@@ -3,6 +3,7 @@ const ejs = require('ejs')
3
3
const path = require ( 'path' )
4
4
const globby = require ( 'globby' )
5
5
const isBinary = require ( 'isbinaryfile' )
6
+ const yaml = require ( 'yaml-front-matter' )
6
7
const mergeDeps = require ( './util/mergeDeps' )
7
8
8
9
const isString = val => typeof val === 'string'
@@ -207,11 +208,46 @@ function extractCallDir () {
207
208
return path . dirname ( fileName )
208
209
}
209
210
211
+ const replaceBlockRE = / < % # R E P L A C E % > ( [ ^ ] * ?) < % # E N D _ R E P L A C E % > / g
212
+
210
213
function renderFile ( name , data , ejsOptions ) {
211
214
if ( isBinary . sync ( name ) ) {
212
215
return fs . readFileSync ( name ) // return buffer
213
216
}
214
- return ejs . render ( fs . readFileSync ( name , 'utf-8' ) , data , ejsOptions )
217
+ const template = fs . readFileSync ( name , 'utf-8' )
218
+
219
+ // custom template inheritance via yaml front matter.
220
+ // ---
221
+ // extend: 'source-file'
222
+ // replace: !!js/regexp /some-regex/
223
+ // OR
224
+ // replace:
225
+ // - !!js/regexp /foo/
226
+ // - !!js/regexp /bar/
227
+ // ---
228
+ const parsed = yaml . loadFront ( template )
229
+ const content = parsed . __content
230
+ let finalTemplate = content . trim ( ) + `\n`
231
+ if ( parsed . extend ) {
232
+ finalTemplate = fs . readFileSync ( require . resolve ( parsed . extend ) , 'utf-8' )
233
+ if ( parsed . replace ) {
234
+ if ( Array . isArray ( parsed . replace ) ) {
235
+ const replaceMatch = content . match ( replaceBlockRE )
236
+ if ( replaceMatch ) {
237
+ const replaces = replaceMatch . map ( m => {
238
+ return m . replace ( replaceBlockRE , '$1' ) . trim ( )
239
+ } )
240
+ parsed . replace . forEach ( ( r , i ) => {
241
+ finalTemplate = finalTemplate . replace ( r , replaces [ i ] )
242
+ } )
243
+ }
244
+ } else {
245
+ finalTemplate = finalTemplate . replace ( parsed . replace , content . trim ( ) )
246
+ }
247
+ }
248
+ }
249
+
250
+ return ejs . render ( finalTemplate , data , ejsOptions )
215
251
}
216
252
217
253
module . exports = GeneratorAPI
0 commit comments