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:
@@ -1,35 +1,30 @@
|
||||
import path from 'path';
|
||||
import fs from 'fs';
|
||||
|
||||
type GeneratedScript = {
|
||||
lang: string;
|
||||
filename: string;
|
||||
pluginScript: string;
|
||||
};
|
||||
// type GeneratedScript = {
|
||||
// lang: string;
|
||||
// filename: string;
|
||||
// pluginScript: string;
|
||||
// };
|
||||
|
||||
export type ScrpitGeneratorFunction = (name: string) => GeneratedScript[];
|
||||
// export type ScrpitGeneratorFunction = () => GeneratedScript[];
|
||||
|
||||
const isScriptGenerator = (s: unknown): s is ScrpitGeneratorFunction => {
|
||||
const isScriptGenerator = s => {
|
||||
return !!s && typeof s === 'function';
|
||||
};
|
||||
|
||||
const generate = async (name: string): Promise<boolean> => {
|
||||
const generate = async name => {
|
||||
try {
|
||||
const generateAll: ScrpitGeneratorFunction | unknown = require(
|
||||
`./${name}/generator`,
|
||||
).generateAll;
|
||||
const generateAll = (await import(`./${name}/generator.js`)).generateAll;
|
||||
if (!isScriptGenerator(generateAll)) return false;
|
||||
const sources = generateAll(name);
|
||||
const sources = generateAll();
|
||||
for (let source of sources) {
|
||||
const { lang, filename, pluginScript } = source;
|
||||
if (!lang || !filename || !pluginScript) {
|
||||
console.warn(name, ': lang, filename, pluginScript are required!');
|
||||
continue;
|
||||
}
|
||||
const pluginsDir = path.join(
|
||||
path.dirname(path.dirname(__dirname)),
|
||||
'plugins',
|
||||
);
|
||||
const pluginsDir = './src/plugins';
|
||||
const filePath = path.join(
|
||||
pluginsDir,
|
||||
lang.toLowerCase(),
|
||||
@@ -39,17 +34,19 @@ const generate = async (name: string): Promise<boolean> => {
|
||||
}
|
||||
return true;
|
||||
} catch (e) {
|
||||
console.log(`${name} is broken! ${e}`);
|
||||
console.log(`${name} is broken! ${e}\n`);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
const MULTISRC_DIR = './scripts/multisrc';
|
||||
|
||||
const run = async () => {
|
||||
const sources = fs
|
||||
.readdirSync(__dirname)
|
||||
.readdirSync(MULTISRC_DIR)
|
||||
.filter(
|
||||
name =>
|
||||
fs.lstatSync(path.join(__dirname, name)).isDirectory() &&
|
||||
fs.lstatSync(path.join(MULTISRC_DIR, name)).isDirectory() &&
|
||||
!name.endsWith('.broken'),
|
||||
);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import * as fs from 'fs';
|
||||
import * as cheerio from 'cheerio';
|
||||
import * as path from 'path';
|
||||
import list from './sources.json';
|
||||
import list from './sources.json' with { type: 'json' };
|
||||
import { HotNovelPubMetadata } from './template';
|
||||
|
||||
async function getFilters(sources: HotNovelPubMetadata) {
|
||||
|
||||
+18
-13
@@ -1,11 +1,16 @@
|
||||
import { FilterTypes, Filters } from '../../../libs/filterInputs';
|
||||
import { ScrpitGeneratorFunction } from '../generate';
|
||||
import list from './sources.json';
|
||||
import { HotNovelPubMetadata } from './template';
|
||||
import list from './sources.json' with { type: 'json' };
|
||||
import { readFileSync } from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
const lang: { [key: string]: string } = {
|
||||
const FilterTypes = {
|
||||
TextInput: 'Text',
|
||||
Picker: 'Picker',
|
||||
CheckboxGroup: 'Checkbox',
|
||||
Switch: 'Switch',
|
||||
ExcludableCheckboxGroup: 'XCheckbox',
|
||||
};
|
||||
|
||||
const lang = {
|
||||
en: 'english',
|
||||
ru: 'russian',
|
||||
es: 'spanish',
|
||||
@@ -13,12 +18,12 @@ const lang: { [key: string]: string } = {
|
||||
th: 'turkish',
|
||||
};
|
||||
|
||||
export const generateAll: ScrpitGeneratorFunction = function (name) {
|
||||
export const generateAll = function () {
|
||||
return list
|
||||
.map<HotNovelPubMetadata>(p => {
|
||||
const filters: Filters = {};
|
||||
.map(p => {
|
||||
const filters = {};
|
||||
for (const k in p.filters) {
|
||||
const f = p.filters[k as keyof typeof p.filters];
|
||||
const f = p.filters[k];
|
||||
if (f) {
|
||||
filters[k] = {
|
||||
...f,
|
||||
@@ -28,15 +33,15 @@ export const generateAll: ScrpitGeneratorFunction = function (name) {
|
||||
}
|
||||
return { ...p, filters };
|
||||
})
|
||||
.map((metadata: HotNovelPubMetadata) => {
|
||||
console.log(`[${name}]: Generating`, metadata.id);
|
||||
.map(metadata => {
|
||||
console.log(`[hotnovelpub]: Generating`, metadata.id);
|
||||
return generator(metadata);
|
||||
});
|
||||
};
|
||||
|
||||
const generator = function generator(metadata: HotNovelPubMetadata) {
|
||||
const generator = function generator(metadata) {
|
||||
const HotNovelPubTemplate = readFileSync(
|
||||
path.join(__dirname, 'template.ts'),
|
||||
'./scripts/multisrc/hotnovelpub/template.ts',
|
||||
{
|
||||
encoding: 'utf-8',
|
||||
},
|
||||
@@ -0,0 +1,36 @@
|
||||
import list from './sources.json' with { type: 'json' };
|
||||
import defaultSettings from './settings.json' with { type: 'json' };
|
||||
import { readFileSync } from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
export const generateAll = function () {
|
||||
return list.map(metadata => {
|
||||
metadata.filters = Object.assign(defaultSettings.filters, metadata.filters);
|
||||
console.log(`[ifreedom]: Generating`, metadata.id);
|
||||
return generator(metadata);
|
||||
});
|
||||
};
|
||||
|
||||
const generator = function generator(metadata) {
|
||||
const IfreedomTemplate = readFileSync(
|
||||
'./scripts/multisrc/ifreedom/template.ts',
|
||||
{
|
||||
encoding: 'utf-8',
|
||||
},
|
||||
);
|
||||
|
||||
const pluginScript = `
|
||||
${IfreedomTemplate}
|
||||
const plugin = new IfreedomPlugin(${JSON.stringify(metadata).replace(
|
||||
/"type":"([^"]+)"/g,
|
||||
'"type":FilterTypes.$1',
|
||||
)});
|
||||
export default plugin;
|
||||
`.trim();
|
||||
|
||||
return {
|
||||
lang: 'russian',
|
||||
filename: metadata.sourceName,
|
||||
pluginScript,
|
||||
};
|
||||
};
|
||||
@@ -1,36 +0,0 @@
|
||||
import { Filters } from '../../../libs/filterInputs';
|
||||
import { ScrpitGeneratorFunction } from '../generate';
|
||||
import list from './sources.json';
|
||||
import defaultSettings from './settings.json';
|
||||
import { IfreedomMetadata } from './template';
|
||||
import { readFileSync } from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
export const generateAll: ScrpitGeneratorFunction = function (name) {
|
||||
return list.map((metadata: IfreedomMetadata) => {
|
||||
metadata.filters = Object.assign(defaultSettings.filters, metadata.filters);
|
||||
console.log(`[${name}]: Generating`, metadata.id);
|
||||
return generator(metadata);
|
||||
});
|
||||
};
|
||||
|
||||
const generator = function generator(metadata: IfreedomMetadata) {
|
||||
const IfreedomTemplate = readFileSync(path.join(__dirname, 'template.ts'), {
|
||||
encoding: 'utf-8',
|
||||
});
|
||||
|
||||
const pluginScript = `
|
||||
${IfreedomTemplate}
|
||||
const plugin = new IfreedomPlugin(${JSON.stringify(metadata).replace(
|
||||
/"type":"([^"]+)"/g,
|
||||
'"type":FilterTypes.$1',
|
||||
)});
|
||||
export default plugin;
|
||||
`.trim();
|
||||
|
||||
return {
|
||||
lang: 'russian',
|
||||
filename: metadata.sourceName,
|
||||
pluginScript,
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,37 @@
|
||||
import list from './sources.json' with { type: 'json' };
|
||||
import { readFileSync } from 'fs';
|
||||
|
||||
export const generateAll = function () {
|
||||
return list.map(source => {
|
||||
let filters = {};
|
||||
try {
|
||||
filters = require(`./filters/${source.id}`);
|
||||
source.filters = filters.filters;
|
||||
} catch (e) {}
|
||||
console.log(
|
||||
`[lightnovelworld] Generating: ${source.id}${' '.repeat(20 - source.id.length)} ${source.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`,
|
||||
);
|
||||
return generator(source);
|
||||
});
|
||||
};
|
||||
|
||||
const generator = function generator(source) {
|
||||
const LightNovelWPTemplate = readFileSync(
|
||||
'./scripts/multisrc/lightnovelworld/template.ts',
|
||||
{
|
||||
encoding: 'utf-8',
|
||||
},
|
||||
);
|
||||
|
||||
const pluginScript = `
|
||||
${LightNovelWPTemplate}
|
||||
const plugin = new LightNovelWorld(${JSON.stringify(source)});
|
||||
export default plugin;
|
||||
`.trim();
|
||||
|
||||
return {
|
||||
lang: source.options?.lang || 'English',
|
||||
filename: source.sourceName,
|
||||
pluginScript,
|
||||
};
|
||||
};
|
||||
@@ -1,40 +0,0 @@
|
||||
import { ScrpitGeneratorFunction } from '../generate';
|
||||
import { LightNovelWorldMetadata } from './template';
|
||||
import list from './sources.json';
|
||||
import { readFileSync } from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
export const generateAll: ScrpitGeneratorFunction = function (name) {
|
||||
return list.map((source: LightNovelWorldMetadata) => {
|
||||
let filters: any = {};
|
||||
try {
|
||||
filters = require(`./filters/${source.id}`);
|
||||
source.filters = filters.filters;
|
||||
} catch (e) {}
|
||||
console.log(
|
||||
`[${name}] Generating: ${source.id}${' '.repeat(20 - source.id.length)} ${source.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`,
|
||||
);
|
||||
return generator(source);
|
||||
});
|
||||
};
|
||||
|
||||
const generator = function generator(source: LightNovelWorldMetadata) {
|
||||
const LightNovelWPTemplate = readFileSync(
|
||||
path.join(__dirname, 'template.ts'),
|
||||
{
|
||||
encoding: 'utf-8',
|
||||
},
|
||||
);
|
||||
|
||||
const pluginScript = `
|
||||
${LightNovelWPTemplate}
|
||||
const plugin = new LightNovelWorld(${JSON.stringify(source)});
|
||||
export default plugin;
|
||||
`.trim();
|
||||
|
||||
return {
|
||||
lang: source.options?.lang || 'English',
|
||||
filename: source.sourceName,
|
||||
pluginScript,
|
||||
};
|
||||
};
|
||||
+7
-10
@@ -1,26 +1,23 @@
|
||||
import { ScrpitGeneratorFunction } from '../generate';
|
||||
import { LightNovelWPMetadata } from './template';
|
||||
import list from './sources.json';
|
||||
import list from './sources.json' with { type: 'json' };
|
||||
import { readFileSync } from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
export const generateAll: ScrpitGeneratorFunction = function (name) {
|
||||
return list.map((source: LightNovelWPMetadata) => {
|
||||
let filters: any = {};
|
||||
export const generateAll = function () {
|
||||
return list.map(source => {
|
||||
let filters = {};
|
||||
try {
|
||||
filters = require(`./filters/${source.id}`);
|
||||
source.filters = filters.filters;
|
||||
} catch (e) {}
|
||||
console.log(
|
||||
`[${name}] Generating: ${source.id}${' '.repeat(20 - source.id.length)} ${source.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`,
|
||||
`[lightnovelwp] Generating: ${source.id}${' '.repeat(20 - source.id.length)} ${source.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`,
|
||||
);
|
||||
return generator(source);
|
||||
});
|
||||
};
|
||||
|
||||
const generator = function generator(source: LightNovelWPMetadata) {
|
||||
const generator = function generator(source) {
|
||||
const LightNovelWPTemplate = readFileSync(
|
||||
path.join(__dirname, 'template.ts'),
|
||||
'./scripts/multisrc/lightnovelwp/template.ts',
|
||||
{
|
||||
encoding: 'utf-8',
|
||||
},
|
||||
@@ -0,0 +1,33 @@
|
||||
import list from './sources.json' with { type: 'json' };
|
||||
import { readFileSync } from 'fs';
|
||||
|
||||
export const generateAll = function () {
|
||||
return list.map(metadata => {
|
||||
let filters = {};
|
||||
try {
|
||||
filters = require(`./filters/${metadata.id}`);
|
||||
metadata.filters = filters.filters;
|
||||
} catch (e) {}
|
||||
console.log(
|
||||
`[madara] Generating: ${metadata.id}${' '.repeat(20 - metadata.id.length)} ${metadata.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`,
|
||||
);
|
||||
return generator(metadata);
|
||||
});
|
||||
};
|
||||
|
||||
const generator = function generator(metadata) {
|
||||
const madaraTemplate = readFileSync('./scripts/multisrc/madara/template.ts', {
|
||||
encoding: 'utf-8',
|
||||
});
|
||||
|
||||
const pluginScript = `
|
||||
${madaraTemplate}
|
||||
const plugin = new MadaraPlugin(${JSON.stringify(metadata)});
|
||||
export default plugin;
|
||||
`.trim();
|
||||
return {
|
||||
lang: metadata.options?.lang || 'English',
|
||||
filename: metadata.sourceName,
|
||||
pluginScript,
|
||||
};
|
||||
};
|
||||
@@ -1,37 +0,0 @@
|
||||
import { FilterTypes, Filters } from '../../../libs/filterInputs';
|
||||
import { ScrpitGeneratorFunction } from '../generate';
|
||||
import list from './sources.json';
|
||||
import { MadaraMetadata } from './template';
|
||||
import { readFileSync } from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
export const generateAll: ScrpitGeneratorFunction = function (name) {
|
||||
return list.map((metadata: MadaraMetadata) => {
|
||||
let filters: any = {};
|
||||
try {
|
||||
filters = require(`./filters/${metadata.id}`);
|
||||
metadata.filters = filters.filters;
|
||||
} catch (e) {}
|
||||
console.log(
|
||||
`[${name}] Generating: ${metadata.id}${' '.repeat(20 - metadata.id.length)} ${metadata.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`,
|
||||
);
|
||||
return generator(metadata);
|
||||
});
|
||||
};
|
||||
|
||||
const generator = function generator(metadata: MadaraMetadata) {
|
||||
const madaraTemplate = readFileSync(path.join(__dirname, 'template.ts'), {
|
||||
encoding: 'utf-8',
|
||||
});
|
||||
|
||||
const pluginScript = `
|
||||
${madaraTemplate}
|
||||
const plugin = new MadaraPlugin(${JSON.stringify(metadata)});
|
||||
export default plugin;
|
||||
`.trim();
|
||||
return {
|
||||
lang: metadata.options?.lang || 'English',
|
||||
filename: metadata.sourceName,
|
||||
pluginScript,
|
||||
};
|
||||
};
|
||||
+6
-8
@@ -1,22 +1,20 @@
|
||||
import { readFileSync } from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
import list from './sources.json';
|
||||
import { ReadNovelFullMetadata } from './template';
|
||||
import { ScrpitGeneratorFunction } from '../generate';
|
||||
import list from './sources.json' with { type: 'json' };
|
||||
|
||||
export const generateAll: ScrpitGeneratorFunction = function (name) {
|
||||
return list.map((metadata: ReadNovelFullMetadata) => {
|
||||
export const generateAll = function () {
|
||||
return list.map(metadata => {
|
||||
console.log(
|
||||
`[${name}] Generating: ${metadata.id}${' '.repeat(20 - metadata.id.length)}`,
|
||||
`[readnovelfull] Generating: ${metadata.id}${' '.repeat(20 - metadata.id.length)}`,
|
||||
);
|
||||
return generator(metadata);
|
||||
});
|
||||
};
|
||||
|
||||
const generator = function generator(metadata: ReadNovelFullMetadata) {
|
||||
const generator = function generator(metadata) {
|
||||
const readNovelFullTemplate = readFileSync(
|
||||
path.join(__dirname, 'template.ts'),
|
||||
'./scripts/multisrc/readnovelfull/template.ts',
|
||||
{ encoding: 'utf-8' },
|
||||
);
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
import list from './sources.json' with { type: 'json' };
|
||||
import { readFileSync } from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
export const generateAll = function () {
|
||||
return list.map(metadata => {
|
||||
try {
|
||||
const { filters } = require(`./filters/${metadata.id}`);
|
||||
metadata.filters = filters;
|
||||
} catch (e) {}
|
||||
console.log(
|
||||
`[readwn] Generating: ${metadata.id}${' '.repeat(20 - metadata.id.length)} ${metadata.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`,
|
||||
);
|
||||
return generator(metadata);
|
||||
});
|
||||
};
|
||||
|
||||
const generator = function generator(metadata) {
|
||||
const readwnTemplate = readFileSync('./scripts/multisrc/readwn/template.ts', {
|
||||
encoding: 'utf-8',
|
||||
});
|
||||
|
||||
const pluginScript = `
|
||||
${readwnTemplate}
|
||||
const plugin = new ReadwnPlugin(${JSON.stringify(metadata)});
|
||||
export default plugin;
|
||||
`.trim();
|
||||
|
||||
return {
|
||||
lang: 'english',
|
||||
filename: metadata.sourceName,
|
||||
pluginScript,
|
||||
};
|
||||
};
|
||||
@@ -1,36 +0,0 @@
|
||||
import { ScrpitGeneratorFunction } from '../generate';
|
||||
import { ReadwnMetadata } from './template';
|
||||
import list from './sources.json';
|
||||
import { readFileSync } from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
export const generateAll: ScrpitGeneratorFunction = function (name) {
|
||||
return list.map((metadata: ReadwnMetadata) => {
|
||||
try {
|
||||
const { filters }: any = require(`./filters/${metadata.id}`);
|
||||
metadata.filters = filters;
|
||||
} catch (e) {}
|
||||
console.log(
|
||||
`[${name}] Generating: ${metadata.id}${' '.repeat(20 - metadata.id.length)} ${metadata.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`,
|
||||
);
|
||||
return generator(metadata);
|
||||
});
|
||||
};
|
||||
|
||||
const generator = function generator(metadata: ReadwnMetadata) {
|
||||
const readwnTemplate = readFileSync(path.join(__dirname, 'template.ts'), {
|
||||
encoding: 'utf-8',
|
||||
});
|
||||
|
||||
const pluginScript = `
|
||||
${readwnTemplate}
|
||||
const plugin = new ReadwnPlugin(${JSON.stringify(metadata)});
|
||||
export default plugin;
|
||||
`.trim();
|
||||
|
||||
return {
|
||||
lang: 'english',
|
||||
filename: metadata.sourceName,
|
||||
pluginScript,
|
||||
};
|
||||
};
|
||||
@@ -1,40 +1,44 @@
|
||||
import { Filters, FilterTypes } from '../../../libs/filterInputs';
|
||||
import { ScrpitGeneratorFunction } from '../generate';
|
||||
import list from './sources.json';
|
||||
import defaultSettings from './settings.json';
|
||||
import { RulateMetadata } from './template';
|
||||
import list from './sources.json' with { type: 'json' };
|
||||
import defaultSettings from './settings.json' with { type: 'json' };
|
||||
import { readFileSync } from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
export const generateAll: ScrpitGeneratorFunction = function (name) {
|
||||
const FilterTypes = {
|
||||
TextInput: 'Text',
|
||||
Picker: 'Picker',
|
||||
CheckboxGroup: 'Checkbox',
|
||||
Switch: 'Switch',
|
||||
ExcludableCheckboxGroup: 'XCheckbox',
|
||||
};
|
||||
|
||||
export const generateAll = function () {
|
||||
return list
|
||||
.map<RulateMetadata>(p => {
|
||||
.map(p => {
|
||||
if (p.filters) {
|
||||
p.filters.cat.options.unshift(...defaultSettings.filters.cat.options);
|
||||
}
|
||||
p.filters = Object.assign(defaultSettings.filters, p.filters);
|
||||
|
||||
let d = false;
|
||||
const filters: any = {};
|
||||
const filters = {};
|
||||
for (const k in p.filters) {
|
||||
const f = p.filters[k as keyof typeof p.filters];
|
||||
const f = p.filters[k];
|
||||
if (f) {
|
||||
filters[k] = {
|
||||
...f,
|
||||
type: FilterTypes[f.type as keyof typeof FilterTypes],
|
||||
type: FilterTypes[f.type],
|
||||
};
|
||||
}
|
||||
}
|
||||
return { ...p, filters: d ? undefined : filters };
|
||||
})
|
||||
.map((metadata: RulateMetadata) => {
|
||||
console.log(`[${name}]: Generating`, metadata.id);
|
||||
.map(metadata => {
|
||||
console.log(`[rulate]: Generating`, metadata.id);
|
||||
return generator(metadata);
|
||||
});
|
||||
};
|
||||
|
||||
const generator = function generator(metadata: RulateMetadata) {
|
||||
const rulateTemplate = readFileSync(path.join(__dirname, 'template.ts'), {
|
||||
const generator = function generator(metadata) {
|
||||
const rulateTemplate = readFileSync('./scripts/multisrc/rulate/template.ts', {
|
||||
encoding: 'utf-8',
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user