mirror of
https://github.com/AIsouler/GKD_subscription.git
synced 2025-12-19 16:25:09 +08:00
feat: 规则分类+全局规则组
This commit is contained in:
55
src/file.ts
55
src/file.ts
@@ -3,19 +3,14 @@ import fs from 'node:fs/promises';
|
||||
import path from 'node:path';
|
||||
import type PkgT from '../package.json';
|
||||
import { parseSelector } from './selector';
|
||||
import type {
|
||||
AppConfig,
|
||||
GroupConfig,
|
||||
IArray,
|
||||
SubscriptionConfig,
|
||||
} from './types';
|
||||
import type { RawApp, RawAppGroup, IArray, RawSubscription } from './types';
|
||||
import JSON5 from 'json5';
|
||||
|
||||
const iArrayToArray = <T>(array: IArray<T> = []): T[] => {
|
||||
return Array<T>().concat(array);
|
||||
};
|
||||
|
||||
const sortKeys: (keyof SubscriptionConfig)[] = [
|
||||
const sortKeys: (keyof RawSubscription)[] = [
|
||||
'id',
|
||||
'name',
|
||||
'version',
|
||||
@@ -61,14 +56,14 @@ const pkg: typeof PkgT = JSON.parse(
|
||||
);
|
||||
const pkgKeys = Object.keys(pkg);
|
||||
|
||||
export const writeConfig = async (config: SubscriptionConfig) => {
|
||||
export const writeConfig = async (config: RawSubscription) => {
|
||||
const gkdFp = process.cwd() + '/dist/gkd.json5';
|
||||
const versionFp = process.cwd() + '/dist/gkd.version.json';
|
||||
const oldConfig: SubscriptionConfig = JSON5.parse(
|
||||
const oldConfig: RawSubscription = JSON5.parse(
|
||||
await fs.readFile(gkdFp, 'utf-8').catch(() => '{}'),
|
||||
);
|
||||
|
||||
const newConfig: SubscriptionConfig = {
|
||||
const newConfig: RawSubscription = {
|
||||
...config,
|
||||
version: oldConfig.version || 0,
|
||||
};
|
||||
@@ -137,7 +132,7 @@ export const validSnapshotUrl = (s: string) => {
|
||||
return u.pathname.startsWith('/import/');
|
||||
};
|
||||
|
||||
export const checkConfig = (newConfig: SubscriptionConfig) => {
|
||||
export const checkConfig = (newConfig: RawSubscription) => {
|
||||
// check duplicated group key
|
||||
newConfig.apps?.forEach((app) => {
|
||||
const deprecatedKeys = app.deprecatedKeys || [];
|
||||
@@ -246,7 +241,7 @@ export const checkConfig = (newConfig: SubscriptionConfig) => {
|
||||
});
|
||||
});
|
||||
});
|
||||
const newKeys = Object.keys(newConfig) as (keyof SubscriptionConfig)[];
|
||||
const newKeys = Object.keys(newConfig) as (keyof RawSubscription)[];
|
||||
if (newKeys.some((s) => !sortKeys.includes(s))) {
|
||||
console.log({
|
||||
sortKeys,
|
||||
@@ -256,7 +251,7 @@ export const checkConfig = (newConfig: SubscriptionConfig) => {
|
||||
}
|
||||
};
|
||||
|
||||
export const updateAppMd = async (app: AppConfig) => {
|
||||
export const updateAppMd = async (app: RawApp) => {
|
||||
const appHeadMdText = [
|
||||
`# ${app.name}`,
|
||||
`存在 ${app.groups?.length || 0} 规则组 - [${app.id}](/src/apps/${
|
||||
@@ -322,14 +317,14 @@ export const updateAppMd = async (app: AppConfig) => {
|
||||
};
|
||||
|
||||
const getAppDiffLog = (
|
||||
oldGroups: GroupConfig[] = [],
|
||||
newGroups: GroupConfig[] = [],
|
||||
oldGroups: RawAppGroup[] = [],
|
||||
newGroups: RawAppGroup[] = [],
|
||||
) => {
|
||||
const removeGroups = oldGroups.filter(
|
||||
(og) => !newGroups.find((ng) => ng.key == og.key),
|
||||
);
|
||||
const addGroups: GroupConfig[] = [];
|
||||
const changeGroups: GroupConfig[] = [];
|
||||
const addGroups: RawAppGroup[] = [];
|
||||
const changeGroups: RawAppGroup[] = [];
|
||||
newGroups.forEach((ng) => {
|
||||
const oldGroup = oldGroups.find((og) => og.key == ng.key);
|
||||
if (oldGroup) {
|
||||
@@ -348,21 +343,21 @@ const getAppDiffLog = (
|
||||
};
|
||||
|
||||
type AppDiff = {
|
||||
app: AppConfig;
|
||||
addGroups: GroupConfig[];
|
||||
changeGroups: GroupConfig[];
|
||||
removeGroups: GroupConfig[];
|
||||
app: RawApp;
|
||||
addGroups: RawAppGroup[];
|
||||
changeGroups: RawAppGroup[];
|
||||
removeGroups: RawAppGroup[];
|
||||
};
|
||||
|
||||
export const updateReadMeMd = async (
|
||||
newConfig: SubscriptionConfig,
|
||||
oldConfig: SubscriptionConfig,
|
||||
newConfig: RawSubscription,
|
||||
oldConfig: RawSubscription,
|
||||
) => {
|
||||
let changeCount = 0;
|
||||
const appDiffs: AppDiff[] = [];
|
||||
await Promise.all(
|
||||
newConfig.apps.map(async (app) => {
|
||||
const oldApp = oldConfig.apps.find((a) => a.id == app.id);
|
||||
newConfig.apps!.map(async (app) => {
|
||||
const oldApp = oldConfig.apps!.find((a) => a.id == app.id);
|
||||
if (!_.isEqual(oldApp, app)) {
|
||||
changeCount++;
|
||||
await updateAppMd(app);
|
||||
@@ -423,19 +418,19 @@ export const updateReadMeMd = async (
|
||||
|
||||
const appListText =
|
||||
'| 名称 | ID | 规则组 |\n| - | - | - |\n' +
|
||||
newConfig.apps
|
||||
.map((app) => {
|
||||
newConfig
|
||||
.apps!.map((app) => {
|
||||
const groups = app.groups || [];
|
||||
return `| ${app.name} | [${app.id}](/docs/${app.id}.md) | ${groups.length} |`;
|
||||
})
|
||||
.join('\n');
|
||||
const mdTemplate = await fs.readFile(process.cwd() + '/Template.md', 'utf-8');
|
||||
const readMeMdText = mdTemplate
|
||||
.replaceAll('--APP_SIZE--', newConfig.apps.length.toString())
|
||||
.replaceAll('--APP_SIZE--', newConfig.apps!.length.toString())
|
||||
.replaceAll(
|
||||
'--GROUP_SIZE--',
|
||||
newConfig.apps
|
||||
.reduce((p, c) => p + (c.groups?.length || 0), 0)
|
||||
newConfig
|
||||
.apps!.reduce((p, c) => p + (c.groups?.length || 0), 0)
|
||||
.toString(),
|
||||
)
|
||||
.replaceAll('--VERSION--', (newConfig.version || 0).toString());
|
||||
|
||||
Reference in New Issue
Block a user