@@ -35,12 +35,14 @@ type NeedleContentToAddCallback = {
35
35
indentPrefix : string ;
36
36
} ;
37
37
38
+ type ContentToAdd = { content : string ; contentToCheck ?: string | RegExp } ;
39
+
38
40
export type NeedleInsertion = {
39
41
needle : string ;
40
42
/**
41
43
* Content to add.
42
44
*/
43
- contentToAdd : string | string [ ] | ( ( content : string , options : NeedleContentToAddCallback ) => string ) ;
45
+ contentToAdd : string | string [ ] | ContentToAdd [ ] | ( ( content : string , options : NeedleContentToAddCallback ) => string ) ;
44
46
contentToCheck ?: string | RegExp ;
45
47
/**
46
48
* check existing content ignoring white spaces and new lines.
@@ -56,7 +58,7 @@ export type NeedleInsertion = {
56
58
autoIndent ?: boolean ;
57
59
} ;
58
60
59
- type NeedleFileInsertion = NeedleInsertion & {
61
+ type NeedleFileInsertion = Omit < NeedleInsertion , 'needle' | 'contentToAdd' > & {
60
62
/**
61
63
* Path to file.
62
64
* The generator context must be passed.
@@ -68,8 +70,9 @@ type NeedleFileInsertion = NeedleInsertion & {
68
70
needlesPrefix ?: string ;
69
71
} ;
70
72
71
- type NeedleContentInsertion = NeedleInsertion & {
73
+ type NeedleContentInsertion = Pick < NeedleInsertion , 'needle' | 'autoIndent' > & {
72
74
content : string ;
75
+ contentToAdd : string | string [ ] | ( ( content : string , options : NeedleContentToAddCallback ) => string ) ;
73
76
} ;
74
77
75
78
/**
@@ -81,6 +84,10 @@ export const convertToPrettierExpressions = (str: string): string =>
81
84
. replace ( / (? ! ) ( > | \\ \) ) / g, ',?\\n?[\\s]*$1' )
82
85
. replace ( / \s + / g, '[\\s\\n]*' ) ;
83
86
87
+ const isArrayOfContentToAdd = ( value : unknown ) : value is ContentToAdd [ ] => {
88
+ return Array . isArray ( value ) && value . every ( item => typeof item === 'object' && 'content' in item ) ;
89
+ } ;
90
+
84
91
/**
85
92
* Check if contentToCheck existing in content
86
93
*
@@ -200,6 +207,15 @@ export const createNeedleCallback = <Generator extends CoreGenerator = CoreGener
200
207
assert ( contentToAdd , 'contentToAdd is required' ) ;
201
208
202
209
return function ( content , filePath ) {
210
+ if ( isArrayOfContentToAdd ( contentToAdd ) ) {
211
+ contentToAdd = contentToAdd . filter ( ( { content : itemContent , contentToCheck } ) => {
212
+ return ! checkContentIn ( contentToCheck ?? itemContent , content , ignoreWhitespaces ) ;
213
+ } ) ;
214
+ if ( contentToAdd . length === 0 ) {
215
+ return content ;
216
+ }
217
+ contentToAdd = contentToAdd . map ( ( { content } ) => content ) ;
218
+ }
203
219
if ( contentToCheck && checkContentIn ( contentToCheck , content , ignoreWhitespaces ) ) {
204
220
return content ;
205
221
}
@@ -238,19 +254,16 @@ export const createNeedleCallback = <Generator extends CoreGenerator = CoreGener
238
254
*
239
255
* @param this - generator if provided, editFile will be executed
240
256
*/
241
- export function createBaseNeedle (
242
- options : Omit < NeedleFileInsertion , 'filePath' | 'needle' | 'contentToAdd' > ,
243
- needles : Record < string , string > ,
244
- ) : NeedleCallback ;
257
+ export function createBaseNeedle ( options : Omit < NeedleFileInsertion , 'filePath' > , needles : Record < string , string > ) : NeedleCallback ;
245
258
export function createBaseNeedle ( needles : Record < string , string > ) : NeedleCallback ;
246
259
export function createBaseNeedle < Generator extends CoreGenerator = CoreGenerator > (
247
260
this : Generator ,
248
- options : Omit < NeedleFileInsertion , 'filePath' | 'needle' | 'contentToAdd' > & { filePath : string } ,
261
+ options : NeedleFileInsertion ,
249
262
needles : Record < string , string > ,
250
263
) : CascatedEditFileCallback < Generator > ;
251
264
export function createBaseNeedle < Generator extends CoreGenerator = CoreGenerator > (
252
265
this : Generator | void ,
253
- options : Omit < NeedleFileInsertion , 'filePath' | 'needle' | 'contentToAdd' > | Record < string , string > ,
266
+ options : NeedleFileInsertion | Record < string , string > ,
254
267
needles ?: Record < string , string > ,
255
268
) : EditFileCallback < Generator > | CascatedEditFileCallback < Generator > {
256
269
const actualNeedles = needles === undefined ? ( options as Record < string , string > ) : needles ;
0 commit comments