ModuleBuilder/src/preprocessors/pcPlugin.js

67 lines
2.1 KiB
JavaScript

import { join } from 'path';
import { readFileSync, writeFileSync, mkdirSync, rmSync } from 'fs';
import sass from 'sass';
import glob from 'glob';
export default (manifestPath, repo) => {
const baseDir = join(manifestPath, '..');
const pcManifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
let manifest = {
main: 'index.js',
tags: ['port'],
name: pcManifest.name,
description: pcManifest.description,
version: pcManifest.version,
authors: [ pcManifest.author ]
};
let content = readFileSync(pcManifest.main || 'index.js', 'utf8');//.replace(/\\/g, '\\\\').replace(/`/g, '\\`');
content = content.replace(`module.exports = `, `export default new `);
content = content.replace(/this\.loadStylesheet\(['"`](.*)['"`]\)/g, (_, relative) => {
const path = manifestPath.split('/').slice(0, -1).concat('').join('/') + relative;
let css;
if (path.split('.').pop() === 'scss') {
css = (sass.renderSync({ file: path })).css.toString('utf8');
} else {
css = readFileSync(path, 'utf8');
}
css = css.replace(/\\/g, '\\\\').replace(/\`/g, '\`'); // Escape backticks
return `this.loadStylesheet(\`${css}\`)`;
});
writeFileSync(join(baseDir, `index.js`), content);
for (const jsFile of glob.sync(`${baseDir}/**/*.{js,jsx,ts,tsx}`)) {
console.log(jsFile);
let content = readFileSync(jsFile, 'utf8');
/* Here we preappend some JS to each file to match context and fix some weird bundler bugs:
- Import our own Powercord global
- Fix dynamic imports (like using require("powercord/" + someVariable)) causing errors (due to no static analyse). Do this because some plugins use it for PC + VZ compat with the same JS
*/
content = `import powercord from '_powercord/global';
require.cache['powercord/entities'] = require('powercord/entities');
require.cache['powercord/components/settings'] = require('powercord/components/settings');
require.cache['powercord/webpack'] = require('powercord/webpack');
${content}`;
writeFileSync(jsFile, content);
}
writeFileSync(join(baseDir, `goosemodModule.json`), JSON.stringify(manifest));
return '';
};