@@ -6,53 +6,127 @@ const file = require('gulp-file');
66const merge2 = require ( 'merge2' ) ;
77
88const package = require ( './package.json' ) ;
9- const generateReadme = require ( './helpers/bundle-readme.generator' ) ;
109
10+ const README_INDENT = ' ' ;
11+ const README_INSTALLATION_TEXT = 'Extract addons and resources to cstrike folder' ;
1112const WORK_DIR = process . cwd ( ) ;
1213const DIST_DIR = path . join ( WORK_DIR , './dist' ) ;
14+ const DIST_BUILD_DIR = path . join ( DIST_DIR , 'build' ) ;
1315const BUILD_DIR = path . join ( DIST_DIR , 'bundles' ) ;
14- const REAPI_DIST_DIR = path . join ( DIST_DIR , 'reapi' ) ;
16+ const BUILD_METADATA_FILE = path . join ( DIST_DIR , 'bundles' , 'files.json' ) ;
17+ const SDK_DIR = path . join ( WORK_DIR , 'sdk' ) ;
18+ const ASSETS_DIR = path . join ( WORK_DIR , 'assets' ) ;
1519
16- if ( ! fs . existsSync ( REAPI_DIST_DIR ) ) {
17- throw new Error ( 'Build ReAPI project before packing' ) ;
20+ if ( ! fs . existsSync ( DIST_BUILD_DIR ) ) {
21+ throw new Error ( 'Build project before packing' ) ;
22+ }
23+
24+ function isDirEmpty ( dir ) {
25+ if ( ! fs . existsSync ( dir ) ) {
26+ return true ;
27+ }
28+
29+ const files = fs . readdirSync ( dir ) ;
30+
31+ return ! files . length ;
32+ }
33+
34+ function generateReadme ( files ) {
35+ const filesArr = Object . keys ( files ) . map ( key => {
36+ const { name, description } = files [ key ] ;
37+ return { key, name, description } ;
38+ } ) ;
39+
40+ const fileMaxLength = Math . max (
41+ ...filesArr . map ( file => file . name . length )
42+ ) ;
43+
44+ const resolvedFiles = filesArr . map ( file => {
45+ const { name, description } = file ;
46+
47+ if ( ! description ) {
48+ return ;
49+ }
50+
51+ const spacesNum = Math . max ( fileMaxLength - name . length , 0 ) ;
52+ const spaces = ' ' . repeat ( spacesNum ) ;
53+
54+ return `${ README_INDENT } ${ name } ${ spaces } - ${ description } `
55+ } ) . filter ( Boolean ) . join ( '\n' ) ;
56+
57+ return [
58+ '[INSTALLATION]' ,
59+ `${ README_INDENT } ${ README_INSTALLATION_TEXT } ` ,
60+ '' ,
61+ '[FILES]' ,
62+ resolvedFiles
63+ ] . join ( '\n' ) ;
1864}
1965
2066const resolveArchiveName = ( sufix ) => `${ package . name } -${ package . version . replace ( / \. / g, '' ) } -${ sufix } .zip` ;
2167
2268const FILES = {
23- bundleArchive : resolveArchiveName ( 'bundle' ) ,
2469 srcArchive : resolveArchiveName ( 'addons-src' ) ,
25- addonsArchive : resolveArchiveName ( 'addons-build' ) ,
26- resourcesArchive : resolveArchiveName ( 'resources' ) ,
27- sdkArchive : resolveArchiveName ( 'sdk' ) ,
28- readme : 'README.TXT'
70+ buildArchive : resolveArchiveName ( 'addons-build' ) ,
71+ resourcesArchive : ! isDirEmpty ( ASSETS_DIR ) ? resolveArchiveName ( 'resources' ) : null ,
72+ sdkArchive : ! isDirEmpty ( SDK_DIR ) ? resolveArchiveName ( 'sdk' ) : null ,
73+ readme : 'README.TXT' ,
74+ bundleArchive : resolveArchiveName ( 'bundle' )
2975} ;
3076
3177const BUNDLE_FILES = [
32- { name : FILES . addonsArchive , description : 'compiled plugins and source code' } ,
33- { name : FILES . resourcesArchive , description : 'mod resources' } ,
34- { name : FILES . sdkArchive , description : 'mod sdk' }
78+ { name : FILES . buildArchive , description : 'compiled plugins and source code' }
3579] ;
3680
81+ if ( FILES . resourcesArchive ) {
82+ BUNDLE_FILES . push ( { name : FILES . resourcesArchive , description : 'mod resources' } ) ;
83+ }
84+
85+ if ( FILES . sdkArchive ) {
86+ BUNDLE_FILES . push ( { name : FILES . sdkArchive , description : 'mod sdk' } ) ;
87+ }
88+
3789gulp . task ( 'pack:bundles' , ( ) => {
3890 const dirPatterns = {
39- all : REAPI_DIST_DIR + '/**' ,
40- addons : REAPI_DIST_DIR + '/addons{,/**}' ,
41- plugins : REAPI_DIST_DIR + '/addons/amxmodx/plugins{,/**}' ,
42- modules : REAPI_DIST_DIR + '/addons/amxmodx/modules{,/**}' ,
43- sdk : WORK_DIR + '/sdk /**'
91+ all : DIST_BUILD_DIR + '/**' ,
92+ addons : DIST_BUILD_DIR + '/addons{,/**}' ,
93+ plugins : DIST_BUILD_DIR + '/addons/amxmodx/plugins{,/**}' ,
94+ modules : DIST_BUILD_DIR + '/addons/amxmodx/modules{,/**}' ,
95+ sdk : SDK_DIR + '/**'
4496 } ;
4597
98+ const zipTasks = [
99+ (
100+ gulp
101+ . src ( [ dirPatterns . addons , '!' + dirPatterns . plugins , '!' + dirPatterns . modules ] )
102+ . pipe ( zip ( FILES . srcArchive ) )
103+ ) ,
104+ (
105+ gulp
106+ . src ( [ dirPatterns . addons ] )
107+ . pipe ( zip ( FILES . buildArchive ) )
108+ )
109+ ] ;
110+
111+ if ( FILES . resourcesArchive ) {
112+ zipTasks . push (
113+ gulp
114+ . src ( [ dirPatterns . all , '!' + dirPatterns . addons ] )
115+ . pipe ( zip ( FILES . resourcesArchive ) )
116+ ) ;
117+ }
118+
119+ if ( FILES . sdkArchive ) {
120+ zipTasks . push (
121+ gulp
122+ . src ( [ dirPatterns . sdk ] )
123+ . pipe ( zip ( FILES . sdkArchive ) )
124+ ) ;
125+ }
126+
46127 return merge2 ( [
47- gulp . src ( [ dirPatterns . addons , '!' + dirPatterns . plugins , '!' + dirPatterns . modules ] )
48- . pipe ( zip ( FILES . srcArchive ) ) ,
49- gulp . src ( [ dirPatterns . addons ] )
50- . pipe ( zip ( FILES . addonsArchive ) ) ,
51- gulp . src ( [ dirPatterns . all , '!' + dirPatterns . addons ] )
52- . pipe ( zip ( FILES . resourcesArchive ) ) ,
53- gulp . src ( [ dirPatterns . sdk ] )
54- . pipe ( zip ( FILES . sdkArchive ) ) ,
55- file ( FILES . readme , generateReadme ( BUNDLE_FILES ) , { src : true } )
128+ ...zipTasks ,
129+ file ( FILES . readme , generateReadme ( BUNDLE_FILES ) , { src : true } )
56130 ] ) . pipe ( gulp . dest ( BUILD_DIR ) ) ;
57131} ) ;
58132
@@ -62,6 +136,10 @@ gulp.task('pack:full', () => {
62136 return gulp . src ( bundleFiles )
63137 . pipe ( zip ( FILES . bundleArchive ) )
64138 . pipe ( gulp . dest ( BUILD_DIR ) )
65- } )
139+ } ) ;
140+
141+ gulp . task ( 'pack:metadata' , cb => {
142+ fs . writeFile ( BUILD_METADATA_FILE , JSON . stringify ( FILES ) , cb ) ;
143+ } ) ;
66144
67- gulp . task ( 'default' , gulp . series ( 'pack:bundles' , 'pack:full' ) ) ;
145+ gulp . task ( 'default' , gulp . series ( 'pack:bundles' , 'pack:full' , 'pack:metadata' ) ) ;
0 commit comments