Skip to content

Commit b7dd694

Browse files
committed
Use pacote
1 parent 1954ce8 commit b7dd694

File tree

20 files changed

+705
-525
lines changed

20 files changed

+705
-525
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@
2828
"ts-jest": "^25.2.1",
2929
"tslint": "^6.1.2",
3030
"tslint-microsoft-contrib": "^6.2.0",
31-
"typescript": "^4.5.5"
31+
"typescript": "^4.6.4"
3232
}
3333
}

packages/definitions-parser/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@
2424
"@definitelytyped/utils": "^0.0.113-next.7",
2525
"@types/node": "^14.14.35",
2626
"fs-extra": "^9.1.0",
27+
"pacote": "^13.3.0",
2728
"semver": "^7.3.7"
2829
},
2930
"devDependencies": {
30-
"@types/fs-extra": "^9.0.8"
31+
"@types/fs-extra": "^9.0.8",
32+
"@types/pacote": "^11.1.3"
3133
},
3234
"peerDependencies": {
3335
"typescript": "*"

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

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,13 @@
11
import { ParseDefinitionsOptions } from "./get-definitely-typed";
22
import { TypingsData, AllPackages, formatTypingVersion } from "./packages";
3-
import {
4-
assertDefined,
5-
mapDefined,
6-
nAtATime,
7-
FS,
8-
logger,
9-
writeLog,
10-
Logger,
11-
UncachedNpmInfoClient,
12-
NpmInfoRawVersions,
13-
NpmInfoVersion,
14-
max,
15-
min,
16-
} from "@definitelytyped/utils";
3+
import { mapDefined, nAtATime, FS, logger, writeLog, Logger, defaultCacheDir, max, min } from "@definitelytyped/utils";
4+
import * as pacote from "pacote";
175
import * as semver from "semver";
186

19-
export async function checkParseResults(
20-
includeNpmChecks: false,
21-
dt: FS,
22-
options: ParseDefinitionsOptions
23-
): Promise<void>;
24-
export async function checkParseResults(
25-
includeNpmChecks: true,
26-
dt: FS,
27-
options: ParseDefinitionsOptions,
28-
client: UncachedNpmInfoClient
29-
): Promise<void>;
307
export async function checkParseResults(
318
includeNpmChecks: boolean,
329
dt: FS,
33-
options: ParseDefinitionsOptions,
34-
client?: UncachedNpmInfoClient
10+
options: ParseDefinitionsOptions
3511
): Promise<void> {
3612
const allPackages = await AllPackages.read(dt);
3713
const [log, logResult] = logger();
@@ -57,7 +33,7 @@ export async function checkParseResults(
5733
await nAtATime(
5834
10,
5935
allPackages.allTypings(),
60-
(pkg) => checkNpm(pkg, log, dependedOn, client!),
36+
(pkg) => checkNpm(pkg, log, dependedOn),
6137
options.progress
6238
? {
6339
name: "Checking for typed packages...",
@@ -120,14 +96,15 @@ Check the path mappings for [${Array.from(allPackages.allDependencyTypings(pkg))
12096
async function checkNpm(
12197
{ major, minor, name, libraryName, projectName, contributors }: TypingsData,
12298
log: Logger,
123-
dependedOn: ReadonlySet<string>,
124-
client: UncachedNpmInfoClient
99+
dependedOn: ReadonlySet<string>
125100
): Promise<void> {
126101
if (notNeededExceptions.has(name)) {
127102
return;
128103
}
129104

130-
const info = await client.fetchRawNpmInfo(name); // Gets info for the real package, not the @types package
105+
const info = await pacote.packument(name, { cache: defaultCacheDir, fullMetadata: true }).catch((cause) => {
106+
if (cause.code !== "E404") throw cause;
107+
}); // Gets info for the real package, not the @types package
131108
if (!info) {
132109
return;
133110
}
@@ -169,21 +146,20 @@ async function checkNpm(
169146
}
170147
}
171148

172-
export async function packageHasTypes(packageName: string, client: UncachedNpmInfoClient): Promise<boolean> {
173-
const info = assertDefined(await client.fetchRawNpmInfo(packageName));
174-
return versionHasTypes(info.versions[info["dist-tags"].latest]);
149+
export async function packageHasTypes(packageName: string): Promise<boolean> {
150+
return versionHasTypes(await pacote.manifest(packageName, { cache: defaultCacheDir, fullMetadata: true }));
175151
}
176152

177153
function getRegularVersions(
178-
versions: NpmInfoRawVersions
154+
versions: pacote.Packument["versions"]
179155
): readonly { readonly version: semver.SemVer; readonly hasTypes: boolean }[] {
180156
return Object.entries(versions).map(([versionString, info]) => ({
181157
version: new semver.SemVer(versionString),
182158
hasTypes: versionHasTypes(info),
183159
}));
184160
}
185161

186-
function versionHasTypes(info: NpmInfoVersion): boolean {
162+
function versionHasTypes(info: pacote.Manifest): boolean {
187163
return "types" in info || "typings" in info;
188164
}
189165

packages/definitions-parser/src/git.ts

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ import {
1717
FS,
1818
consoleLogger,
1919
assertDefined,
20-
UncachedNpmInfoClient,
21-
NpmInfo,
20+
defaultCacheDir,
2221
} from "@definitelytyped/utils";
22+
import * as pacote from "pacote";
2323
import * as semver from "semver";
2424
import { getAffectedPackages } from "./get-affected-packages";
2525

@@ -96,11 +96,8 @@ export async function getAffectedPackagesFromDiff(
9696
const allPackages = await AllPackages.read(dt);
9797
const diffs = await gitDiff(consoleLogger.info, definitelyTypedPath);
9898
if (diffs.find((d) => d.file === "notNeededPackages.json")) {
99-
const uncached = new UncachedNpmInfoClient();
10099
for (const deleted of getNotNeededPackages(allPackages, diffs)) {
101-
const source = await uncached.fetchNpmInfo(deleted.libraryName); // eg @babel/parser
102-
const typings = await uncached.fetchNpmInfo(deleted.fullNpmName); // eg @types/babel__parser
103-
checkNotNeededPackage(deleted, source, typings);
100+
checkNotNeededPackage(deleted);
104101
}
105102
}
106103

@@ -133,30 +130,28 @@ export async function getAffectedPackagesFromDiff(
133130
* 2. asOfVersion must be newer than `@types/name@latest` on npm
134131
* 3. `name@asOfVersion` must exist on npm
135132
*/
136-
export function checkNotNeededPackage(
137-
unneeded: NotNeededPackage,
138-
source: NpmInfo | undefined,
139-
typings: NpmInfo | undefined
140-
) {
141-
source = assertDefined(
142-
source,
143-
`The entry for ${unneeded.fullNpmName} in notNeededPackages.json has
133+
export async function checkNotNeededPackage(unneeded: NotNeededPackage) {
134+
await pacote.manifest(`${unneeded.libraryName}@${unneeded.version}`, { cache: defaultCacheDir }).catch((cause) => {
135+
throw cause.code === "E404"
136+
? new Error(
137+
`The entry for ${unneeded.fullNpmName} in notNeededPackages.json has
144138
"libraryName": "${unneeded.libraryName}", but there is no npm package with this name.
145-
Unneeded packages have to be replaced with a package on npm.`
146-
);
147-
typings = assertDefined(typings, `Unexpected error: @types package not found for ${unneeded.fullNpmName}`);
148-
const latestTypings = assertDefined(
149-
typings.distTags.get("latest"),
150-
`Unexpected error: ${unneeded.fullNpmName} is missing the "latest" tag.`
151-
);
139+
Unneeded packages have to be replaced with a package on npm.`,
140+
{ cause }
141+
)
142+
: cause.code === "ETARGET"
143+
? new Error(`The specified version ${unneeded.version} of ${unneeded.libraryName} is not on npm.`, { cause })
144+
: cause;
145+
}); // eg @babel/parser
146+
const typings = await pacote.manifest(unneeded.fullNpmName, { cache: defaultCacheDir }).catch((cause) => {
147+
throw cause.code === "E404"
148+
? new Error(`Unexpected error: @types package not found for ${unneeded.fullNpmName}`, { cause })
149+
: cause;
150+
}); // eg @types/babel__parser
152151
assert(
153-
semver.gt(unneeded.version, latestTypings),
152+
semver.gt(unneeded.version, typings.version),
154153
`The specified version ${unneeded.version} of ${unneeded.libraryName} must be newer than the version
155-
it is supposed to replace, ${latestTypings} of ${unneeded.fullNpmName}.`
156-
);
157-
assert(
158-
source.versions.has(String(unneeded.version)),
159-
`The specified version ${unneeded.version} of ${unneeded.libraryName} is not on npm.`
154+
it is supposed to replace, ${typings.version} of ${unneeded.fullNpmName}.`
160155
);
161156
}
162157

Lines changed: 43 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { NpmInfo } from "@definitelytyped/utils";
1+
import * as util from "util";
22
import { createTypingsVersionRaw, testo } from "./utils";
33
import { GitDiff, getNotNeededPackages, checkNotNeededPackage } from "../src/git";
44
import { NotNeededPackage, TypesDataFile, AllPackages } from "../src/packages";
@@ -65,94 +65,62 @@ testo({
6565
// TODO: Test with dependents, etc etc
6666
});
6767

68-
const empty: NpmInfo = {
69-
homepage: "",
70-
distTags: new Map(),
71-
versions: new Map(),
72-
time: new Map(),
73-
};
68+
jest.mock("pacote", () => ({
69+
async manifest(spec: string) {
70+
switch (spec) {
71+
case "[email protected]": // Older than the @types/jest package.
72+
case "[email protected]": // The same version as the @types/jest package.
73+
case "[email protected]": // Newer than the @types/jest package.
74+
// These versions exist (don't throw).
75+
return;
76+
case "[email protected]": // A nonexistent version of the replacement package.
77+
// eslint-disable-next-line no-throw-literal
78+
throw { code: "ETARGET" };
79+
case "@types/jest": // The @types/jest package.
80+
return { version: "50.0.0" };
81+
case "[email protected]": // A nonexistent replacement package.
82+
case "@types/nonexistent": // A nonexistent @types package.
83+
// eslint-disable-next-line no-throw-literal
84+
throw { code: "E404" };
85+
}
86+
throw new Error(`Unexpected npm registry fetch: ${util.inspect(spec)}`);
87+
},
88+
}));
89+
90+
const newerReplacement = new NotNeededPackage("jest", "jest", "100.0.0");
91+
const olderReplacement = new NotNeededPackage("jest", "jest", "4.0.0");
92+
const sameVersion = new NotNeededPackage("jest", "jest", "50.0.0");
93+
const nonexistentReplacementVersion = new NotNeededPackage("jest", "jest", "999.0.0");
94+
const nonexistentReplacementPackage = new NotNeededPackage("jest", "nonexistent", "100.0.0");
95+
const nonexistentTypesPackage = new NotNeededPackage("nonexistent", "jest", "100.0.0");
96+
7497
testo({
7598
missingSource() {
76-
expect(() => checkNotNeededPackage(jestNotNeeded[0], undefined, empty)).toThrow(
99+
return expect(checkNotNeededPackage(nonexistentReplacementPackage)).rejects.toThrow(
77100
"The entry for @types/jest in notNeededPackages.json"
78101
);
79102
},
80103
missingTypings() {
81-
expect(() => checkNotNeededPackage(jestNotNeeded[0], empty, undefined)).toThrow(
82-
"@types package not found for @types/jest"
83-
);
84-
},
85-
missingTypingsLatest() {
86-
expect(() => checkNotNeededPackage(jestNotNeeded[0], empty, empty)).toThrow(
87-
'@types/jest is missing the "latest" tag'
104+
return expect(checkNotNeededPackage(nonexistentTypesPackage)).rejects.toThrow(
105+
"@types package not found for @types/nonexistent"
88106
);
89107
},
90108
deprecatedSameVersion() {
91-
expect(() => {
92-
checkNotNeededPackage(jestNotNeeded[0], empty, {
93-
homepage: "jest.com",
94-
distTags: new Map([["latest", "100.0.0"]]),
95-
versions: new Map(),
96-
time: new Map([["modified", ""]]),
97-
});
98-
}).toThrow(`The specified version 100.0.0 of jest must be newer than the version
99-
it is supposed to replace, 100.0.0 of @types/jest.`);
109+
return expect(checkNotNeededPackage(sameVersion)).rejects
110+
.toThrow(`The specified version 50.0.0 of jest must be newer than the version
111+
it is supposed to replace, 50.0.0 of @types/jest.`);
100112
},
101113
deprecatedOlderVersion() {
102-
expect(() => {
103-
checkNotNeededPackage(jestNotNeeded[0], empty, {
104-
homepage: "jest.com",
105-
distTags: new Map([["latest", "999.0.0"]]),
106-
versions: new Map(),
107-
time: new Map([["modified", ""]]),
108-
});
109-
}).toThrow(`The specified version 100.0.0 of jest must be newer than the version
110-
it is supposed to replace, 999.0.0 of @types/jest.`);
114+
return expect(checkNotNeededPackage(olderReplacement)).rejects
115+
.toThrow(`The specified version 4.0.0 of jest must be newer than the version
116+
it is supposed to replace, 50.0.0 of @types/jest.`);
111117
},
112118
missingNpmVersion() {
113-
expect(() => {
114-
checkNotNeededPackage(jestNotNeeded[0], empty, {
115-
homepage: "jest.com",
116-
distTags: new Map([["latest", "4.0.0"]]),
117-
versions: new Map(),
118-
time: new Map([["modified", ""]]),
119-
});
120-
}).toThrow("The specified version 100.0.0 of jest is not on npm.");
121-
},
122-
olderNpmVersion() {
123-
expect(() =>
124-
checkNotNeededPackage(
125-
jestNotNeeded[0],
126-
{
127-
homepage: "jest.com",
128-
distTags: new Map(),
129-
versions: new Map([["50.0.0", {}]]),
130-
time: new Map([["modified", ""]]),
131-
},
132-
{
133-
homepage: "jest.com",
134-
distTags: new Map([["latest", "4.0.0"]]),
135-
versions: new Map(),
136-
time: new Map([["modified", ""]]),
137-
}
138-
)
139-
).toThrow("The specified version 100.0.0 of jest is not on npm.");
119+
return expect(checkNotNeededPackage(nonexistentReplacementVersion)).rejects.toThrow(
120+
"The specified version 999.0.0 of jest is not on npm."
121+
);
140122
},
141123
ok() {
142-
checkNotNeededPackage(
143-
jestNotNeeded[0],
144-
{
145-
homepage: "jest.com",
146-
distTags: new Map(),
147-
versions: new Map([["100.0.0", {}]]),
148-
time: new Map([["modified", ""]]),
149-
},
150-
{
151-
homepage: "jest.com",
152-
distTags: new Map([["latest", "4.0.0"]]),
153-
versions: new Map(),
154-
time: new Map([["modified", ""]]),
155-
}
156-
);
124+
return checkNotNeededPackage(newerReplacement);
157125
},
158126
});

packages/perf/src/measure/measurePerf.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ function getLatestTypesVersionForTypeScriptVersion(
260260
): string | undefined {
261261
const tsVersion = new semver.SemVer(typeScriptVersion);
262262
for (let i = typesVersions.length - 1; i > 0; i--) {
263-
if (semver.gte(tsVersion, `${typesVersions[i]}.0-`)) {
263+
if (semver.gte(tsVersion, `${typesVersions[i]}.0-0`)) {
264264
return typesVersions[i];
265265
}
266266
}

packages/publisher/package.json

Lines changed: 2 additions & 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+
"pacote": "^13.3.0",
2425
"semver": "^7.3.7",
2526
"source-map-support": "^0.4.0",
2627
"typescript": "^4.1.0",
@@ -31,6 +32,7 @@
3132
"@types/hh-mm-ss": "^1.2.1",
3233
"@types/mz": "^0.0.31",
3334
"@types/oboe": "^2.0.28",
35+
"@types/pacote": "^11.1.3",
3436
"@types/source-map-support": "^0.4.0",
3537
"@types/yargs": "^15.0.4"
3638
},

0 commit comments

Comments
 (0)