renovate 44.48.0 → 44.48.2

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.
Files changed (90) hide show
  1. package/dist/config/options/index.js +1 -1
  2. package/dist/config/options/index.js.map +1 -1
  3. package/dist/global-config-option-defaults.generated.js +1 -1
  4. package/dist/global-config-option-defaults.generated.js.map +1 -1
  5. package/dist/modules/datasource/docker/dockerhub-cache.js.map +1 -1
  6. package/dist/modules/datasource/go/common.js.map +1 -1
  7. package/dist/modules/datasource/rubygems/versions-endpoint-cache.js.map +1 -1
  8. package/dist/modules/datasource/rust-version/index.js.map +1 -1
  9. package/dist/modules/datasource/rust-version/parse.js.map +1 -1
  10. package/dist/modules/manager/asdf/extract.js.map +1 -1
  11. package/dist/modules/manager/asdf/upgradeable-tooling.js.map +1 -1
  12. package/dist/modules/manager/bazel-module/extract.js.map +1 -1
  13. package/dist/modules/manager/bazel-module/parser/context.js.map +1 -1
  14. package/dist/modules/manager/bazel-module/parser/fragments.js +1 -1
  15. package/dist/modules/manager/bazel-module/parser/fragments.js.map +1 -1
  16. package/dist/modules/manager/bazel-module/parser/index.js.map +1 -1
  17. package/dist/modules/manager/bazel-module/rules.js.map +1 -1
  18. package/dist/modules/manager/custom/jsonata/utils.js.map +1 -1
  19. package/dist/modules/manager/custom/regex/utils.js.map +1 -1
  20. package/dist/modules/manager/custom/types.d.ts +1 -0
  21. package/dist/modules/manager/custom/utils.d.ts +1 -0
  22. package/dist/modules/manager/custom/utils.js.map +1 -1
  23. package/dist/modules/manager/devbox/tool-versioning.js.map +1 -1
  24. package/dist/modules/manager/fingerprint.generated.js +2 -2
  25. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  26. package/dist/modules/manager/github-actions/community.js.map +1 -1
  27. package/dist/modules/manager/github-actions/extract.js.map +1 -1
  28. package/dist/modules/manager/github-actions/parse.js.map +1 -1
  29. package/dist/modules/manager/github-actions/schema.js.map +1 -1
  30. package/dist/modules/manager/haskell-cabal/extract.js.map +1 -1
  31. package/dist/modules/manager/haskell-cabal/index.js.map +1 -1
  32. package/dist/modules/manager/homebrew/handlers/github.js.map +1 -1
  33. package/dist/modules/manager/homebrew/handlers/npm.js.map +1 -1
  34. package/dist/modules/manager/mise/backends.js.map +1 -1
  35. package/dist/modules/manager/mise/extract.js.map +1 -1
  36. package/dist/modules/manager/mise/lockfile.js.map +1 -1
  37. package/dist/modules/manager/mise/upgradeable-tooling.js.map +1 -1
  38. package/dist/modules/manager/npm/npmrc.js.map +1 -1
  39. package/dist/modules/manager/npm/post-update/node-version.js.map +1 -1
  40. package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
  41. package/dist/modules/manager/npm/post-update/rules.js.map +1 -1
  42. package/dist/modules/manager/npm/post-update/utils.js.map +1 -1
  43. package/dist/modules/manager/pixi/lockfile.js.map +1 -1
  44. package/dist/modules/manager/proto/extract.js.map +1 -1
  45. package/dist/modules/manager/proto/upgradeable-tooling.js.map +1 -1
  46. package/dist/modules/manager/terragrunt/util.js.map +1 -1
  47. package/dist/modules/platform/azure/azure-helper.js.map +1 -1
  48. package/dist/modules/platform/azure/types.js.map +1 -1
  49. package/dist/modules/platform/bitbucket/comments.js.map +1 -1
  50. package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
  51. package/dist/modules/platform/bitbucket-server/utils.js.map +1 -1
  52. package/dist/modules/platform/codecommit/index.js.map +1 -1
  53. package/dist/modules/versioning/apk/index.js.map +1 -1
  54. package/dist/modules/versioning/aws-machine-image/index.js.map +1 -1
  55. package/dist/modules/versioning/azure-rest-api/index.js.map +1 -1
  56. package/dist/modules/versioning/deb/index.js.map +1 -1
  57. package/dist/modules/versioning/debian/common.js.map +1 -1
  58. package/dist/modules/versioning/debian/index.js.map +1 -1
  59. package/dist/modules/versioning/devbox/index.js.map +1 -1
  60. package/dist/modules/versioning/distro.js.map +1 -1
  61. package/dist/modules/versioning/docker/index.js.map +1 -1
  62. package/dist/modules/versioning/generic.d.ts +2 -10
  63. package/dist/modules/versioning/generic.js.map +1 -1
  64. package/dist/modules/versioning/git/index.js.map +1 -1
  65. package/dist/modules/versioning/glasskube/index.js.map +1 -1
  66. package/dist/modules/versioning/gradle/compare.js.map +1 -1
  67. package/dist/modules/versioning/hermit/index.js.map +1 -1
  68. package/dist/modules/versioning/index.d.ts +2 -2
  69. package/dist/modules/versioning/ivy/parse.js.map +1 -1
  70. package/dist/modules/versioning/lambda-node/schedule.js.map +1 -1
  71. package/dist/modules/versioning/loose/index.js.map +1 -1
  72. package/dist/modules/versioning/maven/compare.js.map +1 -1
  73. package/dist/modules/versioning/nixpkgs/index.js.map +1 -1
  74. package/dist/modules/versioning/node/schedule.js.map +1 -1
  75. package/dist/modules/versioning/paket/index.js.map +1 -1
  76. package/dist/modules/versioning/paket/range.js.map +1 -1
  77. package/dist/modules/versioning/perl/index.js.map +1 -1
  78. package/dist/modules/versioning/redhat/index.js.map +1 -1
  79. package/dist/modules/versioning/regex/index.js.map +1 -1
  80. package/dist/modules/versioning/rpm/index.js.map +1 -1
  81. package/dist/modules/versioning/ruby/range.js.map +1 -1
  82. package/dist/modules/versioning/ruby/strategies/bump.js.map +1 -1
  83. package/dist/modules/versioning/ruby/strategies/replace.js.map +1 -1
  84. package/dist/modules/versioning/ruby/strategies/widen.js.map +1 -1
  85. package/dist/modules/versioning/semver/common.js.map +1 -1
  86. package/dist/modules/versioning/types.d.ts +25 -1
  87. package/dist/modules/versioning/unity3d/index.js.map +1 -1
  88. package/dist/modules/versioning/unity3d-packages/index.js.map +1 -1
  89. package/package.json +1 -1
  90. package/renovate-schema.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","names":["parseGithubUrl"],"sources":["../../../../lib/modules/manager/bazel-module/rules.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport parseGithubUrl from 'github-url-from-git';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport type { SkipReason } from '../../../types/index.ts';\nimport { clone } from '../../../util/clone.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { BazelDatasource } from '../../datasource/bazel/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport { RuleFragment, StringFragment } from './parser/fragments.ts';\n\n// Rule Schemas\n\nexport interface BasePackageDep extends PackageDependency {\n depType: string;\n depName: string;\n}\n\ntype BasePackageDepMergeKeys = Extract<keyof BasePackageDep, 'registryUrls'>;\n\nexport interface MergePackageDep extends BasePackageDep {\n // The fields that should be copied from this struct to the bazel_dep\n // PackageDependency.\n bazelDepMergeFields: BasePackageDepMergeKeys[];\n}\n\nexport interface OverridePackageDep extends BasePackageDep {\n // This value is set as the skipReason on the bazel_dep PackageDependency.\n bazelDepSkipReason: SkipReason;\n}\n\nexport type BazelModulePackageDep =\n | BasePackageDep\n | OverridePackageDep\n | MergePackageDep;\n\nfunction isOverride(value: BazelModulePackageDep): value is OverridePackageDep {\n return 'bazelDepSkipReason' in value;\n}\n\nfunction isMerge(value: BazelModulePackageDep): value is MergePackageDep {\n return 'bazelDepMergeFields' in value;\n}\n\n// This function exists to remove properties that are specific to\n// BazelModulePackageDep. In theory, there is no harm in leaving the properties\n// as it does not invalidate the PackageDependency interface. However, it might\n// be surprising to someone outside the bazel-module code to see the extra\n// properties.\nexport function bazelModulePackageDepToPackageDependency(\n bmpd: BazelModulePackageDep,\n): PackageDependency {\n const copy: BazelModulePackageDep = clone(bmpd);\n // v8 ignore else -- TODO: add test #40625\n if (isOverride(copy)) {\n const partial = copy as Partial<OverridePackageDep>;\n delete partial.bazelDepSkipReason;\n }\n if (isMerge(copy)) {\n const partial = copy as Partial<MergePackageDep>;\n delete partial.bazelDepMergeFields;\n }\n return copy;\n}\n\nconst BazelDepToPackageDep = RuleFragment.extend({\n rule: z.literal('bazel_dep'),\n children: z.object({\n name: StringFragment,\n version: StringFragment.optional(),\n }),\n}).transform(\n ({ rule, children: { name, version } }): BasePackageDep => ({\n datasource: BazelDatasource.id,\n depType: rule,\n depName: name.value,\n currentValue: version?.value,\n ...(version ? {} : { skipReason: 'unspecified-version' }),\n }),\n);\n\nconst GitOverrideToPackageDep = RuleFragment.extend({\n rule: z.literal('git_override'),\n children: z.object({\n module_name: StringFragment,\n remote: StringFragment,\n commit: StringFragment,\n }),\n}).transform(\n ({\n rule,\n children: { module_name: moduleName, remote, commit },\n }): OverridePackageDep => {\n const override: OverridePackageDep = {\n depType: rule,\n depName: moduleName.value,\n bazelDepSkipReason: 'git-dependency',\n currentDigest: commit.value,\n };\n const ghPackageName = githubPackageName(remote.value);\n if (isNonEmptyString(ghPackageName)) {\n override.datasource = GithubTagsDatasource.id;\n override.packageName = ghPackageName;\n } else {\n override.skipReason = 'unsupported-datasource';\n }\n return override;\n },\n);\n\nconst SingleVersionOverrideToPackageDep = RuleFragment.extend({\n rule: z.literal('single_version_override'),\n children: z.object({\n module_name: StringFragment,\n version: StringFragment.optional(),\n registry: StringFragment.optional(),\n }),\n}).transform(\n ({\n rule,\n children: { module_name: moduleName, version, registry },\n }): BasePackageDep => {\n const base: BasePackageDep = {\n depType: rule,\n depName: moduleName.value,\n skipReason: 'ignored',\n };\n // If a version is specified, then add a skipReason to bazel_dep\n if (version) {\n const override = base as OverridePackageDep;\n override.bazelDepSkipReason = 'is-pinned';\n override.currentValue = version.value;\n }\n // If a registry is specified, then merge it into the bazel_dep\n // v8 ignore else -- TODO: add test #40625\n if (registry) {\n const merge = base as MergePackageDep;\n merge.bazelDepMergeFields = ['registryUrls'];\n merge.registryUrls = [registry.value];\n }\n return base;\n },\n);\n\nconst UnsupportedOverrideToPackageDep = RuleFragment.extend({\n rule: z.enum(['archive_override', 'local_path_override']),\n children: z.object({\n module_name: StringFragment,\n }),\n}).transform(\n ({ rule, children: { module_name: moduleName } }): OverridePackageDep => {\n let bazelDepSkipReason: SkipReason = 'unsupported';\n switch (rule) {\n case 'archive_override':\n bazelDepSkipReason = 'file-dependency';\n break;\n case 'local_path_override':\n bazelDepSkipReason = 'local-dependency';\n break;\n }\n return {\n depType: rule,\n depName: moduleName.value,\n skipReason: 'unsupported-datasource',\n bazelDepSkipReason,\n };\n },\n);\n\nexport const RuleToBazelModulePackageDep = z.union([\n BazelDepToPackageDep,\n GitOverrideToPackageDep,\n SingleVersionOverrideToPackageDep,\n UnsupportedOverrideToPackageDep,\n]);\n\nconst githubRemoteRegex = regEx(\n /^https:\\/\\/github\\.com\\/(?<packageName>[^/]+\\/.+)$/,\n);\nfunction githubPackageName(remote: string): string | undefined {\n return parseGithubUrl(remote)?.match(githubRemoteRegex)?.groups?.packageName;\n}\n\nfunction collectByModule(\n packageDeps: BazelModulePackageDep[],\n): BazelModulePackageDep[][] {\n const rulesByModule = new Map<string, BasePackageDep[]>();\n for (const pkgDep of packageDeps) {\n const bmi = rulesByModule.get(pkgDep.depName) ?? [];\n bmi.push(pkgDep);\n rulesByModule.set(pkgDep.depName, bmi);\n }\n return Array.from(rulesByModule.values());\n}\n\nexport function processModulePkgDeps(\n packageDeps: BazelModulePackageDep[],\n): PackageDependency[] {\n if (!packageDeps.length) {\n return [];\n }\n const moduleName = packageDeps[0].depName;\n const bazelDep = packageDeps.find((pd) => pd.depType === 'bazel_dep');\n if (!bazelDep) {\n logger.debug(`A 'bazel_dep' was not found for '${moduleName}'.`);\n return [];\n }\n // Create a new bazelDep that will be modified. We do not want to change the\n // input.\n const bazelDepOut = { ...bazelDep };\n const deps: PackageDependency[] = [bazelDepOut];\n const merges = packageDeps.filter(isMerge);\n for (const merge of merges) {\n merge.bazelDepMergeFields.forEach((k) => (bazelDepOut[k] = merge[k]));\n }\n const overrides = packageDeps.filter(isOverride);\n if (overrides.length === 0) {\n return deps;\n }\n // It is an error for more than one override to exist for a module. We will\n // ignore the overrides if there is more than one.\n if (overrides.length > 1) {\n const depTypes = overrides.map((o) => o.depType);\n logger.debug(\n { depName: moduleName, depTypes },\n 'More than one override for a module was found',\n );\n return deps;\n }\n const override = overrides[0];\n deps.push(bazelModulePackageDepToPackageDependency(override));\n bazelDepOut.skipReason = override.bazelDepSkipReason;\n return deps;\n}\n\nexport function toPackageDependencies(\n packageDeps: BazelModulePackageDep[],\n): PackageDependency[] {\n return collectByModule(packageDeps).map(processModulePkgDeps).flat();\n}\n\nexport const GitRepositoryToPackageDep = RuleFragment.extend({\n rule: z.union([z.literal('git_repository'), z.literal('new_git_repository')]),\n children: z.object({\n name: StringFragment,\n remote: StringFragment,\n commit: StringFragment.optional(),\n tag: StringFragment.optional(),\n }),\n}).transform(\n ({ rule, children: { name, remote, commit, tag } }): BasePackageDep => {\n const gitRepo: BasePackageDep = {\n depType: rule,\n depName: name.value,\n };\n\n if (commit?.value) {\n gitRepo.currentDigest = commit.value;\n }\n\n if (tag?.value) {\n gitRepo.currentValue = tag.value;\n }\n\n const ghPackageName = githubPackageName(remote.value);\n if (isNonEmptyString(ghPackageName)) {\n gitRepo.datasource = GithubTagsDatasource.id;\n gitRepo.packageName = ghPackageName;\n } else {\n gitRepo.skipReason = 'unsupported-datasource';\n }\n return gitRepo;\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"rules.js","names":["parseGithubUrl"],"sources":["../../../../lib/modules/manager/bazel-module/rules.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport parseGithubUrl from 'github-url-from-git';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport type { SkipReason } from '../../../types/index.ts';\nimport { clone } from '../../../util/clone.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { BazelDatasource } from '../../datasource/bazel/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport { RuleFragment, StringFragment } from './parser/fragments.ts';\nimport type {\n BasePackageDep,\n BazelModulePackageDep,\n MergePackageDep,\n OverridePackageDep,\n} from './types.ts';\n\n// Rule Schemas\n\nfunction isOverride(value: BazelModulePackageDep): value is OverridePackageDep {\n return 'bazelDepSkipReason' in value;\n}\n\nfunction isMerge(value: BazelModulePackageDep): value is MergePackageDep {\n return 'bazelDepMergeFields' in value;\n}\n\n// This function exists to remove properties that are specific to\n// BazelModulePackageDep. In theory, there is no harm in leaving the properties\n// as it does not invalidate the PackageDependency interface. However, it might\n// be surprising to someone outside the bazel-module code to see the extra\n// properties.\nexport function bazelModulePackageDepToPackageDependency(\n bmpd: BazelModulePackageDep,\n): PackageDependency {\n const copy: BazelModulePackageDep = clone(bmpd);\n // v8 ignore else -- TODO: add test #40625\n if (isOverride(copy)) {\n const partial = copy as Partial<OverridePackageDep>;\n delete partial.bazelDepSkipReason;\n }\n if (isMerge(copy)) {\n const partial = copy as Partial<MergePackageDep>;\n delete partial.bazelDepMergeFields;\n }\n return copy;\n}\n\nconst BazelDepToPackageDep = RuleFragment.extend({\n rule: z.literal('bazel_dep'),\n children: z.object({\n name: StringFragment,\n version: StringFragment.optional(),\n }),\n}).transform(\n ({ rule, children: { name, version } }): BasePackageDep => ({\n datasource: BazelDatasource.id,\n depType: rule,\n depName: name.value,\n currentValue: version?.value,\n ...(version ? {} : { skipReason: 'unspecified-version' }),\n }),\n);\n\nconst GitOverrideToPackageDep = RuleFragment.extend({\n rule: z.literal('git_override'),\n children: z.object({\n module_name: StringFragment,\n remote: StringFragment,\n commit: StringFragment,\n }),\n}).transform(\n ({\n rule,\n children: { module_name: moduleName, remote, commit },\n }): OverridePackageDep => {\n const override: OverridePackageDep = {\n depType: rule,\n depName: moduleName.value,\n bazelDepSkipReason: 'git-dependency',\n currentDigest: commit.value,\n };\n const ghPackageName = githubPackageName(remote.value);\n if (isNonEmptyString(ghPackageName)) {\n override.datasource = GithubTagsDatasource.id;\n override.packageName = ghPackageName;\n } else {\n override.skipReason = 'unsupported-datasource';\n }\n return override;\n },\n);\n\nconst SingleVersionOverrideToPackageDep = RuleFragment.extend({\n rule: z.literal('single_version_override'),\n children: z.object({\n module_name: StringFragment,\n version: StringFragment.optional(),\n registry: StringFragment.optional(),\n }),\n}).transform(\n ({\n rule,\n children: { module_name: moduleName, version, registry },\n }): BasePackageDep => {\n const base: BasePackageDep = {\n depType: rule,\n depName: moduleName.value,\n skipReason: 'ignored',\n };\n // If a version is specified, then add a skipReason to bazel_dep\n if (version) {\n const override = base as OverridePackageDep;\n override.bazelDepSkipReason = 'is-pinned';\n override.currentValue = version.value;\n }\n // If a registry is specified, then merge it into the bazel_dep\n // v8 ignore else -- TODO: add test #40625\n if (registry) {\n const merge = base as MergePackageDep;\n merge.bazelDepMergeFields = ['registryUrls'];\n merge.registryUrls = [registry.value];\n }\n return base;\n },\n);\n\nconst UnsupportedOverrideToPackageDep = RuleFragment.extend({\n rule: z.enum(['archive_override', 'local_path_override']),\n children: z.object({\n module_name: StringFragment,\n }),\n}).transform(\n ({ rule, children: { module_name: moduleName } }): OverridePackageDep => {\n let bazelDepSkipReason: SkipReason = 'unsupported';\n switch (rule) {\n case 'archive_override':\n bazelDepSkipReason = 'file-dependency';\n break;\n case 'local_path_override':\n bazelDepSkipReason = 'local-dependency';\n break;\n }\n return {\n depType: rule,\n depName: moduleName.value,\n skipReason: 'unsupported-datasource',\n bazelDepSkipReason,\n };\n },\n);\n\nexport const RuleToBazelModulePackageDep = z.union([\n BazelDepToPackageDep,\n GitOverrideToPackageDep,\n SingleVersionOverrideToPackageDep,\n UnsupportedOverrideToPackageDep,\n]);\n\nconst githubRemoteRegex = regEx(\n /^https:\\/\\/github\\.com\\/(?<packageName>[^/]+\\/.+)$/,\n);\nfunction githubPackageName(remote: string): string | undefined {\n return parseGithubUrl(remote)?.match(githubRemoteRegex)?.groups?.packageName;\n}\n\nfunction collectByModule(\n packageDeps: BazelModulePackageDep[],\n): BazelModulePackageDep[][] {\n const rulesByModule = new Map<string, BasePackageDep[]>();\n for (const pkgDep of packageDeps) {\n const bmi = rulesByModule.get(pkgDep.depName) ?? [];\n bmi.push(pkgDep);\n rulesByModule.set(pkgDep.depName, bmi);\n }\n return Array.from(rulesByModule.values());\n}\n\nexport function processModulePkgDeps(\n packageDeps: BazelModulePackageDep[],\n): PackageDependency[] {\n if (!packageDeps.length) {\n return [];\n }\n const moduleName = packageDeps[0].depName;\n const bazelDep = packageDeps.find((pd) => pd.depType === 'bazel_dep');\n if (!bazelDep) {\n logger.debug(`A 'bazel_dep' was not found for '${moduleName}'.`);\n return [];\n }\n // Create a new bazelDep that will be modified. We do not want to change the\n // input.\n const bazelDepOut = { ...bazelDep };\n const deps: PackageDependency[] = [bazelDepOut];\n const merges = packageDeps.filter(isMerge);\n for (const merge of merges) {\n merge.bazelDepMergeFields.forEach((k) => (bazelDepOut[k] = merge[k]));\n }\n const overrides = packageDeps.filter(isOverride);\n if (overrides.length === 0) {\n return deps;\n }\n // It is an error for more than one override to exist for a module. We will\n // ignore the overrides if there is more than one.\n if (overrides.length > 1) {\n const depTypes = overrides.map((o) => o.depType);\n logger.debug(\n { depName: moduleName, depTypes },\n 'More than one override for a module was found',\n );\n return deps;\n }\n const override = overrides[0];\n deps.push(bazelModulePackageDepToPackageDependency(override));\n bazelDepOut.skipReason = override.bazelDepSkipReason;\n return deps;\n}\n\nexport function toPackageDependencies(\n packageDeps: BazelModulePackageDep[],\n): PackageDependency[] {\n return collectByModule(packageDeps).map(processModulePkgDeps).flat();\n}\n\nexport const GitRepositoryToPackageDep = RuleFragment.extend({\n rule: z.union([z.literal('git_repository'), z.literal('new_git_repository')]),\n children: z.object({\n name: StringFragment,\n remote: StringFragment,\n commit: StringFragment.optional(),\n tag: StringFragment.optional(),\n }),\n}).transform(\n ({ rule, children: { name, remote, commit, tag } }): BasePackageDep => {\n const gitRepo: BasePackageDep = {\n depType: rule,\n depName: name.value,\n };\n\n if (commit?.value) {\n gitRepo.currentDigest = commit.value;\n }\n\n if (tag?.value) {\n gitRepo.currentValue = tag.value;\n }\n\n const ghPackageName = githubPackageName(remote.value);\n if (isNonEmptyString(ghPackageName)) {\n gitRepo.datasource = GithubTagsDatasource.id;\n gitRepo.packageName = ghPackageName;\n } else {\n gitRepo.skipReason = 'unsupported-datasource';\n }\n return gitRepo;\n },\n);\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["template.compile"],"sources":["../../../../../lib/modules/manager/custom/jsonata/utils.ts"],"sourcesContent":["import { isEmptyArray, isTruthy } from '@sindresorhus/is';\nimport jsonata from 'jsonata';\nimport { migrateDatasource } from '../../../../config/migrations/custom/datasource-migration.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport * as template from '../../../../util/template/index.ts';\nimport { parseUrl } from '../../../../util/url.ts';\nimport type { PackageDependency } from '../../types.ts';\nimport type { ValidMatchFields } from '../utils.ts';\nimport { checkIsValidDependency, validMatchFields } from '../utils.ts';\nimport { QueryResultZod } from './schema.ts';\nimport type { JSONataManagerTemplates, JsonataExtractConfig } from './types.ts';\n\nexport async function handleMatching(\n json: unknown,\n packageFile: string,\n config: JsonataExtractConfig,\n): Promise<PackageDependency[]> {\n let results: Record<string, string>[] = [];\n const { matchStrings: jsonataQueries } = config;\n for (const query of jsonataQueries) {\n // won't fail as this is verified during config validation\n const jsonataExpression = jsonata(query);\n let queryResult: unknown;\n try {\n // this now throws for unknown reasons\n queryResult = await jsonataExpression.evaluate(json);\n } catch (err) {\n logger.warn(\n { err, jsonataQuery: query, packageFile },\n 'Error executing jsonata query. Please check your query.',\n );\n continue;\n }\n\n // allows empty dep object cause templates can be used to configure the required fields\n // if some issues arise then the isValidDependency call will catch them later on\n if (!queryResult || isEmptyArray(queryResult)) {\n logger.debug(\n {\n jsonataQuery: query,\n packageFile,\n },\n 'The jsonata query returned no matches. Possible error, please check your query. Skipping',\n );\n continue;\n }\n\n const parsed = QueryResultZod.safeParse(queryResult);\n if (parsed.success) {\n results = results.concat(parsed.data);\n } else {\n logger.warn(\n { err: parsed.error, jsonataQuery: query, packageFile, queryResult },\n 'Query results failed schema validation',\n );\n continue;\n }\n }\n\n return results\n .map((dep) => createDependency(dep, config))\n .filter(isTruthy)\n .filter((dep) =>\n checkIsValidDependency(dep, packageFile, 'custom.jsonata'),\n );\n}\n\nexport function createDependency(\n queryResult: Record<string, string>,\n config: JsonataExtractConfig,\n): PackageDependency | null {\n const dependency: PackageDependency = {};\n\n for (const field of validMatchFields) {\n const fieldTemplate = `${field}Template` as keyof JSONataManagerTemplates;\n const tmpl = config[fieldTemplate];\n if (tmpl) {\n try {\n const compiled = template.compile(tmpl, queryResult, false);\n updateDependency(field, compiled, dependency);\n } catch {\n logger.debug(\n { template: tmpl },\n 'Error compiling template for JSONata manager',\n );\n return null;\n }\n } else if (queryResult[field]) {\n updateDependency(field, queryResult[field], dependency);\n }\n }\n return dependency;\n}\n\nfunction updateDependency(\n field: ValidMatchFields,\n value: string,\n dependency: PackageDependency,\n): PackageDependency {\n switch (field) {\n case 'registryUrl': {\n const url = parseUrl(value)?.toString();\n if (!url) {\n logger.debug({ url: value }, 'Invalid JSONata manager registryUrl');\n break;\n }\n dependency.registryUrls = [url];\n break;\n }\n case 'datasource':\n dependency.datasource = migrateDatasource(value);\n break;\n default:\n dependency[field] = value;\n break;\n }\n\n return dependency;\n}\n"],"mappings":";;;;;;;;;AAYA,eAAsB,eACpB,MACA,aACA,QAC8B;CAC9B,IAAI,UAAoC,CAAC;CACzC,MAAM,EAAE,cAAc,mBAAmB;CACzC,KAAK,MAAM,SAAS,gBAAgB;EAElC,MAAM,oBAAoB,QAAQ,KAAK;EACvC,IAAI;EACJ,IAAI;GAEF,cAAc,MAAM,kBAAkB,SAAS,IAAI;EACrD,SAAS,KAAK;GACZ,OAAO,KACL;IAAE;IAAK,cAAc;IAAO;GAAY,GACxC,yDACF;GACA;EACF;EAIA,IAAI,CAAC,eAAe,aAAa,WAAW,GAAG;GAC7C,OAAO,MACL;IACE,cAAc;IACd;GACF,GACA,0FACF;GACA;EACF;EAEA,MAAM,SAAS,eAAe,UAAU,WAAW;EACnD,IAAI,OAAO,SACT,UAAU,QAAQ,OAAO,OAAO,IAAI;OAC/B;GACL,OAAO,KACL;IAAE,KAAK,OAAO;IAAO,cAAc;IAAO;IAAa;GAAY,GACnE,wCACF;GACA;EACF;CACF;CAEA,OAAO,QACJ,KAAK,QAAQ,iBAAiB,KAAK,MAAM,CAAC,CAAC,CAC3C,OAAO,QAAQ,CAAC,CAChB,QAAQ,QACP,uBAAuB,KAAK,aAAa,gBAAgB,CAC3D;AACJ;AAEA,SAAgB,iBACd,aACA,QAC0B;CAC1B,MAAM,aAAgC,CAAC;CAEvC,KAAK,MAAM,SAAS,kBAAkB;EAEpC,MAAM,OAAO,OAAO,GADK,MAAM;EAE/B,IAAI,MACF,IAAI;GAEF,iBAAiB,OADAA,QAAiB,MAAM,aAAa,KACtB,GAAG,UAAU;EAC9C,QAAQ;GACN,OAAO,MACL,EAAE,UAAU,KAAK,GACjB,8CACF;GACA,OAAO;EACT;OACK,IAAI,YAAY,QACrB,iBAAiB,OAAO,YAAY,QAAQ,UAAU;CAE1D;CACA,OAAO;AACT;AAEA,SAAS,iBACP,OACA,OACA,YACmB;CACnB,QAAQ,OAAR;EACE,KAAK,eAAe;GAClB,MAAM,MAAM,SAAS,KAAK,CAAC,EAAE,SAAS;GACtC,IAAI,CAAC,KAAK;IACR,OAAO,MAAM,EAAE,KAAK,MAAM,GAAG,qCAAqC;IAClE;GACF;GACA,WAAW,eAAe,CAAC,GAAG;GAC9B;EACF;EACA,KAAK;GACH,WAAW,aAAa,kBAAkB,KAAK;GAC/C;EACF,SACE,WAAW,SAAS;CAExB;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"utils.js","names":["template.compile"],"sources":["../../../../../lib/modules/manager/custom/jsonata/utils.ts"],"sourcesContent":["import { isEmptyArray, isTruthy } from '@sindresorhus/is';\nimport jsonata from 'jsonata';\nimport { migrateDatasource } from '../../../../config/migrations/custom/datasource-migration.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport * as template from '../../../../util/template/index.ts';\nimport { parseUrl } from '../../../../util/url.ts';\nimport type { PackageDependency } from '../../types.ts';\nimport type { ValidMatchFields } from '../types.ts';\nimport { checkIsValidDependency, validMatchFields } from '../utils.ts';\nimport { QueryResultZod } from './schema.ts';\nimport type { JSONataManagerTemplates, JsonataExtractConfig } from './types.ts';\n\nexport async function handleMatching(\n json: unknown,\n packageFile: string,\n config: JsonataExtractConfig,\n): Promise<PackageDependency[]> {\n let results: Record<string, string>[] = [];\n const { matchStrings: jsonataQueries } = config;\n for (const query of jsonataQueries) {\n // won't fail as this is verified during config validation\n const jsonataExpression = jsonata(query);\n let queryResult: unknown;\n try {\n // this now throws for unknown reasons\n queryResult = await jsonataExpression.evaluate(json);\n } catch (err) {\n logger.warn(\n { err, jsonataQuery: query, packageFile },\n 'Error executing jsonata query. Please check your query.',\n );\n continue;\n }\n\n // allows empty dep object cause templates can be used to configure the required fields\n // if some issues arise then the isValidDependency call will catch them later on\n if (!queryResult || isEmptyArray(queryResult)) {\n logger.debug(\n {\n jsonataQuery: query,\n packageFile,\n },\n 'The jsonata query returned no matches. Possible error, please check your query. Skipping',\n );\n continue;\n }\n\n const parsed = QueryResultZod.safeParse(queryResult);\n if (parsed.success) {\n results = results.concat(parsed.data);\n } else {\n logger.warn(\n { err: parsed.error, jsonataQuery: query, packageFile, queryResult },\n 'Query results failed schema validation',\n );\n continue;\n }\n }\n\n return results\n .map((dep) => createDependency(dep, config))\n .filter(isTruthy)\n .filter((dep) =>\n checkIsValidDependency(dep, packageFile, 'custom.jsonata'),\n );\n}\n\nexport function createDependency(\n queryResult: Record<string, string>,\n config: JsonataExtractConfig,\n): PackageDependency | null {\n const dependency: PackageDependency = {};\n\n for (const field of validMatchFields) {\n const fieldTemplate = `${field}Template` as keyof JSONataManagerTemplates;\n const tmpl = config[fieldTemplate];\n if (tmpl) {\n try {\n const compiled = template.compile(tmpl, queryResult, false);\n updateDependency(field, compiled, dependency);\n } catch {\n logger.debug(\n { template: tmpl },\n 'Error compiling template for JSONata manager',\n );\n return null;\n }\n } else if (queryResult[field]) {\n updateDependency(field, queryResult[field], dependency);\n }\n }\n return dependency;\n}\n\nfunction updateDependency(\n field: ValidMatchFields,\n value: string,\n dependency: PackageDependency,\n): PackageDependency {\n switch (field) {\n case 'registryUrl': {\n const url = parseUrl(value)?.toString();\n if (!url) {\n logger.debug({ url: value }, 'Invalid JSONata manager registryUrl');\n break;\n }\n dependency.registryUrls = [url];\n break;\n }\n case 'datasource':\n dependency.datasource = migrateDatasource(value);\n break;\n default:\n dependency[field] = value;\n break;\n }\n\n return dependency;\n}\n"],"mappings":";;;;;;;;;AAYA,eAAsB,eACpB,MACA,aACA,QAC8B;CAC9B,IAAI,UAAoC,CAAC;CACzC,MAAM,EAAE,cAAc,mBAAmB;CACzC,KAAK,MAAM,SAAS,gBAAgB;EAElC,MAAM,oBAAoB,QAAQ,KAAK;EACvC,IAAI;EACJ,IAAI;GAEF,cAAc,MAAM,kBAAkB,SAAS,IAAI;EACrD,SAAS,KAAK;GACZ,OAAO,KACL;IAAE;IAAK,cAAc;IAAO;GAAY,GACxC,yDACF;GACA;EACF;EAIA,IAAI,CAAC,eAAe,aAAa,WAAW,GAAG;GAC7C,OAAO,MACL;IACE,cAAc;IACd;GACF,GACA,0FACF;GACA;EACF;EAEA,MAAM,SAAS,eAAe,UAAU,WAAW;EACnD,IAAI,OAAO,SACT,UAAU,QAAQ,OAAO,OAAO,IAAI;OAC/B;GACL,OAAO,KACL;IAAE,KAAK,OAAO;IAAO,cAAc;IAAO;IAAa;GAAY,GACnE,wCACF;GACA;EACF;CACF;CAEA,OAAO,QACJ,KAAK,QAAQ,iBAAiB,KAAK,MAAM,CAAC,CAAC,CAC3C,OAAO,QAAQ,CAAC,CAChB,QAAQ,QACP,uBAAuB,KAAK,aAAa,gBAAgB,CAC3D;AACJ;AAEA,SAAgB,iBACd,aACA,QAC0B;CAC1B,MAAM,aAAgC,CAAC;CAEvC,KAAK,MAAM,SAAS,kBAAkB;EAEpC,MAAM,OAAO,OAAO,GADK,MAAM;EAE/B,IAAI,MACF,IAAI;GAEF,iBAAiB,OADAA,QAAiB,MAAM,aAAa,KACtB,GAAG,UAAU;EAC9C,QAAQ;GACN,OAAO,MACL,EAAE,UAAU,KAAK,GACjB,8CACF;GACA,OAAO;EACT;OACK,IAAI,YAAY,QACrB,iBAAiB,OAAO,YAAY,QAAQ,UAAU;CAE1D;CACA,OAAO;AACT;AAEA,SAAS,iBACP,OACA,OACA,YACmB;CACnB,QAAQ,OAAR;EACE,KAAK,eAAe;GAClB,MAAM,MAAM,SAAS,KAAK,CAAC,EAAE,SAAS;GACtC,IAAI,CAAC,KAAK;IACR,OAAO,MAAM,EAAE,KAAK,MAAM,GAAG,qCAAqC;IAClE;GACF;GACA,WAAW,eAAe,CAAC,GAAG;GAC9B;EACF;EACA,KAAK;GACH,WAAW,aAAa,kBAAkB,KAAK;GAC/C;EACF,SACE,WAAW,SAAS;CAExB;CAEA,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["template.compile"],"sources":["../../../../../lib/modules/manager/custom/regex/utils.ts"],"sourcesContent":["import { isEmptyStringOrWhitespace } from '@sindresorhus/is';\nimport { migrateDatasource } from '../../../../config/migrations/custom/datasource-migration.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport * as template from '../../../../util/template/index.ts';\nimport { parseUrl } from '../../../../util/url.ts';\nimport type { PackageDependency } from '../../types.ts';\nimport type { ValidMatchFields } from '../utils.ts';\nimport { validMatchFields } from '../utils.ts';\nimport type {\n ExtractionTemplate,\n PackageFileInfo,\n RegexManagerConfig,\n RegexManagerTemplates,\n} from './types.ts';\n\nfunction updateDependency(\n dependency: PackageDependency,\n field: ValidMatchFields,\n value: string,\n): void {\n switch (field) {\n case 'registryUrl': {\n // check if URL is valid and pack inside an array\n const url = parseUrl(value)?.toString();\n if (url) {\n dependency.registryUrls = [url];\n } else {\n logger.warn({ value }, 'Invalid regex manager registryUrl');\n }\n break;\n }\n case 'datasource':\n dependency.datasource = migrateDatasource(value);\n break;\n case 'indentation':\n dependency.indentation = isEmptyStringOrWhitespace(value) ? value : '';\n break;\n default:\n dependency[field] = value;\n break;\n }\n}\n\nexport function createDependency(\n extractionTemplate: ExtractionTemplate,\n config: RegexManagerConfig,\n packageFileInfo: PackageFileInfo,\n dep?: PackageDependency,\n): PackageDependency | null {\n const dependency = dep ?? {};\n const { groups, replaceString } = extractionTemplate;\n const { packageFileName, packageFileDir } = packageFileInfo;\n\n for (const field of validMatchFields) {\n const fieldTemplate = `${field}Template` as keyof RegexManagerTemplates;\n const tmpl = config[fieldTemplate];\n if (tmpl) {\n try {\n const compiled = template.compile(\n tmpl,\n { ...groups, packageFile: packageFileName, packageFileDir },\n false,\n );\n updateDependency(dependency, field, compiled);\n } catch {\n logger.warn(\n { template: tmpl },\n 'Error compiling template for custom manager',\n );\n return null;\n }\n } else if (groups[field]) {\n updateDependency(dependency, field, groups[field]);\n }\n }\n dependency.replaceString = replaceString;\n return dependency;\n}\n\nexport function regexMatchAll(\n regex: RegExp,\n content: string,\n): RegExpMatchArray[] {\n const matches: RegExpMatchArray[] = [];\n let matchResult: RegExpMatchArray | null;\n let iterations = 0;\n const maxIterations = 10000;\n do {\n matchResult = regex.exec(content);\n if (matchResult) {\n matches.push(matchResult);\n }\n iterations += 1;\n } while (matchResult && iterations < maxIterations);\n if (iterations === maxIterations) {\n logger.warn('Max iterations reached for matchStrings');\n }\n return matches;\n}\n\nexport function mergeGroups(\n mergedGroup: Record<string, string>,\n secondGroup: Record<string, string>,\n): Record<string, string> {\n return { ...mergedGroup, ...secondGroup };\n}\n\nexport function mergeExtractionTemplate(\n base: ExtractionTemplate,\n addition: ExtractionTemplate,\n): ExtractionTemplate {\n return {\n groups: mergeGroups(base.groups, addition.groups),\n replaceString: addition.replaceString ?? base.replaceString,\n };\n}\n"],"mappings":";;;;;;;AAeA,SAAS,iBACP,YACA,OACA,OACM;CACN,QAAQ,OAAR;EACE,KAAK,eAAe;GAElB,MAAM,MAAM,SAAS,KAAK,CAAC,EAAE,SAAS;GACtC,IAAI,KACF,WAAW,eAAe,CAAC,GAAG;QAE9B,OAAO,KAAK,EAAE,MAAM,GAAG,mCAAmC;GAE5D;EACF;EACA,KAAK;GACH,WAAW,aAAa,kBAAkB,KAAK;GAC/C;EACF,KAAK;GACH,WAAW,cAAc,0BAA0B,KAAK,IAAI,QAAQ;GACpE;EACF,SACE,WAAW,SAAS;CAExB;AACF;AAEA,SAAgB,iBACd,oBACA,QACA,iBACA,KAC0B;CAC1B,MAAM,aAAa,OAAO,CAAC;CAC3B,MAAM,EAAE,QAAQ,kBAAkB;CAClC,MAAM,EAAE,iBAAiB,mBAAmB;CAE5C,KAAK,MAAM,SAAS,kBAAkB;EAEpC,MAAM,OAAO,OAAO,GADK,MAAM;EAE/B,IAAI,MACF,IAAI;GAMF,iBAAiB,YAAY,OALZA,QACf,MACA;IAAE,GAAG;IAAQ,aAAa;IAAiB;GAAe,GAC1D,KAEyC,CAAC;EAC9C,QAAQ;GACN,OAAO,KACL,EAAE,UAAU,KAAK,GACjB,6CACF;GACA,OAAO;EACT;OACK,IAAI,OAAO,QAChB,iBAAiB,YAAY,OAAO,OAAO,MAAM;CAErD;CACA,WAAW,gBAAgB;CAC3B,OAAO;AACT;AAEA,SAAgB,cACd,OACA,SACoB;CACpB,MAAM,UAA8B,CAAC;CACrC,IAAI;CACJ,IAAI,aAAa;CACjB,MAAM,gBAAgB;CACtB,GAAG;EACD,cAAc,MAAM,KAAK,OAAO;EAChC,IAAI,aACF,QAAQ,KAAK,WAAW;EAE1B,cAAc;CAChB,SAAS,eAAe,aAAa;CACrC,IAAI,eAAe,eACjB,OAAO,KAAK,yCAAyC;CAEvD,OAAO;AACT;AAEA,SAAgB,YACd,aACA,aACwB;CACxB,OAAO;EAAE,GAAG;EAAa,GAAG;CAAY;AAC1C;AAEA,SAAgB,wBACd,MACA,UACoB;CACpB,OAAO;EACL,QAAQ,YAAY,KAAK,QAAQ,SAAS,MAAM;EAChD,eAAe,SAAS,iBAAiB,KAAK;CAChD;AACF"}
1
+ {"version":3,"file":"utils.js","names":["template.compile"],"sources":["../../../../../lib/modules/manager/custom/regex/utils.ts"],"sourcesContent":["import { isEmptyStringOrWhitespace } from '@sindresorhus/is';\nimport { migrateDatasource } from '../../../../config/migrations/custom/datasource-migration.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport * as template from '../../../../util/template/index.ts';\nimport { parseUrl } from '../../../../util/url.ts';\nimport type { PackageDependency } from '../../types.ts';\nimport type { ValidMatchFields } from '../types.ts';\nimport { validMatchFields } from '../utils.ts';\nimport type {\n ExtractionTemplate,\n PackageFileInfo,\n RegexManagerConfig,\n RegexManagerTemplates,\n} from './types.ts';\n\nfunction updateDependency(\n dependency: PackageDependency,\n field: ValidMatchFields,\n value: string,\n): void {\n switch (field) {\n case 'registryUrl': {\n // check if URL is valid and pack inside an array\n const url = parseUrl(value)?.toString();\n if (url) {\n dependency.registryUrls = [url];\n } else {\n logger.warn({ value }, 'Invalid regex manager registryUrl');\n }\n break;\n }\n case 'datasource':\n dependency.datasource = migrateDatasource(value);\n break;\n case 'indentation':\n dependency.indentation = isEmptyStringOrWhitespace(value) ? value : '';\n break;\n default:\n dependency[field] = value;\n break;\n }\n}\n\nexport function createDependency(\n extractionTemplate: ExtractionTemplate,\n config: RegexManagerConfig,\n packageFileInfo: PackageFileInfo,\n dep?: PackageDependency,\n): PackageDependency | null {\n const dependency = dep ?? {};\n const { groups, replaceString } = extractionTemplate;\n const { packageFileName, packageFileDir } = packageFileInfo;\n\n for (const field of validMatchFields) {\n const fieldTemplate = `${field}Template` as keyof RegexManagerTemplates;\n const tmpl = config[fieldTemplate];\n if (tmpl) {\n try {\n const compiled = template.compile(\n tmpl,\n { ...groups, packageFile: packageFileName, packageFileDir },\n false,\n );\n updateDependency(dependency, field, compiled);\n } catch {\n logger.warn(\n { template: tmpl },\n 'Error compiling template for custom manager',\n );\n return null;\n }\n } else if (groups[field]) {\n updateDependency(dependency, field, groups[field]);\n }\n }\n dependency.replaceString = replaceString;\n return dependency;\n}\n\nexport function regexMatchAll(\n regex: RegExp,\n content: string,\n): RegExpMatchArray[] {\n const matches: RegExpMatchArray[] = [];\n let matchResult: RegExpMatchArray | null;\n let iterations = 0;\n const maxIterations = 10000;\n do {\n matchResult = regex.exec(content);\n if (matchResult) {\n matches.push(matchResult);\n }\n iterations += 1;\n } while (matchResult && iterations < maxIterations);\n if (iterations === maxIterations) {\n logger.warn('Max iterations reached for matchStrings');\n }\n return matches;\n}\n\nexport function mergeGroups(\n mergedGroup: Record<string, string>,\n secondGroup: Record<string, string>,\n): Record<string, string> {\n return { ...mergedGroup, ...secondGroup };\n}\n\nexport function mergeExtractionTemplate(\n base: ExtractionTemplate,\n addition: ExtractionTemplate,\n): ExtractionTemplate {\n return {\n groups: mergeGroups(base.groups, addition.groups),\n replaceString: addition.replaceString ?? base.replaceString,\n };\n}\n"],"mappings":";;;;;;;AAeA,SAAS,iBACP,YACA,OACA,OACM;CACN,QAAQ,OAAR;EACE,KAAK,eAAe;GAElB,MAAM,MAAM,SAAS,KAAK,CAAC,EAAE,SAAS;GACtC,IAAI,KACF,WAAW,eAAe,CAAC,GAAG;QAE9B,OAAO,KAAK,EAAE,MAAM,GAAG,mCAAmC;GAE5D;EACF;EACA,KAAK;GACH,WAAW,aAAa,kBAAkB,KAAK;GAC/C;EACF,KAAK;GACH,WAAW,cAAc,0BAA0B,KAAK,IAAI,QAAQ;GACpE;EACF,SACE,WAAW,SAAS;CAExB;AACF;AAEA,SAAgB,iBACd,oBACA,QACA,iBACA,KAC0B;CAC1B,MAAM,aAAa,OAAO,CAAC;CAC3B,MAAM,EAAE,QAAQ,kBAAkB;CAClC,MAAM,EAAE,iBAAiB,mBAAmB;CAE5C,KAAK,MAAM,SAAS,kBAAkB;EAEpC,MAAM,OAAO,OAAO,GADK,MAAM;EAE/B,IAAI,MACF,IAAI;GAMF,iBAAiB,YAAY,OALZA,QACf,MACA;IAAE,GAAG;IAAQ,aAAa;IAAiB;GAAe,GAC1D,KAEyC,CAAC;EAC9C,QAAQ;GACN,OAAO,KACL,EAAE,UAAU,KAAK,GACjB,6CACF;GACA,OAAO;EACT;OACK,IAAI,OAAO,QAChB,iBAAiB,YAAY,OAAO,OAAO,MAAM;CAErD;CACA,WAAW,gBAAgB;CAC3B,OAAO;AACT;AAEA,SAAgB,cACd,OACA,SACoB;CACpB,MAAM,UAA8B,CAAC;CACrC,IAAI;CACJ,IAAI,aAAa;CACjB,MAAM,gBAAgB;CACtB,GAAG;EACD,cAAc,MAAM,KAAK,OAAO;EAChC,IAAI,aACF,QAAQ,KAAK,WAAW;EAE1B,cAAc;CAChB,SAAS,eAAe,aAAa;CACrC,IAAI,eAAe,eACjB,OAAO,KAAK,yCAAyC;CAEvD,OAAO;AACT;AAEA,SAAgB,YACd,aACA,aACwB;CACxB,OAAO;EAAE,GAAG;EAAa,GAAG;CAAY;AAC1C;AAEA,SAAgB,wBACd,MACA,UACoB;CACpB,OAAO;EACL,QAAQ,YAAY,KAAK,QAAQ,SAAS,MAAM;EAChD,eAAe,SAAS,iBAAiB,KAAK;CAChD;AACF"}
@@ -1,5 +1,6 @@
1
1
  import { RegexManagerConfig } from "./regex/types.js";
2
2
  import { JSONataManagerConfig } from "./jsonata/types.js";
3
+ import "./utils.js";
3
4
  //#region lib/modules/manager/custom/types.d.ts
4
5
  interface CustomExtractConfig extends Partial<RegexManagerConfig>, Partial<JSONataManagerConfig> {}
5
6
  type CustomManagerName = 'jsonata' | 'regex';
@@ -0,0 +1 @@
1
+ import "../types.js";
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../../lib/modules/manager/custom/utils.ts"],"sourcesContent":["import { isNonEmptyStringAndNotWhitespace } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport type { PackageDependency } from '../types.ts';\n\nexport const validMatchFields = [\n 'depName',\n 'packageName',\n 'currentValue',\n 'currentDigest',\n 'datasource',\n 'versioning',\n 'extractVersion',\n 'registryUrl',\n 'depType',\n 'indentation',\n] as const;\n\nexport type ValidMatchFields = (typeof validMatchFields)[number];\n\nexport function isValidDependency({\n depName,\n currentValue,\n currentDigest,\n packageName,\n datasource,\n}: PackageDependency): boolean {\n // check if all the fields are set\n return (\n (isNonEmptyStringAndNotWhitespace(depName) ||\n isNonEmptyStringAndNotWhitespace(packageName)) &&\n (isNonEmptyStringAndNotWhitespace(currentDigest) ||\n isNonEmptyStringAndNotWhitespace(currentValue)) &&\n isNonEmptyStringAndNotWhitespace(datasource)\n );\n}\n\nexport function checkIsValidDependency(\n dep: PackageDependency,\n packageFile: string,\n manager: string,\n): boolean {\n const isValid = isValidDependency(dep);\n if (!isValid) {\n const meta = {\n packageDependency: dep,\n packageFile,\n manager,\n };\n logger.trace(\n meta,\n 'Discovered a package dependency, but it did not pass validation. Discarding',\n );\n return isValid;\n }\n\n return isValid;\n}\n"],"mappings":";;;AAIA,MAAa,mBAAmB;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAIA,SAAgB,kBAAkB,EAChC,SACA,cACA,eACA,aACA,cAC6B;CAE7B,QACG,iCAAiC,OAAO,KACvC,iCAAiC,WAAW,OAC7C,iCAAiC,aAAa,KAC7C,iCAAiC,YAAY,MAC/C,iCAAiC,UAAU;AAE/C;AAEA,SAAgB,uBACd,KACA,aACA,SACS;CACT,MAAM,UAAU,kBAAkB,GAAG;CACrC,IAAI,CAAC,SAAS;EACZ,MAAM,OAAO;GACX,mBAAmB;GACnB;GACA;EACF;EACA,OAAO,MACL,MACA,6EACF;EACA,OAAO;CACT;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../lib/modules/manager/custom/utils.ts"],"sourcesContent":["import { isNonEmptyStringAndNotWhitespace } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport type { PackageDependency } from '../types.ts';\n\nexport const validMatchFields = [\n 'depName',\n 'packageName',\n 'currentValue',\n 'currentDigest',\n 'datasource',\n 'versioning',\n 'extractVersion',\n 'registryUrl',\n 'depType',\n 'indentation',\n] as const;\n\nexport function isValidDependency({\n depName,\n currentValue,\n currentDigest,\n packageName,\n datasource,\n}: PackageDependency): boolean {\n // check if all the fields are set\n return (\n (isNonEmptyStringAndNotWhitespace(depName) ||\n isNonEmptyStringAndNotWhitespace(packageName)) &&\n (isNonEmptyStringAndNotWhitespace(currentDigest) ||\n isNonEmptyStringAndNotWhitespace(currentValue)) &&\n isNonEmptyStringAndNotWhitespace(datasource)\n );\n}\n\nexport function checkIsValidDependency(\n dep: PackageDependency,\n packageFile: string,\n manager: string,\n): boolean {\n const isValid = isValidDependency(dep);\n if (!isValid) {\n const meta = {\n packageDependency: dep,\n packageFile,\n manager,\n };\n logger.trace(\n meta,\n 'Discovered a package dependency, but it did not pass validation. Discarding',\n );\n return isValid;\n }\n\n return isValid;\n}\n"],"mappings":";;;AAIA,MAAa,mBAAmB;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAgB,kBAAkB,EAChC,SACA,cACA,eACA,aACA,cAC6B;CAE7B,QACG,iCAAiC,OAAO,KACvC,iCAAiC,WAAW,OAC7C,iCAAiC,aAAa,KAC7C,iCAAiC,YAAY,MAC/C,iCAAiC,UAAU;AAE/C;AAEA,SAAgB,uBACd,KACA,aACA,SACS;CACT,MAAM,UAAU,kBAAkB,GAAG;CACrC,IAAI,CAAC,SAAS;EACZ,MAAM,OAAO;GACX,mBAAmB;GACnB;GACA;EACF;EACA,OAAO,MACL,MACA,6EACF;EACA,OAAO;CACT;CAEA,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"tool-versioning.js","names":["nodeVersioning.api","nodeVersioning.id","rubyVersioning.api","rubyVersioning.id","pythonVersioning.api","pythonVersioning.id","semver.api","semver.id","looseVersioning.api","looseVersioning.id"],"sources":["../../../../lib/modules/manager/devbox/tool-versioning.ts"],"sourcesContent":["import * as looseVersioning from '../../versioning/loose/index.ts';\nimport * as nodeVersioning from '../../versioning/node/index.ts';\nimport * as pythonVersioning from '../../versioning/python/index.ts';\nimport * as rubyVersioning from '../../versioning/ruby/index.ts';\nimport * as semver from '../../versioning/semver/index.ts';\nimport type { VersioningApi } from '../../versioning/types.ts';\n\nexport type ToolVersioning = Record<string, { api: VersioningApi; id: string }>;\n\nexport const devboxToolVersioning: ToolVersioning = {\n nodejs: {\n api: nodeVersioning.api,\n id: nodeVersioning.id,\n },\n ruby: {\n api: rubyVersioning.api,\n id: rubyVersioning.id,\n },\n python: {\n api: pythonVersioning.api,\n id: pythonVersioning.id,\n },\n // Using loose versioning due to versions like 1.2.3+2\n jdk: {\n api: semver.api,\n id: semver.id,\n },\n // Using loose versioning due to versions like 1.2\n postgresql: {\n api: looseVersioning.api,\n id: looseVersioning.id,\n },\n // Using python versioning due to versions like 1.2beta2\n // seems odd, but Go does actually follow python versioning rules for the language\n go: {\n api: pythonVersioning.api,\n id: pythonVersioning.id,\n },\n};\n"],"mappings":";;;;;;AASA,MAAa,uBAAuC;CAClD,QAAQ;EACN,KAAKA;EACL,IAAIC;CACN;CACA,MAAM;EACJ,KAAKC;EACL,IAAIC;CACN;CACA,QAAQ;EACN,KAAKC;EACL,IAAIC;CACN;CAEA,KAAK;EACEC;EACDC;CACN;CAEA,YAAY;EACV,KAAKC;EACL,IAAIC;CACN;CAGA,IAAI;EACF,KAAKL;EACL,IAAIC;CACN;AACF"}
1
+ {"version":3,"file":"tool-versioning.js","names":["nodeVersioning.api","nodeVersioning.id","rubyVersioning.api","rubyVersioning.id","pythonVersioning.api","pythonVersioning.id","semver.api","semver.id","looseVersioning.api","looseVersioning.id"],"sources":["../../../../lib/modules/manager/devbox/tool-versioning.ts"],"sourcesContent":["import * as looseVersioning from '../../versioning/loose/index.ts';\nimport * as nodeVersioning from '../../versioning/node/index.ts';\nimport * as pythonVersioning from '../../versioning/python/index.ts';\nimport * as rubyVersioning from '../../versioning/ruby/index.ts';\nimport * as semver from '../../versioning/semver/index.ts';\nimport type { ToolVersioning } from './types.ts';\n\nexport const devboxToolVersioning: ToolVersioning = {\n nodejs: {\n api: nodeVersioning.api,\n id: nodeVersioning.id,\n },\n ruby: {\n api: rubyVersioning.api,\n id: rubyVersioning.id,\n },\n python: {\n api: pythonVersioning.api,\n id: pythonVersioning.id,\n },\n // Using loose versioning due to versions like 1.2.3+2\n jdk: {\n api: semver.api,\n id: semver.id,\n },\n // Using loose versioning due to versions like 1.2\n postgresql: {\n api: looseVersioning.api,\n id: looseVersioning.id,\n },\n // Using python versioning due to versions like 1.2beta2\n // seems odd, but Go does actually follow python versioning rules for the language\n go: {\n api: pythonVersioning.api,\n id: pythonVersioning.id,\n },\n};\n"],"mappings":";;;;;;AAOA,MAAa,uBAAuC;CAClD,QAAQ;EACN,KAAKA;EACL,IAAIC;CACN;CACA,MAAM;EACJ,KAAKC;EACL,IAAIC;CACN;CACA,QAAQ;EACN,KAAKC;EACL,IAAIC;CACN;CAEA,KAAK;EACEC;EACDC;CACN;CAEA,YAAY;EACV,KAAKC;EACL,IAAIC;CACN;CAGA,IAAI;EACF,KAAKL;EACL,IAAIC;CACN;AACF"}
@@ -4,12 +4,12 @@ hashMap.set("ansible", "1d3568f42393d697f8f96d461b72077ee7a1044b654e87667a12f861
4
4
  hashMap.set("ansible-galaxy", "8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f");
5
5
  hashMap.set("ant", "2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17");
6
6
  hashMap.set("argocd", "5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce");
7
- hashMap.set("asdf", "b2acfc0a6164e9a279daa724777c423f84572dafb0df09b1b0cf6f205f9eb6d0");
7
+ hashMap.set("asdf", "430eb99b58171700c8a59c78b9e648575e9b176b781d90dd10a710f7b69015bb");
8
8
  hashMap.set("azure-pipelines", "4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796");
9
9
  hashMap.set("batect", "bd9208444eff1a4958061484db66a47b616c31f15a8d49d23b75c4560fcee83e");
10
10
  hashMap.set("batect-wrapper", "d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939");
11
11
  hashMap.set("bazel", "4994a8bd86d5bfb169d67c08efd8509b58c368c2bf3dd9bbe42553c0fabc3f1a");
12
- hashMap.set("bazel-module", "40f6a862b4e72fcc7262ee41f8b570ea3fd5600d6d552b94ed3301bb201f5db5");
12
+ hashMap.set("bazel-module", "f7d369015f9028c40cb79f2367d0734f18c0647d1d446d0a165007c3723c3414");
13
13
  hashMap.set("bazelisk", "d71489650feefb0dbbe7461f924cb50e41c8eef8fe2e11acdec2d42d0212c8ef");
14
14
  hashMap.set("bicep", "7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db");
15
15
  hashMap.set("bitbucket-pipelines", "59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd");
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','1d3568f42393d697f8f96d461b72077ee7a1044b654e87667a12f861b3083111');\nhashMap.set('ansible-galaxy','8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('argocd','5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce');\nhashMap.set('asdf','b2acfc0a6164e9a279daa724777c423f84572dafb0df09b1b0cf6f205f9eb6d0');\nhashMap.set('azure-pipelines','4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796');\nhashMap.set('batect','bd9208444eff1a4958061484db66a47b616c31f15a8d49d23b75c4560fcee83e');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','4994a8bd86d5bfb169d67c08efd8509b58c368c2bf3dd9bbe42553c0fabc3f1a');\nhashMap.set('bazel-module','40f6a862b4e72fcc7262ee41f8b570ea3fd5600d6d552b94ed3301bb201f5db5');\nhashMap.set('bazelisk','d71489650feefb0dbbe7461f924cb50e41c8eef8fe2e11acdec2d42d0212c8ef');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1ce3ef69407');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','691aa0bd20c20f7e05be5d231ed14dccdf81b9399d062448794176403aa53d94');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','e4e3e67e49e73aae6b3bfaa47950aefa3fdd4edb05e885adce645bd63685195c');\nhashMap.set('cake','ed6d14c96161f1d3d927adc7e333b96585164e1f25151a87990914d57ae17fe1');\nhashMap.set('cargo','beae41d92d6d321459b1ca6eb80e7ee6906c694fd3c01ffeec32d8053db96e44');\nhashMap.set('cdnurl','d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886');\nhashMap.set('cocoapods','3d3affcaab991e9a27916dfbc8bdddb1066be28303c37be781695bfc0645aa81');\nhashMap.set('composer','d84def5d2f07adb0b5c37195fa115a3a9d86194b57eae014d7b43d2d59fe7d1c');\nhashMap.set('conan','74ca922a0ffdf1a9dd44b83eb2b3a36c56c7d792031e3a4a484f293046be3ecd');\nhashMap.set('copier','3010e0a1f77203b001e4d851dd899d3e23a96f0c25cff8a9c1819837c9972d6a');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','a43016a9a469e0472f00855c8db64bb65ef5ffa773e7bbfade02a21400f67690');\nhashMap.set('deps-edn','c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391eeaf1b64c');\nhashMap.set('devbox','a608d1e6db93a8f997d41f8dee7b67533452a956057865978342e2819272e0a9');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb');\nhashMap.set('dockerfile','54122792bf8ea0be98e0a0716e627e3115b40a5f0155ccd7ae0cfc52424a3478');\nhashMap.set('droneci','237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee');\nhashMap.set('fleet','d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e');\nhashMap.set('flux','70833dd068ea0a746a9392469e7904021562c7629428d0cd554603bad4eb6ce5');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','e95bbc9b69a36dee82e255e8983640b7179cb5f17d24b035c6cf01d9635b35bd');\nhashMap.set('github-actions','3dea0c91977c92d9c225c16cf27ce04a2dd7a1b652f0382c59d19b4685312cb3');\nhashMap.set('gitlabci','33c264edf7837fb8fbc4cf0078c8bd2d5a75431039b1db65bf47356df7753125');\nhashMap.set('gitlabci-include','ef696c478c2ac1723b3aca070ba9779be0e702fff0844054251ba0029523d0eb');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','02389785183c39d2896d7893414c5e1060023f95c1fe7b595bd06cc5c1186d39');\nhashMap.set('gomod','ad58042f6bfba6540522d4982619492ac8952aff65ca0963f859f7a31bfc515e');\nhashMap.set('gradle','1780fe7560babe735da868a0dd1a013fea76d82abfde62028cd48f9de42fb52c');\nhashMap.set('gradle-wrapper','e16500ce08dd35ecb3ddcc3c79989648087b8249c3a95413a991627d064657ca');\nhashMap.set('haskell-cabal','f232d0e883235f74ed71fd9de4a7468e5fcbda9a1af5beb56c24657f7bf2e891');\nhashMap.set('helm-requirements','4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b');\nhashMap.set('helm-values','b5c52c6a27d805557418c585c5d3030c95ee641d53057021f3fe060f81b6e1af');\nhashMap.set('helmfile','0adc0092400df2075e1c4580ebe35bbc3b638ebee67cc948a4338094cb16a8ae');\nhashMap.set('helmsman','ef9680c612f702c7f07aea9b6e5d811e91214dcfa5755c9f3803e9528090935e');\nhashMap.set('helmv3','572f7b0b746377e0c5d6f5ad5c0b78cbed6782a561be77263cf45620b6fdad0c');\nhashMap.set('hermit','61e132cfccbe4e3884801a3728f3391455c214811a33c1f733b0dea7122bbbb6');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','9c64a4f1475b1c2052372e566c9190f32ae8acd1c54313031d55ae8772388367');\nhashMap.set('html','67c5f3c5c58e96f5dd257ba5987d900cf7fef81d667c3640e96c847b37de35a8');\nhashMap.set('jenkins','268ebfc8a1caf3edeb2192c2b1b2fa4bf18a78a3e731ba20a6c104940a5539f3');\nhashMap.set('jsonnet-bundler','e26b390528f2de43dc572bcee7cb15bb4671d2df75413a56caf1ddcee683a0ee');\nhashMap.set('kotlin-script','8a327ba00370d0df5ee656033f0526b898204ef6805cc5692221a71ca2ad654d');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','14bc841079d278b8e03b1eb184d94fef3df8811fa25beddc7ac9e6e2697b43b5');\nhashMap.set('leiningen','133fca2c3423f53f2ccc22518153ddbcafbf0f4812376c77e952eb3d24d81f85');\nhashMap.set('maven','f084cdc88320ca1e82af957d0008e7c9ce991d3282cb428f3108a5722239cead');\nhashMap.set('maven-wrapper','db967206d960b12d7c58d78132808d3c412087ababf5c59444262782e4434c6a');\nhashMap.set('meteor','4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','8509ff587ee410eeb94cbf1d4616c6a174b5f4110d0e748496edd8ed150d8b9b');\nhashMap.set('mix','ca855b0353a8087d91a63fba5cc097d11e0396a963f214a508279aef065707f0');\nhashMap.set('nix','f90bb8943129de40b50564b203df71bb86079dd134e204390a103535de1c5af7');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','788c412f962a5fcace60bc99f9f31438d001b2d70e1a6c04a26900dd5d521992');\nhashMap.set('nuget','4818fdcf3258a19228004c62a605c3fb4b6665ca09df524ab37f712ea201db89');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','32233a1a8a2725699d7448ba438e3d0b78141f7799cd2b588de278d41e26ed10');\nhashMap.set('pep621','db4dc12af1643b6883819bc8d0b4a7fc4533384e5678a61745710f0087f97ab9');\nhashMap.set('pep723','b96683163de63ed93207ec0538066705b1e58a1cd5b8bd11c63fc28b26bddba1');\nhashMap.set('pip-compile','04747259c660d6ec4f9a36d7efd1c823c78767292faf4b358c11f5507214d6f8');\nhashMap.set('pip_requirements','f92868732a7a9bb2b6d7525bd5b4515108376434fe6a2a12d802f7075c12a56c');\nhashMap.set('pip_setup','0175fe550c19d9bd31c978bd83fdc088cb40fcacd5d6751f640164274ae64e61');\nhashMap.set('pipenv','f4c5d17bfcb6f5cb8b85584d4b782379daa69ee85936ca79ef01172e5d6652a2');\nhashMap.set('pixi','3732f052617efd5007ddbe31091a2ba026909288bac4cbbe6d2bd6ac64d85393');\nhashMap.set('poetry','17e7a8e6a233ef311acfed2663b231dbf681a6d25edc9b92ae7c063205d042fc');\nhashMap.set('pre-commit','17a5f183985ebffe98785a541d3609bf25efedc387deb3d50e9f00f02b25f615');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','3ade8bf8232eda456e24909b4d1abce066e674c9ea9aa250c567cf621a96bf9b');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e1fc88a4e14cd595e89bb3d79b4adf2add3ce5eb80f75276e712c32598cca53d');\nhashMap.set('renovate-config','ca60beee2e3b871ea1216fa9df9a501f7ed355fe7da29e12509e56a124a78e69');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720');\nhashMap.set('sbt','e508c2e2fb8d44e6cbec20f449c8eed096728566e6058187269c637930d388fb');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','8d2558bce5fbcdfa4a96bf11de6f40bf6d93179025bbf6a9eeb0b7e02e8e9c00');\nhashMap.set('swift','eb5f7c3c4dabf28eed36916269ca9be16ab9ddb83993db03ea66b9195ad7bdc6');\nhashMap.set('tekton','fdc5b9b5edec2a90cda2f858f3ebc532aa8efb1187d1e0b7c89b07796e9cb6cd');\nhashMap.set('terraform','73f9d1753d1077585bd264163b7bfacaf6cf20b586b233cbb8cf058a9fce0103');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','ffcbaa67dd65f064d43f8c121c1006115eab1879c4bd38de263b9b90a009c118');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','31247d37bc80aae17039bfa21bd989c5717730c5ef10cf2a6f09841576d012ec');\nhashMap.set('travis','bb482a0195cd009ec3896a6227bb95617f5c84bedb518c7d971e50c62235d9ca');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','8901ee24116f7998bddcfc8d2492bff8138d9c66a23caea75c24d594ef4a504d');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','416bcf61144b276b3112814c6e6d261aa29608f46fbb0516c471d35c16f8f0d7');\nhashMap.set('regex','dbe6889ea021a05127fed06226d73366fdada2ae577147a5c027996fd325416e');"],"mappings":"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"}
1
+ {"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','1d3568f42393d697f8f96d461b72077ee7a1044b654e87667a12f861b3083111');\nhashMap.set('ansible-galaxy','8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('argocd','5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce');\nhashMap.set('asdf','430eb99b58171700c8a59c78b9e648575e9b176b781d90dd10a710f7b69015bb');\nhashMap.set('azure-pipelines','4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796');\nhashMap.set('batect','bd9208444eff1a4958061484db66a47b616c31f15a8d49d23b75c4560fcee83e');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','4994a8bd86d5bfb169d67c08efd8509b58c368c2bf3dd9bbe42553c0fabc3f1a');\nhashMap.set('bazel-module','f7d369015f9028c40cb79f2367d0734f18c0647d1d446d0a165007c3723c3414');\nhashMap.set('bazelisk','d71489650feefb0dbbe7461f924cb50e41c8eef8fe2e11acdec2d42d0212c8ef');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1ce3ef69407');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','691aa0bd20c20f7e05be5d231ed14dccdf81b9399d062448794176403aa53d94');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','e4e3e67e49e73aae6b3bfaa47950aefa3fdd4edb05e885adce645bd63685195c');\nhashMap.set('cake','ed6d14c96161f1d3d927adc7e333b96585164e1f25151a87990914d57ae17fe1');\nhashMap.set('cargo','beae41d92d6d321459b1ca6eb80e7ee6906c694fd3c01ffeec32d8053db96e44');\nhashMap.set('cdnurl','d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886');\nhashMap.set('cocoapods','3d3affcaab991e9a27916dfbc8bdddb1066be28303c37be781695bfc0645aa81');\nhashMap.set('composer','d84def5d2f07adb0b5c37195fa115a3a9d86194b57eae014d7b43d2d59fe7d1c');\nhashMap.set('conan','74ca922a0ffdf1a9dd44b83eb2b3a36c56c7d792031e3a4a484f293046be3ecd');\nhashMap.set('copier','3010e0a1f77203b001e4d851dd899d3e23a96f0c25cff8a9c1819837c9972d6a');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','a43016a9a469e0472f00855c8db64bb65ef5ffa773e7bbfade02a21400f67690');\nhashMap.set('deps-edn','c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391eeaf1b64c');\nhashMap.set('devbox','a608d1e6db93a8f997d41f8dee7b67533452a956057865978342e2819272e0a9');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb');\nhashMap.set('dockerfile','54122792bf8ea0be98e0a0716e627e3115b40a5f0155ccd7ae0cfc52424a3478');\nhashMap.set('droneci','237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee');\nhashMap.set('fleet','d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e');\nhashMap.set('flux','70833dd068ea0a746a9392469e7904021562c7629428d0cd554603bad4eb6ce5');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','e95bbc9b69a36dee82e255e8983640b7179cb5f17d24b035c6cf01d9635b35bd');\nhashMap.set('github-actions','3dea0c91977c92d9c225c16cf27ce04a2dd7a1b652f0382c59d19b4685312cb3');\nhashMap.set('gitlabci','33c264edf7837fb8fbc4cf0078c8bd2d5a75431039b1db65bf47356df7753125');\nhashMap.set('gitlabci-include','ef696c478c2ac1723b3aca070ba9779be0e702fff0844054251ba0029523d0eb');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','02389785183c39d2896d7893414c5e1060023f95c1fe7b595bd06cc5c1186d39');\nhashMap.set('gomod','ad58042f6bfba6540522d4982619492ac8952aff65ca0963f859f7a31bfc515e');\nhashMap.set('gradle','1780fe7560babe735da868a0dd1a013fea76d82abfde62028cd48f9de42fb52c');\nhashMap.set('gradle-wrapper','e16500ce08dd35ecb3ddcc3c79989648087b8249c3a95413a991627d064657ca');\nhashMap.set('haskell-cabal','f232d0e883235f74ed71fd9de4a7468e5fcbda9a1af5beb56c24657f7bf2e891');\nhashMap.set('helm-requirements','4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b');\nhashMap.set('helm-values','b5c52c6a27d805557418c585c5d3030c95ee641d53057021f3fe060f81b6e1af');\nhashMap.set('helmfile','0adc0092400df2075e1c4580ebe35bbc3b638ebee67cc948a4338094cb16a8ae');\nhashMap.set('helmsman','ef9680c612f702c7f07aea9b6e5d811e91214dcfa5755c9f3803e9528090935e');\nhashMap.set('helmv3','572f7b0b746377e0c5d6f5ad5c0b78cbed6782a561be77263cf45620b6fdad0c');\nhashMap.set('hermit','61e132cfccbe4e3884801a3728f3391455c214811a33c1f733b0dea7122bbbb6');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','9c64a4f1475b1c2052372e566c9190f32ae8acd1c54313031d55ae8772388367');\nhashMap.set('html','67c5f3c5c58e96f5dd257ba5987d900cf7fef81d667c3640e96c847b37de35a8');\nhashMap.set('jenkins','268ebfc8a1caf3edeb2192c2b1b2fa4bf18a78a3e731ba20a6c104940a5539f3');\nhashMap.set('jsonnet-bundler','e26b390528f2de43dc572bcee7cb15bb4671d2df75413a56caf1ddcee683a0ee');\nhashMap.set('kotlin-script','8a327ba00370d0df5ee656033f0526b898204ef6805cc5692221a71ca2ad654d');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','14bc841079d278b8e03b1eb184d94fef3df8811fa25beddc7ac9e6e2697b43b5');\nhashMap.set('leiningen','133fca2c3423f53f2ccc22518153ddbcafbf0f4812376c77e952eb3d24d81f85');\nhashMap.set('maven','f084cdc88320ca1e82af957d0008e7c9ce991d3282cb428f3108a5722239cead');\nhashMap.set('maven-wrapper','db967206d960b12d7c58d78132808d3c412087ababf5c59444262782e4434c6a');\nhashMap.set('meteor','4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','8509ff587ee410eeb94cbf1d4616c6a174b5f4110d0e748496edd8ed150d8b9b');\nhashMap.set('mix','ca855b0353a8087d91a63fba5cc097d11e0396a963f214a508279aef065707f0');\nhashMap.set('nix','f90bb8943129de40b50564b203df71bb86079dd134e204390a103535de1c5af7');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','788c412f962a5fcace60bc99f9f31438d001b2d70e1a6c04a26900dd5d521992');\nhashMap.set('nuget','4818fdcf3258a19228004c62a605c3fb4b6665ca09df524ab37f712ea201db89');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','32233a1a8a2725699d7448ba438e3d0b78141f7799cd2b588de278d41e26ed10');\nhashMap.set('pep621','db4dc12af1643b6883819bc8d0b4a7fc4533384e5678a61745710f0087f97ab9');\nhashMap.set('pep723','b96683163de63ed93207ec0538066705b1e58a1cd5b8bd11c63fc28b26bddba1');\nhashMap.set('pip-compile','04747259c660d6ec4f9a36d7efd1c823c78767292faf4b358c11f5507214d6f8');\nhashMap.set('pip_requirements','f92868732a7a9bb2b6d7525bd5b4515108376434fe6a2a12d802f7075c12a56c');\nhashMap.set('pip_setup','0175fe550c19d9bd31c978bd83fdc088cb40fcacd5d6751f640164274ae64e61');\nhashMap.set('pipenv','f4c5d17bfcb6f5cb8b85584d4b782379daa69ee85936ca79ef01172e5d6652a2');\nhashMap.set('pixi','3732f052617efd5007ddbe31091a2ba026909288bac4cbbe6d2bd6ac64d85393');\nhashMap.set('poetry','17e7a8e6a233ef311acfed2663b231dbf681a6d25edc9b92ae7c063205d042fc');\nhashMap.set('pre-commit','17a5f183985ebffe98785a541d3609bf25efedc387deb3d50e9f00f02b25f615');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','3ade8bf8232eda456e24909b4d1abce066e674c9ea9aa250c567cf621a96bf9b');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e1fc88a4e14cd595e89bb3d79b4adf2add3ce5eb80f75276e712c32598cca53d');\nhashMap.set('renovate-config','ca60beee2e3b871ea1216fa9df9a501f7ed355fe7da29e12509e56a124a78e69');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720');\nhashMap.set('sbt','e508c2e2fb8d44e6cbec20f449c8eed096728566e6058187269c637930d388fb');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','8d2558bce5fbcdfa4a96bf11de6f40bf6d93179025bbf6a9eeb0b7e02e8e9c00');\nhashMap.set('swift','eb5f7c3c4dabf28eed36916269ca9be16ab9ddb83993db03ea66b9195ad7bdc6');\nhashMap.set('tekton','fdc5b9b5edec2a90cda2f858f3ebc532aa8efb1187d1e0b7c89b07796e9cb6cd');\nhashMap.set('terraform','73f9d1753d1077585bd264163b7bfacaf6cf20b586b233cbb8cf058a9fce0103');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','ffcbaa67dd65f064d43f8c121c1006115eab1879c4bd38de263b9b90a009c118');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','31247d37bc80aae17039bfa21bd989c5717730c5ef10cf2a6f09841576d012ec');\nhashMap.set('travis','bb482a0195cd009ec3896a6227bb95617f5c84bedb518c7d971e50c62235d9ca');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','8901ee24116f7998bddcfc8d2492bff8138d9c66a23caea75c24d594ef4a504d');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','416bcf61144b276b3112814c6e6d261aa29608f46fbb0516c471d35c16f8f0d7');\nhashMap.set('regex','dbe6889ea021a05127fed06226d73366fdada2ae577147a5c027996fd325416e');"],"mappings":";AAAA,MAAa,0BAAU,IAAI,IAAoB;AAE/C,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,kBAAiB,kEAAkE;AAC/F,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,mBAAkB,kEAAkE;AAChG,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,kBAAiB,kEAAkE;AAC/F,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,gBAAe,kEAAkE;AAC7F,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,uBAAsB,kEAAkE;AACpG,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,eAAc,kEAAkE;AAC5F,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,gBAAe,kEAAkE;AAC7F,QAAQ,IAAI,kBAAiB,kEAAkE;AAC/F,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,kBAAiB,kEAAkE;AAC/F,QAAQ,IAAI,kBAAiB,kEAAkE;AAC/F,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,oBAAmB,kEAAkE;AACjG,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,kBAAiB,kEAAkE;AAC/F,QAAQ,IAAI,iBAAgB,kEAAkE;AAC9F,QAAQ,IAAI,qBAAoB,kEAAkE;AAClG,QAAQ,IAAI,eAAc,kEAAkE;AAC5F,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,0BAAyB,kEAAkE;AACvG,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,mBAAkB,kEAAkE;AAChG,QAAQ,IAAI,iBAAgB,kEAAkE;AAC9F,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,iBAAgB,kEAAkE;AAC9F,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,eAAc,kEAAkE;AAC5F,QAAQ,IAAI,oBAAmB,kEAAkE;AACjG,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,mBAAkB,kEAAkE;AAChG,QAAQ,IAAI,gBAAe,kEAAkE;AAC7F,QAAQ,IAAI,mBAAkB,kEAAkE;AAChG,QAAQ,IAAI,kBAAiB,kEAAkE;AAC/F,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,qBAAoB,kEAAkE;AAClG,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,sBAAqB,kEAAkE;AACnG,QAAQ,IAAI,iBAAgB,kEAAkE;AAC9F,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,SAAQ,kEAAkE"}
@@ -1 +1 @@
1
- {"version":3,"file":"community.js","names":["condaVersioning.id"],"sources":["../../../../lib/modules/manager/github-actions/community.ts"],"sourcesContent":["import { z } from 'zod/v4';\n\nimport { regEx } from '../../../util/regex.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { GithubReleaseAttachmentsDatasource } from '../../datasource/github-release-attachments/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { NodeVersionDatasource } from '../../datasource/node-version/index.ts';\nimport { NpmDatasource } from '../../datasource/npm/index.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport { RubyVersionDatasource } from '../../datasource/ruby-version/index.ts';\nimport { RustVersionDatasource } from '../../datasource/rust-version/index.ts';\nimport * as condaVersioning from '../../versioning/conda/index.ts';\nimport * as npmVersioning from '../../versioning/npm/index.ts';\nimport type { PackageDependency } from '../types.ts';\n\n/**\n * Parses a step - or just its `with:` block - into the dependencies it\n * declares. Most actions declare a single one, but a step may yield several.\n */\nexport type ActionSchema = z.ZodType<PackageDependency[]>;\n\nexport interface CommunityActionConfig {\n datasource: string;\n depName?: string;\n packageName: string;\n versioning?: string;\n extractVersion?: string;\n\n /**\n * Parses the `with:` block, defaulting to the `version:` input.\n *\n * The fields above are applied to every dependency it yields, so a schema\n * which yields dependencies of more than one kind must set them itself.\n */\n withSchema?: ActionSchema;\n}\n\nexport function actionSchema(\n name: string,\n { withSchema, ...cfg }: CommunityActionConfig,\n): ActionSchema {\n return z\n .object({\n uses: matchAction(name),\n with: withSchema ?? VersionVal,\n })\n .transform(({ with: deps }) =>\n deps.map((dep) => {\n const merged = { ...cfg, ...dep };\n merged.depName ??= merged.packageName;\n return merged;\n }),\n );\n}\n\nfunction matchAction(action: string): z.ZodString {\n return z\n .string()\n .regex(regEx(`(?:https?://[^/]+/)?${RegExp.escape(action)}(?:@.+)?$`));\n}\n\nfunction parseValue(\n currentValue: string | undefined,\n isInvalid?: (val: string) => boolean,\n): PackageDependency {\n if (!currentValue) {\n return {\n skipStage: 'extract',\n skipReason: 'unspecified-version',\n depType: 'uses-with',\n };\n }\n if (isInvalid?.(currentValue) === true) {\n return {\n skipStage: 'extract',\n skipReason: 'invalid-version',\n depType: 'uses-with',\n currentValue,\n };\n }\n return { currentValue, depType: 'uses-with' };\n}\n\n/**\n * A single dependency, versioned by the given `with:` input.\n *\n * @param isInvalid should return `true` if the version is invalid and should be skipped\n */\nfunction valSchema(\n key: string,\n isInvalid?: (val: string) => boolean,\n): ActionSchema {\n return z\n .object({ [key]: z.string().optional() })\n .transform((val) => [parseValue(val[key], isInvalid)]);\n}\n\nconst VersionVal = valSchema('version');\n\nconst InstallBinaryWith: ActionSchema = z\n .object({ repo: z.string(), tag: z.string() })\n .transform(({ repo, tag }) => [{ packageName: repo, ...parseValue(tag) }]);\n\nconst sha256Regex = regEx(/^[a-f0-9]{64}$/);\nconst MiseWith: ActionSchema = z\n .object({\n version: z.string().optional(),\n sha256: z.string().optional(),\n })\n .transform(({ version, sha256 }) => [\n {\n ...parseValue(version),\n ...(sha256 && sha256Regex.test(sha256) ? { currentDigest: sha256 } : {}),\n },\n ]);\n\n// Runtimes installable by `pnpm/setup`, keyed by the name used in its\n// `runtime:` input. `bun` and `deno` reuse the datasources of their respective\n// `setup-*` actions below.\nconst pnpmRuntimes: Record<string, PackageDependency | undefined> = {\n node: { datasource: NodeVersionDatasource.id, packageName: 'node' },\n bun: { datasource: NpmDatasource.id, packageName: 'bun' },\n deno: { datasource: NpmDatasource.id, packageName: 'deno' },\n};\n\nfunction parsePnpmRuntime(runtime: string | undefined): PackageDependency[] {\n if (!runtime) {\n return [];\n }\n\n // `<name>` or `<name>@<version>`, matching pnpm's `packageManager` field syntax\n const [name, version] = runtime.split('@');\n const cfg = pnpmRuntimes[name];\n if (!cfg) {\n return [\n {\n packageName: name || runtime,\n depType: 'uses-with',\n skipStage: 'extract',\n skipReason: 'invalid-name',\n },\n ];\n }\n\n return [{ ...cfg, ...parseValue(version) }];\n}\n\nconst PnpmSetupWith: ActionSchema = z\n .object({\n version: z.string().optional(),\n runtime: z.string().optional(),\n })\n .transform(({ version, runtime }) => [\n parseValue(version),\n ...parsePnpmRuntime(runtime),\n ]);\n\n/**\n * Community contributed actions with known version input schemas.\n */\nexport const communityActions: Record<string, CommunityActionConfig> = {\n // https://github.com/aquasecurity/setup-trivy\n 'aquasecurity/setup-trivy': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'aquasecurity/trivy',\n },\n // https://github.com/aquasecurity/trivy-action\n 'aquasecurity/trivy-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'aquasecurity/trivy',\n },\n // https://github.com/astral-sh/setup-uv\n 'astral-sh/setup-uv': {\n datasource: GithubReleasesDatasource.id,\n versioning: npmVersioning.id,\n packageName: 'astral-sh/uv',\n },\n 'azure/setup-helm': {\n datasource: GithubReleasesDatasource.id,\n depName: 'helm',\n packageName: 'helm/helm',\n },\n // https://github.com/azure/setup-helm\n 'denoland/setup-deno': {\n datasource: NpmDatasource.id,\n packageName: 'deno',\n withSchema: valSchema('deno-version'),\n },\n // https://github.com/docker/setup-buildx-action\n 'docker/setup-buildx-action': {\n datasource: GithubReleasesDatasource.id,\n depName: 'buildx',\n packageName: 'docker/buildx',\n },\n // https://github.com/docker/setup-compose-action\n 'docker/setup-compose-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'docker/compose',\n },\n // https://github.com/docker/setup-docker-action\n 'docker/setup-docker-action': {\n datasource: GithubReleasesDatasource.id,\n depName: 'docker',\n packageName: 'moby/moby',\n extractVersion: '^docker-(?<version>.+)$',\n },\n // https://github.com/dtolnay/rust-toolchain\n 'dtolnay/rust-toolchain': {\n datasource: RustVersionDatasource.id,\n packageName: 'rust',\n withSchema: valSchema('toolchain'),\n },\n 'golangci/golangci-lint-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'golangci/golangci-lint',\n },\n // https://github.com/helm/chart-testing-action\n 'helm/chart-testing-action': {\n datasource: GithubReleasesDatasource.id,\n depName: 'chart-testing',\n packageName: 'helm/chart-testing',\n },\n 'jakebailey/pyright-action': {\n datasource: NpmDatasource.id,\n packageName: 'pyright',\n withSchema: valSchema('version', (val) => val === 'PATH'),\n },\n 'jaxxstorm/action-install-gh-release': {\n datasource: GithubReleasesDatasource.id,\n packageName: '', // determined from `repo` input\n withSchema: InstallBinaryWith,\n },\n 'jdx/mise-action': {\n datasource: GithubReleaseAttachmentsDatasource.id,\n packageName: 'jdx/mise',\n withSchema: MiseWith,\n },\n 'oven-sh/setup-bun': {\n datasource: NpmDatasource.id,\n packageName: 'bun',\n withSchema: valSchema('bun-version'),\n },\n 'pdm-project/setup-pdm': {\n datasource: PypiDatasource.id,\n packageName: 'pdm',\n },\n 'pnpm/action-setup': {\n datasource: NpmDatasource.id,\n packageName: 'pnpm',\n },\n 'pnpm/setup': {\n datasource: NpmDatasource.id,\n packageName: 'pnpm',\n withSchema: PnpmSetupWith,\n },\n 'prefix-dev/setup-pixi': {\n datasource: GithubReleasesDatasource.id,\n versioning: condaVersioning.id,\n packageName: 'prefix-dev/pixi',\n withSchema: valSchema('pixi-version'),\n },\n // https://github.com/pypa/hatch/tree/install\n 'pypa/hatch': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'pypa/hatch',\n // Strip hatch- prefix from release tags\n extractVersion: '^hatch-(?<version>.+)$',\n },\n 'ruby/setup-ruby': {\n datasource: RubyVersionDatasource.id,\n packageName: 'ruby',\n withSchema: valSchema('ruby-version'),\n },\n 'sigoden/install-binary': {\n datasource: GithubReleasesDatasource.id,\n packageName: '', // determined from `repo` input\n withSchema: InstallBinaryWith,\n },\n 'sigstore/cosign-installer': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'sigstore/cosign',\n withSchema: valSchema('cosign-release'),\n },\n 'UpCloudLtd/upcloud-cli-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'UpCloudLtd/upcloud-cli',\n },\n 'zizmorcore/zizmor-action': {\n datasource: DockerDatasource.id,\n packageName: 'ghcr.io/zizmorcore/zizmor',\n },\n};\n"],"mappings":";;;;;;;;;;;;;AAqCA,SAAgB,aACd,MACA,EAAE,YAAY,GAAG,OACH;CACd,OAAO,EACJ,OAAO;EACN,MAAM,YAAY,IAAI;EACtB,MAAM,cAAc;CACtB,CAAC,CAAC,CACD,WAAW,EAAE,MAAM,WAClB,KAAK,KAAK,QAAQ;EAChB,MAAM,SAAS;GAAE,GAAG;GAAK,GAAG;EAAI;EAChC,OAAO,YAAY,OAAO;EAC1B,OAAO;CACT,CAAC,CACH;AACJ;AAEA,SAAS,YAAY,QAA6B;CAChD,OAAO,EACJ,OAAO,CAAC,CACR,MAAM,MAAM,uBAAuB,OAAO,OAAO,MAAM,EAAE,UAAU,CAAC;AACzE;AAEA,SAAS,WACP,cACA,WACmB;CACnB,IAAI,CAAC,cACH,OAAO;EACL,WAAW;EACX,YAAY;EACZ,SAAS;CACX;CAEF,IAAI,YAAY,YAAY,MAAM,MAChC,OAAO;EACL,WAAW;EACX,YAAY;EACZ,SAAS;EACT;CACF;CAEF,OAAO;EAAE;EAAc,SAAS;CAAY;AAC9C;;;;;;AAOA,SAAS,UACP,KACA,WACc;CACd,OAAO,EACJ,OAAO,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CACxC,WAAW,QAAQ,CAAC,WAAW,IAAI,MAAM,SAAS,CAAC,CAAC;AACzD;AAEA,MAAM,aAAa,UAAU,SAAS;AAEtC,MAAM,oBAAkC,EACrC,OAAO;CAAE,MAAM,EAAE,OAAO;CAAG,KAAK,EAAE,OAAO;AAAE,CAAC,CAAC,CAC7C,WAAW,EAAE,MAAM,UAAU,CAAC;CAAE,aAAa;CAAM,GAAG,WAAW,GAAG;AAAE,CAAC,CAAC;AAE3E,MAAM,cAAc,MAAM,gBAAgB;AAC1C,MAAM,WAAyB,EAC5B,OAAO;CACN,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS;CAC7B,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;AAC9B,CAAC,CAAC,CACD,WAAW,EAAE,SAAS,aAAa,CAClC;CACE,GAAG,WAAW,OAAO;CACrB,GAAI,UAAU,YAAY,KAAK,MAAM,IAAI,EAAE,eAAe,OAAO,IAAI,CAAC;AACxE,CACF,CAAC;AAKH,MAAM,eAA8D;CAClE,MAAM;EAAE,YAAY,sBAAsB;EAAI,aAAa;CAAO;CAClE,KAAK;EAAE,YAAY,cAAc;EAAI,aAAa;CAAM;CACxD,MAAM;EAAE,YAAY,cAAc;EAAI,aAAa;CAAO;AAC5D;AAEA,SAAS,iBAAiB,SAAkD;CAC1E,IAAI,CAAC,SACH,OAAO,CAAC;CAIV,MAAM,CAAC,MAAM,WAAW,QAAQ,MAAM,GAAG;CACzC,MAAM,MAAM,aAAa;CACzB,IAAI,CAAC,KACH,OAAO,CACL;EACE,aAAa,QAAQ;EACrB,SAAS;EACT,WAAW;EACX,YAAY;CACd,CACF;CAGF,OAAO,CAAC;EAAE,GAAG;EAAK,GAAG,WAAW,OAAO;CAAE,CAAC;AAC5C;AAEA,MAAM,gBAA8B,EACjC,OAAO;CACN,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS;CAC7B,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS;AAC/B,CAAC,CAAC,CACD,WAAW,EAAE,SAAS,cAAc,CACnC,WAAW,OAAO,GAClB,GAAG,iBAAiB,OAAO,CAC7B,CAAC;;;;AAKH,MAAa,mBAA0D;CAErE,4BAA4B;EAC1B,YAAY,yBAAyB;EACrC,aAAa;CACf;CAEA,6BAA6B;EAC3B,YAAY,yBAAyB;EACrC,aAAa;CACf;CAEA,sBAAsB;EACpB,YAAY,yBAAyB;EACrC,YAAY;EACZ,aAAa;CACf;CACA,oBAAoB;EAClB,YAAY,yBAAyB;EACrC,SAAS;EACT,aAAa;CACf;CAEA,uBAAuB;EACrB,YAAY,cAAc;EAC1B,aAAa;EACb,YAAY,UAAU,cAAc;CACtC;CAEA,8BAA8B;EAC5B,YAAY,yBAAyB;EACrC,SAAS;EACT,aAAa;CACf;CAEA,+BAA+B;EAC7B,YAAY,yBAAyB;EACrC,aAAa;CACf;CAEA,8BAA8B;EAC5B,YAAY,yBAAyB;EACrC,SAAS;EACT,aAAa;EACb,gBAAgB;CAClB;CAEA,0BAA0B;EACxB,YAAY,sBAAsB;EAClC,aAAa;EACb,YAAY,UAAU,WAAW;CACnC;CACA,iCAAiC;EAC/B,YAAY,yBAAyB;EACrC,aAAa;CACf;CAEA,6BAA6B;EAC3B,YAAY,yBAAyB;EACrC,SAAS;EACT,aAAa;CACf;CACA,6BAA6B;EAC3B,YAAY,cAAc;EAC1B,aAAa;EACb,YAAY,UAAU,YAAY,QAAQ,QAAQ,MAAM;CAC1D;CACA,uCAAuC;EACrC,YAAY,yBAAyB;EACrC,aAAa;EACb,YAAY;CACd;CACA,mBAAmB;EACjB,YAAY,mCAAmC;EAC/C,aAAa;EACb,YAAY;CACd;CACA,qBAAqB;EACnB,YAAY,cAAc;EAC1B,aAAa;EACb,YAAY,UAAU,aAAa;CACrC;CACA,yBAAyB;EACvB,YAAY,eAAe;EAC3B,aAAa;CACf;CACA,qBAAqB;EACnB,YAAY,cAAc;EAC1B,aAAa;CACf;CACA,cAAc;EACZ,YAAY,cAAc;EAC1B,aAAa;EACb,YAAY;CACd;CACA,yBAAyB;EACvB,YAAY,yBAAyB;EACrC,YAAYA;EACZ,aAAa;EACb,YAAY,UAAU,cAAc;CACtC;CAEA,cAAc;EACZ,YAAY,yBAAyB;EACrC,aAAa;EAEb,gBAAgB;CAClB;CACA,mBAAmB;EACjB,YAAY,sBAAsB;EAClC,aAAa;EACb,YAAY,UAAU,cAAc;CACtC;CACA,0BAA0B;EACxB,YAAY,yBAAyB;EACrC,aAAa;EACb,YAAY;CACd;CACA,6BAA6B;EAC3B,YAAY,yBAAyB;EACrC,aAAa;EACb,YAAY,UAAU,gBAAgB;CACxC;CACA,iCAAiC;EAC/B,YAAY,yBAAyB;EACrC,aAAa;CACf;CACA,4BAA4B;EAC1B,YAAY,iBAAiB;EAC7B,aAAa;CACf;AACF"}
1
+ {"version":3,"file":"community.js","names":["condaVersioning.id"],"sources":["../../../../lib/modules/manager/github-actions/community.ts"],"sourcesContent":["import { z } from 'zod/v4';\n\nimport { regEx } from '../../../util/regex.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { GithubReleaseAttachmentsDatasource } from '../../datasource/github-release-attachments/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { NodeVersionDatasource } from '../../datasource/node-version/index.ts';\nimport { NpmDatasource } from '../../datasource/npm/index.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport { RubyVersionDatasource } from '../../datasource/ruby-version/index.ts';\nimport { RustVersionDatasource } from '../../datasource/rust-version/index.ts';\nimport * as condaVersioning from '../../versioning/conda/index.ts';\nimport * as npmVersioning from '../../versioning/npm/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport type { ActionSchema, CommunityActionConfig } from './types.ts';\n\nexport function actionSchema(\n name: string,\n { withSchema, ...cfg }: CommunityActionConfig,\n): ActionSchema {\n return z\n .object({\n uses: matchAction(name),\n with: withSchema ?? VersionVal,\n })\n .transform(({ with: deps }) =>\n deps.map((dep) => {\n const merged = { ...cfg, ...dep };\n merged.depName ??= merged.packageName;\n return merged;\n }),\n );\n}\n\nfunction matchAction(action: string): z.ZodString {\n return z\n .string()\n .regex(regEx(`(?:https?://[^/]+/)?${RegExp.escape(action)}(?:@.+)?$`));\n}\n\nfunction parseValue(\n currentValue: string | undefined,\n isInvalid?: (val: string) => boolean,\n): PackageDependency {\n if (!currentValue) {\n return {\n skipStage: 'extract',\n skipReason: 'unspecified-version',\n depType: 'uses-with',\n };\n }\n if (isInvalid?.(currentValue) === true) {\n return {\n skipStage: 'extract',\n skipReason: 'invalid-version',\n depType: 'uses-with',\n currentValue,\n };\n }\n return { currentValue, depType: 'uses-with' };\n}\n\n/**\n * A single dependency, versioned by the given `with:` input.\n *\n * @param isInvalid should return `true` if the version is invalid and should be skipped\n */\nfunction valSchema(\n key: string,\n isInvalid?: (val: string) => boolean,\n): ActionSchema {\n return z\n .object({ [key]: z.string().optional() })\n .transform((val) => [parseValue(val[key], isInvalid)]);\n}\n\nconst VersionVal = valSchema('version');\n\nconst InstallBinaryWith: ActionSchema = z\n .object({ repo: z.string(), tag: z.string() })\n .transform(({ repo, tag }) => [{ packageName: repo, ...parseValue(tag) }]);\n\nconst sha256Regex = regEx(/^[a-f0-9]{64}$/);\nconst MiseWith: ActionSchema = z\n .object({\n version: z.string().optional(),\n sha256: z.string().optional(),\n })\n .transform(({ version, sha256 }) => [\n {\n ...parseValue(version),\n ...(sha256 && sha256Regex.test(sha256) ? { currentDigest: sha256 } : {}),\n },\n ]);\n\n// Runtimes installable by `pnpm/setup`, keyed by the name used in its\n// `runtime:` input. `bun` and `deno` reuse the datasources of their respective\n// `setup-*` actions below.\nconst pnpmRuntimes: Record<string, PackageDependency | undefined> = {\n node: { datasource: NodeVersionDatasource.id, packageName: 'node' },\n bun: { datasource: NpmDatasource.id, packageName: 'bun' },\n deno: { datasource: NpmDatasource.id, packageName: 'deno' },\n};\n\nfunction parsePnpmRuntime(runtime: string | undefined): PackageDependency[] {\n if (!runtime) {\n return [];\n }\n\n // `<name>` or `<name>@<version>`, matching pnpm's `packageManager` field syntax\n const [name, version] = runtime.split('@');\n const cfg = pnpmRuntimes[name];\n if (!cfg) {\n return [\n {\n packageName: name || runtime,\n depType: 'uses-with',\n skipStage: 'extract',\n skipReason: 'invalid-name',\n },\n ];\n }\n\n return [{ ...cfg, ...parseValue(version) }];\n}\n\nconst PnpmSetupWith: ActionSchema = z\n .object({\n version: z.string().optional(),\n runtime: z.string().optional(),\n })\n .transform(({ version, runtime }) => [\n parseValue(version),\n ...parsePnpmRuntime(runtime),\n ]);\n\n/**\n * Community contributed actions with known version input schemas.\n */\nexport const communityActions: Record<string, CommunityActionConfig> = {\n // https://github.com/aquasecurity/setup-trivy\n 'aquasecurity/setup-trivy': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'aquasecurity/trivy',\n },\n // https://github.com/aquasecurity/trivy-action\n 'aquasecurity/trivy-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'aquasecurity/trivy',\n },\n // https://github.com/astral-sh/setup-uv\n 'astral-sh/setup-uv': {\n datasource: GithubReleasesDatasource.id,\n versioning: npmVersioning.id,\n packageName: 'astral-sh/uv',\n },\n 'azure/setup-helm': {\n datasource: GithubReleasesDatasource.id,\n depName: 'helm',\n packageName: 'helm/helm',\n },\n // https://github.com/azure/setup-helm\n 'denoland/setup-deno': {\n datasource: NpmDatasource.id,\n packageName: 'deno',\n withSchema: valSchema('deno-version'),\n },\n // https://github.com/docker/setup-buildx-action\n 'docker/setup-buildx-action': {\n datasource: GithubReleasesDatasource.id,\n depName: 'buildx',\n packageName: 'docker/buildx',\n },\n // https://github.com/docker/setup-compose-action\n 'docker/setup-compose-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'docker/compose',\n },\n // https://github.com/docker/setup-docker-action\n 'docker/setup-docker-action': {\n datasource: GithubReleasesDatasource.id,\n depName: 'docker',\n packageName: 'moby/moby',\n extractVersion: '^docker-(?<version>.+)$',\n },\n // https://github.com/dtolnay/rust-toolchain\n 'dtolnay/rust-toolchain': {\n datasource: RustVersionDatasource.id,\n packageName: 'rust',\n withSchema: valSchema('toolchain'),\n },\n 'golangci/golangci-lint-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'golangci/golangci-lint',\n },\n // https://github.com/helm/chart-testing-action\n 'helm/chart-testing-action': {\n datasource: GithubReleasesDatasource.id,\n depName: 'chart-testing',\n packageName: 'helm/chart-testing',\n },\n 'jakebailey/pyright-action': {\n datasource: NpmDatasource.id,\n packageName: 'pyright',\n withSchema: valSchema('version', (val) => val === 'PATH'),\n },\n 'jaxxstorm/action-install-gh-release': {\n datasource: GithubReleasesDatasource.id,\n packageName: '', // determined from `repo` input\n withSchema: InstallBinaryWith,\n },\n 'jdx/mise-action': {\n datasource: GithubReleaseAttachmentsDatasource.id,\n packageName: 'jdx/mise',\n withSchema: MiseWith,\n },\n 'oven-sh/setup-bun': {\n datasource: NpmDatasource.id,\n packageName: 'bun',\n withSchema: valSchema('bun-version'),\n },\n 'pdm-project/setup-pdm': {\n datasource: PypiDatasource.id,\n packageName: 'pdm',\n },\n 'pnpm/action-setup': {\n datasource: NpmDatasource.id,\n packageName: 'pnpm',\n },\n 'pnpm/setup': {\n datasource: NpmDatasource.id,\n packageName: 'pnpm',\n withSchema: PnpmSetupWith,\n },\n 'prefix-dev/setup-pixi': {\n datasource: GithubReleasesDatasource.id,\n versioning: condaVersioning.id,\n packageName: 'prefix-dev/pixi',\n withSchema: valSchema('pixi-version'),\n },\n // https://github.com/pypa/hatch/tree/install\n 'pypa/hatch': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'pypa/hatch',\n // Strip hatch- prefix from release tags\n extractVersion: '^hatch-(?<version>.+)$',\n },\n 'ruby/setup-ruby': {\n datasource: RubyVersionDatasource.id,\n packageName: 'ruby',\n withSchema: valSchema('ruby-version'),\n },\n 'sigoden/install-binary': {\n datasource: GithubReleasesDatasource.id,\n packageName: '', // determined from `repo` input\n withSchema: InstallBinaryWith,\n },\n 'sigstore/cosign-installer': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'sigstore/cosign',\n withSchema: valSchema('cosign-release'),\n },\n 'UpCloudLtd/upcloud-cli-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'UpCloudLtd/upcloud-cli',\n },\n 'zizmorcore/zizmor-action': {\n datasource: DockerDatasource.id,\n packageName: 'ghcr.io/zizmorcore/zizmor',\n },\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":["githubActionsVersioning.id","exactVersioning.id","nodeVersioning.id","memCache.get"],"sources":["../../../../lib/modules/manager/github-actions/extract.ts"],"sourcesContent":["import is from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger, withMeta } from '../../../logger/index.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { ForgejoTagsDatasource } from '../../datasource/forgejo-tags/index.ts';\nimport { GiteaTagsDatasource } from '../../datasource/gitea-tags/index.ts';\nimport { GithubDigestDatasource } from '../../datasource/github-digest/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { GithubRunnersDatasource } from '../../datasource/github-runners/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport * as dockerVersioning from '../../versioning/docker/index.ts';\nimport * as exactVersioning from '../../versioning/exact/index.ts';\nimport * as githubActionsVersioning from '../../versioning/github-actions/index.ts';\nimport * as nodeVersioning from '../../versioning/node/index.ts';\nimport * as npmVersioning from '../../versioning/npm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { actionsLockFile, isLockfileManaged } from './common.ts';\nimport type { DockerReference, RepositoryReference } from './parse.ts';\nimport { isSha, isShortSha, parseUsesLine, versionLikeRe } from './parse.ts';\nimport type { UsesStep } from './schema.ts';\nimport { ActionsLockfile, CommunityActions, Workflow } from './schema.ts';\nimport type { LockfileState } from './types.ts';\n\n// detects if we run against a Github Enterprise Server and adds the URL to the beginning of the registryURLs for looking up Actions\n// This reflects the behavior of how GitHub looks up Actions\n// First on the Enterprise Server, then on GitHub.com\nfunction detectCustomGitHubRegistryUrlsForActions(): PackageDependency {\n const endpoint = GlobalConfig.get('endpoint');\n const registryUrls = ['https://github.com'];\n if (endpoint && GlobalConfig.get('platform') === 'github') {\n const parsedEndpoint = parseUrl(endpoint);\n if (!parsedEndpoint) {\n logger.warn({ endpoint }, 'Failed to parse endpoint url');\n return {};\n }\n\n if (\n parsedEndpoint.host !== 'github.com' &&\n parsedEndpoint.host !== 'api.github.com'\n ) {\n registryUrls.unshift(\n `${parsedEndpoint.protocol}//${parsedEndpoint.host}`,\n );\n return { registryUrls };\n }\n }\n return {};\n}\n\nfunction extractDockerAction(\n actionRef: DockerReference,\n config: ExtractConfig,\n): PackageDependency {\n const dep = getDep(actionRef.originalRef, true, config.registryAliases);\n dep.depType = 'docker';\n dep.replaceString = actionRef.originalRef;\n return dep;\n}\n\nconst reusableWorkflowPathRe = regEx(/^\\.github\\/workflows\\/[^/]+\\.ya?ml$/);\n\nfunction extractRepositoryAction(\n actionRef: RepositoryReference,\n parsed: ReturnType<typeof parseUsesLine> & object,\n customRegistryUrlsPackageDependency: PackageDependency,\n): PackageDependency {\n const {\n replaceString: valueString,\n quote,\n commentData,\n commentPrecedingWhitespace,\n } = parsed;\n const {\n owner,\n repo,\n path: subPath,\n ref,\n hostname,\n isExplicitHostname,\n } = actionRef;\n\n const registryUrl = isExplicitHostname ? `https://${hostname}/` : '';\n const packageName = `${owner}/${repo}`;\n const depName = `${registryUrl}${packageName}`;\n const pathSuffix = subPath ? `/${subPath}` : '';\n const commentWs = commentPrecedingWhitespace || ' ';\n const isReusableWorkflow = !!subPath && reusableWorkflowPathRe.test(subPath);\n\n const dep: PackageDependency = {\n depName,\n commitMessageTopic: '{{{depName}}} action',\n versioning: githubActionsVersioning.id,\n depType: isReusableWorkflow ? 'workflow' : 'action',\n replaceString: valueString,\n autoReplaceStringTemplate: `${quote}{{depName}}${pathSuffix}@{{#if newDigest}}{{newDigest}}${quote}{{#if newValue}}${commentWs}# {{newValue}}{{/if}}{{/if}}{{#unless newDigest}}{{newValue}}${quote}{{/unless}}`,\n ...(isExplicitHostname\n ? detectDatasource(registryUrl)\n : customRegistryUrlsPackageDependency),\n };\n\n if (packageName !== depName) {\n dep.packageName = packageName;\n }\n\n // Extend replaceString to include relevant comment portions:\n // - Pinned version or ref: include only up to the matched token (truncate trailing text)\n // - Ratchet exclude: include the full comment to preserve the marker\n const pinComment =\n commentData.pinnedVersion ??\n (isSha(ref) || isShortSha(ref) ? commentData.ref : undefined);\n if (\n pinComment &&\n !is.undefined(commentData.index) &&\n !is.undefined(commentData.matchedString)\n ) {\n const cleanComment = parsed.commentString.slice(1);\n const matchEndIndex = commentData.index + commentData.matchedString.length;\n const commentSuffix = cleanComment.slice(0, matchEndIndex);\n dep.replaceString = `${valueString}${commentPrecedingWhitespace}#${commentSuffix}`;\n } else if (commentData.ratchetExclude) {\n dep.replaceString =\n valueString + commentPrecedingWhitespace + parsed.commentString;\n }\n\n if (isSha(ref)) {\n dep.currentValue = commentData.pinnedVersion ?? commentData.ref;\n dep.currentDigest = ref;\n } else if (isShortSha(ref)) {\n dep.currentValue = commentData.pinnedVersion ?? commentData.ref;\n dep.currentDigestShort = ref;\n } else {\n dep.currentValue = ref;\n }\n\n if (!dep.currentValue) {\n dep.enabled = false;\n dep.skipReason = 'unversioned-reference';\n }\n\n const isVersionLike =\n dep.currentValue && versionLikeRe.test(dep.currentValue);\n if (!dep.datasource && dep.currentValue && !isVersionLike) {\n dep.datasource = GithubDigestDatasource.id;\n dep.versioning = exactVersioning.id;\n }\n\n dep.datasource ??= GithubTagsDatasource.id;\n\n return dep;\n}\n\nfunction extractWithRegex(\n content: string,\n config: ExtractConfig,\n): PackageDependency[] {\n const customRegistryUrlsPackageDependency =\n detectCustomGitHubRegistryUrlsForActions();\n logger.trace('github-actions.extractWithRegex()');\n const deps: PackageDependency[] = [];\n\n for (const line of content.split(newlineRegex)) {\n if (line.trim().startsWith('#')) {\n continue;\n }\n\n const parsed = parseUsesLine(line);\n if (!parsed?.actionRef) {\n continue;\n }\n\n const { actionRef } = parsed;\n\n if (actionRef.kind === 'docker') {\n deps.push(extractDockerAction(actionRef, config));\n continue;\n }\n\n if (actionRef.kind === 'repository') {\n deps.push(\n extractRepositoryAction(\n actionRef,\n parsed,\n customRegistryUrlsPackageDependency,\n ),\n );\n }\n }\n\n return deps;\n}\n\nfunction detectDatasource(registryUrl: string): PackageDependency {\n const platform = detectPlatform(registryUrl);\n\n switch (platform) {\n case 'forgejo':\n return {\n registryUrls: [registryUrl],\n datasource: ForgejoTagsDatasource.id,\n };\n case 'gitea':\n return {\n registryUrls: [registryUrl],\n datasource: GiteaTagsDatasource.id,\n };\n case 'github':\n return { registryUrls: [registryUrl] };\n }\n\n return {\n skipReason: 'unsupported-url',\n };\n}\n\nconst runnerVersionRegex = regEx(\n /^\\s*(?<depName>[a-zA-Z]+)-(?<currentValue>[^\\s]+)/,\n);\n\nfunction extractRunner(runner: string): PackageDependency | null {\n const runnerVersionGroups = runnerVersionRegex.exec(runner)?.groups;\n if (!runnerVersionGroups) {\n return null;\n }\n\n const { depName, currentValue } = runnerVersionGroups;\n\n if (!GithubRunnersDatasource.isValidRunner(depName, currentValue)) {\n return null;\n }\n\n const dependency: PackageDependency = {\n depName,\n currentValue,\n replaceString: `${depName}-${currentValue}`,\n depType: 'github-runner',\n datasource: GithubRunnersDatasource.id,\n autoReplaceStringTemplate: '{{depName}}-{{newValue}}',\n };\n\n if (!dockerVersioning.api.isValid(currentValue)) {\n dependency.skipReason = 'invalid-version';\n }\n\n return dependency;\n}\n\n// For official https://github.com/actions\nconst versionedActions: Record<string, string> = {\n go: npmVersioning.id,\n node: nodeVersioning.id,\n python: npmVersioning.id,\n\n // Not covered yet because they use different datasources/packageNames:\n // - dotnet\n // - java\n};\n\nfunction extractVersionedAction(step: UsesStep): PackageDependency | null {\n for (const [action, versioning] of Object.entries(versionedActions)) {\n const actionName = `actions/setup-${action}`;\n if (step.uses !== actionName && !step.uses?.startsWith(`${actionName}@`)) {\n continue;\n }\n\n const fieldName = `${action}-version`;\n const currentValue = step.with?.[fieldName];\n if (!currentValue) {\n return null;\n }\n\n return {\n datasource: GithubReleasesDatasource.id,\n depName: action,\n packageName: `actions/${action}-versions`,\n versioning,\n extractVersion: '^(?<version>\\\\d+\\\\.\\\\d+\\\\.\\\\d+)(-\\\\d+)?$',\n currentValue,\n depType: 'uses-with',\n };\n }\n return null;\n}\n\nfunction extractSteps(steps: UsesStep[]): PackageDependency[] {\n const deps: PackageDependency[] = [];\n\n for (const step of steps) {\n const res = CommunityActions.safeParse(step);\n if (res.success) {\n deps.push(...res.data);\n continue;\n }\n\n const versionedDep = extractVersionedAction(step);\n if (versionedDep) {\n deps.push(versionedDep);\n }\n }\n\n return deps;\n}\n\nfunction extractWithYAMLParser(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageDependency[] {\n logger.trace('github-actions.extractWithYAMLParser()');\n\n const obj = withMeta({ packageFile }, () => Workflow.parse(content));\n if (!obj) {\n return [];\n }\n\n if ('runs' in obj && obj.runs.steps) {\n return extractSteps(obj.runs.steps);\n }\n\n if (!('jobs' in obj)) {\n return [];\n }\n\n const deps: PackageDependency[] = [];\n\n for (const job of Object.values(obj.jobs)) {\n if (job.container) {\n const dep = getDep(job.container, true, config.registryAliases);\n if (dep) {\n dep.depType = 'container';\n deps.push(dep);\n }\n }\n\n for (const service of job.services) {\n const dep = getDep(service, true, config.registryAliases);\n if (dep) {\n dep.depType = 'service';\n deps.push(dep);\n }\n }\n\n for (const runner of job['runs-on']) {\n const dep = extractRunner(runner);\n if (dep) {\n deps.push(dep);\n }\n }\n\n deps.push(...extractSteps(job.steps));\n }\n\n return deps;\n}\n\nasync function readLockfile(): Promise<LockfileState> {\n const content = await readLocalFile(actionsLockFile, 'utf8');\n if (!content) {\n return { type: 'missing' };\n }\n\n const parsed = ActionsLockfile.safeParse(content);\n if (!parsed.success) {\n // `updateActionsLockfile` warns about this once per branch, so stay quiet\n logger.debug(`Failed to parse ${actionsLockFile}`);\n return { type: 'unparseable' };\n }\n\n return { type: 'parsed', onboardedWorkflows: parsed.data.workflows };\n}\n\n/**\n * A repository has a single lock file, but can have any number of package files, so read and parse it only once.\n */\nfunction getLockfile(): Promise<LockfileState> {\n const cacheKey = `github-actions:${actionsLockFile}`;\n const cached = memCache.get<Promise<LockfileState> | undefined>(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const result = readLockfile();\n memCache.set(cacheKey, result);\n return result;\n}\n\n/**\n * Whether `gh actions-lock` owns the digests in this file.\n *\n * It rewrites the workflows it manages back to plain refs when regenerating, so an inline digest pin would be stripped straight back out.\n */\nasync function isManagedByLockfile(packageFile: string): Promise<boolean> {\n const lockfile = await getLockfile();\n\n switch (lockfile.type) {\n case 'missing':\n return false;\n case 'unparseable':\n // The tool refuses to regenerate a lock file which it cannot parse, so treat everything as managed: pinning inline here would raise a PR which pins the digests the tool owns and leaves the lock file stale.\n return true;\n case 'parsed':\n return isLockfileManaged(packageFile, lockfile.onboardedWorkflows);\n }\n}\n\nexport async function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig = {}, // TODO: enforce ExtractConfig\n): Promise<PackageFileContent | null> {\n logger.trace(`github-actions.extractPackageFile(${packageFile})`);\n\n const deps = [\n ...extractWithRegex(content, config),\n ...extractWithYAMLParser(content, packageFile, config),\n ];\n\n if (!deps.length) {\n return null;\n }\n\n const res: PackageFileContent = { deps };\n\n if (await isManagedByLockfile(packageFile)) {\n // Deliberately no `lockFiles`: nothing here goes through `updateArtifacts`, and `matchFileNames` also tests `lockFiles`, so declaring it would make a negated rule such as `!.github/workflows/release.yml` match every workflow through the lock file path.\n for (const dep of deps) {\n // The lock file only records `OWNER/REPO@REF` pins, so a `docker://` image in a `uses:` is still ours to pin.\n if (dep.depType === 'action' || dep.depType === 'workflow') {\n dep.digestManagedExternally = true;\n }\n }\n }\n\n return res;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extract.js","names":["githubActionsVersioning.id","exactVersioning.id","nodeVersioning.id","memCache.get"],"sources":["../../../../lib/modules/manager/github-actions/extract.ts"],"sourcesContent":["import is from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger, withMeta } from '../../../logger/index.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { ForgejoTagsDatasource } from '../../datasource/forgejo-tags/index.ts';\nimport { GiteaTagsDatasource } from '../../datasource/gitea-tags/index.ts';\nimport { GithubDigestDatasource } from '../../datasource/github-digest/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { GithubRunnersDatasource } from '../../datasource/github-runners/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport * as dockerVersioning from '../../versioning/docker/index.ts';\nimport * as exactVersioning from '../../versioning/exact/index.ts';\nimport * as githubActionsVersioning from '../../versioning/github-actions/index.ts';\nimport * as nodeVersioning from '../../versioning/node/index.ts';\nimport * as npmVersioning from '../../versioning/npm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { actionsLockFile, isLockfileManaged } from './common.ts';\nimport { isSha, isShortSha, parseUsesLine, versionLikeRe } from './parse.ts';\nimport type { UsesStep } from './schema.ts';\nimport { ActionsLockfile, CommunityActions, Workflow } from './schema.ts';\nimport type {\n DockerReference,\n LockfileState,\n RepositoryReference,\n} from './types.ts';\n\n// detects if we run against a Github Enterprise Server and adds the URL to the beginning of the registryURLs for looking up Actions\n// This reflects the behavior of how GitHub looks up Actions\n// First on the Enterprise Server, then on GitHub.com\nfunction detectCustomGitHubRegistryUrlsForActions(): PackageDependency {\n const endpoint = GlobalConfig.get('endpoint');\n const registryUrls = ['https://github.com'];\n if (endpoint && GlobalConfig.get('platform') === 'github') {\n const parsedEndpoint = parseUrl(endpoint);\n if (!parsedEndpoint) {\n logger.warn({ endpoint }, 'Failed to parse endpoint url');\n return {};\n }\n\n if (\n parsedEndpoint.host !== 'github.com' &&\n parsedEndpoint.host !== 'api.github.com'\n ) {\n registryUrls.unshift(\n `${parsedEndpoint.protocol}//${parsedEndpoint.host}`,\n );\n return { registryUrls };\n }\n }\n return {};\n}\n\nfunction extractDockerAction(\n actionRef: DockerReference,\n config: ExtractConfig,\n): PackageDependency {\n const dep = getDep(actionRef.originalRef, true, config.registryAliases);\n dep.depType = 'docker';\n dep.replaceString = actionRef.originalRef;\n return dep;\n}\n\nconst reusableWorkflowPathRe = regEx(/^\\.github\\/workflows\\/[^/]+\\.ya?ml$/);\n\nfunction extractRepositoryAction(\n actionRef: RepositoryReference,\n parsed: ReturnType<typeof parseUsesLine> & object,\n customRegistryUrlsPackageDependency: PackageDependency,\n): PackageDependency {\n const {\n replaceString: valueString,\n quote,\n commentData,\n commentPrecedingWhitespace,\n } = parsed;\n const {\n owner,\n repo,\n path: subPath,\n ref,\n hostname,\n isExplicitHostname,\n } = actionRef;\n\n const registryUrl = isExplicitHostname ? `https://${hostname}/` : '';\n const packageName = `${owner}/${repo}`;\n const depName = `${registryUrl}${packageName}`;\n const pathSuffix = subPath ? `/${subPath}` : '';\n const commentWs = commentPrecedingWhitespace || ' ';\n const isReusableWorkflow = !!subPath && reusableWorkflowPathRe.test(subPath);\n\n const dep: PackageDependency = {\n depName,\n commitMessageTopic: '{{{depName}}} action',\n versioning: githubActionsVersioning.id,\n depType: isReusableWorkflow ? 'workflow' : 'action',\n replaceString: valueString,\n autoReplaceStringTemplate: `${quote}{{depName}}${pathSuffix}@{{#if newDigest}}{{newDigest}}${quote}{{#if newValue}}${commentWs}# {{newValue}}{{/if}}{{/if}}{{#unless newDigest}}{{newValue}}${quote}{{/unless}}`,\n ...(isExplicitHostname\n ? detectDatasource(registryUrl)\n : customRegistryUrlsPackageDependency),\n };\n\n if (packageName !== depName) {\n dep.packageName = packageName;\n }\n\n // Extend replaceString to include relevant comment portions:\n // - Pinned version or ref: include only up to the matched token (truncate trailing text)\n // - Ratchet exclude: include the full comment to preserve the marker\n const pinComment =\n commentData.pinnedVersion ??\n (isSha(ref) || isShortSha(ref) ? commentData.ref : undefined);\n if (\n pinComment &&\n !is.undefined(commentData.index) &&\n !is.undefined(commentData.matchedString)\n ) {\n const cleanComment = parsed.commentString.slice(1);\n const matchEndIndex = commentData.index + commentData.matchedString.length;\n const commentSuffix = cleanComment.slice(0, matchEndIndex);\n dep.replaceString = `${valueString}${commentPrecedingWhitespace}#${commentSuffix}`;\n } else if (commentData.ratchetExclude) {\n dep.replaceString =\n valueString + commentPrecedingWhitespace + parsed.commentString;\n }\n\n if (isSha(ref)) {\n dep.currentValue = commentData.pinnedVersion ?? commentData.ref;\n dep.currentDigest = ref;\n } else if (isShortSha(ref)) {\n dep.currentValue = commentData.pinnedVersion ?? commentData.ref;\n dep.currentDigestShort = ref;\n } else {\n dep.currentValue = ref;\n }\n\n if (!dep.currentValue) {\n dep.enabled = false;\n dep.skipReason = 'unversioned-reference';\n }\n\n const isVersionLike =\n dep.currentValue && versionLikeRe.test(dep.currentValue);\n if (!dep.datasource && dep.currentValue && !isVersionLike) {\n dep.datasource = GithubDigestDatasource.id;\n dep.versioning = exactVersioning.id;\n }\n\n dep.datasource ??= GithubTagsDatasource.id;\n\n return dep;\n}\n\nfunction extractWithRegex(\n content: string,\n config: ExtractConfig,\n): PackageDependency[] {\n const customRegistryUrlsPackageDependency =\n detectCustomGitHubRegistryUrlsForActions();\n logger.trace('github-actions.extractWithRegex()');\n const deps: PackageDependency[] = [];\n\n for (const line of content.split(newlineRegex)) {\n if (line.trim().startsWith('#')) {\n continue;\n }\n\n const parsed = parseUsesLine(line);\n if (!parsed?.actionRef) {\n continue;\n }\n\n const { actionRef } = parsed;\n\n if (actionRef.kind === 'docker') {\n deps.push(extractDockerAction(actionRef, config));\n continue;\n }\n\n if (actionRef.kind === 'repository') {\n deps.push(\n extractRepositoryAction(\n actionRef,\n parsed,\n customRegistryUrlsPackageDependency,\n ),\n );\n }\n }\n\n return deps;\n}\n\nfunction detectDatasource(registryUrl: string): PackageDependency {\n const platform = detectPlatform(registryUrl);\n\n switch (platform) {\n case 'forgejo':\n return {\n registryUrls: [registryUrl],\n datasource: ForgejoTagsDatasource.id,\n };\n case 'gitea':\n return {\n registryUrls: [registryUrl],\n datasource: GiteaTagsDatasource.id,\n };\n case 'github':\n return { registryUrls: [registryUrl] };\n }\n\n return {\n skipReason: 'unsupported-url',\n };\n}\n\nconst runnerVersionRegex = regEx(\n /^\\s*(?<depName>[a-zA-Z]+)-(?<currentValue>[^\\s]+)/,\n);\n\nfunction extractRunner(runner: string): PackageDependency | null {\n const runnerVersionGroups = runnerVersionRegex.exec(runner)?.groups;\n if (!runnerVersionGroups) {\n return null;\n }\n\n const { depName, currentValue } = runnerVersionGroups;\n\n if (!GithubRunnersDatasource.isValidRunner(depName, currentValue)) {\n return null;\n }\n\n const dependency: PackageDependency = {\n depName,\n currentValue,\n replaceString: `${depName}-${currentValue}`,\n depType: 'github-runner',\n datasource: GithubRunnersDatasource.id,\n autoReplaceStringTemplate: '{{depName}}-{{newValue}}',\n };\n\n if (!dockerVersioning.api.isValid(currentValue)) {\n dependency.skipReason = 'invalid-version';\n }\n\n return dependency;\n}\n\n// For official https://github.com/actions\nconst versionedActions: Record<string, string> = {\n go: npmVersioning.id,\n node: nodeVersioning.id,\n python: npmVersioning.id,\n\n // Not covered yet because they use different datasources/packageNames:\n // - dotnet\n // - java\n};\n\nfunction extractVersionedAction(step: UsesStep): PackageDependency | null {\n for (const [action, versioning] of Object.entries(versionedActions)) {\n const actionName = `actions/setup-${action}`;\n if (step.uses !== actionName && !step.uses?.startsWith(`${actionName}@`)) {\n continue;\n }\n\n const fieldName = `${action}-version`;\n const currentValue = step.with?.[fieldName];\n if (!currentValue) {\n return null;\n }\n\n return {\n datasource: GithubReleasesDatasource.id,\n depName: action,\n packageName: `actions/${action}-versions`,\n versioning,\n extractVersion: '^(?<version>\\\\d+\\\\.\\\\d+\\\\.\\\\d+)(-\\\\d+)?$',\n currentValue,\n depType: 'uses-with',\n };\n }\n return null;\n}\n\nfunction extractSteps(steps: UsesStep[]): PackageDependency[] {\n const deps: PackageDependency[] = [];\n\n for (const step of steps) {\n const res = CommunityActions.safeParse(step);\n if (res.success) {\n deps.push(...res.data);\n continue;\n }\n\n const versionedDep = extractVersionedAction(step);\n if (versionedDep) {\n deps.push(versionedDep);\n }\n }\n\n return deps;\n}\n\nfunction extractWithYAMLParser(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageDependency[] {\n logger.trace('github-actions.extractWithYAMLParser()');\n\n const obj = withMeta({ packageFile }, () => Workflow.parse(content));\n if (!obj) {\n return [];\n }\n\n if ('runs' in obj && obj.runs.steps) {\n return extractSteps(obj.runs.steps);\n }\n\n if (!('jobs' in obj)) {\n return [];\n }\n\n const deps: PackageDependency[] = [];\n\n for (const job of Object.values(obj.jobs)) {\n if (job.container) {\n const dep = getDep(job.container, true, config.registryAliases);\n if (dep) {\n dep.depType = 'container';\n deps.push(dep);\n }\n }\n\n for (const service of job.services) {\n const dep = getDep(service, true, config.registryAliases);\n if (dep) {\n dep.depType = 'service';\n deps.push(dep);\n }\n }\n\n for (const runner of job['runs-on']) {\n const dep = extractRunner(runner);\n if (dep) {\n deps.push(dep);\n }\n }\n\n deps.push(...extractSteps(job.steps));\n }\n\n return deps;\n}\n\nasync function readLockfile(): Promise<LockfileState> {\n const content = await readLocalFile(actionsLockFile, 'utf8');\n if (!content) {\n return { type: 'missing' };\n }\n\n const parsed = ActionsLockfile.safeParse(content);\n if (!parsed.success) {\n // `updateActionsLockfile` warns about this once per branch, so stay quiet\n logger.debug(`Failed to parse ${actionsLockFile}`);\n return { type: 'unparseable' };\n }\n\n return { type: 'parsed', onboardedWorkflows: parsed.data.workflows };\n}\n\n/**\n * A repository has a single lock file, but can have any number of package files, so read and parse it only once.\n */\nfunction getLockfile(): Promise<LockfileState> {\n const cacheKey = `github-actions:${actionsLockFile}`;\n const cached = memCache.get<Promise<LockfileState> | undefined>(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const result = readLockfile();\n memCache.set(cacheKey, result);\n return result;\n}\n\n/**\n * Whether `gh actions-lock` owns the digests in this file.\n *\n * It rewrites the workflows it manages back to plain refs when regenerating, so an inline digest pin would be stripped straight back out.\n */\nasync function isManagedByLockfile(packageFile: string): Promise<boolean> {\n const lockfile = await getLockfile();\n\n switch (lockfile.type) {\n case 'missing':\n return false;\n case 'unparseable':\n // The tool refuses to regenerate a lock file which it cannot parse, so treat everything as managed: pinning inline here would raise a PR which pins the digests the tool owns and leaves the lock file stale.\n return true;\n case 'parsed':\n return isLockfileManaged(packageFile, lockfile.onboardedWorkflows);\n }\n}\n\nexport async function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig = {}, // TODO: enforce ExtractConfig\n): Promise<PackageFileContent | null> {\n logger.trace(`github-actions.extractPackageFile(${packageFile})`);\n\n const deps = [\n ...extractWithRegex(content, config),\n ...extractWithYAMLParser(content, packageFile, config),\n ];\n\n if (!deps.length) {\n return null;\n }\n\n const res: PackageFileContent = { deps };\n\n if (await isManagedByLockfile(packageFile)) {\n // Deliberately no `lockFiles`: nothing here goes through `updateArtifacts`, and `matchFileNames` also tests `lockFiles`, so declaring it would make a negated rule such as `!.github/workflows/release.yml` match every workflow through the lock file path.\n for (const dep of deps) {\n // The lock file only records `OWNER/REPO@REF` pins, so a `docker://` image in a `uses:` is still ours to pin.\n if (dep.depType === 'action' || dep.depType === 'workflow') {\n dep.digestManagedExternally = true;\n }\n }\n }\n\n return res;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","names":[],"sources":["../../../../lib/modules/manager/github-actions/parse.ts"],"sourcesContent":["import is from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\n\nfunction splitFirstFrom(\n str: string,\n sep: string,\n start: number,\n): [string, string] | null {\n const idx = str.indexOf(sep, start);\n if (idx === -1) {\n return null;\n }\n return [str.slice(0, idx), str.slice(idx + sep.length)];\n}\n\nfunction splitFirst(str: string, sep: string): [string, string] | null {\n return splitFirstFrom(str, sep, 0);\n}\n\ninterface QuotedValue {\n value: string;\n quote: string;\n}\n\nexport function parseQuote(input: string): QuotedValue {\n const trimmed = input.trim();\n const first = trimmed[0];\n const last = trimmed.at(-1);\n\n if (\n trimmed.length >= 2 &&\n first === last &&\n (first === '\"' || first === \"'\")\n ) {\n return { value: trimmed.slice(1, -1), quote: first };\n }\n\n return { value: trimmed, quote: '' };\n}\n\n/**\n * Docker container:\n * - `docker://image:tag`\n * - `docker://image@digest`\n * - `docker://image:tag@digest`\n */\nexport interface DockerReference {\n kind: 'docker';\n image: string;\n tag?: string;\n digest?: string;\n originalRef: string;\n}\n\n/**\n * Local file or directory:\n * - `./path/to/action`\n * - `./.github/workflows/main.yml`\n */\nexport interface LocalReference {\n kind: 'local';\n path: string;\n}\n\n/**\n * Repository:\n * - `owner/repo[/path]@ref`\n * - `https://host/owner/repo[/path]@ref`\n */\nexport interface RepositoryReference {\n kind: 'repository';\n\n hostname: string;\n isExplicitHostname: boolean;\n\n owner: string;\n repo: string;\n path?: string;\n\n ref: string;\n}\n\nexport type ActionReference =\n | DockerReference\n | LocalReference\n | RepositoryReference;\n\nexport interface ParsedUsesLine {\n /** The whitespace before \"uses:\" */\n indentation: string;\n\n /** The `uses:` (and optional `-`) part */\n usesPrefix: string;\n\n /** The raw value part, potentially quoted (e.g. `actions/checkout@v2`) */\n replaceString: string;\n\n /** Whitespace between value and `#` */\n commentPrecedingWhitespace: string;\n\n /** The full comment including `#` */\n commentString: string;\n\n actionRef: ActionReference | null;\n commentData: CommentData;\n\n /** The quote char used (' or \" or empty) */\n quote: string;\n}\n\nconst shaRe = regEx(/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/);\nconst shaShortRe = regEx(/^[a-f0-9]{6,7}$/);\n\nexport function isSha(str: string): boolean {\n return shaRe.test(str);\n}\n\nexport function isShortSha(str: string): boolean {\n return shaShortRe.test(str);\n}\n\nconst DOCKER_PREFIX = 'docker://';\n\nfunction parseDockerReference(input: string): DockerReference | null {\n const originalRef = input.slice(DOCKER_PREFIX.length);\n if (!originalRef) {\n return null;\n }\n\n const digestParts = splitFirst(originalRef, '@');\n if (digestParts) {\n const [image, digest] = digestParts;\n return { kind: 'docker', image, digest, originalRef };\n }\n\n // Find tag: look for first colon after last slash (to avoid matching port in registry)\n const lastSlashIndex = originalRef.lastIndexOf('/');\n const searchStart = lastSlashIndex === -1 ? 0 : lastSlashIndex + 1;\n const tagParts = splitFirstFrom(originalRef, ':', searchStart);\n\n if (tagParts) {\n const [image, tag] = tagParts;\n return { kind: 'docker', image, tag, originalRef };\n }\n\n return { kind: 'docker', image: originalRef, originalRef };\n}\n\nconst repositoryActionRegex = regEx(\n /^(?:https:\\/\\/(?<hostname>[^/]+)\\/)?(?<owner>[^/]+)\\/(?<repo>[^/]+)(?:\\/(?<path>.+?))?@(?<ref>.+)$/,\n);\n\nfunction parseRepositoryReference(input: string): RepositoryReference | null {\n const match = repositoryActionRegex.exec(input);\n if (!match?.groups) {\n return null;\n }\n\n const { owner, repo, path, ref } = match.groups;\n\n let { hostname } = match.groups;\n let isExplicitHostname = true;\n if (is.undefined(hostname)) {\n hostname = 'github.com';\n isExplicitHostname = false;\n }\n\n return {\n kind: 'repository',\n hostname,\n isExplicitHostname,\n owner,\n repo,\n path,\n ref,\n };\n}\n\nexport function parseActionReference(uses: string): ActionReference | null {\n if (!uses) {\n return null;\n }\n\n if (uses.startsWith(DOCKER_PREFIX)) {\n return parseDockerReference(uses);\n }\n\n if (uses.startsWith('./') || uses.startsWith('../')) {\n return { kind: 'local', path: uses };\n }\n\n return parseRepositoryReference(uses);\n}\n\nexport interface CommentData {\n pinnedVersion?: string;\n ref?: string;\n ratchetExclude?: boolean;\n matchedString?: string;\n index?: number;\n}\n\nconst pinTokenRe = regEx(\n /^\\s*(?:(?:renovate\\s*:\\s*)?(?:pin\\s+|tag\\s*=\\s*)?|(?:ratchet:[\\w-]+\\/[.\\w-]+(?:\\/[.\\w-]+)*))?@?(?<version>([\\w-]*[-/])?v?\\d+(?:\\.\\d+(?:\\.\\d+)?)?(?:-[a-zA-Z0-9.]+)?)/,\n);\n\nexport const versionLikeRe = regEx(/^v?\\d+/);\n\nconst bareTokenRe = regEx(/^\\s*(?<token>\\S+)\\s*$/);\n\nexport function parseComment(commentBody: string): CommentData {\n const trimmed = commentBody.trim();\n if (trimmed === 'ratchet:exclude') {\n return { ratchetExclude: true };\n }\n\n // We use commentBody (with leading spaces) to get the correct index relative to the comment start\n const match = pinTokenRe.exec(commentBody);\n if (match?.groups?.version) {\n return {\n pinnedVersion: match.groups.version,\n matchedString: match[0],\n index: match.index,\n };\n }\n\n const bareMatch = bareTokenRe.exec(commentBody);\n if (bareMatch?.groups?.token) {\n return {\n ref: bareMatch.groups.token,\n matchedString: bareMatch[0],\n index: bareMatch.index,\n };\n }\n\n return {};\n}\n\nconst usesLineRegex = regEx(\n /^(?<prefix>\\s+(?:-\\s+)?uses\\s*:\\s*)(?<remainder>.+)$/,\n);\n\n/**\n * Parses a GitHub Actions `uses:` line into its components.\n *\n * Expected line format:\n * ```\n * <indentation>[- ]uses: [quote]<action-reference>[quote][ # <comment>]\n * ```\n *\n * Examples:\n * - ` uses: actions/checkout@v4`\n * - ` - uses: \"owner/repo@abc123\" # v1.0.0`\n * - ` uses: docker://alpine:3.18`\n *\n * @returns Parsed components or `null` if the line doesn't match `uses:` pattern\n */\nexport function parseUsesLine(line: string): ParsedUsesLine | null {\n const match = usesLineRegex.exec(line);\n if (!match?.groups) {\n return null;\n }\n\n const { prefix, remainder } = match.groups;\n\n if (remainder.startsWith('#')) {\n return null;\n }\n\n const indentation = prefix.slice(0, prefix.indexOf('uses'));\n\n // We look for ' #' to determine where the comment starts.\n // This is a safe heuristic for valid \"uses\" values which cannot contain spaces.\n const commentIndex = remainder.indexOf(' #');\n\n // No comment case\n if (commentIndex === -1) {\n const { value, quote } = parseQuote(remainder);\n return {\n indentation,\n usesPrefix: prefix,\n replaceString: remainder.trim(),\n commentPrecedingWhitespace: '',\n commentString: '',\n actionRef: parseActionReference(value),\n commentData: {},\n quote,\n };\n }\n\n // Has comment: split value and comment\n const rawValuePart = remainder.slice(0, commentIndex);\n const commentPart = remainder.slice(commentIndex + 1); // starts at #\n\n // Calculate whitespace between value and #\n const partBeforeHash = remainder.slice(0, commentIndex + 1);\n const commentPrecedingWhitespace = partBeforeHash.slice(\n partBeforeHash.trimEnd().length,\n );\n\n const { value, quote } = parseQuote(rawValuePart);\n // commentPart always starts with '#' (see commentIndex search above)\n const cleanCommentBody = commentPart.slice(1);\n\n return {\n indentation,\n usesPrefix: prefix,\n replaceString: rawValuePart.trim(),\n commentPrecedingWhitespace,\n commentString: commentPart,\n actionRef: parseActionReference(value),\n commentData: parseComment(cleanCommentBody),\n quote,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"parse.js","names":[],"sources":["../../../../lib/modules/manager/github-actions/parse.ts"],"sourcesContent":["import is from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\nimport type {\n ActionReference,\n CommentData,\n DockerReference,\n ParsedUsesLine,\n RepositoryReference,\n} from './types.ts';\n\nfunction splitFirstFrom(\n str: string,\n sep: string,\n start: number,\n): [string, string] | null {\n const idx = str.indexOf(sep, start);\n if (idx === -1) {\n return null;\n }\n return [str.slice(0, idx), str.slice(idx + sep.length)];\n}\n\nfunction splitFirst(str: string, sep: string): [string, string] | null {\n return splitFirstFrom(str, sep, 0);\n}\n\ninterface QuotedValue {\n value: string;\n quote: string;\n}\n\nexport function parseQuote(input: string): QuotedValue {\n const trimmed = input.trim();\n const first = trimmed[0];\n const last = trimmed.at(-1);\n\n if (\n trimmed.length >= 2 &&\n first === last &&\n (first === '\"' || first === \"'\")\n ) {\n return { value: trimmed.slice(1, -1), quote: first };\n }\n\n return { value: trimmed, quote: '' };\n}\n\nconst shaRe = regEx(/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/);\nconst shaShortRe = regEx(/^[a-f0-9]{6,7}$/);\n\nexport function isSha(str: string): boolean {\n return shaRe.test(str);\n}\n\nexport function isShortSha(str: string): boolean {\n return shaShortRe.test(str);\n}\n\nconst DOCKER_PREFIX = 'docker://';\n\nfunction parseDockerReference(input: string): DockerReference | null {\n const originalRef = input.slice(DOCKER_PREFIX.length);\n if (!originalRef) {\n return null;\n }\n\n const digestParts = splitFirst(originalRef, '@');\n if (digestParts) {\n const [image, digest] = digestParts;\n return { kind: 'docker', image, digest, originalRef };\n }\n\n // Find tag: look for first colon after last slash (to avoid matching port in registry)\n const lastSlashIndex = originalRef.lastIndexOf('/');\n const searchStart = lastSlashIndex === -1 ? 0 : lastSlashIndex + 1;\n const tagParts = splitFirstFrom(originalRef, ':', searchStart);\n\n if (tagParts) {\n const [image, tag] = tagParts;\n return { kind: 'docker', image, tag, originalRef };\n }\n\n return { kind: 'docker', image: originalRef, originalRef };\n}\n\nconst repositoryActionRegex = regEx(\n /^(?:https:\\/\\/(?<hostname>[^/]+)\\/)?(?<owner>[^/]+)\\/(?<repo>[^/]+)(?:\\/(?<path>.+?))?@(?<ref>.+)$/,\n);\n\nfunction parseRepositoryReference(input: string): RepositoryReference | null {\n const match = repositoryActionRegex.exec(input);\n if (!match?.groups) {\n return null;\n }\n\n const { owner, repo, path, ref } = match.groups;\n\n let { hostname } = match.groups;\n let isExplicitHostname = true;\n if (is.undefined(hostname)) {\n hostname = 'github.com';\n isExplicitHostname = false;\n }\n\n return {\n kind: 'repository',\n hostname,\n isExplicitHostname,\n owner,\n repo,\n path,\n ref,\n };\n}\n\nexport function parseActionReference(uses: string): ActionReference | null {\n if (!uses) {\n return null;\n }\n\n if (uses.startsWith(DOCKER_PREFIX)) {\n return parseDockerReference(uses);\n }\n\n if (uses.startsWith('./') || uses.startsWith('../')) {\n return { kind: 'local', path: uses };\n }\n\n return parseRepositoryReference(uses);\n}\n\nconst pinTokenRe = regEx(\n /^\\s*(?:(?:renovate\\s*:\\s*)?(?:pin\\s+|tag\\s*=\\s*)?|(?:ratchet:[\\w-]+\\/[.\\w-]+(?:\\/[.\\w-]+)*))?@?(?<version>([\\w-]*[-/])?v?\\d+(?:\\.\\d+(?:\\.\\d+)?)?(?:-[a-zA-Z0-9.]+)?)/,\n);\n\nexport const versionLikeRe = regEx(/^v?\\d+/);\n\nconst bareTokenRe = regEx(/^\\s*(?<token>\\S+)\\s*$/);\n\nexport function parseComment(commentBody: string): CommentData {\n const trimmed = commentBody.trim();\n if (trimmed === 'ratchet:exclude') {\n return { ratchetExclude: true };\n }\n\n // We use commentBody (with leading spaces) to get the correct index relative to the comment start\n const match = pinTokenRe.exec(commentBody);\n if (match?.groups?.version) {\n return {\n pinnedVersion: match.groups.version,\n matchedString: match[0],\n index: match.index,\n };\n }\n\n const bareMatch = bareTokenRe.exec(commentBody);\n if (bareMatch?.groups?.token) {\n return {\n ref: bareMatch.groups.token,\n matchedString: bareMatch[0],\n index: bareMatch.index,\n };\n }\n\n return {};\n}\n\nconst usesLineRegex = regEx(\n /^(?<prefix>\\s+(?:-\\s+)?uses\\s*:\\s*)(?<remainder>.+)$/,\n);\n\n/**\n * Parses a GitHub Actions `uses:` line into its components.\n *\n * Expected line format:\n * ```\n * <indentation>[- ]uses: [quote]<action-reference>[quote][ # <comment>]\n * ```\n *\n * Examples:\n * - ` uses: actions/checkout@v4`\n * - ` - uses: \"owner/repo@abc123\" # v1.0.0`\n * - ` uses: docker://alpine:3.18`\n *\n * @returns Parsed components or `null` if the line doesn't match `uses:` pattern\n */\nexport function parseUsesLine(line: string): ParsedUsesLine | null {\n const match = usesLineRegex.exec(line);\n if (!match?.groups) {\n return null;\n }\n\n const { prefix, remainder } = match.groups;\n\n if (remainder.startsWith('#')) {\n return null;\n }\n\n const indentation = prefix.slice(0, prefix.indexOf('uses'));\n\n // We look for ' #' to determine where the comment starts.\n // This is a safe heuristic for valid \"uses\" values which cannot contain spaces.\n const commentIndex = remainder.indexOf(' #');\n\n // No comment case\n if (commentIndex === -1) {\n const { value, quote } = parseQuote(remainder);\n return {\n indentation,\n usesPrefix: prefix,\n replaceString: remainder.trim(),\n commentPrecedingWhitespace: '',\n commentString: '',\n actionRef: parseActionReference(value),\n commentData: {},\n quote,\n };\n }\n\n // Has comment: split value and comment\n const rawValuePart = remainder.slice(0, commentIndex);\n const commentPart = remainder.slice(commentIndex + 1); // starts at #\n\n // Calculate whitespace between value and #\n const partBeforeHash = remainder.slice(0, commentIndex + 1);\n const commentPrecedingWhitespace = partBeforeHash.slice(\n partBeforeHash.trimEnd().length,\n );\n\n const { value, quote } = parseQuote(rawValuePart);\n // commentPart always starts with '#' (see commentIndex search above)\n const cleanCommentBody = commentPart.slice(1);\n\n return {\n indentation,\n usesPrefix: prefix,\n replaceString: rawValuePart.trim(),\n commentPrecedingWhitespace,\n commentString: commentPart,\n actionRef: parseActionReference(value),\n commentData: parseComment(cleanCommentBody),\n quote,\n };\n}\n"],"mappings":";;;AAUA,SAAS,eACP,KACA,KACA,OACyB;CACzB,MAAM,MAAM,IAAI,QAAQ,KAAK,KAAK;CAClC,IAAI,QAAQ,IACV,OAAO;CAET,OAAO,CAAC,IAAI,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,MAAM,IAAI,MAAM,CAAC;AACxD;AAEA,SAAS,WAAW,KAAa,KAAsC;CACrE,OAAO,eAAe,KAAK,KAAK,CAAC;AACnC;AAOA,SAAgB,WAAW,OAA4B;CACrD,MAAM,UAAU,MAAM,KAAK;CAC3B,MAAM,QAAQ,QAAQ;CACtB,MAAM,OAAO,QAAQ,GAAG,EAAE;CAE1B,IACE,QAAQ,UAAU,KAClB,UAAU,SACT,UAAU,QAAO,UAAU,MAE5B,OAAO;EAAE,OAAO,QAAQ,MAAM,GAAG,EAAE;EAAG,OAAO;CAAM;CAGrD,OAAO;EAAE,OAAO;EAAS,OAAO;CAAG;AACrC;AAEA,MAAM,QAAQ,MAAM,iCAAiC;AACrD,MAAM,aAAa,MAAM,iBAAiB;AAE1C,SAAgB,MAAM,KAAsB;CAC1C,OAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAgB,WAAW,KAAsB;CAC/C,OAAO,WAAW,KAAK,GAAG;AAC5B;AAEA,MAAM,gBAAgB;AAEtB,SAAS,qBAAqB,OAAuC;CACnE,MAAM,cAAc,MAAM,MAAM,CAAoB;CACpD,IAAI,CAAC,aACH,OAAO;CAGT,MAAM,cAAc,WAAW,aAAa,GAAG;CAC/C,IAAI,aAAa;EACf,MAAM,CAAC,OAAO,UAAU;EACxB,OAAO;GAAE,MAAM;GAAU;GAAO;GAAQ;EAAY;CACtD;CAGA,MAAM,iBAAiB,YAAY,YAAY,GAAG;CAElD,MAAM,WAAW,eAAe,aAAa,KADzB,mBAAmB,KAAK,IAAI,iBAAiB,CACJ;CAE7D,IAAI,UAAU;EACZ,MAAM,CAAC,OAAO,OAAO;EACrB,OAAO;GAAE,MAAM;GAAU;GAAO;GAAK;EAAY;CACnD;CAEA,OAAO;EAAE,MAAM;EAAU,OAAO;EAAa;CAAY;AAC3D;AAEA,MAAM,wBAAwB,MAC5B,oGACF;AAEA,SAAS,yBAAyB,OAA2C;CAC3E,MAAM,QAAQ,sBAAsB,KAAK,KAAK;CAC9C,IAAI,CAAC,OAAO,QACV,OAAO;CAGT,MAAM,EAAE,OAAO,MAAM,MAAM,QAAQ,MAAM;CAEzC,IAAI,EAAE,aAAa,MAAM;CACzB,IAAI,qBAAqB;CACzB,IAAI,GAAG,UAAU,QAAQ,GAAG;EAC1B,WAAW;EACX,qBAAqB;CACvB;CAEA,OAAO;EACL,MAAM;EACN;EACA;EACA;EACA;EACA;EACA;CACF;AACF;AAEA,SAAgB,qBAAqB,MAAsC;CACzE,IAAI,CAAC,MACH,OAAO;CAGT,IAAI,KAAK,WAAW,aAAa,GAC/B,OAAO,qBAAqB,IAAI;CAGlC,IAAI,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,KAAK,GAChD,OAAO;EAAE,MAAM;EAAS,MAAM;CAAK;CAGrC,OAAO,yBAAyB,IAAI;AACtC;AAEA,MAAM,aAAa,MACjB,sKACF;AAEA,MAAa,gBAAgB,MAAM,QAAQ;AAE3C,MAAM,cAAc,MAAM,uBAAuB;AAEjD,SAAgB,aAAa,aAAkC;CAE7D,IADgB,YAAY,KAClB,MAAM,mBACd,OAAO,EAAE,gBAAgB,KAAK;CAIhC,MAAM,QAAQ,WAAW,KAAK,WAAW;CACzC,IAAI,OAAO,QAAQ,SACjB,OAAO;EACL,eAAe,MAAM,OAAO;EAC5B,eAAe,MAAM;EACrB,OAAO,MAAM;CACf;CAGF,MAAM,YAAY,YAAY,KAAK,WAAW;CAC9C,IAAI,WAAW,QAAQ,OACrB,OAAO;EACL,KAAK,UAAU,OAAO;EACtB,eAAe,UAAU;EACzB,OAAO,UAAU;CACnB;CAGF,OAAO,CAAC;AACV;AAEA,MAAM,gBAAgB,MACpB,sDACF;;;;;;;;;;;;;;;;AAiBA,SAAgB,cAAc,MAAqC;CACjE,MAAM,QAAQ,cAAc,KAAK,IAAI;CACrC,IAAI,CAAC,OAAO,QACV,OAAO;CAGT,MAAM,EAAE,QAAQ,cAAc,MAAM;CAEpC,IAAI,UAAU,WAAW,GAAG,GAC1B,OAAO;CAGT,MAAM,cAAc,OAAO,MAAM,GAAG,OAAO,QAAQ,MAAM,CAAC;CAI1D,MAAM,eAAe,UAAU,QAAQ,IAAI;CAG3C,IAAI,iBAAiB,IAAI;EACvB,MAAM,EAAE,OAAO,UAAU,WAAW,SAAS;EAC7C,OAAO;GACL;GACA,YAAY;GACZ,eAAe,UAAU,KAAK;GAC9B,4BAA4B;GAC5B,eAAe;GACf,WAAW,qBAAqB,KAAK;GACrC,aAAa,CAAC;GACd;EACF;CACF;CAGA,MAAM,eAAe,UAAU,MAAM,GAAG,YAAY;CACpD,MAAM,cAAc,UAAU,MAAM,eAAe,CAAC;CAGpD,MAAM,iBAAiB,UAAU,MAAM,GAAG,eAAe,CAAC;CAC1D,MAAM,6BAA6B,eAAe,MAChD,eAAe,QAAQ,CAAC,CAAC,MAC3B;CAEA,MAAM,EAAE,OAAO,UAAU,WAAW,YAAY;CAEhD,MAAM,mBAAmB,YAAY,MAAM,CAAC;CAE5C,OAAO;EACL;EACA,YAAY;EACZ,eAAe,aAAa,KAAK;EACjC;EACA,eAAe;EACf,WAAW,qBAAqB,KAAK;EACrC,aAAa,aAAa,gBAAgB;EAC1C;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/manager/github-actions/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport {\n LooseArray,\n LooseRecord,\n Yaml,\n withDebugMessage,\n} from '../../../util/schema-utils/index.ts';\nimport type { ActionSchema } from './community.ts';\nimport { actionSchema, communityActions } from './community.ts';\n\nconst UsesStep = z.object({\n uses: z.string(),\n with: LooseRecord(\n z.union([z.string(), z.number().transform((s) => s.toString())]),\n ),\n});\nexport type UsesStep = z.infer<typeof UsesStep>;\n\n// A `parallel:` group flattens its (recursively resolved) sub-steps into leaf steps.\n// See: https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#example-running-steps-in-parallel\nconst ParallelStep: z.ZodType<UsesStep[]> = z\n .object({ parallel: LooseArray(z.lazy(() => Step)) })\n .transform(({ parallel }) => parallel.flat());\n\n// A step resolves to a flat list of `uses:` steps: a normal step yields itself,\n// a `parallel:` group yields its flattened sub-steps.\nconst Step: z.ZodType<UsesStep[]> = z.union([\n UsesStep.transform((step) => [step]),\n ParallelStep,\n]);\n\n// Flatten the per-element `UsesStep[]` groups into a single `UsesStep[]`.\nconst Steps = LooseArray(Step).transform((groups) => groups.flat());\n\nconst WorkFlowJobs = z.object({\n jobs: LooseRecord(\n z.object({\n container: z\n .union([\n z.string(),\n z.object({ image: z.string() }).transform((v) => v.image),\n ])\n .optional()\n .catch(undefined),\n services: LooseRecord(\n z.union([\n z.object({ image: z.string() }).transform((v) => v.image),\n z.string(),\n ]),\n )\n .catch({})\n .transform((services) => Object.values(services)),\n 'runs-on': z\n .union([z.string().transform((v) => [v]), z.array(z.string())])\n .catch([]),\n steps: Steps.catch([]),\n }),\n ),\n});\n\nconst Actions = z.object({\n runs: z.object({\n using: z.string(),\n steps: Steps.optional().catch([]),\n }),\n});\nexport const Workflow = Yaml.pipe(\n z.union([WorkFlowJobs, Actions, z.null()]),\n).catch(withDebugMessage(null, 'Does not match schema'));\n\n/**\n * The `actions.lock` schema is owned by the `gh actions-lock` CLI, and is still unstable, so don't rely on the structure too heavily.\n *\n * `workflows` is deliberately required: if the tool renames or reshapes it, we want the parse to fail so that we stop touching the lockfile, rather than silently treating every workflow as un-onboarded.\n *\n * TODO #45191: pin to a version of the schema, once it is v1\n */\nexport const ActionsLockfile = Yaml.pipe(\n z.object({\n workflows: z.record(z.string(), z.unknown()),\n }),\n);\nexport type ActionsLockfile = z.infer<typeof ActionsLockfile>;\n\nexport const CommunityActions = z.union(\n Object.entries(communityActions).map(([name, cfg]) =>\n actionSchema(name, cfg),\n ) as [ActionSchema, ActionSchema, ...ActionSchema[]],\n);\n"],"mappings":";;;;AAUA,MAAM,WAAW,EAAE,OAAO;CACxB,MAAM,EAAE,OAAO;CACf,MAAM,YACJ,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,WAAW,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CACjE;AACF,CAAC;AAKD,MAAM,eAAsC,EACzC,OAAO,EAAE,UAAU,WAAW,EAAE,WAAW,IAAI,CAAC,EAAE,CAAC,CAAC,CACpD,WAAW,EAAE,eAAe,SAAS,KAAK,CAAC;AAI9C,MAAM,OAA8B,EAAE,MAAM,CAC1C,SAAS,WAAW,SAAS,CAAC,IAAI,CAAC,GACnC,YACF,CAAC;AAGD,MAAM,QAAQ,WAAW,IAAI,CAAC,CAAC,WAAW,WAAW,OAAO,KAAK,CAAC;AAElE,MAAM,eAAe,EAAE,OAAO,EAC5B,MAAM,YACJ,EAAE,OAAO;CACP,WAAW,EACR,MAAM,CACL,EAAE,OAAO,GACT,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,KAAK,CAC1D,CAAC,CAAC,CACD,SAAS,CAAC,CACV,MAAM,KAAA,CAAS;CAClB,UAAU,YACR,EAAE,MAAM,CACN,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,KAAK,GACxD,EAAE,OAAO,CACX,CAAC,CACH,CAAC,CACE,MAAM,CAAC,CAAC,CAAC,CACT,WAAW,aAAa,OAAO,OAAO,QAAQ,CAAC;CAClD,WAAW,EACR,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAC9D,MAAM,CAAC,CAAC;CACX,OAAO,MAAM,MAAM,CAAC,CAAC;AACvB,CAAC,CACH,EACF,CAAC;AAED,MAAM,UAAU,EAAE,OAAO,EACvB,MAAM,EAAE,OAAO;CACb,OAAO,EAAE,OAAO;CAChB,OAAO,MAAM,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC,EACH,CAAC;AACD,MAAa,WAAW,KAAK,KAC3B,EAAE,MAAM;CAAC;CAAc;CAAS,EAAE,KAAK;AAAC,CAAC,CAC3C,CAAC,CAAC,MAAM,iBAAiB,MAAM,uBAAuB,CAAC;;;;;;;;AASvD,MAAa,kBAAkB,KAAK,KAClC,EAAE,OAAO,EACP,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAC7C,CAAC,CACH;AAGA,MAAa,mBAAmB,EAAE,MAChC,OAAO,QAAQ,gBAAgB,CAAC,CAAC,KAAK,CAAC,MAAM,SAC3C,aAAa,MAAM,GAAG,CACxB,CACF"}
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/manager/github-actions/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport {\n LooseArray,\n LooseRecord,\n Yaml,\n withDebugMessage,\n} from '../../../util/schema-utils/index.ts';\nimport { actionSchema, communityActions } from './community.ts';\nimport type { ActionSchema } from './types.ts';\n\nconst UsesStep = z.object({\n uses: z.string(),\n with: LooseRecord(\n z.union([z.string(), z.number().transform((s) => s.toString())]),\n ),\n});\nexport type UsesStep = z.infer<typeof UsesStep>;\n\n// A `parallel:` group flattens its (recursively resolved) sub-steps into leaf steps.\n// See: https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#example-running-steps-in-parallel\nconst ParallelStep: z.ZodType<UsesStep[]> = z\n .object({ parallel: LooseArray(z.lazy(() => Step)) })\n .transform(({ parallel }) => parallel.flat());\n\n// A step resolves to a flat list of `uses:` steps: a normal step yields itself,\n// a `parallel:` group yields its flattened sub-steps.\nconst Step: z.ZodType<UsesStep[]> = z.union([\n UsesStep.transform((step) => [step]),\n ParallelStep,\n]);\n\n// Flatten the per-element `UsesStep[]` groups into a single `UsesStep[]`.\nconst Steps = LooseArray(Step).transform((groups) => groups.flat());\n\nconst WorkFlowJobs = z.object({\n jobs: LooseRecord(\n z.object({\n container: z\n .union([\n z.string(),\n z.object({ image: z.string() }).transform((v) => v.image),\n ])\n .optional()\n .catch(undefined),\n services: LooseRecord(\n z.union([\n z.object({ image: z.string() }).transform((v) => v.image),\n z.string(),\n ]),\n )\n .catch({})\n .transform((services) => Object.values(services)),\n 'runs-on': z\n .union([z.string().transform((v) => [v]), z.array(z.string())])\n .catch([]),\n steps: Steps.catch([]),\n }),\n ),\n});\n\nconst Actions = z.object({\n runs: z.object({\n using: z.string(),\n steps: Steps.optional().catch([]),\n }),\n});\nexport const Workflow = Yaml.pipe(\n z.union([WorkFlowJobs, Actions, z.null()]),\n).catch(withDebugMessage(null, 'Does not match schema'));\n\n/**\n * The `actions.lock` schema is owned by the `gh actions-lock` CLI, and is still unstable, so don't rely on the structure too heavily.\n *\n * `workflows` is deliberately required: if the tool renames or reshapes it, we want the parse to fail so that we stop touching the lockfile, rather than silently treating every workflow as un-onboarded.\n *\n * TODO #45191: pin to a version of the schema, once it is v1\n */\nexport const ActionsLockfile = Yaml.pipe(\n z.object({\n workflows: z.record(z.string(), z.unknown()),\n }),\n);\nexport type ActionsLockfile = z.infer<typeof ActionsLockfile>;\n\nexport const CommunityActions = z.union(\n Object.entries(communityActions).map(([name, cfg]) =>\n actionSchema(name, cfg),\n ) as [ActionSchema, ActionSchema, ...ActionSchema[]],\n);\n"],"mappings":";;;;AAUA,MAAM,WAAW,EAAE,OAAO;CACxB,MAAM,EAAE,OAAO;CACf,MAAM,YACJ,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,WAAW,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CACjE;AACF,CAAC;AAKD,MAAM,eAAsC,EACzC,OAAO,EAAE,UAAU,WAAW,EAAE,WAAW,IAAI,CAAC,EAAE,CAAC,CAAC,CACpD,WAAW,EAAE,eAAe,SAAS,KAAK,CAAC;AAI9C,MAAM,OAA8B,EAAE,MAAM,CAC1C,SAAS,WAAW,SAAS,CAAC,IAAI,CAAC,GACnC,YACF,CAAC;AAGD,MAAM,QAAQ,WAAW,IAAI,CAAC,CAAC,WAAW,WAAW,OAAO,KAAK,CAAC;AAElE,MAAM,eAAe,EAAE,OAAO,EAC5B,MAAM,YACJ,EAAE,OAAO;CACP,WAAW,EACR,MAAM,CACL,EAAE,OAAO,GACT,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,KAAK,CAC1D,CAAC,CAAC,CACD,SAAS,CAAC,CACV,MAAM,KAAA,CAAS;CAClB,UAAU,YACR,EAAE,MAAM,CACN,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,KAAK,GACxD,EAAE,OAAO,CACX,CAAC,CACH,CAAC,CACE,MAAM,CAAC,CAAC,CAAC,CACT,WAAW,aAAa,OAAO,OAAO,QAAQ,CAAC;CAClD,WAAW,EACR,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAC9D,MAAM,CAAC,CAAC;CACX,OAAO,MAAM,MAAM,CAAC,CAAC;AACvB,CAAC,CACH,EACF,CAAC;AAED,MAAM,UAAU,EAAE,OAAO,EACvB,MAAM,EAAE,OAAO;CACb,OAAO,EAAE,OAAO;CAChB,OAAO,MAAM,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC,EACH,CAAC;AACD,MAAa,WAAW,KAAK,KAC3B,EAAE,MAAM;CAAC;CAAc;CAAS,EAAE,KAAK;AAAC,CAAC,CAC3C,CAAC,CAAC,MAAM,iBAAiB,MAAM,uBAAuB,CAAC;;;;;;;;AASvD,MAAa,kBAAkB,KAAK,KAClC,EAAE,OAAO,EACP,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAC7C,CAAC,CACH;AAGA,MAAa,mBAAmB,EAAE,MAChC,OAAO,QAAQ,gBAAgB,CAAC,CAAC,KAAK,CAAC,MAAM,SAC3C,aAAa,MAAM,GAAG,CACxB,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/haskell-cabal/extract.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\n\nconst buildDependsRegex = regEx(\n /(?<buildDependsFieldName>build-depends[ \\t]*:)/i,\n);\nconst commentRegex = regEx(/^[ \\t]*--/);\nfunction isNonASCII(str: string): boolean {\n for (let i = 0; i < str.length; i++) {\n if (str.charCodeAt(i) > 127) {\n return true;\n }\n }\n return false;\n}\n\nexport function countPackageNameLength(input: string): number | null {\n if (input.length < 1 || isNonASCII(input)) {\n return null;\n }\n if (!regEx(/^[A-Za-z0-9]/).test(input[0])) {\n // Must start with letter or number\n return null;\n }\n let idx = 1;\n while (idx < input.length) {\n if (regEx(/[A-Za-z0-9-]/).test(input[idx])) {\n idx++;\n } else {\n break;\n }\n }\n if (!regEx(/[A-Za-z]/).test(input.slice(0, idx))) {\n // Must contain a letter\n return null;\n }\n if (idx - 1 < input.length && input[idx - 1] === '-') {\n // Can't end in a hyphen\n return null;\n }\n return idx;\n}\n\nexport interface CabalDependency {\n packageName: string;\n currentValue: string;\n replaceString: string;\n}\n\n/**\n * Find extents of field contents\n *\n * @param {number} indent -\n * Indention level maintained within the block.\n * Any indention lower than this means it's outside the field.\n * Lines with this level or more are included in the field.\n * @returns {number}\n * Index just after the end of the block.\n * Note that it may be after the end of the string.\n */\nexport function findExtents(indent: number, content: string): number {\n let blockIdx = 0;\n let mode: 'finding-newline' | 'finding-indention' = 'finding-newline';\n for (;;) {\n if (mode === 'finding-newline') {\n while (content[blockIdx++] !== '\\n') {\n if (blockIdx >= content.length) {\n break;\n }\n }\n if (blockIdx >= content.length) {\n return content.length;\n }\n mode = 'finding-indention';\n } else {\n let thisIndent = 0;\n for (;;) {\n if ([' ', '\\t'].includes(content[blockIdx])) {\n thisIndent += 1;\n blockIdx++;\n if (blockIdx >= content.length) {\n return content.length;\n }\n continue;\n }\n mode = 'finding-newline';\n blockIdx++;\n break;\n }\n if (thisIndent < indent) {\n if (content.slice(blockIdx - 1, blockIdx + 1) === '--') {\n // not enough indention, but the line is a comment, so include it\n mode = 'finding-newline';\n continue;\n }\n // go back to before the newline\n for (;;) {\n if (content[blockIdx--] === '\\n') {\n break;\n }\n }\n return blockIdx + 1;\n }\n mode = 'finding-newline';\n }\n }\n}\n\n/**\n * Find indention level of build-depends\n *\n * @param {number} match -\n * Search starts at this index, and proceeds backwards.\n * @returns {number}\n * Number of indention levels found before 'match'.\n */\nexport function countPrecedingIndentation(\n content: string,\n match: number,\n): number {\n let whitespaceIdx = match - 1;\n let indent = 0;\n while (whitespaceIdx >= 0 && [' ', '\\t'].includes(content[whitespaceIdx])) {\n indent += 1;\n whitespaceIdx--;\n }\n return indent;\n}\n\n/**\n * Find one 'build-depends' field name usage and its field value\n *\n * @returns {{buildDependsContent: string, lengthProcessed: number}}\n * buildDependsContent:\n * the contents of the field, excluding the field name and the colon,\n * and any comments within\n *\n * lengthProcessed:\n * points to after the end of the field. Note that the field does _not_\n * necessarily start at `content.length - lengthProcessed`.\n *\n * Returns null if no 'build-depends' field is found.\n */\nexport function findDepends(\n content: string,\n): { buildDependsContent: string; lengthProcessed: number } | null {\n const matchObj = buildDependsRegex.exec(content);\n if (!matchObj?.groups) {\n return null;\n }\n const indent = countPrecedingIndentation(content, matchObj.index);\n const ourIdx: number =\n matchObj.index + matchObj.groups.buildDependsFieldName.length;\n const extentLength: number = findExtents(indent + 1, content.slice(ourIdx));\n const extent = content.slice(ourIdx, ourIdx + extentLength);\n const lines = [];\n // Windows-style line breaks are fine because\n // carriage returns are before the line feed.\n for (const maybeCommentLine of extent.split('\\n')) {\n if (!commentRegex.test(maybeCommentLine)) {\n lines.push(maybeCommentLine);\n }\n }\n return {\n buildDependsContent: lines.join('\\n'),\n lengthProcessed: ourIdx + extentLength,\n };\n}\n\n/**\n * Split a cabal single dependency into its constituent parts.\n * The first part is the package name, an optional second part contains\n * the version constraint.\n *\n * For example 'base == 3.2' would be split into 'base' and ' == 3.2'.\n *\n * @returns {{name: string, range: string}}\n * Null if the trimmed string doesn't begin with a package name.\n */\nexport function splitSingleDependency(\n input: string,\n): { name: string; range: string } | null {\n const match = countPackageNameLength(input);\n if (match === null) {\n return null;\n }\n const name: string = input.slice(0, match);\n const range = input.slice(match).trim();\n return { name, range };\n}\n\nexport function extractNamesAndRanges(content: string): CabalDependency[] {\n const list = content.split(',');\n const deps = [];\n for (const untrimmedReplaceString of list) {\n const replaceString = untrimmedReplaceString.trim();\n const maybeNameRange = splitSingleDependency(replaceString);\n if (maybeNameRange !== null) {\n deps.push({\n currentValue: maybeNameRange.range,\n packageName: maybeNameRange.name,\n replaceString,\n });\n }\n }\n return deps;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/haskell-cabal/extract.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport type { CabalDependency } from './types.ts';\n\nconst buildDependsRegex = regEx(\n /(?<buildDependsFieldName>build-depends[ \\t]*:)/i,\n);\nconst commentRegex = regEx(/^[ \\t]*--/);\nfunction isNonASCII(str: string): boolean {\n for (let i = 0; i < str.length; i++) {\n if (str.charCodeAt(i) > 127) {\n return true;\n }\n }\n return false;\n}\n\nexport function countPackageNameLength(input: string): number | null {\n if (input.length < 1 || isNonASCII(input)) {\n return null;\n }\n if (!regEx(/^[A-Za-z0-9]/).test(input[0])) {\n // Must start with letter or number\n return null;\n }\n let idx = 1;\n while (idx < input.length) {\n if (regEx(/[A-Za-z0-9-]/).test(input[idx])) {\n idx++;\n } else {\n break;\n }\n }\n if (!regEx(/[A-Za-z]/).test(input.slice(0, idx))) {\n // Must contain a letter\n return null;\n }\n if (idx - 1 < input.length && input[idx - 1] === '-') {\n // Can't end in a hyphen\n return null;\n }\n return idx;\n}\n\n/**\n * Find extents of field contents\n *\n * @param {number} indent -\n * Indention level maintained within the block.\n * Any indention lower than this means it's outside the field.\n * Lines with this level or more are included in the field.\n * @returns {number}\n * Index just after the end of the block.\n * Note that it may be after the end of the string.\n */\nexport function findExtents(indent: number, content: string): number {\n let blockIdx = 0;\n let mode: 'finding-newline' | 'finding-indention' = 'finding-newline';\n for (;;) {\n if (mode === 'finding-newline') {\n while (content[blockIdx++] !== '\\n') {\n if (blockIdx >= content.length) {\n break;\n }\n }\n if (blockIdx >= content.length) {\n return content.length;\n }\n mode = 'finding-indention';\n } else {\n let thisIndent = 0;\n for (;;) {\n if ([' ', '\\t'].includes(content[blockIdx])) {\n thisIndent += 1;\n blockIdx++;\n if (blockIdx >= content.length) {\n return content.length;\n }\n continue;\n }\n mode = 'finding-newline';\n blockIdx++;\n break;\n }\n if (thisIndent < indent) {\n if (content.slice(blockIdx - 1, blockIdx + 1) === '--') {\n // not enough indention, but the line is a comment, so include it\n mode = 'finding-newline';\n continue;\n }\n // go back to before the newline\n for (;;) {\n if (content[blockIdx--] === '\\n') {\n break;\n }\n }\n return blockIdx + 1;\n }\n mode = 'finding-newline';\n }\n }\n}\n\n/**\n * Find indention level of build-depends\n *\n * @param {number} match -\n * Search starts at this index, and proceeds backwards.\n * @returns {number}\n * Number of indention levels found before 'match'.\n */\nexport function countPrecedingIndentation(\n content: string,\n match: number,\n): number {\n let whitespaceIdx = match - 1;\n let indent = 0;\n while (whitespaceIdx >= 0 && [' ', '\\t'].includes(content[whitespaceIdx])) {\n indent += 1;\n whitespaceIdx--;\n }\n return indent;\n}\n\n/**\n * Find one 'build-depends' field name usage and its field value\n *\n * @returns {{buildDependsContent: string, lengthProcessed: number}}\n * buildDependsContent:\n * the contents of the field, excluding the field name and the colon,\n * and any comments within\n *\n * lengthProcessed:\n * points to after the end of the field. Note that the field does _not_\n * necessarily start at `content.length - lengthProcessed`.\n *\n * Returns null if no 'build-depends' field is found.\n */\nexport function findDepends(\n content: string,\n): { buildDependsContent: string; lengthProcessed: number } | null {\n const matchObj = buildDependsRegex.exec(content);\n if (!matchObj?.groups) {\n return null;\n }\n const indent = countPrecedingIndentation(content, matchObj.index);\n const ourIdx: number =\n matchObj.index + matchObj.groups.buildDependsFieldName.length;\n const extentLength: number = findExtents(indent + 1, content.slice(ourIdx));\n const extent = content.slice(ourIdx, ourIdx + extentLength);\n const lines = [];\n // Windows-style line breaks are fine because\n // carriage returns are before the line feed.\n for (const maybeCommentLine of extent.split('\\n')) {\n if (!commentRegex.test(maybeCommentLine)) {\n lines.push(maybeCommentLine);\n }\n }\n return {\n buildDependsContent: lines.join('\\n'),\n lengthProcessed: ourIdx + extentLength,\n };\n}\n\n/**\n * Split a cabal single dependency into its constituent parts.\n * The first part is the package name, an optional second part contains\n * the version constraint.\n *\n * For example 'base == 3.2' would be split into 'base' and ' == 3.2'.\n *\n * @returns {{name: string, range: string}}\n * Null if the trimmed string doesn't begin with a package name.\n */\nexport function splitSingleDependency(\n input: string,\n): { name: string; range: string } | null {\n const match = countPackageNameLength(input);\n if (match === null) {\n return null;\n }\n const name: string = input.slice(0, match);\n const range = input.slice(match).trim();\n return { name, range };\n}\n\nexport function extractNamesAndRanges(content: string): CabalDependency[] {\n const list = content.split(',');\n const deps = [];\n for (const untrimmedReplaceString of list) {\n const replaceString = untrimmedReplaceString.trim();\n const maybeNameRange = splitSingleDependency(replaceString);\n if (maybeNameRange !== null) {\n deps.push({\n currentValue: maybeNameRange.range,\n packageName: maybeNameRange.name,\n replaceString,\n });\n }\n }\n return deps;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/haskell-cabal/index.ts"],"sourcesContent":["import type { Category } from '../../../constants/index.ts';\nimport type { RangeStrategy } from '../../../types/index.ts';\nimport { HackageDatasource } from '../../datasource/hackage/index.ts';\nimport * as pvpVersioning from '../../versioning/pvp/index.ts';\nimport type {\n PackageDependency,\n PackageFileContent,\n RangeConfig,\n} from '../types.ts';\nimport type { CabalDependency } from './extract.ts';\nimport { extractNamesAndRanges, findDepends } from './extract.ts';\n\nexport const defaultConfig = {\n managerFilePatterns: ['/\\\\.cabal$/'],\n pinDigests: false,\n};\n\nexport const categories: Category[] = ['haskell'];\n\nexport const supportedDatasources = [HackageDatasource.id];\n\nexport function extractPackageFile(content: string): PackageFileContent {\n const deps = [];\n let current = content;\n for (;;) {\n const maybeContent = findDepends(current);\n if (maybeContent === null) {\n break;\n }\n const cabalDeps: CabalDependency[] = extractNamesAndRanges(\n maybeContent.buildDependsContent,\n );\n for (const cabalDep of cabalDeps) {\n const dep: PackageDependency = {\n depName: cabalDep.packageName,\n currentValue: cabalDep.currentValue,\n datasource: HackageDatasource.id,\n packageName: cabalDep.packageName,\n versioning: pvpVersioning.id,\n replaceString: cabalDep.replaceString.trim(),\n autoReplaceStringTemplate: '{{{depName}}} {{{newValue}}}',\n };\n deps.push(dep);\n }\n current = current.slice(maybeContent.lengthProcessed);\n }\n return { deps };\n}\n\nexport function getRangeStrategy({\n rangeStrategy,\n}: RangeConfig): RangeStrategy {\n if (rangeStrategy === 'auto') {\n return 'widen';\n }\n return rangeStrategy!;\n}\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,gBAAgB;CAC3B,qBAAqB,CAAC,aAAa;CACnC,YAAY;AACd;AAEA,MAAa,aAAyB,CAAC,SAAS;AAEhD,MAAa,uBAAuB,CAAC,kBAAkB,EAAE;AAEzD,SAAgB,mBAAmB,SAAqC;CACtE,MAAM,OAAO,CAAC;CACd,IAAI,UAAU;CACd,SAAS;EACP,MAAM,eAAe,YAAY,OAAO;EACxC,IAAI,iBAAiB,MACnB;EAEF,MAAM,YAA+B,sBACnC,aAAa,mBACf;EACA,KAAK,MAAM,YAAY,WAAW;GAChC,MAAM,MAAyB;IAC7B,SAAS,SAAS;IAClB,cAAc,SAAS;IACvB,YAAY,kBAAkB;IAC9B,aAAa,SAAS;IACtB,YAAY;IACZ,eAAe,SAAS,cAAc,KAAK;IAC3C,2BAA2B;GAC7B;GACA,KAAK,KAAK,GAAG;EACf;EACA,UAAU,QAAQ,MAAM,aAAa,eAAe;CACtD;CACA,OAAO,EAAE,KAAK;AAChB;AAEA,SAAgB,iBAAiB,EAC/B,iBAC6B;CAC7B,IAAI,kBAAkB,QACpB,OAAO;CAET,OAAO;AACT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/haskell-cabal/index.ts"],"sourcesContent":["import type { Category } from '../../../constants/index.ts';\nimport type { RangeStrategy } from '../../../types/index.ts';\nimport { HackageDatasource } from '../../datasource/hackage/index.ts';\nimport * as pvpVersioning from '../../versioning/pvp/index.ts';\nimport type {\n PackageDependency,\n PackageFileContent,\n RangeConfig,\n} from '../types.ts';\nimport { extractNamesAndRanges, findDepends } from './extract.ts';\nimport type { CabalDependency } from './types.ts';\n\nexport const defaultConfig = {\n managerFilePatterns: ['/\\\\.cabal$/'],\n pinDigests: false,\n};\n\nexport const categories: Category[] = ['haskell'];\n\nexport const supportedDatasources = [HackageDatasource.id];\n\nexport function extractPackageFile(content: string): PackageFileContent {\n const deps = [];\n let current = content;\n for (;;) {\n const maybeContent = findDepends(current);\n if (maybeContent === null) {\n break;\n }\n const cabalDeps: CabalDependency[] = extractNamesAndRanges(\n maybeContent.buildDependsContent,\n );\n for (const cabalDep of cabalDeps) {\n const dep: PackageDependency = {\n depName: cabalDep.packageName,\n currentValue: cabalDep.currentValue,\n datasource: HackageDatasource.id,\n packageName: cabalDep.packageName,\n versioning: pvpVersioning.id,\n replaceString: cabalDep.replaceString.trim(),\n autoReplaceStringTemplate: '{{{depName}}} {{{newValue}}}',\n };\n deps.push(dep);\n }\n current = current.slice(maybeContent.lengthProcessed);\n }\n return { deps };\n}\n\nexport function getRangeStrategy({\n rangeStrategy,\n}: RangeConfig): RangeStrategy {\n if (rangeStrategy === 'auto') {\n return 'widen';\n }\n return rangeStrategy!;\n}\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,gBAAgB;CAC3B,qBAAqB,CAAC,aAAa;CACnC,YAAY;AACd;AAEA,MAAa,aAAyB,CAAC,SAAS;AAEhD,MAAa,uBAAuB,CAAC,kBAAkB,EAAE;AAEzD,SAAgB,mBAAmB,SAAqC;CACtE,MAAM,OAAO,CAAC;CACd,IAAI,UAAU;CACd,SAAS;EACP,MAAM,eAAe,YAAY,OAAO;EACxC,IAAI,iBAAiB,MACnB;EAEF,MAAM,YAA+B,sBACnC,aAAa,mBACf;EACA,KAAK,MAAM,YAAY,WAAW;GAChC,MAAM,MAAyB;IAC7B,SAAS,SAAS;IAClB,cAAc,SAAS;IACvB,YAAY,kBAAkB;IAC9B,aAAa,SAAS;IACtB,YAAY;IACZ,eAAe,SAAS,cAAc,KAAK;IAC3C,2BAA2B;GAC7B;GACA,KAAK,KAAK,GAAG;EACf;EACA,UAAU,QAAQ,MAAM,aAAa,eAAe;CACtD;CACA,OAAO,EAAE,KAAK;AAChB;AAEA,SAAgB,iBAAiB,EAC/B,iBAC6B;CAC7B,IAAI,kBAAkB,QACpB,OAAO;CAET,OAAO;AACT"}