common/scripts/install-run.js
function resolvePackageVersion(rushCommonFolder, { name, version }) {
    if (!version) {
        version = '*'; // If no version is specified, use the latest version
    }
    if (version.match(/^[a-zA-Z0-9\-\+\.]+$/)) {
        // If the version contains only characters that we recognize to be used in static version specifiers,
        // pass the version through
        return version;
    }
    else {
        // version resolves to
        try {
            const rushTempFolder = ensureAndJoinPath(rushCommonFolder, 'temp');
            const sourceNpmrcFolder = path.join(rushCommonFolder, 'config', 'rush');
            syncNpmrc(sourceNpmrcFolder, rushTempFolder);
            const npmPath = getNpmPath();
            // This returns something that looks like:
            //  @microsoft/rush@3.0.0 '3.0.0'
            //  @microsoft/rush@3.0.1 '3.0.1'
            //  ...
            //  @microsoft/rush@3.0.20 '3.0.20'
            //  <blank line>
            const npmVersionSpawnResult = childProcess.spawnSync(npmPath, ['view', `${name}@${version}`, 'version', '--no-update-notifier'], {
                cwd: rushTempFolder,
                stdio: []
            });
            if (npmVersionSpawnResult.status !== 0) {
                throw new Error(`"npm view" returned error code ${npmVersionSpawnResult.status}`);
            }
            const npmViewVersionOutput = npmVersionSpawnResult.stdout.toString();
            const versionLines = npmViewVersionOutput.split('\n').filter((line) => !!line);
            const latestVersion = versionLines[versionLines.length - 1];
            if (!latestVersion) {
                throw new Error('No versions found for the specified version range.');
            }
            const versionMatches = latestVersion.match(/^.+\s\'(.+)\'$/);
            if (!versionMatches) {
                throw new Error(`Invalid npm output ${latestVersion}`);
            }
            return versionMatches[1];
        }
        catch (e) {
            throw new Error(`Unable to resolve version ${version} of package ${name}: ${e}`);
        }
    }
}
function resolvePackageVersion(rushCommonFolder, { name, version }) {
    if (!version) {
        version = '*'; // If no version is specified, use the latest version
    }
    if (version.match(/^[a-zA-Z0-9\-\+\.]+$/)) {
        // If the version contains only characters that we recognize to be used in static version specifiers,
        // pass the version through
        return version;
    }
    else {
        // version resolves to
        try {
            const rushTempFolder = ensureAndJoinPath(rushCommonFolder, 'temp');
            const sourceNpmrcFolder = path.join(rushCommonFolder, 'config', 'rush');
            syncNpmrc(sourceNpmrcFolder, rushTempFolder);
            const npmPath = getNpmPath();
            // This returns something that looks like:
            //  @microsoft/rush@3.0.0 '3.0.0'
            //  @microsoft/rush@3.0.1 '3.0.1'
            //  ...
            //  @microsoft/rush@3.0.20 '3.0.20'
            //  <blank line>
            const npmVersionSpawnResult = childProcess.spawnSync(npmPath, ['view', `${name}@${version}`, 'version', '--no-update-notifier'], {
                cwd: rushTempFolder,
                stdio: []
            });
            if (npmVersionSpawnResult.status !== 0) {
                throw new Error(`"npm view" returned error code ${npmVersionSpawnResult.status}`);
            }
            const npmViewVersionOutput = npmVersionSpawnResult.stdout.toString();
            const versionLines = npmViewVersionOutput.split('\n').filter((line) => !!line);
            const latestVersion = versionLines[versionLines.length - 1];
            if (!latestVersion) {
                throw new Error('No versions found for the specified version range.');
            }
            const versionMatches = latestVersion.match(/^.+\s\'(.+)\'$/);
            if (!versionMatches) {
                throw new Error(`Invalid npm output ${latestVersion}`);
            }
            return versionMatches[1];
        }
        catch (e) {
            throw new Error(`Unable to resolve version ${version} of package ${name}: ${e}`);
        }
    }
}
function resolvePackageVersion ( rushCommonFolder , { name , version } ) { if ( ! version ) { version = '*' ; // If no version is specified, use the latest version
 } if ( version . match ( / ^[a-zA-Z0-9\-\+\.]+$ / ) ) { // If the version contains only characters that we recognize to be used in static version specifiers,
 // pass the version through
 return version ; } else { // version resolves to
 try { const rushTempFolder = ensureAndJoinPath ( rushCommonFolder , 'temp' ) ; const sourceNpmrcFolder = path . join ( rushCommonFolder , 'config' , 'rush' ) ; syncNpmrc ( sourceNpmrcFolder , rushTempFolder ) ; const npmPath = getNpmPath ( ) ; // This returns something that looks like:
 //  @microsoft/rush@3.0.0 '3.0.0'
 //  @microsoft/rush@3.0.1 '3.0.1'
 //  ...
 //  @microsoft/rush@3.0.20 '3.0.20'
 //  <blank line>
 const npmVersionSpawnResult = childProcess . spawnSync ( npmPath , [ 'view' , ` ${ name } ${ version } ` , 'version' , '--no-update-notifier' ] , { cwd : rushTempFolder , stdio : [ ] } ) ; if ( npmVersionSpawnResult . status !== 0 ) { throw new Error ( ` ${ npmVersionSpawnResult . status } ` ) ; } const npmViewVersionOutput = npmVersionSpawnResult . stdout . toString ( ) ; const versionLines = npmViewVersionOutput . split ( '\n' ) . filter ( ( line ) => ! ! line ) ; const latestVersion = versionLines [ versionLines . length - 1 ] ; if ( ! latestVersion ) { throw new Error ( 'No versions found for the specified version range.' ) ; } const versionMatches = latestVersion . match ( / ^.+\s\'(.+)\'$ / ) ; if ( ! versionMatches ) { throw new Error ( ` ${ latestVersion } ` ) ; } return versionMatches [ 1 ] ; } catch ( e ) { throw new Error ( ` ${ version } ${ name } ${ e } ` ) ; } } }
Resolve a package specifier to a static version
Resolve a package specifier to a static version