fix(utils): versionUtils.isVersionArray strict validation

from `@trezor/connect` package
9c5ecad67f/packages/connect/src/utils/versionUtils.ts
This commit is contained in:
Szymon Lesisz
2023-03-24 12:00:22 +01:00
committed by martin
parent c6071123f3
commit b61d52c1da
2 changed files with 55 additions and 10 deletions

View File

@@ -1,6 +1,28 @@
type VersionArray = [number, number, number];
type VersionInput = VersionArray | string;
export const isVersionArray = (arr: unknown): arr is VersionArray => {
// Check if argument is an actual array
if (!Array.isArray(arr)) {
return false;
}
// Array has invalid length
if (arr.length !== 3) {
return false;
}
// Check for invalid numbers in the array
for (let i = 0; i < arr.length; i++) {
const versionNumber = arr[i];
if (typeof versionNumber !== 'number' || versionNumber < 0) {
return false;
}
}
return true;
};
const parse = (versionArr: VersionArray) => ({
major: versionArr[0],
minor: versionArr[1],
@@ -8,17 +30,15 @@ const parse = (versionArr: VersionArray) => ({
});
const split = (version: string) => {
const arr = version.split('.');
if (arr.length !== 3) {
const arr = version.split('.').map(v => Number(v));
if (!isVersionArray(arr)) {
throw new Error('version string is in wrong format');
}
return arr as unknown as VersionArray;
return arr;
};
const versionToString = (arr: VersionArray) => `${arr[0]}.${arr[1]}.${arr[2]}`;
export const isVersionArray = (arr: number[]): arr is VersionArray => arr.length === 3;
/**
* Is versionX (first arg) newer than versionY (second arg)
* accepts version in two formats:

View File

@@ -1,7 +1,13 @@
import { isNewer, isNewerOrEqual, isEqual, normalizeVersion } from '../src/versionUtils';
import {
isNewer,
isNewerOrEqual,
isEqual,
normalizeVersion,
isVersionArray,
} from '../src/versionUtils';
describe('Version Utils', () => {
describe('is newer', () => {
describe('versionUtils', () => {
describe('isNewer', () => {
// older
it('it should return false [0, 0, 1] [0, 0, 2]', () => {
const result = isNewer([1, 0, 1], [1, 0, 2]);
@@ -51,7 +57,7 @@ describe('Version Utils', () => {
});
});
describe('is equal', () => {
describe('isEqual', () => {
it('it should return false [1, 0, 0], [1, 0, 1]', () => {
const result = isEqual([1, 0, 0], [1, 0, 1]);
expect(result).toBe(false);
@@ -68,7 +74,7 @@ describe('Version Utils', () => {
});
});
describe('is newer or equal', () => {
describe('isNewerOrEqual', () => {
it('it should return false [1, 0, 0], [1, 0, 1]', () => {
const result = isNewerOrEqual([1, 0, 0], [1, 0, 1]);
expect(result).toBe(false);
@@ -99,4 +105,23 @@ describe('Version Utils', () => {
expect(normalizeVersion('20.11.1')).toEqual('20.11.1');
});
});
describe('isVersionArray', () => {
it('invalid cases', () => {
expect(isVersionArray(null)).toEqual(false);
expect(isVersionArray([null])).toEqual(false);
expect(isVersionArray([1, 2, null])).toEqual(false);
expect(isVersionArray([-1])).toEqual(false);
expect(isVersionArray([1, 2, -1])).toEqual(false);
expect(isVersionArray([])).toEqual(false);
expect(isVersionArray([1, 2, 3, 4])).toEqual(false);
expect(isVersionArray([1])).toEqual(false);
expect(isVersionArray([1, 2])).toEqual(false);
});
it('valid cases', () => {
expect(isVersionArray([0, 1, 2])).toEqual(true);
expect(isVersionArray([1, 2, 3])).toEqual(true);
});
});
});