11import path from 'path' ;
22import del from 'del' ;
3+ import beautify from 'js-beautify' ;
34
4- import { mergeDirsAsync , replaceAsync } from '#lib/utils/fs' ;
5+ import {
6+ mergeDirsAsync ,
7+ replaceAsync ,
8+ scanDirectory ,
9+ readFileAsync ,
10+ writeFileAsync
11+ } from '#lib/utils/fs' ;
512
13+ import { findDeep } from '#lib/utils/object' ;
614import { spinner } from '#lib/utils/log' ;
715
816export default async ( config , options ) => {
@@ -13,9 +21,7 @@ export default async (config, options) => {
1321 vendor
1422 } = options ;
1523
16- if ( ! files . boilerplate ) {
17- return ;
18- } ;
24+ if ( ! files . boilerplate ) return ;
1925
2026 const loader = spinner ( ) ;
2127 const cwd = process . cwd ( ) ;
@@ -24,8 +30,8 @@ export default async (config, options) => {
2430 const dest = path . join ( cwd , 'src' ) ;
2531
2632 const paths = {
27- styles : path . join ( cwd , 'src/styles/** ' ) ,
28- js : path . join ( cwd , 'src/js/** ' )
33+ styles : path . join ( cwd , 'src/styles' ) ,
34+ js : path . join ( cwd , 'src/js' )
2935 } ;
3036
3137 const replaces = {
@@ -84,30 +90,57 @@ export default async (config, options) => {
8490 } ;
8591 } ) ;
8692
87- addReplace ( / ( \r \n | \r | \n ) { 1 , } / g, '$1\n' ) ;
88- addReplace ( / ^ \s + \n / gm, '' ) ;
89- addReplace ( / ( \{ | , | \/ \/ .* ) ( \n + ) / g, '$1\n' ) ;
90- addReplace ( / ( \n + ) ( } | @ ? i m p o r t ) / g, '\n$2' ) ;
91- addReplace ( / ; ( \n + ) ( \s + ) \$ / g, ';\n\n$2\$' ) ;
92- addReplace ( / ( \n + ) ( \s + ) } / g, '\n$2}' ) ;
93+ const n = ( process . platform === 'win32' ) ? '\r\n' : '\n' ;
9394
9495 try {
9596 loader . start ( 'COPY_BOILERPLATE_START' ) ;
9697
98+ const formattedFiles = [ ] ;
99+
97100 await mergeDirsAsync ( source , dest ) ;
98101
102+ for ( const path of Object . values ( paths ) ) {
103+ const tree = scanDirectory ( path ) ;
104+ const files = findDeep ( tree , ( { type } ) => ( type === 'file' ) ) ;
105+
106+ for ( const file of files ) {
107+ const data = await readFileAsync ( file . path ) ;
108+
109+ if ( data && data . includes ( '/* if' ) ) {
110+ formattedFiles . push ( file . path ) ;
111+ } ;
112+ } ;
113+ } ;
114+
99115 await replaceAsync ( {
100116 files : [
101- paths . styles ,
102- paths . js
117+ ` ${ paths . styles } /**` ,
118+ ` ${ paths . js } /**`
103119 ] ,
104120 ...replaces
105121 } ) ;
106122
107- if ( removedFiles . length ) {
108- for ( const file of removedFiles ) {
109- await del ( path . join ( cwd , file ) ) ;
123+ for ( const file of removedFiles ) {
124+ await del ( path . join ( cwd , file ) ) ;
125+ } ;
126+
127+ for ( const file of formattedFiles ) {
128+ const type = file . includes ( '.js' ) ? 'js' : 'css' ;
129+
130+ const data = await readFileAsync ( file ) ;
131+
132+ let formatted = beautify [ type ] ( data , {
133+ indent_size : 4 ,
134+ max_preserve_newlines : 2 ,
135+ preserve_newlines : true ,
136+ brace_style : 'collapse,preserve-inline'
137+ } ) ;
138+
139+ if ( type === 'js' ) {
140+ formatted = formatted . replace ( / ( , ) ( \n + ) / gim, `$1${ n } ` ) . replace ( / ( \n + ) ( @ ? i m p o r t ) / gim, `${ n } $2` ) ;
110141 } ;
142+
143+ await writeFileAsync ( file , formatted ) ;
111144 } ;
112145
113146 loader . success ( 'COPY_BOILERPLATE_SUCCESS' ) ;
0 commit comments