addons/isl-server/src/versionNumbers.tsblame
View source
b69ab311/**
b69ab312 * Copyright (c) Meta Platforms, Inc. and affiliates.
b69ab313 *
b69ab314 * This source code is licensed under the MIT license found in the
b69ab315 * LICENSE file in the root directory of this source tree.
b69ab316 */
b69ab317
b69ab318/** An array of parts of the version, like [Major, Minor, Subminor] */
b69ab319export type ParsedVersion = Array<number>;
b69ab3110
b69ab3111/** Comparator for parsed version. Return -1 if a < b, 1 if a > b, and 0 if a == b */
b69ab3112export function compareVersions(a: ParsedVersion, b: ParsedVersion): -1 | 0 | 1 {
b69ab3113 if (a.length === 0 && b.length === 0) {
b69ab3114 return 0;
b69ab3115 }
b69ab3116 if (b.length === 0) {
b69ab3117 return 1;
b69ab3118 }
b69ab3119 if (a.length === 0) {
b69ab3120 return -1;
b69ab3121 }
b69ab3122
b69ab3123 return a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : compareVersions(a.slice(1), b.slice(1));
b69ab3124}
b69ab3125
b69ab3126/**
b69ab3127 * Given a version ordinal label like V1, V0.1, V0.10 etc, extract the parts like [1], [0, 1], [0, 10] etc
b69ab3128 * This IGNORES any leading/trailing non-numeric parts.
b69ab3129 */
b69ab3130export function parseVersionParts(ordinal: string): ParsedVersion {
b69ab3131 try {
b69ab3132 const numbers = /^[a-zA-Z\-_]*(\d+(?:\.\d+)*)[a-zA-Z\-_]*$/.exec(ordinal);
b69ab3133 return numbers?.[1].split('.').map(part => parseInt(part, 10)) ?? [];
b69ab3134 } catch {
b69ab3135 return [];
b69ab3136 }
b69ab3137}