You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
vizality/injector/ipc.js

105 lines
2.8 KiB

const { relative, join, dirname, posix, sep, resolve } = require('path');
const { existsSync, promises: { readFile } } = require('fs');
const { ipcMain, BrowserWindow } = require('electron');
const { renderSync } = require('sass');
/**
*
* @param {*} evt
* @param {*} opts
* @param {*} externalWindow
*/
function openDevTools (evt, opts, externalWindow) {
evt.sender.openDevTools(opts);
if (externalWindow) {
let devToolsWindow = new BrowserWindow({
webContents: evt.sender.devToolsWebContents
});
devToolsWindow.on('ready-to-show', () => devToolsWindow.show());
devToolsWindow.on('close', () => {
evt.sender.closeDevTools();
devToolsWindow = null;
});
}
}
/**
*
* @param {*} evt
*/
function closeDevTools (evt) {
evt.sender.closeDevTools();
}
/**
*
* @param {*} evt
* @returns
*/
function clearCache (evt) {
return new Promise(resolve => {
evt.sender.session.clearCache(() => resolve(null));
});
}
/**
*
* @param {*} evt
* @returns
*/
function getHistory (evt) {
return evt.sender.history;
}
/**
*
* @param {*} _
* @param {*} file
* @returns
*/
function compileSass (_, file) {
return new Promise((res, reject) => {
readFile(file, 'utf8').then(rawScss => {
try {
const relativePath = relative(file, join(__dirname, '..', 'src', 'core', 'lib', 'sass'));
const absolutePath = resolve(join(file, relativePath));
const fixedScss = rawScss.replace('@vizality', absolutePath.split(sep).join(posix.sep));
const result = renderSync({
data: fixedScss,
importer: (url, prev) => {
if (url === '@vizality') {
url = url.replace('@vizality', absolutePath.split(sep).join(posix.sep));
}
url = url.replace('file:///', '');
if (existsSync(url)) {
return {
file: url
};
}
const prevFile =
prev === 'stdin'
? file
: prev.replace(/https?:\/\/(?:[a-z]+\.)?discord(?:app)?\.com/i, '');
return {
file: join(dirname(decodeURI(prevFile)), url).split(sep).join(posix.sep)
};
}
});
if (result) {
return res(result.css.toString());
}
} catch (err) {
return reject(err);
}
});
});
}
ipcMain.on('VIZALITY_GET_PRELOAD', evt => evt.returnValue = evt.sender._preload);
ipcMain.handle('VIZALITY_GET_HISTORY', getHistory);
ipcMain.handle('VIZALITY_OPEN_DEVTOOLS', openDevTools);
ipcMain.handle('VIZALITY_CLOSE_DEVTOOLS', closeDevTools);
ipcMain.handle('VIZALITY_CLEAR_CACHE', clearCache);
ipcMain.handle('VIZALITY_WINDOW_IS_MAXIMIZED', evt => BrowserWindow.fromWebContents(evt.sender).isMaximized());
ipcMain.handle('VIZALITY_COMPILE_SASS', compileSass);