@baicie/ncu 0.1.17 → 0.1.21
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/build/chunks/src.js +4 -4
- package/build/chunks/src.js.map +1 -1
- package/build/cli.js +1 -1
- package/build/cli.js.map +1 -1
- package/package.json +4 -4
- package/build/chunks/source.js +0 -6
- package/build/chunks/source.js.map +0 -1
package/build/chunks/src.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"src.js","names":["keyValueBy","name","chalkInstance: Record<keyof typeof chalkMethods, ChalkMethod>","keyValueBy","fs","path","exists","fs","getPackageJson","getPackageJson","repositoryMetadata: string | PackageFileRepository | null","URL","type","type","entries","entries","type","entries","path","path","VERSION_PART_DELIM: SemVer","semver","version","i","chalk","v","name","latest","table","fs","getPackageVersion","getRepoUrl","chalk","latest","filterObject","cacheData: CacheData","name","version","linesOut: string[]","wrap","supportedVersionTargets","description","extendedHelpDoctor: ExtendedHelp","chalk","table","extendedHelpFilterResults: ExtendedHelp","extendedHelpFormat: ExtendedHelp","extendedHelpInstall: ExtendedHelp","extendedHelpFilterFunction: ExtendedHelp","extendedHelpFilterVersionFunction: ExtendedHelp","extendedHelpRejectFunction: ExtendedHelp","extendedHelpRejectVersionFunction: ExtendedHelp","extendedHelpGroupFunction: ExtendedHelp","extendedHelpTarget: ExtendedHelp","extendedHelpPackageManager: ExtendedHelp","extendedHelpRegistryType: ExtendedHelp","extendedHelpPeer: ExtendedHelp","extendedHelpCooldown: ExtendedHelp","cliOptions: CLIOption[]","v","fs","files","packageManagerLockfileMap: Index<PackageManagerName>","fs","path","os","global","fs","versionUtil.isPre","satisfiesNodeEngine","minVersion","versionNodeEngine: string | undefined","version","predicates: (((o: Partial<Packument>) => boolean) | null)[]","version","nodeSemver","versionUtil.isWildCard","name","pkg.version","partialPackument: Partial<Packument>","err: any","keyTypes: Index<'boolean' | 'number'>","npmConfig","libnpmconfig","parseJson","packageAuthorChanged","packument: Packument","result: Partial<Packument> | undefined","defaultPrefix","cmd","prefix: string | undefined","e: any","greatest: GetVersion","fields: (keyof Packument)[]","versionUtil.compareVersions","getPeerDependencies","getEngines","list","dependencies","distTag: GetVersion","greatest","latest: GetVersion","distTag","newest: GetVersion","satisfiesNodeEngine","filterObject","versionUtil.isPre","v","minor: GetVersion","versionUtil.findGreatestByLevel","patch: GetVersion","semver: GetVersion","defaultPrefix","list","keyValueBy","name","version","fs","npm.normalizeNpmConfig","list","npm.list","keyValueBy","name","version","getVersion","distTag","npm.distTag","greatest","npm.greatest","latest","npm.latest","minor","npm.minor","newest","npm.newest","patch","npm.patch","semver","npm.semver","type","npmConfig","fs","exists","yarnConfigLocal: YarnConfig","yarnConfigUser: YarnConfig","npmConfig: Index<string | boolean>","dependencies: Index<ParsedDep>","name","getVersion","npm.distTag","greatest","npm.greatest","latest","npm.latest","minor","npm.minor","newest","npm.newest","patch","npm.patch","semver","npm.semver","version","npm.parseJson","npm.getEngines","npm.packageAuthorChanged","chalk","pkg: PackageFile","pkgFile: string","fs","depAliases: Index<keyof PackageFile>","name","escapeRegexp","fs","upgradeCatalogData","fs","version","resolveDepSections","name","print","chalk","spawnPnpm","spawnYarn","spawnBun","spawnNpm","packageInfo: PackageInfo","loadPackageInfoFromFile","lockFileName: 'package-lock.json' | 'yarn.lock' | 'pnpm-lock.yaml' | 'bun.lock' | 'bun.lockb'","allDependencies: Index<VersionSpec>","groups: string[]","fs","e","upgrades: Index<VersionSpec>","run","name: string","version: VersionSpec","name","version","upgradePackageData","pkgFile","chalk","fs","pnpmWorkspaceFile: string","fs","catalogDependencies: Index<VersionSpec>","packageData: PackageFile & {\n catalog?: Index<VersionSpec>\n catalogs?: Index<Index<VersionSpec>>\n workspaces?: string[] | { packages: string[]; catalog?: Index<VersionSpec>; catalogs?: Index<Index<VersionSpec>> }\n }","findPackage","workspacePackageGlob: string[]","allWorkspacePackageFilepaths: string[]","allWorkspacePackageInfos: PackageInfo[]","info: PackageInfo","loadPackageInfoFromFile","allWorkspacePackageNames: string[]","catalogPackageFile: PackageFile","useWorkspaces: boolean","packageInfos: PackageInfo[]","catalogPackageInfo: PackageInfo | null","global","config: Options","name","tags: Index<string>","path","name","versionUtil.fixPseudoVersion","versionUtil.compareVersions","latest: GetVersion","versionUtil.isPre","v","versionUtil.upgradeGitHubUrl","greatest: GetVersion","version","versionUtil.findGreatestByLevel","semver: GetVersion","path","content: string","fs","latest: GetVersion","cliOptions","moduleDefaults: Options","options: Options","description","value","exists","target: Target","packageManager","determinePackageManager","resolvedOptions: Options","packageManagers","resolvedOptionsFiltered: Options","keyValueBy","options1: Options","options2: Options","predicate: (name: string, versionSpec?: string) => boolean","identity","version","name","packageManagers","getPackageManager","filterAndReject","filteredPackages: Index<VersionSpec>","filterObject","version","err: any","nextQueue: string[][]","path","name","packageManager","getPackageManager","bar: ProgressBar","version","dependencies: Index<string>","dependencies","accum: Index<Index<string>>","getPackageManager","bar: ProgressBar | undefined","name","version","distTag","versionResult: VersionResult","packageManager","packageManagers","getPackageVersion","err: any","keyValueBy","index","dependencies","wildcard","semver","latest","version","filterObject","getPreferredWildcard","versionUtil.DEFAULT_WILDCARD","versionUtil.upgradeDependencyDeclaration","latest","versionUtil.isNpmAlias","versionUtil.parseNpmAlias","versionUtil.isGitHubUrl","versionUtil.getGitHubUrlTag","versionUtil.stringify","downgrade: boolean","versionUtil.isPre","name","isUpgradeable","versionUtil.upgradeNpmAlias","versionUtil.upgradeGitHubUrl","queryVersions","keyValueBy","result","upgradeDependencies","result: UpgradePackageDefinitionsResult","getPeerDependenciesFromRegistry","checkPeerViolationResult: CheckIfInPeerViolationResult","globalPackages: Index<string>","getInstalledPackages","e: any","latest","upgradePackageDefinitions","chalk","semver","name","version","resolveDepSections","filterObject","filteredDependencies: Index<VersionSpec>","filterAndReject","err: any","packageManager","getPackageManager","bar: ProgressBar","version","upgradePackageDefinitions","getEnginesNodeFromRegistry","keyValueBy","upgradePackageDefinitions","getPeerDependenciesFromRegistry","errors: ParseError[]","parse","packageManager","getPackageManager","chosenDeps: string[]","keyValueBy","pkg: PackageFile","e: any","getCurrentDependencies","getPeerDependenciesFromRegistry","nodeSemver","upgradePackageDefinitions","latest","version","getIgnoredUpgradesDueToPeerDeps","upgradePackageData","output: PackageFile | Index<VersionSpec>","resolveDepSections","fs","chalk","installOptions: Options","determinePackageManager","analysisNormalized: Index<PackageFile>","packageManager","chalk","cmd","err: any","getAllPackages","packageFilepaths: string[]","analysis: Index<PackageFile> | PackageFile | void","analysis","runGlobal","getNcuRc","mergeOptions","pkgOptions: Options","pkgData: string | null","pkgFile: string","indexKey: string","findPackage","initOptions","timeout: NodeJS.Timeout | undefined","timeoutPromise: Promise<void>","doctor"],"sources":["../../package.json","../../src/lib/keyValueBy.ts","../../src/lib/chalk.ts","../../src/lib/filterObject.ts","../../src/lib/exists.ts","../../src/lib/getPackageJson.ts","../../src/lib/getPackageVersion.ts","../../src/lib/getRepoUrl.ts","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isArray.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_freeGlobal.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_root.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Symbol.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getRawTag.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_objectToString.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseGetTag.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isObjectLike.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isSymbol.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isKey.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isObject.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isFunction.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_coreJsData.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isMasked.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_toSource.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsNative.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getValue.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getNative.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_nativeCreate.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashClear.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashDelete.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashGet.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashHas.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashSet.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Hash.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheClear.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/eq.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_assocIndexOf.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheDelete.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheGet.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheHas.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheSet.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_ListCache.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Map.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheClear.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isKeyable.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getMapData.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheDelete.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheGet.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheHas.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheSet.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_MapCache.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/memoize.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_memoizeCapped.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_stringToPath.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayMap.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseToString.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toString.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_castPath.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_toKey.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseGet.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/propertyOf.js","../../src/lib/sortBy.ts","../../src/lib/version-util.ts","../../src/lib/logging.ts","../../src/lib/cache.ts","../../src/lib/wrap.ts","../../src/lib/table.ts","../../src/cli-options.ts","../../src/lib/findLockfile.ts","../../src/lib/determinePackageManager.ts","../../src/lib/figgy-pudding/index.js","../../src/lib/libnpmconfig/index.js","../../src/package-managers/filters.ts","../../src/package-managers/npm.ts","../../src/package-managers/bun.ts","../../src/package-managers/pnpm.ts","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/identity.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_WeakMap.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_metaMap.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseSetData.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseCreate.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createCtor.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createBind.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_apply.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_composeArgs.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_composeArgsRight.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_countHolders.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseLodash.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_LazyWrapper.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/noop.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getData.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_realNames.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getFuncName.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_LodashWrapper.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_copyArray.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_wrapperClone.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/wrapperLodash.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isLaziable.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_shortOut.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_setData.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getWrapDetails.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_insertWrapDetails.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/constant.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_defineProperty.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseSetToString.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_setToString.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayEach.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseFindIndex.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsNaN.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_strictIndexOf.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIndexOf.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayIncludes.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_updateWrapDetails.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_setWrapToString.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createRecurry.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getHolder.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isIndex.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_reorder.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_replaceHolders.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createHybrid.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createCurry.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createPartial.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mergeData.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_trimmedEndIndex.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseTrim.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toNumber.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toFinite.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toInteger.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createWrap.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/curry.js","../../src/package-managers/yarn.ts","../../src/lib/programError.ts","../../src/lib/loadPackageInfoFromFile.ts","../../src/lib/resolveDepSections.ts","../../src/lib/upgradeCatalogData.ts","../../src/lib/upgradePackageData.ts","../../src/lib/doctor.ts","../../src/lib/findPackage.ts","../../src/lib/getAllPackages.ts","../../src/lib/getNcuRc.ts","../../src/package-managers/gitTags.ts","../../src/package-managers/staticRegistry.ts","../../src/package-managers/index.ts","../../src/lib/initOptions.ts","../../src/lib/mergeOptions.ts","../../src/lib/filterAndReject.ts","../../src/lib/getPackageManager.ts","../../src/lib/getInstalledPackages.ts","../../src/lib/getPeerDependenciesFromRegistry.ts","../../src/lib/pick.ts","../../src/types/Target.ts","../../src/lib/queryVersions.ts","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayPush.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsArguments.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isArguments.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isFlattenable.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseFlatten.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/flatten.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_overRest.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_flatRest.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createFlow.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/flow.js","../../src/lib/getPreferredWildcard.ts","../../src/lib/isUpgradeable.ts","../../src/lib/upgradeDependencies.ts","../../src/lib/upgradePackageDefinitions.ts","../../src/lib/runGlobal.ts","../../src/lib/getCurrentDependencies.ts","../../src/lib/getEnginesNodeFromRegistry.ts","../../src/lib/getIgnoredUpgradesDueToEnginesNode.ts","../../src/lib/getIgnoredUpgradesDueToPeerDeps.ts","../../src/lib/utils/parseJson.ts","../../src/lib/runLocal.ts","../../src/lib/defineConfig.ts","../../src/index.ts"],"sourcesContent":["","import { Index } from '../types/IndexType'\n\ntype KeyValueGenerator<K, V, R> = (key: K, value: V, accum: Index<R>) => Index<R> | null\ntype ArrayKeyValueGenerator<T, R> = KeyValueGenerator<T, number, R>\ntype ObjectKeyValueGenerator<T, R> = KeyValueGenerator<string, T, R>\n\nexport function keyValueBy<T>(arr: T[]): Index<true>\nexport function keyValueBy<T, R>(arr: T[], keyValue: KeyValueGenerator<T, number, R>, initialValue?: Index<R>): Index<R>\nexport function keyValueBy<T, R>(\n obj: Index<T>,\n keyValue: KeyValueGenerator<string, T, R>,\n initialValue?: Index<R>,\n): Index<R>\n\n/** Generates an object from an array or object. Simpler than reduce or _.transform. The KeyValueGenerator passes (key, value) if the input is an object, and (value, i) if it is an array. The return object from each iteration is merged into the accumulated object. Return null to skip an item. */\nexport function keyValueBy<T, R = true>(\n input: T[] | Index<T>,\n // if no keyValue is given, sets all values to true\n keyValue?: ArrayKeyValueGenerator<T, R> | ObjectKeyValueGenerator<T, R>,\n accum: Index<R> = {},\n): Index<R> {\n const isArray = Array.isArray(input)\n keyValue = keyValue || ((key: T): Index<R> => ({ [key as unknown as string]: true as unknown as R }))\n // considerably faster than Array.prototype.reduce\n Object.entries(input || {}).forEach(([key, value], i) => {\n const o = isArray\n ? (keyValue as ArrayKeyValueGenerator<T, R>)(value, i, accum)\n : (keyValue as ObjectKeyValueGenerator<T, R>)(key, value, accum)\n Object.entries(o || {}).forEach(entry => {\n accum[entry[0]] = entry[1]\n })\n })\n\n return accum\n}\n\nexport default keyValueBy\n","/*\n\nThis chalk wrapper allows synchronous chalk.COLOR(...) syntax with special support for:\n\n1) dynamic import as pure ESM module\n2) force color on all instances\n3) disable color on all instances\n\nCall await chalkInit(color) at the beginning of execution and the chalk instance will be available everywhere.\n\nIt is a hacky solution, but it is the easiest way to import and pass the color option to all chalk instances without brutalizing the syntax.\n\n*/\nimport keyValueBy from './keyValueBy'\n\ntype ChalkMethod = ((s: any) => string) & { bold: (s: any) => string }\n\nconst chalkMethods = {\n blue: true,\n bold: true,\n cyan: true,\n gray: true,\n green: true,\n magenta: true,\n red: true,\n yellow: true,\n}\n\n// A chalk instance that passes strings through as-is, without color. Used with color: null. */\nconst chalkNoop = keyValueBy(chalkMethods, name => ({ [name]: (s: any) => s.toString() })) as Record<\n keyof typeof chalkMethods,\n ChalkMethod\n>\n\n// a global Promise of a chalk instance that can optionally force or ignore color\nlet chalkInstance: Record<keyof typeof chalkMethods, ChalkMethod>\n\n/** Initializes the global chalk instance with an optional flag for forced color. Idempotent. */\nexport const chalkInit = async (color?: boolean | null) => {\n const chalkModule = await import('chalk')\n const { default: chalkDefault, Chalk } = chalkModule\n chalkInstance = color === true ? new Chalk({ level: 1 }) : color === null ? chalkNoop : chalkDefault\n}\n\n/** Asserts that chalk has been imported. */\nconst assertChalk = () => {\n if (!chalkInstance) {\n throw new Error(\n `Chalk has not been imported yet. Chalk is a dynamic import and requires that you await { chalkInit } from './lib/chalk'.`,\n )\n }\n}\n\n// generate an async method for each chalk method that calls a chalk instance with global.color for forced color\nconst chalkGlobal = keyValueBy(chalkMethods, name => {\n /** Chained bold method. */\n const bold = (s: any) => {\n assertChalk()\n return chalkInstance[name as keyof typeof chalkInstance].bold(s)\n }\n /** Chalk method. */\n const method = (s: any) => {\n assertChalk()\n return chalkInstance[name as keyof typeof chalkInstance](s)\n }\n method.bold = bold\n return {\n [name]: method,\n }\n}) as Record<keyof typeof chalkMethods, ChalkMethod>\n\nexport default chalkGlobal\n","import { Index } from '../types/IndexType'\nimport keyValueBy from './keyValueBy'\n\n/** Filters an object by a predicate. Does not catch exceptions thrown by the predicate. */\nconst filterObject = <T>(obj: Index<T>, predicate: (key: string, value: T) => boolean) =>\n keyValueBy(obj, (key, value) => (predicate(key, value) ? { [key]: value } : null))\n\nexport default filterObject\n","import fs from 'fs/promises'\n\n/** Returns true if a file exists. */\nconst exists = (path: string) =>\n fs.stat(path).then(\n () => true,\n () => false,\n )\n\nexport default exists\n","import fs from 'fs/promises'\nimport path from 'path'\nimport { PackageFile } from '../types/PackageFile'\nimport exists from './exists'\n\n/** Gets the package.json contents of an installed package. */\nasync function getPackageJson(\n packageName: string,\n {\n pkgFile,\n }: {\n /** Specify the package file location to add to the node_modules search paths. Needed in workspaces/deep mode. */\n pkgFile?: string\n } = {},\n): Promise<PackageFile | null> {\n const requirePaths = require.resolve.paths(packageName) || []\n const pkgFileNodeModules = pkgFile ? [path.join(path.dirname(pkgFile), 'node_modules')] : []\n const localNodeModules = [path.join(process.cwd(), 'node_modules')]\n const nodeModulePaths = [...pkgFileNodeModules, ...localNodeModules, ...requirePaths]\n\n for (const basePath of nodeModulePaths) {\n const packageJsonPath = path.join(basePath, packageName, 'package.json')\n if (await exists(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'))\n return packageJson\n } catch (e) {}\n }\n }\n\n return null\n}\n\nexport default getPackageJson\n","import { PackageFile } from '../types/PackageFile'\nimport getPackageJson from './getPackageJson'\n\n/**\n * @param packageName A package name as listed in package.json's dependencies list\n * @param packageJson Optional param to specify an object representation of a package.json file instead of loading from node_modules\n * @returns The package version or null if a version could not be determined\n */\nasync function getPackageVersion(\n packageName: string,\n packageJson?: PackageFile,\n {\n pkgFile,\n }: {\n /** Specify the package file location to add to the node_modules search paths. Needed in workspaces/deep mode. */\n pkgFile?: string\n } = {},\n) {\n if (packageJson) {\n return packageJson.version\n }\n\n const loadedPackageJson = await getPackageJson(packageName, { pkgFile })\n return loadedPackageJson?.version ?? null\n}\n\nexport default getPackageVersion\n","import hostedGitInfo from 'hosted-git-info'\nimport { URL } from 'url'\nimport { PackageFile } from '../types/PackageFile'\nimport { PackageFileRepository } from '../types/PackageFileRepository'\nimport getPackageJson from './getPackageJson'\n\n/** Gets the repo url of an installed package. */\nasync function getPackageRepo(\n packageName: string,\n {\n pkgFile,\n }: {\n /** Specify the package file location to add to the node_modules search paths. Needed in workspaces/deep mode. */\n pkgFile?: string\n } = {},\n): Promise<string | PackageFileRepository | null> {\n const packageJson = await getPackageJson(packageName, { pkgFile })\n return packageJson?.repository ?? null\n}\n\n/**\n * @param packageName A package name as listed in package.json's dependencies list\n * @param packageJson Optional param to specify an object representation of a package.json file instead of loading from node_modules\n * @returns A valid url to the root of the package's source or null if a url could not be determined\n */\nasync function getRepoUrl(\n packageName: string,\n packageJson?: PackageFile,\n {\n pkgFile,\n }: {\n /** See: getPackageRepo pkgFile param. */\n pkgFile?: string\n } = {},\n) {\n const repositoryMetadata: string | PackageFileRepository | null = !packageJson\n ? await getPackageRepo(packageName, { pkgFile })\n : packageJson.repository\n ? packageJson.repository\n : null\n\n if (!repositoryMetadata) return null\n\n let gitURL\n let directory = ''\n\n // It may be a string instead of an object\n if (typeof repositoryMetadata === 'string') {\n gitURL = repositoryMetadata\n try {\n // It may already be a valid Repo URL\n const url = new URL(gitURL)\n // Some packages put a full URL in this field although it's not spec compliant. Let's detect that and use it if present\n if (url.protocol === 'https:' || url.protocol === 'http:') {\n return gitURL\n }\n } catch (e) {}\n } else if (typeof repositoryMetadata.url === 'string') {\n gitURL = repositoryMetadata.url\n if (typeof repositoryMetadata.directory === 'string') {\n directory = repositoryMetadata.directory\n }\n }\n\n if (typeof gitURL === 'string' && typeof directory === 'string') {\n const hostedGitURL = hostedGitInfo.fromUrl(gitURL)?.browse(directory)\n if (hostedGitURL !== undefined) {\n // Remove the default branch path (/tree/HEAD) from a git url\n return hostedGitURL.replace(/\\/$/, '').replace(/\\/tree\\/HEAD$/, '')\n }\n return gitURL\n }\n return null\n}\n\nexport default getRepoUrl\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var baseGet = require('./_baseGet');\n\n/**\n * The opposite of `_.property`; this method creates a function that returns\n * the value at a given path of `object`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var array = [0, 1, 2],\n * object = { 'a': array, 'b': array, 'c': array };\n *\n * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n * // => [2, 0]\n *\n * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n * // => [2, 0]\n */\nfunction propertyOf(object) {\n return function(path) {\n return object == null ? undefined : baseGet(object, path);\n };\n}\n\nmodule.exports = propertyOf;\n","/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection through each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n */\nexport function sortBy<T>(collection: T[] | null | undefined, selector: (item: T) => any): T[] {\n if (!collection) return []\n return collection\n .map(item => ({ item, key: selector(item) }))\n .sort((a, b) => (a.key > b.key ? 1 : a.key < b.key ? -1 : 0))\n .map(({ item }) => item)\n}\n","import propertyOf from 'lodash/propertyOf'\nimport parseGitHubUrl from 'parse-github-url'\nimport semver from 'semver'\nimport semverutils, { SemVer, parse, parseRange } from 'semver-utils'\nimport util from 'util'\nimport { DependencyGroup } from '../types/DependencyGroup'\nimport { Index } from '../types/IndexType'\nimport { Maybe } from '../types/Maybe'\nimport { Options } from '../types/Options'\nimport { UpgradeGroup } from '../types/UpgradeGroup'\nimport { VersionLevel } from '../types/VersionLevel'\nimport chalk from './chalk'\nimport { keyValueBy } from './keyValueBy'\nimport { sortBy } from './sortBy'\n\ntype VersionPart = keyof SemVer\n\nconst VERSION_BASE_PARTS = ['major', 'minor', 'patch'] as VersionPart[]\nconst VERSION_ADDED_PARTS = ['release', 'build'] as VersionPart[]\nconst VERSION_PARTS = [...VERSION_BASE_PARTS, ...VERSION_ADDED_PARTS] as VersionPart[]\nconst VERSION_PART_DELIM: SemVer = {\n major: '',\n minor: '.',\n patch: '.',\n release: '-',\n build: '+',\n}\nexport const DEFAULT_WILDCARD = '^'\nexport const WILDCARDS = ['^', '~', '.*', '.x']\nconst WILDCARDS_PURE = ['^', '~', '^*', '*', 'x', 'x.x', 'x.x.x']\nconst WILDCARD_PURE_REGEX = new RegExp(`^(${WILDCARDS_PURE.join('|').replace(/\\^/g, '\\\\^').replace(/\\*/g, '\\\\*')})$`)\n\n/** Matches an npm alias version declaration. */\nconst NPM_ALIAS_REGEX = /^npm:(.*)@(.*)/\n\ninterface UpgradeOptions {\n wildcard?: string\n removeRange?: boolean\n}\n\n/**\n * @param version\n * @returns The number of parts in the version\n */\nexport function numParts(version: string) {\n const [semver] = semverutils.parseRange(version)\n\n if (!semver) {\n throw new Error(\n util.format(\n 'semverutils.parseRange returned null when trying to parse \"%s\". This is probably a problem with the \"semver-utils\" dependency. Please report an issue at https://github.com/raineorshine/npm-check-updates/issues.',\n version,\n ),\n )\n }\n\n return VERSION_PARTS.reduce((count, part) => (semver[part] ? count + 1 : count), 0)\n}\n\n/**\n * Increases or decreases precision by the given amount, e.g. major+1 -> minor\n *\n * @param precision\n * @param n\n * @returns\n */\nexport function precisionAdd(precision: VersionPart, n: number) {\n if (n === 0) return precision\n\n const index = VERSION_BASE_PARTS.includes(precision)\n ? VERSION_BASE_PARTS.indexOf(precision) + n\n : VERSION_ADDED_PARTS.includes(precision)\n ? VERSION_BASE_PARTS.length + n\n : null\n\n if (index === null || !VERSION_PARTS[index]) {\n throw new Error(`Invalid precision: ${precision}`)\n }\n\n return VERSION_PARTS[index]\n}\n\n/**\n * Joins the major, minor, patch, release, and build parts (controlled by an\n * optional precision arg) of a semver object into a dot-delimited string.\n *\n * @param semver\n * @param [precision]\n * @returns\n */\nexport function stringify(semver: SemVer, precision?: VersionPart) {\n // get a list of the parts up until (and including) the given precision\n // or all of them, if no precision is specified\n const parts = precision ? VERSION_PARTS.slice(0, VERSION_PARTS.indexOf(precision) + 1) : VERSION_PARTS\n\n // pair each part with its delimiter and join together\n return parts\n .filter(part => (precision && VERSION_BASE_PARTS.includes(precision)) || semver[part])\n .map(part => VERSION_PART_DELIM[part] + (semver[part] || '0'))\n .join('')\n}\n\n/**\n * Gets how precise this version number is (major, minor, patch, release, or build)\n *\n * @param version\n * @returns\n */\nexport function getPrecision(version: string) {\n const [semver] = semverutils.parseRange(version)\n // expects VERSION_PARTS to be in correct order\n return VERSION_PARTS.slice().reverse().find(propertyOf(semver))\n}\n\n/**\n * Sets the precision of a (loose) semver to the specified level: major, minor, etc.\n *\n * @param version\n * @param [precision]\n * @returns\n */\nexport function setPrecision(version: string, precision: VersionPart) {\n const [semver] = semverutils.parseRange(version)\n return stringify(semver, precision)\n}\n\n/**\n * Adds a given wildcard (^,~,.*,.x) to a version number. Adds ^ and ~ to the\n * beginning. Replaces everything after the major version number with .* or .x\n *\n * @param version\n * @param wildcard\n * @returns\n */\nexport function addWildCard(version: string, wildcard: string) {\n return wildcard === '^' || wildcard === '~' ? wildcard + version : setPrecision(version, 'major') + wildcard\n}\n\n/**\n * Returns true if the given string is one of the wild cards.\n *\n * @param version\n * @returns\n */\nexport function isWildCard(version: string) {\n return WILDCARD_PURE_REGEX.test(version)\n}\n\n/**\n * Returns true if the given digit is a wildcard for a part of a version.\n *\n * @param versionPart\n * @returns\n */\nexport function isWildPart(versionPartValue: Maybe<string>) {\n return versionPartValue === '*' || versionPartValue === 'x'\n}\n\n/**\n * Determines the part of a version string that has changed when comparing two versions. Assumes that the two version strings are in the same format. Returns null if no parts have changed.\n *\n * @param from\n * @param to\n */\nexport function partChanged(from: string, to: string): UpgradeGroup {\n if (from === to) return 'none'\n\n // separate out leading ^ or ~\n if (/^[~^]/.test(to) && to[0] === from[0]) {\n to = to.slice(1)\n from = from.slice(1)\n }\n\n // split into parts\n const partsTo = to.split('.')\n const partsFrom = from.split('.')\n\n let i = partsTo.findIndex((partto, i) => partto !== partsFrom[i])\n i = i >= 0 ? i : partsTo.length\n\n // major = red (or any change before 1.0.0)\n // minor = cyan\n // patch = green\n return partsTo[0] === '0' ? 'majorVersionZero' : i === 0 ? 'major' : i === 1 ? 'minor' : 'patch'\n}\n\n/**\n * Returns a list of group heading and a map of package names and versions.\n * Used with --format group and takes into account the custom --group function.\n */\nexport function getDependencyGroups(\n newDependencies: Index<string>,\n oldDependencies: Index<string>,\n options: Options,\n): DependencyGroup[] {\n const groups = keyValueBy<string, Index<string>>(newDependencies, (dep, to, accum) => {\n const from = oldDependencies[dep]\n const defaultGroup = partChanged(from, to)\n const userDefinedUpgradeGroup =\n options.groupFunction?.(dep, defaultGroup, parseRange(from), parseRange(to), parse(newDependencies[dep])) ??\n defaultGroup\n if (userDefinedUpgradeGroup === 'none') {\n return accum\n }\n return {\n ...accum,\n [userDefinedUpgradeGroup]: {\n ...accum[userDefinedUpgradeGroup],\n [dep]: to,\n },\n }\n })\n\n // get the text for the default group headings\n const headings = {\n patch: chalk.green(chalk.bold('Patch') + ' Backwards-compatible bug fixes'),\n minor: chalk.cyan(chalk.bold('Minor') + ' Backwards-compatible features'),\n major: chalk.red(chalk.bold('Major') + ' Potentially breaking API changes'),\n majorVersionZero: chalk.magenta(chalk.bold('Major version zero') + ' Anything may change'),\n }\n\n const groupOrder = Array.from(new Set(['patch', 'minor', 'major', 'majorVersionZero', ...Object.keys(groups).sort()]))\n\n return groupOrder\n .filter(groupName => {\n return groupName in groups\n })\n .map(groupName => {\n return {\n groupName,\n heading: groupName in headings ? headings[groupName as keyof typeof headings] : groupName,\n packages: groups[groupName],\n }\n })\n}\n\n/**\n * Colorize the parts of a version string (to) that are different than\n * another (from). Assumes that the two version strings are in the same format.\n *\n * @param from\n * @param to\n * @returns\n */\nexport function colorizeDiff(from: string, to: string) {\n let leadingWildcard = ''\n\n // separate out leading ^ or ~\n if (/^[~^]/.test(to) && to[0] === from[0]) {\n leadingWildcard = to[0]\n to = to.slice(1)\n from = from.slice(1)\n }\n\n // split into parts\n const partsToColor = to.split('.')\n const partsToCompare = from.split('.')\n\n let i = partsToColor.findIndex((part, i) => part !== partsToCompare[i])\n i = i >= 0 ? i : partsToColor.length\n\n // major = red (or any change before 1.0.0)\n // minor = cyan\n // patch = green\n const color = i === 0 || partsToColor[0] === '0' ? 'red' : i === 1 ? 'cyan' : 'green'\n\n // if we are colorizing only part of the word, add a dot in the middle\n const middot = i > 0 && i < partsToColor.length ? '.' : ''\n\n return leadingWildcard + partsToColor.slice(0, i).join('.') + middot + chalk[color](partsToColor.slice(i).join('.'))\n}\n\n/**\n * Extract prerelease tag, omitting build number\n * Example: 1.0.0-next.alpha.2 -> next.alpha\n *\n * @param version\n */\nconst getPre = (version: string) => {\n const pre = semver.prerelease(version)\n return pre && pre.slice(0, -1).join('.')\n}\n\n/**\n * Check if it is allowed to compare two versions based on their prerelease tag\n *\n * SemVer both states that different prerelease versions can't be compared\n * and at the same time compares them as part of the version via strcmp\n *\n * @param a\n * @param b\n * @returns True if two versions can be compared by the means of SemVer\n */\nexport function isComparable(a: string, b: string) {\n const preA = getPre(a)\n const preB = getPre(b)\n return typeof preA !== 'string' || typeof preB !== 'string' || preA === preB\n}\n\n/** Comparator used to sort semver versions */\nexport function compareVersions(a: string, b: string) {\n const isValid = semver.valid(a) && semver.valid(b)\n const isGreater = isValid ? semver.gt(a, b) : a > b\n return isGreater ? 1 : a === b ? 0 : -1\n}\n\n/**\n * Finds the greatest version at the given level (minor|patch).\n *\n * @param versions Unsorted array of all available versions\n * @param current Current version or range\n * @param level major|minor\n * @returns String representation of the suggested version.\n */\nexport function findGreatestByLevel(versions: string[], current: string, level: VersionLevel): string | null {\n if (!semver.validRange(current)) {\n return null\n }\n\n const cur = semver.minVersion(current)\n const versionsSorted = [...versions].sort(compareVersions).filter(v => {\n const parsed = semver.parse(v)\n return (\n parsed &&\n (level === 'major' || parsed.major === cur?.major) &&\n (level === 'major' || level === 'minor' || parsed.minor === cur?.minor)\n )\n })\n\n return versionsSorted.at(-1) || null\n}\n\n/**\n * @param version\n * @returns True if the version is any kind of prerelease: alpha, beta, rc, pre\n */\nexport function isPre(version: string) {\n return getPrecision(version) === 'release'\n}\n\n/** Checks if a string is a simple version in the format \"v1\". */\nconst isMissingMinorAndPatch = (s: string) => /^[vV]?\\d+$/.test(s)\n\n/** Checks if a version string is missing its match component, e.g. \"1.0\". */\nconst isMissingPatch = (s: string) => /^[vV]?\\d+\\.\\d+$/.test(s)\n\n/** Removes a leading 'v' or 'V' from a pseudo version.. */\nconst fixLeadingV = (s: string) => s.replace(/^[vV]/, '')\n\n/** Converts a pseudo version that is missing its minor and patch components into a valid semver version. NOOP for valid semver versions. */\nconst fixMissingMinorAndPatch = (s: string) => (isMissingMinorAndPatch(s) ? s + '.0.0' : s)\n\n/** Converts a pseudo version that is missing its patch component into a valid semver version. NOOP for valid semver versions. */\nconst fixMissingPatch = (s: string) => (isMissingPatch(s) ? s + '.0' : s)\n\n/** Converts a pseudo version into a valid semver version. NOOP for valid semver versions. */\nexport const fixPseudoVersion = (s: string) => fixMissingPatch(fixMissingMinorAndPatch(fixLeadingV(s)))\n\n/**\n * Returns 'v' if the string starts with a v; otherwise, returns empty string.\n *\n * @param str\n * @returns\n */\nexport function v(str: Maybe<string>) {\n return str && (str[0] === 'v' || str[1] === 'v') ? 'v' : ''\n}\n\n/**\n * Constructs an npm alias from the name and version of the actual package.\n *\n * @param name Name of the actual package.\n * @param version Version of the actual package.\n * @returns \"npm:package@x.y.z\"\n * @example createNpmAlias('chalk', '2.0.0') -> 'npm:chalk@2.0.0'\n */\nexport const createNpmAlias = (name: string, version: string) => `npm:${name}@${version}`\n\n/**\n * Parses an npm alias into a [name, version] 2-tuple.\n *\n * @returns [name, version] or null if the input is not an npm alias\n * @example 'npm:chalk@1.0.0' -> ['chalk', '1.0.0']\n */\nexport const parseNpmAlias = (alias: string) => {\n const match = alias && alias.match && alias.match(NPM_ALIAS_REGEX)\n return match && match.slice(1)\n}\n\n/**\n * Returns true if a version declaration is an npm alias.\n */\nexport const isNpmAlias = (declaration: string) => declaration && !!declaration.match(NPM_ALIAS_REGEX)\n\n/**\n * Replaces the version number embedded in an npm alias.\n */\nexport const upgradeNpmAlias = (declaration: string, upgraded: string) => {\n const npmAlias = parseNpmAlias(declaration)\n if (!npmAlias) return null\n return createNpmAlias(npmAlias[0], upgraded)\n}\n\n/**\n * Returns true if a version declaration is a GitHub URL with a valid semver version.\n */\nexport const isGitHubUrl = (declaration: string | null) => {\n if (!declaration) return false\n let parsed = null\n try {\n parsed = parseGitHubUrl(declaration)\n } catch {\n // Strings like `npm:postman-request@2.88.1-postman.33` can throw errors instead of simply returning null\n // In node 18.17+ due to url.parse regression: https://github.com/nodejs/node/issues/49330\n // So if this throws, we can assume it's not a valid GitHub URL.\n }\n if (!parsed || !parsed.branch) return false\n\n const version = decodeURIComponent(parsed.branch).replace(/^semver:/, '')\n return !!semver.validRange(version)\n}\n\n/**\n * Returns the embedded tag in a GitHub URL.\n */\nexport const getGitHubUrlTag = (declaration: string | null) => {\n if (!declaration) return null\n const parsed = parseGitHubUrl(declaration)\n if (!parsed || !parsed.branch) return null\n const version = decodeURIComponent(parsed.branch).replace(/^semver:/, '')\n return parsed && parsed.branch && semver.validRange(version) ? version : null\n}\n\n/**\n * Upgrade an existing dependency declaration to satisfy the latest version.\n *\n * @param declaration Current version declaration (e.g. \"1.2.x\")\n * @param latestVersion Latest version (e.g \"1.3.2\")\n * @param [options={}]\n * @returns The upgraded dependency declaration (e.g. \"1.3.x\")\n */\nexport function upgradeDependencyDeclaration(\n declaration: string,\n latestVersion: string | null,\n options: UpgradeOptions = {},\n) {\n options.wildcard = options.wildcard || DEFAULT_WILDCARD\n\n if (!latestVersion) {\n return declaration\n }\n\n // parse the latestVersion\n // return original declaration if latestSemver is invalid\n const [latestSemver] = semverutils.parseRange(latestVersion)\n if (!latestSemver) {\n return declaration\n }\n\n // return global wildcards immediately\n if (options.removeRange) {\n return latestVersion\n } else if (isWildCard(declaration)) {\n return declaration\n }\n\n // parse the declaration\n // if multiple ranges, use the semver with the least number of parts\n const parsedRange = sortBy(\n semverutils.parseRange(declaration).filter(range => range.operator !== '||' && range.operator !== '-'),\n s => numParts(stringify(s)),\n ) as SemVer[]\n\n const [declaredSemver] = parsedRange\n\n /**\n * Chooses version parts between the declared version and the latest.\n * Base parts (major, minor, patch) are only included if they are in the original declaration.\n * Added parts (release, build) are always included. They are only present if we are checking --greatest versions\n * anyway.\n */\n function chooseVersion(part: VersionPart): string | null {\n return (\n (isWildPart(declaredSemver[part])\n ? declaredSemver[part]\n : VERSION_BASE_PARTS.includes(part) && declaredSemver[part]\n ? latestSemver[part]\n : VERSION_ADDED_PARTS.includes(part)\n ? latestSemver[part]\n : null) || null\n )\n }\n\n // create a new semver object with major, minor, patch, build, and release parts\n const newSemver = keyValueBy(VERSION_PARTS, (part: VersionPart) => ({\n [part]: chooseVersion(part),\n }))\n const newSemverString = stringify(newSemver)\n const version = v(declaredSemver.semver) + newSemverString\n\n // determine the operator\n // do not compact, because [undefined, '<'] must be differentiated from ['<']\n const uniqueOperators = Array.from(new Set(parsedRange.map(range => range.operator)))\n const operator = uniqueOperators[0] || ''\n\n const hasWildCard = WILDCARDS.some(wildcard => newSemverString.includes(wildcard))\n const isLessThanOrEqual = uniqueOperators[0] === '<' || uniqueOperators[0] === '<='\n const isGreaterThan = uniqueOperators[0] === '>'\n const isMixed = uniqueOperators.length > 1\n\n // convert versions with </<= or mixed operators into the preferred wildcard\n // only do so if the new version does not already contain a wildcard\n return !hasWildCard && (isLessThanOrEqual || isMixed)\n ? addWildCard(version, options.wildcard)\n : // convert > to >= since there are likely no available versions > latest\n // https://github.com/raineorshine/npm-check-updates/issues/957\n (isGreaterThan ? '>=' : operator) + version\n}\n\n/** Reverts a valid semver version to a pseudo version. NOOP If the original version was a valid semver version. */\nconst revertPseudoVersion = (current: string, latest: string) => {\n /** Reverts a valid semver version to a pseudo version with a leading 'v'. NOOP If the original version was a valid semver version. */\n const leadingV = v(current)\n let result = leadingV ? leadingV + latest : latest\n\n /** Reverts a valid semver version to a pseudo version that is missing its minor and patch components. NOOP If the original version was a valid semver version. */\n const missingMinorAndPatch = isMissingMinorAndPatch(current)\n result = missingMinorAndPatch ? result.slice(0, result.length - '.0.0'.length) : result\n\n /** Reverts a valid semver version to a pseudo version that is missing its patch components. NOOP If the original version was a valid semver version. */\n const missingPatch = isMissingPatch(current)\n result = missingPatch ? result.slice(0, result.length - '.0'.length) : result\n\n return result\n}\n\n/**\n * Replaces the version number embedded in a GitHub URL.\n */\nexport const upgradeGitHubUrl = (declaration: string, upgraded: string) => {\n // convert upgraded to a proper semver version if it is a pseudo version; otherwise, revertPseudoVersion will return an empty string\n const upgradedNormalized = fixPseudoVersion(upgraded)\n const parsedUrl = parseGitHubUrl(declaration)\n if (!parsedUrl) return declaration\n const tag = decodeURIComponent(parsedUrl.branch).replace(/^semver:/, '')\n return declaration.replace(tag, upgradeDependencyDeclaration(tag, revertPseudoVersion(tag, upgradedNormalized)))\n}\n","/**\n * Loggin functions.\n */\nimport Table from 'cli-table3'\nimport fs from 'fs/promises'\nimport { IgnoredUpgradeDueToEnginesNode } from '../types/IgnoredUpgradeDueToEnginesNode'\nimport { IgnoredUpgradeDueToPeerDeps } from '../types/IgnoredUpgradeDueToPeerDeps'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { VersionResult } from '../types/VersionResult'\nimport { VersionSpec } from '../types/VersionSpec'\nimport chalk from './chalk'\nimport filterObject from './filterObject'\nimport getPackageVersion from './getPackageVersion'\nimport getRepoUrl from './getRepoUrl'\nimport {\n colorizeDiff,\n getDependencyGroups,\n getGitHubUrlTag,\n isGitHubUrl,\n isNpmAlias,\n parseNpmAlias,\n} from './version-util'\n\ntype LogLevel = 'silent' | 'error' | 'warn' | 'info' | 'verbose' | 'silly' | null\n\n// maps string levels to numeric levels\nconst logLevels = {\n silent: 0,\n error: 1,\n minimal: 2,\n warn: 3,\n info: 4,\n verbose: 5,\n silly: 6,\n}\n\n/** Returns true if the dependency spec is not fetchable from the registry and is ignored. */\nconst isFetchable = (spec: VersionSpec) =>\n !spec.startsWith('file:') &&\n !spec.startsWith('link:') &&\n !spec.startsWith('workspace:') &&\n // short github urls that are ignored, e.g. raineorshine/foo\n !/^[^/:@]+\\/\\w+/.test(spec)\n\n/**\n * Prints a message if it is included within options.loglevel.\n *\n * @param options Command line options. These will be compared to the loglevel parameter to determine if the message gets printed.\n * @param message The message to print\n * @param loglevel silent|error|warn|info|verbose|silly\n * @param method The console method to call. Default: 'log'.\n */\nexport function print(\n options: Options,\n message: any,\n loglevel: LogLevel = null,\n method: 'log' | 'warn' | 'info' | 'error' = 'log',\n) {\n // not in json mode\n // not silent\n // not at a loglevel under minimum specified\n if (\n !options.json &&\n options.loglevel !== 'silent' &&\n (loglevel == null ||\n logLevels[(options.loglevel ?? 'warn') as unknown as keyof typeof logLevels] >= logLevels[loglevel])\n ) {\n console[method](message)\n }\n}\n\n/** Pretty print a JSON object. */\nexport function printJson(options: Options, object: any) {\n if (options.loglevel !== 'silent') {\n console.log(JSON.stringify(object, null, 2))\n }\n}\n\n/** Print JSON object keys as string joined by character. */\nexport function printSimpleJoinedString(object: any, join: string) {\n console.log(\n Object.keys(object)\n .map(pkg => pkg + '@' + object[pkg])\n .join(join),\n )\n}\n\n/** Prints an object sorted by key. */\nexport function printSorted<T extends { [key: string]: any }>(options: Options, obj: T, loglevel: LogLevel) {\n const sortedKeys = Object.keys(obj).sort() as (keyof T)[]\n const objSorted = sortedKeys.reduce<T>((accum, key) => {\n accum[key] = obj[key]\n return accum\n }, {} as T)\n print(options, objSorted, loglevel)\n}\n\n/** Create a table with the appropriate columns and alignment to render dependency upgrades. */\nfunction renderDependencyTable(rows: string[][]) {\n const table = new Table({\n colAligns: ['left', 'right', 'right', 'right', 'left', 'left'],\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: '',\n },\n })\n\n table.push(...rows)\n\n // when border is removed, whitespace remains\n // trim the end of each line to remove whitespace\n // this makes no difference visually, but the whitespace interacts poorly with .editorconfig in tests\n return table\n .toString()\n .split('\\n')\n .map(line => line.trimEnd())\n .join('\\n')\n}\n\n/**\n * Extract just the version number from a package.json dep\n *\n * @param dep Raw dependency, could be version / npm: string / Git url\n */\nfunction getVersion(dep: string): string {\n return isGitHubUrl(dep) ? getGitHubUrlTag(dep)! : isNpmAlias(dep) ? parseNpmAlias(dep)![1] : dep\n}\n\n/**\n * Renders a color-coded table of upgrades.\n *\n * @param args\n * @param args.from\n * @param args.to\n * @param args.ownersChangedDeps\n * @param args.format\n */\nexport async function toDependencyTable({\n from: fromDeps,\n to: toDeps,\n format,\n ownersChangedDeps,\n pkgFile,\n time,\n}: {\n from: Index<VersionSpec>\n to: Index<VersionSpec>\n format?: readonly string[]\n ownersChangedDeps?: Index<boolean>\n /** See: logging/getPackageRepo pkgFile param. */\n pkgFile?: string\n time?: Index<string>\n}) {\n const pkg = format?.includes('dep') && pkgFile ? JSON.parse(await fs.readFile(pkgFile, 'utf-8')) : null\n const table = renderDependencyTable(\n await Promise.all(\n Object.keys(toDeps)\n .sort()\n .map(async dep => {\n const from =\n (format?.includes('installedVersion')\n ? await getPackageVersion(dep, undefined, { pkgFile })\n : fromDeps[dep]) || ''\n const depType =\n dep in (pkg?.devDependencies ?? {})\n ? 'dev'\n : dep in (pkg?.peerDependencies ?? {})\n ? 'peer'\n : dep in (pkg?.optionalDependencies ?? {})\n ? 'optional'\n : ''\n const toRaw = toDeps[dep] || ''\n const to = getVersion(toRaw)\n const ownerChanged = ownersChangedDeps\n ? dep in ownersChangedDeps\n ? ownersChangedDeps[dep]\n ? '*owner changed*'\n : ''\n : '*unknown*'\n : ''\n const toColorized = colorizeDiff(getVersion(from), to)\n const repoUrl = format?.includes('repo') ? (await getRepoUrl(dep, undefined, { pkgFile })) || '' : ''\n const publishTime = format?.includes('time') && time?.[dep] ? time[dep] : ''\n return [\n dep,\n ...(format?.includes('dep') ? [depType ? chalk.gray(depType) : ''] : []),\n from,\n '→',\n toColorized,\n ownerChanged,\n ...[repoUrl, publishTime].filter(x => x),\n ]\n }),\n ),\n )\n return table\n}\n\n/**\n * Renders one or more color-coded tables with all upgrades. Supports different formats from the --format option.\n *\n * @param args\n * @param args.current\n * @param args.upgraded\n * @param args.ownersChangedDeps\n * @param options\n */\nexport async function printUpgradesTable(\n {\n current,\n upgraded,\n ownersChangedDeps,\n pkgFile,\n time,\n }: {\n current: Index<VersionSpec>\n upgraded: Index<VersionSpec>\n ownersChangedDeps?: Index<boolean>\n pkgFile?: string\n time?: Index<string>\n },\n options: Options,\n) {\n // group\n if (options.format?.includes('group')) {\n const groups = getDependencyGroups(upgraded, current, options)\n\n for (const { heading, packages } of groups) {\n print(options, '\\n' + heading)\n print(\n options,\n await toDependencyTable({\n from: current,\n to: packages,\n format: options.format,\n ownersChangedDeps,\n pkgFile,\n time,\n }),\n )\n }\n } else {\n if (options.format?.includes('lines')) {\n printSimpleJoinedString(upgraded, '\\n')\n } else {\n print(\n options,\n await toDependencyTable({\n from: current,\n to: upgraded,\n format: options.format,\n ownersChangedDeps,\n pkgFile,\n time,\n }),\n )\n }\n }\n}\n\n/** Prints errors. */\nfunction printErrors(options: Options, errors?: Index<string>) {\n if (!errors) return\n if (Object.keys(errors).length > 0) {\n const errorTable = new Table({\n colAligns: ['left', 'right', 'right', 'right', 'left', 'left'],\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: '',\n },\n })\n\n errorTable.push(...Object.entries(errors).map(([dep, error]) => [dep, chalk.yellow(error)]))\n\n print(options, '\\n' + errorTable.toString())\n }\n}\n\n/**\n * @param args.current -\n * @param args.latest -\n * @param args.upgraded -\n * @param args.total -\n * @param args.ownersChangedDeps -\n */\nexport async function printUpgrades(\n options: Options,\n {\n current,\n latest,\n upgraded,\n total,\n ownersChangedDeps,\n pkgFile,\n time,\n errors,\n }: {\n // Current package versions\n current: Index<VersionSpec>\n // Latest package versions according to the target. This is only used to detect an empty result from npm.\n latest?: Index<VersionResult>\n // Upgraded package specifications\n upgraded: Index<VersionSpec>\n // The total number of all possible upgrades. This is used to differentiate \"no dependencies\" from \"no upgrades\"\n total: number\n // Boolean flag per dependency which announces if package owner changed. Only used by --format ownerChanged\n ownersChangedDeps?: Index<boolean>\n // See: logging/getPackageRepo pkgFile param\n pkgFile?: string\n // Time published if options.format includes \"time\"\n time?: Index<string>\n // Any errors that were encountered when fetching versions.\n errors?: Index<string>\n },\n) {\n if (!options.format?.includes('group')) {\n print(options, '')\n }\n\n const smiley = chalk.green.bold(':)')\n const numErrors = Object.keys(errors || {}).length\n const target = typeof options.target === 'string' ? options.target : 'target'\n const numUpgraded = Object.keys(upgraded).length\n if (numUpgraded === 0 && total === 0 && numErrors === 0) {\n if (Object.keys(current).length === 0) {\n print(options, 'No dependencies.')\n } else if (\n latest &&\n Object.keys(latest).length === 0 &&\n // some specs are ignored by ncu, like the file: protocol, so they should be ignored when detecting fetch issues\n Object.values(filterObject(current, (name, spec) => isFetchable(spec))).length > 0\n ) {\n print(\n options,\n `No package versions were returned. This may be a problem with your installed ${\n options.packageManager\n }, the npm registry, or your Internet connection. Make sure ${chalk.cyan(\n 'npx pacote packument ncu-test-v2',\n )} is working before reporting an issue.`,\n )\n } else if (options.global) {\n print(options, `All global packages are up-to-date ${smiley}`)\n } else {\n print(options, `All dependencies match the ${target} package versions ${smiley}`)\n }\n } else if (numUpgraded === 0 && total > 0) {\n print(options, `No dependencies upgraded ${smiley}`)\n }\n // print table\n else if (numUpgraded > 0) {\n await printUpgradesTable(\n {\n current,\n upgraded,\n ownersChangedDeps,\n pkgFile,\n time,\n },\n options,\n )\n }\n\n printErrors(options, errors)\n}\n\n/** Print updates that were ignored due to incompatible peer dependencies. */\nexport function printIgnoredUpdatesDueToPeerDeps(options: Options, ignoredUpdates: Index<IgnoredUpgradeDueToPeerDeps>) {\n print(options, `\\nIgnored incompatible updates (peer dependencies):\\n`)\n const table = renderDependencyTable(\n Object.entries(ignoredUpdates).map(([pkgName, { from, to, reason }]) => {\n const strReason =\n 'reason: ' +\n Object.entries(reason)\n .map(([pkgReason, requirement]) => pkgReason + ' requires ' + requirement)\n .join(', ')\n return [pkgName, from, '→', colorizeDiff(from, to), strReason]\n }),\n )\n print(options, table)\n}\n\n/** Print updates that were ignored due to incompatible engines.node. */\nexport function printIgnoredUpdatesDueToEnginesNode(\n options: Options,\n ignoredUpdates: Index<IgnoredUpgradeDueToEnginesNode>,\n) {\n print(options, `\\nIgnored incompatible updates (engines node):\\n`)\n const table = renderDependencyTable(\n Object.entries(ignoredUpdates).map(([pkgName, { from, to, enginesNode }]) => [\n pkgName,\n from,\n '→',\n colorizeDiff(from, to),\n `reason: requires node ${enginesNode}`,\n ]),\n )\n print(options, table)\n}\n","import fs from 'fs'\nimport os from 'os'\nimport path from 'path'\nimport { CacheData, Cacher } from '../types/Cacher'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { Version } from '../types/Version'\nimport { print } from './logging'\n\nexport const CACHE_DELIMITER = '___'\n\n/**\n * Check if cache is expired if timestamp is set\n *\n * @param cacheData\n * @param cacheExpiration\n * @returns\n */\nfunction checkCacheExpiration(cacheData: CacheData, cacheExpiration = 10) {\n if (typeof cacheData.timestamp !== 'number') {\n return false\n }\n\n const unixMinuteMS = 60 * 1000\n const expirationLimit = cacheData.timestamp + cacheExpiration * unixMinuteMS\n return expirationLimit < Date.now()\n}\n\nexport const defaultCacheFilename = '.ncu-cache.json'\nexport const defaultCacheFile = `~/${defaultCacheFilename}`\nexport const resolvedDefaultCacheFile = path.join(os.homedir(), defaultCacheFilename)\n\n/** Resolve the cache file path based on os/homedir. */\nexport function resolveCacheFile(optionsCacheFile: string) {\n return optionsCacheFile === defaultCacheFile ? resolvedDefaultCacheFile : optionsCacheFile\n}\n\n/** Clear the default cache, or the cache file specified by --cacheFile. */\nexport async function cacheClear(options: Options) {\n if (!options.cacheFile) {\n return\n }\n\n await fs.promises.rm(resolveCacheFile(options.cacheFile), { force: true })\n}\n\n/**\n * The cacher stores key (name + target) - value (new version) pairs\n * for quick updates across `ncu` calls.\n *\n * @returns\n */\nexport default async function cacher(options: Omit<Options, 'cacher'>): Promise<Cacher | undefined> {\n if (!options.cache || !options.cacheFile) {\n return\n }\n\n const cacheFile = resolveCacheFile(options.cacheFile)\n let cacheData: CacheData = {}\n const cacheHits = new Set<string>()\n\n try {\n cacheData = JSON.parse(await fs.promises.readFile(cacheFile, 'utf-8'))\n\n const expired = checkCacheExpiration(cacheData, options.cacheExpiration)\n if (expired) {\n // reset cache\n fs.promises.rm(cacheFile, { force: true })\n cacheData = {}\n }\n } catch (error) {\n // ignore file read/parse/remove errors\n }\n\n if (typeof cacheData.timestamp !== 'number') {\n cacheData.timestamp = Date.now()\n }\n if (!cacheData.packages) {\n cacheData.packages = {}\n }\n if (!cacheData.peers) {\n cacheData.peers = {}\n }\n\n return {\n get: (name: string, target: string) => {\n if (!cacheData.packages) return\n const key = `${name}${CACHE_DELIMITER}${target}`\n const cached = cacheData.packages[key]\n if (cached && !key.includes(cached)) {\n cacheHits.add(name)\n }\n return cached\n },\n set: (name: string, target: string, version: string) => {\n if (!cacheData.packages) return\n const key = `${name}${CACHE_DELIMITER}${target}`\n cacheData.packages[key] = version\n },\n getPeers: (name: string, version: Version) => {\n if (!cacheData.peers) return\n const key = `${name}${CACHE_DELIMITER}${version}`\n const cached = cacheData.peers[key]\n if (cached) {\n cacheHits.add(name)\n }\n return cached\n },\n setPeers: (name: string, version: Version, peers: Index<string>) => {\n const key = `${name}${CACHE_DELIMITER}${version}`\n if (!cacheData.peers) return\n cacheData.peers[key] = peers\n },\n save: async () => {\n await fs.promises.writeFile(cacheFile, JSON.stringify(cacheData))\n },\n log: (peers?: boolean) => {\n const cacheCount = cacheHits.size\n if (cacheCount === 0) return\n\n print(\n options,\n `\\nUsing ${cacheCount} cached package ${peers ? 'peer' : 'version'}${cacheCount > 1 ? 's' : ''}`,\n 'warn',\n )\n print(options, cacheHits, 'verbose')\n cacheHits.clear()\n },\n } satisfies Cacher\n}\n","/** Wraps a string by inserting newlines every n characters. Wraps on word break. Default: 92 chars. */\nconst wrap = (s: string, maxLineLength = 92) => {\n const linesIn = s.split('\\n')\n const linesOut: string[] = []\n linesIn.forEach(lineIn => {\n let i = 0\n if (lineIn.length === 0) {\n linesOut.push('')\n return\n }\n\n while (i < lineIn.length) {\n const lineFull = lineIn.slice(i, i + maxLineLength + 1)\n\n // if the line is within the line length, push it as the last line and break\n const lineTrimmed = lineFull.trimEnd()\n if (lineTrimmed.length <= maxLineLength) {\n linesOut.push(lineTrimmed)\n break\n }\n\n // otherwise, wrap before the last word that exceeds the wrap length\n // do not wrap in the middle of a word\n // reverse the string and use match to find the first non-word character to wrap on\n const wrapOffset =\n lineFull\n .split('')\n .reverse()\n .join('')\n // add [^\\W] to not break in the middle of --registry\n .match(/[ -][^\\W]/)?.index || 0\n const line = lineFull.slice(0, lineFull.length - wrapOffset)\n\n // make sure we do not end up in an infinite loop\n if (line.length === 0) break\n\n linesOut.push(line.trimEnd())\n i += line.length\n }\n i = 0\n })\n return linesOut.join('\\n').trim()\n}\n\nexport default wrap\n","import Table from 'cli-table3'\nimport wrap from './wrap'\n\n/** Wraps the second column in a list of 2-column cli-table rows. */\nconst wrapRows = (rows: string[][]) => rows.map(([col1, col2]) => [col1, wrap(col2)])\n\n/** Renders an HTML row. */\nconst row = (cells: string[]) => '\\n <tr>' + cells.map(cell => `<td>${cell}</td>`).join('') + '</tr>'\n\n/** Renders a table for the CLI or markdown. */\nconst table = ({\n colAligns,\n markdown,\n rows,\n}: {\n colAligns?: ('left' | 'right')[]\n markdown?: boolean\n rows: string[][]\n}): string => {\n // return HTML table for GitHub-flavored markdown\n if (markdown) {\n return `<table>${rows.map(row).join('')}\\n</table>`\n }\n // otherwise use cli-table3\n else {\n const t = new Table({ ...(colAligns ? { colAligns } : null) })\n t.push(...(markdown ? rows : wrapRows(rows)))\n return t.toString()\n }\n}\n\nexport default table\n","import path from 'path'\nimport { defaultCacheFile } from './lib/cache'\nimport chalk from './lib/chalk'\nimport { sortBy } from './lib/sortBy'\nimport table from './lib/table'\nimport CLIOption from './types/CLIOption'\nimport ExtendedHelp from './types/ExtendedHelp'\nimport { Index } from './types/IndexType'\n\n/** Valid strings for the --target option. Indicates the desired version to upgrade to. */\nconst supportedVersionTargets = ['latest', 'newest', 'greatest', 'minor', 'patch', 'semver']\n\n/** Pads the left side of each line in a string. */\nconst padLeft = (s: string, n: number) =>\n s\n .split('\\n')\n .map(line => `${''.padStart(n, ' ')}${line}`)\n .join('\\n')\n\n/** Formats a code block for CLI or markdown. */\nconst codeBlock = (code: string, { markdown }: { markdown?: boolean } = {}) =>\n `${markdown ? '```js\\n' : ''}${padLeft(code, markdown ? 0 : 4)}${markdown ? '\\n```' : ''}`\n\n/** Removes inline code ticks. */\nconst uncode = (s: string) => s.replace(/`/g, '')\n\n/** Renders the extended help for an option with usage information. */\nexport const renderExtendedHelp = (option: CLIOption, { markdown }: { markdown?: boolean } = {}) => {\n let output = ''\n if (option.cli !== false) {\n // add -u to doctor option\n output = `Usage:\n\n ncu --${option.long}${option.arg ? ` [${option.arg}]` : ''}${option.long === 'doctor' ? ' -u' : ''}\\n`\n }\n if (option.type === 'boolean') {\n output += ` ncu --no-${option.long}\\n`\n }\n if (option.short) {\n // add -u to doctor option\n output += ` ncu -${option.short}${option.arg ? ` [${option.arg}]` : ''}${option.long === 'doctor' ? 'u' : ''}\\n`\n }\n\n if (option.default !== undefined && !(Array.isArray(option.default) && option.default.length === 0)) {\n output += `\\nDefault: ${option.default}\\n`\n }\n if (option.help) {\n const helpText =\n typeof option.help === 'function'\n ? markdown\n ? option.help({ markdown })\n : uncode(option.help({ markdown }))\n : option.help\n output += `\\n${helpText.trim()}\\n\\n`\n } else if (option.description) {\n const description = markdown ? option.description : uncode(option.description)\n output += `\\n${description.replace(/`/g, '')}\\n`\n }\n\n return output.trim()\n}\n\n/** Extended help for the --doctor option. */\nconst extendedHelpDoctor: ExtendedHelp = ({\n markdown,\n}) => `Iteratively installs upgrades and runs your project's tests to identify breaking upgrades. Reverts broken upgrades and updates package.json with working upgrades.\n\n${chalk.yellow('Requires `-u` to execute')} (modifies your package file, lock file, and node_modules)\n\nTo be more precise:\n\n1. Runs \\`npm install\\` and \\`npm test\\` to ensure tests are currently passing.\n2. Runs \\`ncu -u\\` to optimistically upgrade all dependencies.\n3. If tests pass, hurray!\n4. If tests fail, restores package file and lock file.\n5. For each dependency, install upgrade and run tests.\n6. Prints broken upgrades with test error.\n7. Saves working upgrades to package.json.\n\nAdditional options:\n\n${table({\n markdown,\n rows: [\n [chalk.cyan('--doctorInstall'), 'specify a custom install script (default: `npm install` or `yarn`)'],\n [chalk.cyan('--doctorTest'), 'specify a custom test script (default: `npm test`)'],\n ],\n})}\n\nExample:\n\n $ ncu --doctor -u\n Running tests before upgrading\n npm install\n npm run test\n Upgrading all dependencies and re-running tests\n ncu -u\n npm install\n npm run test\n Tests failed\n Identifying broken dependencies\n npm install\n npm install --no-save react@16.0.0\n npm run test\n ✓ react 15.0.0 → 16.0.0\n npm install --no-save react-redux@7.0.0\n npm run test\n ✗ react-redux 6.0.0 → 7.0.0\n\n /projects/myproject/test.js:13\n throw new Error('Test failed!')\n ^\n\n npm install --no-save react-dnd@11.1.3\n npm run test\n ✓ react-dnd 10.0.0 → 11.1.3\n Saving partially upgraded package.json\n`\n\n/** Extended help for the filterResults option. */\nconst extendedHelpFilterResults: ExtendedHelp = ({ markdown }) => {\n /** If markdown, surround inline code with backticks. */\n const codeInline = (code: string) => (markdown ? `\\`${code}\\`` : code)\n\n return `Filters results based on a user provided predicate function after fetching new versions.\n\n${codeInline('filterResults')} runs _after_ new versions are fetched, in contrast to ${codeInline(\n 'filter',\n )}, ${codeInline('reject')}, ${codeInline('filterVersion')}, and ${codeInline(\n 'rejectVersion',\n )}, which run _before_. This allows you to exclude upgrades with ${codeInline(\n 'filterResults',\n )} based on how the version has changed (e.g. a major version change).\n\n> :warning: The predicate function is only available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions.\n\n${codeBlock(\n `${chalk.gray(`/** Exclude major version updates. Note this could also be achieved with --target semver.\n @param {string} packageName The name of the dependency.\n @param {string} current Current version declaration (may be a range).\n @param {SemVer[]} currentVersionSemver Current version declaration in semantic versioning format (may be a range).\n @param {string} upgraded Upgraded version.\n @param {SemVer} upgradedVersionSemver Upgraded version in semantic versioning format.\n @returns {boolean} Return true if the upgrade should be kept; otherwise, it will be ignored.\n*/`)}\n${chalk.green('filterResults')}: (packageName, { current, currentVersionSemver, upgraded, upgradedVersionSemver }) ${chalk.cyan(\n '=>',\n )} {\n ${chalk.cyan('const')} currentMajor ${chalk.red('=')} parseInt(currentVersionSemver[${chalk.cyan('0')}]?.major, ${chalk.cyan(\n '10',\n )})\n ${chalk.cyan('const')} upgradedMajor ${chalk.red('=')} parseInt(upgradedVersionSemver?.major, ${chalk.cyan('10')})\n ${chalk.red('if')} (currentMajor ${chalk.red('&&')} upgradedMajor) {\n ${chalk.red('return')} currentMajor ${chalk.red('>=')} upgradedMajor\n }\n ${chalk.red('return')} ${chalk.cyan('true')}\n}`,\n { markdown },\n)}\n\nFor the SemVer type definition, see: https://git.coolaj86.com/coolaj86/semver-utils.js#semverutils-parse-semverstring\n\n`\n}\n\n/** Extended help for the --format option. */\nconst extendedHelpFormat: ExtendedHelp = ({ markdown }) => {\n const header =\n 'Modify the output formatting or show additional information. Specify one or more comma-delimited values.'\n const tableString = table({\n colAligns: ['right', 'left'],\n markdown,\n rows: [\n ['dep', `Prints the dependency type (dev, peer, optional) of each package.`],\n ['group', `Groups packages by major, minor, patch, and major version zero updates.`],\n ['installedVersion', 'Prints the exact current version number instead of a range.'],\n ['lines', 'Prints name@version on separate lines. Useful for piping to npm install.'],\n ['ownerChanged', `Shows if the package owner has changed.`],\n ['repo', `Infers and displays links to the package's source code repository. Requires packages to be installed.`],\n ['time', 'Shows the publish time of each upgrade.'],\n ],\n })\n\n return `${header}\\n\\n${padLeft(tableString, markdown ? 0 : 4)}\n`\n}\n\n/** Extended help for the --install option. */\nconst extendedHelpInstall: ExtendedHelp = ({ markdown }) => {\n const header = 'Control the auto-install behavior.'\n const tableString = table({\n colAligns: ['right', 'left'],\n markdown,\n rows: [\n ['always', `Runs your package manager's install command automatically after upgrading.`],\n ['never', `Does not install and does not prompt.`],\n [\n 'prompt',\n `Shows a message after upgrading that recommends an install, but does not install. In interactive mode, prompts for install. (default)`,\n ],\n ],\n })\n\n return `${header}\\n\\n${padLeft(tableString, markdown ? 0 : 4)}\n`\n}\n\n/** Extended help for the --filter option. */\nconst extendedHelpFilterFunction: ExtendedHelp = ({ markdown }) => {\n /** If markdown, surround inline code with backticks. */\n const codeInline = (code: string) => (markdown ? `\\`${code}\\`` : code)\n\n return `Include only package names matching the given string, wildcard, glob, comma-or-space-delimited list, /regex/, or predicate function. Only included packages will be checked with ${codeInline(\n '--peer',\n )}.\n\n${codeInline('--filter')} runs _before_ new versions are fetched, in contrast to ${codeInline(\n '--filterResults',\n )} which runs _after_.\n\nYou can also specify a custom function in your .ncurc.js file, or when importing npm-check-updates as a module.\n\n> :warning: The predicate function is only available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions.\n\n${codeBlock(\n `${chalk.gray(`/**\n @param name The name of the dependency.\n @param semver A parsed Semver array of the current version.\n (See: https://git.coolaj86.com/coolaj86/semver-utils.js#semverutils-parse-semverstring)\n @returns True if the package should be included, false if it should be excluded.\n*/`)}\n${chalk.green('filter')}: (name, semver) ${chalk.cyan('=>')} {\n ${chalk.red('if')} (name.startsWith(${chalk.yellow(`'@myorg/'`)})) {\n ${chalk.red('return')} ${chalk.cyan('false')}\n }\n ${chalk.red('return')} ${chalk.cyan('true')}\n}`,\n { markdown },\n)}\n\n`\n}\n\n/** Extended help for the --filterVersion option. */\nconst extendedHelpFilterVersionFunction: ExtendedHelp = ({ markdown }) => {\n /** If markdown, surround inline code with backticks. */\n const codeInline = (code: string) => (markdown ? `\\`${code}\\`` : code)\n\n return `Include only versions matching the given string, wildcard, glob, comma-or-space-delimited list, /regex/, or predicate function.\n\n${codeInline('--filterVersion')} runs _before_ new versions are fetched, in contrast to ${codeInline(\n '--filterResults',\n )} which runs _after_.\n\nYou can also specify a custom function in your .ncurc.js file, or when importing npm-check-updates as a module.\n\n> :warning: The predicate function is only available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions. This function is an alias for the ${codeInline('filter')} option function.\n\n${codeBlock(\n `${chalk.gray(`/**\n @param name The name of the dependency.\n @param semver A parsed Semver array of the current version.\n (See: https://git.coolaj86.com/coolaj86/semver-utils.js#semverutils-parse-semverstring)\n @returns True if the package should be included, false if it should be excluded.\n*/`)}\n${chalk.green('filterVersion')}: (name, semver) ${chalk.cyan('=>')} {\n ${chalk.red('if')} (name.startsWith(${chalk.yellow(`'@myorg/'`)}) ${chalk.red(\n '&&',\n )} parseInt(semver[0]?.major) ${chalk.cyan('>')} ${chalk.cyan(`5`)}) {\n ${chalk.red('return')} ${chalk.cyan('false')}\n }\n ${chalk.red('return')} ${chalk.cyan('true')}\n}`,\n { markdown },\n)}\n\n`\n}\n\n/** Extended help for the --reject option. */\nconst extendedHelpRejectFunction: ExtendedHelp = ({ markdown }) => {\n /** If markdown, surround inline code with backticks. */\n const codeInline = (code: string) => (markdown ? `\\`${code}\\`` : code)\n\n return `The inverse of ${codeInline(\n '--filter',\n )}. Exclude package names matching the given string, wildcard, glob, comma-or-space-delimited list, /regex/, or predicate function. This will also exclude them from the ${codeInline(\n '--peer',\n )} check.\n\n${codeInline('--reject')} runs _before_ new versions are fetched, in contrast to ${codeInline(\n '--filterResults',\n )} which runs _after_.\n\nYou can also specify a custom function in your .ncurc.js file, or when importing npm-check-updates as a module.\n\n> :warning: The predicate function is only available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions.\n\n${codeBlock(\n `${chalk.gray(`/**\n @param name The name of the dependency.\n @param semver A parsed Semver array of the current version.\n (See: https://git.coolaj86.com/coolaj86/semver-utils.js#semverutils-parse-semverstring)\n @returns True if the package should be excluded, false if it should be included.\n*/`)}\n${chalk.green('reject')}: (name, semver) ${chalk.cyan('=>')} {\n ${chalk.red('if')} (name.startsWith(${chalk.yellow(`'@myorg/'`)})) {\n ${chalk.red('return')} ${chalk.cyan('true')}\n }\n ${chalk.red('return')} ${chalk.cyan('false')}\n}`,\n { markdown },\n)}\n\n`\n}\n\n/** Extended help for the --rejectVersion option. */\nconst extendedHelpRejectVersionFunction: ExtendedHelp = ({ markdown }) => {\n /** If markdown, surround inline code with backticks. */\n const codeInline = (code: string) => (markdown ? `\\`${code}\\`` : code)\n\n return `The inverse of ${codeInline(\n '--filterVersion',\n )}. Exclude versions matching the given string, wildcard, glob, comma-or-space-delimited list, /regex/, or predicate function.\n\n${codeInline('--rejectVersion')} runs _before_ new versions are fetched, in contrast to ${codeInline(\n '--filterResults',\n )} which runs _after_.\n\nYou can also specify a custom function in your .ncurc.js file, or when importing npm-check-updates as a module.\n\n> :warning: The predicate function is only available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions. This function is an alias for the reject option function.\n\n${codeBlock(\n `${chalk.gray(`/**\n @param name The name of the dependency.\n @param semver A parsed Semver array of the current version.\n (See: https://git.coolaj86.com/coolaj86/semver-utils.js#semverutils-parse-semverstring)\n @returns True if the package should be excluded, false if it should be included.\n*/`)}\n${chalk.green('rejectVersion')}: (name, semver) ${chalk.cyan('=>')} {\n ${chalk.red('if')} (name.startsWith(${chalk.yellow(`'@myorg/'`)}) ${chalk.red(\n '&&',\n )} parseInt(semver[0]?.major) ${chalk.cyan('>')} ${chalk.cyan(`5`)}) {\n ${chalk.red('return')} ${chalk.cyan('true')}\n }\n ${chalk.red('return')} ${chalk.cyan('false')}\n}`,\n { markdown },\n)}\n\n`\n}\n\n/** Extended help for the --group option. */\nconst extendedHelpGroupFunction: ExtendedHelp = ({ markdown }) => {\n return `Customize how packages are divided into groups when using \\`--format group\\`.\n\nOnly available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions.\n\n${codeBlock(\n `${chalk.gray(`/**\n @param name The name of the dependency.\n @param defaultGroup The predefined group name which will be used by default.\n @param currentSpec The current version range in your package.json.\n @param upgradedSpec The upgraded version range that will be written to your package.json.\n @param upgradedVersion The upgraded version number returned by the registry.\n @returns A predefined group name ('major' | 'minor' | 'patch' | 'majorVersionZero' | 'none') or a custom string to create your own group.\n*/`)}\n${chalk.green('groupFunction')}: (name, defaultGroup, currentSpec, upgradedSpec, upgradedVersion) ${chalk.cyan('=>')} {\n ${chalk.red('if')} (name ${chalk.red('===')} ${chalk.yellow(`'typescript'`)} ${chalk.red(\n '&&',\n )} defaultGroup ${chalk.red('===')} ${chalk.yellow(`'minor'`)}) {\n ${chalk.red('return')} ${chalk.yellow(`'major'`)}\n }\n ${chalk.red('if')} (name.startsWith(${chalk.yellow(`'@myorg/'`)})) {\n ${chalk.red('return')} ${chalk.yellow(`'My Org'`)}\n }\n ${chalk.red('return')} defaultGroup\n}`,\n { markdown },\n)}\n\n`\n}\n\n/** Extended help for the --target option. */\nconst extendedHelpTarget: ExtendedHelp = ({ markdown }) => {\n const header = 'Determines the version to upgrade to. (default: \"latest\")'\n const tableString = table({\n colAligns: ['right', 'left'],\n markdown,\n rows: [\n [\n 'greatest',\n `Upgrade to the highest version number published, regardless of release date or tag. Includes prereleases.`,\n ],\n [\n 'latest',\n `Upgrade to whatever the package's \"latest\" git tag points to. Excludes prereleases unless --pre is specified.`,\n ],\n ['minor', 'Upgrade to the highest minor version without bumping the major version.'],\n [\n 'newest',\n `Upgrade to the version with the most recent publish date, even if there are other version numbers that are higher. Includes prereleases.`,\n ],\n ['patch', `Upgrade to the highest patch version without bumping the minor or major versions.`],\n ['semver', `Upgrade to the highest version within the semver range specified in your package.json.`],\n ['@[tag]', `Upgrade to the version published to a specific tag, e.g. 'next' or 'beta'.`],\n ],\n })\n\n return `${header}\n\n${padLeft(tableString, markdown ? 0 : 4)}\n\ne.g.\n\n${codeBlock(`ncu --target semver`)}\n\nYou can also specify a custom function in your .ncurc.js file, or when importing npm-check-updates as a module.\n\n> :warning: The predicate function is only available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions.\n\n${codeBlock(\n `${chalk.gray(`/** Upgrade major version zero to the next minor version, and everything else to latest.\n @param name The name of the dependency.\n @param semver A parsed Semver object of the upgraded version.\n (See: https://git.coolaj86.com/coolaj86/semver-utils.js#semverutils-parse-semverstring)\n @returns One of the valid target values (specified in the table above).\n*/`)}\n${chalk.green('target')}: (name, semver) ${chalk.cyan('=>')} {\n ${chalk.red('if')} (parseInt(semver[0]?.major) ${chalk.red('===')} ${chalk.yellow(\"'0'\")}) ${chalk.red(\n 'return',\n )} ${chalk.yellow(\"'minor'\")}\n ${chalk.red('return')} ${chalk.yellow(\"'latest'\")}\n}`,\n { markdown },\n)}\n`\n}\n\n/** Extended help for the --packageManager option. */\nconst extendedHelpPackageManager: ExtendedHelp = ({ markdown }) => {\n const header = 'Specifies the package manager to use when looking up versions.'\n const tableString = table({\n colAligns: ['right', 'left'],\n markdown,\n rows: [\n ['npm', `System-installed npm. Default.`],\n ['yarn', `System-installed yarn. Automatically used if yarn.lock is present.`],\n ['pnpm', `System-installed pnpm. Automatically used if pnpm-lock.yaml is present.`],\n ['bun', `System-installed bun. Automatically used if bun.lock or bun.lockb is present.`],\n ],\n })\n\n return `${header}\\n\\n${padLeft(tableString, markdown ? 0 : 4)}\n`\n}\n\n/** Extended help for the --registryType option. */\nconst extendedHelpRegistryType: ExtendedHelp = ({ markdown }) => {\n /** If markdown, surround inline code with backticks. */\n const codeInline = (code: string) => (markdown ? `\\`${code}\\`` : code)\n\n const header = `Specify whether ${codeInline('--registry')} refers to a full npm registry or a simple JSON file.`\n const tableString = table({\n colAligns: ['right', 'left'],\n markdown,\n rows: [\n ['npm', `Default npm registry`],\n [\n 'json',\n `Checks versions from a file or url to a simple JSON registry. Must include the ${chalk.cyan(\n '`--registry`',\n )} option.\n\nExample:\n\n ${chalk.gray('// local file')}\n ${chalk.cyan('$')} ncu --registryType json --registry ./registry.json\n\n ${chalk.gray('// url')}\n ${chalk.cyan('$')} ncu --registryType json --registry https://api.mydomain/registry.json\n\n ${chalk.gray('// you can omit --registryType when the registry ends in .json')}\n ${chalk.cyan('$')} ncu --registry ./registry.json\n ${chalk.cyan('$')} ncu --registry https://api.mydomain/registry.json\n\nregistry.json:\n\n {\n \"prettier\": \"2.7.1\",\n \"typescript\": \"4.7.4\"\n }\n\n`,\n ],\n ],\n })\n\n return `${header}\\n\\n${padLeft(tableString, markdown ? 0 : 4)}\n`\n}\n\n/** Extended help for the --peer option. */\nconst extendedHelpPeer: ExtendedHelp = ({ markdown }) => {\n /** If markdown, surround inline code with backticks. */\n const codeInline = (code: string) => (markdown ? `\\`${code}\\`` : code)\n return `Check peer dependencies of installed packages and filter updates to compatible versions.\n\n${chalk.bold('Example')}:\n\nThe following example demonstrates how \\`--peer\\` works, and how it uses peer dependencies from upgraded modules.\n\nThe package ${chalk.bold('ncu-test-peer-update')} has two versions published:\n\n- 1.0.0 has peer dependency ${codeInline('\"ncu-test-return-version\": \"1.0.x\"')}\n- 1.1.0 has peer dependency ${codeInline('\"ncu-test-return-version\": \"1.1.x\"')}\n\nOur test app has the following dependencies:\n\n \"ncu-test-peer-update\": \"1.0.0\",\n \"ncu-test-return-version\": \"1.0.0\"\n\nThe latest versions of these packages are:\n\n \"ncu-test-peer-update\": \"1.1.0\",\n \"ncu-test-return-version\": \"2.0.0\"\n\n${chalk.bold('With `--peer`')}:\n\nncu upgrades packages to the highest version that still adheres to the peer dependency constraints:\n\n ncu-test-peer-update 1.0.0 → 1.${chalk.cyan('1.0')}\n ncu-test-return-version 1.0.0 → 1.${chalk.cyan('1.0')}\n\n${chalk.bold('Without `--peer`')}:\n\nAs a comparison: without using the \\`--peer\\` option, ncu will suggest the latest versions, ignoring peer dependencies:\n\n ncu-test-peer-update 1.0.0 → 1.${chalk.cyan('1.0')}\n ncu-test-return-version 1.0.0 → ${chalk.red('2.0.0')}\n`\n}\n\n/** Extended help for the --cooldown option. */\nconst extendedHelpCooldown: ExtendedHelp = ({ markdown }) => {\n return `The cooldown option helps protect against supply chain attacks by requiring package versions to be published at least the given number of days before considering them for upgrade.\n\nNote that previous stable versions will ${chalk.bold('not')} be suggested. The package will be completely ignored if its latest published version is within the cooldown period. This is due to a limitation of the npm registry, which does not provide a way to query previous stable versions.\n\n${chalk.bold('Example')}:\n\nLet's examine how cooldown works with a package that has these versions available:\n\n 1.0.0 Released 7 days ago (initial version)\n 1.1.0 Released 6 days ago (minor update)\n 1.1.1 Released 5 days ago (patch update)\n 1.2.0 Released 5 days ago (minor update)\n 2.0.0-beta.1 Released 5 days ago (beta release)\n 1.2.1 Released 4 days ago (patch update)\n 1.3.0 Released 4 days ago (minor update) [latest]\n 2.0.0-beta.2 Released 3 days ago (beta release)\n 2.0.0-beta.3 Released 2 days ago (beta release) [beta]\n\n${chalk.bold('With default target (latest)')}:\n\n${codeBlock(`${chalk.cyan('$')} ncu --cooldown 5`, { markdown })}\n\nNo update will be suggested because:\n\n- Latest version (1.3.0) is only 4 days old.\n- Cooldown requires versions to be at least 5 days old\n- Use \\`--cooldown 4\\` or lower to allow this update\n\n${chalk.bold('With `@beta`/`@tag` target')}:\n\n${codeBlock(`${chalk.cyan('$')} ncu --cooldown 3 --target @beta`, { markdown })}\n\nNo update will be suggested because:\n\n- Current beta (2.0.0-beta.3) is only 2 days old\n- Cooldown requires versions to be at least 3 days old\n- Use \\`--cooldown 2\\` or lower to allow this update\n\n${chalk.bold('With other targets')}:\n\n${codeBlock(`${chalk.cyan('$')} ncu --cooldown 5 --target greatest|newest|minor|patch|semver`, { markdown })}\n\nEach target will select the best version that is at least 5 days old:\n\n greatest → 1.2.0 (highest version number outside cooldown)\n newest → 2.0.0-beta.1 (most recently published version outside cooldown)\n minor → 1.2.0 (highest minor version outside cooldown)\n patch → 1.1.1 (highest patch version outside cooldown)\n\n${chalk.bold('Note for latest/tag targets')}:\n\n> :warning: For packages that update frequently (e.g. daily releases), using a long cooldown period (7+ days) with the default \\`--target latest\\` or \\`--target @tag\\` may prevent all updates since new versions will be published before older ones meet the cooldown requirement. Please consider this when setting your cooldown period.\n\nYou can also provide a custom function in your .ncurc.js file or when importing npm-check-updates as a module.\n\n> :warning: The predicate function is only available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions.\n\n${codeBlock(\n `${chalk.gray(`/** Set cooldown to 3 days but skip it for \\`@my-company\\` packages.\n @param packageName The name of the dependency.\n @returns Cooldown days restriction for given package.\n*/`)}\n${chalk.green('cooldown')}: packageName ${chalk.cyan('=>')} (packageName.startsWith(${chalk.yellow(\"'@my-company'\")}) ? ${chalk.cyan('0')} : ${chalk.cyan('3')})`,\n { markdown },\n)}\n`\n}\n\n// store CLI options separately from bin file so that they can be used to build type definitions\nconst cliOptions: CLIOption[] = [\n {\n long: 'cache',\n description: `Cache versions to a local cache file. Default \\`--cacheFile\\` is ${defaultCacheFile} and default \\`--cacheExpiration\\` is 10 minutes.`,\n type: 'boolean',\n },\n {\n long: 'cacheClear',\n description: 'Clear the default cache, or the cache file specified by `--cacheFile`.',\n type: 'boolean',\n },\n {\n long: 'cacheExpiration',\n arg: 'min',\n description: 'Cache expiration in minutes. Only works with `--cache`.',\n parse: s => parseInt(s, 10),\n default: 10,\n type: 'number',\n },\n {\n long: 'cacheFile',\n arg: 'path',\n description: 'Filepath for the cache file. Only works with `--cache`.',\n parse: s => (path.isAbsolute(s) ? s : path.join(process.cwd(), s)),\n default: defaultCacheFile,\n type: 'string',\n },\n {\n long: 'color',\n description: 'Force color in terminal.',\n type: 'boolean',\n },\n {\n long: 'concurrency',\n arg: 'n',\n description: 'Max number of concurrent HTTP requests to registry.',\n parse: s => parseInt(s, 10),\n default: 8,\n type: 'number',\n },\n {\n long: 'configFileName',\n arg: 's',\n description: 'Config file name. (default: .ncurc.{json,yml,js,cjs})',\n type: 'string',\n },\n {\n long: 'configFilePath',\n arg: 'path',\n description: 'Directory of .ncurc config file. (default: directory of `packageFile`)',\n type: 'string',\n },\n {\n long: 'cwd',\n arg: 'path',\n description: 'Working directory in which npm will be executed.',\n type: 'string',\n },\n {\n long: 'deep',\n description: `Run recursively in current working directory. Alias of (\\`--packageFile '**/package.json'\\`).`,\n type: 'boolean',\n },\n {\n long: 'ignore',\n arg: 'dirs',\n description: 'Ignore directories containing package.json files (comma-delimited).',\n type: 'string | readonly string[]',\n parse: value => (value && typeof value === 'string' ? value.split(',') : value),\n },\n {\n long: 'dep',\n arg: 'value',\n description:\n 'Check one or more sections of dependencies only: dev, optional, peer, prod, or packageManager (comma-delimited).',\n default: ['prod', 'dev', 'optional', 'packageManager'],\n parse: value => (value && typeof value === 'string' ? value.split(',') : value),\n type: 'string | readonly string[]',\n },\n {\n long: 'deprecated',\n default: true,\n description: 'Include deprecated packages. Use `--no-deprecated` to exclude deprecated packages (20–25% slower).',\n type: 'boolean',\n },\n {\n long: 'doctor',\n short: 'd',\n description:\n 'Iteratively installs upgrades and runs tests to identify breaking upgrades. Requires `-u` to execute.',\n type: 'boolean',\n help: extendedHelpDoctor,\n },\n {\n long: 'doctorInstall',\n arg: 'command',\n description:\n 'Specifies the install script to use in doctor mode. (default: `npm install` or the equivalent for your package manager)',\n type: 'string',\n },\n {\n long: 'doctorTest',\n arg: 'command',\n description: 'Specifies the test script to use in doctor mode. (default: `npm test`)',\n type: 'string',\n },\n {\n long: 'enginesNode',\n description: 'Include only packages that satisfy engines.node as specified in the package file.',\n type: 'boolean',\n },\n {\n long: 'errorLevel',\n short: 'e',\n arg: 'n',\n description:\n 'Set the error level. 1: exits with error code 0 if no errors occur. 2: exits with error code 0 if no packages need updating (useful for continuous integration).',\n parse: s => parseInt(s, 10),\n default: 1,\n type: 'number',\n },\n {\n long: 'filter',\n short: 'f',\n arg: 'p',\n description:\n 'Include only package names matching the given string, wildcard, glob, comma-or-space-delimited list, /regex/, or predicate function.',\n type: 'string | RegExp | readonly (string | RegExp)[] | FilterFunction',\n parse: (value, accum) => [...(accum || []), value],\n help: extendedHelpFilterFunction,\n },\n {\n long: 'filterResults',\n arg: 'fn',\n cli: false,\n description: `Filters results based on a user provided predicate function after fetching new versions.`,\n type: 'FilterResultsFunction',\n help: extendedHelpFilterResults,\n },\n {\n long: 'filterVersion',\n arg: 'p',\n description: 'Filter on package version using comma-or-space-delimited list, /regex/, or predicate function.',\n type: 'string | RegExp | readonly (string | RegExp)[] | FilterFunction',\n parse: (value, accum) => [...(accum || []), value],\n help: extendedHelpFilterVersionFunction,\n },\n {\n long: 'format',\n arg: 'value',\n description:\n 'Modify the output formatting or show additional information. Specify one or more comma-delimited values: dep, group, ownerChanged, repo, time, lines, installedVersion.',\n parse: value => (typeof value === 'string' ? value.split(',') : value),\n default: [],\n type: 'readonly string[]',\n choices: ['dep', 'group', 'ownerChanged', 'repo', 'time', 'lines', 'installedVersion'],\n help: extendedHelpFormat,\n },\n {\n long: 'global',\n short: 'g',\n description: 'Check global packages instead of in the current project.',\n type: 'boolean',\n },\n {\n long: 'groupFunction',\n arg: 'fn',\n cli: false,\n description: `Customize how packages are divided into groups when using \\`--format group\\`.`,\n type: 'GroupFunction',\n help: extendedHelpGroupFunction,\n },\n {\n long: 'install',\n arg: 'value',\n description: 'Control the auto-install behavior: always, never, prompt.',\n help: extendedHelpInstall,\n default: 'prompt',\n choices: ['always', 'never', 'prompt'],\n type: `'always' | 'never' | 'prompt'`,\n },\n {\n long: 'interactive',\n short: 'i',\n description: 'Enable interactive prompts for each dependency; implies `-u` unless one of the json options are set.',\n type: 'boolean',\n },\n {\n // program.json is set to true in programInit if any options that begin with 'json' are true\n long: 'jsonAll',\n short: 'j',\n description: 'Output new package file instead of human-readable message.',\n type: 'boolean',\n },\n {\n long: 'jsonDeps',\n description:\n 'Like `jsonAll` but only lists `dependencies`, `devDependencies`, `optionalDependencies`, etc of the new package data.',\n type: 'boolean',\n },\n {\n long: 'jsonUpgraded',\n description: 'Output upgraded dependencies in json.',\n type: 'boolean',\n },\n {\n long: 'loglevel',\n short: 'l',\n arg: 'n',\n description: 'Amount to log: silent, error, minimal, warn, info, verbose, silly.',\n default: 'warn',\n type: 'string',\n },\n {\n long: 'mergeConfig',\n description: `Merges nested configs with the root config file for \\`--deep\\` or \\`--packageFile\\` options. (default: false)`,\n type: 'boolean',\n },\n {\n long: 'minimal',\n short: 'm',\n description: 'Do not upgrade newer versions that are already satisfied by the version range according to semver.',\n type: 'boolean',\n },\n {\n long: 'packageData',\n arg: 'value',\n description: 'Package file data (you can also use stdin).',\n type: 'string | PackageFile',\n },\n {\n long: 'packageFile',\n arg: 'path|glob',\n description: 'Package file(s) location. (default: ./package.json)',\n type: 'string',\n },\n {\n long: 'packageManager',\n short: 'p',\n arg: 's',\n description: 'npm, yarn, pnpm, deno, bun, staticRegistry (default: npm).',\n help: extendedHelpPackageManager,\n type: `'npm' | 'yarn' | 'pnpm' | 'deno' | 'bun' | 'staticRegistry'`,\n },\n {\n long: 'peer',\n description: 'Check peer dependencies of installed packages and filter updates to compatible versions.',\n type: 'boolean',\n help: extendedHelpPeer,\n },\n {\n long: 'pre',\n arg: 'n',\n description:\n 'Include prerelease versions, e.g. -alpha.0, -beta.5, -rc.2. Automatically set to 1 when `--target` is newest or greatest, or when the current version is a prerelease. (default: 0)',\n parse: s => !!parseInt(s, 10),\n type: 'number',\n },\n {\n long: 'prefix',\n arg: 'path',\n description: 'Current working directory of npm.',\n type: 'string',\n },\n {\n long: 'registry',\n short: 'r',\n arg: 'uri',\n description: 'Specify the registry to use when looking up package versions.',\n type: 'string',\n },\n {\n long: 'registryType',\n arg: 'type',\n description:\n 'Specify whether --registry refers to a full npm registry or a simple JSON file or url: npm, json. (default: npm)',\n help: extendedHelpRegistryType,\n type: `'npm' | 'json'`,\n },\n {\n long: 'reject',\n short: 'x',\n arg: 'p',\n description:\n 'Exclude packages matching the given string, wildcard, glob, comma-or-space-delimited list, /regex/, or predicate function.',\n type: 'string | RegExp | readonly (string | RegExp)[] | FilterFunction',\n parse: (value, accum) => [...(accum || []), value],\n help: extendedHelpRejectFunction,\n },\n {\n long: 'rejectVersion',\n arg: 'p',\n description: 'Exclude package.json versions using comma-or-space-delimited list, /regex/, or predicate function.',\n type: 'string | RegExp | readonly (string | RegExp)[] | FilterFunction',\n parse: (value, accum) => [...(accum || []), value],\n help: extendedHelpRejectVersionFunction,\n },\n {\n long: 'removeRange',\n description: 'Remove version ranges from the final package version.',\n type: 'boolean',\n },\n {\n long: 'root',\n default: true,\n description:\n 'Runs updates on the root project in addition to specified workspaces. Only allowed with `--workspace` or `--workspaces`.',\n type: 'boolean',\n },\n {\n long: 'retry',\n arg: 'n',\n description: 'Number of times to retry failed requests for package info.',\n parse: s => parseInt(s, 10),\n default: 3,\n type: 'number',\n },\n {\n long: 'silent',\n short: 's',\n description: \"Don't output anything. Alias for `--loglevel` silent.\",\n type: 'boolean',\n },\n {\n long: 'stdin',\n description: 'Read package.json from stdin.',\n type: 'string',\n },\n {\n long: 'target',\n short: 't',\n arg: 'value',\n description: `Determines the version to upgrade to: latest, newest, greatest, minor, patch, semver, \\`@[tag]\\`, or [function]. (default: latest)`,\n help: extendedHelpTarget,\n type: `${supportedVersionTargets.map(s => `'${s}'`).join(' | ')} | ${'`@${string}`'} | TargetFunction`,\n },\n {\n long: 'timeout',\n arg: 'ms',\n description: 'Global timeout in milliseconds. (default: no global timeout and 30 seconds per npm-registry-fetch)',\n parse: s => parseInt(s, 10),\n type: 'number',\n },\n {\n long: 'upgrade',\n short: 'u',\n description: 'Overwrite package file with upgraded versions instead of just outputting to console.',\n type: 'boolean',\n },\n {\n long: 'verbose',\n description: 'Log additional information for debugging. Alias for `--loglevel` verbose.',\n type: 'boolean',\n },\n {\n long: 'workspace',\n arg: 's',\n parse: (value, accum) => [...accum, value],\n default: [],\n description: 'Run on one or more specified workspaces. Add `--no-root` to exclude the root project.',\n type: 'readonly string[]',\n },\n {\n long: 'workspaces',\n short: 'w',\n description: 'Run on all workspaces. Add `--no-root` to exclude the root project.',\n type: 'boolean',\n },\n {\n long: 'cooldown',\n short: 'c',\n arg: 'n',\n description:\n 'Sets a minimum age (in days) for package versions to be considered for upgrade, reducing the risk of installing newly published, potentially compromised packages.',\n type: `number | CooldownFunction`,\n help: extendedHelpCooldown,\n parse: s => (typeof s === 'function' ? s : parseInt(s, 10)),\n },\n]\n\n// put cliOptions into an object for O(1) lookups\nexport const cliOptionsMap = cliOptions.reduce(\n (accum, option) => ({\n ...accum,\n ...(option.short ? { [option.short]: option } : null),\n ...(option.long ? { [option.long]: option } : null),\n }),\n {} as Index<CLIOption>,\n)\n\nconst cliOptionsSorted = sortBy(cliOptions, v => v.long)\n\nexport default cliOptionsSorted\n","import fs from 'fs/promises'\nimport os from 'os'\nimport path from 'path'\nimport { Options } from '../types/Options'\n\nconst lockFileNames = [\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n 'deno.json',\n 'deno.jsonc',\n 'bun.lock',\n 'bun.lockb',\n]\n\n/**\n * Goes up the filesystem tree until it finds a lock file. (e.g. \"package-lock.json\", \"yarn.lock\", etc.)\n *\n * @param readdir This is only a parameter so that it can be used in tests.\n * @returns The path of the directory that contains the lockfile and the\n * filename of the lockfile.\n */\nexport default async function findLockfile(\n options: Pick<Options, 'cwd' | 'packageFile'>,\n readdir: (_path: string) => Promise<string[]> = fs.readdir,\n): Promise<{ directoryPath: string; filename: string } | null> {\n try {\n // Get boundaries to stop searching.\n const homeDir = os.homedir()\n const tempDir = os.tmpdir()\n\n // 1. explicit cwd\n // 2. same directory as package file\n // 3. current directory\n let currentPath = options.cwd ? options.cwd : options.packageFile ? path.dirname(options.packageFile) : '.'\n currentPath = path.resolve(currentPath)\n\n while (true) {\n const files = await readdir(currentPath)\n\n for (const filename of lockFileNames) {\n if (files.includes(filename)) {\n return { directoryPath: currentPath, filename }\n }\n }\n\n const pathParent = path.resolve(currentPath, '..')\n if (\n // Stop if we have reached the root of the file system.\n pathParent === currentPath ||\n // Stop if we have reached the root of a user's home directory.\n pathParent === homeDir ||\n // Stop if we have reached the root of the temporary directory.\n pathParent === tempDir\n ) {\n break\n }\n\n currentPath = pathParent\n }\n } catch (e) {\n // if readdirSync fails, return null\n }\n\n return null\n}\n","import fs from 'fs/promises'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { PackageManagerName } from '../types/PackageManagerName'\nimport findLockfile from './findLockfile'\n\n// map lockfiles to package managers\nconst packageManagerLockfileMap: Index<PackageManagerName> = {\n 'package-lock': 'npm',\n yarn: 'yarn',\n 'pnpm-lock': 'pnpm',\n deno: 'deno',\n bun: 'bun',\n}\n\n/**\n * Get the package manager being used to run the command.\n * When checking global packages, we need to do it this way since there is no\n * lockfile in the global directory.\n */\nconst getRunningPackageManager = (): PackageManagerName => {\n const userAgent = process.env.npm_config_user_agent ?? ''\n const execpath = process.env.npm_execpath ?? ''\n\n if (\n userAgent.startsWith('yarn/') ||\n execpath.includes('yarn') ||\n __dirname.includes('/yarn/') ||\n __dirname.includes('\\\\Yarn\\\\')\n )\n return 'yarn'\n if (\n userAgent.startsWith('pnpm/') ||\n execpath.includes('pnpm') ||\n __dirname.includes('/pnpm/') ||\n __dirname.includes('\\\\pnpm\\\\')\n )\n return 'pnpm'\n if (\n userAgent.startsWith('bun/') ||\n typeof Bun !== 'undefined' ||\n process.versions.bun ||\n __dirname.includes('/.bun/') ||\n __dirname.includes('\\\\.bun\\\\')\n )\n return 'bun'\n\n return 'npm'\n}\n\n/**\n * If the packageManager option was not provided, look at the lockfiles to\n * determine which package manager is being used.\n */\nconst determinePackageManager = async (\n options: Options,\n // only for testing\n readdir: (_path: string) => Promise<string[]> = fs.readdir,\n): Promise<PackageManagerName> => {\n if (options.packageManager) return options.packageManager\n else if (options.global) return getRunningPackageManager()\n\n const lockfileName = (await findLockfile(options, readdir))?.filename\n return lockfileName ? packageManagerLockfileMap[lockfileName.split('.')[0]] : 'npm'\n}\n\nexport default determinePackageManager\n","/* eslint-disable */\n\n/*\n\nThis is stripped down version of the deprecated figgy-pudding. It is used by libnpmconfig, which is also deprecated and has been brought into the codebase to avoid deprecation warnings.\n\nhttps://github.com/npm/figgy-pudding\n\n*/\n\nclass FiggyPudding {\n constructor(specs, opts, providers) {\n this.__specs = specs || {}\n this.__opts = opts || {}\n this.__providers = reverse(providers.filter(x => x != null && typeof x === 'object'))\n this.__isFiggyPudding = true\n }\n get(key) {\n return pudGet(this, key, true)\n }\n toJSON() {\n const obj = {}\n this.forEach((val, key) => {\n obj[key] = val\n })\n return obj\n }\n forEach(fn, thisArg = this) {\n for (let [key, value] of this.entries()) {\n fn.call(thisArg, value, key, this)\n }\n }\n *entries(_matcher) {\n for (let key of Object.keys(this.__specs)) {\n yield [key, this.get(key)]\n }\n const matcher = _matcher || this.__opts.other\n if (matcher) {\n const seen = new Set()\n for (let p of this.__providers) {\n const iter = p.entries ? p.entries(matcher) : entries(p)\n for (let [key, val] of iter) {\n if (matcher(key) && !seen.has(key)) {\n seen.add(key)\n yield [key, val]\n }\n }\n }\n }\n }\n concat(...moreConfig) {\n return new Proxy(\n new FiggyPudding(this.__specs, this.__opts, reverse(this.__providers).concat(moreConfig)),\n proxyHandler,\n )\n }\n}\n\nfunction pudGet(pud, key, validate) {\n let spec = pud.__specs[key]\n if (!spec) {\n spec = {}\n }\n let ret\n for (let p of pud.__providers) {\n ret = tryGet(key, p)\n if (ret !== undefined) {\n break\n }\n }\n if (ret === undefined && spec.default !== undefined) {\n if (typeof spec.default === 'function') {\n return spec.default(pud)\n } else {\n return spec.default\n }\n } else {\n return ret\n }\n}\n\nfunction tryGet(key, p) {\n let ret\n if (p.__isFiggyPudding) {\n ret = pudGet(p, key, false)\n } else {\n ret = p[key]\n }\n return ret\n}\n\nconst proxyHandler = {\n get(obj, prop) {\n if (typeof prop === 'symbol' || prop.slice(0, 2) === '__' || prop in FiggyPudding.prototype) {\n return obj[prop]\n }\n return obj.get(prop)\n },\n}\n\nexport default function figgyPudding(specs, opts) {\n function factory(...providers) {\n return new Proxy(new FiggyPudding(specs, opts, providers), proxyHandler)\n }\n return factory\n}\n\nfunction reverse(arr) {\n const ret = []\n arr.forEach(x => ret.unshift(x))\n return ret\n}\n\nfunction entries(obj) {\n return Object.keys(obj).map(k => [k, obj[k]])\n}\n","/*\n\nThis is a copy of the deprecated libnpmconfig library. It has been brought into the codebase to avoid deprecation warnings.\n\nhttps://github.com/npm/libnpmconfig\n\n*/\nimport { findUpSync } from 'find-up'\nimport ini from 'ini'\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport figgyPudding from '../figgy-pudding'\n\nconst NpmConfig = figgyPudding(\n {},\n {\n // Open up the pudding object.\n other() {\n return true\n },\n },\n)\n\nconst ConfigOpts = figgyPudding({\n cache: { default: path.join(process.env.HOME || os.homedir(), '.npm') },\n configNames: { default: ['npmrc', '.npmrc'] },\n envPrefix: { default: /^npm_config_/i },\n cwd: { default: () => process.cwd() },\n globalconfig: {\n default: () => path.join(getGlobalPrefix(), 'etc', 'npmrc'),\n },\n userconfig: { default: path.join(process.env.HOME || os.homedir(), '.npmrc') },\n})\n\n/** Gets the npm config. */\nfunction getNpmConfig(_opts, _builtin) {\n const builtin = ConfigOpts(_builtin)\n const env = {}\n Object.keys(process.env).forEach(key => {\n if (!key.match(builtin.envPrefix)) return\n const newKey = key\n .toLowerCase()\n .replace(builtin.envPrefix, '')\n .replace(/(?!^)_/g, '-')\n env[newKey] = process.env[key]\n })\n const cli = NpmConfig(_opts)\n const userConfPath = builtin.userconfig || cli.userconfig || env.userconfig\n const user = userConfPath && maybeReadIni(userConfPath)\n const globalConfPath = builtin.globalconfig || cli.globalconfig || env.globalconfig\n const global = globalConfPath && maybeReadIni(globalConfPath)\n const projConfPath = findUpSync(builtin.configNames, { cwd: builtin.cwd })\n let proj = {}\n if (projConfPath && projConfPath !== userConfPath) {\n proj = maybeReadIni(projConfPath)\n }\n const newOpts = NpmConfig(builtin, global, user, proj, env, cli)\n if (newOpts.cache) {\n return newOpts.concat({\n cache: path.resolve(\n cli.cache || env.cache\n ? builtin.cwd\n : proj.cache\n ? path.dirname(projConfPath)\n : user.cache\n ? path.dirname(userConfPath)\n : global.cache\n ? path.dirname(globalConfPath)\n : path.dirname(userConfPath),\n newOpts.cache,\n ),\n })\n } else {\n return newOpts\n }\n}\n\n/** Try to read the given ini file. */\nfunction maybeReadIni(f) {\n let txt\n try {\n txt = fs.readFileSync(f, 'utf8')\n } catch (err) {\n if (err.code === 'ENOENT') {\n return ''\n } else {\n throw err\n }\n }\n return ini.parse(txt)\n}\n\n/** Get the global node PREFIX. */\nfunction getGlobalPrefix() {\n if (process.env.PREFIX) {\n return process.env.PREFIX\n } else if (process.platform === 'win32') {\n // c:\\node\\node.exe --> prefix=c:\\node\\\n return path.dirname(process.execPath)\n } else {\n // /usr/local/bin/node --> prefix=/usr/local\n let pref = path.dirname(path.dirname(process.execPath))\n // destdir only is respected on Unix\n if (process.env.DESTDIR) {\n pref = path.join(process.env.DESTDIR, pref)\n }\n return pref\n }\n}\n\nexport default getNpmConfig\n","import semver from 'semver'\nimport * as versionUtil from '../lib/version-util'\nimport { CooldownFunction } from '../types/CooldownFunction'\nimport { Index } from '../types/IndexType'\nimport { Maybe } from '../types/Maybe'\nimport { Options } from '../types/Options'\nimport { Packument } from '../types/Packument'\nimport { Version } from '../types/Version'\n\n/**\n * @param versionResult Available version\n * @param options Options\n * @returns True if deprecated versions are allowed or the version is not deprecated\n */\nexport function allowDeprecatedOrIsNotDeprecated(versionResult: Partial<Packument>, options: Options): boolean {\n return options.deprecated || !versionResult.deprecated\n}\n\n/**\n * @param versionResult Available version\n * @param options Options\n * @returns True if pre-releases are allowed or the version is not a pre-release\n */\nexport function allowPreOrIsNotPre(versionResult: Partial<Packument>, options: Options): boolean {\n if (options.pre) return true\n return !versionResult.version || !versionUtil.isPre(versionResult.version)\n}\n\n/**\n * Returns true if the node engine requirement is satisfied or not specified for a given package version.\n *\n * @param versionResult Version object returned by packument.\n * @param nodeEngineVersion The value of engines.node in the package file.\n * @returns True if the node engine requirement is satisfied or not specified.\n */\nexport function satisfiesNodeEngine(versionResult: Partial<Packument>, nodeEngineVersion: Maybe<string>): boolean {\n if (!nodeEngineVersion) return true\n const minVersion = semver.minVersion(nodeEngineVersion)?.version\n if (!minVersion) return true\n const versionNodeEngine: string | undefined = versionResult?.engines?.node\n return !versionNodeEngine || semver.satisfies(minVersion, versionNodeEngine)\n}\n\n/**\n * Returns true if the peer dependencies requirement is satisfied or not specified for a given package version.\n *\n * @param versionResult Version object returned by packument.\n * @param peerDependencies The list of peer dependencies.\n * @returns True if the peer dependencies are satisfied or not specified.\n */\nexport function satisfiesPeerDependencies(versionResult: Partial<Packument>, peerDependencies: Index<Index<Version>>) {\n if (!peerDependencies) return true\n return Object.values(peerDependencies).every(\n peers =>\n peers[versionResult.name!] === undefined || semver.satisfies(versionResult.version!, peers[versionResult.name!]),\n )\n}\n\n/**\n * Determines if a package version satisfies the specified cooldown period.\n *\n * @param versionResult - Partial packument object containing version and release time information.\n * @param cooldownDays - The cooldown period in days. If not specified or invalid, the function returns true.\n * @returns `true` if the version's release date is older than the cooldown period; otherwise, `false`.\n */\nexport function satisfiesCooldownPeriod(\n versionResult: Partial<Packument>,\n cooldownDaysOrPredicateFn: Maybe<number> | Maybe<CooldownFunction>,\n): boolean {\n const version = versionResult.version\n const versionTimeData = versionResult?.time?.[version!]\n\n if (!cooldownDaysOrPredicateFn) return true\n if (!versionTimeData) return false\n\n const versionReleaseDate = new Date(versionTimeData)\n const DAY_AS_MS = 86400000 // milliseconds in a day\n const cooldownDays =\n typeof cooldownDaysOrPredicateFn === 'function'\n ? (cooldownDaysOrPredicateFn(versionResult.name!) ?? 0) // 0 days = no cooldown\n : cooldownDaysOrPredicateFn\n\n return Date.now() - versionReleaseDate.getTime() >= cooldownDays * DAY_AS_MS\n}\n\n/** Returns a composite predicate that filters out deprecated, prerelease, and node engine incompatibilities from version objects returns by packument. */\nexport function filterPredicate(options: Options) {\n const predicates: (((o: Partial<Packument>) => boolean) | null)[] = [\n o => allowDeprecatedOrIsNotDeprecated(o, options),\n o => allowPreOrIsNotPre(o, options),\n options.enginesNode ? o => satisfiesNodeEngine(o, options.nodeEngineVersion) : null,\n options.peerDependencies ? o => satisfiesPeerDependencies(o, options.peerDependencies!) : null,\n options.cooldown ? o => satisfiesCooldownPeriod(o, options.cooldown) : null,\n ]\n\n return (o: Partial<Packument>) => predicates.every(predicate => (predicate ? predicate(o) : true))\n}\n","import camelCase from 'camelcase'\nimport memoize from 'fast-memoize'\nimport fs from 'fs'\nimport ini from 'ini'\nimport npmRegistryFetch from 'npm-registry-fetch'\nimport path from 'path'\nimport nodeSemver from 'semver'\nimport { parseRange } from 'semver-utils'\nimport spawn from 'spawn-please'\nimport untildify from 'untildify'\nimport pkg from '../../package.json'\nimport filterObject from '../lib/filterObject'\nimport { keyValueBy } from '../lib/keyValueBy'\nimport libnpmconfig from '../lib/libnpmconfig'\nimport { print, printSorted } from '../lib/logging'\nimport { sortBy } from '../lib/sortBy'\nimport * as versionUtil from '../lib/version-util'\nimport { GetVersion } from '../types/GetVersion'\nimport { Index } from '../types/IndexType'\nimport { MockedVersions } from '../types/MockedVersions'\nimport { NpmConfig } from '../types/NpmConfig'\nimport { NpmOptions } from '../types/NpmOptions'\nimport { Options } from '../types/Options'\nimport { Packument } from '../types/Packument'\nimport { SpawnOptions } from '../types/SpawnOptions'\nimport { SpawnPleaseOptions } from '../types/SpawnPleaseOptions'\nimport { Version } from '../types/Version'\nimport { VersionResult } from '../types/VersionResult'\nimport { VersionSpec } from '../types/VersionSpec'\nimport { filterPredicate, satisfiesCooldownPeriod, satisfiesNodeEngine } from './filters'\n\nconst EXPLICIT_RANGE_OPS = new Set(['-', '||', '&&', '<', '<=', '>', '>='])\n\n/** Returns true if the spec is an explicit version range (not ~ or ^). */\nconst isExplicitRange = (spec: VersionSpec) => {\n const range = parseRange(spec)\n return range.some(parsed => EXPLICIT_RANGE_OPS.has(parsed.operator || ''))\n}\n\n/** Returns true if the version is sa valid, exact version. */\nconst isExactVersion = (version: Version) =>\n version && (!nodeSemver.validRange(version) || versionUtil.isWildCard(version))\n\n/** Fetches a packument or dist-tag from the npm registry. */\nconst fetchPartialPackument = async (\n name: string,\n fields: (keyof Packument)[],\n tag: string | null,\n opts: npmRegistryFetch.FetchOptions = {},\n version?: Version,\n): Promise<Partial<Packument>> => {\n const corgiDoc = 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*'\n const fullDoc = 'application/json'\n\n const registry = npmRegistryFetch.pickRegistry(name, opts)\n const headers = {\n 'user-agent': opts.userAgent || `npm-check-updates/${pkg.version} node/${process.version}`,\n 'ncu-version': pkg.version,\n 'ncu-pkg-id': `registry:${name}`,\n accept: opts.fullMetadata ? fullDoc : corgiDoc,\n ...opts.headers,\n }\n const url = new URL(\n // since the registry API expects /package or /package/version encoding\n // scoped packages is needed as to not treat the package scope as the full\n // package name and the actual package name as the version/dist-tag\n encodeURIComponent(name),\n // the WhatWG URL standard, when given a base URL to place the first\n // parameter relative to, will find the dirname of the base, treating the\n // last segment as a file name and not a directory name if it isn't\n // terminated by a / and thus remove it before adding the first argument\n // to the URL.\n // this is undesirable for registries configured without a trailing slash\n // in the npm config since, for example looking up the package @foo/bar\n // will give the following results given these configured registry URL:s\n // https://example.com/npm => https://example.com/%40foo%2fbar\n // https://example.com/npm/ => https://example.com/npm/%40foo%2fbar\n // however, like npm itself does there should be leniency allowed in this.\n registry.endsWith('/') ? registry : `${registry}/`,\n )\n if (version) {\n url.pathname += `/${version}`\n }\n const fetchOptions = {\n ...opts,\n headers,\n spec: name,\n }\n\n try {\n if (opts.fullMetadata) {\n return npmRegistryFetch.json(url.href, fetchOptions)\n } else {\n tag = tag || 'latest'\n // typescript does not type async iterable stream correctly so we need to cast it\n const stream = npmRegistryFetch.json.stream(url.href, '$*', fetchOptions) as unknown as IterableIterator<{\n key: keyof Packument\n value: Packument[keyof Packument]\n }>\n\n const partialPackument: Partial<Packument> = { name }\n\n for await (const { key, value } of stream) {\n if (fields.includes(key)) {\n // TODO: Fix type\n partialPackument[key] = value as any\n if (Object.keys(partialPackument).length === fields.length + 1) {\n break\n }\n }\n }\n\n return partialPackument\n }\n } catch (err: any) {\n if (err.code !== 'E404' || opts.fullMetadata) {\n throw err\n }\n\n // possible that corgis are not supported by this registry\n return fetchPartialPackument(name, fields, tag, { ...opts, fullMetadata: true }, version)\n }\n}\n\n/**\n * Decorates a tag-specific/version-specific packument object with the package name and `time` property from the full packument,\n * if the `time` information for the tag's version exists.\n *\n * @param tagPackument - A partial packument object representing a specific tag/version.\n * @param packument - The full packument object, potentially containing time metadata for versions.\n * @returns A new packument object that includes the `time` property if available for the tag's version and package name.\n */\nconst decorateTagPackumentWithTimeAndName = (\n tagPackument: Partial<Packument>,\n packument: Partial<Packument>,\n): Partial<Packument> => {\n const version = tagPackument.version\n\n return {\n ...tagPackument,\n name: packument.name,\n ...(packument?.time?.[version!] ? { time: packument.time } : null),\n }\n}\n\n/** Normalizes the keys of an npm config for pacote. */\nexport const normalizeNpmConfig = (\n npmConfig: NpmConfig,\n // config path used to determine relative cafile paths\n configPath?: string,\n): NpmConfig => {\n const npmConfigToPacoteMap = {\n cafile: (capath: string): undefined | { ca: string[] } => {\n // load-cafile, based on github.com/npm/cli/blob/40c1b0f/lib/config/load-cafile.js\n if (!capath) return\n // synchronous since it is loaded once on startup, and to avoid complexity in libnpmconfig\n // https://github.com/raineorshine/npm-check-updates/issues/636?notification_referrer_id=MDE4Ok5vdGlmaWNhdGlvblRocmVhZDc0Njk2NjAzMjo3NTAyNzY%3D\n const cadata = fs.readFileSync(path.resolve(configPath || '', untildify(capath)), 'utf8')\n const delim = '-----END CERTIFICATE-----'\n const output: string[] = cadata\n .split(delim)\n .filter(xs => !!xs.trim())\n .map(xs => `${xs.trimStart()}${delim}`)\n return { ca: output }\n },\n maxsockets: 'maxSockets',\n 'strict-ssl': 'strictSSL',\n }\n\n // all config variables are read in as strings, so we need to type coerce non-strings\n // lowercased and hyphens removed for comparison purposes\n const keyTypes: Index<'boolean' | 'number'> = {\n all: 'boolean',\n allowsameversion: 'boolean',\n audit: 'boolean',\n binlinks: 'boolean',\n color: 'boolean',\n commithooks: 'boolean',\n description: 'boolean',\n dev: 'boolean',\n diffignoreallspace: 'boolean',\n diffnameonly: 'boolean',\n diffnoprefix: 'boolean',\n difftext: 'boolean',\n dryrun: 'boolean',\n enginestrict: 'boolean',\n force: 'boolean',\n foregroundscripts: 'boolean',\n formatpackagelock: 'boolean',\n fund: 'boolean',\n gittagversion: 'boolean',\n global: 'boolean',\n globalstyle: 'boolean',\n ifpresent: 'boolean',\n ignorescripts: 'boolean',\n includestaged: 'boolean',\n includeworkspaceroot: 'boolean',\n installlinks: 'boolean',\n json: 'boolean',\n legacybundling: 'boolean',\n legacypeerdeps: 'boolean',\n link: 'boolean',\n long: 'boolean',\n offline: 'boolean',\n omitlockfileregistryresolved: 'boolean',\n packagelock: 'boolean',\n packagelockonly: 'boolean',\n parseable: 'boolean',\n preferoffline: 'boolean',\n preferonline: 'boolean',\n progress: 'boolean',\n readonly: 'boolean',\n rebuildbundle: 'boolean',\n save: 'boolean',\n savebundle: 'boolean',\n savedev: 'boolean',\n saveexact: 'boolean',\n saveoptional: 'boolean',\n savepeer: 'boolean',\n saveprod: 'boolean',\n shrinkwrap: 'boolean',\n signgitcommit: 'boolean',\n signgittag: 'boolean',\n strictpeerdeps: 'boolean',\n strictssl: 'boolean',\n timing: 'boolean',\n unicode: 'boolean',\n updatenotifier: 'boolean',\n usage: 'boolean',\n version: 'boolean',\n versions: 'boolean',\n workspacesupdate: 'boolean',\n diffunified: 'number',\n fetchretries: 'number',\n fetchretryfactor: 'number',\n fetchretrymaxtimeout: 'number',\n fetchretrymintimeout: 'number',\n fetchtimeout: 'number',\n logsmax: 'number',\n maxsockets: 'number',\n searchlimit: 'number',\n searchstaleness: 'number',\n ssopollfrequency: 'number',\n timeout: 'number',\n }\n\n /** Parses a string to a boolean. */\n const stringToBoolean = (s: string): boolean => !!s && s !== 'false' && s !== '0'\n\n /** Parses a string to a number. */\n const stringToNumber = (s: string): number => parseInt(s) || 0\n\n // needed until pacote supports full npm config compatibility\n // See: https://github.com/zkat/pacote/issues/156\n const config: NpmConfig = keyValueBy(npmConfig, (key: string, value: NpmConfig[keyof NpmConfig]) => {\n // replace env ${VARS} in strings with the process.env value\n const normalizedValue =\n typeof value !== 'string'\n ? value\n : // parse stringified booleans\n keyTypes[key.replace(/-/g, '').toLowerCase()] === 'boolean'\n ? stringToBoolean(value)\n : keyTypes[key.replace(/-/g, '').toLowerCase()] === 'number'\n ? stringToNumber(value)\n : value.replace(/\\${([^}]+)}/, (_, envVar) => process.env[envVar] as string)\n\n // normalize the key for pacote\n const { [key]: pacoteKey }: Index<NpmConfig[keyof NpmConfig]> = npmConfigToPacoteMap\n\n return typeof pacoteKey === 'string'\n ? // key is mapped to a string\n { [pacoteKey]: normalizedValue }\n : // key is mapped to a function\n typeof pacoteKey === 'function'\n ? { ...(pacoteKey(normalizedValue.toString()) as any) }\n : // otherwise assign the camel-cased key\n { [key.match(/^[a-z]/i) ? camelCase(key) : key]: normalizedValue }\n })\n\n return config\n}\n\n/** Finds and parses the npm config at the given path. If the path does not exist, returns null. If no path is provided, finds and merges the global and user npm configs using libnpmconfig and sets cache: false. */\nconst findNpmConfig = memoize((configPath?: string): NpmConfig | null => {\n let config\n\n if (configPath) {\n try {\n config = ini.parse(fs.readFileSync(configPath, 'utf-8'))\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return null\n } else {\n throw err\n }\n }\n } else {\n // libnpmconfig incorrectly (?) ignores NPM_CONFIG_USERCONFIG because it is always overridden by the default builtin.userconfig\n // set userconfig manually so that it is prioritized\n const opts = libnpmconfig(null, {\n userconfig: process.env.npm_config_userconfig || process.env.NPM_CONFIG_USERCONFIG,\n })\n config = {\n ...opts.toJSON(),\n cache: false,\n }\n }\n\n return normalizeNpmConfig(config, configPath)\n})\n\n// get the base config that is used for all npm queries\n// this may be partially overwritten by .npmrc config files when using --deep\nconst npmConfig = findNpmConfig()\n\n/**\n * Parse JSON and throw an informative error on failure.\n *\n * @param result Data to be parsed\n * @param data\n * @returns\n */\nexport function parseJson<R>(result: string, data: { command?: string; packageName?: string }): R {\n let json\n try {\n json = JSON.parse(result)\n } catch (err) {\n throw new Error(\n `Expected JSON from \"${data.command}\".${\n data.packageName ? ` There could be problems with the ${data.packageName} package.` : ''\n } ${result ? 'Instead received: ' + result : 'Received empty response.'}`,\n )\n }\n return json as R\n}\n\n/**\n * Check if package author changed between current and upgraded version.\n *\n * @param packageName Name of the package\n * @param currentVersion Current version declaration (may be range)\n * @param upgradedVersion Upgraded version declaration (may be range)\n * @param npmConfigLocal Additional npm config variables that are merged into the system npm config\n * @returns A promise that fulfills with boolean value.\n */\nexport async function packageAuthorChanged(\n packageName: string,\n currentVersion: VersionSpec,\n upgradedVersion: VersionSpec,\n options: Options = {},\n npmConfigLocal?: NpmConfig,\n): Promise<boolean> {\n const result = await fetchPartialPackument(packageName, ['versions'], null, {\n ...npmConfigLocal,\n ...npmConfig,\n fullMetadata: true,\n ...(options.registry ? { registry: options.registry, silent: true } : null),\n })\n if (result.versions) {\n const pkgVersions = Object.keys(result.versions)\n const current = nodeSemver.minSatisfying(pkgVersions, currentVersion)\n const upgraded = nodeSemver.maxSatisfying(pkgVersions, upgradedVersion)\n if (current && upgraded && result.versions[current]._npmUser && result.versions[upgraded]._npmUser) {\n const currentAuthor = result.versions[current]._npmUser?.name\n const latestAuthor = result.versions[upgraded]._npmUser?.name\n return currentAuthor !== latestAuthor\n }\n }\n\n return false\n}\n\n/** Returns true if an object is a Packument. */\nconst isPackument = (o: any): o is Partial<Packument> => !!(o && (o.name || o.engines || o.version || o.versions))\n\n/** Creates a function with the same signature as fetchUpgradedPackument that always returns the given versions. */\nexport const mockFetchUpgradedPackument =\n (mockReturnedVersions: MockedVersions): typeof fetchUpgradedPackument =>\n (name: string, fields: (keyof Packument)[], currentVersion: Version, options: Options) => {\n // a partial Packument\n const partialPackument =\n typeof mockReturnedVersions === 'function'\n ? mockReturnedVersions(options)?.[name]\n : typeof mockReturnedVersions === 'string' || isPackument(mockReturnedVersions)\n ? mockReturnedVersions\n : mockReturnedVersions[name]\n\n const version = isPackument(partialPackument) ? partialPackument.version : partialPackument\n\n if (!version) {\n throw new Error(\n `fetchUpgradedPackument is mocked, but no mock version was supplied for ${name}. Make sure that all dependencies are mocked. `,\n )\n }\n\n const time = (isPackument(partialPackument) && partialPackument.time?.[version]) || new Date().toISOString()\n const packument: Packument = {\n name,\n 'dist-tags': {\n [options.distTag || 'latest']: version,\n },\n engines: { node: '' },\n time: {\n [version]: time,\n },\n version,\n // overwritten below\n versions: {},\n ...(isPackument(partialPackument) ? partialPackument : null),\n }\n\n const { versions: _, ...packumentWithoutVersions } = packument\n\n return Promise.resolve({\n ...packument,\n versions: {\n ...((isPackument(partialPackument) && partialPackument.versions) || {\n [version]: packumentWithoutVersions,\n }),\n },\n })\n }\n\n/** Merges the workspace, global, user, local, project, and cwd npm configs (in that order). */\n// Note that this is memoized on configs and options, but not on package name. This avoids duplicate messages when log level is verbose. findNpmConfig is memoized on config path, so it is not expensive to call multiple times.\nconst mergeNpmConfigs = memoize(\n (\n {\n npmConfigLocal,\n npmConfigUser,\n npmConfigWorkspaceProject,\n }: {\n npmConfigLocal?: NpmConfig\n npmConfigUser?: NpmConfig\n npmConfigWorkspaceProject?: NpmConfig\n },\n options: Options,\n ) => {\n // merge project npm config with base config\n const npmConfigProjectPath = options.packageFile ? path.join(options.packageFile, '../.npmrc') : null\n const npmConfigProject = options.packageFile ? findNpmConfig(npmConfigProjectPath || undefined) : null\n const npmConfigCWDPath = options.cwd ? path.join(options.cwd, '.npmrc') : null\n const npmConfigCWD = options.cwd ? findNpmConfig(npmConfigCWDPath!) : null\n\n if (npmConfigWorkspaceProject && Object.keys(npmConfigWorkspaceProject).length > 0) {\n print(options, `\\nnpm config (workspace project):`, 'verbose')\n const { cache: _, ...npmConfigWorkspaceProjectWithoutCache } = npmConfigWorkspaceProject\n printSorted(options, npmConfigWorkspaceProjectWithoutCache, 'verbose')\n }\n\n if (npmConfigUser && Object.keys(npmConfigUser).length > 0) {\n print(options, `\\nnpm config (user):`, 'verbose')\n const { cache: _, ...npmConfigUserWithoutCache } = npmConfigUser\n printSorted(options, npmConfigUserWithoutCache, 'verbose')\n }\n\n if (npmConfigLocal && Object.keys(npmConfigLocal).length > 0) {\n print(options, `\\nnpm config (local override):`, 'verbose')\n const { cache: _, ...npmConfigLocalWithoutCache } = npmConfigLocal\n printSorted(options, npmConfigLocalWithoutCache, 'verbose')\n }\n\n if (npmConfigProject && Object.keys(npmConfigProject).length > 0) {\n print(options, `\\nnpm config (project: ${npmConfigProjectPath}):`, 'verbose')\n const { cache: _, ...npmConfigProjectWithoutCache } = npmConfigProject\n printSorted(options, npmConfigProjectWithoutCache, 'verbose')\n }\n\n if (npmConfigCWD && Object.keys(npmConfigCWD).length > 0) {\n print(options, `\\nnpm config (cwd: ${npmConfigCWDPath}):`, 'verbose')\n // omit cache since it is added to every config\n const { cache: _, ...npmConfigCWDWithoutCache } = npmConfigCWD\n printSorted(options, npmConfigCWDWithoutCache, 'verbose')\n }\n\n const npmConfigMerged = {\n ...npmConfigWorkspaceProject,\n ...npmConfigUser,\n ...npmConfigLocal,\n ...npmConfigProject,\n ...npmConfigCWD,\n ...(options.registry ? { registry: options.registry, silent: true } : null),\n ...(options.timeout ? { timeout: options.timeout } : null),\n }\n\n const isMerged = npmConfigWorkspaceProject || npmConfigLocal || npmConfigProject || npmConfigCWD\n if (isMerged) {\n print(options, `\\nmerged npm config:`, 'verbose')\n // omit cache since it is added to every config\n // @ts-expect-error -- though not typed, but the \"cache\" property does exist on the object and needs to be omitted\n const { cache: _, ...npmConfigMergedWithoutCache } = npmConfigMerged\n printSorted(options, npmConfigMergedWithoutCache, 'verbose')\n }\n\n return npmConfigMerged\n },\n)\n\n/**\n * Returns an object of specified values retrieved by npm view.\n *\n * @param packageName Name of the package\n * @param fields Array of fields like versions, time, version\n * @param currentVersion\n * @returns dist-tags field return Index<Packument>, time field returns Index<Index<string>>>, versions field returns Index<Index<Packument>>\n */\nasync function fetchUpgradedPackument(\n packageName: string,\n fields: (keyof Packument)[],\n currentVersion: Version,\n options: Options,\n retried = 0,\n npmConfigLocal?: NpmConfig,\n npmConfigWorkspaceProject?: NpmConfig,\n): Promise<Partial<Packument> | undefined> {\n // See: /test/helpers/stubVersions\n if (process.env.STUB_VERSIONS) {\n const mockReturnedVersions = JSON.parse(process.env.STUB_VERSIONS)\n return mockFetchUpgradedPackument(mockReturnedVersions)(packageName, fields, currentVersion, options)\n }\n\n if (isExactVersion(currentVersion)) {\n return Promise.resolve({} as Index<Packument>)\n }\n\n // fields may already include time\n const fieldsExtended =\n options.format?.includes('time') && !fields.includes('time') ? ([...fields, 'time'] as (keyof Packument)[]) : fields\n const fullMetadata = fieldsExtended.includes('time')\n\n const npmConfigMerged = mergeNpmConfigs(\n {\n npmConfigUser: { ...npmConfig, fullMetadata },\n npmConfigLocal,\n npmConfigWorkspaceProject,\n },\n options,\n )\n\n let result: Partial<Packument> | undefined\n try {\n const tag = options.distTag || 'latest'\n result = await fetchPartialPackument(\n packageName,\n Array.from(\n new Set([\n 'dist-tags',\n ...fields,\n ...(!options.deprecated ? (['deprecated', 'versions'] as const) : []),\n ...(options.enginesNode ? (['engines', 'versions'] as const) : []),\n ]),\n ),\n fullMetadata ? null : tag,\n npmConfigMerged,\n )\n } catch (err: any) {\n if (options.retry && ++retried <= options.retry) {\n return fetchUpgradedPackument(packageName, fieldsExtended, currentVersion, options, retried, npmConfigLocal)\n }\n\n throw err\n }\n\n return result\n}\n\n/** Memoize fetchUpgradedPackument for --deep and --workspaces performance. */\n// must be exported to stub\nexport const fetchUpgradedPackumentMemo = memoize(fetchUpgradedPackument, {\n // serializer args are incorrectly typed as any[] instead of being generic, so we need to cast it\n serializer: (([\n packageName,\n fields,\n currentVersion,\n options,\n retried,\n npmConfigLocal,\n npmConfigWorkspaceProject,\n ]: Parameters<typeof fetchUpgradedPackument>) => {\n // packageFile varies by cwd in workspaces/deep mode, so we do not want to memoize on that\n const { packageFile: _, ...optionsWithoutPackageFile } = options\n return JSON.stringify([\n packageName,\n fields,\n // currentVersion does not change the behavior of fetchUpgradedPackument unless it is an invalid/inexact version which causes it to short circuit\n isExactVersion(currentVersion),\n optionsWithoutPackageFile,\n // make sure retries do not get memoized\n retried,\n npmConfigLocal,\n npmConfigWorkspaceProject,\n ])\n }) as (args: any[]) => string,\n})\n\n/**\n * Spawns npm with --json. Handles different commands for Window and Linux/OSX.\n *\n * @param args\n * @param [npmOptions={}]\n * @param [spawnOptions={}]\n * @returns\n */\nasync function spawnNpm(\n args: string | string[],\n npmOptions: NpmOptions = {},\n spawnPleaseOptions: SpawnPleaseOptions = {},\n spawnOptions: Index<any> = {},\n): Promise<any> {\n const cmd = process.platform === 'win32' ? 'npm.cmd' : 'npm'\n\n const fullArgs = [\n ...(npmOptions.global ? [`--global`] : []),\n ...(npmOptions.prefix ? [`--prefix=${npmOptions.prefix}`] : []),\n '--json',\n ...(Array.isArray(args) ? args : [args]),\n ]\n const { stdout } = await spawn(cmd, fullArgs, spawnPleaseOptions, spawnOptions)\n return stdout\n}\n\n/**\n * Get platform-specific default prefix to pass on to npm.\n *\n * @param options\n * @param [options.global]\n * @param [options.prefix]\n * @returns\n */\nexport async function defaultPrefix(options: Options): Promise<string | undefined> {\n if (options.prefix) {\n return Promise.resolve(options.prefix)\n }\n\n const cmd = process.platform === 'win32' ? 'npm.cmd' : 'npm'\n\n let prefix: string | undefined\n\n // catch spawn error which can occur on Windows\n // https://github.com/raineorshine/npm-check-updates/issues/703\n try {\n const { stdout } = await spawn(cmd, ['config', 'get', 'prefix'])\n prefix = stdout\n } catch (e: any) {\n const message = (e.message || e || '').toString()\n print(\n options,\n 'Error executing `npm config get prefix`. Caught and ignored. Unsolved: https://github.com/raineorshine/npm-check-updates/issues/703. ERROR: ' +\n message,\n 'verbose',\n 'error',\n )\n }\n\n // FIX: for ncu -g doesn't work on homebrew or windows #146\n // https://github.com/raineorshine/npm-check-updates/issues/146\n return options.global && prefix?.match('Cellar')\n ? '/usr/local'\n : // Workaround: get prefix on windows for global packages\n // Only needed when using npm api directly\n process.platform === 'win32' && options.global && !process.env.prefix\n ? prefix\n ? prefix.trim()\n : `${process.env.AppData}\\\\npm`\n : undefined\n}\n\n/**\n * Fetches the highest version number, regardless of tag or publish time.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns\n */\nexport const greatest: GetVersion = async (\n packageName,\n currentVersion,\n options = {},\n npmConfig?: NpmConfig,\n npmConfigProject?: NpmConfig,\n): Promise<VersionResult> => {\n const fields: (keyof Packument)[] = ['versions']\n\n if (options.cooldown) {\n fields.push('time')\n }\n\n const packument = await fetchUpgradedPackumentMemo(\n packageName,\n fields,\n currentVersion,\n options,\n 0,\n npmConfig,\n npmConfigProject,\n )\n\n // known type based on 'versions'\n const versions = packument?.versions\n\n return {\n version:\n Object.values(versions || {})\n .filter(tagPackument =>\n filterPredicate(options)(decorateTagPackumentWithTimeAndName(tagPackument, packument as Partial<Packument>)),\n )\n .map(o => o.version)\n .sort(versionUtil.compareVersions)\n .at(-1) || null,\n }\n}\n\n/**\n * Fetches the list of peer dependencies for a specific package version.\n *\n * @param packageName\n * @param version\n * @param spawnOptions\n * @returns Promised {packageName: version} collection\n */\nexport const getPeerDependencies = async (\n packageName: string,\n version: Version,\n spawnOptions: SpawnOptions,\n): Promise<Index<Version>> => {\n const args = ['view', `${packageName}@${version}`, 'peerDependencies']\n const result = await spawnNpm(args, {}, { rejectOnError: false }, spawnOptions)\n return result ? parseJson(result, { command: [...args, '--json'].join(' ') }) : {}\n}\n\n/**\n * Fetches the engines list from the registry for a specific package version.\n *\n * @param packageName\n * @param version\n * @returns Promised engines collection\n */\nexport const getEngines = async (\n packageName: string,\n version: Version,\n options: Options = {},\n npmConfigLocal?: NpmConfig,\n): Promise<Index<VersionSpec | undefined>> => {\n const result = await fetchPartialPackument(\n packageName,\n [`engines`],\n null,\n {\n ...npmConfigLocal,\n ...npmConfig,\n ...(options.registry ? { registry: options.registry, silent: true } : null),\n },\n version,\n )\n return result.engines || {}\n}\n\n/**\n * Fetches the list of all installed packages.\n *\n * @param [options]\n * @param [options.cwd]\n * @param [options.global]\n * @param [options.prefix]\n * @returns\n */\nexport const list = async (options: Options = {}): Promise<Index<string | undefined>> => {\n const result = await spawnNpm(\n ['ls', '--depth=0'],\n {\n ...(options.global ? { global: true } : null),\n ...(options.prefix ? { prefix: options.prefix } : null),\n },\n {\n rejectOnError: false,\n },\n {\n ...(options.cwd ? { cwd: options.cwd } : null),\n },\n )\n const dependencies = parseJson<{\n dependencies: Index<{ version?: Version; required?: { version: Version } }>\n }>(result, {\n command: `npm${process.platform === 'win32' ? '.cmd' : ''} ls --json${options.global ? ' --global' : ''}`,\n }).dependencies\n\n return keyValueBy(dependencies, (name, info) => ({\n // unmet peer dependencies have a different structure\n [name]: info.version || info.required?.version,\n }))\n}\n\n/**\n * Fetches the version of a package published to options.distTag.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns\n */\nexport const distTag: GetVersion = async (\n packageName,\n currentVersion,\n options: Options = {},\n npmConfig?: NpmConfig,\n npmConfigProject?: NpmConfig,\n) => {\n const fields: (keyof Packument)[] = ['dist-tags']\n\n if (options.cooldown) {\n fields.push('time')\n }\n\n const packument = await fetchUpgradedPackumentMemo(\n packageName,\n fields,\n currentVersion,\n options,\n 0,\n npmConfig,\n npmConfigProject,\n )\n const version = packument?.['dist-tags']?.[options.distTag || 'latest']\n\n // if the packument does not contain versions, we need to add a minimal versions property with the upgraded version\n const tagPackument = packument?.versions\n ? packument.versions?.[version!]\n : {\n name: packageName,\n version,\n }\n\n const tagPackumentWithTime = decorateTagPackumentWithTimeAndName(tagPackument, packument as Partial<Packument>)\n\n // latest should not be deprecated\n // if latest exists and latest is not a prerelease version, return it\n // if latest exists and latest is a prerelease version and --pre is specified, return it\n // if latest exists and latest not satisfies min version of engines.node\n // if latest exists and cooldown is specified and latest is within cooldown period, return it\n if (tagPackument && filterPredicate(options)(tagPackumentWithTime)) {\n return {\n version: tagPackument.version,\n ...(packument?.time?.[version!] ? { time: packument.time[version!] } : null),\n }\n }\n\n // if version from dist-tag does not meet cooldown requirement skip finding other versions\n if (options.cooldown) {\n return {}\n }\n\n // If we use a custom dist-tag, we do not want to get other 'pre' versions, just the ones from this dist-tag\n if (options.distTag && options.distTag !== 'latest') return {}\n\n // if latest is a prerelease version and --pre is not specified\n // or latest is deprecated\n // find the next valid version\n return greatest(packageName, currentVersion, options, npmConfig, npmConfigProject)\n}\n\n/**\n * Fetches the version published to the latest tag.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns\n */\nexport const latest: GetVersion = async (\n packageName: string,\n currentVersion: Version,\n options: Options = {},\n npmConfig?: NpmConfig,\n npmConfigProject?: NpmConfig,\n) => distTag(packageName, currentVersion, { ...options, distTag: 'latest' }, npmConfig, npmConfigProject)\n\n/**\n * Fetches the most recently published version, regardless of version number.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns\n */\nexport const newest: GetVersion = async (\n packageName,\n currentVersion,\n options = {},\n npmConfig?: NpmConfig,\n npmConfigProject?: NpmConfig,\n): Promise<VersionResult> => {\n const result = await fetchUpgradedPackumentMemo(\n packageName,\n ['time', 'versions'],\n currentVersion,\n options,\n 0,\n npmConfig,\n npmConfigProject,\n )\n\n // Generate a map of versions that satisfy the node engine.\n // result.versions is an object but is parsed as an array, so manually convert it to an object.\n // Otherwise keyValueBy will pass the predicate arguments in the wrong order.\n const versionsSatisfyingNodeEngine = keyValueBy(\n result?.versions || {},\n (version: Version, packument: Packument['versions'][string]) =>\n satisfiesNodeEngine(packument, options.nodeEngineVersion) ? { [packument.version]: true } : null,\n )\n\n // filter out times that do not satisfy the node engine\n // filter out prereleases if pre:false (same as allowPreOrIsNotPre)\n const timesSatisfyingNodeEngine = filterObject(\n (result?.time || {}) as Index<string>,\n version => versionsSatisfyingNodeEngine[version] && (options.pre !== false || !versionUtil.isPre(version)),\n )\n\n // sort by timestamp (entry[1]) and map versions\n const versionsSortedByTime = sortBy(Object.entries(timesSatisfyingNodeEngine), v => v[1]).map(([version]) => version)\n\n if (options.cooldown) {\n const versionsSatisfyingCooldownPeriod = versionsSortedByTime.filter(version =>\n satisfiesCooldownPeriod(\n decorateTagPackumentWithTimeAndName((result as Packument).versions[version], result as Packument),\n options.cooldown,\n ),\n )\n\n return { version: versionsSatisfyingCooldownPeriod.at(-1) }\n }\n\n return { version: versionsSortedByTime.at(-1) }\n}\n\n/**\n * Fetches the highest version with the same major version as currentVersion.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns\n */\nexport const minor: GetVersion = async (\n packageName,\n currentVersion,\n options = {},\n npmConfig?: NpmConfig,\n npmConfigProject?: NpmConfig,\n): Promise<VersionResult> => {\n const fields: (keyof Packument)[] = ['versions']\n\n if (options.cooldown) {\n fields.push('time')\n }\n\n const packument = await fetchUpgradedPackumentMemo(\n packageName,\n fields,\n currentVersion,\n options,\n 0,\n npmConfig,\n npmConfigProject,\n )\n\n const versions = packument?.versions as Index<Packument>\n const version = versionUtil.findGreatestByLevel(\n Object.values(versions || {})\n .filter(tagPackument =>\n filterPredicate(options)(decorateTagPackumentWithTimeAndName(tagPackument, packument as Partial<Packument>)),\n )\n .map(o => o.version),\n currentVersion,\n 'minor',\n )\n return { version }\n}\n\n/**\n * Fetches the highest version with the same minor and major version as currentVersion.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns\n */\nexport const patch: GetVersion = async (\n packageName,\n currentVersion,\n options = {},\n npmConfig?: NpmConfig,\n npmConfigProject?: NpmConfig,\n): Promise<VersionResult> => {\n const fields: (keyof Packument)[] = ['versions']\n\n if (options.cooldown) {\n fields.push('time')\n }\n\n const packument = await fetchUpgradedPackumentMemo(\n packageName,\n fields,\n currentVersion,\n options,\n 0,\n npmConfig,\n npmConfigProject,\n )\n\n const versions = packument?.versions as Index<Packument>\n const version = versionUtil.findGreatestByLevel(\n Object.values(versions || {})\n .filter(tagPackument =>\n filterPredicate(options)(decorateTagPackumentWithTimeAndName(tagPackument, packument as Partial<Packument>)),\n )\n .map(o => o.version),\n currentVersion,\n 'patch',\n )\n return { version }\n}\n\n/**\n * Fetches the highest version that satisfies the semver range specified in the package.json.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns\n */\nexport const semver: GetVersion = async (\n packageName,\n currentVersion,\n options = {},\n npmConfig?: NpmConfig,\n npmConfigProject?: NpmConfig,\n): Promise<VersionResult> => {\n const fields: (keyof Packument)[] = ['versions']\n\n if (options.cooldown) {\n fields.push('time')\n }\n\n const packument = await fetchUpgradedPackumentMemo(\n packageName,\n fields,\n currentVersion,\n options,\n 0,\n npmConfig,\n npmConfigProject,\n )\n\n const versions = packument?.versions as Index<Packument>\n // ignore explicit version ranges\n if (isExplicitRange(currentVersion)) return { version: null }\n\n const versionsFiltered = Object.values(versions || {})\n .filter(tagPackument =>\n filterPredicate(options)(decorateTagPackumentWithTimeAndName(tagPackument, packument as Partial<Packument>)),\n )\n .map(o => o.version)\n // TODO: Upgrading within a prerelease does not seem to work.\n // { includePrerelease: true } does not help.\n const version = nodeSemver.maxSatisfying(versionsFiltered, currentVersion)\n return { version }\n}\n\nexport default spawnNpm\n","import path from 'path'\nimport spawn from 'spawn-please'\nimport keyValueBy from '../lib/keyValueBy'\nimport { Index } from '../types/IndexType'\nimport { NpmOptions } from '../types/NpmOptions'\nimport { Options } from '../types/Options'\nimport { SpawnPleaseOptions } from '../types/SpawnPleaseOptions'\n\n/** Spawn bun. */\nasync function spawnBun(\n args: string | string[],\n npmOptions: NpmOptions = {},\n spawnPleaseOptions: SpawnPleaseOptions = {},\n spawnOptions: Index<any> = {},\n): Promise<{ stdout: string; stderr: string }> {\n const fullArgs = [\n ...(npmOptions.global ? ['--global'] : []),\n ...(npmOptions.prefix ? [`--prefix=${npmOptions.prefix}`] : []),\n ...(Array.isArray(args) ? args : [args]),\n ]\n\n return spawn('bun', fullArgs, spawnPleaseOptions, spawnOptions)\n}\n\n/** Returns the global directory of bun. */\nexport const defaultPrefix = async (options: Options): Promise<string | undefined> =>\n options.global\n ? options.prefix || process.env.BUN_INSTALL || path.dirname((await spawn('bun', ['pm', '-g', 'bin'])).stdout)\n : undefined\n\n/**\n * (Bun) Fetches the list of all installed packages.\n */\nexport const list = async (options: Options = {}): Promise<Index<string | undefined>> => {\n const { default: stripAnsi } = await import('strip-ansi')\n\n // bun pm ls\n const { stdout } = await spawnBun(\n ['pm', 'ls'],\n {\n ...(options.global ? { global: true } : null),\n ...(options.prefix ? { prefix: options.prefix } : null),\n },\n {\n rejectOnError: false,\n },\n {\n env: {\n ...process.env,\n // Disable color to ensure the output is parsed correctly.\n // However, this may be ineffective in some environments (see stripAnsi below).\n // https://bun.sh/docs/runtime/configuration#environment-variables\n NO_COLOR: '1',\n },\n ...(options.cwd ? { cwd: options.cwd } : null),\n },\n )\n\n // Parse the output of `bun pm ls` into an object { [name]: version }.\n // When bun is spawned in the GitHub Actions environment, it outputs ANSI color. Unfortunately, it does not respect the `NO_COLOR` environment variable. Therefore, we have to manually strip ansi.\n const lines = stripAnsi(stdout).split('\\n')\n const dependencies = keyValueBy(lines, line => {\n // The capturing group for the package name requires a + quantifier; otherwise, namespaced packages like @angular/cli will not be captured correctly.\n const match = line.match(/.* (.+?)@(.+)/)\n if (match) {\n const [, name, version] = match\n return { [name]: version }\n }\n return null\n })\n\n return dependencies\n}\n\nexport {\n distTag,\n getEngines,\n getPeerDependencies,\n greatest,\n latest,\n minor,\n newest,\n packageAuthorChanged,\n patch,\n semver,\n} from './npm'\n\nexport default spawnBun\n","import memoize from 'fast-memoize'\nimport { findUp } from 'find-up'\nimport fs from 'fs/promises'\nimport ini from 'ini'\nimport path from 'path'\nimport spawn from 'spawn-please'\nimport keyValueBy from '../lib/keyValueBy'\nimport { print } from '../lib/logging'\nimport { GetVersion } from '../types/GetVersion'\nimport { Index } from '../types/IndexType'\nimport { NpmConfig } from '../types/NpmConfig'\nimport { NpmOptions } from '../types/NpmOptions'\nimport { Options } from '../types/Options'\nimport { SpawnOptions } from '../types/SpawnOptions'\nimport { SpawnPleaseOptions } from '../types/SpawnPleaseOptions'\nimport { Version } from '../types/Version'\nimport * as npm from './npm'\n\n// return type of pnpm ls --json\ntype PnpmList = {\n path: string\n private: boolean\n dependencies: Index<{\n from: string\n version: Version\n resolved: string\n }>\n}[]\n\n/** Reads the npmrc config file from the pnpm-workspace.yaml directory. */\nconst npmConfigFromPnpmWorkspace = memoize(async (options: Options): Promise<NpmConfig> => {\n const pnpmWorkspacePath = await findUp('pnpm-workspace.yaml')\n if (!pnpmWorkspacePath) return {}\n\n const pnpmWorkspaceDir = path.dirname(pnpmWorkspacePath)\n const pnpmWorkspaceConfigPath = path.join(pnpmWorkspaceDir, '.npmrc')\n\n let pnpmWorkspaceConfig\n try {\n pnpmWorkspaceConfig = await fs.readFile(pnpmWorkspaceConfigPath, 'utf-8')\n } catch (e) {\n return {}\n }\n\n print(options, `\\nUsing pnpm workspace config at ${pnpmWorkspaceConfigPath}:`, 'verbose')\n\n const config = npm.normalizeNpmConfig(ini.parse(pnpmWorkspaceConfig), pnpmWorkspaceDir)\n\n print(options, config, 'verbose')\n\n return config\n})\n\n/** Fetches the list of all installed packages. */\nexport const list = async (options: Options = {}): Promise<Index<string | undefined>> => {\n // use npm for local ls for completeness\n // this should never happen since list is only called in runGlobal -> getInstalledPackages\n if (!options.global) return npm.list(options)\n\n const cmd = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm'\n const { stdout } = await spawn(cmd, ['ls', '-g', '--json'])\n const result = JSON.parse(stdout) as PnpmList\n const list = keyValueBy(result[0].dependencies || {}, (name, { version }) => ({\n [name]: version,\n }))\n return list\n}\n\n/** Wraps a GetVersion function and passes the npmrc located next to the pnpm-workspace.yaml if it exists. */\nconst withNpmWorkspaceConfig =\n (getVersion: GetVersion): GetVersion =>\n async (packageName, currentVersion, options = {}) =>\n getVersion(packageName, currentVersion, options, {}, await npmConfigFromPnpmWorkspace(options))\n\nexport const distTag = withNpmWorkspaceConfig(npm.distTag)\nexport const greatest = withNpmWorkspaceConfig(npm.greatest)\nexport const latest = withNpmWorkspaceConfig(npm.latest)\nexport const minor = withNpmWorkspaceConfig(npm.minor)\nexport const newest = withNpmWorkspaceConfig(npm.newest)\nexport const patch = withNpmWorkspaceConfig(npm.patch)\nexport const semver = withNpmWorkspaceConfig(npm.semver)\n\n/**\n * Spawn pnpm.\n *\n * @param args\n * @param [npmOptions={}]\n * @param [spawnOptions={}]\n * @returns\n */\nasync function spawnPnpm(\n args: string | string[],\n npmOptions: NpmOptions = {},\n spawnOptions?: SpawnOptions,\n spawnPleaseOptions?: SpawnPleaseOptions,\n): Promise<string> {\n const cmd = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm'\n\n const fullArgs = [\n ...(npmOptions.global ? 'global' : []),\n ...(Array.isArray(args) ? args : [args]),\n ...(npmOptions.prefix ? `--prefix=${npmOptions.prefix}` : []),\n ]\n\n const { stdout } = await spawn(cmd, fullArgs, spawnPleaseOptions, spawnOptions)\n\n return stdout\n}\n\nexport { defaultPrefix, getPeerDependencies, getEngines, packageAuthorChanged } from './npm'\n\nexport default spawnPnpm\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var WeakMap = require('./_WeakMap');\n\n/** Used to store function metadata. */\nvar metaMap = WeakMap && new WeakMap;\n\nmodule.exports = metaMap;\n","var identity = require('./identity'),\n metaMap = require('./_metaMap');\n\n/**\n * The base implementation of `setData` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\nvar baseSetData = !metaMap ? identity : function(func, data) {\n metaMap.set(func, data);\n return func;\n};\n\nmodule.exports = baseSetData;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n","var baseCreate = require('./_baseCreate'),\n isObject = require('./isObject');\n\n/**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createCtor(Ctor) {\n return function() {\n // Use a `switch` statement to work with class constructors. See\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0: return new Ctor;\n case 1: return new Ctor(args[0]);\n case 2: return new Ctor(args[0], args[1]);\n case 3: return new Ctor(args[0], args[1], args[2]);\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return isObject(result) ? result : thisBinding;\n };\n}\n\nmodule.exports = createCtor;\n","var createCtor = require('./_createCtor'),\n root = require('./_root');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1;\n\n/**\n * Creates a function that wraps `func` to invoke it with the optional `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createBind(func, bitmask, thisArg) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, arguments);\n }\n return wrapper;\n}\n\nmodule.exports = createBind;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\nfunction composeArgs(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersLength = holders.length,\n leftIndex = -1,\n leftLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(leftLength + rangeLength),\n isUncurried = !isCurried;\n\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n }\n while (rangeLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n}\n\nmodule.exports = composeArgs;\n","/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\nfunction composeArgsRight(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersIndex = -1,\n holdersLength = holders.length,\n rightIndex = -1,\n rightLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(rangeLength + rightLength),\n isUncurried = !isCurried;\n\n while (++argsIndex < rangeLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n }\n return result;\n}\n\nmodule.exports = composeArgsRight;\n","/**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */\nfunction countHolders(array, placeholder) {\n var length = array.length,\n result = 0;\n\n while (length--) {\n if (array[length] === placeholder) {\n ++result;\n }\n }\n return result;\n}\n\nmodule.exports = countHolders;\n","/**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\nfunction baseLodash() {\n // No operation performed.\n}\n\nmodule.exports = baseLodash;\n","var baseCreate = require('./_baseCreate'),\n baseLodash = require('./_baseLodash');\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295;\n\n/**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\nfunction LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__dir__ = 1;\n this.__filtered__ = false;\n this.__iteratees__ = [];\n this.__takeCount__ = MAX_ARRAY_LENGTH;\n this.__views__ = [];\n}\n\n// Ensure `LazyWrapper` is an instance of `baseLodash`.\nLazyWrapper.prototype = baseCreate(baseLodash.prototype);\nLazyWrapper.prototype.constructor = LazyWrapper;\n\nmodule.exports = LazyWrapper;\n","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n","var metaMap = require('./_metaMap'),\n noop = require('./noop');\n\n/**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\nvar getData = !metaMap ? noop : function(func) {\n return metaMap.get(func);\n};\n\nmodule.exports = getData;\n","/** Used to lookup unminified function names. */\nvar realNames = {};\n\nmodule.exports = realNames;\n","var realNames = require('./_realNames');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\nfunction getFuncName(func) {\n var result = (func.name + ''),\n array = realNames[result],\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n}\n\nmodule.exports = getFuncName;\n","var baseCreate = require('./_baseCreate'),\n baseLodash = require('./_baseLodash');\n\n/**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\nfunction LodashWrapper(value, chainAll) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__chain__ = !!chainAll;\n this.__index__ = 0;\n this.__values__ = undefined;\n}\n\nLodashWrapper.prototype = baseCreate(baseLodash.prototype);\nLodashWrapper.prototype.constructor = LodashWrapper;\n\nmodule.exports = LodashWrapper;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nmodule.exports = copyArray;\n","var LazyWrapper = require('./_LazyWrapper'),\n LodashWrapper = require('./_LodashWrapper'),\n copyArray = require('./_copyArray');\n\n/**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\nfunction wrapperClone(wrapper) {\n if (wrapper instanceof LazyWrapper) {\n return wrapper.clone();\n }\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n result.__actions__ = copyArray(wrapper.__actions__);\n result.__index__ = wrapper.__index__;\n result.__values__ = wrapper.__values__;\n return result;\n}\n\nmodule.exports = wrapperClone;\n","var LazyWrapper = require('./_LazyWrapper'),\n LodashWrapper = require('./_LodashWrapper'),\n baseLodash = require('./_baseLodash'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike'),\n wrapperClone = require('./_wrapperClone');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\nfunction lodash(value) {\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n if (value instanceof LodashWrapper) {\n return value;\n }\n if (hasOwnProperty.call(value, '__wrapped__')) {\n return wrapperClone(value);\n }\n }\n return new LodashWrapper(value);\n}\n\n// Ensure wrappers are instances of `baseLodash`.\nlodash.prototype = baseLodash.prototype;\nlodash.prototype.constructor = lodash;\n\nmodule.exports = lodash;\n","var LazyWrapper = require('./_LazyWrapper'),\n getData = require('./_getData'),\n getFuncName = require('./_getFuncName'),\n lodash = require('./wrapperLodash');\n\n/**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n * else `false`.\n */\nfunction isLaziable(func) {\n var funcName = getFuncName(func),\n other = lodash[funcName];\n\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n return false;\n }\n if (func === other) {\n return true;\n }\n var data = getData(other);\n return !!data && func === data[0];\n}\n\nmodule.exports = isLaziable;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","var baseSetData = require('./_baseSetData'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity\n * function to avoid garbage collection pauses in V8. See\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\nvar setData = shortOut(baseSetData);\n\nmodule.exports = setData;\n","/** Used to match wrap detail comments. */\nvar reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n reSplitDetails = /,? & /;\n\n/**\n * Extracts wrapper details from the `source` body comment.\n *\n * @private\n * @param {string} source The source to inspect.\n * @returns {Array} Returns the wrapper details.\n */\nfunction getWrapDetails(source) {\n var match = source.match(reWrapDetails);\n return match ? match[1].split(reSplitDetails) : [];\n}\n\nmodule.exports = getWrapDetails;\n","/** Used to match wrap detail comments. */\nvar reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/;\n\n/**\n * Inserts wrapper `details` in a comment at the top of the `source` body.\n *\n * @private\n * @param {string} source The source to modify.\n * @returns {Array} details The details to insert.\n * @returns {string} Returns the modified source.\n */\nfunction insertWrapDetails(source, details) {\n var length = details.length;\n if (!length) {\n return source;\n }\n var lastIndex = length - 1;\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n details = details.join(length > 2 ? ', ' : ' ');\n return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n}\n\nmodule.exports = insertWrapDetails;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n","var arrayEach = require('./_arrayEach'),\n arrayIncludes = require('./_arrayIncludes');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256,\n WRAP_FLIP_FLAG = 512;\n\n/** Used to associate wrap methods with their bit flags. */\nvar wrapFlags = [\n ['ary', WRAP_ARY_FLAG],\n ['bind', WRAP_BIND_FLAG],\n ['bindKey', WRAP_BIND_KEY_FLAG],\n ['curry', WRAP_CURRY_FLAG],\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n ['flip', WRAP_FLIP_FLAG],\n ['partial', WRAP_PARTIAL_FLAG],\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n ['rearg', WRAP_REARG_FLAG]\n];\n\n/**\n * Updates wrapper `details` based on `bitmask` flags.\n *\n * @private\n * @returns {Array} details The details to modify.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Array} Returns `details`.\n */\nfunction updateWrapDetails(details, bitmask) {\n arrayEach(wrapFlags, function(pair) {\n var value = '_.' + pair[0];\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n details.push(value);\n }\n });\n return details.sort();\n}\n\nmodule.exports = updateWrapDetails;\n","var getWrapDetails = require('./_getWrapDetails'),\n insertWrapDetails = require('./_insertWrapDetails'),\n setToString = require('./_setToString'),\n updateWrapDetails = require('./_updateWrapDetails');\n\n/**\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n * with wrapper details in a comment at the top of the source body.\n *\n * @private\n * @param {Function} wrapper The function to modify.\n * @param {Function} reference The reference function.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Function} Returns `wrapper`.\n */\nfunction setWrapToString(wrapper, reference, bitmask) {\n var source = (reference + '');\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n}\n\nmodule.exports = setWrapToString;\n","var isLaziable = require('./_isLaziable'),\n setData = require('./_setData'),\n setWrapToString = require('./_setWrapToString');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG = 8,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64;\n\n/**\n * Creates a function that wraps `func` to continue currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {Function} wrapFunc The function to create the `func` wrapper.\n * @param {*} placeholder The placeholder value.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n var isCurry = bitmask & WRAP_CURRY_FLAG,\n newHolders = isCurry ? holders : undefined,\n newHoldersRight = isCurry ? undefined : holders,\n newPartials = isCurry ? partials : undefined,\n newPartialsRight = isCurry ? undefined : partials;\n\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n }\n var newData = [\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n newHoldersRight, argPos, ary, arity\n ];\n\n var result = wrapFunc.apply(undefined, newData);\n if (isLaziable(func)) {\n setData(result, newData);\n }\n result.placeholder = placeholder;\n return setWrapToString(result, func, bitmask);\n}\n\nmodule.exports = createRecurry;\n","/**\n * Gets the argument placeholder value for `func`.\n *\n * @private\n * @param {Function} func The function to inspect.\n * @returns {*} Returns the placeholder value.\n */\nfunction getHolder(func) {\n var object = func;\n return object.placeholder;\n}\n\nmodule.exports = getHolder;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var copyArray = require('./_copyArray'),\n isIndex = require('./_isIndex');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\nfunction reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin(indexes.length, arrLength),\n oldArray = copyArray(array);\n\n while (length--) {\n var index = indexes[length];\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n}\n\nmodule.exports = reorder;\n","/** Used as the internal argument placeholder. */\nvar PLACEHOLDER = '__lodash_placeholder__';\n\n/**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\nfunction replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value === placeholder || value === PLACEHOLDER) {\n array[index] = PLACEHOLDER;\n result[resIndex++] = index;\n }\n }\n return result;\n}\n\nmodule.exports = replaceHolders;\n","var composeArgs = require('./_composeArgs'),\n composeArgsRight = require('./_composeArgsRight'),\n countHolders = require('./_countHolders'),\n createCtor = require('./_createCtor'),\n createRecurry = require('./_createRecurry'),\n getHolder = require('./_getHolder'),\n reorder = require('./_reorder'),\n replaceHolders = require('./_replaceHolders'),\n root = require('./_root');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_ARY_FLAG = 128,\n WRAP_FLIP_FLAG = 512;\n\n/**\n * Creates a function that wraps `func` to invoke it with optional `this`\n * binding of `thisArg`, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided\n * to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & WRAP_ARY_FLAG,\n isBind = bitmask & WRAP_BIND_FLAG,\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n isFlip = bitmask & WRAP_FLIP_FLAG,\n Ctor = isBindKey ? undefined : createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length;\n\n while (index--) {\n args[index] = arguments[index];\n }\n if (isCurried) {\n var placeholder = getHolder(wrapper),\n holdersCount = countHolders(args, placeholder);\n }\n if (partials) {\n args = composeArgs(args, partials, holders, isCurried);\n }\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n }\n length -= holdersCount;\n if (isCurried && length < arity) {\n var newHolders = replaceHolders(args, placeholder);\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n args, newHolders, argPos, ary, arity - length\n );\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n\n length = args.length;\n if (argPos) {\n args = reorder(args, argPos);\n } else if (isFlip && length > 1) {\n args.reverse();\n }\n if (isAry && ary < length) {\n args.length = ary;\n }\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtor(fn);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n}\n\nmodule.exports = createHybrid;\n","var apply = require('./_apply'),\n createCtor = require('./_createCtor'),\n createHybrid = require('./_createHybrid'),\n createRecurry = require('./_createRecurry'),\n getHolder = require('./_getHolder'),\n replaceHolders = require('./_replaceHolders'),\n root = require('./_root');\n\n/**\n * Creates a function that wraps `func` to enable currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {number} arity The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createCurry(func, bitmask, arity) {\n var Ctor = createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length,\n placeholder = getHolder(wrapper);\n\n while (index--) {\n args[index] = arguments[index];\n }\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n ? []\n : replaceHolders(args, placeholder);\n\n length -= holders.length;\n if (length < arity) {\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\n args, holders, undefined, undefined, arity - length);\n }\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return apply(fn, this, args);\n }\n return wrapper;\n}\n\nmodule.exports = createCurry;\n","var apply = require('./_apply'),\n createCtor = require('./_createCtor'),\n root = require('./_root');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1;\n\n/**\n * Creates a function that wraps `func` to invoke it with the `this` binding\n * of `thisArg` and `partials` prepended to the arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to\n * the new function.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createPartial(func, bitmask, thisArg, partials) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(leftLength + argsLength),\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n return apply(fn, isBind ? thisArg : this, args);\n }\n return wrapper;\n}\n\nmodule.exports = createPartial;\n","var composeArgs = require('./_composeArgs'),\n composeArgsRight = require('./_composeArgsRight'),\n replaceHolders = require('./_replaceHolders');\n\n/** Used as the internal argument placeholder. */\nvar PLACEHOLDER = '__lodash_placeholder__';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG = 8,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers used to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and\n * `_.rearg` modify function arguments, making the order in which they are\n * executed important, preventing the merging of metadata. However, we make\n * an exception for a safe combined case where curried functions have `_.ary`\n * and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\nfunction mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n var isCombo =\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n // Exit early if metadata can't be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & WRAP_BIND_FLAG) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = value;\n }\n // Use source `ary` if it's smaller.\n if (srcBitmask & WRAP_ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n\n return data;\n}\n\nmodule.exports = mergeData;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var toFinite = require('./toFinite');\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n","var baseSetData = require('./_baseSetData'),\n createBind = require('./_createBind'),\n createCurry = require('./_createCurry'),\n createHybrid = require('./_createHybrid'),\n createPartial = require('./_createPartial'),\n getData = require('./_getData'),\n mergeData = require('./_mergeData'),\n setData = require('./_setData'),\n setWrapToString = require('./_setWrapToString'),\n toInteger = require('./toInteger');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags.\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * 512 - `_.flip`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n partials = holders = undefined;\n }\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n arity = arity === undefined ? arity : toInteger(arity);\n length -= holders ? holders.length : 0;\n\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n var partialsRight = partials,\n holdersRight = holders;\n\n partials = holders = undefined;\n }\n var data = isBindKey ? undefined : getData(func);\n\n var newData = [\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n argPos, ary, arity\n ];\n\n if (data) {\n mergeData(newData, data);\n }\n func = newData[0];\n bitmask = newData[1];\n thisArg = newData[2];\n partials = newData[3];\n holders = newData[4];\n arity = newData[9] = newData[9] === undefined\n ? (isBindKey ? 0 : func.length)\n : nativeMax(newData[9] - length, 0);\n\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n }\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n var result = createBind(func, bitmask, thisArg);\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n result = createCurry(func, bitmask, arity);\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n result = createPartial(func, bitmask, thisArg, partials);\n } else {\n result = createHybrid.apply(undefined, newData);\n }\n var setter = data ? baseSetData : setData;\n return setWrapToString(setter(result, newData), func, bitmask);\n}\n\nmodule.exports = createWrap;\n","var createWrap = require('./_createWrap');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_CURRY_FLAG = 8;\n\n/**\n * Creates a function that accepts arguments of `func` and either invokes\n * `func` returning its result, if at least `arity` number of arguments have\n * been provided, or returns a function that accepts the remaining `func`\n * arguments, and so on. The arity of `func` may be specified if `func.length`\n * is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */\nfunction curry(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curry.placeholder;\n return result;\n}\n\n// Assign default placeholders.\ncurry.placeholder = {};\n\nmodule.exports = curry;\n","import memoize from 'fast-memoize'\nimport fs from 'fs/promises'\nimport yaml from 'js-yaml'\nimport jsonlines from 'jsonlines'\nimport curry from 'lodash/curry'\nimport os from 'os'\nimport path from 'path'\nimport spawn from 'spawn-please'\nimport exists from '../lib/exists'\nimport findLockfile from '../lib/findLockfile'\nimport { keyValueBy } from '../lib/keyValueBy'\nimport { print } from '../lib/logging'\nimport { GetVersion } from '../types/GetVersion'\nimport { Index } from '../types/IndexType'\nimport { NpmConfig } from '../types/NpmConfig'\nimport { NpmOptions } from '../types/NpmOptions'\nimport { Options } from '../types/Options'\nimport { SpawnOptions } from '../types/SpawnOptions'\nimport { SpawnPleaseOptions } from '../types/SpawnPleaseOptions'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport * as npm from './npm'\n\ninterface ParsedDep {\n version: string\n from: string\n required?: {\n version: string\n }\n}\n\nexport interface NpmScope {\n npmAlwaysAuth?: boolean\n npmAuthToken?: string\n npmRegistryServer?: string\n}\n\ninterface YarnConfig {\n npmScopes?: Index<NpmScope>\n}\n\n/** Safely interpolates a string as a template string. */\nconst interpolate = (s: string, data: Index<string | undefined>): string =>\n s.replace(\n /\\$\\{([^:-]+)(?:(:)?-([^}]*))?\\}/g,\n (match, key, name, fallbackOnEmpty, fallback) => data[key] || (fallbackOnEmpty ? fallback : ''),\n )\n\n/** Reads an auth token from a yarn config, interpolates it, and returns it as an npm config key-value pair. */\nexport const npmAuthTokenKeyValue = curry((npmConfig: Index<string | boolean>, dep: string, scopedConfig: NpmScope) => {\n if (scopedConfig.npmAuthToken) {\n // get registry server from this config or a previous config (assumes setNpmRegistry has already been called on all npm scopes)\n const registryServer = scopedConfig.npmRegistryServer || (npmConfig[`@${dep}:registry`] as string | undefined)\n // interpolate environment variable fallback\n // https://yarnpkg.com/configuration/yarnrc\n if (registryServer) {\n let trimmedRegistryServer = registryServer.replace(/^https?:/, '')\n\n if (trimmedRegistryServer.endsWith('/')) {\n trimmedRegistryServer = trimmedRegistryServer.slice(0, -1)\n }\n\n return {\n [`${trimmedRegistryServer}/:_authToken`]: interpolate(scopedConfig.npmAuthToken, process.env),\n }\n }\n }\n\n return null\n})\n\n/** Reads a registry from a yarn config. interpolates it, and returns it as an npm config key-value pair. */\nconst npmRegistryKeyValue = (dep: string, scopedConfig: NpmScope): null | Index<VersionSpec> =>\n scopedConfig.npmRegistryServer\n ? { [`@${dep}:registry`]: interpolate(scopedConfig.npmRegistryServer, process.env) }\n : null\n\n/**\n * Returns the path to the local .yarnrc.yml, or undefined. This doesn't\n * actually check that the .yarnrc.yml file exists.\n *\n * Exported for test purposes only.\n *\n * @param readdirSync This is only a parameter so that it can be used in tests.\n */\nexport async function getPathToLookForYarnrc(\n options: Options,\n readdir: (_path: string) => Promise<string[]> = fs.readdir,\n): Promise<string | undefined> {\n if (options.global) return undefined\n\n const directoryPath = (await findLockfile(options, readdir))?.directoryPath\n if (!directoryPath) return undefined\n\n return path.join(directoryPath, '.yarnrc.yml')\n}\n\n// If private registry auth is specified in npmScopes in .yarnrc.yml, read them in and convert them to npm config variables.\n// Define as a memoized function to efficiently call existsSync and readFileSync only once, and only if yarn is being used.\n// https://github.com/raineorshine/npm-check-updates/issues/1036\nconst npmConfigFromYarn = memoize(async (options: Options): Promise<NpmConfig> => {\n const yarnrcLocalPath = await getPathToLookForYarnrc(options)\n const yarnrcUserPath = path.join(os.homedir(), '.yarnrc.yml')\n const yarnrcLocalExists = typeof yarnrcLocalPath === 'string' && (await exists(yarnrcLocalPath))\n const yarnrcUserExists = await exists(yarnrcUserPath)\n const yarnrcLocal = yarnrcLocalExists ? await fs.readFile(yarnrcLocalPath, 'utf-8') : ''\n const yarnrcUser = yarnrcUserExists ? await fs.readFile(yarnrcUserPath, 'utf-8') : ''\n const yarnConfigLocal: YarnConfig = yaml.load(yarnrcLocal) as YarnConfig\n const yarnConfigUser: YarnConfig = yaml.load(yarnrcUser) as YarnConfig\n\n let npmConfig: Index<string | boolean> = {\n ...keyValueBy(yarnConfigUser?.npmScopes || {}, npmRegistryKeyValue),\n ...keyValueBy(yarnConfigLocal?.npmScopes || {}, npmRegistryKeyValue),\n }\n\n // npmAuthTokenKeyValue uses scoped npmRegistryServer, so must come after npmRegistryKeyValue\n npmConfig = {\n ...npmConfig,\n ...keyValueBy(yarnConfigUser?.npmScopes || {}, npmAuthTokenKeyValue(npmConfig)),\n ...keyValueBy(yarnConfigLocal?.npmScopes || {}, npmAuthTokenKeyValue(npmConfig)),\n }\n\n // set auth token after npm registry, since auth token syntax uses registry\n\n if (yarnrcLocalExists) {\n print(options, `\\nUsing local yarn config at ${yarnrcLocalPath}:`, 'verbose')\n print(options, yarnConfigLocal, 'verbose')\n }\n if (yarnrcUserExists) {\n print(options, `\\nUsing user yarn config at ${yarnrcUserPath}:`, 'verbose')\n print(options, yarnConfigLocal, 'verbose')\n }\n\n if (Object.keys(npmConfig)) {\n print(options, '\\nMerged yarn config in npm format:', 'verbose')\n print(options, npmConfig, 'verbose')\n }\n\n return npmConfig\n})\n\n/**\n * Parse JSON lines and throw an informative error on failure.\n *\n * Note: although this is similar to the NPM parseJson() function we always return the\n * same concrete-type here, for now.\n *\n * @param result Output from `yarn list --json` to be parsed\n */\nfunction parseJsonLines(result: string): Promise<{ dependencies: Index<ParsedDep> }> {\n return new Promise((resolve, reject) => {\n const dependencies: Index<ParsedDep> = {}\n\n const parser = jsonlines.parse()\n\n parser.on('data', d => {\n // only parse info data\n // ignore error info, e.g. \"Visit https://yarnpkg.com/en/docs/cli/list for documentation about this command.\"\n if (d.type === 'info' && !d.data.match(/^Visit/)) {\n // parse package name and version number from info data, e.g. \"nodemon@2.0.4\" has binaries\n const [, pkgName, pkgVersion] = d.data.match(/\"(@?.*)@(.*)\"/) || []\n\n dependencies[pkgName] = {\n version: pkgVersion,\n from: pkgName,\n }\n } else if (d.type === 'error') {\n reject(new Error(d.data))\n }\n })\n\n parser.on('end', () => {\n resolve({ dependencies })\n })\n\n parser.on('error', reject)\n\n parser.write(result)\n\n parser.end()\n })\n}\n\n/**\n * Extract first json line from multi line yarn output\n *\n * @param result Output from yarn command to be parsed\n */\nfunction extractFirstJsonLine(result: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const parser = jsonlines.parse()\n let firstFound = false\n\n parser.on('data', value => {\n if (!firstFound) {\n firstFound = true\n resolve(JSON.stringify(value))\n }\n })\n parser.on('error', reject)\n\n parser.write(result)\n\n parser.end()\n })\n}\n\nconst cmd = process.platform === 'win32' ? 'yarn.cmd' : 'yarn'\n\n/**\n * Spawn yarn requires a different command on Windows.\n *\n * @param args\n * @param [yarnOptions={}]\n * @param [spawnOptions={}]\n * @returns\n */\nasync function spawnYarn(\n args: string | string[],\n yarnOptions: NpmOptions = {},\n spawnPleaseOptions: SpawnPleaseOptions = {},\n spawnOptions: SpawnOptions = {},\n): Promise<string> {\n const fullArgs = [\n ...(yarnOptions.global ? ['global'] : []),\n ...(yarnOptions.prefix ? [`--prefix=${yarnOptions.prefix}`] : []),\n '--depth=0',\n '--json',\n '--no-progress',\n // args must go after yarn options; otherwise, they are passed through to npm scripts\n // https://github.com/raineorshine/npm-check-updates/issues/1362\n ...(Array.isArray(args) ? args : [args]),\n ]\n\n const { stdout } = await spawn(cmd, fullArgs, spawnPleaseOptions, spawnOptions)\n\n return stdout\n}\n\n/**\n * Get platform-specific default prefix to pass on to yarn.\n *\n * @param options\n * @param [options.global]\n * @param [options.prefix]\n * @returns\n */\nexport async function defaultPrefix(options: Options): Promise<string | null> {\n if (options.prefix) {\n return Promise.resolve(options.prefix)\n }\n\n const { stdout: prefix } = await spawn(cmd, ['global', 'dir'])\n // yarn 2.0 does not support yarn global\n // catch error to prevent process from crashing\n // https://github.com/raineorshine/npm-check-updates/issues/873\n .catch(() => ({\n stdout: null,\n }))\n\n // FIX: for ncu -g doesn't work on homebrew or windows #146\n // https://github.com/raineorshine/npm-check-updates/issues/146\n\n return options.global && prefix && prefix.match('Cellar')\n ? '/usr/local'\n : // Workaround: get prefix on windows for global packages\n // Only needed when using npm api directly\n process.platform === 'win32' && options.global && !process.env.prefix\n ? prefix\n ? prefix.trim()\n : `${process.env.LOCALAPPDATA}\\\\Yarn\\\\Data\\\\global`\n : null\n}\n\n/**\n * Fetches the list of all installed packages.\n *\n * @param [options]\n * @param [options.cwd]\n * @param [options.global]\n * @param [options.prefix]\n * @returns\n */\nexport const list = async (options: Options = {}, spawnOptions?: SpawnOptions): Promise<Index<string | undefined>> => {\n const jsonLines: string = await spawnYarn(\n 'list',\n options as Index<string>,\n {},\n {\n ...(options.cwd ? { cwd: options.cwd } : {}),\n ...spawnOptions,\n },\n )\n const json: { dependencies: Index<ParsedDep> } = await parseJsonLines(jsonLines)\n const keyValues: Index<string | undefined> = keyValueBy<ParsedDep, string | undefined>(\n json.dependencies,\n (name, info): { [key: string]: string | undefined } => ({\n // unmet peer dependencies have a different structure\n [name]: info.version || info.required?.version,\n }),\n )\n return keyValues\n}\n\n/** Wraps a GetVersion function and passes the yarn config. */\nconst withNpmConfigFromYarn =\n (getVersion: GetVersion): GetVersion =>\n async (packageName, currentVersion, options = {}) =>\n getVersion(packageName, currentVersion, options, await npmConfigFromYarn(options))\n\nexport const distTag = withNpmConfigFromYarn(npm.distTag)\nexport const greatest = withNpmConfigFromYarn(npm.greatest)\nexport const latest = withNpmConfigFromYarn(npm.latest)\nexport const minor = withNpmConfigFromYarn(npm.minor)\nexport const newest = withNpmConfigFromYarn(npm.newest)\nexport const patch = withNpmConfigFromYarn(npm.patch)\nexport const semver = withNpmConfigFromYarn(npm.semver)\n\n/**\n * Fetches the list of peer dependencies for a specific package version.\n *\n * @param packageName\n * @param version\n * @param spawnOptions\n * @returns Promised {packageName: version} collection\n */\nexport const getPeerDependencies = async (\n packageName: string,\n version: Version,\n spawnOptions: SpawnOptions,\n): Promise<Index<Version>> => {\n const { stdout: yarnVersion } = await spawn(cmd, ['--version'], { rejectOnError: false }, spawnOptions)\n if (yarnVersion.startsWith('1')) {\n const args = ['--json', 'info', `${packageName}@${version}`, 'peerDependencies']\n const { stdout } = await spawn(cmd, args, { rejectOnError: false }, spawnOptions)\n return stdout ? npm.parseJson<{ data?: Index<Version> }>(stdout, { command: args.join(' ') }).data || {} : {}\n } else {\n const args = ['--json', 'npm', 'info', `${packageName}@${version}`, '--fields', 'peerDependencies']\n const { stdout } = await spawn(cmd, args, { rejectOnError: false }, spawnOptions)\n if (!stdout) {\n return {}\n }\n try {\n return (\n npm.parseJson<{ peerDependencies?: Index<Version> }>(stdout, { command: args.join(' ') }).peerDependencies || {}\n )\n } catch (parseError) {\n /*\n If package does not exist, yarn returns multiple json errors. As such, we want to extract just the first one, instead of crashing.\n Example response:\n {\"type\":\"error\",\"name\":35,\"displayName\":\"YN0035\",\"indent\":\"\",\"data\":\"Package not found\"}\n{\"type\":\"error\",\"name\":35,\"displayName\":\"YN0035\",\"indent\":\"\",\"data\":\" \\u001b[96mResponse Code\\u001b[39m: \\u001b]8;;https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404\\u0007\\u001b[93m404\\u001b[39m (Not Found)\\u001b]8;;\\u0007\"}\n{\"type\":\"error\",\"name\":35,\"displayName\":\"YN0035\",\"indent\":\"\",\"data\":\" \\u001b[96mRequest Method\\u001b[39m: GET\"}\n{\"type\":\"error\",\"name\":35,\"displayName\":\"YN0035\",\"indent\":\"\",\"data\":\" \\u001b[96mRequest URL\\u001b[39m: \\u001b[95mhttps://registry.yarnpkg.com/fffffffffffff\\u001b[39m\"}\n */\n try {\n const firstObj = await extractFirstJsonLine(stdout)\n if (firstObj) {\n return (\n npm.parseJson<{ peerDependencies?: Index<Version> }>(firstObj, { command: args.join(' ') })\n .peerDependencies || {}\n )\n }\n } catch {}\n throw parseError\n }\n }\n}\n\n/**\n * Fetches the engines list from the registry for a specific package version.\n *\n * @param packageName\n * @param version\n * @returns Promised engines collection\n */\nexport const getEngines = async (\n packageName: string,\n version: Version,\n options: Options = {},\n): Promise<Index<VersionSpec | undefined>> =>\n npm.getEngines(packageName, version, options, await npmConfigFromYarn(options))\n\n/**\n * Check if package author changed between current and upgraded version.\n *\n * @param packageName Name of the package\n * @param currentVersion Current version declaration (may be range)\n * @param upgradedVersion Upgraded version declaration (may be range)\n * @param npmConfigLocal Additional npm config variables that are merged into the system npm config\n * @returns A promise that fulfills with boolean value.\n */\nexport const packageAuthorChanged = async (\n packageName: string,\n currentVersion: VersionSpec,\n upgradedVersion: VersionSpec,\n options: Options = {},\n): Promise<boolean> =>\n npm.packageAuthorChanged(packageName, currentVersion, upgradedVersion, options, await npmConfigFromYarn(options))\n\nexport default spawnYarn\n","import { print } from '../lib/logging'\nimport { Options } from '../types/Options'\nimport chalk from './chalk'\n\n/** Print an error. Exit the process if in CLI mode. */\nfunction programError(\n options: Options,\n message: string,\n {\n color = true,\n }: {\n // defaults to true, which uses chalk.red on the whole error message.\n // set to false to provide your own coloring.\n color?: boolean\n } = {},\n): never {\n if (options.cli) {\n print(options, color ? chalk.red(message) : message, null, 'error')\n process.exit(1)\n } else {\n throw new Error(message)\n }\n}\n\nexport default programError\n","import fs from 'fs/promises'\nimport { Options } from '../types/Options'\nimport { PackageFile } from '../types/PackageFile'\nimport { PackageInfo } from '../types/PackageInfo'\nimport programError from './programError'\n\n/** Load and parse a package file. */\nconst loadPackageInfoFromFile = async (options: Options, filepath: string): Promise<PackageInfo> => {\n let pkg: PackageFile, pkgFile: string\n\n // assert package.json\n try {\n pkgFile = await fs.readFile(filepath, 'utf-8')\n pkg = JSON.parse(pkgFile)\n } catch (e) {\n programError(options, `Missing or invalid ${filepath}`)\n }\n\n return {\n name: undefined, // defined by workspace code only\n pkg,\n pkgFile,\n filepath,\n }\n}\n\nexport default loadPackageInfoFromFile\n","import { cliOptionsMap } from '../cli-options'\nimport { Index } from '../types/IndexType'\nimport { PackageFile } from '../types/PackageFile'\n\n// dependency section aliases that will be resolved to the full name\nconst depAliases: Index<keyof PackageFile> = {\n dev: 'devDependencies',\n peer: 'peerDependencies',\n prod: 'dependencies',\n optional: 'optionalDependencies',\n}\n\n/** Gets a list of dependency sections based on options.dep. */\nconst resolveDepSections = (dep?: string | readonly string[]): (keyof PackageFile)[] => {\n // parse dep string and set default\n const depOptions: string[] = dep ? (typeof dep === 'string' ? dep.split(',') : dep) : cliOptionsMap.dep.default\n\n // map the dependency section option to a full dependency section name\n const depSections = depOptions.map(name => depAliases[name] || name)\n\n return depSections\n}\n\nexport default resolveDepSections\n","import fs from 'fs/promises'\nimport path from 'path'\nimport { Index } from '../types/IndexType'\nimport { VersionSpec } from '../types/VersionSpec'\n\n/**\n * @returns String safe for use in `new RegExp()`\n */\nfunction escapeRegexp(s: string) {\n return s.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&')\n}\n\n/**\n * Upgrade catalog dependencies in a YAML file (e.g., pnpm-workspace.yaml).\n */\nasync function upgradeYamlCatalogData(\n filePath: string,\n current: Index<VersionSpec>,\n upgraded: Index<VersionSpec>,\n): Promise<string> {\n const fileContent = await fs.readFile(filePath, 'utf-8')\n\n // Use regex replacement to maintain original formatting\n return Object.entries(upgraded)\n .filter(([dep]) => current[dep])\n .reduce((content, [dep, newVersion]) => {\n const currentVersion = current[dep]\n\n // Match both quoted and unquoted versions\n const quotedPattern = `(${escapeRegexp(dep)}\\\\s*:\\\\s*[\"'])(${escapeRegexp(currentVersion)})([\"'])`\n const unquotedPattern = `(${escapeRegexp(dep)}\\\\s*:\\\\s*)(${escapeRegexp(currentVersion)})(\\\\s*(?:\\\\n|$))`\n\n const quotedRegex = new RegExp(quotedPattern, 'g')\n const unquotedRegex = new RegExp(unquotedPattern, 'g')\n\n return content.replace(quotedRegex, `$1${newVersion}$3`).replace(unquotedRegex, `$1${newVersion}$3`)\n }, fileContent)\n}\n\n/**\n * Upgrade catalog dependencies in a JSON file (e.g., package.json for Bun).\n */\nasync function upgradeJsonCatalogData(\n filePath: string,\n current: Index<VersionSpec>,\n upgraded: Index<VersionSpec>,\n): Promise<string> {\n const fileContent = await fs.readFile(filePath, 'utf-8')\n\n // Use regex replacement to maintain JSON formatting\n return Object.entries(upgraded)\n .filter(([dep]) => current[dep])\n .reduce((content, [dep, newVersion]) => {\n const currentVersion = current[dep]\n\n // Match catalog and catalogs sections in JSON (both top-level and within workspaces)\n const catalogPattern = `(\"${escapeRegexp(dep)}\"\\\\s*:\\\\s*\")(${escapeRegexp(currentVersion)})(\")`\n const catalogRegex = new RegExp(catalogPattern, 'g')\n\n return content.replace(catalogRegex, `$1${newVersion}$3`)\n }, fileContent)\n}\n\n/**\n * Upgrade catalog dependencies in either YAML or JSON catalog files.\n * Supports pnpm-workspace.yaml (pnpm) and package.json (Bun) catalog formats.\n *\n * @param filePath The path to the catalog file (pnpm-workspace.yaml or package.json)\n * @param current Current catalog dependencies {package: range}\n * @param upgraded New catalog dependencies {package: range}\n * @returns The updated file content as utf8 text\n */\nexport async function upgradeCatalogData(\n filePath: string,\n current: Index<VersionSpec>,\n upgraded: Index<VersionSpec>,\n): Promise<string> {\n const fileExtension = path.extname(filePath)\n\n if (fileExtension === '.yaml' || fileExtension === '.yml') {\n return upgradeYamlCatalogData(filePath, current, upgraded)\n } else if (fileExtension === '.json') {\n return upgradeJsonCatalogData(filePath, current, upgraded)\n } else {\n throw new Error(`Unsupported catalog file type: ${filePath}`)\n }\n}\n\nexport default upgradeCatalogData\n","import fs from 'fs/promises'\nimport yaml from 'js-yaml'\nimport path from 'path'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { PackageFile } from '../types/PackageFile'\nimport { VersionSpec } from '../types/VersionSpec'\nimport resolveDepSections from './resolveDepSections'\nimport upgradeCatalogData from './upgradeCatalogData'\n\n/**\n * @returns String safe for use in `new RegExp()`\n */\nfunction escapeRegexp(s: string) {\n return s.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') // Thanks Stack Overflow!\n}\n\n/**\n * Upgrade the dependency declarations in the package data.\n *\n * @param pkgData The package.json data, as utf8 text\n * @param oldDependencies Old dependencies {package: range}\n * @param newDependencies New dependencies {package: range}\n * @param options Options object\n * @param pkgFile Optional path to the package file\n * @returns The updated package data, as utf8 text\n * @description Side Effect: prompts\n */\nasync function upgradePackageData(\n pkgData: string,\n current: Index<VersionSpec>,\n upgraded: Index<VersionSpec>,\n options: Options,\n pkgFile?: string,\n) {\n // Check if this is a catalog file (pnpm-workspace.yaml or package.json with catalogs)\n if (pkgFile) {\n const fileName = path.basename(pkgFile)\n const fileExtension = path.extname(pkgFile)\n\n // Handle synthetic catalog files (package.json#catalog format)\n if (pkgFile.includes('#catalog')) {\n // This is a synthetic catalog file, we need to read and update the actual file\n const actualFilePath = pkgFile.replace('#catalog', '')\n const actualFileExtension = path.extname(actualFilePath)\n\n if (actualFileExtension === '.json') {\n // Bun format: update package.json catalogs and return the updated content\n return upgradeCatalogData(actualFilePath, current, upgraded)\n }\n }\n\n // Handle pnpm-workspace.yaml catalog files\n if (\n fileName === 'pnpm-workspace.yaml' ||\n (fileName.includes('catalog') && (fileExtension === '.yaml' || fileExtension === '.yml'))\n ) {\n // Check if we have synthetic catalog data (JSON with only dependencies and name/version)\n // In this case, we should generate the proper catalog structure\n const parsed = JSON.parse(pkgData)\n if (\n typeof parsed === 'object' &&\n parsed.name === 'catalog-dependencies' &&\n typeof parsed.dependencies === 'object' &&\n Object.keys(parsed).length <= 3\n ) {\n // This is synthetic catalog data, we need to generate the proper catalog structure\n // Read the original pnpm-workspace.yaml to get the catalog structure\n const yamlContent = await fs.readFile(pkgFile, 'utf-8')\n const yamlData = yaml.load(yamlContent) as {\n packages?: string[]\n catalog?: Index<string>\n catalogs?: Index<Index<string>>\n }\n\n // Update catalog dependencies with upgraded versions\n if (yamlData.catalogs) {\n yamlData.catalogs = Object.entries(yamlData.catalogs as Record<string, Record<string, string>>).reduce(\n (catalogs, [catalogName, catalog]) => ({\n ...catalogs,\n [catalogName]: {\n ...catalog,\n ...Object.entries(upgraded)\n .filter(([dep]) => catalog[dep])\n .reduce((acc, [dep, version]) => ({ ...acc, [dep]: version }), {} as Record<string, string>),\n },\n }),\n {} as Record<string, Record<string, string>>,\n )\n }\n\n // Also handle single catalog (if present)\n if (yamlData.catalog) {\n const catalog = yamlData.catalog as Record<string, string>\n yamlData.catalog = {\n ...catalog,\n ...Object.entries(upgraded)\n .filter(([dep]) => catalog[dep])\n .reduce((acc, [dep, version]) => ({ ...acc, [dep]: version }), {} as Record<string, string>),\n }\n }\n\n // For pnpm, also expose the 'default' catalog as a top-level 'catalog' property\n if (yamlData.catalogs?.default) {\n yamlData.catalog = yamlData.catalogs.default\n }\n\n return JSON.stringify(yamlData, null, 2)\n }\n\n return upgradeCatalogData(pkgFile, current, upgraded)\n }\n\n // Handle package.json catalog files (check if content contains catalog/catalogs at root level or in workspaces)\n if (fileExtension === '.json') {\n const parsed = JSON.parse(pkgData)\n const hasTopLevelCatalogs = parsed.catalog || parsed.catalogs\n const hasWorkspacesCatalogs =\n parsed.workspaces &&\n !Array.isArray(parsed.workspaces) &&\n (parsed.workspaces.catalog || parsed.workspaces.catalogs)\n\n if (hasTopLevelCatalogs || hasWorkspacesCatalogs) {\n return upgradeCatalogData(pkgFile, current, upgraded)\n }\n }\n }\n\n // Always include overrides since any upgraded dependencies needed to be upgraded in overrides as well.\n // https://github.com/raineorshine/npm-check-updates/issues/1332\n const depSections = [...resolveDepSections(options.dep), 'overrides']\n\n // iterate through each dependency section\n const sectionRegExp = new RegExp(`\"(${depSections.join(`|`)})\"s*:[^}]*`, 'g')\n let newPkgData = pkgData.replace(sectionRegExp, section => {\n // replace each upgraded dependency in the section\n return Object.entries(upgraded).reduce((updatedSection, [dep]) => {\n // const expression = `\"${dep}\"\\\\s*:\\\\s*\"(${escapeRegexp(current[dep])})\"`\n const expression = `\"${dep}\"\\\\s*:\\\\s*(\"|{\\\\s*\".\"\\\\s*:\\\\s*\")(${escapeRegexp(current[dep])})\"`\n const regExp = new RegExp(expression, 'g')\n return updatedSection.replace(regExp, (match, child) => `\"${dep}${child ? `\": ${child}` : ': '}${upgraded[dep]}\"`)\n }, section)\n })\n\n if (depSections.includes('packageManager')) {\n const pkg = JSON.parse(pkgData) as PackageFile\n if (pkg.packageManager) {\n const [name] = pkg.packageManager.split('@')\n if (upgraded[name]) {\n newPkgData = newPkgData.replace(\n /\"packageManager\"\\s*:\\s*\".*?@[^\"]*\"/,\n `\"packageManager\": \"${name}@${upgraded[name]}\"`,\n )\n }\n }\n }\n\n return newPkgData\n}\n\nexport default upgradePackageData\n","import fs from 'fs/promises'\nimport spawn from 'spawn-please'\nimport { printUpgrades } from '../lib/logging'\nimport spawnBun from '../package-managers/bun'\nimport spawnNpm from '../package-managers/npm'\nimport spawnPnpm from '../package-managers/pnpm'\nimport spawnYarn from '../package-managers/yarn'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { PackageFile } from '../types/PackageFile'\nimport { PackageInfo } from '../types/PackageInfo'\nimport { SpawnOptions } from '../types/SpawnOptions'\nimport { SpawnPleaseOptions } from '../types/SpawnPleaseOptions'\nimport { VersionSpec } from '../types/VersionSpec'\nimport chalk, { chalkInit } from './chalk'\nimport loadPackageInfoFromFile from './loadPackageInfoFromFile'\nimport upgradePackageData from './upgradePackageData'\n\ntype Run = (options?: Options) => Promise<PackageFile | Index<VersionSpec> | void>\n\n/** Run npm, yarn, pnpm, or bun. */\nconst npm = (\n args: string[],\n options: Options,\n print?: boolean,\n { spawnOptions, spawnPleaseOptions }: { spawnOptions?: SpawnOptions; spawnPleaseOptions?: SpawnPleaseOptions } = {},\n): Promise<string> => {\n if (print) {\n console.log(chalk.blue([options.packageManager, ...args].join(' ')))\n }\n\n const spawnOptionsMerged = {\n cwd: options.cwd || process.cwd(),\n env: {\n ...process.env,\n // TODO: Why does CI break pnpm install?\n ...(options.packageManager !== 'pnpm' ? { CI: '1' } : null),\n FORCE_COLOR: '1',\n ...spawnOptions?.env,\n },\n ...spawnOptions,\n }\n\n const npmOptions = {\n ...(options.global ? { global: true } : null),\n ...(options.prefix ? { prefix: options.prefix } : null),\n }\n\n return (\n options.packageManager === 'pnpm'\n ? spawnPnpm\n : options.packageManager === 'yarn'\n ? spawnYarn\n : options.packageManager === 'bun'\n ? spawnBun\n : spawnNpm\n )(args, npmOptions, spawnPleaseOptions, spawnOptionsMerged)\n}\n\n/** Load and validate package file and tests. */\nconst loadPackageFileForDoctor = async (options: Options): Promise<PackageInfo> => {\n // assert no --packageData or --packageFile\n if (options.packageData || options.packageFile) {\n console.error(\n '--packageData and --packageFile are not allowed with --doctor. You must execute \"ncu --doctor\" in a directory with a package file so it can install dependencies and test them.',\n )\n process.exit(1)\n }\n\n let packageInfo: PackageInfo\n // assert package.json\n try {\n packageInfo = await loadPackageInfoFromFile(options, 'package.json')\n } catch (e) {\n console.error('Missing or invalid package.json')\n process.exit(1)\n }\n\n // assert npm script \"test\" (unless a custom test script is specified)\n if (!options.doctorTest && !packageInfo.pkg.scripts?.test) {\n console.error(\n 'No npm \"test\" script defined. You must define a \"test\" script in the \"scripts\" section of your package.json to use --doctor.',\n )\n process.exit(1)\n }\n\n return packageInfo\n}\n\n/** Iteratively installs upgrades and runs tests to identify breaking upgrades. */\n// we have to pass run directly since it would be a circular require if doctor included this file\nconst doctor = async (run: Run, options: Options): Promise<void> => {\n await chalkInit()\n\n // bun lockFileName defaults to bun.lock but will be overwritten to bun.lockb if detected at the readFile step below\n let lockFileName: 'package-lock.json' | 'yarn.lock' | 'pnpm-lock.yaml' | 'bun.lock' | 'bun.lockb' =\n options.packageManager === 'yarn'\n ? 'yarn.lock'\n : options.packageManager === 'pnpm'\n ? 'pnpm-lock.yaml'\n : options.packageManager === 'bun'\n ? 'bun.lock'\n : 'package-lock.json'\n const { pkg, pkgFile }: PackageInfo = await loadPackageFileForDoctor(options)\n\n // flatten all deps into one so we can iterate over them\n const allDependencies: Index<VersionSpec> = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n ...pkg.optionalDependencies,\n }\n\n /** Install dependencies using \"npm run install\" or a custom script given by --doctorInstall. */\n const runInstall = async (): Promise<void> => {\n if (options.doctorInstall) {\n const [installCommand, ...testArgs] = options.doctorInstall.split(' ')\n console.log(chalk.blue(options.doctorInstall))\n await spawn(installCommand, testArgs)\n } else {\n await npm(['install'], { packageManager: options.packageManager }, true)\n }\n }\n\n /** Run the tests using \"npm run test\" or a custom script given by --doctorTest. */\n const runTests = async (): Promise<void> => {\n const spawnPleaseOptions = {\n stderr: (data: string): void => {\n console.error(chalk.red(data.toString()))\n },\n // Test runners typically write to stdout, so we need to print stdout.\n // Otherwise test failures will be silenced.\n stdout: (data: string): void => {\n process.stdout.write(data.toString())\n },\n }\n\n if (options.doctorTest) {\n const regexp = /\"(.+?)\"|'(.+?)'|[^ ]+/g\n const matches = options.doctorTest.matchAll(regexp)\n let groups: string[] = []\n for (const match of matches) {\n groups = [...groups, match[2] || match[1] || match[0]]\n }\n const [testCommand, ...testArgs] = groups\n console.log(chalk.blue(options.doctorTest))\n await spawn(testCommand, testArgs, spawnPleaseOptions)\n } else {\n await npm(\n ['run', 'test'],\n {\n packageManager: options.packageManager,\n },\n true,\n { spawnPleaseOptions },\n )\n }\n }\n\n console.log(`Running tests before upgrading`)\n\n // initial install\n await runInstall()\n\n // save lock file if there is one\n let lockFile = ''\n try {\n lockFile = await fs.readFile(lockFileName, 'utf-8')\n } catch (e) {\n // try bun.lockb if bun.lock was not found\n // set lockFileName so the rest of doctor mode uses bun.lockb for lock file updating and restoration\n if (options.packageManager === 'bun') {\n lockFileName = 'bun.lockb'\n try {\n lockFile = await fs.readFile(lockFileName, 'utf-8')\n } catch (e) {}\n }\n }\n\n // make sure current tests pass before we begin\n try {\n await runTests()\n } catch (e) {\n console.error('Tests failed before we even got started!')\n process.exit(1)\n }\n\n if (!options.interactive) {\n console.log(`Upgrading all dependencies and re-running tests`)\n }\n\n // upgrade all dependencies\n // save upgrades for later in case we need to iterate\n console.log(\n chalk.blue(\n 'ncu ' +\n process.argv\n .slice(2)\n .filter(arg => arg !== '--doctor')\n .join(' '),\n ),\n )\n process.env.NCU_DOCTOR = '1'\n const upgrades: Index<VersionSpec> = (await run({\n ...options,\n silent: true,\n // --doctor triggers the initial call to doctor, but the internal call needs to executes npm-check-updates normally in order to upgrade the dependencies\n doctor: false,\n })) as Index<VersionSpec>\n\n if (Object.keys(upgrades || {}).length === 0) {\n console.log('All dependencies are up-to-date ' + chalk.green.bold(':)'))\n return\n }\n\n // track if installing dependencies was successful\n // this allows us to skip re-installing when it fails and proceed straight to installing individual dependencies\n let installAllSuccess = false\n\n // run tests on all upgrades\n try {\n // install after all upgrades\n await runInstall()\n installAllSuccess = true\n\n // run tests after all upgrades\n await runTests()\n\n console.log(`${chalk.green('✓')} Tests pass`)\n\n await printUpgrades(options, {\n current: allDependencies,\n upgraded: upgrades,\n total: Object.keys(upgrades || {}).length,\n })\n\n console.log(`\\n${options.interactive ? 'Chosen' : 'All'} dependencies upgraded and installed ${chalk.green(':)')}`)\n } catch {\n console.error(chalk.red(installAllSuccess ? 'Tests failed' : 'Install failed'))\n console.log(`Identifying broken dependencies`)\n\n // restore package file, lockFile and re-install\n await fs.writeFile('package.json', pkgFile)\n\n if (lockFile) {\n await fs.writeFile(lockFileName, lockFile)\n } else {\n await fs.rm(lockFileName, { recursive: true, force: true })\n }\n\n // save the last package file with passing tests\n let lastPkgFile = pkgFile\n\n // re-install after restoring package file and lock file\n // only re-install if the tests failed, not if npm install failed\n if (installAllSuccess) {\n try {\n await runInstall()\n } catch (e) {\n const installCommand = (options.packageManager || 'npm') + ' install'\n throw new Error(\n `Error: Doctor mode was about to test individual upgrades, but ${chalk.cyan(\n installCommand,\n )} failed after rolling back to your existing package and lock files. This is unexpected since the initial install before any upgrades succeeded. Either npm failed to revert a partial install, or failed anomalously on the second run. Please check your internet connection and retry. If doctor mode fails consistently, report a bug with your complete list of dependency versions at https://github.com/raineorshine/npm-check-updates/issues.`,\n )\n }\n }\n\n // iterate upgrades\n let name: string, version: VersionSpec\n for ([name, version] of Object.entries(upgrades)) {\n try {\n // install single dependency\n await npm(\n [\n ...(options.packageManager === 'yarn' ||\n options.packageManager === 'pnpm' ||\n options.packageManager === 'bun'\n ? ['add']\n : ['install', '--no-save']),\n `${name}@${version}`,\n ],\n { packageManager: options.packageManager },\n true,\n )\n\n // if there is a prepare script, we need to run it manually since --no-save does not run prepare automatically\n // https://github.com/raineorshine/npm-check-updates/issues/1170\n if (pkg.scripts?.prepare) {\n try {\n await npm(['run', 'prepare'], { packageManager: options.packageManager }, true)\n } catch (e) {\n console.error(chalk.red('Prepare script failed'))\n throw e\n }\n }\n\n // run tests after individual upgrade\n await runTests()\n console.log(` ${chalk.green('✓')} ${name} ${allDependencies[name]} → ${version}`)\n\n // save upgraded package data so that passing versions can still be saved even when there is a failure\n lastPkgFile = await upgradePackageData(\n lastPkgFile,\n { [name]: allDependencies[name] },\n { [name]: version },\n options,\n )\n\n // save working lock file\n lockFile = await fs.readFile(lockFileName, 'utf-8')\n } catch (e) {\n // print failing package\n console.error(` ${chalk.red('✗')} ${name} ${allDependencies[name]} → ${version}\\n`)\n console.error(chalk.red(e))\n\n // restore last good lock file\n await fs.writeFile(lockFileName, lockFile)\n\n // restore package.json since yarn and pnpm do not have the --no-save option\n if (\n options.packageManager === 'yarn' ||\n options.packageManager === 'pnpm' ||\n options.packageManager === 'bun'\n ) {\n await fs.writeFile('package.json', lastPkgFile)\n }\n }\n }\n\n // silently restore last passing package file and lock file\n // only print message if package file is updated\n if (lastPkgFile !== pkgFile) {\n console.log('Saving partially upgraded package.json')\n await fs.writeFile('package.json', lastPkgFile)\n }\n\n // re-install from restored package.json and lockfile\n await runInstall()\n }\n}\n\nexport default doctor\n","import { findUp } from 'find-up'\nimport fs from 'fs/promises'\nimport { text } from 'node:stream/consumers'\nimport path from 'path'\nimport { print } from '../lib/logging'\nimport { Options } from '../types/Options'\nimport chalk from './chalk'\nimport programError from './programError'\n\n/**\n * Finds the package file and data.\n *\n * Searches as follows:\n * --packageData flag\n * --packageFile flag\n * --stdin\n * --findUp\n */\nasync function findPackage(options: Options): Promise<{\n pkgData: string | null\n pkgFile: string | null\n pkgPath: string | null\n}> {\n let pkgData\n let pkgFile = null\n const pkgPath = options.packageFile || 'package.json'\n\n /** Reads the contents of a package file. */\n function getPackageDataFromFile(pkgFile: string | null | undefined, pkgFileName: string): Promise<string> {\n // exit if no pkgFile to read from fs\n if (pkgFile != null) {\n const relPathToPackage = path.resolve(pkgFile)\n print(options, `${options.upgrade ? 'Upgrading' : 'Checking'} ${relPathToPackage}`)\n } else {\n programError(\n options,\n `${chalk.red(\n `No ${pkgFileName}`,\n )}\\n\\nPlease add a ${pkgFileName} to the current directory, specify the ${chalk.cyan(\n '--packageFile',\n )} or ${chalk.cyan('--packageData')} options, or pipe a ${pkgFileName} to stdin and specify ${chalk.cyan(\n '--stdin',\n )}.`,\n { color: false },\n )\n }\n\n return fs.readFile(pkgFile!, 'utf-8').catch(e => {\n programError(options, e)\n })\n }\n\n print(options, 'Running in local mode', 'verbose')\n print(options, 'Finding package file data', 'verbose')\n\n // get the package data from the various input possibilities\n if (options.packageData) {\n pkgFile = null\n pkgData = Promise.resolve(options.packageData)\n } else if (options.packageFile) {\n pkgFile = options.packageFile\n pkgData = getPackageDataFromFile(pkgFile, pkgPath)\n } else if (options.stdin) {\n print(options, 'Waiting for package data on stdin', 'verbose')\n\n // get data from stdin\n // trim stdin to account for \\r\\n\n const stdinData = await text(process.stdin)\n const data = stdinData.trim().length > 0 ? stdinData : null\n\n // if no stdin content fall back to searching for package.json from pwd and up to root\n pkgFile = data || !pkgPath ? null : await findUp(pkgPath)\n pkgData = data || getPackageDataFromFile(await pkgFile, pkgPath)\n } else {\n // find the closest package starting from the current working directory and going up to the root\n pkgFile = pkgPath\n ? await findUp(\n !options.packageFile && options.packageManager === 'deno' ? ['deno.json', 'deno.jsonc'] : pkgPath,\n {\n cwd: options.cwd || process.cwd(),\n },\n )\n : null\n pkgData = getPackageDataFromFile(pkgFile, pkgPath)\n }\n\n const pkgDataResolved = await pkgData\n\n return {\n pkgData: pkgDataResolved,\n pkgFile: pkgFile || null,\n pkgPath,\n }\n}\n\nexport default findPackage\n","import glob, { type Options as GlobOptions } from 'fast-glob'\nimport fs from 'fs/promises'\nimport yaml from 'js-yaml'\nimport { extend } from 'lodash'\nimport path from 'path'\nimport picomatch from 'picomatch'\nimport untildify from 'untildify'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { PackageFile } from '../types/PackageFile'\nimport { PackageInfo } from '../types/PackageInfo'\nimport { VersionSpec } from '../types/VersionSpec'\nimport findPackage from './findPackage'\nimport loadPackageInfoFromFile from './loadPackageInfoFromFile'\nimport programError from './programError'\n\ntype PnpmWorkspaces =\n | string[]\n | { packages: string[]; catalog?: Index<VersionSpec>; catalogs?: Index<Index<VersionSpec>> }\n\n/** */\nfunction getGlobOptions(options: Options): GlobOptions {\n const ignoreDirs = typeof options.ignore === 'string' ? [options.ignore] : options.ignore || []\n return {\n ignore: ['**/node_modules/**', ...ignoreDirs],\n }\n}\n\n/** Reads, parses, and resolves workspaces from a pnpm-workspace file at the same path as the package file. */\nconst readPnpmWorkspaces = async (pkgPath: string): Promise<PnpmWorkspaces | null> => {\n const pnpmWorkspacesPath = path.join(path.dirname(pkgPath), 'pnpm-workspace.yaml')\n let pnpmWorkspaceFile: string\n try {\n pnpmWorkspaceFile = await fs.readFile(pnpmWorkspacesPath, 'utf-8')\n } catch {\n return null\n }\n return yaml.load(pnpmWorkspaceFile) as PnpmWorkspaces\n}\n\n/** Gets catalog dependencies from both pnpm-workspace.yaml and package.json files. */\nconst readCatalogDependencies = async (options: Options, pkgPath: string): Promise<Index<VersionSpec> | null> => {\n const catalogDependencies: Index<VersionSpec> = {}\n\n // Read from pnpm-workspace.yaml if the package manager is pnpm\n if (options.packageManager === 'pnpm') {\n const pnpmWorkspaces = await readPnpmWorkspaces(pkgPath)\n if (pnpmWorkspaces && !Array.isArray(pnpmWorkspaces)) {\n // Handle both singular 'catalog' and plural 'catalogs'\n if (pnpmWorkspaces.catalog) {\n Object.assign(catalogDependencies, pnpmWorkspaces.catalog)\n }\n if (pnpmWorkspaces.catalogs) {\n Object.assign(catalogDependencies, ...Object.values(pnpmWorkspaces.catalogs))\n }\n }\n }\n\n // Read from package.json (for Bun and modern pnpm)\n const packageData: PackageFile & {\n catalog?: Index<VersionSpec>\n catalogs?: Index<Index<VersionSpec>>\n workspaces?: string[] | { packages: string[]; catalog?: Index<VersionSpec>; catalogs?: Index<Index<VersionSpec>> }\n } = JSON.parse(await fs.readFile(pkgPath, 'utf-8'))\n\n Object.assign(catalogDependencies, packageData.catalog, ...Object.values(packageData.catalogs ?? {}))\n\n // Workspaces catalogs (Bun format)\n if (packageData.workspaces && !Array.isArray(packageData.workspaces)) {\n Object.assign(\n catalogDependencies,\n packageData.workspaces.catalog,\n ...Object.values(packageData.workspaces.catalogs ?? {}),\n )\n }\n\n return Object.keys(catalogDependencies).length > 0 ? catalogDependencies : null\n}\n\n/**\n * Gets all workspace packages information.\n *\n * @param options the application options, used to determine which packages to return.\n * @param defaultPackageFilename the default package filename\n * @returns a list of PackageInfo objects, one for each workspace file\n */\nasync function getWorkspacePackageInfos(\n options: Options,\n defaultPackageFilename: string,\n rootPackageFile: string,\n cwd: string,\n): Promise<[PackageInfo[], string[]]> {\n // use silent; otherwise, there will be a duplicate \"Checking\" message\n const { pkgData, pkgPath } = await findPackage({ ...options, packageFile: rootPackageFile, loglevel: 'silent' })\n const rootPkg: PackageFile = typeof pkgData === 'string' ? JSON.parse(pkgData) : pkgData\n\n const workspacesObject = rootPkg.workspaces || (await readPnpmWorkspaces(pkgPath || ''))\n const workspaces = Array.isArray(workspacesObject) ? workspacesObject : workspacesObject?.packages\n\n if (!workspaces) {\n programError(\n options,\n `workspaces property missing from package.json. --workspace${\n options.workspaces ? 's' : ''\n } only works when you specify a \"workspaces\" property in your package.json.`,\n )\n }\n\n // build a glob from the workspaces\n // FIXME: the following workspaces check is redundant\n const workspacePackageGlob: string[] = (workspaces || []).map(workspace =>\n path\n .join(cwd, workspace, 'package.json')\n // convert Windows path to *nix path for globby\n .replace(/\\\\/g, '/'),\n )\n const globOptions = getGlobOptions(options)\n // e.g. [packages/a/package.json, ...]\n const allWorkspacePackageFilepaths: string[] = glob.sync(workspacePackageGlob, globOptions)\n\n // Get the package names from the package files.\n // If a package does not have a name, use the folder name.\n // These will be used to filter out local workspace packages so they are not fetched from the registry.\n const allWorkspacePackageInfos: PackageInfo[] = await Promise.all(\n allWorkspacePackageFilepaths.map(async (filepath: string): Promise<PackageInfo> => {\n const info: PackageInfo = await loadPackageInfoFromFile(options, filepath)\n info.name = info.pkg.name || filepath.split('/').slice(-2)[0]\n return info\n }),\n )\n\n // Workspace package names\n // These will be used to filter out local workspace packages so they are not fetched from the registry.\n const allWorkspacePackageNames: string[] = allWorkspacePackageInfos.map(\n (packageInfo: PackageInfo): string => packageInfo.name || '',\n )\n\n const filterWorkspaces = options.workspaces !== true\n if (!filterWorkspaces) {\n // --workspaces\n return [allWorkspacePackageInfos, allWorkspacePackageNames]\n }\n\n // add workspace packages\n // --workspace\n const selectedWorkspacePackageInfos: PackageInfo[] = allWorkspacePackageInfos.filter((packageInfo: PackageInfo) =>\n options.workspace?.some((workspace: string) =>\n workspaces?.some(\n (workspacePattern: string) =>\n packageInfo.name === workspace ||\n packageInfo.filepath ===\n path.join(cwd, path.dirname(workspacePattern), workspace, defaultPackageFilename).replace(/\\\\/g, '/'),\n ),\n ),\n )\n return [selectedWorkspacePackageInfos, allWorkspacePackageNames]\n}\n\n/**\n * Gets catalog package info from pnpm-workspace.yaml or package.json.\n *\n * @param options the application options\n * @param pkgPath the package file path (already resolved)\n * @returns PackageInfo for catalog dependencies or null if no catalogs exist\n */\nasync function getCatalogPackageInfo(options: Options, pkgPath: string): Promise<PackageInfo | null> {\n if (!pkgPath) {\n return null\n }\n\n const catalogDependencies = await readCatalogDependencies(options, pkgPath)\n if (!catalogDependencies) {\n return null\n }\n\n // Create a synthetic package info for catalog dependencies\n const catalogPackageFile: PackageFile = {\n name: 'catalog-dependencies',\n version: '1.0.0',\n dependencies: catalogDependencies,\n }\n\n // Determine the correct file path for catalogs. For pnpm, use pnpm-workspace.yaml.\n // For Bun catalogs in package.json, use a virtual path to avoid conflicts with root package.\n const catalogFilePath =\n options.packageManager === 'pnpm' ? path.join(path.dirname(pkgPath), 'pnpm-workspace.yaml') : `${pkgPath}#catalog`\n\n // Create synthetic file content that matches the synthetic PackageFile\n const syntheticFileContent = JSON.stringify(catalogPackageFile, null, 2)\n\n const catalogPackageInfo: PackageInfo = {\n filepath: catalogFilePath,\n pkg: catalogPackageFile,\n pkgFile: syntheticFileContent,\n name: 'catalogs',\n }\n\n return catalogPackageInfo\n}\n\n/**\n * Gets all local packages, including workspaces (depending on -w, -ws, and -root).\n *\n * @param options the application options, used to determine which packages to return.\n * @returns PackageInfo[] an array of all package infos to be considered for updating\n */\nasync function getAllPackages(options: Options): Promise<[PackageInfo[], string[]]> {\n const defaultPackageFilename = options.packageFile || 'package.json'\n const cwd = options.cwd ? untildify(options.cwd) : './'\n const rootPackageFile = options.packageFile || (options.cwd ? path.join(cwd, 'package.json') : 'package.json')\n\n const useWorkspaces: boolean =\n options.workspaces === true || (options.workspace !== undefined && options.workspace.length !== 0)\n\n let packageInfos: PackageInfo[] = []\n\n // Find the package file with globby.\n // When in workspaces mode, only include the root project package file when --root is used.\n const getBasePackageFile: boolean = !useWorkspaces || options.root === true\n if (getBasePackageFile) {\n // we are either:\n // * NOT a workspace\n // * a workspace and have requested an upgrade of the workspace-root\n const globPattern = rootPackageFile.replace(/\\\\/g, '/')\n const globOptions = getGlobOptions(options)\n const rootPackagePaths = glob.sync(globPattern, globOptions)\n // realistically there should only be zero or one\n const rootPackages = await Promise.all(\n rootPackagePaths.map(\n async (packagePath: string): Promise<PackageInfo> => await loadPackageInfoFromFile(options, packagePath),\n ),\n )\n packageInfos = [...packageInfos, ...rootPackages]\n }\n\n if (!useWorkspaces) {\n return [packageInfos, []]\n }\n\n // Read catalog dependencies first so we can resolve references\n let catalogPackageInfo: PackageInfo | null = null\n\n if (useWorkspaces) {\n const { pkgPath: workspacePkgPath } = await findPackage({\n ...options,\n packageFile: rootPackageFile,\n loglevel: 'silent',\n })\n if (workspacePkgPath) {\n catalogPackageInfo = await getCatalogPackageInfo(options, workspacePkgPath)\n }\n }\n\n // workspaces\n const [workspacePackageInfos, workspaceNames]: [PackageInfo[], string[]] = await getWorkspacePackageInfos(\n options,\n defaultPackageFilename,\n rootPackageFile,\n cwd,\n )\n\n // Don't resolve catalog references in workspace packages - leave them as \"catalog:*\"\n // Only the catalog definitions themselves should be updated\n packageInfos = [...packageInfos, ...workspacePackageInfos]\n\n // Add catalog package info for version checking (only if there are catalogs)\n if (catalogPackageInfo) {\n packageInfos = [...packageInfos, catalogPackageInfo]\n }\n\n // Filter out ignored directories using glob patterns\n if (options.ignore) {\n const ignoreDirs = Array.isArray(options.ignore) ? options.ignore : [options.ignore]\n\n packageInfos = packageInfos.filter(packageInfo => {\n const relativePath = path.relative(cwd, packageInfo.filepath).replace(/\\\\/g, '/')\n const dirPath = path.dirname(relativePath).replace(/\\\\/g, '/')\n\n // Check if any ignore pattern matches the directory path\n return !ignoreDirs.some(ignorePattern => {\n // Create glob matchers for the pattern\n const isMatch = picomatch(ignorePattern)\n\n // Test against both the full relative path and just the directory path\n return isMatch(relativePath) || isMatch(dirPath) || isMatch(`${dirPath}/`)\n })\n })\n }\n\n return [packageInfos, workspaceNames]\n}\n\nexport default getAllPackages\n","import os from 'os'\nimport path from 'path'\nimport { rcFile } from 'rc-config-loader'\nimport { cliOptionsMap } from '../cli-options'\nimport { Options } from '../types/Options'\nimport { RcOptions } from '../types/RcOptions'\nimport programError from './programError'\n\n/** Loads the .ncurc config file. */\nasync function getNcuRc({\n configFileName,\n configFilePath,\n packageFile,\n global,\n options,\n}: {\n configFileName?: string\n configFilePath?: string\n /** If true, does not look in package directory. */\n global?: boolean\n packageFile?: string\n options: Options\n}) {\n const { default: chalkDefault, Chalk } = await import('chalk')\n const chalk = options?.color ? new Chalk({ level: 1 }) : chalkDefault\n\n const rawResult = rcFile<RcOptions>('ncurc', {\n configFileName: configFileName || '.ncurc',\n defaultExtension: ['.json', '.yml', '.js'],\n cwd: configFilePath || (global ? os.homedir() : packageFile ? path.dirname(packageFile) : undefined),\n })\n\n // ensure a file was found if expected\n const filePath = rawResult?.filePath\n if (configFileName && !filePath) {\n programError(options, `Config file ${configFileName} not found in ${configFilePath || process.cwd()}`)\n }\n\n // convert the config to valid options by removing $schema and parsing format\n const { $schema: _, ...rawConfig } = rawResult?.config || {}\n const config: Options = rawConfig\n if (typeof config.format === 'string') config.format = cliOptionsMap.format.parse!(config.format)\n\n // validate arguments here to provide a better error message\n const unknownOptions = Object.keys(config).filter(arg => !cliOptionsMap[arg])\n if (unknownOptions.length > 0) {\n console.error(\n chalk.red(`Unknown option${unknownOptions.length === 1 ? '' : 's'} found in config file:`),\n chalk.gray(unknownOptions.join(', ')),\n )\n console.info('Using config file ' + filePath)\n console.info(`You can change the config file path with ${chalk.blue('--configFilePath')}`)\n }\n\n // flatten config object into command line arguments to be read by commander\n const args = Object.entries(config).flatMap(([name, value]): any[] => {\n // render boolean options as a single parameter\n // an option is considered boolean if its type is explicitly set to boolean, or if it is has a proper JavaScript boolean value\n if (typeof value === 'boolean' || cliOptionsMap[name]?.type === 'boolean') {\n // if the boolean option is true, include only the nullary option --${name}; otherwise, exclude it\n return value ? [`--${name}`] : []\n }\n // otherwise render as a 2-tuple with name and value\n return [`--${name}`, value]\n })\n\n return { filePath, args, config }\n}\n\nexport default getNcuRc\n","/** Fetches package metadata from GitHub tags. */\nimport childProcess from 'node:child_process'\nimport { promisify } from 'node:util'\nimport parseGitHubUrl from 'parse-github-url'\nimport { valid } from 'semver'\nimport { print } from '../lib/logging'\nimport * as versionUtil from '../lib/version-util'\nimport { GetVersion } from '../types/GetVersion'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { VersionLevel } from '../types/VersionLevel'\nimport { VersionResult } from '../types/VersionResult'\nimport { VersionSpec } from '../types/VersionSpec'\n\nconst execFile = promisify(childProcess.execFile)\n\n/**\n * Fetches and extracts all git tags from a git url.\n *\n * @param url - url to a github repository.\n * @returns the extracted git tags.\n */\nasync function getGitTags(url: string): Promise<Index<string>> {\n const out = (await execFile('git', ['ls-remote', '--tags', url])).stdout\n const tags: Index<string> = {}\n for (const line of out.trim().split('\\n')) {\n const splitted = line.split('\\t')\n tags[splitted[1].replace(/^refs\\/tags\\/|\\^{}$/g, '')] = splitted[0]\n }\n return tags\n}\n\n/** Gets remote versions sorted. */\nasync function getSortedVersions(\n name: string,\n declaration: VersionSpec,\n options?: Options,\n): Promise<string[] | undefined> {\n // if present, github: is parsed as the protocol. This is not valid when passed into remote-git-tags.\n declaration = declaration.replace(/^github:/, '')\n const { auth, protocol, host, path } = parseGitHubUrl(declaration)!\n let tags: Index<string>\n\n try {\n if (protocol !== null) {\n tags = await getGitTags(\n `${protocol ? protocol.replace('git+', '') : 'https:'}//${auth ? auth + '@' : ''}${host}/${path?.replace(/^:/, '')}`,\n )\n } else {\n try {\n tags = await getGitTags(`ssh://git@${host}/${path?.replace(/^:/, '')}`)\n } catch {\n tags = await getGitTags(`https://${auth ? auth + '@' : ''}${host}/${path}`)\n }\n }\n } catch (e) {\n // catch a variety of errors that occur on invalid or private repos\n print(options ?? {}, `Invalid, private repo, or no tags for ${name}: ${declaration}`, 'verbose')\n return\n }\n\n return (\n Object.keys(tags)\n .map(versionUtil.fixPseudoVersion)\n // do not pass semver.valid reference directly since the mapping index will be interpreted as the loose option\n // https://github.com/npm/node-semver#functions\n .filter(tag => valid(tag))\n .sort(versionUtil.compareVersions)\n )\n}\n\n/** Return the highest non-prerelease numbered tag on a remote Git URL. */\nexport const latest: GetVersion = async (name: string, declaration: VersionSpec, options?: Options) => {\n const versions = await getSortedVersions(name, declaration, options)\n if (!versions) return { version: null }\n const versionsFiltered = options?.pre ? versions : versions.filter(v => !versionUtil.isPre(v))\n const latestVersion = versionsFiltered[versionsFiltered.length - 1]\n return { version: latestVersion ? versionUtil.upgradeGitHubUrl(declaration, latestVersion) : null }\n}\n\n/** Return the highest numbered tag on a remote Git URL. */\nexport const greatest: GetVersion = async (name: string, declaration: VersionSpec, options?: Options) => {\n const versions = await getSortedVersions(name, declaration, options)\n if (!versions) return { version: null }\n const greatestVersion = versions[versions.length - 1]\n return { version: greatestVersion ? versionUtil.upgradeGitHubUrl(declaration, greatestVersion) : null }\n}\n\n/** Returns a function that returns the highest version at the given level. */\nexport const greatestLevel =\n (level: VersionLevel) =>\n async (name: string, declaration: VersionSpec, options: Options = {}): Promise<VersionResult> => {\n const version = decodeURIComponent(parseGitHubUrl(declaration)!.branch).replace(/^semver:/, '')\n const versions = await getSortedVersions(name, declaration, options)\n if (!versions) return { version: null }\n\n const greatestMinor = versionUtil.findGreatestByLevel(\n versions.map(v => v.replace(/^v/, '')),\n version,\n level,\n )\n\n return { version: greatestMinor ? versionUtil.upgradeGitHubUrl(declaration, greatestMinor) : null }\n }\n\nexport const minor = greatestLevel('minor')\nexport const patch = greatestLevel('patch')\n\n/** All git tags are exact versions, so --target semver should never upgrade git tags. */\n// https://github.com/raineorshine/npm-check-updates/pull/1368\nexport const semver: GetVersion = async (_name: string, _declaration: VersionSpec, _options?: Options) => {\n return { version: null }\n}\n\n// use greatest for newest rather than leaving newest undefined\n// this allows a mix of npm and github urls to be used in a package file without causing an \"Unsupported target\" error\nexport const newest = greatest\n","import memoize from 'fast-memoize'\nimport fs from 'fs/promises'\nimport programError from '../lib/programError'\nimport { GetVersion } from '../types/GetVersion'\nimport { Options } from '../types/Options'\nimport { StaticRegistry } from '../types/StaticRegistry'\nimport { Version } from '../types/Version'\n\n/** Returns true if a string is a url. */\nconst isUrl = (s: string) => (s && s.startsWith('http://')) || s.startsWith('https://')\n\n/**\n * Returns a registry object given a valid file path or url.\n *\n * @param path\n * @returns a registry object\n */\nconst readStaticRegistry = async (options: Options): Promise<StaticRegistry> => {\n const path = options.registry!\n let content: string\n\n // url\n if (isUrl(path)) {\n const body = await fetch(path)\n content = await body.text()\n }\n // local path\n else {\n try {\n content = await fs.readFile(path, 'utf8')\n } catch (err) {\n programError(options, `\\nThe specified static registry file does not exist: ${options.registry}`)\n }\n }\n\n return JSON.parse(content)\n}\n\nconst registryMemoized = memoize(readStaticRegistry)\n\n/**\n * Fetches the version in static registry.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns A promise that fulfills to string value or null\n */\nexport const latest: GetVersion = async (packageName: string, currentVersion: Version, options?: Options) => {\n const registry: StaticRegistry = await registryMemoized(options || {})\n return { version: registry[packageName] || null }\n}\n","import { Index } from '../types/IndexType'\nimport { PackageManager } from '../types/PackageManager'\nimport * as bun from './bun'\nimport * as gitTags from './gitTags'\nimport * as npm from './npm'\nimport * as pnpm from './pnpm'\nimport * as staticRegistry from './staticRegistry'\nimport * as yarn from './yarn'\n\nexport default {\n npm,\n pnpm,\n yarn,\n bun,\n gitTags,\n staticRegistry,\n} as Index<PackageManager>\n","import { dequal } from 'dequal'\nimport propertyOf from 'lodash/propertyOf'\nimport cliOptions from '../cli-options'\nimport { print } from '../lib/logging'\nimport packageManagers from '../package-managers'\nimport { FilterPattern } from '../types/FilterPattern'\nimport { Options } from '../types/Options'\nimport { RunOptions } from '../types/RunOptions'\nimport { Target } from '../types/Target'\nimport cacher from './cache'\nimport determinePackageManager from './determinePackageManager'\nimport exists from './exists'\nimport keyValueBy from './keyValueBy'\nimport programError from './programError'\n\nfunction parseFilterExpression(filterExpression: string[] | undefined): string[] | undefined\nfunction parseFilterExpression(filterExpression: FilterPattern | undefined): FilterPattern | undefined\n/** Trims and filters out empty values from a filter expression. */\nfunction parseFilterExpression(filterExpression: FilterPattern | undefined): FilterPattern | undefined {\n if (typeof filterExpression === 'string') {\n return filterExpression.trim()\n } else if (\n Array.isArray(filterExpression) &&\n (filterExpression.length === 0 || typeof filterExpression[0] === 'string')\n ) {\n const filtered = filterExpression.map(s => (typeof s === 'string' ? s.trim() : s)).filter(x => x)\n return filtered.length > 0 ? filtered : undefined\n } else {\n return filterExpression\n }\n}\n\n/** Checks if a string is a valid URL. */\nfunction isValidUrl(url: string): boolean {\n try {\n new URL(url)\n return true\n } catch {\n return false\n }\n}\n\n/** Initializes, validates, sets defaults, and consolidates program options. */\nasync function initOptions(runOptions: RunOptions, { cli }: { cli?: boolean } = {}): Promise<Options> {\n const { default: chalkDefault, Chalk } = await import('chalk')\n const chalk = runOptions.color ? new Chalk({ level: 1 }) : chalkDefault\n\n // if not executed on the command-line (i.e. executed as a node module), set the defaults\n if (!cli) {\n // set cli defaults since they are not set by commander in this case\n const cliDefaults = cliOptions.reduce(\n (acc, curr) => ({\n ...acc,\n ...(curr.default != null ? { [curr.long]: curr.default } : null),\n }),\n {},\n )\n\n // set default options that are specific to module usage\n const moduleDefaults: Options = {\n jsonUpgraded: true,\n silent: runOptions.silent || (runOptions.loglevel === undefined && !runOptions.verbose),\n args: [],\n }\n\n runOptions = { ...cliDefaults, ...moduleDefaults, ...runOptions }\n }\n\n // convert packageData to string to convert RunOptions to Options\n const options: Options = {\n ...runOptions,\n ...(runOptions.packageData && typeof runOptions.packageData !== 'string'\n ? { packageData: JSON.stringify(runOptions.packageData, null, 2) as any }\n : null),\n cli,\n }\n\n // consolidate loglevel\n const loglevel =\n options.silent || options.format?.includes('lines') ? 'silent' : options.verbose ? 'verbose' : options.loglevel\n\n const json = Object.keys(options)\n .filter(option => option.startsWith('json'))\n .some(propertyOf(options))\n\n if (!json && loglevel !== 'silent' && options.rcConfigPath && !options.doctor) {\n print(options, `Using config file ${options.rcConfigPath}`)\n }\n\n // warn about deprecated options\n const deprecatedOptions = cliOptions.filter(\n ({ long, deprecated }) =>\n (deprecated && options[long as keyof Options]) ||\n // special case to deprecate a value but not the entire option\n (long === 'packageManager' && options.packageManager === 'staticRegistry'),\n )\n if (deprecatedOptions.length > 0) {\n deprecatedOptions.forEach(({ long, description }) => {\n const deprecationMessage =\n long === 'packageManager'\n ? '--packageManager staticRegistry is deprecated. Use --registryType json.'\n : `--${long}: ${description}`\n print(options, chalk.yellow(deprecationMessage), 'warn')\n })\n print(options, '', 'warn')\n }\n\n // validate options with predefined choices\n cliOptions.forEach(({ long, choices }) => {\n if (!choices || choices.length === 0) return\n const value = options[long as keyof Options]\n const values = Array.isArray(value) ? value : [value]\n if (values.length === 0) return\n // make sure the option value is valid\n // if an array of values is given, make sure each one is a valid choice\n if (values.every(value => !choices.includes(value))) {\n programError(options, `Invalid option value: --${long} ${value}. Valid values are: ${choices.join(', ')}.`)\n }\n })\n\n // validate options.cwd\n if (options.cwd && !(await exists(options.cwd))) {\n programError(options, `No such directory: ${options.cwd}`)\n }\n\n // trim filter args\n // disallow non-matching filter and args\n const args = parseFilterExpression(options.args)\n const filter = parseFilterExpression(options.filter)\n const filterVersion = parseFilterExpression(options.filterVersion)\n const reject = parseFilterExpression(options.reject)\n const rejectVersion = parseFilterExpression(options.rejectVersion)\n const registryType = options.registryType || (options.registry?.endsWith('.json') ? 'json' : 'npm')\n\n // convert to string for comparison purposes\n // otherwise ['a b'] will not match ['a', 'b']\n if (options.filter && args && !dequal(args.join(' '), Array.isArray(filter) ? filter.join(' ') : filter)) {\n programError(\n options,\n 'Cannot specify a filter using both --filter and args. Did you forget to quote an argument?\\nSee: https://github.com/raineorshine/npm-check-updates/issues/759#issuecomment-723587297',\n )\n }\n // disallow packageFile and --deep\n else if (options.packageFile && options.deep) {\n programError(\n options,\n `Cannot specify both --packageFile and --deep. --deep is an alias for --packageFile '**/package.json'`,\n )\n }\n // disallow --format lines and --jsonUpgraded\n else if (options.format?.includes('lines') && options.jsonUpgraded) {\n programError(options, 'Cannot specify both --format lines and --jsonUpgraded.')\n } else if (options.format?.includes('lines') && options.jsonAll) {\n programError(options, 'Cannot specify both --format lines and --jsonAll.')\n } else if (options.format?.includes('lines') && options.format.length > 1) {\n programError(options, 'Cannot use --format lines with other formatting options.')\n }\n // disallow --workspace and --workspaces\n else if (options.workspace?.length && options.workspaces) {\n programError(options, 'Cannot specify both --workspace and --workspaces.')\n }\n // disallow --workspace(s) and --deep\n else if (options.deep && (options.workspace?.length || options.workspaces)) {\n programError(options, `Cannot specify both --deep and --workspace${options.workspaces ? 's' : ''}.`)\n }\n // disallow --workspace(s) and --doctor\n else if (options.doctor && (options.workspace?.length || options.workspaces)) {\n programError(options, `Doctor mode is not currently supported with --workspace${options.workspaces ? 's' : ''}.`)\n }\n // disallow missing registry path when using registryType\n else if (options.packageManager === 'staticRegistry' && !options.registry) {\n programError(\n options,\n 'When --package-manager staticRegistry is specified, you must provide the path for the registry file with --registry.',\n )\n } else if (options.registryType === 'json' && !options.registry) {\n programError(\n options,\n 'When --registryType json is specified, you must provide the path for the registry file with --registry. Run \"ncu --help registryType\" for details.',\n )\n } else if (registryType !== 'json' && options.registry && !isValidUrl(options.registry)) {\n programError(options, `--registry must be a valid URL. Invalid value: \"${options.registry}\"`)\n }\n\n if (options.cooldown != null) {\n const isValidNumber = typeof options.cooldown === 'number' && !isNaN(options.cooldown) && options.cooldown >= 0\n const isValidFunction = typeof options.cooldown === 'function'\n\n if (!isValidNumber && !isValidFunction) {\n programError(options, 'Cooldown must be a non-negative integer representing days since published or a function')\n }\n }\n\n const target: Target = options.target || 'latest'\n\n const autoPre = target === 'newest' || target === 'greatest'\n\n const packageManager = await determinePackageManager(options)\n\n const resolvedOptions: Options = {\n ...options,\n ...(options.deep ? { packageFile: '**/package.json' } : null),\n ...(packageManager === 'deno' ? { dep: ['imports'] } : null),\n ...(options.format && options.format.length > 0 ? { format: options.format } : null),\n filter: args || filter,\n filterVersion,\n // add shortcut for any keys that start with 'json'\n json,\n loglevel,\n minimal: options.minimal === undefined ? false : options.minimal,\n // default to false, except when newest or greatest are set\n // this is overridden on a per-dependency basis in queryVersions to allow prereleases to be upgraded to newer prereleases\n ...(options.pre != null || autoPre ? { pre: options.pre != null ? !!options.pre : autoPre } : null),\n reject,\n rejectVersion,\n target,\n // imply upgrade in interactive mode when json is not specified as the output\n ...(options.interactive && options.upgrade === undefined ? { upgrade: !json } : null),\n packageManager,\n ...(options.prefix\n ? {\n // use the npm prefix if the package manager does not define defaultPrefix\n prefix: await (packageManagers[packageManager || '']?.defaultPrefix || packageManagers.npm.defaultPrefix!)(\n options,\n ),\n }\n : null),\n registryType,\n }\n resolvedOptions.cacher = await cacher(resolvedOptions)\n\n // remove undefined values\n const resolvedOptionsFiltered: Options = keyValueBy(\n resolvedOptions as { [key: string]: Options[keyof Options] },\n (key, value) => (value !== undefined ? { [key]: value } : null),\n )\n\n // print 'Using yarn/pnpm/etc' when autodetected\n // use resolved options so that options.json is set\n if (!options.packageManager && packageManager !== 'npm') {\n print(resolvedOptionsFiltered, `Using ${packageManager}`)\n }\n\n return resolvedOptionsFiltered\n}\n\nexport default initOptions\n","import { Options } from '../types/Options'\n\ntype OptionKey = keyof Options\n\n/** Merges two arrays into one, removing duplicates. */\nfunction mergeArrays(arr1: any[], arr2: any[]) {\n return Array.from(new Set([...(arr1 || []), ...(arr2 || [])]))\n}\n\n/**\n * Shallow merge (specific or all) properties.\n * If some properties both are arrays, then merge them also.\n */\nfunction mergeOptions(rawOptions1: Options | null, rawOptions2: Options | null) {\n const options1: Options = rawOptions1 || {}\n const options2: Options = rawOptions2 || {}\n const result = { ...options1, ...options2 }\n ;(Object.keys(result) as OptionKey[]).forEach(key => {\n if (Array.isArray(options1[key]) && Array.isArray(options2[key])) {\n result[key] = mergeArrays(options1[key] as any[], options2[key] as any[]) as any\n }\n })\n return result\n}\n\nexport default mergeOptions\n","import { and, or } from 'fp-and-or'\nimport identity from 'lodash/identity'\nimport picomatch from 'picomatch'\nimport { parseRange } from 'semver-utils'\nimport { FilterPattern } from '../types/FilterPattern'\nimport { Maybe } from '../types/Maybe'\nimport { VersionSpec } from '../types/VersionSpec'\n\n/**\n * Creates a filter function from a given filter string.\n * Supports strings, wildcards, comma-or-space-delimited lists, and regexes.\n * The filter function *may* throw an exception if the filter pattern is invalid.\n *\n * @param [filterPattern]\n * @returns\n */\nfunction composeFilter(filterPattern: FilterPattern): (name: string, versionSpec?: string) => boolean {\n let predicate: (name: string, versionSpec?: string) => boolean\n\n // no filter\n if (!filterPattern) {\n predicate = identity\n }\n // string\n else if (typeof filterPattern === 'string') {\n // RegExp string\n if (filterPattern[0] === '/' && filterPattern.at(-1) === '/') {\n const regexp = new RegExp(filterPattern.slice(1, -1))\n predicate = (dependencyName: string) => regexp.test(dependencyName)\n }\n // glob string\n else {\n const patterns = filterPattern.split(/[\\s,]+/)\n predicate = (dependencyName: string) => {\n /** Returns true if the pattern matches an unscoped dependency name. */\n const matchUnscoped = (pattern: string) => picomatch(pattern)(dependencyName)\n\n /** Returns true if the pattern matches a scoped dependency name. */\n const matchScoped = (pattern: string) =>\n !pattern.includes('/') &&\n dependencyName.includes('/') &&\n picomatch(pattern)(dependencyName.replace(/\\//g, '_'))\n\n // return true if any of the provided patterns match the dependency name\n return patterns.some(or(matchUnscoped, matchScoped))\n }\n }\n }\n // array\n else if (Array.isArray(filterPattern)) {\n predicate = (dependencyName: string, versionSpec?: string) =>\n filterPattern.some(subpattern => composeFilter(subpattern)(dependencyName, versionSpec))\n }\n // raw RegExp\n else if (filterPattern instanceof RegExp) {\n predicate = (dependencyName: string) => filterPattern.test(dependencyName)\n }\n // function\n else if (typeof filterPattern === 'function') {\n predicate = (dependencyName: string, versionSpec?: string) =>\n filterPattern(dependencyName, parseRange((versionSpec as string) ?? dependencyName))\n } else {\n throw new TypeError('Invalid filter. Must be a RegExp, array, or comma-or-space-delimited list.')\n }\n\n // limit the arity to 1 to avoid passing the value\n return predicate\n}\n\n/**\n * Composes a filter function from filter, reject, filterVersion, and rejectVersion patterns. The filter function *may* throw an exception if the filter pattern is invalid.\n *\n * @param [filter]\n * @param [reject]\n * @param [filterVersion]\n * @param [rejectVersion]\n */\nfunction filterAndReject(\n filter: Maybe<FilterPattern>,\n reject: Maybe<FilterPattern>,\n filterVersion: Maybe<FilterPattern>,\n rejectVersion: Maybe<FilterPattern>,\n) {\n return and(\n // filter dep\n (dependencyName: VersionSpec, version: string) =>\n and(filter ? composeFilter(filter) : true, reject ? (...args) => !composeFilter(reject)(...args) : true)(\n dependencyName,\n version,\n ),\n // filter version\n (dependencyName: VersionSpec, version: string) =>\n and(\n filterVersion ? composeFilter(filterVersion) : true,\n rejectVersion ? (...args) => !composeFilter(rejectVersion)(...args) : true,\n )(version),\n )\n}\n\nexport default filterAndReject\n","import packageManagers from '../package-managers'\nimport { Maybe } from '../types/Maybe'\nimport { Options } from '../types/Options'\nimport { PackageManager } from '../types/PackageManager'\nimport programError from './programError'\n\n/**\n * Resolves the package manager from a string or object. Throws an error if an invalid packageManager is provided.\n *\n * @param packageManagerNameOrObject\n * @param packageManagerNameOrObject.global\n * @param packageManagerNameOrObject.packageManager\n * @returns\n */\nfunction getPackageManager(options: Options, name: Maybe<string>): PackageManager {\n // default to npm\n if (!name || name === 'deno') {\n return packageManagers.npm\n } else if (options.registryType === 'json') {\n return packageManagers.staticRegistry\n }\n\n if (!packageManagers[name]) {\n programError(options, `Invalid package manager: ${name}`)\n }\n\n return packageManagers[name]\n}\n\nexport default getPackageManager\n","import { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport filterAndReject from './filterAndReject'\nimport filterObject from './filterObject'\nimport getPackageManager from './getPackageManager'\nimport programError from './programError'\nimport { isWildPart } from './version-util'\n\n/**\n * @param [options]\n * @param options.cwd\n * @param options.filter\n * @param options.global\n * @param options.packageManager\n * @param options.prefix\n * @param options.reject\n */\nasync function getInstalledPackages(options: Options = {}) {\n const packages = await getPackageManager(options, options.packageManager).list?.({\n cwd: options.cwd,\n prefix: options.prefix,\n global: options.global,\n })\n\n if (!packages) {\n programError(options, 'Unable to retrieve package list')\n }\n\n // filter out undefined packages or those with a wildcard\n const filterFunction = filterAndReject(options.filter, options.reject, options.filterVersion, options.rejectVersion)\n let filteredPackages: Index<VersionSpec> = {}\n try {\n filteredPackages = filterObject(\n packages,\n (dep: VersionSpec, version: Version) => !!version && !isWildPart(version) && filterFunction(dep, version),\n )\n } catch (err: any) {\n programError(options, 'Invalid filter: ' + err.message || err)\n }\n\n return filteredPackages\n}\n\nexport default getInstalledPackages\n","import pMap from 'p-map'\nimport ProgressBar from 'progress'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { Version } from '../types/Version'\nimport getPackageManager from './getPackageManager'\n\ntype CircularData =\n | {\n isCircular: true\n offendingPackage: string\n }\n | {\n isCircular: false\n }\n\n/**\n * Checks if the specified package will create a loop of peer dependencies by traversing all paths to find a cycle\n *\n * If a cycle was found, the offending peer dependency of the specified package is returned\n */\nfunction isCircularPeer(peerDependencies: Index<Index<string>>, packageName: string): CircularData {\n let queue = [[packageName]]\n while (queue.length > 0) {\n const nextQueue: string[][] = []\n for (const path of queue) {\n const parents = Object.keys(peerDependencies[path[0]] ?? {})\n for (const name of parents) {\n if (name === path.at(-1)) {\n return {\n isCircular: true,\n offendingPackage: path[0],\n }\n }\n nextQueue.push([name, ...path])\n }\n }\n queue = nextQueue\n }\n return {\n isCircular: false,\n }\n}\n\n/**\n * Get the latest or greatest versions from the NPM repository based on the version target.\n *\n * @param packageMap An object whose keys are package name and values are version\n * @param [options={}] Options.\n * @returns Promised {packageName: peer dependencies} collection\n */\nasync function getPeerDependenciesFromRegistry(packageMap: Index<Version>, options: Options) {\n const packageManager = getPackageManager(options, options.packageManager)\n if (!packageManager.getPeerDependencies) return {}\n\n const numItems = Object.keys(packageMap).length\n let bar: ProgressBar\n if (!options.json && options.loglevel !== 'silent' && options.loglevel !== 'verbose' && numItems > 0) {\n bar = new ProgressBar('[:bar] :current/:total :percent', { total: numItems, width: 20 })\n bar.render()\n }\n\n const packageEntries = Object.entries(packageMap)\n\n /**\n * Fetches peer dependencies for a package\n * @param pkg - The package name\n * @param version - The package version\n * @returns Promise that resolves to package name and its peer dependencies\n */\n const getPeerDepsForPackage = async ([pkg, version]: [string, Version]): Promise<{\n pkg: string\n dependencies: Index<string>\n }> => {\n let dependencies: Index<string>\n const cached = options.cacher?.getPeers(pkg, version)\n if (cached) {\n dependencies = cached\n } else {\n dependencies = await packageManager.getPeerDependencies!(pkg, version, { cwd: options.cwd })\n options.cacher?.setPeers(pkg, version, dependencies)\n }\n if (bar) {\n bar.tick()\n }\n return { pkg, dependencies }\n }\n\n const results = await pMap(packageEntries, getPeerDepsForPackage, { concurrency: options.concurrency })\n\n const accum: Index<Index<string>> = {}\n for (const { pkg, dependencies } of results) {\n accum[pkg] = dependencies\n const circularData = isCircularPeer(accum, pkg)\n if (circularData.isCircular) {\n delete accum[pkg][circularData.offendingPackage]\n }\n }\n\n await options.cacher?.save()\n options.cacher?.log(true)\n\n return accum\n}\n\nexport default getPeerDependenciesFromRegistry\n","/** Creates an object composed of the picked `object` properties. */\nexport function pick<T extends object, U extends keyof T>(obj: T, props: U[]): Pick<T, U> {\n const newObject = {} as Pick<T, U>\n\n for (const prop of props) {\n newObject[prop] = obj[prop]\n }\n\n return newObject\n}\n\n/**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n */\nexport function pickBy<R, K extends keyof R>(\n object: R | null | undefined,\n predicate: (value: R[K], key: keyof R) => any,\n): Record<K, R[K]> {\n const newObject = {} as Record<K, R[K]>\n\n for (const [key, value] of Object.entries<R[K]>(object ?? {})) {\n const _key = key as K\n if (predicate(value, _key)) {\n newObject[_key] = value\n }\n }\n\n return newObject\n}\n","import { TargetFunction } from './TargetFunction'\n\n/** Valid strings for the --target option. Indicates the desired version to upgrade to. */\nexport const supportedVersionTargets = ['latest', 'newest', 'greatest', 'minor', 'patch', 'semver'] as const\n\n/** A union of supported version target strings. */\nexport type TargetString = (typeof supportedVersionTargets)[number]\n\n/** Upgrading to specific distribution tags can be done by passing @-starting value to --target option. */\nexport type TargetDistTag = `@${string}`\n\n/** The type of the --target option. Specifies the range from which to select the version to upgrade to. */\nexport type Target = TargetString | TargetDistTag | TargetFunction\n","import pMap from 'p-map'\nimport ProgressBar from 'progress'\nimport { parseRange } from 'semver-utils'\nimport packageManagers from '../package-managers'\nimport { GetVersion } from '../types/GetVersion'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { supportedVersionTargets } from '../types/Target'\nimport { VersionResult } from '../types/VersionResult'\nimport { VersionSpec } from '../types/VersionSpec'\nimport getPackageManager from './getPackageManager'\nimport keyValueBy from './keyValueBy'\nimport programError from './programError'\nimport { createNpmAlias, isGitHubUrl, isPre, parseNpmAlias } from './version-util'\n\n/**\n * Get the latest or greatest versions from the NPM repository based on the version target.\n *\n * @param packageMap An object whose keys are package name and values are current versions. May include npm aliases, i.e. { \"package\": \"npm:other-package@1.0.0\" }\n * @param [options={}] Options. Default: { target: 'latest' }.\n * @returns Promised {packageName: version} collection\n */\nasync function queryVersions(packageMap: Index<VersionSpec>, options: Options = {}): Promise<Index<VersionResult>> {\n const { default: chalkDefault, Chalk } = await import('chalk')\n const chalk = options.color ? new Chalk({ level: 1 }) : chalkDefault\n const packageList = Object.keys(packageMap)\n const globalPackageManager = getPackageManager(options, options.packageManager)\n\n let bar: ProgressBar | undefined\n if (!options.json && options.loglevel !== 'silent' && options.loglevel !== 'verbose' && packageList.length > 0) {\n bar = new ProgressBar('[:bar] :current/:total :percent', { total: packageList.length, width: 20 })\n bar.render()\n }\n\n /**\n * Ignore 404 errors from getPackageVersion by having them return `null`\n * instead of rejecting.\n *\n * @param dep\n * @returns\n */\n async function getPackageVersionProtected(dep: VersionSpec): Promise<VersionResult> {\n const npmAlias = parseNpmAlias(packageMap[dep])\n const [name, version] = npmAlias || [dep, packageMap[dep]]\n const targetOption = options.target || 'latest'\n const targetString = typeof targetOption === 'string' ? targetOption : targetOption(name, parseRange(version))\n const [target, distTag] = targetString.startsWith('@')\n ? ['distTag', targetString.slice(1)]\n : [targetString, 'latest']\n\n const cached = options.cacher?.get(name, target)\n if (cached) {\n bar?.tick()\n\n return {\n version: cached,\n }\n }\n\n let versionResult: VersionResult\n const isGitHubDependency = isGitHubUrl(packageMap[dep])\n\n // use gitTags package manager for git urls (for this dependency only)\n const packageManager = isGitHubDependency ? packageManagers.gitTags : globalPackageManager\n const packageManagerName = isGitHubDependency ? 'github urls' : options.packageManager || 'npm'\n\n const getPackageVersion = packageManager[target as keyof typeof packageManager] as GetVersion\n\n if (!getPackageVersion) {\n const packageManagerSupportedVersionTargets = supportedVersionTargets.filter(t => t in packageManager)\n programError(\n options,\n chalk.red(`\\nUnsupported target \"${target}\" using ${packageManagerName}`) +\n `\\nSupported version targets are: ` +\n packageManagerSupportedVersionTargets.join(', ') +\n (!isGitHubDependency ? ', and tags (e.g. @next)' : ''),\n { color: false },\n )\n }\n\n try {\n versionResult = await getPackageVersion(name, version, {\n ...options,\n distTag,\n // upgrade prereleases to newer prereleases by default\n // allow downgrading when explicit tag is used\n pre: options.pre != null ? options.pre : targetString.startsWith('@') || isPre(version),\n retry: options.retry ?? 2,\n }).catch(reason => {\n // This might happen if a (private) package cannot be accessed due to a missing or invalid token.\n return { error: reason?.body?.error || reason.toString() }\n })\n\n versionResult.version =\n !isGitHubDependency && npmAlias && versionResult?.version\n ? createNpmAlias(name, versionResult.version)\n : (versionResult?.version ?? null)\n } catch (err: any) {\n const errorMessage = err ? (err.message || err).toString() : ''\n if (errorMessage.match(/E504|Gateway Timeout/i)) {\n return {\n error: `${errorMessage}. All ${options.retry} retry attempts failed.`,\n }\n } else if (errorMessage.match(/E400|E404|ENOTFOUND|404 Not Found|400 Bad Request/i)) {\n return {\n error: `${errorMessage.replace(/ - Not found$/i, '')}. All ${\n options.retry\n } retry attempts failed. Either your internet connection is down, the registry is inaccessible, the authentication credentials are invalid, or the package does not exist.`,\n }\n } else if (err.code === 'ERR_INVALID_URL') {\n return {\n error: errorMessage || 'Invalid URL',\n }\n } else {\n // print a hint about the --timeout option for network timeout errors\n if (!process.env.NCU_TESTS && /(Response|network) timeout/i.test(errorMessage)) {\n console.error(\n '\\n\\n' +\n chalk.red(\n 'FetchError: Request Timeout. npm-registry-fetch defaults to 30000 (30 seconds). Try setting the --timeout option (in milliseconds) to override this.',\n ) +\n '\\n',\n )\n }\n\n throw err\n }\n }\n\n bar?.tick()\n\n if (versionResult.version) {\n options.cacher?.set(name, target, versionResult.version)\n }\n\n return versionResult\n }\n\n const versionResultList = await pMap(packageList, getPackageVersionProtected, { concurrency: options.concurrency })\n\n // save cacher only after pMap handles cacher.set\n await options.cacher?.save()\n options.cacher?.log()\n\n const versionResultObject = keyValueBy(versionResultList, (versionResult, i) =>\n versionResult.version || versionResult.error\n ? {\n [packageList[i]]: versionResult,\n }\n : null,\n )\n\n return versionResultObject\n}\n\nexport default queryVersions\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n","var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n","var baseFlatten = require('./_baseFlatten');\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","var flatten = require('./flatten'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n","var LodashWrapper = require('./_LodashWrapper'),\n flatRest = require('./_flatRest'),\n getData = require('./_getData'),\n getFuncName = require('./_getFuncName'),\n isArray = require('./isArray'),\n isLaziable = require('./_isLaziable');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_CURRY_FLAG = 8,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256;\n\n/**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\nfunction createFlow(fromRight) {\n return flatRest(function(funcs) {\n var length = funcs.length,\n index = length,\n prereq = LodashWrapper.prototype.thru;\n\n if (fromRight) {\n funcs.reverse();\n }\n while (index--) {\n var func = funcs[index];\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n var wrapper = new LodashWrapper([], true);\n }\n }\n index = wrapper ? index : length;\n while (++index < length) {\n func = funcs[index];\n\n var funcName = getFuncName(func),\n data = funcName == 'wrapper' ? getData(func) : undefined;\n\n if (data && isLaziable(data[0]) &&\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n !data[4].length && data[9] == 1\n ) {\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n } else {\n wrapper = (func.length == 1 && isLaziable(func))\n ? wrapper[funcName]()\n : wrapper.thru(func);\n }\n }\n return function() {\n var args = arguments,\n value = args[0];\n\n if (wrapper && args.length == 1 && isArray(value)) {\n return wrapper.plant(value).value();\n }\n var index = 0,\n result = length ? funcs[index].apply(this, args) : value;\n\n while (++index < length) {\n result = funcs[index].call(this, result);\n }\n return result;\n };\n });\n}\n\nmodule.exports = createFlow;\n","var createFlow = require('./_createFlow');\n\n/**\n * Creates a function that returns the result of invoking the given functions\n * with the `this` binding of the created function, where each successive\n * invocation is supplied the return value of the previous.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flowRight\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var addSquare = _.flow([_.add, square]);\n * addSquare(1, 2);\n * // => 9\n */\nvar flow = createFlow();\n\nmodule.exports = flow;\n","import { Index } from '../types/IndexType'\nimport { sortBy } from './sortBy'\nimport { WILDCARDS } from './version-util'\n\n/**\n *\n * @param dependencies A dependencies collection\n * @returns Returns whether the user prefers ^, ~, .*, or .x\n * (simply counts the greatest number of occurrences) or `null` if\n * given no dependencies.\n */\nfunction getPreferredWildcard(dependencies: Index<string | null>) {\n // if there are no dependencies, return null.\n if (Object.keys(dependencies).length === 0) {\n return null\n }\n\n // group the dependencies by wildcard\n const groups = Object.values(dependencies).reduce<Record<string, (string | null)[]>>((acc, dep) => {\n const wildcard = WILDCARDS.find((wildcard: string) => dep && dep.includes(wildcard))\n if (wildcard !== undefined) {\n acc[wildcard] ||= []\n acc[wildcard].push(dep)\n }\n return acc\n }, {})\n\n const arrOfGroups = Object.entries(groups).map(([wildcard, instances]) => ({ wildcard, instances }))\n\n // reverse sort the groups so that the wildcard with the most appearances is at the head, then return it.\n const sorted = sortBy(arrOfGroups, wildcardObject => -wildcardObject.instances.length)\n\n return sorted.length > 0 ? sorted[0].wildcard : null\n}\n\nexport default getPreferredWildcard\n","import * as semver from 'semver'\nimport semverutils from 'semver-utils'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport { fixPseudoVersion, isComparable, isWildCard, stringify } from './version-util'\n\n/**\n * Check if a version satisfies the latest, and is not beyond the latest). Ignores `v` prefix.\n *\n * @param current\n * @param latest\n * @param downgrade Allow downgrading\n * @returns\n */\nfunction isUpgradeable(current: VersionSpec, latest: Version, { downgrade }: { downgrade?: boolean } = {}): boolean {\n // do not upgrade non-npm version declarations (such as git tags)\n // do not upgrade wildcards\n if (!semver.validRange(current) || isWildCard(current)) {\n return false\n }\n\n // remove the constraint (e.g. ^1.0.1 -> 1.0.1) to allow upgrades that satisfy the range, but are out of date\n const [range] = semverutils.parseRange(current)\n if (!range) {\n throw new Error(\n `\"${current}\" could not be parsed by semver-utils. This is probably a bug. Please file an issue at https://github.com/raineorshine/npm-check-updates.`,\n )\n }\n\n // allow upgrading of pseudo versions such as \"v1\" or \"1.0\"\n const latestNormalized = fixPseudoVersion(latest)\n\n const version = stringify(range)\n const isValidCurrent = Boolean(semver.validRange(version))\n const isValidLatest = Boolean(semver.valid(latestNormalized))\n\n // make sure it is a valid range\n // not upgradeable if the latest version satisfies the current range\n // not upgradeable if the specified version is newer than the latest (indicating a prerelease version)\n // NOTE: When \"<\" is specified with a single digit version, e.g. \"<7\", and has the same major version as the latest, e.g. \"7\", isSatisfied(latest, version) will return true since it ignores the \"<\". In this case, test the original range (current) rather than the versionUtil output (version).\n return (\n isValidCurrent &&\n isValidLatest &&\n // allow an upgrade if two prerelease versions can't be compared by semver\n (!isComparable(latestNormalized, version) ||\n (!semver.satisfies(latestNormalized, range.operator === '<' ? current : version) &&\n (downgrade || !semver.ltr(latestNormalized, version))))\n )\n}\n\nexport default isUpgradeable\n","import flow from 'lodash/flow'\nimport { parseRange } from 'semver-utils'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport filterObject from './filterObject'\nimport getPreferredWildcard from './getPreferredWildcard'\nimport isUpgradeable from './isUpgradeable'\nimport { pickBy } from './pick'\nimport * as versionUtil from './version-util'\n\ninterface UpgradeSpec {\n current: VersionSpec\n currentParsed: VersionSpec | null\n latest: Version\n latestParsed: Version | null\n}\n\n/**\n * Upgrade a dependencies collection based on latest available versions. Supports npm aliases.\n *\n * @param currentDependencies current dependencies collection object\n * @param latestVersions latest available versions collection object\n * @param [options={}]\n * @returns upgraded dependency collection object\n */\nfunction upgradeDependencies(\n currentDependencies: Index<VersionSpec | null>,\n latestVersions: Index<Version>,\n options: Options = {},\n): Index<VersionSpec> {\n const targetOption = options.target || 'latest'\n\n // filter out dependencies with empty values\n currentDependencies = filterObject(currentDependencies, (key, value) => !!value)\n\n // get the preferred wildcard and bind it to upgradeDependencyDeclaration\n const wildcard = getPreferredWildcard(currentDependencies) || versionUtil.DEFAULT_WILDCARD\n\n /** Upgrades a single dependency. */\n const upgradeDep = (current: VersionSpec, latest: Version) =>\n versionUtil.upgradeDependencyDeclaration(current, latest, {\n wildcard,\n removeRange: options.removeRange,\n })\n\n return flow([\n // only include packages for which a latest version was fetched\n (deps: Index<VersionSpec>): Index<VersionSpec> =>\n pickBy(deps, (current, packageName) => packageName in latestVersions),\n // unpack npm alias and git urls\n (deps: Index<VersionSpec>): Index<UpgradeSpec> =>\n Object.entries(deps).reduce<Index<UpgradeSpec>>((acc, [packageName, current]) => {\n const latest = latestVersions[packageName]\n let currentParsed = null\n let latestParsed = null\n\n // parse npm alias\n if (versionUtil.isNpmAlias(current)) {\n currentParsed = versionUtil.parseNpmAlias(current)![1]\n }\n if (versionUtil.isNpmAlias(latest)) {\n latestParsed = versionUtil.parseNpmAlias(latest)![1]\n }\n\n // \"branch\" is also used for tags (refers to everything after the hash character)\n if (versionUtil.isGitHubUrl(current)) {\n const currentTag = versionUtil.getGitHubUrlTag(current)!\n const [currentSemver] = parseRange(currentTag)\n currentParsed = versionUtil.stringify(currentSemver)\n }\n\n if (versionUtil.isGitHubUrl(latest)) {\n const latestTag = versionUtil.getGitHubUrlTag(latest)!\n const [latestSemver] = parseRange(latestTag)\n latestParsed = versionUtil.stringify(latestSemver)\n }\n\n acc[packageName] = { current, currentParsed, latest, latestParsed }\n return acc\n }, {}),\n // pick the packages that are upgradeable\n (deps: Index<UpgradeSpec>): Index<UpgradeSpec> =>\n pickBy(deps, ({ current, currentParsed, latest, latestParsed }: UpgradeSpec, name) => {\n // allow downgrades from prereleases when explicit tag is given\n const downgrade: boolean =\n versionUtil.isPre(current) &&\n (typeof targetOption === 'string' ? targetOption : targetOption(name, parseRange(current))).startsWith('@')\n return isUpgradeable(currentParsed || current, latestParsed || latest, { downgrade })\n }),\n // pack embedded versions: npm aliases and git urls\n (deps: Index<UpgradeSpec>): Index<Version | null> =>\n Object.entries(deps).reduce<Index<Version | null>>(\n (acc, [packageName, { current, currentParsed, latest, latestParsed }]) => {\n const upgraded = upgradeDep(currentParsed || current, latestParsed || latest)\n\n acc[packageName] = versionUtil.isNpmAlias(current)\n ? versionUtil.upgradeNpmAlias(current, upgraded)\n : versionUtil.isGitHubUrl(current)\n ? versionUtil.upgradeGitHubUrl(current, upgraded)\n : upgraded\n return acc\n },\n {},\n ),\n ])(currentDependencies)\n}\n\nexport default upgradeDependencies\n","import { dequal } from 'dequal'\nimport { intersects, satisfies, validRange } from 'semver'\nimport { parse, parseRange } from 'semver-utils'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { VersionResult } from '../types/VersionResult'\nimport { VersionSpec } from '../types/VersionSpec'\nimport getPeerDependenciesFromRegistry from './getPeerDependenciesFromRegistry'\nimport keyValueBy from './keyValueBy'\nimport { pickBy } from './pick'\nimport queryVersions from './queryVersions'\nimport upgradeDependencies from './upgradeDependencies'\n\ntype CheckIfInPeerViolationResult = {\n violated: boolean\n filteredUpgradedDependencies: Index<VersionSpec>\n upgradedPeerDependencies: Index<Index<VersionSpec>>\n}\n\n/**\n * Check if the peer dependencies constraints of each upgraded package, are in violation,\n * thus rendering the upgrade to be invalid\n *\n * @returns Whether there was any violation, and the upgrades that are not in violation\n */\nconst checkIfInPeerViolation = (\n currentDependencies: Index<VersionSpec>,\n filteredUpgradedDependencies: Index<VersionSpec>,\n upgradedPeerDependencies: Index<Index<VersionSpec>>,\n): CheckIfInPeerViolationResult => {\n const upgradedDependencies = { ...currentDependencies, ...filteredUpgradedDependencies }\n const filteredUpgradedDependenciesAfterPeers = pickBy(filteredUpgradedDependencies, (spec, dep) => {\n const peerDeps = upgradedPeerDependencies[dep]\n if (!peerDeps) {\n return true\n }\n return Object.entries(peerDeps).every(\n ([peer, peerSpec]) =>\n upgradedDependencies[peer] === undefined ||\n !validRange(peerSpec) ||\n intersects(upgradedDependencies[peer], peerSpec),\n )\n })\n const violated =\n Object.keys(filteredUpgradedDependencies).length > Object.keys(filteredUpgradedDependenciesAfterPeers).length\n let filteredUpgradedPeerDependencies = upgradedPeerDependencies\n if (violated) {\n filteredUpgradedPeerDependencies = pickBy(\n upgradedPeerDependencies,\n (spec, dep) => filteredUpgradedDependenciesAfterPeers[dep] || !filteredUpgradedDependencies[dep],\n )\n }\n return {\n violated,\n filteredUpgradedDependencies: filteredUpgradedDependenciesAfterPeers,\n upgradedPeerDependencies: filteredUpgradedPeerDependencies,\n }\n}\n\nexport type UpgradePackageDefinitionsResult = [\n upgradedDependencies: Index<VersionSpec>,\n latestVersionResults: Index<VersionResult>,\n newPeerDependencies?: Index<Index<VersionSpec>>,\n]\n\n/**\n * Returns a 3-tuple of upgradedDependencies, their latest versions and the resulting peer dependencies.\n *\n * @param currentDependencies\n * @param options\n * @returns\n */\nexport async function upgradePackageDefinitions(\n currentDependencies: Index<VersionSpec>,\n options: Options,\n): Promise<UpgradePackageDefinitionsResult> {\n const latestVersionResults = await queryVersions(currentDependencies, options)\n\n const latestVersions = keyValueBy(latestVersionResults, (dep, result) =>\n result?.version &&\n (!options.filterResults ||\n options.filterResults(dep, {\n currentVersion: currentDependencies[dep],\n currentVersionSemver: parseRange(currentDependencies[dep]),\n upgradedVersion: result.version,\n upgradedVersionSemver: parse(result.version),\n }))\n ? {\n [dep]: result.version,\n }\n : null,\n )\n\n const upgradedDependencies = upgradeDependencies(currentDependencies, latestVersions, options)\n\n const filteredUpgradedDependencies = pickBy(upgradedDependencies, (v, dep) => {\n return !options.jsonUpgraded || !options.minimal || !satisfies(latestVersions[dep], currentDependencies[dep])\n })\n\n const filteredLatestDependencies = pickBy(latestVersions, (spec, dep) => filteredUpgradedDependencies[dep])\n\n let result: UpgradePackageDefinitionsResult = [\n filteredUpgradedDependencies,\n latestVersionResults,\n options.peerDependencies,\n ]\n\n if (!options.peer || Object.keys(filteredLatestDependencies).length === 0) {\n return result\n }\n\n if (options.peer && Object.keys(filteredLatestDependencies).length > 0) {\n const upgradedPeerDependencies = await getPeerDependenciesFromRegistry(filteredLatestDependencies, options)\n\n let checkPeerViolationResult: CheckIfInPeerViolationResult\n\n if (\n dequal(options.peerDependencies, {\n ...options.peerDependencies,\n ...upgradedPeerDependencies,\n })\n ) {\n checkPeerViolationResult = checkIfInPeerViolation(\n currentDependencies,\n filteredUpgradedDependencies,\n options.peerDependencies!,\n )\n if (!checkPeerViolationResult.violated) {\n return result\n }\n } else {\n checkPeerViolationResult = {\n violated: false,\n filteredUpgradedDependencies,\n upgradedPeerDependencies,\n }\n }\n let runCount = 0\n do {\n if (runCount++ > 6) {\n throw new Error(`Stuck in a while loop. Please report an issue`)\n }\n const peerDependenciesAfterUpgrade = {\n ...options.peerDependencies,\n ...checkPeerViolationResult.upgradedPeerDependencies,\n }\n if (dequal(options.peerDependencies, peerDependenciesAfterUpgrade)) {\n // We can't find anything to do, will not upgrade anything\n return [{}, latestVersionResults, options.peerDependencies]\n }\n const [newUpgradedDependencies, newLatestVersions, newPeerDependencies] = await upgradePackageDefinitions(\n { ...currentDependencies, ...checkPeerViolationResult.filteredUpgradedDependencies },\n { ...options, peerDependencies: peerDependenciesAfterUpgrade, loglevel: 'silent' },\n )\n result = [\n { ...checkPeerViolationResult.filteredUpgradedDependencies, ...newUpgradedDependencies },\n { ...latestVersionResults, ...newLatestVersions },\n newPeerDependencies,\n ]\n checkPeerViolationResult = checkIfInPeerViolation(currentDependencies, result[0], result[2]!)\n } while (checkPeerViolationResult.violated)\n }\n return result\n}\n\nexport default upgradePackageDefinitions\n","import { print, printJson, printSorted, printUpgrades } from '../lib/logging'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport chalk from './chalk'\nimport getInstalledPackages from './getInstalledPackages'\nimport { keyValueBy } from './keyValueBy'\nimport programError from './programError'\nimport upgradePackageDefinitions from './upgradePackageDefinitions'\n\n/** Checks global dependencies for upgrades. */\nasync function runGlobal(options: Options): Promise<Index<string> | void> {\n print(options, '\\nOptions:', 'verbose')\n printSorted(options, options, 'verbose')\n\n print(options, '\\nGetting installed packages', 'verbose')\n let globalPackages: Index<string> = {}\n try {\n const { cli, cwd, filter, filterVersion, global, packageManager, prefix, reject, rejectVersion } = options\n\n globalPackages = await getInstalledPackages({\n cli,\n cwd,\n filter,\n filterVersion,\n global,\n packageManager,\n prefix,\n reject,\n rejectVersion,\n })\n } catch (e: any) {\n programError(options, e.message)\n }\n\n print(options, 'globalPackages:', 'verbose')\n print(options, globalPackages, 'verbose')\n print(options, '', 'verbose')\n print(options, `Fetching ${options.target} versions`, 'verbose')\n\n const [upgraded, latest] = await upgradePackageDefinitions(globalPackages, options)\n print(options, latest, 'verbose')\n\n const time = keyValueBy(latest, (key, result) => (result.time ? { [key]: result.time } : null))\n\n const upgradedPackageNames = Object.keys(upgraded)\n await printUpgrades(options, {\n current: globalPackages,\n upgraded,\n latest,\n total: upgradedPackageNames.length,\n time,\n })\n\n const instruction = upgraded ? upgradedPackageNames.map(pkg => pkg + '@' + upgraded[pkg]).join(' ') : '[package]'\n\n if (options.json) {\n // since global packages do not have a package.json, return the upgraded deps directly (no version range replacements)\n printJson(options, upgraded)\n } else if (instruction.length) {\n const upgradeCmd =\n options.packageManager === 'yarn'\n ? 'yarn global upgrade'\n : options.packageManager === 'pnpm'\n ? 'pnpm -g add'\n : options.packageManager === 'bun'\n ? 'bun add -g'\n : 'npm -g install'\n\n print(\n options,\n '\\n' +\n chalk.cyan('ncu') +\n ' itself cannot upgrade global packages. Run the following to upgrade all global packages: \\n\\n' +\n chalk.cyan(`${upgradeCmd} ` + instruction) +\n '\\n',\n )\n }\n\n // if errorLevel is 2, exit with non-zero error code\n if (options.cli && options.errorLevel === 2 && upgradedPackageNames.length > 0) {\n process.exit(1)\n }\n return upgraded\n}\n\nexport default runGlobal\n","import * as semver from 'semver'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { PackageFile } from '../types/PackageFile'\nimport { VersionSpec } from '../types/VersionSpec'\nimport filterAndReject from './filterAndReject'\nimport filterObject from './filterObject'\nimport { keyValueBy } from './keyValueBy'\nimport programError from './programError'\nimport resolveDepSections from './resolveDepSections'\n\n/** Returns true if spec1 is greater than spec2, ignoring invalid version ranges. */\nconst isGreaterThanSafe = (spec1: VersionSpec, spec2: VersionSpec) =>\n // not a valid range to compare (e.g. github url)\n semver.validRange(spec1) &&\n semver.validRange(spec2) &&\n // otherwise return true if spec2 is smaller than spec1\n semver.gt(semver.minVersion(spec1)!, semver.minVersion(spec2)!)\n\n/** Parses the packageManager field into a { [name]: version } pair. */\nconst parsePackageManager = (pkgData: PackageFile) => {\n if (!pkgData.packageManager) return {}\n const [name, version] = pkgData.packageManager.split('@')\n return { [name]: version }\n}\n/**\n * Get the current dependencies from the package file.\n *\n * @param [pkgData={}] Object with dependencies, devDependencies, peerDependencies, and/or optionalDependencies properties.\n * @param [options={}]\n * @param options.dep\n * @param options.filter\n * @param options.reject\n * @returns Promised {packageName: version} collection\n */\nfunction getCurrentDependencies(pkgData: PackageFile = {}, options: Options = {}) {\n const depSections = resolveDepSections(options.dep)\n\n // get all dependencies from the selected sections\n // if a dependency appears in more than one section, take the lowest version number\n const allDependencies = depSections.reduce((accum, depSection) => {\n return {\n ...accum,\n ...(depSection === 'packageManager'\n ? parsePackageManager(pkgData)\n : filterObject(\n (pkgData[depSection] as Index<string>) || {},\n (dep, spec) => !isGreaterThanSafe(spec, accum[dep]),\n )),\n }\n }, {} as Index<VersionSpec>)\n\n // filter & reject dependencies and versions\n const workspacePackageMap = keyValueBy(options.workspacePackages || [])\n let filteredDependencies: Index<VersionSpec> = {}\n try {\n filteredDependencies = filterObject(\n filterObject(allDependencies, name => !workspacePackageMap[name]),\n filterAndReject(\n options.filter || null,\n options.reject || null,\n options.filterVersion || null,\n options.rejectVersion || null,\n ),\n )\n } catch (err: any) {\n programError(options, 'Invalid filter: ' + err.message || err)\n }\n\n return filteredDependencies\n}\n\nexport default getCurrentDependencies\n","import ProgressBar from 'progress'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport getPackageManager from './getPackageManager'\n\n/**\n * Get the engines.node versions from the NPM repository based on the version target.\n *\n * @param packageMap An object whose keys are package name and values are version\n * @param [options={}] Options.\n * @returns Promised {packageName: engines.node} collection\n */\nasync function getEnginesNodeFromRegistry(packageMap: Index<Version>, options: Options) {\n const packageManager = getPackageManager(options, options.packageManager)\n if (!packageManager.getEngines) return {}\n\n const numItems = Object.keys(packageMap).length\n let bar: ProgressBar\n if (!options.json && options.loglevel !== 'silent' && options.loglevel !== 'verbose' && numItems > 0) {\n bar = new ProgressBar('[:bar] :current/:total :percent', { total: numItems, width: 20 })\n bar.render()\n }\n\n return Object.entries(packageMap).reduce(async (accumPromise, [pkg, version]) => {\n const enginesNode = (await packageManager.getEngines!(pkg, version, options)).node\n if (bar) {\n bar.tick()\n }\n const accum = await accumPromise\n return { ...accum, [pkg]: enginesNode }\n }, Promise.resolve<Index<VersionSpec | undefined>>({}))\n}\n\nexport default getEnginesNodeFromRegistry\n","import { minVersion, satisfies } from 'semver'\nimport { IgnoredUpgradeDueToEnginesNode } from '../types/IgnoredUpgradeDueToEnginesNode'\nimport { Index } from '../types/IndexType'\nimport { Maybe } from '../types/Maybe'\nimport { Options } from '../types/Options'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport getEnginesNodeFromRegistry from './getEnginesNodeFromRegistry'\nimport keyValueBy from './keyValueBy'\nimport upgradePackageDefinitions from './upgradePackageDefinitions'\n\n/** Checks if package.json min node version satisfies given package engine.node spec */\nconst satisfiesNodeEngine = (enginesNode: Maybe<VersionSpec>, optionsEnginesNodeMinVersion: Version) =>\n !enginesNode || satisfies(optionsEnginesNodeMinVersion, enginesNode)\n\n/** Get all upgrades that are ignored due to incompatible engines.node. */\nexport async function getIgnoredUpgradesDueToEnginesNode(\n current: Index<VersionSpec>,\n upgraded: Index<VersionSpec>,\n options: Options = {},\n) {\n if (!options.nodeEngineVersion) return {}\n const optionsEnginesNodeMinVersion = minVersion(options.nodeEngineVersion)?.version\n if (!optionsEnginesNodeMinVersion) return {}\n const [upgradedLatestVersions, latestVersionResults] = await upgradePackageDefinitions(current, {\n ...options,\n enginesNode: false,\n nodeEngineVersion: undefined,\n loglevel: 'silent',\n })\n\n // Use the latest versions since getEnginesNodeFromRegistry requires exact versions.\n // Filter down to only the upgraded latest versions, as there is no point in checking the engines.node for packages that have been filtered out, e.g. by options.minimal or options.filterResults.\n const latestVersions = keyValueBy(latestVersionResults, (dep, result) =>\n upgradedLatestVersions[dep] && result?.version\n ? {\n [dep]: result.version,\n }\n : null,\n )\n const enginesNodes = await getEnginesNodeFromRegistry(latestVersions, options)\n return Object.entries(upgradedLatestVersions)\n .filter(\n ([pkgName, newVersion]) =>\n upgraded[pkgName] !== newVersion && !satisfiesNodeEngine(enginesNodes[pkgName], optionsEnginesNodeMinVersion),\n )\n .reduce(\n (accum, [pkgName, newVersion]) => ({\n ...accum,\n [pkgName]: {\n from: current[pkgName],\n to: newVersion,\n enginesNode: enginesNodes[pkgName]!,\n },\n }),\n {} as Index<IgnoredUpgradeDueToEnginesNode>,\n )\n}\n\nexport default getIgnoredUpgradesDueToEnginesNode\n","import { intersects, minVersion, satisfies, validRange } from 'semver'\nimport { IgnoredUpgradeDueToPeerDeps } from '../types/IgnoredUpgradeDueToPeerDeps'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport getPeerDependenciesFromRegistry from './getPeerDependenciesFromRegistry'\nimport upgradePackageDefinitions from './upgradePackageDefinitions'\n\n/** Get all upgrades that are ignored due to incompatible peer dependencies. */\nexport async function getIgnoredUpgradesDueToPeerDeps(\n current: Index<VersionSpec>,\n upgraded: Index<VersionSpec>,\n upgradedPeerDependencies: Index<Index<Version>>,\n options: Options = {},\n) {\n const upgradedPackagesWithPeerRestriction = {\n ...current,\n ...upgraded,\n }\n const [upgradedLatestVersions, latestVersionResults] = await upgradePackageDefinitions(current, {\n ...options,\n peer: false,\n peerDependencies: undefined,\n loglevel: 'silent',\n })\n const upgradedPeerDependenciesLatest = await getPeerDependenciesFromRegistry(\n Object.fromEntries(\n Object.entries(upgradedLatestVersions).map(([packageName, versionSpec]) => {\n return [\n packageName,\n // git urls and other non-semver versions are ignored.\n // Make sure versionSpec is a valid semver range; otherwise, minVersion will throw.\n validRange(versionSpec) ? (minVersion(versionSpec)?.version ?? versionSpec) : versionSpec,\n ]\n }),\n ),\n options,\n )\n return Object.entries(upgradedLatestVersions)\n .filter(([pkgName, newVersion]) => upgraded[pkgName] !== newVersion)\n .reduce((accum, [pkgName, newVersion]) => {\n let reason = Object.entries(upgradedPeerDependencies)\n .filter(\n ([, peers]) =>\n peers[pkgName] !== undefined &&\n latestVersionResults[pkgName]?.version &&\n !satisfies(latestVersionResults[pkgName].version!, peers[pkgName]),\n )\n .reduce(\n (accumReason, [peerPkg, peers]) => ({\n ...accumReason,\n [peerPkg]: !validRange(peers[pkgName])\n ? `a range that semver does not understand: ${peers[pkgName]}. This range does not work with semver.satisfies or semver.intersects, which npm-check-updates relies on to determine peer dependency compatibility. Either this is a mistake in ${peerPkg}, or it relies on a new syntax that is not compatible with the semver package.`\n : peers[pkgName],\n }),\n {} as Index<string>,\n )\n if (Object.keys(reason).length === 0) {\n const peersOfPkg = upgradedPeerDependenciesLatest?.[pkgName] || {}\n reason = Object.entries(peersOfPkg)\n .filter(\n ([peer, peerSpec]) =>\n upgradedPackagesWithPeerRestriction[peer] &&\n !(!validRange(peerSpec) || intersects(upgradedPackagesWithPeerRestriction[peer], peerSpec)),\n )\n .reduce(\n (accumReason, [peerPkg, peerSpec]) => ({ ...accumReason, [pkgName]: `${peerPkg} ${peerSpec}` }),\n {} as Index<string>,\n )\n }\n return {\n ...accum,\n [pkgName]: {\n from: current[pkgName],\n to: newVersion,\n reason,\n },\n }\n }, {} as Index<IgnoredUpgradeDueToPeerDeps>)\n}\n\nexport default getIgnoredUpgradesDueToPeerDeps\n","import { ParseError, ParseErrorCode, parse, stripComments } from 'jsonc-parser'\n\nconst stdoutColumns = process.stdout.columns || 80\n\n/**\n * Ensures the code line or a hint is always displayed for the code snippet.\n * If the line is empty, it outputs `<empty>`.\n * If the line is larger than a line of the terminal windows, it will cut it off. This also prevents too much\n * garbage data from being displayed.\n *\n * @param line - target line to check.\n * @returns either the hint or the actual line for the code snippet.\n */\nfunction ensureLineDisplay(line: string): string {\n return `${line.length ? line.slice(0, Math.min(line.length, stdoutColumns)) : '<empty>'}\\n`\n}\n\n/**\n * Builds a marker line to point to the position of the found error.\n *\n * @param length - positions to the right of the error line.\n * @returns the marker line.\n */\nfunction getMarker(length: number): string {\n return length > stdoutColumns ? '' : `${' '.repeat(length - 1)}^\\n`\n}\n\n/**\n * Builds a json code snippet to mark and contextualize the found error.\n * This snippet consists of 5 lines with the erroneous line in the middle.\n *\n * @param lines - all lines of the json file.\n * @param errorLine - erroneous line.\n * @param columnNumber - the error position inside the line.\n * @returns the entire code snippet.\n */\nfunction showSnippet(lines: string[], errorLine: number, columnNumber: number): string {\n const len = lines.length\n if (len === 0) return '<empty>'\n if (len === 1) return `${ensureLineDisplay(lines[0])}${getMarker(columnNumber)}`\n // Show an area of lines around the error line for a more detailed snippet.\n const snippetEnd = Math.min(errorLine + 2, len)\n let snippet = ''\n for (let i = Math.max(errorLine - 2, 1); i <= snippetEnd; i++) {\n // Lines in the output are counted starting from one, so choose the previous line\n snippet += ensureLineDisplay(lines[i - 1])\n if (i === errorLine) snippet += getMarker(columnNumber)\n }\n return `${snippet}\\n`\n}\n\n/**\n * Parses a json string, while also handling errors and comments.\n *\n * @param jsonString - target json string.\n * @returns the parsed json object.\n */\nexport default function parseJson(jsonString: string) {\n jsonString = stripComments(jsonString)\n try {\n return JSON.parse(jsonString)\n } catch {\n const errors: ParseError[] = []\n const json = parse(jsonString, errors)\n\n // If no errors were found, just return the parsed json file\n if (errors.length === 0) return json\n let errorString = ''\n const lines = jsonString.split('\\n')\n for (const error of errors) {\n const offset = error.offset\n let lineNumber = 1\n let columnNumber = 1\n let currentOffset = 0\n // Calculate line and column from the offset\n for (const line of lines) {\n if (currentOffset + line.length >= offset) {\n columnNumber = offset - currentOffset + 1\n break\n }\n currentOffset += line.length + 1 // +1 for the newline character\n lineNumber++\n }\n // @ts-expect-error due to --isolatedModules forbidding to implement ambient constant enums.\n errorString += `Error at line ${lineNumber}, column ${columnNumber}: ${ParseErrorCode[error.error]}\\n${showSnippet(lines, lineNumber, columnNumber)}\\n`\n }\n throw new SyntaxError(errorString)\n }\n}\n","import fs from 'fs/promises'\nimport prompts from 'prompts-ncu'\nimport nodeSemver from 'semver'\nimport { DependencyGroup } from '../types/DependencyGroup'\nimport { Index } from '../types/IndexType'\nimport { Maybe } from '../types/Maybe'\nimport { Options } from '../types/Options'\nimport { PackageFile } from '../types/PackageFile'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport chalk from './chalk'\nimport getCurrentDependencies from './getCurrentDependencies'\nimport { getIgnoredUpgradesDueToEnginesNode } from './getIgnoredUpgradesDueToEnginesNode'\nimport getIgnoredUpgradesDueToPeerDeps from './getIgnoredUpgradesDueToPeerDeps'\nimport getPackageManager from './getPackageManager'\nimport getPeerDependenciesFromRegistry from './getPeerDependenciesFromRegistry'\nimport keyValueBy from './keyValueBy'\nimport {\n print,\n printIgnoredUpdatesDueToEnginesNode,\n printIgnoredUpdatesDueToPeerDeps,\n printJson,\n printSorted,\n printUpgrades,\n toDependencyTable,\n} from './logging'\nimport { pick } from './pick'\nimport programError from './programError'\nimport resolveDepSections from './resolveDepSections'\nimport upgradePackageData from './upgradePackageData'\nimport upgradePackageDefinitions from './upgradePackageDefinitions'\nimport parseJson from './utils/parseJson'\nimport { getDependencyGroups } from './version-util'\n\nconst INTERACTIVE_HINT = `\n ↑/↓: Select a package\n Space: Toggle selection\n a: Toggle all\n Enter: Upgrade`\n\n/**\n * Fetches how many options per page can be listed in the dependency table.\n *\n * @param groups - found dependency groups.\n * @returns the amount of options that can be displayed per page.\n */\nfunction getOptionsPerPage(showHint: boolean, groups?: DependencyGroup[]): number {\n const hintRows = showHint ? INTERACTIVE_HINT.split('\\n').length : 0\n return process.stdout.rows ? Math.max(3, process.stdout.rows - hintRows - 1 - (groups?.length ?? 0) * 2) : 50\n}\n\n/**\n * Return a promise which resolves to object storing package owner changed status for each dependency.\n *\n * @param fromVersion current packages version.\n * @param toVersion target packages version.\n * @param options\n * @returns\n */\nexport async function getOwnerPerDependency(fromVersion: Index<Version>, toVersion: Index<Version>, options: Options) {\n const packageManager = getPackageManager(options, options.packageManager)\n return await Object.keys(toVersion).reduce(\n async (accum, dep) => {\n const from = fromVersion[dep] || null\n const to = toVersion[dep] || null\n const ownerChanged = await packageManager.packageAuthorChanged!(dep, from!, to!, options)\n return {\n ...(await accum),\n [dep]: ownerChanged,\n }\n },\n {} as Promise<Index<boolean>>,\n )\n}\n\n/** Prompts the user to choose which upgrades to upgrade. */\nconst chooseUpgrades = async (\n oldDependencies: Index<string>,\n newDependencies: Index<string>,\n pkgFile: Maybe<string>,\n options: Options,\n): Promise<Index<string>> => {\n let chosenDeps: string[] = []\n\n // Hide the interactive hint if the terminal is small. This gives more space for the scrollable list of available updates\n const showHint = process.stdout.rows > 18\n\n // use toDependencyTable to create choices that are properly padded to align vertically\n const table = await toDependencyTable({\n from: oldDependencies,\n to: newDependencies,\n format: options.format,\n pkgFile: pkgFile || undefined,\n })\n\n const formattedLines = keyValueBy(table.toString().split('\\n'), line => {\n const dep = line.trim().split(' ')[0]\n return {\n [dep]: line.trim(),\n }\n })\n\n // do not prompt if there are no dependencies\n // prompts will crash if passed an empty list of choices\n if (Object.keys(newDependencies).length > 0) {\n print(options, '')\n\n if (options.format?.includes('group')) {\n const groups = getDependencyGroups(newDependencies, oldDependencies, options)\n\n const choices = groups.flatMap(({ heading, groupName, packages }) => {\n return [\n { title: '\\n' + heading, heading: true },\n ...Object.keys(packages)\n .sort()\n .map(dep => ({\n title: formattedLines[dep],\n value: dep,\n selected: ['patch', 'minor'].includes(groupName),\n })),\n ]\n })\n\n const response = await prompts({\n choices: [...choices, { title: ' ', heading: true }],\n hint: showHint && INTERACTIVE_HINT,\n instructions: false,\n message: 'Choose which packages to update',\n name: 'value',\n optionsPerPage: getOptionsPerPage(showHint, groups),\n type: 'multiselect',\n onState: (state: any) => {\n if (state.aborted) {\n process.nextTick(() => process.exit(1))\n }\n },\n })\n\n chosenDeps = response.value\n } else {\n const choices = Object.keys(newDependencies)\n .sort()\n .map(dep => ({\n title: formattedLines[dep],\n value: dep,\n selected: true,\n }))\n\n const response = await prompts({\n choices: [...choices, { title: ' ', heading: true }],\n hint: showHint && INTERACTIVE_HINT + '\\n',\n instructions: false,\n message: 'Choose which packages to update',\n name: 'value',\n optionsPerPage: getOptionsPerPage(showHint),\n type: 'multiselect',\n onState: (state: any) => {\n if (state.aborted) {\n process.nextTick(() => process.exit(1))\n }\n },\n })\n\n chosenDeps = response.value\n }\n }\n\n return keyValueBy(chosenDeps, dep => ({ [dep]: newDependencies[dep] }))\n}\n\n/** Checks local project dependencies for upgrades. */\nexport default async function runLocal(\n options: Options,\n pkgData?: Maybe<string>,\n pkgFile?: Maybe<string>,\n): Promise<PackageFile | Index<VersionSpec>> {\n print(options, '\\nOptions:', 'verbose')\n printSorted(options, options, 'verbose')\n\n let pkg: PackageFile\n\n try {\n if (!pkgData) {\n programError(options, 'Missing package data')\n } else {\n pkg = parseJson(pkgData)\n }\n } catch (e: any) {\n programError(\n options,\n `Invalid package file${pkgFile ? `: ${pkgFile}` : ' from stdin'}. Error details:\\n${e.message}`,\n )\n }\n\n const current = getCurrentDependencies(pkg, options)\n\n print(options, '\\nCurrent versions:', 'verbose')\n print(options, current, 'verbose')\n\n if (options.enginesNode) {\n options.nodeEngineVersion = pkg?.engines?.node\n }\n\n if (options.peer) {\n options.peerDependencies = await getPeerDependenciesFromRegistry(\n Object.fromEntries(\n Object.entries(current).map(([packageName, versionSpec]) => {\n return [\n packageName,\n // git urls and other non-semver versions are ignored.\n // Make sure versionSpec is a valid semver range; otherwise, minVersion will throw.\n nodeSemver.validRange(versionSpec)\n ? (nodeSemver.minVersion(versionSpec)?.version ?? versionSpec)\n : versionSpec,\n ]\n }),\n ),\n options,\n )\n }\n\n const [upgraded, latestResults, upgradedPeerDependencies] = await upgradePackageDefinitions(current, options)\n const latest = keyValueBy(latestResults, (key, result) => (result.version ? { [key]: result.version } : null))\n const errors = keyValueBy(latestResults, (key, result) => (result.error ? { [key]: result.error } : null))\n const time = keyValueBy(latestResults, (key, result) => (result.time ? { [key]: result.time } : null))\n\n if (options.peer) {\n print(options, '\\nupgradedPeerDependencies:', 'verbose')\n print(options, upgradedPeerDependencies, 'verbose')\n }\n\n print(\n options,\n `\\n${\n typeof options.target === 'string' ? `${options.target[0].toUpperCase()}${options.target.slice(1)}` : 'Fetched'\n } versions:`,\n 'verbose',\n )\n print(options, latest, 'verbose')\n\n print(options, '\\nUpgraded versions:', 'verbose')\n print(options, upgraded, 'verbose')\n\n // filter out satisfied deps when using --minimal\n const filteredUpgraded = options.minimal\n ? keyValueBy(upgraded, (dep, version) =>\n !nodeSemver.satisfies(latest[dep], current[dep]) ? { [dep]: version } : null,\n )\n : upgraded\n\n const ownersChangedDeps = (options.format || []).includes('ownerChanged')\n ? await getOwnerPerDependency(current, filteredUpgraded, options)\n : undefined\n\n const chosenUpgraded = options.interactive\n ? await chooseUpgrades(current, filteredUpgraded, pkgFile, options)\n : filteredUpgraded\n\n if (!options.json || options.deep) {\n await printUpgrades(\n // in interactive mode, do not group upgrades afterwards since the prompts are grouped\n options.interactive\n ? { ...options, format: (options.format || []).filter(formatType => formatType !== 'group') }\n : options,\n {\n current,\n upgraded: chosenUpgraded,\n total: Object.keys(upgraded).length,\n latest: latestResults,\n ownersChangedDeps,\n pkgFile: pkgFile || undefined,\n errors,\n time,\n },\n )\n if (options.peer) {\n const ignoredUpdates = await getIgnoredUpgradesDueToPeerDeps(\n current,\n upgraded,\n upgradedPeerDependencies!,\n options,\n )\n if (Object.keys(ignoredUpdates).length > 0) {\n printIgnoredUpdatesDueToPeerDeps(options, ignoredUpdates)\n }\n }\n if (options.enginesNode) {\n const ignoredUpdates = await getIgnoredUpgradesDueToEnginesNode(current, upgraded, options)\n if (Object.keys(ignoredUpdates).length > 0) {\n printIgnoredUpdatesDueToEnginesNode(options, ignoredUpdates)\n }\n }\n }\n\n const newPkgData = await upgradePackageData(pkgData, current, chosenUpgraded, options, pkgFile || undefined)\n\n const output: PackageFile | Index<VersionSpec> = options.jsonAll\n ? (parseJson(newPkgData) as PackageFile)\n : options.jsonDeps\n ? pick(parseJson(newPkgData) as PackageFile, resolveDepSections(options.dep))\n : chosenUpgraded\n\n // will be overwritten with the result of fs.writeFile so that the return promise waits for the package file to be written\n let writePromise\n\n if (options.json && !options.deep) {\n printJson(options, output)\n }\n\n if (Object.keys(filteredUpgraded).length > 0) {\n // if there is a package file, write the new package data\n // otherwise, suggest ncu -u\n if (pkgFile) {\n if (options.upgrade) {\n // do not await until the end\n writePromise = fs.writeFile(pkgFile.replace('#catalog', ''), newPkgData)\n } else {\n const ncuCmd = process.env.npm_lifecycle_event === 'npx' ? 'npx npm-check-updates' : 'ncu'\n // quote arguments with spaces\n const argv = process.argv\n .slice(2)\n .map(arg => (arg.includes(' ') ? `\"${arg}\"` : arg))\n .join(' ')\n const ncuOptions = argv ? ' ' + argv : argv\n const upgradeHint = `\\nRun ${chalk.cyan(`${ncuCmd}${ncuOptions} -u`)} to upgrade ${\n options.packageFile || 'package.json'\n }`\n print(options, upgradeHint)\n }\n }\n }\n\n await writePromise\n\n return output\n}\n","import type { RcOptions } from '../types/RcOptions'\n\n/**\n * TypeScript helper for .npmrc config file. Similar to vite and eslint's\n * defineConfig helper\n */\nfunction defineConfig(config: RcOptions) {\n return config\n}\n\nexport default defineConfig\n","import path from 'path'\nimport prompts from 'prompts-ncu'\nimport spawn from 'spawn-please'\nimport pkg from '../package.json'\nimport { cliOptionsMap } from './cli-options'\nimport { cacheClear } from './lib/cache'\nimport chalk, { chalkInit } from './lib/chalk'\nimport determinePackageManager from './lib/determinePackageManager'\nimport doctor from './lib/doctor'\nimport findPackage from './lib/findPackage'\nimport getAllPackages from './lib/getAllPackages'\nimport getNcuRc from './lib/getNcuRc'\nimport initOptions from './lib/initOptions'\nimport { print, printJson } from './lib/logging'\nimport mergeOptions from './lib/mergeOptions'\nimport programError from './lib/programError'\nimport runGlobal from './lib/runGlobal'\nimport runLocal from './lib/runLocal'\nimport { Index } from './types/IndexType'\nimport { Options } from './types/Options'\nimport { PackageFile } from './types/PackageFile'\nimport { PackageInfo } from './types/PackageInfo'\nimport { RunOptions } from './types/RunOptions'\nimport { VersionSpec } from './types/VersionSpec'\n\nexport { default as defineConfig } from './lib/defineConfig'\nexport type { RcOptions } from './types/RcOptions'\n\n// allow prompt injection from environment variable for testing purposes\nif (process.env.INJECT_PROMPTS) {\n prompts.inject(JSON.parse(process.env.INJECT_PROMPTS))\n}\n\n/** Tracks the (first) unhandled rejection so the process can exit with an error code at the end. This allows other errors to be logged before the process exits. */\nlet unhandledRejectionError = false\n\n// Use `node --trace-uncaught ...` to show where the exception was thrown.\n// See: https://nodejs.org/api/process.html#event-unhandledrejection\nprocess.on('unhandledRejection', (reason: string | Error) => {\n // do not rethrow, as there may be other errors to print out\n console.error(reason)\n\n // ensure the process exits with a non-zero code at the end\n unhandledRejectionError = true\n})\n\n/**\n * Volta is a tool for managing JavaScript tooling like Node and npm. Volta has\n * its own system for installing global packages which circumvents npm, so\n * commands like `npm ls -g` do not accurately reflect what is installed.\n *\n * The ability to use `npm ls -g` is tracked in this Volta issue: https://github.com/volta-cli/volta/issues/1012\n */\nconst noVolta = (options: Options) => {\n // The first check is for macOS/Linux and the second check is for Windows\n if (options.global && (!!process.env.VOLTA_HOME || process.env.PATH?.includes('\\\\Volta'))) {\n const message =\n 'It appears you are using Volta. `npm-check-updates --global` ' +\n 'cannot be used with Volta because Volta has its own system for ' +\n 'managing global packages which circumvents npm.\\n\\n' +\n 'If you are still receiving this message after uninstalling Volta, ' +\n 'ensure your PATH does not contain an entry for Volta and your ' +\n 'shell profile does not define VOLTA_HOME. You may need to reboot ' +\n 'for changes to your shell profile to take effect.'\n\n print(options, message, 'error')\n process.exit(1)\n }\n}\n\n/** Returns the package manager that should be used to install packages after running \"ncu -u\". Uses the same detection logic as the main package manager determination. */\nconst getPackageManagerForInstall = async (options: Options, packageFile: string) => {\n // create options context for the package file location\n const installOptions: Options = {\n ...options,\n cwd: options.cwd || path.resolve(packageFile, '..'),\n packageFile,\n }\n\n // when packageManager is set to staticRegistry, we need to infer the package manager from lock files\n if (options.packageManager === 'staticRegistry') {\n return await determinePackageManager({ ...installOptions, packageManager: undefined })\n } else if (options.packageManager && options.packageManager !== 'npm') {\n return options.packageManager\n }\n\n // use the same logic as the main package manager detection\n return await determinePackageManager(installOptions)\n}\n\n/** Returns if analysis contains upgrades */\nconst someUpgraded = (pkgs: string[], analysis: Index<PackageFile> | PackageFile) => {\n // deep mode analysis is of type Index<PackageFile>\n // non-deep mode analysis is of type <PackageFile>, so we normalize it to Index<PackageFile>\n const analysisNormalized: Index<PackageFile> =\n pkgs.length === 1 ? { [pkgs[0]]: analysis as PackageFile } : (analysis as Index<PackageFile>)\n return Object.values(analysisNormalized).some(upgrades => Object.keys(upgrades).length > 0)\n}\n\n/** Either suggest an install command based on the package manager, or in interactive mode, prompt to auto-install. */\nconst install = async (\n pkgs: string[],\n analysis: Index<PackageFile> | PackageFile,\n options: Options,\n): Promise<unknown> => {\n if (options.install === 'never') {\n print(options, '')\n return\n }\n\n // if no packages were upgraded (i.e. all dependencies deselected in interactive mode), then bail without suggesting an install.\n // normalize the analysis for one or many packages\n if (!someUpgraded(pkgs, analysis)) return\n\n // for the purpose of the install hint, just use the package manager used in the first sub-project\n // if auto-installing, the actual package manager in each sub-project will be used\n const packageManager = await getPackageManagerForInstall(options, pkgs[0])\n\n // by default, show an install hint after upgrading\n // this will be disabled in interactive mode if the user chooses to have npm-check-updates execute the install command\n const installHint = `Run ${chalk.cyan(packageManager + ' install')}${\n pkgs.length > 1 && !options.workspace && !options.workspaces ? ' in each project directory' : ''\n } to install new versions`\n\n // Disable interactive mode when running doctor EXCEPT when running tests.\n // Otherwise running doctor mode on npm-check-updates itself will cause interactive.test.ts to fail.\n const isInteractive = options.interactive && (process.env.NCU_TESTS || !process.env.NCU_DOCTOR)\n\n // prompt the user if they want ncu to run \"npm install\"\n let response\n if (isInteractive && options.install === 'prompt') {\n print(options, '')\n response = await prompts({\n type: 'confirm',\n name: 'value',\n message: `${installHint}?`,\n initial: true,\n // allow Ctrl+C to kill the process\n onState: (state: any) => {\n if (state.aborted) {\n process.nextTick(() => process.exit(1))\n }\n },\n })\n }\n\n // auto-install\n if (options.install === 'always' || (isInteractive && response.value)) {\n if (options.install === 'always') {\n print(options, '')\n }\n print(options, 'Installing dependencies...')\n\n // only run npm install once in the root when in workspace mode\n // npm install will install packages for all workspaces\n const isWorkspace = options.workspaces || !!options.workspace?.length\n const pkgsNormalized = isWorkspace ? ['package.json'] : pkgs\n\n for await (const pkgFile of pkgsNormalized) {\n const packageManager = await getPackageManagerForInstall(options, pkgFile)\n // npm, yarn, pnpm use .cmd on Windows, but bun does not\n const cmd = packageManager + (process.platform === 'win32' && packageManager !== 'bun' ? '.cmd' : '')\n const cwd = options.cwd || path.resolve(pkgFile, '..')\n let stdout = ''\n try {\n await spawn(\n cmd,\n ['install'],\n {\n stdout: (data: string) => {\n stdout += data\n },\n stderr: (data: string) => {\n console.error(chalk.red(data.toString()))\n },\n },\n {\n cwd,\n env: {\n ...process.env,\n ...(options.color !== false ? { FORCE_COLOR: true } : null),\n // With spawn, pnpm install will fail with ERR_PNPM_PEER_DEP_ISSUES Unmet peer dependencies.\n // When pnpm install is run directly from the terminal, this error does not occur.\n // When pnpm install is run from a simple spawn script, this error does not occur.\n // The issue only seems to be when pnpm install is executed from npm-check-updates, but it's not clear what configuration or environmental factors are causing this.\n // For now, turn off strict-peer-dependencies on pnpm auto-install.\n // See: https://github.com/raineorshine/npm-check-updates/issues/1191\n ...(packageManager === 'pnpm' ? { npm_config_strict_peer_dependencies: false } : null),\n },\n },\n )\n print(options, stdout)\n print(options, 'Done')\n } catch (err: any) {\n // sometimes packages print errors to stdout instead of stderr\n // if there is nothing on stderr, reject with stdout\n throw new Error(err?.message || err || stdout)\n }\n }\n }\n // show the install hint unless auto-install occurred\n else if (!isInteractive) {\n print(options, `\\n${installHint}.`)\n }\n}\n\n/** Runs the dependency upgrades. Loads the ncurc, finds the package file, and handles --deep. */\nasync function runUpgrades(options: Options, timeout?: NodeJS.Timeout): Promise<Index<string> | PackageFile | void> {\n const [selectedPackageInfos, workspacePackages]: [PackageInfo[], string[]] = await getAllPackages(options)\n\n const packageFilepaths: string[] = selectedPackageInfos.map((packageInfo: PackageInfo) => packageInfo.filepath)\n\n // enable deep mode if --deep, --workspace, --workspaces, or if multiple package files are found\n const isWorkspace = options.workspaces || !!options.workspace?.length\n options.deep = options.deep || isWorkspace || selectedPackageInfos.length > 1\n\n let analysis: Index<PackageFile> | PackageFile | void\n if (options.global) {\n const analysis = await runGlobal(options)\n clearTimeout(timeout)\n return analysis\n } else if (options.deep) {\n analysis = await selectedPackageInfos.reduce(\n async (previousPromise, packageInfo: PackageInfo) => {\n const packages = await previousPromise\n // copy object to prevent share .ncurc options between different packageFile, to prevent unpredictable behavior\n const rcResult = await getNcuRc({ packageFile: packageInfo.filepath, options })\n let rcConfig = rcResult.config\n if (options.mergeConfig && Object.keys(rcConfig).length) {\n // Merge config options.\n rcConfig = mergeOptions(options, rcConfig)\n }\n const pkgOptions: Options = {\n ...options,\n ...rcConfig,\n packageFile: packageInfo.filepath,\n workspacePackages,\n }\n // For virtual catalog files (like package.json#catalog), use the PackageInfo data directly\n // since the virtual file doesn't exist on disk\n let pkgData: string | null\n let pkgFile: string\n let indexKey: string\n\n if (packageInfo.filepath.includes('#') || packageInfo.name === 'catalogs') {\n // Virtual catalog file or catalog package - use PackageInfo data\n pkgData = packageInfo.pkgFile\n pkgFile = packageInfo.filepath\n // For synthetic catalog files, use the actual underlying file path as the index key\n indexKey = packageInfo.filepath.includes('#catalog')\n ? packageInfo.filepath.replace('#catalog', '')\n : packageInfo.filepath\n\n // Print the same message as findPackage for consistency\n const relPathToPackage = path.resolve(indexKey)\n print(pkgOptions, `${pkgOptions.upgrade ? 'Upgrading' : 'Checking'} ${relPathToPackage} catalog dependencies`)\n } else {\n // Regular file - read from disk\n const result = await findPackage(pkgOptions)\n pkgData = result.pkgData\n pkgFile = result.pkgFile || packageInfo.filepath\n indexKey = pkgFile\n }\n return {\n ...packages,\n // index by relative path if cwd was specified\n [pkgOptions.cwd\n ? path\n .relative(path.resolve(pkgOptions.cwd), indexKey)\n // convert Windows path to *nix path for consistency\n .replace(/\\\\/g, '/')\n : indexKey]: await runLocal(pkgOptions, pkgData, pkgFile),\n }\n },\n Promise.resolve({} as Index<PackageFile> | PackageFile),\n )\n if (options.json) {\n printJson(options, analysis)\n }\n } else {\n // mutate packageFile when glob pattern finds only single package\n if (\n selectedPackageInfos.length === 1 &&\n selectedPackageInfos[0].filepath !== (options.packageFile || 'package.json')\n ) {\n options.packageFile = selectedPackageInfos[0].filepath\n }\n const { pkgData, pkgFile } = await findPackage(options)\n analysis = await runLocal(options, pkgData, pkgFile)\n }\n clearTimeout(timeout)\n\n if (options.errorLevel === 2 && someUpgraded(packageFilepaths, analysis)) {\n programError(options, '\\nDependencies not up-to-date')\n }\n\n // suggest install command or auto-install\n if (options.upgrade) {\n // deno does not have an install command\n // The closest equivalent is deno cache, but it is optional.\n // See: https://deno.land/manual@v1.30.3/references/cheatsheet#nodejs---deno-cheatsheet\n if (options.packageManager === 'deno') {\n print(options, '')\n } else {\n await install(packageFilepaths, analysis, options)\n }\n }\n\n return analysis\n}\n\n/** Main entry point.\n *\n * @returns Promise<\n * PackageFile Default returns upgraded package file.\n * | Index<VersionSpec> --jsonUpgraded returns only upgraded dependencies.\n * | void --global upgrade returns void.\n * >\n */\nexport async function run(\n runOptions: RunOptions = {},\n { cli }: { cli?: boolean } = {},\n): Promise<PackageFile | Index<VersionSpec> | void> {\n const options = await initOptions(runOptions, { cli })\n\n // ensure that the process exits with an error code if there was an unhandled rejection\n const bugsUrl = pkg.bugs.url\n process.on('exit', () => {\n if (unhandledRejectionError) {\n programError(options, `Unhandled Rejection! This is a bug and should be reported: ${bugsUrl}`)\n }\n })\n\n // chalk may already have been initialized in cli.ts, but when imported as a module\n // chalkInit is idempotent\n await chalkInit(options.color)\n\n noVolta(options)\n\n print(options, 'Initializing', 'verbose')\n\n if (options.cacheClear) {\n await cacheClear(options)\n }\n\n let timeout: NodeJS.Timeout | undefined\n let timeoutPromise: Promise<void> = new Promise(() => null)\n if (options.timeout) {\n const timeoutMs = typeof options.timeout === 'string' ? Number.parseInt(options.timeout, 10) : options.timeout\n timeoutPromise = new Promise((resolve, reject) => {\n timeout = setTimeout(() => {\n // must catch the error and reject explicitly since we are in a setTimeout\n const error = `Exceeded global timeout of ${timeoutMs}ms`\n reject(error)\n try {\n programError(options, error)\n } catch (e) {\n /* noop */\n }\n }, timeoutMs)\n })\n }\n\n // doctor mode\n if (options.doctor) {\n // execute with -u\n if (options.upgrade) {\n // we have to pass run directly since it would be a circular require if doctor included this file\n return Promise.race([timeoutPromise, doctor(run, options)])\n }\n // print help otherwise\n else {\n const help =\n typeof cliOptionsMap.doctor.help === 'function' ? cliOptionsMap.doctor.help({}) : cliOptionsMap.doctor.help\n print(options, `Usage: ncu --doctor\\n\\n${help}`, 'warn')\n }\n }\n // normal mode\n else {\n return Promise.race([timeoutPromise, runUpgrades(options, timeout)])\n }\n}\n\nexport default run\n\nexport type { RunOptions }\n"],"x_google_ignoreList":[8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,151,152,153,154,155,156,157,158,159,160],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"src.js","names":["keyValueBy","name","chalkInstance: Record<keyof typeof chalkMethods, ChalkMethod>","keyValueBy","fs","path","exists","fs","getPackageJson","getPackageJson","repositoryMetadata: string | PackageFileRepository | null","URL","type","type","entries","entries","type","entries","path","path","VERSION_PART_DELIM: SemVer","semver","version","i","chalk","v","name","latest","table","fs","getPackageVersion","getRepoUrl","chalk","latest","filterObject","cacheData: CacheData","name","version","linesOut: string[]","wrap","supportedVersionTargets","description","extendedHelpDoctor: ExtendedHelp","chalk","table","extendedHelpFilterResults: ExtendedHelp","extendedHelpFormat: ExtendedHelp","extendedHelpInstall: ExtendedHelp","extendedHelpFilterFunction: ExtendedHelp","extendedHelpFilterVersionFunction: ExtendedHelp","extendedHelpRejectFunction: ExtendedHelp","extendedHelpRejectVersionFunction: ExtendedHelp","extendedHelpGroupFunction: ExtendedHelp","extendedHelpTarget: ExtendedHelp","extendedHelpPackageManager: ExtendedHelp","extendedHelpRegistryType: ExtendedHelp","extendedHelpPeer: ExtendedHelp","extendedHelpCooldown: ExtendedHelp","cliOptions: CLIOption[]","v","fs","files","packageManagerLockfileMap: Index<PackageManagerName>","fs","path","os","global","fs","versionUtil.isPre","satisfiesNodeEngine","minVersion","versionNodeEngine: string | undefined","version","predicates: (((o: Partial<Packument>) => boolean) | null)[]","version","nodeSemver","versionUtil.isWildCard","name","pkg.version","partialPackument: Partial<Packument>","err: any","keyTypes: Index<'boolean' | 'number'>","npmConfig","libnpmconfig","parseJson","packageAuthorChanged","packument: Packument","result: Partial<Packument> | undefined","defaultPrefix","cmd","prefix: string | undefined","e: any","greatest: GetVersion","fields: (keyof Packument)[]","versionUtil.compareVersions","getPeerDependencies","getEngines","list","dependencies","distTag: GetVersion","greatest","latest: GetVersion","distTag","newest: GetVersion","satisfiesNodeEngine","filterObject","versionUtil.isPre","v","minor: GetVersion","versionUtil.findGreatestByLevel","patch: GetVersion","semver: GetVersion","defaultPrefix","list","keyValueBy","name","version","fs","npm.normalizeNpmConfig","list","npm.list","keyValueBy","name","version","getVersion","distTag","npm.distTag","greatest","npm.greatest","latest","npm.latest","minor","npm.minor","newest","npm.newest","patch","npm.patch","semver","npm.semver","type","npmConfig","fs","exists","yarnConfigLocal: YarnConfig","yarnConfigUser: YarnConfig","npmConfig: Index<string | boolean>","dependencies: Index<ParsedDep>","name","getVersion","npm.distTag","greatest","npm.greatest","latest","npm.latest","minor","npm.minor","newest","npm.newest","patch","npm.patch","semver","npm.semver","version","npm.parseJson","npm.getEngines","npm.packageAuthorChanged","chalk","pkg: PackageFile","pkgFile: string","fs","depAliases: Index<keyof PackageFile>","name","escapeRegexp","fs","upgradeCatalogData","fs","version","resolveDepSections","name","print","chalk","spawnPnpm","spawnYarn","spawnBun","spawnNpm","packageInfo: PackageInfo","loadPackageInfoFromFile","lockFileName: 'package-lock.json' | 'yarn.lock' | 'pnpm-lock.yaml' | 'bun.lock' | 'bun.lockb'","allDependencies: Index<VersionSpec>","groups: string[]","fs","e","upgrades: Index<VersionSpec>","run","name: string","version: VersionSpec","name","version","upgradePackageData","pkgFile","chalk","fs","pnpmWorkspaceFile: string","fs","catalogDependencies: Index<VersionSpec>","packageData: PackageFile & {\n catalog?: Index<VersionSpec>\n catalogs?: Index<Index<VersionSpec>>\n workspaces?: string[] | { packages: string[]; catalog?: Index<VersionSpec>; catalogs?: Index<Index<VersionSpec>> }\n }","findPackage","workspacePackageGlob: string[]","allWorkspacePackageFilepaths: string[]","allWorkspacePackageInfos: PackageInfo[]","info: PackageInfo","loadPackageInfoFromFile","allWorkspacePackageNames: string[]","catalogPackageFile: PackageFile","useWorkspaces: boolean","packageInfos: PackageInfo[]","catalogPackageInfo: PackageInfo | null","global","config: Options","name","tags: Index<string>","path","name","versionUtil.fixPseudoVersion","versionUtil.compareVersions","latest: GetVersion","versionUtil.isPre","v","versionUtil.upgradeGitHubUrl","greatest: GetVersion","version","versionUtil.findGreatestByLevel","semver: GetVersion","path","content: string","fs","latest: GetVersion","cliOptions","moduleDefaults: Options","options: Options","description","value","exists","target: Target","packageManager","determinePackageManager","resolvedOptions: Options","packageManagers","resolvedOptionsFiltered: Options","keyValueBy","options1: Options","options2: Options","predicate: (name: string, versionSpec?: string) => boolean","identity","version","name","packageManagers","getPackageManager","filterAndReject","filteredPackages: Index<VersionSpec>","filterObject","version","err: any","nextQueue: string[][]","path","name","packageManager","getPackageManager","bar: ProgressBar","version","dependencies: Index<string>","dependencies","accum: Index<Index<string>>","getPackageManager","bar: ProgressBar | undefined","name","version","distTag","versionResult: VersionResult","packageManager","packageManagers","getPackageVersion","err: any","keyValueBy","index","dependencies","wildcard","semver","latest","version","filterObject","getPreferredWildcard","versionUtil.DEFAULT_WILDCARD","versionUtil.upgradeDependencyDeclaration","latest","versionUtil.isNpmAlias","versionUtil.parseNpmAlias","versionUtil.isGitHubUrl","versionUtil.getGitHubUrlTag","versionUtil.stringify","downgrade: boolean","versionUtil.isPre","name","isUpgradeable","versionUtil.upgradeNpmAlias","versionUtil.upgradeGitHubUrl","queryVersions","keyValueBy","result","upgradeDependencies","result: UpgradePackageDefinitionsResult","getPeerDependenciesFromRegistry","checkPeerViolationResult: CheckIfInPeerViolationResult","globalPackages: Index<string>","getInstalledPackages","e: any","latest","upgradePackageDefinitions","chalk","semver","name","version","resolveDepSections","filterObject","filteredDependencies: Index<VersionSpec>","filterAndReject","err: any","packageManager","getPackageManager","bar: ProgressBar","version","upgradePackageDefinitions","getEnginesNodeFromRegistry","keyValueBy","upgradePackageDefinitions","getPeerDependenciesFromRegistry","errors: ParseError[]","parse","packageManager","getPackageManager","chosenDeps: string[]","keyValueBy","pkg: PackageFile","e: any","getCurrentDependencies","getPeerDependenciesFromRegistry","nodeSemver","upgradePackageDefinitions","latest","version","getIgnoredUpgradesDueToPeerDeps","upgradePackageData","output: PackageFile | Index<VersionSpec>","resolveDepSections","fs","chalk","installOptions: Options","determinePackageManager","analysisNormalized: Index<PackageFile>","packageManager","chalk","cmd","err: any","getAllPackages","packageFilepaths: string[]","analysis: Index<PackageFile> | PackageFile | void","analysis","runGlobal","getNcuRc","mergeOptions","pkgOptions: Options","pkgData: string | null","pkgFile: string","indexKey: string","findPackage","initOptions","timeout: NodeJS.Timeout | undefined","timeoutPromise: Promise<void>","doctor"],"sources":["../../package.json","../../src/lib/keyValueBy.ts","../../src/lib/chalk.ts","../../src/lib/filterObject.ts","../../src/lib/exists.ts","../../src/lib/getPackageJson.ts","../../src/lib/getPackageVersion.ts","../../src/lib/getRepoUrl.ts","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isArray.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_freeGlobal.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_root.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Symbol.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getRawTag.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_objectToString.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseGetTag.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isObjectLike.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isSymbol.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isKey.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isObject.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isFunction.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_coreJsData.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isMasked.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_toSource.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsNative.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getValue.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getNative.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_nativeCreate.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashClear.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashDelete.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashGet.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashHas.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashSet.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Hash.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheClear.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/eq.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_assocIndexOf.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheDelete.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheGet.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheHas.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheSet.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_ListCache.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Map.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheClear.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isKeyable.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getMapData.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheDelete.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheGet.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheHas.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheSet.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_MapCache.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/memoize.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_memoizeCapped.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_stringToPath.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayMap.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseToString.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toString.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_castPath.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_toKey.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseGet.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/propertyOf.js","../../src/lib/sortBy.ts","../../src/lib/version-util.ts","../../src/lib/logging.ts","../../src/lib/cache.ts","../../src/lib/wrap.ts","../../src/lib/table.ts","../../src/cli-options.ts","../../src/lib/findLockfile.ts","../../src/lib/determinePackageManager.ts","../../src/lib/figgy-pudding/index.js","../../src/lib/libnpmconfig/index.js","../../src/package-managers/filters.ts","../../src/package-managers/npm.ts","../../src/package-managers/bun.ts","../../src/package-managers/pnpm.ts","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/identity.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_WeakMap.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_metaMap.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseSetData.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseCreate.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createCtor.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createBind.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_apply.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_composeArgs.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_composeArgsRight.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_countHolders.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseLodash.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_LazyWrapper.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/noop.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getData.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_realNames.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getFuncName.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_LodashWrapper.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_copyArray.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_wrapperClone.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/wrapperLodash.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isLaziable.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_shortOut.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_setData.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getWrapDetails.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_insertWrapDetails.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/constant.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_defineProperty.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseSetToString.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_setToString.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayEach.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseFindIndex.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsNaN.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_strictIndexOf.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIndexOf.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayIncludes.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_updateWrapDetails.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_setWrapToString.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createRecurry.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getHolder.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isIndex.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_reorder.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_replaceHolders.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createHybrid.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createCurry.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createPartial.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mergeData.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_trimmedEndIndex.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseTrim.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toNumber.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toFinite.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toInteger.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createWrap.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/curry.js","../../src/package-managers/yarn.ts","../../src/lib/programError.ts","../../src/lib/loadPackageInfoFromFile.ts","../../src/lib/resolveDepSections.ts","../../src/lib/upgradeCatalogData.ts","../../src/lib/upgradePackageData.ts","../../src/lib/doctor.ts","../../src/lib/findPackage.ts","../../src/lib/getAllPackages.ts","../../src/lib/getNcuRc.ts","../../src/package-managers/gitTags.ts","../../src/package-managers/staticRegistry.ts","../../src/package-managers/index.ts","../../src/lib/initOptions.ts","../../src/lib/mergeOptions.ts","../../src/lib/filterAndReject.ts","../../src/lib/getPackageManager.ts","../../src/lib/getInstalledPackages.ts","../../src/lib/getPeerDependenciesFromRegistry.ts","../../src/lib/pick.ts","../../src/types/Target.ts","../../src/lib/queryVersions.ts","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayPush.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsArguments.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isArguments.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isFlattenable.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseFlatten.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/flatten.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_overRest.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_flatRest.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createFlow.js","../../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/flow.js","../../src/lib/getPreferredWildcard.ts","../../src/lib/isUpgradeable.ts","../../src/lib/upgradeDependencies.ts","../../src/lib/upgradePackageDefinitions.ts","../../src/lib/runGlobal.ts","../../src/lib/getCurrentDependencies.ts","../../src/lib/getEnginesNodeFromRegistry.ts","../../src/lib/getIgnoredUpgradesDueToEnginesNode.ts","../../src/lib/getIgnoredUpgradesDueToPeerDeps.ts","../../src/lib/utils/parseJson.ts","../../src/lib/runLocal.ts","../../src/lib/defineConfig.ts","../../src/index.ts"],"sourcesContent":["","import { Index } from '../types/IndexType'\n\ntype KeyValueGenerator<K, V, R> = (key: K, value: V, accum: Index<R>) => Index<R> | null\ntype ArrayKeyValueGenerator<T, R> = KeyValueGenerator<T, number, R>\ntype ObjectKeyValueGenerator<T, R> = KeyValueGenerator<string, T, R>\n\nexport function keyValueBy<T>(arr: T[]): Index<true>\nexport function keyValueBy<T, R>(arr: T[], keyValue: KeyValueGenerator<T, number, R>, initialValue?: Index<R>): Index<R>\nexport function keyValueBy<T, R>(\n obj: Index<T>,\n keyValue: KeyValueGenerator<string, T, R>,\n initialValue?: Index<R>,\n): Index<R>\n\n/** Generates an object from an array or object. Simpler than reduce or _.transform. The KeyValueGenerator passes (key, value) if the input is an object, and (value, i) if it is an array. The return object from each iteration is merged into the accumulated object. Return null to skip an item. */\nexport function keyValueBy<T, R = true>(\n input: T[] | Index<T>,\n // if no keyValue is given, sets all values to true\n keyValue?: ArrayKeyValueGenerator<T, R> | ObjectKeyValueGenerator<T, R>,\n accum: Index<R> = {},\n): Index<R> {\n const isArray = Array.isArray(input)\n keyValue = keyValue || ((key: T): Index<R> => ({ [key as unknown as string]: true as unknown as R }))\n // considerably faster than Array.prototype.reduce\n Object.entries(input || {}).forEach(([key, value], i) => {\n const o = isArray\n ? (keyValue as ArrayKeyValueGenerator<T, R>)(value, i, accum)\n : (keyValue as ObjectKeyValueGenerator<T, R>)(key, value, accum)\n Object.entries(o || {}).forEach(entry => {\n accum[entry[0]] = entry[1]\n })\n })\n\n return accum\n}\n\nexport default keyValueBy\n","/*\n\nThis chalk wrapper allows synchronous chalk.COLOR(...) syntax with special support for:\n\n1) dynamic import as pure ESM module\n2) force color on all instances\n3) disable color on all instances\n\nCall await chalkInit(color) at the beginning of execution and the chalk instance will be available everywhere.\n\nIt is a hacky solution, but it is the easiest way to import and pass the color option to all chalk instances without brutalizing the syntax.\n\n*/\nimport keyValueBy from './keyValueBy'\n\ntype ChalkMethod = ((s: any) => string) & { bold: (s: any) => string }\n\nconst chalkMethods = {\n blue: true,\n bold: true,\n cyan: true,\n gray: true,\n green: true,\n magenta: true,\n red: true,\n yellow: true,\n}\n\n// A chalk instance that passes strings through as-is, without color. Used with color: null. */\nconst chalkNoop = keyValueBy(chalkMethods, name => ({ [name]: (s: any) => s.toString() })) as Record<\n keyof typeof chalkMethods,\n ChalkMethod\n>\n\n// a global Promise of a chalk instance that can optionally force or ignore color\nlet chalkInstance: Record<keyof typeof chalkMethods, ChalkMethod>\n\n/** Initializes the global chalk instance with an optional flag for forced color. Idempotent. */\nexport const chalkInit = async (color?: boolean | null) => {\n const chalkModule = await import('chalk')\n const { default: chalkDefault, Chalk } = chalkModule\n chalkInstance = color === true ? new Chalk({ level: 1 }) : color === null ? chalkNoop : chalkDefault\n}\n\n/** Asserts that chalk has been imported. */\nconst assertChalk = () => {\n if (!chalkInstance) {\n throw new Error(\n `Chalk has not been imported yet. Chalk is a dynamic import and requires that you await { chalkInit } from './lib/chalk'.`,\n )\n }\n}\n\n// generate an async method for each chalk method that calls a chalk instance with global.color for forced color\nconst chalkGlobal = keyValueBy(chalkMethods, name => {\n /** Chained bold method. */\n const bold = (s: any) => {\n assertChalk()\n return chalkInstance[name as keyof typeof chalkInstance].bold(s)\n }\n /** Chalk method. */\n const method = (s: any) => {\n assertChalk()\n return chalkInstance[name as keyof typeof chalkInstance](s)\n }\n method.bold = bold\n return {\n [name]: method,\n }\n}) as Record<keyof typeof chalkMethods, ChalkMethod>\n\nexport default chalkGlobal\n","import { Index } from '../types/IndexType'\nimport keyValueBy from './keyValueBy'\n\n/** Filters an object by a predicate. Does not catch exceptions thrown by the predicate. */\nconst filterObject = <T>(obj: Index<T>, predicate: (key: string, value: T) => boolean) =>\n keyValueBy(obj, (key, value) => (predicate(key, value) ? { [key]: value } : null))\n\nexport default filterObject\n","import fs from 'fs/promises'\n\n/** Returns true if a file exists. */\nconst exists = (path: string) =>\n fs.stat(path).then(\n () => true,\n () => false,\n )\n\nexport default exists\n","import fs from 'fs/promises'\nimport path from 'path'\nimport { PackageFile } from '../types/PackageFile'\nimport exists from './exists'\n\n/** Gets the package.json contents of an installed package. */\nasync function getPackageJson(\n packageName: string,\n {\n pkgFile,\n }: {\n /** Specify the package file location to add to the node_modules search paths. Needed in workspaces/deep mode. */\n pkgFile?: string\n } = {},\n): Promise<PackageFile | null> {\n const requirePaths = require.resolve.paths(packageName) || []\n const pkgFileNodeModules = pkgFile ? [path.join(path.dirname(pkgFile), 'node_modules')] : []\n const localNodeModules = [path.join(process.cwd(), 'node_modules')]\n const nodeModulePaths = [...pkgFileNodeModules, ...localNodeModules, ...requirePaths]\n\n for (const basePath of nodeModulePaths) {\n const packageJsonPath = path.join(basePath, packageName, 'package.json')\n if (await exists(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'))\n return packageJson\n } catch (e) {}\n }\n }\n\n return null\n}\n\nexport default getPackageJson\n","import { PackageFile } from '../types/PackageFile'\nimport getPackageJson from './getPackageJson'\n\n/**\n * @param packageName A package name as listed in package.json's dependencies list\n * @param packageJson Optional param to specify an object representation of a package.json file instead of loading from node_modules\n * @returns The package version or null if a version could not be determined\n */\nasync function getPackageVersion(\n packageName: string,\n packageJson?: PackageFile,\n {\n pkgFile,\n }: {\n /** Specify the package file location to add to the node_modules search paths. Needed in workspaces/deep mode. */\n pkgFile?: string\n } = {},\n) {\n if (packageJson) {\n return packageJson.version\n }\n\n const loadedPackageJson = await getPackageJson(packageName, { pkgFile })\n return loadedPackageJson?.version ?? null\n}\n\nexport default getPackageVersion\n","import hostedGitInfo from 'hosted-git-info'\nimport { URL } from 'url'\nimport { PackageFile } from '../types/PackageFile'\nimport { PackageFileRepository } from '../types/PackageFileRepository'\nimport getPackageJson from './getPackageJson'\n\n/** Gets the repo url of an installed package. */\nasync function getPackageRepo(\n packageName: string,\n {\n pkgFile,\n }: {\n /** Specify the package file location to add to the node_modules search paths. Needed in workspaces/deep mode. */\n pkgFile?: string\n } = {},\n): Promise<string | PackageFileRepository | null> {\n const packageJson = await getPackageJson(packageName, { pkgFile })\n return packageJson?.repository ?? null\n}\n\n/**\n * @param packageName A package name as listed in package.json's dependencies list\n * @param packageJson Optional param to specify an object representation of a package.json file instead of loading from node_modules\n * @returns A valid url to the root of the package's source or null if a url could not be determined\n */\nasync function getRepoUrl(\n packageName: string,\n packageJson?: PackageFile,\n {\n pkgFile,\n }: {\n /** See: getPackageRepo pkgFile param. */\n pkgFile?: string\n } = {},\n) {\n const repositoryMetadata: string | PackageFileRepository | null = !packageJson\n ? await getPackageRepo(packageName, { pkgFile })\n : packageJson.repository\n ? packageJson.repository\n : null\n\n if (!repositoryMetadata) return null\n\n let gitURL\n let directory = ''\n\n // It may be a string instead of an object\n if (typeof repositoryMetadata === 'string') {\n gitURL = repositoryMetadata\n try {\n // It may already be a valid Repo URL\n const url = new URL(gitURL)\n // Some packages put a full URL in this field although it's not spec compliant. Let's detect that and use it if present\n if (url.protocol === 'https:' || url.protocol === 'http:') {\n return gitURL\n }\n } catch (e) {}\n } else if (typeof repositoryMetadata.url === 'string') {\n gitURL = repositoryMetadata.url\n if (typeof repositoryMetadata.directory === 'string') {\n directory = repositoryMetadata.directory\n }\n }\n\n if (typeof gitURL === 'string' && typeof directory === 'string') {\n const hostedGitURL = hostedGitInfo.fromUrl(gitURL)?.browse(directory)\n if (hostedGitURL !== undefined) {\n // Remove the default branch path (/tree/HEAD) from a git url\n return hostedGitURL.replace(/\\/$/, '').replace(/\\/tree\\/HEAD$/, '')\n }\n return gitURL\n }\n return null\n}\n\nexport default getRepoUrl\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var baseGet = require('./_baseGet');\n\n/**\n * The opposite of `_.property`; this method creates a function that returns\n * the value at a given path of `object`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var array = [0, 1, 2],\n * object = { 'a': array, 'b': array, 'c': array };\n *\n * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n * // => [2, 0]\n *\n * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n * // => [2, 0]\n */\nfunction propertyOf(object) {\n return function(path) {\n return object == null ? undefined : baseGet(object, path);\n };\n}\n\nmodule.exports = propertyOf;\n","/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection through each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n */\nexport function sortBy<T>(collection: T[] | null | undefined, selector: (item: T) => any): T[] {\n if (!collection) return []\n return collection\n .map(item => ({ item, key: selector(item) }))\n .sort((a, b) => (a.key > b.key ? 1 : a.key < b.key ? -1 : 0))\n .map(({ item }) => item)\n}\n","import propertyOf from 'lodash/propertyOf'\nimport parseGitHubUrl from 'parse-github-url'\nimport semver from 'semver'\nimport semverutils, { SemVer, parse, parseRange } from 'semver-utils'\nimport util from 'util'\nimport { DependencyGroup } from '../types/DependencyGroup'\nimport { Index } from '../types/IndexType'\nimport { Maybe } from '../types/Maybe'\nimport { Options } from '../types/Options'\nimport { UpgradeGroup } from '../types/UpgradeGroup'\nimport { VersionLevel } from '../types/VersionLevel'\nimport chalk from './chalk'\nimport { keyValueBy } from './keyValueBy'\nimport { sortBy } from './sortBy'\n\ntype VersionPart = keyof SemVer\n\nconst VERSION_BASE_PARTS = ['major', 'minor', 'patch'] as VersionPart[]\nconst VERSION_ADDED_PARTS = ['release', 'build'] as VersionPart[]\nconst VERSION_PARTS = [...VERSION_BASE_PARTS, ...VERSION_ADDED_PARTS] as VersionPart[]\nconst VERSION_PART_DELIM: SemVer = {\n major: '',\n minor: '.',\n patch: '.',\n release: '-',\n build: '+',\n}\nexport const DEFAULT_WILDCARD = '^'\nexport const WILDCARDS = ['^', '~', '.*', '.x']\nconst WILDCARDS_PURE = ['^', '~', '^*', '*', 'x', 'x.x', 'x.x.x']\nconst WILDCARD_PURE_REGEX = new RegExp(`^(${WILDCARDS_PURE.join('|').replace(/\\^/g, '\\\\^').replace(/\\*/g, '\\\\*')})$`)\n\n/** Matches an npm alias version declaration. */\nconst NPM_ALIAS_REGEX = /^npm:(.*)@(.*)/\n\ninterface UpgradeOptions {\n wildcard?: string\n removeRange?: boolean\n}\n\n/**\n * @param version\n * @returns The number of parts in the version\n */\nexport function numParts(version: string) {\n const [semver] = semverutils.parseRange(version)\n\n if (!semver) {\n throw new Error(\n util.format(\n 'semverutils.parseRange returned null when trying to parse \"%s\". This is probably a problem with the \"semver-utils\" dependency. Please report an issue at https://github.com/raineorshine/npm-check-updates/issues.',\n version,\n ),\n )\n }\n\n return VERSION_PARTS.reduce((count, part) => (semver[part] ? count + 1 : count), 0)\n}\n\n/**\n * Increases or decreases precision by the given amount, e.g. major+1 -> minor\n *\n * @param precision\n * @param n\n * @returns\n */\nexport function precisionAdd(precision: VersionPart, n: number) {\n if (n === 0) return precision\n\n const index = VERSION_BASE_PARTS.includes(precision)\n ? VERSION_BASE_PARTS.indexOf(precision) + n\n : VERSION_ADDED_PARTS.includes(precision)\n ? VERSION_BASE_PARTS.length + n\n : null\n\n if (index === null || !VERSION_PARTS[index]) {\n throw new Error(`Invalid precision: ${precision}`)\n }\n\n return VERSION_PARTS[index]\n}\n\n/**\n * Joins the major, minor, patch, release, and build parts (controlled by an\n * optional precision arg) of a semver object into a dot-delimited string.\n *\n * @param semver\n * @param [precision]\n * @returns\n */\nexport function stringify(semver: SemVer, precision?: VersionPart) {\n // get a list of the parts up until (and including) the given precision\n // or all of them, if no precision is specified\n const parts = precision ? VERSION_PARTS.slice(0, VERSION_PARTS.indexOf(precision) + 1) : VERSION_PARTS\n\n // pair each part with its delimiter and join together\n return parts\n .filter(part => (precision && VERSION_BASE_PARTS.includes(precision)) || semver[part])\n .map(part => VERSION_PART_DELIM[part] + (semver[part] || '0'))\n .join('')\n}\n\n/**\n * Gets how precise this version number is (major, minor, patch, release, or build)\n *\n * @param version\n * @returns\n */\nexport function getPrecision(version: string) {\n const [semver] = semverutils.parseRange(version)\n // expects VERSION_PARTS to be in correct order\n return VERSION_PARTS.slice().reverse().find(propertyOf(semver))\n}\n\n/**\n * Sets the precision of a (loose) semver to the specified level: major, minor, etc.\n *\n * @param version\n * @param [precision]\n * @returns\n */\nexport function setPrecision(version: string, precision: VersionPart) {\n const [semver] = semverutils.parseRange(version)\n return stringify(semver, precision)\n}\n\n/**\n * Adds a given wildcard (^,~,.*,.x) to a version number. Adds ^ and ~ to the\n * beginning. Replaces everything after the major version number with .* or .x\n *\n * @param version\n * @param wildcard\n * @returns\n */\nexport function addWildCard(version: string, wildcard: string) {\n return wildcard === '^' || wildcard === '~' ? wildcard + version : setPrecision(version, 'major') + wildcard\n}\n\n/**\n * Returns true if the given string is one of the wild cards.\n *\n * @param version\n * @returns\n */\nexport function isWildCard(version: string) {\n return WILDCARD_PURE_REGEX.test(version)\n}\n\n/**\n * Returns true if the given digit is a wildcard for a part of a version.\n *\n * @param versionPart\n * @returns\n */\nexport function isWildPart(versionPartValue: Maybe<string>) {\n return versionPartValue === '*' || versionPartValue === 'x'\n}\n\n/**\n * Determines the part of a version string that has changed when comparing two versions. Assumes that the two version strings are in the same format. Returns null if no parts have changed.\n *\n * @param from\n * @param to\n */\nexport function partChanged(from: string, to: string): UpgradeGroup {\n if (from === to) return 'none'\n\n // separate out leading ^ or ~\n if (/^[~^]/.test(to) && to[0] === from[0]) {\n to = to.slice(1)\n from = from.slice(1)\n }\n\n // split into parts\n const partsTo = to.split('.')\n const partsFrom = from.split('.')\n\n let i = partsTo.findIndex((partto, i) => partto !== partsFrom[i])\n i = i >= 0 ? i : partsTo.length\n\n // major = red (or any change before 1.0.0)\n // minor = cyan\n // patch = green\n return partsTo[0] === '0' ? 'majorVersionZero' : i === 0 ? 'major' : i === 1 ? 'minor' : 'patch'\n}\n\n/**\n * Returns a list of group heading and a map of package names and versions.\n * Used with --format group and takes into account the custom --group function.\n */\nexport function getDependencyGroups(\n newDependencies: Index<string>,\n oldDependencies: Index<string>,\n options: Options,\n): DependencyGroup[] {\n const groups = keyValueBy<string, Index<string>>(newDependencies, (dep, to, accum) => {\n const from = oldDependencies[dep]\n const defaultGroup = partChanged(from, to)\n const userDefinedUpgradeGroup =\n options.groupFunction?.(dep, defaultGroup, parseRange(from), parseRange(to), parse(newDependencies[dep])) ??\n defaultGroup\n if (userDefinedUpgradeGroup === 'none') {\n return accum\n }\n return {\n ...accum,\n [userDefinedUpgradeGroup]: {\n ...accum[userDefinedUpgradeGroup],\n [dep]: to,\n },\n }\n })\n\n // get the text for the default group headings\n const headings = {\n patch: chalk.green(chalk.bold('Patch') + ' Backwards-compatible bug fixes'),\n minor: chalk.cyan(chalk.bold('Minor') + ' Backwards-compatible features'),\n major: chalk.red(chalk.bold('Major') + ' Potentially breaking API changes'),\n majorVersionZero: chalk.magenta(chalk.bold('Major version zero') + ' Anything may change'),\n }\n\n const groupOrder = Array.from(new Set(['patch', 'minor', 'major', 'majorVersionZero', ...Object.keys(groups).sort()]))\n\n return groupOrder\n .filter(groupName => {\n return groupName in groups\n })\n .map(groupName => {\n return {\n groupName,\n heading: groupName in headings ? headings[groupName as keyof typeof headings] : groupName,\n packages: groups[groupName],\n }\n })\n}\n\n/**\n * Colorize the parts of a version string (to) that are different than\n * another (from). Assumes that the two version strings are in the same format.\n *\n * @param from\n * @param to\n * @returns\n */\nexport function colorizeDiff(from: string, to: string) {\n let leadingWildcard = ''\n\n // separate out leading ^ or ~\n if (/^[~^]/.test(to) && to[0] === from[0]) {\n leadingWildcard = to[0]\n to = to.slice(1)\n from = from.slice(1)\n }\n\n // split into parts\n const partsToColor = to.split('.')\n const partsToCompare = from.split('.')\n\n let i = partsToColor.findIndex((part, i) => part !== partsToCompare[i])\n i = i >= 0 ? i : partsToColor.length\n\n // major = red (or any change before 1.0.0)\n // minor = cyan\n // patch = green\n const color = i === 0 || partsToColor[0] === '0' ? 'red' : i === 1 ? 'cyan' : 'green'\n\n // if we are colorizing only part of the word, add a dot in the middle\n const middot = i > 0 && i < partsToColor.length ? '.' : ''\n\n return leadingWildcard + partsToColor.slice(0, i).join('.') + middot + chalk[color](partsToColor.slice(i).join('.'))\n}\n\n/**\n * Extract prerelease tag, omitting build number\n * Example: 1.0.0-next.alpha.2 -> next.alpha\n *\n * @param version\n */\nconst getPre = (version: string) => {\n const pre = semver.prerelease(version)\n return pre && pre.slice(0, -1).join('.')\n}\n\n/**\n * Check if it is allowed to compare two versions based on their prerelease tag\n *\n * SemVer both states that different prerelease versions can't be compared\n * and at the same time compares them as part of the version via strcmp\n *\n * @param a\n * @param b\n * @returns True if two versions can be compared by the means of SemVer\n */\nexport function isComparable(a: string, b: string) {\n const preA = getPre(a)\n const preB = getPre(b)\n return typeof preA !== 'string' || typeof preB !== 'string' || preA === preB\n}\n\n/** Comparator used to sort semver versions */\nexport function compareVersions(a: string, b: string) {\n const isValid = semver.valid(a) && semver.valid(b)\n const isGreater = isValid ? semver.gt(a, b) : a > b\n return isGreater ? 1 : a === b ? 0 : -1\n}\n\n/**\n * Finds the greatest version at the given level (minor|patch).\n *\n * @param versions Unsorted array of all available versions\n * @param current Current version or range\n * @param level major|minor\n * @returns String representation of the suggested version.\n */\nexport function findGreatestByLevel(versions: string[], current: string, level: VersionLevel): string | null {\n if (!semver.validRange(current)) {\n return null\n }\n\n const cur = semver.minVersion(current)\n const versionsSorted = [...versions].sort(compareVersions).filter(v => {\n const parsed = semver.parse(v)\n return (\n parsed &&\n (level === 'major' || parsed.major === cur?.major) &&\n (level === 'major' || level === 'minor' || parsed.minor === cur?.minor)\n )\n })\n\n return versionsSorted.at(-1) || null\n}\n\n/**\n * @param version\n * @returns True if the version is any kind of prerelease: alpha, beta, rc, pre\n */\nexport function isPre(version: string) {\n return getPrecision(version) === 'release'\n}\n\n/** Checks if a string is a simple version in the format \"v1\". */\nconst isMissingMinorAndPatch = (s: string) => /^[vV]?\\d+$/.test(s)\n\n/** Checks if a version string is missing its match component, e.g. \"1.0\". */\nconst isMissingPatch = (s: string) => /^[vV]?\\d+\\.\\d+$/.test(s)\n\n/** Removes a leading 'v' or 'V' from a pseudo version.. */\nconst fixLeadingV = (s: string) => s.replace(/^[vV]/, '')\n\n/** Converts a pseudo version that is missing its minor and patch components into a valid semver version. NOOP for valid semver versions. */\nconst fixMissingMinorAndPatch = (s: string) => (isMissingMinorAndPatch(s) ? s + '.0.0' : s)\n\n/** Converts a pseudo version that is missing its patch component into a valid semver version. NOOP for valid semver versions. */\nconst fixMissingPatch = (s: string) => (isMissingPatch(s) ? s + '.0' : s)\n\n/** Converts a pseudo version into a valid semver version. NOOP for valid semver versions. */\nexport const fixPseudoVersion = (s: string) => fixMissingPatch(fixMissingMinorAndPatch(fixLeadingV(s)))\n\n/**\n * Returns 'v' if the string starts with a v; otherwise, returns empty string.\n *\n * @param str\n * @returns\n */\nexport function v(str: Maybe<string>) {\n return str && (str[0] === 'v' || str[1] === 'v') ? 'v' : ''\n}\n\n/**\n * Constructs an npm alias from the name and version of the actual package.\n *\n * @param name Name of the actual package.\n * @param version Version of the actual package.\n * @returns \"npm:package@x.y.z\"\n * @example createNpmAlias('chalk', '2.0.0') -> 'npm:chalk@2.0.0'\n */\nexport const createNpmAlias = (name: string, version: string) => `npm:${name}@${version}`\n\n/**\n * Parses an npm alias into a [name, version] 2-tuple.\n *\n * @returns [name, version] or null if the input is not an npm alias\n * @example 'npm:chalk@1.0.0' -> ['chalk', '1.0.0']\n */\nexport const parseNpmAlias = (alias: string) => {\n const match = alias && alias.match && alias.match(NPM_ALIAS_REGEX)\n return match && match.slice(1)\n}\n\n/**\n * Returns true if a version declaration is an npm alias.\n */\nexport const isNpmAlias = (declaration: string) => declaration && !!declaration.match(NPM_ALIAS_REGEX)\n\n/**\n * Replaces the version number embedded in an npm alias.\n */\nexport const upgradeNpmAlias = (declaration: string, upgraded: string) => {\n const npmAlias = parseNpmAlias(declaration)\n if (!npmAlias) return null\n return createNpmAlias(npmAlias[0], upgraded)\n}\n\n/**\n * Returns true if a version declaration is a GitHub URL with a valid semver version.\n */\nexport const isGitHubUrl = (declaration: string | null) => {\n if (!declaration) return false\n let parsed = null\n try {\n parsed = parseGitHubUrl(declaration)\n } catch {\n // Strings like `npm:postman-request@2.88.1-postman.33` can throw errors instead of simply returning null\n // In node 18.17+ due to url.parse regression: https://github.com/nodejs/node/issues/49330\n // So if this throws, we can assume it's not a valid GitHub URL.\n }\n if (!parsed || !parsed.branch) return false\n\n const version = decodeURIComponent(parsed.branch).replace(/^semver:/, '')\n return !!semver.validRange(version)\n}\n\n/**\n * Returns the embedded tag in a GitHub URL.\n */\nexport const getGitHubUrlTag = (declaration: string | null) => {\n if (!declaration) return null\n const parsed = parseGitHubUrl(declaration)\n if (!parsed || !parsed.branch) return null\n const version = decodeURIComponent(parsed.branch).replace(/^semver:/, '')\n return parsed && parsed.branch && semver.validRange(version) ? version : null\n}\n\n/**\n * Upgrade an existing dependency declaration to satisfy the latest version.\n *\n * @param declaration Current version declaration (e.g. \"1.2.x\")\n * @param latestVersion Latest version (e.g \"1.3.2\")\n * @param [options={}]\n * @returns The upgraded dependency declaration (e.g. \"1.3.x\")\n */\nexport function upgradeDependencyDeclaration(\n declaration: string,\n latestVersion: string | null,\n options: UpgradeOptions = {},\n) {\n options.wildcard = options.wildcard || DEFAULT_WILDCARD\n\n if (!latestVersion) {\n return declaration\n }\n\n // parse the latestVersion\n // return original declaration if latestSemver is invalid\n const [latestSemver] = semverutils.parseRange(latestVersion)\n if (!latestSemver) {\n return declaration\n }\n\n // return global wildcards immediately\n if (options.removeRange) {\n return latestVersion\n } else if (isWildCard(declaration)) {\n return declaration\n }\n\n // parse the declaration\n // if multiple ranges, use the semver with the least number of parts\n const parsedRange = sortBy(\n semverutils.parseRange(declaration).filter(range => range.operator !== '||' && range.operator !== '-'),\n s => numParts(stringify(s)),\n ) as SemVer[]\n\n const [declaredSemver] = parsedRange\n\n /**\n * Chooses version parts between the declared version and the latest.\n * Base parts (major, minor, patch) are only included if they are in the original declaration.\n * Added parts (release, build) are always included. They are only present if we are checking --greatest versions\n * anyway.\n */\n function chooseVersion(part: VersionPart): string | null {\n return (\n (isWildPart(declaredSemver[part])\n ? declaredSemver[part]\n : VERSION_BASE_PARTS.includes(part) && declaredSemver[part]\n ? latestSemver[part]\n : VERSION_ADDED_PARTS.includes(part)\n ? latestSemver[part]\n : null) || null\n )\n }\n\n // create a new semver object with major, minor, patch, build, and release parts\n const newSemver = keyValueBy(VERSION_PARTS, (part: VersionPart) => ({\n [part]: chooseVersion(part),\n }))\n const newSemverString = stringify(newSemver)\n const version = v(declaredSemver.semver) + newSemverString\n\n // determine the operator\n // do not compact, because [undefined, '<'] must be differentiated from ['<']\n const uniqueOperators = Array.from(new Set(parsedRange.map(range => range.operator)))\n const operator = uniqueOperators[0] || ''\n\n const hasWildCard = WILDCARDS.some(wildcard => newSemverString.includes(wildcard))\n const isLessThanOrEqual = uniqueOperators[0] === '<' || uniqueOperators[0] === '<='\n const isGreaterThan = uniqueOperators[0] === '>'\n const isMixed = uniqueOperators.length > 1\n\n // convert versions with </<= or mixed operators into the preferred wildcard\n // only do so if the new version does not already contain a wildcard\n return !hasWildCard && (isLessThanOrEqual || isMixed)\n ? addWildCard(version, options.wildcard)\n : // convert > to >= since there are likely no available versions > latest\n // https://github.com/raineorshine/npm-check-updates/issues/957\n (isGreaterThan ? '>=' : operator) + version\n}\n\n/** Reverts a valid semver version to a pseudo version. NOOP If the original version was a valid semver version. */\nconst revertPseudoVersion = (current: string, latest: string) => {\n /** Reverts a valid semver version to a pseudo version with a leading 'v'. NOOP If the original version was a valid semver version. */\n const leadingV = v(current)\n let result = leadingV ? leadingV + latest : latest\n\n /** Reverts a valid semver version to a pseudo version that is missing its minor and patch components. NOOP If the original version was a valid semver version. */\n const missingMinorAndPatch = isMissingMinorAndPatch(current)\n result = missingMinorAndPatch ? result.slice(0, result.length - '.0.0'.length) : result\n\n /** Reverts a valid semver version to a pseudo version that is missing its patch components. NOOP If the original version was a valid semver version. */\n const missingPatch = isMissingPatch(current)\n result = missingPatch ? result.slice(0, result.length - '.0'.length) : result\n\n return result\n}\n\n/**\n * Replaces the version number embedded in a GitHub URL.\n */\nexport const upgradeGitHubUrl = (declaration: string, upgraded: string) => {\n // convert upgraded to a proper semver version if it is a pseudo version; otherwise, revertPseudoVersion will return an empty string\n const upgradedNormalized = fixPseudoVersion(upgraded)\n const parsedUrl = parseGitHubUrl(declaration)\n if (!parsedUrl) return declaration\n const tag = decodeURIComponent(parsedUrl.branch).replace(/^semver:/, '')\n return declaration.replace(tag, upgradeDependencyDeclaration(tag, revertPseudoVersion(tag, upgradedNormalized)))\n}\n","/**\n * Loggin functions.\n */\nimport Table from 'cli-table3'\nimport fs from 'fs/promises'\nimport { IgnoredUpgradeDueToEnginesNode } from '../types/IgnoredUpgradeDueToEnginesNode'\nimport { IgnoredUpgradeDueToPeerDeps } from '../types/IgnoredUpgradeDueToPeerDeps'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { VersionResult } from '../types/VersionResult'\nimport { VersionSpec } from '../types/VersionSpec'\nimport chalk from './chalk'\nimport filterObject from './filterObject'\nimport getPackageVersion from './getPackageVersion'\nimport getRepoUrl from './getRepoUrl'\nimport {\n colorizeDiff,\n getDependencyGroups,\n getGitHubUrlTag,\n isGitHubUrl,\n isNpmAlias,\n parseNpmAlias,\n} from './version-util'\n\ntype LogLevel = 'silent' | 'error' | 'warn' | 'info' | 'verbose' | 'silly' | null\n\n// maps string levels to numeric levels\nconst logLevels = {\n silent: 0,\n error: 1,\n minimal: 2,\n warn: 3,\n info: 4,\n verbose: 5,\n silly: 6,\n}\n\n/** Returns true if the dependency spec is not fetchable from the registry and is ignored. */\nconst isFetchable = (spec: VersionSpec) =>\n !spec.startsWith('file:') &&\n !spec.startsWith('link:') &&\n !spec.startsWith('workspace:') &&\n // short github urls that are ignored, e.g. raineorshine/foo\n !/^[^/:@]+\\/\\w+/.test(spec)\n\n/**\n * Prints a message if it is included within options.loglevel.\n *\n * @param options Command line options. These will be compared to the loglevel parameter to determine if the message gets printed.\n * @param message The message to print\n * @param loglevel silent|error|warn|info|verbose|silly\n * @param method The console method to call. Default: 'log'.\n */\nexport function print(\n options: Options,\n message: any,\n loglevel: LogLevel = null,\n method: 'log' | 'warn' | 'info' | 'error' = 'log',\n) {\n // not in json mode\n // not silent\n // not at a loglevel under minimum specified\n if (\n !options.json &&\n options.loglevel !== 'silent' &&\n (loglevel == null ||\n logLevels[(options.loglevel ?? 'warn') as unknown as keyof typeof logLevels] >= logLevels[loglevel])\n ) {\n console[method](message)\n }\n}\n\n/** Pretty print a JSON object. */\nexport function printJson(options: Options, object: any) {\n if (options.loglevel !== 'silent') {\n console.log(JSON.stringify(object, null, 2))\n }\n}\n\n/** Print JSON object keys as string joined by character. */\nexport function printSimpleJoinedString(object: any, join: string) {\n console.log(\n Object.keys(object)\n .map(pkg => pkg + '@' + object[pkg])\n .join(join),\n )\n}\n\n/** Prints an object sorted by key. */\nexport function printSorted<T extends { [key: string]: any }>(options: Options, obj: T, loglevel: LogLevel) {\n const sortedKeys = Object.keys(obj).sort() as (keyof T)[]\n const objSorted = sortedKeys.reduce<T>((accum, key) => {\n accum[key] = obj[key]\n return accum\n }, {} as T)\n print(options, objSorted, loglevel)\n}\n\n/** Create a table with the appropriate columns and alignment to render dependency upgrades. */\nfunction renderDependencyTable(rows: string[][]) {\n const table = new Table({\n colAligns: ['left', 'right', 'right', 'right', 'left', 'left'],\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: '',\n },\n })\n\n table.push(...rows)\n\n // when border is removed, whitespace remains\n // trim the end of each line to remove whitespace\n // this makes no difference visually, but the whitespace interacts poorly with .editorconfig in tests\n return table\n .toString()\n .split('\\n')\n .map(line => line.trimEnd())\n .join('\\n')\n}\n\n/**\n * Extract just the version number from a package.json dep\n *\n * @param dep Raw dependency, could be version / npm: string / Git url\n */\nfunction getVersion(dep: string): string {\n return isGitHubUrl(dep) ? getGitHubUrlTag(dep)! : isNpmAlias(dep) ? parseNpmAlias(dep)![1] : dep\n}\n\n/**\n * Renders a color-coded table of upgrades.\n *\n * @param args\n * @param args.from\n * @param args.to\n * @param args.ownersChangedDeps\n * @param args.format\n */\nexport async function toDependencyTable({\n from: fromDeps,\n to: toDeps,\n format,\n ownersChangedDeps,\n pkgFile,\n time,\n}: {\n from: Index<VersionSpec>\n to: Index<VersionSpec>\n format?: readonly string[]\n ownersChangedDeps?: Index<boolean>\n /** See: logging/getPackageRepo pkgFile param. */\n pkgFile?: string\n time?: Index<string>\n}) {\n const pkg = format?.includes('dep') && pkgFile ? JSON.parse(await fs.readFile(pkgFile, 'utf-8')) : null\n const table = renderDependencyTable(\n await Promise.all(\n Object.keys(toDeps)\n .sort()\n .map(async dep => {\n const from =\n (format?.includes('installedVersion')\n ? await getPackageVersion(dep, undefined, { pkgFile })\n : fromDeps[dep]) || ''\n const depType =\n dep in (pkg?.devDependencies ?? {})\n ? 'dev'\n : dep in (pkg?.peerDependencies ?? {})\n ? 'peer'\n : dep in (pkg?.optionalDependencies ?? {})\n ? 'optional'\n : ''\n const toRaw = toDeps[dep] || ''\n const to = getVersion(toRaw)\n const ownerChanged = ownersChangedDeps\n ? dep in ownersChangedDeps\n ? ownersChangedDeps[dep]\n ? '*owner changed*'\n : ''\n : '*unknown*'\n : ''\n const toColorized = colorizeDiff(getVersion(from), to)\n const repoUrl = format?.includes('repo') ? (await getRepoUrl(dep, undefined, { pkgFile })) || '' : ''\n const publishTime = format?.includes('time') && time?.[dep] ? time[dep] : ''\n return [\n dep,\n ...(format?.includes('dep') ? [depType ? chalk.gray(depType) : ''] : []),\n from,\n '→',\n toColorized,\n ownerChanged,\n ...[repoUrl, publishTime].filter(x => x),\n ]\n }),\n ),\n )\n return table\n}\n\n/**\n * Renders one or more color-coded tables with all upgrades. Supports different formats from the --format option.\n *\n * @param args\n * @param args.current\n * @param args.upgraded\n * @param args.ownersChangedDeps\n * @param options\n */\nexport async function printUpgradesTable(\n {\n current,\n upgraded,\n ownersChangedDeps,\n pkgFile,\n time,\n }: {\n current: Index<VersionSpec>\n upgraded: Index<VersionSpec>\n ownersChangedDeps?: Index<boolean>\n pkgFile?: string\n time?: Index<string>\n },\n options: Options,\n) {\n // group\n if (options.format?.includes('group')) {\n const groups = getDependencyGroups(upgraded, current, options)\n\n for (const { heading, packages } of groups) {\n print(options, '\\n' + heading)\n print(\n options,\n await toDependencyTable({\n from: current,\n to: packages,\n format: options.format,\n ownersChangedDeps,\n pkgFile,\n time,\n }),\n )\n }\n } else {\n if (options.format?.includes('lines')) {\n printSimpleJoinedString(upgraded, '\\n')\n } else {\n print(\n options,\n await toDependencyTable({\n from: current,\n to: upgraded,\n format: options.format,\n ownersChangedDeps,\n pkgFile,\n time,\n }),\n )\n }\n }\n}\n\n/** Prints errors. */\nfunction printErrors(options: Options, errors?: Index<string>) {\n if (!errors) return\n if (Object.keys(errors).length > 0) {\n const errorTable = new Table({\n colAligns: ['left', 'right', 'right', 'right', 'left', 'left'],\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: '',\n },\n })\n\n errorTable.push(...Object.entries(errors).map(([dep, error]) => [dep, chalk.yellow(error)]))\n\n print(options, '\\n' + errorTable.toString())\n }\n}\n\n/**\n * @param args.current -\n * @param args.latest -\n * @param args.upgraded -\n * @param args.total -\n * @param args.ownersChangedDeps -\n */\nexport async function printUpgrades(\n options: Options,\n {\n current,\n latest,\n upgraded,\n total,\n ownersChangedDeps,\n pkgFile,\n time,\n errors,\n }: {\n // Current package versions\n current: Index<VersionSpec>\n // Latest package versions according to the target. This is only used to detect an empty result from npm.\n latest?: Index<VersionResult>\n // Upgraded package specifications\n upgraded: Index<VersionSpec>\n // The total number of all possible upgrades. This is used to differentiate \"no dependencies\" from \"no upgrades\"\n total: number\n // Boolean flag per dependency which announces if package owner changed. Only used by --format ownerChanged\n ownersChangedDeps?: Index<boolean>\n // See: logging/getPackageRepo pkgFile param\n pkgFile?: string\n // Time published if options.format includes \"time\"\n time?: Index<string>\n // Any errors that were encountered when fetching versions.\n errors?: Index<string>\n },\n) {\n if (!options.format?.includes('group')) {\n print(options, '')\n }\n\n const smiley = chalk.green.bold(':)')\n const numErrors = Object.keys(errors || {}).length\n const target = typeof options.target === 'string' ? options.target : 'target'\n const numUpgraded = Object.keys(upgraded).length\n if (numUpgraded === 0 && total === 0 && numErrors === 0) {\n if (Object.keys(current).length === 0) {\n print(options, 'No dependencies.')\n } else if (\n latest &&\n Object.keys(latest).length === 0 &&\n // some specs are ignored by ncu, like the file: protocol, so they should be ignored when detecting fetch issues\n Object.values(filterObject(current, (name, spec) => isFetchable(spec))).length > 0\n ) {\n print(\n options,\n `No package versions were returned. This may be a problem with your installed ${\n options.packageManager\n }, the npm registry, or your Internet connection. Make sure ${chalk.cyan(\n 'npx pacote packument ncu-test-v2',\n )} is working before reporting an issue.`,\n )\n } else if (options.global) {\n print(options, `All global packages are up-to-date ${smiley}`)\n } else {\n print(options, `All dependencies match the ${target} package versions ${smiley}`)\n }\n } else if (numUpgraded === 0 && total > 0) {\n print(options, `No dependencies upgraded ${smiley}`)\n }\n // print table\n else if (numUpgraded > 0) {\n await printUpgradesTable(\n {\n current,\n upgraded,\n ownersChangedDeps,\n pkgFile,\n time,\n },\n options,\n )\n }\n\n printErrors(options, errors)\n}\n\n/** Print updates that were ignored due to incompatible peer dependencies. */\nexport function printIgnoredUpdatesDueToPeerDeps(options: Options, ignoredUpdates: Index<IgnoredUpgradeDueToPeerDeps>) {\n print(options, `\\nIgnored incompatible updates (peer dependencies):\\n`)\n const table = renderDependencyTable(\n Object.entries(ignoredUpdates).map(([pkgName, { from, to, reason }]) => {\n const strReason =\n 'reason: ' +\n Object.entries(reason)\n .map(([pkgReason, requirement]) => pkgReason + ' requires ' + requirement)\n .join(', ')\n return [pkgName, from, '→', colorizeDiff(from, to), strReason]\n }),\n )\n print(options, table)\n}\n\n/** Print updates that were ignored due to incompatible engines.node. */\nexport function printIgnoredUpdatesDueToEnginesNode(\n options: Options,\n ignoredUpdates: Index<IgnoredUpgradeDueToEnginesNode>,\n) {\n print(options, `\\nIgnored incompatible updates (engines node):\\n`)\n const table = renderDependencyTable(\n Object.entries(ignoredUpdates).map(([pkgName, { from, to, enginesNode }]) => [\n pkgName,\n from,\n '→',\n colorizeDiff(from, to),\n `reason: requires node ${enginesNode}`,\n ]),\n )\n print(options, table)\n}\n","import fs from 'fs'\nimport os from 'os'\nimport path from 'path'\nimport { CacheData, Cacher } from '../types/Cacher'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { Version } from '../types/Version'\nimport { print } from './logging'\n\nexport const CACHE_DELIMITER = '___'\n\n/**\n * Check if cache is expired if timestamp is set\n *\n * @param cacheData\n * @param cacheExpiration\n * @returns\n */\nfunction checkCacheExpiration(cacheData: CacheData, cacheExpiration = 10) {\n if (typeof cacheData.timestamp !== 'number') {\n return false\n }\n\n const unixMinuteMS = 60 * 1000\n const expirationLimit = cacheData.timestamp + cacheExpiration * unixMinuteMS\n return expirationLimit < Date.now()\n}\n\nexport const defaultCacheFilename = '.ncu-cache.json'\nexport const defaultCacheFile = `~/${defaultCacheFilename}`\nexport const resolvedDefaultCacheFile = path.join(os.homedir(), defaultCacheFilename)\n\n/** Resolve the cache file path based on os/homedir. */\nexport function resolveCacheFile(optionsCacheFile: string) {\n return optionsCacheFile === defaultCacheFile ? resolvedDefaultCacheFile : optionsCacheFile\n}\n\n/** Clear the default cache, or the cache file specified by --cacheFile. */\nexport async function cacheClear(options: Options) {\n if (!options.cacheFile) {\n return\n }\n\n await fs.promises.rm(resolveCacheFile(options.cacheFile), { force: true })\n}\n\n/**\n * The cacher stores key (name + target) - value (new version) pairs\n * for quick updates across `ncu` calls.\n *\n * @returns\n */\nexport default async function cacher(options: Omit<Options, 'cacher'>): Promise<Cacher | undefined> {\n if (!options.cache || !options.cacheFile) {\n return\n }\n\n const cacheFile = resolveCacheFile(options.cacheFile)\n let cacheData: CacheData = {}\n const cacheHits = new Set<string>()\n\n try {\n cacheData = JSON.parse(await fs.promises.readFile(cacheFile, 'utf-8'))\n\n const expired = checkCacheExpiration(cacheData, options.cacheExpiration)\n if (expired) {\n // reset cache\n fs.promises.rm(cacheFile, { force: true })\n cacheData = {}\n }\n } catch (error) {\n // ignore file read/parse/remove errors\n }\n\n if (typeof cacheData.timestamp !== 'number') {\n cacheData.timestamp = Date.now()\n }\n if (!cacheData.packages) {\n cacheData.packages = {}\n }\n if (!cacheData.peers) {\n cacheData.peers = {}\n }\n\n return {\n get: (name: string, target: string) => {\n if (!cacheData.packages) return\n const key = `${name}${CACHE_DELIMITER}${target}`\n const cached = cacheData.packages[key]\n if (cached && !key.includes(cached)) {\n cacheHits.add(name)\n }\n return cached\n },\n set: (name: string, target: string, version: string) => {\n if (!cacheData.packages) return\n const key = `${name}${CACHE_DELIMITER}${target}`\n cacheData.packages[key] = version\n },\n getPeers: (name: string, version: Version) => {\n if (!cacheData.peers) return\n const key = `${name}${CACHE_DELIMITER}${version}`\n const cached = cacheData.peers[key]\n if (cached) {\n cacheHits.add(name)\n }\n return cached\n },\n setPeers: (name: string, version: Version, peers: Index<string>) => {\n const key = `${name}${CACHE_DELIMITER}${version}`\n if (!cacheData.peers) return\n cacheData.peers[key] = peers\n },\n save: async () => {\n await fs.promises.writeFile(cacheFile, JSON.stringify(cacheData))\n },\n log: (peers?: boolean) => {\n const cacheCount = cacheHits.size\n if (cacheCount === 0) return\n\n print(\n options,\n `\\nUsing ${cacheCount} cached package ${peers ? 'peer' : 'version'}${cacheCount > 1 ? 's' : ''}`,\n 'warn',\n )\n print(options, cacheHits, 'verbose')\n cacheHits.clear()\n },\n } satisfies Cacher\n}\n","/** Wraps a string by inserting newlines every n characters. Wraps on word break. Default: 92 chars. */\nconst wrap = (s: string, maxLineLength = 92) => {\n const linesIn = s.split('\\n')\n const linesOut: string[] = []\n linesIn.forEach(lineIn => {\n let i = 0\n if (lineIn.length === 0) {\n linesOut.push('')\n return\n }\n\n while (i < lineIn.length) {\n const lineFull = lineIn.slice(i, i + maxLineLength + 1)\n\n // if the line is within the line length, push it as the last line and break\n const lineTrimmed = lineFull.trimEnd()\n if (lineTrimmed.length <= maxLineLength) {\n linesOut.push(lineTrimmed)\n break\n }\n\n // otherwise, wrap before the last word that exceeds the wrap length\n // do not wrap in the middle of a word\n // reverse the string and use match to find the first non-word character to wrap on\n const wrapOffset =\n lineFull\n .split('')\n .reverse()\n .join('')\n // add [^\\W] to not break in the middle of --registry\n .match(/[ -][^\\W]/)?.index || 0\n const line = lineFull.slice(0, lineFull.length - wrapOffset)\n\n // make sure we do not end up in an infinite loop\n if (line.length === 0) break\n\n linesOut.push(line.trimEnd())\n i += line.length\n }\n i = 0\n })\n return linesOut.join('\\n').trim()\n}\n\nexport default wrap\n","import Table from 'cli-table3'\nimport wrap from './wrap'\n\n/** Wraps the second column in a list of 2-column cli-table rows. */\nconst wrapRows = (rows: string[][]) => rows.map(([col1, col2]) => [col1, wrap(col2)])\n\n/** Renders an HTML row. */\nconst row = (cells: string[]) => '\\n <tr>' + cells.map(cell => `<td>${cell}</td>`).join('') + '</tr>'\n\n/** Renders a table for the CLI or markdown. */\nconst table = ({\n colAligns,\n markdown,\n rows,\n}: {\n colAligns?: ('left' | 'right')[]\n markdown?: boolean\n rows: string[][]\n}): string => {\n // return HTML table for GitHub-flavored markdown\n if (markdown) {\n return `<table>${rows.map(row).join('')}\\n</table>`\n }\n // otherwise use cli-table3\n else {\n const t = new Table({ ...(colAligns ? { colAligns } : null) })\n t.push(...(markdown ? rows : wrapRows(rows)))\n return t.toString()\n }\n}\n\nexport default table\n","import path from 'path'\nimport { defaultCacheFile } from './lib/cache'\nimport chalk from './lib/chalk'\nimport { sortBy } from './lib/sortBy'\nimport table from './lib/table'\nimport CLIOption from './types/CLIOption'\nimport ExtendedHelp from './types/ExtendedHelp'\nimport { Index } from './types/IndexType'\n\n/** Valid strings for the --target option. Indicates the desired version to upgrade to. */\nconst supportedVersionTargets = ['latest', 'newest', 'greatest', 'minor', 'patch', 'semver']\n\n/** Pads the left side of each line in a string. */\nconst padLeft = (s: string, n: number) =>\n s\n .split('\\n')\n .map(line => `${''.padStart(n, ' ')}${line}`)\n .join('\\n')\n\n/** Formats a code block for CLI or markdown. */\nconst codeBlock = (code: string, { markdown }: { markdown?: boolean } = {}) =>\n `${markdown ? '```js\\n' : ''}${padLeft(code, markdown ? 0 : 4)}${markdown ? '\\n```' : ''}`\n\n/** Removes inline code ticks. */\nconst uncode = (s: string) => s.replace(/`/g, '')\n\n/** Renders the extended help for an option with usage information. */\nexport const renderExtendedHelp = (option: CLIOption, { markdown }: { markdown?: boolean } = {}) => {\n let output = ''\n if (option.cli !== false) {\n // add -u to doctor option\n output = `Usage:\n\n ncu --${option.long}${option.arg ? ` [${option.arg}]` : ''}${option.long === 'doctor' ? ' -u' : ''}\\n`\n }\n if (option.type === 'boolean') {\n output += ` ncu --no-${option.long}\\n`\n }\n if (option.short) {\n // add -u to doctor option\n output += ` ncu -${option.short}${option.arg ? ` [${option.arg}]` : ''}${option.long === 'doctor' ? 'u' : ''}\\n`\n }\n\n if (option.default !== undefined && !(Array.isArray(option.default) && option.default.length === 0)) {\n output += `\\nDefault: ${option.default}\\n`\n }\n if (option.help) {\n const helpText =\n typeof option.help === 'function'\n ? markdown\n ? option.help({ markdown })\n : uncode(option.help({ markdown }))\n : option.help\n output += `\\n${helpText.trim()}\\n\\n`\n } else if (option.description) {\n const description = markdown ? option.description : uncode(option.description)\n output += `\\n${description.replace(/`/g, '')}\\n`\n }\n\n return output.trim()\n}\n\n/** Extended help for the --doctor option. */\nconst extendedHelpDoctor: ExtendedHelp = ({\n markdown,\n}) => `Iteratively installs upgrades and runs your project's tests to identify breaking upgrades. Reverts broken upgrades and updates package.json with working upgrades.\n\n${chalk.yellow('Requires `-u` to execute')} (modifies your package file, lock file, and node_modules)\n\nTo be more precise:\n\n1. Runs \\`npm install\\` and \\`npm test\\` to ensure tests are currently passing.\n2. Runs \\`ncu -u\\` to optimistically upgrade all dependencies.\n3. If tests pass, hurray!\n4. If tests fail, restores package file and lock file.\n5. For each dependency, install upgrade and run tests.\n6. Prints broken upgrades with test error.\n7. Saves working upgrades to package.json.\n\nAdditional options:\n\n${table({\n markdown,\n rows: [\n [chalk.cyan('--doctorInstall'), 'specify a custom install script (default: `npm install` or `yarn`)'],\n [chalk.cyan('--doctorTest'), 'specify a custom test script (default: `npm test`)'],\n ],\n})}\n\nExample:\n\n $ ncu --doctor -u\n Running tests before upgrading\n npm install\n npm run test\n Upgrading all dependencies and re-running tests\n ncu -u\n npm install\n npm run test\n Tests failed\n Identifying broken dependencies\n npm install\n npm install --no-save react@16.0.0\n npm run test\n ✓ react 15.0.0 → 16.0.0\n npm install --no-save react-redux@7.0.0\n npm run test\n ✗ react-redux 6.0.0 → 7.0.0\n\n /projects/myproject/test.js:13\n throw new Error('Test failed!')\n ^\n\n npm install --no-save react-dnd@11.1.3\n npm run test\n ✓ react-dnd 10.0.0 → 11.1.3\n Saving partially upgraded package.json\n`\n\n/** Extended help for the filterResults option. */\nconst extendedHelpFilterResults: ExtendedHelp = ({ markdown }) => {\n /** If markdown, surround inline code with backticks. */\n const codeInline = (code: string) => (markdown ? `\\`${code}\\`` : code)\n\n return `Filters results based on a user provided predicate function after fetching new versions.\n\n${codeInline('filterResults')} runs _after_ new versions are fetched, in contrast to ${codeInline(\n 'filter',\n )}, ${codeInline('reject')}, ${codeInline('filterVersion')}, and ${codeInline(\n 'rejectVersion',\n )}, which run _before_. This allows you to exclude upgrades with ${codeInline(\n 'filterResults',\n )} based on how the version has changed (e.g. a major version change).\n\n> :warning: The predicate function is only available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions.\n\n${codeBlock(\n `${chalk.gray(`/** Exclude major version updates. Note this could also be achieved with --target semver.\n @param {string} packageName The name of the dependency.\n @param {string} current Current version declaration (may be a range).\n @param {SemVer[]} currentVersionSemver Current version declaration in semantic versioning format (may be a range).\n @param {string} upgraded Upgraded version.\n @param {SemVer} upgradedVersionSemver Upgraded version in semantic versioning format.\n @returns {boolean} Return true if the upgrade should be kept; otherwise, it will be ignored.\n*/`)}\n${chalk.green('filterResults')}: (packageName, { current, currentVersionSemver, upgraded, upgradedVersionSemver }) ${chalk.cyan(\n '=>',\n )} {\n ${chalk.cyan('const')} currentMajor ${chalk.red('=')} parseInt(currentVersionSemver[${chalk.cyan('0')}]?.major, ${chalk.cyan(\n '10',\n )})\n ${chalk.cyan('const')} upgradedMajor ${chalk.red('=')} parseInt(upgradedVersionSemver?.major, ${chalk.cyan('10')})\n ${chalk.red('if')} (currentMajor ${chalk.red('&&')} upgradedMajor) {\n ${chalk.red('return')} currentMajor ${chalk.red('>=')} upgradedMajor\n }\n ${chalk.red('return')} ${chalk.cyan('true')}\n}`,\n { markdown },\n)}\n\nFor the SemVer type definition, see: https://git.coolaj86.com/coolaj86/semver-utils.js#semverutils-parse-semverstring\n\n`\n}\n\n/** Extended help for the --format option. */\nconst extendedHelpFormat: ExtendedHelp = ({ markdown }) => {\n const header =\n 'Modify the output formatting or show additional information. Specify one or more comma-delimited values.'\n const tableString = table({\n colAligns: ['right', 'left'],\n markdown,\n rows: [\n ['dep', `Prints the dependency type (dev, peer, optional) of each package.`],\n ['group', `Groups packages by major, minor, patch, and major version zero updates.`],\n ['installedVersion', 'Prints the exact current version number instead of a range.'],\n ['lines', 'Prints name@version on separate lines. Useful for piping to npm install.'],\n ['ownerChanged', `Shows if the package owner has changed.`],\n ['repo', `Infers and displays links to the package's source code repository. Requires packages to be installed.`],\n ['time', 'Shows the publish time of each upgrade.'],\n ],\n })\n\n return `${header}\\n\\n${padLeft(tableString, markdown ? 0 : 4)}\n`\n}\n\n/** Extended help for the --install option. */\nconst extendedHelpInstall: ExtendedHelp = ({ markdown }) => {\n const header = 'Control the auto-install behavior.'\n const tableString = table({\n colAligns: ['right', 'left'],\n markdown,\n rows: [\n ['always', `Runs your package manager's install command automatically after upgrading.`],\n ['never', `Does not install and does not prompt.`],\n [\n 'prompt',\n `Shows a message after upgrading that recommends an install, but does not install. In interactive mode, prompts for install. (default)`,\n ],\n ],\n })\n\n return `${header}\\n\\n${padLeft(tableString, markdown ? 0 : 4)}\n`\n}\n\n/** Extended help for the --filter option. */\nconst extendedHelpFilterFunction: ExtendedHelp = ({ markdown }) => {\n /** If markdown, surround inline code with backticks. */\n const codeInline = (code: string) => (markdown ? `\\`${code}\\`` : code)\n\n return `Include only package names matching the given string, wildcard, glob, comma-or-space-delimited list, /regex/, or predicate function. Only included packages will be checked with ${codeInline(\n '--peer',\n )}.\n\n${codeInline('--filter')} runs _before_ new versions are fetched, in contrast to ${codeInline(\n '--filterResults',\n )} which runs _after_.\n\nYou can also specify a custom function in your .ncurc.js file, or when importing npm-check-updates as a module.\n\n> :warning: The predicate function is only available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions.\n\n${codeBlock(\n `${chalk.gray(`/**\n @param name The name of the dependency.\n @param semver A parsed Semver array of the current version.\n (See: https://git.coolaj86.com/coolaj86/semver-utils.js#semverutils-parse-semverstring)\n @returns True if the package should be included, false if it should be excluded.\n*/`)}\n${chalk.green('filter')}: (name, semver) ${chalk.cyan('=>')} {\n ${chalk.red('if')} (name.startsWith(${chalk.yellow(`'@myorg/'`)})) {\n ${chalk.red('return')} ${chalk.cyan('false')}\n }\n ${chalk.red('return')} ${chalk.cyan('true')}\n}`,\n { markdown },\n)}\n\n`\n}\n\n/** Extended help for the --filterVersion option. */\nconst extendedHelpFilterVersionFunction: ExtendedHelp = ({ markdown }) => {\n /** If markdown, surround inline code with backticks. */\n const codeInline = (code: string) => (markdown ? `\\`${code}\\`` : code)\n\n return `Include only versions matching the given string, wildcard, glob, comma-or-space-delimited list, /regex/, or predicate function.\n\n${codeInline('--filterVersion')} runs _before_ new versions are fetched, in contrast to ${codeInline(\n '--filterResults',\n )} which runs _after_.\n\nYou can also specify a custom function in your .ncurc.js file, or when importing npm-check-updates as a module.\n\n> :warning: The predicate function is only available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions. This function is an alias for the ${codeInline('filter')} option function.\n\n${codeBlock(\n `${chalk.gray(`/**\n @param name The name of the dependency.\n @param semver A parsed Semver array of the current version.\n (See: https://git.coolaj86.com/coolaj86/semver-utils.js#semverutils-parse-semverstring)\n @returns True if the package should be included, false if it should be excluded.\n*/`)}\n${chalk.green('filterVersion')}: (name, semver) ${chalk.cyan('=>')} {\n ${chalk.red('if')} (name.startsWith(${chalk.yellow(`'@myorg/'`)}) ${chalk.red(\n '&&',\n )} parseInt(semver[0]?.major) ${chalk.cyan('>')} ${chalk.cyan(`5`)}) {\n ${chalk.red('return')} ${chalk.cyan('false')}\n }\n ${chalk.red('return')} ${chalk.cyan('true')}\n}`,\n { markdown },\n)}\n\n`\n}\n\n/** Extended help for the --reject option. */\nconst extendedHelpRejectFunction: ExtendedHelp = ({ markdown }) => {\n /** If markdown, surround inline code with backticks. */\n const codeInline = (code: string) => (markdown ? `\\`${code}\\`` : code)\n\n return `The inverse of ${codeInline(\n '--filter',\n )}. Exclude package names matching the given string, wildcard, glob, comma-or-space-delimited list, /regex/, or predicate function. This will also exclude them from the ${codeInline(\n '--peer',\n )} check.\n\n${codeInline('--reject')} runs _before_ new versions are fetched, in contrast to ${codeInline(\n '--filterResults',\n )} which runs _after_.\n\nYou can also specify a custom function in your .ncurc.js file, or when importing npm-check-updates as a module.\n\n> :warning: The predicate function is only available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions.\n\n${codeBlock(\n `${chalk.gray(`/**\n @param name The name of the dependency.\n @param semver A parsed Semver array of the current version.\n (See: https://git.coolaj86.com/coolaj86/semver-utils.js#semverutils-parse-semverstring)\n @returns True if the package should be excluded, false if it should be included.\n*/`)}\n${chalk.green('reject')}: (name, semver) ${chalk.cyan('=>')} {\n ${chalk.red('if')} (name.startsWith(${chalk.yellow(`'@myorg/'`)})) {\n ${chalk.red('return')} ${chalk.cyan('true')}\n }\n ${chalk.red('return')} ${chalk.cyan('false')}\n}`,\n { markdown },\n)}\n\n`\n}\n\n/** Extended help for the --rejectVersion option. */\nconst extendedHelpRejectVersionFunction: ExtendedHelp = ({ markdown }) => {\n /** If markdown, surround inline code with backticks. */\n const codeInline = (code: string) => (markdown ? `\\`${code}\\`` : code)\n\n return `The inverse of ${codeInline(\n '--filterVersion',\n )}. Exclude versions matching the given string, wildcard, glob, comma-or-space-delimited list, /regex/, or predicate function.\n\n${codeInline('--rejectVersion')} runs _before_ new versions are fetched, in contrast to ${codeInline(\n '--filterResults',\n )} which runs _after_.\n\nYou can also specify a custom function in your .ncurc.js file, or when importing npm-check-updates as a module.\n\n> :warning: The predicate function is only available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions. This function is an alias for the reject option function.\n\n${codeBlock(\n `${chalk.gray(`/**\n @param name The name of the dependency.\n @param semver A parsed Semver array of the current version.\n (See: https://git.coolaj86.com/coolaj86/semver-utils.js#semverutils-parse-semverstring)\n @returns True if the package should be excluded, false if it should be included.\n*/`)}\n${chalk.green('rejectVersion')}: (name, semver) ${chalk.cyan('=>')} {\n ${chalk.red('if')} (name.startsWith(${chalk.yellow(`'@myorg/'`)}) ${chalk.red(\n '&&',\n )} parseInt(semver[0]?.major) ${chalk.cyan('>')} ${chalk.cyan(`5`)}) {\n ${chalk.red('return')} ${chalk.cyan('true')}\n }\n ${chalk.red('return')} ${chalk.cyan('false')}\n}`,\n { markdown },\n)}\n\n`\n}\n\n/** Extended help for the --group option. */\nconst extendedHelpGroupFunction: ExtendedHelp = ({ markdown }) => {\n return `Customize how packages are divided into groups when using \\`--format group\\`.\n\nOnly available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions.\n\n${codeBlock(\n `${chalk.gray(`/**\n @param name The name of the dependency.\n @param defaultGroup The predefined group name which will be used by default.\n @param currentSpec The current version range in your package.json.\n @param upgradedSpec The upgraded version range that will be written to your package.json.\n @param upgradedVersion The upgraded version number returned by the registry.\n @returns A predefined group name ('major' | 'minor' | 'patch' | 'majorVersionZero' | 'none') or a custom string to create your own group.\n*/`)}\n${chalk.green('groupFunction')}: (name, defaultGroup, currentSpec, upgradedSpec, upgradedVersion) ${chalk.cyan('=>')} {\n ${chalk.red('if')} (name ${chalk.red('===')} ${chalk.yellow(`'typescript'`)} ${chalk.red(\n '&&',\n )} defaultGroup ${chalk.red('===')} ${chalk.yellow(`'minor'`)}) {\n ${chalk.red('return')} ${chalk.yellow(`'major'`)}\n }\n ${chalk.red('if')} (name.startsWith(${chalk.yellow(`'@myorg/'`)})) {\n ${chalk.red('return')} ${chalk.yellow(`'My Org'`)}\n }\n ${chalk.red('return')} defaultGroup\n}`,\n { markdown },\n)}\n\n`\n}\n\n/** Extended help for the --target option. */\nconst extendedHelpTarget: ExtendedHelp = ({ markdown }) => {\n const header = 'Determines the version to upgrade to. (default: \"latest\")'\n const tableString = table({\n colAligns: ['right', 'left'],\n markdown,\n rows: [\n [\n 'greatest',\n `Upgrade to the highest version number published, regardless of release date or tag. Includes prereleases.`,\n ],\n [\n 'latest',\n `Upgrade to whatever the package's \"latest\" git tag points to. Excludes prereleases unless --pre is specified.`,\n ],\n ['minor', 'Upgrade to the highest minor version without bumping the major version.'],\n [\n 'newest',\n `Upgrade to the version with the most recent publish date, even if there are other version numbers that are higher. Includes prereleases.`,\n ],\n ['patch', `Upgrade to the highest patch version without bumping the minor or major versions.`],\n ['semver', `Upgrade to the highest version within the semver range specified in your package.json.`],\n ['@[tag]', `Upgrade to the version published to a specific tag, e.g. 'next' or 'beta'.`],\n ],\n })\n\n return `${header}\n\n${padLeft(tableString, markdown ? 0 : 4)}\n\ne.g.\n\n${codeBlock(`ncu --target semver`)}\n\nYou can also specify a custom function in your .ncurc.js file, or when importing npm-check-updates as a module.\n\n> :warning: The predicate function is only available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions.\n\n${codeBlock(\n `${chalk.gray(`/** Upgrade major version zero to the next minor version, and everything else to latest.\n @param name The name of the dependency.\n @param semver A parsed Semver object of the upgraded version.\n (See: https://git.coolaj86.com/coolaj86/semver-utils.js#semverutils-parse-semverstring)\n @returns One of the valid target values (specified in the table above).\n*/`)}\n${chalk.green('target')}: (name, semver) ${chalk.cyan('=>')} {\n ${chalk.red('if')} (parseInt(semver[0]?.major) ${chalk.red('===')} ${chalk.yellow(\"'0'\")}) ${chalk.red(\n 'return',\n )} ${chalk.yellow(\"'minor'\")}\n ${chalk.red('return')} ${chalk.yellow(\"'latest'\")}\n}`,\n { markdown },\n)}\n`\n}\n\n/** Extended help for the --packageManager option. */\nconst extendedHelpPackageManager: ExtendedHelp = ({ markdown }) => {\n const header = 'Specifies the package manager to use when looking up versions.'\n const tableString = table({\n colAligns: ['right', 'left'],\n markdown,\n rows: [\n ['npm', `System-installed npm. Default.`],\n ['yarn', `System-installed yarn. Automatically used if yarn.lock is present.`],\n ['pnpm', `System-installed pnpm. Automatically used if pnpm-lock.yaml is present.`],\n ['bun', `System-installed bun. Automatically used if bun.lock or bun.lockb is present.`],\n ],\n })\n\n return `${header}\\n\\n${padLeft(tableString, markdown ? 0 : 4)}\n`\n}\n\n/** Extended help for the --registryType option. */\nconst extendedHelpRegistryType: ExtendedHelp = ({ markdown }) => {\n /** If markdown, surround inline code with backticks. */\n const codeInline = (code: string) => (markdown ? `\\`${code}\\`` : code)\n\n const header = `Specify whether ${codeInline('--registry')} refers to a full npm registry or a simple JSON file.`\n const tableString = table({\n colAligns: ['right', 'left'],\n markdown,\n rows: [\n ['npm', `Default npm registry`],\n [\n 'json',\n `Checks versions from a file or url to a simple JSON registry. Must include the ${chalk.cyan(\n '`--registry`',\n )} option.\n\nExample:\n\n ${chalk.gray('// local file')}\n ${chalk.cyan('$')} ncu --registryType json --registry ./registry.json\n\n ${chalk.gray('// url')}\n ${chalk.cyan('$')} ncu --registryType json --registry https://api.mydomain/registry.json\n\n ${chalk.gray('// you can omit --registryType when the registry ends in .json')}\n ${chalk.cyan('$')} ncu --registry ./registry.json\n ${chalk.cyan('$')} ncu --registry https://api.mydomain/registry.json\n\nregistry.json:\n\n {\n \"prettier\": \"2.7.1\",\n \"typescript\": \"4.7.4\"\n }\n\n`,\n ],\n ],\n })\n\n return `${header}\\n\\n${padLeft(tableString, markdown ? 0 : 4)}\n`\n}\n\n/** Extended help for the --peer option. */\nconst extendedHelpPeer: ExtendedHelp = ({ markdown }) => {\n /** If markdown, surround inline code with backticks. */\n const codeInline = (code: string) => (markdown ? `\\`${code}\\`` : code)\n return `Check peer dependencies of installed packages and filter updates to compatible versions.\n\n${chalk.bold('Example')}:\n\nThe following example demonstrates how \\`--peer\\` works, and how it uses peer dependencies from upgraded modules.\n\nThe package ${chalk.bold('ncu-test-peer-update')} has two versions published:\n\n- 1.0.0 has peer dependency ${codeInline('\"ncu-test-return-version\": \"1.0.x\"')}\n- 1.1.0 has peer dependency ${codeInline('\"ncu-test-return-version\": \"1.1.x\"')}\n\nOur test app has the following dependencies:\n\n \"ncu-test-peer-update\": \"1.0.0\",\n \"ncu-test-return-version\": \"1.0.0\"\n\nThe latest versions of these packages are:\n\n \"ncu-test-peer-update\": \"1.1.0\",\n \"ncu-test-return-version\": \"2.0.0\"\n\n${chalk.bold('With `--peer`')}:\n\nncu upgrades packages to the highest version that still adheres to the peer dependency constraints:\n\n ncu-test-peer-update 1.0.0 → 1.${chalk.cyan('1.0')}\n ncu-test-return-version 1.0.0 → 1.${chalk.cyan('1.0')}\n\n${chalk.bold('Without `--peer`')}:\n\nAs a comparison: without using the \\`--peer\\` option, ncu will suggest the latest versions, ignoring peer dependencies:\n\n ncu-test-peer-update 1.0.0 → 1.${chalk.cyan('1.0')}\n ncu-test-return-version 1.0.0 → ${chalk.red('2.0.0')}\n`\n}\n\n/** Extended help for the --cooldown option. */\nconst extendedHelpCooldown: ExtendedHelp = ({ markdown }) => {\n return `The cooldown option helps protect against supply chain attacks by requiring package versions to be published at least the given number of days before considering them for upgrade.\n\nNote that previous stable versions will ${chalk.bold('not')} be suggested. The package will be completely ignored if its latest published version is within the cooldown period. This is due to a limitation of the npm registry, which does not provide a way to query previous stable versions.\n\n${chalk.bold('Example')}:\n\nLet's examine how cooldown works with a package that has these versions available:\n\n 1.0.0 Released 7 days ago (initial version)\n 1.1.0 Released 6 days ago (minor update)\n 1.1.1 Released 5 days ago (patch update)\n 1.2.0 Released 5 days ago (minor update)\n 2.0.0-beta.1 Released 5 days ago (beta release)\n 1.2.1 Released 4 days ago (patch update)\n 1.3.0 Released 4 days ago (minor update) [latest]\n 2.0.0-beta.2 Released 3 days ago (beta release)\n 2.0.0-beta.3 Released 2 days ago (beta release) [beta]\n\n${chalk.bold('With default target (latest)')}:\n\n${codeBlock(`${chalk.cyan('$')} ncu --cooldown 5`, { markdown })}\n\nNo update will be suggested because:\n\n- Latest version (1.3.0) is only 4 days old.\n- Cooldown requires versions to be at least 5 days old\n- Use \\`--cooldown 4\\` or lower to allow this update\n\n${chalk.bold('With `@beta`/`@tag` target')}:\n\n${codeBlock(`${chalk.cyan('$')} ncu --cooldown 3 --target @beta`, { markdown })}\n\nNo update will be suggested because:\n\n- Current beta (2.0.0-beta.3) is only 2 days old\n- Cooldown requires versions to be at least 3 days old\n- Use \\`--cooldown 2\\` or lower to allow this update\n\n${chalk.bold('With other targets')}:\n\n${codeBlock(`${chalk.cyan('$')} ncu --cooldown 5 --target greatest|newest|minor|patch|semver`, { markdown })}\n\nEach target will select the best version that is at least 5 days old:\n\n greatest → 1.2.0 (highest version number outside cooldown)\n newest → 2.0.0-beta.1 (most recently published version outside cooldown)\n minor → 1.2.0 (highest minor version outside cooldown)\n patch → 1.1.1 (highest patch version outside cooldown)\n\n${chalk.bold('Note for latest/tag targets')}:\n\n> :warning: For packages that update frequently (e.g. daily releases), using a long cooldown period (7+ days) with the default \\`--target latest\\` or \\`--target @tag\\` may prevent all updates since new versions will be published before older ones meet the cooldown requirement. Please consider this when setting your cooldown period.\n\nYou can also provide a custom function in your .ncurc.js file or when importing npm-check-updates as a module.\n\n> :warning: The predicate function is only available in .ncurc.js or when importing npm-check-updates as a module, not on the command line. To convert a JSON config to a JS config, follow the instructions at https://github.com/raineorshine/npm-check-updates#config-functions.\n\n${codeBlock(\n `${chalk.gray(`/** Set cooldown to 3 days but skip it for \\`@my-company\\` packages.\n @param packageName The name of the dependency.\n @returns Cooldown days restriction for given package.\n*/`)}\n${chalk.green('cooldown')}: packageName ${chalk.cyan('=>')} (packageName.startsWith(${chalk.yellow(\"'@my-company'\")}) ? ${chalk.cyan('0')} : ${chalk.cyan('3')})`,\n { markdown },\n)}\n`\n}\n\n// store CLI options separately from bin file so that they can be used to build type definitions\nconst cliOptions: CLIOption[] = [\n {\n long: 'cache',\n description: `Cache versions to a local cache file. Default \\`--cacheFile\\` is ${defaultCacheFile} and default \\`--cacheExpiration\\` is 10 minutes.`,\n type: 'boolean',\n },\n {\n long: 'cacheClear',\n description: 'Clear the default cache, or the cache file specified by `--cacheFile`.',\n type: 'boolean',\n },\n {\n long: 'cacheExpiration',\n arg: 'min',\n description: 'Cache expiration in minutes. Only works with `--cache`.',\n parse: s => parseInt(s, 10),\n default: 10,\n type: 'number',\n },\n {\n long: 'cacheFile',\n arg: 'path',\n description: 'Filepath for the cache file. Only works with `--cache`.',\n parse: s => (path.isAbsolute(s) ? s : path.join(process.cwd(), s)),\n default: defaultCacheFile,\n type: 'string',\n },\n {\n long: 'color',\n description: 'Force color in terminal.',\n type: 'boolean',\n },\n {\n long: 'concurrency',\n arg: 'n',\n description: 'Max number of concurrent HTTP requests to registry.',\n parse: s => parseInt(s, 10),\n default: 8,\n type: 'number',\n },\n {\n long: 'configFileName',\n arg: 's',\n description: 'Config file name. (default: .ncurc.{json,yml,js,cjs})',\n type: 'string',\n },\n {\n long: 'configFilePath',\n arg: 'path',\n description: 'Directory of .ncurc config file. (default: directory of `packageFile`)',\n type: 'string',\n },\n {\n long: 'cwd',\n arg: 'path',\n description: 'Working directory in which npm will be executed.',\n type: 'string',\n },\n {\n long: 'deep',\n description: `Run recursively in current working directory. Alias of (\\`--packageFile '**/package.json'\\`).`,\n type: 'boolean',\n },\n {\n long: 'ignore',\n arg: 'dirs',\n description: 'Ignore directories containing package.json files (comma-delimited).',\n type: 'string | readonly string[]',\n parse: value => (value && typeof value === 'string' ? value.split(',') : value),\n },\n {\n long: 'dep',\n arg: 'value',\n description:\n 'Check one or more sections of dependencies only: dev, optional, peer, prod, or packageManager (comma-delimited).',\n default: ['prod', 'dev', 'optional', 'packageManager'],\n parse: value => (value && typeof value === 'string' ? value.split(',') : value),\n type: 'string | readonly string[]',\n },\n {\n long: 'deprecated',\n default: true,\n description: 'Include deprecated packages. Use `--no-deprecated` to exclude deprecated packages (20–25% slower).',\n type: 'boolean',\n },\n {\n long: 'doctor',\n short: 'd',\n description:\n 'Iteratively installs upgrades and runs tests to identify breaking upgrades. Requires `-u` to execute.',\n type: 'boolean',\n help: extendedHelpDoctor,\n },\n {\n long: 'doctorInstall',\n arg: 'command',\n description:\n 'Specifies the install script to use in doctor mode. (default: `npm install` or the equivalent for your package manager)',\n type: 'string',\n },\n {\n long: 'doctorTest',\n arg: 'command',\n description: 'Specifies the test script to use in doctor mode. (default: `npm test`)',\n type: 'string',\n },\n {\n long: 'enginesNode',\n description: 'Include only packages that satisfy engines.node as specified in the package file.',\n type: 'boolean',\n },\n {\n long: 'errorLevel',\n short: 'e',\n arg: 'n',\n description:\n 'Set the error level. 1: exits with error code 0 if no errors occur. 2: exits with error code 0 if no packages need updating (useful for continuous integration).',\n parse: s => parseInt(s, 10),\n default: 1,\n type: 'number',\n },\n {\n long: 'filter',\n short: 'f',\n arg: 'p',\n description:\n 'Include only package names matching the given string, wildcard, glob, comma-or-space-delimited list, /regex/, or predicate function.',\n type: 'string | RegExp | readonly (string | RegExp)[] | FilterFunction',\n parse: (value, accum) => [...(accum || []), value],\n help: extendedHelpFilterFunction,\n },\n {\n long: 'filterResults',\n arg: 'fn',\n cli: false,\n description: `Filters results based on a user provided predicate function after fetching new versions.`,\n type: 'FilterResultsFunction',\n help: extendedHelpFilterResults,\n },\n {\n long: 'filterVersion',\n arg: 'p',\n description: 'Filter on package version using comma-or-space-delimited list, /regex/, or predicate function.',\n type: 'string | RegExp | readonly (string | RegExp)[] | FilterFunction',\n parse: (value, accum) => [...(accum || []), value],\n help: extendedHelpFilterVersionFunction,\n },\n {\n long: 'format',\n arg: 'value',\n description:\n 'Modify the output formatting or show additional information. Specify one or more comma-delimited values: dep, group, ownerChanged, repo, time, lines, installedVersion.',\n parse: value => (typeof value === 'string' ? value.split(',') : value),\n default: [],\n type: 'readonly string[]',\n choices: ['dep', 'group', 'ownerChanged', 'repo', 'time', 'lines', 'installedVersion'],\n help: extendedHelpFormat,\n },\n {\n long: 'global',\n short: 'g',\n description: 'Check global packages instead of in the current project.',\n type: 'boolean',\n },\n {\n long: 'groupFunction',\n arg: 'fn',\n cli: false,\n description: `Customize how packages are divided into groups when using \\`--format group\\`.`,\n type: 'GroupFunction',\n help: extendedHelpGroupFunction,\n },\n {\n long: 'install',\n arg: 'value',\n description: 'Control the auto-install behavior: always, never, prompt.',\n help: extendedHelpInstall,\n default: 'prompt',\n choices: ['always', 'never', 'prompt'],\n type: `'always' | 'never' | 'prompt'`,\n },\n {\n long: 'interactive',\n short: 'i',\n description: 'Enable interactive prompts for each dependency; implies `-u` unless one of the json options are set.',\n type: 'boolean',\n },\n {\n // program.json is set to true in programInit if any options that begin with 'json' are true\n long: 'jsonAll',\n short: 'j',\n description: 'Output new package file instead of human-readable message.',\n type: 'boolean',\n },\n {\n long: 'jsonDeps',\n description:\n 'Like `jsonAll` but only lists `dependencies`, `devDependencies`, `optionalDependencies`, etc of the new package data.',\n type: 'boolean',\n },\n {\n long: 'jsonUpgraded',\n description: 'Output upgraded dependencies in json.',\n type: 'boolean',\n },\n {\n long: 'loglevel',\n short: 'l',\n arg: 'n',\n description: 'Amount to log: silent, error, minimal, warn, info, verbose, silly.',\n default: 'warn',\n type: 'string',\n },\n {\n long: 'mergeConfig',\n description: `Merges nested configs with the root config file for \\`--deep\\` or \\`--packageFile\\` options. (default: false)`,\n type: 'boolean',\n },\n {\n long: 'minimal',\n short: 'm',\n description: 'Do not upgrade newer versions that are already satisfied by the version range according to semver.',\n type: 'boolean',\n },\n {\n long: 'packageData',\n arg: 'value',\n description: 'Package file data (you can also use stdin).',\n type: 'string | PackageFile',\n },\n {\n long: 'packageFile',\n arg: 'path|glob',\n description: 'Package file(s) location. (default: ./package.json)',\n type: 'string',\n },\n {\n long: 'packageManager',\n short: 'p',\n arg: 's',\n description: 'npm, yarn, pnpm, deno, bun, staticRegistry (default: npm).',\n help: extendedHelpPackageManager,\n type: `'npm' | 'yarn' | 'pnpm' | 'deno' | 'bun' | 'staticRegistry'`,\n },\n {\n long: 'peer',\n description: 'Check peer dependencies of installed packages and filter updates to compatible versions.',\n type: 'boolean',\n help: extendedHelpPeer,\n },\n {\n long: 'pre',\n arg: 'n',\n description:\n 'Include prerelease versions, e.g. -alpha.0, -beta.5, -rc.2. Automatically set to 1 when `--target` is newest or greatest, or when the current version is a prerelease. (default: 0)',\n parse: s => !!parseInt(s, 10),\n type: 'number',\n },\n {\n long: 'prefix',\n arg: 'path',\n description: 'Current working directory of npm.',\n type: 'string',\n },\n {\n long: 'registry',\n short: 'r',\n arg: 'uri',\n description: 'Specify the registry to use when looking up package versions.',\n type: 'string',\n },\n {\n long: 'registryType',\n arg: 'type',\n description:\n 'Specify whether --registry refers to a full npm registry or a simple JSON file or url: npm, json. (default: npm)',\n help: extendedHelpRegistryType,\n type: `'npm' | 'json'`,\n },\n {\n long: 'reject',\n short: 'x',\n arg: 'p',\n description:\n 'Exclude packages matching the given string, wildcard, glob, comma-or-space-delimited list, /regex/, or predicate function.',\n type: 'string | RegExp | readonly (string | RegExp)[] | FilterFunction',\n parse: (value, accum) => [...(accum || []), value],\n help: extendedHelpRejectFunction,\n },\n {\n long: 'rejectVersion',\n arg: 'p',\n description: 'Exclude package.json versions using comma-or-space-delimited list, /regex/, or predicate function.',\n type: 'string | RegExp | readonly (string | RegExp)[] | FilterFunction',\n parse: (value, accum) => [...(accum || []), value],\n help: extendedHelpRejectVersionFunction,\n },\n {\n long: 'removeRange',\n description: 'Remove version ranges from the final package version.',\n type: 'boolean',\n },\n {\n long: 'root',\n default: true,\n description:\n 'Runs updates on the root project in addition to specified workspaces. Only allowed with `--workspace` or `--workspaces`.',\n type: 'boolean',\n },\n {\n long: 'retry',\n arg: 'n',\n description: 'Number of times to retry failed requests for package info.',\n parse: s => parseInt(s, 10),\n default: 3,\n type: 'number',\n },\n {\n long: 'silent',\n short: 's',\n description: \"Don't output anything. Alias for `--loglevel` silent.\",\n type: 'boolean',\n },\n {\n long: 'stdin',\n description: 'Read package.json from stdin.',\n type: 'string',\n },\n {\n long: 'target',\n short: 't',\n arg: 'value',\n description: `Determines the version to upgrade to: latest, newest, greatest, minor, patch, semver, \\`@[tag]\\`, or [function]. (default: latest)`,\n help: extendedHelpTarget,\n type: `${supportedVersionTargets.map(s => `'${s}'`).join(' | ')} | ${'`@${string}`'} | TargetFunction`,\n },\n {\n long: 'timeout',\n arg: 'ms',\n description: 'Global timeout in milliseconds. (default: no global timeout and 30 seconds per npm-registry-fetch)',\n parse: s => parseInt(s, 10),\n type: 'number',\n },\n {\n long: 'upgrade',\n short: 'u',\n description: 'Overwrite package file with upgraded versions instead of just outputting to console.',\n type: 'boolean',\n },\n {\n long: 'verbose',\n description: 'Log additional information for debugging. Alias for `--loglevel` verbose.',\n type: 'boolean',\n },\n {\n long: 'workspace',\n arg: 's',\n parse: (value, accum) => [...accum, value],\n default: [],\n description: 'Run on one or more specified workspaces. Add `--no-root` to exclude the root project.',\n type: 'readonly string[]',\n },\n {\n long: 'workspaces',\n short: 'w',\n description: 'Run on all workspaces. Add `--no-root` to exclude the root project.',\n type: 'boolean',\n },\n {\n long: 'cooldown',\n short: 'c',\n arg: 'n',\n description:\n 'Sets a minimum age (in days) for package versions to be considered for upgrade, reducing the risk of installing newly published, potentially compromised packages.',\n type: `number | CooldownFunction`,\n help: extendedHelpCooldown,\n parse: s => (typeof s === 'function' ? s : parseInt(s, 10)),\n },\n]\n\n// put cliOptions into an object for O(1) lookups\nexport const cliOptionsMap = cliOptions.reduce(\n (accum, option) => ({\n ...accum,\n ...(option.short ? { [option.short]: option } : null),\n ...(option.long ? { [option.long]: option } : null),\n }),\n {} as Index<CLIOption>,\n)\n\nconst cliOptionsSorted = sortBy(cliOptions, v => v.long)\n\nexport default cliOptionsSorted\n","import fs from 'fs/promises'\nimport os from 'os'\nimport path from 'path'\nimport { Options } from '../types/Options'\n\nconst lockFileNames = [\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n 'deno.json',\n 'deno.jsonc',\n 'bun.lock',\n 'bun.lockb',\n]\n\n/**\n * Goes up the filesystem tree until it finds a lock file. (e.g. \"package-lock.json\", \"yarn.lock\", etc.)\n *\n * @param readdir This is only a parameter so that it can be used in tests.\n * @returns The path of the directory that contains the lockfile and the\n * filename of the lockfile.\n */\nexport default async function findLockfile(\n options: Pick<Options, 'cwd' | 'packageFile'>,\n readdir: (_path: string) => Promise<string[]> = fs.readdir,\n): Promise<{ directoryPath: string; filename: string } | null> {\n try {\n // Get boundaries to stop searching.\n const homeDir = os.homedir()\n const tempDir = os.tmpdir()\n\n // 1. explicit cwd\n // 2. same directory as package file\n // 3. current directory\n let currentPath = options.cwd ? options.cwd : options.packageFile ? path.dirname(options.packageFile) : '.'\n currentPath = path.resolve(currentPath)\n\n while (true) {\n const files = await readdir(currentPath)\n\n for (const filename of lockFileNames) {\n if (files.includes(filename)) {\n return { directoryPath: currentPath, filename }\n }\n }\n\n const pathParent = path.resolve(currentPath, '..')\n if (\n // Stop if we have reached the root of the file system.\n pathParent === currentPath ||\n // Stop if we have reached the root of a user's home directory.\n pathParent === homeDir ||\n // Stop if we have reached the root of the temporary directory.\n pathParent === tempDir\n ) {\n break\n }\n\n currentPath = pathParent\n }\n } catch (e) {\n // if readdirSync fails, return null\n }\n\n return null\n}\n","import fs from 'fs/promises'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { PackageManagerName } from '../types/PackageManagerName'\nimport findLockfile from './findLockfile'\n\n// map lockfiles to package managers\nconst packageManagerLockfileMap: Index<PackageManagerName> = {\n 'package-lock': 'npm',\n yarn: 'yarn',\n 'pnpm-lock': 'pnpm',\n deno: 'deno',\n bun: 'bun',\n}\n\n/**\n * Get the package manager being used to run the command.\n * When checking global packages, we need to do it this way since there is no\n * lockfile in the global directory.\n */\nconst getRunningPackageManager = (): PackageManagerName => {\n const userAgent = process.env.npm_config_user_agent ?? ''\n const execpath = process.env.npm_execpath ?? ''\n\n if (\n userAgent.startsWith('yarn/') ||\n execpath.includes('yarn') ||\n __dirname.includes('/yarn/') ||\n __dirname.includes('\\\\Yarn\\\\')\n )\n return 'yarn'\n if (\n userAgent.startsWith('pnpm/') ||\n execpath.includes('pnpm') ||\n __dirname.includes('/pnpm/') ||\n __dirname.includes('\\\\pnpm\\\\')\n )\n return 'pnpm'\n if (\n userAgent.startsWith('bun/') ||\n typeof Bun !== 'undefined' ||\n process.versions.bun ||\n __dirname.includes('/.bun/') ||\n __dirname.includes('\\\\.bun\\\\')\n )\n return 'bun'\n\n return 'npm'\n}\n\n/**\n * If the packageManager option was not provided, look at the lockfiles to\n * determine which package manager is being used.\n */\nconst determinePackageManager = async (\n options: Options,\n // only for testing\n readdir: (_path: string) => Promise<string[]> = fs.readdir,\n): Promise<PackageManagerName> => {\n if (options.packageManager) return options.packageManager\n else if (options.global) return getRunningPackageManager()\n\n const lockfileName = (await findLockfile(options, readdir))?.filename\n return lockfileName ? packageManagerLockfileMap[lockfileName.split('.')[0]] : 'npm'\n}\n\nexport default determinePackageManager\n","/* eslint-disable */\n\n/*\n\nThis is stripped down version of the deprecated figgy-pudding. It is used by libnpmconfig, which is also deprecated and has been brought into the codebase to avoid deprecation warnings.\n\nhttps://github.com/npm/figgy-pudding\n\n*/\n\nclass FiggyPudding {\n constructor(specs, opts, providers) {\n this.__specs = specs || {}\n this.__opts = opts || {}\n this.__providers = reverse(providers.filter(x => x != null && typeof x === 'object'))\n this.__isFiggyPudding = true\n }\n get(key) {\n return pudGet(this, key, true)\n }\n toJSON() {\n const obj = {}\n this.forEach((val, key) => {\n obj[key] = val\n })\n return obj\n }\n forEach(fn, thisArg = this) {\n for (let [key, value] of this.entries()) {\n fn.call(thisArg, value, key, this)\n }\n }\n *entries(_matcher) {\n for (let key of Object.keys(this.__specs)) {\n yield [key, this.get(key)]\n }\n const matcher = _matcher || this.__opts.other\n if (matcher) {\n const seen = new Set()\n for (let p of this.__providers) {\n const iter = p.entries ? p.entries(matcher) : entries(p)\n for (let [key, val] of iter) {\n if (matcher(key) && !seen.has(key)) {\n seen.add(key)\n yield [key, val]\n }\n }\n }\n }\n }\n concat(...moreConfig) {\n return new Proxy(\n new FiggyPudding(this.__specs, this.__opts, reverse(this.__providers).concat(moreConfig)),\n proxyHandler,\n )\n }\n}\n\nfunction pudGet(pud, key, validate) {\n let spec = pud.__specs[key]\n if (!spec) {\n spec = {}\n }\n let ret\n for (let p of pud.__providers) {\n ret = tryGet(key, p)\n if (ret !== undefined) {\n break\n }\n }\n if (ret === undefined && spec.default !== undefined) {\n if (typeof spec.default === 'function') {\n return spec.default(pud)\n } else {\n return spec.default\n }\n } else {\n return ret\n }\n}\n\nfunction tryGet(key, p) {\n let ret\n if (p.__isFiggyPudding) {\n ret = pudGet(p, key, false)\n } else {\n ret = p[key]\n }\n return ret\n}\n\nconst proxyHandler = {\n get(obj, prop) {\n if (typeof prop === 'symbol' || prop.slice(0, 2) === '__' || prop in FiggyPudding.prototype) {\n return obj[prop]\n }\n return obj.get(prop)\n },\n}\n\nexport default function figgyPudding(specs, opts) {\n function factory(...providers) {\n return new Proxy(new FiggyPudding(specs, opts, providers), proxyHandler)\n }\n return factory\n}\n\nfunction reverse(arr) {\n const ret = []\n arr.forEach(x => ret.unshift(x))\n return ret\n}\n\nfunction entries(obj) {\n return Object.keys(obj).map(k => [k, obj[k]])\n}\n","/*\n\nThis is a copy of the deprecated libnpmconfig library. It has been brought into the codebase to avoid deprecation warnings.\n\nhttps://github.com/npm/libnpmconfig\n\n*/\nimport { findUpSync } from 'find-up'\nimport ini from 'ini'\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport figgyPudding from '../figgy-pudding'\n\nconst NpmConfig = figgyPudding(\n {},\n {\n // Open up the pudding object.\n other() {\n return true\n },\n },\n)\n\nconst ConfigOpts = figgyPudding({\n cache: { default: path.join(process.env.HOME || os.homedir(), '.npm') },\n configNames: { default: ['npmrc', '.npmrc'] },\n envPrefix: { default: /^npm_config_/i },\n cwd: { default: () => process.cwd() },\n globalconfig: {\n default: () => path.join(getGlobalPrefix(), 'etc', 'npmrc'),\n },\n userconfig: { default: path.join(process.env.HOME || os.homedir(), '.npmrc') },\n})\n\n/** Gets the npm config. */\nfunction getNpmConfig(_opts, _builtin) {\n const builtin = ConfigOpts(_builtin)\n const env = {}\n Object.keys(process.env).forEach(key => {\n if (!key.match(builtin.envPrefix)) return\n const newKey = key\n .toLowerCase()\n .replace(builtin.envPrefix, '')\n .replace(/(?!^)_/g, '-')\n env[newKey] = process.env[key]\n })\n const cli = NpmConfig(_opts)\n const userConfPath = builtin.userconfig || cli.userconfig || env.userconfig\n const user = userConfPath && maybeReadIni(userConfPath)\n const globalConfPath = builtin.globalconfig || cli.globalconfig || env.globalconfig\n const global = globalConfPath && maybeReadIni(globalConfPath)\n const projConfPath = findUpSync(builtin.configNames, { cwd: builtin.cwd })\n let proj = {}\n if (projConfPath && projConfPath !== userConfPath) {\n proj = maybeReadIni(projConfPath)\n }\n const newOpts = NpmConfig(builtin, global, user, proj, env, cli)\n if (newOpts.cache) {\n return newOpts.concat({\n cache: path.resolve(\n cli.cache || env.cache\n ? builtin.cwd\n : proj.cache\n ? path.dirname(projConfPath)\n : user.cache\n ? path.dirname(userConfPath)\n : global.cache\n ? path.dirname(globalConfPath)\n : path.dirname(userConfPath),\n newOpts.cache,\n ),\n })\n } else {\n return newOpts\n }\n}\n\n/** Try to read the given ini file. */\nfunction maybeReadIni(f) {\n let txt\n try {\n txt = fs.readFileSync(f, 'utf8')\n } catch (err) {\n if (err.code === 'ENOENT') {\n return ''\n } else {\n throw err\n }\n }\n return ini.parse(txt)\n}\n\n/** Get the global node PREFIX. */\nfunction getGlobalPrefix() {\n if (process.env.PREFIX) {\n return process.env.PREFIX\n } else if (process.platform === 'win32') {\n // c:\\node\\node.exe --> prefix=c:\\node\\\n return path.dirname(process.execPath)\n } else {\n // /usr/local/bin/node --> prefix=/usr/local\n let pref = path.dirname(path.dirname(process.execPath))\n // destdir only is respected on Unix\n if (process.env.DESTDIR) {\n pref = path.join(process.env.DESTDIR, pref)\n }\n return pref\n }\n}\n\nexport default getNpmConfig\n","import semver from 'semver'\nimport * as versionUtil from '../lib/version-util'\nimport { CooldownFunction } from '../types/CooldownFunction'\nimport { Index } from '../types/IndexType'\nimport { Maybe } from '../types/Maybe'\nimport { Options } from '../types/Options'\nimport { Packument } from '../types/Packument'\nimport { Version } from '../types/Version'\n\n/**\n * @param versionResult Available version\n * @param options Options\n * @returns True if deprecated versions are allowed or the version is not deprecated\n */\nexport function allowDeprecatedOrIsNotDeprecated(versionResult: Partial<Packument>, options: Options): boolean {\n return options.deprecated || !versionResult.deprecated\n}\n\n/**\n * @param versionResult Available version\n * @param options Options\n * @returns True if pre-releases are allowed or the version is not a pre-release\n */\nexport function allowPreOrIsNotPre(versionResult: Partial<Packument>, options: Options): boolean {\n if (options.pre) return true\n return !versionResult.version || !versionUtil.isPre(versionResult.version)\n}\n\n/**\n * Returns true if the node engine requirement is satisfied or not specified for a given package version.\n *\n * @param versionResult Version object returned by packument.\n * @param nodeEngineVersion The value of engines.node in the package file.\n * @returns True if the node engine requirement is satisfied or not specified.\n */\nexport function satisfiesNodeEngine(versionResult: Partial<Packument>, nodeEngineVersion: Maybe<string>): boolean {\n if (!nodeEngineVersion) return true\n const minVersion = semver.minVersion(nodeEngineVersion)?.version\n if (!minVersion) return true\n const versionNodeEngine: string | undefined = versionResult?.engines?.node\n return !versionNodeEngine || semver.satisfies(minVersion, versionNodeEngine)\n}\n\n/**\n * Returns true if the peer dependencies requirement is satisfied or not specified for a given package version.\n *\n * @param versionResult Version object returned by packument.\n * @param peerDependencies The list of peer dependencies.\n * @returns True if the peer dependencies are satisfied or not specified.\n */\nexport function satisfiesPeerDependencies(versionResult: Partial<Packument>, peerDependencies: Index<Index<Version>>) {\n if (!peerDependencies) return true\n return Object.values(peerDependencies).every(\n peers =>\n peers[versionResult.name!] === undefined || semver.satisfies(versionResult.version!, peers[versionResult.name!]),\n )\n}\n\n/**\n * Determines if a package version satisfies the specified cooldown period.\n *\n * @param versionResult - Partial packument object containing version and release time information.\n * @param cooldownDays - The cooldown period in days. If not specified or invalid, the function returns true.\n * @returns `true` if the version's release date is older than the cooldown period; otherwise, `false`.\n */\nexport function satisfiesCooldownPeriod(\n versionResult: Partial<Packument>,\n cooldownDaysOrPredicateFn: Maybe<number> | Maybe<CooldownFunction>,\n): boolean {\n const version = versionResult.version\n const versionTimeData = versionResult?.time?.[version!]\n\n if (!cooldownDaysOrPredicateFn) return true\n if (!versionTimeData) return false\n\n const versionReleaseDate = new Date(versionTimeData)\n const DAY_AS_MS = 86400000 // milliseconds in a day\n const cooldownDays =\n typeof cooldownDaysOrPredicateFn === 'function'\n ? (cooldownDaysOrPredicateFn(versionResult.name!) ?? 0) // 0 days = no cooldown\n : cooldownDaysOrPredicateFn\n\n return Date.now() - versionReleaseDate.getTime() >= cooldownDays * DAY_AS_MS\n}\n\n/** Returns a composite predicate that filters out deprecated, prerelease, and node engine incompatibilities from version objects returns by packument. */\nexport function filterPredicate(options: Options) {\n const predicates: (((o: Partial<Packument>) => boolean) | null)[] = [\n o => allowDeprecatedOrIsNotDeprecated(o, options),\n o => allowPreOrIsNotPre(o, options),\n options.enginesNode ? o => satisfiesNodeEngine(o, options.nodeEngineVersion) : null,\n options.peerDependencies ? o => satisfiesPeerDependencies(o, options.peerDependencies!) : null,\n options.cooldown ? o => satisfiesCooldownPeriod(o, options.cooldown) : null,\n ]\n\n return (o: Partial<Packument>) => predicates.every(predicate => (predicate ? predicate(o) : true))\n}\n","import camelCase from 'camelcase'\nimport memoize from 'fast-memoize'\nimport fs from 'fs'\nimport ini from 'ini'\nimport npmRegistryFetch from 'npm-registry-fetch'\nimport path from 'path'\nimport nodeSemver from 'semver'\nimport { parseRange } from 'semver-utils'\nimport spawn from 'spawn-please'\nimport untildify from 'untildify'\nimport pkg from '../../package.json'\nimport filterObject from '../lib/filterObject'\nimport { keyValueBy } from '../lib/keyValueBy'\nimport libnpmconfig from '../lib/libnpmconfig'\nimport { print, printSorted } from '../lib/logging'\nimport { sortBy } from '../lib/sortBy'\nimport * as versionUtil from '../lib/version-util'\nimport { GetVersion } from '../types/GetVersion'\nimport { Index } from '../types/IndexType'\nimport { MockedVersions } from '../types/MockedVersions'\nimport { NpmConfig } from '../types/NpmConfig'\nimport { NpmOptions } from '../types/NpmOptions'\nimport { Options } from '../types/Options'\nimport { Packument } from '../types/Packument'\nimport { SpawnOptions } from '../types/SpawnOptions'\nimport { SpawnPleaseOptions } from '../types/SpawnPleaseOptions'\nimport { Version } from '../types/Version'\nimport { VersionResult } from '../types/VersionResult'\nimport { VersionSpec } from '../types/VersionSpec'\nimport { filterPredicate, satisfiesCooldownPeriod, satisfiesNodeEngine } from './filters'\n\nconst EXPLICIT_RANGE_OPS = new Set(['-', '||', '&&', '<', '<=', '>', '>='])\n\n/** Returns true if the spec is an explicit version range (not ~ or ^). */\nconst isExplicitRange = (spec: VersionSpec) => {\n const range = parseRange(spec)\n return range.some(parsed => EXPLICIT_RANGE_OPS.has(parsed.operator || ''))\n}\n\n/** Returns true if the version is sa valid, exact version. */\nconst isExactVersion = (version: Version) =>\n version && (!nodeSemver.validRange(version) || versionUtil.isWildCard(version))\n\n/** Fetches a packument or dist-tag from the npm registry. */\nconst fetchPartialPackument = async (\n name: string,\n fields: (keyof Packument)[],\n tag: string | null,\n opts: npmRegistryFetch.FetchOptions = {},\n version?: Version,\n): Promise<Partial<Packument>> => {\n const corgiDoc = 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*'\n const fullDoc = 'application/json'\n\n const registry = npmRegistryFetch.pickRegistry(name, opts)\n const headers = {\n 'user-agent': opts.userAgent || `npm-check-updates/${pkg.version} node/${process.version}`,\n 'ncu-version': pkg.version,\n 'ncu-pkg-id': `registry:${name}`,\n accept: opts.fullMetadata ? fullDoc : corgiDoc,\n ...opts.headers,\n }\n const url = new URL(\n // since the registry API expects /package or /package/version encoding\n // scoped packages is needed as to not treat the package scope as the full\n // package name and the actual package name as the version/dist-tag\n encodeURIComponent(name),\n // the WhatWG URL standard, when given a base URL to place the first\n // parameter relative to, will find the dirname of the base, treating the\n // last segment as a file name and not a directory name if it isn't\n // terminated by a / and thus remove it before adding the first argument\n // to the URL.\n // this is undesirable for registries configured without a trailing slash\n // in the npm config since, for example looking up the package @foo/bar\n // will give the following results given these configured registry URL:s\n // https://example.com/npm => https://example.com/%40foo%2fbar\n // https://example.com/npm/ => https://example.com/npm/%40foo%2fbar\n // however, like npm itself does there should be leniency allowed in this.\n registry.endsWith('/') ? registry : `${registry}/`,\n )\n if (version) {\n url.pathname += `/${version}`\n }\n const fetchOptions = {\n ...opts,\n headers,\n spec: name,\n }\n\n try {\n if (opts.fullMetadata) {\n return npmRegistryFetch.json(url.href, fetchOptions)\n } else {\n tag = tag || 'latest'\n // typescript does not type async iterable stream correctly so we need to cast it\n const stream = npmRegistryFetch.json.stream(url.href, '$*', fetchOptions) as unknown as IterableIterator<{\n key: keyof Packument\n value: Packument[keyof Packument]\n }>\n\n const partialPackument: Partial<Packument> = { name }\n\n for await (const { key, value } of stream) {\n if (fields.includes(key)) {\n // TODO: Fix type\n partialPackument[key] = value as any\n if (Object.keys(partialPackument).length === fields.length + 1) {\n break\n }\n }\n }\n\n return partialPackument\n }\n } catch (err: any) {\n if (err.code !== 'E404' || opts.fullMetadata) {\n throw err\n }\n\n // possible that corgis are not supported by this registry\n return fetchPartialPackument(name, fields, tag, { ...opts, fullMetadata: true }, version)\n }\n}\n\n/**\n * Decorates a tag-specific/version-specific packument object with the package name and `time` property from the full packument,\n * if the `time` information for the tag's version exists.\n *\n * @param tagPackument - A partial packument object representing a specific tag/version.\n * @param packument - The full packument object, potentially containing time metadata for versions.\n * @returns A new packument object that includes the `time` property if available for the tag's version and package name.\n */\nconst decorateTagPackumentWithTimeAndName = (\n tagPackument: Partial<Packument>,\n packument: Partial<Packument>,\n): Partial<Packument> => {\n const version = tagPackument.version\n\n return {\n ...tagPackument,\n name: packument.name,\n ...(packument?.time?.[version!] ? { time: packument.time } : null),\n }\n}\n\n/** Normalizes the keys of an npm config for pacote. */\nexport const normalizeNpmConfig = (\n npmConfig: NpmConfig,\n // config path used to determine relative cafile paths\n configPath?: string,\n): NpmConfig => {\n const npmConfigToPacoteMap = {\n cafile: (capath: string): undefined | { ca: string[] } => {\n // load-cafile, based on github.com/npm/cli/blob/40c1b0f/lib/config/load-cafile.js\n if (!capath) return\n // synchronous since it is loaded once on startup, and to avoid complexity in libnpmconfig\n // https://github.com/raineorshine/npm-check-updates/issues/636?notification_referrer_id=MDE4Ok5vdGlmaWNhdGlvblRocmVhZDc0Njk2NjAzMjo3NTAyNzY%3D\n const cadata = fs.readFileSync(path.resolve(configPath || '', untildify(capath)), 'utf8')\n const delim = '-----END CERTIFICATE-----'\n const output: string[] = cadata\n .split(delim)\n .filter(xs => !!xs.trim())\n .map(xs => `${xs.trimStart()}${delim}`)\n return { ca: output }\n },\n maxsockets: 'maxSockets',\n 'strict-ssl': 'strictSSL',\n }\n\n // all config variables are read in as strings, so we need to type coerce non-strings\n // lowercased and hyphens removed for comparison purposes\n const keyTypes: Index<'boolean' | 'number'> = {\n all: 'boolean',\n allowsameversion: 'boolean',\n audit: 'boolean',\n binlinks: 'boolean',\n color: 'boolean',\n commithooks: 'boolean',\n description: 'boolean',\n dev: 'boolean',\n diffignoreallspace: 'boolean',\n diffnameonly: 'boolean',\n diffnoprefix: 'boolean',\n difftext: 'boolean',\n dryrun: 'boolean',\n enginestrict: 'boolean',\n force: 'boolean',\n foregroundscripts: 'boolean',\n formatpackagelock: 'boolean',\n fund: 'boolean',\n gittagversion: 'boolean',\n global: 'boolean',\n globalstyle: 'boolean',\n ifpresent: 'boolean',\n ignorescripts: 'boolean',\n includestaged: 'boolean',\n includeworkspaceroot: 'boolean',\n installlinks: 'boolean',\n json: 'boolean',\n legacybundling: 'boolean',\n legacypeerdeps: 'boolean',\n link: 'boolean',\n long: 'boolean',\n offline: 'boolean',\n omitlockfileregistryresolved: 'boolean',\n packagelock: 'boolean',\n packagelockonly: 'boolean',\n parseable: 'boolean',\n preferoffline: 'boolean',\n preferonline: 'boolean',\n progress: 'boolean',\n readonly: 'boolean',\n rebuildbundle: 'boolean',\n save: 'boolean',\n savebundle: 'boolean',\n savedev: 'boolean',\n saveexact: 'boolean',\n saveoptional: 'boolean',\n savepeer: 'boolean',\n saveprod: 'boolean',\n shrinkwrap: 'boolean',\n signgitcommit: 'boolean',\n signgittag: 'boolean',\n strictpeerdeps: 'boolean',\n strictssl: 'boolean',\n timing: 'boolean',\n unicode: 'boolean',\n updatenotifier: 'boolean',\n usage: 'boolean',\n version: 'boolean',\n versions: 'boolean',\n workspacesupdate: 'boolean',\n diffunified: 'number',\n fetchretries: 'number',\n fetchretryfactor: 'number',\n fetchretrymaxtimeout: 'number',\n fetchretrymintimeout: 'number',\n fetchtimeout: 'number',\n logsmax: 'number',\n maxsockets: 'number',\n searchlimit: 'number',\n searchstaleness: 'number',\n ssopollfrequency: 'number',\n timeout: 'number',\n }\n\n /** Parses a string to a boolean. */\n const stringToBoolean = (s: string): boolean => !!s && s !== 'false' && s !== '0'\n\n /** Parses a string to a number. */\n const stringToNumber = (s: string): number => parseInt(s) || 0\n\n // needed until pacote supports full npm config compatibility\n // See: https://github.com/zkat/pacote/issues/156\n const config: NpmConfig = keyValueBy(npmConfig, (key: string, value: NpmConfig[keyof NpmConfig]) => {\n // replace env ${VARS} in strings with the process.env value\n const normalizedValue =\n typeof value !== 'string'\n ? value\n : // parse stringified booleans\n keyTypes[key.replace(/-/g, '').toLowerCase()] === 'boolean'\n ? stringToBoolean(value)\n : keyTypes[key.replace(/-/g, '').toLowerCase()] === 'number'\n ? stringToNumber(value)\n : value.replace(/\\${([^}]+)}/, (_, envVar) => process.env[envVar] as string)\n\n // normalize the key for pacote\n const { [key]: pacoteKey }: Index<NpmConfig[keyof NpmConfig]> = npmConfigToPacoteMap\n\n return typeof pacoteKey === 'string'\n ? // key is mapped to a string\n { [pacoteKey]: normalizedValue }\n : // key is mapped to a function\n typeof pacoteKey === 'function'\n ? { ...(pacoteKey(normalizedValue.toString()) as any) }\n : // otherwise assign the camel-cased key\n { [key.match(/^[a-z]/i) ? camelCase(key) : key]: normalizedValue }\n })\n\n return config\n}\n\n/** Finds and parses the npm config at the given path. If the path does not exist, returns null. If no path is provided, finds and merges the global and user npm configs using libnpmconfig and sets cache: false. */\nconst findNpmConfig = memoize((configPath?: string): NpmConfig | null => {\n let config\n\n if (configPath) {\n try {\n config = ini.parse(fs.readFileSync(configPath, 'utf-8'))\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return null\n } else {\n throw err\n }\n }\n } else {\n // libnpmconfig incorrectly (?) ignores NPM_CONFIG_USERCONFIG because it is always overridden by the default builtin.userconfig\n // set userconfig manually so that it is prioritized\n const opts = libnpmconfig(null, {\n userconfig: process.env.npm_config_userconfig || process.env.NPM_CONFIG_USERCONFIG,\n })\n config = {\n ...opts.toJSON(),\n cache: false,\n }\n }\n\n return normalizeNpmConfig(config, configPath)\n})\n\n// get the base config that is used for all npm queries\n// this may be partially overwritten by .npmrc config files when using --deep\nconst npmConfig = findNpmConfig()\n\n/**\n * Parse JSON and throw an informative error on failure.\n *\n * @param result Data to be parsed\n * @param data\n * @returns\n */\nexport function parseJson<R>(result: string, data: { command?: string; packageName?: string }): R {\n let json\n try {\n json = JSON.parse(result)\n } catch (err) {\n throw new Error(\n `Expected JSON from \"${data.command}\".${\n data.packageName ? ` There could be problems with the ${data.packageName} package.` : ''\n } ${result ? 'Instead received: ' + result : 'Received empty response.'}`,\n )\n }\n return json as R\n}\n\n/**\n * Check if package author changed between current and upgraded version.\n *\n * @param packageName Name of the package\n * @param currentVersion Current version declaration (may be range)\n * @param upgradedVersion Upgraded version declaration (may be range)\n * @param npmConfigLocal Additional npm config variables that are merged into the system npm config\n * @returns A promise that fulfills with boolean value.\n */\nexport async function packageAuthorChanged(\n packageName: string,\n currentVersion: VersionSpec,\n upgradedVersion: VersionSpec,\n options: Options = {},\n npmConfigLocal?: NpmConfig,\n): Promise<boolean> {\n const result = await fetchPartialPackument(packageName, ['versions'], null, {\n ...npmConfigLocal,\n ...npmConfig,\n fullMetadata: true,\n ...(options.registry ? { registry: options.registry, silent: true } : null),\n })\n if (result.versions) {\n const pkgVersions = Object.keys(result.versions)\n const current = nodeSemver.minSatisfying(pkgVersions, currentVersion)\n const upgraded = nodeSemver.maxSatisfying(pkgVersions, upgradedVersion)\n if (current && upgraded && result.versions[current]._npmUser && result.versions[upgraded]._npmUser) {\n const currentAuthor = result.versions[current]._npmUser?.name\n const latestAuthor = result.versions[upgraded]._npmUser?.name\n return currentAuthor !== latestAuthor\n }\n }\n\n return false\n}\n\n/** Returns true if an object is a Packument. */\nconst isPackument = (o: any): o is Partial<Packument> => !!(o && (o.name || o.engines || o.version || o.versions))\n\n/** Creates a function with the same signature as fetchUpgradedPackument that always returns the given versions. */\nexport const mockFetchUpgradedPackument =\n (mockReturnedVersions: MockedVersions): typeof fetchUpgradedPackument =>\n (name: string, fields: (keyof Packument)[], currentVersion: Version, options: Options) => {\n // a partial Packument\n const partialPackument =\n typeof mockReturnedVersions === 'function'\n ? mockReturnedVersions(options)?.[name]\n : typeof mockReturnedVersions === 'string' || isPackument(mockReturnedVersions)\n ? mockReturnedVersions\n : mockReturnedVersions[name]\n\n const version = isPackument(partialPackument) ? partialPackument.version : partialPackument\n\n if (!version) {\n throw new Error(\n `fetchUpgradedPackument is mocked, but no mock version was supplied for ${name}. Make sure that all dependencies are mocked. `,\n )\n }\n\n const time = (isPackument(partialPackument) && partialPackument.time?.[version]) || new Date().toISOString()\n const packument: Packument = {\n name,\n 'dist-tags': {\n [options.distTag || 'latest']: version,\n },\n engines: { node: '' },\n time: {\n [version]: time,\n },\n version,\n // overwritten below\n versions: {},\n ...(isPackument(partialPackument) ? partialPackument : null),\n }\n\n const { versions: _, ...packumentWithoutVersions } = packument\n\n return Promise.resolve({\n ...packument,\n versions: {\n ...((isPackument(partialPackument) && partialPackument.versions) || {\n [version]: packumentWithoutVersions,\n }),\n },\n })\n }\n\n/** Merges the workspace, global, user, local, project, and cwd npm configs (in that order). */\n// Note that this is memoized on configs and options, but not on package name. This avoids duplicate messages when log level is verbose. findNpmConfig is memoized on config path, so it is not expensive to call multiple times.\nconst mergeNpmConfigs = memoize(\n (\n {\n npmConfigLocal,\n npmConfigUser,\n npmConfigWorkspaceProject,\n }: {\n npmConfigLocal?: NpmConfig\n npmConfigUser?: NpmConfig\n npmConfigWorkspaceProject?: NpmConfig\n },\n options: Options,\n ) => {\n // merge project npm config with base config\n const npmConfigProjectPath = options.packageFile ? path.join(options.packageFile, '../.npmrc') : null\n const npmConfigProject = options.packageFile ? findNpmConfig(npmConfigProjectPath || undefined) : null\n const npmConfigCWDPath = options.cwd ? path.join(options.cwd, '.npmrc') : null\n const npmConfigCWD = options.cwd ? findNpmConfig(npmConfigCWDPath!) : null\n\n if (npmConfigWorkspaceProject && Object.keys(npmConfigWorkspaceProject).length > 0) {\n print(options, `\\nnpm config (workspace project):`, 'verbose')\n const { cache: _, ...npmConfigWorkspaceProjectWithoutCache } = npmConfigWorkspaceProject\n printSorted(options, npmConfigWorkspaceProjectWithoutCache, 'verbose')\n }\n\n if (npmConfigUser && Object.keys(npmConfigUser).length > 0) {\n print(options, `\\nnpm config (user):`, 'verbose')\n const { cache: _, ...npmConfigUserWithoutCache } = npmConfigUser\n printSorted(options, npmConfigUserWithoutCache, 'verbose')\n }\n\n if (npmConfigLocal && Object.keys(npmConfigLocal).length > 0) {\n print(options, `\\nnpm config (local override):`, 'verbose')\n const { cache: _, ...npmConfigLocalWithoutCache } = npmConfigLocal\n printSorted(options, npmConfigLocalWithoutCache, 'verbose')\n }\n\n if (npmConfigProject && Object.keys(npmConfigProject).length > 0) {\n print(options, `\\nnpm config (project: ${npmConfigProjectPath}):`, 'verbose')\n const { cache: _, ...npmConfigProjectWithoutCache } = npmConfigProject\n printSorted(options, npmConfigProjectWithoutCache, 'verbose')\n }\n\n if (npmConfigCWD && Object.keys(npmConfigCWD).length > 0) {\n print(options, `\\nnpm config (cwd: ${npmConfigCWDPath}):`, 'verbose')\n // omit cache since it is added to every config\n const { cache: _, ...npmConfigCWDWithoutCache } = npmConfigCWD\n printSorted(options, npmConfigCWDWithoutCache, 'verbose')\n }\n\n const npmConfigMerged = {\n ...npmConfigWorkspaceProject,\n ...npmConfigUser,\n ...npmConfigLocal,\n ...npmConfigProject,\n ...npmConfigCWD,\n ...(options.registry ? { registry: options.registry, silent: true } : null),\n ...(options.timeout ? { timeout: options.timeout } : null),\n }\n\n const isMerged = npmConfigWorkspaceProject || npmConfigLocal || npmConfigProject || npmConfigCWD\n if (isMerged) {\n print(options, `\\nmerged npm config:`, 'verbose')\n // omit cache since it is added to every config\n // @ts-expect-error -- though not typed, but the \"cache\" property does exist on the object and needs to be omitted\n const { cache: _, ...npmConfigMergedWithoutCache } = npmConfigMerged\n printSorted(options, npmConfigMergedWithoutCache, 'verbose')\n }\n\n return npmConfigMerged\n },\n)\n\n/**\n * Returns an object of specified values retrieved by npm view.\n *\n * @param packageName Name of the package\n * @param fields Array of fields like versions, time, version\n * @param currentVersion\n * @returns dist-tags field return Index<Packument>, time field returns Index<Index<string>>>, versions field returns Index<Index<Packument>>\n */\nasync function fetchUpgradedPackument(\n packageName: string,\n fields: (keyof Packument)[],\n currentVersion: Version,\n options: Options,\n retried = 0,\n npmConfigLocal?: NpmConfig,\n npmConfigWorkspaceProject?: NpmConfig,\n): Promise<Partial<Packument> | undefined> {\n // See: /test/helpers/stubVersions\n if (process.env.STUB_VERSIONS) {\n const mockReturnedVersions = JSON.parse(process.env.STUB_VERSIONS)\n return mockFetchUpgradedPackument(mockReturnedVersions)(packageName, fields, currentVersion, options)\n }\n\n if (isExactVersion(currentVersion)) {\n return Promise.resolve({} as Index<Packument>)\n }\n\n // fields may already include time\n const fieldsExtended =\n options.format?.includes('time') && !fields.includes('time') ? ([...fields, 'time'] as (keyof Packument)[]) : fields\n const fullMetadata = fieldsExtended.includes('time')\n\n const npmConfigMerged = mergeNpmConfigs(\n {\n npmConfigUser: { ...npmConfig, fullMetadata },\n npmConfigLocal,\n npmConfigWorkspaceProject,\n },\n options,\n )\n\n let result: Partial<Packument> | undefined\n try {\n const tag = options.distTag || 'latest'\n result = await fetchPartialPackument(\n packageName,\n Array.from(\n new Set([\n 'dist-tags',\n ...fields,\n ...(!options.deprecated ? (['deprecated', 'versions'] as const) : []),\n ...(options.enginesNode ? (['engines', 'versions'] as const) : []),\n ]),\n ),\n fullMetadata ? null : tag,\n npmConfigMerged,\n )\n } catch (err: any) {\n if (options.retry && ++retried <= options.retry) {\n return fetchUpgradedPackument(packageName, fieldsExtended, currentVersion, options, retried, npmConfigLocal)\n }\n\n throw err\n }\n\n return result\n}\n\n/** Memoize fetchUpgradedPackument for --deep and --workspaces performance. */\n// must be exported to stub\nexport const fetchUpgradedPackumentMemo = memoize(fetchUpgradedPackument, {\n // serializer args are incorrectly typed as any[] instead of being generic, so we need to cast it\n serializer: (([\n packageName,\n fields,\n currentVersion,\n options,\n retried,\n npmConfigLocal,\n npmConfigWorkspaceProject,\n ]: Parameters<typeof fetchUpgradedPackument>) => {\n // packageFile varies by cwd in workspaces/deep mode, so we do not want to memoize on that\n const { packageFile: _, ...optionsWithoutPackageFile } = options\n return JSON.stringify([\n packageName,\n fields,\n // currentVersion does not change the behavior of fetchUpgradedPackument unless it is an invalid/inexact version which causes it to short circuit\n isExactVersion(currentVersion),\n optionsWithoutPackageFile,\n // make sure retries do not get memoized\n retried,\n npmConfigLocal,\n npmConfigWorkspaceProject,\n ])\n }) as (args: any[]) => string,\n})\n\n/**\n * Spawns npm with --json. Handles different commands for Window and Linux/OSX.\n *\n * @param args\n * @param [npmOptions={}]\n * @param [spawnOptions={}]\n * @returns\n */\nasync function spawnNpm(\n args: string | string[],\n npmOptions: NpmOptions = {},\n spawnPleaseOptions: SpawnPleaseOptions = {},\n spawnOptions: Index<any> = {},\n): Promise<any> {\n const cmd = process.platform === 'win32' ? 'npm.cmd' : 'npm'\n\n const fullArgs = [\n ...(npmOptions.global ? [`--global`] : []),\n ...(npmOptions.prefix ? [`--prefix=${npmOptions.prefix}`] : []),\n '--json',\n ...(Array.isArray(args) ? args : [args]),\n ]\n const { stdout } = await spawn(cmd, fullArgs, spawnPleaseOptions, spawnOptions)\n return stdout\n}\n\n/**\n * Get platform-specific default prefix to pass on to npm.\n *\n * @param options\n * @param [options.global]\n * @param [options.prefix]\n * @returns\n */\nexport async function defaultPrefix(options: Options): Promise<string | undefined> {\n if (options.prefix) {\n return Promise.resolve(options.prefix)\n }\n\n const cmd = process.platform === 'win32' ? 'npm.cmd' : 'npm'\n\n let prefix: string | undefined\n\n // catch spawn error which can occur on Windows\n // https://github.com/raineorshine/npm-check-updates/issues/703\n try {\n const { stdout } = await spawn(cmd, ['config', 'get', 'prefix'])\n prefix = stdout\n } catch (e: any) {\n const message = (e.message || e || '').toString()\n print(\n options,\n 'Error executing `npm config get prefix`. Caught and ignored. Unsolved: https://github.com/raineorshine/npm-check-updates/issues/703. ERROR: ' +\n message,\n 'verbose',\n 'error',\n )\n }\n\n // FIX: for ncu -g doesn't work on homebrew or windows #146\n // https://github.com/raineorshine/npm-check-updates/issues/146\n return options.global && prefix?.match('Cellar')\n ? '/usr/local'\n : // Workaround: get prefix on windows for global packages\n // Only needed when using npm api directly\n process.platform === 'win32' && options.global && !process.env.prefix\n ? prefix\n ? prefix.trim()\n : `${process.env.AppData}\\\\npm`\n : undefined\n}\n\n/**\n * Fetches the highest version number, regardless of tag or publish time.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns\n */\nexport const greatest: GetVersion = async (\n packageName,\n currentVersion,\n options = {},\n npmConfig?: NpmConfig,\n npmConfigProject?: NpmConfig,\n): Promise<VersionResult> => {\n const fields: (keyof Packument)[] = ['versions']\n\n if (options.cooldown) {\n fields.push('time')\n }\n\n const packument = await fetchUpgradedPackumentMemo(\n packageName,\n fields,\n currentVersion,\n options,\n 0,\n npmConfig,\n npmConfigProject,\n )\n\n // known type based on 'versions'\n const versions = packument?.versions\n\n return {\n version:\n Object.values(versions || {})\n .filter(tagPackument =>\n filterPredicate(options)(decorateTagPackumentWithTimeAndName(tagPackument, packument as Partial<Packument>)),\n )\n .map(o => o.version)\n .sort(versionUtil.compareVersions)\n .at(-1) || null,\n }\n}\n\n/**\n * Fetches the list of peer dependencies for a specific package version.\n *\n * @param packageName\n * @param version\n * @param spawnOptions\n * @returns Promised {packageName: version} collection\n */\nexport const getPeerDependencies = async (\n packageName: string,\n version: Version,\n spawnOptions: SpawnOptions,\n): Promise<Index<Version>> => {\n const args = ['view', `${packageName}@${version}`, 'peerDependencies']\n const result = await spawnNpm(args, {}, { rejectOnError: false }, spawnOptions)\n return result ? parseJson(result, { command: [...args, '--json'].join(' ') }) : {}\n}\n\n/**\n * Fetches the engines list from the registry for a specific package version.\n *\n * @param packageName\n * @param version\n * @returns Promised engines collection\n */\nexport const getEngines = async (\n packageName: string,\n version: Version,\n options: Options = {},\n npmConfigLocal?: NpmConfig,\n): Promise<Index<VersionSpec | undefined>> => {\n const result = await fetchPartialPackument(\n packageName,\n [`engines`],\n null,\n {\n ...npmConfigLocal,\n ...npmConfig,\n ...(options.registry ? { registry: options.registry, silent: true } : null),\n },\n version,\n )\n return result.engines || {}\n}\n\n/**\n * Fetches the list of all installed packages.\n *\n * @param [options]\n * @param [options.cwd]\n * @param [options.global]\n * @param [options.prefix]\n * @returns\n */\nexport const list = async (options: Options = {}): Promise<Index<string | undefined>> => {\n const result = await spawnNpm(\n ['ls', '--depth=0'],\n {\n ...(options.global ? { global: true } : null),\n ...(options.prefix ? { prefix: options.prefix } : null),\n },\n {\n rejectOnError: false,\n },\n {\n ...(options.cwd ? { cwd: options.cwd } : null),\n },\n )\n const dependencies = parseJson<{\n dependencies: Index<{ version?: Version; required?: { version: Version } }>\n }>(result, {\n command: `npm${process.platform === 'win32' ? '.cmd' : ''} ls --json${options.global ? ' --global' : ''}`,\n }).dependencies\n\n return keyValueBy(dependencies, (name, info) => ({\n // unmet peer dependencies have a different structure\n [name]: info.version || info.required?.version,\n }))\n}\n\n/**\n * Fetches the version of a package published to options.distTag.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns\n */\nexport const distTag: GetVersion = async (\n packageName,\n currentVersion,\n options: Options = {},\n npmConfig?: NpmConfig,\n npmConfigProject?: NpmConfig,\n) => {\n const fields: (keyof Packument)[] = ['dist-tags']\n\n if (options.cooldown) {\n fields.push('time')\n }\n\n const packument = await fetchUpgradedPackumentMemo(\n packageName,\n fields,\n currentVersion,\n options,\n 0,\n npmConfig,\n npmConfigProject,\n )\n const version = packument?.['dist-tags']?.[options.distTag || 'latest']\n\n // if the packument does not contain versions, we need to add a minimal versions property with the upgraded version\n const tagPackument = packument?.versions\n ? packument.versions?.[version!]\n : {\n name: packageName,\n version,\n }\n\n const tagPackumentWithTime = decorateTagPackumentWithTimeAndName(tagPackument, packument as Partial<Packument>)\n\n // latest should not be deprecated\n // if latest exists and latest is not a prerelease version, return it\n // if latest exists and latest is a prerelease version and --pre is specified, return it\n // if latest exists and latest not satisfies min version of engines.node\n // if latest exists and cooldown is specified and latest is within cooldown period, return it\n if (tagPackument && filterPredicate(options)(tagPackumentWithTime)) {\n return {\n version: tagPackument.version,\n ...(packument?.time?.[version!] ? { time: packument.time[version!] } : null),\n }\n }\n\n // if version from dist-tag does not meet cooldown requirement skip finding other versions\n if (options.cooldown) {\n return {}\n }\n\n // If we use a custom dist-tag, we do not want to get other 'pre' versions, just the ones from this dist-tag\n if (options.distTag && options.distTag !== 'latest') return {}\n\n // if latest is a prerelease version and --pre is not specified\n // or latest is deprecated\n // find the next valid version\n return greatest(packageName, currentVersion, options, npmConfig, npmConfigProject)\n}\n\n/**\n * Fetches the version published to the latest tag.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns\n */\nexport const latest: GetVersion = async (\n packageName: string,\n currentVersion: Version,\n options: Options = {},\n npmConfig?: NpmConfig,\n npmConfigProject?: NpmConfig,\n) => distTag(packageName, currentVersion, { ...options, distTag: 'latest' }, npmConfig, npmConfigProject)\n\n/**\n * Fetches the most recently published version, regardless of version number.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns\n */\nexport const newest: GetVersion = async (\n packageName,\n currentVersion,\n options = {},\n npmConfig?: NpmConfig,\n npmConfigProject?: NpmConfig,\n): Promise<VersionResult> => {\n const result = await fetchUpgradedPackumentMemo(\n packageName,\n ['time', 'versions'],\n currentVersion,\n options,\n 0,\n npmConfig,\n npmConfigProject,\n )\n\n // Generate a map of versions that satisfy the node engine.\n // result.versions is an object but is parsed as an array, so manually convert it to an object.\n // Otherwise keyValueBy will pass the predicate arguments in the wrong order.\n const versionsSatisfyingNodeEngine = keyValueBy(\n result?.versions || {},\n (version: Version, packument: Packument['versions'][string]) =>\n satisfiesNodeEngine(packument, options.nodeEngineVersion) ? { [packument.version]: true } : null,\n )\n\n // filter out times that do not satisfy the node engine\n // filter out prereleases if pre:false (same as allowPreOrIsNotPre)\n const timesSatisfyingNodeEngine = filterObject(\n (result?.time || {}) as Index<string>,\n version => versionsSatisfyingNodeEngine[version] && (options.pre !== false || !versionUtil.isPre(version)),\n )\n\n // sort by timestamp (entry[1]) and map versions\n const versionsSortedByTime = sortBy(Object.entries(timesSatisfyingNodeEngine), v => v[1]).map(([version]) => version)\n\n if (options.cooldown) {\n const versionsSatisfyingCooldownPeriod = versionsSortedByTime.filter(version =>\n satisfiesCooldownPeriod(\n decorateTagPackumentWithTimeAndName((result as Packument).versions[version], result as Packument),\n options.cooldown,\n ),\n )\n\n return { version: versionsSatisfyingCooldownPeriod.at(-1) }\n }\n\n return { version: versionsSortedByTime.at(-1) }\n}\n\n/**\n * Fetches the highest version with the same major version as currentVersion.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns\n */\nexport const minor: GetVersion = async (\n packageName,\n currentVersion,\n options = {},\n npmConfig?: NpmConfig,\n npmConfigProject?: NpmConfig,\n): Promise<VersionResult> => {\n const fields: (keyof Packument)[] = ['versions']\n\n if (options.cooldown) {\n fields.push('time')\n }\n\n const packument = await fetchUpgradedPackumentMemo(\n packageName,\n fields,\n currentVersion,\n options,\n 0,\n npmConfig,\n npmConfigProject,\n )\n\n const versions = packument?.versions as Index<Packument>\n const version = versionUtil.findGreatestByLevel(\n Object.values(versions || {})\n .filter(tagPackument =>\n filterPredicate(options)(decorateTagPackumentWithTimeAndName(tagPackument, packument as Partial<Packument>)),\n )\n .map(o => o.version),\n currentVersion,\n 'minor',\n )\n return { version }\n}\n\n/**\n * Fetches the highest version with the same minor and major version as currentVersion.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns\n */\nexport const patch: GetVersion = async (\n packageName,\n currentVersion,\n options = {},\n npmConfig?: NpmConfig,\n npmConfigProject?: NpmConfig,\n): Promise<VersionResult> => {\n const fields: (keyof Packument)[] = ['versions']\n\n if (options.cooldown) {\n fields.push('time')\n }\n\n const packument = await fetchUpgradedPackumentMemo(\n packageName,\n fields,\n currentVersion,\n options,\n 0,\n npmConfig,\n npmConfigProject,\n )\n\n const versions = packument?.versions as Index<Packument>\n const version = versionUtil.findGreatestByLevel(\n Object.values(versions || {})\n .filter(tagPackument =>\n filterPredicate(options)(decorateTagPackumentWithTimeAndName(tagPackument, packument as Partial<Packument>)),\n )\n .map(o => o.version),\n currentVersion,\n 'patch',\n )\n return { version }\n}\n\n/**\n * Fetches the highest version that satisfies the semver range specified in the package.json.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns\n */\nexport const semver: GetVersion = async (\n packageName,\n currentVersion,\n options = {},\n npmConfig?: NpmConfig,\n npmConfigProject?: NpmConfig,\n): Promise<VersionResult> => {\n const fields: (keyof Packument)[] = ['versions']\n\n if (options.cooldown) {\n fields.push('time')\n }\n\n const packument = await fetchUpgradedPackumentMemo(\n packageName,\n fields,\n currentVersion,\n options,\n 0,\n npmConfig,\n npmConfigProject,\n )\n\n const versions = packument?.versions as Index<Packument>\n // ignore explicit version ranges\n if (isExplicitRange(currentVersion)) return { version: null }\n\n const versionsFiltered = Object.values(versions || {})\n .filter(tagPackument =>\n filterPredicate(options)(decorateTagPackumentWithTimeAndName(tagPackument, packument as Partial<Packument>)),\n )\n .map(o => o.version)\n // TODO: Upgrading within a prerelease does not seem to work.\n // { includePrerelease: true } does not help.\n const version = nodeSemver.maxSatisfying(versionsFiltered, currentVersion)\n return { version }\n}\n\nexport default spawnNpm\n","import path from 'path'\nimport spawn from 'spawn-please'\nimport keyValueBy from '../lib/keyValueBy'\nimport { Index } from '../types/IndexType'\nimport { NpmOptions } from '../types/NpmOptions'\nimport { Options } from '../types/Options'\nimport { SpawnPleaseOptions } from '../types/SpawnPleaseOptions'\n\n/** Spawn bun. */\nasync function spawnBun(\n args: string | string[],\n npmOptions: NpmOptions = {},\n spawnPleaseOptions: SpawnPleaseOptions = {},\n spawnOptions: Index<any> = {},\n): Promise<{ stdout: string; stderr: string }> {\n const fullArgs = [\n ...(npmOptions.global ? ['--global'] : []),\n ...(npmOptions.prefix ? [`--prefix=${npmOptions.prefix}`] : []),\n ...(Array.isArray(args) ? args : [args]),\n ]\n\n return spawn('bun', fullArgs, spawnPleaseOptions, spawnOptions)\n}\n\n/** Returns the global directory of bun. */\nexport const defaultPrefix = async (options: Options): Promise<string | undefined> =>\n options.global\n ? options.prefix || process.env.BUN_INSTALL || path.dirname((await spawn('bun', ['pm', '-g', 'bin'])).stdout)\n : undefined\n\n/**\n * (Bun) Fetches the list of all installed packages.\n */\nexport const list = async (options: Options = {}): Promise<Index<string | undefined>> => {\n const { default: stripAnsi } = await import('strip-ansi')\n\n // bun pm ls\n const { stdout } = await spawnBun(\n ['pm', 'ls'],\n {\n ...(options.global ? { global: true } : null),\n ...(options.prefix ? { prefix: options.prefix } : null),\n },\n {\n rejectOnError: false,\n },\n {\n env: {\n ...process.env,\n // Disable color to ensure the output is parsed correctly.\n // However, this may be ineffective in some environments (see stripAnsi below).\n // https://bun.sh/docs/runtime/configuration#environment-variables\n NO_COLOR: '1',\n },\n ...(options.cwd ? { cwd: options.cwd } : null),\n },\n )\n\n // Parse the output of `bun pm ls` into an object { [name]: version }.\n // When bun is spawned in the GitHub Actions environment, it outputs ANSI color. Unfortunately, it does not respect the `NO_COLOR` environment variable. Therefore, we have to manually strip ansi.\n const lines = stripAnsi(stdout).split('\\n')\n const dependencies = keyValueBy(lines, line => {\n // The capturing group for the package name requires a + quantifier; otherwise, namespaced packages like @angular/cli will not be captured correctly.\n const match = line.match(/.* (.+?)@(.+)/)\n if (match) {\n const [, name, version] = match\n return { [name]: version }\n }\n return null\n })\n\n return dependencies\n}\n\nexport {\n distTag,\n getEngines,\n getPeerDependencies,\n greatest,\n latest,\n minor,\n newest,\n packageAuthorChanged,\n patch,\n semver,\n} from './npm'\n\nexport default spawnBun\n","import memoize from 'fast-memoize'\nimport { findUp } from 'find-up'\nimport fs from 'fs/promises'\nimport ini from 'ini'\nimport path from 'path'\nimport spawn from 'spawn-please'\nimport keyValueBy from '../lib/keyValueBy'\nimport { print } from '../lib/logging'\nimport { GetVersion } from '../types/GetVersion'\nimport { Index } from '../types/IndexType'\nimport { NpmConfig } from '../types/NpmConfig'\nimport { NpmOptions } from '../types/NpmOptions'\nimport { Options } from '../types/Options'\nimport { SpawnOptions } from '../types/SpawnOptions'\nimport { SpawnPleaseOptions } from '../types/SpawnPleaseOptions'\nimport { Version } from '../types/Version'\nimport * as npm from './npm'\n\n// return type of pnpm ls --json\ntype PnpmList = {\n path: string\n private: boolean\n dependencies: Index<{\n from: string\n version: Version\n resolved: string\n }>\n}[]\n\n/** Reads the npmrc config file from the pnpm-workspace.yaml directory. */\nconst npmConfigFromPnpmWorkspace = memoize(async (options: Options): Promise<NpmConfig> => {\n const pnpmWorkspacePath = await findUp('pnpm-workspace.yaml')\n if (!pnpmWorkspacePath) return {}\n\n const pnpmWorkspaceDir = path.dirname(pnpmWorkspacePath)\n const pnpmWorkspaceConfigPath = path.join(pnpmWorkspaceDir, '.npmrc')\n\n let pnpmWorkspaceConfig\n try {\n pnpmWorkspaceConfig = await fs.readFile(pnpmWorkspaceConfigPath, 'utf-8')\n } catch (e) {\n return {}\n }\n\n print(options, `\\nUsing pnpm workspace config at ${pnpmWorkspaceConfigPath}:`, 'verbose')\n\n const config = npm.normalizeNpmConfig(ini.parse(pnpmWorkspaceConfig), pnpmWorkspaceDir)\n\n print(options, config, 'verbose')\n\n return config\n})\n\n/** Fetches the list of all installed packages. */\nexport const list = async (options: Options = {}): Promise<Index<string | undefined>> => {\n // use npm for local ls for completeness\n // this should never happen since list is only called in runGlobal -> getInstalledPackages\n if (!options.global) return npm.list(options)\n\n const cmd = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm'\n const { stdout } = await spawn(cmd, ['ls', '-g', '--json'])\n const result = JSON.parse(stdout) as PnpmList\n const list = keyValueBy(result[0].dependencies || {}, (name, { version }) => ({\n [name]: version,\n }))\n return list\n}\n\n/** Wraps a GetVersion function and passes the npmrc located next to the pnpm-workspace.yaml if it exists. */\nconst withNpmWorkspaceConfig =\n (getVersion: GetVersion): GetVersion =>\n async (packageName, currentVersion, options = {}) =>\n getVersion(packageName, currentVersion, options, {}, await npmConfigFromPnpmWorkspace(options))\n\nexport const distTag = withNpmWorkspaceConfig(npm.distTag)\nexport const greatest = withNpmWorkspaceConfig(npm.greatest)\nexport const latest = withNpmWorkspaceConfig(npm.latest)\nexport const minor = withNpmWorkspaceConfig(npm.minor)\nexport const newest = withNpmWorkspaceConfig(npm.newest)\nexport const patch = withNpmWorkspaceConfig(npm.patch)\nexport const semver = withNpmWorkspaceConfig(npm.semver)\n\n/**\n * Spawn pnpm.\n *\n * @param args\n * @param [npmOptions={}]\n * @param [spawnOptions={}]\n * @returns\n */\nasync function spawnPnpm(\n args: string | string[],\n npmOptions: NpmOptions = {},\n spawnOptions?: SpawnOptions,\n spawnPleaseOptions?: SpawnPleaseOptions,\n): Promise<string> {\n const cmd = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm'\n\n const fullArgs = [\n ...(npmOptions.global ? 'global' : []),\n ...(Array.isArray(args) ? args : [args]),\n ...(npmOptions.prefix ? `--prefix=${npmOptions.prefix}` : []),\n ]\n\n const { stdout } = await spawn(cmd, fullArgs, spawnPleaseOptions, spawnOptions)\n\n return stdout\n}\n\nexport { defaultPrefix, getPeerDependencies, getEngines, packageAuthorChanged } from './npm'\n\nexport default spawnPnpm\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var WeakMap = require('./_WeakMap');\n\n/** Used to store function metadata. */\nvar metaMap = WeakMap && new WeakMap;\n\nmodule.exports = metaMap;\n","var identity = require('./identity'),\n metaMap = require('./_metaMap');\n\n/**\n * The base implementation of `setData` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\nvar baseSetData = !metaMap ? identity : function(func, data) {\n metaMap.set(func, data);\n return func;\n};\n\nmodule.exports = baseSetData;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n","var baseCreate = require('./_baseCreate'),\n isObject = require('./isObject');\n\n/**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createCtor(Ctor) {\n return function() {\n // Use a `switch` statement to work with class constructors. See\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0: return new Ctor;\n case 1: return new Ctor(args[0]);\n case 2: return new Ctor(args[0], args[1]);\n case 3: return new Ctor(args[0], args[1], args[2]);\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return isObject(result) ? result : thisBinding;\n };\n}\n\nmodule.exports = createCtor;\n","var createCtor = require('./_createCtor'),\n root = require('./_root');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1;\n\n/**\n * Creates a function that wraps `func` to invoke it with the optional `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createBind(func, bitmask, thisArg) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, arguments);\n }\n return wrapper;\n}\n\nmodule.exports = createBind;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\nfunction composeArgs(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersLength = holders.length,\n leftIndex = -1,\n leftLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(leftLength + rangeLength),\n isUncurried = !isCurried;\n\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n }\n while (rangeLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n}\n\nmodule.exports = composeArgs;\n","/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\nfunction composeArgsRight(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersIndex = -1,\n holdersLength = holders.length,\n rightIndex = -1,\n rightLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(rangeLength + rightLength),\n isUncurried = !isCurried;\n\n while (++argsIndex < rangeLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n }\n return result;\n}\n\nmodule.exports = composeArgsRight;\n","/**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */\nfunction countHolders(array, placeholder) {\n var length = array.length,\n result = 0;\n\n while (length--) {\n if (array[length] === placeholder) {\n ++result;\n }\n }\n return result;\n}\n\nmodule.exports = countHolders;\n","/**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\nfunction baseLodash() {\n // No operation performed.\n}\n\nmodule.exports = baseLodash;\n","var baseCreate = require('./_baseCreate'),\n baseLodash = require('./_baseLodash');\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295;\n\n/**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\nfunction LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__dir__ = 1;\n this.__filtered__ = false;\n this.__iteratees__ = [];\n this.__takeCount__ = MAX_ARRAY_LENGTH;\n this.__views__ = [];\n}\n\n// Ensure `LazyWrapper` is an instance of `baseLodash`.\nLazyWrapper.prototype = baseCreate(baseLodash.prototype);\nLazyWrapper.prototype.constructor = LazyWrapper;\n\nmodule.exports = LazyWrapper;\n","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n","var metaMap = require('./_metaMap'),\n noop = require('./noop');\n\n/**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\nvar getData = !metaMap ? noop : function(func) {\n return metaMap.get(func);\n};\n\nmodule.exports = getData;\n","/** Used to lookup unminified function names. */\nvar realNames = {};\n\nmodule.exports = realNames;\n","var realNames = require('./_realNames');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\nfunction getFuncName(func) {\n var result = (func.name + ''),\n array = realNames[result],\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n}\n\nmodule.exports = getFuncName;\n","var baseCreate = require('./_baseCreate'),\n baseLodash = require('./_baseLodash');\n\n/**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\nfunction LodashWrapper(value, chainAll) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__chain__ = !!chainAll;\n this.__index__ = 0;\n this.__values__ = undefined;\n}\n\nLodashWrapper.prototype = baseCreate(baseLodash.prototype);\nLodashWrapper.prototype.constructor = LodashWrapper;\n\nmodule.exports = LodashWrapper;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nmodule.exports = copyArray;\n","var LazyWrapper = require('./_LazyWrapper'),\n LodashWrapper = require('./_LodashWrapper'),\n copyArray = require('./_copyArray');\n\n/**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\nfunction wrapperClone(wrapper) {\n if (wrapper instanceof LazyWrapper) {\n return wrapper.clone();\n }\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n result.__actions__ = copyArray(wrapper.__actions__);\n result.__index__ = wrapper.__index__;\n result.__values__ = wrapper.__values__;\n return result;\n}\n\nmodule.exports = wrapperClone;\n","var LazyWrapper = require('./_LazyWrapper'),\n LodashWrapper = require('./_LodashWrapper'),\n baseLodash = require('./_baseLodash'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike'),\n wrapperClone = require('./_wrapperClone');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\nfunction lodash(value) {\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n if (value instanceof LodashWrapper) {\n return value;\n }\n if (hasOwnProperty.call(value, '__wrapped__')) {\n return wrapperClone(value);\n }\n }\n return new LodashWrapper(value);\n}\n\n// Ensure wrappers are instances of `baseLodash`.\nlodash.prototype = baseLodash.prototype;\nlodash.prototype.constructor = lodash;\n\nmodule.exports = lodash;\n","var LazyWrapper = require('./_LazyWrapper'),\n getData = require('./_getData'),\n getFuncName = require('./_getFuncName'),\n lodash = require('./wrapperLodash');\n\n/**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n * else `false`.\n */\nfunction isLaziable(func) {\n var funcName = getFuncName(func),\n other = lodash[funcName];\n\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n return false;\n }\n if (func === other) {\n return true;\n }\n var data = getData(other);\n return !!data && func === data[0];\n}\n\nmodule.exports = isLaziable;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","var baseSetData = require('./_baseSetData'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity\n * function to avoid garbage collection pauses in V8. See\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\nvar setData = shortOut(baseSetData);\n\nmodule.exports = setData;\n","/** Used to match wrap detail comments. */\nvar reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n reSplitDetails = /,? & /;\n\n/**\n * Extracts wrapper details from the `source` body comment.\n *\n * @private\n * @param {string} source The source to inspect.\n * @returns {Array} Returns the wrapper details.\n */\nfunction getWrapDetails(source) {\n var match = source.match(reWrapDetails);\n return match ? match[1].split(reSplitDetails) : [];\n}\n\nmodule.exports = getWrapDetails;\n","/** Used to match wrap detail comments. */\nvar reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/;\n\n/**\n * Inserts wrapper `details` in a comment at the top of the `source` body.\n *\n * @private\n * @param {string} source The source to modify.\n * @returns {Array} details The details to insert.\n * @returns {string} Returns the modified source.\n */\nfunction insertWrapDetails(source, details) {\n var length = details.length;\n if (!length) {\n return source;\n }\n var lastIndex = length - 1;\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n details = details.join(length > 2 ? ', ' : ' ');\n return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n}\n\nmodule.exports = insertWrapDetails;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n","var arrayEach = require('./_arrayEach'),\n arrayIncludes = require('./_arrayIncludes');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256,\n WRAP_FLIP_FLAG = 512;\n\n/** Used to associate wrap methods with their bit flags. */\nvar wrapFlags = [\n ['ary', WRAP_ARY_FLAG],\n ['bind', WRAP_BIND_FLAG],\n ['bindKey', WRAP_BIND_KEY_FLAG],\n ['curry', WRAP_CURRY_FLAG],\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n ['flip', WRAP_FLIP_FLAG],\n ['partial', WRAP_PARTIAL_FLAG],\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n ['rearg', WRAP_REARG_FLAG]\n];\n\n/**\n * Updates wrapper `details` based on `bitmask` flags.\n *\n * @private\n * @returns {Array} details The details to modify.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Array} Returns `details`.\n */\nfunction updateWrapDetails(details, bitmask) {\n arrayEach(wrapFlags, function(pair) {\n var value = '_.' + pair[0];\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n details.push(value);\n }\n });\n return details.sort();\n}\n\nmodule.exports = updateWrapDetails;\n","var getWrapDetails = require('./_getWrapDetails'),\n insertWrapDetails = require('./_insertWrapDetails'),\n setToString = require('./_setToString'),\n updateWrapDetails = require('./_updateWrapDetails');\n\n/**\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n * with wrapper details in a comment at the top of the source body.\n *\n * @private\n * @param {Function} wrapper The function to modify.\n * @param {Function} reference The reference function.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Function} Returns `wrapper`.\n */\nfunction setWrapToString(wrapper, reference, bitmask) {\n var source = (reference + '');\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n}\n\nmodule.exports = setWrapToString;\n","var isLaziable = require('./_isLaziable'),\n setData = require('./_setData'),\n setWrapToString = require('./_setWrapToString');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG = 8,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64;\n\n/**\n * Creates a function that wraps `func` to continue currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {Function} wrapFunc The function to create the `func` wrapper.\n * @param {*} placeholder The placeholder value.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n var isCurry = bitmask & WRAP_CURRY_FLAG,\n newHolders = isCurry ? holders : undefined,\n newHoldersRight = isCurry ? undefined : holders,\n newPartials = isCurry ? partials : undefined,\n newPartialsRight = isCurry ? undefined : partials;\n\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n }\n var newData = [\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n newHoldersRight, argPos, ary, arity\n ];\n\n var result = wrapFunc.apply(undefined, newData);\n if (isLaziable(func)) {\n setData(result, newData);\n }\n result.placeholder = placeholder;\n return setWrapToString(result, func, bitmask);\n}\n\nmodule.exports = createRecurry;\n","/**\n * Gets the argument placeholder value for `func`.\n *\n * @private\n * @param {Function} func The function to inspect.\n * @returns {*} Returns the placeholder value.\n */\nfunction getHolder(func) {\n var object = func;\n return object.placeholder;\n}\n\nmodule.exports = getHolder;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var copyArray = require('./_copyArray'),\n isIndex = require('./_isIndex');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\nfunction reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin(indexes.length, arrLength),\n oldArray = copyArray(array);\n\n while (length--) {\n var index = indexes[length];\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n}\n\nmodule.exports = reorder;\n","/** Used as the internal argument placeholder. */\nvar PLACEHOLDER = '__lodash_placeholder__';\n\n/**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\nfunction replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value === placeholder || value === PLACEHOLDER) {\n array[index] = PLACEHOLDER;\n result[resIndex++] = index;\n }\n }\n return result;\n}\n\nmodule.exports = replaceHolders;\n","var composeArgs = require('./_composeArgs'),\n composeArgsRight = require('./_composeArgsRight'),\n countHolders = require('./_countHolders'),\n createCtor = require('./_createCtor'),\n createRecurry = require('./_createRecurry'),\n getHolder = require('./_getHolder'),\n reorder = require('./_reorder'),\n replaceHolders = require('./_replaceHolders'),\n root = require('./_root');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_ARY_FLAG = 128,\n WRAP_FLIP_FLAG = 512;\n\n/**\n * Creates a function that wraps `func` to invoke it with optional `this`\n * binding of `thisArg`, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided\n * to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & WRAP_ARY_FLAG,\n isBind = bitmask & WRAP_BIND_FLAG,\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n isFlip = bitmask & WRAP_FLIP_FLAG,\n Ctor = isBindKey ? undefined : createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length;\n\n while (index--) {\n args[index] = arguments[index];\n }\n if (isCurried) {\n var placeholder = getHolder(wrapper),\n holdersCount = countHolders(args, placeholder);\n }\n if (partials) {\n args = composeArgs(args, partials, holders, isCurried);\n }\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n }\n length -= holdersCount;\n if (isCurried && length < arity) {\n var newHolders = replaceHolders(args, placeholder);\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n args, newHolders, argPos, ary, arity - length\n );\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n\n length = args.length;\n if (argPos) {\n args = reorder(args, argPos);\n } else if (isFlip && length > 1) {\n args.reverse();\n }\n if (isAry && ary < length) {\n args.length = ary;\n }\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtor(fn);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n}\n\nmodule.exports = createHybrid;\n","var apply = require('./_apply'),\n createCtor = require('./_createCtor'),\n createHybrid = require('./_createHybrid'),\n createRecurry = require('./_createRecurry'),\n getHolder = require('./_getHolder'),\n replaceHolders = require('./_replaceHolders'),\n root = require('./_root');\n\n/**\n * Creates a function that wraps `func` to enable currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {number} arity The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createCurry(func, bitmask, arity) {\n var Ctor = createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length,\n placeholder = getHolder(wrapper);\n\n while (index--) {\n args[index] = arguments[index];\n }\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n ? []\n : replaceHolders(args, placeholder);\n\n length -= holders.length;\n if (length < arity) {\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\n args, holders, undefined, undefined, arity - length);\n }\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return apply(fn, this, args);\n }\n return wrapper;\n}\n\nmodule.exports = createCurry;\n","var apply = require('./_apply'),\n createCtor = require('./_createCtor'),\n root = require('./_root');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1;\n\n/**\n * Creates a function that wraps `func` to invoke it with the `this` binding\n * of `thisArg` and `partials` prepended to the arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to\n * the new function.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createPartial(func, bitmask, thisArg, partials) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(leftLength + argsLength),\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n return apply(fn, isBind ? thisArg : this, args);\n }\n return wrapper;\n}\n\nmodule.exports = createPartial;\n","var composeArgs = require('./_composeArgs'),\n composeArgsRight = require('./_composeArgsRight'),\n replaceHolders = require('./_replaceHolders');\n\n/** Used as the internal argument placeholder. */\nvar PLACEHOLDER = '__lodash_placeholder__';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG = 8,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers used to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and\n * `_.rearg` modify function arguments, making the order in which they are\n * executed important, preventing the merging of metadata. However, we make\n * an exception for a safe combined case where curried functions have `_.ary`\n * and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\nfunction mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n var isCombo =\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n // Exit early if metadata can't be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & WRAP_BIND_FLAG) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = value;\n }\n // Use source `ary` if it's smaller.\n if (srcBitmask & WRAP_ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n\n return data;\n}\n\nmodule.exports = mergeData;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var toFinite = require('./toFinite');\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n","var baseSetData = require('./_baseSetData'),\n createBind = require('./_createBind'),\n createCurry = require('./_createCurry'),\n createHybrid = require('./_createHybrid'),\n createPartial = require('./_createPartial'),\n getData = require('./_getData'),\n mergeData = require('./_mergeData'),\n setData = require('./_setData'),\n setWrapToString = require('./_setWrapToString'),\n toInteger = require('./toInteger');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags.\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * 512 - `_.flip`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n partials = holders = undefined;\n }\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n arity = arity === undefined ? arity : toInteger(arity);\n length -= holders ? holders.length : 0;\n\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n var partialsRight = partials,\n holdersRight = holders;\n\n partials = holders = undefined;\n }\n var data = isBindKey ? undefined : getData(func);\n\n var newData = [\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n argPos, ary, arity\n ];\n\n if (data) {\n mergeData(newData, data);\n }\n func = newData[0];\n bitmask = newData[1];\n thisArg = newData[2];\n partials = newData[3];\n holders = newData[4];\n arity = newData[9] = newData[9] === undefined\n ? (isBindKey ? 0 : func.length)\n : nativeMax(newData[9] - length, 0);\n\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n }\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n var result = createBind(func, bitmask, thisArg);\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n result = createCurry(func, bitmask, arity);\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n result = createPartial(func, bitmask, thisArg, partials);\n } else {\n result = createHybrid.apply(undefined, newData);\n }\n var setter = data ? baseSetData : setData;\n return setWrapToString(setter(result, newData), func, bitmask);\n}\n\nmodule.exports = createWrap;\n","var createWrap = require('./_createWrap');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_CURRY_FLAG = 8;\n\n/**\n * Creates a function that accepts arguments of `func` and either invokes\n * `func` returning its result, if at least `arity` number of arguments have\n * been provided, or returns a function that accepts the remaining `func`\n * arguments, and so on. The arity of `func` may be specified if `func.length`\n * is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */\nfunction curry(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curry.placeholder;\n return result;\n}\n\n// Assign default placeholders.\ncurry.placeholder = {};\n\nmodule.exports = curry;\n","import memoize from 'fast-memoize'\nimport fs from 'fs/promises'\nimport yaml from 'js-yaml'\nimport jsonlines from 'jsonlines'\nimport curry from 'lodash/curry'\nimport os from 'os'\nimport path from 'path'\nimport spawn from 'spawn-please'\nimport exists from '../lib/exists'\nimport findLockfile from '../lib/findLockfile'\nimport { keyValueBy } from '../lib/keyValueBy'\nimport { print } from '../lib/logging'\nimport { GetVersion } from '../types/GetVersion'\nimport { Index } from '../types/IndexType'\nimport { NpmConfig } from '../types/NpmConfig'\nimport { NpmOptions } from '../types/NpmOptions'\nimport { Options } from '../types/Options'\nimport { SpawnOptions } from '../types/SpawnOptions'\nimport { SpawnPleaseOptions } from '../types/SpawnPleaseOptions'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport * as npm from './npm'\n\ninterface ParsedDep {\n version: string\n from: string\n required?: {\n version: string\n }\n}\n\nexport interface NpmScope {\n npmAlwaysAuth?: boolean\n npmAuthToken?: string\n npmRegistryServer?: string\n}\n\ninterface YarnConfig {\n npmScopes?: Index<NpmScope>\n}\n\n/** Safely interpolates a string as a template string. */\nconst interpolate = (s: string, data: Index<string | undefined>): string =>\n s.replace(\n /\\$\\{([^:-]+)(?:(:)?-([^}]*))?\\}/g,\n (match, key, name, fallbackOnEmpty, fallback) => data[key] || (fallbackOnEmpty ? fallback : ''),\n )\n\n/** Reads an auth token from a yarn config, interpolates it, and returns it as an npm config key-value pair. */\nexport const npmAuthTokenKeyValue = curry((npmConfig: Index<string | boolean>, dep: string, scopedConfig: NpmScope) => {\n if (scopedConfig.npmAuthToken) {\n // get registry server from this config or a previous config (assumes setNpmRegistry has already been called on all npm scopes)\n const registryServer = scopedConfig.npmRegistryServer || (npmConfig[`@${dep}:registry`] as string | undefined)\n // interpolate environment variable fallback\n // https://yarnpkg.com/configuration/yarnrc\n if (registryServer) {\n let trimmedRegistryServer = registryServer.replace(/^https?:/, '')\n\n if (trimmedRegistryServer.endsWith('/')) {\n trimmedRegistryServer = trimmedRegistryServer.slice(0, -1)\n }\n\n return {\n [`${trimmedRegistryServer}/:_authToken`]: interpolate(scopedConfig.npmAuthToken, process.env),\n }\n }\n }\n\n return null\n})\n\n/** Reads a registry from a yarn config. interpolates it, and returns it as an npm config key-value pair. */\nconst npmRegistryKeyValue = (dep: string, scopedConfig: NpmScope): null | Index<VersionSpec> =>\n scopedConfig.npmRegistryServer\n ? { [`@${dep}:registry`]: interpolate(scopedConfig.npmRegistryServer, process.env) }\n : null\n\n/**\n * Returns the path to the local .yarnrc.yml, or undefined. This doesn't\n * actually check that the .yarnrc.yml file exists.\n *\n * Exported for test purposes only.\n *\n * @param readdirSync This is only a parameter so that it can be used in tests.\n */\nexport async function getPathToLookForYarnrc(\n options: Options,\n readdir: (_path: string) => Promise<string[]> = fs.readdir,\n): Promise<string | undefined> {\n if (options.global) return undefined\n\n const directoryPath = (await findLockfile(options, readdir))?.directoryPath\n if (!directoryPath) return undefined\n\n return path.join(directoryPath, '.yarnrc.yml')\n}\n\n// If private registry auth is specified in npmScopes in .yarnrc.yml, read them in and convert them to npm config variables.\n// Define as a memoized function to efficiently call existsSync and readFileSync only once, and only if yarn is being used.\n// https://github.com/raineorshine/npm-check-updates/issues/1036\nconst npmConfigFromYarn = memoize(async (options: Options): Promise<NpmConfig> => {\n const yarnrcLocalPath = await getPathToLookForYarnrc(options)\n const yarnrcUserPath = path.join(os.homedir(), '.yarnrc.yml')\n const yarnrcLocalExists = typeof yarnrcLocalPath === 'string' && (await exists(yarnrcLocalPath))\n const yarnrcUserExists = await exists(yarnrcUserPath)\n const yarnrcLocal = yarnrcLocalExists ? await fs.readFile(yarnrcLocalPath, 'utf-8') : ''\n const yarnrcUser = yarnrcUserExists ? await fs.readFile(yarnrcUserPath, 'utf-8') : ''\n const yarnConfigLocal: YarnConfig = yaml.load(yarnrcLocal) as YarnConfig\n const yarnConfigUser: YarnConfig = yaml.load(yarnrcUser) as YarnConfig\n\n let npmConfig: Index<string | boolean> = {\n ...keyValueBy(yarnConfigUser?.npmScopes || {}, npmRegistryKeyValue),\n ...keyValueBy(yarnConfigLocal?.npmScopes || {}, npmRegistryKeyValue),\n }\n\n // npmAuthTokenKeyValue uses scoped npmRegistryServer, so must come after npmRegistryKeyValue\n npmConfig = {\n ...npmConfig,\n ...keyValueBy(yarnConfigUser?.npmScopes || {}, npmAuthTokenKeyValue(npmConfig)),\n ...keyValueBy(yarnConfigLocal?.npmScopes || {}, npmAuthTokenKeyValue(npmConfig)),\n }\n\n // set auth token after npm registry, since auth token syntax uses registry\n\n if (yarnrcLocalExists) {\n print(options, `\\nUsing local yarn config at ${yarnrcLocalPath}:`, 'verbose')\n print(options, yarnConfigLocal, 'verbose')\n }\n if (yarnrcUserExists) {\n print(options, `\\nUsing user yarn config at ${yarnrcUserPath}:`, 'verbose')\n print(options, yarnConfigLocal, 'verbose')\n }\n\n if (Object.keys(npmConfig)) {\n print(options, '\\nMerged yarn config in npm format:', 'verbose')\n print(options, npmConfig, 'verbose')\n }\n\n return npmConfig\n})\n\n/**\n * Parse JSON lines and throw an informative error on failure.\n *\n * Note: although this is similar to the NPM parseJson() function we always return the\n * same concrete-type here, for now.\n *\n * @param result Output from `yarn list --json` to be parsed\n */\nfunction parseJsonLines(result: string): Promise<{ dependencies: Index<ParsedDep> }> {\n return new Promise((resolve, reject) => {\n const dependencies: Index<ParsedDep> = {}\n\n const parser = jsonlines.parse()\n\n parser.on('data', d => {\n // only parse info data\n // ignore error info, e.g. \"Visit https://yarnpkg.com/en/docs/cli/list for documentation about this command.\"\n if (d.type === 'info' && !d.data.match(/^Visit/)) {\n // parse package name and version number from info data, e.g. \"nodemon@2.0.4\" has binaries\n const [, pkgName, pkgVersion] = d.data.match(/\"(@?.*)@(.*)\"/) || []\n\n dependencies[pkgName] = {\n version: pkgVersion,\n from: pkgName,\n }\n } else if (d.type === 'error') {\n reject(new Error(d.data))\n }\n })\n\n parser.on('end', () => {\n resolve({ dependencies })\n })\n\n parser.on('error', reject)\n\n parser.write(result)\n\n parser.end()\n })\n}\n\n/**\n * Extract first json line from multi line yarn output\n *\n * @param result Output from yarn command to be parsed\n */\nfunction extractFirstJsonLine(result: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const parser = jsonlines.parse()\n let firstFound = false\n\n parser.on('data', value => {\n if (!firstFound) {\n firstFound = true\n resolve(JSON.stringify(value))\n }\n })\n parser.on('error', reject)\n\n parser.write(result)\n\n parser.end()\n })\n}\n\nconst cmd = process.platform === 'win32' ? 'yarn.cmd' : 'yarn'\n\n/**\n * Spawn yarn requires a different command on Windows.\n *\n * @param args\n * @param [yarnOptions={}]\n * @param [spawnOptions={}]\n * @returns\n */\nasync function spawnYarn(\n args: string | string[],\n yarnOptions: NpmOptions = {},\n spawnPleaseOptions: SpawnPleaseOptions = {},\n spawnOptions: SpawnOptions = {},\n): Promise<string> {\n const fullArgs = [\n ...(yarnOptions.global ? ['global'] : []),\n ...(yarnOptions.prefix ? [`--prefix=${yarnOptions.prefix}`] : []),\n '--depth=0',\n '--json',\n '--no-progress',\n // args must go after yarn options; otherwise, they are passed through to npm scripts\n // https://github.com/raineorshine/npm-check-updates/issues/1362\n ...(Array.isArray(args) ? args : [args]),\n ]\n\n const { stdout } = await spawn(cmd, fullArgs, spawnPleaseOptions, spawnOptions)\n\n return stdout\n}\n\n/**\n * Get platform-specific default prefix to pass on to yarn.\n *\n * @param options\n * @param [options.global]\n * @param [options.prefix]\n * @returns\n */\nexport async function defaultPrefix(options: Options): Promise<string | null> {\n if (options.prefix) {\n return Promise.resolve(options.prefix)\n }\n\n const { stdout: prefix } = await spawn(cmd, ['global', 'dir'])\n // yarn 2.0 does not support yarn global\n // catch error to prevent process from crashing\n // https://github.com/raineorshine/npm-check-updates/issues/873\n .catch(() => ({\n stdout: null,\n }))\n\n // FIX: for ncu -g doesn't work on homebrew or windows #146\n // https://github.com/raineorshine/npm-check-updates/issues/146\n\n return options.global && prefix && prefix.match('Cellar')\n ? '/usr/local'\n : // Workaround: get prefix on windows for global packages\n // Only needed when using npm api directly\n process.platform === 'win32' && options.global && !process.env.prefix\n ? prefix\n ? prefix.trim()\n : `${process.env.LOCALAPPDATA}\\\\Yarn\\\\Data\\\\global`\n : null\n}\n\n/**\n * Fetches the list of all installed packages.\n *\n * @param [options]\n * @param [options.cwd]\n * @param [options.global]\n * @param [options.prefix]\n * @returns\n */\nexport const list = async (options: Options = {}, spawnOptions?: SpawnOptions): Promise<Index<string | undefined>> => {\n const jsonLines: string = await spawnYarn(\n 'list',\n options as Index<string>,\n {},\n {\n ...(options.cwd ? { cwd: options.cwd } : {}),\n ...spawnOptions,\n },\n )\n const json: { dependencies: Index<ParsedDep> } = await parseJsonLines(jsonLines)\n const keyValues: Index<string | undefined> = keyValueBy<ParsedDep, string | undefined>(\n json.dependencies,\n (name, info): { [key: string]: string | undefined } => ({\n // unmet peer dependencies have a different structure\n [name]: info.version || info.required?.version,\n }),\n )\n return keyValues\n}\n\n/** Wraps a GetVersion function and passes the yarn config. */\nconst withNpmConfigFromYarn =\n (getVersion: GetVersion): GetVersion =>\n async (packageName, currentVersion, options = {}) =>\n getVersion(packageName, currentVersion, options, await npmConfigFromYarn(options))\n\nexport const distTag = withNpmConfigFromYarn(npm.distTag)\nexport const greatest = withNpmConfigFromYarn(npm.greatest)\nexport const latest = withNpmConfigFromYarn(npm.latest)\nexport const minor = withNpmConfigFromYarn(npm.minor)\nexport const newest = withNpmConfigFromYarn(npm.newest)\nexport const patch = withNpmConfigFromYarn(npm.patch)\nexport const semver = withNpmConfigFromYarn(npm.semver)\n\n/**\n * Fetches the list of peer dependencies for a specific package version.\n *\n * @param packageName\n * @param version\n * @param spawnOptions\n * @returns Promised {packageName: version} collection\n */\nexport const getPeerDependencies = async (\n packageName: string,\n version: Version,\n spawnOptions: SpawnOptions,\n): Promise<Index<Version>> => {\n const { stdout: yarnVersion } = await spawn(cmd, ['--version'], { rejectOnError: false }, spawnOptions)\n if (yarnVersion.startsWith('1')) {\n const args = ['--json', 'info', `${packageName}@${version}`, 'peerDependencies']\n const { stdout } = await spawn(cmd, args, { rejectOnError: false }, spawnOptions)\n return stdout ? npm.parseJson<{ data?: Index<Version> }>(stdout, { command: args.join(' ') }).data || {} : {}\n } else {\n const args = ['--json', 'npm', 'info', `${packageName}@${version}`, '--fields', 'peerDependencies']\n const { stdout } = await spawn(cmd, args, { rejectOnError: false }, spawnOptions)\n if (!stdout) {\n return {}\n }\n try {\n return (\n npm.parseJson<{ peerDependencies?: Index<Version> }>(stdout, { command: args.join(' ') }).peerDependencies || {}\n )\n } catch (parseError) {\n /*\n If package does not exist, yarn returns multiple json errors. As such, we want to extract just the first one, instead of crashing.\n Example response:\n {\"type\":\"error\",\"name\":35,\"displayName\":\"YN0035\",\"indent\":\"\",\"data\":\"Package not found\"}\n{\"type\":\"error\",\"name\":35,\"displayName\":\"YN0035\",\"indent\":\"\",\"data\":\" \\u001b[96mResponse Code\\u001b[39m: \\u001b]8;;https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404\\u0007\\u001b[93m404\\u001b[39m (Not Found)\\u001b]8;;\\u0007\"}\n{\"type\":\"error\",\"name\":35,\"displayName\":\"YN0035\",\"indent\":\"\",\"data\":\" \\u001b[96mRequest Method\\u001b[39m: GET\"}\n{\"type\":\"error\",\"name\":35,\"displayName\":\"YN0035\",\"indent\":\"\",\"data\":\" \\u001b[96mRequest URL\\u001b[39m: \\u001b[95mhttps://registry.yarnpkg.com/fffffffffffff\\u001b[39m\"}\n */\n try {\n const firstObj = await extractFirstJsonLine(stdout)\n if (firstObj) {\n return (\n npm.parseJson<{ peerDependencies?: Index<Version> }>(firstObj, { command: args.join(' ') })\n .peerDependencies || {}\n )\n }\n } catch {}\n throw parseError\n }\n }\n}\n\n/**\n * Fetches the engines list from the registry for a specific package version.\n *\n * @param packageName\n * @param version\n * @returns Promised engines collection\n */\nexport const getEngines = async (\n packageName: string,\n version: Version,\n options: Options = {},\n): Promise<Index<VersionSpec | undefined>> =>\n npm.getEngines(packageName, version, options, await npmConfigFromYarn(options))\n\n/**\n * Check if package author changed between current and upgraded version.\n *\n * @param packageName Name of the package\n * @param currentVersion Current version declaration (may be range)\n * @param upgradedVersion Upgraded version declaration (may be range)\n * @param npmConfigLocal Additional npm config variables that are merged into the system npm config\n * @returns A promise that fulfills with boolean value.\n */\nexport const packageAuthorChanged = async (\n packageName: string,\n currentVersion: VersionSpec,\n upgradedVersion: VersionSpec,\n options: Options = {},\n): Promise<boolean> =>\n npm.packageAuthorChanged(packageName, currentVersion, upgradedVersion, options, await npmConfigFromYarn(options))\n\nexport default spawnYarn\n","import { print } from '../lib/logging'\nimport { Options } from '../types/Options'\nimport chalk from './chalk'\n\n/** Print an error. Exit the process if in CLI mode. */\nfunction programError(\n options: Options,\n message: string,\n {\n color = true,\n }: {\n // defaults to true, which uses chalk.red on the whole error message.\n // set to false to provide your own coloring.\n color?: boolean\n } = {},\n): never {\n if (options.cli) {\n print(options, color ? chalk.red(message) : message, null, 'error')\n process.exit(1)\n } else {\n throw new Error(message)\n }\n}\n\nexport default programError\n","import fs from 'fs/promises'\nimport { Options } from '../types/Options'\nimport { PackageFile } from '../types/PackageFile'\nimport { PackageInfo } from '../types/PackageInfo'\nimport programError from './programError'\n\n/** Load and parse a package file. */\nconst loadPackageInfoFromFile = async (options: Options, filepath: string): Promise<PackageInfo> => {\n let pkg: PackageFile, pkgFile: string\n\n // assert package.json\n try {\n pkgFile = await fs.readFile(filepath, 'utf-8')\n pkg = JSON.parse(pkgFile)\n } catch (e) {\n programError(options, `Missing or invalid ${filepath}`)\n }\n\n return {\n name: undefined, // defined by workspace code only\n pkg,\n pkgFile,\n filepath,\n }\n}\n\nexport default loadPackageInfoFromFile\n","import { cliOptionsMap } from '../cli-options'\nimport { Index } from '../types/IndexType'\nimport { PackageFile } from '../types/PackageFile'\n\n// dependency section aliases that will be resolved to the full name\nconst depAliases: Index<keyof PackageFile> = {\n dev: 'devDependencies',\n peer: 'peerDependencies',\n prod: 'dependencies',\n optional: 'optionalDependencies',\n}\n\n/** Gets a list of dependency sections based on options.dep. */\nconst resolveDepSections = (dep?: string | readonly string[]): (keyof PackageFile)[] => {\n // parse dep string and set default\n const depOptions: string[] = dep ? (typeof dep === 'string' ? dep.split(',') : dep) : cliOptionsMap.dep.default\n\n // map the dependency section option to a full dependency section name\n const depSections = depOptions.map(name => depAliases[name] || name)\n\n return depSections\n}\n\nexport default resolveDepSections\n","import fs from 'fs/promises'\nimport path from 'path'\nimport { Index } from '../types/IndexType'\nimport { VersionSpec } from '../types/VersionSpec'\n\n/**\n * @returns String safe for use in `new RegExp()`\n */\nfunction escapeRegexp(s: string) {\n return s.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&')\n}\n\n/**\n * Upgrade catalog dependencies in a YAML file (e.g., pnpm-workspace.yaml).\n */\nasync function upgradeYamlCatalogData(\n filePath: string,\n current: Index<VersionSpec>,\n upgraded: Index<VersionSpec>,\n): Promise<string> {\n const fileContent = await fs.readFile(filePath, 'utf-8')\n\n // Use regex replacement to maintain original formatting\n return Object.entries(upgraded)\n .filter(([dep]) => current[dep])\n .reduce((content, [dep, newVersion]) => {\n const currentVersion = current[dep]\n\n // Match both quoted and unquoted versions\n const quotedPattern = `(${escapeRegexp(dep)}\\\\s*:\\\\s*[\"'])(${escapeRegexp(currentVersion)})([\"'])`\n const unquotedPattern = `(${escapeRegexp(dep)}\\\\s*:\\\\s*)(${escapeRegexp(currentVersion)})(\\\\s*(?:\\\\n|$))`\n\n const quotedRegex = new RegExp(quotedPattern, 'g')\n const unquotedRegex = new RegExp(unquotedPattern, 'g')\n\n return content.replace(quotedRegex, `$1${newVersion}$3`).replace(unquotedRegex, `$1${newVersion}$3`)\n }, fileContent)\n}\n\n/**\n * Upgrade catalog dependencies in a JSON file (e.g., package.json for Bun).\n */\nasync function upgradeJsonCatalogData(\n filePath: string,\n current: Index<VersionSpec>,\n upgraded: Index<VersionSpec>,\n): Promise<string> {\n const fileContent = await fs.readFile(filePath, 'utf-8')\n\n // Use regex replacement to maintain JSON formatting\n return Object.entries(upgraded)\n .filter(([dep]) => current[dep])\n .reduce((content, [dep, newVersion]) => {\n const currentVersion = current[dep]\n\n // Match catalog and catalogs sections in JSON (both top-level and within workspaces)\n const catalogPattern = `(\"${escapeRegexp(dep)}\"\\\\s*:\\\\s*\")(${escapeRegexp(currentVersion)})(\")`\n const catalogRegex = new RegExp(catalogPattern, 'g')\n\n return content.replace(catalogRegex, `$1${newVersion}$3`)\n }, fileContent)\n}\n\n/**\n * Upgrade catalog dependencies in either YAML or JSON catalog files.\n * Supports pnpm-workspace.yaml (pnpm) and package.json (Bun) catalog formats.\n *\n * @param filePath The path to the catalog file (pnpm-workspace.yaml or package.json)\n * @param current Current catalog dependencies {package: range}\n * @param upgraded New catalog dependencies {package: range}\n * @returns The updated file content as utf8 text\n */\nexport async function upgradeCatalogData(\n filePath: string,\n current: Index<VersionSpec>,\n upgraded: Index<VersionSpec>,\n): Promise<string> {\n const fileExtension = path.extname(filePath)\n\n if (fileExtension === '.yaml' || fileExtension === '.yml') {\n return upgradeYamlCatalogData(filePath, current, upgraded)\n } else if (fileExtension === '.json') {\n return upgradeJsonCatalogData(filePath, current, upgraded)\n } else {\n throw new Error(`Unsupported catalog file type: ${filePath}`)\n }\n}\n\nexport default upgradeCatalogData\n","import fs from 'fs/promises'\nimport yaml from 'js-yaml'\nimport path from 'path'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { PackageFile } from '../types/PackageFile'\nimport { VersionSpec } from '../types/VersionSpec'\nimport resolveDepSections from './resolveDepSections'\nimport upgradeCatalogData from './upgradeCatalogData'\n\n/**\n * @returns String safe for use in `new RegExp()`\n */\nfunction escapeRegexp(s: string) {\n return s.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') // Thanks Stack Overflow!\n}\n\n/**\n * Upgrade the dependency declarations in the package data.\n *\n * @param pkgData The package.json data, as utf8 text\n * @param oldDependencies Old dependencies {package: range}\n * @param newDependencies New dependencies {package: range}\n * @param options Options object\n * @param pkgFile Optional path to the package file\n * @returns The updated package data, as utf8 text\n * @description Side Effect: prompts\n */\nasync function upgradePackageData(\n pkgData: string,\n current: Index<VersionSpec>,\n upgraded: Index<VersionSpec>,\n options: Options,\n pkgFile?: string,\n) {\n // Check if this is a catalog file (pnpm-workspace.yaml or package.json with catalogs)\n if (pkgFile) {\n const fileName = path.basename(pkgFile)\n const fileExtension = path.extname(pkgFile)\n\n // Handle synthetic catalog files (package.json#catalog format)\n if (pkgFile.includes('#catalog')) {\n // This is a synthetic catalog file, we need to read and update the actual file\n const actualFilePath = pkgFile.replace('#catalog', '')\n const actualFileExtension = path.extname(actualFilePath)\n\n if (actualFileExtension === '.json') {\n // Bun format: update package.json catalogs and return the updated content\n return upgradeCatalogData(actualFilePath, current, upgraded)\n }\n }\n\n // Handle pnpm-workspace.yaml catalog files\n if (\n fileName === 'pnpm-workspace.yaml' ||\n (fileName.includes('catalog') && (fileExtension === '.yaml' || fileExtension === '.yml'))\n ) {\n // Check if we have synthetic catalog data (JSON with only dependencies and name/version)\n // In this case, we should generate the proper catalog structure\n const parsed = JSON.parse(pkgData)\n if (\n typeof parsed === 'object' &&\n parsed.name === 'catalog-dependencies' &&\n typeof parsed.dependencies === 'object' &&\n Object.keys(parsed).length <= 3\n ) {\n // This is synthetic catalog data, we need to generate the proper catalog structure\n // Read the original pnpm-workspace.yaml to get the catalog structure\n const yamlContent = await fs.readFile(pkgFile, 'utf-8')\n const yamlData = yaml.load(yamlContent) as {\n packages?: string[]\n catalog?: Index<string>\n catalogs?: Index<Index<string>>\n }\n\n // Update catalog dependencies with upgraded versions\n if (yamlData.catalogs) {\n yamlData.catalogs = Object.entries(yamlData.catalogs as Record<string, Record<string, string>>).reduce(\n (catalogs, [catalogName, catalog]) => ({\n ...catalogs,\n [catalogName]: {\n ...catalog,\n ...Object.entries(upgraded)\n .filter(([dep]) => catalog[dep])\n .reduce((acc, [dep, version]) => ({ ...acc, [dep]: version }), {} as Record<string, string>),\n },\n }),\n {} as Record<string, Record<string, string>>,\n )\n }\n\n // Also handle single catalog (if present)\n if (yamlData.catalog) {\n const catalog = yamlData.catalog as Record<string, string>\n yamlData.catalog = {\n ...catalog,\n ...Object.entries(upgraded)\n .filter(([dep]) => catalog[dep])\n .reduce((acc, [dep, version]) => ({ ...acc, [dep]: version }), {} as Record<string, string>),\n }\n }\n\n // For pnpm, also expose the 'default' catalog as a top-level 'catalog' property\n if (yamlData.catalogs?.default) {\n yamlData.catalog = yamlData.catalogs.default\n }\n\n return JSON.stringify(yamlData, null, 2)\n }\n\n return upgradeCatalogData(pkgFile, current, upgraded)\n }\n\n // Handle package.json catalog files (check if content contains catalog/catalogs at root level or in workspaces)\n if (fileExtension === '.json') {\n const parsed = JSON.parse(pkgData)\n const hasTopLevelCatalogs = parsed.catalog || parsed.catalogs\n const hasWorkspacesCatalogs =\n parsed.workspaces &&\n !Array.isArray(parsed.workspaces) &&\n (parsed.workspaces.catalog || parsed.workspaces.catalogs)\n\n if (hasTopLevelCatalogs || hasWorkspacesCatalogs) {\n return upgradeCatalogData(pkgFile, current, upgraded)\n }\n }\n }\n\n // Always include overrides since any upgraded dependencies needed to be upgraded in overrides as well.\n // https://github.com/raineorshine/npm-check-updates/issues/1332\n const depSections = [...resolveDepSections(options.dep), 'overrides']\n\n // iterate through each dependency section\n const sectionRegExp = new RegExp(`\"(${depSections.join(`|`)})\"s*:[^}]*`, 'g')\n let newPkgData = pkgData.replace(sectionRegExp, section => {\n // replace each upgraded dependency in the section\n return Object.entries(upgraded).reduce((updatedSection, [dep]) => {\n // const expression = `\"${dep}\"\\\\s*:\\\\s*\"(${escapeRegexp(current[dep])})\"`\n const expression = `\"${dep}\"\\\\s*:\\\\s*(\"|{\\\\s*\".\"\\\\s*:\\\\s*\")(${escapeRegexp(current[dep])})\"`\n const regExp = new RegExp(expression, 'g')\n return updatedSection.replace(regExp, (match, child) => `\"${dep}${child ? `\": ${child}` : ': '}${upgraded[dep]}\"`)\n }, section)\n })\n\n if (depSections.includes('packageManager')) {\n const pkg = JSON.parse(pkgData) as PackageFile\n if (pkg.packageManager) {\n const [name] = pkg.packageManager.split('@')\n if (upgraded[name]) {\n newPkgData = newPkgData.replace(\n /\"packageManager\"\\s*:\\s*\".*?@[^\"]*\"/,\n `\"packageManager\": \"${name}@${upgraded[name]}\"`,\n )\n }\n }\n }\n\n return newPkgData\n}\n\nexport default upgradePackageData\n","import fs from 'fs/promises'\nimport spawn from 'spawn-please'\nimport { printUpgrades } from '../lib/logging'\nimport spawnBun from '../package-managers/bun'\nimport spawnNpm from '../package-managers/npm'\nimport spawnPnpm from '../package-managers/pnpm'\nimport spawnYarn from '../package-managers/yarn'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { PackageFile } from '../types/PackageFile'\nimport { PackageInfo } from '../types/PackageInfo'\nimport { SpawnOptions } from '../types/SpawnOptions'\nimport { SpawnPleaseOptions } from '../types/SpawnPleaseOptions'\nimport { VersionSpec } from '../types/VersionSpec'\nimport chalk, { chalkInit } from './chalk'\nimport loadPackageInfoFromFile from './loadPackageInfoFromFile'\nimport upgradePackageData from './upgradePackageData'\n\ntype Run = (options?: Options) => Promise<PackageFile | Index<VersionSpec> | void>\n\n/** Run npm, yarn, pnpm, or bun. */\nconst npm = (\n args: string[],\n options: Options,\n print?: boolean,\n { spawnOptions, spawnPleaseOptions }: { spawnOptions?: SpawnOptions; spawnPleaseOptions?: SpawnPleaseOptions } = {},\n): Promise<string> => {\n if (print) {\n console.log(chalk.blue([options.packageManager, ...args].join(' ')))\n }\n\n const spawnOptionsMerged = {\n cwd: options.cwd || process.cwd(),\n env: {\n ...process.env,\n // TODO: Why does CI break pnpm install?\n ...(options.packageManager !== 'pnpm' ? { CI: '1' } : null),\n FORCE_COLOR: '1',\n ...spawnOptions?.env,\n },\n ...spawnOptions,\n }\n\n const npmOptions = {\n ...(options.global ? { global: true } : null),\n ...(options.prefix ? { prefix: options.prefix } : null),\n }\n\n return (\n options.packageManager === 'pnpm'\n ? spawnPnpm\n : options.packageManager === 'yarn'\n ? spawnYarn\n : options.packageManager === 'bun'\n ? spawnBun\n : spawnNpm\n )(args, npmOptions, spawnPleaseOptions, spawnOptionsMerged)\n}\n\n/** Load and validate package file and tests. */\nconst loadPackageFileForDoctor = async (options: Options): Promise<PackageInfo> => {\n // assert no --packageData or --packageFile\n if (options.packageData || options.packageFile) {\n console.error(\n '--packageData and --packageFile are not allowed with --doctor. You must execute \"ncu --doctor\" in a directory with a package file so it can install dependencies and test them.',\n )\n process.exit(1)\n }\n\n let packageInfo: PackageInfo\n // assert package.json\n try {\n packageInfo = await loadPackageInfoFromFile(options, 'package.json')\n } catch (e) {\n console.error('Missing or invalid package.json')\n process.exit(1)\n }\n\n // assert npm script \"test\" (unless a custom test script is specified)\n if (!options.doctorTest && !packageInfo.pkg.scripts?.test) {\n console.error(\n 'No npm \"test\" script defined. You must define a \"test\" script in the \"scripts\" section of your package.json to use --doctor.',\n )\n process.exit(1)\n }\n\n return packageInfo\n}\n\n/** Iteratively installs upgrades and runs tests to identify breaking upgrades. */\n// we have to pass run directly since it would be a circular require if doctor included this file\nconst doctor = async (run: Run, options: Options): Promise<void> => {\n await chalkInit()\n\n // bun lockFileName defaults to bun.lock but will be overwritten to bun.lockb if detected at the readFile step below\n let lockFileName: 'package-lock.json' | 'yarn.lock' | 'pnpm-lock.yaml' | 'bun.lock' | 'bun.lockb' =\n options.packageManager === 'yarn'\n ? 'yarn.lock'\n : options.packageManager === 'pnpm'\n ? 'pnpm-lock.yaml'\n : options.packageManager === 'bun'\n ? 'bun.lock'\n : 'package-lock.json'\n const { pkg, pkgFile }: PackageInfo = await loadPackageFileForDoctor(options)\n\n // flatten all deps into one so we can iterate over them\n const allDependencies: Index<VersionSpec> = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n ...pkg.optionalDependencies,\n }\n\n /** Install dependencies using \"npm run install\" or a custom script given by --doctorInstall. */\n const runInstall = async (): Promise<void> => {\n if (options.doctorInstall) {\n const [installCommand, ...testArgs] = options.doctorInstall.split(' ')\n console.log(chalk.blue(options.doctorInstall))\n await spawn(installCommand, testArgs)\n } else {\n await npm(['install'], { packageManager: options.packageManager }, true)\n }\n }\n\n /** Run the tests using \"npm run test\" or a custom script given by --doctorTest. */\n const runTests = async (): Promise<void> => {\n const spawnPleaseOptions = {\n stderr: (data: string): void => {\n console.error(chalk.red(data.toString()))\n },\n // Test runners typically write to stdout, so we need to print stdout.\n // Otherwise test failures will be silenced.\n stdout: (data: string): void => {\n process.stdout.write(data.toString())\n },\n }\n\n if (options.doctorTest) {\n const regexp = /\"(.+?)\"|'(.+?)'|[^ ]+/g\n const matches = options.doctorTest.matchAll(regexp)\n let groups: string[] = []\n for (const match of matches) {\n groups = [...groups, match[2] || match[1] || match[0]]\n }\n const [testCommand, ...testArgs] = groups\n console.log(chalk.blue(options.doctorTest))\n await spawn(testCommand, testArgs, spawnPleaseOptions)\n } else {\n await npm(\n ['run', 'test'],\n {\n packageManager: options.packageManager,\n },\n true,\n { spawnPleaseOptions },\n )\n }\n }\n\n console.log(`Running tests before upgrading`)\n\n // initial install\n await runInstall()\n\n // save lock file if there is one\n let lockFile = ''\n try {\n lockFile = await fs.readFile(lockFileName, 'utf-8')\n } catch (e) {\n // try bun.lockb if bun.lock was not found\n // set lockFileName so the rest of doctor mode uses bun.lockb for lock file updating and restoration\n if (options.packageManager === 'bun') {\n lockFileName = 'bun.lockb'\n try {\n lockFile = await fs.readFile(lockFileName, 'utf-8')\n } catch (e) {}\n }\n }\n\n // make sure current tests pass before we begin\n try {\n await runTests()\n } catch (e) {\n console.error('Tests failed before we even got started!')\n process.exit(1)\n }\n\n if (!options.interactive) {\n console.log(`Upgrading all dependencies and re-running tests`)\n }\n\n // upgrade all dependencies\n // save upgrades for later in case we need to iterate\n console.log(\n chalk.blue(\n 'ncu ' +\n process.argv\n .slice(2)\n .filter(arg => arg !== '--doctor')\n .join(' '),\n ),\n )\n process.env.NCU_DOCTOR = '1'\n const upgrades: Index<VersionSpec> = (await run({\n ...options,\n silent: true,\n // --doctor triggers the initial call to doctor, but the internal call needs to executes npm-check-updates normally in order to upgrade the dependencies\n doctor: false,\n })) as Index<VersionSpec>\n\n if (Object.keys(upgrades || {}).length === 0) {\n console.log('All dependencies are up-to-date ' + chalk.green.bold(':)'))\n return\n }\n\n // track if installing dependencies was successful\n // this allows us to skip re-installing when it fails and proceed straight to installing individual dependencies\n let installAllSuccess = false\n\n // run tests on all upgrades\n try {\n // install after all upgrades\n await runInstall()\n installAllSuccess = true\n\n // run tests after all upgrades\n await runTests()\n\n console.log(`${chalk.green('✓')} Tests pass`)\n\n await printUpgrades(options, {\n current: allDependencies,\n upgraded: upgrades,\n total: Object.keys(upgrades || {}).length,\n })\n\n console.log(`\\n${options.interactive ? 'Chosen' : 'All'} dependencies upgraded and installed ${chalk.green(':)')}`)\n } catch {\n console.error(chalk.red(installAllSuccess ? 'Tests failed' : 'Install failed'))\n console.log(`Identifying broken dependencies`)\n\n // restore package file, lockFile and re-install\n await fs.writeFile('package.json', pkgFile)\n\n if (lockFile) {\n await fs.writeFile(lockFileName, lockFile)\n } else {\n await fs.rm(lockFileName, { recursive: true, force: true })\n }\n\n // save the last package file with passing tests\n let lastPkgFile = pkgFile\n\n // re-install after restoring package file and lock file\n // only re-install if the tests failed, not if npm install failed\n if (installAllSuccess) {\n try {\n await runInstall()\n } catch (e) {\n const installCommand = (options.packageManager || 'npm') + ' install'\n throw new Error(\n `Error: Doctor mode was about to test individual upgrades, but ${chalk.cyan(\n installCommand,\n )} failed after rolling back to your existing package and lock files. This is unexpected since the initial install before any upgrades succeeded. Either npm failed to revert a partial install, or failed anomalously on the second run. Please check your internet connection and retry. If doctor mode fails consistently, report a bug with your complete list of dependency versions at https://github.com/raineorshine/npm-check-updates/issues.`,\n )\n }\n }\n\n // iterate upgrades\n let name: string, version: VersionSpec\n for ([name, version] of Object.entries(upgrades)) {\n try {\n // install single dependency\n await npm(\n [\n ...(options.packageManager === 'yarn' ||\n options.packageManager === 'pnpm' ||\n options.packageManager === 'bun'\n ? ['add']\n : ['install', '--no-save']),\n `${name}@${version}`,\n ],\n { packageManager: options.packageManager },\n true,\n )\n\n // if there is a prepare script, we need to run it manually since --no-save does not run prepare automatically\n // https://github.com/raineorshine/npm-check-updates/issues/1170\n if (pkg.scripts?.prepare) {\n try {\n await npm(['run', 'prepare'], { packageManager: options.packageManager }, true)\n } catch (e) {\n console.error(chalk.red('Prepare script failed'))\n throw e\n }\n }\n\n // run tests after individual upgrade\n await runTests()\n console.log(` ${chalk.green('✓')} ${name} ${allDependencies[name]} → ${version}`)\n\n // save upgraded package data so that passing versions can still be saved even when there is a failure\n lastPkgFile = await upgradePackageData(\n lastPkgFile,\n { [name]: allDependencies[name] },\n { [name]: version },\n options,\n )\n\n // save working lock file\n lockFile = await fs.readFile(lockFileName, 'utf-8')\n } catch (e) {\n // print failing package\n console.error(` ${chalk.red('✗')} ${name} ${allDependencies[name]} → ${version}\\n`)\n console.error(chalk.red(e))\n\n // restore last good lock file\n await fs.writeFile(lockFileName, lockFile)\n\n // restore package.json since yarn and pnpm do not have the --no-save option\n if (\n options.packageManager === 'yarn' ||\n options.packageManager === 'pnpm' ||\n options.packageManager === 'bun'\n ) {\n await fs.writeFile('package.json', lastPkgFile)\n }\n }\n }\n\n // silently restore last passing package file and lock file\n // only print message if package file is updated\n if (lastPkgFile !== pkgFile) {\n console.log('Saving partially upgraded package.json')\n await fs.writeFile('package.json', lastPkgFile)\n }\n\n // re-install from restored package.json and lockfile\n await runInstall()\n }\n}\n\nexport default doctor\n","import { findUp } from 'find-up'\nimport fs from 'fs/promises'\nimport { text } from 'node:stream/consumers'\nimport path from 'path'\nimport { print } from '../lib/logging'\nimport { Options } from '../types/Options'\nimport chalk from './chalk'\nimport programError from './programError'\n\n/**\n * Finds the package file and data.\n *\n * Searches as follows:\n * --packageData flag\n * --packageFile flag\n * --stdin\n * --findUp\n */\nasync function findPackage(options: Options): Promise<{\n pkgData: string | null\n pkgFile: string | null\n pkgPath: string | null\n}> {\n let pkgData\n let pkgFile = null\n const pkgPath = options.packageFile || 'package.json'\n\n /** Reads the contents of a package file. */\n function getPackageDataFromFile(pkgFile: string | null | undefined, pkgFileName: string): Promise<string> {\n // exit if no pkgFile to read from fs\n if (pkgFile != null) {\n const relPathToPackage = path.resolve(pkgFile)\n print(options, `${options.upgrade ? 'Upgrading' : 'Checking'} ${relPathToPackage}`)\n } else {\n programError(\n options,\n `${chalk.red(\n `No ${pkgFileName}`,\n )}\\n\\nPlease add a ${pkgFileName} to the current directory, specify the ${chalk.cyan(\n '--packageFile',\n )} or ${chalk.cyan('--packageData')} options, or pipe a ${pkgFileName} to stdin and specify ${chalk.cyan(\n '--stdin',\n )}.`,\n { color: false },\n )\n }\n\n return fs.readFile(pkgFile!, 'utf-8').catch(e => {\n programError(options, e)\n })\n }\n\n print(options, 'Running in local mode', 'verbose')\n print(options, 'Finding package file data', 'verbose')\n\n // get the package data from the various input possibilities\n if (options.packageData) {\n pkgFile = null\n pkgData = Promise.resolve(options.packageData)\n } else if (options.packageFile) {\n pkgFile = options.packageFile\n pkgData = getPackageDataFromFile(pkgFile, pkgPath)\n } else if (options.stdin) {\n print(options, 'Waiting for package data on stdin', 'verbose')\n\n // get data from stdin\n // trim stdin to account for \\r\\n\n const stdinData = await text(process.stdin)\n const data = stdinData.trim().length > 0 ? stdinData : null\n\n // if no stdin content fall back to searching for package.json from pwd and up to root\n pkgFile = data || !pkgPath ? null : await findUp(pkgPath)\n pkgData = data || getPackageDataFromFile(await pkgFile, pkgPath)\n } else {\n // find the closest package starting from the current working directory and going up to the root\n pkgFile = pkgPath\n ? await findUp(\n !options.packageFile && options.packageManager === 'deno' ? ['deno.json', 'deno.jsonc'] : pkgPath,\n {\n cwd: options.cwd || process.cwd(),\n },\n )\n : null\n pkgData = getPackageDataFromFile(pkgFile, pkgPath)\n }\n\n const pkgDataResolved = await pkgData\n\n return {\n pkgData: pkgDataResolved,\n pkgFile: pkgFile || null,\n pkgPath,\n }\n}\n\nexport default findPackage\n","import glob, { type Options as GlobOptions } from 'fast-glob'\nimport fs from 'fs/promises'\nimport yaml from 'js-yaml'\nimport { extend } from 'lodash'\nimport path from 'path'\nimport picomatch from 'picomatch'\nimport untildify from 'untildify'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { PackageFile } from '../types/PackageFile'\nimport { PackageInfo } from '../types/PackageInfo'\nimport { VersionSpec } from '../types/VersionSpec'\nimport findPackage from './findPackage'\nimport loadPackageInfoFromFile from './loadPackageInfoFromFile'\nimport programError from './programError'\n\ntype PnpmWorkspaces =\n | string[]\n | { packages: string[]; catalog?: Index<VersionSpec>; catalogs?: Index<Index<VersionSpec>> }\n\n/** */\nfunction getGlobOptions(options: Options): GlobOptions {\n const ignoreDirs = typeof options.ignore === 'string' ? [options.ignore] : options.ignore || []\n return {\n ignore: ['**/node_modules/**', ...ignoreDirs],\n }\n}\n\n/** Reads, parses, and resolves workspaces from a pnpm-workspace file at the same path as the package file. */\nconst readPnpmWorkspaces = async (pkgPath: string): Promise<PnpmWorkspaces | null> => {\n const pnpmWorkspacesPath = path.join(path.dirname(pkgPath), 'pnpm-workspace.yaml')\n let pnpmWorkspaceFile: string\n try {\n pnpmWorkspaceFile = await fs.readFile(pnpmWorkspacesPath, 'utf-8')\n } catch {\n return null\n }\n return yaml.load(pnpmWorkspaceFile) as PnpmWorkspaces\n}\n\n/** Gets catalog dependencies from both pnpm-workspace.yaml and package.json files. */\nconst readCatalogDependencies = async (options: Options, pkgPath: string): Promise<Index<VersionSpec> | null> => {\n const catalogDependencies: Index<VersionSpec> = {}\n\n // Read from pnpm-workspace.yaml if the package manager is pnpm\n if (options.packageManager === 'pnpm') {\n const pnpmWorkspaces = await readPnpmWorkspaces(pkgPath)\n if (pnpmWorkspaces && !Array.isArray(pnpmWorkspaces)) {\n // Handle both singular 'catalog' and plural 'catalogs'\n if (pnpmWorkspaces.catalog) {\n Object.assign(catalogDependencies, pnpmWorkspaces.catalog)\n }\n if (pnpmWorkspaces.catalogs) {\n Object.assign(catalogDependencies, ...Object.values(pnpmWorkspaces.catalogs))\n }\n }\n }\n\n // Read from package.json (for Bun and modern pnpm)\n const packageData: PackageFile & {\n catalog?: Index<VersionSpec>\n catalogs?: Index<Index<VersionSpec>>\n workspaces?: string[] | { packages: string[]; catalog?: Index<VersionSpec>; catalogs?: Index<Index<VersionSpec>> }\n } = JSON.parse(await fs.readFile(pkgPath, 'utf-8'))\n\n Object.assign(catalogDependencies, packageData.catalog, ...Object.values(packageData.catalogs ?? {}))\n\n // Workspaces catalogs (Bun format)\n if (packageData.workspaces && !Array.isArray(packageData.workspaces)) {\n Object.assign(\n catalogDependencies,\n packageData.workspaces.catalog,\n ...Object.values(packageData.workspaces.catalogs ?? {}),\n )\n }\n\n return Object.keys(catalogDependencies).length > 0 ? catalogDependencies : null\n}\n\n/**\n * Gets all workspace packages information.\n *\n * @param options the application options, used to determine which packages to return.\n * @param defaultPackageFilename the default package filename\n * @returns a list of PackageInfo objects, one for each workspace file\n */\nasync function getWorkspacePackageInfos(\n options: Options,\n defaultPackageFilename: string,\n rootPackageFile: string,\n cwd: string,\n): Promise<[PackageInfo[], string[]]> {\n // use silent; otherwise, there will be a duplicate \"Checking\" message\n const { pkgData, pkgPath } = await findPackage({ ...options, packageFile: rootPackageFile, loglevel: 'silent' })\n const rootPkg: PackageFile = typeof pkgData === 'string' ? JSON.parse(pkgData) : pkgData\n\n const workspacesObject = rootPkg.workspaces || (await readPnpmWorkspaces(pkgPath || ''))\n const workspaces = Array.isArray(workspacesObject) ? workspacesObject : workspacesObject?.packages\n\n if (!workspaces) {\n programError(\n options,\n `workspaces property missing from package.json. --workspace${\n options.workspaces ? 's' : ''\n } only works when you specify a \"workspaces\" property in your package.json.`,\n )\n }\n\n // build a glob from the workspaces\n // FIXME: the following workspaces check is redundant\n const workspacePackageGlob: string[] = (workspaces || []).map(workspace =>\n path\n .join(cwd, workspace, 'package.json')\n // convert Windows path to *nix path for globby\n .replace(/\\\\/g, '/'),\n )\n const globOptions = getGlobOptions(options)\n // e.g. [packages/a/package.json, ...]\n const allWorkspacePackageFilepaths: string[] = glob.sync(workspacePackageGlob, globOptions)\n\n // Get the package names from the package files.\n // If a package does not have a name, use the folder name.\n // These will be used to filter out local workspace packages so they are not fetched from the registry.\n const allWorkspacePackageInfos: PackageInfo[] = await Promise.all(\n allWorkspacePackageFilepaths.map(async (filepath: string): Promise<PackageInfo> => {\n const info: PackageInfo = await loadPackageInfoFromFile(options, filepath)\n info.name = info.pkg.name || filepath.split('/').slice(-2)[0]\n return info\n }),\n )\n\n // Workspace package names\n // These will be used to filter out local workspace packages so they are not fetched from the registry.\n const allWorkspacePackageNames: string[] = allWorkspacePackageInfos.map(\n (packageInfo: PackageInfo): string => packageInfo.name || '',\n )\n\n const filterWorkspaces = options.workspaces !== true\n if (!filterWorkspaces) {\n // --workspaces\n return [allWorkspacePackageInfos, allWorkspacePackageNames]\n }\n\n // add workspace packages\n // --workspace\n const selectedWorkspacePackageInfos: PackageInfo[] = allWorkspacePackageInfos.filter((packageInfo: PackageInfo) =>\n options.workspace?.some((workspace: string) =>\n workspaces?.some(\n (workspacePattern: string) =>\n packageInfo.name === workspace ||\n packageInfo.filepath ===\n path.join(cwd, path.dirname(workspacePattern), workspace, defaultPackageFilename).replace(/\\\\/g, '/'),\n ),\n ),\n )\n return [selectedWorkspacePackageInfos, allWorkspacePackageNames]\n}\n\n/**\n * Gets catalog package info from pnpm-workspace.yaml or package.json.\n *\n * @param options the application options\n * @param pkgPath the package file path (already resolved)\n * @returns PackageInfo for catalog dependencies or null if no catalogs exist\n */\nasync function getCatalogPackageInfo(options: Options, pkgPath: string): Promise<PackageInfo | null> {\n if (!pkgPath) {\n return null\n }\n\n const catalogDependencies = await readCatalogDependencies(options, pkgPath)\n if (!catalogDependencies) {\n return null\n }\n\n // Create a synthetic package info for catalog dependencies\n const catalogPackageFile: PackageFile = {\n name: 'catalog-dependencies',\n version: '1.0.0',\n dependencies: catalogDependencies,\n }\n\n // Determine the correct file path for catalogs. For pnpm, use pnpm-workspace.yaml.\n // For Bun catalogs in package.json, use a virtual path to avoid conflicts with root package.\n const catalogFilePath =\n options.packageManager === 'pnpm' ? path.join(path.dirname(pkgPath), 'pnpm-workspace.yaml') : `${pkgPath}#catalog`\n\n // Create synthetic file content that matches the synthetic PackageFile\n const syntheticFileContent = JSON.stringify(catalogPackageFile, null, 2)\n\n const catalogPackageInfo: PackageInfo = {\n filepath: catalogFilePath,\n pkg: catalogPackageFile,\n pkgFile: syntheticFileContent,\n name: 'catalogs',\n }\n\n return catalogPackageInfo\n}\n\n/**\n * Gets all local packages, including workspaces (depending on -w, -ws, and -root).\n *\n * @param options the application options, used to determine which packages to return.\n * @returns PackageInfo[] an array of all package infos to be considered for updating\n */\nasync function getAllPackages(options: Options): Promise<[PackageInfo[], string[]]> {\n const defaultPackageFilename = options.packageFile || 'package.json'\n const cwd = options.cwd ? untildify(options.cwd) : './'\n const rootPackageFile = options.packageFile || (options.cwd ? path.join(cwd, 'package.json') : 'package.json')\n\n const useWorkspaces: boolean =\n options.workspaces === true || (options.workspace !== undefined && options.workspace.length !== 0)\n\n let packageInfos: PackageInfo[] = []\n\n // Find the package file with globby.\n // When in workspaces mode, only include the root project package file when --root is used.\n const getBasePackageFile: boolean = !useWorkspaces || options.root === true\n if (getBasePackageFile) {\n // we are either:\n // * NOT a workspace\n // * a workspace and have requested an upgrade of the workspace-root\n const globPattern = rootPackageFile.replace(/\\\\/g, '/')\n const globOptions = getGlobOptions(options)\n const rootPackagePaths = glob.sync(globPattern, globOptions)\n // realistically there should only be zero or one\n const rootPackages = await Promise.all(\n rootPackagePaths.map(\n async (packagePath: string): Promise<PackageInfo> => await loadPackageInfoFromFile(options, packagePath),\n ),\n )\n packageInfos = [...packageInfos, ...rootPackages]\n }\n\n if (!useWorkspaces) {\n return [packageInfos, []]\n }\n\n // Read catalog dependencies first so we can resolve references\n let catalogPackageInfo: PackageInfo | null = null\n\n if (useWorkspaces) {\n const { pkgPath: workspacePkgPath } = await findPackage({\n ...options,\n packageFile: rootPackageFile,\n loglevel: 'silent',\n })\n if (workspacePkgPath) {\n catalogPackageInfo = await getCatalogPackageInfo(options, workspacePkgPath)\n }\n }\n\n // workspaces\n const [workspacePackageInfos, workspaceNames]: [PackageInfo[], string[]] = await getWorkspacePackageInfos(\n options,\n defaultPackageFilename,\n rootPackageFile,\n cwd,\n )\n\n // Don't resolve catalog references in workspace packages - leave them as \"catalog:*\"\n // Only the catalog definitions themselves should be updated\n packageInfos = [...packageInfos, ...workspacePackageInfos]\n\n // Add catalog package info for version checking (only if there are catalogs)\n if (catalogPackageInfo) {\n packageInfos = [...packageInfos, catalogPackageInfo]\n }\n\n // Filter out ignored directories using glob patterns\n if (options.ignore) {\n const ignoreDirs = Array.isArray(options.ignore) ? options.ignore : [options.ignore]\n\n packageInfos = packageInfos.filter(packageInfo => {\n const relativePath = path.relative(cwd, packageInfo.filepath).replace(/\\\\/g, '/')\n const dirPath = path.dirname(relativePath).replace(/\\\\/g, '/')\n\n // Check if any ignore pattern matches the directory path\n return !ignoreDirs.some(ignorePattern => {\n // Create glob matchers for the pattern\n const isMatch = picomatch(ignorePattern)\n\n // Test against both the full relative path and just the directory path\n return isMatch(relativePath) || isMatch(dirPath) || isMatch(`${dirPath}/`)\n })\n })\n }\n\n return [packageInfos, workspaceNames]\n}\n\nexport default getAllPackages\n","import os from 'os'\nimport path from 'path'\nimport { rcFile } from 'rc-config-loader'\nimport { cliOptionsMap } from '../cli-options'\nimport { Options } from '../types/Options'\nimport { RcOptions } from '../types/RcOptions'\nimport programError from './programError'\n\n/** Loads the .ncurc config file. */\nasync function getNcuRc({\n configFileName,\n configFilePath,\n packageFile,\n global,\n options,\n}: {\n configFileName?: string\n configFilePath?: string\n /** If true, does not look in package directory. */\n global?: boolean\n packageFile?: string\n options: Options\n}) {\n const { default: chalkDefault, Chalk } = await import('chalk')\n const chalk = options?.color ? new Chalk({ level: 1 }) : chalkDefault\n\n const rawResult = rcFile<RcOptions>('ncurc', {\n configFileName: configFileName || '.ncurc',\n defaultExtension: ['.json', '.yml', '.js'],\n cwd: configFilePath || (global ? os.homedir() : packageFile ? path.dirname(packageFile) : undefined),\n })\n\n // ensure a file was found if expected\n const filePath = rawResult?.filePath\n if (configFileName && !filePath) {\n programError(options, `Config file ${configFileName} not found in ${configFilePath || process.cwd()}`)\n }\n\n // convert the config to valid options by removing $schema and parsing format\n const { $schema: _, ...rawConfig } = rawResult?.config || {}\n const config: Options = rawConfig\n if (typeof config.format === 'string') config.format = cliOptionsMap.format.parse!(config.format)\n\n // validate arguments here to provide a better error message\n const unknownOptions = Object.keys(config).filter(arg => !cliOptionsMap[arg])\n if (unknownOptions.length > 0) {\n console.error(\n chalk.red(`Unknown option${unknownOptions.length === 1 ? '' : 's'} found in config file:`),\n chalk.gray(unknownOptions.join(', ')),\n )\n console.info('Using config file ' + filePath)\n console.info(`You can change the config file path with ${chalk.blue('--configFilePath')}`)\n }\n\n // flatten config object into command line arguments to be read by commander\n const args = Object.entries(config).flatMap(([name, value]): any[] => {\n // render boolean options as a single parameter\n // an option is considered boolean if its type is explicitly set to boolean, or if it is has a proper JavaScript boolean value\n if (typeof value === 'boolean' || cliOptionsMap[name]?.type === 'boolean') {\n // if the boolean option is true, include only the nullary option --${name}; otherwise, exclude it\n return value ? [`--${name}`] : []\n }\n // otherwise render as a 2-tuple with name and value\n return [`--${name}`, value]\n })\n\n return { filePath, args, config }\n}\n\nexport default getNcuRc\n","/** Fetches package metadata from GitHub tags. */\nimport childProcess from 'node:child_process'\nimport { promisify } from 'node:util'\nimport parseGitHubUrl from 'parse-github-url'\nimport { valid } from 'semver'\nimport { print } from '../lib/logging'\nimport * as versionUtil from '../lib/version-util'\nimport { GetVersion } from '../types/GetVersion'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { VersionLevel } from '../types/VersionLevel'\nimport { VersionResult } from '../types/VersionResult'\nimport { VersionSpec } from '../types/VersionSpec'\n\nconst execFile = promisify(childProcess.execFile)\n\n/**\n * Fetches and extracts all git tags from a git url.\n *\n * @param url - url to a github repository.\n * @returns the extracted git tags.\n */\nasync function getGitTags(url: string): Promise<Index<string>> {\n const out = (await execFile('git', ['ls-remote', '--tags', url])).stdout\n const tags: Index<string> = {}\n for (const line of out.trim().split('\\n')) {\n const splitted = line.split('\\t')\n tags[splitted[1].replace(/^refs\\/tags\\/|\\^{}$/g, '')] = splitted[0]\n }\n return tags\n}\n\n/** Gets remote versions sorted. */\nasync function getSortedVersions(\n name: string,\n declaration: VersionSpec,\n options?: Options,\n): Promise<string[] | undefined> {\n // if present, github: is parsed as the protocol. This is not valid when passed into remote-git-tags.\n declaration = declaration.replace(/^github:/, '')\n const { auth, protocol, host, path } = parseGitHubUrl(declaration)!\n let tags: Index<string>\n\n try {\n if (protocol !== null) {\n tags = await getGitTags(\n `${protocol ? protocol.replace('git+', '') : 'https:'}//${auth ? auth + '@' : ''}${host}/${path?.replace(/^:/, '')}`,\n )\n } else {\n try {\n tags = await getGitTags(`ssh://git@${host}/${path?.replace(/^:/, '')}`)\n } catch {\n tags = await getGitTags(`https://${auth ? auth + '@' : ''}${host}/${path}`)\n }\n }\n } catch (e) {\n // catch a variety of errors that occur on invalid or private repos\n print(options ?? {}, `Invalid, private repo, or no tags for ${name}: ${declaration}`, 'verbose')\n return\n }\n\n return (\n Object.keys(tags)\n .map(versionUtil.fixPseudoVersion)\n // do not pass semver.valid reference directly since the mapping index will be interpreted as the loose option\n // https://github.com/npm/node-semver#functions\n .filter(tag => valid(tag))\n .sort(versionUtil.compareVersions)\n )\n}\n\n/** Return the highest non-prerelease numbered tag on a remote Git URL. */\nexport const latest: GetVersion = async (name: string, declaration: VersionSpec, options?: Options) => {\n const versions = await getSortedVersions(name, declaration, options)\n if (!versions) return { version: null }\n const versionsFiltered = options?.pre ? versions : versions.filter(v => !versionUtil.isPre(v))\n const latestVersion = versionsFiltered[versionsFiltered.length - 1]\n return { version: latestVersion ? versionUtil.upgradeGitHubUrl(declaration, latestVersion) : null }\n}\n\n/** Return the highest numbered tag on a remote Git URL. */\nexport const greatest: GetVersion = async (name: string, declaration: VersionSpec, options?: Options) => {\n const versions = await getSortedVersions(name, declaration, options)\n if (!versions) return { version: null }\n const greatestVersion = versions[versions.length - 1]\n return { version: greatestVersion ? versionUtil.upgradeGitHubUrl(declaration, greatestVersion) : null }\n}\n\n/** Returns a function that returns the highest version at the given level. */\nexport const greatestLevel =\n (level: VersionLevel) =>\n async (name: string, declaration: VersionSpec, options: Options = {}): Promise<VersionResult> => {\n const version = decodeURIComponent(parseGitHubUrl(declaration)!.branch).replace(/^semver:/, '')\n const versions = await getSortedVersions(name, declaration, options)\n if (!versions) return { version: null }\n\n const greatestMinor = versionUtil.findGreatestByLevel(\n versions.map(v => v.replace(/^v/, '')),\n version,\n level,\n )\n\n return { version: greatestMinor ? versionUtil.upgradeGitHubUrl(declaration, greatestMinor) : null }\n }\n\nexport const minor = greatestLevel('minor')\nexport const patch = greatestLevel('patch')\n\n/** All git tags are exact versions, so --target semver should never upgrade git tags. */\n// https://github.com/raineorshine/npm-check-updates/pull/1368\nexport const semver: GetVersion = async (_name: string, _declaration: VersionSpec, _options?: Options) => {\n return { version: null }\n}\n\n// use greatest for newest rather than leaving newest undefined\n// this allows a mix of npm and github urls to be used in a package file without causing an \"Unsupported target\" error\nexport const newest = greatest\n","import memoize from 'fast-memoize'\nimport fs from 'fs/promises'\nimport programError from '../lib/programError'\nimport { GetVersion } from '../types/GetVersion'\nimport { Options } from '../types/Options'\nimport { StaticRegistry } from '../types/StaticRegistry'\nimport { Version } from '../types/Version'\n\n/** Returns true if a string is a url. */\nconst isUrl = (s: string) => (s && s.startsWith('http://')) || s.startsWith('https://')\n\n/**\n * Returns a registry object given a valid file path or url.\n *\n * @param path\n * @returns a registry object\n */\nconst readStaticRegistry = async (options: Options): Promise<StaticRegistry> => {\n const path = options.registry!\n let content: string\n\n // url\n if (isUrl(path)) {\n const body = await fetch(path)\n content = await body.text()\n }\n // local path\n else {\n try {\n content = await fs.readFile(path, 'utf8')\n } catch (err) {\n programError(options, `\\nThe specified static registry file does not exist: ${options.registry}`)\n }\n }\n\n return JSON.parse(content)\n}\n\nconst registryMemoized = memoize(readStaticRegistry)\n\n/**\n * Fetches the version in static registry.\n *\n * @param packageName\n * @param currentVersion\n * @param options\n * @returns A promise that fulfills to string value or null\n */\nexport const latest: GetVersion = async (packageName: string, currentVersion: Version, options?: Options) => {\n const registry: StaticRegistry = await registryMemoized(options || {})\n return { version: registry[packageName] || null }\n}\n","import { Index } from '../types/IndexType'\nimport { PackageManager } from '../types/PackageManager'\nimport * as bun from './bun'\nimport * as gitTags from './gitTags'\nimport * as npm from './npm'\nimport * as pnpm from './pnpm'\nimport * as staticRegistry from './staticRegistry'\nimport * as yarn from './yarn'\n\nexport default {\n npm,\n pnpm,\n yarn,\n bun,\n gitTags,\n staticRegistry,\n} as Index<PackageManager>\n","import { dequal } from 'dequal'\nimport propertyOf from 'lodash/propertyOf'\nimport cliOptions from '../cli-options'\nimport { print } from '../lib/logging'\nimport packageManagers from '../package-managers'\nimport { FilterPattern } from '../types/FilterPattern'\nimport { Options } from '../types/Options'\nimport { RunOptions } from '../types/RunOptions'\nimport { Target } from '../types/Target'\nimport cacher from './cache'\nimport determinePackageManager from './determinePackageManager'\nimport exists from './exists'\nimport keyValueBy from './keyValueBy'\nimport programError from './programError'\n\nfunction parseFilterExpression(filterExpression: string[] | undefined): string[] | undefined\nfunction parseFilterExpression(filterExpression: FilterPattern | undefined): FilterPattern | undefined\n/** Trims and filters out empty values from a filter expression. */\nfunction parseFilterExpression(filterExpression: FilterPattern | undefined): FilterPattern | undefined {\n if (typeof filterExpression === 'string') {\n return filterExpression.trim()\n } else if (\n Array.isArray(filterExpression) &&\n (filterExpression.length === 0 || typeof filterExpression[0] === 'string')\n ) {\n const filtered = filterExpression.map(s => (typeof s === 'string' ? s.trim() : s)).filter(x => x)\n return filtered.length > 0 ? filtered : undefined\n } else {\n return filterExpression\n }\n}\n\n/** Checks if a string is a valid URL. */\nfunction isValidUrl(url: string): boolean {\n try {\n new URL(url)\n return true\n } catch {\n return false\n }\n}\n\n/** Initializes, validates, sets defaults, and consolidates program options. */\nasync function initOptions(runOptions: RunOptions, { cli }: { cli?: boolean } = {}): Promise<Options> {\n const { default: chalkDefault, Chalk } = await import('chalk')\n const chalk = runOptions.color ? new Chalk({ level: 1 }) : chalkDefault\n\n // if not executed on the command-line (i.e. executed as a node module), set the defaults\n if (!cli) {\n // set cli defaults since they are not set by commander in this case\n const cliDefaults = cliOptions.reduce(\n (acc, curr) => ({\n ...acc,\n ...(curr.default != null ? { [curr.long]: curr.default } : null),\n }),\n {},\n )\n\n // set default options that are specific to module usage\n const moduleDefaults: Options = {\n jsonUpgraded: true,\n silent: runOptions.silent || (runOptions.loglevel === undefined && !runOptions.verbose),\n args: [],\n }\n\n runOptions = { ...cliDefaults, ...moduleDefaults, ...runOptions }\n }\n\n // convert packageData to string to convert RunOptions to Options\n const options: Options = {\n ...runOptions,\n ...(runOptions.packageData && typeof runOptions.packageData !== 'string'\n ? { packageData: JSON.stringify(runOptions.packageData, null, 2) as any }\n : null),\n cli,\n }\n\n // consolidate loglevel\n const loglevel =\n options.silent || options.format?.includes('lines') ? 'silent' : options.verbose ? 'verbose' : options.loglevel\n\n const json = Object.keys(options)\n .filter(option => option.startsWith('json'))\n .some(propertyOf(options))\n\n if (!json && loglevel !== 'silent' && options.rcConfigPath && !options.doctor) {\n print(options, `Using config file ${options.rcConfigPath}`)\n }\n\n // warn about deprecated options\n const deprecatedOptions = cliOptions.filter(\n ({ long, deprecated }) =>\n (deprecated && options[long as keyof Options]) ||\n // special case to deprecate a value but not the entire option\n (long === 'packageManager' && options.packageManager === 'staticRegistry'),\n )\n if (deprecatedOptions.length > 0) {\n deprecatedOptions.forEach(({ long, description }) => {\n const deprecationMessage =\n long === 'packageManager'\n ? '--packageManager staticRegistry is deprecated. Use --registryType json.'\n : `--${long}: ${description}`\n print(options, chalk.yellow(deprecationMessage), 'warn')\n })\n print(options, '', 'warn')\n }\n\n // validate options with predefined choices\n cliOptions.forEach(({ long, choices }) => {\n if (!choices || choices.length === 0) return\n const value = options[long as keyof Options]\n const values = Array.isArray(value) ? value : [value]\n if (values.length === 0) return\n // make sure the option value is valid\n // if an array of values is given, make sure each one is a valid choice\n if (values.every(value => !choices.includes(value))) {\n programError(options, `Invalid option value: --${long} ${value}. Valid values are: ${choices.join(', ')}.`)\n }\n })\n\n // validate options.cwd\n if (options.cwd && !(await exists(options.cwd))) {\n programError(options, `No such directory: ${options.cwd}`)\n }\n\n // trim filter args\n // disallow non-matching filter and args\n const args = parseFilterExpression(options.args)\n const filter = parseFilterExpression(options.filter)\n const filterVersion = parseFilterExpression(options.filterVersion)\n const reject = parseFilterExpression(options.reject)\n const rejectVersion = parseFilterExpression(options.rejectVersion)\n const registryType = options.registryType || (options.registry?.endsWith('.json') ? 'json' : 'npm')\n\n // convert to string for comparison purposes\n // otherwise ['a b'] will not match ['a', 'b']\n if (options.filter && args && !dequal(args.join(' '), Array.isArray(filter) ? filter.join(' ') : filter)) {\n programError(\n options,\n 'Cannot specify a filter using both --filter and args. Did you forget to quote an argument?\\nSee: https://github.com/raineorshine/npm-check-updates/issues/759#issuecomment-723587297',\n )\n }\n // disallow packageFile and --deep\n else if (options.packageFile && options.deep) {\n programError(\n options,\n `Cannot specify both --packageFile and --deep. --deep is an alias for --packageFile '**/package.json'`,\n )\n }\n // disallow --format lines and --jsonUpgraded\n else if (options.format?.includes('lines') && options.jsonUpgraded) {\n programError(options, 'Cannot specify both --format lines and --jsonUpgraded.')\n } else if (options.format?.includes('lines') && options.jsonAll) {\n programError(options, 'Cannot specify both --format lines and --jsonAll.')\n } else if (options.format?.includes('lines') && options.format.length > 1) {\n programError(options, 'Cannot use --format lines with other formatting options.')\n }\n // disallow --workspace and --workspaces\n else if (options.workspace?.length && options.workspaces) {\n programError(options, 'Cannot specify both --workspace and --workspaces.')\n }\n // disallow --workspace(s) and --deep\n else if (options.deep && (options.workspace?.length || options.workspaces)) {\n programError(options, `Cannot specify both --deep and --workspace${options.workspaces ? 's' : ''}.`)\n }\n // disallow --workspace(s) and --doctor\n else if (options.doctor && (options.workspace?.length || options.workspaces)) {\n programError(options, `Doctor mode is not currently supported with --workspace${options.workspaces ? 's' : ''}.`)\n }\n // disallow missing registry path when using registryType\n else if (options.packageManager === 'staticRegistry' && !options.registry) {\n programError(\n options,\n 'When --package-manager staticRegistry is specified, you must provide the path for the registry file with --registry.',\n )\n } else if (options.registryType === 'json' && !options.registry) {\n programError(\n options,\n 'When --registryType json is specified, you must provide the path for the registry file with --registry. Run \"ncu --help registryType\" for details.',\n )\n } else if (registryType !== 'json' && options.registry && !isValidUrl(options.registry)) {\n programError(options, `--registry must be a valid URL. Invalid value: \"${options.registry}\"`)\n }\n\n if (options.cooldown != null) {\n const isValidNumber = typeof options.cooldown === 'number' && !isNaN(options.cooldown) && options.cooldown >= 0\n const isValidFunction = typeof options.cooldown === 'function'\n\n if (!isValidNumber && !isValidFunction) {\n programError(options, 'Cooldown must be a non-negative integer representing days since published or a function')\n }\n }\n\n const target: Target = options.target || 'latest'\n\n const autoPre = target === 'newest' || target === 'greatest'\n\n const packageManager = await determinePackageManager(options)\n\n const resolvedOptions: Options = {\n ...options,\n ...(options.deep ? { packageFile: '**/package.json' } : null),\n ...(packageManager === 'deno' ? { dep: ['imports'] } : null),\n ...(options.format && options.format.length > 0 ? { format: options.format } : null),\n filter: args || filter,\n filterVersion,\n // add shortcut for any keys that start with 'json'\n json,\n loglevel,\n minimal: options.minimal === undefined ? false : options.minimal,\n // default to false, except when newest or greatest are set\n // this is overridden on a per-dependency basis in queryVersions to allow prereleases to be upgraded to newer prereleases\n ...(options.pre != null || autoPre ? { pre: options.pre != null ? !!options.pre : autoPre } : null),\n reject,\n rejectVersion,\n target,\n // imply upgrade in interactive mode when json is not specified as the output\n ...(options.interactive && options.upgrade === undefined ? { upgrade: !json } : null),\n packageManager,\n ...(options.prefix\n ? {\n // use the npm prefix if the package manager does not define defaultPrefix\n prefix: await (packageManagers[packageManager || '']?.defaultPrefix || packageManagers.npm.defaultPrefix!)(\n options,\n ),\n }\n : null),\n registryType,\n }\n resolvedOptions.cacher = await cacher(resolvedOptions)\n\n // remove undefined values\n const resolvedOptionsFiltered: Options = keyValueBy(\n resolvedOptions as { [key: string]: Options[keyof Options] },\n (key, value) => (value !== undefined ? { [key]: value } : null),\n )\n\n // print 'Using yarn/pnpm/etc' when autodetected\n // use resolved options so that options.json is set\n if (!options.packageManager && packageManager !== 'npm') {\n print(resolvedOptionsFiltered, `Using ${packageManager}`)\n }\n\n return resolvedOptionsFiltered\n}\n\nexport default initOptions\n","import { Options } from '../types/Options'\n\ntype OptionKey = keyof Options\n\n/** Merges two arrays into one, removing duplicates. */\nfunction mergeArrays(arr1: any[], arr2: any[]) {\n return Array.from(new Set([...(arr1 || []), ...(arr2 || [])]))\n}\n\n/**\n * Shallow merge (specific or all) properties.\n * If some properties both are arrays, then merge them also.\n */\nfunction mergeOptions(rawOptions1: Options | null, rawOptions2: Options | null) {\n const options1: Options = rawOptions1 || {}\n const options2: Options = rawOptions2 || {}\n const result = { ...options1, ...options2 }\n ;(Object.keys(result) as OptionKey[]).forEach(key => {\n if (Array.isArray(options1[key]) && Array.isArray(options2[key])) {\n result[key] = mergeArrays(options1[key] as any[], options2[key] as any[]) as any\n }\n })\n return result\n}\n\nexport default mergeOptions\n","import { and, or } from 'fp-and-or'\nimport identity from 'lodash/identity'\nimport picomatch from 'picomatch'\nimport { parseRange } from 'semver-utils'\nimport { FilterPattern } from '../types/FilterPattern'\nimport { Maybe } from '../types/Maybe'\nimport { VersionSpec } from '../types/VersionSpec'\n\n/**\n * Creates a filter function from a given filter string.\n * Supports strings, wildcards, comma-or-space-delimited lists, and regexes.\n * The filter function *may* throw an exception if the filter pattern is invalid.\n *\n * @param [filterPattern]\n * @returns\n */\nfunction composeFilter(filterPattern: FilterPattern): (name: string, versionSpec?: string) => boolean {\n let predicate: (name: string, versionSpec?: string) => boolean\n\n // no filter\n if (!filterPattern) {\n predicate = identity\n }\n // string\n else if (typeof filterPattern === 'string') {\n // RegExp string\n if (filterPattern[0] === '/' && filterPattern.at(-1) === '/') {\n const regexp = new RegExp(filterPattern.slice(1, -1))\n predicate = (dependencyName: string) => regexp.test(dependencyName)\n }\n // glob string\n else {\n const patterns = filterPattern.split(/[\\s,]+/)\n predicate = (dependencyName: string) => {\n /** Returns true if the pattern matches an unscoped dependency name. */\n const matchUnscoped = (pattern: string) => picomatch(pattern)(dependencyName)\n\n /** Returns true if the pattern matches a scoped dependency name. */\n const matchScoped = (pattern: string) =>\n !pattern.includes('/') &&\n dependencyName.includes('/') &&\n picomatch(pattern)(dependencyName.replace(/\\//g, '_'))\n\n // return true if any of the provided patterns match the dependency name\n return patterns.some(or(matchUnscoped, matchScoped))\n }\n }\n }\n // array\n else if (Array.isArray(filterPattern)) {\n predicate = (dependencyName: string, versionSpec?: string) =>\n filterPattern.some(subpattern => composeFilter(subpattern)(dependencyName, versionSpec))\n }\n // raw RegExp\n else if (filterPattern instanceof RegExp) {\n predicate = (dependencyName: string) => filterPattern.test(dependencyName)\n }\n // function\n else if (typeof filterPattern === 'function') {\n predicate = (dependencyName: string, versionSpec?: string) =>\n filterPattern(dependencyName, parseRange((versionSpec as string) ?? dependencyName))\n } else {\n throw new TypeError('Invalid filter. Must be a RegExp, array, or comma-or-space-delimited list.')\n }\n\n // limit the arity to 1 to avoid passing the value\n return predicate\n}\n\n/**\n * Composes a filter function from filter, reject, filterVersion, and rejectVersion patterns. The filter function *may* throw an exception if the filter pattern is invalid.\n *\n * @param [filter]\n * @param [reject]\n * @param [filterVersion]\n * @param [rejectVersion]\n */\nfunction filterAndReject(\n filter: Maybe<FilterPattern>,\n reject: Maybe<FilterPattern>,\n filterVersion: Maybe<FilterPattern>,\n rejectVersion: Maybe<FilterPattern>,\n) {\n return and(\n // filter dep\n (dependencyName: VersionSpec, version: string) =>\n and(filter ? composeFilter(filter) : true, reject ? (...args) => !composeFilter(reject)(...args) : true)(\n dependencyName,\n version,\n ),\n // filter version\n (dependencyName: VersionSpec, version: string) =>\n and(\n filterVersion ? composeFilter(filterVersion) : true,\n rejectVersion ? (...args) => !composeFilter(rejectVersion)(...args) : true,\n )(version),\n )\n}\n\nexport default filterAndReject\n","import packageManagers from '../package-managers'\nimport { Maybe } from '../types/Maybe'\nimport { Options } from '../types/Options'\nimport { PackageManager } from '../types/PackageManager'\nimport programError from './programError'\n\n/**\n * Resolves the package manager from a string or object. Throws an error if an invalid packageManager is provided.\n *\n * @param packageManagerNameOrObject\n * @param packageManagerNameOrObject.global\n * @param packageManagerNameOrObject.packageManager\n * @returns\n */\nfunction getPackageManager(options: Options, name: Maybe<string>): PackageManager {\n // default to npm\n if (!name || name === 'deno') {\n return packageManagers.npm\n } else if (options.registryType === 'json') {\n return packageManagers.staticRegistry\n }\n\n if (!packageManagers[name]) {\n programError(options, `Invalid package manager: ${name}`)\n }\n\n return packageManagers[name]\n}\n\nexport default getPackageManager\n","import { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport filterAndReject from './filterAndReject'\nimport filterObject from './filterObject'\nimport getPackageManager from './getPackageManager'\nimport programError from './programError'\nimport { isWildPart } from './version-util'\n\n/**\n * @param [options]\n * @param options.cwd\n * @param options.filter\n * @param options.global\n * @param options.packageManager\n * @param options.prefix\n * @param options.reject\n */\nasync function getInstalledPackages(options: Options = {}) {\n const packages = await getPackageManager(options, options.packageManager).list?.({\n cwd: options.cwd,\n prefix: options.prefix,\n global: options.global,\n })\n\n if (!packages) {\n programError(options, 'Unable to retrieve package list')\n }\n\n // filter out undefined packages or those with a wildcard\n const filterFunction = filterAndReject(options.filter, options.reject, options.filterVersion, options.rejectVersion)\n let filteredPackages: Index<VersionSpec> = {}\n try {\n filteredPackages = filterObject(\n packages,\n (dep: VersionSpec, version: Version) => !!version && !isWildPart(version) && filterFunction(dep, version),\n )\n } catch (err: any) {\n programError(options, 'Invalid filter: ' + err.message || err)\n }\n\n return filteredPackages\n}\n\nexport default getInstalledPackages\n","import pMap from 'p-map'\nimport ProgressBar from 'progress'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { Version } from '../types/Version'\nimport getPackageManager from './getPackageManager'\n\ntype CircularData =\n | {\n isCircular: true\n offendingPackage: string\n }\n | {\n isCircular: false\n }\n\n/**\n * Checks if the specified package will create a loop of peer dependencies by traversing all paths to find a cycle\n *\n * If a cycle was found, the offending peer dependency of the specified package is returned\n */\nfunction isCircularPeer(peerDependencies: Index<Index<string>>, packageName: string): CircularData {\n let queue = [[packageName]]\n while (queue.length > 0) {\n const nextQueue: string[][] = []\n for (const path of queue) {\n const parents = Object.keys(peerDependencies[path[0]] ?? {})\n for (const name of parents) {\n if (name === path.at(-1)) {\n return {\n isCircular: true,\n offendingPackage: path[0],\n }\n }\n nextQueue.push([name, ...path])\n }\n }\n queue = nextQueue\n }\n return {\n isCircular: false,\n }\n}\n\n/**\n * Get the latest or greatest versions from the NPM repository based on the version target.\n *\n * @param packageMap An object whose keys are package name and values are version\n * @param [options={}] Options.\n * @returns Promised {packageName: peer dependencies} collection\n */\nasync function getPeerDependenciesFromRegistry(packageMap: Index<Version>, options: Options) {\n const packageManager = getPackageManager(options, options.packageManager)\n if (!packageManager.getPeerDependencies) return {}\n\n const numItems = Object.keys(packageMap).length\n let bar: ProgressBar\n if (!options.json && options.loglevel !== 'silent' && options.loglevel !== 'verbose' && numItems > 0) {\n bar = new ProgressBar('[:bar] :current/:total :percent', { total: numItems, width: 20 })\n bar.render()\n }\n\n const packageEntries = Object.entries(packageMap)\n\n /**\n * Fetches peer dependencies for a package\n * @param pkg - The package name\n * @param version - The package version\n * @returns Promise that resolves to package name and its peer dependencies\n */\n const getPeerDepsForPackage = async ([pkg, version]: [string, Version]): Promise<{\n pkg: string\n dependencies: Index<string>\n }> => {\n let dependencies: Index<string>\n const cached = options.cacher?.getPeers(pkg, version)\n if (cached) {\n dependencies = cached\n } else {\n dependencies = await packageManager.getPeerDependencies!(pkg, version, { cwd: options.cwd })\n options.cacher?.setPeers(pkg, version, dependencies)\n }\n if (bar) {\n bar.tick()\n }\n return { pkg, dependencies }\n }\n\n const results = await pMap(packageEntries, getPeerDepsForPackage, { concurrency: options.concurrency })\n\n const accum: Index<Index<string>> = {}\n for (const { pkg, dependencies } of results) {\n accum[pkg] = dependencies\n const circularData = isCircularPeer(accum, pkg)\n if (circularData.isCircular) {\n delete accum[pkg][circularData.offendingPackage]\n }\n }\n\n await options.cacher?.save()\n options.cacher?.log(true)\n\n return accum\n}\n\nexport default getPeerDependenciesFromRegistry\n","/** Creates an object composed of the picked `object` properties. */\nexport function pick<T extends object, U extends keyof T>(obj: T, props: U[]): Pick<T, U> {\n const newObject = {} as Pick<T, U>\n\n for (const prop of props) {\n newObject[prop] = obj[prop]\n }\n\n return newObject\n}\n\n/**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n */\nexport function pickBy<R, K extends keyof R>(\n object: R | null | undefined,\n predicate: (value: R[K], key: keyof R) => any,\n): Record<K, R[K]> {\n const newObject = {} as Record<K, R[K]>\n\n for (const [key, value] of Object.entries<R[K]>(object ?? {})) {\n const _key = key as K\n if (predicate(value, _key)) {\n newObject[_key] = value\n }\n }\n\n return newObject\n}\n","import { TargetFunction } from './TargetFunction'\n\n/** Valid strings for the --target option. Indicates the desired version to upgrade to. */\nexport const supportedVersionTargets = ['latest', 'newest', 'greatest', 'minor', 'patch', 'semver'] as const\n\n/** A union of supported version target strings. */\nexport type TargetString = (typeof supportedVersionTargets)[number]\n\n/** Upgrading to specific distribution tags can be done by passing @-starting value to --target option. */\nexport type TargetDistTag = `@${string}`\n\n/** The type of the --target option. Specifies the range from which to select the version to upgrade to. */\nexport type Target = TargetString | TargetDistTag | TargetFunction\n","import pMap from 'p-map'\nimport ProgressBar from 'progress'\nimport { parseRange } from 'semver-utils'\nimport packageManagers from '../package-managers'\nimport { GetVersion } from '../types/GetVersion'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { supportedVersionTargets } from '../types/Target'\nimport { VersionResult } from '../types/VersionResult'\nimport { VersionSpec } from '../types/VersionSpec'\nimport getPackageManager from './getPackageManager'\nimport keyValueBy from './keyValueBy'\nimport programError from './programError'\nimport { createNpmAlias, isGitHubUrl, isPre, parseNpmAlias } from './version-util'\n\n/**\n * Get the latest or greatest versions from the NPM repository based on the version target.\n *\n * @param packageMap An object whose keys are package name and values are current versions. May include npm aliases, i.e. { \"package\": \"npm:other-package@1.0.0\" }\n * @param [options={}] Options. Default: { target: 'latest' }.\n * @returns Promised {packageName: version} collection\n */\nasync function queryVersions(packageMap: Index<VersionSpec>, options: Options = {}): Promise<Index<VersionResult>> {\n const { default: chalkDefault, Chalk } = await import('chalk')\n const chalk = options.color ? new Chalk({ level: 1 }) : chalkDefault\n const packageList = Object.keys(packageMap)\n const globalPackageManager = getPackageManager(options, options.packageManager)\n\n let bar: ProgressBar | undefined\n if (!options.json && options.loglevel !== 'silent' && options.loglevel !== 'verbose' && packageList.length > 0) {\n bar = new ProgressBar('[:bar] :current/:total :percent', { total: packageList.length, width: 20 })\n bar.render()\n }\n\n /**\n * Ignore 404 errors from getPackageVersion by having them return `null`\n * instead of rejecting.\n *\n * @param dep\n * @returns\n */\n async function getPackageVersionProtected(dep: VersionSpec): Promise<VersionResult> {\n const npmAlias = parseNpmAlias(packageMap[dep])\n const [name, version] = npmAlias || [dep, packageMap[dep]]\n const targetOption = options.target || 'latest'\n const targetString = typeof targetOption === 'string' ? targetOption : targetOption(name, parseRange(version))\n const [target, distTag] = targetString.startsWith('@')\n ? ['distTag', targetString.slice(1)]\n : [targetString, 'latest']\n\n const cached = options.cacher?.get(name, target)\n if (cached) {\n bar?.tick()\n\n return {\n version: cached,\n }\n }\n\n let versionResult: VersionResult\n const isGitHubDependency = isGitHubUrl(packageMap[dep])\n\n // use gitTags package manager for git urls (for this dependency only)\n const packageManager = isGitHubDependency ? packageManagers.gitTags : globalPackageManager\n const packageManagerName = isGitHubDependency ? 'github urls' : options.packageManager || 'npm'\n\n const getPackageVersion = packageManager[target as keyof typeof packageManager] as GetVersion\n\n if (!getPackageVersion) {\n const packageManagerSupportedVersionTargets = supportedVersionTargets.filter(t => t in packageManager)\n programError(\n options,\n chalk.red(`\\nUnsupported target \"${target}\" using ${packageManagerName}`) +\n `\\nSupported version targets are: ` +\n packageManagerSupportedVersionTargets.join(', ') +\n (!isGitHubDependency ? ', and tags (e.g. @next)' : ''),\n { color: false },\n )\n }\n\n try {\n versionResult = await getPackageVersion(name, version, {\n ...options,\n distTag,\n // upgrade prereleases to newer prereleases by default\n // allow downgrading when explicit tag is used\n pre: options.pre != null ? options.pre : targetString.startsWith('@') || isPre(version),\n retry: options.retry ?? 2,\n }).catch(reason => {\n // This might happen if a (private) package cannot be accessed due to a missing or invalid token.\n return { error: reason?.body?.error || reason.toString() }\n })\n\n versionResult.version =\n !isGitHubDependency && npmAlias && versionResult?.version\n ? createNpmAlias(name, versionResult.version)\n : (versionResult?.version ?? null)\n } catch (err: any) {\n const errorMessage = err ? (err.message || err).toString() : ''\n if (errorMessage.match(/E504|Gateway Timeout/i)) {\n return {\n error: `${errorMessage}. All ${options.retry} retry attempts failed.`,\n }\n } else if (errorMessage.match(/E400|E404|ENOTFOUND|404 Not Found|400 Bad Request/i)) {\n return {\n error: `${errorMessage.replace(/ - Not found$/i, '')}. All ${\n options.retry\n } retry attempts failed. Either your internet connection is down, the registry is inaccessible, the authentication credentials are invalid, or the package does not exist.`,\n }\n } else if (err.code === 'ERR_INVALID_URL') {\n return {\n error: errorMessage || 'Invalid URL',\n }\n } else {\n // print a hint about the --timeout option for network timeout errors\n if (!process.env.NCU_TESTS && /(Response|network) timeout/i.test(errorMessage)) {\n console.error(\n '\\n\\n' +\n chalk.red(\n 'FetchError: Request Timeout. npm-registry-fetch defaults to 30000 (30 seconds). Try setting the --timeout option (in milliseconds) to override this.',\n ) +\n '\\n',\n )\n }\n\n throw err\n }\n }\n\n bar?.tick()\n\n if (versionResult.version) {\n options.cacher?.set(name, target, versionResult.version)\n }\n\n return versionResult\n }\n\n const versionResultList = await pMap(packageList, getPackageVersionProtected, { concurrency: options.concurrency })\n\n // save cacher only after pMap handles cacher.set\n await options.cacher?.save()\n options.cacher?.log()\n\n const versionResultObject = keyValueBy(versionResultList, (versionResult, i) =>\n versionResult.version || versionResult.error\n ? {\n [packageList[i]]: versionResult,\n }\n : null,\n )\n\n return versionResultObject\n}\n\nexport default queryVersions\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n","var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n","var baseFlatten = require('./_baseFlatten');\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","var flatten = require('./flatten'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n","var LodashWrapper = require('./_LodashWrapper'),\n flatRest = require('./_flatRest'),\n getData = require('./_getData'),\n getFuncName = require('./_getFuncName'),\n isArray = require('./isArray'),\n isLaziable = require('./_isLaziable');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_CURRY_FLAG = 8,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256;\n\n/**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\nfunction createFlow(fromRight) {\n return flatRest(function(funcs) {\n var length = funcs.length,\n index = length,\n prereq = LodashWrapper.prototype.thru;\n\n if (fromRight) {\n funcs.reverse();\n }\n while (index--) {\n var func = funcs[index];\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n var wrapper = new LodashWrapper([], true);\n }\n }\n index = wrapper ? index : length;\n while (++index < length) {\n func = funcs[index];\n\n var funcName = getFuncName(func),\n data = funcName == 'wrapper' ? getData(func) : undefined;\n\n if (data && isLaziable(data[0]) &&\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n !data[4].length && data[9] == 1\n ) {\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n } else {\n wrapper = (func.length == 1 && isLaziable(func))\n ? wrapper[funcName]()\n : wrapper.thru(func);\n }\n }\n return function() {\n var args = arguments,\n value = args[0];\n\n if (wrapper && args.length == 1 && isArray(value)) {\n return wrapper.plant(value).value();\n }\n var index = 0,\n result = length ? funcs[index].apply(this, args) : value;\n\n while (++index < length) {\n result = funcs[index].call(this, result);\n }\n return result;\n };\n });\n}\n\nmodule.exports = createFlow;\n","var createFlow = require('./_createFlow');\n\n/**\n * Creates a function that returns the result of invoking the given functions\n * with the `this` binding of the created function, where each successive\n * invocation is supplied the return value of the previous.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flowRight\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var addSquare = _.flow([_.add, square]);\n * addSquare(1, 2);\n * // => 9\n */\nvar flow = createFlow();\n\nmodule.exports = flow;\n","import { Index } from '../types/IndexType'\nimport { sortBy } from './sortBy'\nimport { WILDCARDS } from './version-util'\n\n/**\n *\n * @param dependencies A dependencies collection\n * @returns Returns whether the user prefers ^, ~, .*, or .x\n * (simply counts the greatest number of occurrences) or `null` if\n * given no dependencies.\n */\nfunction getPreferredWildcard(dependencies: Index<string | null>) {\n // if there are no dependencies, return null.\n if (Object.keys(dependencies).length === 0) {\n return null\n }\n\n // group the dependencies by wildcard\n const groups = Object.values(dependencies).reduce<Record<string, (string | null)[]>>((acc, dep) => {\n const wildcard = WILDCARDS.find((wildcard: string) => dep && dep.includes(wildcard))\n if (wildcard !== undefined) {\n acc[wildcard] ||= []\n acc[wildcard].push(dep)\n }\n return acc\n }, {})\n\n const arrOfGroups = Object.entries(groups).map(([wildcard, instances]) => ({ wildcard, instances }))\n\n // reverse sort the groups so that the wildcard with the most appearances is at the head, then return it.\n const sorted = sortBy(arrOfGroups, wildcardObject => -wildcardObject.instances.length)\n\n return sorted.length > 0 ? sorted[0].wildcard : null\n}\n\nexport default getPreferredWildcard\n","import * as semver from 'semver'\nimport semverutils from 'semver-utils'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport { fixPseudoVersion, isComparable, isWildCard, stringify } from './version-util'\n\n/**\n * Check if a version satisfies the latest, and is not beyond the latest). Ignores `v` prefix.\n *\n * @param current\n * @param latest\n * @param downgrade Allow downgrading\n * @returns\n */\nfunction isUpgradeable(current: VersionSpec, latest: Version, { downgrade }: { downgrade?: boolean } = {}): boolean {\n // do not upgrade non-npm version declarations (such as git tags)\n // do not upgrade wildcards\n if (!semver.validRange(current) || isWildCard(current)) {\n return false\n }\n\n // remove the constraint (e.g. ^1.0.1 -> 1.0.1) to allow upgrades that satisfy the range, but are out of date\n const [range] = semverutils.parseRange(current)\n if (!range) {\n throw new Error(\n `\"${current}\" could not be parsed by semver-utils. This is probably a bug. Please file an issue at https://github.com/raineorshine/npm-check-updates.`,\n )\n }\n\n // allow upgrading of pseudo versions such as \"v1\" or \"1.0\"\n const latestNormalized = fixPseudoVersion(latest)\n\n const version = stringify(range)\n const isValidCurrent = Boolean(semver.validRange(version))\n const isValidLatest = Boolean(semver.valid(latestNormalized))\n\n // make sure it is a valid range\n // not upgradeable if the latest version satisfies the current range\n // not upgradeable if the specified version is newer than the latest (indicating a prerelease version)\n // NOTE: When \"<\" is specified with a single digit version, e.g. \"<7\", and has the same major version as the latest, e.g. \"7\", isSatisfied(latest, version) will return true since it ignores the \"<\". In this case, test the original range (current) rather than the versionUtil output (version).\n return (\n isValidCurrent &&\n isValidLatest &&\n // allow an upgrade if two prerelease versions can't be compared by semver\n (!isComparable(latestNormalized, version) ||\n (!semver.satisfies(latestNormalized, range.operator === '<' ? current : version) &&\n (downgrade || !semver.ltr(latestNormalized, version))))\n )\n}\n\nexport default isUpgradeable\n","import flow from 'lodash/flow'\nimport { parseRange } from 'semver-utils'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport filterObject from './filterObject'\nimport getPreferredWildcard from './getPreferredWildcard'\nimport isUpgradeable from './isUpgradeable'\nimport { pickBy } from './pick'\nimport * as versionUtil from './version-util'\n\ninterface UpgradeSpec {\n current: VersionSpec\n currentParsed: VersionSpec | null\n latest: Version\n latestParsed: Version | null\n}\n\n/**\n * Upgrade a dependencies collection based on latest available versions. Supports npm aliases.\n *\n * @param currentDependencies current dependencies collection object\n * @param latestVersions latest available versions collection object\n * @param [options={}]\n * @returns upgraded dependency collection object\n */\nfunction upgradeDependencies(\n currentDependencies: Index<VersionSpec | null>,\n latestVersions: Index<Version>,\n options: Options = {},\n): Index<VersionSpec> {\n const targetOption = options.target || 'latest'\n\n // filter out dependencies with empty values\n currentDependencies = filterObject(currentDependencies, (key, value) => !!value)\n\n // get the preferred wildcard and bind it to upgradeDependencyDeclaration\n const wildcard = getPreferredWildcard(currentDependencies) || versionUtil.DEFAULT_WILDCARD\n\n /** Upgrades a single dependency. */\n const upgradeDep = (current: VersionSpec, latest: Version) =>\n versionUtil.upgradeDependencyDeclaration(current, latest, {\n wildcard,\n removeRange: options.removeRange,\n })\n\n return flow([\n // only include packages for which a latest version was fetched\n (deps: Index<VersionSpec>): Index<VersionSpec> =>\n pickBy(deps, (current, packageName) => packageName in latestVersions),\n // unpack npm alias and git urls\n (deps: Index<VersionSpec>): Index<UpgradeSpec> =>\n Object.entries(deps).reduce<Index<UpgradeSpec>>((acc, [packageName, current]) => {\n const latest = latestVersions[packageName]\n let currentParsed = null\n let latestParsed = null\n\n // parse npm alias\n if (versionUtil.isNpmAlias(current)) {\n currentParsed = versionUtil.parseNpmAlias(current)![1]\n }\n if (versionUtil.isNpmAlias(latest)) {\n latestParsed = versionUtil.parseNpmAlias(latest)![1]\n }\n\n // \"branch\" is also used for tags (refers to everything after the hash character)\n if (versionUtil.isGitHubUrl(current)) {\n const currentTag = versionUtil.getGitHubUrlTag(current)!\n const [currentSemver] = parseRange(currentTag)\n currentParsed = versionUtil.stringify(currentSemver)\n }\n\n if (versionUtil.isGitHubUrl(latest)) {\n const latestTag = versionUtil.getGitHubUrlTag(latest)!\n const [latestSemver] = parseRange(latestTag)\n latestParsed = versionUtil.stringify(latestSemver)\n }\n\n acc[packageName] = { current, currentParsed, latest, latestParsed }\n return acc\n }, {}),\n // pick the packages that are upgradeable\n (deps: Index<UpgradeSpec>): Index<UpgradeSpec> =>\n pickBy(deps, ({ current, currentParsed, latest, latestParsed }: UpgradeSpec, name) => {\n // allow downgrades from prereleases when explicit tag is given\n const downgrade: boolean =\n versionUtil.isPre(current) &&\n (typeof targetOption === 'string' ? targetOption : targetOption(name, parseRange(current))).startsWith('@')\n return isUpgradeable(currentParsed || current, latestParsed || latest, { downgrade })\n }),\n // pack embedded versions: npm aliases and git urls\n (deps: Index<UpgradeSpec>): Index<Version | null> =>\n Object.entries(deps).reduce<Index<Version | null>>(\n (acc, [packageName, { current, currentParsed, latest, latestParsed }]) => {\n const upgraded = upgradeDep(currentParsed || current, latestParsed || latest)\n\n acc[packageName] = versionUtil.isNpmAlias(current)\n ? versionUtil.upgradeNpmAlias(current, upgraded)\n : versionUtil.isGitHubUrl(current)\n ? versionUtil.upgradeGitHubUrl(current, upgraded)\n : upgraded\n return acc\n },\n {},\n ),\n ])(currentDependencies)\n}\n\nexport default upgradeDependencies\n","import { dequal } from 'dequal'\nimport { intersects, satisfies, validRange } from 'semver'\nimport { parse, parseRange } from 'semver-utils'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { VersionResult } from '../types/VersionResult'\nimport { VersionSpec } from '../types/VersionSpec'\nimport getPeerDependenciesFromRegistry from './getPeerDependenciesFromRegistry'\nimport keyValueBy from './keyValueBy'\nimport { pickBy } from './pick'\nimport queryVersions from './queryVersions'\nimport upgradeDependencies from './upgradeDependencies'\n\ntype CheckIfInPeerViolationResult = {\n violated: boolean\n filteredUpgradedDependencies: Index<VersionSpec>\n upgradedPeerDependencies: Index<Index<VersionSpec>>\n}\n\n/**\n * Check if the peer dependencies constraints of each upgraded package, are in violation,\n * thus rendering the upgrade to be invalid\n *\n * @returns Whether there was any violation, and the upgrades that are not in violation\n */\nconst checkIfInPeerViolation = (\n currentDependencies: Index<VersionSpec>,\n filteredUpgradedDependencies: Index<VersionSpec>,\n upgradedPeerDependencies: Index<Index<VersionSpec>>,\n): CheckIfInPeerViolationResult => {\n const upgradedDependencies = { ...currentDependencies, ...filteredUpgradedDependencies }\n const filteredUpgradedDependenciesAfterPeers = pickBy(filteredUpgradedDependencies, (spec, dep) => {\n const peerDeps = upgradedPeerDependencies[dep]\n if (!peerDeps) {\n return true\n }\n return Object.entries(peerDeps).every(\n ([peer, peerSpec]) =>\n upgradedDependencies[peer] === undefined ||\n !validRange(peerSpec) ||\n intersects(upgradedDependencies[peer], peerSpec),\n )\n })\n const violated =\n Object.keys(filteredUpgradedDependencies).length > Object.keys(filteredUpgradedDependenciesAfterPeers).length\n let filteredUpgradedPeerDependencies = upgradedPeerDependencies\n if (violated) {\n filteredUpgradedPeerDependencies = pickBy(\n upgradedPeerDependencies,\n (spec, dep) => filteredUpgradedDependenciesAfterPeers[dep] || !filteredUpgradedDependencies[dep],\n )\n }\n return {\n violated,\n filteredUpgradedDependencies: filteredUpgradedDependenciesAfterPeers,\n upgradedPeerDependencies: filteredUpgradedPeerDependencies,\n }\n}\n\nexport type UpgradePackageDefinitionsResult = [\n upgradedDependencies: Index<VersionSpec>,\n latestVersionResults: Index<VersionResult>,\n newPeerDependencies?: Index<Index<VersionSpec>>,\n]\n\n/**\n * Returns a 3-tuple of upgradedDependencies, their latest versions and the resulting peer dependencies.\n *\n * @param currentDependencies\n * @param options\n * @returns\n */\nexport async function upgradePackageDefinitions(\n currentDependencies: Index<VersionSpec>,\n options: Options,\n): Promise<UpgradePackageDefinitionsResult> {\n const latestVersionResults = await queryVersions(currentDependencies, options)\n\n const latestVersions = keyValueBy(latestVersionResults, (dep, result) =>\n result?.version &&\n (!options.filterResults ||\n options.filterResults(dep, {\n currentVersion: currentDependencies[dep],\n currentVersionSemver: parseRange(currentDependencies[dep]),\n upgradedVersion: result.version,\n upgradedVersionSemver: parse(result.version),\n }))\n ? {\n [dep]: result.version,\n }\n : null,\n )\n\n const upgradedDependencies = upgradeDependencies(currentDependencies, latestVersions, options)\n\n const filteredUpgradedDependencies = pickBy(upgradedDependencies, (v, dep) => {\n return !options.jsonUpgraded || !options.minimal || !satisfies(latestVersions[dep], currentDependencies[dep])\n })\n\n const filteredLatestDependencies = pickBy(latestVersions, (spec, dep) => filteredUpgradedDependencies[dep])\n\n let result: UpgradePackageDefinitionsResult = [\n filteredUpgradedDependencies,\n latestVersionResults,\n options.peerDependencies,\n ]\n\n if (!options.peer || Object.keys(filteredLatestDependencies).length === 0) {\n return result\n }\n\n if (options.peer && Object.keys(filteredLatestDependencies).length > 0) {\n const upgradedPeerDependencies = await getPeerDependenciesFromRegistry(filteredLatestDependencies, options)\n\n let checkPeerViolationResult: CheckIfInPeerViolationResult\n\n if (\n dequal(options.peerDependencies, {\n ...options.peerDependencies,\n ...upgradedPeerDependencies,\n })\n ) {\n checkPeerViolationResult = checkIfInPeerViolation(\n currentDependencies,\n filteredUpgradedDependencies,\n options.peerDependencies!,\n )\n if (!checkPeerViolationResult.violated) {\n return result\n }\n } else {\n checkPeerViolationResult = {\n violated: false,\n filteredUpgradedDependencies,\n upgradedPeerDependencies,\n }\n }\n let runCount = 0\n do {\n if (runCount++ > 6) {\n throw new Error(`Stuck in a while loop. Please report an issue`)\n }\n const peerDependenciesAfterUpgrade = {\n ...options.peerDependencies,\n ...checkPeerViolationResult.upgradedPeerDependencies,\n }\n if (dequal(options.peerDependencies, peerDependenciesAfterUpgrade)) {\n // We can't find anything to do, will not upgrade anything\n return [{}, latestVersionResults, options.peerDependencies]\n }\n const [newUpgradedDependencies, newLatestVersions, newPeerDependencies] = await upgradePackageDefinitions(\n { ...currentDependencies, ...checkPeerViolationResult.filteredUpgradedDependencies },\n { ...options, peerDependencies: peerDependenciesAfterUpgrade, loglevel: 'silent' },\n )\n result = [\n { ...checkPeerViolationResult.filteredUpgradedDependencies, ...newUpgradedDependencies },\n { ...latestVersionResults, ...newLatestVersions },\n newPeerDependencies,\n ]\n checkPeerViolationResult = checkIfInPeerViolation(currentDependencies, result[0], result[2]!)\n } while (checkPeerViolationResult.violated)\n }\n return result\n}\n\nexport default upgradePackageDefinitions\n","import { print, printJson, printSorted, printUpgrades } from '../lib/logging'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport chalk from './chalk'\nimport getInstalledPackages from './getInstalledPackages'\nimport { keyValueBy } from './keyValueBy'\nimport programError from './programError'\nimport upgradePackageDefinitions from './upgradePackageDefinitions'\n\n/** Checks global dependencies for upgrades. */\nasync function runGlobal(options: Options): Promise<Index<string> | void> {\n print(options, '\\nOptions:', 'verbose')\n printSorted(options, options, 'verbose')\n\n print(options, '\\nGetting installed packages', 'verbose')\n let globalPackages: Index<string> = {}\n try {\n const { cli, cwd, filter, filterVersion, global, packageManager, prefix, reject, rejectVersion } = options\n\n globalPackages = await getInstalledPackages({\n cli,\n cwd,\n filter,\n filterVersion,\n global,\n packageManager,\n prefix,\n reject,\n rejectVersion,\n })\n } catch (e: any) {\n programError(options, e.message)\n }\n\n print(options, 'globalPackages:', 'verbose')\n print(options, globalPackages, 'verbose')\n print(options, '', 'verbose')\n print(options, `Fetching ${options.target} versions`, 'verbose')\n\n const [upgraded, latest] = await upgradePackageDefinitions(globalPackages, options)\n print(options, latest, 'verbose')\n\n const time = keyValueBy(latest, (key, result) => (result.time ? { [key]: result.time } : null))\n\n const upgradedPackageNames = Object.keys(upgraded)\n await printUpgrades(options, {\n current: globalPackages,\n upgraded,\n latest,\n total: upgradedPackageNames.length,\n time,\n })\n\n const instruction = upgraded ? upgradedPackageNames.map(pkg => pkg + '@' + upgraded[pkg]).join(' ') : '[package]'\n\n if (options.json) {\n // since global packages do not have a package.json, return the upgraded deps directly (no version range replacements)\n printJson(options, upgraded)\n } else if (instruction.length) {\n const upgradeCmd =\n options.packageManager === 'yarn'\n ? 'yarn global upgrade'\n : options.packageManager === 'pnpm'\n ? 'pnpm -g add'\n : options.packageManager === 'bun'\n ? 'bun add -g'\n : 'npm -g install'\n\n print(\n options,\n '\\n' +\n chalk.cyan('ncu') +\n ' itself cannot upgrade global packages. Run the following to upgrade all global packages: \\n\\n' +\n chalk.cyan(`${upgradeCmd} ` + instruction) +\n '\\n',\n )\n }\n\n // if errorLevel is 2, exit with non-zero error code\n if (options.cli && options.errorLevel === 2 && upgradedPackageNames.length > 0) {\n process.exit(1)\n }\n return upgraded\n}\n\nexport default runGlobal\n","import * as semver from 'semver'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { PackageFile } from '../types/PackageFile'\nimport { VersionSpec } from '../types/VersionSpec'\nimport filterAndReject from './filterAndReject'\nimport filterObject from './filterObject'\nimport { keyValueBy } from './keyValueBy'\nimport programError from './programError'\nimport resolveDepSections from './resolveDepSections'\n\n/** Returns true if spec1 is greater than spec2, ignoring invalid version ranges. */\nconst isGreaterThanSafe = (spec1: VersionSpec, spec2: VersionSpec) =>\n // not a valid range to compare (e.g. github url)\n semver.validRange(spec1) &&\n semver.validRange(spec2) &&\n // otherwise return true if spec2 is smaller than spec1\n semver.gt(semver.minVersion(spec1)!, semver.minVersion(spec2)!)\n\n/** Parses the packageManager field into a { [name]: version } pair. */\nconst parsePackageManager = (pkgData: PackageFile) => {\n if (!pkgData.packageManager) return {}\n const [name, version] = pkgData.packageManager.split('@')\n return { [name]: version }\n}\n/**\n * Get the current dependencies from the package file.\n *\n * @param [pkgData={}] Object with dependencies, devDependencies, peerDependencies, and/or optionalDependencies properties.\n * @param [options={}]\n * @param options.dep\n * @param options.filter\n * @param options.reject\n * @returns Promised {packageName: version} collection\n */\nfunction getCurrentDependencies(pkgData: PackageFile = {}, options: Options = {}) {\n const depSections = resolveDepSections(options.dep)\n\n // get all dependencies from the selected sections\n // if a dependency appears in more than one section, take the lowest version number\n const allDependencies = depSections.reduce((accum, depSection) => {\n return {\n ...accum,\n ...(depSection === 'packageManager'\n ? parsePackageManager(pkgData)\n : filterObject(\n (pkgData[depSection] as Index<string>) || {},\n (dep, spec) => !isGreaterThanSafe(spec, accum[dep]),\n )),\n }\n }, {} as Index<VersionSpec>)\n\n // filter & reject dependencies and versions\n const workspacePackageMap = keyValueBy(options.workspacePackages || [])\n let filteredDependencies: Index<VersionSpec> = {}\n try {\n filteredDependencies = filterObject(\n filterObject(allDependencies, name => !workspacePackageMap[name]),\n filterAndReject(\n options.filter || null,\n options.reject || null,\n options.filterVersion || null,\n options.rejectVersion || null,\n ),\n )\n } catch (err: any) {\n programError(options, 'Invalid filter: ' + err.message || err)\n }\n\n return filteredDependencies\n}\n\nexport default getCurrentDependencies\n","import ProgressBar from 'progress'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport getPackageManager from './getPackageManager'\n\n/**\n * Get the engines.node versions from the NPM repository based on the version target.\n *\n * @param packageMap An object whose keys are package name and values are version\n * @param [options={}] Options.\n * @returns Promised {packageName: engines.node} collection\n */\nasync function getEnginesNodeFromRegistry(packageMap: Index<Version>, options: Options) {\n const packageManager = getPackageManager(options, options.packageManager)\n if (!packageManager.getEngines) return {}\n\n const numItems = Object.keys(packageMap).length\n let bar: ProgressBar\n if (!options.json && options.loglevel !== 'silent' && options.loglevel !== 'verbose' && numItems > 0) {\n bar = new ProgressBar('[:bar] :current/:total :percent', { total: numItems, width: 20 })\n bar.render()\n }\n\n return Object.entries(packageMap).reduce(async (accumPromise, [pkg, version]) => {\n const enginesNode = (await packageManager.getEngines!(pkg, version, options)).node\n if (bar) {\n bar.tick()\n }\n const accum = await accumPromise\n return { ...accum, [pkg]: enginesNode }\n }, Promise.resolve<Index<VersionSpec | undefined>>({}))\n}\n\nexport default getEnginesNodeFromRegistry\n","import { minVersion, satisfies } from 'semver'\nimport { IgnoredUpgradeDueToEnginesNode } from '../types/IgnoredUpgradeDueToEnginesNode'\nimport { Index } from '../types/IndexType'\nimport { Maybe } from '../types/Maybe'\nimport { Options } from '../types/Options'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport getEnginesNodeFromRegistry from './getEnginesNodeFromRegistry'\nimport keyValueBy from './keyValueBy'\nimport upgradePackageDefinitions from './upgradePackageDefinitions'\n\n/** Checks if package.json min node version satisfies given package engine.node spec */\nconst satisfiesNodeEngine = (enginesNode: Maybe<VersionSpec>, optionsEnginesNodeMinVersion: Version) =>\n !enginesNode || satisfies(optionsEnginesNodeMinVersion, enginesNode)\n\n/** Get all upgrades that are ignored due to incompatible engines.node. */\nexport async function getIgnoredUpgradesDueToEnginesNode(\n current: Index<VersionSpec>,\n upgraded: Index<VersionSpec>,\n options: Options = {},\n) {\n if (!options.nodeEngineVersion) return {}\n const optionsEnginesNodeMinVersion = minVersion(options.nodeEngineVersion)?.version\n if (!optionsEnginesNodeMinVersion) return {}\n const [upgradedLatestVersions, latestVersionResults] = await upgradePackageDefinitions(current, {\n ...options,\n enginesNode: false,\n nodeEngineVersion: undefined,\n loglevel: 'silent',\n })\n\n // Use the latest versions since getEnginesNodeFromRegistry requires exact versions.\n // Filter down to only the upgraded latest versions, as there is no point in checking the engines.node for packages that have been filtered out, e.g. by options.minimal or options.filterResults.\n const latestVersions = keyValueBy(latestVersionResults, (dep, result) =>\n upgradedLatestVersions[dep] && result?.version\n ? {\n [dep]: result.version,\n }\n : null,\n )\n const enginesNodes = await getEnginesNodeFromRegistry(latestVersions, options)\n return Object.entries(upgradedLatestVersions)\n .filter(\n ([pkgName, newVersion]) =>\n upgraded[pkgName] !== newVersion && !satisfiesNodeEngine(enginesNodes[pkgName], optionsEnginesNodeMinVersion),\n )\n .reduce(\n (accum, [pkgName, newVersion]) => ({\n ...accum,\n [pkgName]: {\n from: current[pkgName],\n to: newVersion,\n enginesNode: enginesNodes[pkgName]!,\n },\n }),\n {} as Index<IgnoredUpgradeDueToEnginesNode>,\n )\n}\n\nexport default getIgnoredUpgradesDueToEnginesNode\n","import { intersects, minVersion, satisfies, validRange } from 'semver'\nimport { IgnoredUpgradeDueToPeerDeps } from '../types/IgnoredUpgradeDueToPeerDeps'\nimport { Index } from '../types/IndexType'\nimport { Options } from '../types/Options'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport getPeerDependenciesFromRegistry from './getPeerDependenciesFromRegistry'\nimport upgradePackageDefinitions from './upgradePackageDefinitions'\n\n/** Get all upgrades that are ignored due to incompatible peer dependencies. */\nexport async function getIgnoredUpgradesDueToPeerDeps(\n current: Index<VersionSpec>,\n upgraded: Index<VersionSpec>,\n upgradedPeerDependencies: Index<Index<Version>>,\n options: Options = {},\n) {\n const upgradedPackagesWithPeerRestriction = {\n ...current,\n ...upgraded,\n }\n const [upgradedLatestVersions, latestVersionResults] = await upgradePackageDefinitions(current, {\n ...options,\n peer: false,\n peerDependencies: undefined,\n loglevel: 'silent',\n })\n const upgradedPeerDependenciesLatest = await getPeerDependenciesFromRegistry(\n Object.fromEntries(\n Object.entries(upgradedLatestVersions).map(([packageName, versionSpec]) => {\n return [\n packageName,\n // git urls and other non-semver versions are ignored.\n // Make sure versionSpec is a valid semver range; otherwise, minVersion will throw.\n validRange(versionSpec) ? (minVersion(versionSpec)?.version ?? versionSpec) : versionSpec,\n ]\n }),\n ),\n options,\n )\n return Object.entries(upgradedLatestVersions)\n .filter(([pkgName, newVersion]) => upgraded[pkgName] !== newVersion)\n .reduce((accum, [pkgName, newVersion]) => {\n let reason = Object.entries(upgradedPeerDependencies)\n .filter(\n ([, peers]) =>\n peers[pkgName] !== undefined &&\n latestVersionResults[pkgName]?.version &&\n !satisfies(latestVersionResults[pkgName].version!, peers[pkgName]),\n )\n .reduce(\n (accumReason, [peerPkg, peers]) => ({\n ...accumReason,\n [peerPkg]: !validRange(peers[pkgName])\n ? `a range that semver does not understand: ${peers[pkgName]}. This range does not work with semver.satisfies or semver.intersects, which npm-check-updates relies on to determine peer dependency compatibility. Either this is a mistake in ${peerPkg}, or it relies on a new syntax that is not compatible with the semver package.`\n : peers[pkgName],\n }),\n {} as Index<string>,\n )\n if (Object.keys(reason).length === 0) {\n const peersOfPkg = upgradedPeerDependenciesLatest?.[pkgName] || {}\n reason = Object.entries(peersOfPkg)\n .filter(\n ([peer, peerSpec]) =>\n upgradedPackagesWithPeerRestriction[peer] &&\n !(!validRange(peerSpec) || intersects(upgradedPackagesWithPeerRestriction[peer], peerSpec)),\n )\n .reduce(\n (accumReason, [peerPkg, peerSpec]) => ({ ...accumReason, [pkgName]: `${peerPkg} ${peerSpec}` }),\n {} as Index<string>,\n )\n }\n return {\n ...accum,\n [pkgName]: {\n from: current[pkgName],\n to: newVersion,\n reason,\n },\n }\n }, {} as Index<IgnoredUpgradeDueToPeerDeps>)\n}\n\nexport default getIgnoredUpgradesDueToPeerDeps\n","import { ParseError, ParseErrorCode, parse, stripComments } from 'jsonc-parser'\n\nconst stdoutColumns = process.stdout.columns || 80\n\n/**\n * Ensures the code line or a hint is always displayed for the code snippet.\n * If the line is empty, it outputs `<empty>`.\n * If the line is larger than a line of the terminal windows, it will cut it off. This also prevents too much\n * garbage data from being displayed.\n *\n * @param line - target line to check.\n * @returns either the hint or the actual line for the code snippet.\n */\nfunction ensureLineDisplay(line: string): string {\n return `${line.length ? line.slice(0, Math.min(line.length, stdoutColumns)) : '<empty>'}\\n`\n}\n\n/**\n * Builds a marker line to point to the position of the found error.\n *\n * @param length - positions to the right of the error line.\n * @returns the marker line.\n */\nfunction getMarker(length: number): string {\n return length > stdoutColumns ? '' : `${' '.repeat(length - 1)}^\\n`\n}\n\n/**\n * Builds a json code snippet to mark and contextualize the found error.\n * This snippet consists of 5 lines with the erroneous line in the middle.\n *\n * @param lines - all lines of the json file.\n * @param errorLine - erroneous line.\n * @param columnNumber - the error position inside the line.\n * @returns the entire code snippet.\n */\nfunction showSnippet(lines: string[], errorLine: number, columnNumber: number): string {\n const len = lines.length\n if (len === 0) return '<empty>'\n if (len === 1) return `${ensureLineDisplay(lines[0])}${getMarker(columnNumber)}`\n // Show an area of lines around the error line for a more detailed snippet.\n const snippetEnd = Math.min(errorLine + 2, len)\n let snippet = ''\n for (let i = Math.max(errorLine - 2, 1); i <= snippetEnd; i++) {\n // Lines in the output are counted starting from one, so choose the previous line\n snippet += ensureLineDisplay(lines[i - 1])\n if (i === errorLine) snippet += getMarker(columnNumber)\n }\n return `${snippet}\\n`\n}\n\n/**\n * Parses a json string, while also handling errors and comments.\n *\n * @param jsonString - target json string.\n * @returns the parsed json object.\n */\nexport default function parseJson(jsonString: string) {\n jsonString = stripComments(jsonString)\n try {\n return JSON.parse(jsonString)\n } catch {\n const errors: ParseError[] = []\n const json = parse(jsonString, errors)\n\n // If no errors were found, just return the parsed json file\n if (errors.length === 0) return json\n let errorString = ''\n const lines = jsonString.split('\\n')\n for (const error of errors) {\n const offset = error.offset\n let lineNumber = 1\n let columnNumber = 1\n let currentOffset = 0\n // Calculate line and column from the offset\n for (const line of lines) {\n if (currentOffset + line.length >= offset) {\n columnNumber = offset - currentOffset + 1\n break\n }\n currentOffset += line.length + 1 // +1 for the newline character\n lineNumber++\n }\n // @ts-expect-error due to --isolatedModules forbidding to implement ambient constant enums.\n errorString += `Error at line ${lineNumber}, column ${columnNumber}: ${ParseErrorCode[error.error]}\\n${showSnippet(lines, lineNumber, columnNumber)}\\n`\n }\n throw new SyntaxError(errorString)\n }\n}\n","import fs from 'fs/promises'\nimport prompts from 'prompts-ncu'\nimport nodeSemver from 'semver'\nimport { DependencyGroup } from '../types/DependencyGroup'\nimport { Index } from '../types/IndexType'\nimport { Maybe } from '../types/Maybe'\nimport { Options } from '../types/Options'\nimport { PackageFile } from '../types/PackageFile'\nimport { Version } from '../types/Version'\nimport { VersionSpec } from '../types/VersionSpec'\nimport chalk from './chalk'\nimport getCurrentDependencies from './getCurrentDependencies'\nimport { getIgnoredUpgradesDueToEnginesNode } from './getIgnoredUpgradesDueToEnginesNode'\nimport getIgnoredUpgradesDueToPeerDeps from './getIgnoredUpgradesDueToPeerDeps'\nimport getPackageManager from './getPackageManager'\nimport getPeerDependenciesFromRegistry from './getPeerDependenciesFromRegistry'\nimport keyValueBy from './keyValueBy'\nimport {\n print,\n printIgnoredUpdatesDueToEnginesNode,\n printIgnoredUpdatesDueToPeerDeps,\n printJson,\n printSorted,\n printUpgrades,\n toDependencyTable,\n} from './logging'\nimport { pick } from './pick'\nimport programError from './programError'\nimport resolveDepSections from './resolveDepSections'\nimport upgradePackageData from './upgradePackageData'\nimport upgradePackageDefinitions from './upgradePackageDefinitions'\nimport parseJson from './utils/parseJson'\nimport { getDependencyGroups } from './version-util'\n\nconst INTERACTIVE_HINT = `\n ↑/↓: Select a package\n Space: Toggle selection\n a: Toggle all\n Enter: Upgrade`\n\n/**\n * Fetches how many options per page can be listed in the dependency table.\n *\n * @param groups - found dependency groups.\n * @returns the amount of options that can be displayed per page.\n */\nfunction getOptionsPerPage(showHint: boolean, groups?: DependencyGroup[]): number {\n const hintRows = showHint ? INTERACTIVE_HINT.split('\\n').length : 0\n return process.stdout.rows ? Math.max(3, process.stdout.rows - hintRows - 1 - (groups?.length ?? 0) * 2) : 50\n}\n\n/**\n * Return a promise which resolves to object storing package owner changed status for each dependency.\n *\n * @param fromVersion current packages version.\n * @param toVersion target packages version.\n * @param options\n * @returns\n */\nexport async function getOwnerPerDependency(fromVersion: Index<Version>, toVersion: Index<Version>, options: Options) {\n const packageManager = getPackageManager(options, options.packageManager)\n return await Object.keys(toVersion).reduce(\n async (accum, dep) => {\n const from = fromVersion[dep] || null\n const to = toVersion[dep] || null\n const ownerChanged = await packageManager.packageAuthorChanged!(dep, from!, to!, options)\n return {\n ...(await accum),\n [dep]: ownerChanged,\n }\n },\n {} as Promise<Index<boolean>>,\n )\n}\n\n/** Prompts the user to choose which upgrades to upgrade. */\nconst chooseUpgrades = async (\n oldDependencies: Index<string>,\n newDependencies: Index<string>,\n pkgFile: Maybe<string>,\n options: Options,\n): Promise<Index<string>> => {\n let chosenDeps: string[] = []\n\n // Hide the interactive hint if the terminal is small. This gives more space for the scrollable list of available updates\n const showHint = process.stdout.rows > 18\n\n // use toDependencyTable to create choices that are properly padded to align vertically\n const table = await toDependencyTable({\n from: oldDependencies,\n to: newDependencies,\n format: options.format,\n pkgFile: pkgFile || undefined,\n })\n\n const formattedLines = keyValueBy(table.toString().split('\\n'), line => {\n const dep = line.trim().split(' ')[0]\n return {\n [dep]: line.trim(),\n }\n })\n\n // do not prompt if there are no dependencies\n // prompts will crash if passed an empty list of choices\n if (Object.keys(newDependencies).length > 0) {\n print(options, '')\n\n if (options.format?.includes('group')) {\n const groups = getDependencyGroups(newDependencies, oldDependencies, options)\n\n const choices = groups.flatMap(({ heading, groupName, packages }) => {\n return [\n { title: '\\n' + heading, heading: true },\n ...Object.keys(packages)\n .sort()\n .map(dep => ({\n title: formattedLines[dep],\n value: dep,\n selected: ['patch', 'minor'].includes(groupName),\n })),\n ]\n })\n\n const response = await prompts({\n choices: [...choices, { title: ' ', heading: true }],\n hint: showHint && INTERACTIVE_HINT,\n instructions: false,\n message: 'Choose which packages to update',\n name: 'value',\n optionsPerPage: getOptionsPerPage(showHint, groups),\n type: 'multiselect',\n onState: (state: any) => {\n if (state.aborted) {\n process.nextTick(() => process.exit(1))\n }\n },\n })\n\n chosenDeps = response.value\n } else {\n const choices = Object.keys(newDependencies)\n .sort()\n .map(dep => ({\n title: formattedLines[dep],\n value: dep,\n selected: true,\n }))\n\n const response = await prompts({\n choices: [...choices, { title: ' ', heading: true }],\n hint: showHint && INTERACTIVE_HINT + '\\n',\n instructions: false,\n message: 'Choose which packages to update',\n name: 'value',\n optionsPerPage: getOptionsPerPage(showHint),\n type: 'multiselect',\n onState: (state: any) => {\n if (state.aborted) {\n process.nextTick(() => process.exit(1))\n }\n },\n })\n\n chosenDeps = response.value\n }\n }\n\n return keyValueBy(chosenDeps, dep => ({ [dep]: newDependencies[dep] }))\n}\n\n/** Checks local project dependencies for upgrades. */\nexport default async function runLocal(\n options: Options,\n pkgData?: Maybe<string>,\n pkgFile?: Maybe<string>,\n): Promise<PackageFile | Index<VersionSpec>> {\n print(options, '\\nOptions:', 'verbose')\n printSorted(options, options, 'verbose')\n\n let pkg: PackageFile\n\n try {\n if (!pkgData) {\n programError(options, 'Missing package data')\n } else {\n pkg = parseJson(pkgData)\n }\n } catch (e: any) {\n programError(\n options,\n `Invalid package file${pkgFile ? `: ${pkgFile}` : ' from stdin'}. Error details:\\n${e.message}`,\n )\n }\n\n const current = getCurrentDependencies(pkg, options)\n\n print(options, '\\nCurrent versions:', 'verbose')\n print(options, current, 'verbose')\n\n if (options.enginesNode) {\n options.nodeEngineVersion = pkg?.engines?.node\n }\n\n if (options.peer) {\n options.peerDependencies = await getPeerDependenciesFromRegistry(\n Object.fromEntries(\n Object.entries(current).map(([packageName, versionSpec]) => {\n return [\n packageName,\n // git urls and other non-semver versions are ignored.\n // Make sure versionSpec is a valid semver range; otherwise, minVersion will throw.\n nodeSemver.validRange(versionSpec)\n ? (nodeSemver.minVersion(versionSpec)?.version ?? versionSpec)\n : versionSpec,\n ]\n }),\n ),\n options,\n )\n }\n\n const [upgraded, latestResults, upgradedPeerDependencies] = await upgradePackageDefinitions(current, options)\n const latest = keyValueBy(latestResults, (key, result) => (result.version ? { [key]: result.version } : null))\n const errors = keyValueBy(latestResults, (key, result) => (result.error ? { [key]: result.error } : null))\n const time = keyValueBy(latestResults, (key, result) => (result.time ? { [key]: result.time } : null))\n\n if (options.peer) {\n print(options, '\\nupgradedPeerDependencies:', 'verbose')\n print(options, upgradedPeerDependencies, 'verbose')\n }\n\n print(\n options,\n `\\n${\n typeof options.target === 'string' ? `${options.target[0].toUpperCase()}${options.target.slice(1)}` : 'Fetched'\n } versions:`,\n 'verbose',\n )\n print(options, latest, 'verbose')\n\n print(options, '\\nUpgraded versions:', 'verbose')\n print(options, upgraded, 'verbose')\n\n // filter out satisfied deps when using --minimal\n const filteredUpgraded = options.minimal\n ? keyValueBy(upgraded, (dep, version) =>\n !nodeSemver.satisfies(latest[dep], current[dep]) ? { [dep]: version } : null,\n )\n : upgraded\n\n const ownersChangedDeps = (options.format || []).includes('ownerChanged')\n ? await getOwnerPerDependency(current, filteredUpgraded, options)\n : undefined\n\n const chosenUpgraded = options.interactive\n ? await chooseUpgrades(current, filteredUpgraded, pkgFile, options)\n : filteredUpgraded\n\n if (!options.json || options.deep) {\n await printUpgrades(\n // in interactive mode, do not group upgrades afterwards since the prompts are grouped\n options.interactive\n ? { ...options, format: (options.format || []).filter(formatType => formatType !== 'group') }\n : options,\n {\n current,\n upgraded: chosenUpgraded,\n total: Object.keys(upgraded).length,\n latest: latestResults,\n ownersChangedDeps,\n pkgFile: pkgFile || undefined,\n errors,\n time,\n },\n )\n if (options.peer) {\n const ignoredUpdates = await getIgnoredUpgradesDueToPeerDeps(\n current,\n upgraded,\n upgradedPeerDependencies!,\n options,\n )\n if (Object.keys(ignoredUpdates).length > 0) {\n printIgnoredUpdatesDueToPeerDeps(options, ignoredUpdates)\n }\n }\n if (options.enginesNode) {\n const ignoredUpdates = await getIgnoredUpgradesDueToEnginesNode(current, upgraded, options)\n if (Object.keys(ignoredUpdates).length > 0) {\n printIgnoredUpdatesDueToEnginesNode(options, ignoredUpdates)\n }\n }\n }\n\n const newPkgData = await upgradePackageData(pkgData, current, chosenUpgraded, options, pkgFile || undefined)\n\n const output: PackageFile | Index<VersionSpec> = options.jsonAll\n ? (parseJson(newPkgData) as PackageFile)\n : options.jsonDeps\n ? pick(parseJson(newPkgData) as PackageFile, resolveDepSections(options.dep))\n : chosenUpgraded\n\n // will be overwritten with the result of fs.writeFile so that the return promise waits for the package file to be written\n let writePromise\n\n if (options.json && !options.deep) {\n printJson(options, output)\n }\n\n if (Object.keys(filteredUpgraded).length > 0) {\n // if there is a package file, write the new package data\n // otherwise, suggest ncu -u\n if (pkgFile) {\n if (options.upgrade) {\n // do not await until the end\n writePromise = fs.writeFile(pkgFile.replace('#catalog', ''), newPkgData)\n } else {\n const ncuCmd = process.env.npm_lifecycle_event === 'npx' ? 'npx npm-check-updates' : 'ncu'\n // quote arguments with spaces\n const argv = process.argv\n .slice(2)\n .map(arg => (arg.includes(' ') ? `\"${arg}\"` : arg))\n .join(' ')\n const ncuOptions = argv ? ' ' + argv : argv\n const upgradeHint = `\\nRun ${chalk.cyan(`${ncuCmd}${ncuOptions} -u`)} to upgrade ${\n options.packageFile || 'package.json'\n }`\n print(options, upgradeHint)\n }\n }\n }\n\n await writePromise\n\n return output\n}\n","import type { RcOptions } from '../types/RcOptions'\n\n/**\n * TypeScript helper for .npmrc config file. Similar to vite and eslint's\n * defineConfig helper\n */\nfunction defineConfig(config: RcOptions) {\n return config\n}\n\nexport default defineConfig\n","import path from 'path'\nimport prompts from 'prompts-ncu'\nimport spawn from 'spawn-please'\nimport pkg from '../package.json'\nimport { cliOptionsMap } from './cli-options'\nimport { cacheClear } from './lib/cache'\nimport chalk, { chalkInit } from './lib/chalk'\nimport determinePackageManager from './lib/determinePackageManager'\nimport doctor from './lib/doctor'\nimport findPackage from './lib/findPackage'\nimport getAllPackages from './lib/getAllPackages'\nimport getNcuRc from './lib/getNcuRc'\nimport initOptions from './lib/initOptions'\nimport { print, printJson } from './lib/logging'\nimport mergeOptions from './lib/mergeOptions'\nimport programError from './lib/programError'\nimport runGlobal from './lib/runGlobal'\nimport runLocal from './lib/runLocal'\nimport { Index } from './types/IndexType'\nimport { Options } from './types/Options'\nimport { PackageFile } from './types/PackageFile'\nimport { PackageInfo } from './types/PackageInfo'\nimport { RunOptions } from './types/RunOptions'\nimport { VersionSpec } from './types/VersionSpec'\n\nexport { default as defineConfig } from './lib/defineConfig'\nexport type { RcOptions } from './types/RcOptions'\n\n// allow prompt injection from environment variable for testing purposes\nif (process.env.INJECT_PROMPTS) {\n prompts.inject(JSON.parse(process.env.INJECT_PROMPTS))\n}\n\n/** Tracks the (first) unhandled rejection so the process can exit with an error code at the end. This allows other errors to be logged before the process exits. */\nlet unhandledRejectionError = false\n\n// Use `node --trace-uncaught ...` to show where the exception was thrown.\n// See: https://nodejs.org/api/process.html#event-unhandledrejection\nprocess.on('unhandledRejection', (reason: string | Error) => {\n // do not rethrow, as there may be other errors to print out\n console.error(reason)\n\n // ensure the process exits with a non-zero code at the end\n unhandledRejectionError = true\n})\n\n/**\n * Volta is a tool for managing JavaScript tooling like Node and npm. Volta has\n * its own system for installing global packages which circumvents npm, so\n * commands like `npm ls -g` do not accurately reflect what is installed.\n *\n * The ability to use `npm ls -g` is tracked in this Volta issue: https://github.com/volta-cli/volta/issues/1012\n */\nconst noVolta = (options: Options) => {\n // The first check is for macOS/Linux and the second check is for Windows\n if (options.global && (!!process.env.VOLTA_HOME || process.env.PATH?.includes('\\\\Volta'))) {\n const message =\n 'It appears you are using Volta. `npm-check-updates --global` ' +\n 'cannot be used with Volta because Volta has its own system for ' +\n 'managing global packages which circumvents npm.\\n\\n' +\n 'If you are still receiving this message after uninstalling Volta, ' +\n 'ensure your PATH does not contain an entry for Volta and your ' +\n 'shell profile does not define VOLTA_HOME. You may need to reboot ' +\n 'for changes to your shell profile to take effect.'\n\n print(options, message, 'error')\n process.exit(1)\n }\n}\n\n/** Returns the package manager that should be used to install packages after running \"ncu -u\". Uses the same detection logic as the main package manager determination. */\nconst getPackageManagerForInstall = async (options: Options, packageFile: string) => {\n // create options context for the package file location\n const installOptions: Options = {\n ...options,\n cwd: options.cwd || path.resolve(packageFile, '..'),\n packageFile,\n }\n\n // when packageManager is set to staticRegistry, we need to infer the package manager from lock files\n if (options.packageManager === 'staticRegistry') {\n return await determinePackageManager({ ...installOptions, packageManager: undefined })\n } else if (options.packageManager && options.packageManager !== 'npm') {\n return options.packageManager\n }\n\n // use the same logic as the main package manager detection\n return await determinePackageManager(installOptions)\n}\n\n/** Returns if analysis contains upgrades */\nconst someUpgraded = (pkgs: string[], analysis: Index<PackageFile> | PackageFile) => {\n // deep mode analysis is of type Index<PackageFile>\n // non-deep mode analysis is of type <PackageFile>, so we normalize it to Index<PackageFile>\n const analysisNormalized: Index<PackageFile> =\n pkgs.length === 1 ? { [pkgs[0]]: analysis as PackageFile } : (analysis as Index<PackageFile>)\n return Object.values(analysisNormalized).some(upgrades => Object.keys(upgrades).length > 0)\n}\n\n/** Either suggest an install command based on the package manager, or in interactive mode, prompt to auto-install. */\nconst install = async (\n pkgs: string[],\n analysis: Index<PackageFile> | PackageFile,\n options: Options,\n): Promise<unknown> => {\n if (options.install === 'never') {\n print(options, '')\n return\n }\n\n // if no packages were upgraded (i.e. all dependencies deselected in interactive mode), then bail without suggesting an install.\n // normalize the analysis for one or many packages\n if (!someUpgraded(pkgs, analysis)) return\n\n // for the purpose of the install hint, just use the package manager used in the first sub-project\n // if auto-installing, the actual package manager in each sub-project will be used\n const packageManager = await getPackageManagerForInstall(options, pkgs[0])\n\n // by default, show an install hint after upgrading\n // this will be disabled in interactive mode if the user chooses to have npm-check-updates execute the install command\n const installHint = `Run ${chalk.cyan(packageManager + ' install')}${\n pkgs.length > 1 && !options.workspace && !options.workspaces ? ' in each project directory' : ''\n } to install new versions`\n\n // Disable interactive mode when running doctor EXCEPT when running tests.\n // Otherwise running doctor mode on npm-check-updates itself will cause interactive.test.ts to fail.\n const isInteractive = options.interactive && (process.env.NCU_TESTS || !process.env.NCU_DOCTOR)\n\n // prompt the user if they want ncu to run \"npm install\"\n let response\n if (isInteractive && options.install === 'prompt') {\n print(options, '')\n response = await prompts({\n type: 'confirm',\n name: 'value',\n message: `${installHint}?`,\n initial: true,\n // allow Ctrl+C to kill the process\n onState: (state: any) => {\n if (state.aborted) {\n process.nextTick(() => process.exit(1))\n }\n },\n })\n }\n\n // auto-install\n if (options.install === 'always' || (isInteractive && response.value)) {\n if (options.install === 'always') {\n print(options, '')\n }\n print(options, 'Installing dependencies...')\n\n // only run npm install once in the root when in workspace mode\n // npm install will install packages for all workspaces\n const isWorkspace = options.workspaces || !!options.workspace?.length\n const pkgsNormalized = isWorkspace ? ['package.json'] : pkgs\n\n for await (const pkgFile of pkgsNormalized) {\n const packageManager = await getPackageManagerForInstall(options, pkgFile)\n // npm, yarn, pnpm use .cmd on Windows, but bun does not\n const cmd = packageManager + (process.platform === 'win32' && packageManager !== 'bun' ? '.cmd' : '')\n const cwd = options.cwd || path.resolve(pkgFile, '..')\n let stdout = ''\n try {\n await spawn(\n cmd,\n ['install'],\n {\n stdout: (data: string) => {\n stdout += data\n },\n stderr: (data: string) => {\n console.error(chalk.red(data.toString()))\n },\n },\n {\n cwd,\n env: {\n ...process.env,\n ...(options.color !== false ? { FORCE_COLOR: true } : null),\n // With spawn, pnpm install will fail with ERR_PNPM_PEER_DEP_ISSUES Unmet peer dependencies.\n // When pnpm install is run directly from the terminal, this error does not occur.\n // When pnpm install is run from a simple spawn script, this error does not occur.\n // The issue only seems to be when pnpm install is executed from npm-check-updates, but it's not clear what configuration or environmental factors are causing this.\n // For now, turn off strict-peer-dependencies on pnpm auto-install.\n // See: https://github.com/raineorshine/npm-check-updates/issues/1191\n ...(packageManager === 'pnpm' ? { npm_config_strict_peer_dependencies: false } : null),\n },\n },\n )\n print(options, stdout)\n print(options, 'Done')\n } catch (err: any) {\n // sometimes packages print errors to stdout instead of stderr\n // if there is nothing on stderr, reject with stdout\n throw new Error(err?.message || err || stdout)\n }\n }\n }\n // show the install hint unless auto-install occurred\n else if (!isInteractive) {\n print(options, `\\n${installHint}.`)\n }\n}\n\n/** Runs the dependency upgrades. Loads the ncurc, finds the package file, and handles --deep. */\nasync function runUpgrades(options: Options, timeout?: NodeJS.Timeout): Promise<Index<string> | PackageFile | void> {\n const [selectedPackageInfos, workspacePackages]: [PackageInfo[], string[]] = await getAllPackages(options)\n\n const packageFilepaths: string[] = selectedPackageInfos.map((packageInfo: PackageInfo) => packageInfo.filepath)\n\n // enable deep mode if --deep, --workspace, --workspaces, or if multiple package files are found\n const isWorkspace = options.workspaces || !!options.workspace?.length\n options.deep = options.deep || isWorkspace || selectedPackageInfos.length > 1\n\n let analysis: Index<PackageFile> | PackageFile | void\n if (options.global) {\n const analysis = await runGlobal(options)\n clearTimeout(timeout)\n return analysis\n } else if (options.deep) {\n analysis = await selectedPackageInfos.reduce(\n async (previousPromise, packageInfo: PackageInfo) => {\n const packages = await previousPromise\n // copy object to prevent share .ncurc options between different packageFile, to prevent unpredictable behavior\n const rcResult = await getNcuRc({ packageFile: packageInfo.filepath, options })\n let rcConfig = rcResult.config\n if (options.mergeConfig && Object.keys(rcConfig).length) {\n // Merge config options.\n rcConfig = mergeOptions(options, rcConfig)\n }\n const pkgOptions: Options = {\n ...options,\n ...rcConfig,\n packageFile: packageInfo.filepath,\n workspacePackages,\n }\n // For virtual catalog files (like package.json#catalog), use the PackageInfo data directly\n // since the virtual file doesn't exist on disk\n let pkgData: string | null\n let pkgFile: string\n let indexKey: string\n\n if (packageInfo.filepath.includes('#') || packageInfo.name === 'catalogs') {\n // Virtual catalog file or catalog package - use PackageInfo data\n pkgData = packageInfo.pkgFile\n pkgFile = packageInfo.filepath\n // For synthetic catalog files, use the actual underlying file path as the index key\n indexKey = packageInfo.filepath.includes('#catalog')\n ? packageInfo.filepath.replace('#catalog', '')\n : packageInfo.filepath\n\n // Print the same message as findPackage for consistency\n const relPathToPackage = path.resolve(indexKey)\n print(pkgOptions, `${pkgOptions.upgrade ? 'Upgrading' : 'Checking'} ${relPathToPackage} catalog dependencies`)\n } else {\n // Regular file - read from disk\n const result = await findPackage(pkgOptions)\n pkgData = result.pkgData\n pkgFile = result.pkgFile || packageInfo.filepath\n indexKey = pkgFile\n }\n return {\n ...packages,\n // index by relative path if cwd was specified\n [pkgOptions.cwd\n ? path\n .relative(path.resolve(pkgOptions.cwd), indexKey)\n // convert Windows path to *nix path for consistency\n .replace(/\\\\/g, '/')\n : indexKey]: await runLocal(pkgOptions, pkgData, pkgFile),\n }\n },\n Promise.resolve({} as Index<PackageFile> | PackageFile),\n )\n if (options.json) {\n printJson(options, analysis)\n }\n } else {\n // mutate packageFile when glob pattern finds only single package\n if (\n selectedPackageInfos.length === 1 &&\n selectedPackageInfos[0].filepath !== (options.packageFile || 'package.json')\n ) {\n options.packageFile = selectedPackageInfos[0].filepath\n }\n const { pkgData, pkgFile } = await findPackage(options)\n analysis = await runLocal(options, pkgData, pkgFile)\n }\n clearTimeout(timeout)\n\n if (options.errorLevel === 2 && someUpgraded(packageFilepaths, analysis)) {\n programError(options, '\\nDependencies not up-to-date')\n }\n\n // suggest install command or auto-install\n if (options.upgrade) {\n // deno does not have an install command\n // The closest equivalent is deno cache, but it is optional.\n // See: https://deno.land/manual@v1.30.3/references/cheatsheet#nodejs---deno-cheatsheet\n if (options.packageManager === 'deno') {\n print(options, '')\n } else {\n await install(packageFilepaths, analysis, options)\n }\n }\n\n return analysis\n}\n\n/** Main entry point.\n *\n * @returns Promise<\n * PackageFile Default returns upgraded package file.\n * | Index<VersionSpec> --jsonUpgraded returns only upgraded dependencies.\n * | void --global upgrade returns void.\n * >\n */\nexport async function run(\n runOptions: RunOptions = {},\n { cli }: { cli?: boolean } = {},\n): Promise<PackageFile | Index<VersionSpec> | void> {\n const options = await initOptions(runOptions, { cli })\n\n // ensure that the process exits with an error code if there was an unhandled rejection\n const bugsUrl = pkg.bugs.url\n process.on('exit', () => {\n if (unhandledRejectionError) {\n programError(options, `Unhandled Rejection! This is a bug and should be reported: ${bugsUrl}`)\n }\n })\n\n // chalk may already have been initialized in cli.ts, but when imported as a module\n // chalkInit is idempotent\n await chalkInit(options.color)\n\n noVolta(options)\n\n print(options, 'Initializing', 'verbose')\n\n if (options.cacheClear) {\n await cacheClear(options)\n }\n\n let timeout: NodeJS.Timeout | undefined\n let timeoutPromise: Promise<void> = new Promise(() => null)\n if (options.timeout) {\n const timeoutMs = typeof options.timeout === 'string' ? Number.parseInt(options.timeout, 10) : options.timeout\n timeoutPromise = new Promise((resolve, reject) => {\n timeout = setTimeout(() => {\n // must catch the error and reject explicitly since we are in a setTimeout\n const error = `Exceeded global timeout of ${timeoutMs}ms`\n reject(error)\n try {\n programError(options, error)\n } catch (e) {\n /* noop */\n }\n }, timeoutMs)\n })\n }\n\n // doctor mode\n if (options.doctor) {\n // execute with -u\n if (options.upgrade) {\n // we have to pass run directly since it would be a circular require if doctor included this file\n return Promise.race([timeoutPromise, doctor(run, options)])\n }\n // print help otherwise\n else {\n const help =\n typeof cliOptionsMap.doctor.help === 'function' ? cliOptionsMap.doctor.help({}) : cliOptionsMap.doctor.help\n print(options, `Usage: ncu --doctor\\n\\n${help}`, 'warn')\n }\n }\n // normal mode\n else {\n return Promise.race([timeoutPromise, runUpgrades(options, timeout)])\n }\n}\n\nexport default run\n\nexport type { RunOptions }\n"],"x_google_ignoreList":[8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,151,152,153,154,155,156,157,158,159,160],"mappings":"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"}
|