getOptionsForDiffAvailabilities()

in src/mixins/apiChangesHelpers.js [49:92]


    getOptionsForDiffAvailabilities(diffAvailabilities = []) {
      // create a diff availability hash composed of lists of the availability
      // hash for each topic
      const allDiffAvailabilities = diffAvailabilities.reduce((memo, diffAvailability = {}) => (
        Object.keys(diffAvailability).reduce((result, key) => (
          { ...result, [key]: (result[key] || []).concat(diffAvailability[key]) }
        ), memo)
      ), {});

      const diffKeys = Object.keys(allDiffAvailabilities);

      // reduce each list into a single option for each key ("gm, "beta", etc),
      // preferring the "Xcode" platform when possible
      const diffAvailability = diffKeys.reduce((memo, key) => {
        const diffs = allDiffAvailabilities[key];
        return {
          ...memo,
          [key]: diffs.find(d => d.platform === Platforms.xcode.label) || diffs[0],
        };
      }, {});

      // create a list of value/label pairs for each item in the diff availability
      // with the preferred order of "sdk", "beta", "minor", "major", (any others)
      const toOption = key => ({
        label: this.toVersionRange(diffAvailability[key]),
        value: this.toOptionValue(key),
        platform: diffAvailability[key].platform,
      });
      const {
        sdk,
        beta,
        minor,
        major,
        ...others
      } = diffAvailability;
      const sortedOptions = []
        .concat(sdk ? toOption('sdk') : [])
        .concat(beta ? toOption('beta') : [])
        .concat(minor ? toOption('minor') : [])
        .concat(major ? toOption('major') : [])
        .concat(Object.keys(others).map(toOption));

      return this.splitOptionsPerPlatform(sortedOptions);
    },