72 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| #!/usr/bin/env node
 | |
| 
 | |
| // This is a simple script used to build a mod package. The script will copy necessary files to the build directory
 | |
| // and compress the build directory into a zip file that can be easily shared.
 | |
| 
 | |
| const fs = require("fs-extra");
 | |
| const glob = require("glob");
 | |
| const zip = require('bestzip');
 | |
| const path = require("path");
 | |
| 
 | |
| // Load the package.json file to get some information about the package so we can name things appropriately. This is
 | |
| // atypical, and you would never do this in a production environment, but this script is only used for development so
 | |
| // it's fine in this case. Some of these values are stored in environment variables, but those differ between node
 | |
| // versions; the 'author' value is not available after node v14.
 | |
| const { author, name:packageName, version } = require("./package.json");
 | |
| 
 | |
| // Generate the name of the package, stripping out all non-alphanumeric characters in the 'author' and 'name'.
 | |
| const modName = `${author.replace(/[^a-z0-9]/gi, "")}-${packageName.replace(/[^a-z0-9]/gi, "")}-${version}`;
 | |
| console.log(`Generated package name: ${modName}`);
 | |
| 
 | |
| // Delete the old build directory and compressed package file.
 | |
| fs.rmSync(`${__dirname}/dist`, { force: true, recursive: true });
 | |
| console.log("Previous build files deleted.");
 | |
| 
 | |
| // Generate a list of files that should not be copied over into the distribution directory. This is a blacklist to ensure
 | |
| // we always copy over additional files and directories that authors may have added to their project. This may need to be
 | |
| // expanded upon by the mod author to allow for node modules that are used within the mod; example commented out below.
 | |
| const ignoreList = [
 | |
|     "node_modules/",
 | |
|     // "node_modules/!(weighted|glob)", // Instead of excluding the entire node_modules directory, allow two node modules.
 | |
|     "src/**/*.js",
 | |
|     "types/",
 | |
|     ".git/",
 | |
|     ".gitea/",
 | |
|     ".eslintignore",
 | |
|     ".eslintrc.json",
 | |
|     ".gitignore",
 | |
|     ".DS_Store",
 | |
|     "packageBuild.ts",
 | |
|     "mod.code-workspace",
 | |
|     "package-lock.json",
 | |
|     "tsconfig.json"
 | |
| ];
 | |
| const exclude = glob.sync(`{${ignoreList.join(",")}}`, { realpath: true, dot: true });
 | |
| 
 | |
| // For some reason these basic-bitch functions won't allow us to copy a directory into itself, so we have to resort to
 | |
| // using a temporary directory, like an idiot. Excuse the normalize spam; some modules cross-platform, some don't...
 | |
| fs.copySync(__dirname, path.normalize(`${__dirname}/../~${modName}`), {filter:(filePath) => 
 | |
| {
 | |
|     return !exclude.includes(filePath);
 | |
| }});
 | |
| fs.moveSync(path.normalize(`${__dirname}/../~${modName}`), path.normalize(`${__dirname}/${modName}`), { overwrite: true });
 | |
| fs.copySync(path.normalize(`${__dirname}/${modName}`), path.normalize(`${__dirname}/dist`));
 | |
| console.log("Build files copied.");
 | |
| 
 | |
| // Compress the files for easy distribution. The compressed file is saved into the dist directory. When uncompressed we
 | |
| // need to be sure that it includes a directory that the user can easily copy into their game mods directory.
 | |
| zip({
 | |
|     source: modName,
 | |
|     destination: `dist/${modName}.zip`,
 | |
|     cwd: __dirname
 | |
| }).catch(function(err)
 | |
| {
 | |
|     console.error("A bestzip error has occurred: ", err.stack);
 | |
| }).then(function()
 | |
| {
 | |
|     console.log(`Compressed mod package to: /dist/${modName}.zip`);
 | |
| 
 | |
|     // Now that we're done with the compression we can delete the temporary build directory.
 | |
|     fs.rmSync(`${__dirname}/${modName}`, { force: true, recursive: true });
 | |
|     console.log("Build successful! your zip file has been created and is ready to be uploaded to hub.sp-tarkov.com/files/");
 | |
| }); |