Skip to content

Commit b07a19b

Browse files
greysteilarcanis
authored andcommitted
Ensure malformedRegistryResponse errors always have a dependency name (#6455)
1 parent 49a157c commit b07a19b

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

__tests__/registries/npm-registry.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -866,4 +866,23 @@ describe('checkOutdated functional test', () => {
866866

867867
expect(message).toEqual(expect.stringContaining('No valid versions'));
868868
});
869+
870+
test('package with an empty response', async () => {
871+
const testCwd = '.';
872+
const {mockRequestManager, mockRegistries, mockReporter} = createMocks();
873+
const npmRegistry = new NpmRegistry(testCwd, mockRegistries, mockRequestManager, mockReporter, true, []);
874+
875+
mockRequestManager.request = () => {
876+
return {};
877+
};
878+
879+
let message;
880+
try {
881+
await npmRegistry.checkOutdated(mockConfig, 'left-pad', '2.0.0');
882+
} catch (err) {
883+
message = err.message;
884+
}
885+
886+
expect(message).toEqual(expect.stringContaining('malformed response from registry for "left-pad"'));
887+
});
869888
});

src/registries/npm-registry.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,14 +190,15 @@ export default class NpmRegistry extends Registry {
190190
}
191191

192192
async checkOutdated(config: Config, name: string, range: string): CheckOutdatedReturn {
193-
const req = await this.request(NpmRegistry.escapeName(name), {unfiltered: true});
193+
const escapedName = NpmRegistry.escapeName(name);
194+
const req = await this.request(escapedName, {unfiltered: true});
194195
if (!req) {
195196
throw new Error('couldnt find ' + name);
196197
}
197198

198199
// By default use top level 'repository' and 'homepage' values
199200
let {repository, homepage} = req;
200-
const wantedPkg = await NpmResolver.findVersionInRegistryResponse(config, range, req);
201+
const wantedPkg = await NpmResolver.findVersionInRegistryResponse(config, escapedName, range, req);
201202

202203
// But some local repositories like Verdaccio do not return 'repository' nor 'homepage'
203204
// in top level data structure, so we fallback to wanted package manifest

src/resolvers/registries/npm-resolver.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export default class NpmResolver extends RegistryResolver {
3131

3232
static async findVersionInRegistryResponse(
3333
config: Config,
34+
name: string,
3435
range: string,
3536
body: RegistryResponse,
3637
request: ?PackageRequest,
@@ -40,7 +41,7 @@ export default class NpmResolver extends RegistryResolver {
4041
}
4142

4243
if (!body['dist-tags'] || !body.versions) {
43-
throw new MessageError(config.reporter.lang('malformedRegistryResponse', body.name));
44+
throw new MessageError(config.reporter.lang('malformedRegistryResponse', name));
4445
}
4546

4647
if (range in body['dist-tags']) {
@@ -91,10 +92,12 @@ export default class NpmResolver extends RegistryResolver {
9192
}
9293
}
9394

94-
const body = await this.config.registries.npm.request(NpmRegistry.escapeName(this.name));
95+
const escapedName = NpmRegistry.escapeName(this.name);
96+
const desiredRange = desiredVersion || this.range;
97+
const body = await this.config.registries.npm.request(escapedName);
9598

9699
if (body) {
97-
return NpmResolver.findVersionInRegistryResponse(this.config, desiredVersion || this.range, body, this.request);
100+
return NpmResolver.findVersionInRegistryResponse(this.config, escapedName, desiredRange, body, this.request);
98101
} else {
99102
return null;
100103
}

0 commit comments

Comments
 (0)