feat(utils): add splitTagToArray that will transform a tag into an array alpha and num splited
This commit is contained in:
parent
b0ea4e5fb8
commit
a135c00866
|
@ -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));
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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']);
|
||||
});
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue