This commit is contained in:
Russell2259
2023-12-21 00:05:11 +00:00
parent 00f29e2595
commit d2882efcb0
25 changed files with 550 additions and 241 deletions
+64 -42
View File
@@ -92,43 +92,54 @@ const html = (data) => {
});
};
const javascript = (data) => {
const javascript = (data, filePath) => {
return new Promise((resolve, reject) => {
const imports = String(data).split('import ')
.map(data => data.split('from ')[1])
.filter(data => Boolean(data))
.map(data => data.split(';')[0]
.map(data => data.split('\n')[0]
.replaceAll('\'', '')
.replaceAll('`', '')
.replaceAll('"', ''))
.filter(data => fs.existsSync(path.join(__dirname, '../templates', data + '.javascript')));
.replaceAll('"', '')
.replaceAll(';', ''))
.map(data => {
if (data.startsWith('./')) return {
originalFile: data,
newFile: path.join(filePath.split('/').slice(0, -1).join('/'), data)
};
else if (data.startsWith('../')) return {
originalFile: data,
newFile: path.join(filePath.split('/').slice(0, -1).join('/'), data)
};
else return {
originalFile: data,
newFile: data
};
})
.filter(data => fs.existsSync(path.join(__dirname, '../static', data.newFile)));
let javascript = String(data);
if (config.assetScrambling) for (let i = 0; i < imports.length; i++) {
javascript = javascript.replace(imports[i], '/asset/' + TokenManager.generate('asset', 20000, {
asset: path.join(__dirname, '../static', imports[i]),
type: 'text/javascript'
}).token);
}
if (config.assetScrambling) for (let i = 0; i < imports.length; i++) javascript = javascript.replace(imports[i].originalFile, '/asset/' + TokenManager.generate('asset', 20000, {
asset: path.join(__dirname, '../static', imports[i].newFile),
type: 'text/javascript'
}).token);
if (config.minify) resolve(JavaScriptObfuscator.obfuscate(javascript,
{
compact: true,
controlFlowFlattening: true,
controlFlowFlatteningThreshold: 1,
numbersToExpressions: true,
simplify: true,
stringArrayShuffle: true,
splitStrings: true,
stringArrayThreshold: 1
}).getObfuscatedCode());
if (config.minify) resolve(JavaScriptObfuscator.obfuscate(javascript, {
compact: true,
controlFlowFlattening: true,
controlFlowFlatteningThreshold: 1,
numbersToExpressions: true,
simplify: true,
stringArrayShuffle: true,
splitStrings: true,
stringArrayThreshold: 1
}).getObfuscatedCode());
else resolve(javascript);
});
};
const css = (data) => {
const css = (data, filePath) => {
return new Promise((resolve, reject) => {
const imports = String(data).split('url(')
.map(data => {
@@ -143,37 +154,48 @@ const css = (data) => {
else return undefined;
})
.filter(data => {
if (data) {
try {
new URL(data);
if (data) try {
new URL(data);
return false;
} catch (e) {
if (data.startsWith('/')) return true;
else return false;
}
return false;
} catch (e) {
return true;
} else return false;
})
.filter(data => fs.existsSync(path.join(__dirname, '../templates', data + mime.getExtension(data))));
.map(data => {
// console.log(path.join(filePath.split('/').slice(0, -1).join('/')));
if (data.startsWith('./')) return {
originalFile: data,
newFile: path.join(filePath.split('/').slice(0, -1).join('/'), data)
};
else if (data.startsWith('../')) return {
originalFile: data,
newFile: path.join(filePath.split('/').slice(0, -1).join('/'), data)
};
else return {
originalFile: data,
newFile: data
};
})
.filter(data => fs.existsSync(path.join(__dirname, '../static', data.newFile)));
let css = String(data);
if (config.assetScrambling) for (let i = 0; i < imports.length; i++) {
css = css.replace(imports[i], '/asset/' + TokenManager.generate('asset', 20000, {
asset: path.join(__dirname, '../static', imports[i]),
type: mime.getType(path.join(__dirname, '../static', imports[i]))
}).token);
}
if (config.assetScrambling) for (let i = 0; i < imports.length; i++) css = css.replace(imports[i].originalFile, '/asset/' + TokenManager.generate('asset', 20000, {
asset: path.join(__dirname, '../static', imports[i].newFile),
type: mime.getType(path.join(__dirname, '../static', imports[i].newFile))
}).token);
if (config.minify) resolve(css.replace(/(\r\n|\n|\r)/gm, '').replaceAll(' ', ' '));
else resolve(css);
});
};
const auto = async (data, type) => {
const auto = async (data, type, filePath) => {
if (type === 'text/html') return await html(data);
else if (type === 'text/javascript' || type === 'application/javascript') return await javascript(data);
else if (type === 'text/css') return await css(data);
else if (type === 'text/javascript' || type === 'application/javascript') return await javascript(data, filePath);
else if (type === 'text/css') return await css(data, filePath);
else return data;
};