public async getUnreleasedPastLabels()

in src/common/github-service.ts [159:206]


  public async getUnreleasedPastLabels(version: string): Promise<string[]> {
    const v = semver.parse(version);
    if (!v) {
      // If the version was not valid or we're generating for a major version we're
      // not finding anything. We can't do this for major versions, since we don't
      // know what the last minor version of the previous major was and searching for
      // e.g. v7.* will result in too many matches.
      return [];
    }

    let priorVersionLabels: string[];
    if (v.minor === 1) {
      // If we're generating for a x.1.y version, check the x.0 version and the highest
      // minor of the previous major.
      priorVersionLabels = [
        ...(await this.getHighestVersionsForMajor(v.major - 1, 1)),
        ...(await this.getVersionsForMinor(v.major, [v.minor - 1])),
      ];
    } else if (v.minor === 0) {
      // If we're generating for a x.0.y version, check the two highest minors of the previous major
      priorVersionLabels = await this.getHighestVersionsForMajor(v.major - 1, 2);
    } else {
      // In other cases just check the previous two minors
      priorVersionLabels = await this.getVersionsForMinor(v.major, [v.minor - 1, v.minor - 2]);
    }

    // Check for each of the previous highest patch labels if there is a corresponding release for them
    const releases = await Promise.allSettled(
      priorVersionLabels.map((label) => {
        return this.octokit.repos.getReleaseByTag({
          owner: GITHUB_OWNER,
          repo: this.repoName,
          tag: label,
        });
      })
    );

    return (
      releases
        // Map the status of the release check back to the release label
        .map((release, index) => ({ status: release.status, label: priorVersionLabels[index] }))
        // Filter for only releases which had no release (which will return a 404)
        .filter((release) => release.status === 'rejected')
        // Just extract the label of those
        .map(({ label }) => label)
        .sort()
    );
  }