mirror of
https://github.com/trezor/trezor-suite.git
synced 2026-03-02 21:45:14 +01:00
fix(utils): versionUtils.isVersionArray strict validation
from `@trezor/connect` package
9c5ecad67f/packages/connect/src/utils/versionUtils.ts
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user