@@ -61,7 +61,7 @@ async function run(
61
61
cwd : string ,
62
62
errorAsString : boolean ,
63
63
) : Promise < string | Error | undefined > {
64
- return new Promise ( resolve => {
64
+ return new Promise ( ( resolve , reject ) => {
65
65
exec ( cmd , { cwd} , ( error , stdout , stderr ) => {
66
66
if ( error ) {
67
67
resolve ( errorAsString ? `${ stdout } \n${ stderr } ` : error )
@@ -84,108 +84,104 @@ function getItLabelDetails(tsVer: TestDef): string {
84
84
) } `
85
85
}
86
86
87
- describe ( "compatibility of typings for typescript versions" , function ( ) {
88
- let execCmd : "pnpm" | "npm" | "yarn" = "npm"
87
+ describe ( "compatibility of typings for typescript versions" , async function ( ) {
88
+ let execCmd : string
89
89
90
90
before ( async function ( ) {
91
91
this . timeout ( 10000 )
92
92
if ( / ^ t r u e $ / . test ( process . env . EXCLUDE_TYPINGS_COMPAT_TESTS as string ) ) {
93
93
this . skip ( )
94
- } else {
95
- // detect package manager (pnpm, npm, yarn) for installing typescript versions
96
- const packageManagers = [ "pnpm" , "yarn" , "npm" ] as typeof execCmd [ ]
97
-
98
- const versionResults = await Promise . all (
99
- packageManagers . map ( pm =>
100
- run ( `${ pm } --version` , tscTestBasePath , false ) ,
101
- ) ,
102
- )
94
+ }
95
+ execCmd = await getPackageManager ( )
96
+ } )
103
97
104
- const packageManagerIndex = versionResults . findIndex (
105
- versionResult => typeof versionResult === "string" ,
98
+ for ( const tsVer of tsVersions ) {
99
+ // must increase timeout for allowing `npm install`'ing the version of
100
+ // the typescript package to complete
101
+ this . timeout ( 30000 )
102
+
103
+ const tscTargetPath = path . resolve ( tscTestBasePath , `ts-${ tsVer . version } ` )
104
+
105
+ it ( `it should compile successfully with typescript version ${
106
+ tsVer . version
107
+ // eslint-disable-next-line no-loop-func
108
+ } , tsc ${ getItLabelDetails ( tsVer ) } `, async function ( ) {
109
+ await prepareTestPackage ( tscTargetPath , tsVer , execCmd )
110
+
111
+ const cmd = [ "npm" , "pnpm" ] . includes ( execCmd ) ? `${ execCmd } run` : execCmd
112
+ const errMsg = ( await run ( `${ cmd } test` , tscTargetPath , true ) ) as
113
+ | string
114
+ | undefined
115
+ assert . isUndefined ( errMsg , errMsg )
116
+ } )
117
+
118
+ afterEach ( async ( ) => {
119
+ await remove ( tscTargetPath )
120
+ } )
121
+ }
122
+ } )
123
+
124
+ async function prepareTestPackage (
125
+ tscTargetPath : string ,
126
+ tsVer : TestDef ,
127
+ execCmd : string ,
128
+ ) {
129
+ await emptyDir ( tscTargetPath )
130
+
131
+ await Promise . all ( [
132
+ ( async ( ) => {
133
+ const tsConfig = await readJson (
134
+ path . resolve ( templateSrcPath , "tsconfig.json" ) ,
106
135
)
107
136
108
- if ( packageManagerIndex === - 1 ) {
109
- throw new Error (
110
- "Cannot run typings compatibility test, because pnpm, npm, and yarn are not available." ,
137
+ tsConfig . compilerOptions . target = tsVer . minTarget
138
+ if ( tsVer . requiredLibs ) {
139
+ tsConfig . compilerOptions . lib = addLibs (
140
+ tsVer . requiredLibs ,
141
+ tsConfig . compilerOptions . lib as string [ ] ,
111
142
)
112
143
}
144
+ return writeJson ( path . resolve ( tscTargetPath , "tsconfig.json" ) , tsConfig )
145
+ } ) ( ) ,
146
+ ( async ( ) => {
147
+ const pkgJson = await readJson (
148
+ path . resolve ( templateSrcPath , "package.json" ) ,
149
+ )
113
150
114
- // eslint-disable-next-line require-atomic-updates
115
- execCmd = packageManagers [ packageManagerIndex ]
116
- }
117
- } )
151
+ pkgJson . name = `test-typings-ts-${ tsVer . version } `
152
+ pkgJson . devDependencies . typescript = `${ tsVer . version } `
153
+ return writeJson ( path . resolve ( tscTargetPath , "package.json" ) , pkgJson )
154
+ } ) ( ) ,
155
+ ( async ( ) => {
156
+ const content = await srcStr
157
+ return writeFile (
158
+ path . resolve ( tscTargetPath , "typings-test.ts" ) ,
159
+ content ,
160
+ "utf8" ,
161
+ )
162
+ } ) ( ) ,
163
+ ] )
118
164
119
- for ( const tsVer of tsVersions ) {
120
- // eslint-disable-next-line no-loop-func
121
- describe ( `when used in a project with typescript version ${ tsVer . version } ` , function ( ) {
122
- // must increase timeout for allowing `npm install`'ing the version of
123
- // the typescript package to complete
124
- this . timeout ( 30000 )
125
-
126
- const tscTargetPath = path . resolve ( tscTestBasePath , `ts-${ tsVer . version } ` )
127
-
128
- beforeEach ( async ( ) => {
129
- await emptyDir ( tscTargetPath )
130
-
131
- await Promise . all ( [
132
- ( async ( ) => {
133
- const tsConfig = await readJson (
134
- path . resolve ( templateSrcPath , "tsconfig.json" ) ,
135
- )
136
-
137
- tsConfig . compilerOptions . target = tsVer . minTarget
138
- if ( tsVer . requiredLibs ) {
139
- tsConfig . compilerOptions . lib = addLibs (
140
- tsVer . requiredLibs ,
141
- tsConfig . compilerOptions . lib as string [ ] ,
142
- )
143
- }
144
- return writeJson (
145
- path . resolve ( tscTargetPath , "tsconfig.json" ) ,
146
- tsConfig ,
147
- )
148
- } ) ( ) ,
149
- ( async ( ) => {
150
- const pkgJson = await readJson (
151
- path . resolve ( templateSrcPath , "package.json" ) ,
152
- )
153
-
154
- pkgJson . name = `test-typings-ts-${ tsVer . version } `
155
- pkgJson . devDependencies . typescript = `${ tsVer . version } `
156
- return writeJson (
157
- path . resolve ( tscTargetPath , "package.json" ) ,
158
- pkgJson ,
159
- )
160
- } ) ( ) ,
161
- ( async ( ) => {
162
- const content = await srcStr
163
- return writeFile (
164
- path . resolve ( tscTargetPath , "typings-test.ts" ) ,
165
- content ,
166
- "utf8" ,
167
- )
168
- } ) ( ) ,
169
- ] )
170
-
171
- await run ( `${ execCmd } install` , tscTargetPath , false )
172
- } )
173
-
174
- afterEach ( async ( ) => {
175
- await remove ( tscTargetPath )
176
- } )
177
-
178
- it ( `it should compile successfully with tsc ${ getItLabelDetails (
179
- tsVer ,
180
- ) } `, async function ( ) {
181
- const cmd = [ "npm" , "pnpm" ] . includes ( execCmd )
182
- ? `${ execCmd } run`
183
- : execCmd
184
- const errMsg = ( await run ( `${ cmd } test` , tscTargetPath , true ) ) as
185
- | string
186
- | undefined
187
- assert . isUndefined ( errMsg , errMsg )
188
- } )
189
- } )
165
+ await run ( `${ execCmd } install` , tscTargetPath , false )
166
+ }
167
+
168
+ /// detect package manager (pnpm, npm, yarn) for installing typescript versions
169
+ async function getPackageManager ( ) {
170
+ const packageManagers = [ "pnpm" , "yarn" , "npm" ]
171
+
172
+ const versionResults = await Promise . all (
173
+ packageManagers . map ( pm => run ( `${ pm } --version` , tscTestBasePath , false ) ) ,
174
+ )
175
+
176
+ const packageManagerIndex = versionResults . findIndex (
177
+ versionResult => typeof versionResult === "string" ,
178
+ )
179
+
180
+ if ( packageManagerIndex === - 1 ) {
181
+ throw new Error (
182
+ "Cannot run typings compatibility test, because pnpm, npm, and yarn are not available." ,
183
+ )
190
184
}
191
- } )
185
+
186
+ return packageManagers [ packageManagerIndex ]
187
+ }
0 commit comments