@@ -21,49 +21,87 @@ async function setup({
21
21
options : UpdateApiExecutorSchema ;
22
22
tempFolder : string ;
23
23
} ) {
24
+ logger . debug (
25
+ `Setting up update-api executor with options: ${ JSON . stringify ( options , null , 2 ) } ` ,
26
+ ) ;
27
+ logger . debug ( `Using temp folder: ${ tempFolder } ` ) ;
28
+ logger . debug ( `Absolute temp folder path: ${ absoluteTempFolder } ` ) ;
29
+
24
30
const tempApiFolder = join ( tempFolder , CONSTANTS . SPEC_DIR_NAME ) ;
31
+ logger . debug ( `Temp API folder path: ${ tempApiFolder } ` ) ;
25
32
26
33
// Create temp folders if they don't exist
27
34
const absoluteTempApiFolder = join (
28
35
absoluteTempFolder ,
29
36
CONSTANTS . SPEC_DIR_NAME ,
30
37
) ;
38
+ logger . debug ( `Absolute temp API folder path: ${ absoluteTempApiFolder } ` ) ;
39
+
31
40
if ( ! existsSync ( absoluteTempApiFolder ) ) {
32
41
logger . debug ( `Creating executor temp api folder: ${ absoluteTempApiFolder } ` ) ;
33
42
await mkdir ( absoluteTempApiFolder , { recursive : true } ) ;
43
+ logger . debug ( `Created temp API folder: ${ absoluteTempApiFolder } ` ) ;
44
+ } else {
45
+ logger . debug ( `Temp API folder already exists: ${ absoluteTempApiFolder } ` ) ;
34
46
}
35
47
logger . debug ( 'Temp folders created.' ) ;
36
48
37
49
// Determine file paths
38
50
const projectRoot = join ( options . directory , options . name ) ;
51
+ logger . debug ( `Project root path: ${ projectRoot } ` ) ;
52
+
39
53
const apiDirectory = join ( projectRoot , CONSTANTS . SPEC_DIR_NAME ) ;
54
+ logger . debug ( `API directory path: ${ apiDirectory } ` ) ;
55
+
40
56
const existingSpecPath = join ( apiDirectory , CONSTANTS . SPEC_FILE_NAME ) ;
57
+ logger . debug ( `Existing spec file path: ${ existingSpecPath } ` ) ;
58
+
41
59
const tempSpecPath = join ( tempApiFolder , CONSTANTS . SPEC_FILE_NAME ) ;
60
+ logger . debug ( `Temp spec file path: ${ tempSpecPath } ` ) ;
61
+
42
62
const generatedTempDir = join ( tempFolder , CONSTANTS . GENERATED_DIR_NAME ) ;
63
+ logger . debug ( `Generated temp directory path: ${ generatedTempDir } ` ) ;
43
64
44
65
// Check if existing spec exists
45
66
const absoluteExistingSpecPath = join ( process . cwd ( ) , existingSpecPath ) ;
67
+ logger . debug ( `Absolute existing spec path: ${ absoluteExistingSpecPath } ` ) ;
68
+
46
69
if ( ! existsSync ( absoluteExistingSpecPath ) ) {
70
+ logger . error ( `No existing spec file found at ${ existingSpecPath } .` ) ;
47
71
throw new Error ( `No existing spec file found at ${ existingSpecPath } .` ) ;
72
+ } else {
73
+ logger . debug ( `Existing spec file found at ${ absoluteExistingSpecPath } ` ) ;
48
74
}
49
75
76
+ logger . info ( `Bundling and dereferencing spec file from: ${ options . spec } ` ) ;
50
77
const dereferencedSpec = await bundleAndDereferenceSpecFile ( {
51
78
client : options . client ,
52
79
outputPath : tempSpecPath ,
53
80
plugins : options . plugins ,
54
81
specPath : options . spec ,
55
82
} ) ;
83
+ logger . info ( `Spec file bundled successfully` ) ;
84
+
56
85
// save the dereferenced spec to the temp spec file
57
86
try {
87
+ logger . debug ( `Writing dereferenced spec to temp file: ${ tempSpecPath } ` ) ;
58
88
writeFileSync ( tempSpecPath , JSON . stringify ( dereferencedSpec , null , 2 ) ) ;
89
+ logger . debug ( `Dereferenced spec written to temp file successfully` ) ;
59
90
} catch ( error ) {
60
91
logger . error ( `Failed to write dereferenced spec to temp file: ${ error } .` ) ;
61
92
throw error ;
62
93
}
63
94
64
95
logger . info ( 'Reading existing and new spec files...' ) ;
65
96
const absoluteTempSpecPath = join ( process . cwd ( ) , tempSpecPath ) ;
97
+ logger . debug ( `Absolute temp spec path: ${ absoluteTempSpecPath } ` ) ;
98
+
99
+ logger . debug ( `Reading new spec file from: ${ absoluteTempSpecPath } ` ) ;
66
100
const newSpecString = await readFile ( absoluteTempSpecPath , 'utf-8' ) ;
101
+ logger . debug (
102
+ `New spec file read successfully, size: ${ newSpecString . length } bytes` ,
103
+ ) ;
104
+
67
105
if ( ! newSpecString ) {
68
106
logger . error ( 'New spec file is empty.' ) ;
69
107
throw new Error ( 'New spec file is empty.' ) ;
@@ -90,11 +128,21 @@ const runExecutor: PromiseExecutor<UpdateApiExecutorSchema> = async (
90
128
// eslint-disable-next-line @typescript-eslint/no-unused-vars
91
129
_context ,
92
130
) => {
131
+ logger . info (
132
+ `Starting update-api executor with options: ${ JSON . stringify ( options , null , 2 ) } ` ,
133
+ ) ;
134
+
93
135
const tempFolder = options . tempFolder ?? CONSTANTS . TMP_DIR_NAME ;
136
+ logger . debug ( `Using temp folder: ${ tempFolder } ` ) ;
137
+
94
138
const absoluteTempFolder = join ( process . cwd ( ) , tempFolder ) ;
139
+ logger . debug ( `Absolute temp folder path: ${ absoluteTempFolder } ` ) ;
140
+
95
141
const force = options . force ?? false ;
142
+ logger . debug ( `Force flag: ${ force } ` ) ;
96
143
97
144
try {
145
+ logger . info ( `Setting up executor environment...` ) ;
98
146
const {
99
147
absoluteExistingSpecPath,
100
148
absoluteTempSpecPath,
@@ -108,15 +156,20 @@ const runExecutor: PromiseExecutor<UpdateApiExecutorSchema> = async (
108
156
options,
109
157
tempFolder,
110
158
} ) ;
159
+ logger . info ( `Setup completed successfully` ) ;
160
+
161
+ logger . info ( `Comparing existing spec with new spec...` ) ;
111
162
const areSpecsEqual = await compareSpecs (
112
163
absoluteExistingSpecPath ,
113
164
absoluteTempSpecPath ,
114
165
) ;
166
+ logger . debug ( `Specs comparison result - equal: ${ areSpecsEqual } ` ) ;
115
167
116
168
// If specs are equal, we don't need to generate new client code and we can return unless the force flag is true
117
169
if ( areSpecsEqual ) {
118
170
logger . info ( 'No changes detected in the API spec.' ) ;
119
171
if ( ! force ) {
172
+ logger . info ( 'Force flag is false. Skipping client code generation.' ) ;
120
173
await cleanup ( absoluteTempFolder ) ;
121
174
return { success : true } ;
122
175
} else {
@@ -131,32 +184,54 @@ const runExecutor: PromiseExecutor<UpdateApiExecutorSchema> = async (
131
184
// Generate new client code in temp directory
132
185
// Create temp generated directory
133
186
const absoluteGeneratedTempDir = join ( process . cwd ( ) , generatedTempDir ) ;
187
+ logger . debug (
188
+ `Absolute generated temp directory: ${ absoluteGeneratedTempDir } ` ,
189
+ ) ;
190
+
134
191
if ( ! existsSync ( absoluteGeneratedTempDir ) ) {
192
+ logger . debug (
193
+ `Creating temp generated directory: ${ absoluteGeneratedTempDir } ` ,
194
+ ) ;
135
195
await mkdir ( absoluteGeneratedTempDir ) ;
196
+ logger . debug ( `Created temp generated directory successfully` ) ;
197
+ } else {
198
+ logger . debug ( `Temp generated directory already exists` ) ;
136
199
}
137
200
138
201
// Generate new client code
202
+ logger . info (
203
+ `Generating client code using client: ${ options . client } and plugins: ${ options . plugins . join ( ', ' ) } ` ,
204
+ ) ;
139
205
await generateClientCode ( {
140
206
clientType : options . client ,
141
207
outputPath : generatedTempDir ,
142
208
plugins : options . plugins ,
143
209
specFile : tempSpecPath ,
144
210
} ) ;
211
+ logger . info ( `Client code generated successfully` ) ;
145
212
146
213
// After successful generation, update the files
147
214
logger . info ( 'Updating existing spec and client files...' ) ;
148
215
149
216
const absoluteApiDirectory = join ( process . cwd ( ) , apiDirectory ) ;
217
+ logger . debug ( `Absolute API directory: ${ absoluteApiDirectory } ` ) ;
218
+
150
219
const apiDirectoryExists = existsSync ( absoluteApiDirectory ) ;
220
+ logger . debug ( `API directory exists: ${ apiDirectoryExists } ` ) ;
221
+
151
222
const existingSpecFileExists = existsSync ( absoluteExistingSpecPath ) ;
223
+ logger . debug ( `Existing spec file exists: ${ existingSpecFileExists } ` ) ;
224
+
152
225
// Copy new spec to project
153
226
if ( apiDirectoryExists ) {
154
227
if ( existingSpecFileExists ) {
155
228
logger . debug ( 'Existing spec file found. Updating...' ) ;
156
229
} else {
157
230
logger . debug ( 'No existing spec file found. Creating...' ) ;
158
231
}
232
+ logger . debug ( `Writing new spec to: ${ absoluteExistingSpecPath } ` ) ;
159
233
writeFileSync ( absoluteExistingSpecPath , newSpecString ) ;
234
+ logger . debug ( `Spec file updated successfully` ) ;
160
235
} else {
161
236
logger . error (
162
237
`No API directory found at ${ apiDirectory } after checking once, exiting.` ,
@@ -171,42 +246,65 @@ const runExecutor: PromiseExecutor<UpdateApiExecutorSchema> = async (
171
246
'src' ,
172
247
CONSTANTS . GENERATED_DIR_NAME ,
173
248
) ;
249
+ logger . debug ( `Project generated directory: ${ projectGeneratedDir } ` ) ;
174
250
175
251
const absoluteProjectGeneratedDir = join (
176
252
process . cwd ( ) ,
177
253
projectGeneratedDir ,
178
254
) ;
255
+ logger . debug (
256
+ `Absolute project generated directory: ${ absoluteProjectGeneratedDir } ` ,
257
+ ) ;
179
258
180
259
// Remove old generated directory if it exists
181
260
if ( existsSync ( absoluteProjectGeneratedDir ) ) {
261
+ logger . debug (
262
+ `Removing old generated directory: ${ absoluteProjectGeneratedDir } ` ,
263
+ ) ;
182
264
await rm ( absoluteProjectGeneratedDir , {
183
265
force : true ,
184
266
recursive : true ,
185
267
} ) ;
268
+ logger . debug ( `Old generated directory removed successfully` ) ;
269
+ } else {
270
+ logger . debug ( `No existing generated directory to remove` ) ;
186
271
}
187
272
188
273
// Copy new generated directory
274
+ logger . debug (
275
+ `Copying from ${ absoluteGeneratedTempDir } to ${ absoluteProjectGeneratedDir } ` ,
276
+ ) ;
189
277
await cp ( absoluteGeneratedTempDir , absoluteProjectGeneratedDir , {
190
278
recursive : true ,
191
279
} ) ;
280
+ logger . debug ( `Generated files copied successfully` ) ;
192
281
193
282
logger . info ( 'Successfully updated API client and spec files.' ) ;
283
+ logger . debug ( `Cleaning up temp folder: ${ absoluteTempFolder } ` ) ;
194
284
await cleanup ( absoluteTempFolder ) ;
285
+ logger . info ( 'Update-api executor completed successfully' ) ;
195
286
return { success : true } ;
196
287
} catch ( error ) {
197
- logger . error (
198
- `Failed to update API: ${ error instanceof Error ? error . message : String ( error ) } .` ,
199
- ) ;
288
+ const errorMessage = error instanceof Error ? error . message : String ( error ) ;
289
+ logger . error ( `Failed to update API: ${ errorMessage } ` ) ;
290
+ logger . debug ( `Error details: ${ error } ` ) ;
291
+ logger . debug ( `Cleaning up temp folder after error: ${ absoluteTempFolder } ` ) ;
200
292
await cleanup ( absoluteTempFolder ) ;
201
293
return { success : false } ;
202
294
}
203
295
} ;
204
296
205
297
async function cleanup ( tempFolder : string ) {
298
+ logger . debug ( `Cleaning up temp folder: ${ tempFolder } ` ) ;
206
299
const absoluteTempFolder = join ( process . cwd ( ) , tempFolder ) ;
300
+ logger . debug ( `Absolute temp folder path for cleanup: ${ absoluteTempFolder } ` ) ;
301
+
207
302
if ( existsSync ( absoluteTempFolder ) ) {
208
303
logger . debug ( `Removing temp folder: ${ absoluteTempFolder } ` ) ;
209
304
await rm ( absoluteTempFolder , { force : true , recursive : true } ) ;
305
+ logger . debug ( `Temp folder removed successfully` ) ;
306
+ } else {
307
+ logger . debug ( `Temp folder doesn't exist, nothing to clean up` ) ;
210
308
}
211
309
}
212
310
0 commit comments