@@ -12,6 +12,7 @@ import {
12
12
} from "@definitelytyped/utils" ;
13
13
import { fetchTypesPackageVersionInfo } from "@definitelytyped/retag" ;
14
14
import * as pacote from "pacote" ;
15
+ import * as semver from "semver" ;
15
16
16
17
if ( ! module . parent ) {
17
18
const log = loggerWithErrors ( ) [ 0 ] ;
@@ -37,9 +38,9 @@ async function computeAndSaveChangedPackages(
37
38
const cp = await computeChangedPackages ( allPackages , log ) ;
38
39
const json : ChangedPackagesJson = {
39
40
changedTypings : cp . changedTypings . map (
40
- ( { pkg : { id } , version, latestVersion } ) : ChangedTypingJson => ( { id , version, latestVersion } )
41
+ ( { pkg : { name } , version, latestVersion } ) : ChangedTypingJson => ( { name , version, latestVersion } )
41
42
) ,
42
- changedNotNeededPackages : cp . changedNotNeededPackages . map ( ( p ) => p . name ) ,
43
+ changedNotNeededPackages : cp . changedNotNeededPackages . map ( ( { pkg : { name } , version } ) => ( { name, version } ) ) ,
43
44
} ;
44
45
await writeDataFile ( versionsFilename , json ) ;
45
46
return cp ;
@@ -72,7 +73,8 @@ async function computeChangedPackages(allPackages: AllPackages, log: LoggerWithE
72
73
} ) ;
73
74
log . info ( "# Computing deprecated packages..." ) ;
74
75
const changedNotNeededPackages = await mapDefinedAsync ( allPackages . allNotNeeded ( ) , async ( pkg ) => {
75
- if ( ! ( await isAlreadyDeprecated ( pkg , log ) ) ) {
76
+ const incipientVersion = await fetchIncipientStubVersion ( pkg , log ) ;
77
+ if ( incipientVersion ) {
76
78
// Assert that dependencies (i.e. the replacement package) exist on npm.
77
79
// Also checked in checkNotNeededPackage().
78
80
await pacote . manifest ( pkg . libraryName , { cache : cacheDir } ) . catch ( ( reason ) => {
@@ -81,20 +83,30 @@ async function computeChangedPackages(allPackages: AllPackages, log: LoggerWithE
81
83
: reason ;
82
84
} ) ;
83
85
log . info ( `To be deprecated: ${ pkg . name } ` ) ;
84
- return pkg ;
86
+ return { pkg, version : incipientVersion } ;
85
87
}
86
88
return undefined ;
87
89
} ) ;
88
90
return { changedTypings, changedNotNeededPackages } ;
89
91
}
90
92
91
- async function isAlreadyDeprecated ( pkg : NotNeededPackage , log : LoggerWithErrors ) : Promise < unknown > {
92
- const offline = await pacote . manifest ( pkg . fullNpmName , { cache : cacheDir , offline : true } ) . catch ( ( reason ) => {
93
- if ( reason . code !== "ENOTCACHED" ) throw reason ;
94
- return undefined ;
95
- } ) ;
96
- if ( offline ?. deprecated ) return offline . deprecated ;
97
- log . info ( `Version info not cached for deprecated package ${ pkg . desc } ` ) ;
98
- const online = await pacote . manifest ( pkg . fullNpmName , { cache : cacheDir , preferOnline : true } ) ;
99
- return online . deprecated ;
93
+ /**
94
+ * Return the version of the stub @types package we're about to publish and deprecate, if we haven't already deprecated that package.
95
+ * It's the max of the not-needed version and the max published version + 1, in case we already published a not-needed-versioned stub but failed to deprecate it, for whatever reason.
96
+ */
97
+ export async function fetchIncipientStubVersion ( pkg : NotNeededPackage , log : LoggerWithErrors ) {
98
+ const packument = await revalidate ( ) ;
99
+ if ( packument . versions [ packument [ "dist-tags" ] . latest ] . deprecated ) return ;
100
+ const maxVersion = semver . maxSatisfying ( Object . keys ( packument . versions ) , "*" ) ! ;
101
+ return String ( semver . maxSatisfying ( [ pkg . version , semver . inc ( maxVersion , "patch" ) ! ] , "*" ) ) ;
102
+
103
+ async function revalidate ( ) {
104
+ const offline = await pacote . packument ( pkg . fullNpmName , { cache : cacheDir , offline : true } ) . catch ( ( reason ) => {
105
+ if ( reason . code !== "ENOTCACHED" ) throw reason ;
106
+ return undefined ;
107
+ } ) ;
108
+ if ( offline ?. versions [ offline [ "dist-tags" ] . latest ] . deprecated ) return offline ;
109
+ log . info ( `Version info not cached for deprecated package ${ pkg . desc } ` ) ;
110
+ return pacote . packument ( pkg . fullNpmName , { cache : cacheDir , preferOnline : true } ) ;
111
+ }
100
112
}
0 commit comments