Skip to content

Commit 575fd10

Browse files
authored
Use valid semvers internally (#436)
* Update test position after upgrading Prettier * Use valid semvers internally
1 parent e2ac9d3 commit 575fd10

File tree

20 files changed

+115
-270
lines changed

20 files changed

+115
-270
lines changed

packages/definitions-parser/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
"@definitelytyped/typescript-versions": "^0.0.112-next.9",
2424
"@definitelytyped/utils": "^0.0.112-next.9",
2525
"@types/node": "^14.14.35",
26-
"fs-extra": "^9.1.0"
26+
"fs-extra": "^9.1.0",
27+
"semver": "^7.3.7"
2728
},
2829
"devDependencies": {
2930
"@types/fs-extra": "^9.0.8"

packages/definitions-parser/src/check-parse-results.ts

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,19 @@ import { ParseDefinitionsOptions } from "./get-definitely-typed";
22
import { TypingsData, AllPackages, formatTypingVersion } from "./packages";
33
import {
44
assertDefined,
5-
best,
65
mapDefined,
76
nAtATime,
87
FS,
98
logger,
109
writeLog,
1110
Logger,
12-
Semver,
1311
UncachedNpmInfoClient,
1412
NpmInfoRawVersions,
1513
NpmInfoVersion,
14+
max,
15+
min,
1616
} from "@definitelytyped/utils";
17+
import * as semver from "semver";
1718

1819
export async function checkParseResults(
1920
includeNpmChecks: false,
@@ -132,21 +133,19 @@ async function checkNpm(
132133
}
133134

134135
const versions = getRegularVersions(info.versions);
135-
const firstTypedVersion = best(
136+
const firstTypedVersion = min(
136137
mapDefined(versions, ({ hasTypes, version }) => (hasTypes ? version : undefined)),
137-
(a, b) => b.greaterThan(a)
138+
semver.compare
138139
);
139140
// A package might have added types but removed them later, so check the latest version too
140-
if (firstTypedVersion === undefined || !best(versions, (a, b) => a.version.greaterThan(b.version))!.hasTypes) {
141+
if (firstTypedVersion === undefined || !max(versions, (a, b) => semver.compare(a.version, b.version))!.hasTypes) {
141142
return;
142143
}
143144

144145
const ourVersion = `${major}.${minor}`;
145146

146147
log("");
147-
log(
148-
`Typings already defined for ${name} (${libraryName}) as of ${firstTypedVersion.versionString} (our version: ${ourVersion})`
149-
);
148+
log(`Typings already defined for ${name} (${libraryName}) as of ${firstTypedVersion} (our version: ${ourVersion})`);
150149
const contributorUrls = contributors
151150
.map((c) => {
152151
const gh = "https://github.com/";
@@ -155,14 +154,14 @@ async function checkNpm(
155154
.join(", ");
156155
log(" To fix this:");
157156
log(` git checkout -b not-needed-${name}`);
158-
const yarnargs = [name, firstTypedVersion.versionString, projectName];
157+
const yarnargs = [name, firstTypedVersion, projectName];
159158
if (libraryName !== name) {
160159
yarnargs.push(JSON.stringify(libraryName));
161160
}
162161
log(" yarn not-needed " + yarnargs.join(" "));
163162
log(` git add --all && git commit -m "${name}: Provides its own types" && git push -u origin not-needed-${name}`);
164163
log(` And comment PR: This will deprecate \`@types/${name}\` in favor of just \`${name}\`. CC ${contributorUrls}`);
165-
if (new Semver(major, minor, 0).greaterThan(firstTypedVersion)) {
164+
if (semver.gt(`${major}.${minor}.0`, firstTypedVersion)) {
166165
log(" WARNING: our version is greater!");
167166
}
168167
if (dependedOn.has(name)) {
@@ -177,11 +176,11 @@ export async function packageHasTypes(packageName: string, client: UncachedNpmIn
177176

178177
function getRegularVersions(
179178
versions: NpmInfoRawVersions
180-
): readonly { readonly version: Semver; readonly hasTypes: boolean }[] {
181-
return mapDefined(Object.entries(versions), ([versionString, info]) => {
182-
const version = Semver.tryParse(versionString);
183-
return version === undefined ? undefined : { version, hasTypes: versionHasTypes(info) };
184-
});
179+
): readonly { readonly version: semver.SemVer; readonly hasTypes: boolean }[] {
180+
return Object.entries(versions).map(([versionString, info]) => ({
181+
version: new semver.SemVer(versionString),
182+
hasTypes: versionHasTypes(info),
183+
}));
185184
}
186185

187186
function versionHasTypes(info: NpmInfoVersion): boolean {

packages/definitions-parser/src/git.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ import {
1717
FS,
1818
consoleLogger,
1919
assertDefined,
20-
Semver,
2120
UncachedNpmInfoClient,
2221
NpmInfo,
2322
} from "@definitelytyped/utils";
23+
import * as semver from "semver";
2424
import { getAffectedPackages } from "./get-affected-packages";
2525

2626
export interface GitDiff {
@@ -145,20 +145,18 @@ export function checkNotNeededPackage(
145145
Unneeded packages have to be replaced with a package on npm.`
146146
);
147147
typings = assertDefined(typings, `Unexpected error: @types package not found for ${unneeded.fullNpmName}`);
148-
const latestTypings = Semver.parse(
149-
assertDefined(
150-
typings.distTags.get("latest"),
151-
`Unexpected error: ${unneeded.fullNpmName} is missing the "latest" tag.`
152-
)
148+
const latestTypings = assertDefined(
149+
typings.distTags.get("latest"),
150+
`Unexpected error: ${unneeded.fullNpmName} is missing the "latest" tag.`
153151
);
154152
assert(
155-
unneeded.version.greaterThan(latestTypings),
156-
`The specified version ${unneeded.version.versionString} of ${unneeded.libraryName} must be newer than the version
157-
it is supposed to replace, ${latestTypings.versionString} of ${unneeded.fullNpmName}.`
153+
semver.gt(unneeded.version, latestTypings),
154+
`The specified version ${unneeded.version} of ${unneeded.libraryName} must be newer than the version
155+
it is supposed to replace, ${latestTypings} of ${unneeded.fullNpmName}.`
158156
);
159157
assert(
160-
source.versions.has(unneeded.version.versionString),
161-
`The specified version ${unneeded.version.versionString} of ${unneeded.libraryName} is not on npm.`
158+
source.versions.has(String(unneeded.version)),
159+
`The specified version ${unneeded.version} of ${unneeded.libraryName} is not on npm.`
162160
);
163161
}
164162

packages/definitions-parser/src/mocks.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { parseHeaderOrFail } from "@definitelytyped/header-parser";
2-
import { Dir, FS, InMemoryFS, mangleScopedPackage, Semver } from "@definitelytyped/utils";
2+
import { Dir, FS, InMemoryFS, mangleScopedPackage } from "@definitelytyped/utils";
3+
import * as semver from "semver";
34

45
class DTMock {
56
public readonly fs: FS;
@@ -43,7 +44,7 @@ class DTMock {
4344
const index = latestDir.get("index.d.ts") as string;
4445
const latestHeader = parseHeaderOrFail(index);
4546
const latestVersion = `${latestHeader.libraryMajorVersion}.${latestHeader.libraryMinorVersion}`;
46-
const olderVersionParsed = Semver.parse(olderVersion, true)!;
47+
const olderVersionParsed = semver.coerce(olderVersion)!;
4748

4849
const oldDir = latestDir.subdir(`v${olderVersion}`);
4950
const tsconfig = JSON.parse(latestDir.get("tsconfig.json") as string);

packages/definitions-parser/src/packages.ts

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,8 @@
11
import assert = require("assert");
22
import { Author } from "@definitelytyped/header-parser";
3-
import {
4-
FS,
5-
mapValues,
6-
assertSorted,
7-
unmangleScopedPackage,
8-
Semver,
9-
assertDefined,
10-
unique,
11-
} from "@definitelytyped/utils";
3+
import { FS, mapValues, assertSorted, unmangleScopedPackage, assertDefined, unique } from "@definitelytyped/utils";
124
import { AllTypeScriptVersion, TypeScriptVersion } from "@definitelytyped/typescript-versions";
5+
import * as semver from "semver";
136
import { readDataFile } from "./data-file";
147
import { scopeName, typesDirectoryName } from "./lib/settings";
158
import { parseVersionFromDirectoryName } from "./lib/definition-parser";
@@ -261,7 +254,7 @@ interface NotNeededPackageRaw extends BaseRaw {
261254
}
262255

263256
export class NotNeededPackage extends PackageBase {
264-
readonly version: Semver;
257+
readonly version: semver.SemVer;
265258

266259
get license(): License.MIT {
267260
return License.MIT;
@@ -286,7 +279,7 @@ export class NotNeededPackage extends PackageBase {
286279
constructor(readonly name: string, readonly libraryName: string, asOfVersion: string) {
287280
super({ libraryName });
288281
assert(libraryName && name && asOfVersion);
289-
this.version = Semver.parse(asOfVersion);
282+
this.version = new semver.SemVer(asOfVersion);
290283
}
291284

292285
get major(): number {
@@ -496,22 +489,20 @@ export function getLicenseFromPackageJson(packageJsonLicense: unknown): License
496489
}
497490

498491
export class TypingsVersions {
499-
private readonly map: ReadonlyMap<Semver, TypingsData>;
492+
private readonly map: ReadonlyMap<semver.SemVer, TypingsData>;
500493

501494
/**
502495
* Sorted from latest to oldest.
503496
*/
504-
private readonly versions: Semver[];
497+
private readonly versions: semver.SemVer[];
505498

506499
constructor(data: TypingsVersionsRaw) {
507500
/**
508501
* Sorted from latest to oldest so that we publish the current version first.
509502
* This is important because older versions repeatedly reset the "latest" tag to the current version.
510503
*/
511-
this.versions = Object.keys(data)
512-
.map((key) => Semver.parse(key, true))
513-
.sort(Semver.compare)
514-
.reverse();
504+
this.versions = Object.keys(data).map((key) => new semver.SemVer(`${key}.0`));
505+
this.versions.sort(semver.rcompare);
515506

516507
this.map = new Map(
517508
this.versions.map((version, i) => [version, new TypingsData(data[`${version.major}.${version.minor}`], !i)])

packages/definitions-parser/test/packages.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ describe(NotNeededPackage, () => {
219219
expect(data.license).toBe(License.MIT);
220220
expect(data.name).toBe("types-package");
221221
expect(data.libraryName).toBe("real-package");
222-
expect(data.version).toEqual({
222+
expect(data.version).toMatchObject({
223223
major: 1,
224224
minor: 0,
225225
patch: 0,

packages/perf/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"@octokit/rest": "^16.33.0",
2222
"@types/node": "^12.12.29",
2323
"markdown-table": "^1.1.3",
24+
"semver": "^7.3.7",
2425
"typescript": "^4.1.0",
2526
"yargs": "^15.4.1"
2627
},

packages/perf/src/measure/measurePerf.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ import {
1616
MeasureBatchCompilationChildProcessResult,
1717
} from "./measureBatchCompilationWorker";
1818
import { AllPackages, HeaderParsedTypingVersion } from "@definitelytyped/definitions-parser";
19-
import { runWithListeningChildProcesses, runWithChildProcesses, Semver } from "@definitelytyped/utils";
19+
import { TypeScriptVersion } from "@definitelytyped/typescript-versions";
20+
import { runWithListeningChildProcesses, runWithChildProcesses } from "@definitelytyped/utils";
21+
import * as semver from "semver";
2022

2123
export interface MeasurePerfOptions {
2224
packageName: string;
@@ -253,14 +255,12 @@ export async function measurePerf({
253255
}
254256

255257
function getLatestTypesVersionForTypeScriptVersion(
256-
typesVersions: readonly string[],
258+
typesVersions: readonly TypeScriptVersion[],
257259
typeScriptVersion: string
258260
): string | undefined {
259-
const tsVersion = Semver.parse(typeScriptVersion.replace(/-dev.*$/, ""));
261+
const tsVersion = new semver.SemVer(typeScriptVersion);
260262
for (let i = typesVersions.length - 1; i > 0; i--) {
261-
const [major, minor] = typesVersions[i].split(".").map(Number); // e.g. '3.5'
262-
const typesVersion = new Semver(major, minor, 0);
263-
if (tsVersion.greaterThan(typesVersion)) {
263+
if (semver.gte(tsVersion, `${typesVersions[i]}.0-`)) {
264264
return typesVersions[i];
265265
}
266266
}

packages/publisher/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"hh-mm-ss": "^1.2.0",
2222
"longjohn": "^0.2.11",
2323
"oboe": "^2.1.3",
24+
"semver": "^7.3.7",
2425
"source-map-support": "^0.4.0",
2526
"typescript": "^4.1.0",
2627
"yargs": "15.3.1"

packages/publisher/src/generate-packages.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ function dependencySemver(dependency: DependencyVersion): string {
213213
export function createNotNeededPackageJSON({ libraryName, license, fullNpmName, version }: NotNeededPackage): string {
214214
const out = {
215215
name: fullNpmName,
216-
version: version.versionString,
216+
version: String(version),
217217
typings: null, // tslint:disable-line no-null-keyword
218218
description: `Stub TypeScript definitions entry for ${libraryName}, which provides its own types definitions`,
219219
main: "",

0 commit comments

Comments
 (0)