diff --git a/package-lock.json b/package-lock.json index a57de5e..d8b5929 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index a85bccb..697740a 100644 --- a/package.json +++ b/package.json @@ -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" diff --git a/src/main/index.ts b/src/main/index.ts index 01aafb5..cc04408 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -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 => { + return await (pluginService as any).addPlugin(pluginCode, pluginName) +}) + +ipcMain.handle('service-plugin-getPluginById', async (_, id): Promise => { + return await (pluginService as any).getPluginById(id) +}) + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +ipcMain.handle('service-plugin-loadAllPlugins', async (_): Promise => { + return await (pluginService as any).getPluginById() +}) + ipcMain.handle('service-music-request', async (_, api, args) => { return await musicService.request(api, args) }) diff --git a/src/main/services/music/net-ease-service.ts b/src/main/services/music/net-ease-service.ts index 671a097..dc6217e 100644 --- a/src/main/services/music/net-ease-service.ts +++ b/src/main/services/music/net-ease-service.ts @@ -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` diff --git a/src/main/services/plugin/index.js b/src/main/services/plugin/index.js new file mode 100644 index 0000000..354cb3f --- /dev/null +++ b/src/main/services/plugin/index.js @@ -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 diff --git a/src/main/services/plugin/logger.ts b/src/main/services/plugin/logger.ts new file mode 100644 index 0000000..7aa0c2b --- /dev/null +++ b/src/main/services/plugin/logger.ts @@ -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 diff --git a/src/main/services/plugin/manager/CeruMusicPluginHost.js b/src/main/services/plugin/manager/CeruMusicPluginHost.js new file mode 100644 index 0000000..5a261a1 --- /dev/null +++ b/src/main/services/plugin/manager/CeruMusicPluginHost.js @@ -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; diff --git a/src/main/services/plugin/manager/converter-event-driven.js b/src/main/services/plugin/manager/converter-event-driven.js new file mode 100644 index 0000000..0e32d9f --- /dev/null +++ b/src/main/services/plugin/manager/converter-event-driven.js @@ -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(); +} \ No newline at end of file diff --git a/src/main/utils/path.ts b/src/main/utils/path.ts new file mode 100644 index 0000000..fe930d4 --- /dev/null +++ b/src/main/utils/path.ts @@ -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 +} diff --git a/tsconfig.json b/tsconfig.json index dd3b7cd..b5e81c2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,8 @@ "files": [], "references": [{ "path": "./tsconfig.node.json" }, { "path": "./tsconfig.web.json" }], "compilerOptions": { - "noImplicitAny": false + "noImplicitAny": false, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true } } diff --git a/yarn.lock b/yarn.lock index b583710..3656c46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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==