1
1
import fs from 'node:fs/promises' ;
2
2
import path from 'node:path' ;
3
3
import type { ESLint as ESLintClass } from 'eslint' ;
4
- import { lock } from './lock' ;
5
4
import { makeDir } from './make-dir' ;
6
5
import {
7
6
ClientGenerationResultFile ,
8
7
CommonOpenApiClientGeneratorConfigPostprocess
9
8
} from '../schema-to-typescript/config' ;
10
9
11
- let eslintInstance : ESLintClass | null = null ;
12
-
13
- function getEslintInstance ( ) : ESLintClass {
14
- if ( eslintInstance === null ) {
15
- // This is an optional dependency, so we require it here to avoid loading it when it's not needed.
16
- // eslint-disable-next-line @typescript-eslint/no-var-requires
17
- const { ESLint} = require ( 'eslint' ) as { ESLint : typeof ESLintClass } ;
18
- eslintInstance = new ESLint ( {
19
- fix : true
20
- } ) ;
21
- }
22
- return eslintInstance ;
23
- }
24
-
25
10
export async function postprocessFiles ( {
26
11
files,
27
12
config : { eslint : enableEslint } = { } ,
@@ -40,72 +25,68 @@ export async function postprocessFiles({
40
25
directories . add ( directory ) ;
41
26
}
42
27
43
- await lock ( 'calc:directories' , async ( ) => {
44
- for ( const directory of Array . from ( directories ) ) {
45
- try {
46
- await fs . stat ( directory ) ;
47
- } catch ( _e ) {
48
- const directoryBits = directory . split ( path . sep ) ;
49
- let currentDirectory = directoryBits . shift ( ) || '/' ;
50
- for ( ; ; ) {
51
- try {
52
- await fs . stat ( currentDirectory ) ;
53
- } catch ( e ) {
54
- await makeDir ( currentDirectory ) ;
55
- directoriesToRemove . unshift ( currentDirectory ) ;
56
- }
57
- const subDirectory = directoryBits . shift ( ) ;
58
- if ( ! subDirectory ) {
59
- break ;
60
- }
61
- currentDirectory = path . join ( currentDirectory , subDirectory ) ;
28
+ for ( const directory of Array . from ( directories ) ) {
29
+ try {
30
+ await fs . stat ( directory ) ;
31
+ } catch ( _e ) {
32
+ const directoryBits = directory . split ( path . sep ) ;
33
+ let currentDirectory = directoryBits . shift ( ) || '/' ;
34
+ for ( ; ; ) {
35
+ try {
36
+ await fs . stat ( currentDirectory ) ;
37
+ } catch ( e ) {
38
+ await makeDir ( currentDirectory ) ;
39
+ directoriesToRemove . unshift ( currentDirectory ) ;
40
+ }
41
+ const subDirectory = directoryBits . shift ( ) ;
42
+ if ( ! subDirectory ) {
43
+ break ;
62
44
}
45
+ currentDirectory = path . join ( currentDirectory , subDirectory ) ;
63
46
}
64
47
}
65
- } ) ;
48
+ }
66
49
67
- const eslint = getEslintInstance ( ) ;
68
50
try {
51
+ // This is an optional dependency, so we require it here to avoid loading it when it's not needed.
52
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
53
+ const { ESLint} = require ( 'eslint' ) as { ESLint : typeof ESLintClass } ;
54
+ const eslint = new ESLint ( {
55
+ fix : true
56
+ } ) ;
57
+
69
58
return await Promise . all (
70
59
files . map ( async ( file ) => {
71
60
const filePath = path . resolve ( outputDirPath , file . filename ) ;
72
- return await lock ( `file: ${ filePath } ` , async ( ) => {
73
- let fileCreated = false ;
61
+ let fileCreated = false ;
62
+ try {
74
63
try {
75
- try {
76
- await fs . stat ( filePath ) ;
77
- } catch ( _e ) {
78
- await fs . writeFile ( filePath , file . data ) ;
79
- fileCreated = true ;
80
- }
81
- const [ result ] = await eslint . lintText ( file . data , { filePath} ) ;
82
- for ( const message of result . messages ) {
83
- if ( message . fatal ) {
84
- throw new Error ( `Fatal ESLint error in ${ file . filename } : ${ message . message } ` ) ;
85
- }
86
- }
87
- return {
88
- ...file ,
89
- data : result . output ?? file . data
90
- } ;
91
- } finally {
92
- if ( fileCreated ) {
93
- await fs . unlink ( filePath ) ;
64
+ await fs . stat ( filePath ) ;
65
+ } catch ( _e ) {
66
+ await fs . writeFile ( filePath , file . data ) ;
67
+ fileCreated = true ;
68
+ }
69
+ const [ result ] = await eslint . lintText ( file . data , { filePath} ) ;
70
+ for ( const message of result . messages ) {
71
+ if ( message . fatal ) {
72
+ throw new Error ( `Fatal ESLint error in ${ file . filename } : ${ message . message } ` ) ;
94
73
}
95
74
}
96
- } ) ;
75
+ return {
76
+ ...file ,
77
+ data : result . output ?? file . data
78
+ } ;
79
+ } finally {
80
+ if ( fileCreated ) {
81
+ await fs . unlink ( filePath ) ;
82
+ }
83
+ }
97
84
} )
98
85
) ;
99
86
} finally {
100
- await lock ( 'cleanup:directories' , async ( ) => {
101
- for ( const directory of directoriesToRemove ) {
102
- try {
103
- await fs . rmdir ( directory ) ;
104
- } catch ( e ) {
105
- // Ignore
106
- }
107
- }
108
- } ) ;
87
+ for ( const directory of directoriesToRemove ) {
88
+ await fs . rmdir ( directory ) ;
89
+ }
109
90
}
110
91
}
111
92
return files ;
0 commit comments