Skip to content
This repository was archived by the owner on Jun 11, 2020. It is now read-only.

Commit da36d0e

Browse files
committed
Allow using peer dependencies in a package json to indicate that a dependency doesn't have to be included for the package to pass - this is because styled-components infers react-native, but it doesn't need it to pass
1 parent ed18949 commit da36d0e

File tree

6 files changed

+41
-14
lines changed

6 files changed

+41
-14
lines changed

src/generate-packages.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
1-
import { emptyDir } from "fs-extra";
1+
import { emptyDir, mkdir, mkdirp, readFileSync } from "fs-extra";
22
import * as yargs from "yargs";
33

44
import { FS, getDefinitelyTyped } from "./get-definitely-typed";
55
import { Options } from "./lib/common";
66
import {
77
AllPackages, AnyPackage, DependencyVersion, getFullNpmName, License, NotNeededPackage, PackageJsonDependency, TypingsData,
88
} from "./lib/packages";
9-
import { sourceBranch, outputDirPath } from "./lib/settings";
9+
import { outputDirPath, sourceBranch } from "./lib/settings";
1010
import { ChangedPackages, readChangedPackages, skipBadPublishes } from "./lib/versions";
1111
import { writeFile } from "./util/io";
1212
import { logger, loggerWithErrors, writeLog, Logger } from "./util/logging";
1313
import { writeTgz } from "./util/tgz";
1414
import { assertNever, joinPaths, logUncaughtErrors, sortObjectKeys } from "./util/util";
1515
import { makeTypesVersionsForPackageJson } from "definitelytyped-header-parser";
16-
import { mkdir, mkdirp, readFileSync } from "fs-extra";
1716
import * as path from "path";
1817
import { withNpmCache, CachedNpmInfoClient, UncachedNpmInfoClient } from "./lib/npm-client";
1918

@@ -112,6 +111,7 @@ function createPackageJSON(typing: TypingsData, version: string, packages: AllPa
112111
},
113112
scripts: {},
114113
dependencies: getDependencies(typing.packageJsonDependencies, typing, packages),
114+
peerDependencies: getPeerDependencies(typing.peerDependencies),
115115
typesPublisherContentHash: typing.contentHash,
116116
typeScriptVersion: typing.minTypeScriptVersion,
117117
};
@@ -121,7 +121,7 @@ function createPackageJSON(typing: TypingsData, version: string, packages: AllPa
121121

122122
const definitelyTypedURL = "https://github.com/DefinitelyTyped/DefinitelyTyped";
123123

124-
/** Adds inferred dependencies to `dependencies`, if they are not already specified in either `dependencies` or `peerDependencies`. */
124+
/** Adds inferred dependencies to `dependencies`, if they are not already specified in either `dependencies`. */
125125
function getDependencies(packageJsonDependencies: ReadonlyArray<PackageJsonDependency>, typing: TypingsData, allPackages: AllPackages): Dependencies {
126126
const dependencies: Dependencies = {};
127127
for (const { name, version } of packageJsonDependencies) {
@@ -138,6 +138,15 @@ function getDependencies(packageJsonDependencies: ReadonlyArray<PackageJsonDepen
138138
return sortObjectKeys(dependencies);
139139
}
140140

141+
function getPeerDependencies(packageJsonDependencies: ReadonlyArray<PackageJsonDependency>): Dependencies {
142+
const dependencies: Dependencies = {};
143+
for (const { name, version } of packageJsonDependencies) {
144+
dependencies[name] = version;
145+
}
146+
147+
return sortObjectKeys(dependencies);
148+
}
149+
141150
function dependencySemver(dependency: DependencyVersion): string {
142151
return dependency === "*" ? dependency : `^${dependency}`;
143152
}
@@ -185,6 +194,8 @@ function createReadme(typing: TypingsData): string {
185194
lines.push(` * Last updated: ${(new Date()).toUTCString()}`);
186195
const dependencies = Array.from(typing.dependencies).map(d => getFullNpmName(d.name));
187196
lines.push(` * Dependencies: ${dependencies.length ? dependencies.join(", ") : "none"}`);
197+
const peerDependencies = Array.from(typing.peerDependencies).map(d => getFullNpmName(d.name));
198+
lines.push(` * Peer Dependencies: ${peerDependencies.length ? peerDependencies.join(", ") : "none"}`);
188199
lines.push(` * Global values: ${typing.globals.length ? typing.globals.join(", ") : "none"}`);
189200
lines.push("");
190201

src/lib/definition-parser-worker.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,3 @@ if (!module.parent) {
2222
});
2323
}
2424

25-

src/lib/definition-parser.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,21 @@ async function combineDataForAllTypesVersions(
9393
});
9494
const allTypesVersions = [dataForRoot, ...dataForOtherTypesVersions];
9595

96+
interface OptionalPackageJSON { readonly license?: unknown; readonly dependencies?: unknown; peerDependencies?: unknown; }
97+
9698
// tslint:disable-next-line await-promise (tslint bug)
97-
const packageJson = hasPackageJson ? await fs.readJson(packageJsonName) as { readonly license?: unknown, readonly dependencies?: unknown } : {};
99+
const packageJson = hasPackageJson ? await fs.readJson(packageJsonName) as OptionalPackageJSON : {};
98100
const license = getLicenseFromPackageJson(packageJson.license);
99-
const packageJsonDependencies = checkPackageJsonDependencies(packageJson.dependencies, packageJsonName);
101+
const packageJsonDependencies = checkPackageJsonDependencies(packageJson.dependencies, packageJsonName, /* checkWhitelist */ true);
102+
const packageJsonPeerDependencies = checkPackageJsonDependencies(packageJson.peerDependencies, packageJsonName, /* checkWhitelist */ false);
100103

101104
const files = Array.from(flatMap(allTypesVersions, ({ typescriptVersion, declFiles }) =>
102105
declFiles.map(file =>
103106
typescriptVersion === undefined ? file : `ts${typescriptVersion}/${file}`)));
104107

108+
// Get all package dependencies and remove any peer dependencies from them
109+
const dependencies = getAllUniqueValues<"dependencies", PackageId>(allTypesVersions, "dependencies")
110+
.filter(dep => !packageJsonPeerDependencies.find(peerDep => peerDep.name === dep.name));
105111
return {
106112
libraryName,
107113
typingsPackageName,
@@ -113,11 +119,12 @@ async function combineDataForAllTypesVersions(
113119
typesVersions,
114120
files,
115121
license,
122+
dependencies,
116123
// TODO: Explicit type arguments shouldn't be necessary. https://github.com/Microsoft/TypeScript/issues/27507
117-
dependencies: getAllUniqueValues<"dependencies", PackageId>(allTypesVersions, "dependencies"),
118124
testDependencies: getAllUniqueValues<"testDependencies", string>(allTypesVersions, "testDependencies"),
119125
pathMappings: getAllUniqueValues<"pathMappings", PathMapping>(allTypesVersions, "pathMappings"),
120126
packageJsonDependencies,
127+
packageJsonPeerDependencies,
121128
contentHash: await hash(hasPackageJson ? [...files, packageJsonName] : files, mapDefined(allTypesVersions, a => a.tsconfigPathsForHash), fs),
122129
globals: getAllUniqueValues<"globals", string>(allTypesVersions, "globals"),
123130
declaredModules: getAllUniqueValues<"declaredModules", string>(allTypesVersions, "declaredModules"),
@@ -179,7 +186,7 @@ async function getTypingDataForSingleTypesVersion(
179186
return { typescriptVersion, dependencies, testDependencies, pathMappings, globals, declaredModules, declFiles, tsconfigPathsForHash };
180187
}
181188

182-
function checkPackageJsonDependencies(dependencies: unknown, path: string): ReadonlyArray<PackageJsonDependency> {
189+
function checkPackageJsonDependencies(dependencies: unknown, path: string, checkWhitelist: boolean): ReadonlyArray<PackageJsonDependency> {
183190
if (dependencies === undefined) { // tslint:disable-line strict-type-predicates (false positive)
184191
return [];
185192
}
@@ -190,7 +197,7 @@ function checkPackageJsonDependencies(dependencies: unknown, path: string): Read
190197
const deps: PackageJsonDependency[] = [];
191198

192199
for (const dependencyName in dependencies) {
193-
if (!dependenciesWhitelist.has(dependencyName)) {
200+
if (checkWhitelist && !dependenciesWhitelist.has(dependencyName)) {
194201
const msg = dependencyName.startsWith("@types/")
195202
? `Don't use a 'package.json' for @types dependencies unless this package relies on
196203
an old version of types that have since been moved to the source repo.

src/lib/packages.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ export class AllPackages {
112112
return this.notNeeded;
113113
}
114114

115-
/** Returns all of the dependences *that have typings*, ignoring others, and including test dependencies. */
115+
/** Returns all of the dependencies *that have typings*, ignoring others, and including test dependencies. */
116116
*allDependencyTypings(pkg: TypingsData): Iterable<TypingsData> {
117117
for (const { name, majorVersion } of pkg.dependencies) {
118118
const versions = this.data.get(getMangledNameForScopedPackage(name));
@@ -308,8 +308,13 @@ export interface TypingsDataRaw extends BaseRaw {
308308

309309
// Whether a "package.json" exists
310310
readonly license: License;
311+
312+
// List of dependencies which indicate they should come from npm, not def typed
311313
readonly packageJsonDependencies: ReadonlyArray<PackageJsonDependency>;
312314

315+
// These should be removed from the packageJsonDependencies above
316+
readonly packageJsonPeerDependencies: ReadonlyArray<PackageJsonDependency>;
317+
313318
// A hash computed from all files from this definition
314319
readonly contentHash: string;
315320

@@ -419,6 +424,10 @@ export class TypingsData extends PackageBase {
419424
return this.data.dependencies;
420425
}
421426

427+
get peerDependencies(): ReadonlyArray<PackageJsonDependency> {
428+
return this.data.packageJsonPeerDependencies;
429+
}
430+
422431
/** Path to this package, *relative* to the DefinitelyTyped directory. */
423432
get subDirectoryPath(): string {
424433
return this.isLatest ? this.name : `${this.name}/v${this.data.libraryMajorVersion}`;

src/tester/get-affected-packages.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,10 @@ function transitiveClosure<T>(initialItems: Iterable<T>, getRelatedItems: (item:
6262

6363
/** Generate a map from a package to packages that depend on it. */
6464
function getReverseDependencies(allPackages: AllPackages, changedPackages: PackageId[]): Map<PackageId, Set<PackageId>> {
65-
const map = new Map<string, [PackageId, Set<PackageId>]>();
66-
for (const changed of changedPackages) {
65+
const map = new Map<string, [PackageId, Set<PackageId>]>();
66+
for (const changed of changedPackages) {
6767
map.set(packageIdToKey(changed), [changed, new Set()]);
68-
}
68+
}
6969
for (const typing of allPackages.allTypings()) {
7070
if (!map.has(packageIdToKey(typing.id))) {
7171
map.set(packageIdToKey(typing.id), [typing.id, new Set()]);

src/util/test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export function createTypingsVersionRaw(
2323
typesVersions: [],
2424
license: License.MIT,
2525
packageJsonDependencies: [],
26+
packageJsonPeerDependencies: [],
2627
contentHash: "11111111111111",
2728
projectName: "zombo.com",
2829
globals: [],

0 commit comments

Comments
 (0)