diff --git a/__tests__/commands/install/integration.js b/__tests__/commands/install/integration.js index bb5ad56dbd..36c836e45d 100644 --- a/__tests__/commands/install/integration.js +++ b/__tests__/commands/install/integration.js @@ -719,6 +719,20 @@ test('install a scoped module from authed private registry with a missing traili }); }); +test('install a private scoped module from the official npm registry', (): Promise => { + return runInstall({noLockfile: true}, 'install-private-pkg-from-npm', async (config) => { + const authedRequests = request.__getAuthedRequests(); + assert.equal(authedRequests[0].url, 'https://registry.yarnpkg.com/@types%2flodash'); + assert.equal(authedRequests[0].headers.authorization, 'Bearer abc123'); + assert.equal(authedRequests[1].url, 'https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.37.tgz'); + assert.equal(authedRequests[1].headers.authorization, 'Bearer abc123'); + assert.equal( + (await fs.readFile(path.join(config.cwd, 'node_modules', '@types', 'lodash', 'index.d.ts'))).split('\n')[0], + '// Type definitions for Lo-Dash 4.14', + ); + }); +}); + test.concurrent('install will not overwrite files in symlinked scoped directories', async (): Promise => { await runInstall({}, 'install-dont-overwrite-linked-scoped', async (config): Promise => { const dependencyPath = path.join(config.cwd, 'node_modules', '@fakescope', 'fake-dependency'); @@ -778,3 +792,4 @@ test.concurrent('a subdependency of an optional dependency that fails should be assert.ok(await fs.exists(path.join(config.cwd, 'node_modules', 'sub-dep'))); }); }); + diff --git a/__tests__/fixtures/install/install-private-pkg-from-npm/.npmrc b/__tests__/fixtures/install/install-private-pkg-from-npm/.npmrc new file mode 100644 index 0000000000..6a91ef52b8 --- /dev/null +++ b/__tests__/fixtures/install/install-private-pkg-from-npm/.npmrc @@ -0,0 +1,2 @@ +//registry.npmjs.org/:_authToken=abc123 +@types:registry=https://registry.npmjs.org/ diff --git a/__tests__/fixtures/install/install-private-pkg-from-npm/package.json b/__tests__/fixtures/install/install-private-pkg-from-npm/package.json new file mode 100644 index 0000000000..a02c5b41b4 --- /dev/null +++ b/__tests__/fixtures/install/install-private-pkg-from-npm/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@types/lodash": "4.14.37" + } +} diff --git a/src/registries/npm-registry.js b/src/registries/npm-registry.js index 16c213c49b..e51fec00f6 100644 --- a/src/registries/npm-registry.js +++ b/src/registries/npm-registry.js @@ -9,6 +9,10 @@ import NpmResolver from '../resolvers/registries/npm-resolver.js'; import envReplace from '../util/env-replace.js'; import Registry from './base-registry.js'; import {addSuffix, removePrefix} from '../util/misc'; +import {YARN_REGISTRY} from '../constants.js'; + +const NPM_REGISTRY = /http[s]:\/\/registry.npmjs.org/g; +const DEFAULT_REGISTRY = 'https://registry.npmjs.org/'; const defaults = require('defaults'); const userHome = require('user-home'); @@ -16,7 +20,6 @@ const path = require('path'); const url = require('url'); const ini = require('ini'); -const DEFAULT_REGISTRY = 'https://registry.npmjs.org/'; function getGlobalPrefix(): string { if (process.env.PREFIX) { @@ -66,7 +69,7 @@ export default class NpmRegistry extends Registry { } return this.requestManager.request({ - url: requestUrl, + url: this.cleanRegistry(requestUrl), method: opts.method, body: opts.body, auth: opts.auth, @@ -202,4 +205,8 @@ export default class NpmRegistry extends Registry { getScopedOption(scope: string, option: string): mixed { return this.getOption(scope + (scope ? ':' : '') + option); } + + cleanRegistry(url: string): string { + return url.replace(NPM_REGISTRY, YARN_REGISTRY); + } } diff --git a/src/resolvers/registries/npm-resolver.js b/src/resolvers/registries/npm-resolver.js index e5fd645076..050e6619dc 100644 --- a/src/resolvers/registries/npm-resolver.js +++ b/src/resolvers/registries/npm-resolver.js @@ -7,14 +7,11 @@ import RegistryResolver from './registry-resolver.js'; import NpmRegistry from '../../registries/npm-registry.js'; import map from '../../util/map.js'; import * as fs from '../../util/fs.js'; -import {YARN_REGISTRY} from '../../constants.js'; const invariant = require('invariant'); const path = require('path'); const os = require('os'); -const NPM_REGISTRY = /http[s]:\/\/registry.npmjs.org/g; - type RegistryResponse = { name: string, versions: { [key: string]: Manifest }, @@ -135,14 +132,6 @@ export default class NpmResolver extends RegistryResolver { } } - cleanRegistry(url: string): string { - if (this.config.getOption('registry') === YARN_REGISTRY) { - return url.replace(NPM_REGISTRY, YARN_REGISTRY); - } else { - return url; - } - } - async resolve(): Promise { // lockfile const shrunk = this.request.getLocked('tarball'); @@ -167,9 +156,9 @@ export default class NpmResolver extends RegistryResolver { if (dist != null && dist.tarball) { info._remote = { - resolved: `${this.cleanRegistry(dist.tarball)}#${dist.shasum}`, + resolved: `${dist.tarball}#${dist.shasum}`, type: 'tarball', - reference: this.cleanRegistry(dist.tarball), + reference: dist.tarball, hash: dist.shasum, registry: 'npm', };