UNPKG

7.69 kBJavaScriptView Raw
1(function (factory) {
2 if (typeof module === "object" && typeof module.exports === "object") {
3 var v = factory(require, exports);
4 if (v !== undefined) module.exports = v;
5 }
6 else if (typeof define === "function" && define.amd) {
7 define(["require", "exports", "tslib", "path", "./node/process", "./Environment"], factory);
8 }
9})(function (require, exports) {
10 "use strict";
11 Object.defineProperty(exports, "__esModule", { value: true });
12 var tslib_1 = require("tslib");
13 var path_1 = require("path");
14 var process_1 = require("./node/process");
15 var Environment_1 = require("./Environment");
16 function resolveEnvironments(capabilities, environments, available) {
17 environments = environments.map(expandPwd);
18 var flatEnvironments = createPermutations(capabilities, environments);
19 var expandedEnvironments = flatEnvironments.map(function (environment) {
20 var version = resolveVersions(environment, available);
21 if (version == null) {
22 return environment;
23 }
24 return Object.assign({}, environment, { version: version });
25 });
26 return createPermutations({}, expandedEnvironments).map(function (environment) {
27 return new Environment_1.default(environment);
28 });
29 }
30 exports.default = resolveEnvironments;
31 function expandPwd(value) {
32 if (value == null) {
33 return value;
34 }
35 if (typeof value === 'string' && /{pwd}/.test(value)) {
36 return path_1.normalize(value.replace(/{pwd}/g, process_1.default.cwd()));
37 }
38 if (Array.isArray(value)) {
39 return value.map(expandPwd);
40 }
41 if (typeof value === 'object') {
42 return Object.keys(value).reduce(function (newObj, key) {
43 var _a;
44 return (tslib_1.__assign({}, newObj, (_a = {}, _a[key] = expandPwd(value[key]), _a)));
45 }, {});
46 }
47 return value;
48 }
49 function expandVersionRange(left, right, availableVersions) {
50 if (availableVersions.indexOf(left) === -1 ||
51 availableVersions.indexOf(right) === -1) {
52 throw new Error('The version range ' + left + '..' + right + ' is unavailable');
53 }
54 return availableVersions.filter(function (version) {
55 return version >= left && version <= right;
56 });
57 }
58 function resolveVersionAlias(version, availableVersions) {
59 var pieces = version.split('-');
60 if (pieces.length > 2) {
61 throw new Error('Invalid alias syntax "' + version + '"');
62 }
63 pieces = pieces.map(function (piece) {
64 return piece.trim();
65 });
66 if ((pieces.length === 2 &&
67 (pieces[0] !== 'latest' || isNaN(Number(pieces[1])))) ||
68 (pieces.length === 1 && isNaN(Number(pieces[0])) && pieces[0] !== 'latest')) {
69 throw new Error('Invalid alias syntax "' + version + '"');
70 }
71 if (pieces[0] === 'latest') {
72 var numericVersions = availableVersions
73 .filter(function (version) {
74 return !isNaN(Number(version));
75 })
76 .sort(function (a, b) {
77 return Number(a) - Number(b);
78 });
79 var offset = pieces.length === 2 ? Number(pieces[1]) : 0;
80 if (offset > numericVersions.length) {
81 var message = "Can't get " + version + '; ' + numericVersions.length + ' version';
82 message +=
83 (numericVersions.length !== 1 ? 's are' : ' is') + ' available';
84 throw new Error(message);
85 }
86 return numericVersions[numericVersions.length - 1 - offset];
87 }
88 else {
89 return pieces[0];
90 }
91 }
92 function splitVersions(versionSpec) {
93 var versions = versionSpec.split('..');
94 if (versions.length > 2) {
95 throw new Error('Invalid version syntax');
96 }
97 return versions.map(function (version) {
98 return version.trim();
99 });
100 }
101 function getVersions(environment, available) {
102 var versions = {};
103 available
104 .filter(function (availableEnvironment) {
105 return !Object.keys(environment)
106 .filter(function (key) { return key !== 'version'; })
107 .some(function (envKey) {
108 var key = envKey;
109 return (key in availableEnvironment &&
110 availableEnvironment[key] !== environment[key]);
111 });
112 })
113 .forEach(function (availableEnvironment) {
114 versions[availableEnvironment.version] = true;
115 });
116 return Object.keys(versions).sort(function (a, b) {
117 var na = Number(a);
118 var nb = Number(b);
119 if (!isNaN(na) && !isNaN(nb)) {
120 return na - nb;
121 }
122 if (a < b) {
123 return -1;
124 }
125 if (a > b) {
126 return 1;
127 }
128 return 0;
129 });
130 }
131 function resolveVersions(environment, available) {
132 var versionSpec = environment.version;
133 var versions;
134 available = available || [];
135 if (versionSpec && isNaN(Number(versionSpec))) {
136 var availableVersions_1 = getVersions(environment, available);
137 versions = splitVersions(versionSpec).map(function (version) {
138 var resolved = resolveVersionAlias(version, availableVersions_1);
139 if (resolved == null) {
140 throw new Error("Unable to resolve version \"" + version + "\" for " + environment.browserName + ". Are you using the " +
141 'proper browser and platform names for the tunnel?');
142 }
143 return resolved;
144 });
145 if (versions.length === 2) {
146 if (versions[0] > versions[1]) {
147 throw new Error('Invalid range [' + versions + '], must be in ascending order');
148 }
149 versions = expandVersionRange(versions[0], versions[1], availableVersions_1);
150 }
151 return versions;
152 }
153 return versionSpec;
154 }
155 function createPermutations(base, sources) {
156 if (!sources || sources.length === 0) {
157 return [Object.assign({}, base)];
158 }
159 return sources
160 .map(function (source) {
161 return Object.keys(source).reduce(function (permutations, key) {
162 if (Array.isArray(source[key])) {
163 permutations = source[key]
164 .map(function (value) {
165 return permutations.map(function (permutation) {
166 var _a;
167 return Object.assign({}, permutation, (_a = {}, _a[key] = value, _a));
168 });
169 })
170 .reduce(function (newPermutations, keyPermutations) {
171 return newPermutations.concat(keyPermutations);
172 }, []);
173 }
174 else {
175 permutations.forEach(function (permutation) {
176 permutation[key] = source[key];
177 });
178 }
179 return permutations;
180 }, [Object.assign({}, base)]);
181 })
182 .reduce(function (newPermutations, sourcePermutations) {
183 return newPermutations.concat(sourcePermutations);
184 }, []);
185 }
186});
187//# sourceMappingURL=resolveEnvironments.js.map
\No newline at end of file