Skip to content

Commit 6b9507a

Browse files
filipesilvavikerman
authored andcommitted
fix(@schematics/update): handle peerDependenciesMeta
1 parent 2fc322f commit 6b9507a

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

packages/schematics/update/update/index.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,18 +113,22 @@ function _validateForwardPeerDependencies(
113113
name: string,
114114
infoMap: Map<string, PackageInfo>,
115115
peers: {[name: string]: string},
116+
peersMeta: { [name: string]: { optional?: boolean }},
116117
logger: logging.LoggerApi,
117118
next: boolean,
118119
): boolean {
119120
let validationFailed = false;
120121
for (const [peer, range] of Object.entries(peers)) {
121122
logger.debug(`Checking forward peer ${peer}...`);
122123
const maybePeerInfo = infoMap.get(peer);
124+
const isOptional = peersMeta[peer] && !!peersMeta[peer].optional;
123125
if (!maybePeerInfo) {
124-
logger.warn([
125-
`Package ${JSON.stringify(name)} has a missing peer dependency of`,
126-
`${JSON.stringify(peer)} @ ${JSON.stringify(range)}.`,
127-
].join(' '));
126+
if (!isOptional) {
127+
logger.warn([
128+
`Package ${JSON.stringify(name)} has a missing peer dependency of`,
129+
`${JSON.stringify(peer)} @ ${JSON.stringify(range)}.`,
130+
].join(' '));
131+
}
128132

129133
continue;
130134
}
@@ -211,8 +215,9 @@ function _validateUpdatePackages(
211215
const pkgLogger = logger.createChild(name);
212216
logger.debug(`${name}...`);
213217

214-
const peers = target.packageJson.peerDependencies || {};
215-
peerErrors = _validateForwardPeerDependencies(name, infoMap, peers, pkgLogger, next) || peerErrors;
218+
const { peerDependencies = {}, peerDependenciesMeta = {} } = target.packageJson;
219+
peerErrors = _validateForwardPeerDependencies(name, infoMap, peerDependencies,
220+
peerDependenciesMeta, pkgLogger, next) || peerErrors;
216221
peerErrors
217222
= _validateReversePeerDependencies(name, target.version, infoMap, pkgLogger, next)
218223
|| peerErrors;

packages/schematics/update/update/index_spec.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,4 +362,37 @@ describe('@schematics/update', () => {
362362
}),
363363
).toPromise().then(done, done.fail);
364364
}, 45000);
365+
366+
it('validates peer dependencies', done => {
367+
const content = virtualFs.fileBufferToString(host.sync.read(normalize('/package.json')));
368+
const packageJson = JSON.parse(content);
369+
const dependencies = packageJson['dependencies'];
370+
// TODO: when we start using a local npm registry for test packages, add a package that includes
371+
// a optional peer dependency and a non-optional one for this test. Use it instead of
372+
// @angular-devkit/build-angular, whose optional peerdep is @angular/localize and non-optional
373+
// are typescript and @angular/compiler-cli.
374+
dependencies['@angular-devkit/build-angular'] = '0.900.0-next.1';
375+
host.sync.write(
376+
normalize('/package.json'),
377+
virtualFs.stringToFileBuffer(JSON.stringify(packageJson)),
378+
);
379+
380+
const messages: string[] = [];
381+
schematicRunner.logger.subscribe(x => messages.push(x.message));
382+
const hasPeerdepMsg = (dep: string) =>
383+
messages.some(str => str.includes(`missing peer dependency of "${dep}"`));
384+
385+
schematicRunner.runSchematicAsync('update', {
386+
packages: ['@angular-devkit/build-angular'],
387+
next: true,
388+
}, appTree).pipe(
389+
map(() => {
390+
expect(hasPeerdepMsg('@angular/compiler-cli'))
391+
.toBeTruthy(`Should show @angular/compiler-cli message.`);
392+
expect(hasPeerdepMsg('typescript')).toBeTruthy(`Should show typescript message.`);
393+
expect(hasPeerdepMsg('@angular/localize'))
394+
.toBeFalsy(`Should not show @angular/localize message.`);
395+
}),
396+
).toPromise().then(done, done.fail);
397+
}, 45000);
365398
});

0 commit comments

Comments
 (0)