UNPKG

16.4 kBSource Map (JSON)View Raw
1{"version":3,"file":"resolveEnvironments.js","sourceRoot":"","sources":["../../../src/lib/resolveEnvironments.ts"],"names":[],"mappings":"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","sourcesContent":["import { NormalizedEnvironment } from '@theintern/digdug/Tunnel';\nimport { normalize } from 'path';\n\nimport process from './node/process';\nimport Environment from './Environment';\n\n/**\n * Resolves a collection of Intern test environments to a list of service\n * environments\n *\n * @param capabilities a base set of capabilities for all environments\n * @param environments a list of user-requested enviromnents\n * @param available a list of available environments\n * @returns a list of flattened service environments\n */\nexport default function resolveEnvironments(\n capabilities: { [key: string]: any },\n environments: EnvironmentOptions[],\n available?: NormalizedEnvironment[]\n) {\n // Pre-process the environments list to resolve any uses of {pwd} and do any\n // top-level substitutions\n environments = environments.map(expandPwd);\n\n // flatEnviroments will have non-array versions\n const flatEnvironments = createPermutations(capabilities, environments);\n\n // Expand any version ranges or aliases in the environments.\n const expandedEnvironments = flatEnvironments.map(function(environment) {\n const version = resolveVersions(environment, available);\n if (version == null) {\n return environment;\n }\n return Object.assign({}, environment, { version });\n });\n\n // Perform a second round of permuting to handle any expanded version ranges\n return createPermutations({}, expandedEnvironments).map(function(\n environment\n ) {\n // After permuting, environment.version will be singular again\n return new Environment(environment);\n });\n}\n\nexport interface EnvironmentOptions {\n browserName: string | string[];\n version?: string | string[] | number | number[];\n [key: string]: any;\n}\n\nexport interface FlatEnvironment {\n browserName: string;\n version?: string;\n [key: string]: any;\n}\n\n/**\n * Expands {pwd} placeholders in a value. The value is assumed to be a string,\n * simple object, or array of strings or simple objects.\n */\nfunction expandPwd<T>(value: T): T {\n if (value == null) {\n return value;\n }\n\n if (typeof value === 'string' && /{pwd}/.test(value)) {\n return <any>normalize(value.replace(/{pwd}/g, process.cwd()));\n }\n\n if (Array.isArray(value)) {\n return <any>value.map(expandPwd);\n }\n\n if (typeof value === 'object') {\n return <any>Object.keys(value).reduce(\n (newObj, key) => ({\n ...newObj,\n [key]: expandPwd((<any>value)[key])\n }),\n {}\n );\n }\n\n return value;\n}\n\n/**\n * Expands a range of versions using available environments\n */\nfunction expandVersionRange(\n left: string,\n right: string,\n availableVersions: string[]\n) {\n if (\n availableVersions.indexOf(left) === -1 ||\n availableVersions.indexOf(right) === -1\n ) {\n throw new Error(\n 'The version range ' + left + '..' + right + ' is unavailable'\n );\n }\n return availableVersions.filter(function(version) {\n return version >= left && version <= right;\n });\n}\n\n/**\n * Resolves a version alias from a list of available versions.\n *\n * Assumes availableVersions is sorted in ascending order. Acceptable versions\n * are:\n *\n * * '{number}'\n * * 'latest'\n * * 'latest-{number}'\n */\nfunction resolveVersionAlias(version: string, availableVersions: string[]) {\n let pieces = version.split('-');\n if (pieces.length > 2) {\n throw new Error('Invalid alias syntax \"' + version + '\"');\n }\n\n pieces = pieces.map(function(piece) {\n return piece.trim();\n });\n\n if (\n (pieces.length === 2 &&\n (pieces[0] !== 'latest' || isNaN(Number(pieces[1])))) ||\n (pieces.length === 1 && isNaN(Number(pieces[0])) && pieces[0] !== 'latest')\n ) {\n throw new Error('Invalid alias syntax \"' + version + '\"');\n }\n\n if (pieces[0] === 'latest') {\n // Only consider numeric versions; we don't want 'beta' or 'dev'\n const numericVersions = availableVersions\n .filter(version => {\n return !isNaN(Number(version));\n })\n .sort((a, b) => {\n return Number(a) - Number(b);\n });\n\n let offset = pieces.length === 2 ? Number(pieces[1]) : 0;\n if (offset > numericVersions.length) {\n let message =\n \"Can't get \" + version + '; ' + numericVersions.length + ' version';\n message +=\n (numericVersions.length !== 1 ? 's are' : ' is') + ' available';\n throw new Error(message);\n }\n\n return numericVersions[numericVersions.length - 1 - offset];\n } else {\n return pieces[0];\n }\n}\n\n/**\n * Splits a version into one or two version strings using the '..' delimiter\n *\n * @returns {string[]}\n */\nfunction splitVersions(versionSpec: string) {\n const versions = versionSpec.split('..');\n\n if (versions.length > 2) {\n throw new Error('Invalid version syntax');\n }\n\n return versions.map(function(version) {\n return version.trim();\n });\n}\n\n/**\n * Get a list of versions from a list of available environments filtered by the\n * current environment.\n *\n * @param environment the environment for which versions should match\n * @param available a list of available environments\n * @returns a list of version numbers from available filtered by the current\n * environment\n */\nfunction getVersions(\n environment: EnvironmentOptions,\n available: NormalizedEnvironment[]\n): string[] {\n let versions: { [key: string]: boolean } = {};\n\n available\n .filter(function(availableEnvironment) {\n // Return true if there are no mismatching keys\n return !Object.keys(environment)\n .filter(key => key !== 'version')\n .some(envKey => {\n const key = <keyof NormalizedEnvironment>envKey;\n return (\n key in availableEnvironment &&\n availableEnvironment[key] !== environment[key]\n );\n });\n })\n .forEach(function(availableEnvironment) {\n versions[availableEnvironment.version] = true;\n });\n\n return Object.keys(versions).sort((a, b) => {\n const na = Number(a);\n const nb = Number(b);\n if (!isNaN(na) && !isNaN(nb)) {\n return na - nb;\n }\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n });\n}\n\n/**\n * Resolves version aliases (e.g. latest, latest - 1) and version ranges (e.g.\n * 36 .. latest or latest - 3 .. latest) using the environment list returned by\n * tunnel#getEnvironments().\n *\n * @param environment an object with an optional version property\n * @param available a list of environment available on the target service\n * @returns the environment with resolved version aliases\n */\nfunction resolveVersions(\n environment: FlatEnvironment,\n available?: NormalizedEnvironment[]\n): string | string[] | undefined {\n let versionSpec = environment.version;\n let versions: string[];\n available = available || [];\n\n if (versionSpec && isNaN(Number(versionSpec))) {\n let availableVersions = getVersions(environment, available);\n\n versions = splitVersions(versionSpec).map(function(version) {\n const resolved = resolveVersionAlias(version, availableVersions);\n if (resolved == null) {\n throw new Error(\n `Unable to resolve version \"${version}\" for ${\n environment.browserName\n }. Are you using the ` +\n 'proper browser and platform names for the tunnel?'\n );\n }\n return resolved;\n });\n\n if (versions.length === 2) {\n if (versions[0] > versions[1]) {\n throw new Error(\n 'Invalid range [' + versions + '], must be in ascending order'\n );\n }\n\n versions = expandVersionRange(\n versions[0],\n versions[1],\n availableVersions\n );\n }\n\n return versions;\n }\n\n return versionSpec;\n}\n\n/**\n * Builds permutations of an object by flattening properties holding array\n * values into a collection of objects representing all combinations of objects\n * for all arrays in the object.\n *\n * @param base a base set of properties applied to each source\n * @param sources a list of sources to flatten\n * @return a flattened collection of sources\n */\nfunction createPermutations(\n base: { [key: string]: string },\n sources?: EnvironmentOptions[]\n): FlatEnvironment[] {\n // If no expansion sources were given, the set of permutations consists of\n // just the base\n if (!sources || sources.length === 0) {\n return [<FlatEnvironment>Object.assign({}, base)];\n }\n\n // Expand the permutation set for each source\n return sources\n .map(function(source) {\n return Object.keys(source).reduce(\n (permutations: FlatEnvironment[], key: string) => {\n if (Array.isArray(source[key])) {\n // For array values, create a copy of the permutation\n // set for each array item, then use the combination of\n // these copies as the new value of `permutations`\n permutations = source[key]\n .map((value: any) => {\n return permutations.map(permutation =>\n Object.assign({}, permutation, { [key]: value })\n );\n })\n .reduce(\n (newPermutations: object[], keyPermutations: object[]) => {\n return newPermutations.concat(keyPermutations);\n },\n []\n );\n } else {\n // For simple values, add the value to all current\n // permutations\n permutations.forEach(permutation => {\n permutation[key] = source[key];\n });\n }\n return permutations;\n },\n [<FlatEnvironment>Object.assign({}, base)]\n );\n })\n .reduce(\n (newPermutations, sourcePermutations) =>\n newPermutations.concat(sourcePermutations),\n []\n );\n}\n"]}
\No newline at end of file