1 |
|
2 | import versionClean from 'version-clean';
|
3 | import versionCompare from 'version-compare';
|
4 | import versionRange from 'version-range';
|
5 |
|
6 | import Version from './version.js';
|
7 |
|
8 | export class Versions {
|
9 |
|
10 | listeners = [];
|
11 |
|
12 | array = [];
|
13 |
|
14 | constructor(versions, listeners = []) {
|
15 | this.listeners.push(...listeners);
|
16 | this.add(versions);
|
17 | }
|
18 |
|
19 | static comparator(left, right) {
|
20 | const a = versionClean(left.version);
|
21 | const b = versionClean(right.version);
|
22 | if (!a) {
|
23 |
|
24 | return 1;
|
25 | }
|
26 | else if (!b) {
|
27 |
|
28 | return -1;
|
29 | }
|
30 | else {
|
31 |
|
32 | return versionCompare(a, b);
|
33 | }
|
34 | }
|
35 |
|
36 | add(versions) {
|
37 | if (!Array.isArray(versions))
|
38 | versions = [versions];
|
39 | this.array.push(...versions.map((v) => {
|
40 | const V = new Version(v, this.listeners);
|
41 | return V;
|
42 | }));
|
43 | this.compact();
|
44 | return this;
|
45 | }
|
46 |
|
47 | get(version) {
|
48 | return (this.array.find((V) => V.version === version) ||
|
49 | this.array.find((V) => V.aliases.includes(version)) ||
|
50 | this.array.find((V) => versionRange(V.version, version)) ||
|
51 | null);
|
52 | }
|
53 |
|
54 | sort() {
|
55 | this.array.sort(Versions.comparator);
|
56 | return this;
|
57 | }
|
58 |
|
59 | compact() {
|
60 | const map = {};
|
61 | this.array.forEach(function (V) {
|
62 | if (map[V.version]) {
|
63 | map[V.version].alias = V.alias;
|
64 | }
|
65 | else {
|
66 | map[V.version] = V;
|
67 | }
|
68 | });
|
69 | this.array = Object.values(map);
|
70 | this.sort();
|
71 | return this;
|
72 | }
|
73 |
|
74 | get success() {
|
75 | const failure = this.array.some((V) => V.success === false);
|
76 | return !failure;
|
77 | }
|
78 |
|
79 | get length() {
|
80 | return this.array.length;
|
81 | }
|
82 |
|
83 | get json() {
|
84 | const results = { success: true };
|
85 | this.array.forEach(function (V) {
|
86 | results[V.status] = (results[V.status] || []).concat(V.version);
|
87 | if (V.success === false)
|
88 | results.success = false;
|
89 | });
|
90 | return results;
|
91 | }
|
92 |
|
93 | get table() {
|
94 | return this.array.map((V) => V.row);
|
95 | }
|
96 |
|
97 | get messages() {
|
98 | return this.array.map((V) => V.message);
|
99 | }
|
100 |
|
101 | async load(compact = true) {
|
102 | await Promise.all(this.array.map((V) => V.load()));
|
103 | if (compact) {
|
104 | this.compact();
|
105 | }
|
106 | else {
|
107 | this.sort();
|
108 | }
|
109 | return this;
|
110 | }
|
111 |
|
112 | async install() {
|
113 | await Promise.all(this.array.map((V) => V.install()));
|
114 | return this;
|
115 | }
|
116 |
|
117 | async test(command, serial = false) {
|
118 | if (!command) {
|
119 | throw new Error('no command provided to the testen versions runner');
|
120 | }
|
121 | if (serial) {
|
122 | for (const V of this.array) {
|
123 | await V.test(command);
|
124 | }
|
125 | }
|
126 | else {
|
127 | await Promise.all(this.array.map((V) => V.test(command)));
|
128 | }
|
129 | return this;
|
130 | }
|
131 | }
|
132 | export default Versions;
|