KP-Liberation/_tools/gulpfile.ts

157 lines
4.8 KiB
TypeScript

import * as gulp from "gulp";
import * as gulpReplace from "gulp-replace";
import * as gulpPbo from "gulp-armapbo";
import * as gulpModify from "gulp-modify-file";
import * as gulpZip from "gulp-zip";
import * as vinylPaths from "vinyl-paths";
import * as del from "del";
import { resolve } from "path";
import { MissionPaths } from "./src";
import { Preset, FolderStructureInfo } from "./src";
const presets: Preset[] = require('./_presets.json');
/**
* Mission folders configuration
*/
const paths: FolderStructureInfo = {
frameworkFolder: resolve('..', 'Missionframework'),
missionsFolder: resolve('..', 'Missionbasefiles'),
workDir: resolve("./build")
};
/**
* Create gulp tasks
*/
let taskNames: string[] = [];
let taskNamesPbo: string[] = [];
let taskNamesZip: string[] = [];
for (let preset of presets) {
const mission = new MissionPaths(preset, paths);
const taskName = [preset.missionName, preset.map].join('.');
taskNames.push('mission_' + taskName);
gulp.task('mission_' + taskName, gulp.series(
/** Copy mission framework to output dir */
function frameworkCopy () {
return gulp.src(mission.getFrameworkPath().concat('/**/*'))
.pipe(gulp.dest(mission.getOutputDir()));
},
/** Copy mission.sqm to output dir */
function missionSqmCopy () {
return gulp.src(mission.getMissionSqmPath())
.pipe(gulp.dest(mission.getOutputDir()));
},
/** Replace variables values in configuration file */
function configReplace () {
let src = gulp.src(mission.getMissionConfigFilePath());
const variables = Object.getOwnPropertyNames(preset.variables);
for (let variable of variables) {
// https://regex101.com/r/YknC8r/1
const regex = new RegExp(`(${variable} += +)(?:\\d+|".+")`, 'ig');
const value = JSON.stringify(preset.variables[variable]);
// replace variable value
src = src.pipe(gulpReplace(regex, `$1${value}`));
}
return src.pipe(gulp.dest(mission.getOutputDir()));
},
/** Replace values in stringtable */
function stringTableReplace () {
// I know, replacing XML with regex... :|
// https://regex101.com/r/TSfish/2
const versionRegex = /<Key ID="STR_MISSION_VERSION">\s*<Original>(?<version>.+)<\/Original>/;
const nameRegex = /(<Key ID="STR_MISSION_TITLE">\s*<Original>)(?<name>.+)(<\/Original>)/;
return gulp.src(mission.getFrameworkPath().concat('/stringtable.xml'))
.pipe(gulpModify((content: string) => {
const version: string = content.match(versionRegex)['groups']['version'];
return content.replace(nameRegex, `$1CTI 34 KP Liberation ${preset.mapDisplay || preset.map} ${version}$3`);
}))
.pipe(gulp.dest(mission.getOutputDir(), { overwrite: true, }))
;
}
));
/**
* Pack PBOs
*/
taskNamesPbo.push('pack_' + taskName);
gulp.task('pack_' + taskName, () => {
return gulp.src(mission.getOutputDir() + '/**/*')
.pipe(gulpPbo({
fileName: mission.getFullName() + '.pbo',
progress: false,
verbose: false,
// Do not compress (SLOW)
compress: true ? [] : [
'**/*.sqf',
'mission.sqm',
'description.ext'
]
}))
.pipe(gulp.dest(mission.getWorkDir() + '/pbo'));
});
/**
* Create ZIP files
*/
taskNamesZip.push('zip_' + taskName);
gulp.task('zip_' + taskName, () => {
return gulp.src([
resolve('..', './userconfig/**/*'),
resolve('..', 'LICENSE.md'),
resolve('..', 'README.md')
], {
base: resolve('..') // Change base dir to have correct relative paths in ZIP
})
.pipe(
gulp.src(
resolve(mission.getWorkDir(), 'pbo', mission.getFullName() + '.pbo'), {
base: resolve(mission.getWorkDir(), 'pbo') // Change base dir to have correct relative paths in ZIP
})
)
.pipe(gulpZip(
mission.getFullName() + '.zip'
))
.pipe(gulp.dest(mission.getWorkDir()))
});
}
// Main tasks
gulp.task('clean', () => {
return gulp.src(paths.workDir)
.pipe(vinylPaths(del));
});
gulp.task('build', gulp.series(taskNames));
gulp.task('pbo', gulp.series(taskNamesPbo));
gulp.task('zip', gulp.series(taskNamesZip));
gulp.task('default',
gulp.series(
gulp.task('build'),
gulp.task('pbo'),
gulp.task('zip'),
)
);