renovate 43.264.1 → 43.265.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/config/global.js +2 -0
  2. package/dist/config/global.js.map +1 -1
  3. package/dist/config/types.d.ts +2 -2
  4. package/dist/config/types.js.map +1 -1
  5. package/dist/config-validator.js.map +1 -1
  6. package/dist/modules/datasource/bitrise/index.js +1 -1
  7. package/dist/modules/datasource/bitrise/index.js.map +1 -1
  8. package/dist/modules/datasource/custom/index.js +8 -2
  9. package/dist/modules/datasource/custom/index.js.map +1 -1
  10. package/dist/modules/datasource/postprocess-release.js +4 -1
  11. package/dist/modules/datasource/postprocess-release.js.map +1 -1
  12. package/dist/modules/manager/bazel-module/lockfile.js +1 -1
  13. package/dist/modules/manager/bazel-module/lockfile.js.map +1 -1
  14. package/dist/modules/manager/deno/artifacts.js +5 -1
  15. package/dist/modules/manager/deno/artifacts.js.map +1 -1
  16. package/dist/modules/manager/deno/post.js +1 -1
  17. package/dist/modules/manager/deno/post.js.map +1 -1
  18. package/dist/modules/manager/fingerprint.generated.js +2 -2
  19. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  20. package/dist/modules/manager/gradle/artifacts.js +1 -1
  21. package/dist/modules/manager/gradle/artifacts.js.map +1 -1
  22. package/dist/modules/manager/mise/artifacts.js +4 -1
  23. package/dist/modules/manager/mise/artifacts.js.map +1 -1
  24. package/dist/modules/platform/azure/issue.js +4 -1
  25. package/dist/modules/platform/azure/issue.js.map +1 -1
  26. package/dist/modules/platform/bitbucket/index.js +4 -1
  27. package/dist/modules/platform/bitbucket/index.js.map +1 -1
  28. package/dist/modules/platform/codecommit/index.js +2 -2
  29. package/dist/modules/platform/codecommit/index.js.map +1 -1
  30. package/dist/modules/platform/gitlab/http.js +1 -1
  31. package/dist/modules/platform/gitlab/http.js.map +1 -1
  32. package/dist/modules/platform/scm-manager/index.js +5 -2
  33. package/dist/modules/platform/scm-manager/index.js.map +1 -1
  34. package/dist/util/emoji.js +2 -2
  35. package/dist/util/emoji.js.map +1 -1
  36. package/dist/util/http/github.js +2 -2
  37. package/dist/util/http/github.js.map +1 -1
  38. package/dist/util/interpolator.js +4 -1
  39. package/dist/util/interpolator.js.map +1 -1
  40. package/dist/workers/global/config/parse/additional-config-file.js +1 -1
  41. package/dist/workers/global/config/parse/additional-config-file.js.map +1 -1
  42. package/dist/workers/global/config/parse/env.js +4 -1
  43. package/dist/workers/global/config/parse/env.js.map +1 -1
  44. package/dist/workers/global/config/parse/file.js +1 -1
  45. package/dist/workers/global/config/parse/file.js.map +1 -1
  46. package/dist/workers/repository/dependency-dashboard.js +4 -3
  47. package/dist/workers/repository/dependency-dashboard.js.map +1 -1
  48. package/dist/workers/repository/error.js +3 -3
  49. package/dist/workers/repository/error.js.map +1 -1
  50. package/dist/workers/repository/process/extract-update.js +2 -2
  51. package/dist/workers/repository/process/extract-update.js.map +1 -1
  52. package/dist/workers/repository/update/branch/bump-versions.js +5 -1
  53. package/dist/workers/repository/update/branch/bump-versions.js.map +1 -1
  54. package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js +1 -1
  55. package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js.map +1 -1
  56. package/dist/workers/repository/update/branch/get-updated.js +3 -3
  57. package/dist/workers/repository/update/branch/get-updated.js.map +1 -1
  58. package/dist/workers/repository/updates/branch-name.js +1 -1
  59. package/dist/workers/repository/updates/branch-name.js.map +1 -1
  60. package/package.json +1 -1
  61. package/renovate-schema.json +2 -2
@@ -18,6 +18,7 @@ var GlobalConfig = class GlobalConfig {
18
18
  "cacheHardTtlMinutes",
19
19
  "cachePrivatePackages",
20
20
  "cacheTtlOverride",
21
+ "checkedBranches",
21
22
  "configFileNames",
22
23
  "containerbaseDir",
23
24
  "customEnvVariables",
@@ -50,6 +51,7 @@ var GlobalConfig = class GlobalConfig {
50
51
  "prCacheSyncMaxPages",
51
52
  "presetCachePersistence",
52
53
  "productLinks",
54
+ "rebaseAllOpenBranches",
53
55
  "repositoryCacheForceLocal",
54
56
  "requireConfig",
55
57
  "s3Endpoint",
@@ -1 +1 @@
1
- {"version":3,"file":"global.js","names":[],"sources":["../../lib/config/global.ts"],"sourcesContent":["import { globalConfigOptionDefaults } from '../global-config-option-defaults.generated.ts';\nimport type { RenovateConfig, RepoGlobalConfig } from './types.ts';\n\nexport class GlobalConfig {\n // TODO: once global config work is complete, add a test to make sure this list includes all options with globalOnly=true (#9603)\n static OPTIONS: readonly (keyof RepoGlobalConfig)[] = [\n 'allowCustomCrateRegistries',\n 'allowPlugins',\n 'allowScripts',\n 'allowShellExecutorForPostUpgradeCommands',\n 'allowedCommands',\n 'allowedEnv',\n 'allowedHeaders',\n 'allowedUnsafeExecutions',\n 'autodiscoverRepoOrder',\n 'autodiscoverRepoSort',\n 'bbUseDevelopmentBranch',\n 'binarySource',\n 'cacheDir',\n 'cacheHardTtlMinutes',\n 'cachePrivatePackages',\n 'cacheTtlOverride',\n 'configFileNames',\n 'containerbaseDir',\n 'customEnvVariables',\n 'dockerChildPrefix',\n 'dockerCliOptions',\n 'dockerMaxPages',\n 'dockerSidecarImage',\n 'dockerUser',\n 'dryRun',\n 'encryptedWarning',\n 'endpoint',\n 'executionTimeout',\n 'exposeAllEnv',\n 'gitTimeout',\n 'githubTokenWarn',\n 'httpCacheTtlDays',\n 'ignorePrAuthor',\n 'includeMirrors',\n 'localDir',\n 'migratePresets',\n 'onboarding',\n 'onboardingAutoCloseAge',\n 'onboardingBranch',\n 'onboardingCommitMessage',\n 'onboardingConfig',\n 'onboardingConfigFileName',\n 'onboardingNoDeps',\n 'onboardingPrTitle',\n 'platform',\n 'prCacheSyncMaxPages',\n 'presetCachePersistence',\n 'productLinks',\n 'repositoryCacheForceLocal',\n 'requireConfig',\n 's3Endpoint',\n 's3PathStyle',\n 'toolSettings',\n 'userAgent',\n ];\n\n private static config: RepoGlobalConfig = {};\n\n static get(): RepoGlobalConfig;\n static get<Key extends keyof RepoGlobalConfig>(\n key: Key,\n ): Required<RepoGlobalConfig>[Key];\n static get<Key extends keyof RepoGlobalConfig>(\n key: Key,\n ): Required<RepoGlobalConfig>[Key];\n static get<Key extends keyof RepoGlobalConfig>(\n key?: Key,\n ): RepoGlobalConfig | Required<RepoGlobalConfig>[Key] {\n const defaultValue = key\n ? (globalConfigOptionDefaults[key] as Required<RepoGlobalConfig>[Key])\n : undefined;\n\n return key\n ? ((GlobalConfig.config[key] ??\n defaultValue) as Required<RepoGlobalConfig>[Key])\n : GlobalConfig.config;\n }\n\n static set(config: RenovateConfig & RepoGlobalConfig): RenovateConfig {\n GlobalConfig.reset();\n\n const result = { ...config };\n for (const option of GlobalConfig.OPTIONS) {\n GlobalConfig.config[option] = config[option] as never;\n delete result[option];\n }\n\n return result;\n }\n\n static reset(): void {\n GlobalConfig.config = {};\n }\n}\n"],"mappings":";;AAGA,IAAa,eAAb,MAAa,aAAa;CAExB,OAAO,UAA+C;EACpD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CAEA,OAAe,SAA2B,CAAC;CAS3C,OAAO,IACL,KACoD;EACpD,MAAM,eAAe,MAChB,2BAA2B,OAC5B,KAAA;EAEJ,OAAO,MACD,aAAa,OAAO,QACpB,eACF,aAAa;CACnB;CAEA,OAAO,IAAI,QAA2D;EACpE,aAAa,MAAM;EAEnB,MAAM,SAAS,EAAE,GAAG,OAAO;EAC3B,KAAK,MAAM,UAAU,aAAa,SAAS;GACzC,aAAa,OAAO,UAAU,OAAO;GACrC,OAAO,OAAO;EAChB;EAEA,OAAO;CACT;CAEA,OAAO,QAAc;EACnB,aAAa,SAAS,CAAC;CACzB;AACF"}
1
+ {"version":3,"file":"global.js","names":[],"sources":["../../lib/config/global.ts"],"sourcesContent":["import { globalConfigOptionDefaults } from '../global-config-option-defaults.generated.ts';\nimport type { RenovateConfig, RepoGlobalConfig } from './types.ts';\n\nexport class GlobalConfig {\n // TODO: once global config work is complete, add a test to make sure this list includes all options with globalOnly=true (#9603)\n static OPTIONS: readonly (keyof RepoGlobalConfig)[] = [\n 'allowCustomCrateRegistries',\n 'allowPlugins',\n 'allowScripts',\n 'allowShellExecutorForPostUpgradeCommands',\n 'allowedCommands',\n 'allowedEnv',\n 'allowedHeaders',\n 'allowedUnsafeExecutions',\n 'autodiscoverRepoOrder',\n 'autodiscoverRepoSort',\n 'bbUseDevelopmentBranch',\n 'binarySource',\n 'cacheDir',\n 'cacheHardTtlMinutes',\n 'cachePrivatePackages',\n 'cacheTtlOverride',\n 'checkedBranches',\n 'configFileNames',\n 'containerbaseDir',\n 'customEnvVariables',\n 'dockerChildPrefix',\n 'dockerCliOptions',\n 'dockerMaxPages',\n 'dockerSidecarImage',\n 'dockerUser',\n 'dryRun',\n 'encryptedWarning',\n 'endpoint',\n 'executionTimeout',\n 'exposeAllEnv',\n 'gitTimeout',\n 'githubTokenWarn',\n 'httpCacheTtlDays',\n 'ignorePrAuthor',\n 'includeMirrors',\n 'localDir',\n 'migratePresets',\n 'onboarding',\n 'onboardingAutoCloseAge',\n 'onboardingBranch',\n 'onboardingCommitMessage',\n 'onboardingConfig',\n 'onboardingConfigFileName',\n 'onboardingNoDeps',\n 'onboardingPrTitle',\n 'platform',\n 'prCacheSyncMaxPages',\n 'presetCachePersistence',\n 'productLinks',\n 'rebaseAllOpenBranches',\n 'repositoryCacheForceLocal',\n 'requireConfig',\n 's3Endpoint',\n 's3PathStyle',\n 'toolSettings',\n 'userAgent',\n ];\n\n private static config: RepoGlobalConfig = {};\n\n static get(): RepoGlobalConfig;\n static get<Key extends keyof RepoGlobalConfig>(\n key: Key,\n ): Required<RepoGlobalConfig>[Key];\n static get<Key extends keyof RepoGlobalConfig>(\n key: Key,\n ): Required<RepoGlobalConfig>[Key];\n static get<Key extends keyof RepoGlobalConfig>(\n key?: Key,\n ): RepoGlobalConfig | Required<RepoGlobalConfig>[Key] {\n const defaultValue = key\n ? (globalConfigOptionDefaults[key] as Required<RepoGlobalConfig>[Key])\n : undefined;\n\n return key\n ? ((GlobalConfig.config[key] ??\n defaultValue) as Required<RepoGlobalConfig>[Key])\n : GlobalConfig.config;\n }\n\n static set(config: RenovateConfig & RepoGlobalConfig): RenovateConfig {\n GlobalConfig.reset();\n\n const result = { ...config };\n for (const option of GlobalConfig.OPTIONS) {\n GlobalConfig.config[option] = config[option] as never;\n delete result[option];\n }\n\n return result;\n }\n\n static reset(): void {\n GlobalConfig.config = {};\n }\n}\n"],"mappings":";;AAGA,IAAa,eAAb,MAAa,aAAa;CAExB,OAAO,UAA+C;EACpD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CAEA,OAAe,SAA2B,CAAC;CAS3C,OAAO,IACL,KACoD;EACpD,MAAM,eAAe,MAChB,2BAA2B,OAC5B,KAAA;EAEJ,OAAO,MACD,aAAa,OAAO,QACpB,eACF,aAAa;CACnB;CAEA,OAAO,IAAI,QAA2D;EACpE,aAAa,MAAM;EAEnB,MAAM,SAAS,EAAE,GAAG,OAAO;EAC3B,KAAK,MAAM,UAAU,aAAa,SAAS;GACzC,aAAa,OAAO,UAAU,OAAO;GACrC,OAAO,OAAO;EAChB;EAEA,OAAO;CACT;CAEA,OAAO,QAAc;EACnB,aAAa,SAAS,CAAC;CACzB;AACF"}
@@ -207,6 +207,7 @@ interface RepoGlobalConfig extends GlobalInheritableConfig {
207
207
  cacheDir?: string;
208
208
  cacheHardTtlMinutes?: number;
209
209
  cacheTtlOverride?: Record<string, number>;
210
+ checkedBranches?: string[];
210
211
  containerbaseDir?: string;
211
212
  customEnvVariables?: Record<string, string>;
212
213
  dockerChildPrefix?: string;
@@ -240,6 +241,7 @@ interface RepoGlobalConfig extends GlobalInheritableConfig {
240
241
  allowedUnsafeExecutions?: AllowedUnsafeExecution[];
241
242
  onboardingAutoCloseAge?: number;
242
243
  productLinks?: Record<string, string>;
244
+ rebaseAllOpenBranches?: boolean;
243
245
  toolSettings?: ToolSettingsOptions;
244
246
  }
245
247
  /**
@@ -385,8 +387,6 @@ interface RenovateConfig extends LegacyAdminConfig, RenovateSharedConfig, Update
385
387
  constraintsVersioning?: Partial<Record<AdditionalConstraintName, string>>;
386
388
  skipInstalls?: boolean | null;
387
389
  constraintsFiltering?: ConstraintsFilter;
388
- checkedBranches?: string[];
389
- rebaseAllOpenBranches?: boolean;
390
390
  customizeDashboard?: Record<string, string>;
391
391
  statusCheckNames?: Record<StatusCheckKey, string | null>;
392
392
  statusCheckWhen?: Partial<Record<StatusCheckKey, StatusCheckWhen>>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../lib/config/types.ts"],"sourcesContent":["import type { Category, PlatformId } from '../constants/index.ts';\nimport type { LogLevelRemap } from '../logger/types.ts';\nimport type { ManagerName } from '../manager-list.generated.ts';\nimport type { CustomManager } from '../modules/manager/custom/types.ts';\nimport type {\n GitUrlOption,\n RepoSortMethod,\n SortMethod,\n} from '../modules/platform/types.ts';\nimport type {\n AutoMergeType,\n HostRule,\n Nullish,\n RangeStrategy,\n SkipReason,\n} from '../types/index.ts';\nimport type { StageName } from '../types/skip-reason.ts';\nimport type {\n AdditionalConstraintName,\n ConstraintName,\n ToolName,\n} from '../util/exec/types.ts';\nimport type { GitNoVerifyOption } from '../util/git/types.ts';\nimport type { MergeConfidence } from '../util/merge-confidence/types.ts';\nimport type { Timestamp } from '../util/timestamp.ts';\n\nexport type RenovateConfigStage =\n | 'global'\n | 'inherit'\n | 'repository'\n | 'package'\n | 'branch'\n | 'pr';\n\nexport type RenovateSplit =\n | 'init'\n | 'onboarding'\n | 'extract'\n | 'lookup'\n | 'update';\n\nexport type RepositoryCacheConfig = 'disabled' | 'enabled' | 'reset';\nexport type RepositoryCacheType = 'local' | (string & {});\nexport type DryRunConfig = 'extract' | 'lookup' | 'full';\nexport type RequiredConfig = 'required' | 'optional' | 'ignored';\n\nexport interface GroupConfig extends Record<string, unknown> {\n branchName?: string;\n branchTopic?: string;\n}\n\nexport type RecreateWhen = 'auto' | 'never' | 'always';\nexport type StatusCheckWhen = 'always' | 'never' | 'failed';\nexport type PlatformCommitOptions = 'auto' | 'disabled' | 'enabled';\n\nexport type BinarySource = 'docker' | 'global' | 'install' | 'hermit';\n\n// TODO: Proper typings\n/**\n * Any configuration that could be used either top-level in a repository config (or Global, Inherited or Shareable Preset configuration), or:\n *\n * - in a datasource-specific configuration\n * - in a manager-specific configuration\n * - in a Package Rule\n *\n * @see RenovateConfig for the superset of all configuration allowed in a given repository\n *\n */\nexport interface RenovateSharedConfig {\n $schema?: string;\n abandonmentThreshold?: Nullish<string>;\n addLabels?: string[];\n assignAutomerge?: boolean;\n autoApprove?: boolean;\n autoReplaceGlobalMatch?: boolean;\n automerge?: boolean;\n automergeSchedule?: string[];\n automergeStrategy?: MergeStrategy;\n automergeType?: AutoMergeType;\n azureWorkItemId?: number;\n branchName?: string;\n branchNameStrict?: boolean;\n branchPrefix?: string;\n branchPrefixOld?: string;\n bumpVersions?: BumpVersionConfig[];\n commitBody?: string;\n commitBodyTable?: boolean;\n commitMessage?: string;\n commitMessageAction?: string;\n commitMessageExtra?: string;\n commitMessageLowerCase?: 'auto' | 'never';\n commitMessagePrefix?: string;\n commitMessageTopic?: string;\n confidential?: boolean;\n configValidationError?: boolean;\n changelogUrl?: string;\n dependencyDashboardApproval?: boolean;\n draftPR?: boolean;\n enabled?: boolean;\n enabledManagers?: string[];\n encrypted?: Record<string, string>;\n extends?: string[];\n extractVersion?: string;\n managerFilePatterns?: string[];\n followTag?: string;\n force?: RenovateConfig;\n gitIgnoredAuthors?: string[];\n group?: GroupConfig;\n groupName?: string;\n groupSingleUpdates?: boolean;\n groupSlug?: string;\n hashedBranchLength?: number;\n ignoreDeps?: string[];\n ignorePaths?: string[];\n ignoreTests?: boolean;\n ignoreUnstable?: boolean;\n includePaths?: string[];\n internalChecksAsSuccess?: boolean;\n internalChecksFilter?: 'strict' | 'flexible' | 'none';\n keepUpdatedLabel?: string;\n labels?: string[];\n manager?: string;\n milestone?: number;\n minimumReleaseAge?: Nullish<string>;\n npmrc?: string;\n npmrcMerge?: boolean;\n npmToken?: string;\n\n pinDigests?: boolean;\n platformAutomerge?: boolean;\n platformCommit?: PlatformCommitOptions;\n postUpgradeTasks?: PostUpgradeTasks;\n prBodyColumns?: string[];\n prBodyDefinitions?: Record<string, string>;\n prBodyHeadingDefinitions?: Record<string, string>;\n prBodyNotes?: string[];\n prCreation?: 'immediate' | 'not-pending' | 'status-success' | 'approval';\n prFooter?: string;\n prHeader?: string;\n prPriority?: number;\n prTitle?: string;\n prTitleStrict?: boolean;\n pruneBranchAfterAutomerge?: boolean;\n rangeStrategy?: RangeStrategy;\n rebaseLabel?: string;\n rebaseWhen?: string;\n recreateClosed?: boolean;\n recreateWhen?: RecreateWhen;\n repository?: string;\n repositoryCache?: RepositoryCacheConfig;\n repositoryCacheType?: RepositoryCacheType;\n respectLatest?: boolean;\n rollbackPrs?: boolean;\n schedule?: string[];\n semanticCommitScope?: string | null;\n semanticCommitType?: string;\n semanticCommits?: 'auto' | 'enabled' | 'disabled';\n separateMajorMinor?: boolean;\n separateMinorPatch?: boolean;\n separateMultipleMajor?: boolean;\n separateMultipleMinor?: boolean;\n skipArtifactsUpdate?: boolean;\n stopUpdatingLabel?: string;\n suppressNotifications?: string[];\n timezone?: string;\n unicodeEmoji?: boolean;\n updateNotScheduled?: boolean;\n versioning?: string;\n versionCompatibility?: string;\n}\n\n/**\n * Contains all options with globalOnly=true && inheritConfigSupport=true\n */\nexport interface GlobalInheritableConfig {\n bbUseDevelopmentBranch?: boolean;\n configFileNames?: string[];\n onboarding?: boolean;\n onboardingAutoCloseAge?: number;\n onboardingBranch?: string;\n onboardingCommitMessage?: string;\n onboardingConfig?: RenovateConfig;\n onboardingConfigFileName?: string;\n onboardingNoDeps?: 'auto' | 'enabled' | 'disabled';\n onboardingPrTitle?: string;\n requireConfig?: RequiredConfig;\n}\n\n// Config options used only within the global worker\n// The below should contain config options where stage=global\n/** @deprecated use `RepoGlobalConfig` instead **/\nexport interface GlobalOnlyConfigLegacy {\n autodiscover?: boolean;\n autodiscoverFilter?: string[] | string;\n autodiscoverNamespaces?: string[];\n autodiscoverProjects?: string[];\n autodiscoverTopics?: string[];\n baseDir?: string;\n cacheDir?: string;\n containerbaseDir?: string;\n detectHostRulesFromEnv?: boolean;\n dockerCliOptions?: string;\n endpoint?: string;\n forceCli?: boolean;\n gitNoVerify?: GitNoVerifyOption[];\n gitPrivateKey?: string;\n gitPrivateKeyPassphrase?: string;\n globalExtends?: string[];\n mergeConfidenceDatasources?: string[];\n mergeConfidenceEndpoint?: string;\n platform?: PlatformId;\n processEnv?: Record<string, string>;\n prCommitsPerRunLimit?: number;\n privateKey?: string;\n privateKeyOld?: string;\n privateKeyPath?: string;\n privateKeyPathOld?: string;\n redisPrefix?: string;\n redisUrl?: string;\n repositories?: RenovateRepository[];\n useCloudMetadataServices?: boolean;\n deleteConfigFile?: boolean;\n deleteAdditionalConfigFile?: boolean;\n}\n\n/**\n * Any global-only configuration set by self-hosted administrators.\n *\n * Used within the repository worker.\n *\n * Should only contain config options where globalOnly=true.\n */\nexport interface RepoGlobalConfig extends GlobalInheritableConfig {\n allowedCommands?: string[];\n allowCustomCrateRegistries?: boolean;\n allowPlugins?: boolean;\n allowScripts?: boolean;\n allowShellExecutorForPostUpgradeCommands?: boolean;\n allowedEnv?: string[];\n allowedHeaders?: string[];\n binarySource?: BinarySource;\n cacheDir?: string;\n cacheHardTtlMinutes?: number;\n cacheTtlOverride?: Record<string, number>;\n containerbaseDir?: string;\n customEnvVariables?: Record<string, string>;\n dockerChildPrefix?: string;\n dockerCliOptions?: string;\n dockerSidecarImage?: string;\n dockerUser?: string;\n dryRun?: DryRunConfig;\n encryptedWarning?: string;\n endpoint?: string;\n executionTimeout?: number;\n exposeAllEnv?: boolean;\n gitTimeout?: number;\n githubTokenWarn?: boolean;\n includeMirrors?: boolean;\n localDir?: string;\n migratePresets?: Record<string, string>;\n platform?: PlatformId;\n prCacheSyncMaxPages?: number;\n presetCachePersistence?: boolean;\n httpCacheTtlDays?: number;\n autodiscoverRepoSort?: RepoSortMethod;\n autodiscoverRepoOrder?: SortMethod;\n userAgent?: string;\n dockerMaxPages?: number;\n s3Endpoint?: string;\n s3PathStyle?: boolean;\n cachePrivatePackages?: boolean;\n repositoryCacheForceLocal?: boolean;\n configFileNames?: string[];\n ignorePrAuthor?: boolean;\n allowedUnsafeExecutions?: AllowedUnsafeExecution[];\n onboardingAutoCloseAge?: number;\n productLinks?: Record<string, string>;\n toolSettings?: ToolSettingsOptions;\n}\n\n/**\n * Those options are global only but still passed into the repository worker config.\n *\n * @deprecated https://github.com/renovatebot/renovate/issues/39693\n */\nexport interface LegacyAdminConfig {\n baseDir?: string;\n localDir?: string;\n\n logContext?: string;\n\n onboarding?: boolean;\n onboardingBranch?: string;\n onboardingNoDeps?: 'auto' | 'enabled' | 'disabled';\n onboardingRebaseCheckbox?: boolean;\n onboardingConfig?: RenovateConfig;\n onboardingConfigFileName?: string;\n\n optimizeForDisabled?: boolean;\n\n persistRepoData?: boolean;\n\n prCommitsPerRunLimit?: number;\n\n requireConfig?: RequiredConfig;\n\n useCloudMetadataServices?: boolean;\n\n writeDiscoveredRepos?: string;\n}\n\nexport type ExecutionMode = 'branch' | 'update';\n\nexport interface PostUpgradeTasks {\n commands?: string[];\n workingDirTemplate?: string;\n dataFileTemplate?: string;\n fileFilters?: string[];\n executionMode: ExecutionMode;\n installTools?: Partial<Record<ToolName, Record<never, never>>>;\n}\n\nexport type UpdateConfig<\n T extends RenovateSharedConfig = RenovateSharedConfig,\n> = Partial<Record<UpdateType, T | null>>;\n\nexport type RenovateRepositoryEntry = AllConfig & {\n repository: string;\n};\n\nexport type RenovateRepository = string | RenovateRepositoryEntry;\n\nexport type UseBaseBranchConfigType = 'merge' | 'none';\nexport type ConstraintsFilter = 'strict' | 'none';\nexport type MinimumReleaseAgeBehaviour =\n | 'timestamp-required'\n | 'timestamp-optional';\n\nexport const allowedStatusCheckStrings = [\n 'minimumReleaseAge',\n 'mergeConfidence',\n 'configValidation',\n 'artifactError',\n] as const;\nexport type StatusCheckKey = (typeof allowedStatusCheckStrings)[number];\ntype UserEnv = Record<string, string>;\n\n/**\n * Computed properties, for internal use only\n */\nexport interface RenovateInternalConfig {\n /** computed base branch from patterns - for internal use only */\n baseBranches?: string[];\n currentCompatibility?: string;\n datasource?: string;\n hasBaseBranches?: boolean;\n isFork?: boolean;\n isVulnerabilityAlert?: boolean;\n\n /** What is this used for? */\n remediations?: unknown;\n /** What is this used for? */\n vulnerabilityAlertsOnly?: boolean;\n}\n\n// TODO: Proper typings\n/**\n * Configuration that could be used either top-level in a repository config (or Global, Inherited or Shareable Preset configuration).\n *\n * This is a superset of any configuration that a Renovate user (not self-hosted administrator) can set.\n */\nexport interface RenovateConfig\n extends\n LegacyAdminConfig,\n RenovateSharedConfig,\n UpdateConfig<PackageRule>,\n AssigneesAndReviewersConfig,\n ConfigMigration,\n RenovateInternalConfig {\n s3Endpoint?: string;\n s3PathStyle?: boolean;\n reportFormatting?: boolean;\n reportPath?: string;\n reportType?: 'logging' | 'file' | 's3' | null;\n depName?: string;\n /** user configurable base branch patterns*/\n baseBranchPatterns?: string[];\n useBaseBranchConfig?: UseBaseBranchConfigType;\n baseBranch?: string;\n defaultBranch?: string;\n branchList?: string[];\n cloneSubmodules?: boolean;\n cloneSubmodulesFilter?: string[];\n description?: string | string[];\n detectGlobalManagerConfig?: boolean;\n errors?: ValidationMessage[];\n forkModeDisallowMaintainerEdits?: boolean;\n forkProcessing?: 'auto' | 'enabled' | 'disabled';\n forkToken?: string;\n\n gitAuthor?: string;\n\n hostRules?: HostRule[];\n\n inheritConfig?: boolean;\n inheritConfigFileName?: string;\n inheritConfigRepoName?: string;\n inheritConfigStrict?: boolean;\n\n ignorePresets?: string[];\n\n fileList?: string[];\n configWarningReuseIssue?: boolean;\n dependencyDashboard?: boolean;\n dependencyDashboardAutoclose?: boolean;\n dependencyDashboardChecks?: Record<string, string>;\n dependencyDashboardIssue?: number;\n dependencyDashboardTitle?: string;\n dependencyDashboardHeader?: string;\n dependencyDashboardFooter?: string;\n dependencyDashboardLabels?: string[];\n dependencyDashboardOSVVulnerabilitySummary?: 'none' | 'all' | 'unresolved';\n dependencyDashboardReportAbandonment?: boolean;\n mode?: 'silent' | 'full';\n packageFile?: string;\n packageRules?: PackageRule[];\n postUpdateOptions?: string[];\n branchConcurrentLimit?: number | null;\n parentOrg?: string;\n prConcurrentLimit?: number;\n commitHourlyLimit?: number;\n prHourlyLimit?: number;\n\n printConfig?: boolean;\n\n pruneStaleBranches?: boolean;\n\n defaultRegistryUrls?: string[];\n registryUrls?: string[] | null;\n registryAliases?: Record<string, string>;\n\n /**\n * What is this used for?\n * @deprecated\n */\n renovateJsonPresent?: boolean;\n\n repoIsOnboarded?: boolean;\n repoIsActivated?: boolean;\n\n topLevelOrg?: string;\n updateInternalDeps?: boolean;\n updateType?: UpdateType;\n\n warnings?: ValidationMessage[];\n vulnerabilityAlerts?: RenovateSharedConfig;\n osvVulnerabilityAlerts?: boolean;\n vulnerabilitySeverity?: string;\n customManagers?: CustomManager[];\n customDatasources?: Record<string, CustomDatasourceConfig>;\n\n fetchChangeLogs?: FetchChangeLogsOptions;\n secrets?: Record<string, string>;\n variables?: Record<string, string>;\n\n constraints?: Partial<Record<ConstraintName, string>>;\n /**\n * Any specific overrides for the versioning for the `AdditionalConstraintName`s.\n */\n constraintsVersioning?: Partial<Record<AdditionalConstraintName, string>>;\n skipInstalls?: boolean | null;\n\n constraintsFiltering?: ConstraintsFilter;\n\n checkedBranches?: string[];\n rebaseAllOpenBranches?: boolean;\n customizeDashboard?: Record<string, string>;\n\n statusCheckNames?: Record<StatusCheckKey, string | null>;\n statusCheckWhen?: Partial<Record<StatusCheckKey, StatusCheckWhen>>;\n /**\n * User configured environment variables that Renovate uses when executing package manager commands\n */\n env?: UserEnv;\n logLevelRemap?: LogLevelRemap[];\n\n branchTopic?: string;\n additionalBranchPrefix?: string;\n sharedVariableName?: string;\n minimumGroupSize?: number;\n configFileNames?: string[];\n minimumReleaseAgeBehaviour?: MinimumReleaseAgeBehaviour;\n toolSettings?: ToolSettingsOptions;\n}\n\nconst CustomDatasourceFormats = [\n 'html',\n 'json',\n 'plain',\n 'toml',\n 'yaml',\n] as const;\nexport type CustomDatasourceFormats = (typeof CustomDatasourceFormats)[number];\n\nexport interface CustomDatasourceConfig {\n defaultRegistryUrlTemplate?: string;\n format?: CustomDatasourceFormats;\n transformTemplates?: string[];\n}\n\n/**\n * The superset of all configuration that a self-hosted administrator can set, alongside all repository-level configuration.\n *\n */\nexport interface AllConfig\n extends RenovateConfig, GlobalOnlyConfigLegacy, RepoGlobalConfig {\n gitUrl?: GitUrlOption;\n password?: string;\n token?: string;\n username?: string;\n}\n\nexport interface AssigneesAndReviewersConfig {\n assigneesFromCodeOwners?: boolean;\n expandCodeOwnersGroups?: boolean;\n assignees?: string[];\n assigneesSampleSize?: number;\n ignoreReviewers?: string[];\n reviewersFromCodeOwners?: boolean;\n reviewers?: string[];\n reviewersSampleSize?: number;\n additionalReviewers?: string[];\n filterUnavailableUsers?: boolean;\n}\n\nexport type UpdateType =\n | 'major'\n | 'minor'\n | 'patch'\n | 'pin'\n | 'digest'\n | 'pinDigest'\n | 'lockFileMaintenance'\n | 'lockfileUpdate'\n | 'rollback'\n | 'bump'\n | 'replacement';\n\n// These are the update types which can have configuration\nexport const UpdateTypesOptions = [\n 'major',\n 'minor',\n 'patch',\n 'pin',\n 'digest',\n 'pinDigest',\n 'lockFileMaintenance',\n 'rollback',\n 'replacement',\n] as const;\n\nexport type UpdateTypeOptions = (typeof UpdateTypesOptions)[number];\n\nexport type FetchChangeLogsOptions = 'off' | 'branch' | 'pr';\n\nexport type MatchStringsStrategy = 'any' | 'recursive' | 'combination';\n\nexport type MergeStrategy =\n | 'auto'\n | 'fast-forward'\n | 'merge-commit'\n | 'rebase'\n | 'rebase-merge'\n | 'squash';\n\n// This list should be added to as any new unsafe execution commands should be permitted\nexport type AllowedUnsafeExecution =\n | 'bazelModDeps'\n | 'goGenerate'\n | 'gradleWrapper'\n | 'mise';\n\n// TODO: Proper typings\nexport interface PackageRule\n extends RenovateSharedConfig, RenovateInternalConfig, UpdateConfig {\n allowedVersions?: string;\n description?: string | string[];\n matchBaseBranches?: string[];\n matchCategories?: string[];\n matchConfidence?: MergeConfidence[];\n matchCurrentAge?: string;\n matchCurrentValue?: string;\n matchCurrentVersion?: string;\n matchDatasources?: string[];\n matchDepNames?: string[];\n matchDepTypes?: string[];\n matchFileNames?: string[];\n matchManagers?: string[];\n matchNewValue?: string;\n matchPackageNames?: string[];\n matchRepositories?: string[];\n matchSourceUrls?: string[];\n matchRegistryUrls?: string[];\n matchUpdateTypes?: UpdateType[];\n matchJsonata?: string[];\n overrideDatasource?: string;\n overrideDepName?: string;\n overridePackageName?: string;\n registryUrls?: string[] | null;\n replacementName?: string;\n replacementVersion?: string;\n sourceUrl?: string;\n sourceDirectory?: string;\n vulnerabilitySeverity?: string;\n vulnerabilityFixVersion?: string;\n}\n\nexport interface ValidationMessage {\n topic: string;\n message: string;\n}\n\nexport type AllowedParents =\n | '.'\n | 'bumpVersions'\n | 'customDatasources'\n | 'customManagers'\n | 'hostRules'\n | 'logLevelRemap'\n | 'packageRules'\n | 'postUpgradeTasks'\n | 'vulnerabilityAlerts'\n | 'toolSettings'\n | ManagerName\n | UpdateTypeOptions;\nexport interface RenovateOptionBase {\n /**\n * If true, the option can only be configured by people with access to the Renovate instance.\n * Furthermore, the option should be documented in docs/usage/self-hosted-configuration.md.\n */\n globalOnly?: boolean;\n\n inheritConfigSupport?: boolean;\n\n allowedValues?: string[];\n\n allowString?: boolean;\n\n cli?: boolean;\n\n description: string;\n\n env?: false | string;\n\n /**\n * Do not validate object children\n */\n freeChoice?: boolean;\n\n mergeable?: boolean;\n\n autogenerated?: boolean;\n\n name: string;\n\n parents?: AllowedParents[];\n\n stage?: RenovateConfigStage;\n\n experimental?: boolean;\n\n experimentalDescription?: string;\n\n experimentalIssues?: number[];\n\n advancedUse?: boolean;\n\n /**\n * This is used to add a deprecation message in the docs\n */\n deprecationMsg?: string;\n\n /**\n * For internal use only: add it to any config option that supports regex or glob matching\n */\n patternMatch?: boolean;\n\n /**\n * For internal use only: add it to any config option of type integer that supports negative integers\n */\n allowNegative?: boolean;\n\n /**\n * Managers which support this option, leave undefined if all managers support it.\n */\n supportedManagers?: string[];\n\n /**\n * Platforms which support this option, leave undefined if all platforms support it.\n */\n supportedPlatforms?: PlatformId[];\n\n /**\n * Conditions that must be met for this option to be required.\n */\n requiredIf?: RenovateRequiredOption[];\n\n /**\n * If true, the option's value supports Renovate templating.\n * @see https://docs.renovatebot.com/templates/\n */\n supportsTemplating?: boolean;\n}\n\nexport interface RenovateRequiredOption {\n siblingProperties: { property: string; value: string }[];\n}\n\nexport interface RenovateArrayOption<\n T extends string | number | Record<string, unknown> = Record<string, unknown>,\n> extends RenovateOptionBase {\n default?: T[] | null;\n mergeable?: boolean;\n type: 'array';\n subType?: 'string' | 'object' | 'number';\n}\n\nexport interface RenovateStringArrayOption extends RenovateArrayOption<string> {\n format?: 'regex';\n subType: 'string';\n}\n\nexport interface RenovateNumberArrayOption extends RenovateArrayOption<number> {\n subType: 'number';\n}\n\nexport interface RenovateBooleanOption extends RenovateOptionBase {\n default?: boolean | null;\n type: 'boolean';\n}\n\nexport interface RenovateIntegerOption extends RenovateOptionBase {\n default?: number | null;\n type: 'integer';\n}\n\nexport interface RenovateStringOption extends RenovateOptionBase {\n default?: string | null;\n format?: 'regex';\n\n // Not used\n replaceLineReturns?: boolean;\n type: 'string';\n}\n\nexport interface RenovateObjectOption extends RenovateOptionBase {\n default?: any;\n additionalProperties?: Record<string, unknown> | boolean;\n mergeable?: boolean;\n type: 'object';\n}\n\nexport type RenovateOptions =\n | RenovateStringOption\n | RenovateNumberArrayOption\n | RenovateStringArrayOption\n | RenovateIntegerOption\n | RenovateBooleanOption\n | RenovateArrayOption\n | RenovateObjectOption;\n\nexport interface PackageRuleInputConfig extends RenovateConfig {\n versioning?: string;\n packageFile?: string;\n lockFiles?: string[];\n depType?: string;\n depTypes?: string[];\n depName?: string;\n packageName?: string | null;\n newValue?: string | null;\n currentValue?: string | null;\n currentVersion?: string;\n lockedVersion?: string;\n updateType?: UpdateType;\n mergeConfidenceLevel?: MergeConfidence | undefined;\n isBump?: boolean;\n sourceUrl?: string | null;\n categories?: string[];\n baseBranch?: string;\n manager?: string;\n datasource?: string;\n packageRules?: (PackageRule & PackageRuleInputConfig)[];\n releaseTimestamp?: Timestamp | null;\n repository?: string;\n currentVersionAgeInDays?: number;\n currentVersionTimestamp?: string;\n enabled?: boolean;\n skipReason?: SkipReason;\n skipStage?: StageName;\n}\n\nexport interface ConfigMigration {\n configMigration?: boolean;\n}\n\nexport interface MigratedConfig {\n /**\n * Indicates whether there was a migration applied to the configuration.\n *\n * @returns\n * `false` if the configuration does not need migrating, and `migratedConfig` can be ignored\n * `true` if the configuration was migrated, and if so, `migratedConfig` should be used instead of the provided config\n */\n isMigrated: boolean;\n migratedConfig: RenovateConfig;\n}\n\nexport interface MigratedRenovateConfig extends RenovateConfig {\n endpoints?: HostRule[];\n pathRules: PackageRule[];\n packages: PackageRule[];\n\n node?: RenovateConfig;\n travis?: RenovateConfig;\n gradle?: RenovateConfig;\n}\n\nexport interface ManagerConfig extends RenovateConfig {\n manager: string;\n categories?: Category[];\n}\n\nexport interface ValidationResult {\n errors: ValidationMessage[];\n warnings: ValidationMessage[];\n}\n\nexport interface BumpVersionConfig {\n bumpType?: string;\n filePatterns: string[];\n matchStrings: string[];\n name?: string;\n}\n\nexport interface ToolSettingsOptions {\n jvmMaxMemory?: number;\n jvmMemory?: number;\n nodeMaxMemory?: number;\n}\n"],"mappings":";AAkVA,MAAa,4BAA4B;CACvC;CACA;CACA;CACA;AACF;AA8MA,MAAa,qBAAqB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../lib/config/types.ts"],"sourcesContent":["import type { Category, PlatformId } from '../constants/index.ts';\nimport type { LogLevelRemap } from '../logger/types.ts';\nimport type { ManagerName } from '../manager-list.generated.ts';\nimport type { CustomManager } from '../modules/manager/custom/types.ts';\nimport type {\n GitUrlOption,\n RepoSortMethod,\n SortMethod,\n} from '../modules/platform/types.ts';\nimport type {\n AutoMergeType,\n HostRule,\n Nullish,\n RangeStrategy,\n SkipReason,\n} from '../types/index.ts';\nimport type { StageName } from '../types/skip-reason.ts';\nimport type {\n AdditionalConstraintName,\n ConstraintName,\n ToolName,\n} from '../util/exec/types.ts';\nimport type { GitNoVerifyOption } from '../util/git/types.ts';\nimport type { MergeConfidence } from '../util/merge-confidence/types.ts';\nimport type { Timestamp } from '../util/timestamp.ts';\n\nexport type RenovateConfigStage =\n | 'global'\n | 'inherit'\n | 'repository'\n | 'package'\n | 'branch'\n | 'pr';\n\nexport type RenovateSplit =\n | 'init'\n | 'onboarding'\n | 'extract'\n | 'lookup'\n | 'update';\n\nexport type RepositoryCacheConfig = 'disabled' | 'enabled' | 'reset';\nexport type RepositoryCacheType = 'local' | (string & {});\nexport type DryRunConfig = 'extract' | 'lookup' | 'full';\nexport type RequiredConfig = 'required' | 'optional' | 'ignored';\n\nexport interface GroupConfig extends Record<string, unknown> {\n branchName?: string;\n branchTopic?: string;\n}\n\nexport type RecreateWhen = 'auto' | 'never' | 'always';\nexport type StatusCheckWhen = 'always' | 'never' | 'failed';\nexport type PlatformCommitOptions = 'auto' | 'disabled' | 'enabled';\n\nexport type BinarySource = 'docker' | 'global' | 'install' | 'hermit';\n\n// TODO: Proper typings\n/**\n * Any configuration that could be used either top-level in a repository config (or Global, Inherited or Shareable Preset configuration), or:\n *\n * - in a datasource-specific configuration\n * - in a manager-specific configuration\n * - in a Package Rule\n *\n * @see RenovateConfig for the superset of all configuration allowed in a given repository\n *\n */\nexport interface RenovateSharedConfig {\n $schema?: string;\n abandonmentThreshold?: Nullish<string>;\n addLabels?: string[];\n assignAutomerge?: boolean;\n autoApprove?: boolean;\n autoReplaceGlobalMatch?: boolean;\n automerge?: boolean;\n automergeSchedule?: string[];\n automergeStrategy?: MergeStrategy;\n automergeType?: AutoMergeType;\n azureWorkItemId?: number;\n branchName?: string;\n branchNameStrict?: boolean;\n branchPrefix?: string;\n branchPrefixOld?: string;\n bumpVersions?: BumpVersionConfig[];\n commitBody?: string;\n commitBodyTable?: boolean;\n commitMessage?: string;\n commitMessageAction?: string;\n commitMessageExtra?: string;\n commitMessageLowerCase?: 'auto' | 'never';\n commitMessagePrefix?: string;\n commitMessageTopic?: string;\n confidential?: boolean;\n configValidationError?: boolean;\n changelogUrl?: string;\n dependencyDashboardApproval?: boolean;\n draftPR?: boolean;\n enabled?: boolean;\n enabledManagers?: string[];\n encrypted?: Record<string, string>;\n extends?: string[];\n extractVersion?: string;\n managerFilePatterns?: string[];\n followTag?: string;\n force?: RenovateConfig;\n gitIgnoredAuthors?: string[];\n group?: GroupConfig;\n groupName?: string;\n groupSingleUpdates?: boolean;\n groupSlug?: string;\n hashedBranchLength?: number;\n ignoreDeps?: string[];\n ignorePaths?: string[];\n ignoreTests?: boolean;\n ignoreUnstable?: boolean;\n includePaths?: string[];\n internalChecksAsSuccess?: boolean;\n internalChecksFilter?: 'strict' | 'flexible' | 'none';\n keepUpdatedLabel?: string;\n labels?: string[];\n manager?: string;\n milestone?: number;\n minimumReleaseAge?: Nullish<string>;\n npmrc?: string;\n npmrcMerge?: boolean;\n npmToken?: string;\n\n pinDigests?: boolean;\n platformAutomerge?: boolean;\n platformCommit?: PlatformCommitOptions;\n postUpgradeTasks?: PostUpgradeTasks;\n prBodyColumns?: string[];\n prBodyDefinitions?: Record<string, string>;\n prBodyHeadingDefinitions?: Record<string, string>;\n prBodyNotes?: string[];\n prCreation?: 'immediate' | 'not-pending' | 'status-success' | 'approval';\n prFooter?: string;\n prHeader?: string;\n prPriority?: number;\n prTitle?: string;\n prTitleStrict?: boolean;\n pruneBranchAfterAutomerge?: boolean;\n rangeStrategy?: RangeStrategy;\n rebaseLabel?: string;\n rebaseWhen?: string;\n recreateClosed?: boolean;\n recreateWhen?: RecreateWhen;\n repository?: string;\n repositoryCache?: RepositoryCacheConfig;\n repositoryCacheType?: RepositoryCacheType;\n respectLatest?: boolean;\n rollbackPrs?: boolean;\n schedule?: string[];\n semanticCommitScope?: string | null;\n semanticCommitType?: string;\n semanticCommits?: 'auto' | 'enabled' | 'disabled';\n separateMajorMinor?: boolean;\n separateMinorPatch?: boolean;\n separateMultipleMajor?: boolean;\n separateMultipleMinor?: boolean;\n skipArtifactsUpdate?: boolean;\n stopUpdatingLabel?: string;\n suppressNotifications?: string[];\n timezone?: string;\n unicodeEmoji?: boolean;\n updateNotScheduled?: boolean;\n versioning?: string;\n versionCompatibility?: string;\n}\n\n/**\n * Contains all options with globalOnly=true && inheritConfigSupport=true\n */\nexport interface GlobalInheritableConfig {\n bbUseDevelopmentBranch?: boolean;\n configFileNames?: string[];\n onboarding?: boolean;\n onboardingAutoCloseAge?: number;\n onboardingBranch?: string;\n onboardingCommitMessage?: string;\n onboardingConfig?: RenovateConfig;\n onboardingConfigFileName?: string;\n onboardingNoDeps?: 'auto' | 'enabled' | 'disabled';\n onboardingPrTitle?: string;\n requireConfig?: RequiredConfig;\n}\n\n// Config options used only within the global worker\n// The below should contain config options where stage=global\n/** @deprecated use `RepoGlobalConfig` instead **/\nexport interface GlobalOnlyConfigLegacy {\n autodiscover?: boolean;\n autodiscoverFilter?: string[] | string;\n autodiscoverNamespaces?: string[];\n autodiscoverProjects?: string[];\n autodiscoverTopics?: string[];\n baseDir?: string;\n cacheDir?: string;\n containerbaseDir?: string;\n detectHostRulesFromEnv?: boolean;\n dockerCliOptions?: string;\n endpoint?: string;\n forceCli?: boolean;\n gitNoVerify?: GitNoVerifyOption[];\n gitPrivateKey?: string;\n gitPrivateKeyPassphrase?: string;\n globalExtends?: string[];\n mergeConfidenceDatasources?: string[];\n mergeConfidenceEndpoint?: string;\n platform?: PlatformId;\n processEnv?: Record<string, string>;\n prCommitsPerRunLimit?: number;\n privateKey?: string;\n privateKeyOld?: string;\n privateKeyPath?: string;\n privateKeyPathOld?: string;\n redisPrefix?: string;\n redisUrl?: string;\n repositories?: RenovateRepository[];\n useCloudMetadataServices?: boolean;\n deleteConfigFile?: boolean;\n deleteAdditionalConfigFile?: boolean;\n}\n\n/**\n * Any global-only configuration set by self-hosted administrators.\n *\n * Used within the repository worker.\n *\n * Should only contain config options where globalOnly=true.\n */\nexport interface RepoGlobalConfig extends GlobalInheritableConfig {\n allowedCommands?: string[];\n allowCustomCrateRegistries?: boolean;\n allowPlugins?: boolean;\n allowScripts?: boolean;\n allowShellExecutorForPostUpgradeCommands?: boolean;\n allowedEnv?: string[];\n allowedHeaders?: string[];\n binarySource?: BinarySource;\n cacheDir?: string;\n cacheHardTtlMinutes?: number;\n cacheTtlOverride?: Record<string, number>;\n checkedBranches?: string[];\n containerbaseDir?: string;\n customEnvVariables?: Record<string, string>;\n dockerChildPrefix?: string;\n dockerCliOptions?: string;\n dockerSidecarImage?: string;\n dockerUser?: string;\n dryRun?: DryRunConfig;\n encryptedWarning?: string;\n endpoint?: string;\n executionTimeout?: number;\n exposeAllEnv?: boolean;\n gitTimeout?: number;\n githubTokenWarn?: boolean;\n includeMirrors?: boolean;\n localDir?: string;\n migratePresets?: Record<string, string>;\n platform?: PlatformId;\n prCacheSyncMaxPages?: number;\n presetCachePersistence?: boolean;\n httpCacheTtlDays?: number;\n autodiscoverRepoSort?: RepoSortMethod;\n autodiscoverRepoOrder?: SortMethod;\n userAgent?: string;\n dockerMaxPages?: number;\n s3Endpoint?: string;\n s3PathStyle?: boolean;\n cachePrivatePackages?: boolean;\n repositoryCacheForceLocal?: boolean;\n configFileNames?: string[];\n ignorePrAuthor?: boolean;\n allowedUnsafeExecutions?: AllowedUnsafeExecution[];\n onboardingAutoCloseAge?: number;\n productLinks?: Record<string, string>;\n rebaseAllOpenBranches?: boolean;\n toolSettings?: ToolSettingsOptions;\n}\n\n/**\n * Those options are global only but still passed into the repository worker config.\n *\n * @deprecated https://github.com/renovatebot/renovate/issues/39693\n */\nexport interface LegacyAdminConfig {\n baseDir?: string;\n localDir?: string;\n\n logContext?: string;\n\n onboarding?: boolean;\n onboardingBranch?: string;\n onboardingNoDeps?: 'auto' | 'enabled' | 'disabled';\n onboardingRebaseCheckbox?: boolean;\n onboardingConfig?: RenovateConfig;\n onboardingConfigFileName?: string;\n\n optimizeForDisabled?: boolean;\n\n persistRepoData?: boolean;\n\n prCommitsPerRunLimit?: number;\n\n requireConfig?: RequiredConfig;\n\n useCloudMetadataServices?: boolean;\n\n writeDiscoveredRepos?: string;\n}\n\nexport type ExecutionMode = 'branch' | 'update';\n\nexport interface PostUpgradeTasks {\n commands?: string[];\n workingDirTemplate?: string;\n dataFileTemplate?: string;\n fileFilters?: string[];\n executionMode: ExecutionMode;\n installTools?: Partial<Record<ToolName, Record<never, never>>>;\n}\n\nexport type UpdateConfig<\n T extends RenovateSharedConfig = RenovateSharedConfig,\n> = Partial<Record<UpdateType, T | null>>;\n\nexport type RenovateRepositoryEntry = AllConfig & {\n repository: string;\n};\n\nexport type RenovateRepository = string | RenovateRepositoryEntry;\n\nexport type UseBaseBranchConfigType = 'merge' | 'none';\nexport type ConstraintsFilter = 'strict' | 'none';\nexport type MinimumReleaseAgeBehaviour =\n | 'timestamp-required'\n | 'timestamp-optional';\n\nexport const allowedStatusCheckStrings = [\n 'minimumReleaseAge',\n 'mergeConfidence',\n 'configValidation',\n 'artifactError',\n] as const;\nexport type StatusCheckKey = (typeof allowedStatusCheckStrings)[number];\ntype UserEnv = Record<string, string>;\n\n/**\n * Computed properties, for internal use only\n */\nexport interface RenovateInternalConfig {\n /** computed base branch from patterns - for internal use only */\n baseBranches?: string[];\n currentCompatibility?: string;\n datasource?: string;\n hasBaseBranches?: boolean;\n isFork?: boolean;\n isVulnerabilityAlert?: boolean;\n\n /** What is this used for? */\n remediations?: unknown;\n /** What is this used for? */\n vulnerabilityAlertsOnly?: boolean;\n}\n\n// TODO: Proper typings\n/**\n * Configuration that could be used either top-level in a repository config (or Global, Inherited or Shareable Preset configuration).\n *\n * This is a superset of any configuration that a Renovate user (not self-hosted administrator) can set.\n */\nexport interface RenovateConfig\n extends\n LegacyAdminConfig,\n RenovateSharedConfig,\n UpdateConfig<PackageRule>,\n AssigneesAndReviewersConfig,\n ConfigMigration,\n RenovateInternalConfig {\n s3Endpoint?: string;\n s3PathStyle?: boolean;\n reportFormatting?: boolean;\n reportPath?: string;\n reportType?: 'logging' | 'file' | 's3' | null;\n depName?: string;\n /** user configurable base branch patterns*/\n baseBranchPatterns?: string[];\n useBaseBranchConfig?: UseBaseBranchConfigType;\n baseBranch?: string;\n defaultBranch?: string;\n branchList?: string[];\n cloneSubmodules?: boolean;\n cloneSubmodulesFilter?: string[];\n description?: string | string[];\n detectGlobalManagerConfig?: boolean;\n errors?: ValidationMessage[];\n forkModeDisallowMaintainerEdits?: boolean;\n forkProcessing?: 'auto' | 'enabled' | 'disabled';\n forkToken?: string;\n\n gitAuthor?: string;\n\n hostRules?: HostRule[];\n\n inheritConfig?: boolean;\n inheritConfigFileName?: string;\n inheritConfigRepoName?: string;\n inheritConfigStrict?: boolean;\n\n ignorePresets?: string[];\n\n fileList?: string[];\n configWarningReuseIssue?: boolean;\n dependencyDashboard?: boolean;\n dependencyDashboardAutoclose?: boolean;\n dependencyDashboardChecks?: Record<string, string>;\n dependencyDashboardIssue?: number;\n dependencyDashboardTitle?: string;\n dependencyDashboardHeader?: string;\n dependencyDashboardFooter?: string;\n dependencyDashboardLabels?: string[];\n dependencyDashboardOSVVulnerabilitySummary?: 'none' | 'all' | 'unresolved';\n dependencyDashboardReportAbandonment?: boolean;\n mode?: 'silent' | 'full';\n packageFile?: string;\n packageRules?: PackageRule[];\n postUpdateOptions?: string[];\n branchConcurrentLimit?: number | null;\n parentOrg?: string;\n prConcurrentLimit?: number;\n commitHourlyLimit?: number;\n prHourlyLimit?: number;\n\n printConfig?: boolean;\n\n pruneStaleBranches?: boolean;\n\n defaultRegistryUrls?: string[];\n registryUrls?: string[] | null;\n registryAliases?: Record<string, string>;\n\n /**\n * What is this used for?\n * @deprecated\n */\n renovateJsonPresent?: boolean;\n\n repoIsOnboarded?: boolean;\n repoIsActivated?: boolean;\n\n topLevelOrg?: string;\n updateInternalDeps?: boolean;\n updateType?: UpdateType;\n\n warnings?: ValidationMessage[];\n vulnerabilityAlerts?: RenovateSharedConfig;\n osvVulnerabilityAlerts?: boolean;\n vulnerabilitySeverity?: string;\n customManagers?: CustomManager[];\n customDatasources?: Record<string, CustomDatasourceConfig>;\n\n fetchChangeLogs?: FetchChangeLogsOptions;\n secrets?: Record<string, string>;\n variables?: Record<string, string>;\n\n constraints?: Partial<Record<ConstraintName, string>>;\n /**\n * Any specific overrides for the versioning for the `AdditionalConstraintName`s.\n */\n constraintsVersioning?: Partial<Record<AdditionalConstraintName, string>>;\n skipInstalls?: boolean | null;\n\n constraintsFiltering?: ConstraintsFilter;\n\n customizeDashboard?: Record<string, string>;\n\n statusCheckNames?: Record<StatusCheckKey, string | null>;\n statusCheckWhen?: Partial<Record<StatusCheckKey, StatusCheckWhen>>;\n /**\n * User configured environment variables that Renovate uses when executing package manager commands\n */\n env?: UserEnv;\n logLevelRemap?: LogLevelRemap[];\n\n branchTopic?: string;\n additionalBranchPrefix?: string;\n sharedVariableName?: string;\n minimumGroupSize?: number;\n configFileNames?: string[];\n minimumReleaseAgeBehaviour?: MinimumReleaseAgeBehaviour;\n toolSettings?: ToolSettingsOptions;\n}\n\nconst CustomDatasourceFormats = [\n 'html',\n 'json',\n 'plain',\n 'toml',\n 'yaml',\n] as const;\nexport type CustomDatasourceFormats = (typeof CustomDatasourceFormats)[number];\n\nexport interface CustomDatasourceConfig {\n defaultRegistryUrlTemplate?: string;\n format?: CustomDatasourceFormats;\n transformTemplates?: string[];\n}\n\n/**\n * The superset of all configuration that a self-hosted administrator can set, alongside all repository-level configuration.\n *\n */\nexport interface AllConfig\n extends RenovateConfig, GlobalOnlyConfigLegacy, RepoGlobalConfig {\n gitUrl?: GitUrlOption;\n password?: string;\n token?: string;\n username?: string;\n}\n\nexport interface AssigneesAndReviewersConfig {\n assigneesFromCodeOwners?: boolean;\n expandCodeOwnersGroups?: boolean;\n assignees?: string[];\n assigneesSampleSize?: number;\n ignoreReviewers?: string[];\n reviewersFromCodeOwners?: boolean;\n reviewers?: string[];\n reviewersSampleSize?: number;\n additionalReviewers?: string[];\n filterUnavailableUsers?: boolean;\n}\n\nexport type UpdateType =\n | 'major'\n | 'minor'\n | 'patch'\n | 'pin'\n | 'digest'\n | 'pinDigest'\n | 'lockFileMaintenance'\n | 'lockfileUpdate'\n | 'rollback'\n | 'bump'\n | 'replacement';\n\n// These are the update types which can have configuration\nexport const UpdateTypesOptions = [\n 'major',\n 'minor',\n 'patch',\n 'pin',\n 'digest',\n 'pinDigest',\n 'lockFileMaintenance',\n 'rollback',\n 'replacement',\n] as const;\n\nexport type UpdateTypeOptions = (typeof UpdateTypesOptions)[number];\n\nexport type FetchChangeLogsOptions = 'off' | 'branch' | 'pr';\n\nexport type MatchStringsStrategy = 'any' | 'recursive' | 'combination';\n\nexport type MergeStrategy =\n | 'auto'\n | 'fast-forward'\n | 'merge-commit'\n | 'rebase'\n | 'rebase-merge'\n | 'squash';\n\n// This list should be added to as any new unsafe execution commands should be permitted\nexport type AllowedUnsafeExecution =\n | 'bazelModDeps'\n | 'goGenerate'\n | 'gradleWrapper'\n | 'mise';\n\n// TODO: Proper typings\nexport interface PackageRule\n extends RenovateSharedConfig, RenovateInternalConfig, UpdateConfig {\n allowedVersions?: string;\n description?: string | string[];\n matchBaseBranches?: string[];\n matchCategories?: string[];\n matchConfidence?: MergeConfidence[];\n matchCurrentAge?: string;\n matchCurrentValue?: string;\n matchCurrentVersion?: string;\n matchDatasources?: string[];\n matchDepNames?: string[];\n matchDepTypes?: string[];\n matchFileNames?: string[];\n matchManagers?: string[];\n matchNewValue?: string;\n matchPackageNames?: string[];\n matchRepositories?: string[];\n matchSourceUrls?: string[];\n matchRegistryUrls?: string[];\n matchUpdateTypes?: UpdateType[];\n matchJsonata?: string[];\n overrideDatasource?: string;\n overrideDepName?: string;\n overridePackageName?: string;\n registryUrls?: string[] | null;\n replacementName?: string;\n replacementVersion?: string;\n sourceUrl?: string;\n sourceDirectory?: string;\n vulnerabilitySeverity?: string;\n vulnerabilityFixVersion?: string;\n}\n\nexport interface ValidationMessage {\n topic: string;\n message: string;\n}\n\nexport type AllowedParents =\n | '.'\n | 'bumpVersions'\n | 'customDatasources'\n | 'customManagers'\n | 'hostRules'\n | 'logLevelRemap'\n | 'packageRules'\n | 'postUpgradeTasks'\n | 'vulnerabilityAlerts'\n | 'toolSettings'\n | ManagerName\n | UpdateTypeOptions;\nexport interface RenovateOptionBase {\n /**\n * If true, the option can only be configured by people with access to the Renovate instance.\n * Furthermore, the option should be documented in docs/usage/self-hosted-configuration.md.\n */\n globalOnly?: boolean;\n\n inheritConfigSupport?: boolean;\n\n allowedValues?: string[];\n\n allowString?: boolean;\n\n cli?: boolean;\n\n description: string;\n\n env?: false | string;\n\n /**\n * Do not validate object children\n */\n freeChoice?: boolean;\n\n mergeable?: boolean;\n\n autogenerated?: boolean;\n\n name: string;\n\n parents?: AllowedParents[];\n\n stage?: RenovateConfigStage;\n\n experimental?: boolean;\n\n experimentalDescription?: string;\n\n experimentalIssues?: number[];\n\n advancedUse?: boolean;\n\n /**\n * This is used to add a deprecation message in the docs\n */\n deprecationMsg?: string;\n\n /**\n * For internal use only: add it to any config option that supports regex or glob matching\n */\n patternMatch?: boolean;\n\n /**\n * For internal use only: add it to any config option of type integer that supports negative integers\n */\n allowNegative?: boolean;\n\n /**\n * Managers which support this option, leave undefined if all managers support it.\n */\n supportedManagers?: string[];\n\n /**\n * Platforms which support this option, leave undefined if all platforms support it.\n */\n supportedPlatforms?: PlatformId[];\n\n /**\n * Conditions that must be met for this option to be required.\n */\n requiredIf?: RenovateRequiredOption[];\n\n /**\n * If true, the option's value supports Renovate templating.\n * @see https://docs.renovatebot.com/templates/\n */\n supportsTemplating?: boolean;\n}\n\nexport interface RenovateRequiredOption {\n siblingProperties: { property: string; value: string }[];\n}\n\nexport interface RenovateArrayOption<\n T extends string | number | Record<string, unknown> = Record<string, unknown>,\n> extends RenovateOptionBase {\n default?: T[] | null;\n mergeable?: boolean;\n type: 'array';\n subType?: 'string' | 'object' | 'number';\n}\n\nexport interface RenovateStringArrayOption extends RenovateArrayOption<string> {\n format?: 'regex';\n subType: 'string';\n}\n\nexport interface RenovateNumberArrayOption extends RenovateArrayOption<number> {\n subType: 'number';\n}\n\nexport interface RenovateBooleanOption extends RenovateOptionBase {\n default?: boolean | null;\n type: 'boolean';\n}\n\nexport interface RenovateIntegerOption extends RenovateOptionBase {\n default?: number | null;\n type: 'integer';\n}\n\nexport interface RenovateStringOption extends RenovateOptionBase {\n default?: string | null;\n format?: 'regex';\n\n // Not used\n replaceLineReturns?: boolean;\n type: 'string';\n}\n\nexport interface RenovateObjectOption extends RenovateOptionBase {\n default?: any;\n additionalProperties?: Record<string, unknown> | boolean;\n mergeable?: boolean;\n type: 'object';\n}\n\nexport type RenovateOptions =\n | RenovateStringOption\n | RenovateNumberArrayOption\n | RenovateStringArrayOption\n | RenovateIntegerOption\n | RenovateBooleanOption\n | RenovateArrayOption\n | RenovateObjectOption;\n\nexport interface PackageRuleInputConfig extends RenovateConfig {\n versioning?: string;\n packageFile?: string;\n lockFiles?: string[];\n depType?: string;\n depTypes?: string[];\n depName?: string;\n packageName?: string | null;\n newValue?: string | null;\n currentValue?: string | null;\n currentVersion?: string;\n lockedVersion?: string;\n updateType?: UpdateType;\n mergeConfidenceLevel?: MergeConfidence | undefined;\n isBump?: boolean;\n sourceUrl?: string | null;\n categories?: string[];\n baseBranch?: string;\n manager?: string;\n datasource?: string;\n packageRules?: (PackageRule & PackageRuleInputConfig)[];\n releaseTimestamp?: Timestamp | null;\n repository?: string;\n currentVersionAgeInDays?: number;\n currentVersionTimestamp?: string;\n enabled?: boolean;\n skipReason?: SkipReason;\n skipStage?: StageName;\n}\n\nexport interface ConfigMigration {\n configMigration?: boolean;\n}\n\nexport interface MigratedConfig {\n /**\n * Indicates whether there was a migration applied to the configuration.\n *\n * @returns\n * `false` if the configuration does not need migrating, and `migratedConfig` can be ignored\n * `true` if the configuration was migrated, and if so, `migratedConfig` should be used instead of the provided config\n */\n isMigrated: boolean;\n migratedConfig: RenovateConfig;\n}\n\nexport interface MigratedRenovateConfig extends RenovateConfig {\n endpoints?: HostRule[];\n pathRules: PackageRule[];\n packages: PackageRule[];\n\n node?: RenovateConfig;\n travis?: RenovateConfig;\n gradle?: RenovateConfig;\n}\n\nexport interface ManagerConfig extends RenovateConfig {\n manager: string;\n categories?: Category[];\n}\n\nexport interface ValidationResult {\n errors: ValidationMessage[];\n warnings: ValidationMessage[];\n}\n\nexport interface BumpVersionConfig {\n bumpType?: string;\n filePatterns: string[];\n matchStrings: string[];\n name?: string;\n}\n\nexport interface ToolSettingsOptions {\n jvmMaxMemory?: number;\n jvmMemory?: number;\n nodeMaxMemory?: number;\n}\n"],"mappings":";AAoVA,MAAa,4BAA4B;CACvC;CACA;CACA;CACA;AACF;AA4MA,MAAa,qBAAqB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-validator.js","names":["getFileConfig"],"sources":["../lib/config-validator.ts"],"sourcesContent":["#!/usr/bin/env node\nimport 'source-map-support/register.js';\nimport './punycode.cjs';\n\nimport { styleText } from 'node:util';\nimport { isNonEmptyStringAndNotWhitespace } from '@sindresorhus/is';\nimport { Command, CommanderError } from 'commander';\nimport { dequal } from 'dequal';\nimport { diffLines } from 'diff';\nimport fs from 'fs-extra';\nimport { getConfigFileNames } from './config/app-strings.ts';\nimport { GlobalConfig } from './config/global.ts';\nimport { massageConfig } from './config/massage.ts';\nimport { migrateConfig } from './config/migration.ts';\nimport type { RenovateConfig } from './config/types.ts';\nimport { validateConfig } from './config/validation.ts';\nimport { pkg } from './expose.ts';\nimport { init, logger } from './logger/index.ts';\nimport { getEnv } from './util/env.ts';\nimport { add as addHostRule } from './util/host-rules.ts';\nimport { regEx } from './util/regex.ts';\nimport { getConfig as getFileConfig } from './workers/global/config/parse/file.ts';\nimport { parseConfigs } from './workers/global/config/parse/index.ts';\nimport { getParsedContent } from './workers/global/config/parse/util.ts';\n\nawait init();\n\nconst { pathExists, readFile } = fs;\n\nlet returnVal = 0;\n\n/**\n * Make sure that we've resolved configuration from the different places that Renovate users would expect them to be specified\n *\n * This then allows a `configType=repo` config to i.e. be validated alongside a `config.js` or `env RENOVATE_ALLOWED_COMMANDS=...`\n *\n * Note that we intentionally don't fully initialize Renovate and its modules, as we're not fully running, and it would require a Platform to be configured\n * */\nasync function partiallyGlobalInitialize(): Promise<void> {\n // NOTE that this doesn't allow command-line arguments\n const globalConfig = await parseConfigs(getEnv(), []);\n GlobalConfig.set(globalConfig);\n\n if (globalConfig.hostRules) {\n for (const hostRule of globalConfig.hostRules) {\n addHostRule(hostRule);\n }\n }\n}\n\nasync function validate(\n configType: 'global' | 'repo',\n desc: string,\n config: RenovateConfig,\n strict: boolean,\n isPreset = false,\n): Promise<void> {\n if (config.hostRules) {\n for (const hostRule of config.hostRules) {\n addHostRule(hostRule);\n }\n }\n const { isMigrated, migratedConfig } = migrateConfig(config);\n if (isMigrated) {\n logger.warn(\n {\n oldConfig: config,\n newConfig: migratedConfig,\n },\n 'Config migration necessary',\n );\n const changedObjects = diffLines(\n JSON.stringify(config, null, 2),\n JSON.stringify(migratedConfig, null, 2),\n { ignoreWhitespace: false, newlineIsToken: false },\n );\n const added = styleText('green', '+ ');\n const removed = styleText('red', '- ');\n const msg = changedObjects\n .flatMap((part) => {\n let linePrefix: string;\n if (part.added) {\n linePrefix = added;\n } else if (part.removed) {\n linePrefix = removed;\n } else {\n linePrefix = ' ';\n }\n return part.value\n .split('\\n')\n .filter(isNonEmptyStringAndNotWhitespace)\n .map((line) =>\n line.replace(regEx(/^(?<ws> *)/), `${linePrefix}$<ws>`),\n );\n })\n .join('\\n');\n logger.warn(`Config migration diff:\\n${msg}`);\n if (strict) {\n returnVal = 1;\n }\n }\n const massagedConfig = massageConfig(migratedConfig);\n const res = await validateConfig(configType, massagedConfig, isPreset);\n if (res.errors.length) {\n logger.error(\n { file: desc, errors: res.errors },\n 'Found errors in configuration',\n );\n returnVal = 1;\n }\n if (res.warnings.length) {\n logger.warn(\n { file: desc, warnings: res.warnings },\n 'Found errors in configuration',\n );\n returnVal = 1;\n }\n}\n\ninterface PackageJson {\n renovate?: RenovateConfig;\n 'renovate-config'?: Record<string, RenovateConfig>;\n}\n\n(async () => {\n await partiallyGlobalInitialize();\n\n const program = new Command('renovate-config-validator')\n .summary('Validate Renovate configuration files')\n .description(\n `Validate your Renovate configuration (repo config, shared presets or global configuration) files\\n` +\n // oxlint-disable-next-line renovate/no-hardcoded-docs-url -- CLI help text, no config available\n 'If no [config-files...] are given, renovate-config-validator will look at the default config file locations (https://docs.renovatebot.com/configuration-options/)',\n )\n .addHelpText(\n 'after',\n // oxlint-disable-next-line renovate/no-hardcoded-docs-url -- CLI help text, no config available\n `\nWhen specifying [config-files...], Renovate will treat them as global self-hosted configuration files. You can disable this behaviour with --no-global\n\nExamples:\n\n $ renovate-config-validator\n $ renovate-config-validator --strict\n $ renovate-config-validator first_config.json\n $ renovate-config-validator --strict config.js\n $ renovate-config-validator --no-global renovate.json5\n $ env RENOVATE_CONFIG_FILE=obscure-name.json renovate-config-validator\n\nGlobal configuration:\n\nIf you have specified global self-hosted configuration (https://docs.renovatebot.com/self-hosted-configuration/) in environment variables or in a \\`config.js\\`, this will be detected:\n\n $ env RENOVATE_ALLOWED_ENV='[\"GO*\"]' renovate-config-validator\n # if passing the filename, make sure it's not validating as a global config\n $ env RENOVATE_ALLOWED_ENV='[\"GO*\"]' renovate-config-validator --no-global renovate.json`,\n )\n .argument('[config-files...]')\n .version(pkg.version, '-v, --version')\n .option(\n '--strict',\n 'Fail command if any configuration warnings, errors, or a migration is needed',\n )\n .option(\n '--no-global',\n 'When specifying [config-files], do not treat them as global self-hosted configuration file(s)',\n true,\n )\n // allow us to manage the exit code\n .exitOverride();\n\n program.action(async (files, opts) => {\n const strict = opts.strict ?? false;\n let filesValidated = 0;\n\n if (files.length) {\n let isGlobalConfig = true;\n if (opts.global === false) {\n isGlobalConfig = false;\n }\n const configType = isGlobalConfig ? 'global' : 'repo';\n for (const file of files) {\n try {\n if (!(await pathExists(file))) {\n returnVal = 1;\n logger.error({ file }, 'File does not exist');\n break;\n }\n const parsedContent = await getParsedContent(file);\n try {\n logger.info(`Validating ${file} as ${configType} config`);\n await validate(configType, file, parsedContent, strict);\n } catch (err) {\n logger.warn({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n } catch (err) {\n logger.warn({ file, err }, 'File could not be parsed');\n returnVal = 1;\n }\n\n filesValidated++;\n }\n } else {\n for (const file of getConfigFileNames().filter(\n (name) => name !== 'package.json',\n )) {\n try {\n if (!(await pathExists(file))) {\n continue;\n }\n const parsedContent = await getParsedContent(file);\n try {\n logger.info(`Validating ${file}`);\n await validate('repo', file, parsedContent, strict);\n } catch (err) {\n logger.warn({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n } catch (err) {\n logger.warn({ file, err }, 'File could not be parsed');\n returnVal = 1;\n }\n\n filesValidated++;\n }\n try {\n const pkgJson = JSON.parse(\n await readFile('package.json', 'utf8'),\n ) as PackageJson;\n if (pkgJson.renovate) {\n logger.info(`Validating package.json > renovate`);\n await validate(\n 'repo',\n 'package.json > renovate',\n pkgJson.renovate,\n strict,\n );\n\n filesValidated++;\n }\n if (pkgJson['renovate-config']) {\n logger.info(`Validating package.json > renovate-config`);\n for (const presetConfig of Object.values(\n pkgJson['renovate-config'],\n )) {\n await validate(\n 'repo',\n 'package.json > renovate-config',\n presetConfig,\n strict,\n true,\n );\n\n filesValidated++;\n }\n }\n } catch {\n // ignore\n }\n try {\n const env = getEnv();\n const fileConfig = await getFileConfig(env);\n if (!dequal(fileConfig, {})) {\n const file = env.RENOVATE_CONFIG_FILE ?? 'config.js';\n logger.info(`Validating ${file}`);\n try {\n await validate('global', file, fileConfig, strict);\n } catch (err) {\n logger.error({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n filesValidated++;\n }\n } catch {\n // ignore\n }\n }\n if (returnVal === 0 && filesValidated) {\n logger.info(\n `Config validated successfully against ${filesValidated} file(s)`,\n );\n } else if (!filesValidated) {\n logger.warn(`No files to perform configuration validation against`);\n }\n // Use exitCode (not process.exit) so async log streams can flush\n process.exitCode = returnVal;\n });\n\n await program.parseAsync();\n})().catch((e) => {\n // Commander throws an error at the end of Action execution i.e. as part of the `help` and `version` commands, and so we don't want to return an error code in this case\n if (\n e instanceof CommanderError &&\n (e.code === 'commander.helpDisplayed' || e.code === 'commander.version')\n ) {\n return;\n }\n\n // oxlint-disable-next-line no-console -- intentional: display critical error on CLI\n console.error(e);\n process.exit(99);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"config-validator.js","names":["getFileConfig"],"sources":["../lib/config-validator.ts"],"sourcesContent":["#!/usr/bin/env node\nimport 'source-map-support/register.js';\nimport './punycode.cjs';\n\nimport { styleText } from 'node:util';\nimport { isNonEmptyStringAndNotWhitespace } from '@sindresorhus/is';\nimport { Command, CommanderError } from 'commander';\nimport { dequal } from 'dequal';\nimport { diffLines } from 'diff';\nimport fs from 'fs-extra';\nimport { getConfigFileNames } from './config/app-strings.ts';\nimport { GlobalConfig } from './config/global.ts';\nimport { massageConfig } from './config/massage.ts';\nimport { migrateConfig } from './config/migration.ts';\nimport type { RenovateConfig } from './config/types.ts';\nimport { validateConfig } from './config/validation.ts';\nimport { pkg } from './expose.ts';\nimport { init, logger } from './logger/index.ts';\nimport { getEnv } from './util/env.ts';\nimport { add as addHostRule } from './util/host-rules.ts';\nimport { regEx } from './util/regex.ts';\nimport { getConfig as getFileConfig } from './workers/global/config/parse/file.ts';\nimport { parseConfigs } from './workers/global/config/parse/index.ts';\nimport { getParsedContent } from './workers/global/config/parse/util.ts';\n\nawait init();\n\nconst { pathExists, readFile } = fs;\n\nlet returnVal = 0;\n\n/**\n * Make sure that we've resolved configuration from the different places that Renovate users would expect them to be specified\n *\n * This then allows a `configType=repo` config to i.e. be validated alongside a `config.js` or `env RENOVATE_ALLOWED_COMMANDS=...`\n *\n * Note that we intentionally don't fully initialize Renovate and its modules, as we're not fully running, and it would require a Platform to be configured\n * */\nasync function partiallyGlobalInitialize(): Promise<void> {\n // NOTE that this doesn't allow command-line arguments\n const globalConfig = await parseConfigs(getEnv(), []);\n GlobalConfig.set(globalConfig);\n\n if (globalConfig.hostRules) {\n for (const hostRule of globalConfig.hostRules) {\n addHostRule(hostRule);\n }\n }\n}\n\nasync function validate(\n configType: 'global' | 'repo',\n desc: string,\n config: RenovateConfig,\n strict: boolean,\n isPreset = false,\n): Promise<void> {\n if (config.hostRules) {\n for (const hostRule of config.hostRules) {\n addHostRule(hostRule);\n }\n }\n const { isMigrated, migratedConfig } = migrateConfig(config);\n if (isMigrated) {\n logger.warn(\n {\n oldConfig: config,\n newConfig: migratedConfig,\n },\n 'Config migration necessary',\n );\n const changedObjects = diffLines(\n JSON.stringify(config, null, 2),\n JSON.stringify(migratedConfig, null, 2),\n { ignoreWhitespace: false, newlineIsToken: false },\n );\n const added = styleText('green', '+ ');\n const removed = styleText('red', '- ');\n const msg = changedObjects\n .flatMap((part) => {\n let linePrefix: string;\n if (part.added) {\n linePrefix = added;\n } else if (part.removed) {\n linePrefix = removed;\n } else {\n linePrefix = ' ';\n }\n return part.value\n .split('\\n')\n .filter(isNonEmptyStringAndNotWhitespace)\n .map((line) =>\n line.replace(regEx(/^(?<ws> *)/), `${linePrefix}$<ws>`),\n );\n })\n .join('\\n');\n // oxlint-disable-next-line renovate/logger-static-message -- the multi-line, colorized diff must be interpolated to stay readable; as a metadata field it is JSON-escaped onto one line\n logger.warn(`Config migration diff:\\n${msg}`);\n if (strict) {\n returnVal = 1;\n }\n }\n const massagedConfig = massageConfig(migratedConfig);\n const res = await validateConfig(configType, massagedConfig, isPreset);\n if (res.errors.length) {\n logger.error(\n { file: desc, errors: res.errors },\n 'Found errors in configuration',\n );\n returnVal = 1;\n }\n if (res.warnings.length) {\n logger.warn(\n { file: desc, warnings: res.warnings },\n 'Found errors in configuration',\n );\n returnVal = 1;\n }\n}\n\ninterface PackageJson {\n renovate?: RenovateConfig;\n 'renovate-config'?: Record<string, RenovateConfig>;\n}\n\n(async () => {\n await partiallyGlobalInitialize();\n\n const program = new Command('renovate-config-validator')\n .summary('Validate Renovate configuration files')\n .description(\n `Validate your Renovate configuration (repo config, shared presets or global configuration) files\\n` +\n // oxlint-disable-next-line renovate/no-hardcoded-docs-url -- CLI help text, no config available\n 'If no [config-files...] are given, renovate-config-validator will look at the default config file locations (https://docs.renovatebot.com/configuration-options/)',\n )\n .addHelpText(\n 'after',\n // oxlint-disable-next-line renovate/no-hardcoded-docs-url -- CLI help text, no config available\n `\nWhen specifying [config-files...], Renovate will treat them as global self-hosted configuration files. You can disable this behaviour with --no-global\n\nExamples:\n\n $ renovate-config-validator\n $ renovate-config-validator --strict\n $ renovate-config-validator first_config.json\n $ renovate-config-validator --strict config.js\n $ renovate-config-validator --no-global renovate.json5\n $ env RENOVATE_CONFIG_FILE=obscure-name.json renovate-config-validator\n\nGlobal configuration:\n\nIf you have specified global self-hosted configuration (https://docs.renovatebot.com/self-hosted-configuration/) in environment variables or in a \\`config.js\\`, this will be detected:\n\n $ env RENOVATE_ALLOWED_ENV='[\"GO*\"]' renovate-config-validator\n # if passing the filename, make sure it's not validating as a global config\n $ env RENOVATE_ALLOWED_ENV='[\"GO*\"]' renovate-config-validator --no-global renovate.json`,\n )\n .argument('[config-files...]')\n .version(pkg.version, '-v, --version')\n .option(\n '--strict',\n 'Fail command if any configuration warnings, errors, or a migration is needed',\n )\n .option(\n '--no-global',\n 'When specifying [config-files], do not treat them as global self-hosted configuration file(s)',\n true,\n )\n // allow us to manage the exit code\n .exitOverride();\n\n program.action(async (files, opts) => {\n const strict = opts.strict ?? false;\n let filesValidated = 0;\n\n if (files.length) {\n let isGlobalConfig = true;\n if (opts.global === false) {\n isGlobalConfig = false;\n }\n const configType = isGlobalConfig ? 'global' : 'repo';\n for (const file of files) {\n try {\n if (!(await pathExists(file))) {\n returnVal = 1;\n logger.error({ file }, 'File does not exist');\n break;\n }\n const parsedContent = await getParsedContent(file);\n try {\n logger.info(`Validating ${file} as ${configType} config`);\n await validate(configType, file, parsedContent, strict);\n } catch (err) {\n logger.warn({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n } catch (err) {\n logger.warn({ file, err }, 'File could not be parsed');\n returnVal = 1;\n }\n\n filesValidated++;\n }\n } else {\n for (const file of getConfigFileNames().filter(\n (name) => name !== 'package.json',\n )) {\n try {\n if (!(await pathExists(file))) {\n continue;\n }\n const parsedContent = await getParsedContent(file);\n try {\n logger.info(`Validating ${file}`);\n await validate('repo', file, parsedContent, strict);\n } catch (err) {\n logger.warn({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n } catch (err) {\n logger.warn({ file, err }, 'File could not be parsed');\n returnVal = 1;\n }\n\n filesValidated++;\n }\n try {\n const pkgJson = JSON.parse(\n await readFile('package.json', 'utf8'),\n ) as PackageJson;\n if (pkgJson.renovate) {\n logger.info(`Validating package.json > renovate`);\n await validate(\n 'repo',\n 'package.json > renovate',\n pkgJson.renovate,\n strict,\n );\n\n filesValidated++;\n }\n if (pkgJson['renovate-config']) {\n logger.info(`Validating package.json > renovate-config`);\n for (const presetConfig of Object.values(\n pkgJson['renovate-config'],\n )) {\n await validate(\n 'repo',\n 'package.json > renovate-config',\n presetConfig,\n strict,\n true,\n );\n\n filesValidated++;\n }\n }\n } catch {\n // ignore\n }\n try {\n const env = getEnv();\n const fileConfig = await getFileConfig(env);\n if (!dequal(fileConfig, {})) {\n const file = env.RENOVATE_CONFIG_FILE ?? 'config.js';\n logger.info(`Validating ${file}`);\n try {\n await validate('global', file, fileConfig, strict);\n } catch (err) {\n logger.error({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n filesValidated++;\n }\n } catch {\n // ignore\n }\n }\n if (returnVal === 0 && filesValidated) {\n logger.info(\n `Config validated successfully against ${filesValidated} file(s)`,\n );\n } else if (!filesValidated) {\n logger.warn(`No files to perform configuration validation against`);\n }\n // Use exitCode (not process.exit) so async log streams can flush\n process.exitCode = returnVal;\n });\n\n await program.parseAsync();\n})().catch((e) => {\n // Commander throws an error at the end of Action execution i.e. as part of the `help` and `version` commands, and so we don't want to return an error code in this case\n if (\n e instanceof CommanderError &&\n (e.code === 'commander.helpDisplayed' || e.code === 'commander.version')\n ) {\n return;\n }\n\n // oxlint-disable-next-line no-console -- intentional: display critical error on CLI\n console.error(e);\n process.exit(99);\n});\n"],"mappings":"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"}
@@ -29,7 +29,7 @@ var BitriseDatasource = class BitriseDatasource extends Datasource {
29
29
  if (!registryUrl) return null;
30
30
  const parsedUrl = parseGitUrl(registryUrl);
31
31
  if (detectPlatform(registryUrl) !== "github") {
32
- logger.once.warn(`${parsedUrl.source} is not a supported Git hoster for this datasource`);
32
+ logger.once.warn({ source: parsedUrl.source }, "Unsupported Git hoster for this datasource");
33
33
  return null;
34
34
  }
35
35
  const result = { releases: [] };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["semver"],"sources":["../../../../lib/modules/datasource/bitrise/index.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { fromBase64 } from '../../../util/string.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { GithubContentResponse } from '../../platform/github/schema.ts';\nimport semver from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { BitriseStepFile } from './schema.ts';\n\nexport class BitriseDatasource extends Datasource {\n static readonly id = 'bitrise';\n\n override readonly http: GithubHttp;\n\n constructor() {\n super(BitriseDatasource.id);\n\n this.http = new GithubHttp(this.id);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = [\n 'https://github.com/bitrise-io/bitrise-steplib.git',\n ];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `source_code_url` field of the release object in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const parsedUrl = parseGitUrl(registryUrl);\n if (detectPlatform(registryUrl) !== 'github') {\n logger.once.warn(\n `${parsedUrl.source} is not a supported Git hoster for this datasource`,\n );\n return null;\n }\n\n const result: ReleaseResult = {\n releases: [],\n };\n\n const massagedPackageName = encodeURIComponent(packageName);\n const baseApiURL =\n parsedUrl.resource === 'github.com'\n ? 'https://api.github.com'\n : `https://${parsedUrl.resource}/api/v3`;\n const packageUrl = joinUrlParts(\n baseApiURL,\n 'repos',\n parsedUrl.full_name,\n 'contents/steps',\n massagedPackageName,\n );\n\n const { body: packageRaw } = await this.http.getJson(\n packageUrl,\n GithubContentResponse,\n );\n\n if (!isArray(packageRaw)) {\n logger.warn(\n { data: packageRaw, url: packageUrl },\n 'Got unexpected response for Bitrise package location',\n );\n return null;\n }\n\n for (const versionDir of packageRaw.filter((element) =>\n semver.isValid(element.name),\n )) {\n const stepUrl = joinUrlParts(packageUrl, versionDir.name, 'step.yml');\n // TODO use getRawFile when ready #30155\n const { body } = await this.http.getJson(stepUrl, GithubContentResponse);\n if (!('content' in body)) {\n logger.warn(\n { data: body, url: stepUrl },\n 'Got unexpected response for Bitrise step location',\n );\n return null;\n }\n if (body.encoding !== 'base64') {\n logger.warn(\n { encoding: body.encoding, data: body, url: stepUrl },\n `Got unexpected encoding for Bitrise step location`,\n );\n return null;\n }\n\n const content = fromBase64(body.content);\n const { published_at, source_code_url } = BitriseStepFile.parse(content);\n\n result.releases.push({\n version: versionDir.name,\n releaseTimestamp: published_at,\n sourceUrl: source_code_url,\n });\n }\n\n // if we have no releases return null\n if (!result.releases.length) {\n return null;\n }\n\n return {\n ...result,\n homepage: `https://bitrise.io/integrations/steps/${packageName}`,\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${BitriseDatasource.id}`,\n key: `${config.registryUrl}/${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,IAAa,oBAAb,MAAa,0BAA0B,WAAW;CAChD,OAAgB,KAAK;CAErB;CAEA,cAAc;EACZ,MAAM,kBAAkB,EAAE;EAE1B,KAAK,OAAO,IAAI,WAAW,KAAK,EAAE;CACpC;CAEA,wBAA0C;CAE1C,sBAAwC,CACtC,mDACF;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,YAAY,YAAY,WAAW;EACzC,IAAI,eAAe,WAAW,MAAM,UAAU;GAC5C,OAAO,KAAK,KACV,GAAG,UAAU,OAAO,mDACtB;GACA,OAAO;EACT;EAEA,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EAEA,MAAM,sBAAsB,mBAAmB,WAAW;EAK1D,MAAM,aAAa,aAHjB,UAAU,aAAa,eACnB,2BACA,WAAW,UAAU,SAAS,UAGlC,SACA,UAAU,WACV,kBACA,mBACF;EAEA,MAAM,EAAE,MAAM,eAAe,MAAM,KAAK,KAAK,QAC3C,YACA,qBACF;EAEA,IAAI,CAAC,QAAQ,UAAU,GAAG;GACxB,OAAO,KACL;IAAE,MAAM;IAAY,KAAK;GAAW,GACpC,sDACF;GACA,OAAO;EACT;EAEA,KAAK,MAAM,cAAc,WAAW,QAAQ,YAC1CA,IAAO,QAAQ,QAAQ,IAAI,CAC7B,GAAG;GACD,MAAM,UAAU,aAAa,YAAY,WAAW,MAAM,UAAU;GAEpE,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAAQ,SAAS,qBAAqB;GACvE,IAAI,EAAE,aAAa,OAAO;IACxB,OAAO,KACL;KAAE,MAAM;KAAM,KAAK;IAAQ,GAC3B,mDACF;IACA,OAAO;GACT;GACA,IAAI,KAAK,aAAa,UAAU;IAC9B,OAAO,KACL;KAAE,UAAU,KAAK;KAAU,MAAM;KAAM,KAAK;IAAQ,GACpD,mDACF;IACA,OAAO;GACT;GAEA,MAAM,UAAU,WAAW,KAAK,OAAO;GACvC,MAAM,EAAE,cAAc,oBAAoB,gBAAgB,MAAM,OAAO;GAEvE,OAAO,SAAS,KAAK;IACnB,SAAS,WAAW;IACpB,kBAAkB;IAClB,WAAW;GACb,CAAC;EACH;EAGA,IAAI,CAAC,OAAO,SAAS,QACnB,OAAO;EAGT,OAAO;GACL,GAAG;GACH,UAAU,yCAAyC;EACrD;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,kBAAkB;GAC3C,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["semver"],"sources":["../../../../lib/modules/datasource/bitrise/index.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { fromBase64 } from '../../../util/string.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { GithubContentResponse } from '../../platform/github/schema.ts';\nimport semver from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { BitriseStepFile } from './schema.ts';\n\nexport class BitriseDatasource extends Datasource {\n static readonly id = 'bitrise';\n\n override readonly http: GithubHttp;\n\n constructor() {\n super(BitriseDatasource.id);\n\n this.http = new GithubHttp(this.id);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = [\n 'https://github.com/bitrise-io/bitrise-steplib.git',\n ];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `source_code_url` field of the release object in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const parsedUrl = parseGitUrl(registryUrl);\n if (detectPlatform(registryUrl) !== 'github') {\n logger.once.warn(\n { source: parsedUrl.source },\n 'Unsupported Git hoster for this datasource',\n );\n return null;\n }\n\n const result: ReleaseResult = {\n releases: [],\n };\n\n const massagedPackageName = encodeURIComponent(packageName);\n const baseApiURL =\n parsedUrl.resource === 'github.com'\n ? 'https://api.github.com'\n : `https://${parsedUrl.resource}/api/v3`;\n const packageUrl = joinUrlParts(\n baseApiURL,\n 'repos',\n parsedUrl.full_name,\n 'contents/steps',\n massagedPackageName,\n );\n\n const { body: packageRaw } = await this.http.getJson(\n packageUrl,\n GithubContentResponse,\n );\n\n if (!isArray(packageRaw)) {\n logger.warn(\n { data: packageRaw, url: packageUrl },\n 'Got unexpected response for Bitrise package location',\n );\n return null;\n }\n\n for (const versionDir of packageRaw.filter((element) =>\n semver.isValid(element.name),\n )) {\n const stepUrl = joinUrlParts(packageUrl, versionDir.name, 'step.yml');\n // TODO use getRawFile when ready #30155\n const { body } = await this.http.getJson(stepUrl, GithubContentResponse);\n if (!('content' in body)) {\n logger.warn(\n { data: body, url: stepUrl },\n 'Got unexpected response for Bitrise step location',\n );\n return null;\n }\n if (body.encoding !== 'base64') {\n logger.warn(\n { encoding: body.encoding, data: body, url: stepUrl },\n `Got unexpected encoding for Bitrise step location`,\n );\n return null;\n }\n\n const content = fromBase64(body.content);\n const { published_at, source_code_url } = BitriseStepFile.parse(content);\n\n result.releases.push({\n version: versionDir.name,\n releaseTimestamp: published_at,\n sourceUrl: source_code_url,\n });\n }\n\n // if we have no releases return null\n if (!result.releases.length) {\n return null;\n }\n\n return {\n ...result,\n homepage: `https://bitrise.io/integrations/steps/${packageName}`,\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${BitriseDatasource.id}`,\n key: `${config.registryUrl}/${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,IAAa,oBAAb,MAAa,0BAA0B,WAAW;CAChD,OAAgB,KAAK;CAErB;CAEA,cAAc;EACZ,MAAM,kBAAkB,EAAE;EAE1B,KAAK,OAAO,IAAI,WAAW,KAAK,EAAE;CACpC;CAEA,wBAA0C;CAE1C,sBAAwC,CACtC,mDACF;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,YAAY,YAAY,WAAW;EACzC,IAAI,eAAe,WAAW,MAAM,UAAU;GAC5C,OAAO,KAAK,KACV,EAAE,QAAQ,UAAU,OAAO,GAC3B,4CACF;GACA,OAAO;EACT;EAEA,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EAEA,MAAM,sBAAsB,mBAAmB,WAAW;EAK1D,MAAM,aAAa,aAHjB,UAAU,aAAa,eACnB,2BACA,WAAW,UAAU,SAAS,UAGlC,SACA,UAAU,WACV,kBACA,mBACF;EAEA,MAAM,EAAE,MAAM,eAAe,MAAM,KAAK,KAAK,QAC3C,YACA,qBACF;EAEA,IAAI,CAAC,QAAQ,UAAU,GAAG;GACxB,OAAO,KACL;IAAE,MAAM;IAAY,KAAK;GAAW,GACpC,sDACF;GACA,OAAO;EACT;EAEA,KAAK,MAAM,cAAc,WAAW,QAAQ,YAC1CA,IAAO,QAAQ,QAAQ,IAAI,CAC7B,GAAG;GACD,MAAM,UAAU,aAAa,YAAY,WAAW,MAAM,UAAU;GAEpE,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAAQ,SAAS,qBAAqB;GACvE,IAAI,EAAE,aAAa,OAAO;IACxB,OAAO,KACL;KAAE,MAAM;KAAM,KAAK;IAAQ,GAC3B,mDACF;IACA,OAAO;GACT;GACA,IAAI,KAAK,aAAa,UAAU;IAC9B,OAAO,KACL;KAAE,UAAU,KAAK;KAAU,MAAM;KAAM,KAAK;IAAQ,GACpD,mDACF;IACA,OAAO;GACT;GAEA,MAAM,UAAU,WAAW,KAAK,OAAO;GACvC,MAAM,EAAE,cAAc,oBAAoB,gBAAgB,MAAM,OAAO;GAEvE,OAAO,SAAS,KAAK;IACnB,SAAS,WAAW;IACpB,kBAAkB;IAClB,WAAW;GACb,CAAC;EACH;EAGA,IAAI,CAAC,OAAO,SAAS,QACnB,OAAO;EAGT,OAAO;GACL,GAAG;GACH,UAAU,yCAAyC;EACrD;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,kBAAkB;GAC3C,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
@@ -30,7 +30,10 @@ var CustomDatasource = class CustomDatasource extends Datasource {
30
30
  for (const transformTemplate of transformTemplates) {
31
31
  const expression = getExpression(transformTemplate);
32
32
  if (expression instanceof Error) {
33
- logger.once.warn({ errorMessage: expression.message }, `Invalid JSONata expression: ${transformTemplate}`);
33
+ logger.once.warn({
34
+ errorMessage: expression.message,
35
+ transformTemplate
36
+ }, "Invalid JSONata expression");
34
37
  return null;
35
38
  }
36
39
  try {
@@ -41,7 +44,10 @@ var CustomDatasource = class CustomDatasource extends Datasource {
41
44
  }, `Custom datasource transformed data.`);
42
45
  data = modifiedData;
43
46
  } catch (err) {
44
- logger.once.warn({ err }, `Error while evaluating JSONata expression: ${transformTemplate}`);
47
+ logger.once.warn({
48
+ err,
49
+ transformTemplate
50
+ }, "Error while evaluating JSONata expression");
45
51
  return null;
46
52
  }
47
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/custom/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { getExpression } from '../../../util/jsonata.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport { fetchers } from './formats/index.ts';\nimport { ReleaseResultZod } from './schema.ts';\nimport { getCustomConfig } from './utils.ts';\n\nexport class CustomDatasource extends Datasource {\n static readonly id = 'custom';\n\n override customRegistrySupport = true;\n\n constructor() {\n super(CustomDatasource.id);\n }\n\n async getReleases(\n getReleasesConfig: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const config = getCustomConfig(getReleasesConfig);\n if (isNullOrUndefined(config)) {\n return null;\n }\n\n const { defaultRegistryUrlTemplate, transformTemplates, format } = config;\n\n const fetcher = fetchers[format];\n const isLocalRegistry = defaultRegistryUrlTemplate.startsWith('file://');\n\n let data: unknown;\n try {\n if (isLocalRegistry) {\n data = await fetcher.readFile(\n defaultRegistryUrlTemplate.replace('file://', ''),\n );\n } else {\n data = await fetcher.fetch(this.http, defaultRegistryUrlTemplate);\n }\n } catch (e) {\n this.handleHttpErrors(e);\n return null;\n }\n\n logger.trace(\n { data },\n `Custom datasource API fetcher '${format}' received data. Starting transformation.`,\n );\n\n for (const transformTemplate of transformTemplates) {\n const expression = getExpression(transformTemplate);\n\n if (expression instanceof Error) {\n logger.once.warn(\n { errorMessage: expression.message },\n `Invalid JSONata expression: ${transformTemplate}`,\n );\n return null;\n }\n\n try {\n const modifiedData = await expression.evaluate(data);\n\n logger.trace(\n { before: data, after: modifiedData },\n `Custom datasource transformed data.`,\n );\n\n data = modifiedData;\n } catch (err) {\n logger.once.warn(\n { err },\n `Error while evaluating JSONata expression: ${transformTemplate}`,\n );\n return null;\n }\n }\n\n try {\n const parsed = ReleaseResultZod.parse(data);\n return structuredClone(parsed);\n } catch (err) {\n logger.debug({ err }, `Response has failed validation`);\n logger.trace({ data }, 'Response that has failed validation');\n return null;\n }\n }\n\n override getDigest(\n _cfg: DigestConfig,\n _newValue?: string,\n ): Promise<string | null> {\n // Return null here to support setting a digest: value can be provided digest in getReleases\n return Promise.resolve(null);\n }\n}\n"],"mappings":";;;;;;;;AAaA,IAAa,mBAAb,MAAa,yBAAyB,WAAW;CAC/C,OAAgB,KAAK;CAErB,wBAAiC;CAEjC,cAAc;EACZ,MAAM,iBAAiB,EAAE;CAC3B;CAEA,MAAM,YACJ,mBAC+B;EAC/B,MAAM,SAAS,gBAAgB,iBAAiB;EAChD,IAAI,kBAAkB,MAAM,GAC1B,OAAO;EAGT,MAAM,EAAE,4BAA4B,oBAAoB,WAAW;EAEnE,MAAM,UAAU,SAAS;EACzB,MAAM,kBAAkB,2BAA2B,WAAW,SAAS;EAEvE,IAAI;EACJ,IAAI;GACF,IAAI,iBACF,OAAO,MAAM,QAAQ,SACnB,2BAA2B,QAAQ,WAAW,EAAE,CAClD;QAEA,OAAO,MAAM,QAAQ,MAAM,KAAK,MAAM,0BAA0B;EAEpE,SAAS,GAAG;GACV,KAAK,iBAAiB,CAAC;GACvB,OAAO;EACT;EAEA,OAAO,MACL,EAAE,KAAK,GACP,kCAAkC,OAAO,0CAC3C;EAEA,KAAK,MAAM,qBAAqB,oBAAoB;GAClD,MAAM,aAAa,cAAc,iBAAiB;GAElD,IAAI,sBAAsB,OAAO;IAC/B,OAAO,KAAK,KACV,EAAE,cAAc,WAAW,QAAQ,GACnC,+BAA+B,mBACjC;IACA,OAAO;GACT;GAEA,IAAI;IACF,MAAM,eAAe,MAAM,WAAW,SAAS,IAAI;IAEnD,OAAO,MACL;KAAE,QAAQ;KAAM,OAAO;IAAa,GACpC,qCACF;IAEA,OAAO;GACT,SAAS,KAAK;IACZ,OAAO,KAAK,KACV,EAAE,IAAI,GACN,8CAA8C,mBAChD;IACA,OAAO;GACT;EACF;EAEA,IAAI;GACF,MAAM,SAAS,iBAAiB,MAAM,IAAI;GAC1C,OAAO,gBAAgB,MAAM;EAC/B,SAAS,KAAK;GACZ,OAAO,MAAM,EAAE,IAAI,GAAG,gCAAgC;GACtD,OAAO,MAAM,EAAE,KAAK,GAAG,qCAAqC;GAC5D,OAAO;EACT;CACF;CAEA,UACE,MACA,WACwB;EAExB,OAAO,QAAQ,QAAQ,IAAI;CAC7B;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/custom/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { getExpression } from '../../../util/jsonata.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport { fetchers } from './formats/index.ts';\nimport { ReleaseResultZod } from './schema.ts';\nimport { getCustomConfig } from './utils.ts';\n\nexport class CustomDatasource extends Datasource {\n static readonly id = 'custom';\n\n override customRegistrySupport = true;\n\n constructor() {\n super(CustomDatasource.id);\n }\n\n async getReleases(\n getReleasesConfig: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const config = getCustomConfig(getReleasesConfig);\n if (isNullOrUndefined(config)) {\n return null;\n }\n\n const { defaultRegistryUrlTemplate, transformTemplates, format } = config;\n\n const fetcher = fetchers[format];\n const isLocalRegistry = defaultRegistryUrlTemplate.startsWith('file://');\n\n let data: unknown;\n try {\n if (isLocalRegistry) {\n data = await fetcher.readFile(\n defaultRegistryUrlTemplate.replace('file://', ''),\n );\n } else {\n data = await fetcher.fetch(this.http, defaultRegistryUrlTemplate);\n }\n } catch (e) {\n this.handleHttpErrors(e);\n return null;\n }\n\n logger.trace(\n { data },\n `Custom datasource API fetcher '${format}' received data. Starting transformation.`,\n );\n\n for (const transformTemplate of transformTemplates) {\n const expression = getExpression(transformTemplate);\n\n if (expression instanceof Error) {\n logger.once.warn(\n { errorMessage: expression.message, transformTemplate },\n 'Invalid JSONata expression',\n );\n return null;\n }\n\n try {\n const modifiedData = await expression.evaluate(data);\n\n logger.trace(\n { before: data, after: modifiedData },\n `Custom datasource transformed data.`,\n );\n\n data = modifiedData;\n } catch (err) {\n logger.once.warn(\n { err, transformTemplate },\n 'Error while evaluating JSONata expression',\n );\n return null;\n }\n }\n\n try {\n const parsed = ReleaseResultZod.parse(data);\n return structuredClone(parsed);\n } catch (err) {\n logger.debug({ err }, `Response has failed validation`);\n logger.trace({ data }, 'Response that has failed validation');\n return null;\n }\n }\n\n override getDigest(\n _cfg: DigestConfig,\n _newValue?: string,\n ): Promise<string | null> {\n // Return null here to support setting a digest: value can be provided digest in getReleases\n return Promise.resolve(null);\n }\n}\n"],"mappings":";;;;;;;;AAaA,IAAa,mBAAb,MAAa,yBAAyB,WAAW;CAC/C,OAAgB,KAAK;CAErB,wBAAiC;CAEjC,cAAc;EACZ,MAAM,iBAAiB,EAAE;CAC3B;CAEA,MAAM,YACJ,mBAC+B;EAC/B,MAAM,SAAS,gBAAgB,iBAAiB;EAChD,IAAI,kBAAkB,MAAM,GAC1B,OAAO;EAGT,MAAM,EAAE,4BAA4B,oBAAoB,WAAW;EAEnE,MAAM,UAAU,SAAS;EACzB,MAAM,kBAAkB,2BAA2B,WAAW,SAAS;EAEvE,IAAI;EACJ,IAAI;GACF,IAAI,iBACF,OAAO,MAAM,QAAQ,SACnB,2BAA2B,QAAQ,WAAW,EAAE,CAClD;QAEA,OAAO,MAAM,QAAQ,MAAM,KAAK,MAAM,0BAA0B;EAEpE,SAAS,GAAG;GACV,KAAK,iBAAiB,CAAC;GACvB,OAAO;EACT;EAEA,OAAO,MACL,EAAE,KAAK,GACP,kCAAkC,OAAO,0CAC3C;EAEA,KAAK,MAAM,qBAAqB,oBAAoB;GAClD,MAAM,aAAa,cAAc,iBAAiB;GAElD,IAAI,sBAAsB,OAAO;IAC/B,OAAO,KAAK,KACV;KAAE,cAAc,WAAW;KAAS;IAAkB,GACtD,4BACF;IACA,OAAO;GACT;GAEA,IAAI;IACF,MAAM,eAAe,MAAM,WAAW,SAAS,IAAI;IAEnD,OAAO,MACL;KAAE,QAAQ;KAAM,OAAO;IAAa,GACpC,qCACF;IAEA,OAAO;GACT,SAAS,KAAK;IACZ,OAAO,KAAK,KACV;KAAE;KAAK;IAAkB,GACzB,2CACF;IACA,OAAO;GACT;EACF;EAEA,IAAI;GACF,MAAM,SAAS,iBAAiB,MAAM,IAAI;GAC1C,OAAO,gBAAgB,MAAM;EAC/B,SAAS,KAAK;GACZ,OAAO,MAAM,EAAE,IAAI,GAAG,gCAAgC;GACtD,OAAO,MAAM,EAAE,KAAK,GAAG,qCAAqC;GAC5D,OAAO;EACT;CACF;CAEA,UACE,MACA,WACwB;EAExB,OAAO,QAAQ,QAAQ,IAAI;CAC7B;AACF"}
@@ -33,7 +33,10 @@ async function postprocessRelease(config, release) {
33
33
  }
34
34
  return result;
35
35
  } catch (err) {
36
- logger.once.warn({ err }, `Release interceptor failed for "${datasource}"`);
36
+ logger.once.warn({
37
+ err,
38
+ datasource
39
+ }, "Release interceptor failed");
37
40
  return release;
38
41
  }
39
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"postprocess-release.js","names":[],"sources":["../../../lib/modules/datasource/postprocess-release.ts"],"sourcesContent":["import { logger } from '../../logger/index.ts';\nimport type {\n LookupUpdateConfig,\n UpdateResult,\n} from '../../workers/repository/process/lookup/types.ts';\nimport { getDatasourceFor } from './common.ts';\nimport { Datasource } from './datasource.ts';\nimport type { Release } from './types.ts';\n\ntype Config = Partial<LookupUpdateConfig & UpdateResult>;\n\nexport async function postprocessRelease(\n config: Config,\n release: Release,\n): Promise<Release | null> {\n const { datasource } = config;\n\n const ds = datasource && getDatasourceFor(datasource);\n if (!ds) {\n logger.once.warn(\n { datasource },\n 'Failed to resolve datasource during release postprocessing',\n );\n return release;\n }\n\n if (\n ds.constructor.prototype.postprocessRelease ===\n Datasource.prototype.postprocessRelease\n ) {\n return release;\n }\n\n const { packageName } = config;\n if (!packageName) {\n logger.once.warn(\n { datasource },\n 'Release postprocessing is not supported for empty `packageName` field',\n );\n return release;\n }\n\n const registryUrl = config.registryUrl ?? config.registryUrls?.at(0) ?? null;\n\n try {\n const result = await ds.postprocessRelease(\n { packageName, registryUrl },\n release,\n );\n\n if (result === 'reject') {\n logger.debug(\n {\n datasource,\n packageName,\n registryUrl,\n version: release.version,\n versionOrig: release.versionOrig,\n },\n 'Rejected release',\n );\n return null;\n }\n\n return result;\n } catch (err) {\n logger.once.warn({ err }, `Release interceptor failed for \"${datasource}\"`);\n return release;\n }\n}\n"],"mappings":";;;;AAWA,eAAsB,mBACpB,QACA,SACyB;CACzB,MAAM,EAAE,eAAe;CAEvB,MAAM,KAAK,cAAc,iBAAiB,UAAU;CACpD,IAAI,CAAC,IAAI;EACP,OAAO,KAAK,KACV,EAAE,WAAW,GACb,4DACF;EACA,OAAO;CACT;CAEA,IACE,GAAG,YAAY,UAAU,uBACzB,WAAW,UAAU,oBAErB,OAAO;CAGT,MAAM,EAAE,gBAAgB;CACxB,IAAI,CAAC,aAAa;EAChB,OAAO,KAAK,KACV,EAAE,WAAW,GACb,uEACF;EACA,OAAO;CACT;CAEA,MAAM,cAAc,OAAO,eAAe,OAAO,cAAc,GAAG,CAAC,KAAK;CAExE,IAAI;EACF,MAAM,SAAS,MAAM,GAAG,mBACtB;GAAE;GAAa;EAAY,GAC3B,OACF;EAEA,IAAI,WAAW,UAAU;GACvB,OAAO,MACL;IACE;IACA;IACA;IACA,SAAS,QAAQ;IACjB,aAAa,QAAQ;GACvB,GACA,kBACF;GACA,OAAO;EACT;EAEA,OAAO;CACT,SAAS,KAAK;EACZ,OAAO,KAAK,KAAK,EAAE,IAAI,GAAG,mCAAmC,WAAW,EAAE;EAC1E,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"postprocess-release.js","names":[],"sources":["../../../lib/modules/datasource/postprocess-release.ts"],"sourcesContent":["import { logger } from '../../logger/index.ts';\nimport type {\n LookupUpdateConfig,\n UpdateResult,\n} from '../../workers/repository/process/lookup/types.ts';\nimport { getDatasourceFor } from './common.ts';\nimport { Datasource } from './datasource.ts';\nimport type { Release } from './types.ts';\n\ntype Config = Partial<LookupUpdateConfig & UpdateResult>;\n\nexport async function postprocessRelease(\n config: Config,\n release: Release,\n): Promise<Release | null> {\n const { datasource } = config;\n\n const ds = datasource && getDatasourceFor(datasource);\n if (!ds) {\n logger.once.warn(\n { datasource },\n 'Failed to resolve datasource during release postprocessing',\n );\n return release;\n }\n\n if (\n ds.constructor.prototype.postprocessRelease ===\n Datasource.prototype.postprocessRelease\n ) {\n return release;\n }\n\n const { packageName } = config;\n if (!packageName) {\n logger.once.warn(\n { datasource },\n 'Release postprocessing is not supported for empty `packageName` field',\n );\n return release;\n }\n\n const registryUrl = config.registryUrl ?? config.registryUrls?.at(0) ?? null;\n\n try {\n const result = await ds.postprocessRelease(\n { packageName, registryUrl },\n release,\n );\n\n if (result === 'reject') {\n logger.debug(\n {\n datasource,\n packageName,\n registryUrl,\n version: release.version,\n versionOrig: release.versionOrig,\n },\n 'Rejected release',\n );\n return null;\n }\n\n return result;\n } catch (err) {\n logger.once.warn({ err, datasource }, 'Release interceptor failed');\n return release;\n }\n}\n"],"mappings":";;;;AAWA,eAAsB,mBACpB,QACA,SACyB;CACzB,MAAM,EAAE,eAAe;CAEvB,MAAM,KAAK,cAAc,iBAAiB,UAAU;CACpD,IAAI,CAAC,IAAI;EACP,OAAO,KAAK,KACV,EAAE,WAAW,GACb,4DACF;EACA,OAAO;CACT;CAEA,IACE,GAAG,YAAY,UAAU,uBACzB,WAAW,UAAU,oBAErB,OAAO;CAGT,MAAM,EAAE,gBAAgB;CACxB,IAAI,CAAC,aAAa;EAChB,OAAO,KAAK,KACV,EAAE,WAAW,GACb,uEACF;EACA,OAAO;CACT;CAEA,MAAM,cAAc,OAAO,eAAe,OAAO,cAAc,GAAG,CAAC,KAAK;CAExE,IAAI;EACF,MAAM,SAAS,MAAM,GAAG,mBACtB;GAAE;GAAa;EAAY,GAC3B,OACF;EAEA,IAAI,WAAW,UAAU;GACvB,OAAO,MACL;IACE;IACA;IACA;IACA,SAAS,QAAQ;IACjB,aAAa,QAAQ;GACvB,GACA,kBACF;GACA,OAAO;EACT;EAEA,OAAO;CACT,SAAS,KAAK;EACZ,OAAO,KAAK,KAAK;GAAE;GAAK;EAAW,GAAG,4BAA4B;EAClE,OAAO;CACT;AACF"}
@@ -10,7 +10,7 @@ async function updateBazelLockfile(lockFileName, cwdFile, isLockFileMaintenance,
10
10
  const allowlist = GlobalConfig.get("allowedUnsafeExecutions");
11
11
  const command = "bazel mod deps --lockfile_mode=update";
12
12
  if (!allowlist.includes("bazelModDeps")) {
13
- logger.once.warn(`Bazel command, \`${command}\`, was requested to run, but \`bazelModDeps\` is not permitted in the allowedUnsafeExecutions`);
13
+ logger.once.warn({ command }, "Bazel command was requested to run, but `bazelModDeps` is not permitted in the allowedUnsafeExecutions");
14
14
  return null;
15
15
  }
16
16
  if (isLockFileMaintenance) await deleteLocalFile(lockFileName);
@@ -1 +1 @@
1
- {"version":3,"file":"lockfile.js","names":[],"sources":["../../../../lib/modules/manager/bazel-module/lockfile.ts"],"sourcesContent":["import { GlobalConfig } from '../../../config/global.ts';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport { deleteLocalFile, readLocalFile } from '../../../util/fs/index.ts';\nimport { getRepoStatus } from '../../../util/git/index.ts';\nimport type { UpdateArtifactsResult } from '../types.ts';\n\nexport async function updateBazelLockfile(\n lockFileName: string,\n cwdFile: string,\n isLockFileMaintenance: boolean | undefined,\n bazeliskConstraint: string | undefined,\n): Promise<UpdateArtifactsResult[] | null> {\n try {\n const allowlist = GlobalConfig.get('allowedUnsafeExecutions');\n\n const command = 'bazel mod deps --lockfile_mode=update';\n\n if (!allowlist.includes('bazelModDeps')) {\n logger.once.warn(\n `Bazel command, \\`${command}\\`, was requested to run, but \\`bazelModDeps\\` is not permitted in the allowedUnsafeExecutions`,\n );\n return null;\n }\n\n if (isLockFileMaintenance) {\n await deleteLocalFile(lockFileName);\n }\n\n const execOptions: ExecOptions = {\n cwdFile,\n docker: {},\n toolConstraints: [\n { toolName: 'bazelisk', constraint: bazeliskConstraint },\n ],\n };\n await exec(command, execOptions);\n\n const status = await getRepoStatus();\n if (\n !status.modified.includes(lockFileName) &&\n !status.not_added?.includes(lockFileName)\n ) {\n return null;\n }\n\n const newLockContent = await readLocalFile(lockFileName, 'utf8');\n return [\n {\n file: {\n type: 'addition',\n path: lockFileName,\n contents: newLockContent,\n },\n },\n ];\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.warn(\n { lockFile: lockFileName, err },\n 'Failed to update MODULE.bazel.lock',\n );\n return [\n {\n artifactError: {\n fileName: lockFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n"],"mappings":";;;;;;;AASA,eAAsB,oBACpB,cACA,SACA,uBACA,oBACyC;CACzC,IAAI;EACF,MAAM,YAAY,aAAa,IAAI,yBAAyB;EAE5D,MAAM,UAAU;EAEhB,IAAI,CAAC,UAAU,SAAS,cAAc,GAAG;GACvC,OAAO,KAAK,KACV,oBAAoB,QAAQ,+FAC9B;GACA,OAAO;EACT;EAEA,IAAI,uBACF,MAAM,gBAAgB,YAAY;EAUpC,MAAM,KAAK,SAAS;GANlB;GACA,QAAQ,CAAC;GACT,iBAAiB,CACf;IAAE,UAAU;IAAY,YAAY;GAAmB,CACzD;EAE4B,CAAC;EAE/B,MAAM,SAAS,MAAM,cAAc;EACnC,IACE,CAAC,OAAO,SAAS,SAAS,YAAY,KACtC,CAAC,OAAO,WAAW,SAAS,YAAY,GAExC,OAAO;EAIT,OAAO,CACL,EACE,MAAM;GACJ,MAAM;GACN,MAAM;GACN,UAAU,MANa,cAAc,cAAc,MAAM;EAO3D,EACF,CACF;CACF,SAAS,KAAK;EACZ,IAAI,IAAI,YAAA,mBACN,MAAM;EAER,OAAO,KACL;GAAE,UAAU;GAAc;EAAI,GAC9B,oCACF;EACA,OAAO,CACL,EACE,eAAe;GACb,UAAU;GACV,QAAQ,IAAI;EACd,EACF,CACF;CACF;AACF"}
1
+ {"version":3,"file":"lockfile.js","names":[],"sources":["../../../../lib/modules/manager/bazel-module/lockfile.ts"],"sourcesContent":["import { GlobalConfig } from '../../../config/global.ts';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport { deleteLocalFile, readLocalFile } from '../../../util/fs/index.ts';\nimport { getRepoStatus } from '../../../util/git/index.ts';\nimport type { UpdateArtifactsResult } from '../types.ts';\n\nexport async function updateBazelLockfile(\n lockFileName: string,\n cwdFile: string,\n isLockFileMaintenance: boolean | undefined,\n bazeliskConstraint: string | undefined,\n): Promise<UpdateArtifactsResult[] | null> {\n try {\n const allowlist = GlobalConfig.get('allowedUnsafeExecutions');\n\n const command = 'bazel mod deps --lockfile_mode=update';\n\n if (!allowlist.includes('bazelModDeps')) {\n logger.once.warn(\n { command },\n 'Bazel command was requested to run, but `bazelModDeps` is not permitted in the allowedUnsafeExecutions',\n );\n return null;\n }\n\n if (isLockFileMaintenance) {\n await deleteLocalFile(lockFileName);\n }\n\n const execOptions: ExecOptions = {\n cwdFile,\n docker: {},\n toolConstraints: [\n { toolName: 'bazelisk', constraint: bazeliskConstraint },\n ],\n };\n await exec(command, execOptions);\n\n const status = await getRepoStatus();\n if (\n !status.modified.includes(lockFileName) &&\n !status.not_added?.includes(lockFileName)\n ) {\n return null;\n }\n\n const newLockContent = await readLocalFile(lockFileName, 'utf8');\n return [\n {\n file: {\n type: 'addition',\n path: lockFileName,\n contents: newLockContent,\n },\n },\n ];\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.warn(\n { lockFile: lockFileName, err },\n 'Failed to update MODULE.bazel.lock',\n );\n return [\n {\n artifactError: {\n fileName: lockFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n"],"mappings":";;;;;;;AASA,eAAsB,oBACpB,cACA,SACA,uBACA,oBACyC;CACzC,IAAI;EACF,MAAM,YAAY,aAAa,IAAI,yBAAyB;EAE5D,MAAM,UAAU;EAEhB,IAAI,CAAC,UAAU,SAAS,cAAc,GAAG;GACvC,OAAO,KAAK,KACV,EAAE,QAAQ,GACV,wGACF;GACA,OAAO;EACT;EAEA,IAAI,uBACF,MAAM,gBAAgB,YAAY;EAUpC,MAAM,KAAK,SAAS;GANlB;GACA,QAAQ,CAAC;GACT,iBAAiB,CACf;IAAE,UAAU;IAAY,YAAY;GAAmB,CACzD;EAE4B,CAAC;EAE/B,MAAM,SAAS,MAAM,cAAc;EACnC,IACE,CAAC,OAAO,SAAS,SAAS,YAAY,KACtC,CAAC,OAAO,WAAW,SAAS,YAAY,GAExC,OAAO;EAIT,OAAO,CACL,EACE,MAAM;GACJ,MAAM;GACN,MAAM;GACN,UAAU,MANa,cAAc,cAAc,MAAM;EAO3D,EACF,CACF;CACF,SAAS,KAAK;EACZ,IAAI,IAAI,YAAA,mBACN,MAAM;EAER,OAAO,KACL;GAAE,UAAU;GAAc;EAAI,GAC9B,oCACF;EACA,OAAO,CACL,EACE,eAAe;GACb,UAAU;GACV,QAAQ,IAAI;EACd,EACF,CACF;CACF;AACF"}
@@ -30,7 +30,11 @@ async function updateArtifacts(updateArtifact) {
30
30
  } }];
31
31
  }
32
32
  for (const updateDep of updatedDeps) if (updateDep.depType === "tasks" || updateDep.depType === "tasks.command") {
33
- logger.warn(`depType: "${updateDep.depType}", depName: "${updateDep.depName}" can't be updated with a lock file: "${lockFileName}"`);
33
+ logger.warn({
34
+ depType: updateDep.depType,
35
+ depName: updateDep.depName,
36
+ lockFileName
37
+ }, "Dependency can't be updated with a lock file");
34
38
  return [{ artifactError: {
35
39
  fileName: lockFileName,
36
40
  stderr: `depType: "${updateDep.depType}", depName: "${updateDep.depName}" can't be updated with a lock file: "${lockFileName}"`
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","names":["hostRules\n .findAll"],"sources":["../../../../lib/modules/manager/deno/artifacts.ts"],"sourcesContent":["import { isEmptyArray } from '@sindresorhus/is';\nimport upath from 'upath';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n deleteLocalFile,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { processHostRules } from '../npm/post-update/rules.ts';\nimport {\n getNpmrcContent,\n resetNpmrcContent,\n updateNpmrcContent,\n} from '../npm/utils.ts';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types.ts';\nimport type { DenoManagerData } from './types.ts';\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact<DenoManagerData>,\n): Promise<UpdateArtifactsResult[] | null> {\n const { packageFileName, updatedDeps, newPackageFileContent, config } =\n updateArtifact;\n logger.debug(`deno.updateArtifacts(${packageFileName})`);\n const isLockFileMaintenance = config.updateType === 'lockFileMaintenance';\n\n if (isEmptyArray(updatedDeps) && !isLockFileMaintenance) {\n logger.debug('No updated deno deps - returning null');\n return null;\n }\n\n // falling back for lockFileMaintenance\n const lockFileName = updatedDeps[0]?.lockFiles?.[0] ?? config.lockFiles?.[0];\n\n if (!lockFileName) {\n logger.debug('No lock file found. Skipping artifact update.');\n return null;\n }\n\n const oldLockFileContent = await readLocalFile(lockFileName);\n if (!oldLockFileContent) {\n logger.debug(`Failed to read ${lockFileName}. Skipping artifact update.`);\n return [\n {\n artifactError: {\n fileName: lockFileName,\n stderr: `Failed to read \"${lockFileName}\"`,\n },\n },\n ];\n }\n\n for (const updateDep of updatedDeps) {\n if (\n updateDep.depType === 'tasks' ||\n updateDep.depType === 'tasks.command'\n ) {\n logger.warn(\n `depType: \"${updateDep.depType}\", depName: \"${updateDep.depName}\" can't be updated with a lock file: \"${lockFileName}\"`,\n );\n return [\n {\n artifactError: {\n fileName: lockFileName,\n stderr: `depType: \"${updateDep.depType}\", depName: \"${updateDep.depName}\" can't be updated with a lock file: \"${lockFileName}\"`,\n },\n },\n ];\n }\n }\n\n const pkgFileDir = upath.dirname(packageFileName);\n const { additionalNpmrcContent } = processHostRules();\n const npmrcContent = await getNpmrcContent(pkgFileDir);\n await updateNpmrcContent(pkgFileDir, npmrcContent, additionalNpmrcContent);\n\n try {\n await writeLocalFile(packageFileName, newPackageFileContent);\n\n if (isLockFileMaintenance) {\n await deleteLocalFile(lockFileName);\n }\n\n // run from its referred deno.json/deno.jsonc location if import map is used\n const importMapReferrerDep = updatedDeps.find(\n (dep) => dep.managerData?.importMapReferrer,\n );\n const cwdFile =\n importMapReferrerDep?.managerData?.importMapReferrer ?? packageFileName;\n\n const execOptions: ExecOptions = {\n cwdFile,\n docker: {},\n toolConstraints: [\n {\n toolName: 'deno',\n constraint: config.constraints?.deno,\n },\n ],\n };\n\n // \"deno install\" don't execute lifecycle scripts of package.json by default\n // https://docs.deno.com/runtime/reference/cli/install/#native-node.js-addons\n // deno.json(c) could have the `lock.frozen` field\n // we should always override the `frozen` flag due to if it would be specified true\n let command = 'deno install --frozen=false';\n\n // defaults as per https://docs.deno.com/runtime/fundamentals/security/#importing-from-the-web\n const defaultImportHosts = [\n 'deno.land:443',\n 'esm.sh:443',\n 'jsr.io:443',\n 'cdn.jsdelivr.net:443',\n 'raw.githubusercontent.com:443',\n 'gist.githubusercontent.com:443',\n ];\n const additionalImportHosts = hostRules\n .findAll({ hostType: 'npm' })\n .filter((rule) => rule.resolvedHost)\n .map((rule) => rule.resolvedHost);\n\n if (additionalImportHosts.length > 0) {\n // combine default and additional import hosts, removing duplicates\n const importHosts = [\n ...new Set([...defaultImportHosts, ...additionalImportHosts]),\n ].join(',');\n\n command += ` --allow-import=${importHosts}`;\n }\n\n // TODO: appending `--lockfile-only` is better to reduce disk usage\n // https://docs.deno.com/runtime/reference/cli/install/#options-lockfile-only\n await exec(command, execOptions);\n await resetNpmrcContent(pkgFileDir, npmrcContent);\n\n const newLockFileContent = await readLocalFile(lockFileName);\n if (\n !newLockFileContent ||\n Buffer.compare(oldLockFileContent, newLockFileContent) === 0\n ) {\n return null;\n }\n\n return [\n {\n file: {\n type: 'addition',\n path: lockFileName,\n contents: newLockFileContent,\n },\n },\n ];\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.warn({ lockfile: lockFileName, err }, `Failed to update lock file`);\n return [\n {\n artifactError: {\n fileName: lockFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n"],"mappings":";;;;;;;;;;AAqBA,eAAsB,gBACpB,gBACyC;CACzC,MAAM,EAAE,iBAAiB,aAAa,uBAAuB,WAC3D;CACF,OAAO,MAAM,wBAAwB,gBAAgB,EAAE;CACvD,MAAM,wBAAwB,OAAO,eAAe;CAEpD,IAAI,aAAa,WAAW,KAAK,CAAC,uBAAuB;EACvD,OAAO,MAAM,uCAAuC;EACpD,OAAO;CACT;CAGA,MAAM,eAAe,YAAY,EAAE,EAAE,YAAY,MAAM,OAAO,YAAY;CAE1E,IAAI,CAAC,cAAc;EACjB,OAAO,MAAM,+CAA+C;EAC5D,OAAO;CACT;CAEA,MAAM,qBAAqB,MAAM,cAAc,YAAY;CAC3D,IAAI,CAAC,oBAAoB;EACvB,OAAO,MAAM,kBAAkB,aAAa,4BAA4B;EACxE,OAAO,CACL,EACE,eAAe;GACb,UAAU;GACV,QAAQ,mBAAmB,aAAa;EAC1C,EACF,CACF;CACF;CAEA,KAAK,MAAM,aAAa,aACtB,IACE,UAAU,YAAY,WACtB,UAAU,YAAY,iBACtB;EACA,OAAO,KACL,aAAa,UAAU,QAAQ,eAAe,UAAU,QAAQ,wCAAwC,aAAa,EACvH;EACA,OAAO,CACL,EACE,eAAe;GACb,UAAU;GACV,QAAQ,aAAa,UAAU,QAAQ,eAAe,UAAU,QAAQ,wCAAwC,aAAa;EAC/H,EACF,CACF;CACF;CAGF,MAAM,aAAa,MAAM,QAAQ,eAAe;CAChD,MAAM,EAAE,2BAA2B,iBAAiB;CACpD,MAAM,eAAe,MAAM,gBAAgB,UAAU;CACrD,MAAM,mBAAmB,YAAY,cAAc,sBAAsB;CAEzE,IAAI;EACF,MAAM,eAAe,iBAAiB,qBAAqB;EAE3D,IAAI,uBACF,MAAM,gBAAgB,YAAY;EAUpC,MAAM,cAA2B;GAC/B,SAP2B,YAAY,MACtC,QAAQ,IAAI,aAAa,iBAGP,CAAC,EAAE,aAAa,qBAAqB;GAIxD,QAAQ,CAAC;GACT,iBAAiB,CACf;IACE,UAAU;IACV,YAAY,OAAO,aAAa;GAClC,CACF;EACF;EAMA,IAAI,UAAU;EAGd,MAAM,qBAAqB;GACzB;GACA;GACA;GACA;GACA;GACA;EACF;EACA,MAAM,wBAAwBA,QACnB,EAAE,UAAU,MAAM,CAAC,CAAC,CAC5B,QAAQ,SAAS,KAAK,YAAY,CAAC,CACnC,KAAK,SAAS,KAAK,YAAY;EAElC,IAAI,sBAAsB,SAAS,GAAG;GAEpC,MAAM,cAAc,CAClB,mBAAG,IAAI,IAAI,CAAC,GAAG,oBAAoB,GAAG,qBAAqB,CAAC,CAC9D,CAAC,CAAC,KAAK,GAAG;GAEV,WAAW,mBAAmB;EAChC;EAIA,MAAM,KAAK,SAAS,WAAW;EAC/B,MAAM,kBAAkB,YAAY,YAAY;EAEhD,MAAM,qBAAqB,MAAM,cAAc,YAAY;EAC3D,IACE,CAAC,sBACD,OAAO,QAAQ,oBAAoB,kBAAkB,MAAM,GAE3D,OAAO;EAGT,OAAO,CACL,EACE,MAAM;GACJ,MAAM;GACN,MAAM;GACN,UAAU;EACZ,EACF,CACF;CACF,SAAS,KAAK;EACZ,IAAI,IAAI,YAAA,mBACN,MAAM;EAER,OAAO,KAAK;GAAE,UAAU;GAAc;EAAI,GAAG,4BAA4B;EACzE,OAAO,CACL,EACE,eAAe;GACb,UAAU;GACV,QAAQ,IAAI;EACd,EACF,CACF;CACF;AACF"}
1
+ {"version":3,"file":"artifacts.js","names":["hostRules\n .findAll"],"sources":["../../../../lib/modules/manager/deno/artifacts.ts"],"sourcesContent":["import { isEmptyArray } from '@sindresorhus/is';\nimport upath from 'upath';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n deleteLocalFile,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { processHostRules } from '../npm/post-update/rules.ts';\nimport {\n getNpmrcContent,\n resetNpmrcContent,\n updateNpmrcContent,\n} from '../npm/utils.ts';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types.ts';\nimport type { DenoManagerData } from './types.ts';\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact<DenoManagerData>,\n): Promise<UpdateArtifactsResult[] | null> {\n const { packageFileName, updatedDeps, newPackageFileContent, config } =\n updateArtifact;\n logger.debug(`deno.updateArtifacts(${packageFileName})`);\n const isLockFileMaintenance = config.updateType === 'lockFileMaintenance';\n\n if (isEmptyArray(updatedDeps) && !isLockFileMaintenance) {\n logger.debug('No updated deno deps - returning null');\n return null;\n }\n\n // falling back for lockFileMaintenance\n const lockFileName = updatedDeps[0]?.lockFiles?.[0] ?? config.lockFiles?.[0];\n\n if (!lockFileName) {\n logger.debug('No lock file found. Skipping artifact update.');\n return null;\n }\n\n const oldLockFileContent = await readLocalFile(lockFileName);\n if (!oldLockFileContent) {\n logger.debug(`Failed to read ${lockFileName}. Skipping artifact update.`);\n return [\n {\n artifactError: {\n fileName: lockFileName,\n stderr: `Failed to read \"${lockFileName}\"`,\n },\n },\n ];\n }\n\n for (const updateDep of updatedDeps) {\n if (\n updateDep.depType === 'tasks' ||\n updateDep.depType === 'tasks.command'\n ) {\n logger.warn(\n {\n depType: updateDep.depType,\n depName: updateDep.depName,\n lockFileName,\n },\n \"Dependency can't be updated with a lock file\",\n );\n return [\n {\n artifactError: {\n fileName: lockFileName,\n stderr: `depType: \"${updateDep.depType}\", depName: \"${updateDep.depName}\" can't be updated with a lock file: \"${lockFileName}\"`,\n },\n },\n ];\n }\n }\n\n const pkgFileDir = upath.dirname(packageFileName);\n const { additionalNpmrcContent } = processHostRules();\n const npmrcContent = await getNpmrcContent(pkgFileDir);\n await updateNpmrcContent(pkgFileDir, npmrcContent, additionalNpmrcContent);\n\n try {\n await writeLocalFile(packageFileName, newPackageFileContent);\n\n if (isLockFileMaintenance) {\n await deleteLocalFile(lockFileName);\n }\n\n // run from its referred deno.json/deno.jsonc location if import map is used\n const importMapReferrerDep = updatedDeps.find(\n (dep) => dep.managerData?.importMapReferrer,\n );\n const cwdFile =\n importMapReferrerDep?.managerData?.importMapReferrer ?? packageFileName;\n\n const execOptions: ExecOptions = {\n cwdFile,\n docker: {},\n toolConstraints: [\n {\n toolName: 'deno',\n constraint: config.constraints?.deno,\n },\n ],\n };\n\n // \"deno install\" don't execute lifecycle scripts of package.json by default\n // https://docs.deno.com/runtime/reference/cli/install/#native-node.js-addons\n // deno.json(c) could have the `lock.frozen` field\n // we should always override the `frozen` flag due to if it would be specified true\n let command = 'deno install --frozen=false';\n\n // defaults as per https://docs.deno.com/runtime/fundamentals/security/#importing-from-the-web\n const defaultImportHosts = [\n 'deno.land:443',\n 'esm.sh:443',\n 'jsr.io:443',\n 'cdn.jsdelivr.net:443',\n 'raw.githubusercontent.com:443',\n 'gist.githubusercontent.com:443',\n ];\n const additionalImportHosts = hostRules\n .findAll({ hostType: 'npm' })\n .filter((rule) => rule.resolvedHost)\n .map((rule) => rule.resolvedHost);\n\n if (additionalImportHosts.length > 0) {\n // combine default and additional import hosts, removing duplicates\n const importHosts = [\n ...new Set([...defaultImportHosts, ...additionalImportHosts]),\n ].join(',');\n\n command += ` --allow-import=${importHosts}`;\n }\n\n // TODO: appending `--lockfile-only` is better to reduce disk usage\n // https://docs.deno.com/runtime/reference/cli/install/#options-lockfile-only\n await exec(command, execOptions);\n await resetNpmrcContent(pkgFileDir, npmrcContent);\n\n const newLockFileContent = await readLocalFile(lockFileName);\n if (\n !newLockFileContent ||\n Buffer.compare(oldLockFileContent, newLockFileContent) === 0\n ) {\n return null;\n }\n\n return [\n {\n file: {\n type: 'addition',\n path: lockFileName,\n contents: newLockFileContent,\n },\n },\n ];\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.warn({ lockfile: lockFileName, err }, `Failed to update lock file`);\n return [\n {\n artifactError: {\n fileName: lockFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n"],"mappings":";;;;;;;;;;AAqBA,eAAsB,gBACpB,gBACyC;CACzC,MAAM,EAAE,iBAAiB,aAAa,uBAAuB,WAC3D;CACF,OAAO,MAAM,wBAAwB,gBAAgB,EAAE;CACvD,MAAM,wBAAwB,OAAO,eAAe;CAEpD,IAAI,aAAa,WAAW,KAAK,CAAC,uBAAuB;EACvD,OAAO,MAAM,uCAAuC;EACpD,OAAO;CACT;CAGA,MAAM,eAAe,YAAY,EAAE,EAAE,YAAY,MAAM,OAAO,YAAY;CAE1E,IAAI,CAAC,cAAc;EACjB,OAAO,MAAM,+CAA+C;EAC5D,OAAO;CACT;CAEA,MAAM,qBAAqB,MAAM,cAAc,YAAY;CAC3D,IAAI,CAAC,oBAAoB;EACvB,OAAO,MAAM,kBAAkB,aAAa,4BAA4B;EACxE,OAAO,CACL,EACE,eAAe;GACb,UAAU;GACV,QAAQ,mBAAmB,aAAa;EAC1C,EACF,CACF;CACF;CAEA,KAAK,MAAM,aAAa,aACtB,IACE,UAAU,YAAY,WACtB,UAAU,YAAY,iBACtB;EACA,OAAO,KACL;GACE,SAAS,UAAU;GACnB,SAAS,UAAU;GACnB;EACF,GACA,8CACF;EACA,OAAO,CACL,EACE,eAAe;GACb,UAAU;GACV,QAAQ,aAAa,UAAU,QAAQ,eAAe,UAAU,QAAQ,wCAAwC,aAAa;EAC/H,EACF,CACF;CACF;CAGF,MAAM,aAAa,MAAM,QAAQ,eAAe;CAChD,MAAM,EAAE,2BAA2B,iBAAiB;CACpD,MAAM,eAAe,MAAM,gBAAgB,UAAU;CACrD,MAAM,mBAAmB,YAAY,cAAc,sBAAsB;CAEzE,IAAI;EACF,MAAM,eAAe,iBAAiB,qBAAqB;EAE3D,IAAI,uBACF,MAAM,gBAAgB,YAAY;EAUpC,MAAM,cAA2B;GAC/B,SAP2B,YAAY,MACtC,QAAQ,IAAI,aAAa,iBAGP,CAAC,EAAE,aAAa,qBAAqB;GAIxD,QAAQ,CAAC;GACT,iBAAiB,CACf;IACE,UAAU;IACV,YAAY,OAAO,aAAa;GAClC,CACF;EACF;EAMA,IAAI,UAAU;EAGd,MAAM,qBAAqB;GACzB;GACA;GACA;GACA;GACA;GACA;EACF;EACA,MAAM,wBAAwBA,QACnB,EAAE,UAAU,MAAM,CAAC,CAAC,CAC5B,QAAQ,SAAS,KAAK,YAAY,CAAC,CACnC,KAAK,SAAS,KAAK,YAAY;EAElC,IAAI,sBAAsB,SAAS,GAAG;GAEpC,MAAM,cAAc,CAClB,mBAAG,IAAI,IAAI,CAAC,GAAG,oBAAoB,GAAG,qBAAqB,CAAC,CAC9D,CAAC,CAAC,KAAK,GAAG;GAEV,WAAW,mBAAmB;EAChC;EAIA,MAAM,KAAK,SAAS,WAAW;EAC/B,MAAM,kBAAkB,YAAY,YAAY;EAEhD,MAAM,qBAAqB,MAAM,cAAc,YAAY;EAC3D,IACE,CAAC,sBACD,OAAO,QAAQ,oBAAoB,kBAAkB,MAAM,GAE3D,OAAO;EAGT,OAAO,CACL,EACE,MAAM;GACJ,MAAM;GACN,MAAM;GACN,UAAU;EACZ,EACF,CACF;CACF,SAAS,KAAK;EACZ,IAAI,IAAI,YAAA,mBACN,MAAM;EAER,OAAO,KAAK;GAAE,UAAU;GAAc;EAAI,GAAG,4BAA4B;EACzE,OAAO,CACL,EACE,eAAe;GACb,UAAU;GACV,QAAQ,IAAI;EACd,EACF,CACF;CACF;AACF"}
@@ -23,7 +23,7 @@ async function getDenoLock(filePath) {
23
23
  return { lockedVersions: {} };
24
24
  }
25
25
  if (parsedLockfile.data.lockfileVersion < 5) {
26
- logger.warn({ filePath }, `Deno: unsupported lockfile version. Please update ${filePath} on your own.`);
26
+ logger.warn({ filePath }, "Deno: unsupported lockfile version. Please update the lock file on your own.");
27
27
  return { lockedVersions: {} };
28
28
  }
29
29
  return parsedLockfile.data;
@@ -1 +1 @@
1
- {"version":3,"file":"post.js","names":["semver"],"sources":["../../../../lib/modules/manager/deno/post.ts"],"sourcesContent":["import {\n isEmptyObject,\n isNonEmptyArray,\n isNonEmptyObject,\n} from '@sindresorhus/is';\nimport upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { minimatch } from '../../../util/minimatch.ts';\nimport { api as semver } from '../../versioning/deno/index.ts';\nimport type { PackageDependency, PackageFile } from '../types.ts';\nimport {\n detectNodeCompatWorkspaces,\n extractDenoCompatiblePackageJson,\n} from './compat.ts';\nimport { DenoLock } from './schema.ts';\nimport type { DenoManagerData, LockFile, WorkspaceContext } from './types.ts';\nimport { denoLandRegex, depValueRegex } from './utils.ts';\n\nexport async function getDenoLock(filePath: string): Promise<LockFile> {\n const lockfileContent = await readLocalFile(filePath, 'utf8');\n if (!lockfileContent) {\n logger.debug({ filePath }, 'Deno: unable to read lockfile');\n return { lockedVersions: {} };\n }\n const parsedLockfile = DenoLock.safeParse(lockfileContent);\n if (!parsedLockfile.success) {\n logger.debug(\n { filePath, err: parsedLockfile.error },\n 'Deno: unable to parse lockfile',\n );\n return { lockedVersions: {} };\n }\n if (parsedLockfile.data.lockfileVersion < 5) {\n logger.warn(\n { filePath },\n `Deno: unsupported lockfile version. Please update ${filePath} on your own.`,\n );\n return { lockedVersions: {} };\n }\n\n return parsedLockfile.data;\n}\n\nexport function getLockedVersion(\n deps: PackageDependency<DenoManagerData>,\n lockFileContent: LockFile,\n): string | undefined | null {\n if (isEmptyObject(lockFileContent)) {\n return null;\n }\n const { datasource, currentRawValue, currentValue, depName } = deps;\n\n if (datasource === 'deno') {\n // \"remote\": {\n // \"https://deno.land/std@0.223.0/fs/mod.ts\": \"c25e6802cbf27f3050f60b26b00c2d8dba1cb7fcdafe34c66006a7473b7b34d4\",\n // },\n if (\n lockFileContent.remoteVersions &&\n lockFileContent.remoteVersions.size > 0 &&\n currentRawValue &&\n lockFileContent.remoteVersions.has(currentRawValue)\n ) {\n const match = denoLandRegex.exec(currentRawValue);\n return match?.groups?.currentValue;\n }\n\n // \"redirects\": {\n // \"https://deno.land/std\": \"https://deno.land/std@0.224.0\"\n // },\n const key =\n currentValue && depName ? `${depName}@${currentValue}` : depName;\n if (\n lockFileContent.redirectVersions &&\n isNonEmptyObject(lockFileContent.redirectVersions) &&\n key &&\n lockFileContent.redirectVersions[key]\n ) {\n const match = denoLandRegex.exec(\n // SAFETY: checked above\n lockFileContent.redirectVersions[key],\n );\n return match?.groups?.currentValue;\n }\n }\n\n // jsr and npm datasource\n if (datasource === 'jsr' || datasource === 'npm') {\n if (\n !lockFileContent.lockedVersions ||\n isEmptyObject(lockFileContent.lockedVersions)\n ) {\n return null;\n }\n\n // find \"jsr:@scope/name@1.2.3\" from \"jsr:@scope/name@1.2.3\"\n if (currentRawValue && lockFileContent.lockedVersions[currentRawValue]) {\n return lockFileContent.lockedVersions[currentRawValue];\n }\n\n // find \"jsr:@scope/name@*\" from \"jsr:@scope/name\"\n if (\n currentRawValue &&\n lockFileContent.lockedVersions[`${currentRawValue}@*`]\n ) {\n return lockFileContent.lockedVersions[`${currentRawValue}@*`];\n }\n\n for (const [key, value] of Object.entries(lockFileContent.lockedVersions)) {\n const match = depValueRegex.exec(key);\n // find \"jsr:@scope/name@1\" intersects \"jsr:@scope/name@^1.0.0\"\n if (\n typeof depName === 'string' &&\n match?.groups?.depName === depName &&\n match?.groups?.datasource === datasource &&\n currentValue &&\n match?.groups?.currentValue &&\n // SAFETY: npm semver define it\n semver.intersects!(match.groups.currentValue, currentValue)\n ) {\n return value;\n }\n }\n return null;\n }\n\n return null;\n}\n\nexport async function collectPackageJsonAsWorkspaceMember(\n packageFiles: PackageFile<DenoManagerData>[],\n): Promise<void> {\n // detect package.json as members of a deno workspace\n const workspaceRoots = packageFiles.filter(\n (pkg) =>\n isNonEmptyArray(pkg.managerData?.workspaces) &&\n upath.basename(pkg.packageFile).startsWith('deno.json'),\n );\n for (const workspaceRoot of workspaceRoots) {\n const result = await detectNodeCompatWorkspaces(workspaceRoot);\n const { packagePaths } = result;\n for (const packagePath of packagePaths) {\n const packageFile = await extractDenoCompatiblePackageJson(packagePath);\n if (packageFile) {\n const pkg = {\n ...packageFile,\n lockFiles: workspaceRoot.lockFiles,\n };\n packageFiles.push(pkg);\n }\n }\n }\n}\n\nexport function normalizeWorkspace(\n packageFiles: PackageFile<DenoManagerData>[],\n): void {\n // determine workspace root to collect lock files of workspace members\n const workspaceContexts: WorkspaceContext[] = [];\n\n // create reference map for packageFile object\n const packageMap: Record<string, PackageFile<DenoManagerData>> = {};\n for (const pkg of packageFiles) {\n packageMap[pkg.packageFile] = pkg;\n }\n\n for (const pkg of packageFiles) {\n const workspaces = pkg.managerData?.workspaces;\n if (isNonEmptyArray(workspaces)) {\n const rootDir = upath.dirname(pkg.packageFile);\n const matchers = workspaces.map((pattern) =>\n // allow ./sub/* to match sub\n minimatch(upath.normalize(pattern), {\n dot: true,\n partial: true,\n }),\n );\n workspaceContexts.push({\n lockFiles: pkg.lockFiles,\n rootDir,\n packageFile: pkg.packageFile,\n matchers,\n });\n }\n }\n\n // remove nested workspace\n // if the workspace is a subdirectory of another workspace, the nested is invalid\n const validContexts: typeof workspaceContexts = [];\n const invalidPackageFiles = new Set<string>();\n for (const [i, currentContext] of workspaceContexts.entries()) {\n let isNested = false;\n\n for (const [j, otherContext] of workspaceContexts.entries()) {\n if (i === j) {\n continue;\n }\n\n const found = otherContext.matchers.some((matcher) =>\n matcher.match(currentContext.rootDir),\n );\n if (found) {\n isNested = true;\n invalidPackageFiles.add(currentContext.packageFile);\n break;\n }\n }\n\n if (!isNested) {\n validContexts.push(currentContext);\n }\n }\n for (const packageFile of invalidPackageFiles) {\n const pkg = packageMap[packageFile];\n // remove invalid workspace\n delete pkg?.managerData?.workspaces;\n }\n\n // supply lock files to workspace members from their root\n const workspaceRootFiles = new Set<string>();\n for (const pkg of packageFiles) {\n const workspaces = pkg.managerData?.workspaces;\n if (isNonEmptyArray(workspaces)) {\n workspaceRootFiles.add(pkg.packageFile);\n }\n }\n\n for (const pkg of packageFiles) {\n if (workspaceRootFiles.has(pkg.packageFile)) {\n continue;\n }\n\n for (const context of workspaceContexts) {\n const { rootDir, matchers, lockFiles } = context;\n const pkgRelativePath = upath.relative(rootDir, pkg.packageFile);\n const pkgDir = upath.dirname(pkgRelativePath);\n const isMatch = matchers.some((matcher) => matcher.match(pkgDir));\n if (isMatch) {\n pkg.lockFiles = lockFiles;\n break;\n }\n }\n }\n}\n\nasync function applyLockedVersion(\n packageFiles: PackageFile<DenoManagerData>[],\n): Promise<void> {\n // apply locked versions from lock files\n // use cache to avoid reading the same lock file multiple times\n const lockFileCache: Record<string, LockFile> = {};\n for (const pkg of packageFiles) {\n if (!isNonEmptyArray(pkg.lockFiles)) {\n continue;\n }\n const lockFile = pkg.lockFiles[0];\n let lockFileContent = lockFileCache[lockFile];\n\n if (!lockFileContent) {\n lockFileContent = await getDenoLock(lockFile);\n lockFileCache[lockFile] = lockFileContent;\n }\n\n const withLockedVersionDeps = pkg.deps.map((dep) => {\n const lockedVersion = getLockedVersion(dep, lockFileContent);\n return lockedVersion\n ? {\n ...dep,\n lockedVersion,\n }\n : dep;\n });\n\n pkg.deps = withLockedVersionDeps;\n }\n}\n\nexport async function postExtract(\n packageFiles: PackageFile<DenoManagerData>[],\n): Promise<void> {\n await collectPackageJsonAsWorkspaceMember(packageFiles);\n normalizeWorkspace(packageFiles);\n await applyLockedVersion(packageFiles);\n}\n"],"mappings":";;;;;;;;;;AAmBA,eAAsB,YAAY,UAAqC;CACrE,MAAM,kBAAkB,MAAM,cAAc,UAAU,MAAM;CAC5D,IAAI,CAAC,iBAAiB;EACpB,OAAO,MAAM,EAAE,SAAS,GAAG,+BAA+B;EAC1D,OAAO,EAAE,gBAAgB,CAAC,EAAE;CAC9B;CACA,MAAM,iBAAiB,SAAS,UAAU,eAAe;CACzD,IAAI,CAAC,eAAe,SAAS;EAC3B,OAAO,MACL;GAAE;GAAU,KAAK,eAAe;EAAM,GACtC,gCACF;EACA,OAAO,EAAE,gBAAgB,CAAC,EAAE;CAC9B;CACA,IAAI,eAAe,KAAK,kBAAkB,GAAG;EAC3C,OAAO,KACL,EAAE,SAAS,GACX,qDAAqD,SAAS,cAChE;EACA,OAAO,EAAE,gBAAgB,CAAC,EAAE;CAC9B;CAEA,OAAO,eAAe;AACxB;AAEA,SAAgB,iBACd,MACA,iBAC2B;CAC3B,IAAI,cAAc,eAAe,GAC/B,OAAO;CAET,MAAM,EAAE,YAAY,iBAAiB,cAAc,YAAY;CAE/D,IAAI,eAAe,QAAQ;EAIzB,IACE,gBAAgB,kBAChB,gBAAgB,eAAe,OAAO,KACtC,mBACA,gBAAgB,eAAe,IAAI,eAAe,GAGlD,OADc,cAAc,KAAK,eACtB,CAAC,EAAE,QAAQ;EAMxB,MAAM,MACJ,gBAAgB,UAAU,GAAG,QAAQ,GAAG,iBAAiB;EAC3D,IACE,gBAAgB,oBAChB,iBAAiB,gBAAgB,gBAAgB,KACjD,OACA,gBAAgB,iBAAiB,MAMjC,OAJc,cAAc,KAE1B,gBAAgB,iBAAiB,IAExB,CAAC,EAAE,QAAQ;CAE1B;CAGA,IAAI,eAAe,SAAS,eAAe,OAAO;EAChD,IACE,CAAC,gBAAgB,kBACjB,cAAc,gBAAgB,cAAc,GAE5C,OAAO;EAIT,IAAI,mBAAmB,gBAAgB,eAAe,kBACpD,OAAO,gBAAgB,eAAe;EAIxC,IACE,mBACA,gBAAgB,eAAe,GAAG,gBAAgB,MAElD,OAAO,gBAAgB,eAAe,GAAG,gBAAgB;EAG3D,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,gBAAgB,cAAc,GAAG;GACzE,MAAM,QAAQ,cAAc,KAAK,GAAG;GAEpC,IACE,OAAO,YAAY,YACnB,OAAO,QAAQ,YAAY,WAC3B,OAAO,QAAQ,eAAe,cAC9B,gBACA,OAAO,QAAQ,gBAEfA,IAAO,WAAY,MAAM,OAAO,cAAc,YAAY,GAE1D,OAAO;EAEX;EACA,OAAO;CACT;CAEA,OAAO;AACT;AAEA,eAAsB,oCACpB,cACe;CAEf,MAAM,iBAAiB,aAAa,QACjC,QACC,gBAAgB,IAAI,aAAa,UAAU,KAC3C,MAAM,SAAS,IAAI,WAAW,CAAC,CAAC,WAAW,WAAW,CAC1D;CACA,KAAK,MAAM,iBAAiB,gBAAgB;EAE1C,MAAM,EAAE,iBAAiB,MADJ,2BAA2B,aAAa;EAE7D,KAAK,MAAM,eAAe,cAAc;GACtC,MAAM,cAAc,MAAM,iCAAiC,WAAW;GACtE,IAAI,aAAa;IACf,MAAM,MAAM;KACV,GAAG;KACH,WAAW,cAAc;IAC3B;IACA,aAAa,KAAK,GAAG;GACvB;EACF;CACF;AACF;AAEA,SAAgB,mBACd,cACM;CAEN,MAAM,oBAAwC,CAAC;CAG/C,MAAM,aAA2D,CAAC;CAClE,KAAK,MAAM,OAAO,cAChB,WAAW,IAAI,eAAe;CAGhC,KAAK,MAAM,OAAO,cAAc;EAC9B,MAAM,aAAa,IAAI,aAAa;EACpC,IAAI,gBAAgB,UAAU,GAAG;GAC/B,MAAM,UAAU,MAAM,QAAQ,IAAI,WAAW;GAC7C,MAAM,WAAW,WAAW,KAAK,YAE/B,UAAU,MAAM,UAAU,OAAO,GAAG;IAClC,KAAK;IACL,SAAS;GACX,CAAC,CACH;GACA,kBAAkB,KAAK;IACrB,WAAW,IAAI;IACf;IACA,aAAa,IAAI;IACjB;GACF,CAAC;EACH;CACF;CAIA,MAAM,gBAA0C,CAAC;CACjD,MAAM,sCAAsB,IAAI,IAAY;CAC5C,KAAK,MAAM,CAAC,GAAG,mBAAmB,kBAAkB,QAAQ,GAAG;EAC7D,IAAI,WAAW;EAEf,KAAK,MAAM,CAAC,GAAG,iBAAiB,kBAAkB,QAAQ,GAAG;GAC3D,IAAI,MAAM,GACR;GAMF,IAHc,aAAa,SAAS,MAAM,YACxC,QAAQ,MAAM,eAAe,OAAO,CAE9B,GAAG;IACT,WAAW;IACX,oBAAoB,IAAI,eAAe,WAAW;IAClD;GACF;EACF;EAEA,IAAI,CAAC,UACH,cAAc,KAAK,cAAc;CAErC;CACA,KAAK,MAAM,eAAe,qBAAqB;EAC7C,MAAM,MAAM,WAAW;EAEvB,OAAO,KAAK,aAAa;CAC3B;CAGA,MAAM,qCAAqB,IAAI,IAAY;CAC3C,KAAK,MAAM,OAAO,cAAc;EAC9B,MAAM,aAAa,IAAI,aAAa;EACpC,IAAI,gBAAgB,UAAU,GAC5B,mBAAmB,IAAI,IAAI,WAAW;CAE1C;CAEA,KAAK,MAAM,OAAO,cAAc;EAC9B,IAAI,mBAAmB,IAAI,IAAI,WAAW,GACxC;EAGF,KAAK,MAAM,WAAW,mBAAmB;GACvC,MAAM,EAAE,SAAS,UAAU,cAAc;GACzC,MAAM,kBAAkB,MAAM,SAAS,SAAS,IAAI,WAAW;GAC/D,MAAM,SAAS,MAAM,QAAQ,eAAe;GAE5C,IADgB,SAAS,MAAM,YAAY,QAAQ,MAAM,MAAM,CACrD,GAAG;IACX,IAAI,YAAY;IAChB;GACF;EACF;CACF;AACF;AAEA,eAAe,mBACb,cACe;CAGf,MAAM,gBAA0C,CAAC;CACjD,KAAK,MAAM,OAAO,cAAc;EAC9B,IAAI,CAAC,gBAAgB,IAAI,SAAS,GAChC;EAEF,MAAM,WAAW,IAAI,UAAU;EAC/B,IAAI,kBAAkB,cAAc;EAEpC,IAAI,CAAC,iBAAiB;GACpB,kBAAkB,MAAM,YAAY,QAAQ;GAC5C,cAAc,YAAY;EAC5B;EAYA,IAAI,OAV0B,IAAI,KAAK,KAAK,QAAQ;GAClD,MAAM,gBAAgB,iBAAiB,KAAK,eAAe;GAC3D,OAAO,gBACH;IACE,GAAG;IACH;GACF,IACA;EACN,CAE+B;CACjC;AACF;AAEA,eAAsB,YACpB,cACe;CACf,MAAM,oCAAoC,YAAY;CACtD,mBAAmB,YAAY;CAC/B,MAAM,mBAAmB,YAAY;AACvC"}
1
+ {"version":3,"file":"post.js","names":["semver"],"sources":["../../../../lib/modules/manager/deno/post.ts"],"sourcesContent":["import {\n isEmptyObject,\n isNonEmptyArray,\n isNonEmptyObject,\n} from '@sindresorhus/is';\nimport upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { minimatch } from '../../../util/minimatch.ts';\nimport { api as semver } from '../../versioning/deno/index.ts';\nimport type { PackageDependency, PackageFile } from '../types.ts';\nimport {\n detectNodeCompatWorkspaces,\n extractDenoCompatiblePackageJson,\n} from './compat.ts';\nimport { DenoLock } from './schema.ts';\nimport type { DenoManagerData, LockFile, WorkspaceContext } from './types.ts';\nimport { denoLandRegex, depValueRegex } from './utils.ts';\n\nexport async function getDenoLock(filePath: string): Promise<LockFile> {\n const lockfileContent = await readLocalFile(filePath, 'utf8');\n if (!lockfileContent) {\n logger.debug({ filePath }, 'Deno: unable to read lockfile');\n return { lockedVersions: {} };\n }\n const parsedLockfile = DenoLock.safeParse(lockfileContent);\n if (!parsedLockfile.success) {\n logger.debug(\n { filePath, err: parsedLockfile.error },\n 'Deno: unable to parse lockfile',\n );\n return { lockedVersions: {} };\n }\n if (parsedLockfile.data.lockfileVersion < 5) {\n logger.warn(\n { filePath },\n 'Deno: unsupported lockfile version. Please update the lock file on your own.',\n );\n return { lockedVersions: {} };\n }\n\n return parsedLockfile.data;\n}\n\nexport function getLockedVersion(\n deps: PackageDependency<DenoManagerData>,\n lockFileContent: LockFile,\n): string | undefined | null {\n if (isEmptyObject(lockFileContent)) {\n return null;\n }\n const { datasource, currentRawValue, currentValue, depName } = deps;\n\n if (datasource === 'deno') {\n // \"remote\": {\n // \"https://deno.land/std@0.223.0/fs/mod.ts\": \"c25e6802cbf27f3050f60b26b00c2d8dba1cb7fcdafe34c66006a7473b7b34d4\",\n // },\n if (\n lockFileContent.remoteVersions &&\n lockFileContent.remoteVersions.size > 0 &&\n currentRawValue &&\n lockFileContent.remoteVersions.has(currentRawValue)\n ) {\n const match = denoLandRegex.exec(currentRawValue);\n return match?.groups?.currentValue;\n }\n\n // \"redirects\": {\n // \"https://deno.land/std\": \"https://deno.land/std@0.224.0\"\n // },\n const key =\n currentValue && depName ? `${depName}@${currentValue}` : depName;\n if (\n lockFileContent.redirectVersions &&\n isNonEmptyObject(lockFileContent.redirectVersions) &&\n key &&\n lockFileContent.redirectVersions[key]\n ) {\n const match = denoLandRegex.exec(\n // SAFETY: checked above\n lockFileContent.redirectVersions[key],\n );\n return match?.groups?.currentValue;\n }\n }\n\n // jsr and npm datasource\n if (datasource === 'jsr' || datasource === 'npm') {\n if (\n !lockFileContent.lockedVersions ||\n isEmptyObject(lockFileContent.lockedVersions)\n ) {\n return null;\n }\n\n // find \"jsr:@scope/name@1.2.3\" from \"jsr:@scope/name@1.2.3\"\n if (currentRawValue && lockFileContent.lockedVersions[currentRawValue]) {\n return lockFileContent.lockedVersions[currentRawValue];\n }\n\n // find \"jsr:@scope/name@*\" from \"jsr:@scope/name\"\n if (\n currentRawValue &&\n lockFileContent.lockedVersions[`${currentRawValue}@*`]\n ) {\n return lockFileContent.lockedVersions[`${currentRawValue}@*`];\n }\n\n for (const [key, value] of Object.entries(lockFileContent.lockedVersions)) {\n const match = depValueRegex.exec(key);\n // find \"jsr:@scope/name@1\" intersects \"jsr:@scope/name@^1.0.0\"\n if (\n typeof depName === 'string' &&\n match?.groups?.depName === depName &&\n match?.groups?.datasource === datasource &&\n currentValue &&\n match?.groups?.currentValue &&\n // SAFETY: npm semver define it\n semver.intersects!(match.groups.currentValue, currentValue)\n ) {\n return value;\n }\n }\n return null;\n }\n\n return null;\n}\n\nexport async function collectPackageJsonAsWorkspaceMember(\n packageFiles: PackageFile<DenoManagerData>[],\n): Promise<void> {\n // detect package.json as members of a deno workspace\n const workspaceRoots = packageFiles.filter(\n (pkg) =>\n isNonEmptyArray(pkg.managerData?.workspaces) &&\n upath.basename(pkg.packageFile).startsWith('deno.json'),\n );\n for (const workspaceRoot of workspaceRoots) {\n const result = await detectNodeCompatWorkspaces(workspaceRoot);\n const { packagePaths } = result;\n for (const packagePath of packagePaths) {\n const packageFile = await extractDenoCompatiblePackageJson(packagePath);\n if (packageFile) {\n const pkg = {\n ...packageFile,\n lockFiles: workspaceRoot.lockFiles,\n };\n packageFiles.push(pkg);\n }\n }\n }\n}\n\nexport function normalizeWorkspace(\n packageFiles: PackageFile<DenoManagerData>[],\n): void {\n // determine workspace root to collect lock files of workspace members\n const workspaceContexts: WorkspaceContext[] = [];\n\n // create reference map for packageFile object\n const packageMap: Record<string, PackageFile<DenoManagerData>> = {};\n for (const pkg of packageFiles) {\n packageMap[pkg.packageFile] = pkg;\n }\n\n for (const pkg of packageFiles) {\n const workspaces = pkg.managerData?.workspaces;\n if (isNonEmptyArray(workspaces)) {\n const rootDir = upath.dirname(pkg.packageFile);\n const matchers = workspaces.map((pattern) =>\n // allow ./sub/* to match sub\n minimatch(upath.normalize(pattern), {\n dot: true,\n partial: true,\n }),\n );\n workspaceContexts.push({\n lockFiles: pkg.lockFiles,\n rootDir,\n packageFile: pkg.packageFile,\n matchers,\n });\n }\n }\n\n // remove nested workspace\n // if the workspace is a subdirectory of another workspace, the nested is invalid\n const validContexts: typeof workspaceContexts = [];\n const invalidPackageFiles = new Set<string>();\n for (const [i, currentContext] of workspaceContexts.entries()) {\n let isNested = false;\n\n for (const [j, otherContext] of workspaceContexts.entries()) {\n if (i === j) {\n continue;\n }\n\n const found = otherContext.matchers.some((matcher) =>\n matcher.match(currentContext.rootDir),\n );\n if (found) {\n isNested = true;\n invalidPackageFiles.add(currentContext.packageFile);\n break;\n }\n }\n\n if (!isNested) {\n validContexts.push(currentContext);\n }\n }\n for (const packageFile of invalidPackageFiles) {\n const pkg = packageMap[packageFile];\n // remove invalid workspace\n delete pkg?.managerData?.workspaces;\n }\n\n // supply lock files to workspace members from their root\n const workspaceRootFiles = new Set<string>();\n for (const pkg of packageFiles) {\n const workspaces = pkg.managerData?.workspaces;\n if (isNonEmptyArray(workspaces)) {\n workspaceRootFiles.add(pkg.packageFile);\n }\n }\n\n for (const pkg of packageFiles) {\n if (workspaceRootFiles.has(pkg.packageFile)) {\n continue;\n }\n\n for (const context of workspaceContexts) {\n const { rootDir, matchers, lockFiles } = context;\n const pkgRelativePath = upath.relative(rootDir, pkg.packageFile);\n const pkgDir = upath.dirname(pkgRelativePath);\n const isMatch = matchers.some((matcher) => matcher.match(pkgDir));\n if (isMatch) {\n pkg.lockFiles = lockFiles;\n break;\n }\n }\n }\n}\n\nasync function applyLockedVersion(\n packageFiles: PackageFile<DenoManagerData>[],\n): Promise<void> {\n // apply locked versions from lock files\n // use cache to avoid reading the same lock file multiple times\n const lockFileCache: Record<string, LockFile> = {};\n for (const pkg of packageFiles) {\n if (!isNonEmptyArray(pkg.lockFiles)) {\n continue;\n }\n const lockFile = pkg.lockFiles[0];\n let lockFileContent = lockFileCache[lockFile];\n\n if (!lockFileContent) {\n lockFileContent = await getDenoLock(lockFile);\n lockFileCache[lockFile] = lockFileContent;\n }\n\n const withLockedVersionDeps = pkg.deps.map((dep) => {\n const lockedVersion = getLockedVersion(dep, lockFileContent);\n return lockedVersion\n ? {\n ...dep,\n lockedVersion,\n }\n : dep;\n });\n\n pkg.deps = withLockedVersionDeps;\n }\n}\n\nexport async function postExtract(\n packageFiles: PackageFile<DenoManagerData>[],\n): Promise<void> {\n await collectPackageJsonAsWorkspaceMember(packageFiles);\n normalizeWorkspace(packageFiles);\n await applyLockedVersion(packageFiles);\n}\n"],"mappings":";;;;;;;;;;AAmBA,eAAsB,YAAY,UAAqC;CACrE,MAAM,kBAAkB,MAAM,cAAc,UAAU,MAAM;CAC5D,IAAI,CAAC,iBAAiB;EACpB,OAAO,MAAM,EAAE,SAAS,GAAG,+BAA+B;EAC1D,OAAO,EAAE,gBAAgB,CAAC,EAAE;CAC9B;CACA,MAAM,iBAAiB,SAAS,UAAU,eAAe;CACzD,IAAI,CAAC,eAAe,SAAS;EAC3B,OAAO,MACL;GAAE;GAAU,KAAK,eAAe;EAAM,GACtC,gCACF;EACA,OAAO,EAAE,gBAAgB,CAAC,EAAE;CAC9B;CACA,IAAI,eAAe,KAAK,kBAAkB,GAAG;EAC3C,OAAO,KACL,EAAE,SAAS,GACX,8EACF;EACA,OAAO,EAAE,gBAAgB,CAAC,EAAE;CAC9B;CAEA,OAAO,eAAe;AACxB;AAEA,SAAgB,iBACd,MACA,iBAC2B;CAC3B,IAAI,cAAc,eAAe,GAC/B,OAAO;CAET,MAAM,EAAE,YAAY,iBAAiB,cAAc,YAAY;CAE/D,IAAI,eAAe,QAAQ;EAIzB,IACE,gBAAgB,kBAChB,gBAAgB,eAAe,OAAO,KACtC,mBACA,gBAAgB,eAAe,IAAI,eAAe,GAGlD,OADc,cAAc,KAAK,eACtB,CAAC,EAAE,QAAQ;EAMxB,MAAM,MACJ,gBAAgB,UAAU,GAAG,QAAQ,GAAG,iBAAiB;EAC3D,IACE,gBAAgB,oBAChB,iBAAiB,gBAAgB,gBAAgB,KACjD,OACA,gBAAgB,iBAAiB,MAMjC,OAJc,cAAc,KAE1B,gBAAgB,iBAAiB,IAExB,CAAC,EAAE,QAAQ;CAE1B;CAGA,IAAI,eAAe,SAAS,eAAe,OAAO;EAChD,IACE,CAAC,gBAAgB,kBACjB,cAAc,gBAAgB,cAAc,GAE5C,OAAO;EAIT,IAAI,mBAAmB,gBAAgB,eAAe,kBACpD,OAAO,gBAAgB,eAAe;EAIxC,IACE,mBACA,gBAAgB,eAAe,GAAG,gBAAgB,MAElD,OAAO,gBAAgB,eAAe,GAAG,gBAAgB;EAG3D,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,gBAAgB,cAAc,GAAG;GACzE,MAAM,QAAQ,cAAc,KAAK,GAAG;GAEpC,IACE,OAAO,YAAY,YACnB,OAAO,QAAQ,YAAY,WAC3B,OAAO,QAAQ,eAAe,cAC9B,gBACA,OAAO,QAAQ,gBAEfA,IAAO,WAAY,MAAM,OAAO,cAAc,YAAY,GAE1D,OAAO;EAEX;EACA,OAAO;CACT;CAEA,OAAO;AACT;AAEA,eAAsB,oCACpB,cACe;CAEf,MAAM,iBAAiB,aAAa,QACjC,QACC,gBAAgB,IAAI,aAAa,UAAU,KAC3C,MAAM,SAAS,IAAI,WAAW,CAAC,CAAC,WAAW,WAAW,CAC1D;CACA,KAAK,MAAM,iBAAiB,gBAAgB;EAE1C,MAAM,EAAE,iBAAiB,MADJ,2BAA2B,aAAa;EAE7D,KAAK,MAAM,eAAe,cAAc;GACtC,MAAM,cAAc,MAAM,iCAAiC,WAAW;GACtE,IAAI,aAAa;IACf,MAAM,MAAM;KACV,GAAG;KACH,WAAW,cAAc;IAC3B;IACA,aAAa,KAAK,GAAG;GACvB;EACF;CACF;AACF;AAEA,SAAgB,mBACd,cACM;CAEN,MAAM,oBAAwC,CAAC;CAG/C,MAAM,aAA2D,CAAC;CAClE,KAAK,MAAM,OAAO,cAChB,WAAW,IAAI,eAAe;CAGhC,KAAK,MAAM,OAAO,cAAc;EAC9B,MAAM,aAAa,IAAI,aAAa;EACpC,IAAI,gBAAgB,UAAU,GAAG;GAC/B,MAAM,UAAU,MAAM,QAAQ,IAAI,WAAW;GAC7C,MAAM,WAAW,WAAW,KAAK,YAE/B,UAAU,MAAM,UAAU,OAAO,GAAG;IAClC,KAAK;IACL,SAAS;GACX,CAAC,CACH;GACA,kBAAkB,KAAK;IACrB,WAAW,IAAI;IACf;IACA,aAAa,IAAI;IACjB;GACF,CAAC;EACH;CACF;CAIA,MAAM,gBAA0C,CAAC;CACjD,MAAM,sCAAsB,IAAI,IAAY;CAC5C,KAAK,MAAM,CAAC,GAAG,mBAAmB,kBAAkB,QAAQ,GAAG;EAC7D,IAAI,WAAW;EAEf,KAAK,MAAM,CAAC,GAAG,iBAAiB,kBAAkB,QAAQ,GAAG;GAC3D,IAAI,MAAM,GACR;GAMF,IAHc,aAAa,SAAS,MAAM,YACxC,QAAQ,MAAM,eAAe,OAAO,CAE9B,GAAG;IACT,WAAW;IACX,oBAAoB,IAAI,eAAe,WAAW;IAClD;GACF;EACF;EAEA,IAAI,CAAC,UACH,cAAc,KAAK,cAAc;CAErC;CACA,KAAK,MAAM,eAAe,qBAAqB;EAC7C,MAAM,MAAM,WAAW;EAEvB,OAAO,KAAK,aAAa;CAC3B;CAGA,MAAM,qCAAqB,IAAI,IAAY;CAC3C,KAAK,MAAM,OAAO,cAAc;EAC9B,MAAM,aAAa,IAAI,aAAa;EACpC,IAAI,gBAAgB,UAAU,GAC5B,mBAAmB,IAAI,IAAI,WAAW;CAE1C;CAEA,KAAK,MAAM,OAAO,cAAc;EAC9B,IAAI,mBAAmB,IAAI,IAAI,WAAW,GACxC;EAGF,KAAK,MAAM,WAAW,mBAAmB;GACvC,MAAM,EAAE,SAAS,UAAU,cAAc;GACzC,MAAM,kBAAkB,MAAM,SAAS,SAAS,IAAI,WAAW;GAC/D,MAAM,SAAS,MAAM,QAAQ,eAAe;GAE5C,IADgB,SAAS,MAAM,YAAY,QAAQ,MAAM,MAAM,CACrD,GAAG;IACX,IAAI,YAAY;IAChB;GACF;EACF;CACF;AACF;AAEA,eAAe,mBACb,cACe;CAGf,MAAM,gBAA0C,CAAC;CACjD,KAAK,MAAM,OAAO,cAAc;EAC9B,IAAI,CAAC,gBAAgB,IAAI,SAAS,GAChC;EAEF,MAAM,WAAW,IAAI,UAAU;EAC/B,IAAI,kBAAkB,cAAc;EAEpC,IAAI,CAAC,iBAAiB;GACpB,kBAAkB,MAAM,YAAY,QAAQ;GAC5C,cAAc,YAAY;EAC5B;EAYA,IAAI,OAV0B,IAAI,KAAK,KAAK,QAAQ;GAClD,MAAM,gBAAgB,iBAAiB,KAAK,eAAe;GAC3D,OAAO,gBACH;IACE,GAAG;IACH;GACF,IACA;EACN,CAE+B;CACjC;AACF;AAEA,eAAsB,YACpB,cACe;CACf,MAAM,oCAAoC,YAAY;CACtD,mBAAmB,YAAY;CAC/B,MAAM,mBAAmB,YAAY;AACvC"}
@@ -9,7 +9,7 @@ hashMap.set("azure-pipelines", "4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1c
9
9
  hashMap.set("batect", "fad98996bea8626525ab925f83a6ae0ce9262c53770e7aa7cb448a1e0f1ddf21");
10
10
  hashMap.set("batect-wrapper", "d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939");
11
11
  hashMap.set("bazel", "c6e0ad88ea468664c3a33263baf7452d83d2d37ff09ba920e18f64ee81fd0acb");
12
- hashMap.set("bazel-module", "8d5314f630038df8a974a285ab5066a0b4d69bc4dcd0a4fa2e9e6c6747073229");
12
+ hashMap.set("bazel-module", "b1324dc15e77012a667d33c48c14dec90aa25832593c6c47c219d57931bd1def");
13
13
  hashMap.set("bazelisk", "49e6bd1fc8f03facd06e517dc64596833b90ee0a079a45cff78f0eeb3c3566f8");
14
14
  hashMap.set("bicep", "7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db");
15
15
  hashMap.set("bitbucket-pipelines", "59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd");
@@ -48,7 +48,7 @@ hashMap.set("gitlabci-include", "ef696c478c2ac1723b3aca070ba9779be0e702fff084405
48
48
  hashMap.set("glasskube", "253d6db30bdec75ed5ab5d26f31d69bc07813ba10089a28da12c6a29eff4ec70");
49
49
  hashMap.set("gleam", "e7ee3392d1f900fc1299308c8e930db9288790c6d0b6c35f1a62e55683090d34");
50
50
  hashMap.set("gomod", "9ab033fb37fbf3b212232019ba2d36e247acc9831f7c17818a40cb155606abfe");
51
- hashMap.set("gradle", "1108234b4fcfebf95c453111f652ab75f5c6cc6c4472efb60b7bc29cbe683612");
51
+ hashMap.set("gradle", "65487851c4592d9f6b7889137576c4e2dd6a98b8bee6db9c999d67bfc13d5247");
52
52
  hashMap.set("gradle-wrapper", "f85031e7feb4e811aa5f29c589a30f8076a078e5bbf366fb65fb28b5a47d2c44");
53
53
  hashMap.set("haskell-cabal", "f232d0e883235f74ed71fd9de4a7468e5fcbda9a1af5beb56c24657f7bf2e891");
54
54
  hashMap.set("helm-requirements", "4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b");