Skip to content

Commit 8d48293

Browse files
hanslfilipesilva
authored andcommitted
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 0a70464 commit 8d48293

File tree

4 files changed

+33
-6
lines changed

4 files changed

+33
-6
lines changed

packages/schematics/update/update/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,7 @@ export default function(options: UpdateSchema): Rule {
652652
return observableFrom([...allDependencies.keys()]).pipe(
653653
// Grab all package.json from the npm repository. This requires a lot of HTTP calls so we
654654
// try to parallelize as many as possible.
655-
mergeMap(depName => getNpmPackageJson(depName, logger)),
655+
mergeMap(depName => getNpmPackageJson(depName, options.registry, logger)),
656656

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

packages/schematics/update/update/npm.ts

+18-5
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
*/
88
import { logging } from '@angular-devkit/core';
99
import * as http from 'http';
10+
import * as https from 'https';
1011
import { Observable, ReplaySubject } from 'rxjs';
12+
import * as url from 'url';
1113
import { NpmRepositoryPackageJson } from './npm-package-json';
1214

1315

@@ -17,24 +19,35 @@ const npmPackageJsonCache = new Map<string, Observable<NpmRepositoryPackageJson>
1719
/**
1820
* Get the NPM repository's package.json for a package. This is p
1921
* @param {string} packageName The package name to fetch.
22+
* @param {string} registryUrl The NPM Registry URL to use.
2023
* @param {LoggerApi} logger A logger instance to log debug information.
2124
* @returns An observable that will put the pacakge.json content.
2225
* @private
2326
*/
2427
export function getNpmPackageJson(
2528
packageName: string,
29+
registryUrl: string,
2630
logger: logging.LoggerApi,
2731
): Observable<NpmRepositoryPackageJson> {
28-
const url = `http://registry.npmjs.org/${packageName.replace(/\//g, '%2F')}`;
32+
let fullUrl = new url.URL(`http://${registryUrl}/${packageName.replace(/\//g, '%2F')}`);
33+
try {
34+
const registry = new url.URL(registryUrl);
35+
registry.pathname = (registry.pathname || '')
36+
.replace(/\/?$/, '/' + packageName.replace(/\//g, '%2F'));
37+
fullUrl = new url.URL(url.format(registry));
38+
} catch (_) {
39+
}
40+
2941
logger.debug(
30-
`Getting package.json from ${JSON.stringify(packageName)} (url: ${JSON.stringify(url)})...`,
42+
`Getting package.json from ${JSON.stringify(packageName)} (url: ${JSON.stringify(fullUrl)})...`,
3143
);
3244

33-
let maybeRequest = npmPackageJsonCache.get(url);
45+
let maybeRequest = npmPackageJsonCache.get(fullUrl.toString());
3446
if (!maybeRequest) {
3547
const subject = new ReplaySubject<NpmRepositoryPackageJson>(1);
3648

37-
const request = http.request(url, response => {
49+
const protocolPackage = (fullUrl.protocol == 'https' ? https : http) as typeof http;
50+
const request = protocolPackage.request(fullUrl, response => {
3851
let data = '';
3952
response.on('data', chunk => data += chunk);
4053
response.on('end', () => {
@@ -51,7 +64,7 @@ export function getNpmPackageJson(
5164
request.end();
5265

5366
maybeRequest = subject.asObservable();
54-
npmPackageJsonCache.set(url, maybeRequest);
67+
npmPackageJsonCache.set(fullUrl.toString(), maybeRequest);
5568
}
5669

5770
return maybeRequest;

packages/schematics/update/update/schema.json

+13
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

+1
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)