setting
This commit is contained in:
@ -19,26 +19,26 @@ const userscriptsConfig = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const userscriptsRules = Object.fromEntries(
|
// const userscriptsRules = Object.fromEntries(
|
||||||
Object.keys(userscriptsConfig.rules).map((name) => {
|
// Object.keys(userscriptsConfig.rules).map((name) => {
|
||||||
const ruleName = name.split("/")[1];
|
// const ruleName = name.split("/")[1];
|
||||||
// eslint-disable-next-line import/no-dynamic-require, global-require
|
// // eslint-disable-next-line import/no-dynamic-require, global-require
|
||||||
const ruleMeta = require(`eslint-plugin-userscripts/lib/rules/${ruleName}.js`);
|
// const ruleMeta = require(`eslint-plugin-userscripts/lib/rules/${ruleName}.js`);
|
||||||
return [
|
// return [
|
||||||
name,
|
// name,
|
||||||
{
|
// {
|
||||||
...ruleMeta,
|
// ...ruleMeta,
|
||||||
meta: {
|
// meta: {
|
||||||
...ruleMeta.meta,
|
// ...ruleMeta.meta,
|
||||||
docs: {
|
// docs: {
|
||||||
...ruleMeta.meta.docs,
|
// ...ruleMeta.meta.docs,
|
||||||
url: `https://yash-singh1.github.io/eslint-plugin-userscripts/#/rules/${ruleName}`,
|
// url: `https://yash-singh1.github.io/eslint-plugin-userscripts/#/rules/${ruleName}`,
|
||||||
},
|
// },
|
||||||
},
|
// },
|
||||||
},
|
// },
|
||||||
];
|
// ];
|
||||||
})
|
// })
|
||||||
);
|
// );
|
||||||
|
|
||||||
// 默认规则
|
// 默认规则
|
||||||
const config = {
|
const config = {
|
||||||
@ -128,4 +128,4 @@ const config = {
|
|||||||
// 以文本形式导出默认规则
|
// 以文本形式导出默认规则
|
||||||
const defaultConfig = JSON.stringify(config);
|
const defaultConfig = JSON.stringify(config);
|
||||||
|
|
||||||
export { defaultConfig, userscriptsConfig, userscriptsRules };
|
export { defaultConfig, userscriptsConfig };
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
"react-router-dom": "^7.1.1",
|
"react-router-dom": "^7.1.1",
|
||||||
"semver": "^7.6.3",
|
"semver": "^7.6.3",
|
||||||
"uuid": "^11.0.3",
|
"uuid": "^11.0.3",
|
||||||
|
"webdav": "^5.8.0",
|
||||||
"yaml": "^2.6.1"
|
"yaml": "^2.6.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@ -63,6 +64,7 @@
|
|||||||
"eslint": "^9.24.0",
|
"eslint": "^9.24.0",
|
||||||
"eslint-plugin-react": "^7.37.4",
|
"eslint-plugin-react": "^7.37.4",
|
||||||
"eslint-plugin-react-hooks": "^5.2.0",
|
"eslint-plugin-react-hooks": "^5.2.0",
|
||||||
|
"eslint-plugin-userscripts": "^0.5.6",
|
||||||
"fake-indexeddb": "^6.0.0",
|
"fake-indexeddb": "^6.0.0",
|
||||||
"globals": "^16.0.0",
|
"globals": "^16.0.0",
|
||||||
"jsdom": "^25.0.1",
|
"jsdom": "^25.0.1",
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
/* eslint-disable camelcase */
|
import { ExtServer, ExtServerApi } from "@App/app/const";
|
||||||
/* eslint-disable import/prefer-default-export */
|
|
||||||
import { ExtServer } from "@App/app/const";
|
|
||||||
import { api } from "@App/pkg/axios";
|
|
||||||
import { WarpTokenError } from "./error";
|
import { WarpTokenError } from "./error";
|
||||||
|
|
||||||
type NetDiskType = "baidu" | "onedrive";
|
type NetDiskType = "baidu" | "onedrive";
|
||||||
@ -11,8 +8,8 @@ export function GetNetDiskToken(netDiskType: NetDiskType): Promise<{
|
|||||||
msg: string;
|
msg: string;
|
||||||
data: { token: { access_token: string; refresh_token: string } };
|
data: { token: { access_token: string; refresh_token: string } };
|
||||||
}> {
|
}> {
|
||||||
return api
|
return fetch(ExtServerApi + `auth/net-disk/token?netDiskType=${netDiskType}`)
|
||||||
.get(`/auth/net-disk/token?netDiskType=${netDiskType}`)
|
.then((resp) => resp.json())
|
||||||
.then((resp) => {
|
.then((resp) => {
|
||||||
return resp.data;
|
return resp.data;
|
||||||
});
|
});
|
||||||
@ -26,11 +23,17 @@ export function RefreshToken(
|
|||||||
msg: string;
|
msg: string;
|
||||||
data: { token: { access_token: string; refresh_token: string } };
|
data: { token: { access_token: string; refresh_token: string } };
|
||||||
}> {
|
}> {
|
||||||
return api
|
return fetch(ExtServerApi + `auth/net-disk/token/refresh?netDiskType=${netDiskType}`, {
|
||||||
.post(`/auth/net-disk/token/refresh?netDiskType=${netDiskType}`, {
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
netDiskType,
|
netDiskType,
|
||||||
refreshToken,
|
refreshToken,
|
||||||
})
|
}),
|
||||||
|
})
|
||||||
|
.then((resp) => resp.json())
|
||||||
.then((resp) => {
|
.then((resp) => {
|
||||||
return resp.data;
|
return resp.data;
|
||||||
});
|
});
|
||||||
@ -38,9 +41,7 @@ export function RefreshToken(
|
|||||||
|
|
||||||
export function NetDisk(netDiskType: NetDiskType) {
|
export function NetDisk(netDiskType: NetDiskType) {
|
||||||
return new Promise<void>((resolve) => {
|
return new Promise<void>((resolve) => {
|
||||||
const loginWindow = window.open(
|
const loginWindow = window.open(`${ExtServer}api/v1/auth/net-disk?netDiskType=${netDiskType}`);
|
||||||
`${ExtServer}api/v1/auth/net-disk?netDiskType=${netDiskType}`
|
|
||||||
);
|
|
||||||
const t = setInterval(() => {
|
const t = setInterval(() => {
|
||||||
try {
|
try {
|
||||||
if (loginWindow!.closed) {
|
if (loginWindow!.closed) {
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
/* eslint-disable no-unused-vars */
|
|
||||||
import IoC from "@App/app/ioc";
|
|
||||||
import { SystemConfig } from "@App/pkg/config/config";
|
import { SystemConfig } from "@App/pkg/config/config";
|
||||||
import { AuthVerify } from "../auth";
|
import { AuthVerify } from "../auth";
|
||||||
import FileSystem, { File, FileReader, FileWriter } from "../filesystem";
|
import FileSystem, { File, FileReader, FileWriter } from "../filesystem";
|
||||||
@ -11,12 +9,9 @@ export default class BaiduFileSystem implements FileSystem {
|
|||||||
|
|
||||||
path: string;
|
path: string;
|
||||||
|
|
||||||
systemConfig: SystemConfig;
|
|
||||||
|
|
||||||
constructor(path?: string, accessToken?: string) {
|
constructor(path?: string, accessToken?: string) {
|
||||||
this.path = path || "/apps";
|
this.path = path || "/apps";
|
||||||
this.accessToken = accessToken;
|
this.accessToken = accessToken;
|
||||||
this.systemConfig = IoC.instance(SystemConfig) as SystemConfig;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async verify(): Promise<void> {
|
async verify(): Promise<void> {
|
||||||
@ -31,15 +26,11 @@ export default class BaiduFileSystem implements FileSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
openDir(path: string): Promise<FileSystem> {
|
openDir(path: string): Promise<FileSystem> {
|
||||||
return Promise.resolve(
|
return Promise.resolve(new BaiduFileSystem(joinPath(this.path, path), this.accessToken));
|
||||||
new BaiduFileSystem(joinPath(this.path, path), this.accessToken)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
create(path: string): Promise<FileWriter> {
|
create(path: string): Promise<FileWriter> {
|
||||||
return Promise.resolve(
|
return Promise.resolve(new BaiduFileWriter(this, joinPath(this.path, path)));
|
||||||
new BaiduFileWriter(this, joinPath(this.path, path))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
createDir(dir: string): Promise<void> {
|
createDir(dir: string): Promise<void> {
|
||||||
@ -51,15 +42,12 @@ export default class BaiduFileSystem implements FileSystem {
|
|||||||
urlencoded.append("rtype", "3");
|
urlencoded.append("rtype", "3");
|
||||||
const myHeaders = new Headers();
|
const myHeaders = new Headers();
|
||||||
myHeaders.append("Content-Type", "application/x-www-form-urlencoded");
|
myHeaders.append("Content-Type", "application/x-www-form-urlencoded");
|
||||||
return this.request(
|
return this.request(`https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=${this.accessToken}`, {
|
||||||
`https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=${this.accessToken}`,
|
method: "POST",
|
||||||
{
|
headers: myHeaders,
|
||||||
method: "POST",
|
body: urlencoded,
|
||||||
headers: myHeaders,
|
redirect: "follow",
|
||||||
body: urlencoded,
|
}).then((data) => {
|
||||||
redirect: "follow",
|
|
||||||
}
|
|
||||||
).then((data) => {
|
|
||||||
if (data.errno) {
|
if (data.errno) {
|
||||||
throw new Error(JSON.stringify(data));
|
throw new Error(JSON.stringify(data));
|
||||||
}
|
}
|
||||||
@ -71,9 +59,23 @@ export default class BaiduFileSystem implements FileSystem {
|
|||||||
request(url: string, config?: RequestInit) {
|
request(url: string, config?: RequestInit) {
|
||||||
config = config || {};
|
config = config || {};
|
||||||
const headers = <Headers>config.headers || new Headers();
|
const headers = <Headers>config.headers || new Headers();
|
||||||
// 利用GM函数的匿名实现不发送cookie,因为某些情况cookie会导致-6错误
|
// 处理请求匿名不发送cookie
|
||||||
headers.append(`${this.systemConfig.scriptCatFlag}-gm-xhr`, "true");
|
chrome.declarativeNetRequest.updateDynamicRules({
|
||||||
headers.append(`${this.systemConfig.scriptCatFlag}-anonymous`, "true");
|
removeRuleIds: [100],
|
||||||
|
addRules: [
|
||||||
|
{
|
||||||
|
id: 100,
|
||||||
|
action: {
|
||||||
|
type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS,
|
||||||
|
responseHeaders: [{ operation: chrome.declarativeNetRequest.HeaderOperation.REMOVE, header: "cookie" }],
|
||||||
|
},
|
||||||
|
condition: {
|
||||||
|
urlFilter: url,
|
||||||
|
resourceTypes: [chrome.declarativeNetRequest.ResourceType.XMLHTTPREQUEST],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
config.headers = headers;
|
config.headers = headers;
|
||||||
return fetch(url, config)
|
return fetch(url, config)
|
||||||
.then((data) => data.json())
|
.then((data) => data.json())
|
||||||
@ -92,6 +94,11 @@ export default class BaiduFileSystem implements FileSystem {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
chrome.declarativeNetRequest.updateDynamicRules({
|
||||||
|
removeRuleIds: [100],
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,9 +110,7 @@ export default class BaiduFileSystem implements FileSystem {
|
|||||||
`https://pan.baidu.com/rest/2.0/xpan/file?method=filemanager&access_token=${this.accessToken}&opera=delete`,
|
`https://pan.baidu.com/rest/2.0/xpan/file?method=filemanager&access_token=${this.accessToken}&opera=delete`,
|
||||||
{
|
{
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: `async=0&filelist=${encodeURIComponent(
|
body: `async=0&filelist=${encodeURIComponent(JSON.stringify(filelist))}`,
|
||||||
JSON.stringify(filelist)
|
|
||||||
)}`,
|
|
||||||
headers: myHeaders,
|
headers: myHeaders,
|
||||||
}
|
}
|
||||||
).then((data) => {
|
).then((data) => {
|
||||||
@ -145,10 +150,6 @@ export default class BaiduFileSystem implements FileSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getDirUrl(): Promise<string> {
|
getDirUrl(): Promise<string> {
|
||||||
return Promise.resolve(
|
return Promise.resolve(`https://pan.baidu.com/disk/main#/index?category=all&path=${encodeURIComponent(this.path)}`);
|
||||||
`https://pan.baidu.com/disk/main#/index?category=all&path=${encodeURIComponent(
|
|
||||||
this.path
|
|
||||||
)}`
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,3 @@
|
|||||||
/* eslint-disable no-unused-vars */
|
|
||||||
import IoC from "@App/app/ioc";
|
|
||||||
import { SystemConfig } from "@App/pkg/config/config";
|
|
||||||
import { AuthVerify } from "../auth";
|
import { AuthVerify } from "../auth";
|
||||||
import FileSystem, { File, FileReader, FileWriter } from "../filesystem";
|
import FileSystem, { File, FileReader, FileWriter } from "../filesystem";
|
||||||
import { joinPath } from "../utils";
|
import { joinPath } from "../utils";
|
||||||
@ -11,12 +8,9 @@ export default class OneDriveFileSystem implements FileSystem {
|
|||||||
|
|
||||||
path: string;
|
path: string;
|
||||||
|
|
||||||
systemConfig: SystemConfig;
|
|
||||||
|
|
||||||
constructor(path?: string, accessToken?: string) {
|
constructor(path?: string, accessToken?: string) {
|
||||||
this.path = path || "/";
|
this.path = path || "/";
|
||||||
this.accessToken = accessToken;
|
this.accessToken = accessToken;
|
||||||
this.systemConfig = IoC.instance(SystemConfig) as SystemConfig;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async verify(): Promise<void> {
|
async verify(): Promise<void> {
|
||||||
@ -33,15 +27,11 @@ export default class OneDriveFileSystem implements FileSystem {
|
|||||||
if (path.startsWith("ScriptCat")) {
|
if (path.startsWith("ScriptCat")) {
|
||||||
path = path.substring(9);
|
path = path.substring(9);
|
||||||
}
|
}
|
||||||
return Promise.resolve(
|
return Promise.resolve(new OneDriveFileSystem(joinPath(this.path, path), this.accessToken));
|
||||||
new OneDriveFileSystem(joinPath(this.path, path), this.accessToken)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
create(path: string): Promise<FileWriter> {
|
create(path: string): Promise<FileWriter> {
|
||||||
return Promise.resolve(
|
return Promise.resolve(new OneDriveFileWriter(this, joinPath(this.path, path)));
|
||||||
new OneDriveFileWriter(this, joinPath(this.path, path))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
createDir(dir: string): Promise<void> {
|
createDir(dir: string): Promise<void> {
|
||||||
@ -65,18 +55,15 @@ export default class OneDriveFileSystem implements FileSystem {
|
|||||||
if (parent !== "") {
|
if (parent !== "") {
|
||||||
parent = `:${parent}:`;
|
parent = `:${parent}:`;
|
||||||
}
|
}
|
||||||
return this.request(
|
return this.request(`https://graph.microsoft.com/v1.0/me/drive/special/approot${parent}/children`, {
|
||||||
`https://graph.microsoft.com/v1.0/me/drive/special/approot${parent}/children`,
|
method: "POST",
|
||||||
{
|
headers: myHeaders,
|
||||||
method: "POST",
|
body: JSON.stringify({
|
||||||
headers: myHeaders,
|
name: dirs[dirs.length - 1],
|
||||||
body: JSON.stringify({
|
folder: {},
|
||||||
name: dirs[dirs.length - 1],
|
"@microsoft.graph.conflictBehavior": "replace",
|
||||||
folder: {},
|
}),
|
||||||
"@microsoft.graph.conflictBehavior": "replace",
|
}).then((data: any) => {
|
||||||
}),
|
|
||||||
}
|
|
||||||
).then((data: any) => {
|
|
||||||
if (data.errno) {
|
if (data.errno) {
|
||||||
throw new Error(JSON.stringify(data));
|
throw new Error(JSON.stringify(data));
|
||||||
}
|
}
|
||||||
@ -84,7 +71,6 @@ export default class OneDriveFileSystem implements FileSystem {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line no-undef
|
|
||||||
request(url: string, config?: RequestInit, nothen?: boolean) {
|
request(url: string, config?: RequestInit, nothen?: boolean) {
|
||||||
config = config || {};
|
config = config || {};
|
||||||
const headers = <Headers>config.headers || new Headers();
|
const headers = <Headers>config.headers || new Headers();
|
||||||
@ -121,10 +107,7 @@ export default class OneDriveFileSystem implements FileSystem {
|
|||||||
|
|
||||||
delete(path: string): Promise<void> {
|
delete(path: string): Promise<void> {
|
||||||
return this.request(
|
return this.request(
|
||||||
`https://graph.microsoft.com/v1.0/me/drive/special/approot:${joinPath(
|
`https://graph.microsoft.com/v1.0/me/drive/special/approot:${joinPath(this.path, path)}`,
|
||||||
this.path,
|
|
||||||
path
|
|
||||||
)}`,
|
|
||||||
{
|
{
|
||||||
method: "DELETE",
|
method: "DELETE",
|
||||||
},
|
},
|
||||||
@ -144,9 +127,7 @@ export default class OneDriveFileSystem implements FileSystem {
|
|||||||
} else {
|
} else {
|
||||||
path = `:${path}:`;
|
path = `:${path}:`;
|
||||||
}
|
}
|
||||||
return this.request(
|
return this.request(`https://graph.microsoft.com/v1.0/me/drive/special/approot${path}/children`).then((data) => {
|
||||||
`https://graph.microsoft.com/v1.0/me/drive/special/approot${path}/children`
|
|
||||||
).then((data) => {
|
|
||||||
const list: File[] = [];
|
const list: File[] = [];
|
||||||
data.value.forEach((val: any) => {
|
data.value.forEach((val: any) => {
|
||||||
list.push({
|
list.push({
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
/* eslint-disable max-classes-per-file */
|
import { WebDAVClient } from "webdav";
|
||||||
/* eslint-disable import/prefer-default-export */
|
|
||||||
import { WebDAVClient } from "webdav/web";
|
|
||||||
import { FileReader, FileWriter } from "../filesystem";
|
import { FileReader, FileWriter } from "../filesystem";
|
||||||
|
|
||||||
export class WebDAVFileReader implements FileReader {
|
export class WebDAVFileReader implements FileReader {
|
||||||
@ -42,10 +40,7 @@ export class WebDAVFileWriter implements FileWriter {
|
|||||||
async write(content: string | Blob): Promise<void> {
|
async write(content: string | Blob): Promise<void> {
|
||||||
let resp;
|
let resp;
|
||||||
if (content instanceof Blob) {
|
if (content instanceof Blob) {
|
||||||
resp = await this.client.putFileContents(
|
resp = await this.client.putFileContents(this.path, await content.arrayBuffer());
|
||||||
this.path,
|
|
||||||
await content.arrayBuffer()
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
resp = await this.client.putFileContents(this.path, content);
|
resp = await this.client.putFileContents(this.path, content);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { AuthType, createClient, FileStat, WebDAVClient } from "webdav/web";
|
import { AuthType, createClient, FileStat, WebDAVClient } from "webdav";
|
||||||
import FileSystem, { File, FileReader, FileWriter } from "../filesystem";
|
import FileSystem, { File, FileReader, FileWriter } from "../filesystem";
|
||||||
import { joinPath } from "../utils";
|
import { joinPath } from "../utils";
|
||||||
import { WebDAVFileReader, WebDAVFileWriter } from "./rw";
|
import { WebDAVFileReader, WebDAVFileWriter } from "./rw";
|
||||||
@ -11,12 +11,7 @@ export default class WebDAVFileSystem implements FileSystem {
|
|||||||
|
|
||||||
basePath: string = "/";
|
basePath: string = "/";
|
||||||
|
|
||||||
constructor(
|
constructor(authType: AuthType | WebDAVClient, url?: string, username?: string, password?: string) {
|
||||||
authType: AuthType | WebDAVClient,
|
|
||||||
url?: string,
|
|
||||||
username?: string,
|
|
||||||
password?: string
|
|
||||||
) {
|
|
||||||
if (typeof authType === "object") {
|
if (typeof authType === "object") {
|
||||||
this.client = authType;
|
this.client = authType;
|
||||||
this.basePath = joinPath(url || "");
|
this.basePath = joinPath(url || "");
|
||||||
@ -44,28 +39,20 @@ export default class WebDAVFileSystem implements FileSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
open(file: File): Promise<FileReader> {
|
open(file: File): Promise<FileReader> {
|
||||||
return Promise.resolve(
|
return Promise.resolve(new WebDAVFileReader(this.client, joinPath(file.path, file.name)));
|
||||||
new WebDAVFileReader(this.client, joinPath(file.path, file.name))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
openDir(path: string): Promise<FileSystem> {
|
openDir(path: string): Promise<FileSystem> {
|
||||||
return Promise.resolve(
|
return Promise.resolve(new WebDAVFileSystem(this.client, joinPath(this.basePath, path), this.url));
|
||||||
new WebDAVFileSystem(this.client, joinPath(this.basePath, path), this.url)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
create(path: string): Promise<FileWriter> {
|
create(path: string): Promise<FileWriter> {
|
||||||
return Promise.resolve(
|
return Promise.resolve(new WebDAVFileWriter(this.client, joinPath(this.basePath, path)));
|
||||||
new WebDAVFileWriter(this.client, joinPath(this.basePath, path))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async createDir(path: string): Promise<void> {
|
async createDir(path: string): Promise<void> {
|
||||||
try {
|
try {
|
||||||
return Promise.resolve(
|
return Promise.resolve(await this.client.createDirectory(joinPath(this.basePath, path)));
|
||||||
await this.client.createDirectory(joinPath(this.basePath, path))
|
|
||||||
);
|
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
// 如果是405错误,则忽略
|
// 如果是405错误,则忽略
|
||||||
if (e.message.includes("405")) {
|
if (e.message.includes("405")) {
|
||||||
@ -80,9 +67,7 @@ export default class WebDAVFileSystem implements FileSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async list(): Promise<File[]> {
|
async list(): Promise<File[]> {
|
||||||
const dir = (await this.client.getDirectoryContents(
|
const dir = (await this.client.getDirectoryContents(this.basePath)) as FileStat[];
|
||||||
this.basePath
|
|
||||||
)) as FileStat[];
|
|
||||||
const ret: File[] = [];
|
const ret: File[] = [];
|
||||||
dir.forEach((item: FileStat) => {
|
dir.forEach((item: FileStat) => {
|
||||||
if (item.type !== "file") {
|
if (item.type !== "file") {
|
||||||
|
195
pnpm-lock.yaml
generated
195
pnpm-lock.yaml
generated
@ -74,6 +74,9 @@ importers:
|
|||||||
uuid:
|
uuid:
|
||||||
specifier: ^11.0.3
|
specifier: ^11.0.3
|
||||||
version: 11.0.3
|
version: 11.0.3
|
||||||
|
webdav:
|
||||||
|
specifier: ^5.8.0
|
||||||
|
version: 5.8.0
|
||||||
yaml:
|
yaml:
|
||||||
specifier: ^2.6.1
|
specifier: ^2.6.1
|
||||||
version: 2.6.1
|
version: 2.6.1
|
||||||
@ -141,6 +144,9 @@ importers:
|
|||||||
eslint-plugin-react-hooks:
|
eslint-plugin-react-hooks:
|
||||||
specifier: ^5.2.0
|
specifier: ^5.2.0
|
||||||
version: 5.2.0(eslint@9.24.0(jiti@1.21.7))
|
version: 5.2.0(eslint@9.24.0(jiti@1.21.7))
|
||||||
|
eslint-plugin-userscripts:
|
||||||
|
specifier: ^0.5.6
|
||||||
|
version: 0.5.6(eslint@9.24.0(jiti@1.21.7))
|
||||||
fake-indexeddb:
|
fake-indexeddb:
|
||||||
specifier: ^6.0.0
|
specifier: ^6.0.0
|
||||||
version: 6.0.0
|
version: 6.0.0
|
||||||
@ -352,6 +358,9 @@ packages:
|
|||||||
'@bcoe/v8-coverage@0.2.3':
|
'@bcoe/v8-coverage@0.2.3':
|
||||||
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
|
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
|
||||||
|
|
||||||
|
'@buttercup/fetch@0.2.1':
|
||||||
|
resolution: {integrity: sha512-sCgECOx8wiqY8NN1xN22BqqKzXYIG2AicNLlakOAI4f0WgyLVUbAigMf8CZhBtJxdudTcB1gD5lciqi44jwJvg==}
|
||||||
|
|
||||||
'@cspotcode/source-map-support@0.8.1':
|
'@cspotcode/source-map-support@0.8.1':
|
||||||
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
|
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
@ -967,55 +976,46 @@ packages:
|
|||||||
resolution: {integrity: sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==}
|
resolution: {integrity: sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
|
||||||
|
|
||||||
'@rollup/rollup-linux-arm-musleabihf@4.24.4':
|
'@rollup/rollup-linux-arm-musleabihf@4.24.4':
|
||||||
resolution: {integrity: sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==}
|
resolution: {integrity: sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [musl]
|
|
||||||
|
|
||||||
'@rollup/rollup-linux-arm64-gnu@4.24.4':
|
'@rollup/rollup-linux-arm64-gnu@4.24.4':
|
||||||
resolution: {integrity: sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==}
|
resolution: {integrity: sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
|
||||||
|
|
||||||
'@rollup/rollup-linux-arm64-musl@4.24.4':
|
'@rollup/rollup-linux-arm64-musl@4.24.4':
|
||||||
resolution: {integrity: sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==}
|
resolution: {integrity: sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [musl]
|
|
||||||
|
|
||||||
'@rollup/rollup-linux-powerpc64le-gnu@4.24.4':
|
'@rollup/rollup-linux-powerpc64le-gnu@4.24.4':
|
||||||
resolution: {integrity: sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==}
|
resolution: {integrity: sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==}
|
||||||
cpu: [ppc64]
|
cpu: [ppc64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
|
||||||
|
|
||||||
'@rollup/rollup-linux-riscv64-gnu@4.24.4':
|
'@rollup/rollup-linux-riscv64-gnu@4.24.4':
|
||||||
resolution: {integrity: sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==}
|
resolution: {integrity: sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==}
|
||||||
cpu: [riscv64]
|
cpu: [riscv64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
|
||||||
|
|
||||||
'@rollup/rollup-linux-s390x-gnu@4.24.4':
|
'@rollup/rollup-linux-s390x-gnu@4.24.4':
|
||||||
resolution: {integrity: sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==}
|
resolution: {integrity: sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==}
|
||||||
cpu: [s390x]
|
cpu: [s390x]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
|
||||||
|
|
||||||
'@rollup/rollup-linux-x64-gnu@4.24.4':
|
'@rollup/rollup-linux-x64-gnu@4.24.4':
|
||||||
resolution: {integrity: sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==}
|
resolution: {integrity: sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
|
||||||
|
|
||||||
'@rollup/rollup-linux-x64-musl@4.24.4':
|
'@rollup/rollup-linux-x64-musl@4.24.4':
|
||||||
resolution: {integrity: sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==}
|
resolution: {integrity: sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [musl]
|
|
||||||
|
|
||||||
'@rollup/rollup-win32-arm64-msvc@4.24.4':
|
'@rollup/rollup-win32-arm64-msvc@4.24.4':
|
||||||
resolution: {integrity: sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==}
|
resolution: {integrity: sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==}
|
||||||
@ -1080,7 +1080,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-nJzY+Ur6FxWM0xc+G2tY1TQu3s6qgolxXb5K2VLIDHSPqDAjqRc35ypQc9Tz3rUPb8HVh+X7YLIZxA0hE4eQOg==}
|
resolution: {integrity: sha512-nJzY+Ur6FxWM0xc+G2tY1TQu3s6qgolxXb5K2VLIDHSPqDAjqRc35ypQc9Tz3rUPb8HVh+X7YLIZxA0hE4eQOg==}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
|
||||||
|
|
||||||
'@rspack/binding-linux-arm64-musl@1.0.14':
|
'@rspack/binding-linux-arm64-musl@1.0.14':
|
||||||
resolution: {integrity: sha512-qgybhxI/nnoa8CUz7zKTC0Oh37NZt9uRxsSV7+ZYrfxqbrVCoNVuutPpY724uUHy1M6W34kVEm1uT1N4Ka5cZg==}
|
resolution: {integrity: sha512-qgybhxI/nnoa8CUz7zKTC0Oh37NZt9uRxsSV7+ZYrfxqbrVCoNVuutPpY724uUHy1M6W34kVEm1uT1N4Ka5cZg==}
|
||||||
@ -1092,7 +1091,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-sRi77ccO/oOfyBNq3FgW2pDtXcgMzslLokOby8NpD/kv/SxtOE4ORoLZKzdJyGNh2WDPbtSwIDWPes2x4MKASQ==}
|
resolution: {integrity: sha512-sRi77ccO/oOfyBNq3FgW2pDtXcgMzslLokOby8NpD/kv/SxtOE4ORoLZKzdJyGNh2WDPbtSwIDWPes2x4MKASQ==}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [musl]
|
|
||||||
|
|
||||||
'@rspack/binding-linux-x64-gnu@1.0.14':
|
'@rspack/binding-linux-x64-gnu@1.0.14':
|
||||||
resolution: {integrity: sha512-5vzaDRw3/sGKo3ax/1cU3/cxqNjajwlt2LU288vXNe1/n8oe/pcDfYcTugpOe/A1DqzadanudJszLpFcKsaFtQ==}
|
resolution: {integrity: sha512-5vzaDRw3/sGKo3ax/1cU3/cxqNjajwlt2LU288vXNe1/n8oe/pcDfYcTugpOe/A1DqzadanudJszLpFcKsaFtQ==}
|
||||||
@ -1104,7 +1102,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-KnrFQUj6SKJFGXqJW9Kgdv+mRGcPCirQesuwXtW+9YejT6MzLRRdJ4NDQdfcmfLZK9+ap+l73bLXAyMiIBZiOw==}
|
resolution: {integrity: sha512-KnrFQUj6SKJFGXqJW9Kgdv+mRGcPCirQesuwXtW+9YejT6MzLRRdJ4NDQdfcmfLZK9+ap+l73bLXAyMiIBZiOw==}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
|
||||||
|
|
||||||
'@rspack/binding-linux-x64-musl@1.0.14':
|
'@rspack/binding-linux-x64-musl@1.0.14':
|
||||||
resolution: {integrity: sha512-4U6QD9xVS1eGme52DuJr6Fg/KdcUfJ+iKwH49Up460dZ/fLvGylnVGA+V0mzPlKi8gfy7NwFuYXZdu3Pwi1YYg==}
|
resolution: {integrity: sha512-4U6QD9xVS1eGme52DuJr6Fg/KdcUfJ+iKwH49Up460dZ/fLvGylnVGA+V0mzPlKi8gfy7NwFuYXZdu3Pwi1YYg==}
|
||||||
@ -1116,7 +1113,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-ZcTl4LBgxp5Bfyu9x7NhYRAR4qWPwhhxzwXmiQ1ya7DsdqiYaiCr59dPQx7ZaExXckeHGly75B3aTn1II9Vexw==}
|
resolution: {integrity: sha512-ZcTl4LBgxp5Bfyu9x7NhYRAR4qWPwhhxzwXmiQ1ya7DsdqiYaiCr59dPQx7ZaExXckeHGly75B3aTn1II9Vexw==}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [musl]
|
|
||||||
|
|
||||||
'@rspack/binding-win32-arm64-msvc@1.0.14':
|
'@rspack/binding-win32-arm64-msvc@1.0.14':
|
||||||
resolution: {integrity: sha512-SjeYw7qqRHYZ5RPClu+ffKZsShQdU3amA1OwC3M0AS6dbfEcji8482St3Y8Z+QSzYRapCEZij9LMM/9ypEhISg==}
|
resolution: {integrity: sha512-SjeYw7qqRHYZ5RPClu+ffKZsShQdU3amA1OwC3M0AS6dbfEcji8482St3Y8Z+QSzYRapCEZij9LMM/9ypEhISg==}
|
||||||
@ -1836,6 +1832,9 @@ packages:
|
|||||||
balanced-match@1.0.2:
|
balanced-match@1.0.2:
|
||||||
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
||||||
|
|
||||||
|
base-64@1.0.0:
|
||||||
|
resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==}
|
||||||
|
|
||||||
base64-js@1.5.1:
|
base64-js@1.5.1:
|
||||||
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
|
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
|
||||||
|
|
||||||
@ -1898,6 +1897,9 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
esbuild: '>=0.18'
|
esbuild: '>=0.18'
|
||||||
|
|
||||||
|
byte-length@1.0.2:
|
||||||
|
resolution: {integrity: sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==}
|
||||||
|
|
||||||
bytes@3.0.0:
|
bytes@3.0.0:
|
||||||
resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
|
resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
@ -1944,6 +1946,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
|
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
|
charenc@0.0.2:
|
||||||
|
resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==}
|
||||||
|
|
||||||
check-error@2.1.1:
|
check-error@2.1.1:
|
||||||
resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
|
resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
|
||||||
engines: {node: '>= 16'}
|
engines: {node: '>= 16'}
|
||||||
@ -2094,6 +2099,9 @@ packages:
|
|||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
crypt@0.0.2:
|
||||||
|
resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==}
|
||||||
|
|
||||||
crypto-js@4.2.0:
|
crypto-js@4.2.0:
|
||||||
resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
|
resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
|
||||||
|
|
||||||
@ -2108,6 +2116,10 @@ packages:
|
|||||||
csstype@3.1.3:
|
csstype@3.1.3:
|
||||||
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
|
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
|
||||||
|
|
||||||
|
data-uri-to-buffer@4.0.1:
|
||||||
|
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
|
||||||
|
engines: {node: '>= 12'}
|
||||||
|
|
||||||
data-urls@5.0.0:
|
data-urls@5.0.0:
|
||||||
resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
|
resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
@ -2299,6 +2311,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
|
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
|
||||||
engines: {node: '>=0.12'}
|
engines: {node: '>=0.12'}
|
||||||
|
|
||||||
|
entities@6.0.0:
|
||||||
|
resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==}
|
||||||
|
engines: {node: '>=0.12'}
|
||||||
|
|
||||||
env-paths@2.2.1:
|
env-paths@2.2.1:
|
||||||
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
|
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
@ -2408,6 +2424,12 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
|
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
|
||||||
|
|
||||||
|
eslint-plugin-userscripts@0.5.6:
|
||||||
|
resolution: {integrity: sha512-/DXb8UKyEkNCzXOA6j4E4rCWn2mLCUw2TMxrzSoz3spi4cyANlE0JNmtRleAmzc1HTUmZXr5fIMCQxyLS73DZQ==}
|
||||||
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
peerDependencies:
|
||||||
|
eslint: '>=8.40.0 <11'
|
||||||
|
|
||||||
eslint-scope@5.1.1:
|
eslint-scope@5.1.1:
|
||||||
resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
|
resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
|
||||||
engines: {node: '>=8.0.0'}
|
engines: {node: '>=8.0.0'}
|
||||||
@ -2544,6 +2566,10 @@ packages:
|
|||||||
fast-uri@3.0.3:
|
fast-uri@3.0.3:
|
||||||
resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==}
|
resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==}
|
||||||
|
|
||||||
|
fast-xml-parser@4.5.3:
|
||||||
|
resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
fastq@1.17.1:
|
fastq@1.17.1:
|
||||||
resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
|
resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
|
||||||
|
|
||||||
@ -2567,6 +2593,10 @@ packages:
|
|||||||
picomatch:
|
picomatch:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
fetch-blob@3.2.0:
|
||||||
|
resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
|
||||||
|
engines: {node: ^12.20 || >= 14.13}
|
||||||
|
|
||||||
file-entry-cache@8.0.0:
|
file-entry-cache@8.0.0:
|
||||||
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
|
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
|
||||||
engines: {node: '>=16.0.0'}
|
engines: {node: '>=16.0.0'}
|
||||||
@ -2614,6 +2644,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
|
resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
|
||||||
engines: {node: '>= 6'}
|
engines: {node: '>= 6'}
|
||||||
|
|
||||||
|
formdata-polyfill@4.0.10:
|
||||||
|
resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
|
||||||
|
engines: {node: '>=12.20.0'}
|
||||||
|
|
||||||
forwarded@0.2.0:
|
forwarded@0.2.0:
|
||||||
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
|
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
@ -2770,6 +2804,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
|
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
hot-patcher@2.0.1:
|
||||||
|
resolution: {integrity: sha512-ECg1JFG0YzehicQaogenlcs2qg6WsXQsxtnbr1i696u5tLUjtJdQAh0u2g0Q5YV45f263Ta1GnUJsc8WIfJf4Q==}
|
||||||
|
|
||||||
hpack.js@2.1.6:
|
hpack.js@2.1.6:
|
||||||
resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==}
|
resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==}
|
||||||
|
|
||||||
@ -2931,6 +2968,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
|
resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
is-buffer@1.1.6:
|
||||||
|
resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
|
||||||
|
|
||||||
is-callable@1.2.7:
|
is-callable@1.2.7:
|
||||||
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
|
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
@ -3198,6 +3238,9 @@ packages:
|
|||||||
launch-editor@2.9.1:
|
launch-editor@2.9.1:
|
||||||
resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==}
|
resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==}
|
||||||
|
|
||||||
|
layerr@3.0.0:
|
||||||
|
resolution: {integrity: sha512-tv754Ki2dXpPVApOrjTyRo4/QegVb9eVFq4mjqp4+NM5NaX7syQvN5BBNfV/ZpAHCEHV24XdUVrBAoka4jt3pA==}
|
||||||
|
|
||||||
lazystream@1.0.1:
|
lazystream@1.0.1:
|
||||||
resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
|
resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
|
||||||
engines: {node: '>= 0.6.3'}
|
engines: {node: '>= 0.6.3'}
|
||||||
@ -3283,6 +3326,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
|
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
md5@2.3.0:
|
||||||
|
resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==}
|
||||||
|
|
||||||
mdn-data@2.12.1:
|
mdn-data@2.12.1:
|
||||||
resolution: {integrity: sha512-rsfnCbOHjqrhWxwt5/wtSLzpoKTzW7OXdT5lLOIH1OTYhWu9rRJveGq0sKvDZODABH7RX+uoR+DYcpFnq4Tf6Q==}
|
resolution: {integrity: sha512-rsfnCbOHjqrhWxwt5/wtSLzpoKTzW7OXdT5lLOIH1OTYhWu9rRJveGq0sKvDZODABH7RX+uoR+DYcpFnq4Tf6Q==}
|
||||||
|
|
||||||
@ -3403,9 +3449,20 @@ packages:
|
|||||||
neo-async@2.6.2:
|
neo-async@2.6.2:
|
||||||
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
|
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
|
||||||
|
|
||||||
|
nested-property@4.0.0:
|
||||||
|
resolution: {integrity: sha512-yFehXNWRs4cM0+dz7QxCd06hTbWbSkV0ISsqBfkntU6TOY4Qm3Q88fRRLOddkGh2Qq6dZvnKVAahfhjcUvLnyA==}
|
||||||
|
|
||||||
|
node-domexception@1.0.0:
|
||||||
|
resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
|
||||||
|
engines: {node: '>=10.5.0'}
|
||||||
|
|
||||||
node-fetch-native@1.6.4:
|
node-fetch-native@1.6.4:
|
||||||
resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==}
|
resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==}
|
||||||
|
|
||||||
|
node-fetch@3.3.2:
|
||||||
|
resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
|
||||||
|
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||||
|
|
||||||
node-forge@1.3.1:
|
node-forge@1.3.1:
|
||||||
resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
|
resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
|
||||||
engines: {node: '>= 6.13.0'}
|
engines: {node: '>= 6.13.0'}
|
||||||
@ -3576,6 +3633,9 @@ packages:
|
|||||||
path-parse@1.0.7:
|
path-parse@1.0.7:
|
||||||
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
|
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
|
||||||
|
|
||||||
|
path-posix@1.0.0:
|
||||||
|
resolution: {integrity: sha512-1gJ0WpNIiYcQydgg3Ed8KzvIqTsDpNwq+cjBCssvBtuTWjEqY1AW+i+OepiEMqDCzyro9B2sLAe4RBPajMYFiA==}
|
||||||
|
|
||||||
path-scurry@1.11.1:
|
path-scurry@1.11.1:
|
||||||
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
|
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
|
||||||
engines: {node: '>=16 || 14 >=14.18'}
|
engines: {node: '>=16 || 14 >=14.18'}
|
||||||
@ -3681,6 +3741,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
|
resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
|
||||||
engines: {node: '>=0.6'}
|
engines: {node: '>=0.6'}
|
||||||
|
|
||||||
|
querystringify@2.2.0:
|
||||||
|
resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
|
||||||
|
|
||||||
queue-microtask@1.2.3:
|
queue-microtask@1.2.3:
|
||||||
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
|
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
|
||||||
|
|
||||||
@ -4195,6 +4258,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
|
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
|
strnum@1.1.2:
|
||||||
|
resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==}
|
||||||
|
|
||||||
supports-color@7.2.0:
|
supports-color@7.2.0:
|
||||||
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
|
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@ -4495,6 +4561,13 @@ packages:
|
|||||||
uri-js@4.4.1:
|
uri-js@4.4.1:
|
||||||
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
||||||
|
|
||||||
|
url-join@5.0.0:
|
||||||
|
resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==}
|
||||||
|
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||||
|
|
||||||
|
url-parse@1.5.10:
|
||||||
|
resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
|
||||||
|
|
||||||
use-callback-ref@1.3.2:
|
use-callback-ref@1.3.2:
|
||||||
resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
|
resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
@ -4631,6 +4704,14 @@ packages:
|
|||||||
wbuf@1.7.3:
|
wbuf@1.7.3:
|
||||||
resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==}
|
resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==}
|
||||||
|
|
||||||
|
web-streams-polyfill@3.3.3:
|
||||||
|
resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
|
||||||
|
engines: {node: '>= 8'}
|
||||||
|
|
||||||
|
webdav@5.8.0:
|
||||||
|
resolution: {integrity: sha512-iuFG7NamJ41Oshg4930iQgfIpRrUiatPWIekeznYgEf2EOraTRcDPTjy7gIOMtkdpKTaqPk1E68NO5PAGtJahA==}
|
||||||
|
engines: {node: '>=14'}
|
||||||
|
|
||||||
webidl-conversions@7.0.0:
|
webidl-conversions@7.0.0:
|
||||||
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
|
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
@ -4918,6 +4999,10 @@ snapshots:
|
|||||||
|
|
||||||
'@bcoe/v8-coverage@0.2.3': {}
|
'@bcoe/v8-coverage@0.2.3': {}
|
||||||
|
|
||||||
|
'@buttercup/fetch@0.2.1':
|
||||||
|
optionalDependencies:
|
||||||
|
node-fetch: 3.3.2
|
||||||
|
|
||||||
'@cspotcode/source-map-support@0.8.1':
|
'@cspotcode/source-map-support@0.8.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/trace-mapping': 0.3.9
|
'@jridgewell/trace-mapping': 0.3.9
|
||||||
@ -6571,6 +6656,8 @@ snapshots:
|
|||||||
|
|
||||||
balanced-match@1.0.2: {}
|
balanced-match@1.0.2: {}
|
||||||
|
|
||||||
|
base-64@1.0.0: {}
|
||||||
|
|
||||||
base64-js@1.5.1: {}
|
base64-js@1.5.1: {}
|
||||||
|
|
||||||
batch@0.6.1: {}
|
batch@0.6.1: {}
|
||||||
@ -6657,6 +6744,8 @@ snapshots:
|
|||||||
esbuild: 0.23.1
|
esbuild: 0.23.1
|
||||||
load-tsconfig: 0.2.5
|
load-tsconfig: 0.2.5
|
||||||
|
|
||||||
|
byte-length@1.0.2: {}
|
||||||
|
|
||||||
bytes@3.0.0: {}
|
bytes@3.0.0: {}
|
||||||
|
|
||||||
bytes@3.1.2: {}
|
bytes@3.1.2: {}
|
||||||
@ -6707,6 +6796,8 @@ snapshots:
|
|||||||
ansi-styles: 4.3.0
|
ansi-styles: 4.3.0
|
||||||
supports-color: 7.2.0
|
supports-color: 7.2.0
|
||||||
|
|
||||||
|
charenc@0.0.2: {}
|
||||||
|
|
||||||
check-error@2.1.1: {}
|
check-error@2.1.1: {}
|
||||||
|
|
||||||
chokidar@3.6.0:
|
chokidar@3.6.0:
|
||||||
@ -6873,6 +6964,8 @@ snapshots:
|
|||||||
node-rsa: 1.1.1
|
node-rsa: 1.1.1
|
||||||
pbf: 3.3.0
|
pbf: 3.3.0
|
||||||
|
|
||||||
|
crypt@0.0.2: {}
|
||||||
|
|
||||||
crypto-js@4.2.0: {}
|
crypto-js@4.2.0: {}
|
||||||
|
|
||||||
css-tree@3.0.1:
|
css-tree@3.0.1:
|
||||||
@ -6886,6 +6979,8 @@ snapshots:
|
|||||||
|
|
||||||
csstype@3.1.3: {}
|
csstype@3.1.3: {}
|
||||||
|
|
||||||
|
data-uri-to-buffer@4.0.1: {}
|
||||||
|
|
||||||
data-urls@5.0.0:
|
data-urls@5.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
whatwg-mimetype: 4.0.0
|
whatwg-mimetype: 4.0.0
|
||||||
@ -7048,6 +7143,8 @@ snapshots:
|
|||||||
|
|
||||||
entities@4.5.0: {}
|
entities@4.5.0: {}
|
||||||
|
|
||||||
|
entities@6.0.0: {}
|
||||||
|
|
||||||
env-paths@2.2.1: {}
|
env-paths@2.2.1: {}
|
||||||
|
|
||||||
error-ex@1.3.2:
|
error-ex@1.3.2:
|
||||||
@ -7352,6 +7449,11 @@ snapshots:
|
|||||||
string.prototype.matchall: 4.0.12
|
string.prototype.matchall: 4.0.12
|
||||||
string.prototype.repeat: 1.0.0
|
string.prototype.repeat: 1.0.0
|
||||||
|
|
||||||
|
eslint-plugin-userscripts@0.5.6(eslint@9.24.0(jiti@1.21.7)):
|
||||||
|
dependencies:
|
||||||
|
eslint: 9.24.0(jiti@1.21.7)
|
||||||
|
semver: 7.6.3
|
||||||
|
|
||||||
eslint-scope@5.1.1:
|
eslint-scope@5.1.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
esrecurse: 4.3.0
|
esrecurse: 4.3.0
|
||||||
@ -7606,6 +7708,10 @@ snapshots:
|
|||||||
|
|
||||||
fast-uri@3.0.3: {}
|
fast-uri@3.0.3: {}
|
||||||
|
|
||||||
|
fast-xml-parser@4.5.3:
|
||||||
|
dependencies:
|
||||||
|
strnum: 1.1.2
|
||||||
|
|
||||||
fastq@1.17.1:
|
fastq@1.17.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
reusify: 1.0.4
|
reusify: 1.0.4
|
||||||
@ -7623,6 +7729,11 @@ snapshots:
|
|||||||
picomatch: 4.0.2
|
picomatch: 4.0.2
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
fetch-blob@3.2.0:
|
||||||
|
dependencies:
|
||||||
|
node-domexception: 1.0.0
|
||||||
|
web-streams-polyfill: 3.3.3
|
||||||
|
|
||||||
file-entry-cache@8.0.0:
|
file-entry-cache@8.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
flat-cache: 4.0.1
|
flat-cache: 4.0.1
|
||||||
@ -7676,6 +7787,10 @@ snapshots:
|
|||||||
combined-stream: 1.0.8
|
combined-stream: 1.0.8
|
||||||
mime-types: 2.1.35
|
mime-types: 2.1.35
|
||||||
|
|
||||||
|
formdata-polyfill@4.0.10:
|
||||||
|
dependencies:
|
||||||
|
fetch-blob: 3.2.0
|
||||||
|
|
||||||
forwarded@0.2.0: {}
|
forwarded@0.2.0: {}
|
||||||
|
|
||||||
fraction.js@4.3.7: {}
|
fraction.js@4.3.7: {}
|
||||||
@ -7837,6 +7952,8 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
function-bind: 1.1.2
|
function-bind: 1.1.2
|
||||||
|
|
||||||
|
hot-patcher@2.0.1: {}
|
||||||
|
|
||||||
hpack.js@2.1.6:
|
hpack.js@2.1.6:
|
||||||
dependencies:
|
dependencies:
|
||||||
inherits: 2.0.4
|
inherits: 2.0.4
|
||||||
@ -8020,6 +8137,8 @@ snapshots:
|
|||||||
call-bound: 1.0.3
|
call-bound: 1.0.3
|
||||||
has-tostringtag: 1.0.2
|
has-tostringtag: 1.0.2
|
||||||
|
|
||||||
|
is-buffer@1.1.6: {}
|
||||||
|
|
||||||
is-callable@1.2.7: {}
|
is-callable@1.2.7: {}
|
||||||
|
|
||||||
is-core-module@2.15.1:
|
is-core-module@2.15.1:
|
||||||
@ -8307,6 +8426,8 @@ snapshots:
|
|||||||
picocolors: 1.1.1
|
picocolors: 1.1.1
|
||||||
shell-quote: 1.8.1
|
shell-quote: 1.8.1
|
||||||
|
|
||||||
|
layerr@3.0.0: {}
|
||||||
|
|
||||||
lazystream@1.0.1:
|
lazystream@1.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
readable-stream: 2.3.8
|
readable-stream: 2.3.8
|
||||||
@ -8382,6 +8503,12 @@ snapshots:
|
|||||||
|
|
||||||
math-intrinsics@1.1.0: {}
|
math-intrinsics@1.1.0: {}
|
||||||
|
|
||||||
|
md5@2.3.0:
|
||||||
|
dependencies:
|
||||||
|
charenc: 0.0.2
|
||||||
|
crypt: 0.0.2
|
||||||
|
is-buffer: 1.1.6
|
||||||
|
|
||||||
mdn-data@2.12.1: {}
|
mdn-data@2.12.1: {}
|
||||||
|
|
||||||
media-typer@0.3.0: {}
|
media-typer@0.3.0: {}
|
||||||
@ -8474,8 +8601,18 @@ snapshots:
|
|||||||
neo-async@2.6.2:
|
neo-async@2.6.2:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
nested-property@4.0.0: {}
|
||||||
|
|
||||||
|
node-domexception@1.0.0: {}
|
||||||
|
|
||||||
node-fetch-native@1.6.4: {}
|
node-fetch-native@1.6.4: {}
|
||||||
|
|
||||||
|
node-fetch@3.3.2:
|
||||||
|
dependencies:
|
||||||
|
data-uri-to-buffer: 4.0.1
|
||||||
|
fetch-blob: 3.2.0
|
||||||
|
formdata-polyfill: 4.0.10
|
||||||
|
|
||||||
node-forge@1.3.1: {}
|
node-forge@1.3.1: {}
|
||||||
|
|
||||||
node-releases@2.0.18: {}
|
node-releases@2.0.18: {}
|
||||||
@ -8653,6 +8790,8 @@ snapshots:
|
|||||||
|
|
||||||
path-parse@1.0.7: {}
|
path-parse@1.0.7: {}
|
||||||
|
|
||||||
|
path-posix@1.0.0: {}
|
||||||
|
|
||||||
path-scurry@1.11.1:
|
path-scurry@1.11.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
lru-cache: 10.4.3
|
lru-cache: 10.4.3
|
||||||
@ -8742,6 +8881,8 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
side-channel: 1.1.0
|
side-channel: 1.1.0
|
||||||
|
|
||||||
|
querystringify@2.2.0: {}
|
||||||
|
|
||||||
queue-microtask@1.2.3: {}
|
queue-microtask@1.2.3: {}
|
||||||
|
|
||||||
randombytes@2.1.0:
|
randombytes@2.1.0:
|
||||||
@ -9400,6 +9541,8 @@ snapshots:
|
|||||||
|
|
||||||
strip-json-comments@3.1.1: {}
|
strip-json-comments@3.1.1: {}
|
||||||
|
|
||||||
|
strnum@1.1.2: {}
|
||||||
|
|
||||||
supports-color@7.2.0:
|
supports-color@7.2.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
has-flag: 4.0.0
|
has-flag: 4.0.0
|
||||||
@ -9769,6 +9912,13 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
punycode: 2.3.1
|
punycode: 2.3.1
|
||||||
|
|
||||||
|
url-join@5.0.0: {}
|
||||||
|
|
||||||
|
url-parse@1.5.10:
|
||||||
|
dependencies:
|
||||||
|
querystringify: 2.2.0
|
||||||
|
requires-port: 1.0.0
|
||||||
|
|
||||||
use-callback-ref@1.3.2(@types/react@18.3.12)(react@18.3.1):
|
use-callback-ref@1.3.2(@types/react@18.3.12)(react@18.3.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
@ -9954,6 +10104,25 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
minimalistic-assert: 1.0.1
|
minimalistic-assert: 1.0.1
|
||||||
|
|
||||||
|
web-streams-polyfill@3.3.3: {}
|
||||||
|
|
||||||
|
webdav@5.8.0:
|
||||||
|
dependencies:
|
||||||
|
'@buttercup/fetch': 0.2.1
|
||||||
|
base-64: 1.0.0
|
||||||
|
byte-length: 1.0.2
|
||||||
|
entities: 6.0.0
|
||||||
|
fast-xml-parser: 4.5.3
|
||||||
|
hot-patcher: 2.0.1
|
||||||
|
layerr: 3.0.0
|
||||||
|
md5: 2.3.0
|
||||||
|
minimatch: 9.0.5
|
||||||
|
nested-property: 4.0.0
|
||||||
|
node-fetch: 3.3.2
|
||||||
|
path-posix: 1.0.0
|
||||||
|
url-join: 5.0.0
|
||||||
|
url-parse: 1.5.10
|
||||||
|
|
||||||
webidl-conversions@7.0.0: {}
|
webidl-conversions@7.0.0: {}
|
||||||
|
|
||||||
webpack-bundle-analyzer@4.10.2:
|
webpack-bundle-analyzer@4.10.2:
|
||||||
|
@ -3,12 +3,8 @@ import { version } from "../../package.json";
|
|||||||
export const ExtVersion = version;
|
export const ExtVersion = version;
|
||||||
|
|
||||||
export const ExtServer = "https://ext.scriptcat.org/";
|
export const ExtServer = "https://ext.scriptcat.org/";
|
||||||
|
export const ExtServerApi = ExtServer + "api/v1/";
|
||||||
|
|
||||||
export const ExternalWhitelist = [
|
export const ExternalWhitelist = ["greasyfork.org", "scriptcat.org", "tampermonkey.net.cn", "openuserjs.org"];
|
||||||
"greasyfork.org",
|
|
||||||
"scriptcat.org",
|
|
||||||
"tampermonkey.net.cn",
|
|
||||||
"openuserjs.org",
|
|
||||||
];
|
|
||||||
|
|
||||||
export const ExternalMessage = "externalMessage";
|
export const ExternalMessage = "externalMessage";
|
||||||
|
@ -358,5 +358,6 @@
|
|||||||
"collapse": "Collapse",
|
"collapse": "Collapse",
|
||||||
"expand": "Expand",
|
"expand": "Expand",
|
||||||
"menu_expand_num_before": "Menu item more than",
|
"menu_expand_num_before": "Menu item more than",
|
||||||
"menu_expand_num_after": "Auto-hide."
|
"menu_expand_num_after": "Auto-hide.",
|
||||||
|
"eslint_config_format_error": "ESLint configuration format error"
|
||||||
}
|
}
|
@ -363,5 +363,6 @@
|
|||||||
"expand": "展开",
|
"expand": "展开",
|
||||||
"menu_expand_num_before": "菜单项超过",
|
"menu_expand_num_before": "菜单项超过",
|
||||||
"menu_expand_num_after": "个时,自动隐藏",
|
"menu_expand_num_after": "个时,自动隐藏",
|
||||||
"script_name_cannot_be_set_to_empty": "脚本name不可以设置为空"
|
"script_name_cannot_be_set_to_empty": "脚本name不可以设置为空",
|
||||||
|
"eslint_config_format_error": "eslint配置格式错误"
|
||||||
}
|
}
|
@ -1,6 +1,8 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import { Input, Select, Space } from "@arco-design/web-react";
|
import { Input, Select, Space } from "@arco-design/web-react";
|
||||||
|
import FileSystemFactory, { FileSystemType } from "@Packages/filesystem/factory";
|
||||||
|
|
||||||
|
const fsParams = FileSystemFactory.params();
|
||||||
|
|
||||||
const fileSystemList: {
|
const fileSystemList: {
|
||||||
key: FileSystemType;
|
key: FileSystemType;
|
||||||
@ -65,10 +67,7 @@ const FileSystemParams: React.FC<{
|
|||||||
<>
|
<>
|
||||||
<span>{fsParams[fileSystemType][key].title}</span>
|
<span>{fsParams[fileSystemType][key].title}</span>
|
||||||
<Select
|
<Select
|
||||||
value={
|
value={fileSystemParams[key] || fsParams[fileSystemType][key].options![0]}
|
||||||
fileSystemParams[key] ||
|
|
||||||
fsParams[fileSystemType][key].options![0]
|
|
||||||
}
|
|
||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
onChangeFileSystemParams({
|
onChangeFileSystemParams({
|
||||||
...fileSystemParams,
|
...fileSystemParams,
|
||||||
|
@ -1,29 +1,28 @@
|
|||||||
import React, { useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import {
|
import { Button, Card, Collapse, Link, Message, Space, Typography } from "@arco-design/web-react";
|
||||||
Button,
|
|
||||||
Card,
|
|
||||||
Collapse,
|
|
||||||
Link,
|
|
||||||
Message,
|
|
||||||
Space,
|
|
||||||
Typography,
|
|
||||||
} from "@arco-design/web-react";
|
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import FileSystemParams from "../FileSystemParams";
|
import FileSystemParams from "../FileSystemParams";
|
||||||
|
import { systemConfig } from "@App/pages/store/global";
|
||||||
|
import { FileSystemType } from "@Packages/filesystem/factory";
|
||||||
|
|
||||||
const CollapseItem = Collapse.Item;
|
const CollapseItem = Collapse.Item;
|
||||||
|
|
||||||
const GMApiSetting: React.FC = () => {
|
const GMApiSetting: React.FC = () => {
|
||||||
const systemConfig = IoC.instance(SystemConfig) as SystemConfig;
|
const [status, setStatus] = useState("unset");
|
||||||
const [status, setStatus] = useState(systemConfig.catFileStorage.status);
|
const [fileSystemType, setFilesystemType] = useState<FileSystemType>("webdav");
|
||||||
const [fileSystemType, setFilesystemType] = useState<FileSystemType>(
|
|
||||||
systemConfig.catFileStorage.filesystem
|
|
||||||
);
|
|
||||||
const [fileSystemParams, setFilesystemParam] = useState<{
|
const [fileSystemParams, setFilesystemParam] = useState<{
|
||||||
[key: string]: any;
|
[key: string]: any;
|
||||||
}>(systemConfig.catFileStorage.params[fileSystemType] || {});
|
}>({});
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
systemConfig.getCatFileStorage().then((res) => {
|
||||||
|
setStatus(res.status);
|
||||||
|
setFilesystemType(res.filesystem);
|
||||||
|
setFilesystemParam(res.params[res.filesystem] || {});
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card title={t("gm_api")} bordered={false}>
|
<Card title={t("gm_api")} bordered={false}>
|
||||||
<Collapse bordered={false} defaultActiveKey={["storage"]}>
|
<Collapse bordered={false} defaultActiveKey={["storage"]}>
|
||||||
@ -48,10 +47,7 @@ const GMApiSetting: React.FC = () => {
|
|||||||
type="primary"
|
type="primary"
|
||||||
onClick={async () => {
|
onClick={async () => {
|
||||||
try {
|
try {
|
||||||
await FileSystemFactory.create(
|
await FileSystemFactory.create(fileSystemType, fileSystemParams);
|
||||||
fileSystemType,
|
|
||||||
fileSystemParams
|
|
||||||
);
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Message.error(`${t("account_validation_failed")}: ${e}`);
|
Message.error(`${t("account_validation_failed")}: ${e}`);
|
||||||
return;
|
return;
|
||||||
@ -87,10 +83,7 @@ const GMApiSetting: React.FC = () => {
|
|||||||
type="secondary"
|
type="secondary"
|
||||||
onClick={async () => {
|
onClick={async () => {
|
||||||
try {
|
try {
|
||||||
let fs = await FileSystemFactory.create(
|
let fs = await FileSystemFactory.create(fileSystemType, fileSystemParams);
|
||||||
fileSystemType,
|
|
||||||
fileSystemParams
|
|
||||||
);
|
|
||||||
fs = await fs.openDir("ScriptCat/app");
|
fs = await fs.openDir("ScriptCat/app");
|
||||||
window.open(await fs.getDirUrl(), "_black");
|
window.open(await fs.getDirUrl(), "_black");
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -110,17 +103,9 @@ const GMApiSetting: React.FC = () => {
|
|||||||
setFilesystemParam(params);
|
setFilesystemParam(params);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
{status === "unset" && (
|
{status === "unset" && <Typography.Text type="secondary">{t("not_set")}</Typography.Text>}
|
||||||
<Typography.Text type="secondary">{t("not_set")}</Typography.Text>
|
{status === "success" && <Typography.Text type="success">{t("in_use")}</Typography.Text>}
|
||||||
)}
|
{status === "error" && <Typography.Text type="error">{t("storage_error")}</Typography.Text>}
|
||||||
{status === "success" && (
|
|
||||||
<Typography.Text type="success">{t("in_use")}</Typography.Text>
|
|
||||||
)}
|
|
||||||
{status === "error" && (
|
|
||||||
<Typography.Text type="error">
|
|
||||||
{t("storage_error")}
|
|
||||||
</Typography.Text>
|
|
||||||
)}
|
|
||||||
</Space>
|
</Space>
|
||||||
</CollapseItem>
|
</CollapseItem>
|
||||||
</Collapse>
|
</Collapse>
|
||||||
|
@ -14,12 +14,11 @@ import { RiPlayFill, RiStopFill } from "react-icons/ri";
|
|||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { ScriptIcons } from "@App/pages/options/routes/utils";
|
import { ScriptIcons } from "@App/pages/options/routes/utils";
|
||||||
import { ScriptMenu, ScriptMenuItem } from "@App/app/service/service_worker/popup";
|
import { ScriptMenu, ScriptMenuItem } from "@App/app/service/service_worker/popup";
|
||||||
import { selectMenuExpandNum } from "@App/pages/store/features/setting";
|
|
||||||
import { useAppSelector } from "@App/pages/store/hooks";
|
import { useAppSelector } from "@App/pages/store/hooks";
|
||||||
import { popupClient, runtimeClient, scriptClient } from "@App/pages/store/features/script";
|
import { popupClient, runtimeClient, scriptClient } from "@App/pages/store/features/script";
|
||||||
import { i18nName } from "@App/locales/locales";
|
import { i18nName } from "@App/locales/locales";
|
||||||
import { subscribeScriptRunStatus } from "@App/app/service/queue";
|
import { subscribeScriptRunStatus } from "@App/app/service/queue";
|
||||||
import { messageQueue } from "@App/pages/store/global";
|
import { messageQueue, systemConfig } from "@App/pages/store/global";
|
||||||
|
|
||||||
const CollapseItem = Collapse.Item;
|
const CollapseItem = Collapse.Item;
|
||||||
|
|
||||||
@ -46,7 +45,7 @@ const ScriptMenuList: React.FC<{
|
|||||||
[key: string]: boolean;
|
[key: string]: boolean;
|
||||||
}>({});
|
}>({});
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const menuExpandNum = useAppSelector(selectMenuExpandNum);
|
const [menuExpandNum, setMenuExpandNum] = useState(5);
|
||||||
|
|
||||||
let url: URL;
|
let url: URL;
|
||||||
try {
|
try {
|
||||||
@ -70,6 +69,10 @@ const ScriptMenuList: React.FC<{
|
|||||||
return newList;
|
return newList;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
// 获取配置
|
||||||
|
systemConfig.getMenuExpandNum().then((num) => {
|
||||||
|
setMenuExpandNum(num);
|
||||||
|
});
|
||||||
return () => {
|
return () => {
|
||||||
unsub();
|
unsub();
|
||||||
};
|
};
|
||||||
|
@ -16,7 +16,7 @@ import React, { ReactNode, useRef, useState } from "react";
|
|||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import "./index.css";
|
import "./index.css";
|
||||||
import { useAppDispatch, useAppSelector } from "@App/pages/store/hooks";
|
import { useAppDispatch, useAppSelector } from "@App/pages/store/hooks";
|
||||||
import { selectThemeMode, setDarkMode } from "@App/pages/store/features/setting";
|
import { selectThemeMode, setDarkMode } from "@App/pages/store/features/config";
|
||||||
import { RiFileCodeLine, RiImportLine, RiPlayListAddLine, RiTerminalBoxLine, RiTimerLine } from "react-icons/ri";
|
import { RiFileCodeLine, RiImportLine, RiPlayListAddLine, RiTerminalBoxLine, RiTimerLine } from "react-icons/ri";
|
||||||
|
|
||||||
const MainLayout: React.FC<{
|
const MainLayout: React.FC<{
|
||||||
|
@ -80,7 +80,7 @@ import {
|
|||||||
requestStopScript,
|
requestStopScript,
|
||||||
requestRunScript,
|
requestRunScript,
|
||||||
} from "@App/pages/store/features/script";
|
} from "@App/pages/store/features/script";
|
||||||
import { selectScriptListColumnWidth } from "@App/pages/store/features/setting";
|
import { systemConfig } from "@App/pages/store/global";
|
||||||
|
|
||||||
type ListType = Script & { loading?: boolean };
|
type ListType = Script & { loading?: boolean };
|
||||||
|
|
||||||
@ -93,7 +93,6 @@ function ScriptList() {
|
|||||||
const [cloudScript, setCloudScript] = useState<Script>();
|
const [cloudScript, setCloudScript] = useState<Script>();
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
const scriptList = useAppSelector(selectScripts);
|
const scriptList = useAppSelector(selectScripts);
|
||||||
const scriptListColumnWidth = useAppSelector(selectScriptListColumnWidth);
|
|
||||||
const inputRef = useRef<RefInputType>(null);
|
const inputRef = useRef<RefInputType>(null);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const openUserConfig = useSearchParams()[0].get("userConfig") || "";
|
const openUserConfig = useSearchParams()[0].get("userConfig") || "";
|
||||||
@ -557,12 +556,14 @@ function ScriptList() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setNewColumns(
|
systemConfig.getScriptListColumnWidth().then((columnWidth) => {
|
||||||
columns.map((item) => {
|
setNewColumns(
|
||||||
item.width = scriptListColumnWidth[item.key!] ?? item.width;
|
columns.map((item) => {
|
||||||
return item;
|
item.width = columnWidth[item.key!] ?? item.width;
|
||||||
})
|
return item;
|
||||||
);
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
// 处理拖拽排序
|
// 处理拖拽排序
|
||||||
|
@ -1,13 +1,5 @@
|
|||||||
import React, { useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import {
|
import { Button, Card, Checkbox, Input, Message, Select, Space } from "@arco-design/web-react";
|
||||||
Button,
|
|
||||||
Card,
|
|
||||||
Checkbox,
|
|
||||||
Input,
|
|
||||||
Message,
|
|
||||||
Select,
|
|
||||||
Space,
|
|
||||||
} from "@arco-design/web-react";
|
|
||||||
import Title from "@arco-design/web-react/es/Typography/title";
|
import Title from "@arco-design/web-react/es/Typography/title";
|
||||||
import { IconQuestionCircleFill } from "@arco-design/web-react/icon";
|
import { IconQuestionCircleFill } from "@arco-design/web-react/icon";
|
||||||
import { format } from "prettier";
|
import { format } from "prettier";
|
||||||
@ -17,22 +9,24 @@ import i18n from "@App/locales/locales";
|
|||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import Logger from "@App/app/logger/logger";
|
import Logger from "@App/app/logger/logger";
|
||||||
|
import { systemConfig } from "@App/pages/store/global";
|
||||||
|
import { FileSystemType } from "@Packages/filesystem/factory";
|
||||||
|
import FileSystemParams from "@App/pages/components/FileSystemParams";
|
||||||
|
|
||||||
function Setting() {
|
function Setting() {
|
||||||
const systemConfig = IoC.instance(SystemConfig) as SystemConfig;
|
const [syncDelete, setSyncDelete] = useState<boolean>();
|
||||||
const [syncDelete, setSyncDelete] = useState<boolean>(
|
const [enableCloudSync, setEnableCloudSync] = useState<boolean>();
|
||||||
systemConfig.cloudSync.syncDelete
|
const [fileSystemType, setFilesystemType] = useState<FileSystemType>("webdav");
|
||||||
);
|
|
||||||
const [enableCloudSync, setEnableCloudSync] = useState(
|
|
||||||
systemConfig.cloudSync.enable
|
|
||||||
);
|
|
||||||
const [fileSystemType, setFilesystemType] = useState<FileSystemType>(
|
|
||||||
systemConfig.cloudSync.filesystem
|
|
||||||
);
|
|
||||||
const [fileSystemParams, setFilesystemParam] = useState<{
|
const [fileSystemParams, setFilesystemParam] = useState<{
|
||||||
[key: string]: any;
|
[key: string]: any;
|
||||||
}>(systemConfig.cloudSync.params[fileSystemType] || {});
|
}>({});
|
||||||
const [language, setLanguage] = useState(i18n.language);
|
const [language, setLanguage] = useState(i18n.language);
|
||||||
|
const [menuExpandNum, setMenuExpandNum] = useState(5);
|
||||||
|
const [checkScriptUpdateCycle, setCheckScriptUpdateCycle] = useState(0);
|
||||||
|
const [updateDisableScript, setUpdateDisableScript] = useState(false);
|
||||||
|
const [silenceUpdateScript, setSilenceUpdateScript] = useState(false);
|
||||||
|
const [enableEslint, setEnableEslint] = useState(false);
|
||||||
|
const [eslintConfig, setEslintConfig] = useState("");
|
||||||
const languageList: { key: string; title: string }[] = [];
|
const languageList: { key: string; title: string }[] = [];
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
Object.keys(i18n.store.data).forEach((key) => {
|
Object.keys(i18n.store.data).forEach((key) => {
|
||||||
@ -49,6 +43,34 @@ function Setting() {
|
|||||||
title: t("help_translate"),
|
title: t("help_translate"),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const loadConfigs = async () => {
|
||||||
|
const [cloudSync, menuExpandNum, checkCycle, updateDisabled, silenceUpdate, eslintConfig, enableEslint] =
|
||||||
|
await Promise.all([
|
||||||
|
systemConfig.getCloudSync(),
|
||||||
|
systemConfig.getMenuExpandNum(),
|
||||||
|
systemConfig.getCheckScriptUpdateCycle(),
|
||||||
|
systemConfig.getUpdateDisableScript(),
|
||||||
|
systemConfig.getSilenceUpdateScript(),
|
||||||
|
systemConfig.getEslintConfig(),
|
||||||
|
systemConfig.getEnableEslint(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
setSyncDelete(cloudSync.syncDelete);
|
||||||
|
setEnableCloudSync(cloudSync.enable);
|
||||||
|
setFilesystemType(cloudSync.filesystem);
|
||||||
|
setFilesystemParam(cloudSync.params[cloudSync.filesystem] || {});
|
||||||
|
setMenuExpandNum(menuExpandNum);
|
||||||
|
setCheckScriptUpdateCycle(checkCycle);
|
||||||
|
setUpdateDisableScript(updateDisabled);
|
||||||
|
setSilenceUpdateScript(silenceUpdate);
|
||||||
|
setEslintConfig(eslintConfig);
|
||||||
|
setEnableEslint(enableEslint);
|
||||||
|
};
|
||||||
|
|
||||||
|
loadConfigs();
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Space
|
<Space
|
||||||
className="setting"
|
className="setting"
|
||||||
@ -69,10 +91,7 @@ function Setting() {
|
|||||||
className="w-24"
|
className="w-24"
|
||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
if (value === "help") {
|
if (value === "help") {
|
||||||
window.open(
|
window.open("https://crowdin.com/project/scriptcat", "_blank");
|
||||||
"https://crowdin.com/project/scriptcat",
|
|
||||||
"_blank"
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setLanguage(value);
|
setLanguage(value);
|
||||||
@ -94,9 +113,11 @@ function Setting() {
|
|||||||
<Input
|
<Input
|
||||||
style={{ width: "64px" }}
|
style={{ width: "64px" }}
|
||||||
type="number"
|
type="number"
|
||||||
defaultValue={systemConfig.menuExpandNum.toString()}
|
value={menuExpandNum.toString()}
|
||||||
onChange={(val) => {
|
onChange={(val) => {
|
||||||
systemConfig.menuExpandNum = parseInt(val, 10);
|
const num = parseInt(val, 10);
|
||||||
|
setMenuExpandNum(num);
|
||||||
|
systemConfig.setMenuExpandNum(num);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
{t("menu_expand_num_after")}
|
{t("menu_expand_num_after")}
|
||||||
@ -134,16 +155,9 @@ function Setting() {
|
|||||||
if (enableCloudSync) {
|
if (enableCloudSync) {
|
||||||
Message.info(t("cloud_sync_account_verification")!);
|
Message.info(t("cloud_sync_account_verification")!);
|
||||||
try {
|
try {
|
||||||
await FileSystemFactory.create(
|
await FileSystemFactory.create(fileSystemType, fileSystemParams);
|
||||||
fileSystemType,
|
|
||||||
fileSystemParams
|
|
||||||
);
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Message.error(
|
Message.error(`${t("cloud_sync_verification_failed")}: ${JSON.stringify(Logger.E(e))}`);
|
||||||
`${t(
|
|
||||||
"cloud_sync_verification_failed"
|
|
||||||
)}: ${JSON.stringify(Logger.E(e))}`
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -177,12 +191,14 @@ function Setting() {
|
|||||||
<Space>
|
<Space>
|
||||||
<span>{t("script_subscription_check_interval")}:</span>
|
<span>{t("script_subscription_check_interval")}:</span>
|
||||||
<Select
|
<Select
|
||||||
defaultValue={systemConfig.checkScriptUpdateCycle.toString()}
|
value={checkScriptUpdateCycle.toString()}
|
||||||
style={{
|
style={{
|
||||||
width: 120,
|
width: 120,
|
||||||
}}
|
}}
|
||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
systemConfig.checkScriptUpdateCycle = parseInt(value, 10);
|
const num = parseInt(value, 10);
|
||||||
|
setCheckScriptUpdateCycle(num);
|
||||||
|
systemConfig.setCheckScriptUpdateCycle(num);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Select.Option value="0">{t("never")}</Select.Option>
|
<Select.Option value="0">{t("never")}</Select.Option>
|
||||||
@ -194,17 +210,19 @@ function Setting() {
|
|||||||
</Space>
|
</Space>
|
||||||
<Checkbox
|
<Checkbox
|
||||||
onChange={(checked) => {
|
onChange={(checked) => {
|
||||||
systemConfig.updateDisableScript = checked;
|
setEnableCloudSync(checked);
|
||||||
|
systemConfig.setUpdateDisableScript(checked);
|
||||||
}}
|
}}
|
||||||
defaultChecked={systemConfig.updateDisableScript}
|
checked={updateDisableScript}
|
||||||
>
|
>
|
||||||
{t("update_disabled_scripts")}
|
{t("update_disabled_scripts")}
|
||||||
</Checkbox>
|
</Checkbox>
|
||||||
<Checkbox
|
<Checkbox
|
||||||
onChange={(checked) => {
|
onChange={(checked) => {
|
||||||
systemConfig.silenceUpdateScript = checked;
|
setSilenceUpdateScript(checked);
|
||||||
|
systemConfig.setSilenceUpdateScript(checked);
|
||||||
}}
|
}}
|
||||||
defaultChecked={systemConfig.silenceUpdateScript}
|
checked={silenceUpdateScript}
|
||||||
>
|
>
|
||||||
{t("silent_update_non_critical_changes")}
|
{t("silent_update_non_critical_changes")}
|
||||||
</Checkbox>
|
</Checkbox>
|
||||||
@ -215,9 +233,10 @@ function Setting() {
|
|||||||
<Space direction="vertical" className="w-full">
|
<Space direction="vertical" className="w-full">
|
||||||
<Checkbox
|
<Checkbox
|
||||||
onChange={(checked) => {
|
onChange={(checked) => {
|
||||||
systemConfig.enableEslint = checked;
|
setEnableEslint(checked);
|
||||||
|
systemConfig.setEnableEslint(checked);
|
||||||
}}
|
}}
|
||||||
defaultChecked={systemConfig.enableEslint}
|
checked={enableEslint}
|
||||||
>
|
>
|
||||||
{t("enable_eslint")}
|
{t("enable_eslint")}
|
||||||
</Checkbox>
|
</Checkbox>
|
||||||
@ -246,12 +265,21 @@ function Setting() {
|
|||||||
minRows: 4,
|
minRows: 4,
|
||||||
maxRows: 8,
|
maxRows: 8,
|
||||||
}}
|
}}
|
||||||
defaultValue={format(systemConfig.eslintConfig, {
|
value={eslintConfig}
|
||||||
parser: "json",
|
onChange={(v) => {
|
||||||
plugins: [babel],
|
setEslintConfig(v);
|
||||||
})}
|
}}
|
||||||
onBlur={(v) => {
|
onBlur={(v) => {
|
||||||
systemConfig.eslintConfig = v.target.value;
|
format(eslintConfig, {
|
||||||
|
parser: "json",
|
||||||
|
plugins: [babel],
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
systemConfig.setEslintConfig(v.target.value);
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
Message.error(`${t("eslint_config_format_error")}: ${JSON.stringify(Logger.E(e))}`);
|
||||||
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Space>
|
</Space>
|
||||||
|
@ -1,16 +1,5 @@
|
|||||||
import React, { useRef, useState } from "react";
|
import React, { useEffect, useRef, useState } from "react";
|
||||||
import {
|
import { Button, Card, Checkbox, Drawer, Empty, Input, List, Message, Modal, Space } from "@arco-design/web-react";
|
||||||
Button,
|
|
||||||
Card,
|
|
||||||
Checkbox,
|
|
||||||
Drawer,
|
|
||||||
Empty,
|
|
||||||
Input,
|
|
||||||
List,
|
|
||||||
Message,
|
|
||||||
Modal,
|
|
||||||
Space,
|
|
||||||
} from "@arco-design/web-react";
|
|
||||||
import Title from "@arco-design/web-react/es/Typography/title";
|
import Title from "@arco-design/web-react/es/Typography/title";
|
||||||
import { formatUnixTime } from "@App/pkg/utils/utils";
|
import { formatUnixTime } from "@App/pkg/utils/utils";
|
||||||
import FileSystemParams from "@App/pages/components/FileSystemParams";
|
import FileSystemParams from "@App/pages/components/FileSystemParams";
|
||||||
@ -18,20 +7,27 @@ import { IconQuestionCircleFill } from "@arco-design/web-react/icon";
|
|||||||
import { RefInputType } from "@arco-design/web-react/es/Input/interface";
|
import { RefInputType } from "@arco-design/web-react/es/Input/interface";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { FileSystemType } from "@Packages/filesystem/factory";
|
import { FileSystemType } from "@Packages/filesystem/factory";
|
||||||
|
import { systemConfig } from "@App/pages/store/global";
|
||||||
|
|
||||||
function Tools() {
|
function Tools() {
|
||||||
const [loading, setLoading] = useState<{ [key: string]: boolean }>({});
|
const [loading, setLoading] = useState<{ [key: string]: boolean }>({});
|
||||||
const fileRef = useRef<HTMLInputElement>(null);
|
const fileRef = useRef<HTMLInputElement>(null);
|
||||||
const [fileSystemType, setFilesystemType] = useState<FileSystemType>(
|
const [fileSystemType, setFilesystemType] = useState<FileSystemType>("webdav");
|
||||||
systemConfig.backup.filesystem
|
|
||||||
);
|
|
||||||
const [fileSystemParams, setFilesystemParam] = useState<{
|
const [fileSystemParams, setFilesystemParam] = useState<{
|
||||||
[key: string]: any;
|
[key: string]: any;
|
||||||
}>(systemConfig.backup.params[fileSystemType] || {});
|
}>({});
|
||||||
const [backupFileList, setBackupFileList] = useState<File[]>([]);
|
const [backupFileList, setBackupFileList] = useState<File[]>([]);
|
||||||
const vscodeRef = useRef<RefInputType>(null);
|
const vscodeRef = useRef<RefInputType>(null);
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
// 获取配置
|
||||||
|
systemConfig.getBackup().then((backup) => {
|
||||||
|
setFilesystemType(backup.filesystem);
|
||||||
|
setFilesystemParam(backup.params[backup.filesystem] || {});
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Space
|
<Space
|
||||||
className="tools"
|
className="tools"
|
||||||
@ -47,12 +43,7 @@ function Tools() {
|
|||||||
<Space direction="vertical">
|
<Space direction="vertical">
|
||||||
<Title heading={6}>{t("local")}</Title>
|
<Title heading={6}>{t("local")}</Title>
|
||||||
<Space>
|
<Space>
|
||||||
<input
|
<input type="file" ref={fileRef} style={{ display: "none" }} accept=".zip" />
|
||||||
type="file"
|
|
||||||
ref={fileRef}
|
|
||||||
style={{ display: "none" }}
|
|
||||||
accept=".zip"
|
|
||||||
/>
|
|
||||||
<Button
|
<Button
|
||||||
type="primary"
|
type="primary"
|
||||||
loading={loading.local}
|
loading={loading.local}
|
||||||
@ -96,12 +87,12 @@ function Tools() {
|
|||||||
loading={loading.cloud}
|
loading={loading.cloud}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
// Store parameters
|
// Store parameters
|
||||||
const params = { ...systemConfig.backup.params };
|
const params = { ...fileSystemParams };
|
||||||
params[fileSystemType] = fileSystemParams;
|
params[fileSystemType] = fileSystemParams;
|
||||||
systemConfig.backup = {
|
systemConfig.setBackup({
|
||||||
filesystem: fileSystemType,
|
filesystem: fileSystemType,
|
||||||
params,
|
params,
|
||||||
};
|
});
|
||||||
setLoading((prev) => ({ ...prev, cloud: true }));
|
setLoading((prev) => ({ ...prev, cloud: true }));
|
||||||
Message.info(t("preparing_backup")!);
|
Message.info(t("preparing_backup")!);
|
||||||
syncCtrl
|
syncCtrl
|
||||||
@ -123,10 +114,7 @@ function Tools() {
|
|||||||
key="list"
|
key="list"
|
||||||
type="primary"
|
type="primary"
|
||||||
onClick={async () => {
|
onClick={async () => {
|
||||||
let fs = await FileSystemFactory.create(
|
let fs = await FileSystemFactory.create(fileSystemType, fileSystemParams);
|
||||||
fileSystemType,
|
|
||||||
fileSystemParams
|
|
||||||
);
|
|
||||||
try {
|
try {
|
||||||
fs = await fs.openDir("ScriptCat");
|
fs = await fs.openDir("ScriptCat");
|
||||||
let list = await fs.list();
|
let list = await fs.list();
|
||||||
@ -158,10 +146,7 @@ function Tools() {
|
|||||||
type="secondary"
|
type="secondary"
|
||||||
size="mini"
|
size="mini"
|
||||||
onClick={async () => {
|
onClick={async () => {
|
||||||
let fs = await FileSystemFactory.create(
|
let fs = await FileSystemFactory.create(fileSystemType, fileSystemParams);
|
||||||
fileSystemType,
|
|
||||||
fileSystemParams
|
|
||||||
);
|
|
||||||
try {
|
try {
|
||||||
fs = await fs.openDir("ScriptCat");
|
fs = await fs.openDir("ScriptCat");
|
||||||
const url = await fs.getDirUrl();
|
const url = await fs.getDirUrl();
|
||||||
@ -190,20 +175,14 @@ function Tools() {
|
|||||||
dataSource={backupFileList}
|
dataSource={backupFileList}
|
||||||
render={(item: File) => (
|
render={(item: File) => (
|
||||||
<List.Item key={item.name}>
|
<List.Item key={item.name}>
|
||||||
<List.Item.Meta
|
<List.Item.Meta title={item.name} description={formatUnixTime(item.updatetime / 1000)} />
|
||||||
title={item.name}
|
|
||||||
description={formatUnixTime(item.updatetime / 1000)}
|
|
||||||
/>
|
|
||||||
<Space className="w-full justify-end">
|
<Space className="w-full justify-end">
|
||||||
<Button
|
<Button
|
||||||
type="primary"
|
type="primary"
|
||||||
size="small"
|
size="small"
|
||||||
onClick={async () => {
|
onClick={async () => {
|
||||||
Message.info(t("pulling_data_from_cloud")!);
|
Message.info(t("pulling_data_from_cloud")!);
|
||||||
let fs = await FileSystemFactory.create(
|
let fs = await FileSystemFactory.create(fileSystemType, fileSystemParams);
|
||||||
fileSystemType,
|
|
||||||
fileSystemParams
|
|
||||||
);
|
|
||||||
let file: FileReader;
|
let file: FileReader;
|
||||||
let data: Blob;
|
let data: Blob;
|
||||||
try {
|
try {
|
||||||
@ -237,22 +216,13 @@ function Tools() {
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
Modal.confirm({
|
Modal.confirm({
|
||||||
title: t("confirm_delete"),
|
title: t("confirm_delete"),
|
||||||
content: `${t("confirm_delete_backup_file")}${
|
content: `${t("confirm_delete_backup_file")}${item.name}?`,
|
||||||
item.name
|
|
||||||
}?`,
|
|
||||||
onOk: async () => {
|
onOk: async () => {
|
||||||
let fs = await FileSystemFactory.create(
|
let fs = await FileSystemFactory.create(fileSystemType, fileSystemParams);
|
||||||
fileSystemType,
|
|
||||||
fileSystemParams
|
|
||||||
);
|
|
||||||
try {
|
try {
|
||||||
fs = await fs.openDir("ScriptCat");
|
fs = await fs.openDir("ScriptCat");
|
||||||
await fs.delete(item.name);
|
await fs.delete(item.name);
|
||||||
setBackupFileList(
|
setBackupFileList(backupFileList.filter((i) => i.name !== item.name));
|
||||||
backupFileList.filter(
|
|
||||||
(i) => i.name !== item.name
|
|
||||||
)
|
|
||||||
);
|
|
||||||
Message.success(t("delete_success")!);
|
Message.success(t("delete_success")!);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Message.error(`${t("delete_failed")}${e}`);
|
Message.error(`${t("delete_failed")}${e}`);
|
||||||
|
51
src/pages/store/features/config.ts
Normal file
51
src/pages/store/features/config.ts
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import { SystemConfig } from "@App/pkg/config/config";
|
||||||
|
import { createAppSlice } from "../hooks";
|
||||||
|
import { PayloadAction } from "@reduxjs/toolkit";
|
||||||
|
import { editor } from "monaco-editor";
|
||||||
|
|
||||||
|
function setAutoMode() {
|
||||||
|
const darkTheme = window.matchMedia("(prefers-color-scheme: dark)");
|
||||||
|
const isMatch = (match: boolean) => {
|
||||||
|
if (match) {
|
||||||
|
document.body.setAttribute("arco-theme", "dark");
|
||||||
|
editor.setTheme("vs-dark");
|
||||||
|
} else {
|
||||||
|
document.body.removeAttribute("arco-theme");
|
||||||
|
editor.setTheme("vs");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
darkTheme.addEventListener("change", (e) => {
|
||||||
|
isMatch(e.matches);
|
||||||
|
});
|
||||||
|
isMatch(darkTheme.matches);
|
||||||
|
}
|
||||||
|
|
||||||
|
export const configSlice = createAppSlice({
|
||||||
|
name: "setting",
|
||||||
|
initialState: {
|
||||||
|
lightMode: localStorage.lightMode || "auto",
|
||||||
|
},
|
||||||
|
reducers: (create) => {
|
||||||
|
// 初始化黑夜模式
|
||||||
|
setAutoMode();
|
||||||
|
return {
|
||||||
|
setDarkMode: create.reducer((state, action: PayloadAction<"light" | "dark" | "auto">) => {
|
||||||
|
localStorage.loghtMode = action.payload;
|
||||||
|
state.lightMode = action.payload;
|
||||||
|
if (action.payload === "auto") {
|
||||||
|
setAutoMode();
|
||||||
|
} else {
|
||||||
|
document.body.setAttribute("arco-theme", action.payload);
|
||||||
|
editor.setTheme(action.payload === "dark" ? "vs-dark" : "vs");
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
selectors: {
|
||||||
|
selectThemeMode: (state) => state.lightMode,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const { setDarkMode } = configSlice.actions;
|
||||||
|
|
||||||
|
export const { selectThemeMode } = configSlice.selectors;
|
@ -1,82 +0,0 @@
|
|||||||
import { createAppSlice } from "../hooks";
|
|
||||||
import { PayloadAction } from "@reduxjs/toolkit";
|
|
||||||
import { editor } from "monaco-editor";
|
|
||||||
|
|
||||||
function setAutoMode() {
|
|
||||||
const darkTheme = window.matchMedia("(prefers-color-scheme: dark)");
|
|
||||||
const isMatch = (match: boolean) => {
|
|
||||||
if (match) {
|
|
||||||
document.body.setAttribute("arco-theme", "dark");
|
|
||||||
editor.setTheme("vs-dark");
|
|
||||||
} else {
|
|
||||||
document.body.removeAttribute("arco-theme");
|
|
||||||
editor.setTheme("vs");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
darkTheme.addEventListener("change", (e) => {
|
|
||||||
isMatch(e.matches);
|
|
||||||
});
|
|
||||||
isMatch(darkTheme.matches);
|
|
||||||
}
|
|
||||||
|
|
||||||
export type SystemConfig = {
|
|
||||||
lightMode: "light" | "dark" | "auto";
|
|
||||||
eslint: {
|
|
||||||
enable: boolean;
|
|
||||||
config: string;
|
|
||||||
};
|
|
||||||
scriptListColumnWidth: { [key: string]: number };
|
|
||||||
menuExpandNum: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const settingSlice = createAppSlice({
|
|
||||||
name: "setting",
|
|
||||||
initialState: {
|
|
||||||
lightMode: localStorage.lightMode || "auto",
|
|
||||||
eslint: {
|
|
||||||
enable: true,
|
|
||||||
config: "",
|
|
||||||
},
|
|
||||||
scriptListColumnWidth: {} as { [key: string]: number },
|
|
||||||
menuExpandNum: 5,
|
|
||||||
} as SystemConfig,
|
|
||||||
reducers: (create) => {
|
|
||||||
// 初始化黑夜模式
|
|
||||||
setAutoMode();
|
|
||||||
// 加载配置
|
|
||||||
chrome.storage.sync.get("systemSetting", (result) => {
|
|
||||||
const systemSetting = result.systemSetting as SystemConfig;
|
|
||||||
settingSlice.actions.initSetting(systemSetting);
|
|
||||||
if (systemSetting) {
|
|
||||||
localStorage.lightMode = systemSetting.lightMode;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return {
|
|
||||||
initSetting: create.reducer((state, action: PayloadAction<SystemConfig>) => {
|
|
||||||
state.menuExpandNum = action.payload.menuExpandNum;
|
|
||||||
}),
|
|
||||||
setDarkMode: create.reducer((state, action: PayloadAction<"light" | "dark" | "auto">) => {
|
|
||||||
localStorage.loghtMode = action.payload;
|
|
||||||
state.lightMode = action.payload;
|
|
||||||
if (action.payload === "auto") {
|
|
||||||
setAutoMode();
|
|
||||||
} else {
|
|
||||||
document.body.setAttribute("arco-theme", action.payload);
|
|
||||||
editor.setTheme(action.payload === "dark" ? "vs-dark" : "vs");
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
menuExpandNum: create.reducer((state, action: PayloadAction<number>) => {
|
|
||||||
state.menuExpandNum = action.payload;
|
|
||||||
}),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
selectors: {
|
|
||||||
selectThemeMode: (state) => state.lightMode,
|
|
||||||
selectScriptListColumnWidth: (state) => state.scriptListColumnWidth,
|
|
||||||
selectMenuExpandNum: (state) => state.menuExpandNum,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
export const { setDarkMode } = settingSlice.actions;
|
|
||||||
|
|
||||||
export const { selectThemeMode, selectScriptListColumnWidth, selectMenuExpandNum } = settingSlice.selectors;
|
|
@ -1,5 +1,7 @@
|
|||||||
|
import { SystemConfig } from "@App/pkg/config/config";
|
||||||
import { ExtensionMessage } from "@Packages/message/extension_message";
|
import { ExtensionMessage } from "@Packages/message/extension_message";
|
||||||
import { MessageQueue } from "@Packages/message/message_queue";
|
import { MessageQueue } from "@Packages/message/message_queue";
|
||||||
|
|
||||||
export const message = new ExtensionMessage();
|
export const message = new ExtensionMessage();
|
||||||
export const messageQueue = new MessageQueue();
|
export const messageQueue = new MessageQueue();
|
||||||
|
export const systemConfig = new SystemConfig(messageQueue);
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
import type { Action, ThunkAction } from "@reduxjs/toolkit";
|
import type { Action, ThunkAction } from "@reduxjs/toolkit";
|
||||||
import { combineSlices, configureStore } from "@reduxjs/toolkit";
|
import { combineSlices, configureStore } from "@reduxjs/toolkit";
|
||||||
import { setupListeners } from "@reduxjs/toolkit/query";
|
import { setupListeners } from "@reduxjs/toolkit/query";
|
||||||
import { settingSlice } from "./features/setting";
|
|
||||||
import { scriptSlice } from "./features/script";
|
import { scriptSlice } from "./features/script";
|
||||||
|
import { configSlice } from "./features/config";
|
||||||
|
|
||||||
// `combineSlices` automatically combines the reducers using
|
// `combineSlices` automatically combines the reducers using
|
||||||
// their `reducerPath`s, therefore we no longer need to call `combineReducers`.
|
// their `reducerPath`s, therefore we no longer need to call `combineReducers`.
|
||||||
const rootReducer = combineSlices(settingSlice, scriptSlice);
|
const rootReducer = combineSlices(configSlice, scriptSlice);
|
||||||
// Infer the `RootState` type from the root reducer
|
// Infer the `RootState` type from the root reducer
|
||||||
export type RootState = ReturnType<typeof rootReducer>;
|
export type RootState = ReturnType<typeof rootReducer>;
|
||||||
|
|
||||||
|
58
src/pkg/config/chrome_storage.ts
Normal file
58
src/pkg/config/chrome_storage.ts
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
export default class ChromeStorage {
|
||||||
|
private prefix: string;
|
||||||
|
|
||||||
|
private storage: chrome.storage.StorageArea;
|
||||||
|
|
||||||
|
constructor(prefix: string, sync: boolean) {
|
||||||
|
this.prefix = `${prefix}_`;
|
||||||
|
this.storage = sync ? chrome.storage.sync : chrome.storage.local;
|
||||||
|
}
|
||||||
|
|
||||||
|
public buildKey(key: string): string {
|
||||||
|
return this.prefix + key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get(key: string): Promise<any> {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
key = this.buildKey(key);
|
||||||
|
this.storage.get(key, (items) => {
|
||||||
|
resolve(items[key]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public set(key: string, value: any): Promise<void> {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
const kvp: { [key: string]: any } = {};
|
||||||
|
kvp[this.buildKey(key)] = value;
|
||||||
|
this.storage.set(kvp, () => resolve());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public remove(key: string): Promise<void> {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
this.storage.remove(this.buildKey(key), () => resolve());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public removeAll(): Promise<void> {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
this.storage.clear(() => resolve());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public keys(): Promise<{ [key: string]: any }> {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
const ret: { [key: string]: any } = {};
|
||||||
|
const prefix = this.buildKey("");
|
||||||
|
this.storage.get((items) => {
|
||||||
|
Object.keys(items).forEach((key) => {
|
||||||
|
if (key.startsWith(prefix)) {
|
||||||
|
ret[key.substring(prefix.length)] = items[key];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
resolve(ret);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
217
src/pkg/config/config.ts
Normal file
217
src/pkg/config/config.ts
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
import { Message } from "@arco-design/web-react";
|
||||||
|
import ChromeStorage from "./chrome_storage";
|
||||||
|
import { defaultConfig } from "../../../eslint/linter-config";
|
||||||
|
import { FileSystemType } from "@Packages/filesystem/factory";
|
||||||
|
import { MessageQueue } from "@Packages/message/message_queue";
|
||||||
|
|
||||||
|
export const SystamConfigChange = "systemConfigChange";
|
||||||
|
|
||||||
|
export type CloudSyncConfig = {
|
||||||
|
enable: boolean;
|
||||||
|
syncDelete: boolean;
|
||||||
|
filesystem: FileSystemType;
|
||||||
|
params: { [key: string]: any };
|
||||||
|
};
|
||||||
|
|
||||||
|
export type CATFileStorage = {
|
||||||
|
filesystem: FileSystemType;
|
||||||
|
params: { [key: string]: any };
|
||||||
|
status: "unset" | "success" | "error";
|
||||||
|
};
|
||||||
|
|
||||||
|
export class SystemConfig {
|
||||||
|
public cache = new Map<string, any>();
|
||||||
|
|
||||||
|
public storage = new ChromeStorage("system", true);
|
||||||
|
|
||||||
|
constructor(private mq: MessageQueue) {
|
||||||
|
this.mq.subscribe("systemConfigChange", (msg) => {
|
||||||
|
const { key, value } = msg;
|
||||||
|
this.cache.set(key, value);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async getAll(): Promise<{ [key: string]: any }> {
|
||||||
|
const ret: { [key: string]: any } = {};
|
||||||
|
const list = await this.storage.keys();
|
||||||
|
Object.keys(list).forEach((key) => {
|
||||||
|
this.cache.set(key, list[key]);
|
||||||
|
ret[key] = list[key];
|
||||||
|
});
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
get<T>(key: string, defaultValue: T): Promise<T> {
|
||||||
|
if (this.cache.has(key)) {
|
||||||
|
return Promise.resolve(this.cache.get(key));
|
||||||
|
}
|
||||||
|
return this.storage.get(key).then((val) => {
|
||||||
|
if (val === undefined) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
this.cache.set(key, val);
|
||||||
|
return val;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public set(key: string, val: any) {
|
||||||
|
this.cache.set(key, val);
|
||||||
|
this.storage.set(key, val);
|
||||||
|
// 发送消息通知更新
|
||||||
|
this.mq.publish(SystamConfigChange, {
|
||||||
|
key,
|
||||||
|
value: val,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public getChangetime() {
|
||||||
|
return this.get("changetime", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public setChangetime(n: number) {
|
||||||
|
this.set("changetime", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查更新周期,单位为秒
|
||||||
|
public getCheckScriptUpdateCycle() {
|
||||||
|
return this.get("check_script_update_cycle", 86400);
|
||||||
|
}
|
||||||
|
|
||||||
|
public setCheckScriptUpdateCycle(n: number) {
|
||||||
|
this.set("check_script_update_cycle", n);
|
||||||
|
}
|
||||||
|
|
||||||
|
public getSilenceUpdateScript() {
|
||||||
|
return this.get("silence_update_script", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public setSilenceUpdateScript(val: boolean) {
|
||||||
|
this.set("silence_update_script", val);
|
||||||
|
}
|
||||||
|
|
||||||
|
public getEnableAutoSync() {
|
||||||
|
return this.get("enable_auto_sync", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public setEnableAutoSync(enable: boolean) {
|
||||||
|
this.set("enable_auto_sync", enable);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新已经禁用的脚本
|
||||||
|
public getUpdateDisableScript() {
|
||||||
|
return this.get("update_disable_script", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public setUpdateDisableScript(enable: boolean) {
|
||||||
|
this.set("update_disable_script", enable);
|
||||||
|
}
|
||||||
|
|
||||||
|
public getVscodeUrl() {
|
||||||
|
return this.get("vscode_url", "ws://localhost:8642");
|
||||||
|
}
|
||||||
|
|
||||||
|
public setVscodeUrl(val: string) {
|
||||||
|
this.set("vscode_url", val);
|
||||||
|
}
|
||||||
|
|
||||||
|
public getVscodeReconnect() {
|
||||||
|
return this.get("vscode_reconnect", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public setVscodeReconnect(val: boolean) {
|
||||||
|
this.set("vscode_reconnect", val);
|
||||||
|
}
|
||||||
|
|
||||||
|
public getBackup(): Promise<{
|
||||||
|
filesystem: FileSystemType;
|
||||||
|
params: { [key: string]: any };
|
||||||
|
}> {
|
||||||
|
return this.get("backup", {
|
||||||
|
filesystem: "webdav",
|
||||||
|
params: {},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public setBackup(data: { filesystem: FileSystemType; params: { [key: string]: any } }) {
|
||||||
|
this.set("backup", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
getCloudSync(): Promise<CloudSyncConfig> {
|
||||||
|
return this.get("cloud_sync", {
|
||||||
|
enable: false,
|
||||||
|
syncDelete: true,
|
||||||
|
filesystem: "webdav",
|
||||||
|
params: {},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setCloudSync(data: CloudSyncConfig) {
|
||||||
|
this.set("cloud_sync", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
getCatFileStorage(): Promise<CATFileStorage> {
|
||||||
|
return this.get("cat_file_storage", {
|
||||||
|
status: "unset",
|
||||||
|
filesystem: "webdav",
|
||||||
|
params: {},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setCatFileStorage(data: CATFileStorage | undefined) {
|
||||||
|
this.set("cat_file_storage", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
getEnableEslint() {
|
||||||
|
return this.get("enable_eslint", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
setEnableEslint(val: boolean) {
|
||||||
|
this.set("enable_eslint", val);
|
||||||
|
}
|
||||||
|
|
||||||
|
getEslintConfig() {
|
||||||
|
return this.get("eslint_config", defaultConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
setEslintConfig(v: string) {
|
||||||
|
if (v === "") {
|
||||||
|
this.set("eslint_config", v);
|
||||||
|
Message.success("ESLint规则已重置");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
JSON.parse(v);
|
||||||
|
this.set("eslint_config", v);
|
||||||
|
Message.success("ESLint规则已保存");
|
||||||
|
} catch (err: any) {
|
||||||
|
Message.error(err.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 日志清理周期
|
||||||
|
getLogCleanCycle() {
|
||||||
|
return this.get("log_clean_cycle", 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
setLogCleanCycle(val: number) {
|
||||||
|
this.set("log_clean_cycle", val);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置脚本列表列宽度
|
||||||
|
getScriptListColumnWidth() {
|
||||||
|
return this.get<{ [key: string]: number }>("script_list_column_width", {});
|
||||||
|
}
|
||||||
|
|
||||||
|
setScriptListColumnWidth(val: { [key: string]: number }) {
|
||||||
|
this.set("script_list_column_width", val);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 展开菜单数
|
||||||
|
getMenuExpandNum() {
|
||||||
|
return this.get("menu_expand_num", 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
setMenuExpandNum(val: number) {
|
||||||
|
this.set("menu_expand_num", val);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user