From a135c0086697d2623d74dd7b23dcb2b69e307a0e Mon Sep 17 00:00:00 2001 From: Joxit Date: Tue, 9 May 2023 22:34:59 +0200 Subject: [PATCH] feat(utils): add splitTagToArray that will transform a tag into an array alpha and num splited --- src/scripts/taglist-order.js | 58 +++++++++++++++++++ src/scripts/utils.js | 42 -------------- test/{utils.test.js => taglist-order.test.js} | 23 +++++++- 3 files changed, 78 insertions(+), 45 deletions(-) create mode 100644 src/scripts/taglist-order.js rename test/{utils.test.js => taglist-order.test.js} (75%) diff --git a/src/scripts/taglist-order.js b/src/scripts/taglist-order.js new file mode 100644 index 0000000..42d274d --- /dev/null +++ b/src/scripts/taglist-order.js @@ -0,0 +1,58 @@ +import { DockerRegistryUIError } from './error.js'; +import { isDigit } from './utils.js'; + +const TAGLIST_ORDER_REGEX = /(alpha-(asc|desc);num-(asc|desc))|(num-(asc|desc);alpha-(asc|desc))/; + +export const taglistOrderVariants = (taglistOrder) => { + switch (taglistOrder) { + case 'desc': + return 'alpha-desc;num-desc'; + case 'asc': + return 'num-asc;alpha-asc'; + case 'alpha-desc': + case 'alpha-asc': + case 'num-desc': + case 'num-asc': + return `${taglistOrder};${taglistOrder.startsWith('num') ? 'alpha' : 'num'}-asc`; + default: + if (!taglistOrder) { + return 'num-asc;alpha-asc'; + } else if (TAGLIST_ORDER_REGEX.test(taglistOrder)) { + return taglistOrder; + } + throw new DockerRegistryUIError(`The order \`${taglistOrder}\` is not recognized.`); + } +}; + +export const taglistOrderParser = (taglistOrder) => { + const orders = taglistOrderVariants(taglistOrder) + .split(';') + .filter((e) => e) + .map((e) => e.split('-').filter((e) => e)) + .reduce((acc, e, idx) => { + if (e.length > 1) { + acc[e[0] + 'Asc'] = e[1] === 'asc'; + } + if (idx === 0) { + acc.numFirst = e[0] === 'num'; + } + return acc; + }, {}); + + return orders; +}; + +export const tagReduce = (acc, e) => { + if (acc.length > 0 && isDigit(acc[acc.length - 1].charAt(0)) == isDigit(e)) { + acc[acc.length - 1] += e; + } else { + acc.push(e); + } + return acc; +}; + +export const splitTagToArray = (tag) => + tag + .split('') + .reduce(tagReduce, []) + .map((e) => (isDigit(e.charAt(0)) ? parseInt(e) : e)); diff --git a/src/scripts/utils.js b/src/scripts/utils.js index 0ca3642..81e4328 100644 --- a/src/scripts/utils.js +++ b/src/scripts/utils.js @@ -1,4 +1,3 @@ -import { DockerRegistryUIError } from './error.js'; const LOCAL_STORAGE_KEY = 'registryServer'; export function bytesToSize(bytes) { @@ -221,44 +220,3 @@ export function truthy(value) { export function stringToArray(value) { return value && typeof value === 'string' ? value.split(',') : []; } - -const TAGLIST_ORDER_REGEX = /(alpha-(asc|desc);num-(asc|desc))|(num-(asc|desc);alpha-(asc|desc))/; - -export const taglistOrderVariants = (taglistOrder) => { - switch (taglistOrder) { - case 'desc': - return 'alpha-desc;num-desc'; - case 'asc': - return 'num-asc;alpha-asc'; - case 'alpha-desc': - case 'alpha-asc': - case 'num-desc': - case 'num-asc': - return `${taglistOrder};${taglistOrder.startsWith('num') ? 'alpha' : 'num'}-asc`; - default: - if (!taglistOrder) { - return 'num-asc;alpha-asc'; - } else if (TAGLIST_ORDER_REGEX.test(taglistOrder)) { - return taglistOrder; - } - throw new DockerRegistryUIError(`The order \`${taglistOrder}\` is not recognized.`); - } -}; - -export const taglistOrderParser = (taglistOrder) => { - const orders = taglistOrderVariants(taglistOrder) - .split(';') - .filter((e) => e) - .map((e) => e.split('-').filter((e) => e)) - .reduce((acc, e, idx) => { - if (e.length > 1) { - acc[e[0] + 'Asc'] = e[1] === 'asc'; - } - if (idx === 0) { - acc.numFirst = e[0] === 'num'; - } - return acc; - }, {}); - - return orders; -}; diff --git a/test/utils.test.js b/test/taglist-order.test.js similarity index 75% rename from test/utils.test.js rename to test/taglist-order.test.js index feb6d02..0736786 100644 --- a/test/utils.test.js +++ b/test/taglist-order.test.js @@ -1,4 +1,4 @@ -import { taglistOrderVariants, taglistOrderParser } from '../src/scripts/utils.js'; +import { taglistOrderVariants, taglistOrderParser, splitTagToArray } from '../src/scripts/taglist-order.js'; import { DockerRegistryUIError } from '../src/scripts/error.js'; import assert from 'assert'; @@ -59,12 +59,29 @@ describe('utils tests', () => { it('should parse correctly `alpha-asc;num-desc` and variants', () => { const expected = { numAsc: false, alphaAsc: true, numFirst: false }; - assert.deepEqual(taglistOrderParser('alpha-asc;num-desc'), expected) + assert.deepEqual(taglistOrderParser('alpha-asc;num-desc'), expected); }); it('should parse correctly `num-desc;alpha-desc` and variants', () => { const expected = { numAsc: false, alphaAsc: false, numFirst: true }; - assert.deepEqual(taglistOrderParser('num-desc;alpha-desc'), expected) + assert.deepEqual(taglistOrderParser('num-desc;alpha-desc'), expected); + }); + }); + + describe('splitTagToArray', () => { + it('should reduce tags with numbers', () => { + assert.deepEqual(splitTagToArray('0.2.4'), [0, '.', 2, '.', 4]); + assert.deepEqual(splitTagToArray('1.2.3-SNAPSHOT'), [1, '.', 2, '.', 3, '-SNAPSHOT']); + assert.deepEqual(splitTagToArray('alpine-3.2'), ['alpine-', 3, '.', 2]); + assert.deepEqual(splitTagToArray('10.30.00'), [10, '.', 30, '.', 0]); + assert.deepEqual(splitTagToArray('010.30.00'), [10, '.', 30, '.', 0]); + assert.deepEqual(splitTagToArray('z010.30.00'), ['z', 10, '.', 30, '.', 0]); + }); + + it('should reduce tags without numbers', () => { + assert.deepEqual(splitTagToArray('main'), ['main']); + assert.deepEqual(splitTagToArray('master'), ['master']); + assert.deepEqual(splitTagToArray('alpine-lts'), ['alpine-lts']); }); }); });