renovate 43.24.3 → 43.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/migrations/base/abstract-migration.js.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/modules/versioning/generic.js.map +1 -1
- package/dist/util/github/graphql/cache-strategies/abstract-cache-strategy.js.map +1 -1
- package/dist/util/result.js.map +1 -1
- package/dist/util/yaml.js.map +1 -1
- package/dist/workers/repository/dependency-dashboard.js +19 -8
- package/dist/workers/repository/dependency-dashboard.js.map +1 -1
- package/dist/workers/repository/update/pr/index.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-migration.js","names":[],"sources":["../../../../lib/config/migrations/base/abstract-migration.ts"],"sourcesContent":["import { isNullOrUndefined, isString } from '@sindresorhus/is';\nimport type { AllConfig, RenovateConfig } from '../../types.ts';\nimport type { MigratableConfig, Migration } from '../types.ts';\n\nexport abstract class AbstractMigration
|
|
1
|
+
{"version":3,"file":"abstract-migration.js","names":[],"sources":["../../../../lib/config/migrations/base/abstract-migration.ts"],"sourcesContent":["import { isNullOrUndefined, isString } from '@sindresorhus/is';\nimport type { AllConfig, RenovateConfig } from '../../types.ts';\nimport type { MigratableConfig, Migration } from '../types.ts';\n\nexport abstract class AbstractMigration<\n T extends RenovateConfig = AllConfig,\n> implements Migration {\n readonly deprecated: boolean = false;\n abstract readonly propertyName: string | RegExp;\n private readonly originalConfig: MigratableConfig<T>;\n private readonly migratedConfig: MigratableConfig<T>;\n\n constructor(\n originalConfig: MigratableConfig<T>,\n migratedConfig: MigratableConfig<T>,\n ) {\n this.originalConfig = originalConfig;\n this.migratedConfig = migratedConfig;\n }\n\n abstract run(value: unknown, key: string): void;\n\n protected get<Key extends keyof MigratableConfig<T>>(\n key: Key,\n ): MigratableConfig<T>[Key] {\n return this.migratedConfig[key] ?? this.originalConfig[key];\n }\n\n protected has<Key extends keyof T | string>(key: Key): boolean {\n return key in this.originalConfig;\n }\n\n protected setSafely<Key extends keyof MigratableConfig<T>>(\n key: Key,\n value: MigratableConfig<T>[Key],\n ): void {\n if (\n isNullOrUndefined(this.originalConfig[key]) &&\n isNullOrUndefined(this.migratedConfig[key])\n ) {\n this.migratedConfig[key] = value;\n }\n }\n\n protected setHard<Key extends keyof MigratableConfig<T>>(\n key: Key,\n value: MigratableConfig<T>[Key],\n ): void {\n this.migratedConfig[key] = value;\n }\n\n protected rewrite(value: unknown): void {\n if (!isString(this.propertyName)) {\n throw new Error();\n }\n\n // TODO: fix types\n this.setHard(\n this.propertyName as keyof MigratableConfig<T>,\n value as never,\n );\n }\n\n protected delete(property = this.propertyName): void {\n if (!isString(property)) {\n throw new Error();\n }\n\n // TODO: fix types\n delete this.migratedConfig[property as keyof MigratableConfig<T>];\n }\n}\n"],"mappings":";;;AAIA,IAAsB,oBAAtB,MAEuB;CACrB,AAAS,aAAsB;CAE/B,AAAiB;CACjB,AAAiB;CAEjB,YACE,gBACA,gBACA;AACA,OAAK,iBAAiB;AACtB,OAAK,iBAAiB;;CAKxB,AAAU,IACR,KAC0B;AAC1B,SAAO,KAAK,eAAe,QAAQ,KAAK,eAAe;;CAGzD,AAAU,IAAkC,KAAmB;AAC7D,SAAO,OAAO,KAAK;;CAGrB,AAAU,UACR,KACA,OACM;AACN,MACE,kBAAkB,KAAK,eAAe,KAAK,IAC3C,kBAAkB,KAAK,eAAe,KAAK,CAE3C,MAAK,eAAe,OAAO;;CAI/B,AAAU,QACR,KACA,OACM;AACN,OAAK,eAAe,OAAO;;CAG7B,AAAU,QAAQ,OAAsB;AACtC,MAAI,CAAC,SAAS,KAAK,aAAa,CAC9B,OAAM,IAAI,OAAO;AAInB,OAAK,QACH,KAAK,cACL,MACD;;CAGH,AAAU,OAAO,WAAW,KAAK,cAAoB;AACnD,MAAI,CAAC,SAAS,SAAS,CACrB,OAAM,IAAI,OAAO;AAInB,SAAO,KAAK,eAAe"}
|
package/dist/config/types.js.map
CHANGED
|
@@ -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 { RepoSortMethod, SortMethod } 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 { 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 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 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 productLinks?: Record<string, string>;\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 onboardingAutoCloseAge?: number;\n onboardingBranch?: string;\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 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 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 onboardingCommitMessage?: string;\n onboardingNoDeps?: 'auto' | 'enabled' | 'disabled';\n onboardingRebaseCheckbox?: boolean;\n onboardingPrTitle?: string;\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}\n\nexport type UpdateConfig<\n T extends RenovateSharedConfig = RenovateSharedConfig,\n> = Partial<Record<UpdateType, T | null>>;\n\nexport type RenovateRepository =\n | string\n | (RenovateConfig & {\n repository: string;\n });\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 LegacyAdminConfig,\n RenovateSharedConfig,\n UpdateConfig<PackageRule>,\n AssigneesAndReviewersConfig,\n ConfigMigration,\n RenovateInternalConfig {\n s3Endpoint?: string;\n s3PathStyle?: 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 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?: Record<string, string>;\n skipInstalls?: boolean | null;\n\n constraintsFiltering?: ConstraintsFilter;\n\n checkedBranches?: string[];\n customizeDashboard?: Record<string, string>;\n\n statusCheckNames?: Record<StatusCheckKey, string | null>;\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,\n GlobalOnlyConfigLegacy,\n RepoGlobalConfig {\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 = 'goGenerate' | 'gradleWrapper';\n\n// TODO: Proper typings\nexport interface PackageRule\n extends RenovateSharedConfig,\n RenovateInternalConfig,\n 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 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\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}\n"],"mappings":";AAgUA,MAAa,4BAA4B;CACvC;CACA;CACA;CACA;CACD;AAsMD,MAAa,qBAAqB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD"}
|
|
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 { RepoSortMethod, SortMethod } 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 { 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 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 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 productLinks?: Record<string, string>;\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 onboardingAutoCloseAge?: number;\n onboardingBranch?: string;\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 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 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 onboardingCommitMessage?: string;\n onboardingNoDeps?: 'auto' | 'enabled' | 'disabled';\n onboardingRebaseCheckbox?: boolean;\n onboardingPrTitle?: string;\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}\n\nexport type UpdateConfig<\n T extends RenovateSharedConfig = RenovateSharedConfig,\n> = Partial<Record<UpdateType, T | null>>;\n\nexport type RenovateRepository =\n | string\n | (RenovateConfig & {\n repository: string;\n });\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 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 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?: Record<string, string>;\n skipInstalls?: boolean | null;\n\n constraintsFiltering?: ConstraintsFilter;\n\n checkedBranches?: string[];\n customizeDashboard?: Record<string, string>;\n\n statusCheckNames?: Record<StatusCheckKey, string | null>;\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 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 = 'goGenerate' | 'gradleWrapper';\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 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\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}\n"],"mappings":";AAgUA,MAAa,4BAA4B;CACvC;CACA;CACA;CACA;CACD;AAqMD,MAAa,qBAAqB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generic.js","names":[],"sources":["../../../lib/modules/versioning/generic.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport type { NewValueConfig, VersioningApi } from './types.ts';\n\nexport interface GenericVersion {\n release: number[];\n /** prereleases are treated in the standard semver manner, if present */\n prerelease?: string;\n suffix?: string;\n}\nexport type VersionParser = (version: string) => GenericVersion;\n\nexport type VersionComparator = (version: string, other: string) => number;\n\nexport abstract class GenericVersioningApi<\n T extends GenericVersion = GenericVersion,\n> implements VersioningApi
|
|
1
|
+
{"version":3,"file":"generic.js","names":[],"sources":["../../../lib/modules/versioning/generic.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport type { NewValueConfig, VersioningApi } from './types.ts';\n\nexport interface GenericVersion {\n release: number[];\n /** prereleases are treated in the standard semver manner, if present */\n prerelease?: string;\n suffix?: string;\n}\nexport type VersionParser = (version: string) => GenericVersion;\n\nexport type VersionComparator = (version: string, other: string) => number;\n\nexport abstract class GenericVersioningApi<\n T extends GenericVersion = GenericVersion,\n> implements VersioningApi {\n private _getSection(version: string, index: number): number | null {\n const parsed = this._parse(version);\n return parsed && parsed.release.length > index\n ? parsed.release[index]\n : null;\n }\n\n protected _compare(version: string, other: string): number {\n const left = this._parse(version);\n const right = this._parse(other);\n\n // istanbul ignore if\n if (!(left && right)) {\n return 1;\n }\n\n // support variable length compare\n const length = Math.max(left.release.length, right.release.length);\n for (let i = 0; i < length; i += 1) {\n // 2.1 and 2.1.0 are equivalent\n const part1 = left.release[i] ?? 0;\n const part2 = right.release[i] ?? 0;\n if (part1 !== part2) {\n return part1 - part2;\n }\n }\n\n if (\n isNonEmptyString(left.prerelease) &&\n isNonEmptyString(right.prerelease)\n ) {\n const pre = left.prerelease.localeCompare(right.prerelease, undefined, {\n numeric: true,\n });\n\n if (pre !== 0) {\n return pre;\n }\n } else if (isNonEmptyString(left.prerelease)) {\n return -1;\n } else if (isNonEmptyString(right.prerelease)) {\n return 1;\n }\n\n return this._compareOther(left, right);\n }\n\n /*\n * virtual\n */\n\n protected _compareOther(_left: T, _right: T): number {\n return 0;\n }\n\n protected abstract _parse(version: string): T | null;\n\n isValid(version: string): boolean {\n return this._parse(version) !== null;\n }\n\n isCompatible(version: string, _current: string): boolean {\n return this.isValid(version);\n }\n\n isStable(version: string): boolean {\n const parsed = this._parse(version);\n return !!(parsed && !parsed.prerelease);\n }\n\n isSingleVersion(version: string): boolean {\n return this.isValid(version);\n }\n\n isVersion(version: string): boolean {\n return this.isValid(version);\n }\n\n getMajor(version: string): number | null {\n return this._getSection(version, 0);\n }\n\n getMinor(version: string): number | null {\n return this._getSection(version, 1);\n }\n\n getPatch(version: string): number | null {\n return this._getSection(version, 2);\n }\n\n equals(version: string, other: string): boolean {\n return this._compare(version, other) === 0;\n }\n\n isGreaterThan(version: string, other: string): boolean {\n return this._compare(version, other) > 0;\n }\n\n isLessThanRange(version: string, range: string): boolean {\n return this._compare(version, range) < 0;\n }\n\n getSatisfyingVersion(versions: string[], range: string): string | null {\n const result = versions.find((v) => this.equals(v, range));\n return result ?? null;\n }\n\n minSatisfyingVersion(versions: string[], range: string): string | null {\n const result = versions.find((v) => this.equals(v, range));\n return result ?? null;\n }\n\n getNewValue({\n currentValue,\n currentVersion,\n newVersion,\n }: NewValueConfig): string | null {\n if (currentVersion === `v${currentValue}`) {\n return newVersion.replace(/^v/, '');\n }\n return newVersion ?? null;\n }\n\n sortVersions(version: string, other: string): number {\n return this._compare(version, other);\n }\n\n matches(version: string, range: string): boolean {\n return this.equals(version, range);\n }\n\n isSame(type: 'major' | 'minor' | 'patch', a: string, b: string): boolean {\n if (type === 'major') {\n return this.getMajor(a) === this.getMajor(b);\n }\n if (type === 'minor') {\n return this.getMinor(a) === this.getMinor(b);\n }\n return this.getPatch(a) === this.getPatch(b);\n }\n}\n"],"mappings":";;;AAaA,IAAsB,uBAAtB,MAE2B;CACzB,AAAQ,YAAY,SAAiB,OAA8B;EACjE,MAAM,SAAS,KAAK,OAAO,QAAQ;AACnC,SAAO,UAAU,OAAO,QAAQ,SAAS,QACrC,OAAO,QAAQ,SACf;;CAGN,AAAU,SAAS,SAAiB,OAAuB;EACzD,MAAM,OAAO,KAAK,OAAO,QAAQ;EACjC,MAAM,QAAQ,KAAK,OAAO,MAAM;;AAGhC,MAAI,EAAE,QAAQ,OACZ,QAAO;EAIT,MAAM,SAAS,KAAK,IAAI,KAAK,QAAQ,QAAQ,MAAM,QAAQ,OAAO;AAClE,OAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;GAElC,MAAM,QAAQ,KAAK,QAAQ,MAAM;GACjC,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAClC,OAAI,UAAU,MACZ,QAAO,QAAQ;;AAInB,MACE,iBAAiB,KAAK,WAAW,IACjC,iBAAiB,MAAM,WAAW,EAClC;GACA,MAAM,MAAM,KAAK,WAAW,cAAc,MAAM,YAAY,QAAW,EACrE,SAAS,MACV,CAAC;AAEF,OAAI,QAAQ,EACV,QAAO;aAEA,iBAAiB,KAAK,WAAW,CAC1C,QAAO;WACE,iBAAiB,MAAM,WAAW,CAC3C,QAAO;AAGT,SAAO,KAAK,cAAc,MAAM,MAAM;;CAOxC,AAAU,cAAc,OAAU,QAAmB;AACnD,SAAO;;CAKT,QAAQ,SAA0B;AAChC,SAAO,KAAK,OAAO,QAAQ,KAAK;;CAGlC,aAAa,SAAiB,UAA2B;AACvD,SAAO,KAAK,QAAQ,QAAQ;;CAG9B,SAAS,SAA0B;EACjC,MAAM,SAAS,KAAK,OAAO,QAAQ;AACnC,SAAO,CAAC,EAAE,UAAU,CAAC,OAAO;;CAG9B,gBAAgB,SAA0B;AACxC,SAAO,KAAK,QAAQ,QAAQ;;CAG9B,UAAU,SAA0B;AAClC,SAAO,KAAK,QAAQ,QAAQ;;CAG9B,SAAS,SAAgC;AACvC,SAAO,KAAK,YAAY,SAAS,EAAE;;CAGrC,SAAS,SAAgC;AACvC,SAAO,KAAK,YAAY,SAAS,EAAE;;CAGrC,SAAS,SAAgC;AACvC,SAAO,KAAK,YAAY,SAAS,EAAE;;CAGrC,OAAO,SAAiB,OAAwB;AAC9C,SAAO,KAAK,SAAS,SAAS,MAAM,KAAK;;CAG3C,cAAc,SAAiB,OAAwB;AACrD,SAAO,KAAK,SAAS,SAAS,MAAM,GAAG;;CAGzC,gBAAgB,SAAiB,OAAwB;AACvD,SAAO,KAAK,SAAS,SAAS,MAAM,GAAG;;CAGzC,qBAAqB,UAAoB,OAA8B;AAErE,SADe,SAAS,MAAM,MAAM,KAAK,OAAO,GAAG,MAAM,CAAC,IACzC;;CAGnB,qBAAqB,UAAoB,OAA8B;AAErE,SADe,SAAS,MAAM,MAAM,KAAK,OAAO,GAAG,MAAM,CAAC,IACzC;;CAGnB,YAAY,EACV,cACA,gBACA,cACgC;AAChC,MAAI,mBAAmB,IAAI,eACzB,QAAO,WAAW,QAAQ,MAAM,GAAG;AAErC,SAAO,cAAc;;CAGvB,aAAa,SAAiB,OAAuB;AACnD,SAAO,KAAK,SAAS,SAAS,MAAM;;CAGtC,QAAQ,SAAiB,OAAwB;AAC/C,SAAO,KAAK,OAAO,SAAS,MAAM;;CAGpC,OAAO,MAAmC,GAAW,GAAoB;AACvE,MAAI,SAAS,QACX,QAAO,KAAK,SAAS,EAAE,KAAK,KAAK,SAAS,EAAE;AAE9C,MAAI,SAAS,QACX,QAAO,KAAK,SAAS,EAAE,KAAK,KAAK,SAAS,EAAE;AAE9C,SAAO,KAAK,SAAS,EAAE,KAAK,KAAK,SAAS,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-cache-strategy.js","names":[],"sources":["../../../../../lib/util/github/graphql/cache-strategies/abstract-cache-strategy.ts"],"sourcesContent":["import { dequal } from 'dequal';\nimport { DateTime } from 'luxon';\nimport type { PackageCacheNamespace } from '../../../cache/package/types.ts';\nimport type {\n GithubDatasourceItem,\n GithubGraphqlCacheRecord,\n GithubGraphqlCacheStrategy,\n} from '../types.ts';\nimport { isDateExpired } from '../util.ts';\n\n/**\n * Cache strategy handles the caching Github GraphQL items\n * and reconciling them with newly obtained ones from paginated queries.\n */\nexport abstract class AbstractGithubGraphqlCacheStrategy<\n GithubItem extends GithubDatasourceItem,\n> implements GithubGraphqlCacheStrategy<GithubItem
|
|
1
|
+
{"version":3,"file":"abstract-cache-strategy.js","names":[],"sources":["../../../../../lib/util/github/graphql/cache-strategies/abstract-cache-strategy.ts"],"sourcesContent":["import { dequal } from 'dequal';\nimport { DateTime } from 'luxon';\nimport type { PackageCacheNamespace } from '../../../cache/package/types.ts';\nimport type {\n GithubDatasourceItem,\n GithubGraphqlCacheRecord,\n GithubGraphqlCacheStrategy,\n} from '../types.ts';\nimport { isDateExpired } from '../util.ts';\n\n/**\n * Cache strategy handles the caching Github GraphQL items\n * and reconciling them with newly obtained ones from paginated queries.\n */\nexport abstract class AbstractGithubGraphqlCacheStrategy<\n GithubItem extends GithubDatasourceItem,\n> implements GithubGraphqlCacheStrategy<GithubItem> {\n /**\n * Time period after which a cache record is considered expired.\n */\n protected static readonly cacheTTLDays = 30;\n\n /**\n * The time which is used during single cache access cycle.\n */\n protected readonly now = DateTime.now().toUTC();\n\n /**\n * Set of all versions which were reconciled\n * during the current cache access cycle.\n */\n private reconciledVersions: Set<string> | undefined;\n\n /**\n * These fields will be persisted.\n */\n private items: Record<string, GithubItem> | undefined;\n protected createdAt: DateTime = this.now;\n\n /**\n * This flag indicates whether there is any new or updated items\n */\n protected hasNovelty = false;\n\n /**\n * Loading and persisting data is delegated to the concrete strategy.\n */\n abstract load(): Promise<GithubGraphqlCacheRecord<GithubItem> | undefined>;\n abstract persist(\n cacheRecord: GithubGraphqlCacheRecord<GithubItem>,\n ): Promise<void>;\n\n protected readonly cacheNs: PackageCacheNamespace;\n protected readonly cacheKey: string;\n protected readonly skipStabilization: boolean;\n\n constructor(\n cacheNs: PackageCacheNamespace,\n cacheKey: string,\n skipStabilization = false,\n ) {\n this.cacheNs = cacheNs;\n this.cacheKey = cacheKey;\n this.skipStabilization = skipStabilization;\n }\n\n /**\n * Load data previously persisted by this strategy\n * for given `cacheNs` and `cacheKey`.\n */\n private async getItems(): Promise<Record<string, GithubItem>> {\n if (this.items) {\n return this.items;\n }\n\n let result: GithubGraphqlCacheRecord<GithubItem> = {\n items: {},\n createdAt: this.createdAt.toISO()!,\n };\n\n const storedData = await this.load();\n if (storedData) {\n const cacheTTLDuration = {\n hours: AbstractGithubGraphqlCacheStrategy.cacheTTLDays * 24,\n };\n if (!isDateExpired(this.now, storedData.createdAt, cacheTTLDuration)) {\n result = storedData;\n }\n }\n\n this.createdAt = DateTime.fromISO(result.createdAt).toUTC();\n this.items = result.items;\n return this.items;\n }\n\n /**\n * If package release exists longer than this cache can exist,\n * we assume it won't updated/removed on the Github side.\n */\n private isStabilized(item: GithubItem): boolean {\n const unstableDuration = {\n hours: AbstractGithubGraphqlCacheStrategy.cacheTTLDays * 24,\n };\n return isDateExpired(this.now, item.releaseTimestamp, unstableDuration);\n }\n\n /**\n * Process items received from GraphQL page\n * ordered by `releaseTimestamp` in descending order\n * (fresh versions go first).\n */\n async reconcile(items: GithubItem[]): Promise<boolean> {\n const cachedItems = await this.getItems();\n\n let isPaginationDone = false;\n for (const item of items) {\n const { version } = item;\n const oldItem = cachedItems[version];\n\n // If we reached previously stored item that is stabilized,\n // we assume the further pagination will not yield any new items.\n //\n // However, we don't break the loop here, allowing to reconcile\n // the entire page of items. This protects us from unusual cases\n // when release authors intentionally break the timeline. Therefore,\n // while it feels appealing to break early, please don't do that.\n //\n // Skip this optimization if skipStabilization is set (e.g. for branches\n // where we can't rely on date-based ordering).\n if (!this.skipStabilization && oldItem && this.isStabilized(oldItem)) {\n isPaginationDone = true;\n }\n\n // Check if item is new or updated\n if (!oldItem || !dequal(oldItem, item)) {\n this.hasNovelty = true;\n }\n\n cachedItems[version] = item;\n this.reconciledVersions ??= new Set();\n this.reconciledVersions.add(version);\n }\n\n this.items = cachedItems;\n return isPaginationDone;\n }\n\n /**\n * Handle removed items for packages that are not stabilized\n * and return the list of all items.\n */\n async finalizeAndReturn(): Promise<GithubItem[]> {\n const cachedItems = await this.getItems();\n let resultItems: Record<string, GithubItem>;\n\n let hasDeletedItems = false;\n if (this.reconciledVersions) {\n resultItems = {};\n for (const [version, item] of Object.entries(cachedItems)) {\n if (this.reconciledVersions.has(version) || this.isStabilized(item)) {\n resultItems[version] = item;\n } else {\n hasDeletedItems = true;\n }\n }\n } else {\n resultItems = cachedItems;\n }\n\n if (this.hasNovelty || hasDeletedItems) {\n await this.store(resultItems);\n }\n\n return Object.values(resultItems);\n }\n\n private async store(cachedItems: Record<string, GithubItem>): Promise<void> {\n const cacheRecord: GithubGraphqlCacheRecord<GithubItem> = {\n items: cachedItems,\n createdAt: this.createdAt.toISO()!,\n };\n await this.persist(cacheRecord);\n }\n}\n"],"mappings":";;;;;;;;;AAcA,IAAsB,qCAAtB,MAAsB,mCAE8B;;;;CAIlD,OAA0B,eAAe;;;;CAKzC,AAAmB,MAAM,SAAS,KAAK,CAAC,OAAO;;;;;CAM/C,AAAQ;;;;CAKR,AAAQ;CACR,AAAU,YAAsB,KAAK;;;;CAKrC,AAAU,aAAa;CAUvB,AAAmB;CACnB,AAAmB;CACnB,AAAmB;CAEnB,YACE,SACA,UACA,oBAAoB,OACpB;AACA,OAAK,UAAU;AACf,OAAK,WAAW;AAChB,OAAK,oBAAoB;;;;;;CAO3B,MAAc,WAAgD;AAC5D,MAAI,KAAK,MACP,QAAO,KAAK;EAGd,IAAI,SAA+C;GACjD,OAAO,EAAE;GACT,WAAW,KAAK,UAAU,OAAO;GAClC;EAED,MAAM,aAAa,MAAM,KAAK,MAAM;AACpC,MAAI,YAAY;GACd,MAAM,mBAAmB,EACvB,OAAO,mCAAmC,eAAe,IAC1D;AACD,OAAI,CAAC,cAAc,KAAK,KAAK,WAAW,WAAW,iBAAiB,CAClE,UAAS;;AAIb,OAAK,YAAY,SAAS,QAAQ,OAAO,UAAU,CAAC,OAAO;AAC3D,OAAK,QAAQ,OAAO;AACpB,SAAO,KAAK;;;;;;CAOd,AAAQ,aAAa,MAA2B;EAC9C,MAAM,mBAAmB,EACvB,OAAO,mCAAmC,eAAe,IAC1D;AACD,SAAO,cAAc,KAAK,KAAK,KAAK,kBAAkB,iBAAiB;;;;;;;CAQzE,MAAM,UAAU,OAAuC;EACrD,MAAM,cAAc,MAAM,KAAK,UAAU;EAEzC,IAAI,mBAAmB;AACvB,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,EAAE,YAAY;GACpB,MAAM,UAAU,YAAY;AAY5B,OAAI,CAAC,KAAK,qBAAqB,WAAW,KAAK,aAAa,QAAQ,CAClE,oBAAmB;AAIrB,OAAI,CAAC,WAAW,CAAC,OAAO,SAAS,KAAK,CACpC,MAAK,aAAa;AAGpB,eAAY,WAAW;AACvB,QAAK,uCAAuB,IAAI,KAAK;AACrC,QAAK,mBAAmB,IAAI,QAAQ;;AAGtC,OAAK,QAAQ;AACb,SAAO;;;;;;CAOT,MAAM,oBAA2C;EAC/C,MAAM,cAAc,MAAM,KAAK,UAAU;EACzC,IAAI;EAEJ,IAAI,kBAAkB;AACtB,MAAI,KAAK,oBAAoB;AAC3B,iBAAc,EAAE;AAChB,QAAK,MAAM,CAAC,SAAS,SAAS,OAAO,QAAQ,YAAY,CACvD,KAAI,KAAK,mBAAmB,IAAI,QAAQ,IAAI,KAAK,aAAa,KAAK,CACjE,aAAY,WAAW;OAEvB,mBAAkB;QAItB,eAAc;AAGhB,MAAI,KAAK,cAAc,gBACrB,OAAM,KAAK,MAAM,YAAY;AAG/B,SAAO,OAAO,OAAO,YAAY;;CAGnC,MAAc,MAAM,aAAwD;EAC1E,MAAM,cAAoD;GACxD,OAAO;GACP,WAAW,KAAK,UAAU,OAAO;GAClC;AACD,QAAM,KAAK,QAAQ,YAAY"}
|
package/dist/util/result.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result.js","names":[],"sources":["../../lib/util/result.ts"],"sourcesContent":["import type {\n SafeParseReturnType,\n input as ZodInput,\n output as ZodOutput,\n ZodType,\n} from 'zod/v3';\nimport { NEVER, ZodError, ZodIssueCode } from 'zod/v3';\nimport { logger } from '../logger/index.ts';\nimport type { Nullish } from '../types/index.ts';\n\ntype Val = NonNullable<unknown>;\n\ninterface Ok<T extends Val> {\n readonly ok: true;\n readonly val: T;\n readonly err?: never;\n}\n\ninterface Err<E extends Val> {\n readonly ok: false;\n readonly err: E;\n readonly val?: never;\n\n /**\n * Internal flag to indicate that the error was thrown during `.transform()`\n * and will be re-thrown on `.unwrap()`.\n */\n readonly _uncaught?: true;\n}\n\ntype Res<T extends Val, E extends Val> = Ok<T> | Err<E>;\n\nfunction isZodResult<Input, Output extends Val>(\n input: unknown,\n): input is SafeParseReturnType<Input, Output> {\n if (\n typeof input !== 'object' ||\n input === null ||\n Object.keys(input).length !== 2 ||\n !('success' in input) ||\n typeof input.success !== 'boolean'\n ) {\n return false;\n }\n\n if (input.success) {\n return (\n 'data' in input &&\n typeof input.data !== 'undefined' &&\n input.data !== null\n );\n } else {\n return 'error' in input && input.error instanceof ZodError;\n }\n}\n\nfunction fromZodResult<ZodInput, ZodOutput extends Val>(\n input: SafeParseReturnType<ZodInput, ZodOutput>,\n): Result<ZodOutput, ZodError<ZodInput>> {\n return input.success ? Result.ok(input.data) : Result.err(input.error);\n}\n\n/**\n * All non-nullable values that also are not Promises nor Zod results.\n * It's useful for restricting Zod results to not return `null` or `undefined`.\n */\ntype RawValue<T extends Val> = Exclude<\n T,\n SafeParseReturnType<unknown, T> | Promise<unknown>\n>;\n\nfunction fromNullable<\n T extends Val,\n ErrForNull extends Val,\n ErrForUndefined extends Val,\n>(\n input: Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n): Result<T, ErrForNull | ErrForUndefined> {\n if (input === null) {\n return Result.err(errForNull);\n }\n\n if (input === undefined) {\n return Result.err(errForUndefined);\n }\n\n return Result.ok(input);\n}\n\n/**\n * Class for representing a result that can fail.\n *\n * The mental model:\n * - `.wrap()` and `.wrapNullable()` are sinks\n * - `.transform()` are pipes which can be chained\n * - `.unwrap()` is the point of consumption\n */\nexport class Result<T extends Val, E extends Val = Error> {\n private readonly res: Res<T, E>;\n\n private constructor(res: Res<T, E>) {\n this.res = res;\n }\n\n static ok<T extends Val>(val: T): Result<T, never> {\n return new Result({ ok: true, val });\n }\n\n static err<E extends Val>(err: E): Result<never, E> {\n return new Result({ ok: false, err });\n }\n\n static _uncaught<E extends Val>(err: E): Result<never, E> {\n return new Result({ ok: false, err, _uncaught: true });\n }\n\n /**\n * Wrap a callback or promise in a Result in such a way that any thrown errors\n * are caught and wrapped with `Result.err()` (and hence never re-thrown).\n *\n * In case of a promise, the `AsyncResult` is returned.\n * Use `.unwrap()` to get the `Promise<Result<T, E>>` from `AsyncResult`.\n *\n * ```ts\n *\n * // SYNC\n * const parse = (json: string) => Result.wrap(() => JSON.parse(json));\n *\n * const { val, err } = parse('{\"foo\": \"bar\"}').unwrap();\n * expect(val).toEqual({ foo: 'bar' });\n * expect(err).toBeUndefined();\n *\n * const { val, err } = parse('!!!').unwrap();\n * expect(val).toBeUndefined();\n * expect(err).toBeInstanceOf(SyntaxError);\n *\n * // ASYNC\n * const request = (url: string) => Result.wrap(http.get(url));\n *\n * const { val, err } = await request('https://example.com').unwrap();\n * expect(val).toBeString();\n * expect(err).toBeUndefined();\n *\n * ```\n */\n static wrap<T extends Val, Input = unknown>(\n zodResult: SafeParseReturnType<Input, T>,\n ): Result<T, ZodError<Input>>;\n static wrap<T extends Val, E extends Val = Error>(\n callback: () => RawValue<T>,\n ): Result<T, E>;\n static wrap<T extends Val, E extends Val = Error>(\n callback: () => Promise<RawValue<T>>,\n ): AsyncResult<T, E>;\n static wrap<T extends Val, E extends Val = Error, EE extends Val = never>(\n promise: Promise<Result<T, EE>>,\n ): AsyncResult<T, E | EE>;\n static wrap<T extends Val, E extends Val = Error>(\n promise: Promise<RawValue<T>>,\n ): AsyncResult<T, E>;\n static wrap<\n T extends Val,\n E extends Val = Error,\n EE extends Val = never,\n Input = unknown,\n >(\n input:\n | SafeParseReturnType<Input, T>\n | (() => RawValue<T>)\n | (() => Promise<RawValue<T>>)\n | Promise<Result<T, EE>>\n | Promise<RawValue<T>>,\n ): Result<T, ZodError<Input>> | Result<T, E | EE> | AsyncResult<T, E | EE> {\n if (isZodResult<Input, T>(input)) {\n return fromZodResult(input);\n }\n\n if (input instanceof Promise) {\n return AsyncResult.wrap(input as never);\n }\n\n try {\n const result = input();\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result);\n }\n\n return Result.ok(result);\n } catch (error) {\n return Result.err(error);\n }\n }\n\n /**\n * Similar to `Result.wrap()`, but helps to undo the billion dollar mistake by\n * replacing `null` or `undefined` with an error of provided type.\n *\n * Errors thrown inside the callback or promise are caught and wrapped with `Result.err()`,\n * hence never re-thrown.\n *\n * Since functions and promises returning nullable can't be wrapped with `Result.wrap()`\n * because `val` is constrained by being `NonNullable`, `null` and `undefined`\n * must be converted to some sort of `err` value.\n *\n * This method does exactly this, i.g. it is the feature-rich shorthand for:\n *\n * ```ts\n * const { val, err } = Result.wrap(() => {\n * const result = callback();\n * return result === null || result === undefined\n * ? Result.err('oops')\n * : Result.ok(result);\n * }).unwrap();\n * ```\n *\n * In case of a promise, the `AsyncResult` is returned.\n *\n * ```ts\n *\n * // SYNC\n * const getHostname = (url: string) =>\n * Result.wrapNullable(\n * () => parseUrl(url)?.hostname,\n * 'invalid-url' as const\n * );\n * const { val, err } = getHostname('foobar').unwrap();\n * expect(val).toBeUndefined();\n * expect(err).toBe('invalid-url');\n *\n * // ASYNC\n * const { val, err } = await Result.wrapNullable(\n * readLocalFile('yarn.lock'),\n * 'file-read-error' as const\n * ).unwrap();\n *\n * ```\n */\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n callback: () => Nullish<T>,\n errForNullable: ErrForNullable,\n ): Result<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n callback: () => Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): Result<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n promise: Promise<Nullish<T>>,\n errForNullable: ErrForNullable,\n ): AsyncResult<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n promise: Promise<Nullish<T>>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): AsyncResult<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n value: Nullish<T>,\n errForNullable: ErrForNullable,\n ): Result<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n value: Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): Result<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n input: (() => Nullish<T>) | Promise<Nullish<T>> | Nullish<T>,\n arg2: ErrForNull,\n arg3?: ErrForUndefined,\n ):\n | Result<T, E | ErrForNull | ErrForUndefined>\n | AsyncResult<T, E | ErrForNull | ErrForUndefined> {\n const errForNull = arg2;\n const errForUndefined = arg3 ?? arg2;\n\n if (input instanceof Promise) {\n return AsyncResult.wrapNullable(input, errForNull, errForUndefined);\n }\n\n if (input instanceof Function) {\n try {\n const result = input();\n return fromNullable(result, errForNull, errForUndefined);\n } catch (error) {\n return Result.err(error);\n }\n }\n\n return fromNullable(input, errForNull, errForUndefined);\n }\n\n /**\n * Returns a discriminated union for type-safe consumption of the result.\n * When error was uncaught during transformation, it's being re-thrown here.\n *\n * ```ts\n *\n * const { val, err } = Result.ok('foo').unwrap();\n * expect(val).toBe('foo');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrap(): Res<T, E> {\n if (this.res.ok) {\n return this.res;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw this.res.err;\n }\n\n return this.res;\n }\n\n /**\n * Returns a success value or a fallback value.\n * When error was uncaught during transformation, it's being re-thrown here.\n *\n * ```ts\n *\n * const value = Result.err('bar').unwrapOr('foo');\n * expect(val).toBe('foo');\n *\n * ```\n */\n unwrapOr(fallback: T): T {\n if (this.res.ok) {\n return this.res.val;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw this.res.err;\n }\n\n return fallback;\n }\n\n /**\n * Returns the ok-value or throw the error.\n */\n unwrapOrThrow(): T {\n if (this.res.ok) {\n return this.res.val;\n }\n\n // TODO: fix, should only allow `Error` type\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw this.res.err;\n }\n\n /**\n * Returns the ok-value or `null`.\n * When error was uncaught during transformation, it's being re-thrown here.\n */\n unwrapOrNull(): T | null {\n if (this.res.ok) {\n return this.res.val;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw this.res.err;\n }\n\n return null;\n }\n\n /**\n * Transforms the ok-value, sync or async way.\n *\n * Transform functions SHOULD NOT throw.\n * Uncaught errors are logged and wrapped to `Result._uncaught()`,\n * which leads to re-throwing them in `unwrap()`.\n *\n * Zod `.safeParse()` results are converted automatically.\n *\n * ```ts\n *\n * // SYNC\n * const { val, err } = Result.ok('foo')\n * .transform((x) => x.length)\n * .unwrap();\n * expect(val).toBe(3);\n *\n * // ASYNC\n * const { val, err } = await Result.wrap(\n * http.getJson('https://api.example.com/data.json')\n * )\n * .transform(({ body }) => body)\n * .unwrap();\n *\n * ```\n */\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Result<U, E | EE>,\n ): Result<U, E | EE>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => AsyncResult<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val, Input = unknown>(\n fn: (value: T) => SafeParseReturnType<Input, NonNullable<U>>,\n ): Result<U, E | ZodError<Input>>;\n transform<U extends Val, Input = unknown>(\n fn: (value: T) => Promise<SafeParseReturnType<Input, NonNullable<U>>>,\n ): AsyncResult<U, E | ZodError<Input>>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Promise<Result<U, E | EE>>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => Promise<RawValue<U>>,\n ): AsyncResult<U, E>;\n transform<U extends Val>(fn: (value: T) => RawValue<U>): Result<U, E>;\n transform<U extends Val, EE extends Val, Input = unknown>(\n fn: (\n value: T,\n ) =>\n | Result<U, E | EE>\n | AsyncResult<U, E | EE>\n | SafeParseReturnType<Input, NonNullable<U>>\n | Promise<SafeParseReturnType<Input, NonNullable<U>>>\n | Promise<Result<U, E | EE>>\n | Promise<RawValue<U>>\n | RawValue<U>,\n ):\n | Result<U, E | EE | ZodError<Input>>\n | AsyncResult<U, E | EE | ZodError<Input>> {\n if (!this.res.ok) {\n return Result.err(this.res.err);\n }\n\n try {\n const result = fn(this.res.val);\n\n if (result instanceof Result) {\n return result;\n }\n\n if (result instanceof AsyncResult) {\n return result;\n }\n\n if (isZodResult<Input, U>(result)) {\n return fromZodResult(result);\n }\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn({ err }, 'Result: unhandled async transform error');\n return Result._uncaught(err);\n });\n }\n\n return Result.ok(result);\n } catch (err) {\n logger.warn({ err }, 'Result: unhandled transform error');\n return Result._uncaught(err);\n }\n }\n\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Result<U, EE>,\n ): Result<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => AsyncResult<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Result<U, EE> | AsyncResult<U, EE> | Promise<Result<U, EE>>,\n ): Result<T | U, EE> | AsyncResult<T | U, EE> {\n if (this.res.ok) {\n return this as never;\n }\n\n if (this.res._uncaught) {\n return this as never;\n }\n\n try {\n const result = fn(this.res.err);\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn(\n { err },\n 'Result: unexpected error in async catch handler',\n );\n return Result._uncaught(err);\n });\n }\n\n return result;\n } catch (err) {\n logger.warn({ err }, 'Result: unexpected error in catch handler');\n return Result._uncaught(err);\n }\n }\n\n /**\n * Given a `schema` and `input`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n static parse<Schema extends ZodType<any, any, any>>(\n input: unknown,\n schema: Schema,\n ): Result<NonNullable<ZodOutput<Schema>>, ZodError<ZodInput<Schema>>> {\n const parseResult = schema\n .transform((result, ctx): NonNullable<ZodOutput<Schema>> => {\n if (result === undefined) {\n ctx.addIssue({\n code: ZodIssueCode.custom,\n message: `Result can't accept nullish values, but input was parsed by Zod schema to undefined`,\n });\n return NEVER;\n }\n\n if (result === null) {\n ctx.addIssue({\n code: ZodIssueCode.custom,\n message: `Result can't accept nullish values, but input was parsed by Zod schema to null`,\n });\n return NEVER;\n }\n\n return result;\n })\n .safeParse(input);\n\n return fromZodResult(parseResult);\n }\n\n /**\n * Given a `schema`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n parse<Schema extends ZodType<any, any, any>>(\n schema: Schema,\n ): Result<NonNullable<ZodOutput<Schema>>, E | ZodError<ZodInput<Schema>>> {\n if (this.res.ok) {\n return Result.parse(this.res.val, schema);\n }\n\n const err = this.res.err;\n\n if (this.res._uncaught) {\n return Result._uncaught(err);\n }\n\n return Result.err(err);\n }\n\n /**\n * Call `fn` on the `val` if the result is ok.\n */\n onValue(fn: (value: T) => void): Result<T, E> {\n if (this.res.ok) {\n try {\n fn(this.res.val);\n } catch (err) {\n return Result._uncaught(err);\n }\n }\n\n return this;\n }\n\n /**\n * Call `fn` on the `err` if the result is err.\n */\n onError(fn: (err: E) => void): Result<T, E> {\n if (!this.res.ok) {\n try {\n fn(this.res.err);\n } catch (err) {\n return Result._uncaught(err);\n }\n }\n\n return this;\n }\n}\n\n/**\n * This class is being used when `Result` methods encounter async code.\n * It isn't meant to be used directly, but exported for usage in type annotations.\n *\n * All the methods resemble `Result` methods, but work asynchronously.\n */\nexport class AsyncResult<T extends Val, E extends Val>\n implements PromiseLike<Result<T, E>>\n{\n private asyncResult: Promise<Result<T, E>>;\n\n private constructor(asyncResult: Promise<Result<T, E>>) {\n this.asyncResult = asyncResult;\n }\n\n then<TResult1 = Result<T, E>>(\n onfulfilled?:\n | ((value: Result<T, E>) => TResult1 | PromiseLike<TResult1>)\n | null,\n ): PromiseLike<TResult1> {\n return this.asyncResult.then(onfulfilled);\n }\n\n static ok<T extends Val>(val: T): AsyncResult<T, never> {\n return new AsyncResult(Promise.resolve(Result.ok(val)));\n }\n\n static err<E extends Val>(err: NonNullable<E>): AsyncResult<never, E> {\n // eslint-disable-next-line promise/no-promise-in-callback\n return new AsyncResult(Promise.resolve(Result.err(err)));\n }\n\n static wrap<\n T extends Val,\n E extends Val = Error,\n EE extends Val = never,\n Input = unknown,\n >(\n promise:\n | Promise<SafeParseReturnType<Input, T>>\n | Promise<Result<T, EE>>\n | Promise<RawValue<T>>,\n onErr?: (err: NonNullable<E>) => Result<T, E>,\n ): AsyncResult<T, E | EE> {\n return new AsyncResult(\n promise\n .then((value) => {\n if (value instanceof Result) {\n return value;\n }\n\n if (isZodResult<Input, T>(value)) {\n return fromZodResult(value);\n }\n\n return Result.ok(value);\n })\n .catch((err) => {\n if (onErr) {\n return onErr(err);\n }\n return Result.err(err);\n }),\n );\n }\n\n static wrapNullable<\n T extends Val,\n E extends Val,\n ErrForNull extends Val,\n ErrForUndefined extends Val,\n >(\n promise: Promise<Nullish<T>>,\n errForNull: NonNullable<ErrForNull>,\n errForUndefined: NonNullable<ErrForUndefined>,\n ): AsyncResult<T, E | ErrForNull | ErrForUndefined> {\n return new AsyncResult(\n promise\n .then((value) => fromNullable(value, errForNull, errForUndefined))\n .catch((err) => Result.err(err)),\n );\n }\n\n /**\n * Returns a discriminated union for type-safe consumption of the result.\n *\n * ```ts\n *\n * const { val, err } = await Result.wrap(readFile('foo.txt')).unwrap();\n * expect(val).toBe('foo');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrap(): Promise<Res<T, E>> {\n return this.asyncResult.then<Res<T, E>>((res) => res.unwrap());\n }\n\n /**\n * Returns a success value or a fallback value.\n *\n * ```ts\n *\n * const val = await Result.wrap(readFile('foo.txt')).unwrapOr('bar');\n * expect(val).toBe('bar');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrapOr(fallback: T): Promise<T> {\n return this.asyncResult.then<T>((res) => res.unwrapOr(fallback));\n }\n\n /**\n * Returns the ok-value or throw the error.\n */\n async unwrapOrThrow(): Promise<T> {\n const result = await this.asyncResult;\n return result.unwrapOrThrow();\n }\n\n /**\n * Returns the ok-value or `null`.\n */\n unwrapOrNull(): Promise<T | null> {\n return this.asyncResult.then<T | null>((res) => res.unwrapOrNull());\n }\n\n /**\n * Transforms the ok-value, sync or async way.\n *\n * Transform functions SHOULD NOT throw.\n * Uncaught errors are logged and wrapped to `Result._uncaught()`,\n * which leads to re-throwing them in `unwrap()`.\n *\n * Zod `.safeParse()` results are converted automatically.\n *\n * ```ts\n *\n * const { val, err } = await Result.wrap(\n * http.getJson('https://api.example.com/data.json')\n * )\n * .transform(({ body }) => body)\n * .unwrap();\n *\n * ```\n */\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Result<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => AsyncResult<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val, Input = unknown>(\n fn: (value: T) => SafeParseReturnType<Input, NonNullable<U>>,\n ): AsyncResult<U, E | ZodError<Input>>;\n transform<U extends Val, Input = unknown>(\n fn: (value: T) => Promise<SafeParseReturnType<Input, NonNullable<U>>>,\n ): AsyncResult<U, E | ZodError<Input>>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Promise<Result<U, E | EE>>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => Promise<RawValue<U>>,\n ): AsyncResult<U, E>;\n transform<U extends Val>(fn: (value: T) => RawValue<U>): AsyncResult<U, E>;\n transform<U extends Val, EE extends Val, Input = unknown>(\n fn: (\n value: T,\n ) =>\n | Result<U, E | EE>\n | AsyncResult<U, E | EE>\n | SafeParseReturnType<Input, NonNullable<U>>\n | Promise<SafeParseReturnType<Input, NonNullable<U>>>\n | Promise<Result<U, E | EE>>\n | Promise<RawValue<U>>\n | RawValue<U>,\n ): AsyncResult<U, E | EE | ZodError<Input>> {\n return new AsyncResult(\n this.asyncResult\n .then((oldResult) => {\n const { ok, val: value, err: error } = oldResult.unwrap();\n if (!ok) {\n return Result.err(error);\n }\n\n try {\n const result = fn(value);\n\n if (result instanceof Result) {\n return result;\n }\n\n if (result instanceof AsyncResult) {\n return result;\n }\n\n if (isZodResult<Input, U>(result)) {\n return fromZodResult(result);\n }\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn(\n { err },\n 'AsyncResult: unhandled async transform error',\n );\n return Result._uncaught(err);\n });\n }\n\n return Result.ok(result);\n } catch (err) {\n logger.warn({ err }, 'AsyncResult: unhandled transform error');\n return Result._uncaught(err);\n }\n })\n .catch((err) => {\n // Happens when `.unwrap()` of `oldResult` throws\n return Result._uncaught(err);\n }),\n );\n }\n\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => Result<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => AsyncResult<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (\n err: NonNullable<E>,\n ) => Result<U, EE> | AsyncResult<U, EE> | Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE> {\n const caughtAsyncResult: Promise<Result<T, EE>> = this.asyncResult.then(\n (result) =>\n // eslint-disable-next-line promise/no-nesting\n result.catch(fn as never),\n );\n return AsyncResult.wrap(caughtAsyncResult);\n }\n\n /**\n * Given a `schema`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n parse<Schema extends ZodType<any, any, any>>(\n schema: Schema,\n ): AsyncResult<\n NonNullable<ZodOutput<Schema>>,\n E | ZodError<ZodInput<Schema>>\n > {\n return new AsyncResult(\n this.asyncResult\n .then((oldResult) => oldResult.parse(schema))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n\n onValue(fn: (value: T) => void): AsyncResult<T, E> {\n return new AsyncResult(\n this.asyncResult\n .then((result) => result.onValue(fn))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n\n onError(fn: (err: E) => void): AsyncResult<T, E> {\n return new AsyncResult(\n this.asyncResult\n .then((result) => result.onError(fn))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"result.js","names":[],"sources":["../../lib/util/result.ts"],"sourcesContent":["import type {\n SafeParseReturnType,\n input as ZodInput,\n output as ZodOutput,\n ZodType,\n} from 'zod/v3';\nimport { NEVER, ZodError, ZodIssueCode } from 'zod/v3';\nimport { logger } from '../logger/index.ts';\nimport type { Nullish } from '../types/index.ts';\n\ntype Val = NonNullable<unknown>;\n\ninterface Ok<T extends Val> {\n readonly ok: true;\n readonly val: T;\n readonly err?: never;\n}\n\ninterface Err<E extends Val> {\n readonly ok: false;\n readonly err: E;\n readonly val?: never;\n\n /**\n * Internal flag to indicate that the error was thrown during `.transform()`\n * and will be re-thrown on `.unwrap()`.\n */\n readonly _uncaught?: true;\n}\n\ntype Res<T extends Val, E extends Val> = Ok<T> | Err<E>;\n\nfunction isZodResult<Input, Output extends Val>(\n input: unknown,\n): input is SafeParseReturnType<Input, Output> {\n if (\n typeof input !== 'object' ||\n input === null ||\n Object.keys(input).length !== 2 ||\n !('success' in input) ||\n typeof input.success !== 'boolean'\n ) {\n return false;\n }\n\n if (input.success) {\n return (\n 'data' in input &&\n typeof input.data !== 'undefined' &&\n input.data !== null\n );\n } else {\n return 'error' in input && input.error instanceof ZodError;\n }\n}\n\nfunction fromZodResult<ZodInput, ZodOutput extends Val>(\n input: SafeParseReturnType<ZodInput, ZodOutput>,\n): Result<ZodOutput, ZodError<ZodInput>> {\n return input.success ? Result.ok(input.data) : Result.err(input.error);\n}\n\n/**\n * All non-nullable values that also are not Promises nor Zod results.\n * It's useful for restricting Zod results to not return `null` or `undefined`.\n */\ntype RawValue<T extends Val> = Exclude<\n T,\n SafeParseReturnType<unknown, T> | Promise<unknown>\n>;\n\nfunction fromNullable<\n T extends Val,\n ErrForNull extends Val,\n ErrForUndefined extends Val,\n>(\n input: Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n): Result<T, ErrForNull | ErrForUndefined> {\n if (input === null) {\n return Result.err(errForNull);\n }\n\n if (input === undefined) {\n return Result.err(errForUndefined);\n }\n\n return Result.ok(input);\n}\n\n/**\n * Class for representing a result that can fail.\n *\n * The mental model:\n * - `.wrap()` and `.wrapNullable()` are sinks\n * - `.transform()` are pipes which can be chained\n * - `.unwrap()` is the point of consumption\n */\nexport class Result<T extends Val, E extends Val = Error> {\n private readonly res: Res<T, E>;\n\n private constructor(res: Res<T, E>) {\n this.res = res;\n }\n\n static ok<T extends Val>(val: T): Result<T, never> {\n return new Result({ ok: true, val });\n }\n\n static err<E extends Val>(err: E): Result<never, E> {\n return new Result({ ok: false, err });\n }\n\n static _uncaught<E extends Val>(err: E): Result<never, E> {\n return new Result({ ok: false, err, _uncaught: true });\n }\n\n /**\n * Wrap a callback or promise in a Result in such a way that any thrown errors\n * are caught and wrapped with `Result.err()` (and hence never re-thrown).\n *\n * In case of a promise, the `AsyncResult` is returned.\n * Use `.unwrap()` to get the `Promise<Result<T, E>>` from `AsyncResult`.\n *\n * ```ts\n *\n * // SYNC\n * const parse = (json: string) => Result.wrap(() => JSON.parse(json));\n *\n * const { val, err } = parse('{\"foo\": \"bar\"}').unwrap();\n * expect(val).toEqual({ foo: 'bar' });\n * expect(err).toBeUndefined();\n *\n * const { val, err } = parse('!!!').unwrap();\n * expect(val).toBeUndefined();\n * expect(err).toBeInstanceOf(SyntaxError);\n *\n * // ASYNC\n * const request = (url: string) => Result.wrap(http.get(url));\n *\n * const { val, err } = await request('https://example.com').unwrap();\n * expect(val).toBeString();\n * expect(err).toBeUndefined();\n *\n * ```\n */\n static wrap<T extends Val, Input = unknown>(\n zodResult: SafeParseReturnType<Input, T>,\n ): Result<T, ZodError<Input>>;\n static wrap<T extends Val, E extends Val = Error>(\n callback: () => RawValue<T>,\n ): Result<T, E>;\n static wrap<T extends Val, E extends Val = Error>(\n callback: () => Promise<RawValue<T>>,\n ): AsyncResult<T, E>;\n static wrap<T extends Val, E extends Val = Error, EE extends Val = never>(\n promise: Promise<Result<T, EE>>,\n ): AsyncResult<T, E | EE>;\n static wrap<T extends Val, E extends Val = Error>(\n promise: Promise<RawValue<T>>,\n ): AsyncResult<T, E>;\n static wrap<\n T extends Val,\n E extends Val = Error,\n EE extends Val = never,\n Input = unknown,\n >(\n input:\n | SafeParseReturnType<Input, T>\n | (() => RawValue<T>)\n | (() => Promise<RawValue<T>>)\n | Promise<Result<T, EE>>\n | Promise<RawValue<T>>,\n ): Result<T, ZodError<Input>> | Result<T, E | EE> | AsyncResult<T, E | EE> {\n if (isZodResult<Input, T>(input)) {\n return fromZodResult(input);\n }\n\n if (input instanceof Promise) {\n return AsyncResult.wrap(input as never);\n }\n\n try {\n const result = input();\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result);\n }\n\n return Result.ok(result);\n } catch (error) {\n return Result.err(error);\n }\n }\n\n /**\n * Similar to `Result.wrap()`, but helps to undo the billion dollar mistake by\n * replacing `null` or `undefined` with an error of provided type.\n *\n * Errors thrown inside the callback or promise are caught and wrapped with `Result.err()`,\n * hence never re-thrown.\n *\n * Since functions and promises returning nullable can't be wrapped with `Result.wrap()`\n * because `val` is constrained by being `NonNullable`, `null` and `undefined`\n * must be converted to some sort of `err` value.\n *\n * This method does exactly this, i.g. it is the feature-rich shorthand for:\n *\n * ```ts\n * const { val, err } = Result.wrap(() => {\n * const result = callback();\n * return result === null || result === undefined\n * ? Result.err('oops')\n * : Result.ok(result);\n * }).unwrap();\n * ```\n *\n * In case of a promise, the `AsyncResult` is returned.\n *\n * ```ts\n *\n * // SYNC\n * const getHostname = (url: string) =>\n * Result.wrapNullable(\n * () => parseUrl(url)?.hostname,\n * 'invalid-url' as const\n * );\n * const { val, err } = getHostname('foobar').unwrap();\n * expect(val).toBeUndefined();\n * expect(err).toBe('invalid-url');\n *\n * // ASYNC\n * const { val, err } = await Result.wrapNullable(\n * readLocalFile('yarn.lock'),\n * 'file-read-error' as const\n * ).unwrap();\n *\n * ```\n */\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n callback: () => Nullish<T>,\n errForNullable: ErrForNullable,\n ): Result<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n callback: () => Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): Result<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n promise: Promise<Nullish<T>>,\n errForNullable: ErrForNullable,\n ): AsyncResult<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n promise: Promise<Nullish<T>>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): AsyncResult<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n value: Nullish<T>,\n errForNullable: ErrForNullable,\n ): Result<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n value: Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): Result<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n input: (() => Nullish<T>) | Promise<Nullish<T>> | Nullish<T>,\n arg2: ErrForNull,\n arg3?: ErrForUndefined,\n ):\n | Result<T, E | ErrForNull | ErrForUndefined>\n | AsyncResult<T, E | ErrForNull | ErrForUndefined> {\n const errForNull = arg2;\n const errForUndefined = arg3 ?? arg2;\n\n if (input instanceof Promise) {\n return AsyncResult.wrapNullable(input, errForNull, errForUndefined);\n }\n\n if (input instanceof Function) {\n try {\n const result = input();\n return fromNullable(result, errForNull, errForUndefined);\n } catch (error) {\n return Result.err(error);\n }\n }\n\n return fromNullable(input, errForNull, errForUndefined);\n }\n\n /**\n * Returns a discriminated union for type-safe consumption of the result.\n * When error was uncaught during transformation, it's being re-thrown here.\n *\n * ```ts\n *\n * const { val, err } = Result.ok('foo').unwrap();\n * expect(val).toBe('foo');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrap(): Res<T, E> {\n if (this.res.ok) {\n return this.res;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw this.res.err;\n }\n\n return this.res;\n }\n\n /**\n * Returns a success value or a fallback value.\n * When error was uncaught during transformation, it's being re-thrown here.\n *\n * ```ts\n *\n * const value = Result.err('bar').unwrapOr('foo');\n * expect(val).toBe('foo');\n *\n * ```\n */\n unwrapOr(fallback: T): T {\n if (this.res.ok) {\n return this.res.val;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw this.res.err;\n }\n\n return fallback;\n }\n\n /**\n * Returns the ok-value or throw the error.\n */\n unwrapOrThrow(): T {\n if (this.res.ok) {\n return this.res.val;\n }\n\n // TODO: fix, should only allow `Error` type\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw this.res.err;\n }\n\n /**\n * Returns the ok-value or `null`.\n * When error was uncaught during transformation, it's being re-thrown here.\n */\n unwrapOrNull(): T | null {\n if (this.res.ok) {\n return this.res.val;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw this.res.err;\n }\n\n return null;\n }\n\n /**\n * Transforms the ok-value, sync or async way.\n *\n * Transform functions SHOULD NOT throw.\n * Uncaught errors are logged and wrapped to `Result._uncaught()`,\n * which leads to re-throwing them in `unwrap()`.\n *\n * Zod `.safeParse()` results are converted automatically.\n *\n * ```ts\n *\n * // SYNC\n * const { val, err } = Result.ok('foo')\n * .transform((x) => x.length)\n * .unwrap();\n * expect(val).toBe(3);\n *\n * // ASYNC\n * const { val, err } = await Result.wrap(\n * http.getJson('https://api.example.com/data.json')\n * )\n * .transform(({ body }) => body)\n * .unwrap();\n *\n * ```\n */\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Result<U, E | EE>,\n ): Result<U, E | EE>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => AsyncResult<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val, Input = unknown>(\n fn: (value: T) => SafeParseReturnType<Input, NonNullable<U>>,\n ): Result<U, E | ZodError<Input>>;\n transform<U extends Val, Input = unknown>(\n fn: (value: T) => Promise<SafeParseReturnType<Input, NonNullable<U>>>,\n ): AsyncResult<U, E | ZodError<Input>>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Promise<Result<U, E | EE>>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => Promise<RawValue<U>>,\n ): AsyncResult<U, E>;\n transform<U extends Val>(fn: (value: T) => RawValue<U>): Result<U, E>;\n transform<U extends Val, EE extends Val, Input = unknown>(\n fn: (\n value: T,\n ) =>\n | Result<U, E | EE>\n | AsyncResult<U, E | EE>\n | SafeParseReturnType<Input, NonNullable<U>>\n | Promise<SafeParseReturnType<Input, NonNullable<U>>>\n | Promise<Result<U, E | EE>>\n | Promise<RawValue<U>>\n | RawValue<U>,\n ):\n | Result<U, E | EE | ZodError<Input>>\n | AsyncResult<U, E | EE | ZodError<Input>> {\n if (!this.res.ok) {\n return Result.err(this.res.err);\n }\n\n try {\n const result = fn(this.res.val);\n\n if (result instanceof Result) {\n return result;\n }\n\n if (result instanceof AsyncResult) {\n return result;\n }\n\n if (isZodResult<Input, U>(result)) {\n return fromZodResult(result);\n }\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn({ err }, 'Result: unhandled async transform error');\n return Result._uncaught(err);\n });\n }\n\n return Result.ok(result);\n } catch (err) {\n logger.warn({ err }, 'Result: unhandled transform error');\n return Result._uncaught(err);\n }\n }\n\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Result<U, EE>,\n ): Result<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => AsyncResult<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Result<U, EE> | AsyncResult<U, EE> | Promise<Result<U, EE>>,\n ): Result<T | U, EE> | AsyncResult<T | U, EE> {\n if (this.res.ok) {\n return this as never;\n }\n\n if (this.res._uncaught) {\n return this as never;\n }\n\n try {\n const result = fn(this.res.err);\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn(\n { err },\n 'Result: unexpected error in async catch handler',\n );\n return Result._uncaught(err);\n });\n }\n\n return result;\n } catch (err) {\n logger.warn({ err }, 'Result: unexpected error in catch handler');\n return Result._uncaught(err);\n }\n }\n\n /**\n * Given a `schema` and `input`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n static parse<Schema extends ZodType<any, any, any>>(\n input: unknown,\n schema: Schema,\n ): Result<NonNullable<ZodOutput<Schema>>, ZodError<ZodInput<Schema>>> {\n const parseResult = schema\n .transform((result, ctx): NonNullable<ZodOutput<Schema>> => {\n if (result === undefined) {\n ctx.addIssue({\n code: ZodIssueCode.custom,\n message: `Result can't accept nullish values, but input was parsed by Zod schema to undefined`,\n });\n return NEVER;\n }\n\n if (result === null) {\n ctx.addIssue({\n code: ZodIssueCode.custom,\n message: `Result can't accept nullish values, but input was parsed by Zod schema to null`,\n });\n return NEVER;\n }\n\n return result;\n })\n .safeParse(input);\n\n return fromZodResult(parseResult);\n }\n\n /**\n * Given a `schema`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n parse<Schema extends ZodType<any, any, any>>(\n schema: Schema,\n ): Result<NonNullable<ZodOutput<Schema>>, E | ZodError<ZodInput<Schema>>> {\n if (this.res.ok) {\n return Result.parse(this.res.val, schema);\n }\n\n const err = this.res.err;\n\n if (this.res._uncaught) {\n return Result._uncaught(err);\n }\n\n return Result.err(err);\n }\n\n /**\n * Call `fn` on the `val` if the result is ok.\n */\n onValue(fn: (value: T) => void): Result<T, E> {\n if (this.res.ok) {\n try {\n fn(this.res.val);\n } catch (err) {\n return Result._uncaught(err);\n }\n }\n\n return this;\n }\n\n /**\n * Call `fn` on the `err` if the result is err.\n */\n onError(fn: (err: E) => void): Result<T, E> {\n if (!this.res.ok) {\n try {\n fn(this.res.err);\n } catch (err) {\n return Result._uncaught(err);\n }\n }\n\n return this;\n }\n}\n\n/**\n * This class is being used when `Result` methods encounter async code.\n * It isn't meant to be used directly, but exported for usage in type annotations.\n *\n * All the methods resemble `Result` methods, but work asynchronously.\n */\nexport class AsyncResult<T extends Val, E extends Val> implements PromiseLike<\n Result<T, E>\n> {\n private asyncResult: Promise<Result<T, E>>;\n\n private constructor(asyncResult: Promise<Result<T, E>>) {\n this.asyncResult = asyncResult;\n }\n\n then<TResult1 = Result<T, E>>(\n onfulfilled?:\n | ((value: Result<T, E>) => TResult1 | PromiseLike<TResult1>)\n | null,\n ): PromiseLike<TResult1> {\n return this.asyncResult.then(onfulfilled);\n }\n\n static ok<T extends Val>(val: T): AsyncResult<T, never> {\n return new AsyncResult(Promise.resolve(Result.ok(val)));\n }\n\n static err<E extends Val>(err: NonNullable<E>): AsyncResult<never, E> {\n // eslint-disable-next-line promise/no-promise-in-callback\n return new AsyncResult(Promise.resolve(Result.err(err)));\n }\n\n static wrap<\n T extends Val,\n E extends Val = Error,\n EE extends Val = never,\n Input = unknown,\n >(\n promise:\n | Promise<SafeParseReturnType<Input, T>>\n | Promise<Result<T, EE>>\n | Promise<RawValue<T>>,\n onErr?: (err: NonNullable<E>) => Result<T, E>,\n ): AsyncResult<T, E | EE> {\n return new AsyncResult(\n promise\n .then((value) => {\n if (value instanceof Result) {\n return value;\n }\n\n if (isZodResult<Input, T>(value)) {\n return fromZodResult(value);\n }\n\n return Result.ok(value);\n })\n .catch((err) => {\n if (onErr) {\n return onErr(err);\n }\n return Result.err(err);\n }),\n );\n }\n\n static wrapNullable<\n T extends Val,\n E extends Val,\n ErrForNull extends Val,\n ErrForUndefined extends Val,\n >(\n promise: Promise<Nullish<T>>,\n errForNull: NonNullable<ErrForNull>,\n errForUndefined: NonNullable<ErrForUndefined>,\n ): AsyncResult<T, E | ErrForNull | ErrForUndefined> {\n return new AsyncResult(\n promise\n .then((value) => fromNullable(value, errForNull, errForUndefined))\n .catch((err) => Result.err(err)),\n );\n }\n\n /**\n * Returns a discriminated union for type-safe consumption of the result.\n *\n * ```ts\n *\n * const { val, err } = await Result.wrap(readFile('foo.txt')).unwrap();\n * expect(val).toBe('foo');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrap(): Promise<Res<T, E>> {\n return this.asyncResult.then<Res<T, E>>((res) => res.unwrap());\n }\n\n /**\n * Returns a success value or a fallback value.\n *\n * ```ts\n *\n * const val = await Result.wrap(readFile('foo.txt')).unwrapOr('bar');\n * expect(val).toBe('bar');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrapOr(fallback: T): Promise<T> {\n return this.asyncResult.then<T>((res) => res.unwrapOr(fallback));\n }\n\n /**\n * Returns the ok-value or throw the error.\n */\n async unwrapOrThrow(): Promise<T> {\n const result = await this.asyncResult;\n return result.unwrapOrThrow();\n }\n\n /**\n * Returns the ok-value or `null`.\n */\n unwrapOrNull(): Promise<T | null> {\n return this.asyncResult.then<T | null>((res) => res.unwrapOrNull());\n }\n\n /**\n * Transforms the ok-value, sync or async way.\n *\n * Transform functions SHOULD NOT throw.\n * Uncaught errors are logged and wrapped to `Result._uncaught()`,\n * which leads to re-throwing them in `unwrap()`.\n *\n * Zod `.safeParse()` results are converted automatically.\n *\n * ```ts\n *\n * const { val, err } = await Result.wrap(\n * http.getJson('https://api.example.com/data.json')\n * )\n * .transform(({ body }) => body)\n * .unwrap();\n *\n * ```\n */\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Result<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => AsyncResult<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val, Input = unknown>(\n fn: (value: T) => SafeParseReturnType<Input, NonNullable<U>>,\n ): AsyncResult<U, E | ZodError<Input>>;\n transform<U extends Val, Input = unknown>(\n fn: (value: T) => Promise<SafeParseReturnType<Input, NonNullable<U>>>,\n ): AsyncResult<U, E | ZodError<Input>>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Promise<Result<U, E | EE>>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => Promise<RawValue<U>>,\n ): AsyncResult<U, E>;\n transform<U extends Val>(fn: (value: T) => RawValue<U>): AsyncResult<U, E>;\n transform<U extends Val, EE extends Val, Input = unknown>(\n fn: (\n value: T,\n ) =>\n | Result<U, E | EE>\n | AsyncResult<U, E | EE>\n | SafeParseReturnType<Input, NonNullable<U>>\n | Promise<SafeParseReturnType<Input, NonNullable<U>>>\n | Promise<Result<U, E | EE>>\n | Promise<RawValue<U>>\n | RawValue<U>,\n ): AsyncResult<U, E | EE | ZodError<Input>> {\n return new AsyncResult(\n this.asyncResult\n .then((oldResult) => {\n const { ok, val: value, err: error } = oldResult.unwrap();\n if (!ok) {\n return Result.err(error);\n }\n\n try {\n const result = fn(value);\n\n if (result instanceof Result) {\n return result;\n }\n\n if (result instanceof AsyncResult) {\n return result;\n }\n\n if (isZodResult<Input, U>(result)) {\n return fromZodResult(result);\n }\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn(\n { err },\n 'AsyncResult: unhandled async transform error',\n );\n return Result._uncaught(err);\n });\n }\n\n return Result.ok(result);\n } catch (err) {\n logger.warn({ err }, 'AsyncResult: unhandled transform error');\n return Result._uncaught(err);\n }\n })\n .catch((err) => {\n // Happens when `.unwrap()` of `oldResult` throws\n return Result._uncaught(err);\n }),\n );\n }\n\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => Result<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => AsyncResult<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (\n err: NonNullable<E>,\n ) => Result<U, EE> | AsyncResult<U, EE> | Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE> {\n const caughtAsyncResult: Promise<Result<T, EE>> = this.asyncResult.then(\n (result) =>\n // eslint-disable-next-line promise/no-nesting\n result.catch(fn as never),\n );\n return AsyncResult.wrap(caughtAsyncResult);\n }\n\n /**\n * Given a `schema`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n parse<Schema extends ZodType<any, any, any>>(\n schema: Schema,\n ): AsyncResult<\n NonNullable<ZodOutput<Schema>>,\n E | ZodError<ZodInput<Schema>>\n > {\n return new AsyncResult(\n this.asyncResult\n .then((oldResult) => oldResult.parse(schema))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n\n onValue(fn: (value: T) => void): AsyncResult<T, E> {\n return new AsyncResult(\n this.asyncResult\n .then((result) => result.onValue(fn))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n\n onError(fn: (err: E) => void): AsyncResult<T, E> {\n return new AsyncResult(\n this.asyncResult\n .then((result) => result.onError(fn))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n}\n"],"mappings":"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"}
|
package/dist/util/yaml.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yaml.js","names":[],"sources":["../../lib/util/yaml.ts"],"sourcesContent":["import type {\n CreateNodeOptions,\n Document,\n DocumentOptions,\n ParseOptions,\n SchemaOptions,\n ToStringOptions,\n} from 'yaml';\nimport { parseAllDocuments, parseDocument, stringify } from 'yaml';\nimport type { ZodType } from 'zod/v3';\nimport { logger } from '../logger/index.ts';\nimport { stripTemplates } from './string.ts';\n\nexport interface YamlOptions<\n ResT = unknown,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n
|
|
1
|
+
{"version":3,"file":"yaml.js","names":[],"sources":["../../lib/util/yaml.ts"],"sourcesContent":["import type {\n CreateNodeOptions,\n Document,\n DocumentOptions,\n ParseOptions,\n SchemaOptions,\n ToStringOptions,\n} from 'yaml';\nimport { parseAllDocuments, parseDocument, stringify } from 'yaml';\nimport type { ZodType } from 'zod/v3';\nimport { logger } from '../logger/index.ts';\nimport { stripTemplates } from './string.ts';\n\nexport interface YamlOptions<\n ResT = unknown,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n>\n extends ParseOptions, DocumentOptions, SchemaOptions {\n customSchema?: Schema;\n removeTemplates?: boolean;\n}\n\ninterface YamlParseDocumentOptions\n extends ParseOptions, DocumentOptions, SchemaOptions {\n removeTemplates?: boolean;\n}\n\nexport interface YamlOptionsMultiple<\n ResT = unknown,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n> extends YamlOptions<ResT, Schema> {\n failureBehaviour?: 'throw' | 'filter';\n}\n\nexport type DumpOptions = DocumentOptions &\n SchemaOptions &\n ParseOptions &\n CreateNodeOptions &\n ToStringOptions;\n\n/**\n * Parse a YAML string into a JavaScript object.\n *\n * Multiple documents are supported.\n *\n * If a schema is provided, the parsed object will be validated against it.\n *\n * If failureBehaviour is set to 'filter',\n * the function will return an empty array if the YAML parsing or schema validation fails and therefore will not throw an error.\n *\n * If failureBehaviour is set to 'throw',\n * the function will throw an error if the YAML parsing or schema validation fails for ANY document.\n * @param content\n * @param options\n */\nexport function parseYaml<ResT = unknown>(\n content: string,\n options?: YamlOptionsMultiple<ResT>,\n): ResT[] {\n const massagedContent = massageContent(content, options);\n\n const rawDocuments = parseAllDocuments(\n massagedContent,\n prepareParseOption(options),\n );\n\n const schema = options?.customSchema;\n\n const results: ResT[] = [];\n for (const rawDocument of rawDocuments) {\n const errors = rawDocument.errors;\n // handle YAML parse errors\n if (errors?.length) {\n const error = new AggregateError(errors, 'Failed to parse YAML file');\n if (options?.failureBehaviour === 'filter') {\n logger.debug(`Failed to parse YAML file`);\n continue;\n }\n throw error;\n }\n\n const document = rawDocument.toJS({ maxAliasCount: 10000 });\n\n // skip schema validation if no schema is provided\n if (!schema) {\n results.push(document as ResT);\n continue;\n }\n\n const result = schema.safeParse(document);\n if (result.success) {\n results.push(result.data);\n continue;\n }\n\n // handle schema validation errors\n if (options?.failureBehaviour === 'filter') {\n logger.trace(\n { error: result.error, document },\n 'Failed to parse schema for YAML',\n );\n continue;\n }\n throw new Error('Failed to parse YAML file', { cause: result.error });\n }\n\n return results;\n}\n\n/**\n * Parse a YAML string into a JavaScript object.\n *\n * Only a single document is supported.\n *\n * If a schema is provided, the parsed object will be validated against it.\n * Should the YAML parsing or schemata validation fail, an error will be thrown.\n *\n * @param content\n * @param options\n */\nexport function parseSingleYaml<ResT = unknown>(\n content: string,\n options?: YamlOptions<ResT>,\n): ResT {\n const rawDocument = parseSingleYamlDocument(content, options);\n\n const document = rawDocument.toJS({ maxAliasCount: 10000 });\n const schema = options?.customSchema;\n if (!schema) {\n return document as ResT;\n }\n\n return schema.parse(document);\n}\n\n/**\n * Parse a YAML string into a Document representation.\n *\n * Only a single document is supported.\n *\n * @param content\n * @param options\n */\nexport function parseSingleYamlDocument(\n content: string,\n options?: YamlParseDocumentOptions,\n): Document {\n const massagedContent = massageContent(content, options);\n const rawDocument = parseDocument(\n massagedContent,\n prepareParseOption(options),\n );\n\n if (rawDocument?.errors?.length) {\n throw new AggregateError(rawDocument.errors, 'Failed to parse YAML file');\n }\n\n return rawDocument;\n}\n\nexport function dump(obj: any, opts?: DumpOptions): string {\n return stringify(obj, opts);\n}\n\nfunction massageContent(content: string, options?: YamlOptions): string {\n if (options?.removeTemplates) {\n return stripTemplates(content);\n }\n\n return content;\n}\n\nfunction prepareParseOption(options: YamlOptions | undefined): YamlOptions {\n return {\n prettyErrors: true,\n // if we're removing templates, we can run into the situation where we have duplicate keys\n uniqueKeys: !options?.removeTemplates,\n strict: false,\n ...options,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuDA,SAAgB,UACd,SACA,SACQ;CAGR,MAAM,eAAe,kBAFG,eAAe,SAAS,QAAQ,EAItD,mBAAmB,QAAQ,CAC5B;CAED,MAAM,SAAS,SAAS;CAExB,MAAM,UAAkB,EAAE;AAC1B,MAAK,MAAM,eAAe,cAAc;EACtC,MAAM,SAAS,YAAY;AAE3B,MAAI,QAAQ,QAAQ;GAClB,MAAM,QAAQ,IAAI,eAAe,QAAQ,4BAA4B;AACrE,OAAI,SAAS,qBAAqB,UAAU;AAC1C,WAAO,MAAM,4BAA4B;AACzC;;AAEF,SAAM;;EAGR,MAAM,WAAW,YAAY,KAAK,EAAE,eAAe,KAAO,CAAC;AAG3D,MAAI,CAAC,QAAQ;AACX,WAAQ,KAAK,SAAiB;AAC9B;;EAGF,MAAM,SAAS,OAAO,UAAU,SAAS;AACzC,MAAI,OAAO,SAAS;AAClB,WAAQ,KAAK,OAAO,KAAK;AACzB;;AAIF,MAAI,SAAS,qBAAqB,UAAU;AAC1C,UAAO,MACL;IAAE,OAAO,OAAO;IAAO;IAAU,EACjC,kCACD;AACD;;AAEF,QAAM,IAAI,MAAM,6BAA6B,EAAE,OAAO,OAAO,OAAO,CAAC;;AAGvE,QAAO;;;;;;;;;;;;;AAcT,SAAgB,gBACd,SACA,SACM;CAGN,MAAM,WAFc,wBAAwB,SAAS,QAAQ,CAEhC,KAAK,EAAE,eAAe,KAAO,CAAC;CAC3D,MAAM,SAAS,SAAS;AACxB,KAAI,CAAC,OACH,QAAO;AAGT,QAAO,OAAO,MAAM,SAAS;;;;;;;;;;AAW/B,SAAgB,wBACd,SACA,SACU;CAEV,MAAM,cAAc,cADI,eAAe,SAAS,QAAQ,EAGtD,mBAAmB,QAAQ,CAC5B;AAED,KAAI,aAAa,QAAQ,OACvB,OAAM,IAAI,eAAe,YAAY,QAAQ,4BAA4B;AAG3E,QAAO;;AAGT,SAAgB,KAAK,KAAU,MAA4B;AACzD,QAAO,UAAU,KAAK,KAAK;;AAG7B,SAAS,eAAe,SAAiB,SAA+B;AACtE,KAAI,SAAS,gBACX,QAAO,eAAe,QAAQ;AAGhC,QAAO;;AAGT,SAAS,mBAAmB,SAA+C;AACzE,QAAO;EACL,cAAc;EAEd,YAAY,CAAC,SAAS;EACtB,QAAQ;EACR,GAAG;EACJ"}
|
|
@@ -117,6 +117,9 @@ async function readDashboardBody(config) {
|
|
|
117
117
|
}
|
|
118
118
|
Object.assign(config, dashboardChecks);
|
|
119
119
|
}
|
|
120
|
+
function formatAsMarkdownLink(name, url) {
|
|
121
|
+
return url ? `[${name}](${url})` : `\`${name}\``;
|
|
122
|
+
}
|
|
120
123
|
function getListItem(branch, type) {
|
|
121
124
|
let item = getCheckbox(`${type}-branch=${branch.branchName}`);
|
|
122
125
|
if (branch.prNo) item += `[${branch.prTitle}](../pull/${branch.prNo})`;
|
|
@@ -221,7 +224,10 @@ async function ensureDependencyDashboard(config, allBranches, packageFiles = {},
|
|
|
221
224
|
if (name && (dep.deprecationMessage ?? hasReplacement)) {
|
|
222
225
|
hasDeprecationsOrReplacements = true;
|
|
223
226
|
deprecatedPackages[manager] ??= {};
|
|
224
|
-
deprecatedPackages[manager][name] ??=
|
|
227
|
+
deprecatedPackages[manager][name] ??= {
|
|
228
|
+
hasReplacement,
|
|
229
|
+
sourceUrl: dep.sourceUrl
|
|
230
|
+
};
|
|
225
231
|
}
|
|
226
232
|
}
|
|
227
233
|
const hasBranches = isNonEmptyArray(branches);
|
|
@@ -243,13 +249,14 @@ async function ensureDependencyDashboard(config, allBranches, packageFiles = {},
|
|
|
243
249
|
issueBody += "## Deprecations / Replacements\n";
|
|
244
250
|
issueBody += emojify("> :warning: **Warning**\n> \n");
|
|
245
251
|
issueBody += "These dependencies are either deprecated or have replacements available:\n\n";
|
|
246
|
-
issueBody += "| Datasource |
|
|
252
|
+
issueBody += "| Datasource | Package | Replacement PR? |\n";
|
|
247
253
|
issueBody += "|------------|------|--------------|\n";
|
|
248
254
|
for (const manager of Object.keys(deprecatedPackages).sort()) {
|
|
249
255
|
const deps = deprecatedPackages[manager];
|
|
250
256
|
for (const depName of Object.keys(deps).sort()) {
|
|
251
|
-
const hasReplacement = deps[depName];
|
|
252
|
-
|
|
257
|
+
const { hasReplacement, sourceUrl } = deps[depName];
|
|
258
|
+
const packageName = formatAsMarkdownLink(depName, sourceUrl);
|
|
259
|
+
issueBody += `| ${manager} | ${packageName} | ${hasReplacement ? "" : ""} |\n`;
|
|
253
260
|
}
|
|
254
261
|
}
|
|
255
262
|
issueBody += "\n";
|
|
@@ -322,7 +329,10 @@ function getAbandonedPackagesMd(packageFiles) {
|
|
|
322
329
|
for (const [manager, managerPackageFiles] of Object.entries(packageFiles)) for (const packageFile of managerPackageFiles) for (const dep of coerceArray(packageFile.deps)) if (dep.depName && dep.isAbandoned) {
|
|
323
330
|
abandonedCount++;
|
|
324
331
|
abandonedPackages[manager] = abandonedPackages[manager] || {};
|
|
325
|
-
abandonedPackages[manager][dep.depName] =
|
|
332
|
+
abandonedPackages[manager][dep.depName] = {
|
|
333
|
+
mostRecentTimestamp: dep.mostRecentTimestamp,
|
|
334
|
+
sourceUrl: dep.sourceUrl
|
|
335
|
+
};
|
|
326
336
|
}
|
|
327
337
|
if (abandonedCount === 0) return "";
|
|
328
338
|
let abandonedMd = emojify("## Abandoned Dependencies\n\n> :information_source: **Note**\n> \n");
|
|
@@ -331,14 +341,15 @@ function getAbandonedPackagesMd(packageFiles) {
|
|
|
331
341
|
abandonedMd += "> These dependencies have not received updates for an extended period and may be unmaintained:\n\n";
|
|
332
342
|
abandonedMd += "<details>\n";
|
|
333
343
|
abandonedMd += `<summary>View abandoned dependencies (${abandonedCount})</summary>\n\n`;
|
|
334
|
-
abandonedMd += "| Datasource |
|
|
344
|
+
abandonedMd += "| Datasource | Package | Last Updated |\n";
|
|
335
345
|
abandonedMd += "|------------|------|-------------|\n";
|
|
336
346
|
for (const manager of Object.keys(abandonedPackages).sort()) {
|
|
337
347
|
const deps = abandonedPackages[manager];
|
|
338
348
|
for (const depName of Object.keys(deps).sort()) {
|
|
339
|
-
const mostRecentTimestamp = deps[depName];
|
|
349
|
+
const { mostRecentTimestamp, sourceUrl } = deps[depName];
|
|
340
350
|
const formattedDate = mostRecentTimestamp ? DateTime.fromISO(mostRecentTimestamp).toFormat("yyyy-MM-dd") : "unknown";
|
|
341
|
-
|
|
351
|
+
const packageName = formatAsMarkdownLink(depName, sourceUrl);
|
|
352
|
+
abandonedMd += `| ${manager} | ${packageName} | \`${formattedDate}\` |\n`;
|
|
342
353
|
}
|
|
343
354
|
}
|
|
344
355
|
abandonedMd += "\n</details>\n\n\n";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-dashboard.js","names":["template.compile"],"sources":["../../../lib/workers/repository/dependency-dashboard.ts"],"sourcesContent":["import {\n isNonEmptyArray,\n isNonEmptyObject,\n isNonEmptyString,\n isNullOrUndefined,\n isTruthy,\n} from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { GlobalConfig } from '../../config/global.ts';\nimport type { RenovateConfig } from '../../config/types.ts';\nimport { logger } from '../../logger/index.ts';\nimport type { PackageFile } from '../../modules/manager/types.ts';\nimport { platform } from '../../modules/platform/index.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport { emojify } from '../../util/emoji.ts';\nimport { regEx } from '../../util/regex.ts';\nimport { coerceString } from '../../util/string.ts';\nimport * as template from '../../util/template/index.ts';\nimport type { BranchConfig, SelectAllConfig } from '../types.ts';\nimport { extractRepoProblems } from './common.ts';\nimport type { ConfigMigrationResult } from './config-migration/index.ts';\nimport { getDepWarningsDashboard } from './errors-warnings.ts';\nimport { PackageFiles } from './package-files.ts';\nimport type { Vulnerability } from './process/types.ts';\nimport { Vulnerabilities } from './process/vulnerabilities.ts';\n\ninterface DependencyDashboard {\n dependencyDashboardChecks: Record<string, string>;\n dependencyDashboardRebaseAllOpen: boolean;\n dependencyDashboardAllPending: boolean;\n dependencyDashboardAllRateLimited: boolean;\n dependencyDashboardAllAwaitingSchedule: boolean;\n}\n\nconst rateLimitedRe = regEx(\n ` - \\\\[ \\\\] ${getMarkdownComment('unlimit-branch=([^\\\\s]+)')}`,\n 'g',\n);\nconst pendingApprovalRe = regEx(\n ` - \\\\[ \\\\] ${getMarkdownComment('approve-branch=([^\\\\s]+)')}`,\n 'g',\n);\nconst awaitingScheduleRe = regEx(\n ` - \\\\[ \\\\] ${getMarkdownComment('unschedule-branch=([^\\\\s]+)')}`,\n 'g',\n);\nconst generalBranchRe = regEx(\n ` ${getMarkdownComment('([a-zA-Z]+)-branch=([^\\\\s]+)')}`,\n);\nconst markedBranchesRe = regEx(\n ` - \\\\[x\\\\] ${getMarkdownComment('([a-zA-Z]+)-branch=([^\\\\s]+)')}`,\n 'g',\n);\n\nconst approveAllPendingPrs = 'approve-all-pending-prs';\nconst createAllRateLimitedPrs = 'create-all-rate-limited-prs';\nconst createAllAwaitingSchedulePrs = 'create-all-awaiting-schedule-prs';\nconst createConfigMigrationPr = 'create-config-migration-pr';\nconst configMigrationPrInfo = 'config-migration-pr-info';\nconst rebaseAllOpenPrs = 'rebase-all-open-prs';\n\nfunction getMarkdownComment(comment: string): string {\n return `<!-- ${comment} -->`;\n}\n\nfunction isBoxChecked(issueBody: string, type: string): boolean {\n return issueBody.includes(getCheckbox(type, true));\n}\n\nfunction isBoxUnchecked(issueBody: string, type: string): boolean {\n return issueBody.includes(getCheckbox(type));\n}\n\nfunction getCheckbox(type: string, checked = false): string {\n return ` - [${checked ? 'x' : ' '}] ${getMarkdownComment(type)}`;\n}\n\nfunction checkOpenAllRateLimitedPR(issueBody: string): boolean {\n return isBoxChecked(issueBody, createAllRateLimitedPrs);\n}\n\nfunction checkOpenAllAwaitingSchedulePR(issueBody: string): boolean {\n return isBoxChecked(issueBody, createAllAwaitingSchedulePrs);\n}\n\nfunction checkApproveAllPendingPR(issueBody: string): boolean {\n return isBoxChecked(issueBody, approveAllPendingPrs);\n}\n\nfunction checkRebaseAll(issueBody: string): boolean {\n return isBoxChecked(issueBody, rebaseAllOpenPrs);\n}\n\nfunction getConfigMigrationCheckboxState(\n issueBody: string,\n): 'no-checkbox' | 'checked' | 'unchecked' | 'migration-pr-exists' {\n if (issueBody.includes(getMarkdownComment(configMigrationPrInfo))) {\n return 'migration-pr-exists';\n }\n\n if (isBoxChecked(issueBody, createConfigMigrationPr)) {\n return 'checked';\n }\n\n if (isBoxUnchecked(issueBody, createConfigMigrationPr)) {\n return 'unchecked';\n }\n\n return 'no-checkbox';\n}\n\nfunction selectAllRelevantBranches(issueBody: string): string[] {\n const checkedBranches = [];\n if (checkOpenAllRateLimitedPR(issueBody)) {\n for (const match of issueBody.matchAll(rateLimitedRe)) {\n checkedBranches.push(match[0]);\n }\n }\n if (checkOpenAllAwaitingSchedulePR(issueBody)) {\n for (const match of issueBody.matchAll(awaitingScheduleRe)) {\n checkedBranches.push(match[0]);\n }\n }\n if (checkApproveAllPendingPR(issueBody)) {\n for (const match of issueBody.matchAll(pendingApprovalRe)) {\n checkedBranches.push(match[0]);\n }\n }\n return checkedBranches;\n}\n\nfunction getAllSelectedBranches(\n issueBody: string,\n dependencyDashboardChecks: Record<string, string>,\n): Record<string, string> {\n const allRelevantBranches = selectAllRelevantBranches(issueBody);\n for (const branch of allRelevantBranches) {\n const [, type, branchName] = generalBranchRe.exec(branch)!;\n dependencyDashboardChecks[branchName] = type;\n }\n return dependencyDashboardChecks;\n}\n\nfunction getCheckedBranches(issueBody: string): Record<string, string> {\n let dependencyDashboardChecks: Record<string, string> = {};\n for (const [, type, branchName] of issueBody.matchAll(markedBranchesRe)) {\n dependencyDashboardChecks[branchName] = type;\n }\n dependencyDashboardChecks = getAllSelectedBranches(\n issueBody,\n dependencyDashboardChecks,\n );\n return dependencyDashboardChecks;\n}\n\nfunction parseDashboardIssue(issueBody: string): DependencyDashboard {\n const dependencyDashboardChecks = getCheckedBranches(issueBody);\n const dependencyDashboardRebaseAllOpen = checkRebaseAll(issueBody);\n const dependencyDashboardAllAwaitingSchedule =\n checkOpenAllAwaitingSchedulePR(issueBody);\n const dependencyDashboardAllPending = checkApproveAllPendingPR(issueBody);\n const dependencyDashboardAllRateLimited =\n checkOpenAllRateLimitedPR(issueBody);\n dependencyDashboardChecks.configMigrationCheckboxState =\n getConfigMigrationCheckboxState(issueBody);\n return {\n dependencyDashboardChecks,\n dependencyDashboardRebaseAllOpen,\n dependencyDashboardAllAwaitingSchedule,\n dependencyDashboardAllPending,\n dependencyDashboardAllRateLimited,\n };\n}\n\nexport async function readDashboardBody(\n config: SelectAllConfig,\n): Promise<void> {\n let dashboardChecks: DependencyDashboard = {\n dependencyDashboardChecks: {},\n dependencyDashboardRebaseAllOpen: false,\n dependencyDashboardAllAwaitingSchedule: false,\n dependencyDashboardAllPending: false,\n dependencyDashboardAllRateLimited: false,\n };\n const stringifiedConfig = JSON.stringify(config);\n if (\n config.dependencyDashboard === true ||\n stringifiedConfig.includes('\"dependencyDashboardApproval\":true') ||\n stringifiedConfig.includes('\"prCreation\":\"approval\"')\n ) {\n config.dependencyDashboardTitle =\n config.dependencyDashboardTitle ?? `Dependency Dashboard`;\n const issue = await platform.findIssue(config.dependencyDashboardTitle);\n if (issue) {\n config.dependencyDashboardIssue = issue.number;\n dashboardChecks = parseDashboardIssue(issue.body ?? '');\n }\n }\n\n if (config.checkedBranches) {\n const checkedBranchesRec: Record<string, string> = Object.fromEntries(\n config.checkedBranches.map((branchName) => [branchName, 'global-config']),\n );\n dashboardChecks.dependencyDashboardChecks = {\n ...dashboardChecks.dependencyDashboardChecks,\n ...checkedBranchesRec,\n };\n }\n\n Object.assign(config, dashboardChecks);\n}\n\nfunction getListItem(branch: BranchConfig, type: string): string {\n let item = getCheckbox(`${type}-branch=${branch.branchName}`);\n if (branch.prNo) {\n // TODO: types (#22198)\n item += `[${branch.prTitle!}](../pull/${branch.prNo})`;\n } else {\n item += branch.prTitle;\n }\n const uniquePackages = [\n // TODO: types (#22198)\n ...new Set(branch.upgrades.map((upgrade) => `\\`${upgrade.depName!}\\``)),\n ];\n if (uniquePackages.length < 2) {\n return item + '\\n';\n }\n return item + ' (' + uniquePackages.join(', ') + ')\\n';\n}\n\nfunction splitBranchesByCategory(filteredBranches: BranchConfig[]): {\n categories: Record<string, BranchConfig[]>;\n uncategorized: BranchConfig[];\n hasCategorized: boolean;\n hasUncategorized: boolean;\n} {\n const categories: Record<string, BranchConfig[]> = {};\n const uncategorized: BranchConfig[] = [];\n let hasCategorized = false;\n let hasUncategorized = false;\n for (const branch of filteredBranches) {\n if (branch.dependencyDashboardCategory) {\n categories[branch.dependencyDashboardCategory] ??= [];\n categories[branch.dependencyDashboardCategory].push(branch);\n hasCategorized = true;\n continue;\n }\n uncategorized.push(branch);\n hasUncategorized = true;\n }\n return { categories, uncategorized, hasCategorized, hasUncategorized };\n}\n\nfunction getBranchList(branches: BranchConfig[], listItemType: string): string {\n return branches\n .map((branch: BranchConfig): string => getListItem(branch, listItemType))\n .join('');\n}\n\nfunction getBranchesListMd(\n branches: BranchConfig[],\n predicate: (\n value: BranchConfig,\n index: number,\n array: BranchConfig[],\n ) => unknown,\n title: string,\n description: string,\n listItemType = 'approvePr',\n bulkComment?: string,\n bulkMessage?: string,\n bulkIcon?: '🔐',\n): string {\n const filteredBranches = branches.filter(predicate);\n if (filteredBranches.length === 0) {\n return '';\n }\n let result = `## ${title}\\n\\n${description}\\n\\n`;\n const { categories, uncategorized, hasCategorized, hasUncategorized } =\n splitBranchesByCategory(filteredBranches);\n if (hasCategorized) {\n for (const [category, branches] of Object.entries(categories).sort(\n ([keyA], [keyB]) =>\n keyA.localeCompare(keyB, undefined, { numeric: true }),\n )) {\n result = result.trimEnd() + '\\n\\n';\n result += `### ${category}\\n\\n`;\n result += getBranchList(branches, listItemType);\n }\n if (hasUncategorized) {\n result = result.trimEnd() + '\\n\\n';\n result += `### Others`;\n }\n }\n result = result.trimEnd() + '\\n\\n';\n result += getBranchList(uncategorized, listItemType);\n\n if (bulkComment && bulkMessage && filteredBranches.length > 1) {\n if (hasCategorized) {\n result = result.trimEnd() + '\\n\\n';\n result += '### All\\n\\n';\n }\n result += getCheckbox(bulkComment);\n result += `${bulkIcon ? bulkIcon + ' ' : ''}**${bulkMessage}**${bulkIcon ? ' ' + bulkIcon : ''}`;\n }\n return result.trimEnd() + '\\n\\n';\n}\n\nfunction appendRepoProblems(config: RenovateConfig, issueBody: string): string {\n let newIssueBody = issueBody;\n const repoProblems = extractRepoProblems(config.repository);\n if (repoProblems.size) {\n newIssueBody += '## Repository Problems\\n\\n';\n const repoProblemsHeader =\n config.customizeDashboard?.repoProblemsHeader ??\n 'Renovate tried to run on this repository, but found these problems.';\n newIssueBody += template.compile(repoProblemsHeader, config) + '\\n\\n';\n\n for (const repoProblem of repoProblems) {\n newIssueBody += ` - ${repoProblem}\\n`;\n }\n newIssueBody += '\\n';\n }\n return newIssueBody;\n}\n\nexport async function ensureDependencyDashboard(\n config: SelectAllConfig,\n allBranches: BranchConfig[],\n packageFiles: Record<string, PackageFile[]> = {},\n configMigrationRes: ConfigMigrationResult,\n): Promise<void> {\n logger.debug('ensureDependencyDashboard()');\n if (config.mode === 'silent') {\n logger.debug(\n 'Dependency Dashboard issue is not created, updated or closed when mode=silent',\n );\n return;\n }\n // legacy/migrated issue\n const reuseTitle = 'Update Dependencies (Renovate Bot)';\n const branches = allBranches.filter(\n (branch) =>\n branch.result !== 'automerged' &&\n !branch.upgrades?.every((upgrade) => upgrade.remediationNotPossible),\n );\n if (\n !(\n config.dependencyDashboard === true ||\n config.dependencyDashboardApproval === true ||\n config.packageRules?.some((rule) => rule.dependencyDashboardApproval) ===\n true ||\n branches.some(\n (branch) =>\n !!branch.dependencyDashboardApproval ||\n !!branch.dependencyDashboardPrApproval,\n )\n )\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would close Dependency Dashboard',\n );\n } else {\n logger.debug('Closing Dependency Dashboard');\n await platform.ensureIssueClosing(config.dependencyDashboardTitle!);\n }\n return;\n }\n // istanbul ignore if\n if (config.repoIsOnboarded === false) {\n logger.debug('Repo is onboarding - skipping dependency dashboard');\n return;\n }\n logger.debug('Ensuring Dependency Dashboard');\n\n // Check packageFiles for any deprecations or replacements\n let hasDeprecationsOrReplacements = false;\n const deprecatedPackages: Record<string, Record<string, boolean>> = {};\n logger.debug('Checking packageFiles for deprecated or replacement packages');\n if (isNonEmptyObject(packageFiles)) {\n for (const [manager, fileNames] of Object.entries(packageFiles)) {\n for (const fileName of fileNames) {\n for (const dep of fileName.deps) {\n const name = dep.packageName ?? dep.depName;\n const hasReplacement = !!dep.updates?.find(\n (updates) => updates.updateType === 'replacement',\n );\n if (name && (dep.deprecationMessage ?? hasReplacement)) {\n hasDeprecationsOrReplacements = true;\n deprecatedPackages[manager] ??= {};\n deprecatedPackages[manager][name] ??= hasReplacement;\n }\n }\n }\n }\n }\n\n const hasBranches = isNonEmptyArray(branches);\n if (\n config.dependencyDashboardAutoclose &&\n !hasBranches &&\n !hasDeprecationsOrReplacements\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would close Dependency Dashboard',\n );\n } else {\n logger.debug('Closing Dependency Dashboard');\n await platform.ensureIssueClosing(config.dependencyDashboardTitle!);\n }\n return;\n }\n let issueBody = '';\n\n if (config.dependencyDashboardHeader?.length) {\n issueBody +=\n template.compile(config.dependencyDashboardHeader, config) + '\\n\\n';\n }\n\n if (configMigrationRes.result === 'pr-exists') {\n issueBody +=\n '## Config Migration Needed\\n\\n' +\n getMarkdownComment(configMigrationPrInfo) +\n ` See Config Migration PR: #${configMigrationRes.prNumber}.\\n\\n`;\n } else if (configMigrationRes?.result === 'pr-modified') {\n issueBody +=\n '## Config Migration Needed (Blocked)\\n\\n' +\n getMarkdownComment(configMigrationPrInfo) +\n ` The Config Migration branch exists but has been modified by another user. Renovate will not push to this branch unless it is first deleted. \\n\\n See Config Migration PR: #${configMigrationRes.prNumber}.\\n\\n`;\n } else if (configMigrationRes?.result === 'add-checkbox') {\n issueBody +=\n '## Config Migration Needed\\n\\n' +\n getCheckbox(createConfigMigrationPr) +\n ' Select this checkbox to let Renovate create an automated Config Migration PR.' +\n '\\n\\n';\n }\n\n issueBody = appendRepoProblems(config, issueBody);\n\n if (hasDeprecationsOrReplacements) {\n issueBody += '## Deprecations / Replacements\\n';\n issueBody += emojify('> :warning: **Warning**\\n> \\n');\n issueBody +=\n 'These dependencies are either deprecated or have replacements available:\\n\\n';\n issueBody += '| Datasource | Name | Replacement PR? |\\n';\n issueBody += '|------------|------|--------------|\\n';\n for (const manager of Object.keys(deprecatedPackages).sort()) {\n const deps = deprecatedPackages[manager];\n for (const depName of Object.keys(deps).sort()) {\n const hasReplacement = deps[depName];\n issueBody += `| ${manager} | \\`${depName}\\` | ${\n hasReplacement\n ? ''\n : ''\n } |\\n`;\n }\n }\n issueBody += '\\n';\n }\n\n if (config.dependencyDashboardReportAbandonment) {\n issueBody += getAbandonedPackagesMd(packageFiles);\n }\n\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'needs-approval',\n 'Pending Approval',\n 'The following branches are pending approval. To create them, click on a checkbox below.',\n 'approve',\n approveAllPendingPrs,\n 'Create all pending approval PRs at once',\n '🔐',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'minimum-group-size-not-met',\n 'Group Size Not Met',\n 'The following branches have not met their minimum group size. To create them, click on a checkbox below.',\n 'approveGroup',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'not-scheduled',\n 'Awaiting Schedule',\n 'The following updates are awaiting their schedule. To get an update now, click on a checkbox below.',\n 'unschedule',\n createAllAwaitingSchedulePrs,\n 'Create all awaiting schedule PRs at once',\n '🔐',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) =>\n branch.result === 'branch-limit-reached' ||\n branch.result === 'pr-limit-reached' ||\n branch.result === 'commit-limit-reached',\n 'Rate-Limited',\n 'The following updates are currently rate-limited. To force their creation now, click on a checkbox below.',\n 'unlimit',\n createAllRateLimitedPrs,\n 'Create all rate-limited PRs at once',\n '🔐',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'error',\n 'Errored',\n 'The following updates encountered an error and will be retried. To force a retry now, click on a checkbox below.',\n 'retry',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'needs-pr-approval',\n 'PR Creation Approval Required',\n 'The following branches exist but PR creation requires approval. To approve PR creation, click on a checkbox below.',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'pr-edited',\n 'PR Edited (Blocked)',\n 'The following updates have been manually edited so Renovate will no longer make changes. To discard all commits and start over, click on a checkbox below.',\n 'rebase',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'pending',\n 'Pending Status Checks',\n 'The following updates await pending status checks. To force their creation now, click on a checkbox below.',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.prBlockedBy === 'BranchAutomerge',\n 'Pending Branch Automerge',\n 'The following updates await pending status checks before automerging. To abort the branch automerge and create a PR instead, click on a checkbox below.',\n );\n\n const warn = getDepWarningsDashboard(packageFiles, config);\n if (warn) {\n issueBody += warn;\n issueBody += '\\n';\n }\n\n const otherRes = [\n 'pending',\n 'needs-approval',\n 'needs-pr-approval',\n 'not-scheduled',\n 'pr-limit-reached',\n 'commit-limit-reached',\n 'branch-limit-reached',\n 'already-existed',\n 'error',\n 'automerged',\n 'pr-edited',\n 'minimum-group-size-not-met',\n ];\n const inProgress = branches.filter(\n (branch) =>\n !otherRes.includes(branch.result!) &&\n branch.prBlockedBy !== 'BranchAutomerge',\n );\n issueBody += getBranchesListMd(\n inProgress,\n (branch) => !!branch.prBlockedBy || !branch.prNo,\n 'Other Branches',\n 'The following updates are pending. To force the creation of a PR, click on a checkbox below.',\n 'other',\n );\n issueBody += getBranchesListMd(\n inProgress,\n (branch) => branch.prNo && !branch.prBlockedBy,\n 'Open',\n 'The following updates have all been created. To force a retry/rebase of any, click on a checkbox below.',\n 'rebase',\n rebaseAllOpenPrs,\n 'Click on this checkbox to rebase all open PRs at once',\n );\n\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'already-existed',\n 'PR Closed (Blocked)',\n 'The following updates are blocked by an existing closed PR. To recreate the PR, click on a checkbox below.',\n 'recreate',\n );\n\n if (!hasBranches) {\n issueBody +=\n 'This repository currently has no open or pending branches.\\n\\n';\n }\n\n // add CVE section\n issueBody += await getDashboardMarkdownVulnerabilities(config, packageFiles);\n\n // fit the detected dependencies section\n const footer = getFooter(config);\n issueBody += PackageFiles.getDashboardMarkdown(\n platform.maxBodyLength() - issueBody.length - footer.length,\n );\n\n issueBody += footer;\n\n if (config.dependencyDashboardIssue) {\n // If we're not changing the dashboard issue, then we can skip checking if the user changed it.\n // The cached issue we get back here will reflect its state at the _start_ of our run\n const cachedIssue = await platform.getIssue?.(\n config.dependencyDashboardIssue,\n );\n if (cachedIssue?.body === issueBody) {\n logger.debug('No changes to dependency dashboard issue needed');\n return;\n }\n\n // Skip cache when getting the issue to ensure we get the latest body,\n // including any updates the user made after we started the run\n const updatedIssue = await platform.getIssue?.(\n config.dependencyDashboardIssue,\n false,\n );\n if (updatedIssue) {\n const { dependencyDashboardChecks } = parseDashboardIssue(\n coerceString(updatedIssue.body),\n );\n for (const branchName of Object.keys(config.dependencyDashboardChecks!)) {\n delete dependencyDashboardChecks[branchName];\n }\n for (const branchName of Object.keys(dependencyDashboardChecks)) {\n const checkText = getCheckbox(\n `${dependencyDashboardChecks[branchName]}-branch=${branchName}`,\n );\n issueBody = issueBody.replace(\n checkText,\n checkText.replace('[ ]', '[x]'),\n );\n }\n }\n }\n\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would ensure Dependency Dashboard',\n );\n } else {\n await platform.ensureIssue({\n title: config.dependencyDashboardTitle!,\n reuseTitle,\n body: platform.massageMarkdown(issueBody, config.rebaseLabel),\n labels: config.dependencyDashboardLabels,\n confidential: config.confidential,\n });\n }\n}\n\nexport function getAbandonedPackagesMd(\n packageFiles: Record<string, PackageFile[]>,\n): string {\n const abandonedPackages: Record<\n string,\n Record<string, string | undefined | null>\n > = {};\n let abandonedCount = 0;\n\n for (const [manager, managerPackageFiles] of Object.entries(packageFiles)) {\n for (const packageFile of managerPackageFiles) {\n for (const dep of coerceArray(packageFile.deps)) {\n if (dep.depName && dep.isAbandoned) {\n abandonedCount++;\n abandonedPackages[manager] = abandonedPackages[manager] || {};\n abandonedPackages[manager][dep.depName] = dep.mostRecentTimestamp;\n }\n }\n }\n }\n\n if (abandonedCount === 0) {\n return '';\n }\n\n let abandonedMd = emojify(\n '## Abandoned Dependencies\\n\\n> :information_source: **Note**\\n> \\n',\n );\n\n abandonedMd +=\n 'Packages are marked as abandoned when they exceed the [`abandonmentThreshold`](https://docs.renovatebot.com/configuration-options/#abandonmentthreshold) since their last release. ';\n abandonedMd +=\n 'Unlike deprecated packages with official notices, abandonment is detected by release inactivity.\\n> \\n';\n\n abandonedMd +=\n '> These dependencies have not received updates for an extended period and may be unmaintained:\\n\\n';\n\n abandonedMd += '<details>\\n';\n abandonedMd += `<summary>View abandoned dependencies (${abandonedCount})</summary>\\n\\n`;\n abandonedMd += '| Datasource | Name | Last Updated |\\n';\n abandonedMd += '|------------|------|-------------|\\n';\n\n for (const manager of Object.keys(abandonedPackages).sort()) {\n const deps = abandonedPackages[manager];\n for (const depName of Object.keys(deps).sort()) {\n const mostRecentTimestamp = deps[depName];\n const formattedDate = mostRecentTimestamp\n ? DateTime.fromISO(mostRecentTimestamp).toFormat('yyyy-MM-dd')\n : 'unknown';\n abandonedMd += `| ${manager} | \\`${depName}\\` | \\`${formattedDate}\\` |\\n`;\n }\n }\n\n abandonedMd += '\\n</details>\\n\\n\\n';\n\n return abandonedMd;\n}\n\nfunction getFooter(config: RenovateConfig): string {\n let footer = '';\n if (config.dependencyDashboardFooter?.length) {\n footer +=\n '---\\n' +\n template.compile(config.dependencyDashboardFooter, config) +\n '\\n';\n }\n\n return footer;\n}\n\nexport async function getDashboardMarkdownVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<string> {\n let result = '';\n\n if (\n isNullOrUndefined(config.dependencyDashboardOSVVulnerabilitySummary) ||\n config.dependencyDashboardOSVVulnerabilitySummary === 'none'\n ) {\n return result;\n }\n\n result += '## Vulnerabilities\\n\\n';\n\n const vulnerabilityFetcher = await Vulnerabilities.create();\n const vulnerabilities = await vulnerabilityFetcher.fetchVulnerabilities(\n config,\n packageFiles,\n );\n\n if (vulnerabilities.length === 0) {\n result +=\n 'Renovate has not found any CVEs on [osv.dev](https://osv.dev).\\n\\n';\n return result;\n }\n\n const unresolvedVulnerabilities = vulnerabilities.filter((value) =>\n isNullOrUndefined(value.fixedVersion),\n );\n const resolvedVulnerabilitiesLength =\n vulnerabilities.length - unresolvedVulnerabilities.length;\n\n result += emojify('> :exclamation: **Important**\\n> \\n');\n result += `> \\`${resolvedVulnerabilitiesLength}\\`/\\`${vulnerabilities.length}\\``;\n if (isTruthy(config.osvVulnerabilityAlerts)) {\n result += ' CVEs have Renovate fixes.\\n\\n';\n } else {\n result +=\n ' CVEs have possible Renovate fixes.\\n> See [`osvVulnerabilityAlerts`](https://docs.renovatebot.com/configuration-options/#osvvulnerabilityalerts) to allow Renovate to supply fixes.\\n\\n';\n }\n\n let renderedVulnerabilities: Vulnerability[];\n switch (config.dependencyDashboardOSVVulnerabilitySummary) {\n // filter vulnerabilities to display based on configuration\n case 'unresolved':\n renderedVulnerabilities = unresolvedVulnerabilities;\n break;\n default:\n renderedVulnerabilities = vulnerabilities;\n }\n\n const managerRecords: Record<\n string,\n Record<string, Record<string, Vulnerability[]>>\n > = {};\n for (const vulnerability of renderedVulnerabilities) {\n const { manager, packageFile } = vulnerability.packageFileConfig;\n if (isNullOrUndefined(managerRecords[manager!])) {\n managerRecords[manager!] = {};\n }\n if (isNullOrUndefined(managerRecords[manager!][packageFile])) {\n managerRecords[manager!][packageFile] = {};\n }\n if (\n isNullOrUndefined(\n managerRecords[manager!][packageFile][vulnerability.packageName],\n )\n ) {\n managerRecords[manager!][packageFile][vulnerability.packageName] = [];\n }\n managerRecords[manager!][packageFile][vulnerability.packageName].push(\n vulnerability,\n );\n }\n\n for (const [manager, packageFileRecords] of Object.entries(managerRecords)) {\n result += `<details><summary>${manager}</summary>\\n<blockquote>\\n\\n`;\n for (const [packageFile, packageNameRecords] of Object.entries(\n packageFileRecords,\n )) {\n result += `<details><summary>${packageFile}</summary>\\n<blockquote>\\n\\n`;\n for (const [packageName, cves] of Object.entries(packageNameRecords)) {\n result += `<details><summary>${packageName}</summary>\\n<blockquote>\\n\\n`;\n for (const vul of cves) {\n const id = vul.vulnerability.id;\n const suffix = isNonEmptyString(vul.fixedVersion)\n ? ` (fixed in ${vul.fixedVersion})`\n : '';\n result += `- [${id}](https://osv.dev/vulnerability/${id})${suffix}\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n\n return result;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dependency-dashboard.js","names":["template.compile"],"sources":["../../../lib/workers/repository/dependency-dashboard.ts"],"sourcesContent":["import {\n isNonEmptyArray,\n isNonEmptyObject,\n isNonEmptyString,\n isNullOrUndefined,\n isTruthy,\n} from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { GlobalConfig } from '../../config/global.ts';\nimport type { RenovateConfig } from '../../config/types.ts';\nimport { logger } from '../../logger/index.ts';\nimport type { PackageFile } from '../../modules/manager/types.ts';\nimport { platform } from '../../modules/platform/index.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport { emojify } from '../../util/emoji.ts';\nimport { regEx } from '../../util/regex.ts';\nimport { coerceString } from '../../util/string.ts';\nimport * as template from '../../util/template/index.ts';\nimport type { BranchConfig, SelectAllConfig } from '../types.ts';\nimport { extractRepoProblems } from './common.ts';\nimport type { ConfigMigrationResult } from './config-migration/index.ts';\nimport { getDepWarningsDashboard } from './errors-warnings.ts';\nimport { PackageFiles } from './package-files.ts';\nimport type { Vulnerability } from './process/types.ts';\nimport { Vulnerabilities } from './process/vulnerabilities.ts';\n\ninterface DependencyDashboard {\n dependencyDashboardChecks: Record<string, string>;\n dependencyDashboardRebaseAllOpen: boolean;\n dependencyDashboardAllPending: boolean;\n dependencyDashboardAllRateLimited: boolean;\n dependencyDashboardAllAwaitingSchedule: boolean;\n}\n\nconst rateLimitedRe = regEx(\n ` - \\\\[ \\\\] ${getMarkdownComment('unlimit-branch=([^\\\\s]+)')}`,\n 'g',\n);\nconst pendingApprovalRe = regEx(\n ` - \\\\[ \\\\] ${getMarkdownComment('approve-branch=([^\\\\s]+)')}`,\n 'g',\n);\nconst awaitingScheduleRe = regEx(\n ` - \\\\[ \\\\] ${getMarkdownComment('unschedule-branch=([^\\\\s]+)')}`,\n 'g',\n);\nconst generalBranchRe = regEx(\n ` ${getMarkdownComment('([a-zA-Z]+)-branch=([^\\\\s]+)')}`,\n);\nconst markedBranchesRe = regEx(\n ` - \\\\[x\\\\] ${getMarkdownComment('([a-zA-Z]+)-branch=([^\\\\s]+)')}`,\n 'g',\n);\n\nconst approveAllPendingPrs = 'approve-all-pending-prs';\nconst createAllRateLimitedPrs = 'create-all-rate-limited-prs';\nconst createAllAwaitingSchedulePrs = 'create-all-awaiting-schedule-prs';\nconst createConfigMigrationPr = 'create-config-migration-pr';\nconst configMigrationPrInfo = 'config-migration-pr-info';\nconst rebaseAllOpenPrs = 'rebase-all-open-prs';\n\nfunction getMarkdownComment(comment: string): string {\n return `<!-- ${comment} -->`;\n}\n\nfunction isBoxChecked(issueBody: string, type: string): boolean {\n return issueBody.includes(getCheckbox(type, true));\n}\n\nfunction isBoxUnchecked(issueBody: string, type: string): boolean {\n return issueBody.includes(getCheckbox(type));\n}\n\nfunction getCheckbox(type: string, checked = false): string {\n return ` - [${checked ? 'x' : ' '}] ${getMarkdownComment(type)}`;\n}\n\nfunction checkOpenAllRateLimitedPR(issueBody: string): boolean {\n return isBoxChecked(issueBody, createAllRateLimitedPrs);\n}\n\nfunction checkOpenAllAwaitingSchedulePR(issueBody: string): boolean {\n return isBoxChecked(issueBody, createAllAwaitingSchedulePrs);\n}\n\nfunction checkApproveAllPendingPR(issueBody: string): boolean {\n return isBoxChecked(issueBody, approveAllPendingPrs);\n}\n\nfunction checkRebaseAll(issueBody: string): boolean {\n return isBoxChecked(issueBody, rebaseAllOpenPrs);\n}\n\nfunction getConfigMigrationCheckboxState(\n issueBody: string,\n): 'no-checkbox' | 'checked' | 'unchecked' | 'migration-pr-exists' {\n if (issueBody.includes(getMarkdownComment(configMigrationPrInfo))) {\n return 'migration-pr-exists';\n }\n\n if (isBoxChecked(issueBody, createConfigMigrationPr)) {\n return 'checked';\n }\n\n if (isBoxUnchecked(issueBody, createConfigMigrationPr)) {\n return 'unchecked';\n }\n\n return 'no-checkbox';\n}\n\nfunction selectAllRelevantBranches(issueBody: string): string[] {\n const checkedBranches = [];\n if (checkOpenAllRateLimitedPR(issueBody)) {\n for (const match of issueBody.matchAll(rateLimitedRe)) {\n checkedBranches.push(match[0]);\n }\n }\n if (checkOpenAllAwaitingSchedulePR(issueBody)) {\n for (const match of issueBody.matchAll(awaitingScheduleRe)) {\n checkedBranches.push(match[0]);\n }\n }\n if (checkApproveAllPendingPR(issueBody)) {\n for (const match of issueBody.matchAll(pendingApprovalRe)) {\n checkedBranches.push(match[0]);\n }\n }\n return checkedBranches;\n}\n\nfunction getAllSelectedBranches(\n issueBody: string,\n dependencyDashboardChecks: Record<string, string>,\n): Record<string, string> {\n const allRelevantBranches = selectAllRelevantBranches(issueBody);\n for (const branch of allRelevantBranches) {\n const [, type, branchName] = generalBranchRe.exec(branch)!;\n dependencyDashboardChecks[branchName] = type;\n }\n return dependencyDashboardChecks;\n}\n\nfunction getCheckedBranches(issueBody: string): Record<string, string> {\n let dependencyDashboardChecks: Record<string, string> = {};\n for (const [, type, branchName] of issueBody.matchAll(markedBranchesRe)) {\n dependencyDashboardChecks[branchName] = type;\n }\n dependencyDashboardChecks = getAllSelectedBranches(\n issueBody,\n dependencyDashboardChecks,\n );\n return dependencyDashboardChecks;\n}\n\nfunction parseDashboardIssue(issueBody: string): DependencyDashboard {\n const dependencyDashboardChecks = getCheckedBranches(issueBody);\n const dependencyDashboardRebaseAllOpen = checkRebaseAll(issueBody);\n const dependencyDashboardAllAwaitingSchedule =\n checkOpenAllAwaitingSchedulePR(issueBody);\n const dependencyDashboardAllPending = checkApproveAllPendingPR(issueBody);\n const dependencyDashboardAllRateLimited =\n checkOpenAllRateLimitedPR(issueBody);\n dependencyDashboardChecks.configMigrationCheckboxState =\n getConfigMigrationCheckboxState(issueBody);\n return {\n dependencyDashboardChecks,\n dependencyDashboardRebaseAllOpen,\n dependencyDashboardAllAwaitingSchedule,\n dependencyDashboardAllPending,\n dependencyDashboardAllRateLimited,\n };\n}\n\nexport async function readDashboardBody(\n config: SelectAllConfig,\n): Promise<void> {\n let dashboardChecks: DependencyDashboard = {\n dependencyDashboardChecks: {},\n dependencyDashboardRebaseAllOpen: false,\n dependencyDashboardAllAwaitingSchedule: false,\n dependencyDashboardAllPending: false,\n dependencyDashboardAllRateLimited: false,\n };\n const stringifiedConfig = JSON.stringify(config);\n if (\n config.dependencyDashboard === true ||\n stringifiedConfig.includes('\"dependencyDashboardApproval\":true') ||\n stringifiedConfig.includes('\"prCreation\":\"approval\"')\n ) {\n config.dependencyDashboardTitle =\n config.dependencyDashboardTitle ?? `Dependency Dashboard`;\n const issue = await platform.findIssue(config.dependencyDashboardTitle);\n if (issue) {\n config.dependencyDashboardIssue = issue.number;\n dashboardChecks = parseDashboardIssue(issue.body ?? '');\n }\n }\n\n if (config.checkedBranches) {\n const checkedBranchesRec: Record<string, string> = Object.fromEntries(\n config.checkedBranches.map((branchName) => [branchName, 'global-config']),\n );\n dashboardChecks.dependencyDashboardChecks = {\n ...dashboardChecks.dependencyDashboardChecks,\n ...checkedBranchesRec,\n };\n }\n\n Object.assign(config, dashboardChecks);\n}\n\nfunction formatAsMarkdownLink(name: string, url?: string | null): string {\n return url ? `[${name}](${url})` : `\\`${name}\\``;\n}\n\nfunction getListItem(branch: BranchConfig, type: string): string {\n let item = getCheckbox(`${type}-branch=${branch.branchName}`);\n if (branch.prNo) {\n // TODO: types (#22198)\n item += `[${branch.prTitle!}](../pull/${branch.prNo})`;\n } else {\n item += branch.prTitle;\n }\n const uniquePackages = [\n // TODO: types (#22198)\n ...new Set(branch.upgrades.map((upgrade) => `\\`${upgrade.depName!}\\``)),\n ];\n if (uniquePackages.length < 2) {\n return item + '\\n';\n }\n return item + ' (' + uniquePackages.join(', ') + ')\\n';\n}\n\nfunction splitBranchesByCategory(filteredBranches: BranchConfig[]): {\n categories: Record<string, BranchConfig[]>;\n uncategorized: BranchConfig[];\n hasCategorized: boolean;\n hasUncategorized: boolean;\n} {\n const categories: Record<string, BranchConfig[]> = {};\n const uncategorized: BranchConfig[] = [];\n let hasCategorized = false;\n let hasUncategorized = false;\n for (const branch of filteredBranches) {\n if (branch.dependencyDashboardCategory) {\n categories[branch.dependencyDashboardCategory] ??= [];\n categories[branch.dependencyDashboardCategory].push(branch);\n hasCategorized = true;\n continue;\n }\n uncategorized.push(branch);\n hasUncategorized = true;\n }\n return { categories, uncategorized, hasCategorized, hasUncategorized };\n}\n\nfunction getBranchList(branches: BranchConfig[], listItemType: string): string {\n return branches\n .map((branch: BranchConfig): string => getListItem(branch, listItemType))\n .join('');\n}\n\nfunction getBranchesListMd(\n branches: BranchConfig[],\n predicate: (\n value: BranchConfig,\n index: number,\n array: BranchConfig[],\n ) => unknown,\n title: string,\n description: string,\n listItemType = 'approvePr',\n bulkComment?: string,\n bulkMessage?: string,\n bulkIcon?: '🔐',\n): string {\n const filteredBranches = branches.filter(predicate);\n if (filteredBranches.length === 0) {\n return '';\n }\n let result = `## ${title}\\n\\n${description}\\n\\n`;\n const { categories, uncategorized, hasCategorized, hasUncategorized } =\n splitBranchesByCategory(filteredBranches);\n if (hasCategorized) {\n for (const [category, branches] of Object.entries(categories).sort(\n ([keyA], [keyB]) =>\n keyA.localeCompare(keyB, undefined, { numeric: true }),\n )) {\n result = result.trimEnd() + '\\n\\n';\n result += `### ${category}\\n\\n`;\n result += getBranchList(branches, listItemType);\n }\n if (hasUncategorized) {\n result = result.trimEnd() + '\\n\\n';\n result += `### Others`;\n }\n }\n result = result.trimEnd() + '\\n\\n';\n result += getBranchList(uncategorized, listItemType);\n\n if (bulkComment && bulkMessage && filteredBranches.length > 1) {\n if (hasCategorized) {\n result = result.trimEnd() + '\\n\\n';\n result += '### All\\n\\n';\n }\n result += getCheckbox(bulkComment);\n result += `${bulkIcon ? bulkIcon + ' ' : ''}**${bulkMessage}**${bulkIcon ? ' ' + bulkIcon : ''}`;\n }\n return result.trimEnd() + '\\n\\n';\n}\n\nfunction appendRepoProblems(config: RenovateConfig, issueBody: string): string {\n let newIssueBody = issueBody;\n const repoProblems = extractRepoProblems(config.repository);\n if (repoProblems.size) {\n newIssueBody += '## Repository Problems\\n\\n';\n const repoProblemsHeader =\n config.customizeDashboard?.repoProblemsHeader ??\n 'Renovate tried to run on this repository, but found these problems.';\n newIssueBody += template.compile(repoProblemsHeader, config) + '\\n\\n';\n\n for (const repoProblem of repoProblems) {\n newIssueBody += ` - ${repoProblem}\\n`;\n }\n newIssueBody += '\\n';\n }\n return newIssueBody;\n}\n\nexport async function ensureDependencyDashboard(\n config: SelectAllConfig,\n allBranches: BranchConfig[],\n packageFiles: Record<string, PackageFile[]> = {},\n configMigrationRes: ConfigMigrationResult,\n): Promise<void> {\n logger.debug('ensureDependencyDashboard()');\n if (config.mode === 'silent') {\n logger.debug(\n 'Dependency Dashboard issue is not created, updated or closed when mode=silent',\n );\n return;\n }\n // legacy/migrated issue\n const reuseTitle = 'Update Dependencies (Renovate Bot)';\n const branches = allBranches.filter(\n (branch) =>\n branch.result !== 'automerged' &&\n !branch.upgrades?.every((upgrade) => upgrade.remediationNotPossible),\n );\n if (\n !(\n config.dependencyDashboard === true ||\n config.dependencyDashboardApproval === true ||\n config.packageRules?.some((rule) => rule.dependencyDashboardApproval) ===\n true ||\n branches.some(\n (branch) =>\n !!branch.dependencyDashboardApproval ||\n !!branch.dependencyDashboardPrApproval,\n )\n )\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would close Dependency Dashboard',\n );\n } else {\n logger.debug('Closing Dependency Dashboard');\n await platform.ensureIssueClosing(config.dependencyDashboardTitle!);\n }\n return;\n }\n // istanbul ignore if\n if (config.repoIsOnboarded === false) {\n logger.debug('Repo is onboarding - skipping dependency dashboard');\n return;\n }\n logger.debug('Ensuring Dependency Dashboard');\n\n // Check packageFiles for any deprecations or replacements\n let hasDeprecationsOrReplacements = false;\n const deprecatedPackages: Record<\n string,\n Record<string, { hasReplacement: boolean; sourceUrl?: string | null }>\n > = {};\n logger.debug('Checking packageFiles for deprecated or replacement packages');\n if (isNonEmptyObject(packageFiles)) {\n for (const [manager, fileNames] of Object.entries(packageFiles)) {\n for (const fileName of fileNames) {\n for (const dep of fileName.deps) {\n const name = dep.packageName ?? dep.depName;\n const hasReplacement = !!dep.updates?.find(\n (updates) => updates.updateType === 'replacement',\n );\n if (name && (dep.deprecationMessage ?? hasReplacement)) {\n hasDeprecationsOrReplacements = true;\n deprecatedPackages[manager] ??= {};\n deprecatedPackages[manager][name] ??= {\n hasReplacement,\n sourceUrl: dep.sourceUrl,\n };\n }\n }\n }\n }\n }\n\n const hasBranches = isNonEmptyArray(branches);\n if (\n config.dependencyDashboardAutoclose &&\n !hasBranches &&\n !hasDeprecationsOrReplacements\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would close Dependency Dashboard',\n );\n } else {\n logger.debug('Closing Dependency Dashboard');\n await platform.ensureIssueClosing(config.dependencyDashboardTitle!);\n }\n return;\n }\n let issueBody = '';\n\n if (config.dependencyDashboardHeader?.length) {\n issueBody +=\n template.compile(config.dependencyDashboardHeader, config) + '\\n\\n';\n }\n\n if (configMigrationRes.result === 'pr-exists') {\n issueBody +=\n '## Config Migration Needed\\n\\n' +\n getMarkdownComment(configMigrationPrInfo) +\n ` See Config Migration PR: #${configMigrationRes.prNumber}.\\n\\n`;\n } else if (configMigrationRes?.result === 'pr-modified') {\n issueBody +=\n '## Config Migration Needed (Blocked)\\n\\n' +\n getMarkdownComment(configMigrationPrInfo) +\n ` The Config Migration branch exists but has been modified by another user. Renovate will not push to this branch unless it is first deleted. \\n\\n See Config Migration PR: #${configMigrationRes.prNumber}.\\n\\n`;\n } else if (configMigrationRes?.result === 'add-checkbox') {\n issueBody +=\n '## Config Migration Needed\\n\\n' +\n getCheckbox(createConfigMigrationPr) +\n ' Select this checkbox to let Renovate create an automated Config Migration PR.' +\n '\\n\\n';\n }\n\n issueBody = appendRepoProblems(config, issueBody);\n\n if (hasDeprecationsOrReplacements) {\n issueBody += '## Deprecations / Replacements\\n';\n issueBody += emojify('> :warning: **Warning**\\n> \\n');\n issueBody +=\n 'These dependencies are either deprecated or have replacements available:\\n\\n';\n issueBody += '| Datasource | Package | Replacement PR? |\\n';\n issueBody += '|------------|------|--------------|\\n';\n for (const manager of Object.keys(deprecatedPackages).sort()) {\n const deps = deprecatedPackages[manager];\n for (const depName of Object.keys(deps).sort()) {\n const { hasReplacement, sourceUrl } = deps[depName];\n const packageName = formatAsMarkdownLink(depName, sourceUrl);\n\n issueBody += `| ${manager} | ${packageName} | ${\n hasReplacement\n ? ''\n : ''\n } |\\n`;\n }\n }\n issueBody += '\\n';\n }\n\n if (config.dependencyDashboardReportAbandonment) {\n issueBody += getAbandonedPackagesMd(packageFiles);\n }\n\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'needs-approval',\n 'Pending Approval',\n 'The following branches are pending approval. To create them, click on a checkbox below.',\n 'approve',\n approveAllPendingPrs,\n 'Create all pending approval PRs at once',\n '🔐',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'minimum-group-size-not-met',\n 'Group Size Not Met',\n 'The following branches have not met their minimum group size. To create them, click on a checkbox below.',\n 'approveGroup',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'not-scheduled',\n 'Awaiting Schedule',\n 'The following updates are awaiting their schedule. To get an update now, click on a checkbox below.',\n 'unschedule',\n createAllAwaitingSchedulePrs,\n 'Create all awaiting schedule PRs at once',\n '🔐',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) =>\n branch.result === 'branch-limit-reached' ||\n branch.result === 'pr-limit-reached' ||\n branch.result === 'commit-limit-reached',\n 'Rate-Limited',\n 'The following updates are currently rate-limited. To force their creation now, click on a checkbox below.',\n 'unlimit',\n createAllRateLimitedPrs,\n 'Create all rate-limited PRs at once',\n '🔐',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'error',\n 'Errored',\n 'The following updates encountered an error and will be retried. To force a retry now, click on a checkbox below.',\n 'retry',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'needs-pr-approval',\n 'PR Creation Approval Required',\n 'The following branches exist but PR creation requires approval. To approve PR creation, click on a checkbox below.',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'pr-edited',\n 'PR Edited (Blocked)',\n 'The following updates have been manually edited so Renovate will no longer make changes. To discard all commits and start over, click on a checkbox below.',\n 'rebase',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'pending',\n 'Pending Status Checks',\n 'The following updates await pending status checks. To force their creation now, click on a checkbox below.',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.prBlockedBy === 'BranchAutomerge',\n 'Pending Branch Automerge',\n 'The following updates await pending status checks before automerging. To abort the branch automerge and create a PR instead, click on a checkbox below.',\n );\n\n const warn = getDepWarningsDashboard(packageFiles, config);\n if (warn) {\n issueBody += warn;\n issueBody += '\\n';\n }\n\n const otherRes = [\n 'pending',\n 'needs-approval',\n 'needs-pr-approval',\n 'not-scheduled',\n 'pr-limit-reached',\n 'commit-limit-reached',\n 'branch-limit-reached',\n 'already-existed',\n 'error',\n 'automerged',\n 'pr-edited',\n 'minimum-group-size-not-met',\n ];\n const inProgress = branches.filter(\n (branch) =>\n !otherRes.includes(branch.result!) &&\n branch.prBlockedBy !== 'BranchAutomerge',\n );\n issueBody += getBranchesListMd(\n inProgress,\n (branch) => !!branch.prBlockedBy || !branch.prNo,\n 'Other Branches',\n 'The following updates are pending. To force the creation of a PR, click on a checkbox below.',\n 'other',\n );\n issueBody += getBranchesListMd(\n inProgress,\n (branch) => branch.prNo && !branch.prBlockedBy,\n 'Open',\n 'The following updates have all been created. To force a retry/rebase of any, click on a checkbox below.',\n 'rebase',\n rebaseAllOpenPrs,\n 'Click on this checkbox to rebase all open PRs at once',\n );\n\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'already-existed',\n 'PR Closed (Blocked)',\n 'The following updates are blocked by an existing closed PR. To recreate the PR, click on a checkbox below.',\n 'recreate',\n );\n\n if (!hasBranches) {\n issueBody +=\n 'This repository currently has no open or pending branches.\\n\\n';\n }\n\n // add CVE section\n issueBody += await getDashboardMarkdownVulnerabilities(config, packageFiles);\n\n // fit the detected dependencies section\n const footer = getFooter(config);\n issueBody += PackageFiles.getDashboardMarkdown(\n platform.maxBodyLength() - issueBody.length - footer.length,\n );\n\n issueBody += footer;\n\n if (config.dependencyDashboardIssue) {\n // If we're not changing the dashboard issue, then we can skip checking if the user changed it.\n // The cached issue we get back here will reflect its state at the _start_ of our run\n const cachedIssue = await platform.getIssue?.(\n config.dependencyDashboardIssue,\n );\n if (cachedIssue?.body === issueBody) {\n logger.debug('No changes to dependency dashboard issue needed');\n return;\n }\n\n // Skip cache when getting the issue to ensure we get the latest body,\n // including any updates the user made after we started the run\n const updatedIssue = await platform.getIssue?.(\n config.dependencyDashboardIssue,\n false,\n );\n if (updatedIssue) {\n const { dependencyDashboardChecks } = parseDashboardIssue(\n coerceString(updatedIssue.body),\n );\n for (const branchName of Object.keys(config.dependencyDashboardChecks!)) {\n delete dependencyDashboardChecks[branchName];\n }\n for (const branchName of Object.keys(dependencyDashboardChecks)) {\n const checkText = getCheckbox(\n `${dependencyDashboardChecks[branchName]}-branch=${branchName}`,\n );\n issueBody = issueBody.replace(\n checkText,\n checkText.replace('[ ]', '[x]'),\n );\n }\n }\n }\n\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would ensure Dependency Dashboard',\n );\n } else {\n await platform.ensureIssue({\n title: config.dependencyDashboardTitle!,\n reuseTitle,\n body: platform.massageMarkdown(issueBody, config.rebaseLabel),\n labels: config.dependencyDashboardLabels,\n confidential: config.confidential,\n });\n }\n}\n\nexport function getAbandonedPackagesMd(\n packageFiles: Record<string, PackageFile[]>,\n): string {\n const abandonedPackages: Record<\n string,\n Record<\n string,\n { mostRecentTimestamp?: string | null; sourceUrl?: string | null }\n >\n > = {};\n let abandonedCount = 0;\n\n for (const [manager, managerPackageFiles] of Object.entries(packageFiles)) {\n for (const packageFile of managerPackageFiles) {\n for (const dep of coerceArray(packageFile.deps)) {\n if (dep.depName && dep.isAbandoned) {\n abandonedCount++;\n abandonedPackages[manager] = abandonedPackages[manager] || {};\n abandonedPackages[manager][dep.depName] = {\n mostRecentTimestamp: dep.mostRecentTimestamp,\n sourceUrl: dep.sourceUrl,\n };\n }\n }\n }\n }\n\n if (abandonedCount === 0) {\n return '';\n }\n\n let abandonedMd = emojify(\n '## Abandoned Dependencies\\n\\n> :information_source: **Note**\\n> \\n',\n );\n\n abandonedMd +=\n 'Packages are marked as abandoned when they exceed the [`abandonmentThreshold`](https://docs.renovatebot.com/configuration-options/#abandonmentthreshold) since their last release. ';\n abandonedMd +=\n 'Unlike deprecated packages with official notices, abandonment is detected by release inactivity.\\n> \\n';\n\n abandonedMd +=\n '> These dependencies have not received updates for an extended period and may be unmaintained:\\n\\n';\n\n abandonedMd += '<details>\\n';\n abandonedMd += `<summary>View abandoned dependencies (${abandonedCount})</summary>\\n\\n`;\n abandonedMd += '| Datasource | Package | Last Updated |\\n';\n abandonedMd += '|------------|------|-------------|\\n';\n\n for (const manager of Object.keys(abandonedPackages).sort()) {\n const deps = abandonedPackages[manager];\n for (const depName of Object.keys(deps).sort()) {\n const { mostRecentTimestamp, sourceUrl } = deps[depName];\n const formattedDate = mostRecentTimestamp\n ? DateTime.fromISO(mostRecentTimestamp).toFormat('yyyy-MM-dd')\n : 'unknown';\n const packageName = formatAsMarkdownLink(depName, sourceUrl);\n abandonedMd += `| ${manager} | ${packageName} | \\`${formattedDate}\\` |\\n`;\n }\n }\n\n abandonedMd += '\\n</details>\\n\\n\\n';\n\n return abandonedMd;\n}\n\nfunction getFooter(config: RenovateConfig): string {\n let footer = '';\n if (config.dependencyDashboardFooter?.length) {\n footer +=\n '---\\n' +\n template.compile(config.dependencyDashboardFooter, config) +\n '\\n';\n }\n\n return footer;\n}\n\nexport async function getDashboardMarkdownVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<string> {\n let result = '';\n\n if (\n isNullOrUndefined(config.dependencyDashboardOSVVulnerabilitySummary) ||\n config.dependencyDashboardOSVVulnerabilitySummary === 'none'\n ) {\n return result;\n }\n\n result += '## Vulnerabilities\\n\\n';\n\n const vulnerabilityFetcher = await Vulnerabilities.create();\n const vulnerabilities = await vulnerabilityFetcher.fetchVulnerabilities(\n config,\n packageFiles,\n );\n\n if (vulnerabilities.length === 0) {\n result +=\n 'Renovate has not found any CVEs on [osv.dev](https://osv.dev).\\n\\n';\n return result;\n }\n\n const unresolvedVulnerabilities = vulnerabilities.filter((value) =>\n isNullOrUndefined(value.fixedVersion),\n );\n const resolvedVulnerabilitiesLength =\n vulnerabilities.length - unresolvedVulnerabilities.length;\n\n result += emojify('> :exclamation: **Important**\\n> \\n');\n result += `> \\`${resolvedVulnerabilitiesLength}\\`/\\`${vulnerabilities.length}\\``;\n if (isTruthy(config.osvVulnerabilityAlerts)) {\n result += ' CVEs have Renovate fixes.\\n\\n';\n } else {\n result +=\n ' CVEs have possible Renovate fixes.\\n> See [`osvVulnerabilityAlerts`](https://docs.renovatebot.com/configuration-options/#osvvulnerabilityalerts) to allow Renovate to supply fixes.\\n\\n';\n }\n\n let renderedVulnerabilities: Vulnerability[];\n switch (config.dependencyDashboardOSVVulnerabilitySummary) {\n // filter vulnerabilities to display based on configuration\n case 'unresolved':\n renderedVulnerabilities = unresolvedVulnerabilities;\n break;\n default:\n renderedVulnerabilities = vulnerabilities;\n }\n\n const managerRecords: Record<\n string,\n Record<string, Record<string, Vulnerability[]>>\n > = {};\n for (const vulnerability of renderedVulnerabilities) {\n const { manager, packageFile } = vulnerability.packageFileConfig;\n if (isNullOrUndefined(managerRecords[manager!])) {\n managerRecords[manager!] = {};\n }\n if (isNullOrUndefined(managerRecords[manager!][packageFile])) {\n managerRecords[manager!][packageFile] = {};\n }\n if (\n isNullOrUndefined(\n managerRecords[manager!][packageFile][vulnerability.packageName],\n )\n ) {\n managerRecords[manager!][packageFile][vulnerability.packageName] = [];\n }\n managerRecords[manager!][packageFile][vulnerability.packageName].push(\n vulnerability,\n );\n }\n\n for (const [manager, packageFileRecords] of Object.entries(managerRecords)) {\n result += `<details><summary>${manager}</summary>\\n<blockquote>\\n\\n`;\n for (const [packageFile, packageNameRecords] of Object.entries(\n packageFileRecords,\n )) {\n result += `<details><summary>${packageFile}</summary>\\n<blockquote>\\n\\n`;\n for (const [packageName, cves] of Object.entries(packageNameRecords)) {\n result += `<details><summary>${packageName}</summary>\\n<blockquote>\\n\\n`;\n for (const vul of cves) {\n const id = vul.vulnerability.id;\n const suffix = isNonEmptyString(vul.fixedVersion)\n ? ` (fixed in ${vul.fixedVersion})`\n : '';\n result += `- [${id}](https://osv.dev/vulnerability/${id})${suffix}\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n\n return result;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/workers/repository/update/pr/index.ts"],"sourcesContent":["import { isArray, isNonEmptyArray, isNumber } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport {\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_CHANGED,\n} from '../../../../constants/error-messages.ts';\nimport { pkg } from '../../../../expose.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { ensureComment } from '../../../../modules/platform/comment.ts';\nimport type {\n PlatformPrOptions,\n Pr,\n PrDebugData,\n UpdatePrConfig,\n} from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport {\n getPrBodyStruct,\n hashBody,\n} from '../../../../modules/platform/pr-body.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getElapsedHours } from '../../../../util/date.ts';\nimport { stripEmojis } from '../../../../util/emoji.ts';\nimport { fingerprint } from '../../../../util/fingerprint.ts';\nimport { getBranchLastCommitTime } from '../../../../util/git/index.ts';\nimport { memoize } from '../../../../util/memoize.ts';\nimport { incCountValue, isLimitReached } from '../../../global/limits.ts';\nimport type {\n BranchConfig,\n BranchUpgradeConfig,\n PrBlockedBy,\n} from '../../../types.ts';\nimport { embedChangelogs } from '../../changelog/index.ts';\nimport { resolveBranchStatus } from '../branch/status-checks.ts';\nimport { getPrBody } from './body/index.ts';\nimport {\n getChangedLabels,\n prepareLabels,\n shouldUpdateLabels,\n} from './labels.ts';\nimport { addParticipants } from './participants.ts';\nimport { getPrCache, setPrCache } from './pr-cache.ts';\nimport {\n generatePrBodyFingerprintConfig,\n validatePrCache,\n} from './pr-fingerprint.ts';\nimport { tryReuseAutoclosedPr } from './pr-reuse.ts';\n\nexport function getPlatformPrOptions(\n config: RenovateConfig & PlatformPrOptions,\n): PlatformPrOptions {\n const usePlatformAutomerge = Boolean(\n config.automerge &&\n (config.automergeType === 'pr' || config.automergeType === 'branch') &&\n config.platformAutomerge,\n );\n\n return {\n autoApprove: !!config.autoApprove,\n automergeStrategy: config.automergeStrategy,\n azureWorkItemId: config.azureWorkItemId ?? 0,\n bbAutoResolvePrTasks: !!config.bbAutoResolvePrTasks,\n bbUseDefaultReviewers: !!config.bbUseDefaultReviewers,\n gitLabIgnoreApprovals: !!config.gitLabIgnoreApprovals,\n forkModeDisallowMaintainerEdits: !!config.forkModeDisallowMaintainerEdits,\n usePlatformAutomerge,\n };\n}\n\nexport interface ResultWithPr {\n type: 'with-pr';\n pr: Pr;\n}\n\nexport interface ResultWithoutPr {\n type: 'without-pr';\n prBlockedBy: PrBlockedBy;\n}\n\nexport type EnsurePrResult = ResultWithPr | ResultWithoutPr;\n\nexport function updatePrDebugData(\n targetBranch: string,\n labels: string[],\n debugData: PrDebugData | undefined,\n): PrDebugData {\n const createdByRenovateVersion = debugData?.createdInVer ?? pkg.version;\n const updatedByRenovateVersion = pkg.version;\n\n const updatedPrDebugData: PrDebugData = {\n createdInVer: createdByRenovateVersion,\n updatedInVer: updatedByRenovateVersion,\n targetBranch,\n };\n\n // Add labels to the debug data object.\n // When to add:\n // 1. Add it when a new PR is created, i.e., when debugData is undefined.\n // 2. Add it if an existing PR already has labels in the debug data, confirming that we can update its labels.\n if (!debugData || isArray(debugData.labels)) {\n updatedPrDebugData.labels = labels;\n }\n\n return updatedPrDebugData;\n}\n\nfunction hasNotIgnoredReviewers(pr: Pr, config: BranchConfig): boolean {\n if (\n isNonEmptyArray(config.ignoreReviewers) &&\n isNonEmptyArray(pr.reviewers)\n ) {\n const ignoreReviewers = new Set(config.ignoreReviewers);\n return (\n pr.reviewers.filter((reviewer) => !ignoreReviewers.has(reviewer)).length >\n 0\n );\n }\n return isNonEmptyArray(pr.reviewers);\n}\n\nfunction addPullRequestNoteIfAttestationHasBeenLost(\n upgrade: BranchUpgradeConfig,\n): void {\n const { packageName, depName, currentVersion, newVersion } = upgrade;\n const name = packageName ?? depName;\n\n const currentRelease = upgrade.releases?.find(\n (release) => release.version === currentVersion,\n );\n const newRelease = upgrade.releases?.find(\n (release) => release.version === newVersion,\n );\n\n if (\n currentRelease &&\n newRelease &&\n currentRelease.attestation === true &&\n newRelease.attestation !== true\n ) {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n [\n '> :stop_sign: **Caution**',\n '>',\n `> ${name} ${currentVersion} was released with an attestation, but ${newVersion} has no attestation.`,\n `> Verify that release ${newVersion} was published by the expected author.`,\n '\\n',\n ].join('\\n'),\n );\n }\n}\n\n// Ensures that PR exists with matching title/body\nexport async function ensurePr(\n prConfig: BranchConfig,\n): Promise<EnsurePrResult> {\n const config: BranchConfig = { ...prConfig };\n const filteredPrConfig = generatePrBodyFingerprintConfig(config);\n const prBodyFingerprint = fingerprint(filteredPrConfig);\n logger.trace({ config }, 'ensurePr');\n // If there is a group, it will use the config of the first upgrade in the array\n const {\n branchName,\n ignoreTests,\n internalChecksAsSuccess,\n prTitle = '',\n upgrades,\n } = config;\n const getBranchStatus = memoize(() =>\n resolveBranchStatus(branchName, !!internalChecksAsSuccess, ignoreTests),\n );\n const dependencyDashboardCheck =\n config.dependencyDashboardChecks?.[config.branchName];\n // Check if PR already exists\n const existingPr =\n (await platform.getBranchPr(branchName, config.baseBranch)) ??\n (await tryReuseAutoclosedPr(branchName, prTitle));\n const prCache = getPrCache(branchName);\n if (existingPr) {\n logger.debug('Found existing PR');\n if (existingPr.bodyStruct?.rebaseRequested) {\n logger.debug('PR rebase requested, so skipping cache check');\n } else if (prCache) {\n logger.trace({ prCache }, 'Found existing PR cache');\n // return if pr cache is valid and pr was not changed in the past 24hrs\n if (validatePrCache(prCache, prBodyFingerprint)) {\n return { type: 'with-pr', pr: existingPr };\n }\n } else if (config.repositoryCache === 'enabled') {\n logger.debug('PR cache not found');\n }\n }\n config.upgrades = [];\n\n if (config.artifactErrors?.length) {\n logger.debug('Forcing PR because of artifact errors');\n config.forcePr = true;\n }\n\n if (dependencyDashboardCheck === 'approvePr') {\n logger.debug('Forcing PR because of dependency dashboard approval');\n config.forcePr = true;\n }\n\n if (!existingPr) {\n // Only create a PR if a branch automerge has failed\n if (\n config.automerge === true &&\n config.automergeType?.startsWith('branch') &&\n !config.forcePr\n ) {\n logger.debug(`Branch automerge is enabled`);\n if (\n config.stabilityStatus !== 'yellow' &&\n (await getBranchStatus()) === 'yellow' &&\n isNumber(config.prNotPendingHours)\n ) {\n logger.debug('Checking how long this branch has been pending');\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n if (getElapsedHours(lastCommitTime) >= config.prNotPendingHours) {\n logger.debug(\n `Branch exceeds prNotPending=${config.prNotPendingHours}, hours - forcing PR creation`,\n );\n config.forcePr = true;\n }\n }\n if (config.forcePr || (await getBranchStatus()) === 'red') {\n logger.debug(`Branch tests failed, so will create PR`);\n } else {\n // Branch should be automerged, so we don't want to create a PR\n return { type: 'without-pr', prBlockedBy: 'BranchAutomerge' };\n }\n }\n if (config.prCreation === 'status-success') {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) !== 'green') {\n logger.debug(`Branch status isn't green - not creating PR`);\n return { type: 'without-pr', prBlockedBy: 'AwaitingTests' };\n }\n logger.debug('Branch status success');\n } else if (\n config.prCreation === 'approval' &&\n dependencyDashboardCheck !== 'approvePr'\n ) {\n return { type: 'without-pr', prBlockedBy: 'NeedsApproval' };\n } else if (config.prCreation === 'not-pending' && !config.forcePr) {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) === 'yellow') {\n logger.debug(`Branch status is yellow - checking timeout`);\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n const elapsedHours = getElapsedHours(lastCommitTime);\n if (\n !dependencyDashboardCheck &&\n ((config.stabilityStatus && config.stabilityStatus !== 'yellow') ||\n (isNumber(config.prNotPendingHours) &&\n elapsedHours < config.prNotPendingHours))\n ) {\n logger.debug(\n `Branch is ${elapsedHours} hours old - skipping PR creation as prNotPendingHours is set to ${config.prNotPendingHours}`,\n );\n return {\n type: 'without-pr',\n prBlockedBy: 'AwaitingTests',\n };\n }\n const prNotPendingHours = String(config.prNotPendingHours);\n logger.debug(\n `prNotPendingHours=${prNotPendingHours} threshold hit - creating PR`,\n );\n }\n logger.debug('Branch status success');\n }\n }\n\n const processedUpgrades: string[] = [];\n const commitRepos: string[] = [];\n\n function getRepoNameWithSourceDirectory(\n upgrade: BranchUpgradeConfig,\n ): string {\n // TODO: types (#22198)\n return `${upgrade.repoName!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n }\n\n if (config.fetchChangeLogs === 'pr') {\n // fetch changelogs when not already done;\n await embedChangelogs(upgrades);\n }\n\n // Get changelog and then generate template strings\n for (const upgrade of upgrades) {\n // TODO: types (#22198)\n const upgradeKey = `${upgrade.depType!}-${upgrade.depName!}-${upgrade.manager}-${upgrade.currentVersion ?? ''}-${upgrade.currentValue ?? ''}-${upgrade.newVersion ?? ''}-${upgrade.newValue ?? ''}`;\n if (processedUpgrades.includes(upgradeKey)) {\n continue;\n }\n processedUpgrades.push(upgradeKey);\n\n const logJSON = upgrade.logJSON;\n\n if (logJSON) {\n if (typeof logJSON.error === 'undefined') {\n if (logJSON.project) {\n upgrade.repoName = logJSON.project.repository;\n }\n upgrade.hasReleaseNotes = false;\n upgrade.releases = [];\n if (\n logJSON.hasReleaseNotes &&\n upgrade.repoName &&\n !commitRepos.includes(getRepoNameWithSourceDirectory(upgrade))\n ) {\n commitRepos.push(getRepoNameWithSourceDirectory(upgrade));\n upgrade.hasReleaseNotes = logJSON.hasReleaseNotes;\n if (logJSON.versions) {\n for (const version of logJSON.versions) {\n const release = { ...version };\n upgrade.releases.push(release);\n }\n }\n }\n } else if (logJSON.error === 'MissingGithubToken') {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n [\n '> :exclamation: **Important**',\n '> ',\n '> Release Notes retrieval for this PR were skipped because no github.com credentials were available. ',\n '> If you are self-hosted, please see [this instruction](https://github.com/renovatebot/renovate/blob/master/docs/usage/examples/self-hosting.md#githubcom-token-for-release-notes).',\n '\\n',\n ].join('\\n'),\n );\n }\n }\n\n addPullRequestNoteIfAttestationHasBeenLost(upgrade);\n\n config.upgrades.push(upgrade);\n }\n\n config.hasReleaseNotes = config.upgrades.some((upg) => upg.hasReleaseNotes);\n\n const releaseNotesSources: string[] = [];\n for (const upgrade of config.upgrades) {\n let notesSourceUrl = upgrade.releases?.[0]?.releaseNotes?.notesSourceUrl;\n // TODO: types (#22198)\n notesSourceUrl ??= `${upgrade.sourceUrl!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n\n if (upgrade.hasReleaseNotes && notesSourceUrl) {\n if (releaseNotesSources.includes(notesSourceUrl)) {\n logger.debug(\n { depName: upgrade.depName },\n 'Removing duplicate release notes',\n );\n upgrade.hasReleaseNotes = false;\n } else {\n releaseNotesSources.push(notesSourceUrl);\n }\n }\n }\n\n const prBody = getPrBody(\n config,\n {\n debugData: updatePrDebugData(\n config.baseBranch,\n prepareLabels(config), // include labels in debug data\n existingPr?.bodyStruct?.debugData,\n ),\n },\n config,\n );\n\n try {\n if (existingPr) {\n logger.debug('Processing existing PR');\n\n if (\n !existingPr.hasAssignees &&\n !hasNotIgnoredReviewers(existingPr, config) &&\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) === 'red'\n ) {\n logger.debug(`Setting assignees and reviewers as status checks failed`);\n await addParticipants(config, existingPr);\n }\n // Check if existing PR needs updating\n const existingPrTitle = stripEmojis(existingPr.title);\n const existingPrBodyHash = existingPr.bodyStruct?.hash;\n const newPrTitle = stripEmojis(prTitle);\n const newPrBodyHash = hashBody(prBody);\n\n const prInitialLabels = existingPr.bodyStruct?.debugData?.labels;\n const prCurrentLabels = existingPr.labels;\n const configuredLabels = prepareLabels(config);\n\n const labelsNeedUpdate = shouldUpdateLabels(\n prInitialLabels,\n prCurrentLabels,\n configuredLabels,\n );\n\n if (\n existingPr?.targetBranch === config.baseBranch &&\n existingPrTitle === newPrTitle &&\n existingPrBodyHash === newPrBodyHash &&\n !labelsNeedUpdate\n ) {\n // adds or-cache for existing PRs\n setPrCache(branchName, prBodyFingerprint, false);\n logger.debug(\n `Pull Request #${existingPr.number} does not need updating`,\n );\n return { type: 'with-pr', pr: existingPr };\n }\n\n const updatePrConfig: UpdatePrConfig = {\n number: existingPr.number,\n prTitle,\n prBody,\n platformPrOptions: getPlatformPrOptions(config),\n };\n // PR must need updating\n if (existingPr?.targetBranch !== config.baseBranch) {\n logger.debug(\n {\n branchName,\n oldBaseBranch: existingPr?.targetBranch,\n newBaseBranch: config.baseBranch,\n },\n 'PR base branch has changed',\n );\n updatePrConfig.targetBranch = config.baseBranch;\n }\n\n if (labelsNeedUpdate) {\n logger.debug(\n {\n branchName,\n prCurrentLabels,\n configuredLabels,\n },\n 'PR labels have changed',\n );\n\n // Divide labels into three categories:\n // i) addLabels: Labels that need to be added\n // ii) removeLabels: Labels that need to be removed\n // iii) labels: New labels for the PR, replacing the old labels array entirely.\n // This distinction is necessary because different platforms update labels differently\n // For more details, refer to the updatePr function of each platform.\n\n const [addLabels, removeLabels] = getChangedLabels(\n prCurrentLabels,\n configuredLabels,\n );\n\n // for Gitea\n updatePrConfig.labels = configuredLabels;\n\n // for GitHub, GitLab\n updatePrConfig.addLabels = addLabels;\n updatePrConfig.removeLabels = removeLabels;\n }\n if (existingPrTitle !== newPrTitle) {\n logger.debug(\n {\n branchName,\n oldPrTitle: existingPr.title,\n newPrTitle: prTitle,\n },\n 'PR title changed',\n );\n } else if (!config.committedFiles && !config.rebaseRequested) {\n logger.debug(\n {\n prTitle,\n },\n 'PR body changed',\n );\n }\n\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would update PR #${existingPr.number}`);\n return { type: 'with-pr', pr: existingPr };\n } else {\n await platform.updatePr(updatePrConfig);\n logger.info({ pr: existingPr.number, prTitle }, `PR updated`);\n setPrCache(branchName, prBodyFingerprint, true);\n }\n return {\n type: 'with-pr',\n pr: {\n ...existingPr,\n bodyStruct: getPrBodyStruct(prBody),\n title: prTitle,\n targetBranch: config.baseBranch,\n },\n };\n }\n logger.debug({ branch: branchName, prTitle }, `Creating PR`);\n if (config.updateType === 'rollback') {\n logger.info('Creating Rollback PR');\n }\n let pr: Pr | null;\n if (GlobalConfig.get('dryRun')) {\n logger.info('DRY-RUN: Would create PR: ' + prTitle);\n pr = { number: 0 } as never;\n } else {\n try {\n if (\n !dependencyDashboardCheck &&\n isLimitReached('ConcurrentPRs', prConfig) &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Skipping PR - limit reached');\n return { type: 'without-pr', prBlockedBy: 'RateLimited' };\n }\n pr = await platform.createPr({\n sourceBranch: branchName,\n targetBranch: config.baseBranch,\n prTitle,\n prBody,\n labels: prepareLabels(config),\n platformPrOptions: getPlatformPrOptions(config),\n draftPR: !!config.draftPR,\n milestone: config.milestone,\n });\n\n incCountValue('ConcurrentPRs');\n incCountValue('HourlyPRs');\n logger.info({ pr: pr?.number, prTitle }, 'PR created');\n } catch (err) {\n logger.debug({ err }, 'Pull request creation error');\n if (\n err.body?.message === 'Validation failed' &&\n err.body.errors?.length &&\n err.body.errors.some((error: { message?: string }) =>\n error.message?.startsWith('A pull request already exists'),\n )\n ) {\n logger.warn('A pull requests already exists');\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n if (err.statusCode === 502) {\n logger.warn(\n { branch: branchName },\n 'Deleting branch due to server error',\n );\n await scm.deleteBranch(branchName);\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n }\n if (\n pr &&\n config.branchAutomergeFailureMessage &&\n !config.suppressNotifications?.includes('branchAutomergeFailure')\n ) {\n const topic = 'Branch automerge failure';\n let content =\n 'This PR was configured for branch automerge. However, this is not possible, so it has been raised as a PR instead.';\n if (config.branchAutomergeFailureMessage === 'branch status error') {\n content += '\\n___\\n * Branch has one or more failed status checks';\n }\n content = platform.massageMarkdown(content, config.rebaseLabel);\n logger.debug('Adding branch automerge failure message to PR');\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would add comment to PR #${pr.number}`);\n } else {\n await ensureComment({\n number: pr.number,\n topic,\n content,\n });\n }\n }\n // Skip assign and review if automerging PR\n if (pr) {\n if (\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) !== 'red'\n ) {\n logger.debug(\n `Skipping assignees and reviewers as automerge=${config.automerge}`,\n );\n } else {\n await addParticipants(config, pr);\n }\n setPrCache(branchName, prBodyFingerprint, true);\n logger.debug(`Created Pull Request #${pr.number}`);\n return { type: 'with-pr', pr };\n }\n } catch (err) {\n if (\n err instanceof ExternalHostError ||\n err.message === REPOSITORY_CHANGED ||\n err.message === PLATFORM_RATE_LIMIT_EXCEEDED ||\n err.message === PLATFORM_INTEGRATION_UNAUTHORIZED\n ) {\n logger.debug('Passing error up');\n throw err;\n }\n logger.warn({ err, prTitle }, 'Failed to ensure PR');\n }\n if (existingPr) {\n return { type: 'with-pr', pr: existingPr };\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/workers/repository/update/pr/index.ts"],"sourcesContent":["import { isArray, isNonEmptyArray, isNumber } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport {\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_CHANGED,\n} from '../../../../constants/error-messages.ts';\nimport { pkg } from '../../../../expose.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { ensureComment } from '../../../../modules/platform/comment.ts';\nimport type {\n PlatformPrOptions,\n Pr,\n PrDebugData,\n UpdatePrConfig,\n} from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport {\n getPrBodyStruct,\n hashBody,\n} from '../../../../modules/platform/pr-body.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getElapsedHours } from '../../../../util/date.ts';\nimport { stripEmojis } from '../../../../util/emoji.ts';\nimport { fingerprint } from '../../../../util/fingerprint.ts';\nimport { getBranchLastCommitTime } from '../../../../util/git/index.ts';\nimport { memoize } from '../../../../util/memoize.ts';\nimport { incCountValue, isLimitReached } from '../../../global/limits.ts';\nimport type {\n BranchConfig,\n BranchUpgradeConfig,\n PrBlockedBy,\n} from '../../../types.ts';\nimport { embedChangelogs } from '../../changelog/index.ts';\nimport { resolveBranchStatus } from '../branch/status-checks.ts';\nimport { getPrBody } from './body/index.ts';\nimport {\n getChangedLabels,\n prepareLabels,\n shouldUpdateLabels,\n} from './labels.ts';\nimport { addParticipants } from './participants.ts';\nimport { getPrCache, setPrCache } from './pr-cache.ts';\nimport {\n generatePrBodyFingerprintConfig,\n validatePrCache,\n} from './pr-fingerprint.ts';\nimport { tryReuseAutoclosedPr } from './pr-reuse.ts';\n\nexport function getPlatformPrOptions(\n config: RenovateConfig & PlatformPrOptions,\n): PlatformPrOptions {\n const usePlatformAutomerge = Boolean(\n config.automerge &&\n (config.automergeType === 'pr' || config.automergeType === 'branch') &&\n config.platformAutomerge,\n );\n\n return {\n autoApprove: !!config.autoApprove,\n automergeStrategy: config.automergeStrategy,\n azureWorkItemId: config.azureWorkItemId ?? 0,\n bbAutoResolvePrTasks: !!config.bbAutoResolvePrTasks,\n bbUseDefaultReviewers: !!config.bbUseDefaultReviewers,\n gitLabIgnoreApprovals: !!config.gitLabIgnoreApprovals,\n forkModeDisallowMaintainerEdits: !!config.forkModeDisallowMaintainerEdits,\n usePlatformAutomerge,\n };\n}\n\nexport interface ResultWithPr {\n type: 'with-pr';\n pr: Pr;\n}\n\nexport interface ResultWithoutPr {\n type: 'without-pr';\n prBlockedBy: PrBlockedBy;\n}\n\nexport type EnsurePrResult = ResultWithPr | ResultWithoutPr;\n\nexport function updatePrDebugData(\n targetBranch: string,\n labels: string[],\n debugData: PrDebugData | undefined,\n): PrDebugData {\n const createdByRenovateVersion = debugData?.createdInVer ?? pkg.version;\n const updatedByRenovateVersion = pkg.version;\n\n const updatedPrDebugData: PrDebugData = {\n createdInVer: createdByRenovateVersion,\n updatedInVer: updatedByRenovateVersion,\n targetBranch,\n };\n\n // Add labels to the debug data object.\n // When to add:\n // 1. Add it when a new PR is created, i.e., when debugData is undefined.\n // 2. Add it if an existing PR already has labels in the debug data, confirming that we can update its labels.\n if (!debugData || isArray(debugData.labels)) {\n updatedPrDebugData.labels = labels;\n }\n\n return updatedPrDebugData;\n}\n\nfunction hasNotIgnoredReviewers(pr: Pr, config: BranchConfig): boolean {\n if (\n isNonEmptyArray(config.ignoreReviewers) &&\n isNonEmptyArray(pr.reviewers)\n ) {\n const ignoreReviewers = new Set(config.ignoreReviewers);\n return (\n pr.reviewers.filter((reviewer) => !ignoreReviewers.has(reviewer)).length >\n 0\n );\n }\n return isNonEmptyArray(pr.reviewers);\n}\n\nfunction addPullRequestNoteIfAttestationHasBeenLost(\n upgrade: BranchUpgradeConfig,\n): void {\n const { packageName, depName, currentVersion, newVersion } = upgrade;\n const name = packageName ?? depName;\n\n const currentRelease = upgrade.releases?.find(\n (release) => release.version === currentVersion,\n );\n const newRelease = upgrade.releases?.find(\n (release) => release.version === newVersion,\n );\n\n if (\n currentRelease &&\n newRelease &&\n currentRelease.attestation === true &&\n newRelease.attestation !== true\n ) {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n [\n '> :stop_sign: **Caution**',\n '>',\n `> ${name} ${currentVersion} was released with an attestation, but ${newVersion} has no attestation.`,\n `> Verify that release ${newVersion} was published by the expected author.`,\n '\\n',\n ].join('\\n'),\n );\n }\n}\n\n// Ensures that PR exists with matching title/body\nexport async function ensurePr(\n prConfig: BranchConfig,\n): Promise<EnsurePrResult> {\n const config: BranchConfig = { ...prConfig };\n const filteredPrConfig = generatePrBodyFingerprintConfig(config);\n const prBodyFingerprint = fingerprint(filteredPrConfig);\n logger.trace({ config }, 'ensurePr');\n // If there is a group, it will use the config of the first upgrade in the array\n const {\n branchName,\n ignoreTests,\n internalChecksAsSuccess,\n prTitle = '',\n upgrades,\n } = config;\n const getBranchStatus = memoize(() =>\n resolveBranchStatus(branchName, !!internalChecksAsSuccess, ignoreTests),\n );\n const dependencyDashboardCheck =\n config.dependencyDashboardChecks?.[config.branchName];\n // Check if PR already exists\n const existingPr =\n (await platform.getBranchPr(branchName, config.baseBranch)) ??\n (await tryReuseAutoclosedPr(branchName, prTitle));\n const prCache = getPrCache(branchName);\n if (existingPr) {\n logger.debug('Found existing PR');\n if (existingPr.bodyStruct?.rebaseRequested) {\n logger.debug('PR rebase requested, so skipping cache check');\n } else if (prCache) {\n logger.trace({ prCache }, 'Found existing PR cache');\n // return if pr cache is valid and pr was not changed in the past 24hrs\n if (validatePrCache(prCache, prBodyFingerprint)) {\n return { type: 'with-pr', pr: existingPr };\n }\n } else if (config.repositoryCache === 'enabled') {\n logger.debug('PR cache not found');\n }\n }\n config.upgrades = [];\n\n if (config.artifactErrors?.length) {\n logger.debug('Forcing PR because of artifact errors');\n config.forcePr = true;\n }\n\n if (dependencyDashboardCheck === 'approvePr') {\n logger.debug('Forcing PR because of dependency dashboard approval');\n config.forcePr = true;\n }\n\n if (!existingPr) {\n // Only create a PR if a branch automerge has failed\n if (\n config.automerge === true &&\n config.automergeType?.startsWith('branch') &&\n !config.forcePr\n ) {\n logger.debug(`Branch automerge is enabled`);\n if (\n config.stabilityStatus !== 'yellow' &&\n (await getBranchStatus()) === 'yellow' &&\n isNumber(config.prNotPendingHours)\n ) {\n logger.debug('Checking how long this branch has been pending');\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n if (getElapsedHours(lastCommitTime) >= config.prNotPendingHours) {\n logger.debug(\n `Branch exceeds prNotPending=${config.prNotPendingHours}, hours - forcing PR creation`,\n );\n config.forcePr = true;\n }\n }\n if (config.forcePr || (await getBranchStatus()) === 'red') {\n logger.debug(`Branch tests failed, so will create PR`);\n } else {\n // Branch should be automerged, so we don't want to create a PR\n return { type: 'without-pr', prBlockedBy: 'BranchAutomerge' };\n }\n }\n if (config.prCreation === 'status-success') {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) !== 'green') {\n logger.debug(`Branch status isn't green - not creating PR`);\n return { type: 'without-pr', prBlockedBy: 'AwaitingTests' };\n }\n logger.debug('Branch status success');\n } else if (\n config.prCreation === 'approval' &&\n dependencyDashboardCheck !== 'approvePr'\n ) {\n return { type: 'without-pr', prBlockedBy: 'NeedsApproval' };\n } else if (config.prCreation === 'not-pending' && !config.forcePr) {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) === 'yellow') {\n logger.debug(`Branch status is yellow - checking timeout`);\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n const elapsedHours = getElapsedHours(lastCommitTime);\n if (\n !dependencyDashboardCheck &&\n ((config.stabilityStatus && config.stabilityStatus !== 'yellow') ||\n (isNumber(config.prNotPendingHours) &&\n elapsedHours < config.prNotPendingHours))\n ) {\n logger.debug(\n `Branch is ${elapsedHours} hours old - skipping PR creation as prNotPendingHours is set to ${config.prNotPendingHours}`,\n );\n return {\n type: 'without-pr',\n prBlockedBy: 'AwaitingTests',\n };\n }\n const prNotPendingHours = String(config.prNotPendingHours);\n logger.debug(\n `prNotPendingHours=${prNotPendingHours} threshold hit - creating PR`,\n );\n }\n logger.debug('Branch status success');\n }\n }\n\n const processedUpgrades: string[] = [];\n const commitRepos: string[] = [];\n\n function getRepoNameWithSourceDirectory(\n upgrade: BranchUpgradeConfig,\n ): string {\n // TODO: types (#22198)\n return `${upgrade.repoName!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n }\n\n if (config.fetchChangeLogs === 'pr') {\n // fetch changelogs when not already done;\n await embedChangelogs(upgrades);\n }\n\n // Get changelog and then generate template strings\n for (const upgrade of upgrades) {\n // TODO: types (#22198)\n const upgradeKey = `${upgrade.depType!}-${upgrade.depName!}-${upgrade.manager}-${upgrade.currentVersion ?? ''}-${upgrade.currentValue ?? ''}-${upgrade.newVersion ?? ''}-${upgrade.newValue ?? ''}`;\n if (processedUpgrades.includes(upgradeKey)) {\n continue;\n }\n processedUpgrades.push(upgradeKey);\n\n const logJSON = upgrade.logJSON;\n\n if (logJSON) {\n if (typeof logJSON.error === 'undefined') {\n if (logJSON.project) {\n upgrade.repoName = logJSON.project.repository;\n }\n upgrade.hasReleaseNotes = false;\n upgrade.releases = [];\n if (\n logJSON.hasReleaseNotes &&\n upgrade.repoName &&\n !commitRepos.includes(getRepoNameWithSourceDirectory(upgrade))\n ) {\n commitRepos.push(getRepoNameWithSourceDirectory(upgrade));\n upgrade.hasReleaseNotes = logJSON.hasReleaseNotes;\n if (logJSON.versions) {\n for (const version of logJSON.versions) {\n const release = { ...version };\n upgrade.releases.push(release);\n }\n }\n }\n } else if (logJSON.error === 'MissingGithubToken') {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n [\n '> :exclamation: **Important**',\n '> ',\n '> Release Notes retrieval for this PR were skipped because no github.com credentials were available. ',\n '> If you are self-hosted, please see [this instruction](https://github.com/renovatebot/renovate/blob/master/docs/usage/examples/self-hosting.md#githubcom-token-for-release-notes).',\n '\\n',\n ].join('\\n'),\n );\n }\n }\n\n addPullRequestNoteIfAttestationHasBeenLost(upgrade);\n\n config.upgrades.push(upgrade);\n }\n\n config.hasReleaseNotes = config.upgrades.some((upg) => upg.hasReleaseNotes);\n\n const releaseNotesSources: string[] = [];\n for (const upgrade of config.upgrades) {\n let notesSourceUrl = upgrade.releases?.[0]?.releaseNotes?.notesSourceUrl;\n // TODO: types (#22198)\n notesSourceUrl ??= `${upgrade.sourceUrl!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n\n if (upgrade.hasReleaseNotes && notesSourceUrl) {\n if (releaseNotesSources.includes(notesSourceUrl)) {\n logger.debug(\n { depName: upgrade.depName },\n 'Removing duplicate release notes',\n );\n upgrade.hasReleaseNotes = false;\n } else {\n releaseNotesSources.push(notesSourceUrl);\n }\n }\n }\n\n const prBody = getPrBody(\n config,\n {\n debugData: updatePrDebugData(\n config.baseBranch,\n prepareLabels(config), // include labels in debug data\n existingPr?.bodyStruct?.debugData,\n ),\n },\n config,\n );\n\n try {\n if (existingPr) {\n logger.debug('Processing existing PR');\n\n if (\n !existingPr.hasAssignees &&\n !hasNotIgnoredReviewers(existingPr, config) &&\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) === 'red'\n ) {\n logger.debug(`Setting assignees and reviewers as status checks failed`);\n await addParticipants(config, existingPr);\n }\n // Check if existing PR needs updating\n const existingPrTitle = stripEmojis(existingPr.title);\n const existingPrBodyHash = existingPr.bodyStruct?.hash;\n const newPrTitle = stripEmojis(prTitle);\n const newPrBodyHash = hashBody(prBody);\n\n const prInitialLabels = existingPr.bodyStruct?.debugData?.labels;\n const prCurrentLabels = existingPr.labels;\n const configuredLabels = prepareLabels(config);\n\n const labelsNeedUpdate = shouldUpdateLabels(\n prInitialLabels,\n prCurrentLabels,\n configuredLabels,\n );\n\n if (\n existingPr?.targetBranch === config.baseBranch &&\n existingPrTitle === newPrTitle &&\n existingPrBodyHash === newPrBodyHash &&\n !labelsNeedUpdate\n ) {\n // adds or-cache for existing PRs\n setPrCache(branchName, prBodyFingerprint, false);\n logger.debug(\n `Pull Request #${existingPr.number} does not need updating`,\n );\n return { type: 'with-pr', pr: existingPr };\n }\n\n const updatePrConfig: UpdatePrConfig = {\n number: existingPr.number,\n prTitle,\n prBody,\n platformPrOptions: getPlatformPrOptions(config),\n };\n // PR must need updating\n if (existingPr?.targetBranch !== config.baseBranch) {\n logger.debug(\n {\n branchName,\n oldBaseBranch: existingPr?.targetBranch,\n newBaseBranch: config.baseBranch,\n },\n 'PR base branch has changed',\n );\n updatePrConfig.targetBranch = config.baseBranch;\n }\n\n if (labelsNeedUpdate) {\n logger.debug(\n {\n branchName,\n prCurrentLabels,\n configuredLabels,\n },\n 'PR labels have changed',\n );\n\n // Divide labels into three categories:\n // i) addLabels: Labels that need to be added\n // ii) removeLabels: Labels that need to be removed\n // iii) labels: New labels for the PR, replacing the old labels array entirely.\n // This distinction is necessary because different platforms update labels differently\n // For more details, refer to the updatePr function of each platform.\n\n const [addLabels, removeLabels] = getChangedLabels(\n prCurrentLabels,\n configuredLabels,\n );\n\n // for Gitea\n updatePrConfig.labels = configuredLabels;\n\n // for GitHub, GitLab\n updatePrConfig.addLabels = addLabels;\n updatePrConfig.removeLabels = removeLabels;\n }\n if (existingPrTitle !== newPrTitle) {\n logger.debug(\n {\n branchName,\n oldPrTitle: existingPr.title,\n newPrTitle: prTitle,\n },\n 'PR title changed',\n );\n } else if (!config.committedFiles && !config.rebaseRequested) {\n logger.debug(\n {\n prTitle,\n },\n 'PR body changed',\n );\n }\n\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would update PR #${existingPr.number}`);\n return { type: 'with-pr', pr: existingPr };\n } else {\n await platform.updatePr(updatePrConfig);\n logger.info({ pr: existingPr.number, prTitle }, `PR updated`);\n setPrCache(branchName, prBodyFingerprint, true);\n }\n return {\n type: 'with-pr',\n pr: {\n ...existingPr,\n bodyStruct: getPrBodyStruct(prBody),\n title: prTitle,\n targetBranch: config.baseBranch,\n },\n };\n }\n logger.debug({ branch: branchName, prTitle }, `Creating PR`);\n if (config.updateType === 'rollback') {\n logger.info('Creating Rollback PR');\n }\n let pr: Pr | null;\n if (GlobalConfig.get('dryRun')) {\n logger.info('DRY-RUN: Would create PR: ' + prTitle);\n pr = { number: 0 } as never;\n } else {\n try {\n if (\n !dependencyDashboardCheck &&\n isLimitReached('ConcurrentPRs', prConfig) &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Skipping PR - limit reached');\n return { type: 'without-pr', prBlockedBy: 'RateLimited' };\n }\n pr = await platform.createPr({\n sourceBranch: branchName,\n targetBranch: config.baseBranch,\n prTitle,\n prBody,\n labels: prepareLabels(config),\n platformPrOptions: getPlatformPrOptions(config),\n draftPR: !!config.draftPR,\n milestone: config.milestone,\n });\n\n incCountValue('ConcurrentPRs');\n incCountValue('HourlyPRs');\n logger.info({ pr: pr?.number, prTitle }, 'PR created');\n } catch (err) {\n logger.debug({ err }, 'Pull request creation error');\n if (\n err.body?.message === 'Validation failed' &&\n err.body.errors?.length &&\n err.body.errors.some((error: { message?: string }) =>\n error.message?.startsWith('A pull request already exists'),\n )\n ) {\n logger.warn('A pull requests already exists');\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n if (err.statusCode === 502) {\n logger.warn(\n { branch: branchName },\n 'Deleting branch due to server error',\n );\n await scm.deleteBranch(branchName);\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n }\n if (\n pr &&\n config.branchAutomergeFailureMessage &&\n !config.suppressNotifications?.includes('branchAutomergeFailure')\n ) {\n const topic = 'Branch automerge failure';\n let content =\n 'This PR was configured for branch automerge. However, this is not possible, so it has been raised as a PR instead.';\n if (config.branchAutomergeFailureMessage === 'branch status error') {\n content += '\\n___\\n * Branch has one or more failed status checks';\n }\n content = platform.massageMarkdown(content, config.rebaseLabel);\n logger.debug('Adding branch automerge failure message to PR');\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would add comment to PR #${pr.number}`);\n } else {\n await ensureComment({\n number: pr.number,\n topic,\n content,\n });\n }\n }\n // Skip assign and review if automerging PR\n if (pr) {\n if (\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) !== 'red'\n ) {\n logger.debug(\n `Skipping assignees and reviewers as automerge=${config.automerge}`,\n );\n } else {\n await addParticipants(config, pr);\n }\n setPrCache(branchName, prBodyFingerprint, true);\n logger.debug(`Created Pull Request #${pr.number}`);\n return { type: 'with-pr', pr };\n }\n } catch (err) {\n if (\n err instanceof ExternalHostError ||\n err.message === REPOSITORY_CHANGED ||\n err.message === PLATFORM_RATE_LIMIT_EXCEEDED ||\n err.message === PLATFORM_INTEGRATION_UNAUTHORIZED\n ) {\n logger.debug('Passing error up');\n throw err;\n }\n logger.warn({ err, prTitle }, 'Failed to ensure PR');\n }\n if (existingPr) {\n return { type: 'with-pr', pr: existingPr };\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,SAAgB,qBACd,QACmB;CACnB,MAAM,uBAAuB,QAC3B,OAAO,cACN,OAAO,kBAAkB,QAAQ,OAAO,kBAAkB,aAC3D,OAAO,kBACR;AAED,QAAO;EACL,aAAa,CAAC,CAAC,OAAO;EACtB,mBAAmB,OAAO;EAC1B,iBAAiB,OAAO,mBAAmB;EAC3C,sBAAsB,CAAC,CAAC,OAAO;EAC/B,uBAAuB,CAAC,CAAC,OAAO;EAChC,uBAAuB,CAAC,CAAC,OAAO;EAChC,iCAAiC,CAAC,CAAC,OAAO;EAC1C;EACD;;AAeH,SAAgB,kBACd,cACA,QACA,WACa;CAIb,MAAM,qBAAkC;EACtC,cAJ+B,WAAW,gBAAgB,IAAI;EAK9D,cAJ+B,IAAI;EAKnC;EACD;AAMD,KAAI,CAAC,aAAa,QAAQ,UAAU,OAAO,CACzC,oBAAmB,SAAS;AAG9B,QAAO;;AAGT,SAAS,uBAAuB,IAAQ,QAA+B;AACrE,KACE,gBAAgB,OAAO,gBAAgB,IACvC,gBAAgB,GAAG,UAAU,EAC7B;EACA,MAAM,kBAAkB,IAAI,IAAI,OAAO,gBAAgB;AACvD,SACE,GAAG,UAAU,QAAQ,aAAa,CAAC,gBAAgB,IAAI,SAAS,CAAC,CAAC,SAClE;;AAGJ,QAAO,gBAAgB,GAAG,UAAU;;AAGtC,SAAS,2CACP,SACM;CACN,MAAM,EAAE,aAAa,SAAS,gBAAgB,eAAe;CAC7D,MAAM,OAAO,eAAe;CAE5B,MAAM,iBAAiB,QAAQ,UAAU,MACtC,YAAY,QAAQ,YAAY,eAClC;CACD,MAAM,aAAa,QAAQ,UAAU,MAClC,YAAY,QAAQ,YAAY,WAClC;AAED,KACE,kBACA,cACA,eAAe,gBAAgB,QAC/B,WAAW,gBAAgB,MAC3B;AACA,UAAQ,gBAAgB,EAAE;AAC1B,UAAQ,YAAY,KAClB;GACE;GACA;GACA,KAAK,KAAK,GAAG,eAAe,yCAAyC,WAAW;GAChF,yBAAyB,WAAW;GACpC;GACD,CAAC,KAAK,KAAK,CACb;;;AAKL,eAAsB,SACpB,UACyB;CACzB,MAAM,SAAuB,EAAE,GAAG,UAAU;CAE5C,MAAM,oBAAoB,YADD,gCAAgC,OAAO,CACT;AACvD,QAAO,MAAM,EAAE,QAAQ,EAAE,WAAW;CAEpC,MAAM,EACJ,YACA,aACA,yBACA,UAAU,IACV,aACE;CACJ,MAAM,kBAAkB,cACtB,oBAAoB,YAAY,CAAC,CAAC,yBAAyB,YAAY,CACxE;CACD,MAAM,2BACJ,OAAO,4BAA4B,OAAO;CAE5C,MAAM,aACH,MAAM,SAAS,YAAY,YAAY,OAAO,WAAW,IACzD,MAAM,qBAAqB,YAAY,QAAQ;CAClD,MAAM,UAAU,WAAW,WAAW;AACtC,KAAI,YAAY;AACd,SAAO,MAAM,oBAAoB;AACjC,MAAI,WAAW,YAAY,gBACzB,QAAO,MAAM,+CAA+C;WACnD,SAAS;AAClB,UAAO,MAAM,EAAE,SAAS,EAAE,0BAA0B;AAEpD,OAAI,gBAAgB,SAAS,kBAAkB,CAC7C,QAAO;IAAE,MAAM;IAAW,IAAI;IAAY;aAEnC,OAAO,oBAAoB,UACpC,QAAO,MAAM,qBAAqB;;AAGtC,QAAO,WAAW,EAAE;AAEpB,KAAI,OAAO,gBAAgB,QAAQ;AACjC,SAAO,MAAM,wCAAwC;AACrD,SAAO,UAAU;;AAGnB,KAAI,6BAA6B,aAAa;AAC5C,SAAO,MAAM,sDAAsD;AACnE,SAAO,UAAU;;AAGnB,KAAI,CAAC,YAAY;AAEf,MACE,OAAO,cAAc,QACrB,OAAO,eAAe,WAAW,SAAS,IAC1C,CAAC,OAAO,SACR;AACA,UAAO,MAAM,8BAA8B;AAC3C,OACE,OAAO,oBAAoB,YAC1B,MAAM,iBAAiB,KAAM,YAC9B,SAAS,OAAO,kBAAkB,EAClC;AACA,WAAO,MAAM,iDAAiD;AAE9D,QAAI,gBADmB,MAAM,wBAAwB,WAAW,CAC7B,IAAI,OAAO,mBAAmB;AAC/D,YAAO,MACL,+BAA+B,OAAO,kBAAkB,+BACzD;AACD,YAAO,UAAU;;;AAGrB,OAAI,OAAO,WAAY,MAAM,iBAAiB,KAAM,MAClD,QAAO,MAAM,yCAAyC;OAGtD,QAAO;IAAE,MAAM;IAAc,aAAa;IAAmB;;AAGjE,MAAI,OAAO,eAAe,kBAAkB;AAC1C,UAAO,MAAM,kCAAkC;AAC/C,OAAK,MAAM,iBAAiB,KAAM,SAAS;AACzC,WAAO,MAAM,8CAA8C;AAC3D,WAAO;KAAE,MAAM;KAAc,aAAa;KAAiB;;AAE7D,UAAO,MAAM,wBAAwB;aAErC,OAAO,eAAe,cACtB,6BAA6B,YAE7B,QAAO;GAAE,MAAM;GAAc,aAAa;GAAiB;WAClD,OAAO,eAAe,iBAAiB,CAAC,OAAO,SAAS;AACjE,UAAO,MAAM,kCAAkC;AAC/C,OAAK,MAAM,iBAAiB,KAAM,UAAU;AAC1C,WAAO,MAAM,6CAA6C;IAE1D,MAAM,eAAe,gBADE,MAAM,wBAAwB,WAAW,CACZ;AACpD,QACE,CAAC,6BACC,OAAO,mBAAmB,OAAO,oBAAoB,YACpD,SAAS,OAAO,kBAAkB,IACjC,eAAe,OAAO,oBAC1B;AACA,YAAO,MACL,aAAa,aAAa,mEAAmE,OAAO,oBACrG;AACD,YAAO;MACL,MAAM;MACN,aAAa;MACd;;IAEH,MAAM,oBAAoB,OAAO,OAAO,kBAAkB;AAC1D,WAAO,MACL,qBAAqB,kBAAkB,8BACxC;;AAEH,UAAO,MAAM,wBAAwB;;;CAIzC,MAAM,oBAA8B,EAAE;CACtC,MAAM,cAAwB,EAAE;CAEhC,SAAS,+BACP,SACQ;AAER,SAAO,GAAG,QAAQ,WAChB,QAAQ,kBAAkB,IAAI,QAAQ,oBAAoB;;AAI9D,KAAI,OAAO,oBAAoB,KAE7B,OAAM,gBAAgB,SAAS;AAIjC,MAAK,MAAM,WAAW,UAAU;EAE9B,MAAM,aAAa,GAAG,QAAQ,QAAS,GAAG,QAAQ,QAAS,GAAG,QAAQ,QAAQ,GAAG,QAAQ,kBAAkB,GAAG,GAAG,QAAQ,gBAAgB,GAAG,GAAG,QAAQ,cAAc,GAAG,GAAG,QAAQ,YAAY;AAC/L,MAAI,kBAAkB,SAAS,WAAW,CACxC;AAEF,oBAAkB,KAAK,WAAW;EAElC,MAAM,UAAU,QAAQ;AAExB,MAAI,SACF;OAAI,OAAO,QAAQ,UAAU,aAAa;AACxC,QAAI,QAAQ,QACV,SAAQ,WAAW,QAAQ,QAAQ;AAErC,YAAQ,kBAAkB;AAC1B,YAAQ,WAAW,EAAE;AACrB,QACE,QAAQ,mBACR,QAAQ,YACR,CAAC,YAAY,SAAS,+BAA+B,QAAQ,CAAC,EAC9D;AACA,iBAAY,KAAK,+BAA+B,QAAQ,CAAC;AACzD,aAAQ,kBAAkB,QAAQ;AAClC,SAAI,QAAQ,SACV,MAAK,MAAM,WAAW,QAAQ,UAAU;MACtC,MAAM,UAAU,EAAE,GAAG,SAAS;AAC9B,cAAQ,SAAS,KAAK,QAAQ;;;cAI3B,QAAQ,UAAU,sBAAsB;AACjD,YAAQ,gBAAgB,EAAE;AAC1B,YAAQ,YAAY,KAClB;KACE;KACA;KACA;KACA;KACA;KACD,CAAC,KAAK,KAAK,CACb;;;AAIL,6CAA2C,QAAQ;AAEnD,SAAO,SAAS,KAAK,QAAQ;;AAG/B,QAAO,kBAAkB,OAAO,SAAS,MAAM,QAAQ,IAAI,gBAAgB;CAE3E,MAAM,sBAAgC,EAAE;AACxC,MAAK,MAAM,WAAW,OAAO,UAAU;EACrC,IAAI,iBAAiB,QAAQ,WAAW,IAAI,cAAc;AAE1D,qBAAmB,GAAG,QAAQ,YAC5B,QAAQ,kBAAkB,IAAI,QAAQ,oBAAoB;AAG5D,MAAI,QAAQ,mBAAmB,eAC7B,KAAI,oBAAoB,SAAS,eAAe,EAAE;AAChD,UAAO,MACL,EAAE,SAAS,QAAQ,SAAS,EAC5B,mCACD;AACD,WAAQ,kBAAkB;QAE1B,qBAAoB,KAAK,eAAe;;CAK9C,MAAM,SAAS,UACb,QACA,EACE,WAAW,kBACT,OAAO,YACP,cAAc,OAAO,EACrB,YAAY,YAAY,UACzB,EACF,EACD,OACD;AAED,KAAI;AACF,MAAI,YAAY;AACd,UAAO,MAAM,yBAAyB;AAEtC,OACE,CAAC,WAAW,gBACZ,CAAC,uBAAuB,YAAY,OAAO,IAC3C,OAAO,aACP,CAAC,OAAO,mBACP,MAAM,iBAAiB,KAAM,OAC9B;AACA,WAAO,MAAM,0DAA0D;AACvE,UAAM,gBAAgB,QAAQ,WAAW;;GAG3C,MAAM,kBAAkB,YAAY,WAAW,MAAM;GACrD,MAAM,qBAAqB,WAAW,YAAY;GAClD,MAAM,aAAa,YAAY,QAAQ;GACvC,MAAM,gBAAgB,SAAS,OAAO;GAEtC,MAAM,kBAAkB,WAAW,YAAY,WAAW;GAC1D,MAAM,kBAAkB,WAAW;GACnC,MAAM,mBAAmB,cAAc,OAAO;GAE9C,MAAM,mBAAmB,mBACvB,iBACA,iBACA,iBACD;AAED,OACE,YAAY,iBAAiB,OAAO,cACpC,oBAAoB,cACpB,uBAAuB,iBACvB,CAAC,kBACD;AAEA,eAAW,YAAY,mBAAmB,MAAM;AAChD,WAAO,MACL,iBAAiB,WAAW,OAAO,yBACpC;AACD,WAAO;KAAE,MAAM;KAAW,IAAI;KAAY;;GAG5C,MAAM,iBAAiC;IACrC,QAAQ,WAAW;IACnB;IACA;IACA,mBAAmB,qBAAqB,OAAO;IAChD;AAED,OAAI,YAAY,iBAAiB,OAAO,YAAY;AAClD,WAAO,MACL;KACE;KACA,eAAe,YAAY;KAC3B,eAAe,OAAO;KACvB,EACD,6BACD;AACD,mBAAe,eAAe,OAAO;;AAGvC,OAAI,kBAAkB;AACpB,WAAO,MACL;KACE;KACA;KACA;KACD,EACD,yBACD;IASD,MAAM,CAAC,WAAW,gBAAgB,iBAChC,iBACA,iBACD;AAGD,mBAAe,SAAS;AAGxB,mBAAe,YAAY;AAC3B,mBAAe,eAAe;;AAEhC,OAAI,oBAAoB,WACtB,QAAO,MACL;IACE;IACA,YAAY,WAAW;IACvB,YAAY;IACb,EACD,mBACD;YACQ,CAAC,OAAO,kBAAkB,CAAC,OAAO,gBAC3C,QAAO,MACL,EACE,SACD,EACD,kBACD;AAGH,OAAI,aAAa,IAAI,SAAS,EAAE;AAC9B,WAAO,KAAK,6BAA6B,WAAW,SAAS;AAC7D,WAAO;KAAE,MAAM;KAAW,IAAI;KAAY;UACrC;AACL,UAAM,SAAS,SAAS,eAAe;AACvC,WAAO,KAAK;KAAE,IAAI,WAAW;KAAQ;KAAS,EAAE,aAAa;AAC7D,eAAW,YAAY,mBAAmB,KAAK;;AAEjD,UAAO;IACL,MAAM;IACN,IAAI;KACF,GAAG;KACH,YAAY,gBAAgB,OAAO;KACnC,OAAO;KACP,cAAc,OAAO;KACtB;IACF;;AAEH,SAAO,MAAM;GAAE,QAAQ;GAAY;GAAS,EAAE,cAAc;AAC5D,MAAI,OAAO,eAAe,WACxB,QAAO,KAAK,uBAAuB;EAErC,IAAI;AACJ,MAAI,aAAa,IAAI,SAAS,EAAE;AAC9B,UAAO,KAAK,+BAA+B,QAAQ;AACnD,QAAK,EAAE,QAAQ,GAAG;QAElB,KAAI;AACF,OACE,CAAC,4BACD,eAAe,iBAAiB,SAAS,IACzC,CAAC,OAAO,sBACR;AACA,WAAO,MAAM,8BAA8B;AAC3C,WAAO;KAAE,MAAM;KAAc,aAAa;KAAe;;AAE3D,QAAK,MAAM,SAAS,SAAS;IAC3B,cAAc;IACd,cAAc,OAAO;IACrB;IACA;IACA,QAAQ,cAAc,OAAO;IAC7B,mBAAmB,qBAAqB,OAAO;IAC/C,SAAS,CAAC,CAAC,OAAO;IAClB,WAAW,OAAO;IACnB,CAAC;AAEF,iBAAc,gBAAgB;AAC9B,iBAAc,YAAY;AAC1B,UAAO,KAAK;IAAE,IAAI,IAAI;IAAQ;IAAS,EAAE,aAAa;WAC/C,KAAK;AACZ,UAAO,MAAM,EAAE,KAAK,EAAE,8BAA8B;AACpD,OACE,IAAI,MAAM,YAAY,uBACtB,IAAI,KAAK,QAAQ,UACjB,IAAI,KAAK,OAAO,MAAM,UACpB,MAAM,SAAS,WAAW,gCAAgC,CAC3D,EACD;AACA,WAAO,KAAK,iCAAiC;AAC7C,WAAO;KAAE,MAAM;KAAc,aAAa;KAAS;;AAErD,OAAI,IAAI,eAAe,KAAK;AAC1B,WAAO,KACL,EAAE,QAAQ,YAAY,EACtB,sCACD;AACD,UAAM,IAAI,aAAa,WAAW;;AAEpC,UAAO;IAAE,MAAM;IAAc,aAAa;IAAS;;AAGvD,MACE,MACA,OAAO,iCACP,CAAC,OAAO,uBAAuB,SAAS,yBAAyB,EACjE;GACA,MAAM,QAAQ;GACd,IAAI,UACF;AACF,OAAI,OAAO,kCAAkC,sBAC3C,YAAW;AAEb,aAAU,SAAS,gBAAgB,SAAS,OAAO,YAAY;AAC/D,UAAO,MAAM,gDAAgD;AAC7D,OAAI,aAAa,IAAI,SAAS,CAC5B,QAAO,KAAK,qCAAqC,GAAG,SAAS;OAE7D,OAAM,cAAc;IAClB,QAAQ,GAAG;IACX;IACA;IACD,CAAC;;AAIN,MAAI,IAAI;AACN,OACE,OAAO,aACP,CAAC,OAAO,mBACP,MAAM,iBAAiB,KAAM,MAE9B,QAAO,MACL,iDAAiD,OAAO,YACzD;OAED,OAAM,gBAAgB,QAAQ,GAAG;AAEnC,cAAW,YAAY,mBAAmB,KAAK;AAC/C,UAAO,MAAM,yBAAyB,GAAG,SAAS;AAClD,UAAO;IAAE,MAAM;IAAW;IAAI;;UAEzB,KAAK;AACZ,MACE,eAAe,qBACf,IAAI,YAAY,sBAChB,IAAI,YAAY,gCAChB,IAAI,YAAY,mCAChB;AACA,UAAO,MAAM,mBAAmB;AAChC,SAAM;;AAER,SAAO,KAAK;GAAE;GAAK;GAAS,EAAE,sBAAsB;;AAEtD,KAAI,WACF,QAAO;EAAE,MAAM;EAAW,IAAI;EAAY;AAE5C,QAAO;EAAE,MAAM;EAAc,aAAa;EAAS"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "renovate",
|
|
3
3
|
"description": "Automated dependency updates. Flexible so you don't need to be.",
|
|
4
|
-
"version": "43.
|
|
4
|
+
"version": "43.25.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"renovate": "dist/renovate.js",
|
|
@@ -184,7 +184,7 @@
|
|
|
184
184
|
"p-queue": "9.1.0",
|
|
185
185
|
"p-throttle": "8.1.0",
|
|
186
186
|
"parse-link-header": "2.0.0",
|
|
187
|
-
"prettier": "3.
|
|
187
|
+
"prettier": "3.8.1",
|
|
188
188
|
"protobufjs": "8.0.0",
|
|
189
189
|
"punycode": "2.3.1",
|
|
190
190
|
"redis": "5.10.0",
|
package/renovate-schema.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"title": "JSON schema for Renovate 43.
|
|
2
|
+
"title": "JSON schema for Renovate 43.25.0 config files (https://renovatebot.com/)",
|
|
3
3
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
4
|
-
"x-renovate-version": "43.
|
|
4
|
+
"x-renovate-version": "43.25.0",
|
|
5
5
|
"allowComments": true,
|
|
6
6
|
"type": "object",
|
|
7
7
|
"properties": {
|