import { isNumber } from '@sindresorhus/is'; import semver from 'semver'; import { parseRange } from 'semver-utils'; import { logger } from '../../../logger/index.ts'; import type { RangeStrategy } from '../../../types/versioning.ts'; import { regEx } from '../../../util/regex.ts'; import { api as npm } from '../npm/index.ts'; import type { NewValueConfig, VersioningApi } from '../types.ts'; export const id = 'composer'; export const displayName = 'Composer'; export const urls = [ '[Composer versions](https://getcomposer.org/doc/articles/versions.md)', '[composer/semver package](https://packagist.org/packages/composer/semver)', '[Tilde and caret constraints](https://madewithlove.be/tilde-and-caret-constraints/)', '[Composer semver checker](https://semver.mwl.be)', ]; export const supportsRanges = true; export const supportedRangeStrategies: RangeStrategy[] = [ 'bump', 'widen', 'replace', 'update-lockfile', ]; function getVersionParts(input: string): [string, string] { const versionParts = input.split('-'); if (versionParts.length === 1) { return [input, '']; } return [versionParts[0], `-${versionParts[1]}`]; } function padZeroes(input: string): string { const [output, stability] = getVersionParts(input); const sections = output.split('.'); while (sections.length < 3) { sections.push('0'); } return `${sections.join('.')}${stability}`; } function convertStabilityModifier(input: string): string { // Handle stability modifiers. const versionParts = input.split('@'); if (versionParts.length === 1) { return input; } // 1.0@beta2 to 1.0-beta.2 const stability = versionParts[1].replace( regEx(/(?:^|\s)(?