Skip to content
Snippets Groups Projects
version-manager.ts 2.29 KiB
Newer Older
rhenck's avatar
rhenck committed
import packageJSON from '../../../package.json';

/* General version strategy:
  Player + Editor:
  - isNewer -> abgelehnt
  - isOlder -> wunderbar

  - isLesserMajor is accepeted by Editor and sanitized
 */
export class VersionManager {
  private static acceptedLesserMajor = [3, 10, 0];
  private static currentVersion: [number, number, number] =
    packageJSON.config.unit_definition_version.split('.').map(Number) as [number, number, number];

  static getCurrentVersion(): string {
    return VersionManager.currentVersion.join('.');
  }

  static hasCompatibleVersion(unitDefinition: Record<string, unknown>): boolean {
    const unitDefinitionVersion = VersionManager.getUnitDefinitionVersion(unitDefinition);
    const result = !VersionManager.isNewer(unitDefinition) &&
rhenck's avatar
rhenck committed
      VersionManager.isSameMajor(unitDefinitionVersion);
    if (!result) {
      console.log('Current version: ', VersionManager.currentVersion);
      console.log('Found version: ', unitDefinitionVersion);
    }
    return result;
rhenck's avatar
rhenck committed
  }

  static isNewer(unitDefinition: Record<string, unknown>): boolean {
    return VersionManager.compare(VersionManager.getUnitDefinitionVersion(unitDefinition)) === 1;
  }

  static needsSanitization(unitDefinition: Record<string, unknown>): boolean {
    const unitDefinitionVersion = VersionManager.getUnitDefinitionVersion(unitDefinition);
    return !VersionManager.isSameMajor(unitDefinitionVersion) &&
      unitDefinitionVersion.join() === VersionManager.acceptedLesserMajor.join();
  }

  private static getUnitDefinitionVersion(unitDefinition: Record<string, any>): [number, number, number] {
    return unitDefinition.version.split('.').map(Number);
  }

  private static compare(unitDefinitionVersion: [number, number, number]): number {
    let i = 0;
    let result = 0;
    while (result === 0 && i < 3) {
      result = VersionManager.compareVersionDigit(unitDefinitionVersion[i], VersionManager.currentVersion[i]);
      i += 1;
    }
    return result;
  }

  /* -1 for older */
  private static compareVersionDigit(a: number, b: number): number {
    if (a === b) return 0;
    return a < b ? -1 : 1;
  }

  private static isSameMajor(unitDefinitionVersion: [number, number, number]): boolean {
    return VersionManager.compareVersionDigit(unitDefinitionVersion[0], VersionManager.currentVersion[0]) === 0;
  }
}