mirror of
https://gitlab.com/SpaccInc/SpaccDotWeb.git
synced 2025-06-05 21:29:12 +02:00
[Alt] Add new methods; [Server] Slight improvements to example; [Build] Add full HTML build
This commit is contained in:
64
SpaccDotWeb.Build/node.js
Normal file
64
SpaccDotWeb.Build/node.js
Normal file
@ -0,0 +1,64 @@
|
||||
#!/usr/bin/env node
|
||||
const Lib = {
|
||||
fs: require('fs'),
|
||||
path: require('path'),
|
||||
mime: require('mime-types'),
|
||||
crypto: require('crypto'),
|
||||
babel: require('@babel/core'),
|
||||
uglify: require('uglify-js'),
|
||||
postcss: require('postcss'),
|
||||
postcssImport: require('postcss-import'),
|
||||
postcssUrl: require('postcss-url'),
|
||||
jsdom: require('jsdom').JSDOM,
|
||||
};
|
||||
let Build = require('./lib.js')(Lib);
|
||||
|
||||
const BuildScriptFile = (scriptFile, options) => {
|
||||
options = {
|
||||
forceResult: false,
|
||||
checkHash: true,
|
||||
outputFolder: './Build',
|
||||
...options };
|
||||
Lib.fs.mkdirSync(options.outputFolder, { recursive: true });
|
||||
const __scriptname = scriptFile.split('/').slice(-1)[0].split('.').slice(0, -1).join('.');
|
||||
const scriptText = Lib.fs.readFileSync(scriptFile, 'utf8');
|
||||
const compiledPath = `${options.outputFolder}/${__scriptname}.js`;
|
||||
const minifiedPath = `${options.outputFolder}/${__scriptname}.min.js`;
|
||||
const hashPath = `${options.outputFolder}/${__scriptname}.js.hash`;
|
||||
const hashOld = (Lib.fs.existsSync(hashPath) && Lib.fs.readFileSync(hashPath, 'utf8'));
|
||||
const hashNew = Lib.crypto.createHash('sha256').update(scriptText).digest('hex');
|
||||
if (!options.checkHash || !Lib.fs.existsSync(compiledPath) || !Lib.fs.existsSync(minifiedPath) || !(hashOld === hashNew)) {
|
||||
const builtScript = Build.BuildScript(scriptText, /* JSON.parse(Lib.fs.readFileSync(`${__dirname}/babel.config.json`, 'utf8')) */);
|
||||
Lib.fs.writeFileSync(compiledPath, builtScript.compiled);
|
||||
Lib.fs.writeFileSync(minifiedPath, builtScript.minified);
|
||||
Lib.fs.writeFileSync(hashPath, hashNew);
|
||||
return builtScript;
|
||||
}
|
||||
return { notice: `Target "${scriptFile}" is up-to-date.`, ...(options.forceResult && {
|
||||
compiled: Lib.fs.readFileSync(compiledPath, 'utf8'),
|
||||
minified: Lib.fs.readFileSync(minifiedPath, 'utf8'),
|
||||
}) };
|
||||
};
|
||||
|
||||
const BuildHtmlFile = (htmlFile, options) => {
|
||||
options = {
|
||||
outputFolder: './Build',
|
||||
outputFile: htmlFile,
|
||||
inputFolder: Lib.path.dirname(htmlFile),
|
||||
...options };
|
||||
const outputPath = `${options.outputFolder}/${options.outputFile}`;
|
||||
Build.BuildHtml(Lib.fs.readFileSync(htmlFile, 'utf8'), options).then(html => Lib.fs.writeFileSync(outputPath, html));
|
||||
return outputPath;
|
||||
};
|
||||
|
||||
const EncodeStaticFiles = (files, /* encoding='base64' */) => {
|
||||
const data = {};
|
||||
files.forEach(file => (data[file] = Build.fileToBase64(file)));
|
||||
return data;
|
||||
};
|
||||
|
||||
module.exports = Build = { ...Build, BuildScriptFile, BuildHtmlFile, EncodeStaticFiles };
|
||||
|
||||
if (require.main === module) {
|
||||
console.log(eval(process.argv.slice(-1)[0]));
|
||||
}
|
Reference in New Issue
Block a user