Feat: Vite + React (#991)
* remove test_web * integrate reactjs-vite * update lint-staged * simple cors proxy server which handles cookies and redirections * overrider global fetch with proxy call * simple examples for set cookies and fetch request * app bar * add redux * loadPlugins. error: cant load urlencode module * add ts-node for transforming * plugin search & select * plugin slice * accordion components * path item & popular novel * optional for filters * search novel * parse novel * parseChapter * update cookies * default filters * fix: import path * bundler module resolution * new json_plugins * fix: generate multisrc (missing filters) * fix: host scripts * fix: plugin code path * remove typechecking action
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
import path from 'path';
|
||||
import fs from 'fs';
|
||||
import { exit } from 'process';
|
||||
import languages from './languages.js';
|
||||
import { execSync } from 'child_process';
|
||||
import { minify } from './terser.js';
|
||||
|
||||
const REMOTE = execSync('git remote get-url origin')
|
||||
.toString()
|
||||
.replace(/[\s\n]/g, '');
|
||||
const CURRENT_BRANCH = execSync('git branch --show-current')
|
||||
.toString()
|
||||
.replace(/[\s\n]/g, '');
|
||||
const matched = REMOTE.match(/([^:/]+?)\/([^/.]+)(\.git)?$/);
|
||||
if (!matched) throw Error('Cant parse git url');
|
||||
const USERNAME = matched[1];
|
||||
const REPO = matched[2];
|
||||
const USER_CONTENT_LINK = `https://raw.githubusercontent.com/${USERNAME}/${REPO}/${CURRENT_BRANCH}`;
|
||||
|
||||
const ICON_LINK = `${USER_CONTENT_LINK}/public/icons`;
|
||||
const PLUGIN_LINK = `${USER_CONTENT_LINK}/.js/src/plugins`;
|
||||
|
||||
const DIST_DIR = '.dist';
|
||||
|
||||
const json = [];
|
||||
if (!fs.existsSync(DIST_DIR)) {
|
||||
fs.mkdirSync(DIST_DIR);
|
||||
}
|
||||
const jsonPath = path.join(DIST_DIR, 'plugins.json');
|
||||
const jsonMinPath = path.join(DIST_DIR, 'plugins.min.json');
|
||||
const pluginSet = new Set();
|
||||
let totalPlugins = 0;
|
||||
|
||||
const createRecursiveProxy = () => {
|
||||
const target = {};
|
||||
const handler = {
|
||||
get(target, prop) {
|
||||
if (prop === 'get') {
|
||||
return a => a;
|
||||
}
|
||||
if (!target[prop]) {
|
||||
target[prop] = createRecursiveProxy();
|
||||
}
|
||||
return target[prop];
|
||||
},
|
||||
};
|
||||
return new Proxy(target, handler);
|
||||
};
|
||||
|
||||
const proxy = createRecursiveProxy();
|
||||
|
||||
const _require = () => proxy;
|
||||
|
||||
const COMPILED_PLUGIN_DIR = './.js/src/plugins';
|
||||
|
||||
for (let language in languages) {
|
||||
// language with English name
|
||||
const langPath = path.join(COMPILED_PLUGIN_DIR, language.toLowerCase());
|
||||
if (!fs.existsSync(langPath)) continue;
|
||||
const plugins = fs.readdirSync(langPath);
|
||||
plugins.forEach(plugin => {
|
||||
if (plugin.startsWith('.')) return;
|
||||
minify(path.join(langPath, plugin));
|
||||
const rawCode = fs.readFileSync(
|
||||
`${COMPILED_PLUGIN_DIR}/${language.toLowerCase()}/${plugin}`,
|
||||
'utf-8',
|
||||
);
|
||||
const instance = Function(
|
||||
'require',
|
||||
'module',
|
||||
`const exports = module.exports = {};
|
||||
${rawCode};
|
||||
return exports.default`,
|
||||
)(_require, {});
|
||||
const { id, name, site, version, icon } = instance;
|
||||
const normalisedName = name.replace(/\[.*\]/, '');
|
||||
|
||||
const info = {
|
||||
id,
|
||||
name: normalisedName,
|
||||
site,
|
||||
lang: languages[language],
|
||||
version,
|
||||
url: `${PLUGIN_LINK}/${language.toLowerCase()}/${plugin}`,
|
||||
iconUrl: `${ICON_LINK}/${icon || 'siteNotAvailable.png'}`,
|
||||
};
|
||||
|
||||
if (pluginSet.has(id)) {
|
||||
console.log("There's already a plugin with id:", id);
|
||||
throw new Error('2 or more plugins have the same id');
|
||||
} else {
|
||||
pluginSet.add(id);
|
||||
}
|
||||
json.push(info);
|
||||
totalPlugins += 1;
|
||||
console.log(name, '✅');
|
||||
});
|
||||
}
|
||||
|
||||
json.sort((a, b) => {
|
||||
if (a.lang === b.lang) return a.id.localeCompare(b.id);
|
||||
return 0;
|
||||
});
|
||||
|
||||
fs.writeFileSync(jsonMinPath, JSON.stringify(json));
|
||||
fs.writeFileSync(jsonPath, JSON.stringify(json, null, '\t'));
|
||||
fs.writeFileSync(
|
||||
'total.svg',
|
||||
`
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="80" height="20" role="img" aria-label="Plugins: ${totalPlugins}"><title>Plugins: ${totalPlugins}</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="80" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="49" height="20" fill="#555"/><rect x="49" width="31" height="20" fill="#007ec6"/><rect width="80" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="255" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="390">Plugins</text><text x="255" y="140" transform="scale(.1)" fill="#fff" textLength="390">Plugins</text><text aria-hidden="true" x="635" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="210">161</text><text x="635" y="140" transform="scale(.1)" fill="#fff" textLength="210">${totalPlugins}</text></g></svg>
|
||||
`,
|
||||
);
|
||||
|
||||
// check for broken plugins
|
||||
for (let language in languages) {
|
||||
const tsFiles = fs.readdirSync(
|
||||
path.join('./src/plugins', language.toLocaleLowerCase()),
|
||||
);
|
||||
tsFiles
|
||||
.filter(f => f.endsWith('.broken.ts'))
|
||||
.forEach(fn => {
|
||||
console.error(
|
||||
language.toLocaleLowerCase() +
|
||||
'/' +
|
||||
fn.replace('.broken.ts', '') +
|
||||
' ❌',
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
console.log(jsonPath);
|
||||
console.log('Done ✅');
|
||||
Reference in New Issue
Block a user