UNPKG

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