export function parseSemverVersionString()

in tools/spec-gen-sdk/src/utils/parseSemverVersionString.ts [22:116]


export function parseSemverVersionString(
  versionString: string | undefined,
  language: string | undefined
): ParseVersion | undefined {
  if (!versionString || !language) {
    return undefined;
  }
  // Copied from https://github.com/Azure/azure-sdk-tools/blob/efa8a15c81e4614f2071b82dd8ca4f6ce6076f7b/eng/common/scripts/SemVer.ps1#L36
  const SEMVER_REGEX =
   /(?<major>0|[1-9]\d*)\.(?<minor>0|[1-9]\d*)\.(?<patch>0|[1-9]\d*)(?:(?<presep>-?)(?<prelabel>[a-zA-Z]+)(?:(?<prenumsep>\.?)(?<prenumber>[0-9]{1,8})(?:(?<buildnumsep>\.?)(?<buildnumber>\d{1,3}))?)?)?/im;
  let prereleaseLabelSeparator: string | undefined;
  let prereleaseNumberSeparator: string | undefined;
  let buildNumberSeparator: string | undefined;
  let defaultPrereleaseLabel: string | undefined;
  let defaultAlphaReleaseLabel: string | undefined;
  let major: string | undefined;
  let minor: string | undefined;
  let patch: string | undefined;
  let prereleaseLabel: string | undefined;
  let prereleaseNumber: string | undefined;
  let isPrerelease: boolean | undefined;
  let versionType: string | undefined;
  let buildNumber: string | undefined;
  let prelabel: string | undefined;
  let isSemVerFormat: boolean | undefined;
  let rawVersion: string | undefined;
  const matches = versionString.match(SEMVER_REGEX);
  if (matches) {
    isSemVerFormat = true;
    rawVersion = versionString;
    major = matches && matches.groups && matches.groups.major;
    minor = matches && matches.groups && matches.groups.minor;
    patch = matches && matches.groups && matches.groups.patch;
    // If Language exists and is set to python setup the python conventions.
    const parseLanguage = 'python';
    if (parseLanguage === language.toLowerCase()) {
      // Python uses no separators and 'b' for beta so this sets up the the object to work with those conventions
      prereleaseLabelSeparator = prereleaseNumberSeparator = buildNumberSeparator = '';
      defaultPrereleaseLabel = 'b';
      defaultAlphaReleaseLabel = 'a';
    } else {
      // Use the default common conventions
      prereleaseLabelSeparator = '-';
      prereleaseNumberSeparator = '.';
      buildNumberSeparator = '.';
      defaultPrereleaseLabel = 'beta';
      defaultAlphaReleaseLabel = 'alpha';
    }

    prelabel = matches && matches.groups && matches.groups.prelabel;
    if (!prelabel) {
      prereleaseLabel = 'zzz';
      prereleaseNumber = '99999999';
      isPrerelease = false;
      versionType = 'GA';
      if (major?.toString() === '0') {
        // Treat initial 0 versions as a prerelease beta's
        versionType = 'Beta';
        isPrerelease = true;
      } else if (patch?.toString() !== '0') {
        versionType = 'patch';
      }
    } else {
      prereleaseLabel = matches && matches.groups && matches.groups.prelabel;
      prereleaseLabelSeparator = matches && matches.groups && matches.groups.presep;
      prereleaseNumber = matches && matches.groups && matches.groups.prenumber;
      prereleaseNumberSeparator = matches && matches.groups && matches.groups.prenumsep;
      isPrerelease = true;
      versionType = 'Beta';
      buildNumberSeparator = matches && matches.groups && matches.groups.buildnumsep;
      buildNumber = matches && matches.groups && matches.groups.buildnumber;
    }
  } else {
    rawVersion = versionString;
    isSemVerFormat = false;
  }
  return {
    prelabel,
    major,
    minor,
    patch,
    prereleaseLabelSeparator,
    prereleaseLabel,
    prereleaseNumberSeparator,
    buildNumberSeparator,
    buildNumber,
    prereleaseNumber,
    isPrerelease,
    versionType,
    rawVersion,
    isSemVerFormat,
    defaultPrereleaseLabel,
    defaultAlphaReleaseLabel
  };
}