import { isFunction, isTruthy } from '@sindresorhus/is'; import { logger } from '../../../logger/index.ts'; import { isSkipComment } from '../../../util/ignore.ts'; import { regEx } from '../../../util/regex.ts'; import type { PackageDependency, PackageFileContent } from '../types.ts'; import type { StaticTooling } from './types.ts'; import { upgradeableTooling } from './upgradeable-tooling.ts'; export function extractPackageFile(content: string): PackageFileContent | null { logger.trace(`asdf.extractPackageFile()`); const regex = regEx( /^(?(?:[\w_-]+)) +(?[^\s#]+)(?: +[^\s#]+)* *(?: #(?.*))?$/gm, ); const deps: PackageDependency[] = []; for (const groups of [...content.matchAll(regex)] .map((m) => m.groups) .filter(isTruthy)) { const depName = groups.toolName.trim(); const version = groups.version.trim(); const toolConfig = upgradeableTooling[depName]; let toolDefinition: StaticTooling | undefined; if (toolConfig) { toolDefinition = isFunction(toolConfig.config) ? toolConfig.config(version) : toolConfig.config; } if (toolDefinition) { const dep: PackageDependency = { currentValue: version, depName, ...toolDefinition, }; if (isSkipComment((groups.comment ?? '').trim())) { dep.skipReason = 'ignored'; } deps.push(dep); } else { const dep: PackageDependency = { depName, skipReason: 'unsupported-datasource', }; deps.push(dep); } } return deps.length ? { deps } : null; }