Skip to content

Commit 6783147

Browse files
committed
feat(@schematics/update): add registry flag
To allow for people that use NPM proxies or local cache and dont have access to the registry.npmjs.org Fix angular/angular-cli#10241
1 parent e7a32db commit 6783147

File tree

4 files changed

+31
-7
lines changed

4 files changed

+31
-7
lines changed

packages/schematics/update/update/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,7 @@ export default function(options: UpdateSchema): Rule {
631631
return observableFrom([...allDependencies.keys()]).pipe(
632632
// Grab all package.json from the npm repository. This requires a lot of HTTP calls so we
633633
// try to parallelize as many as possible.
634-
mergeMap(depName => getNpmPackageJson(depName, logger)),
634+
mergeMap(depName => getNpmPackageJson(depName, options.registry, logger)),
635635

636636
// Build a map of all dependencies and their packageJson.
637637
reduce<NpmRepositoryPackageJson, Map<string, NpmRepositoryPackageJson>>(

packages/schematics/update/update/npm.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88
import { logging } from '@angular-devkit/core';
9-
import * as http from 'http';
109
import { Observable, ReplaySubject } from 'rxjs';
10+
import * as url from 'url';
1111
import { NpmRepositoryPackageJson } from './npm-package-json';
1212

1313

@@ -17,24 +17,34 @@ const npmPackageJsonCache = new Map<string, Observable<NpmRepositoryPackageJson>
1717
/**
1818
* Get the NPM repository's package.json for a package. This is p
1919
* @param {string} packageName The package name to fetch.
20+
* @param {string} registryUrl The NPM Registry URL to use.
2021
* @param {LoggerApi} logger A logger instance to log debug information.
2122
* @returns An observable that will put the pacakge.json content.
2223
* @private
2324
*/
2425
export function getNpmPackageJson(
2526
packageName: string,
27+
registryUrl: string,
2628
logger: logging.LoggerApi,
2729
): Observable<NpmRepositoryPackageJson> {
28-
const url = `http://registry.npmjs.org/${packageName.replace(/\//g, '%2F')}`;
30+
let fullUrl = new url.URL(`http://${registryUrl}/${packageName.replace(/\//g, '%2F')}`);
31+
try {
32+
const registry = new url.URL(registryUrl);
33+
registry.pathname = (registry.pathname || '')
34+
.replace(/\/?$/, '/' + packageName.replace(/\//g, '%2F'));
35+
fullUrl = new url.URL(url.format(registry));
36+
} catch (_) {
37+
}
38+
2939
logger.debug(
30-
`Getting package.json from ${JSON.stringify(packageName)} (url: ${JSON.stringify(url)})...`,
40+
`Getting package.json from ${JSON.stringify(packageName)} (url: ${JSON.stringify(fullUrl)})...`,
3141
);
3242

33-
let maybeRequest = npmPackageJsonCache.get(url);
43+
let maybeRequest = npmPackageJsonCache.get(fullUrl);
3444
if (!maybeRequest) {
3545
const subject = new ReplaySubject<NpmRepositoryPackageJson>(1);
3646

37-
const request = http.request(url, response => {
47+
const request = require(fullUrl.protocol.replace(/:$/, '')).request(fullUrl, response => {
3848
let data = '';
3949
response.on('data', chunk => data += chunk);
4050
response.on('end', () => {
@@ -51,7 +61,7 @@ export function getNpmPackageJson(
5161
request.end();
5262

5363
maybeRequest = subject.asObservable();
54-
npmPackageJsonCache.set(url, maybeRequest);
64+
npmPackageJsonCache.set(fullUrl, maybeRequest);
5565
}
5666

5767
return maybeRequest;

packages/schematics/update/update/schema.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,19 @@
4141
"to": {
4242
"description": "Version up to which to apply migrations. Only available with a single package being updated, and only on migrations only. Requires from to be specified. Default to the installed version detected.",
4343
"type": "string"
44+
},
45+
"registry": {
46+
"description": "The NPM registry to use. If you have an NPM proxy, you need to use this flag and set it to point to the proxy.",
47+
"type": "string",
48+
"oneOf": [
49+
{
50+
"format": "uri"
51+
},
52+
{
53+
"format": "hostname"
54+
}
55+
],
56+
"default": "http://registry.npmjs.org/"
4457
}
4558
}
4659
}

packages/schematics/update/update/schema.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ export interface UpdateSchema {
1313
migrateOnly: boolean;
1414
from?: string;
1515
to?: string;
16+
registry: string;
1617
}

0 commit comments

Comments
 (0)