feat(plugin service)

This commit is contained in:
star
2025-08-19 19:12:06 +08:00
parent 5d3d9a7214
commit f186769f33
11 changed files with 916 additions and 636 deletions

86
package-lock.json generated
View File

@@ -35,6 +35,7 @@
"marked": "^16.1.2",
"mitt": "^3.0.1",
"NeteaseCloudMusicApi": "^4.27.0",
"node-fetch": "^3.3.2",
"pinia": "^3.0.3",
"tdesign-vue-next": "^1.15.2",
"vue-router": "^4.5.1"
@@ -8632,6 +8633,28 @@
"pend": "~1.2.0"
}
},
"node_modules/fetch-blob": {
"version": "3.2.0",
"resolved": "https://registry.npmmirror.com/fetch-blob/-/fetch-blob-3.2.0.tgz",
"integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/jimmywarting"
},
{
"type": "paypal",
"url": "https://paypal.me/jimmywarting"
}
],
"dependencies": {
"node-domexception": "^1.0.0",
"web-streams-polyfill": "^3.0.3"
},
"engines": {
"node": "^12.20 || >= 14.13"
}
},
"node_modules/figures": {
"version": "6.1.0",
"resolved": "https://registry.npmmirror.com/figures/-/figures-6.1.0.tgz",
@@ -8894,6 +8917,17 @@
"node": ">= 6"
}
},
"node_modules/formdata-polyfill": {
"version": "4.0.10",
"resolved": "https://registry.npmmirror.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
"integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
"dependencies": {
"fetch-blob": "^3.1.2"
},
"engines": {
"node": ">=12.20.0"
}
},
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
@@ -11504,6 +11538,50 @@
"node": ">=10"
}
},
"node_modules/node-domexception": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz",
"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
"deprecated": "Use your platform's native DOMException instead",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/jimmywarting"
},
{
"type": "github",
"url": "https://paypal.me/jimmywarting"
}
],
"engines": {
"node": ">=10.5.0"
}
},
"node_modules/node-fetch": {
"version": "3.3.2",
"resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-3.3.2.tgz",
"integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
"dependencies": {
"data-uri-to-buffer": "^4.0.0",
"fetch-blob": "^3.1.4",
"formdata-polyfill": "^4.0.10"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/node-fetch"
}
},
"node_modules/node-fetch/node_modules/data-uri-to-buffer": {
"version": "4.0.1",
"resolved": "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
"integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
"engines": {
"node": ">= 12"
}
},
"node_modules/node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz",
@@ -16286,6 +16364,14 @@
"defaults": "^1.0.3"
}
},
"node_modules/web-streams-polyfill": {
"version": "3.3.3",
"resolved": "https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
"integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
"engines": {
"node": ">= 8"
}
},
"node_modules/webpack-virtual-modules": {
"version": "0.6.2",
"resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",

View File

@@ -50,6 +50,7 @@
"marked": "^16.1.2",
"mitt": "^3.0.1",
"NeteaseCloudMusicApi": "^4.27.0",
"node-fetch": "^3.3.2",
"pinia": "^3.0.3",
"tdesign-vue-next": "^1.15.2",
"vue-router": "^4.5.1"

View File

@@ -4,6 +4,7 @@ import { electronApp, optimizer, is } from '@electron-toolkit/utils'
import icon from '../../resources/logo.png?asset'
import path from 'node:path'
import musicService from './services/music'
import pluginService from './services/plugin'
import { AIService } from './services/ai-service'
let tray: Tray | null = null
@@ -107,19 +108,32 @@ function createWindow(): void {
})
mainWindow.webContents.setWindowOpenHandler((details) => {
shell.openExternal(details.url)
shell.openExternal(details.url).then()
return { action: 'deny' }
})
// HMR for renderer base on electron-vite cli.
// Load the remote URL for development or the local html file for production.
if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']).then()
} else {
mainWindow.loadFile(join(__dirname, '../renderer/index.html'))
mainWindow.loadFile(join(__dirname, '../renderer/index.html')).then()
}
}
ipcMain.handle('service-plugin-addPlugin', async (_, pluginCode, pluginName): Promise<any> => {
return await (pluginService as any).addPlugin(pluginCode, pluginName)
})
ipcMain.handle('service-plugin-getPluginById', async (_, id): Promise<any> => {
return await (pluginService as any).getPluginById(id)
})
// eslint-disable-next-line @typescript-eslint/no-unused-vars
ipcMain.handle('service-plugin-loadAllPlugins', async (_): Promise<any> => {
return await (pluginService as any).getPluginById()
})
ipcMain.handle('service-music-request', async (_, api, args) => {
return await musicService.request(api, args)
})

View File

@@ -20,7 +20,7 @@ import {
import { SongDetailResponse, SongResponse } from './service-base'
import { fieldsSelector } from '../../utils/object'
import * as electron from 'electron'
import { getAppDirPath } from '../../utils/path'
const baseUrl: string = 'https://music.163.com'
const baseTwoUrl: string = 'https://www.lihouse.xyz/coco_widget'
@@ -140,13 +140,8 @@ export const netEaseService: MusicServiceBase = {
async downloadSingleSong({ id }: DownloadSingleSongArgs) {
const songDownloadDetail = await this.getSongUrl({ id })
let basePath: string = electron.app.getAppPath()
if (basePath.endsWith('.asar')) {
basePath = path.join(path.dirname(basePath), '../')
}
const songPath = path.join(
basePath,
getAppDirPath(),
'download',
'songs',
`${songDownloadDetail.name}-${songDownloadDetail.artist}-${songDownloadDetail.id}.mp3`

View File

@@ -0,0 +1,82 @@
/* eslint-disable */
import fs from 'fs'
import path from 'path'
import fsPromise from 'fs/promises'
import { randomUUID } from 'crypto'
import { getAppDirPath } from '../../utils/path'
const CeruMusicPluginHost = require('./manager/CeruMusicPluginHost')
import Logger from './logger'
const loadedPlugins = {}
const pluginService = {
async addPlugin(pluginCode, pluginName) {
const pluginId = randomUUID().replace(/-/g, '')
const ceruPluginManager = new CeruMusicPluginHost()
await ceruPluginManager.loadPlugin(pluginCode, new Logger(pluginId))
const filePath = path.join(getAppDirPath(), 'plugins', `${pluginId}-${pluginName}`)
if (fs.existsSync(filePath)) {
throw new Error('插件已存在')
}
await fsPromise.mkdir(path.dirname(filePath), { recursive: true })
await fsPromise.writeFile(
path.join(getAppDirPath(), 'plugins', `${pluginId}-${pluginName}`),
pluginCode
)
return {
pluginId,
pluginName,
pluginInfo: ceruPluginManager.getPluginInfo(),
supportedSources: ceruPluginManager.getSupportedSources(),
plugin: ceruPluginManager
}
},
getPluginById(pluginId) {
if (!Object.hasOwn(loadedPlugins, pluginId)) {
return null
}
return loadedPlugins[pluginId]
},
async loadAllPlugins() {
let pluginDirPath = path.join(getAppDirPath(), 'plugins')
if (!fs.existsSync(pluginDirPath)) {
return
}
let files = []
try {
files = await fsPromise.readdir(pluginDirPath, { recursive: true, withFileTypes: true })
} catch (err) {
console.error(err)
throw new Error(`无法读取插件目录${err.message ? ': ' + err.message : ''}`)
}
return Promise.all(
files.map(async (file) => {
const pluginId = file.name.split('-')[0]
const pluginName = file.name.split('-').slice(1).join('-')
const fullPath = path.join(pluginDirPath, file.name)
const ceruPluginManager = new CeruMusicPluginHost()
await ceruPluginManager.loadPlugin(fullPath)
loadedPlugins[pluginId] = ceruPluginManager
return {
pluginId,
pluginName,
pluginInfo: ceruPluginManager.getPluginInfo(),
supportedSources: ceruPluginManager.getSupportedSources()
}
})
)
}
}
export default pluginService

View File

@@ -0,0 +1,31 @@
import path from 'path'
import fs from 'fs'
import fsPromise from 'fs/promises'
import { getAppDirPath } from '../../utils/path'
class Logger {
private readonly logFilePath: string
constructor(pluginId: string) {
this.logFilePath = path.join(getAppDirPath(), pluginId, 'log.txt')
fsPromise.mkdir(path.dirname(this.logFilePath), { recursive: true }).then()
}
info(...args: any[]) {
this.write(`info ${args.join(' ')}`)
}
warn(...args: any[]) {
this.write(`warn ${args.join(' ')}`)
}
error(...args: any[]) {
this.write(`error ${args.join(' ')}`)
}
private write(msg: string) {
fs.appendFileSync(this.logFilePath, `${msg}\n`)
}
}
export default Logger

View File

@@ -0,0 +1,370 @@
/* eslint-disable */
const vm = require('vm');
const fetch = require('node-fetch');
/**
* CeruMusic 插件引擎
* 负责加载和执行单个插件并提供一个简洁的API。
*/
class CeruMusicPluginHost {
/**
* @param {string | null} pluginCode 插件的 JavaScript 代码字符串(可选)
* @param {any} logger
*/
constructor(pluginCode = null, logger=console) {
this.pluginCode = pluginCode;
this.plugin = null; // 存储插件导出的对象
if (pluginCode) {
this._initialize(logger);
}
}
/**
* 从文件加载插件
* @param {string} pluginPath 插件文件路径
* @param {any} logger
*/
async loadPlugin(pluginPath, logger=console) {
const fs = require('fs');
this.pluginCode = fs.readFileSync(pluginPath, 'utf-8');
this._initialize(logger);
return this.plugin;
}
/**
* 初始化沙箱环境,加载并验证插件
* @private
*/
_initialize(console) {
// 提供给插件的API
const cerumusicApi = {
env: 'nodejs',
version: '1.0.0',
utils: {
buffer: {
from: (data, encoding) => Buffer.from(data, encoding),
bufToString: (buffer, encoding) => buffer.toString(encoding),
},
},
request: (url, options, callback) => {
// 支持 Promise 和 callback 两种调用方式
if (typeof options === 'function') {
callback = options;
options = { method: 'GET' };
}
const makeRequest = async () => {
try {
console.log(`[CeruMusic] 发起请求: ${url}`);
// 添加超时设置
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时
const requestOptions = {
method: 'GET',
...options,
signal: controller.signal
};
const response = await fetch(url, requestOptions);
clearTimeout(timeoutId);
console.log(`[CeruMusic] 请求响应状态: ${response.status}`);
// 尝试解析JSON如果失败则返回文本
let body;
const contentType = response.headers.get('content-type');
try {
if (contentType && contentType.includes('application/json')) {
body = await response.json();
} else {
const text = await response.text();
console.log(`[CeruMusic] 响应不是JSON格式内容: ${text.substring(0, 200)}...`);
// 对于非JSON响应创建一个错误状态的body
body = {
code: response.status,
msg: `Expected JSON response but got: ${contentType || 'unknown content type'}`,
data: text
};
}
} catch (parseError) {
console.error(`[CeruMusic] 解析响应失败: ${parseError.message}`);
// 解析失败时创建错误body
body = {
code: response.status,
msg: `Failed to parse response: ${parseError.message}`
};
}
console.log(`[CeruMusic] 请求响应内容:`, body);
const result = {
body,
statusCode: response.status,
headers: response.headers.raw(),
};
if (callback) {
callback(null, result);
}
return result;
} catch (error) {
console.error(`[CeruMusic] Request failed: ${error.message}`);
if (callback) {
// 网络错误时,调用 callback(error, null)
callback(error, null);
} else {
throw error;
}
}
};
if (callback) {
makeRequest().catch(() => {}); // 错误已在makeRequest中处理
} else {
return makeRequest();
}
},
};
const sandbox = {
module: { exports: {} },
cerumusic: cerumusicApi,
console: console,
setTimeout: setTimeout,
clearTimeout: clearTimeout,
setInterval: setInterval,
clearInterval: clearInterval,
Buffer: Buffer,
JSON: JSON,
require: () => ({}),
global: {},
process: { env: {} }
};
try {
// 在沙箱中执行插件代码
vm.runInNewContext(this.pluginCode, sandbox);
this.plugin = sandbox.module.exports;
console.log(`[CeruMusic] Plugin "${this.plugin.pluginInfo.name}" loaded successfully.`);
} catch (e) {
console.error('[CeruMusic] Error executing plugin code:', e);
throw new Error('Failed to initialize plugin.');
}
// 验证插件结构
if (!this.plugin.pluginInfo || !this.plugin.sources || !this.plugin.musicUrl) {
throw new Error('Invalid plugin structure. Required fields: pluginInfo, sources, musicUrl.');
}
}
/**
* 获取插件信息
*/
getPluginInfo() {
return this.plugin.pluginInfo;
}
/**
* 获取支持的音源和音质信息
*/
getSupportedSources() {
return this.plugin.sources;
}
/**
* 调用插件的 getMusicUrl 方法
* @param {string} source 音源标识
* @param {object} musicInfo 音乐信息
* @param {string} quality 音质
*/
async getMusicUrl(source, musicInfo, quality) {
try {
if (typeof this.plugin.musicUrl !== 'function') {
throw new Error(`Action "musicUrl" is not implemented in plugin.`);
}
console.log(`[CeruMusic] 开始调用插件的 musicUrl 方法...`);
// 将 cerumusic API 绑定到函数调用的 this 上下文
const result = await this.plugin.musicUrl.call(
{ cerumusic: this._getCerumusicApi() },
source,
musicInfo,
quality
);
console.log(`[CeruMusic] 插件 musicUrl 方法调用成功`);
return result;
} catch (error) {
console.error(`[CeruMusic] getMusicUrl 方法执行失败:`, error.message);
console.error(`[CeruMusic] 错误堆栈:`, error.stack);
// 重新抛出错误,确保外部可以捕获
throw new Error(`Plugin getMusicUrl failed: ${error.message}`);
}
}
/**
* 获取 cerumusic API 对象
* @private
*/
_getCerumusicApi() {
return {
env: 'nodejs',
version: '1.0.0',
utils: {
buffer: {
from: (data, encoding) => Buffer.from(data, encoding),
bufToString: (buffer, encoding) => buffer.toString(encoding),
},
},
request: (url, options, callback) => {
// 支持 Promise 和 callback 两种调用方式
if (typeof options === 'function') {
callback = options;
options = { method: 'GET' };
}
const makeRequest = async () => {
try {
console.log(`[CeruMusic] 发起请求: ${url}`);
// 添加超时设置
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时
const requestOptions = {
method: 'GET',
...options,
signal: controller.signal
};
const response = await fetch(url, requestOptions);
clearTimeout(timeoutId);
console.log(`[CeruMusic] 请求响应状态: ${response.status}`);
// 尝试解析JSON如果失败则返回文本
let body;
const contentType = response.headers.get('content-type');
try {
if (contentType && contentType.includes('application/json')) {
body = await response.json();
} else {
const text = await response.text();
console.log(`[CeruMusic] 响应不是JSON格式内容: ${text.substring(0, 200)}...`);
// 对于非JSON响应创建一个错误状态的body
body = {
code: response.status,
msg: `Expected JSON response but got: ${contentType || 'unknown content type'}`,
data: text
};
}
} catch (parseError) {
console.error(`[CeruMusic] 解析响应失败: ${parseError.message}`);
// 解析失败时创建错误body
body = {
code: response.status,
msg: `Failed to parse response: ${parseError.message}`
};
}
console.log(`[CeruMusic] 请求响应内容:`, body);
const result = {
body,
statusCode: response.status,
headers: response.headers.raw(),
};
if (callback) {
callback(null, result);
}
return result;
} catch (error) {
console.error(`[CeruMusic] Request failed: ${error.message}`);
if (callback) {
// 网络错误时,调用 callback(error, null)
callback(error, null);
} else {
throw error;
}
}
};
if (callback) {
makeRequest().catch(() => {}); // 错误已在makeRequest中处理
} else {
return makeRequest();
}
},
};
}
/**
* 调用插件的 getPic 方法
* @param {string} source 音源标识
* @param {object} musicInfo 音乐信息
*/
async getPic(source, musicInfo) {
try {
if (typeof this.plugin.getPic !== 'function') {
throw new Error(`Action "getPic" is not implemented in plugin.`);
}
console.log(`[CeruMusic] 开始调用插件的 getPic 方法...`);
const result = await this.plugin.getPic.call(
{ cerumusic: this._getCerumusicApi() },
source,
musicInfo
);
console.log(`[CeruMusic] 插件 getPic 方法调用成功`);
return result;
} catch (error) {
console.error(`[CeruMusic] getPic 方法执行失败:`, error.message);
throw new Error(`Plugin getPic failed: ${error.message}`);
}
}
/**
* 调用插件的 getLyric 方法
* @param {string} source 音源标识
* @param {object} musicInfo 音乐信息
*/
async getLyric(source, musicInfo) {
try {
if (typeof this.plugin.getLyric !== 'function') {
throw new Error(`Action "getLyric" is not implemented in plugin.`);
}
console.log(`[CeruMusic] 开始调用插件的 getLyric 方法...`);
const result = await this.plugin.getLyric.call(
{ cerumusic: this._getCerumusicApi() },
source,
musicInfo
);
console.log(`[CeruMusic] 插件 getLyric 方法调用成功`);
return result;
} catch (error) {
console.error(`[CeruMusic] getLyric 方法执行失败:`, error.message);
throw new Error(`Plugin getLyric failed: ${error.message}`);
}
}
}
module.exports = CeruMusicPluginHost;

View File

@@ -0,0 +1,263 @@
const fs = require('fs');
function convertEventDrivenPlugin(inputFile) {
console.log('检测到事件驱动插件,使用事件包装器转换...');
const originalCode = fs.readFileSync(inputFile, 'utf-8');
// 提取插件信息
const nameMatch = originalCode.match(/@name\s+(.+)/);
const versionMatch = originalCode.match(/@version\s+(.+)/);
const descMatch = originalCode.match(/@description\s+(.+)/);
const pluginName = nameMatch ? nameMatch[1].trim() : "未知插件";
const pluginVersion = versionMatch ? versionMatch[1].trim() : "1.0.0";
const pluginDesc = descMatch ? descMatch[1].trim() : "从事件驱动插件转换而来";
return `/**
* 由 CeruMusic 插件转换器转换 - @author sqj
* @name ${pluginName}
* @version ${pluginVersion}
* @description ${pluginDesc}
*/
const pluginInfo = {
name: "${pluginName}",
version: "${pluginVersion}",
author: "Unknown",
description: "${pluginDesc}"
};
// 原始插件代码
const originalPluginCode = ${JSON.stringify(originalCode)};
// 插件状态
let isInitialized = false;
let pluginSources = {};
let requestHandler = null;
function initializePlugin() {
if (isInitialized) return;
const { request, utils } = cerumusic;
// 创建完整的 lx 模拟环境
const mockLx = {
EVENT_NAMES: {
request: 'request',
inited: 'inited',
updateAlert: 'updateAlert'
},
on: (event, handler) => {
console.log(\`[${ pluginName + ' by Ceru插件' || 'ceru插件' }] 注册事件监听器: \${event}\`);
if (event === 'request') {
requestHandler = handler;
}
},
send: (event, data) => {
console.log(\`[${ pluginName + ' by Ceru插件' || 'ceru插件' }] 发送事件: \${event}\`, data);
if (event === 'inited' && data.sources) {
pluginSources = data.sources;
console.log('[${ pluginName + ' by Ceru插件' || 'ceru插件' }] 音源注册完成:', Object.keys(pluginSources));
}
},
request: request,
utils: {
buffer: utils.buffer,
crypto: {
aesEncrypt: (data, mode, key, iv) => {
// 简化的 AES 加密实现
try {
return utils.crypto ? utils.crypto.aesEncrypt(data, mode, key, iv) : data;
} catch (e) {
return data;
}
},
md5: (str) => {
try {
return utils.crypto ? utils.crypto.md5(str) : str;
} catch (e) {
return str;
}
},
randomBytes: (size) => {
try {
return utils.crypto ? utils.crypto.randomBytes(size) : Buffer.alloc(size);
} catch (e) {
return Buffer.alloc(size);
}
},
rsaEncrypt: (data, key) => {
try {
return utils.crypto ? utils.crypto.rsaEncrypt(data, key) : data;
} catch (e) {
return data;
}
}
}
},
version: '1.0.0',
currentScriptInfo: {
rawScript: originalPluginCode,
version: '1.0.0' // 添加版本信息
},
env: 'nodejs' // 添加环境信息
};
// 创建全局环境
const globalThis = {
lx: mockLx
};
// 创建沙箱环境
const sandbox = {
globalThis: globalThis,
lx: mockLx,
console: console,
setTimeout: setTimeout,
clearTimeout: clearTimeout,
setInterval: setInterval,
clearInterval: clearInterval,
Buffer: Buffer,
JSON: JSON,
require: () => ({}),
module: { exports: {} },
exports: {},
process: { env: { NODE_ENV: 'production' } }
};
try {
// 使用 Function 构造器执行插件代码
const pluginFunction = new Function(
'globalThis', 'lx', 'console', 'setTimeout', 'clearTimeout',
'setInterval', 'clearInterval', 'Buffer', 'JSON', 'require',
'module', 'exports', 'process',
originalPluginCode
);
pluginFunction(
globalThis, mockLx, console, setTimeout, clearTimeout,
setInterval, clearInterval, Buffer, JSON, () => ({}),
{ exports: {} }, {}, { env: { NODE_ENV: 'production' } }
);
isInitialized = true;
console.log(\`[CeruMusic] 事件驱动插件初始化成功\`);
} catch (error) {
console.log(\`[CeruMusic] 插件初始化完成: \${error.message}\`);
isInitialized = true;
}
}
// 从插件源码中提取音源信息作为备用
const sources = {};
// 尝试从代码中提取音源信息
const sourceMatches = originalPluginCode.match(/sources\\[['"]([^'"]+)['"]\\]\\s*=\\s*apiInfo\\.info/g);
if (sourceMatches) {
sourceMatches.forEach(match => {
const sourceId = match.match(/['"]([^'"]+)['"]/)[1];
sources[sourceId] = {
name: sourceId.toUpperCase() + '音乐',
type: 'music',
qualitys: ['128k', '320k']
};
});
} else {
// 默认音源配置
sources.kw = { name: "酷我音乐", type: "music", qualitys: ["128k", "320k"] };
sources.kg = { name: "酷狗音乐", type: "music", qualitys: ["128k"] };
sources.tx = { name: "QQ音乐", type: "music", qualitys: ["128k"] };
sources.wy = { name: "网易云音乐", type: "music", qualitys: ["128k", "320k"] };
sources.mg = { name: "咪咕音乐", type: "music", qualitys: ["128k"] };
}
async function musicUrl(source, musicInfo, quality) {
// 确保插件已初始化
initializePlugin();
// 等待一小段时间让插件完全初始化
await new Promise(resolve => setTimeout(resolve, 100));
if (!requestHandler) {
const errorMessage = '插件请求处理器未初始化';
console.error(\`[\${pluginInfo.name}] Error: \${errorMessage}\`);
throw new Error(errorMessage);
}
console.log(\`[\${pluginInfo.name}] 使用事件驱动方式获取 \${source} 音源链接\`);
try {
// 调用插件的请求处理器
const result = await requestHandler({
source: source,
action: 'musicUrl',
info: {
musicInfo: musicInfo,
type: quality
}
});
// 检查结果是否有效
if (!result) {
const errorMessage = \`获取 \${source} 音源链接失败: 返回结果为空\`;
console.error(\`[\${pluginInfo.name}] Error: \${errorMessage}\`);
throw new Error(errorMessage);
}
// 如果结果是对象且包含错误信息
if (typeof result === 'object' && result.error) {
const errorMessage = result.error || \`获取 \${source} 音源链接失败\`;
console.error(\`[\${pluginInfo.name}] Error: \${errorMessage}\`);
throw new Error(errorMessage);
}
// 如果结果是对象且包含状态码
if (typeof result === 'object' && result.code && result.code !== 200) {
const errorMessage = result.msg || \`接口错误 (Code: \${result.code})\`;
console.error(\`[\${pluginInfo.name}] Error: \${errorMessage}\`);
throw new Error(errorMessage);
}
console.log(\`[\${pluginInfo.name}] Got URL: \${typeof result === 'string' ? result : result.url || result}\`);
return result;
} catch (error) {
// 确保错误信息格式与 example-plugin.js 一致
const errorMessage = error.message || \`获取 \${source} 音源链接时发生未知错误\`;
console.error(\`[\${pluginInfo.name}] Error: \${errorMessage}\`);
throw new Error(errorMessage);
}
}
module.exports = {
pluginInfo,
sources,
musicUrl
};`;
}
// 主函数
function main() {
const inputFile = process.argv[2];
const outputFile = process.argv[3] || 'event-driven-plugin.js';
if (!inputFile) {
console.error('使用方法: node converter-event-driven.js <输入文件> [输出文件]');
process.exit(1);
}
try {
const result = convertEventDrivenPlugin(inputFile);
fs.writeFileSync(outputFile, result);
console.log('\\n🎉 事件驱动插件转换成功!');
console.log(` 新插件已保存至: ${outputFile}`);
} catch (error) {
console.error('❌ 转换失败:', error.message);
process.exit(1);
}
}
if (require.main === module) {
main();
}

14
src/main/utils/path.ts Normal file
View File

@@ -0,0 +1,14 @@
import electron from 'electron'
import path from 'path'
function getAppDirPath() {
let dirPath: string = electron.app.getAppPath()
if (dirPath.endsWith('.asar')) {
dirPath = path.join(path.dirname(dirPath), '../')
}
return dirPath
}
export {
getAppDirPath
}

View File

@@ -2,6 +2,8 @@
"files": [],
"references": [{ "path": "./tsconfig.node.json" }, { "path": "./tsconfig.web.json" }],
"compilerOptions": {
"noImplicitAny": false
"noImplicitAny": false,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true
}
}

672
yarn.lock
View File

@@ -432,138 +432,6 @@
minimatch "^9.0.3"
plist "^3.1.0"
"@emnapi/runtime@^1.2.0":
version "1.4.5"
resolved "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.4.5.tgz"
integrity sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==
dependencies:
tslib "^2.4.0"
"@esbuild/aix-ppc64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz"
integrity sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==
"@esbuild/android-arm@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.9.tgz"
integrity sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==
"@esbuild/android-arm64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz"
integrity sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==
"@esbuild/android-x64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.9.tgz"
integrity sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==
"@esbuild/darwin-arm64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz"
integrity sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==
"@esbuild/darwin-x64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz"
integrity sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==
"@esbuild/freebsd-arm64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz"
integrity sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==
"@esbuild/freebsd-x64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz"
integrity sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==
"@esbuild/linux-arm@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz"
integrity sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==
"@esbuild/linux-arm64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz"
integrity sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==
"@esbuild/linux-ia32@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz"
integrity sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==
"@esbuild/linux-loong64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz"
integrity sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==
"@esbuild/linux-mips64el@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz"
integrity sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==
"@esbuild/linux-ppc64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz"
integrity sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==
"@esbuild/linux-riscv64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz"
integrity sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==
"@esbuild/linux-s390x@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz"
integrity sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==
"@esbuild/linux-x64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz"
integrity sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==
"@esbuild/netbsd-arm64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz"
integrity sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==
"@esbuild/netbsd-x64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz"
integrity sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==
"@esbuild/openbsd-arm64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz"
integrity sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==
"@esbuild/openbsd-x64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz"
integrity sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==
"@esbuild/openharmony-arm64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz"
integrity sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==
"@esbuild/sunos-x64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz"
integrity sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==
"@esbuild/win32-arm64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz"
integrity sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==
"@esbuild/win32-ia32@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz"
integrity sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==
"@esbuild/win32-x64@0.25.9":
version "0.25.9"
resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz"
@@ -668,114 +536,6 @@
resolved "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.4.3.tgz"
integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
"@img/sharp-darwin-arm64@0.33.5":
version "0.33.5"
resolved "https://registry.npmmirror.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz"
integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==
optionalDependencies:
"@img/sharp-libvips-darwin-arm64" "1.0.4"
"@img/sharp-darwin-x64@0.33.5":
version "0.33.5"
resolved "https://registry.npmmirror.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz"
integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==
optionalDependencies:
"@img/sharp-libvips-darwin-x64" "1.0.4"
"@img/sharp-libvips-darwin-arm64@1.0.4":
version "1.0.4"
resolved "https://registry.npmmirror.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz"
integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==
"@img/sharp-libvips-darwin-x64@1.0.4":
version "1.0.4"
resolved "https://registry.npmmirror.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz"
integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==
"@img/sharp-libvips-linux-arm@1.0.5":
version "1.0.5"
resolved "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz"
integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==
"@img/sharp-libvips-linux-arm64@1.0.4":
version "1.0.4"
resolved "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz"
integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==
"@img/sharp-libvips-linux-s390x@1.0.4":
version "1.0.4"
resolved "https://registry.npmmirror.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz"
integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==
"@img/sharp-libvips-linux-x64@1.0.4":
version "1.0.4"
resolved "https://registry.npmmirror.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz"
integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==
"@img/sharp-libvips-linuxmusl-arm64@1.0.4":
version "1.0.4"
resolved "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz"
integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==
"@img/sharp-libvips-linuxmusl-x64@1.0.4":
version "1.0.4"
resolved "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz"
integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==
"@img/sharp-linux-arm@0.33.5":
version "0.33.5"
resolved "https://registry.npmmirror.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz"
integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==
optionalDependencies:
"@img/sharp-libvips-linux-arm" "1.0.5"
"@img/sharp-linux-arm64@0.33.5":
version "0.33.5"
resolved "https://registry.npmmirror.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz"
integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==
optionalDependencies:
"@img/sharp-libvips-linux-arm64" "1.0.4"
"@img/sharp-linux-s390x@0.33.5":
version "0.33.5"
resolved "https://registry.npmmirror.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz"
integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==
optionalDependencies:
"@img/sharp-libvips-linux-s390x" "1.0.4"
"@img/sharp-linux-x64@0.33.5":
version "0.33.5"
resolved "https://registry.npmmirror.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz"
integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==
optionalDependencies:
"@img/sharp-libvips-linux-x64" "1.0.4"
"@img/sharp-linuxmusl-arm64@0.33.5":
version "0.33.5"
resolved "https://registry.npmmirror.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz"
integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==
optionalDependencies:
"@img/sharp-libvips-linuxmusl-arm64" "1.0.4"
"@img/sharp-linuxmusl-x64@0.33.5":
version "0.33.5"
resolved "https://registry.npmmirror.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz"
integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==
optionalDependencies:
"@img/sharp-libvips-linuxmusl-x64" "1.0.4"
"@img/sharp-wasm32@0.33.5":
version "0.33.5"
resolved "https://registry.npmmirror.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz"
integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==
dependencies:
"@emnapi/runtime" "^1.2.0"
"@img/sharp-win32-ia32@0.33.5":
version "0.33.5"
resolved "https://registry.npmmirror.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz"
integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==
"@img/sharp-win32-x64@0.33.5":
version "0.33.5"
resolved "https://registry.npmmirror.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz"
@@ -1232,66 +992,6 @@
mkdirp "^1.0.4"
rimraf "^3.0.2"
"@parcel/watcher-android-arm64@2.5.1":
version "2.5.1"
resolved "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz"
integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==
"@parcel/watcher-darwin-arm64@2.5.1":
version "2.5.1"
resolved "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz"
integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==
"@parcel/watcher-darwin-x64@2.5.1":
version "2.5.1"
resolved "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz"
integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==
"@parcel/watcher-freebsd-x64@2.5.1":
version "2.5.1"
resolved "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz"
integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==
"@parcel/watcher-linux-arm-glibc@2.5.1":
version "2.5.1"
resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz"
integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==
"@parcel/watcher-linux-arm-musl@2.5.1":
version "2.5.1"
resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz"
integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==
"@parcel/watcher-linux-arm64-glibc@2.5.1":
version "2.5.1"
resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz"
integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==
"@parcel/watcher-linux-arm64-musl@2.5.1":
version "2.5.1"
resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz"
integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==
"@parcel/watcher-linux-x64-glibc@2.5.1":
version "2.5.1"
resolved "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz"
integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==
"@parcel/watcher-linux-x64-musl@2.5.1":
version "2.5.1"
resolved "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz"
integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==
"@parcel/watcher-win32-arm64@2.5.1":
version "2.5.1"
resolved "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz"
integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==
"@parcel/watcher-win32-ia32@2.5.1":
version "2.5.1"
resolved "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz"
integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==
"@parcel/watcher-win32-x64@2.5.1":
version "2.5.1"
resolved "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz"
@@ -1458,101 +1158,6 @@
resolved "https://registry.npmmirror.com/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz"
integrity sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==
"@rollup/rollup-android-arm-eabi@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz"
integrity sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==
"@rollup/rollup-android-arm64@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz"
integrity sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==
"@rollup/rollup-darwin-arm64@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz"
integrity sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==
"@rollup/rollup-darwin-x64@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz"
integrity sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==
"@rollup/rollup-freebsd-arm64@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz"
integrity sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==
"@rollup/rollup-freebsd-x64@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz"
integrity sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==
"@rollup/rollup-linux-arm-gnueabihf@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz"
integrity sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==
"@rollup/rollup-linux-arm-musleabihf@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz"
integrity sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==
"@rollup/rollup-linux-arm64-gnu@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz"
integrity sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==
"@rollup/rollup-linux-arm64-musl@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz"
integrity sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==
"@rollup/rollup-linux-loongarch64-gnu@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz"
integrity sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==
"@rollup/rollup-linux-ppc64-gnu@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz"
integrity sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==
"@rollup/rollup-linux-riscv64-gnu@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz"
integrity sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==
"@rollup/rollup-linux-riscv64-musl@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz"
integrity sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==
"@rollup/rollup-linux-s390x-gnu@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz"
integrity sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==
"@rollup/rollup-linux-x64-gnu@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz"
integrity sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==
"@rollup/rollup-linux-x64-musl@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz"
integrity sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==
"@rollup/rollup-win32-arm64-msvc@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz"
integrity sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==
"@rollup/rollup-win32-ia32-msvc@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz"
integrity sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==
"@rollup/rollup-win32-x64-msvc@4.46.2":
version "4.46.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz"
@@ -1573,51 +1178,6 @@
resolved "https://registry.npmmirror.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz"
integrity sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==
"@swc/core-darwin-arm64@1.13.3":
version "1.13.3"
resolved "https://registry.npmmirror.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.13.3.tgz"
integrity sha512-ux0Ws4pSpBTqbDS9GlVP354MekB1DwYlbxXU3VhnDr4GBcCOimpocx62x7cFJkSpEBF8bmX8+/TTCGKh4PbyXw==
"@swc/core-darwin-x64@1.13.3":
version "1.13.3"
resolved "https://registry.npmmirror.com/@swc/core-darwin-x64/-/core-darwin-x64-1.13.3.tgz"
integrity sha512-p0X6yhxmNUOMZrbeZ3ZNsPige8lSlSe1llllXvpCLkKKxN/k5vZt1sULoq6Nj4eQ7KeHQVm81/+AwKZyf/e0TA==
"@swc/core-linux-arm-gnueabihf@1.13.3":
version "1.13.3"
resolved "https://registry.npmmirror.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.13.3.tgz"
integrity sha512-OmDoiexL2fVWvQTCtoh0xHMyEkZweQAlh4dRyvl8ugqIPEVARSYtaj55TBMUJIP44mSUOJ5tytjzhn2KFxFcBA==
"@swc/core-linux-arm64-gnu@1.13.3":
version "1.13.3"
resolved "https://registry.npmmirror.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.13.3.tgz"
integrity sha512-STfKku3QfnuUj6k3g9ld4vwhtgCGYIFQmsGPPgT9MK/dI3Lwnpe5Gs5t1inoUIoGNP8sIOLlBB4HV4MmBjQuhw==
"@swc/core-linux-arm64-musl@1.13.3":
version "1.13.3"
resolved "https://registry.npmmirror.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.13.3.tgz"
integrity sha512-bc+CXYlFc1t8pv9yZJGus372ldzOVscBl7encUBlU1m/Sig0+NDJLz6cXXRcFyl6ABNOApWeR4Yl7iUWx6C8og==
"@swc/core-linux-x64-gnu@1.13.3":
version "1.13.3"
resolved "https://registry.npmmirror.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.13.3.tgz"
integrity sha512-dFXoa0TEhohrKcxn/54YKs1iwNeW6tUkHJgXW33H381SvjKFUV53WR231jh1sWVJETjA3vsAwxKwR23s7UCmUA==
"@swc/core-linux-x64-musl@1.13.3":
version "1.13.3"
resolved "https://registry.npmmirror.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.13.3.tgz"
integrity sha512-ieyjisLB+ldexiE/yD8uomaZuZIbTc8tjquYln9Quh5ykOBY7LpJJYBWvWtm1g3pHv6AXlBI8Jay7Fffb6aLfA==
"@swc/core-win32-arm64-msvc@1.13.3":
version "1.13.3"
resolved "https://registry.npmmirror.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.13.3.tgz"
integrity sha512-elTQpnaX5vESSbhCEgcwXjpMsnUbqqHfEpB7ewpkAsLzKEXZaK67ihSRYAuAx6ewRQTo7DS5iTT6X5aQD3MzMw==
"@swc/core-win32-ia32-msvc@1.13.3":
version "1.13.3"
resolved "https://registry.npmmirror.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.13.3.tgz"
integrity sha512-nvehQVEOdI1BleJpuUgPLrclJ0TzbEMc+MarXDmmiRFwEUGqj+pnfkTSb7RZyS1puU74IXdK/YhTirHurtbI9w==
"@swc/core-win32-x64-msvc@1.13.3":
version "1.13.3"
resolved "https://registry.npmmirror.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.13.3.tgz"
@@ -1784,14 +1344,6 @@
resolved "https://registry.npmmirror.com/@types/node/-/node-16.9.1.tgz"
integrity sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==
"@types/plist@^3.0.1":
version "3.0.5"
resolved "https://registry.npmmirror.com/@types/plist/-/plist-3.0.5.tgz"
integrity sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==
dependencies:
"@types/node" "*"
xmlbuilder ">=11.0.1"
"@types/responselike@^1.0.0":
version "1.0.3"
resolved "https://registry.npmmirror.com/@types/responselike/-/responselike-1.0.3.tgz"
@@ -1829,11 +1381,6 @@
resolved "https://registry.npmmirror.com/@types/validator/-/validator-13.15.2.tgz"
integrity sha512-y7pa/oEJJ4iGYBxOpfAKn5b9+xuihvzDVnC/OSvlVnGxVg0pOqmjiMafiJ1KVNQEaPZf9HsEp5icEwGg8uIe5Q==
"@types/verror@^1.10.3":
version "1.10.11"
resolved "https://registry.npmmirror.com/@types/verror/-/verror-1.10.11.tgz"
integrity sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==
"@types/yauzl@^2.9.1":
version "2.10.3"
resolved "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz"
@@ -2243,7 +1790,7 @@ ajv-keywords@^3.4.1:
resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz"
integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.9.1:
ajv@^6.12.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.9.1:
version "6.12.6"
resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -2460,11 +2007,6 @@ ast-types@^0.13.4:
dependencies:
tslib "^2.0.1"
astral-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz"
integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
async-exit-hook@^2.0.1:
version "2.0.1"
resolved "https://registry.npmmirror.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz"
@@ -2647,7 +2189,7 @@ buffer-from@^1.0.0:
resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
buffer@^5.1.0, buffer@^5.2.0, buffer@^5.5.0:
buffer@^5.2.0, buffer@^5.5.0:
version "5.7.1"
resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
@@ -2901,14 +2443,6 @@ cli-spinners@^2.5.0:
resolved "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.2.tgz"
integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==
cli-truncate@^2.1.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz"
integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==
dependencies:
slice-ansi "^3.0.0"
string-width "^4.2.0"
cliui@^3.2.0:
version "3.2.0"
resolved "https://registry.npmmirror.com/cliui/-/cliui-3.2.0.tgz"
@@ -3143,13 +2677,6 @@ crc-32@^1.2.0:
resolved "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz"
integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
crc@^3.8.0:
version "3.8.0"
resolved "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz"
integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==
dependencies:
buffer "^5.1.0"
crc32-stream@^4.0.2:
version "4.0.3"
resolved "https://registry.npmmirror.com/crc32-stream/-/crc32-stream-4.0.3.tgz"
@@ -3209,6 +2736,11 @@ dashdash@^1.12.0:
dependencies:
assert-plus "^1.0.0"
data-uri-to-buffer@^4.0.0:
version "4.0.1"
resolved "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz"
integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==
data-uri-to-buffer@^6.0.2:
version "6.0.2"
resolved "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz"
@@ -3402,20 +2934,6 @@ dmg-builder@25.1.8:
optionalDependencies:
dmg-license "^1.0.11"
dmg-license@^1.0.11:
version "1.0.11"
resolved "https://registry.npmmirror.com/dmg-license/-/dmg-license-1.0.11.tgz"
integrity sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==
dependencies:
"@types/plist" "^3.0.1"
"@types/verror" "^1.10.3"
ajv "^6.10.0"
crc "^3.8.0"
iconv-corefoundation "^1.1.7"
plist "^3.0.4"
smart-buffer "^4.0.2"
verror "^1.10.0"
dom-walk@^0.1.0:
version "0.1.2"
resolved "https://registry.npmmirror.com/dom-walk/-/dom-walk-0.1.2.tgz"
@@ -3990,12 +3508,7 @@ extract-zip@^2.0.1:
optionalDependencies:
"@types/yauzl" "^2.9.1"
extsprintf@^1.2.0:
version "1.4.1"
resolved "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.4.1.tgz"
integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
extsprintf@1.3.0:
extsprintf@^1.2.0, extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz"
integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==
@@ -4055,6 +3568,14 @@ fdir@^6.4.6:
resolved "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz"
integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
fetch-blob@^3.1.2, fetch-blob@^3.1.4:
version "3.2.0"
resolved "https://registry.npmmirror.com/fetch-blob/-/fetch-blob-3.2.0.tgz"
integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==
dependencies:
node-domexception "^1.0.0"
web-streams-polyfill "^3.0.3"
figures@^6.1.0:
version "6.1.0"
resolved "https://registry.npmmirror.com/figures/-/figures-6.1.0.tgz"
@@ -4185,6 +3706,13 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"
formdata-polyfill@^4.0.10:
version "4.0.10"
resolved "https://registry.npmmirror.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz"
integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==
dependencies:
fetch-blob "^3.1.2"
forwarded@0.2.0:
version "0.2.0"
resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz"
@@ -4277,11 +3805,6 @@ fs.realpath@^1.0.0:
resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
fsevents@~2.3.2, fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz"
@@ -4696,14 +4219,6 @@ icon-gen@^2.0.0:
svg2png "4.1.1"
uuid "^8.3.1"
iconv-corefoundation@^1.1.7:
version "1.1.7"
resolved "https://registry.npmmirror.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz"
integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==
dependencies:
cli-truncate "^2.1.0"
node-addon-api "^1.6.3"
iconv-lite@^0.6.2:
version "0.6.3"
resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz"
@@ -5886,11 +5401,6 @@ node-abi@^3.45.0:
dependencies:
semver "^7.3.5"
node-addon-api@^1.6.3:
version "1.7.2"
resolved "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-1.7.2.tgz"
integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==
node-addon-api@^7.0.0:
version "7.1.1"
resolved "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz"
@@ -5903,6 +5413,20 @@ node-api-version@^0.2.0:
dependencies:
semver "^7.3.5"
node-domexception@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz"
integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
node-fetch@^3.3.2:
version "3.3.2"
resolved "https://registry.npmmirror.com/node-fetch/-/node-fetch-3.3.2.tgz"
integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==
dependencies:
data-uri-to-buffer "^4.0.0"
fetch-blob "^3.1.4"
formdata-polyfill "^4.0.10"
node-forge@^1.3.1:
version "1.3.1"
resolved "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz"
@@ -6424,7 +5948,7 @@ pkg-types@^2.0.1, pkg-types@^2.2.0:
exsolve "^1.0.7"
pathe "^2.0.3"
plist@^3.0.4, plist@^3.0.5, plist@^3.1.0:
plist@^3.0.5, plist@^3.1.0:
version "3.1.0"
resolved "https://registry.npmmirror.com/plist/-/plist-3.1.0.tgz"
integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==
@@ -6938,95 +6462,6 @@ sanitize-filename@^1.6.3:
dependencies:
truncate-utf8-bytes "^1.0.0"
sass-embedded-all-unknown@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.90.0.tgz"
integrity sha512-/n7jTQvI+hftDDrHzK19G4pxfDzOhtjuQO1K54ui1pT2S0sWfWDjCYUbQgtWQ6FO7g5qWS0hgmrWdc7fmS3rgA==
dependencies:
sass "1.90.0"
sass-embedded-android-arm@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.90.0.tgz"
integrity sha512-usF6kVJQWa1CMgPH1nCT1y8KEmAT2fzB00dDIPBYHq8U5VZLCihi2bJRP5U9NlcwP1TlKGKCjwsbIdSjDKfecg==
sass-embedded-android-arm64@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.90.0.tgz"
integrity sha512-bkTlewzWksa6Sj4Zs1CWiutnvUbsO3xuYh2QBRknXsOtuMlfTPoXnwhCnyE4lSvUxw2qxSbv+NdQev9qMfsBgA==
sass-embedded-android-riscv64@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.90.0.tgz"
integrity sha512-bpqCIOaX+0Lou/BNJ4iJIKbWbVaYXFdg26C3gG6gxxKZRzp/6OYCxHrIQDwhKz6YC8Q5rwNPMpfDVYbWPcgroA==
sass-embedded-android-x64@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.90.0.tgz"
integrity sha512-GNxVKnCMd/p2icZ+Q4mhvNk19NrLXq1C4guiqjrycHYQLEnxRkjbW1QXYiL+XyDn4e+Bcq0knzG0I9pMuNZxkg==
sass-embedded-darwin-arm64@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.90.0.tgz"
integrity sha512-qr4KBMJfBA+lzXiWnP00qzpLzHQzGd1OSK3VHcUFjZ8l7VOYf2R7Tc3fcTLhpaNPMJtTK0jrk8rFqBvsiZExnA==
sass-embedded-darwin-x64@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.90.0.tgz"
integrity sha512-z2nr1nNqtWDLVRwTbHtL7zriK90U7O/Gb15UaCSMYeAz9Y+wog5s/sDEKm0+GsVdzzkaCaMZRWGN4jTilnUwmQ==
sass-embedded-linux-arm@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.90.0.tgz"
integrity sha512-FeBxI5Q2HvM3CCadcEcQgvWbDPVs2YEF0PZ87fbAVTCG8dV+iNnQreSz7GRJroknpvbRhm5t2gedvcgmTnPb2Q==
sass-embedded-linux-arm64@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.90.0.tgz"
integrity sha512-SPMcGZuP71Fj8btCGtlBnv8h8DAbJn8EQfLzXs9oo6NGFFLVjNGiFpqGfgtUV6DLWCuaRyEFeViO7wZow/vKGQ==
sass-embedded-linux-musl-arm@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.90.0.tgz"
integrity sha512-EB2z0fUXdUdvSoddf4DzdZQkD/xyreD72gwAi8YScgUvR4HMXI7bLcK/n78Rft6OnqvV8090hjC8FsLDo3x5xQ==
sass-embedded-linux-musl-arm64@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.90.0.tgz"
integrity sha512-xLH7+PFq763MoEm3vI7hQk5E+nStiLWbijHEYW/tEtCbcQIphgzSkDItEezxXew3dU4EJ1jqrBUySPdoXFLqWA==
sass-embedded-linux-musl-riscv64@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.90.0.tgz"
integrity sha512-L21UkOgnSrD+ERF+jo1IWneGv40t0ap9+3cI+wZWYhQS5MkxponhT9QaNU57JEDJwB9mOl01LVw14opz4SN+VQ==
sass-embedded-linux-musl-x64@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.90.0.tgz"
integrity sha512-NeAycQlsdhFdnIeSmRmScYUyCd+uE+x15NLFunbF8M0PgCKurrUhaxgGKSuBbaK56FpxarKOHCqcOrWbemIGzQ==
sass-embedded-linux-riscv64@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.90.0.tgz"
integrity sha512-lJopaQhW8S+kaQ61vMqq3c+bOurcf9RdZf2EmzQYpc2y1vT5cWfRNrRkbAgO/23IQxsk/fq3UIUnsjnyQmi6MA==
sass-embedded-linux-x64@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.90.0.tgz"
integrity sha512-Cc061gBfMPwH9rN7neQaH36cvOQC+dFMSGIeX5qUOhrEL4Ng51iqBV6aI4RIB1jCFGth6eDydVRN1VdV9qom8A==
sass-embedded-unknown-all@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.90.0.tgz"
integrity sha512-DBGzHVCJDqtjTHZFohush9YTxd4ZxhIygIRTNRXnA0359woF9Z8AS7/YxfzwkqrTX5durSJa6ZamGFYVLoRphQ==
dependencies:
sass "1.90.0"
sass-embedded-win32-arm64@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.90.0.tgz"
integrity sha512-c3/vL/CATnaW3x/6kcNbCROEOUU7zvJpIURp7M9664GJj08/gLPRWKNruw0OkAPQ3C5TTQz7+/fQWEpRA6qmvA==
sass-embedded-win32-x64@1.90.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.90.0.tgz"
@@ -7065,7 +6500,7 @@ sass-embedded@^1.70.0, sass-embedded@^1.90.0:
sass-embedded-win32-arm64 "1.90.0"
sass-embedded-win32-x64 "1.90.0"
sass@^1.70.0, sass@1.90.0:
sass@^1.70.0:
version "1.90.0"
resolved "https://registry.npmmirror.com/sass/-/sass-1.90.0.tgz"
integrity sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==
@@ -7313,16 +6748,7 @@ slash@^3.0.0:
resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
slice-ansi@^3.0.0:
version "3.0.0"
resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz"
integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==
dependencies:
ansi-styles "^4.0.0"
astral-regex "^2.0.0"
is-fullwidth-code-point "^3.0.0"
smart-buffer@^4.0.2, smart-buffer@^4.2.0:
smart-buffer@^4.2.0:
version "4.2.0"
resolved "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz"
integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
@@ -7780,7 +7206,7 @@ ts-api-utils@^2.1.0:
resolved "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz"
integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==
tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0:
tslib@^2.0.1, tslib@^2.1.0:
version "2.8.1"
resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz"
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
@@ -8052,15 +7478,6 @@ vary@~1.1.2:
resolved "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz"
integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
verror@^1.10.0:
version "1.10.1"
resolved "https://registry.npmmirror.com/verror/-/verror-1.10.1.tgz"
integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==
dependencies:
assert-plus "^1.0.0"
core-util-is "1.0.2"
extsprintf "^1.2.0"
verror@1.10.0:
version "1.10.0"
resolved "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz"
@@ -8210,6 +7627,11 @@ wcwidth@^1.0.1:
dependencies:
defaults "^1.0.3"
web-streams-polyfill@^3.0.3:
version "3.3.3"
resolved "https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz"
integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==
webpack-virtual-modules@^0.6.2:
version "0.6.2"
resolved "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz"
@@ -8343,7 +7765,7 @@ xml2js@^0.6.2:
sax ">=0.6.0"
xmlbuilder "~11.0.0"
xmlbuilder@^15.1.1, xmlbuilder@>=11.0.1:
xmlbuilder@^15.1.1:
version "15.1.1"
resolved "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz"
integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==