Skip to content

Commit a19278f

Browse files
committed
Use pacote
1 parent 0c0b39d commit a19278f

21 files changed

+719
-544
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.17",
2525
"@types/node": "^14.14.35",
2626
"fs-extra": "^9.1.0",
27+
"pacote": "^13.6.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.4"
3133
},
3234
"peerDependencies": {
3335
"typescript": "*"

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

Lines changed: 13 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,16 @@ 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((reason) => {
106+
if (reason.code !== "E404") throw reason;
107+
return undefined;
108+
}); // Gets info for the real package, not the @types package
131109
if (!info) {
132110
return;
133111
}
@@ -169,21 +147,20 @@ async function checkNpm(
169147
}
170148
}
171149

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]);
150+
export async function packageHasTypes(packageName: string): Promise<boolean> {
151+
return versionHasTypes(await pacote.manifest(packageName, { cache: defaultCacheDir, fullMetadata: true }));
175152
}
176153

177154
function getRegularVersions(
178-
versions: NpmInfoRawVersions
155+
versions: pacote.Packument["versions"]
179156
): readonly { readonly version: semver.SemVer; readonly hasTypes: boolean }[] {
180157
return Object.entries(versions).map(([versionString, info]) => ({
181158
version: new semver.SemVer(versionString),
182159
hasTypes: versionHasTypes(info),
183160
}));
184161
}
185162

186-
function versionHasTypes(info: NpmInfoVersion): boolean {
163+
function versionHasTypes(info: pacote.Manifest): boolean {
187164
return "types" in info || "typings" in info;
188165
}
189166

packages/definitions-parser/src/git.ts

Lines changed: 24 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,30 @@ 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((reason) => {
135+
throw reason.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: reason }
141+
)
142+
: reason.code === "ETARGET"
143+
? new Error(`The specified version ${unneeded.version} of ${unneeded.libraryName} is not on npm.`, {
144+
cause: reason,
145+
})
146+
: reason;
147+
}); // eg @babel/parser
148+
const typings = await pacote.manifest(unneeded.fullNpmName, { cache: defaultCacheDir }).catch((reason) => {
149+
throw reason.code === "E404"
150+
? new Error(`Unexpected error: @types package not found for ${unneeded.fullNpmName}`, { cause: reason })
151+
: reason;
152+
}); // eg @types/babel__parser
152153
assert(
153-
semver.gt(unneeded.version, latestTypings),
154+
semver.gt(unneeded.version, typings.version),
154155
`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.`
156+
it is supposed to replace, ${typings.version} of ${unneeded.fullNpmName}.`
160157
);
161158
}
162159

Lines changed: 44 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { NpmInfo } from "@definitelytyped/utils";
1+
import * as util from "util";
2+
import * as pacote from "pacote";
23
import { createTypingsVersionRaw, testo } from "./utils";
34
import { GitDiff, getNotNeededPackages, checkNotNeededPackage } from "../src/git";
45
import { NotNeededPackage, TypesDataFile, AllPackages } from "../src/packages";
@@ -65,94 +66,62 @@ testo({
6566
// TODO: Test with dependents, etc etc
6667
});
6768

68-
const empty: NpmInfo = {
69-
homepage: "",
70-
distTags: new Map(),
71-
versions: new Map(),
72-
time: new Map(),
73-
};
69+
jest.mock("pacote", () => ({
70+
async manifest(spec: string, opts: pacote.Options) {
71+
switch (spec) {
72+
case "[email protected]": // Older than the @types/jest package.
73+
case "[email protected]": // The same version as the @types/jest package.
74+
case "[email protected]": // Newer than the @types/jest package.
75+
// These versions exist (don't throw).
76+
return;
77+
case "[email protected]": // A nonexistent version of the replacement package.
78+
// eslint-disable-next-line no-throw-literal
79+
throw { code: "ETARGET" };
80+
case "@types/jest": // The @types/jest package.
81+
return { version: "50.0.0" };
82+
case "[email protected]": // A nonexistent replacement package.
83+
case "@types/nonexistent": // A nonexistent @types package.
84+
// eslint-disable-next-line no-throw-literal
85+
throw { code: opts.offline ? "ENOTCACHED" : "E404" };
86+
}
87+
throw new Error(`Unexpected npm registry fetch: ${util.inspect(spec)}`);
88+
},
89+
}));
90+
91+
const newerReplacement = new NotNeededPackage("jest", "jest", "100.0.0");
92+
const olderReplacement = new NotNeededPackage("jest", "jest", "4.0.0");
93+
const sameVersion = new NotNeededPackage("jest", "jest", "50.0.0");
94+
const nonexistentReplacementVersion = new NotNeededPackage("jest", "jest", "999.0.0");
95+
const nonexistentReplacementPackage = new NotNeededPackage("jest", "nonexistent", "100.0.0");
96+
const nonexistentTypesPackage = new NotNeededPackage("nonexistent", "jest", "100.0.0");
97+
7498
testo({
7599
missingSource() {
76-
expect(() => checkNotNeededPackage(jestNotNeeded[0], undefined, empty)).toThrow(
100+
return expect(checkNotNeededPackage(nonexistentReplacementPackage)).rejects.toThrow(
77101
"The entry for @types/jest in notNeededPackages.json"
78102
);
79103
},
80104
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'
105+
return expect(checkNotNeededPackage(nonexistentTypesPackage)).rejects.toThrow(
106+
"@types package not found for @types/nonexistent"
88107
);
89108
},
90109
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.`);
110+
return expect(checkNotNeededPackage(sameVersion)).rejects
111+
.toThrow(`The specified version 50.0.0 of jest must be newer than the version
112+
it is supposed to replace, 50.0.0 of @types/jest.`);
100113
},
101114
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.`);
115+
return expect(checkNotNeededPackage(olderReplacement)).rejects
116+
.toThrow(`The specified version 4.0.0 of jest must be newer than the version
117+
it is supposed to replace, 50.0.0 of @types/jest.`);
111118
},
112119
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.");
120+
return expect(checkNotNeededPackage(nonexistentReplacementVersion)).rejects.toThrow(
121+
"The specified version 999.0.0 of jest is not on npm."
122+
);
140123
},
141124
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-
);
125+
return checkNotNeededPackage(newerReplacement);
157126
},
158127
});

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.6.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.4",
3436
"@types/source-map-support": "^0.4.0",
3537
"@types/yargs": "^15.0.4"
3638
},

0 commit comments

Comments
 (0)