Skip to content
Snippets Groups Projects
utils.ts 2.38 KiB
import { getPkgReleases } from '../../datasource';
import { logger } from '../../logger';
import { api, id as composerVersioningId } from '../../versioning/composer';
import type { ComposerConfig, ComposerLock } from './types';

export { composerVersioningId };

export async function getComposerConstraint(
  constraints: Record<string, string>
): Promise<string> {
  const { composer } = constraints;

  if (api.isSingleVersion(composer)) {
    logger.debug(
      { version: composer },
      'Using composer constraint from config'
    );
    return composer;
  }

  const release = await getPkgReleases({
    depName: 'composer/composer',
    datasource: 'github-releases',
    versioning: composerVersioningId,
  });

  if (!release?.releases?.length) {
    throw new Error('No composer releases found.');
  }
  let versions = release.releases.map((r) => r.version);

  if (composer) {
    versions = versions.filter(
      (v) => api.isValid(v) && api.matches(v, composer)
    );
  }

  if (!versions.length) {
    throw new Error('No compatible composer releases found.');
  }

  const version = versions.pop();
  logger.debug({ range: composer, version }, 'Using composer constraint');
  return version;
}

export function getPhpConstraint(constraints: Record<string, string>): string {
  const { php } = constraints;

  if (php) {
    logger.debug('Using php constraint from config');
    return php;
  }

  return null;
}

export function extractContraints(
  composerJson: ComposerConfig,
  lockParsed: ComposerLock
): Record<string, string> {
  const res: Record<string, string> = { composer: '1.*' };

  // extract php
  if (composerJson.require?.php) {
    res.php = composerJson.require?.php;
  }

  // extract direct composer dependency
  if (composerJson.require?.['composer/composer']) {
    res.composer = composerJson.require?.['composer/composer'];
  } else if (composerJson['require-dev']?.['composer/composer']) {
    res.composer = composerJson['require-dev']?.['composer/composer'];
  }
  // check last used composer version
  else if (lockParsed?.['plugin-api-version']) {
    const major = api.getMajor(lockParsed?.['plugin-api-version']);
    res.composer = `${major}.*`;
  }
  // check composer api dependency
  else if (composerJson.require?.['composer-runtime-api']) {
    const major = api.getMajor(composerJson.require?.['composer-runtime-api']);
    res.composer = `${major}.*`;
  }
  return res;
}