1+ 'use strict' ;
2+
3+ const parser = require ( 'git-ignore-parser' ) ;
4+ const ignore = require ( 'ignore' ) ;
5+ const fs = require ( 'fs' ) ;
6+ const path = require ( 'path' ) ;
7+ const template = require ( 'lodash/template' ) ;
8+ const templateSettings = require ( 'lodash/templateSettings' ) ;
9+ const debug = require ( 'debug' ) ( 'fun:renderer' ) ;
10+ const { green } = require ( 'colors' ) ;
11+ templateSettings . interpolate = / { { ( [ \s \S ] + ?) } } / g;
12+
13+ function renderContent ( content , context ) {
14+ return template ( content ) ( context . vars ) ;
15+ }
16+
17+ function isCopyOnlyPath ( file , context ) {
18+ const copyOnlyPaths = context . config . copyOnlyPaths ;
19+ if ( copyOnlyPaths ) {
20+ debug ( `copyOnlyPath is ${ copyOnlyPaths } ` ) ;
21+ const ignoredPaths = parser ( copyOnlyPaths ) ;
22+ const ig = ignore ( ) . add ( ignoredPaths ) ;
23+ const relativePath = path . relative ( path . resolve ( context . repoDir , context . templateDir ) , file ) ;
24+ debug ( `relativePath is ${ relativePath } ` ) ;
25+ return ig . ignores ( relativePath ) ;
26+ }
27+ return false ;
28+ }
29+
30+ function renderFile ( file , context ) {
31+ const renderedFile = renderContent ( file , context ) ;
32+ const fullSourceFile = path . resolve ( context . repoDir , file ) ;
33+ const fullTargetFile = path . resolve ( context . outputDir , renderedFile ) ;
34+ debug ( 'Source file: %s, target file: %s' , fullSourceFile , fullTargetFile ) ;
35+ console . log ( green ( `+ ${ fullTargetFile } ` ) ) ;
36+
37+ if ( isCopyOnlyPath ( fullSourceFile , context ) ) {
38+ debug ( 'Copy %s to %s' , fullSourceFile , fullTargetFile ) ;
39+ fs . createReadStream ( fullSourceFile ) . pipe ( fs . createWriteStream ( fullTargetFile ) ) ;
40+ return ;
41+ }
42+
43+ const content = fs . readFileSync ( fullSourceFile , 'utf8' ) ;
44+ const renderedContent = renderContent ( content , context ) ;
45+
46+ fs . writeFileSync ( fullTargetFile , renderedContent ) ;
47+ }
48+
49+ function renderDir ( dir , context ) {
50+ const renderedDir = renderContent ( dir , context ) ;
51+ const fullSourceDir = path . resolve ( context . repoDir , dir ) ;
52+ const fullTargetDir = path . resolve ( context . outputDir , renderedDir ) ;
53+
54+ debug ( 'Source Dir: %s, target dir: %s' , fullSourceDir , fullTargetDir ) ;
55+ console . log ( green ( `+ ${ fullTargetDir } ` ) ) ;
56+ fs . mkdirSync ( fullTargetDir ) ;
57+ const files = fs . readdirSync ( fullSourceDir ) ;
58+ files . forEach ( file => {
59+ const targetFile = path . join ( dir , file ) ;
60+ const fullTargetFile = path . resolve ( fullSourceDir , file ) ;
61+ var stat = fs . statSync ( fullTargetFile ) ;
62+ if ( stat && stat . isDirectory ( ) ) {
63+ renderDir ( targetFile , context ) ;
64+ } else {
65+ renderFile ( targetFile , context ) ;
66+ }
67+ } ) ;
68+ }
69+
70+ function render ( context ) {
71+ console . log ( 'Start rendering template...' ) ;
72+ renderDir ( context . templateDir , context ) ;
73+ console . log ( 'finish rendering template.' ) ;
74+ }
75+
76+ module . exports = { render, renderContent } ;
0 commit comments