From 76e46c25d1ba0b1fd5411d7e39787c16184d1be7 Mon Sep 17 00:00:00 2001 From: wanglihui <1769794040@qq.com> Date: Thu, 28 Dec 2023 14:36:52 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Eelectron=E3=80=81?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E9=9F=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/electron-builder.js | 52 + apps/web/package.json | 22 +- apps/web/src-election/electron-env.d.ts | 0 apps/web/src-election/main/index.ts | 19 + .../src-election/main/utils/createWindow.ts | 35 + apps/web/src-election/preload/index.ts | 3 + apps/web/src/index.tsx | 61 +- apps/web/tsconfig.e.json | 15 + package.json | 4 +- packages/eslint-config-custom/index.js | 3 +- packages/eslint-config-custom/package.json | 1 + packages/tsdaodaobase/src/module.tsx | 2673 ++++++++++------- turbo.json | 14 +- 13 files changed, 1761 insertions(+), 1141 deletions(-) create mode 100644 apps/web/electron-builder.js create mode 100644 apps/web/src-election/electron-env.d.ts create mode 100644 apps/web/src-election/main/index.ts create mode 100644 apps/web/src-election/main/utils/createWindow.ts create mode 100644 apps/web/src-election/preload/index.ts create mode 100644 apps/web/tsconfig.e.json diff --git a/apps/web/electron-builder.js b/apps/web/electron-builder.js new file mode 100644 index 0000000..ed18c28 --- /dev/null +++ b/apps/web/electron-builder.js @@ -0,0 +1,52 @@ +module.exports = { + productName: "唐僧叨叨", //项目名 + appId: "com.tsdaodao.im", + copyright: "Copyright © tsdaodao", //版权 + directories: { + output: "output/app", // 输出文件夹 + }, + npmRebuild: false, + asar: false, + buildDependenciesFromSource: true, + electronDownload: { + mirror: "https://registry.npmmirror.com/-/binary/electron/", + }, + files: ["out-election/**/*", "build/**/*"], // 需要打包的文件 + extraMetadata: { + main: "out-election/main/index.js", + }, + mac: { + category: "public.app-category.utilities", + icon: "public/icon.icns", + }, + dmg: { + // background: 'build/appdmg.png', // dmg安装窗口背景图 + icon: "public/icon.icns", // 客户端图标 + iconSize: 100, // 安装图标大小 + // 安装窗口中包含的项目和配置 + contents: [ + { x: 380, y: 280, type: "link", path: "/Applications" }, + { x: 110, y: 280, type: "file" }, + ], + window: { width: 500, height: 500 }, // 安装窗口大小 + }, + win: { + icon: "public/icon.icns", + target: ["nsis", "zip"], + }, + nsis: { + oneClick: false, // 是否一键安装 + allowElevation: true, // 允许请求提升。 如果为false,则用户必须使用提升的权限重新启动安装程序。 + allowToChangeInstallationDirectory: true, // 允许修改安装目录 + // installerIcon: "./build/icon.ico",// 安装图标 + // uninstallerIcon: "./build/icons/bbb.ico",//卸载图标 + // installerHeaderIcon: "./build/icon.ico", // 安装时头部图标 + createDesktopShortcut: true, // 创建桌面图标 + createStartMenuShortcut: true, // 创建开始菜单图标 + shortcutName: "唐僧叨叨", // 图标名称 + }, + linux: { + target: ["AppImage", "deb"], + icon: "public/icon.icns", + }, +}; diff --git a/apps/web/package.json b/apps/web/package.json index 86635cc..96f4cf1 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -2,7 +2,7 @@ "name": "@tsdaodao/web", "version": "1.0.0", "private": true, - "homepage": "./", + "main": "out-election/main/index.js", "dependencies": { "@tauri-apps/api": "^1.1.0", "@tsdaodao/base": "*", @@ -13,6 +13,7 @@ "@types/react-mentions": "^4.1.5", "@types/react-virtualized": "^9.21.22", "classnames": "^2.3.1", + "howler": "^2.2.4", "react": "^17.0.2", "react-app-rewired": "^2.1.8", "react-lazyload": "^3.2.0", @@ -26,24 +27,39 @@ "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^7.1.2", + "@types/howler": "^2.2.11", "@types/jest": "^24.0.0", - "@types/node": "^12.0.0", + "@types/node": "^20.10.5", "@types/react": "^16.9.0", + "concurrently": "^8.2.2", "cross-env": "^7.0.3", "customize-cra": "^1.0.0", + "electron": "26.0.0", + "electron-builder": "^24.9.1", + "electron-log": "^5.0.1", "eslint-config-react-app": "^7.0.1", + "kill-port": "^2.0.1", + "npm-run-all": "^4.1.5", "postcss-normalize": "^10.0.1", "react-dom": "^17.0.2", "react-scripts": "5.0.0", "terser-webpack-plugin": "^5.3.9", - "typescript": "~3.7.2", + "tsc-watch": "^6.0.4", + "typescript": "^5.3.3", + "wait-on": "^7.2.0", "webpack-bundle-analyzer": "^4.5.0" }, "scripts": { "start": "cross-env BROWSER=none REACT_APP_VERSION=$npm_package_version react-app-rewired start", "dev": "cross-env MODE=dev BROWSER=none REACT_APP_VERSION=$npm_package_version react-app-rewired start", + "dev-ele": "kill-port 3000 && concurrently -k -n=web,ele -c=green,blue \"yarn dev\" \"wait-on tcp:3000 && npm-run-all watch\"", + "watch": "tsc-watch -p tsconfig.e.json --onSuccess \"npm-run-all start:electron\"", + "start:electron": "cross-env NODE_ENV=development electron .", "build": "cross-env REACT_APP_VERSION=$npm_package_version react-app-rewired build", "build:analyzer": "cross-env ANALYZER=true REACT_APP_VERSION=$npm_package_version react-app-rewired build", + "build-ele:mac": "tsc -p tsconfig.e.json && electron-builder --mac -c", + "build-ele:win": "tsc -p tsconfig.e.json && electron-builder --win -c", + "build-ele": "tsc -p tsconfig.e.json && electron-builder -mw -c", "test": "react-app-rewired test", "eject": "react-app-rewired eject", "tauri": "tauri" diff --git a/apps/web/src-election/electron-env.d.ts b/apps/web/src-election/electron-env.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/apps/web/src-election/main/index.ts b/apps/web/src-election/main/index.ts new file mode 100644 index 0000000..b4a82ff --- /dev/null +++ b/apps/web/src-election/main/index.ts @@ -0,0 +1,19 @@ +import { app, BrowserWindow, Menu } from "electron"; + +import { createWindow } from "./utils/createWindow"; + +app.on("ready", () => { + // 设置app菜单 + // Menu.setApplicationMenu(createAppMenu()); + createWindow(); // 创建窗口 + // 通常在 macOS 上,当点击 dock 中的应用程序图标时,如果没有其他打开的窗口,那么程序会重新创建一个窗口。 + app.on( + "activate", + () => BrowserWindow.getAllWindows().length === 0 && createWindow() + ); +}); + +// 除了 macOS 外,当所有窗口都被关闭的时候退出程序。 macOS窗口全部关闭时,dock中程序不会退出 +app.on("window-all-closed", () => { + process.platform !== "darwin" && app.quit(); +}); diff --git a/apps/web/src-election/main/utils/createWindow.ts b/apps/web/src-election/main/utils/createWindow.ts new file mode 100644 index 0000000..461040c --- /dev/null +++ b/apps/web/src-election/main/utils/createWindow.ts @@ -0,0 +1,35 @@ +import { BrowserWindow, screen } from "electron"; +import { join } from "path"; + +export function createWindow() { + const NODE_ENV = process.env.NODE_ENV; + const { width, height } = screen.getPrimaryDisplay().workAreaSize; + // 生成窗口实例 + const mainWin = new BrowserWindow({ + width, // * 指定启动app时的默认窗口尺寸 + height, // * 指定启动app时的默认窗口尺寸 + frame: true, // * app边框(包括关闭,全屏,最小化按钮的导航栏) @false: 隐藏 + titleBarStyle: "hidden", + transparent: true, // * app 背景透明 + hasShadow: false, // * app 边框阴影 + show: false, // 启动窗口时隐藏,直到渲染进程加载完成「ready-to-show 监听事件」 再显示窗口,防止加载时闪烁 + resizable: true, // 禁止手动修改窗口尺寸 + webPreferences: { + // 加载脚本 + preload: join(__dirname, "../..", "preload/index"), + nodeIntegration: true, + }, + }); + + // 启动窗口时隐藏,直到渲染进程加载完成「ready-to-show 监听事件」 再显示窗口,防止加载时闪烁 + mainWin.once("ready-to-show", () => { + mainWin.show(); // 显示窗口 + }); + + if (NODE_ENV === "development") mainWin.loadURL("http://localhost:3000"); + if (NODE_ENV !== "development") { + process.env.DIST_ELECTRON = join(__dirname, '../'); + const WEB_URL = join(process.env.DIST_ELECTRON, "../../build/index.html"); + mainWin.loadFile(WEB_URL); + } +} diff --git a/apps/web/src-election/preload/index.ts b/apps/web/src-election/preload/index.ts new file mode 100644 index 0000000..6e6f8a6 --- /dev/null +++ b/apps/web/src-election/preload/index.ts @@ -0,0 +1,3 @@ +import { contextBridge, ipcRenderer } from "electron"; + +contextBridge.exposeInMainWorld("__POWERED_ELECTRON__", true); \ No newline at end of file diff --git a/apps/web/src/index.tsx b/apps/web/src/index.tsx index 0e7d511..21aff99 100644 --- a/apps/web/src/index.tsx +++ b/apps/web/src/index.tsx @@ -1,49 +1,48 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import './index.css'; -import App from './App'; -import reportWebVitals from './reportWebVitals'; -import { BaseModule, WKApp } from '@tsdaodao/base'; -import { LoginModule } from '@tsdaodao/login'; -import { DataSourceModule } from '@tsdaodao/datasource'; -import {ContactsModule} from '@tsdaodao/contacts'; +import React from "react"; +import ReactDOM from "react-dom"; +import "./index.css"; +import App from "./App"; +import reportWebVitals from "./reportWebVitals"; +import { BaseModule, WKApp } from "@tsdaodao/base"; +import { LoginModule } from "@tsdaodao/login"; +import { DataSourceModule } from "@tsdaodao/datasource"; +import { ContactsModule } from "@tsdaodao/contacts"; -const apiURL = "https://api.botgate.cn/v1/" +const apiURL = "https://api.botgate.cn/v1/"; -if(!(window as any).__TAURI_IPC__) { // tauri环境 - if(process.env.NODE_ENV === "development") { - WKApp.apiClient.config.apiURL = apiURL - }else { - WKApp.apiClient.config.apiURL = "/api/v1/" // 正式环境地址 (通用打包镜像,用此相对地址),打包出来的镜像可以通过API_URL环境变量来修改API地址 +if ((window as any).__TAURI_IPC__) { + // tauri环境 + console.log("tauri环境"); + WKApp.apiClient.config.apiURL = apiURL; +} else if ((window as any)?.__POWERED_ELECTRON__) { + console.log("__POWERED_ELECTRON__环境"); + WKApp.apiClient.config.apiURL = apiURL; +} else { + if (process.env.NODE_ENV === "development") { + WKApp.apiClient.config.apiURL = apiURL; + } else { + WKApp.apiClient.config.apiURL = "/api/v1/"; // 正式环境地址 (通用打包镜像,用此相对地址),打包出来的镜像可以通过API_URL环境变量来修改API地址 } -}else { - console.log("tauri环境") - WKApp.apiClient.config.apiURL = apiURL } +WKApp.apiClient.config.tokenCallback = () => { + return WKApp.loginInfo.token; +}; +WKApp.config.appVersion = `${process.env.REACT_APP_VERSION || "0.0.0"}`; - - -WKApp.apiClient.config.tokenCallback = ()=> { - return WKApp.loginInfo.token -} -WKApp.config.appVersion = `${process.env.REACT_APP_VERSION || "0.0.0"}` - -WKApp.loginInfo.load() // 加载登录信息 +WKApp.loginInfo.load(); // 加载登录信息 WKApp.shared.registerModule(new BaseModule()); // 基础模块 -WKApp.shared.registerModule(new DataSourceModule()) // 数据源模块 +WKApp.shared.registerModule(new DataSourceModule()); // 数据源模块 WKApp.shared.registerModule(new LoginModule()); // 登录模块 WKApp.shared.registerModule(new ContactsModule()); // 联系模块 -WKApp.shared.startup() // app启动 - +WKApp.shared.startup(); // app启动 ReactDOM.render( , - document.getElementById('root') + document.getElementById("root") ); reportWebVitals(); - diff --git a/apps/web/tsconfig.e.json b/apps/web/tsconfig.e.json new file mode 100644 index 0000000..53dcb01 --- /dev/null +++ b/apps/web/tsconfig.e.json @@ -0,0 +1,15 @@ +{ + "exclude": ["node_modules", "src"], + "include": ["src-election/**/*"], + "compilerOptions": { + "outDir": "./out-election", + "module": "commonjs", + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "noEmit": false, + "baseUrl": "./", + "skipLibCheck":true, + "sourceMap": false + } +} diff --git a/package.json b/package.json index 69479c0..78989dc 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,10 @@ "react-error-overlay": "6.0.9" }, "scripts": { - "build": "turbo run build", "dev": "turbo run dev --parallel", + "dev-ele": "turbo run dev-ele --parallel", + "build": "turbo run build", + "build-ele": "turbo run build-ele", "lint": "turbo run lint", "format": "prettier --write \"**/*.{ts,tsx,md}\"" }, diff --git a/packages/eslint-config-custom/index.js b/packages/eslint-config-custom/index.js index 2ea526a..e65ff9c 100644 --- a/packages/eslint-config-custom/index.js +++ b/packages/eslint-config-custom/index.js @@ -1,7 +1,8 @@ module.exports = { - extends: ["next", "turbo", "prettier"], + extends: ["next", "turbo", "prettier", "@typescript-eslint/parser"], rules: { "@next/next/no-html-link-for-pages": "off", "react/jsx-key": "off", + "@next/next/no-img-element": "off" }, }; diff --git a/packages/eslint-config-custom/package.json b/packages/eslint-config-custom/package.json index 9580d09..a9ad596 100644 --- a/packages/eslint-config-custom/package.json +++ b/packages/eslint-config-custom/package.json @@ -4,6 +4,7 @@ "main": "index.js", "license": "MIT", "dependencies": { + "@typescript-eslint/parser": "^6.16.0", "eslint-config-next": "^12.0.8", "eslint-config-prettier": "^8.3.0", "eslint-plugin-react": "7.28.0", diff --git a/packages/tsdaodaobase/src/module.tsx b/packages/tsdaodaobase/src/module.tsx index a38cdc6..6302ec5 100644 --- a/packages/tsdaodaobase/src/module.tsx +++ b/packages/tsdaodaobase/src/module.tsx @@ -1,29 +1,64 @@ -import { Channel, ChannelTypePerson, WKSDK, Message, MessageContentType, ConversationAction, ChannelTypeGroup, ChannelInfo, CMDContent, MessageText } from "wukongimjssdk"; +import { + Channel, + ChannelTypePerson, + WKSDK, + Message, + MessageContentType, + ConversationAction, + ChannelTypeGroup, + ChannelInfo, + CMDContent, + MessageText, +} from "wukongimjssdk"; import React, { ElementType } from "react"; +import { Howl, Howler } from "howler"; import WKApp, { FriendApply, FriendApplyState, ThemeMode } from "./App"; import ChannelQRCode from "./Components/ChannelQRCode"; import { ChannelSettingRouteData } from "./Components/ChannelSetting/context"; import { IndexTableItem } from "./Components/IndexTable"; import { InputEdit } from "./Components/InputEdit"; -import { ListItem, ListItemButton, ListItemButtonType, ListItemIcon, ListItemMuliteLine, ListItemSwitch, ListItemSwitchContext, ListItemTip } from "./Components/ListItem"; +import { + ListItem, + ListItemButton, + ListItemButtonType, + ListItemIcon, + ListItemMuliteLine, + ListItemSwitch, + ListItemSwitchContext, + ListItemTip, +} from "./Components/ListItem"; import { Subscribers } from "./Components/Subscribers"; import UserSelect, { ContactsSelect } from "./Components/UserSelect"; import { Card, CardCell } from "./Messages/Card"; import { GifCell, GifContent } from "./Messages/Gif"; import { HistorySplitCell, HistorySplitContent } from "./Messages/HistorySplit"; import { ImageCell, ImageContent } from "./Messages/Image"; -import { SignalMessageCell, SignalMessageContent } from "./Messages/SignalMessage/signalmessage"; +import { + SignalMessageCell, + SignalMessageContent, +} from "./Messages/SignalMessage/signalmessage"; import { SystemCell } from "./Messages/System"; import { TextCell } from "./Messages/Text"; import { TimeCell } from "./Messages/Time"; import { UnknownCell } from "./Messages/Unknown"; import { UnsupportCell, UnsupportContent } from "./Messages/Unsupport"; -import { ChannelTypeCustomerService, EndpointCategory, EndpointID, GroupRole, MessageContentTypeConst, unsupportMessageTypes, UserRelation } from "./Service/Const"; -import RouteContext, { FinishButtonContext, RouteContextConfig } from "./Service/Context"; +import { + ChannelTypeCustomerService, + EndpointCategory, + EndpointID, + GroupRole, + MessageContentTypeConst, + unsupportMessageTypes, + UserRelation, +} from "./Service/Const"; +import RouteContext, { + FinishButtonContext, + RouteContextConfig, +} from "./Service/Context"; import { ChannelField } from "./Service/DataSource/DataSource"; import { IModule } from "./Service/Module"; import { Row, Section } from "./Service/Section"; -import { VoiceCell, VoiceContent } from './Messages/Voice'; +import { VoiceCell, VoiceContent } from "./Messages/Voice"; import { VideoCell, VideoContent } from "./Messages/Video"; import { TypingCell } from "./Messages/Typing"; import { LottieSticker, LottieStickerCell } from "./Messages/LottieSticker"; @@ -45,1154 +80,1588 @@ import { ScreenshotCell, ScreenshotContent } from "./Messages/Screenshot"; import ImageToolbar from "./Components/ImageToolbar"; export default class BaseModule implements IModule { - id(): string { - return "base" - } - init(): void { + messageTone?: Howl; + id(): string { + return "base"; + } + init(): void { + APIClient.shared.logoutCallback = () => { + WKApp.shared.logout(); + }; - APIClient.shared.logoutCallback = () => { - WKApp.shared.logout() + WKApp.endpointManager.setMethod( + EndpointID.emojiService, + () => DefaultEmojiService.shared + ); + + WKApp.messageManager.registerMessageFactor( + (contentType: number): ElementType | undefined => { + switch (contentType) { + case MessageContentType.text: // 文本消息 + return TextCell; + case MessageContentType.image: // 图片消息 + return ImageCell; + case MessageContentTypeConst.card: // 名片 + return CardCell; + case MessageContentTypeConst.gif: // gif + return GifCell; + case MessageContentTypeConst.voice: // 语音 + return VoiceCell; + case MessageContentTypeConst.mergeForward: // 合并转发 + return MergeforwardCell; + case MessageContentTypeConst.smallVideo: // 小视频 + return VideoCell; + case MessageContentTypeConst.historySplit: // 历史消息风格线 + return HistorySplitCell; + case MessageContentTypeConst.time: // 时间消息 + return TimeCell; + case MessageContentTypeConst.typing: // 输入中... + return TypingCell; + case MessageContentTypeConst.lottieSticker: // 动图 + case MessageContentTypeConst.lottieEmojiSticker: + return LottieStickerCell; + case MessageContentTypeConst.location: // 定位 + return LocationCell; + case MessageContentTypeConst.screenshot: + return ScreenshotCell; + case MessageContentType.signalMessage: // 端对端加密错误消息 + case 98: + return SignalMessageCell; + default: + if (contentType <= 2000 && contentType >= 1000) { + return SystemCell; + } } + } + ); - WKApp.endpointManager.setMethod(EndpointID.emojiService, () => DefaultEmojiService.shared) + WKSDK.shared().register(MessageContentType.image, () => new ImageContent()); // 图片 - WKApp.messageManager.registerMessageFactor((contentType: number): ElementType | undefined => { + WKSDK.shared().register(MessageContentTypeConst.card, () => new Card()); // 名片 + WKSDK.shared().register( + MessageContentTypeConst.gif, + () => new GifContent() + ); // gif动图 + WKSDK.shared().register( + MessageContentTypeConst.voice, + () => new VoiceContent() + ); // 语音正文 + WKSDK.shared().register( + MessageContentTypeConst.smallVideo, + () => new VideoContent() + ); // 视频正文 + WKSDK.shared().register( + MessageContentTypeConst.historySplit, + () => new HistorySplitContent() + ); // 历史分割线 + WKSDK.shared().register( + MessageContentTypeConst.location, + () => new LocationContent() + ); // 定位 + WKSDK.shared().register( + MessageContentTypeConst.lottieSticker, + () => new LottieSticker() + ); // 动图 + WKSDK.shared().register( + MessageContentTypeConst.lottieEmojiSticker, + () => new LottieSticker() + ); // 动图 + WKSDK.shared().register( + MessageContentTypeConst.mergeForward, + () => new MergeforwardContent() + ); // 合并转发 + WKSDK.shared().register( + MessageContentTypeConst.screenshot, + () => new ScreenshotContent() + ); - switch (contentType) { - case MessageContentType.text: // 文本消息 - return TextCell - case MessageContentType.image: // 图片消息 - return ImageCell - case MessageContentTypeConst.card: // 名片 - return CardCell - case MessageContentTypeConst.gif: // gif - return GifCell - case MessageContentTypeConst.voice: // 语音 - return VoiceCell - case MessageContentTypeConst.mergeForward: // 合并转发 - return MergeforwardCell - case MessageContentTypeConst.smallVideo: // 小视频 - return VideoCell - case MessageContentTypeConst.historySplit: // 历史消息风格线 - return HistorySplitCell - case MessageContentTypeConst.time: // 时间消息 - return TimeCell - case MessageContentTypeConst.typing: // 输入中... - return TypingCell - case MessageContentTypeConst.lottieSticker: // 动图 - case MessageContentTypeConst.lottieEmojiSticker: - return LottieStickerCell - case MessageContentTypeConst.location: // 定位 - return LocationCell - case MessageContentTypeConst.screenshot: - return ScreenshotCell - case MessageContentType.signalMessage: // 端对端加密错误消息 - case 98: - return SignalMessageCell - default: - if (contentType <= 2000 && contentType >= 1000) { - return SystemCell - } - } - }) + // 未知消息 + WKApp.messageManager.registerCell( + MessageContentType.unknown, + (): ElementType => { + return UnknownCell; + } + ); - WKSDK.shared().register(MessageContentType.image, () => new ImageContent()) // 图片 - - WKSDK.shared().register(MessageContentTypeConst.card, () => new Card()) // 名片 - WKSDK.shared().register(MessageContentTypeConst.gif, () => new GifContent()) // gif动图 - WKSDK.shared().register(MessageContentTypeConst.voice, () => new VoiceContent()) // 语音正文 - WKSDK.shared().register(MessageContentTypeConst.smallVideo, () => new VideoContent()) // 视频正文 - WKSDK.shared().register(MessageContentTypeConst.historySplit, () => new HistorySplitContent()) // 历史分割线 - WKSDK.shared().register(MessageContentTypeConst.location, () => new LocationContent()) // 定位 - WKSDK.shared().register(MessageContentTypeConst.lottieSticker, () => new LottieSticker()) // 动图 - WKSDK.shared().register(MessageContentTypeConst.lottieEmojiSticker, () => new LottieSticker()) // 动图 - WKSDK.shared().register(MessageContentTypeConst.mergeForward, () => new MergeforwardContent()) // 合并转发 - WKSDK.shared().register(MessageContentTypeConst.screenshot, () => new ScreenshotContent()) - - // 未知消息 - WKApp.messageManager.registerCell(MessageContentType.unknown, (): ElementType => { - return UnknownCell - }) - - // 不支持的消息 - for (const unsupportMessageType of unsupportMessageTypes) { - WKSDK.shared().register(unsupportMessageType, () => new UnsupportContent()) - WKApp.messageManager.registerCell(unsupportMessageType, (): ElementType => { - return UnsupportCell - }) + // 不支持的消息 + for (const unsupportMessageType of unsupportMessageTypes) { + WKSDK.shared().register( + unsupportMessageType, + () => new UnsupportContent() + ); + WKApp.messageManager.registerCell( + unsupportMessageType, + (): ElementType => { + return UnsupportCell; } - - WKSDK.shared().chatManager.addCMDListener((message: Message) => { - console.log('收到CMD->', message) - const cmdContent = message.content as CMDContent - const param = cmdContent.param - - if (cmdContent.cmd === 'channelUpdate') { // 频道信息更新 - WKSDK.shared().channelManager.fetchChannelInfo(new Channel(param.channel_id, param.channel_type)) - } else if (cmdContent.cmd === "typing") { - TypingManager.shared.addTyping(new Channel(cmdContent.param.channel_id, cmdContent.param.channel_type), cmdContent.param.from_uid, cmdContent.param.from_name) - } else if (cmdContent.cmd === "groupAvatarUpdate") { // 群头像更新 - WKSDK.shared().channelManager.fetchChannelInfo(new Channel(param.group_no, ChannelTypeGroup)) - } else if (cmdContent.cmd === "unreadClear") { // 清除最近会话未读数量 - const channel = new Channel(param.channel_id, param.channel_type) - const conversation = WKSDK.shared().conversationManager.findConversation(channel) - let unread = 0 - if (param.unread > 0) { - unread = param.unread - } - if (conversation) { - conversation.unread = unread - WKSDK.shared().conversationManager.notifyConversationListeners(conversation, ConversationAction.update) - } - } else if (cmdContent.cmd === "conversationDeleted") { // 最近会话删除 - const channel = new Channel(param.channel_id, param.channel_type) - WKSDK.shared().conversationManager.removeConversation(channel) - } else if (cmdContent.cmd === "friendRequest") { // 好友申请 - const friendApply = new FriendApply() - friendApply.uid = param.apply_uid - friendApply.name = param.apply_name - friendApply.state = FriendApplyState.apply - friendApply.remark = param.remark - friendApply.token = param.token - friendApply.unread = true - friendApply.createdAt = message.timestamp - WKApp.shared.addFriendApply(friendApply) - } else if (cmdContent.cmd === "friendAccept") { // 接受好友申请 - const toUID = param.to_uid - if (!toUID || toUID === "") { - return - } - if (param.from_uid) { - WKSDK.shared().channelManager.fetchChannelInfo(new Channel(param.from_uid, ChannelTypePerson)) - } - - WKApp.dataSource.contactsSync() // 同步联系人 - - const friendApplys = WKApp.shared.getFriendApplys() - if (friendApplys && friendApplys.length > 0) { - for (const friendApply of friendApplys) { - if (toUID === friendApply.uid) { - friendApply.unread = false - friendApply.state = FriendApplyState.accepted - WKApp.shared.updateFriendApply(friendApply) - WKApp.endpointManager.invokes(EndpointCategory.friendApplyDataChange) - break - } - } - } - } else if (cmdContent.cmd === "friendDeleted") { - WKApp.dataSource.contactsSync() // 同步联系人 - } else if (cmdContent.cmd === "memberUpdate") { // 成员更新 - const channel = new Channel(cmdContent.param.group_no, ChannelTypeGroup) - WKSDK.shared().channelManager.syncSubscribes(channel) - } else if (cmdContent.cmd === "onlineStatus") { // 好友在线状态改变 - const channel = new Channel(cmdContent.param.uid, ChannelTypePerson) - const online = param.online === 1 - const onlineChannelInfo = WKSDK.shared().channelManager.getChannelInfo(channel) - if (onlineChannelInfo) { - onlineChannelInfo.online = online - if (!online) { - onlineChannelInfo.lastOffline = new Date().getTime() / 1000 - } - WKSDK.shared().channelManager.notifyListeners(onlineChannelInfo) - } else { - WKSDK.shared().channelManager.fetchChannelInfo(channel) - } - } else if (cmdContent.cmd === "syncConversationExtra") { // 同步最近会话扩展 - WKSDK.shared().conversationManager.syncExtra() - } else if (cmdContent.cmd === "syncReminders") { // 同步提醒项 - WKSDK.shared().reminderManager.sync() - } else if (cmdContent.cmd === "messageRevoke") { // 消息撤回 - const channel = message.channel - const messageID = param.message_id - let conversation = WKSDK.shared().conversationManager.findConversation(channel) - if (conversation && conversation.lastMessage && conversation.lastMessage?.messageID === messageID) { - conversation.lastMessage.remoteExtra.revoke = true - conversation.lastMessage.remoteExtra.revoker = message.fromUID - WKSDK.shared().conversationManager.notifyConversationListeners(conversation, ConversationAction.update) - } - } - }) - - WKSDK.shared().chatManager.addMessageListener((message: Message) => { - console.log('收到消息->', message) - - if (TypingManager.shared.hasTyping(message.channel)) { - TypingManager.shared.removeTyping(message.channel) - } - switch (message.contentType) { - case MessageContentTypeConst.channelUpdate: - WKSDK.shared().channelManager.fetchChannelInfo(message.channel) - break - case MessageContentTypeConst.addMembers: - case MessageContentTypeConst.removeMembers: - WKSDK.shared().channelManager.syncSubscribes(message.channel) - break; - } - - if (this.allowNotify(message)) { - let from = "" - if (message.channel.channelType === ChannelTypeGroup) { - const fromChannelInfo = WKSDK.shared().channelManager.getChannelInfo(new Channel(message.fromUID, ChannelTypePerson)) - if (fromChannelInfo) { - from = `${fromChannelInfo?.orgData.displayName}: ` - } - - } - this.sendNotification(message, `${from}${message.content.conversationDigest}`) - } - }) - - WKSDK.shared().channelManager.addListener((channelInfo: ChannelInfo) => { - if (channelInfo.channel.channelType === ChannelTypePerson) { - if (WKApp.loginInfo.uid === channelInfo.channel.channelID) { - WKApp.loginInfo.name = channelInfo.title; - WKApp.loginInfo.shortNo = channelInfo.orgData.short_no; - WKApp.loginInfo.sex = channelInfo.orgData.sex; - WKApp.loginInfo.save() - } - } - - }) - - - this.registerChatMenus() // 注册开始菜单 - - this.registerUserInfo() // 注册用户资料功能 - - this.registerChannelSettings() // 注册频道设置功能 - this.registerChannelManages() // 注册频道管理功能 - this.registerMessageContextMenus() // 注册消息上下文菜单 - - this.registerChatToolbars() // 注册聊天工具栏 - - + ); } - allowNotify(message: Message) { - if (WKApp.shared.notificationIsClose) { // 用户关闭了通知 - return false + WKSDK.shared().chatManager.addCMDListener((message: Message) => { + console.log("收到CMD->", message); + const cmdContent = message.content as CMDContent; + const param = cmdContent.param; + + if (cmdContent.cmd === "channelUpdate") { + // 频道信息更新 + WKSDK.shared().channelManager.fetchChannelInfo( + new Channel(param.channel_id, param.channel_type) + ); + this.tipsAudio(); + } else if (cmdContent.cmd === "typing") { + TypingManager.shared.addTyping( + new Channel( + cmdContent.param.channel_id, + cmdContent.param.channel_type + ), + cmdContent.param.from_uid, + cmdContent.param.from_name + ); + } else if (cmdContent.cmd === "groupAvatarUpdate") { + // 群头像更新 + WKSDK.shared().channelManager.fetchChannelInfo( + new Channel(param.group_no, ChannelTypeGroup) + ); + } else if (cmdContent.cmd === "unreadClear") { + // 清除最近会话未读数量 + const channel = new Channel(param.channel_id, param.channel_type); + const conversation = + WKSDK.shared().conversationManager.findConversation(channel); + let unread = 0; + if (param.unread > 0) { + unread = param.unread; } - if (WKSDK.shared().isSystemMessage(message.contentType)) { // 系统消息不发通知 - return false + if (conversation) { + conversation.unread = unread; + WKSDK.shared().conversationManager.notifyConversationListeners( + conversation, + ConversationAction.update + ); } - if (message.fromUID === WKApp.loginInfo.uid) { // 自己发的消息不发通知 - return false + } else if (cmdContent.cmd === "conversationDeleted") { + // 最近会话删除 + const channel = new Channel(param.channel_id, param.channel_type); + WKSDK.shared().conversationManager.removeConversation(channel); + } else if (cmdContent.cmd === "friendRequest") { + // 好友申请 + const friendApply = new FriendApply(); + friendApply.uid = param.apply_uid; + friendApply.name = param.apply_name; + friendApply.state = FriendApplyState.apply; + friendApply.remark = param.remark; + friendApply.token = param.token; + friendApply.unread = true; + friendApply.createdAt = message.timestamp; + WKApp.shared.addFriendApply(friendApply); + } else if (cmdContent.cmd === "friendAccept") { + // 接受好友申请 + const toUID = param.to_uid; + if (!toUID || toUID === "") { + return; + } + if (param.from_uid) { + WKSDK.shared().channelManager.fetchChannelInfo( + new Channel(param.from_uid, ChannelTypePerson) + ); } - return true + WKApp.dataSource.contactsSync(); // 同步联系人 + + const friendApplys = WKApp.shared.getFriendApplys(); + if (friendApplys && friendApplys.length > 0) { + for (const friendApply of friendApplys) { + if (toUID === friendApply.uid) { + friendApply.unread = false; + friendApply.state = FriendApplyState.accepted; + WKApp.shared.updateFriendApply(friendApply); + WKApp.endpointManager.invokes( + EndpointCategory.friendApplyDataChange + ); + break; + } + } + } + } else if (cmdContent.cmd === "friendDeleted") { + WKApp.dataSource.contactsSync(); // 同步联系人 + } else if (cmdContent.cmd === "memberUpdate") { + // 成员更新 + const channel = new Channel( + cmdContent.param.group_no, + ChannelTypeGroup + ); + WKSDK.shared().channelManager.syncSubscribes(channel); + } else if (cmdContent.cmd === "onlineStatus") { + // 好友在线状态改变 + const channel = new Channel(cmdContent.param.uid, ChannelTypePerson); + const online = param.online === 1; + const onlineChannelInfo = + WKSDK.shared().channelManager.getChannelInfo(channel); + if (onlineChannelInfo) { + onlineChannelInfo.online = online; + if (!online) { + onlineChannelInfo.lastOffline = new Date().getTime() / 1000; + } + WKSDK.shared().channelManager.notifyListeners(onlineChannelInfo); + } else { + WKSDK.shared().channelManager.fetchChannelInfo(channel); + } + } else if (cmdContent.cmd === "syncConversationExtra") { + // 同步最近会话扩展 + WKSDK.shared().conversationManager.syncExtra(); + } else if (cmdContent.cmd === "syncReminders") { + // 同步提醒项 + WKSDK.shared().reminderManager.sync(); + } else if (cmdContent.cmd === "messageRevoke") { + // 消息撤回 + const channel = message.channel; + const messageID = param.message_id; + let conversation = + WKSDK.shared().conversationManager.findConversation(channel); + if ( + conversation && + conversation.lastMessage && + conversation.lastMessage?.messageID === messageID + ) { + conversation.lastMessage.remoteExtra.revoke = true; + conversation.lastMessage.remoteExtra.revoker = message.fromUID; + WKSDK.shared().conversationManager.notifyConversationListeners( + conversation, + ConversationAction.update + ); + } + } + }); + + WKSDK.shared().chatManager.addMessageListener((message: Message) => { + console.log("收到消息->", message); + + if (TypingManager.shared.hasTyping(message.channel)) { + TypingManager.shared.removeTyping(message.channel); + } + switch (message.contentType) { + case MessageContentTypeConst.channelUpdate: + WKSDK.shared().channelManager.fetchChannelInfo(message.channel); + break; + case MessageContentTypeConst.addMembers: + case MessageContentTypeConst.removeMembers: + WKSDK.shared().channelManager.syncSubscribes(message.channel); + break; + } + + if (this.allowNotify(message)) { + let from = ""; + if (message.channel.channelType === ChannelTypeGroup) { + const fromChannelInfo = WKSDK.shared().channelManager.getChannelInfo( + new Channel(message.fromUID, ChannelTypePerson) + ); + if (fromChannelInfo) { + from = `${fromChannelInfo?.orgData.displayName}: `; + } + } + this.sendNotification( + message, + `${from}${message.content.conversationDigest}` + ); + this.tipsAudio(); + } + }); + + WKSDK.shared().channelManager.addListener((channelInfo: ChannelInfo) => { + if (channelInfo.channel.channelType === ChannelTypePerson) { + if (WKApp.loginInfo.uid === channelInfo.channel.channelID) { + WKApp.loginInfo.name = channelInfo.title; + WKApp.loginInfo.shortNo = channelInfo.orgData.short_no; + WKApp.loginInfo.sex = channelInfo.orgData.sex; + WKApp.loginInfo.save(); + } + } + }); + + this.registerChatMenus(); // 注册开始菜单 + + this.registerUserInfo(); // 注册用户资料功能 + + this.registerChannelSettings(); // 注册频道设置功能 + this.registerChannelManages(); // 注册频道管理功能 + this.registerMessageContextMenus(); // 注册消息上下文菜单 + + this.registerChatToolbars(); // 注册聊天工具栏 + this.tipsAudio(); + } + + tipsAudio() { + Howler.autoUnlock = false; + if (!this.messageTone) { + this.messageTone = new Howl({ + src: require("./assets/msg-tip.mp3"), + }); + this.messageTone.play(); + } else { + this.messageTone.play(); + } + } + + allowNotify(message: Message) { + if (WKApp.shared.notificationIsClose) { + // 用户关闭了通知 + return false; + } + if (WKSDK.shared().isSystemMessage(message.contentType)) { + // 系统消息不发通知 + return false; + } + if (message.fromUID === WKApp.loginInfo.uid) { + // 自己发的消息不发通知 + return false; } - sendNotification(message: Message, description?: string) { - let channelInfo = WKSDK.shared().channelManager.getChannelInfo(message.channel) - if (channelInfo && channelInfo.mute) { - return - } - if (!message.header.reddot) { // 不显示红点的消息不发通知 - return - } + return true; + } - - if (window.Notification && Notification.permission !== "denied") { - const notify = new Notification(channelInfo ? channelInfo.orgData.displayName : "通知", { - body: description, - icon: WKApp.shared.avatarChannel(message.channel), - lang: 'zh-CN', - tag: "tag", - renotify: true - }); - - notify.onclick = () => { - notify.close(); - window.focus(); - WKApp.endpoints.showConversation(message.channel) - } - notify.onshow = () => { - //5秒后关闭消息框 - setTimeout(function () { - notify.close(); - }, 5000); - } - notify.onclose = () => { - console.log("通知关闭") - } - - } + sendNotification(message: Message, description?: string) { + let channelInfo = WKSDK.shared().channelManager.getChannelInfo( + message.channel + ); + if (channelInfo && channelInfo.mute) { + return; + } + if (!message.header.reddot) { + // 不显示红点的消息不发通知 + return; } - registerChatToolbars() { - WKApp.endpoints.registerChatToolbar("chattoolbar.emoji", (ctx) => { - return - }) - - WKApp.endpoints.registerChatToolbar("chattoolbar.mention", (ctx) => { - const channel = ctx.channel() - if (channel.channelType === ChannelTypePerson) { - return undefined - } - return { - ctx.messageInputContext().insertText("@") - }}> - }) - - WKApp.endpoints.registerChatToolbar("chattoolbar.screenshot", (ctx) => { - - return { - window.open("https://www.snipaste.com") - }}> - }) - WKApp.endpoints.registerChatToolbar("chattoolbar.image", (ctx) => { - - return - }) - + if (window.Notification && Notification.permission !== "denied") { + const notify = new Notification( + channelInfo ? channelInfo.orgData.displayName : "通知", + { + body: description, + icon: WKApp.shared.avatarChannel(message.channel), + lang: "zh-CN", + tag: "tag", + renotify: true, + } + ); + notify.onclick = () => { + notify.close(); + window.focus(); + WKApp.endpoints.showConversation(message.channel); + }; + notify.onshow = () => { + //5秒后关闭消息框 + setTimeout(function () { + notify.close(); + }, 5000); + }; + notify.onclose = () => { + console.log("通知关闭"); + }; } + } - registerChatMenus() { - WKApp.shared.chatMenusRegister("chatmenus.startchat", (param) => { - const isDark = WKApp.config.themeMode === ThemeMode.dark - return { - title: "发起群聊", - icon: require(`${isDark ? "./assets/popmenus_startchat_dark.png" : "./assets/popmenus_startchat.png"}`), - onClick: () => { - var selectItems: IndexTableItem[] - var finishButtonContext: FinishButtonContext - WKApp.routeLeft.push( { - finishButtonContext = context - }} onSelect={(items) => { - selectItems = items - }} showHeader={true} onBack={() => { - WKApp.routeLeft.pop() - }} onFinished={() => { - if (selectItems && selectItems.length > 0) { - finishButtonContext.loading(true) - WKApp.dataSource.channelDataSource.createChannel(selectItems.map((item) => { - return item.id - })).then(() => { - finishButtonContext.loading(false) - WKApp.routeLeft.pop() - }).catch((err) => { - Toast.error(err.msg) - finishButtonContext.loading(false) - }) - } - }}>) - } - } - }) - } + registerChatToolbars() { + WKApp.endpoints.registerChatToolbar("chattoolbar.emoji", (ctx) => { + return ( + + ); + }); - registerMessageContextMenus() { - WKApp.endpoints.registerMessageContextMenus("contextmenus.copy", (message) => { - if (message.contentType !== MessageContentType.text) { - return null - } + WKApp.endpoints.registerChatToolbar("chattoolbar.mention", (ctx) => { + const channel = ctx.channel(); + if (channel.channelType === ChannelTypePerson) { + return undefined; + } + return ( + { + ctx.messageInputContext().insertText("@"); + }} + > + ); + }); - return { - title: "复制", onClick: () => { - (function (s) { - document.oncopy = function (e) { - e.clipboardData?.setData('text', s); - e.preventDefault(); - document.oncopy = null; - } - })((message.content as MessageText).text || ""); - document.execCommand('Copy'); - } - } - }, 1000) + WKApp.endpoints.registerChatToolbar("chattoolbar.screenshot", (ctx) => { + return ( + { + window.open("https://www.snipaste.com"); + }} + > + ); + }); + WKApp.endpoints.registerChatToolbar("chattoolbar.image", (ctx) => { + return ( + + ); + }); + } - WKApp.endpoints.registerMessageContextMenus("contextmenus.forward", (message, context) => { - if (WKApp.shared.notSupportForward.includes(message.contentType)) { - return null - } - - - return { - title: "转发", onClick: () => { - context.fowardMessageUI(message) - } - } - }, 2000) - WKApp.endpoints.registerMessageContextMenus("contextmenus.reply", (message, context) => { - return { - title: "回复", onClick: () => { - context.reply(message) - } - } - }) - WKApp.endpoints.registerMessageContextMenus("contextmenus.muli", (message, context) => { - return { - title: "多选", onClick: () => { - context.setEditOn(true) - } - } - }, 3000) - WKApp.endpoints.registerMessageContextMenus("contextmenus.revoke", (message, context) => { - if (message.messageID == "") { - return null - } - - let isManager = false - if (message.channel.channelType == ChannelTypeGroup) { - const sub = WKSDK.shared().channelManager.getSubscribeOfMe(message.channel) - if (sub?.role == GroupRole.manager || sub?.role == GroupRole.owner) { - isManager = true; - } - } - - if (!isManager) { - if (!message.send) { - return null - } - let revokeSecond = WKApp.remoteConfig.revokeSecond - if (revokeSecond > 0) { - const messageTime = new Date().getTime() / 1000 - message.timestamp - if (messageTime > revokeSecond) { // 超过两分钟则不显示撤回 - return null - } - } - } - return { - title: "撤回", onClick: () => { - context.revokeMessage(message).catch((err) => { - Toast.error(err.msg) + registerChatMenus() { + WKApp.shared.chatMenusRegister("chatmenus.startchat", (param) => { + const isDark = WKApp.config.themeMode === ThemeMode.dark; + return { + title: "发起群聊", + icon: require(`${ + isDark + ? "./assets/popmenus_startchat_dark.png" + : "./assets/popmenus_startchat.png" + }`), + onClick: () => { + var selectItems: IndexTableItem[]; + var finishButtonContext: FinishButtonContext; + WKApp.routeLeft.push( + { + finishButtonContext = context; + }} + onSelect={(items) => { + selectItems = items; + }} + showHeader={true} + onBack={() => { + WKApp.routeLeft.pop(); + }} + onFinished={() => { + if (selectItems && selectItems.length > 0) { + finishButtonContext.loading(true); + WKApp.dataSource.channelDataSource + .createChannel( + selectItems.map((item) => { + return item.id; + }) + ) + .then(() => { + finishButtonContext.loading(false); + WKApp.routeLeft.pop(); }) + .catch((err) => { + Toast.error(err.msg); + finishButtonContext.loading(false); + }); } + }} + > + ); + }, + }; + }); + } + + registerMessageContextMenus() { + WKApp.endpoints.registerMessageContextMenus( + "contextmenus.copy", + (message) => { + if (message.contentType !== MessageContentType.text) { + return null; + } + + return { + title: "复制", + onClick: () => { + (function (s) { + document.oncopy = function (e) { + e.clipboardData?.setData("text", s); + e.preventDefault(); + document.oncopy = null; + }; + })((message.content as MessageText).text || ""); + document.execCommand("Copy"); + }, + }; + }, + 1000 + ); + + WKApp.endpoints.registerMessageContextMenus( + "contextmenus.forward", + (message, context) => { + if (WKApp.shared.notSupportForward.includes(message.contentType)) { + return null; + } + + return { + title: "转发", + onClick: () => { + context.fowardMessageUI(message); + }, + }; + }, + 2000 + ); + WKApp.endpoints.registerMessageContextMenus( + "contextmenus.reply", + (message, context) => { + return { + title: "回复", + onClick: () => { + context.reply(message); + }, + }; + } + ); + WKApp.endpoints.registerMessageContextMenus( + "contextmenus.muli", + (message, context) => { + return { + title: "多选", + onClick: () => { + context.setEditOn(true); + }, + }; + }, + 3000 + ); + WKApp.endpoints.registerMessageContextMenus( + "contextmenus.revoke", + (message, context) => { + if (message.messageID == "") { + return null; + } + + let isManager = false; + if (message.channel.channelType == ChannelTypeGroup) { + const sub = WKSDK.shared().channelManager.getSubscribeOfMe( + message.channel + ); + if (sub?.role == GroupRole.manager || sub?.role == GroupRole.owner) { + isManager = true; + } + } + + if (!isManager) { + if (!message.send) { + return null; + } + let revokeSecond = WKApp.remoteConfig.revokeSecond; + if (revokeSecond > 0) { + const messageTime = new Date().getTime() / 1000 - message.timestamp; + if (messageTime > revokeSecond) { + // 超过两分钟则不显示撤回 + return null; } - }, 4000) - } + } + } + return { + title: "撤回", + onClick: () => { + context.revokeMessage(message).catch((err) => { + Toast.error(err.msg); + }); + }, + }; + }, + 4000 + ); + } - registerUserInfo() { - WKApp.shared.userInfoRegister("userinfo.remark", (context: RouteContext) => { - const data = context.routeData() - const channelInfo = data.channelInfo - const fromSubscriberOfUser = data.fromSubscriberOfUser + registerUserInfo() { + WKApp.shared.userInfoRegister( + "userinfo.remark", + (context: RouteContext) => { + const data = context.routeData(); + const channelInfo = data.channelInfo; + const fromSubscriberOfUser = data.fromSubscriberOfUser; - if (data.isSelf) { - return - } + if (data.isSelf) { + return; + } - const rows = new Array() - rows.push(new Row({ - cell: ListItem, - properties: { - title: "设置备注", - onClick: () => { - this.inputEditPush(context, channelInfo?.orgData?.remark, async (value) => { - await WKApp.dataSource.commonDataSource.userRemark(data.uid, value).catch((err) => { - Toast.error(err.msg) - }) - return - }, "设置备注") - } - } - })) - if (fromSubscriberOfUser) { - let joinDesc = `${fromSubscriberOfUser.orgData.created_at.substr(0, 10)}` - if (fromSubscriberOfUser.orgData?.invite_uid && fromSubscriberOfUser.orgData?.invite_uid !== "") { - const inviterChannel = new Channel(fromSubscriberOfUser.orgData?.invite_uid, ChannelTypePerson) - const inviteChannelInfo = WKSDK.shared().channelManager.getChannelInfo(inviterChannel) - if (inviteChannelInfo) { - joinDesc += ` ${inviteChannelInfo.title}邀请入群` - } else { - WKSDK.shared().channelManager.fetchChannelInfo(inviterChannel) - } - } else { - joinDesc += "加入群聊" - } - rows.push(new Row({ - cell: ListItem, - properties: { - title: "进群方式", - subTitle: joinDesc, - } - })) - } - - return new Section({ - rows: rows - }) - }) - - WKApp.shared.userInfoRegister("userinfo.others", (context: RouteContext) => { - const data = context.routeData() - const channelInfo = data.channelInfo - const relation = channelInfo?.orgData?.follow - const status = channelInfo?.orgData.status - - console.log("userInfoRegister---refresh.....") - if (data.isSelf) { - return - } - console.log("userInfoRegister---refresh2.....", channelInfo) - - const rows = new Array() - if (relation === UserRelation.friend) { - rows.push(new Row({ - cell: ListItem, - properties: { - title: "解除好友关系", - onClick: () => { - WKApp.shared.baseContext.showAlert({ - content: `将联系人“${channelInfo?.orgData?.displayName}”删除,同时删除与该联系人的聊天记录`, - onOk: () => { - WKApp.dataSource.commonDataSource.deleteFriend(data.uid).then(() => { - const channel = new Channel(data.uid, ChannelTypePerson) - const conversation = WKSDK.shared().conversationManager.findConversation(channel) - if (conversation) { - WKApp.conversationProvider.clearConversationMessages(conversation) - } - WKSDK.shared().conversationManager.removeConversation(channel) - WKApp.endpointManager.invoke(EndpointID.clearChannelMessages, channel) - - WKSDK.shared().channelManager.fetchChannelInfo(new Channel(data.uid, ChannelTypePerson)) - - }).catch((err) => { - Toast.error(err.msg) - }) - - - } - }) - } - } - })) - } - - rows.push(new Row({ - cell: ListItem, - properties: { - title: status === UserRelation.blacklist ? "拉出黑名单" : "拉入黑名单", - onClick: () => { - if (status === UserRelation.blacklist) { - WKApp.dataSource.commonDataSource.blacklistRemove(data.uid).then(() => { - WKApp.dataSource.contactsSync() - }).catch((err) => { - Toast.error(err.msg) - }) - } else { - WKApp.shared.baseContext.showAlert({ - content: "加入黑名单,你将不再收到对方的消息。", - onOk: () => { - WKApp.dataSource.commonDataSource.blacklistAdd(data.uid).then(() => { - WKApp.dataSource.contactsSync() - }).catch((err) => { - Toast.error(err.msg) - }) - } - }) - } - - } - } - })) - - // rows.push(new Row({ - // cell: ListItem, - // properties: { - // title: "投诉", - // } - // })) - console.log("userInfoRegister---refresh3.....", rows) - return new Section({ - rows: rows - }) - }) - - WKApp.shared.userInfoRegister("userinfo.source", (context: RouteContext) => { - const data = context.routeData() - const channelInfo = data.channelInfo - const relation = channelInfo?.orgData?.follow - if (data.isSelf) { - return - } - if (relation !== UserRelation.friend) { - return - } - return new Section({ - rows: [ - new Row({ - cell: ListItem, - properties: { - title: "来源", - subTitle: `${channelInfo?.orgData?.source_desc}`, - } - }), - ] - }) - }) - - WKApp.shared.userInfoRegister("userinfo.blacklist.tip", (context: RouteContext) => { - const data = context.routeData() - const channelInfo = data.channelInfo - const status = channelInfo?.orgData?.status - if (data.isSelf) { - return - } - if (status !== UserRelation.blacklist) { - return - } - return new Section({ - rows: [ - new Row({ - cell: ListItemTip, - properties: { - tip:
已添加至黑名单,你将不再收到对方的消息
, - } - }), - ] - }) - }, 99999) - } - - inputEditPush(context: RouteContext, defaultValue: string, onFinish: (value: string) => Promise, placeholder?: string, maxCount?: number, allowEmpty?: boolean, allowWrap?: boolean) { - let value: string - let finishButtonContext: FinishButtonContext - context.push( { - value = v - if (!allowEmpty && (!value || value === "")) { - finishButtonContext.disable(true) - } else { - finishButtonContext.disable(false) - } - if (exceeded) { - finishButtonContext.disable(true) - } - }} maxCount={maxCount} allowWrap={allowWrap}>, new RouteContextConfig({ - showFinishButton: true, - onFinishContext: (finishBtnContext) => { - finishButtonContext = finishBtnContext - finishBtnContext.disable(true) + const rows = new Array(); + rows.push( + new Row({ + cell: ListItem, + properties: { + title: "设置备注", + onClick: () => { + this.inputEditPush( + context, + channelInfo?.orgData?.remark, + async (value) => { + await WKApp.dataSource.commonDataSource + .userRemark(data.uid, value) + .catch((err) => { + Toast.error(err.msg); + }); + return; + }, + "设置备注" + ); + }, }, - onFinish: async () => { - finishButtonContext.loading(true) - await onFinish(value) - finishButtonContext.loading(false) - - context.pop() + }) + ); + if (fromSubscriberOfUser) { + let joinDesc = `${fromSubscriberOfUser.orgData.created_at.substr( + 0, + 10 + )}`; + if ( + fromSubscriberOfUser.orgData?.invite_uid && + fromSubscriberOfUser.orgData?.invite_uid !== "" + ) { + const inviterChannel = new Channel( + fromSubscriberOfUser.orgData?.invite_uid, + ChannelTypePerson + ); + const inviteChannelInfo = + WKSDK.shared().channelManager.getChannelInfo(inviterChannel); + if (inviteChannelInfo) { + joinDesc += ` ${inviteChannelInfo.title}邀请入群`; + } else { + WKSDK.shared().channelManager.fetchChannelInfo(inviterChannel); } - })) - } - - registerChannelSettings() { - - WKApp.shared.channelSettingRegister("channel.subscribers", (context) => { - const data = context.routeData() as ChannelSettingRouteData - const channel = data.channel - - if (channel.channelType == ChannelTypeCustomerService) { - return - } - - let addFinishButtonContext: FinishButtonContext - let removeFinishButtonContext: FinishButtonContext - let addSelectItems: IndexTableItem[] - let removeSelectItems: IndexTableItem[] - const disableSelectList = data.subscribers.map((subscriber) => { - return subscriber.uid + } else { + joinDesc += "加入群聊"; + } + rows.push( + new Row({ + cell: ListItem, + properties: { + title: "进群方式", + subTitle: joinDesc, + }, }) - return new Section({ - rows: [ - new Row({ - cell: Subscribers, - properties: { - context: context, - key: channel.getChannelKey(), - onAdd: () => { - context.push( { - addSelectItems = items - addFinishButtonContext.disable(items.length === 0) - }} disableSelectList={disableSelectList} >, { - title: "联系人选择", - showFinishButton: true, - onFinish: async () => { - addFinishButtonContext.loading(true) + ); + } - if (channel.channelType === ChannelTypePerson) { - const uids = new Array() - uids.push(WKApp.loginInfo.uid || "") - uids.push(channel.channelID) - for (const item of addSelectItems) { - uids.push(item.id) - } + return new Section({ + rows: rows, + }); + } + ); - const result = await WKApp.dataSource.channelDataSource.createChannel(uids).catch((err) => { - Toast.error(err.msg) - }) - if (result) { - WKApp.endpoints.showConversation(new Channel(result.group_no, ChannelTypeGroup)) - } - } else { - await WKApp.dataSource.channelDataSource.addSubscribers(channel, addSelectItems.map((item) => { - return item.id - })) - context.pop() - } - addFinishButtonContext.loading(false) + WKApp.shared.userInfoRegister( + "userinfo.others", + (context: RouteContext) => { + const data = context.routeData(); + const channelInfo = data.channelInfo; + const relation = channelInfo?.orgData?.follow; + const status = channelInfo?.orgData.status; - }, - onFinishContext: (context) => { - console.log("onFinishContext------>", context) - addFinishButtonContext = context - addFinishButtonContext.disable(true) - } - }) - }, - onRemove: () => { - context.push( { - removeSelectItems = items - removeFinishButtonContext.disable(items.length === 0) - }} users={data.subscribers.filter((subscriber) => subscriber.uid !== WKApp.loginInfo.uid).map((item) => { - return new IndexTableItem(item.uid, item.name, item.avatar) - })}>, { - title: "删除群成员", - showFinishButton: true, - onFinish: async () => { - removeFinishButtonContext.loading(true) - await WKApp.dataSource.channelDataSource.removeSubscribers(channel, removeSelectItems.map((item) => { - return item.id - })) - removeFinishButtonContext.loading(false) - context.pop() - }, - onFinishContext: (context) => { - removeFinishButtonContext = context - removeFinishButtonContext.disable(true) - } - }) - } - } - }) - ], - }) - }) + console.log("userInfoRegister---refresh....."); + if (data.isSelf) { + return; + } + console.log("userInfoRegister---refresh2.....", channelInfo); - WKApp.shared.channelSettingRegister("channel.base.setting", (context) => { - const data = context.routeData() as ChannelSettingRouteData - const channelInfo = data.channelInfo - const channel = data.channel - if (channel.channelType !== ChannelTypeGroup) { - return undefined - } - const rows = new Array() - rows.push(new Row({ - cell: ListItem, - properties: { - title: "群聊名称", - subTitle: channelInfo?.title, - onClick: () => { - if (!data.isManagerOrCreatorOfMe) { - Toast.warning("只有管理者才能修改群名字") - return - } - this.inputEditPush(context, channelInfo?.title || "", (value: string) => { - return WKApp.dataSource.channelDataSource.updateField(channel, ChannelField.channelName, value).catch((err) => { - Toast.error(err.msg) - }) - }, "群名称", 20) - } - }, - })) + const rows = new Array(); + if (relation === UserRelation.friend) { + rows.push( + new Row({ + cell: ListItem, + properties: { + title: "解除好友关系", + onClick: () => { + WKApp.shared.baseContext.showAlert({ + content: `将联系人“${channelInfo?.orgData?.displayName}”删除,同时删除与该联系人的聊天记录`, + onOk: () => { + WKApp.dataSource.commonDataSource + .deleteFriend(data.uid) + .then(() => { + const channel = new Channel( + data.uid, + ChannelTypePerson + ); + const conversation = + WKSDK.shared().conversationManager.findConversation( + channel + ); + if (conversation) { + WKApp.conversationProvider.clearConversationMessages( + conversation + ); + } + WKSDK.shared().conversationManager.removeConversation( + channel + ); + WKApp.endpointManager.invoke( + EndpointID.clearChannelMessages, + channel + ); - rows.push(new Row({ - cell: ListItemIcon, - properties: { - title: "群头像", - icon: , - onClick: () => { - context.push(, { title: "群头像" }) - } - }, - })) - - rows.push(new Row({ - cell: ListItemIcon, - properties: { - title: "群二维码", - icon: , - onClick: () => { - context.push(, new RouteContextConfig({ - title: "群二维码名片", - })) - } - }, - })) - rows.push(new Row({ - cell: ListItemMuliteLine, - properties: { - title: "群公告", - subTitle: channelInfo?.orgData?.notice, - onClick: () => { - if (!data.isManagerOrCreatorOfMe) { - Toast.warning("只有管理者才能修改群公告") - return - } - this.inputEditPush(context, channelInfo?.orgData?.notice || "", (value: string) => { - return WKApp.dataSource.channelDataSource.updateField(channel, ChannelField.notice, value).catch((err) => { - Toast.error(err.msg) - }) - }, "群公告", 400, false, true) - } - }, - })) - - return new Section({ - rows: rows, - }) - }, 1000) - - - - WKApp.shared.channelSettingRegister("channel.base.setting2", (context) => { - const data = context.routeData() as ChannelSettingRouteData - const channelInfo = data.channelInfo - const channel = data.channel - const rows = new Array() - - if (channel.channelType == ChannelTypeCustomerService) { - return - } - - rows.push(new Row({ - cell: ListItemSwitch, - properties: { - title: "消息免打扰", - checked: channelInfo?.mute, - onCheck: (v: boolean, ctx: ListItemSwitchContext) => { - ctx.loading = true - ChannelSettingManager.shared.mute(v, channel).then(() => { - ctx.loading = false - data.refresh() - }).catch(() => { - ctx.loading = false + WKSDK.shared().channelManager.fetchChannelInfo( + new Channel(data.uid, ChannelTypePerson) + ); }) - } - }, - })) - - rows.push(new Row({ - cell: ListItemSwitch, - properties: { - title: "聊天置顶", - checked: channelInfo?.top, - onCheck: (v: boolean, ctx: ListItemSwitchContext) => { - ctx.loading = true - ChannelSettingManager.shared.top(v, channel).then(() => { - ctx.loading = false - data.refresh() - }).catch(() => { - ctx.loading = false - }) - } - }, - })) - - if (channel.channelType == ChannelTypeGroup) { - rows.push(new Row({ - cell: ListItemSwitch, - properties: { - title: "保存到通讯录", - checked: channelInfo?.orgData.save === 1, - onCheck: (v: boolean, ctx: ListItemSwitchContext) => { - ctx.loading = true - ChannelSettingManager.shared.save(v, channel).then(() => { - ctx.loading = false - data.refresh() - }).catch(() => { - ctx.loading = false - }) - } + .catch((err) => { + Toast.error(err.msg); + }); }, - })) - } - return new Section({ - rows: rows, + }); + }, + }, }) - }, 3000) + ); + } + rows.push( + new Row({ + cell: ListItem, + properties: { + title: + status === UserRelation.blacklist ? "拉出黑名单" : "拉入黑名单", + onClick: () => { + if (status === UserRelation.blacklist) { + WKApp.dataSource.commonDataSource + .blacklistRemove(data.uid) + .then(() => { + WKApp.dataSource.contactsSync(); + }) + .catch((err) => { + Toast.error(err.msg); + }); + } else { + WKApp.shared.baseContext.showAlert({ + content: "加入黑名单,你将不再收到对方的消息。", + onOk: () => { + WKApp.dataSource.commonDataSource + .blacklistAdd(data.uid) + .then(() => { + WKApp.dataSource.contactsSync(); + }) + .catch((err) => { + Toast.error(err.msg); + }); + }, + }); + } + }, + }, + }) + ); + // rows.push(new Row({ + // cell: ListItem, + // properties: { + // title: "投诉", + // } + // })) + console.log("userInfoRegister---refresh3.....", rows); + return new Section({ + rows: rows, + }); + } + ); - WKApp.shared.channelSettingRegister("channel.base.setting3", (context) => { - const data = context.routeData() as ChannelSettingRouteData - if (data.channel.channelType !== ChannelTypeGroup) { - return undefined - } + WKApp.shared.userInfoRegister( + "userinfo.source", + (context: RouteContext) => { + const data = context.routeData(); + const channelInfo = data.channelInfo; + const relation = channelInfo?.orgData?.follow; + if (data.isSelf) { + return; + } + if (relation !== UserRelation.friend) { + return; + } + return new Section({ + rows: [ + new Row({ + cell: ListItem, + properties: { + title: "来源", + subTitle: `${channelInfo?.orgData?.source_desc}`, + }, + }), + ], + }); + } + ); - let name = data.subscriberOfMe?.remark - if (!name || name === "") { - name = data.subscriberOfMe?.name - } + WKApp.shared.userInfoRegister( + "userinfo.blacklist.tip", + (context: RouteContext) => { + const data = context.routeData(); + const channelInfo = data.channelInfo; + const status = channelInfo?.orgData?.status; + if (data.isSelf) { + return; + } + if (status !== UserRelation.blacklist) { + return; + } + return new Section({ + rows: [ + new Row({ + cell: ListItemTip, + properties: { + tip: ( +
+ + 已添加至黑名单,你将不再收到对方的消息 +
+ ), + }, + }), + ], + }); + }, + 99999 + ); + } - return new Section({ - rows: [ - new Row({ - cell: ListItem, - properties: { - title: "我在本群的昵称", - subTitle: name, - onClick: () => { - this.inputEditPush(context, name || "", (value: string) => { - return WKApp.dataSource.channelDataSource.subscriberAttrUpdate(data.channel, WKApp.loginInfo.uid || "", { "remark": value }) - }, "在这里可以设置你在这个群里的昵称。这个昵称只会在此群内显示。", 10, true) - } - }, - }), - ], + inputEditPush( + context: RouteContext, + defaultValue: string, + onFinish: (value: string) => Promise, + placeholder?: string, + maxCount?: number, + allowEmpty?: boolean, + allowWrap?: boolean + ) { + let value: string; + let finishButtonContext: FinishButtonContext; + context.push( + { + value = v; + if (!allowEmpty && (!value || value === "")) { + finishButtonContext.disable(true); + } else { + finishButtonContext.disable(false); + } + if (exceeded) { + finishButtonContext.disable(true); + } + }} + maxCount={maxCount} + allowWrap={allowWrap} + >, + new RouteContextConfig({ + showFinishButton: true, + onFinishContext: (finishBtnContext) => { + finishButtonContext = finishBtnContext; + finishBtnContext.disable(true); + }, + onFinish: async () => { + finishButtonContext.loading(true); + await onFinish(value); + finishButtonContext.loading(false); + + context.pop(); + }, + }) + ); + } + + registerChannelSettings() { + WKApp.shared.channelSettingRegister("channel.subscribers", (context) => { + const data = context.routeData() as ChannelSettingRouteData; + const channel = data.channel; + + if (channel.channelType == ChannelTypeCustomerService) { + return; + } + + let addFinishButtonContext: FinishButtonContext; + let removeFinishButtonContext: FinishButtonContext; + let addSelectItems: IndexTableItem[]; + let removeSelectItems: IndexTableItem[]; + const disableSelectList = data.subscribers.map((subscriber) => { + return subscriber.uid; + }); + return new Section({ + rows: [ + new Row({ + cell: Subscribers, + properties: { + context: context, + key: channel.getChannelKey(), + onAdd: () => { + context.push( + { + addSelectItems = items; + addFinishButtonContext.disable(items.length === 0); + }} + disableSelectList={disableSelectList} + >, + { + title: "联系人选择", + showFinishButton: true, + onFinish: async () => { + addFinishButtonContext.loading(true); + + if (channel.channelType === ChannelTypePerson) { + const uids = new Array(); + uids.push(WKApp.loginInfo.uid || ""); + uids.push(channel.channelID); + for (const item of addSelectItems) { + uids.push(item.id); + } + + const result = await WKApp.dataSource.channelDataSource + .createChannel(uids) + .catch((err) => { + Toast.error(err.msg); + }); + if (result) { + WKApp.endpoints.showConversation( + new Channel(result.group_no, ChannelTypeGroup) + ); + } + } else { + await WKApp.dataSource.channelDataSource.addSubscribers( + channel, + addSelectItems.map((item) => { + return item.id; + }) + ); + context.pop(); + } + addFinishButtonContext.loading(false); + }, + onFinishContext: (context) => { + console.log("onFinishContext------>", context); + addFinishButtonContext = context; + addFinishButtonContext.disable(true); + }, + } + ); + }, + onRemove: () => { + context.push( + { + removeSelectItems = items; + removeFinishButtonContext.disable(items.length === 0); + }} + users={data.subscribers + .filter( + (subscriber) => subscriber.uid !== WKApp.loginInfo.uid + ) + .map((item) => { + return new IndexTableItem( + item.uid, + item.name, + item.avatar + ); + })} + >, + { + title: "删除群成员", + showFinishButton: true, + onFinish: async () => { + removeFinishButtonContext.loading(true); + await WKApp.dataSource.channelDataSource.removeSubscribers( + channel, + removeSelectItems.map((item) => { + return item.id; + }) + ); + removeFinishButtonContext.loading(false); + context.pop(); + }, + onFinishContext: (context) => { + removeFinishButtonContext = context; + removeFinishButtonContext.disable(true); + }, + } + ); + }, + }, + }), + ], + }); + }); + + WKApp.shared.channelSettingRegister( + "channel.base.setting", + (context) => { + const data = context.routeData() as ChannelSettingRouteData; + const channelInfo = data.channelInfo; + const channel = data.channel; + if (channel.channelType !== ChannelTypeGroup) { + return undefined; + } + const rows = new Array(); + rows.push( + new Row({ + cell: ListItem, + properties: { + title: "群聊名称", + subTitle: channelInfo?.title, + onClick: () => { + if (!data.isManagerOrCreatorOfMe) { + Toast.warning("只有管理者才能修改群名字"); + return; + } + this.inputEditPush( + context, + channelInfo?.title || "", + (value: string) => { + return WKApp.dataSource.channelDataSource + .updateField(channel, ChannelField.channelName, value) + .catch((err) => { + Toast.error(err.msg); + }); + }, + "群名称", + 20 + ); + }, + }, + }) + ); + + rows.push( + new Row({ + cell: ListItemIcon, + properties: { + title: "群头像", + icon: ( + + ), + onClick: () => { + context.push( + , + { title: "群头像" } + ); + }, + }, + }) + ); + + rows.push( + new Row({ + cell: ListItemIcon, + properties: { + title: "群二维码", + icon: ( + + ), + onClick: () => { + context.push( + , + new RouteContextConfig({ + title: "群二维码名片", + }) + ); + }, + }, + }) + ); + rows.push( + new Row({ + cell: ListItemMuliteLine, + properties: { + title: "群公告", + subTitle: channelInfo?.orgData?.notice, + onClick: () => { + if (!data.isManagerOrCreatorOfMe) { + Toast.warning("只有管理者才能修改群公告"); + return; + } + this.inputEditPush( + context, + channelInfo?.orgData?.notice || "", + (value: string) => { + return WKApp.dataSource.channelDataSource + .updateField(channel, ChannelField.notice, value) + .catch((err) => { + Toast.error(err.msg); + }); + }, + "群公告", + 400, + false, + true + ); + }, + }, + }) + ); + + return new Section({ + rows: rows, + }); + }, + 1000 + ); + + WKApp.shared.channelSettingRegister( + "channel.base.setting2", + (context) => { + const data = context.routeData() as ChannelSettingRouteData; + const channelInfo = data.channelInfo; + const channel = data.channel; + const rows = new Array(); + + if (channel.channelType == ChannelTypeCustomerService) { + return; + } + + rows.push( + new Row({ + cell: ListItemSwitch, + properties: { + title: "消息免打扰", + checked: channelInfo?.mute, + onCheck: (v: boolean, ctx: ListItemSwitchContext) => { + ctx.loading = true; + ChannelSettingManager.shared + .mute(v, channel) + .then(() => { + ctx.loading = false; + data.refresh(); + }) + .catch(() => { + ctx.loading = false; + }); + }, + }, + }) + ); + + rows.push( + new Row({ + cell: ListItemSwitch, + properties: { + title: "聊天置顶", + checked: channelInfo?.top, + onCheck: (v: boolean, ctx: ListItemSwitchContext) => { + ctx.loading = true; + ChannelSettingManager.shared + .top(v, channel) + .then(() => { + ctx.loading = false; + data.refresh(); + }) + .catch(() => { + ctx.loading = false; + }); + }, + }, + }) + ); + + if (channel.channelType == ChannelTypeGroup) { + rows.push( + new Row({ + cell: ListItemSwitch, + properties: { + title: "保存到通讯录", + checked: channelInfo?.orgData.save === 1, + onCheck: (v: boolean, ctx: ListItemSwitchContext) => { + ctx.loading = true; + ChannelSettingManager.shared + .save(v, channel) + .then(() => { + ctx.loading = false; + data.refresh(); + }) + .catch(() => { + ctx.loading = false; + }); + }, + }, }) - }, 4000) + ); + } + return new Section({ + rows: rows, + }); + }, + 3000 + ); - // WKApp.shared.channelSettingRegister("channel.notify.setting.screen", (context) => { - // return new Section({ - // subtitle: "在对话中的截屏,各方均会收到通知", - // rows: [ - // new Row({ - // cell: ListItemSwitch, - // properties: { - // title: "截屏通知", - // }, - // }), - // ], - // }) - // }) - // WKApp.shared.channelSettingRegister("channel.notify.setting.revokemind", (context) => { - // return new Section({ - // subtitle: "在对话中的消息撤回,各方均会收到通知", - // rows: [ - // new Row({ - // cell: ListItemSwitch, - // properties: { - // title: "撤回通知", - // }, - // }), - // ], - // }) - // }) - // WKApp.shared.channelSettingRegister("channel.base.setting5", (context) => { - // return new Section({ - // rows: [ - // new Row({ - // cell: ListItem, - // properties: { - // title: "投诉", - // }, - // }), - // ], - // }) - // }) + WKApp.shared.channelSettingRegister( + "channel.base.setting3", + (context) => { + const data = context.routeData() as ChannelSettingRouteData; + if (data.channel.channelType !== ChannelTypeGroup) { + return undefined; + } - WKApp.shared.channelSettingRegister("channel.base.setting6", (context) => { - const data = context.routeData() as ChannelSettingRouteData - if (data.channel.channelType !== ChannelTypeGroup) { - return undefined - } - return new Section({ - rows: [ - new Row({ - cell: ListItemButton, - properties: { - title: "清空聊天记录", - type: ListItemButtonType.warn, - onClick: () => { - WKApp.shared.baseContext.showAlert({ - content: "是否清空此会话的所有消息?", - onOk: async () => { - const conversation = WKSDK.shared().conversationManager.findConversation(data.channel) - if (!conversation) { - return - } - await WKApp.conversationProvider.clearConversationMessages(conversation) - conversation.lastMessage = undefined - WKApp.endpointManager.invoke(EndpointID.clearChannelMessages, data.channel) - } - }) - } - }, - }), - new Row({ - cell: ListItemButton, - properties: { - title: "删除并退出", - type: ListItemButtonType.warn, - onClick: () => { - WKApp.shared.baseContext.showAlert({ - content: "退出后不会通知群里其他成员,且不会再接收此群聊消息", - onOk: async () => { - WKApp.dataSource.channelDataSource.exitChannel(data.channel).catch((err) => { - Toast.error(err.msg) - }) - WKApp.conversationProvider.deleteConversation(data.channel) - } - }) - } - }, - }), - ], - }) - }, 90000) - } + let name = data.subscriberOfMe?.remark; + if (!name || name === "") { + name = data.subscriberOfMe?.name; + } - registerChannelManages() { - WKApp.shared.channelManageRegister("channel.setting.manage.invite", (context) => { - const data = context.routeData() as ChannelSettingRouteData - const channel = data.channel - const channelInfo = data.channelInfo - return new Section({ - subtitle: "启用后,群成员需要群主或管理员确认才能邀请朋友进群。扫描二维码进群将同时停用。", - rows: [ - new Row({ - cell: ListItemSwitch, - properties: { - title: "群聊邀请确认", - checked: channelInfo?.orgData?.invite === 1, - onCheck: (v: boolean, ctx: ListItemSwitchContext) => { - ctx.loading = true - ChannelSettingManager.shared.invite(v, channel).then(() => { - ctx.loading = false - data.refresh() - }).catch((err) => { - ctx.loading = false - }) - } - }, - }), - ], - }); - }) + return new Section({ + rows: [ + new Row({ + cell: ListItem, + properties: { + title: "我在本群的昵称", + subTitle: name, + onClick: () => { + this.inputEditPush( + context, + name || "", + (value: string) => { + return WKApp.dataSource.channelDataSource.subscriberAttrUpdate( + data.channel, + WKApp.loginInfo.uid || "", + { remark: value } + ); + }, + "在这里可以设置你在这个群里的昵称。这个昵称只会在此群内显示。", + 10, + true + ); + }, + }, + }), + ], + }); + }, + 4000 + ); - WKApp.shared.channelManageRegister("channel.setting.manage.transfer", (context) => { - const data = context.routeData() as ChannelSettingRouteData - const channel = data.channel - const subscriberOfMe = data.subscriberOfMe - if (!subscriberOfMe || subscriberOfMe.role !== GroupRole.owner) { - return - } - return new Section({ - rows: [ - new Row({ - cell: ListItem, - properties: { - title: "群主管理权转让", - onClick: () => { - context.push( { - const item = items[0] - WKApp.shared.baseContext.showAlert({ - content: "你将自动放弃群主身份", - onOk: () => { - WKApp.dataSource.channelDataSource.channelTransferOwner(channel, item.id).then(() => { - context.popToRoot() - }).catch((err) => { - Toast.error(err.msg) - }) - } - }) - }} users={data.subscribers.filter((subscriber) => !(subscriber.uid === WKApp.loginInfo.uid || subscriber.uid === WKApp.config.fileHelperUID || subscriber.uid === WKApp.config.systemUID)).map((item) => { - return new IndexTableItem(item.uid, item.name, item.avatar) - })}>, { - title: "选择新的群主", - showFinishButton: false, - onFinish: async () => { + // WKApp.shared.channelSettingRegister("channel.notify.setting.screen", (context) => { + // return new Section({ + // subtitle: "在对话中的截屏,各方均会收到通知", + // rows: [ + // new Row({ + // cell: ListItemSwitch, + // properties: { + // title: "截屏通知", + // }, + // }), + // ], + // }) + // }) + // WKApp.shared.channelSettingRegister("channel.notify.setting.revokemind", (context) => { + // return new Section({ + // subtitle: "在对话中的消息撤回,各方均会收到通知", + // rows: [ + // new Row({ + // cell: ListItemSwitch, + // properties: { + // title: "撤回通知", + // }, + // }), + // ], + // }) + // }) + // WKApp.shared.channelSettingRegister("channel.base.setting5", (context) => { + // return new Section({ + // rows: [ + // new Row({ + // cell: ListItem, + // properties: { + // title: "投诉", + // }, + // }), + // ], + // }) + // }) - context.pop() - }, - onFinishContext: (context) => { - } - }) - } - }, - }), - ], - }); - }) + WKApp.shared.channelSettingRegister( + "channel.base.setting6", + (context) => { + const data = context.routeData() as ChannelSettingRouteData; + if (data.channel.channelType !== ChannelTypeGroup) { + return undefined; + } + return new Section({ + rows: [ + new Row({ + cell: ListItemButton, + properties: { + title: "清空聊天记录", + type: ListItemButtonType.warn, + onClick: () => { + WKApp.shared.baseContext.showAlert({ + content: "是否清空此会话的所有消息?", + onOk: async () => { + const conversation = + WKSDK.shared().conversationManager.findConversation( + data.channel + ); + if (!conversation) { + return; + } + await WKApp.conversationProvider.clearConversationMessages( + conversation + ); + conversation.lastMessage = undefined; + WKApp.endpointManager.invoke( + EndpointID.clearChannelMessages, + data.channel + ); + }, + }); + }, + }, + }), + new Row({ + cell: ListItemButton, + properties: { + title: "删除并退出", + type: ListItemButtonType.warn, + onClick: () => { + WKApp.shared.baseContext.showAlert({ + content: + "退出后不会通知群里其他成员,且不会再接收此群聊消息", + onOk: async () => { + WKApp.dataSource.channelDataSource + .exitChannel(data.channel) + .catch((err) => { + Toast.error(err.msg); + }); + WKApp.conversationProvider.deleteConversation( + data.channel + ); + }, + }); + }, + }, + }), + ], + }); + }, + 90000 + ); + } - WKApp.shared.channelManageRegister("channel.setting.manage.mute", (context) => { - const data = context.routeData() as ChannelSettingRouteData - const channel = data.channel - const channelInfo = data.channelInfo - return new Section({ - title: "成员设置", - subtitle: "全员禁言启用后,只允许群主和管理员发言。", - rows: [ - new Row({ - cell: ListItemSwitch, - properties: { - title: "全员禁言", - checked: channelInfo?.orgData?.forbidden === 1, - onCheck: (v: boolean, ctx: ListItemSwitchContext) => { - ctx.loading = true - ChannelSettingManager.shared.forbidden(v, channel).then(() => { - ctx.loading = false - data.refresh() - }).catch((err) => { - ctx.loading = false - }) - } - }, - }), - ], - }); - }) + registerChannelManages() { + WKApp.shared.channelManageRegister( + "channel.setting.manage.invite", + (context) => { + const data = context.routeData() as ChannelSettingRouteData; + const channel = data.channel; + const channelInfo = data.channelInfo; + return new Section({ + subtitle: + "启用后,群成员需要群主或管理员确认才能邀请朋友进群。扫描二维码进群将同时停用。", + rows: [ + new Row({ + cell: ListItemSwitch, + properties: { + title: "群聊邀请确认", + checked: channelInfo?.orgData?.invite === 1, + onCheck: (v: boolean, ctx: ListItemSwitchContext) => { + ctx.loading = true; + ChannelSettingManager.shared + .invite(v, channel) + .then(() => { + ctx.loading = false; + data.refresh(); + }) + .catch((err) => { + ctx.loading = false; + }); + }, + }, + }), + ], + }); + } + ); - WKApp.shared.channelManageRegister("channel.setting.manage.prohibitAddFriend", (context) => { - const data = context.routeData() as ChannelSettingRouteData - const channel = data.channel - const channelInfo = data.channelInfo - return new Section({ - rows: [ - new Row({ - cell: ListItemSwitch, - properties: { - title: "禁止群成员互加好友", - checked: channelInfo?.orgData?.forbidden_add_friend === 1, - onCheck: (v: boolean, ctx: ListItemSwitchContext) => { - ctx.loading = true - ChannelSettingManager.shared.forbiddenAddFriend(v, channel).then(() => { - ctx.loading = false - data.refresh() - }).catch((err) => { - ctx.loading = false - }) - } - }, - }), - ], - }); - }) - WKApp.shared.channelManageRegister("channel.setting.manage.blacklist", (context) => { - return new Section({ - rows: [ - new Row({ - cell: ListItem, - properties: { - title: "群黑名单", - onClick: () => { - context.push(, { - title: "群黑名单", - }) - } - }, - }), - ], - }); - }) - WKApp.shared.channelManageRegister("channel.setting.manage.managerlist", (context) => { - const data = context.routeData() as ChannelSettingRouteData - const subscriberOfMe = data.subscriberOfMe - if (subscriberOfMe?.role !== GroupRole.owner) { - return - } - return new Section({ - title: "群主、管理员", - rows: [ - new Row({ - cell: ChannelManagerList, - properties: { - routeContext: context, - }, - }), - ], - }); - }) - } + WKApp.shared.channelManageRegister( + "channel.setting.manage.transfer", + (context) => { + const data = context.routeData() as ChannelSettingRouteData; + const channel = data.channel; + const subscriberOfMe = data.subscriberOfMe; + if (!subscriberOfMe || subscriberOfMe.role !== GroupRole.owner) { + return; + } + return new Section({ + rows: [ + new Row({ + cell: ListItem, + properties: { + title: "群主管理权转让", + onClick: () => { + context.push( + { + const item = items[0]; + WKApp.shared.baseContext.showAlert({ + content: "你将自动放弃群主身份", + onOk: () => { + WKApp.dataSource.channelDataSource + .channelTransferOwner(channel, item.id) + .then(() => { + context.popToRoot(); + }) + .catch((err) => { + Toast.error(err.msg); + }); + }, + }); + }} + users={data.subscribers + .filter( + (subscriber) => + !( + subscriber.uid === WKApp.loginInfo.uid || + subscriber.uid === WKApp.config.fileHelperUID || + subscriber.uid === WKApp.config.systemUID + ) + ) + .map((item) => { + return new IndexTableItem( + item.uid, + item.name, + item.avatar + ); + })} + >, + { + title: "选择新的群主", + showFinishButton: false, + onFinish: async () => { + context.pop(); + }, + onFinishContext: (context) => {}, + } + ); + }, + }, + }), + ], + }); + } + ); + + WKApp.shared.channelManageRegister( + "channel.setting.manage.mute", + (context) => { + const data = context.routeData() as ChannelSettingRouteData; + const channel = data.channel; + const channelInfo = data.channelInfo; + return new Section({ + title: "成员设置", + subtitle: "全员禁言启用后,只允许群主和管理员发言。", + rows: [ + new Row({ + cell: ListItemSwitch, + properties: { + title: "全员禁言", + checked: channelInfo?.orgData?.forbidden === 1, + onCheck: (v: boolean, ctx: ListItemSwitchContext) => { + ctx.loading = true; + ChannelSettingManager.shared + .forbidden(v, channel) + .then(() => { + ctx.loading = false; + data.refresh(); + }) + .catch((err) => { + ctx.loading = false; + }); + }, + }, + }), + ], + }); + } + ); + + WKApp.shared.channelManageRegister( + "channel.setting.manage.prohibitAddFriend", + (context) => { + const data = context.routeData() as ChannelSettingRouteData; + const channel = data.channel; + const channelInfo = data.channelInfo; + return new Section({ + rows: [ + new Row({ + cell: ListItemSwitch, + properties: { + title: "禁止群成员互加好友", + checked: channelInfo?.orgData?.forbidden_add_friend === 1, + onCheck: (v: boolean, ctx: ListItemSwitchContext) => { + ctx.loading = true; + ChannelSettingManager.shared + .forbiddenAddFriend(v, channel) + .then(() => { + ctx.loading = false; + data.refresh(); + }) + .catch((err) => { + ctx.loading = false; + }); + }, + }, + }), + ], + }); + } + ); + WKApp.shared.channelManageRegister( + "channel.setting.manage.blacklist", + (context) => { + return new Section({ + rows: [ + new Row({ + cell: ListItem, + properties: { + title: "群黑名单", + onClick: () => { + context.push( + , + { + title: "群黑名单", + } + ); + }, + }, + }), + ], + }); + } + ); + WKApp.shared.channelManageRegister( + "channel.setting.manage.managerlist", + (context) => { + const data = context.routeData() as ChannelSettingRouteData; + const subscriberOfMe = data.subscriberOfMe; + if (subscriberOfMe?.role !== GroupRole.owner) { + return; + } + return new Section({ + title: "群主、管理员", + rows: [ + new Row({ + cell: ChannelManagerList, + properties: { + routeContext: context, + }, + }), + ], + }); + } + ); + } } diff --git a/turbo.json b/turbo.json index 40ddf1d..fdad91d 100644 --- a/turbo.json +++ b/turbo.json @@ -1,14 +1,22 @@ { "$schema": "https://turborepo.org/schema.json", "pipeline": { + "dev": { + "cache": false + }, + "dev-ele": { + "dependsOn": ["^dev"], + "cache": false + }, "build": { "outputs": [".next/**"] }, + "build-ele": { + "outputs": [".next/**"], + "dependsOn": ["^build"] + }, "lint": { "outputs": [] - }, - "dev": { - "cache": false } } } From 9bcf418171e5f08b4d4b5eb86d85547c3ceda0f4 Mon Sep 17 00:00:00 2001 From: wanglihui <1769794040@qq.com> Date: Thu, 28 Dec 2023 14:58:35 +0800 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E9=9F=B3=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/tsdaodaobase/src/assets/msg-tip.mp3 | Bin 0 -> 6559 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/tsdaodaobase/src/assets/msg-tip.mp3 diff --git a/packages/tsdaodaobase/src/assets/msg-tip.mp3 b/packages/tsdaodaobase/src/assets/msg-tip.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b4b7e98786d8dbd825aee82218c437dfc0d74b5d GIT binary patch literal 6559 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 literal 0 HcmV?d00001 From 2cef85714bdd58c8d4c4d3b83520712dd036b696 Mon Sep 17 00:00:00 2001 From: wanglihui <1769794040@qq.com> Date: Thu, 28 Dec 2023 20:31:35 +0800 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E.yarnrc=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 +- .yarnrc | 3 + yarn.lock | 1593 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 1569 insertions(+), 33 deletions(-) create mode 100644 .yarnrc diff --git a/.gitignore b/.gitignore index c0627dd..a29114b 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,8 @@ yarn-error.log* lib/ out/ -build \ No newline at end of file +build +out-election/ +output/ +icon.icns +icons.iconset \ No newline at end of file diff --git a/.yarnrc b/.yarnrc new file mode 100644 index 0000000..3db8343 --- /dev/null +++ b/.yarnrc @@ -0,0 +1,3 @@ +registry "https://registry.npmmirror.com/" + +electron_mirror "https://registry.npmmirror.com/-/binary/electron/" \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 8992f1b..f22532f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"7zip-bin@~5.2.0": + version "5.2.0" + resolved "https://registry.npmmirror.com/7zip-bin/-/7zip-bin-5.2.0.tgz#7a03314684dd6572b7dfa89e68ce31d60286854d" + integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A== + "@aashutoshrathi/word-wrap@^1.2.3": version "1.2.6" resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" @@ -2060,6 +2065,14 @@ resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.npmmirror.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + "@dnd-kit/accessibility@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@dnd-kit/accessibility/-/accessibility-3.0.1.tgz#3ccbefdfca595b0a23a5dc57d3de96bc6935641c" @@ -2172,6 +2185,64 @@ scroll-into-view-if-needed "^2.2.24" utility-types "^3.10.0" +"@electron/asar@^3.2.1": + version "3.2.8" + resolved "https://registry.npmmirror.com/@electron/asar/-/asar-3.2.8.tgz#2ea722f3452583dbd4ffdcc4b4f5dc903f1d8178" + integrity sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg== + dependencies: + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + +"@electron/get@^2.0.0": + version "2.0.3" + resolved "https://registry.npmmirror.com/@electron/get/-/get-2.0.3.tgz#fba552683d387aebd9f3fcadbcafc8e12ee4f960" + integrity sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^11.8.5" + progress "^2.0.3" + semver "^6.2.0" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^3.0.0" + +"@electron/notarize@2.1.0": + version "2.1.0" + resolved "https://registry.npmmirror.com/@electron/notarize/-/notarize-2.1.0.tgz#76aaec10c8687225e8d0a427cc9df67611c46ff3" + integrity sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + promise-retry "^2.0.1" + +"@electron/osx-sign@1.0.5": + version "1.0.5" + resolved "https://registry.npmmirror.com/@electron/osx-sign/-/osx-sign-1.0.5.tgz#0af7149f2fce44d1a8215660fd25a9fb610454d8" + integrity sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww== + dependencies: + compare-version "^0.1.2" + debug "^4.3.4" + fs-extra "^10.0.0" + isbinaryfile "^4.0.8" + minimist "^1.2.6" + plist "^3.0.5" + +"@electron/universal@1.4.1": + version "1.4.1" + resolved "https://registry.npmmirror.com/@electron/universal/-/universal-1.4.1.tgz#3fbda2a5ed9ff9f3304c8e8316b94c1e3a7b3785" + integrity sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ== + dependencies: + "@electron/asar" "^3.2.1" + "@malept/cross-spawn-promise" "^1.1.0" + debug "^4.3.1" + dir-compare "^3.0.0" + fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" + "@emotion/babel-plugin@^11.10.0": version "11.10.2" resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.2.tgz#879db80ba622b3f6076917a1e6f648b1c7d008c7" @@ -2308,6 +2379,18 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.49.0.tgz#86f79756004a97fa4df866835093f1df3d03c333" integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w== +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.npmmirror.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + "@humanwhocodes/config-array@^0.11.11": version "0.11.11" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" @@ -2336,6 +2419,18 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -2668,6 +2763,23 @@ pako "^2.0.4" resize-observer-polyfill "^1.5.1" +"@malept/cross-spawn-promise@^1.1.0": + version "1.1.1" + resolved "https://registry.npmmirror.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" + integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== + dependencies: + cross-spawn "^7.0.1" + +"@malept/flatpak-bundler@^0.4.0": + version "0.4.0" + resolved "https://registry.npmmirror.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" + integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.0" + lodash "^4.17.15" + tmp-promise "^3.0.2" + "@next/eslint-plugin-next@12.3.1": version "12.3.1" resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-12.3.1.tgz#b821f27b0f175954d8d18e5d323fce040ecc79a6" @@ -2703,6 +2815,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": version "0.5.11" resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz#7c2268cedaa0644d677e8c4f377bc8fb304f714a" @@ -2775,11 +2892,33 @@ resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz#5405ee8e444ed212db44e79351f0c70a582aae25" integrity sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw== +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.npmmirror.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.npmmirror.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.npmmirror.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== +"@sindresorhus/is@^4.0.0": + version "4.6.0" + resolved "https://registry.npmmirror.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + "@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -2907,6 +3046,13 @@ "@svgr/plugin-svgo" "^5.5.0" loader-utils "^2.0.0" +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + "@tauri-apps/api@^1.1.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.4.0.tgz#b4013ca3d17b853f7df29fe14079ebb4d52dbffa" @@ -3033,6 +3179,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" @@ -3109,6 +3260,16 @@ dependencies: "@types/node" "*" +"@types/cacheable-request@^6.0.1": + version "6.0.3" + resolved "https://registry.npmmirror.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + "@types/connect-history-api-fallback@^1.3.5": version "1.5.1" resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz#6e5e3602d93bda975cebc3449e1a318340af9e20" @@ -3129,6 +3290,13 @@ resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d" integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA== +"@types/debug@^4.1.6": + version "4.1.12" + resolved "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + "@types/eslint-scope@^3.7.3": version "3.7.4" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" @@ -3180,6 +3348,13 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + "@types/graceful-fs@^4.1.2": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" @@ -3187,11 +3362,21 @@ dependencies: "@types/node" "*" +"@types/howler@^2.2.11": + version "2.2.11" + resolved "https://registry.npmmirror.com/@types/howler/-/howler-2.2.11.tgz#a75c4ab5666aee5fcfbd5de15d35dbaaa3d3f070" + integrity sha512-7aBoUL6RbSIrqKnpEgfa1wSNUBK06mn08siP2QI0zYk7MXfEJAaORc4tohamQYqCqVESoDyRWSdQn2BOKWj2Qw== + "@types/html-minifier-terser@^6.0.0": version "6.1.0" resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== +"@types/http-cache-semantics@*": + version "4.0.4" + resolved "https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + "@types/http-errors@*": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" @@ -3253,6 +3438,13 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.npmmirror.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + "@types/mime@*": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" @@ -3263,6 +3455,11 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== +"@types/ms@*": + version "0.7.34" + resolved "https://registry.npmmirror.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + "@types/node-forge@^1.0.0": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.0.5.tgz#5c793947838dbe90c699a4651583a13744397650" @@ -3275,10 +3472,19 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.18.tgz#633184f55c322e4fb08612307c274ee6d5ed3154" integrity sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg== -"@types/node@^12.0.0": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== +"@types/node@^18.11.18": + version "18.19.3" + resolved "https://registry.npmmirror.com/@types/node/-/node-18.19.3.tgz#e4723c4cb385641d61b983f6fe0b716abd5f8fc0" + integrity sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg== + dependencies: + undici-types "~5.26.4" + +"@types/node@^20.10.5": + version "20.10.5" + resolved "https://registry.npmmirror.com/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2" + integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== + dependencies: + undici-types "~5.26.4" "@types/pako@^1.0.1": version "1.0.4" @@ -3290,6 +3496,14 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/plist@^3.0.1": + version "3.0.5" + resolved "https://registry.npmmirror.com/@types/plist/-/plist-3.0.5.tgz#9a0c49c0f9886c8c8696a7904dd703f6284036e0" + integrity sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" + "@types/prettier@^2.1.5": version "2.7.3" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" @@ -3405,6 +3619,13 @@ dependencies: "@types/node" "*" +"@types/responselike@^1.0.0": + version "1.0.3" + resolved "https://registry.npmmirror.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== + dependencies: + "@types/node" "*" + "@types/retry@0.12.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" @@ -3484,6 +3705,11 @@ resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== +"@types/verror@^1.10.3": + version "1.10.9" + resolved "https://registry.npmmirror.com/@types/verror/-/verror-1.10.9.tgz#420c32adb9a2dd50b3db4c8f96501e05a0e72941" + integrity sha512-MLx9Z+9lGzwEuW16ubGeNkpBDE84RpB/NyGgg6z2BTpWzKkGU451cAY3UkUzZEp72RHF585oJ3V8JVNqIplcAQ== + "@types/ws@^8.5.5": version "8.5.5" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" @@ -3524,6 +3750,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + "@typescript-eslint/eslint-plugin@^5.5.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" @@ -3567,6 +3800,17 @@ "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" +"@typescript-eslint/parser@^6.16.0": + version "6.16.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.16.0.tgz#36f39f63b126aa25af2ad2df13d9891e9fd5b40c" + integrity sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw== + dependencies: + "@typescript-eslint/scope-manager" "6.16.0" + "@typescript-eslint/types" "6.16.0" + "@typescript-eslint/typescript-estree" "6.16.0" + "@typescript-eslint/visitor-keys" "6.16.0" + debug "^4.3.4" + "@typescript-eslint/scope-manager@5.38.0": version "5.38.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz#8f0927024b6b24e28671352c93b393a810ab4553" @@ -3583,6 +3827,14 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" +"@typescript-eslint/scope-manager@6.16.0": + version "6.16.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.16.0.tgz#f3e9a00fbc1d0701356359cd56489c54d9e37168" + integrity sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw== + dependencies: + "@typescript-eslint/types" "6.16.0" + "@typescript-eslint/visitor-keys" "6.16.0" + "@typescript-eslint/type-utils@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" @@ -3603,6 +3855,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/types@6.16.0": + version "6.16.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.16.0.tgz#a3abe0045737d44d8234708d5ed8fef5d59dc91e" + integrity sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ== + "@typescript-eslint/typescript-estree@5.38.0": version "5.38.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz#89f86b2279815c6fb7f57d68cf9b813f0dc25d98" @@ -3629,6 +3886,20 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@6.16.0": + version "6.16.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.16.0.tgz#d6e0578e4f593045f0df06c4b3a22bd6f13f2d03" + integrity sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA== + dependencies: + "@typescript-eslint/types" "6.16.0" + "@typescript-eslint/visitor-keys" "6.16.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + "@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.58.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" @@ -3659,6 +3930,14 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@6.16.0": + version "6.16.0" + resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.16.0.tgz#d50da18a05d91318ed3e7e8889bda0edc35f3a10" + integrity sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A== + dependencies: + "@typescript-eslint/types" "6.16.0" + eslint-visitor-keys "^3.4.1" + "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" @@ -3780,6 +4059,11 @@ "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" +"@xmldom/xmldom@^0.8.8": + version "0.8.10" + resolved "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -3890,7 +4174,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3976,6 +4260,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -3989,6 +4278,45 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +app-builder-bin@4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" + integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== + +app-builder-lib@24.9.1: + version "24.9.1" + resolved "https://registry.npmmirror.com/app-builder-lib/-/app-builder-lib-24.9.1.tgz#bf3568529298b4de8595ed1acbb351fe27db5ba4" + integrity sha512-Q1nYxZcio4r+W72cnIRVYofEAyjBd3mG47o+zms8HlD51zWtA/YxJb01Jei5F+jkWhge/PTQK+uldsPh6d0/4g== + dependencies: + "7zip-bin" "~5.2.0" + "@develar/schema-utils" "~2.6.5" + "@electron/notarize" "2.1.0" + "@electron/osx-sign" "1.0.5" + "@electron/universal" "1.4.1" + "@malept/flatpak-bundler" "^0.4.0" + "@types/fs-extra" "9.0.13" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "24.8.1" + builder-util-runtime "9.2.3" + chromium-pickle-js "^0.2.0" + debug "^4.3.4" + ejs "^3.1.8" + electron-publish "24.8.1" + form-data "^4.0.0" + fs-extra "^10.1.0" + hosted-git-info "^4.1.0" + is-ci "^3.0.0" + isbinaryfile "^5.0.0" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + minimatch "^5.1.1" + read-config-file "6.3.2" + sanitize-filename "^1.6.3" + semver "^7.3.8" + tar "^6.1.12" + temp-file "^3.4.0" + arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -4155,6 +4483,11 @@ asap@~2.0.6: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" @@ -4165,6 +4498,11 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" 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#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + async-validator@^3.5.0: version "3.5.2" resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-3.5.2.tgz#68e866a96824e8b2694ff7a831c1a25c44d5e500" @@ -4226,6 +4564,15 @@ axios@^0.25.0: dependencies: follow-redirects "^1.14.7" +axios@^1.6.1: + version "1.6.3" + resolved "https://registry.npmmirror.com/axios/-/axios-1.6.3.tgz#7f50f23b3aa246eff43c54834272346c396613f4" + integrity sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + axobject-query@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" @@ -4403,7 +4750,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1: +base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -4455,6 +4802,13 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.npmmirror.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -4493,6 +4847,11 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +boolean@^3.0.1: + version "3.2.0" + resolved "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" + integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -4547,11 +4906,29 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer-equal@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/buffer-equal/-/buffer-equal-1.0.1.tgz#2f7651be5b1b3f057fcd6e7ee16cf34767077d90" + integrity sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^5.1.0: + version "5.7.1" + resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -4560,6 +4937,36 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +builder-util-runtime@9.2.3: + version "9.2.3" + resolved "https://registry.npmmirror.com/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz#0a82c7aca8eadef46d67b353c638f052c206b83c" + integrity sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw== + dependencies: + debug "^4.3.4" + sax "^1.2.4" + +builder-util@24.8.1: + version "24.8.1" + resolved "https://registry.npmmirror.com/builder-util/-/builder-util-24.8.1.tgz#594d45b0c86d1d17f5c7bebbb77405080b2571c2" + integrity sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw== + dependencies: + "7zip-bin" "~5.2.0" + "@types/debug" "^4.1.6" + app-builder-bin "4.0.0" + bluebird-lst "^1.0.9" + builder-util-runtime "9.2.3" + chalk "^4.1.2" + cross-spawn "^7.0.3" + debug "^4.3.4" + fs-extra "^10.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-ci "^3.0.0" + js-yaml "^4.1.0" + source-map-support "^0.5.19" + stat-mode "^1.0.0" + temp-file "^3.4.0" + builtin-modules@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" @@ -4575,6 +4982,24 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.npmmirror.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -4696,11 +5121,21 @@ chokidar@^3.4.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw== + ci-info@^3.2.0: version "3.8.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" @@ -4723,6 +5158,14 @@ clean-css@^5.2.2: dependencies: source-map "~0.6.0" +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -4732,6 +5175,22 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + clsx@^1.0.4, clsx@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" @@ -4807,6 +5266,11 @@ commander@^4.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" @@ -4832,6 +5296,11 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.npmmirror.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A== + compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -4862,6 +5331,29 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +concurrently@^8.2.2: + version "8.2.2" + resolved "https://registry.npmmirror.com/concurrently/-/concurrently-8.2.2.tgz#353141985c198cfa5e4a3ef90082c336b5851784" + integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg== + dependencies: + chalk "^4.1.2" + date-fns "^2.30.0" + lodash "^4.17.21" + rxjs "^7.8.1" + shell-quote "^1.8.1" + spawn-command "0.0.2" + supports-color "^8.1.1" + tree-kill "^1.2.2" + yargs "^17.7.2" + +config-file-ts@^0.2.4: + version "0.2.6" + resolved "https://registry.npmmirror.com/config-file-ts/-/config-file-ts-0.2.6.tgz#b424ff74612fb37f626d6528f08f92ddf5d22027" + integrity sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w== + dependencies: + glob "^10.3.10" + typescript "^5.3.3" + confusing-browser-globals@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" @@ -4935,6 +5427,11 @@ core-js@^3.19.2: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.32.2.tgz#172fb5949ef468f93b4be7841af6ab1f21992db7" integrity sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ== +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -4962,6 +5459,13 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + cross-env@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" @@ -4969,7 +5473,18 @@ cross-env@^7.0.3: dependencies: cross-spawn "^7.0.1" -cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -5224,7 +5739,7 @@ date-fns-tz@^1.3.8: resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-1.3.8.tgz#083e3a4e1f19b7857fa0c18deea6c2bc46ded7b9" integrity sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ== -date-fns@^2.29.3: +date-fns@^2.29.3, date-fns@^2.30.0: version "2.30.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== @@ -5238,7 +5753,7 @@ debug@2.6.9, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -5262,6 +5777,13 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -5284,6 +5806,11 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -5358,6 +5885,14 @@ diff-sequences@^27.5.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== +dir-compare@^3.0.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/dir-compare/-/dir-compare-3.3.0.tgz#2c749f973b5c4b5d087f11edaae730db31788416" + integrity sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg== + dependencies: + buffer-equal "^1.0.0" + minimatch "^3.0.4" + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -5370,6 +5905,34 @@ dlv@^1.1.3: resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== +dmg-builder@24.9.1: + version "24.9.1" + resolved "https://registry.npmmirror.com/dmg-builder/-/dmg-builder-24.9.1.tgz#04bf6c0dcd235f6214511f2358a78ed2b9379421" + integrity sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ== + dependencies: + app-builder-lib "24.9.1" + builder-util "24.8.1" + builder-util-runtime "9.2.3" + fs-extra "^10.1.0" + iconv-lite "^0.6.2" + js-yaml "^4.1.0" + 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#7b3bc3745d1b52be7506b4ee80cb61df6e4cd79a" + 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" + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -5497,23 +6060,68 @@ dotenv@^10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== -duplexer@^0.1.2: +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.npmmirror.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + +duplexer@^0.1.2, duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -ejs@^3.1.6: +ejs@^3.1.6, ejs@^3.1.8: version "3.1.9" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== dependencies: jake "^10.8.5" +electron-builder@^24.9.1: + version "24.9.1" + resolved "https://registry.npmmirror.com/electron-builder/-/electron-builder-24.9.1.tgz#4aee03947963b829a7f48a850fe02c219311ef63" + integrity sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg== + dependencies: + app-builder-lib "24.9.1" + builder-util "24.8.1" + builder-util-runtime "9.2.3" + chalk "^4.1.2" + dmg-builder "24.9.1" + fs-extra "^10.1.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.3.2" + simple-update-notifier "2.0.0" + yargs "^17.6.2" + +electron-log@^5.0.1: + version "5.0.2" + resolved "https://registry.npmmirror.com/electron-log/-/electron-log-5.0.2.tgz#6dae26cb7fce9feaa4605d575e02fee75da7b085" + integrity sha512-uzUXpUGZ5lJeCEIn4Hrxt6zQWiURu+EbFyTul0Y81huc6UrvWXIOMx4WxNdaGJYWPk9YLWrz2dQf3894MoZKXw== + +electron-publish@24.8.1: + version "24.8.1" + resolved "https://registry.npmmirror.com/electron-publish/-/electron-publish-24.8.1.tgz#4216740372bf4297a429543402a1a15ce8c3560b" + integrity sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "24.8.1" + builder-util-runtime "9.2.3" + chalk "^4.1.2" + fs-extra "^10.1.0" + lazy-val "^1.0.5" + mime "^2.5.2" + electron-to-chromium@^1.4.251: version "1.4.255" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.255.tgz#dc52d1095b876ed8acf25865db10265b02b1d6e1" @@ -5524,6 +6132,15 @@ electron-to-chromium@^1.4.477: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.518.tgz#067dd47e1ee6a3f573a2b00753ecf9a566db63ec" integrity sha512-eqbfyW9i/en/qgIPsddW+cuxQvjq3KZmfH+/gc3f/gnynYj0qxee0yRmll69W0SGwiVD+goeU1J9LT6zDHDzlg== +electron@26.0.0: + version "26.0.0" + resolved "https://registry.npmmirror.com/electron/-/electron-26.0.0.tgz#f054aad7db99379aba11237622e9742bbe800dea" + integrity sha512-x57bdCaDvgnlc41VOm/UWihJCCiI3OxJKiBgB/e5F7Zd6avo+61mO6IzQS7Bu/k/a1KPjou25EUORR6UPKznBQ== + dependencies: + "@electron/get" "^2.0.0" + "@types/node" "^18.11.18" + extract-zip "^2.0.1" + emittery@^0.10.2: version "0.10.2" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" @@ -5554,6 +6171,13 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enhanced-resolve@^5.15.0: version "5.15.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" @@ -5574,6 +6198,16 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.npmmirror.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -5717,6 +6351,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -6210,6 +6849,19 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +event-stream@=3.3.4: + version "3.3.4" + resolved "https://registry.npmmirror.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + integrity sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g== + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -6287,6 +6939,22 @@ express@^4.17.3: utils-merge "1.0.1" vary "~1.1.2" +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + 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#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -6345,6 +7013,13 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -6447,6 +7122,11 @@ follow-redirects@^1.0.0, follow-redirects@^1.14.7: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +follow-redirects@^1.15.0: + version "1.15.3" + resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -6454,6 +7134,14 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + fork-ts-checker-webpack-plugin@^6.5.0: version "6.5.3" resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" @@ -6482,6 +7170,15 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -6497,7 +7194,12 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-extra@^10.0.0: +from@~0: + version "0.1.7" + resolved "https://registry.npmmirror.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== + +fs-extra@^10.0.0, fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== @@ -6506,6 +7208,15 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -6516,6 +7227,13 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs-monkey@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" @@ -6600,6 +7318,13 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -6613,6 +7338,11 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +get-them-args@1.3.2: + version "1.3.2" + resolved "https://registry.npmmirror.com/get-them-args/-/get-them-args-1.3.2.tgz#74a20ba8a4abece5ae199ad03f2bcc68fdfc9ba5" + integrity sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -6656,6 +7386,17 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^10.3.10: + version "10.3.10" + resolved "https://registry.npmmirror.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -6668,6 +7409,18 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +global-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== + dependencies: + boolean "^3.0.1" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -6703,7 +7456,7 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" -globalthis@^1.0.3: +globalthis@^1.0.1, globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== @@ -6729,6 +7482,23 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +got@^11.8.5: + version "11.8.6" + resolved "https://registry.npmmirror.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -6824,11 +7594,28 @@ hoopy@^0.1.4: resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + hotkeys-js@^3.8.7: version "3.10.0" resolved "https://registry.yarnpkg.com/hotkeys-js/-/hotkeys-js-3.10.0.tgz#2bbd13de4aa002fa916c34e3859239924311e35a" integrity sha512-20xeVdOqcgTkMox0+BqFwADZP7+5dy/9CFPpAinSMh2d0s3b0Hs2V2D+lMh4Hphkf7VE9pwnOl58eP1te+REcg== +howler@^2.2.4: + version "2.2.4" + resolved "https://registry.npmmirror.com/howler/-/howler-2.2.4.tgz#bd3df4a4f68a0118a51e4bd84a2bfc2e93e6e5a1" + integrity sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w== + hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -6890,6 +7677,11 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" +http-cache-semantics@^4.0.0: + version "4.1.1" + resolved "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" @@ -6930,6 +7722,15 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-proxy-middleware@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" @@ -6950,7 +7751,15 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" -https-proxy-agent@^5.0.0: +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -6963,6 +7772,14 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.npmmirror.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" + integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ== + dependencies: + cli-truncate "^2.1.0" + node-addon-api "^1.6.3" + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -6970,7 +7787,7 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.3: +iconv-lite@^0.6.2, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -6994,7 +7811,7 @@ identity-obj-proxy@^3.0.0: dependencies: harmony-reflect "^1.4.6" -ieee754@^1.2.1: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -7151,6 +7968,13 @@ is-callable@^1.1.4, is-callable@^1.2.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.6.tgz#fd6170b0b8c7e2cc73de342ef8284a2202023c44" integrity sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q== +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + is-core-module@^2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" @@ -7358,6 +8182,16 @@ isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isbinaryfile@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-5.0.0.tgz#034b7e54989dab8986598cbcea41f66663c65234" + integrity sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -7426,6 +8260,15 @@ iterator.prototype@^1.1.0: has-symbols "^1.0.3" reflect.getprototypeof "^1.0.3" +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.npmmirror.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jake@^10.8.5: version "10.8.7" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" @@ -7948,6 +8791,17 @@ jiti@^1.18.2: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== +joi@^17.11.0: + version "17.11.0" + resolved "https://registry.npmmirror.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a" + integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -8011,6 +8865,16 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -8036,6 +8900,11 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -8060,6 +8929,13 @@ json5@^2.2.0, json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -8087,6 +8963,21 @@ keypair@^1.0.4: resolved "https://registry.yarnpkg.com/keypair/-/keypair-1.0.4.tgz#a749a45f388593f3950f18b3757d32a93bd8ce83" integrity sha512-zwhgOhhniaL7oxMgUMKKw5219PWWABMO+dgMnzJOQ2/5L3XJtTJGhW2PEXlxXj9zaccdReZJZ83+4NPhVfNVDg== +keyv@^4.0.0: + version "4.5.4" + resolved "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kill-port@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/kill-port/-/kill-port-2.0.1.tgz#e5e18e2706b13d54320938be42cb7d40609b15cf" + integrity sha512-e0SVOV5jFo0mx8r7bS29maVWp17qGqLBZ5ricNSajON6//kmb7qqqNnml4twNE8Dtj97UQD+gNFOaipS/q1zzQ== + dependencies: + get-them-args "1.3.2" + shell-exec "1.0.2" + kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -8127,6 +9018,11 @@ launch-editor@^2.6.0: picocolors "^1.0.0" shell-quote "^1.7.3" +lazy-val@^1.0.4, lazy-val@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" + integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -8182,6 +9078,16 @@ lit@^2.1.2: lit-element "^3.2.0" lit-html "^2.3.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" @@ -8272,7 +9178,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.11, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -8296,6 +9202,11 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -8310,6 +9221,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +"lru-cache@^9.1.1 || ^10.0.0": + version "10.1.0" + resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" + integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + lz-string@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" @@ -8336,6 +9252,18 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== + +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" + md5-typescript@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/md5-typescript/-/md5-typescript-1.0.5.tgz#68c0b24dff8e5d3162e498fa9893b63be72e038f" @@ -8368,6 +9296,11 @@ memfs@^3.1.2, memfs@^3.4.3: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -8413,11 +9346,26 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -8435,6 +9383,13 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== +minimatch@9.0.3, minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -8442,7 +9397,7 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: +minimatch@^5.0.1, minimatch@^5.1.1: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== @@ -8454,6 +9409,41 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.npmmirror.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -8528,6 +9518,11 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -8536,6 +9531,16 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +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#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + +node-cleanup@^2.1.2: + version "2.1.2" + resolved "https://registry.npmmirror.com/node-cleanup/-/node-cleanup-2.1.2.tgz#7ac19abd297e09a7f72a71545d951b517e4dde2c" + integrity sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw== + node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -8556,6 +9561,16 @@ node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -8571,6 +9586,21 @@ normalize-url@^6.0.1: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.npmmirror.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -8739,7 +9769,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -8803,6 +9833,11 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -8871,6 +9906,14 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -8914,6 +9957,11 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -8924,16 +9972,43 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.npmmirror.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== + dependencies: + through "~2.3" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -8954,11 +10029,21 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatc resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.npmmirror.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + pirates@^4.0.1: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" @@ -8983,6 +10068,15 @@ pkg-up@^3.1.0: dependencies: find-up "^3.0.0" +plist@^3.0.4, plist@^3.0.5: + version "3.1.0" + resolved "https://registry.npmmirror.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" + integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== + dependencies: + "@xmldom/xmldom" "^0.8.8" + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + postcss-attribute-case-insensitive@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" @@ -9615,11 +10709,19 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@^2.0.0: +progress@^2.0.0, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + promise@^8.1.0: version "8.2.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.2.0.tgz#a1f6280ab67457fbfc8aad2b198c9497e9e5c806" @@ -9652,11 +10754,31 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +ps-tree@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" + integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== + dependencies: + event-stream "=3.3.4" + psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -9698,6 +10820,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -9972,6 +11099,27 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +read-config-file@6.3.2: + version "6.3.2" + resolved "https://registry.npmmirror.com/read-config-file/-/read-config-file-6.3.2.tgz#556891aa6ffabced916ed57457cb192e61880411" + integrity sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q== + dependencies: + config-file-ts "^0.2.4" + dotenv "^9.0.2" + dotenv-expand "^5.1.0" + js-yaml "^4.1.0" + json5 "^2.2.0" + lazy-val "^1.0.4" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + readable-stream@^2.0.1: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -10169,6 +11317,11 @@ resize-observer-polyfill@^1.5.1: resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== +resolve-alpn@^1.0.0: + version "1.2.1" + resolved "https://registry.npmmirror.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -10216,6 +11369,15 @@ resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.10.0: + version "1.22.8" + resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" @@ -10234,6 +11396,18 @@ resolve@^2.0.0-next.3, resolve@^2.0.0-next.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" @@ -10251,6 +11425,18 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +roarr@^2.15.3: + version "2.15.4" + resolved "https://registry.npmmirror.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" + integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== + dependencies: + boolean "^3.0.1" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + rollup-plugin-terser@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" @@ -10275,6 +11461,13 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + safe-array-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" @@ -10309,6 +11502,13 @@ safe-regex-test@^1.0.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.npmmirror.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + sanitize.css@*: version "13.0.0" resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-13.0.0.tgz#2675553974b27964c75562ade3bd85d79879f173" @@ -10322,6 +11522,11 @@ sass-loader@^12.3.0: klona "^2.0.4" neo-async "^2.6.2" +sax@^1.2.4: + version "1.3.0" + resolved "https://registry.npmmirror.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -10407,6 +11612,16 @@ selfsigned@^2.1.1: dependencies: node-forge "^1" +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== + +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.7.2" + resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -10417,7 +11632,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^6.3.1: +semver@^6.2.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -10429,9 +11644,9 @@ semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7: dependencies: lru-cache "^6.0.0" -semver@^7.3.8: +semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + resolved "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -10455,6 +11670,13 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -10502,6 +11724,13 @@ setprototypeof@1.2.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -10509,12 +11738,22 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.7.3: +shell-exec@1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/shell-exec/-/shell-exec-1.0.2.tgz#2e9361b0fde1d73f476c4b6671fa17785f696756" + integrity sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg== + +shell-quote@^1.6.1, shell-quote@^1.7.3, shell-quote@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== @@ -10533,6 +11772,18 @@ signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simple-update-notifier@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + sirv@^1.0.7: version "1.0.19" resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" @@ -10557,6 +11808,15 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -10566,6 +11826,11 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +smart-buffer@^4.0.2: + version "4.2.0" + resolved "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -10605,7 +11870,7 @@ source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.6, source-map-support@~0.5.20: +source-map-support@^0.5.19, source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -10645,6 +11910,37 @@ sourcemap-codec@^1.4.8: resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +spawn-command@0.0.2: + version "0.0.2" + resolved "https://registry.npmmirror.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" + integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.16" + resolved "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== + spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -10668,6 +11964,18 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" +split@0.3: + version "0.3.3" + resolved "https://registry.npmmirror.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA== + dependencies: + through "2" + +sprintf-js@^1.1.2: + version "1.1.3" + resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -10690,6 +11998,11 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -10700,6 +12013,18 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.npmmirror.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== + dependencies: + duplexer "~0.1.1" + +string-argv@^0.3.1: + version "0.3.2" + resolved "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -10721,6 +12046,15 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -10730,6 +12064,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" @@ -10758,6 +12101,15 @@ string.prototype.matchall@^4.0.8: regexp.prototype.flags "^1.5.0" side-channel "^1.0.4" +string.prototype.padend@^3.0.0: + version "3.1.5" + resolved "https://registry.npmmirror.com/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz#311ef3a4e3c557dd999cdf88fbdde223f2ac0f95" + integrity sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + string.prototype.trim@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" @@ -10826,6 +12178,13 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -10911,6 +12270,13 @@ sucrase@^3.32.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" +sumchecker@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" + integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== + dependencies: + debug "^4.1.0" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -10925,7 +12291,7 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: +supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -11036,11 +12402,31 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar@^6.1.12: + version "6.2.0" + resolved "https://registry.npmmirror.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + temp-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== +temp-file@^3.4.0: + version "3.4.0" + resolved "https://registry.npmmirror.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" + integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== + dependencies: + async-exit-hook "^2.0.1" + fs-extra "^10.0.0" + tempy@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.6.0.tgz#65e2c35abc06f1124a97f387b08303442bde59f3" @@ -11113,11 +12499,30 @@ throat@^6.0.1: resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== +through@2, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.npmmirror.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.npmmirror.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -11169,16 +12574,43 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ== + dependencies: + utf8-byte-length "^1.0.1" + tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +tsc-watch@^6.0.4: + version "6.0.4" + resolved "https://registry.npmmirror.com/tsc-watch/-/tsc-watch-6.0.4.tgz#af15229f03cd53086771a97b10653db063bc6c59" + integrity sha512-cHvbvhjO86w2aGlaHgSCeQRl+Aqw6X6XN4sQMPZKF88GoP30O+oTuh5lRIJr5pgFWrRpF1AgXnJJ2DoFEIPHyg== + dependencies: + cross-spawn "^7.0.3" + node-cleanup "^2.1.2" + ps-tree "^1.2.0" + string-argv "^0.3.1" + tsconfig-paths@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -11204,7 +12636,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0: +tslib@^2.0.0, tslib@^2.1.0: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -11330,6 +12762,11 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + type-fest@^0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" @@ -11399,10 +12836,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@~3.7.2: - version "3.7.7" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.7.tgz#c931733e2ec10dda56b855b379cc488a72a81199" - integrity sha512-MmQdgo/XenfZPvVLtKZOq9jQQvzaUAUpcKW8Z43x9B2fOm4S5g//tPtMweZUIP+SoBqrVPEIm+dJeQ9dfO0QdA== +typescript@^5.3.3: + version "5.3.3" + resolved "https://registry.npmmirror.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== unbox-primitive@^1.0.2: version "1.0.2" @@ -11414,6 +12851,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -11449,6 +12891,11 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" @@ -11510,6 +12957,11 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.npmmirror.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -11559,11 +13011,28 @@ v8-to-istanbul@^8.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 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#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -11583,6 +13052,17 @@ wait-for-expect@^3.0.2: resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-3.0.2.tgz#d2f14b2f7b778c9b82144109c8fa89ceaadaa463" integrity sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag== +wait-on@^7.2.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/wait-on/-/wait-on-7.2.0.tgz#d76b20ed3fc1e2bebc051fae5c1ff93be7892928" + integrity sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ== + dependencies: + axios "^1.6.1" + joi "^17.11.0" + lodash "^4.17.21" + minimist "^1.2.8" + rxjs "^7.8.1" + walker@^1.0.7: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -11845,7 +13325,7 @@ which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.0" -which@^1.3.1: +which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -12033,6 +13513,15 @@ workbox-window@6.6.1: "@types/trusted-types" "^2.0.2" workbox-core "6.6.1" +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -12042,6 +13531,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -12085,6 +13583,11 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" @@ -12120,6 +13623,11 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -12133,6 +13641,27 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.6.2, yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 65afe3e2690dbf87e89d0d709be3c0fd83be93b2 Mon Sep 17 00:00:00 2001 From: wanglihui <1769794040@qq.com> Date: Sat, 9 Mar 2024 17:30:00 +0800 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Eelectron=E6=89=93?= =?UTF-8?q?=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- apps/web/electron-builder.js | 23 +- apps/web/package.json | 33 +- apps/web/resources/icons/128x128.png | Bin 0 -> 9014 bytes apps/web/resources/icons/128x128@2x.png | Bin 0 -> 21645 bytes apps/web/resources/icons/32x32.png | Bin 0 -> 1340 bytes apps/web/resources/icons/icon.ico | Bin 0 -> 32044 bytes apps/web/resources/logo.png | Bin 0 -> 1340 bytes apps/web/resources/tray/128x128.png | Bin 0 -> 9014 bytes apps/web/resources/tray/30x30.png | Bin 0 -> 1232 bytes apps/web/resources/tray/32x32.png | Bin 0 -> 1340 bytes apps/web/src-election/electron-env.d.ts | 1 + apps/web/src-election/main/confing.ts | 6 + apps/web/src-election/main/index.ts | 444 ++++++++++++++++++++- apps/web/src-election/main/logo.ts | 16 + apps/web/src-election/preload/index.ts | 20 +- package.json | 6 +- packages/eslint-config-custom/index.js | 3 +- packages/eslint-config-custom/package.json | 3 + packages/tsdaodaobase/package.json | 6 +- turbo.json | 3 + yarn.lock | 111 +++++- 22 files changed, 621 insertions(+), 56 deletions(-) create mode 100644 apps/web/resources/icons/128x128.png create mode 100644 apps/web/resources/icons/128x128@2x.png create mode 100644 apps/web/resources/icons/32x32.png create mode 100644 apps/web/resources/icons/icon.ico create mode 100644 apps/web/resources/logo.png create mode 100644 apps/web/resources/tray/128x128.png create mode 100644 apps/web/resources/tray/30x30.png create mode 100644 apps/web/resources/tray/32x32.png create mode 100644 apps/web/src-election/main/confing.ts create mode 100644 apps/web/src-election/main/logo.ts diff --git a/.gitignore b/.gitignore index a29114b..3777213 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,6 @@ lib/ out/ build out-election/ -output/ +dist-ele/ icon.icns icons.iconset \ No newline at end of file diff --git a/apps/web/electron-builder.js b/apps/web/electron-builder.js index ed18c28..e207824 100644 --- a/apps/web/electron-builder.js +++ b/apps/web/electron-builder.js @@ -1,9 +1,9 @@ module.exports = { - productName: "唐僧叨叨", //项目名 + productName: "tangsengdaodao", //项目名 appId: "com.tsdaodao.im", copyright: "Copyright © tsdaodao", //版权 directories: { - output: "output/app", // 输出文件夹 + output: "dist-ele", // 输出文件夹 }, npmRebuild: false, asar: false, @@ -11,17 +11,19 @@ module.exports = { electronDownload: { mirror: "https://registry.npmmirror.com/-/binary/electron/", }, - files: ["out-election/**/*", "build/**/*"], // 需要打包的文件 + files: ["resources/**/*","out-election/**/*", "build/**/*"], // 需要打包的文件 extraMetadata: { main: "out-election/main/index.js", }, mac: { - category: "public.app-category.utilities", - icon: "public/icon.icns", + category: "public.app-category.instant-messaging", + artifactName: "${productName}-${version}-${arch}.${ext}", + icon: "resources/icons/icon.icns", + target: ["dmg", "zip"] }, dmg: { // background: 'build/appdmg.png', // dmg安装窗口背景图 - icon: "public/icon.icns", // 客户端图标 + icon: "resources/icons/icon.icns", // 客户端图标 iconSize: 100, // 安装图标大小 // 安装窗口中包含的项目和配置 contents: [ @@ -31,8 +33,10 @@ module.exports = { window: { width: 500, height: 500 }, // 安装窗口大小 }, win: { - icon: "public/icon.icns", + icon: "resources/icons/icon.ico", + verifyUpdateCodeSignature: false, target: ["nsis", "zip"], + artifactName: "${productName}-Setup-${version}.${ext}" }, nsis: { oneClick: false, // 是否一键安装 @@ -43,10 +47,9 @@ module.exports = { // installerHeaderIcon: "./build/icon.ico", // 安装时头部图标 createDesktopShortcut: true, // 创建桌面图标 createStartMenuShortcut: true, // 创建开始菜单图标 - shortcutName: "唐僧叨叨", // 图标名称 }, linux: { target: ["AppImage", "deb"], - icon: "public/icon.icns", + icon: "resources/icons/icon.icns", }, -}; +}; \ No newline at end of file diff --git a/apps/web/package.json b/apps/web/package.json index 96f4cf1..ebaa7a1 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -3,6 +3,22 @@ "version": "1.0.0", "private": true, "main": "out-election/main/index.js", + "scripts": { + "start": "cross-env BROWSER=none REACT_APP_VERSION=$npm_package_version react-app-rewired start", + "dev": "cross-env MODE=dev BROWSER=none REACT_APP_VERSION=$npm_package_version react-app-rewired start", + "dev-ele": "kill-port 3000 && concurrently -k -n=web,ele -c=green,blue \"yarn dev\" \"wait-on tcp:3000 && npm-run-all watch\"", + "watch": "tsc-watch -p tsconfig.e.json --onSuccess \"npm-run-all start:electron\"", + "start:electron": "cross-env NODE_ENV=development electron .", + "build": "cross-env REACT_APP_VERSION=$npm_package_version react-app-rewired build", + "build:analyzer": "cross-env ANALYZER=true REACT_APP_VERSION=$npm_package_version react-app-rewired build", + "build-ele:mac": "tsc -p tsconfig.e.json && electron-builder --mac -c", + "build-ele:win": "tsc -p tsconfig.e.json && electron-builder --win -c", + "build-ele": "tsc -p tsconfig.e.json && electron-builder -mw -c", + "test": "react-app-rewired test", + "eject": "react-app-rewired eject", + "clean": "rimraf node_modules out-election build dist-ele .turbo", + "tauri": "tauri" + }, "dependencies": { "@tauri-apps/api": "^1.1.0", "@tsdaodao/base": "*", @@ -13,6 +29,8 @@ "@types/react-mentions": "^4.1.5", "@types/react-virtualized": "^9.21.22", "classnames": "^2.3.1", + "electron-log": "^5.1.1", + "electron-screenshots": "^0.5.26", "howler": "^2.2.4", "react": "^17.0.2", "react-app-rewired": "^2.1.8", @@ -49,21 +67,6 @@ "wait-on": "^7.2.0", "webpack-bundle-analyzer": "^4.5.0" }, - "scripts": { - "start": "cross-env BROWSER=none REACT_APP_VERSION=$npm_package_version react-app-rewired start", - "dev": "cross-env MODE=dev BROWSER=none REACT_APP_VERSION=$npm_package_version react-app-rewired start", - "dev-ele": "kill-port 3000 && concurrently -k -n=web,ele -c=green,blue \"yarn dev\" \"wait-on tcp:3000 && npm-run-all watch\"", - "watch": "tsc-watch -p tsconfig.e.json --onSuccess \"npm-run-all start:electron\"", - "start:electron": "cross-env NODE_ENV=development electron .", - "build": "cross-env REACT_APP_VERSION=$npm_package_version react-app-rewired build", - "build:analyzer": "cross-env ANALYZER=true REACT_APP_VERSION=$npm_package_version react-app-rewired build", - "build-ele:mac": "tsc -p tsconfig.e.json && electron-builder --mac -c", - "build-ele:win": "tsc -p tsconfig.e.json && electron-builder --win -c", - "build-ele": "tsc -p tsconfig.e.json && electron-builder -mw -c", - "test": "react-app-rewired test", - "eject": "react-app-rewired eject", - "tauri": "tauri" - }, "eslintConfig": { "extends": "react-app" }, diff --git a/apps/web/resources/icons/128x128.png b/apps/web/resources/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..989b4bd2224125479d86d6faab0f17bbe664a7ed GIT binary patch literal 9014 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 literal 0 HcmV?d00001 diff --git a/apps/web/resources/icons/128x128@2x.png b/apps/web/resources/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2d50741cf6103b35aea09b53690c0b14191b7300 GIT binary patch literal 21645 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 literal 0 HcmV?d00001 diff --git a/apps/web/resources/icons/32x32.png b/apps/web/resources/icons/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..341c57d3004d988d474a99803311441f17cafb22 GIT binary patch literal 1340 zcmV-C1;hG@P){fXtE!5GfLY10+Pkk02o-<~I;P00Bq@ zNPrL-0U`loA;27m@AlQ*!Lh!+8k*GFgMUwWNs zt<(4A>wL{*pPisl5H&5kh4&pZ3!#zaxe^dIdZjzkciTOI$Lk(n(Mp~%*=m5RESBHC z>2D94QJ~;02bOvzYO;8qL3(&W+c@v3joY<0}X6p8d z2r}|uOXRx9=4Un@)R-<@LNjn7wk}Drx>{L&30|Loue}I9{0}(ZfY!pcmYw0g@w#lf z`y?kXThPLum55%YP#ST_*vQw$2PzP-@?*UO&YlNex&gZI6nOs;;M*^O|Nj);M)ROf zQdb~1m5q^ybbm-{38{$|u2@&}&gu4-Z-TDA0PM^`&s_&@z9SGyIP6*l`C>({gYe|N z_rq241hm$w&qSD9dKs2@;g0UYe*YD)JQjs2)CvOb&TnG1#LwG4++knf%fj8r@~+aO zVH&9dQLtWtPwoM`XMn|tC>7Yx>?aR0)I7{~N~L(})i31{14#aax_=h<>yF+xYq85{ z92du$CnVu8Rl_o;7?5)e{eDpy5EAen%(;u$NUV=;y^e=J{v3->KLLLD8oQUS0CQ2? z>;NGgtA!$#6$AsqeXF1_E+;2tIwu31A6UwluYrI5343pU5R-8J${X+(FTs8H1?WU7 zM5@9(c@g;KN6_xRCK*?)m#bpnqCaEJZGIfEPc+kZ$8H~>BKtTdk^ zNxp~Vu$jeYy7D}l>o;H|L20>+T|1O5)?U{t-IwV(|F)_8q?2;cm35lXh=Ks$!9(o~ z{`X(O-+U%LN8&x33nQg&N#K745iuyN{z0~NDS2FnfMTl-eGC>`)QNAsR%VLiq{Z^? zZEXHIls(iXnHC7#iRb`~1UL?tvS2{&a9RAneWVt(*AW_yoG$qQt> zJ*8lzADDnh>~0esx0xtKPG0-8M$3@Z;YJiS^JaRuh{@!J2Bed*XB?G@Slp)!hy>SX z+Frg;Qu9!i3+0~D09)umF2nLNg#xNP$;-r@Lj!!8SDIpf3D8W(jjjAa4g{j1ZW1!o z^@x%udcx{W>2(O9*KCKcLKknO6H$M z9|_G!XuC2DmbV4`hDMtV?~u+CE$i97O)A#!2%kK5)dA%S!?-peY@7w*MrL>4&vY)4 zU>(iY+<9IiEe_Bo9Z30d2^mgCav#+;GP52o6wdL5pPuPvls+>2u>Kp;MiXQh@V7^S}d$u7MOhccrY~beaAYIFGtERK;C9#(rK8L#1b_6-2v`Go4TPUA*aKB yQ@~UkuuD4qSRQ&mO9RV#q0000%}3s1qkktAi*6j?(S|uf=h6BcMk-&V8LA`@4eqyGyT=O z`>gZRRke5TE&u=sfCEra0R9aM01yrUu>3c}!1y1g1_1z8|JDcy{)gwl06-)H0Km@v zKTL=W0O+Ft01(LkFcT&K;EMmB`F{olAVw1a$YTHiB2<-SQIUv{{w<=)%SoyKck|x| z2><>KaQ5=L0RUh}hhI~K-2oa;O2*Qm)1rv;sD3mvScl8+E>E1M*=CI*mdAK|^ zb-w0pGY0=RRgN38laWO6v){onOp`t5JX<;Q(?CpI9VSsoo|%(7M-H)6?@UmMDs0^! zv0jyD7}#l`s&vp~IwM>zbx(3#MJo`twqBY$x>N)vza{`xcb|@-GC$y}lt>X)G4t#S z>~K`ihm?gfBSnf(+%VXD6(=6$RJ)+I*ezca#X04&5P9}e1BRqR8_XfqkR-(42TnGn zvp3<*s#+_*(lI_*q+Uh~S_?*V{)%wg4`FbBi)ra5pG0WJOt|tzN*Rh@4@oag^pelw z@ctg^#H@$6zzOeXfTWp-D{lr@WHRuh0h7%z>R>%dtw~wd=URHe-+ycTPVqwi5NU|6 zI!CWwD_@0NV6VVZVXg989ANaLY?AJS!g5jTi_gFiMW$7ajJ|&sUOlNG*bvt}n&6_&sb<%}iHkfE4wq23vFrxOrI2{d0 ze~{~m=0IMvrH{Xq0gmNDwLt)%t?aR!&UV%}ePDXx%WRlzB@Wchh3yyDp;=yMm-lX? z$3xMy>3vchb=NzSvVIE=hw;vaOz>J=vqHEu;K~vx9EQ!G-rs+ylj>$ZW1)v1(52sj zwO>kZc3pLUje%z9CsK0AHn6ugU9?I#moh&q>L|K%NM0z=yW}wvt`ILo@64j5xf;;` zFqc9~R}}z9=zaTjTNr(Bx;yD!*y>wp@uNf`o!)EHtRk&u_E7BAO zwxJU**Uc5svUXFSMr}MGOfSmmjEgT#WcKj7c0Y%nS?BtNjvumy{VfRh6Wc$SbDnMY z`tTXenv3K!o8HiLc;y@!4Y|ZvqM5Sy!6Ds;DXl~Ebqmlb;;(s^*YvkLh2$Es{V9{~ zXE4c+73I3hD|FHV3PwGn-W@DAh;C9xpWSx(9T{>~3Hd@YaSdw=?$jQCXtTr6+opRs zWf>Xg*0+lhH6{r?X`Dzp_D$!a0TqAs+*BKg>56;k^lea3+mnWaHqH|%{ zi@x?AJXm~y#hI$gBeqEz>0AfK>3<(V%Sv0c@Lr|sU~(}QsuR-6<0HCODA)yK=8y7 zfp4O6nL7Of;_%pcao7)KkY4>`UE!oXYu{A$>aYIgnK7Ykl+gW(zN9h|jnyrSK=^k| z`2hOuu^0bfPyIR@6U3+=&ow9&>A1!eX;Q1!k8boqXjrCB3EAD2exa8~g(|^GdNeyg)mDV}{bm49iKG+6f;rDo2Yb$T|swQhuo$6fkIjHw0~y$zEFev9iKC#>8TkK1=rw28^2?5PPf z$|qsfrfE};)U5{?HzQqitQ{bMrPYKPFkInVwzPQQt;Gb%J9v+kc2oK#JK$ew2gpk+ zOI1r42mW6O;6D_D@m~TUzkW9X0D#B;BLJmDk=O+YMu^c`ZiscU0ZnQ&Efgjmfgd1C zNlPuE4@~$*0a8bh!vKO1gJ>PU{kz8Bj<$)ZC}6`E<(>whN1(Z|Y{N9HFHDGlo#i-!37I8lL8q;_h@PY4NHIu#I{nV+(tT?yq6)*@!Bkvg6pLrx5 zvCY$JhV7^?o~+!WUhk9cnbmob5hOq;Z^`d(UXdEiUPWftT4{m4!Tzw@f{L1I@%?{7 z6b$F7vHfi6V8IDS2S2S^FJhYJo~m|awrpeQWCTa)XoZj*7R)qT*28F zv)crfk@hqFxiBS*Y~S_=O7Ir(G7-Teu3-;Z1lH_#Fbpee4FqwqW-k|p1A`U=`>81j zKgFAn|JZa%d)Y}<59x3{C9}%VedCyOZHQ>Owohj3j%|6g9PlQWdU?_q*oEg7V@Ckq zKIqe$!QI?W@14jHt!ULp-yECyJK~*v!7Z+BP0HdB_JUwASIKH8SSeu+p_Ji#**7@1 zi(kV8*O{TbzY!YDOIM;7{e;O8iD;?oQ*!)U+()(1kEP1yCM$eS$EJHJAy9aC=5BgD z9>=lqF7&kN7wfdky%W6qxk^BN%2n1D_qsecMDPc_4W}`D>$Zf7!=Oi?@LL`&R0C7sBZ%H=wIzDf2aU_5yFGF|%IfBe&YAcUqyD+q;?VKK z5ziooN~IH>&bmP9cfU)VZQGSMli^*@{qaE|pl&AbuUkYRnjn)olrvh{n4haY`GvF64;3wTI@YV&el2$+r?XYzt2 zq90>c&;kF`%skL5%A`=0gNNN0uR?U2V+2{hX28VVaS$z7*#xVLaA1mJn>J6NWPFkT zmdf5sk@hT{P>3#_E1gbp&dB$Rvs2?rS#||8e2Ic(ZXR-Dk7C)rus?CTX+TDk(pL_5 zd(^Rgd|V9|weY!FDo+7~GVeuw9%d)0ZwwROIYoq5WPrw`uP`^zVCTgG^89R!`bJd9J*3c2X5uhinO3AWssgh?5> ze!soPH~(t-rX6RtH4DA}m_PJ6yv_NmyC|Y{-A|u&)W38fY-%X(3S*1&WVf}v#V$1H z&=)sKwPRiX%K<^6@F2{WL|J=C$xM8Q(o$6^zXUe`QGX*bFQ~YLD=40%r7v&=Q?Y2) z1OQ+ABRAibH1|N;1@D}RUtPON-4Lvg)u!gHNsHzQy~M5UFC>rcDEysHh||3nFBd8z zP^+^yw8MuNZqMgJACE>#xtpn)TU4pWZQDKPfWFJD3StiJrkFwV#IWW%YZT0+)|_GBCHmn#v;j%29fY=Hd;X{c)!zQyN2NrJIc@==eo#jVuC zB!1|z>qeUfjpdh!MjmWUh7XJ4PoAfQ^Pv&QkuHjwtF_R!I(3q8e;%uX6F_uwHTyp4 zHDT5ThC>^SZmP>-*k6_HN18zVrW)-cFJZ}9Be!nK8)x~PTXz0#JYe(|{;2h-L1AD+ z8O5p--4!n-C#k{NAZo{qJa`Zji7g0~E)~acTu5{x7!9C`e8 zGuq=GeB?%bzTW46H`yQ-b)4rP$3G1?GnPS_W;mh}N{c=6P1(d~VWU4vZvnYXF5vR_ z^_!X?!Y84+I5$nXQ1ARoqb7U#Rv~J7Vry?^dE#?RjL9Z~KN-~>e%uFpwFO!E$S*gI zYcFpV;741trpk(jX?2czpK3S=RT-<4=uc!rvzIpD>L;t-rB032WlxA5xz>K`sfHMS zn<272*l9%$CQhvTRXlHu;=0G{zTfc?bx)oce1yhfZfe8GWdOs9cE5A+r+d% zzmaEc&t}-_k3JQ({e3H|ULS5UwQ%F*Fm@M;?XCI|qqPsuS+O6ojZyIihn-ox%rweS4xun->M|=QsQ|9U8p~T{Y*4 zCJh2l@^R`5BFkmC;=T9vJ|N*(@3dtb`U~IrJ|y7uqDn#}X> zug(|@eBB^nKS`@rJr$o|d3z;~IoSR>yZ%gO=ypgYdV%ma&KFCyfLUXt!)aO^Zy~`c zZ{b!xr!`UXSnzWl2<3X}EW83;ZDBE8?74I0aY=*Yb>Ofr;8EDE`*kj|+182WNN40btX^D$x>CHaO(ZTYOTlm9f!vv(a?h(M zpAVFt_3{&$Qi>Hir@y0*XQu}$1tLem=(4`A3O?^0v1(i6lv6cx3TbASFI*h{PqHH& zTXcs-8-nZk#Rb;*V*BOig=Mn1rvll>Bhw{M2k!U5v<1iL zR|2C^zBfu2$hJF$;gMr0wTn$N9{PMR(MzLS1+^HlPtaGrts*1Yc^Bh&PoZ>fD**K- zPn6yS6<<7`vSPZO&acoOL$SL*IxlDLYIcrb4v4`%jje8lb;8+8!U3%&uJIQ{c-Gb% z_x*)l&e+T~2TD30MAE_RimR96GG4b8K|TUN9=0F8Qu=EB2N-xEG(v&9&=>9hn_Nyl$kKVK><6i`TCd%xQ zFJt$2y^h@P?SxT;%zcfEbb&CBBu4`Q1|GzGv(mOt#?Y8PRmL*}r*+u?Px+@5KW_qm z?4+3!2Tlu_X`|>r!OV$$oFu;FxNAR5F?g8!+*H@#?a zp#vKD2`(6B<2Z0OLhznC`4bLKmj1iMQ#7XaN($cj6iZw1nZyCc*!t4wZ3@iUA~VI_ z)B?uwGdty=9G)eYulkX(9+u0Wzv!z!*>_SIIF4IluA4PCil3}Lgury|GE<-|eCLW? z&C;Kvn-y=OJ$q8vn8hnm#tK2UfFGkhWIN1I_>JJf*W_%g{7UO9w|LQim+S$VY3Cl70mM3NL55)LD;l%hKY z%xf%PU1Q~uq;IthxoTx9eQfYZYJCQfoIQ#vtBE+$p5-z)IeO$zLv@17u$HN4k#mAN z1edGZ1ph2JaeM!hPdz?MCZf5NC60PEXb-u7ig@|ZC)b(H!cXEFSYkIJwB!=L0j`x0 z@9+<*fCHs8o-X+kz8y)5p(c#C|K4E!Z%aJ&+G)>FYJ%`Uo=KIiB!eQ^0ncoPc28j^ z%uSTKo*f>bfc0Ic&*vNs{tGGdOf@tj1lIm4j2>A{n#)dD{`{|BI}~RTZK{j(bv^=& zQTBNUUIlCLP%jtX+%>j|Vt}M|c^^%k)}L?`sFQZ218PV=Xbx03?k#S4F`A*~To<%T7_1@D*`>{k;Z)p7cFBwy(oIKeR2!7{OYtH!x;s zU?l2=U(nVzf@c^kC<4cW96x-E_>gn4N#9V|#!=?}^~!(JQ4Ty?t7aUFN|KEMUyGLh zj@~YDc4+)~{LkV3e+pyBzir5Wg>ku!9%|*$5o@+On zj-%JSa8wEl6+1jYo@y^P(l|ICgA$PvVJFB_E>~g$3jygLVgqsj5l1CE@&gM|j-YAq zuBvLX(xd~eH;V4suC9x%w*K9XY`NtdR(ZZ-{{AOEn{Qo>OU+A9)!y3p`$C&)GWcUu zW1YG<4UPka;S_eknRMd}!{ZFfB_lcM!qu^+9Rxa!F>=-Q{IdJS+t-soXb#5`L4fzmIB5D#{O=C$gZ-U)m#ezrq|-BstWcU zjs5U|nfW7?d$M4ii0iIewv(irTpIm$Ny^Huo$eL= zHkoBzU}uFd<3#d-&; z2|-zNued5d>4B)R-k!@)AG{wHTqN7$kMOiks>pF|(?{eusZ)cQ@edYL+)wbQx$b2oSAYraOm2oS@EP0Q_Rh%KH7v(h-5zL-7Zf;A0Xa?pNE=R;F)x?*x~7X)C90))s=uWf+%cZ(Y!IDMrb)us5{_tbV!J); zwQf)u=-p>H_m^)JQ*6aoO#!Z0QU{BismI3XF6x0V#||==^8MimdT~-~O$FjEJJAP@ ztc-L8(q6e*B5Qc(jPbV_L^|!=6;1a7%z33byM^ zlj(846AeB}ybsCzfrx(ff`zt!H#9aWRa)bO38QQdp+2iA|+0B*;JJ`O6 zbX+7*?wqn!D%fjT?GD}%>nE{^Ml%m1o9;Q?9e{urXn4T2{QJ=C%G)0^YAww1=G=X# z_(WxR>SPn^awpA6+>6)#{drT?=lQGSg_S?{b!j)TWL)im302K zh$t3-;0faF=|V6_yn#1P-%T>E;?M2&{^FpEV}l$ThM_uYWE z^@Fia3cVU$Q^b?n$sc!rxr^X({ho?dh0A)Jcv@<^%edz>`dsgOE)jqF=B-=V z9wcFrRWmPVS09&TOv2Aqo|VuU@%frGq+BX#nSd5NW{PgbChnucXF5oFgb*wF>jBE{ zf9lK8c1Pi}e!jk_foW%8PQj10yY(^JZ})Z`RoTNKb0D0$VP&=7(qoUyh&IOtQHcLd zAC7wmW}q?x`v^@7rr5X-H;ms8#>C;Orv`mrG+0cWOc>rhVIgR0FNr~A44e&wB^NIK}R0vSt=qdOVzQx)nHw-hM8f|83MbcHka>#E1aC%|PZ7oJOZDrRR9N z3@dE;JA4%WXVMxC6t#XIm>5%=ZgfaDnk^#D0fc-#K7>C8-3nS@NL^J+%Ib~HrEm?c znuaARjQq`v&$|B38U9iHlBLXeFT3fw#*Y>6{bDKH``lu=>8BEsdthuY0L5l~xRhNvJ3J zaBfdm4g zZU!9U`k8keKcqg<+G$p+sT*#I$AzrIRjD7PboSPZh2QJ02`(hO+3t~FTD zt$#56p2R=2=D4^QH{HjnNvP86j{D~I zm{Ez`sNP=-n4V0smDBT5kT}Qe$f7ROB4bX-M=|qwb-WFi_=eVt<0{sAZbcpY-XNy~ z)b&v=hGcBJZI=2>a&__Ap!+5oklJ}+kYKl@dCom@`O+rX+Ll80El<42rqg9e*Xaai z!bkFlp~Q%kE+^WogjqvU_%&w%RSH@joezA_#ivBZ zYP;leK@$ik!Jd%M(eGtaT)r6~WzcNkRRuC;(ud^|Bu$pf6^V>%>tEW=uJLe^oo>n> zf5CXt_`B$E`|;#6K0tSRE)N|)pAGOtHPBL5?sEPq)94lsd9{?DQ@0B z*){SM&($+YK^oeP%btd!+%#(qVFgKP#61FvKKHaWlGt7ecxw!apY+n$@8W_!@IXF= zIdeIF(h+aNP)FM*qOoHyhpp5bH*wy86+S27Rwt+PRE`onkz%6mX5dE3(l?ci{zBQ! zPR;}$$4m!r2c3BGhCAHub50cz7<^pKt zCs5l-H~`conZP(nQfVl!OJa7ZGk*}tWvuoDn7Gv^$kpkchGs@kCM@PhP$8_1>t8(x z03g7%C&TID%1A}DX`&2&RY$fC-Q(#&_RPh#>as<8heKJzcAa6one%}_prHNCiua4R zVVBmEt#8n0=`6kxE5Dz5mEo0OU|H(~jY+P9AH#0UkL<)GteYvlRNw)`4W{AcycO$Mkn)h6W_knRt}-h;9xb#Smjs#g+LQBwraw9T*CV|h||rhCvRXuNp)Vee5ufe>sxFKe=pdspd40w z@-Xyt7&Q9suiCPV@J#(sJRUa59pLX-$}Tr{Da>g91hb`}T4StSvTyRsMQkN+?t zb>T&D(LHaljdk2G{$7up?QLr^qb~%PWhywTS3UT`K{18%kZthm@bj=%uvCr>G=?>V zyA5sQ6QsIh%sW+?;Icr_coKCwaK4+>9;T!%`ER}MBiye#A{!c z8X418zxW`AZq}tbmmp z|EDPc_|GT-0{-ii=sT7DYgW|M{GU^D*6A5~L(xQ!zPcnOKK^s5*9h-{Fs7)?!SpNEV}_-)GT^Ae41X!5vOX{xF)TP*)`vd#Y~E z=tMKlE$;{~51;{JFxPdsZcMmrdSB%@h-|w5J^PdK=e%9fzijBt&T!K~;P7QC_D1aO z5auhHi#<6-4ZxCc>zp^*lp@2^;)?(}Qco84?FN6zkaHoaP_r*jb0_BHS#sWAiQng$ z+VHo15W`IAv4tX{UYqis3F-!C38J^`%!AZ8Tl)&(P2Klt_oa~U12&d;k;Rs3nTJ8- z2>cD>KM2>t!-MZje>xKrJL|ofW;pkJO ziJqJ0JsB)9+e&b-NdATUFURGfR{CN7y`9z}@!8`i5G&g*`m;;-o+h;Mo&O6C1dA?( z|C=c#7d&!`r@cq~z58`s|IgQTCZT3jZ0n9sslYuP%@R>0@R0;8fLYqovl1@4w_H=) z*xYPBrKmN9m}je&x_VKZyWH5Y>i0s^5rz!pXQhdf_Ao6n=ND)_Yt8L_njg>C5n>f= z1qz~7^HiNDpG{;^o1S_*`>X_(6lq0cVTNe9)$>J3R@Gqd&s=X?3Pp`BJ^UHjL_J|W zQ#PTm-G8OwrtOw^nJQ8|Ck#I$NZ*;#^mvt$X>Qk#rct?Kg5m7CD;%_iXbXE|y^+z!1Kmf@wFe zNpBcis%(&PC-9X>`fwtP;$e!5D25371k3#@oc^^NMr{X z((7bUlMqv|iRF0E;HRq)$5T2dzW;^98Oy4Tw>gG1-&amWdxLFSUJL^;^kz{6hw=(Z zKy->^=>g|p7o+pU{ZMk7EtS*kv=Lf9B6ArS&bBB@^`?&AJn4UGy&ZjW(m(^=Sd5(Z z*wVN`7eMQ20<)C&9|*Yw6W9>bZ4?bs4nvW??#?7+@BA(FkIQ_2rQT#)x;{2|L!f5m ztowLG2ncO}y=o7e@WwrvJgR{j!yn0SD2QnSngy;S8BnyGQVH|}PSTTT@a`o(s#TeW zFk^Fa9%BuVA{b$Cm52qx{oueJnf(r{icHyPNxo}Jf`m`4de!TuG-y#9icwoXZ7?a> z_wYPpyvhFsuW>i8_#*qFh@KMoDh@FIt)NFW<#Qp}5Czk}#U(bHUA9kCGB6&TgGi7= znl+s}gBKZ%9z}#a#|nsv85V-~o?@O5Uh6PdZOy+=)(#EgdMR z5^Ii@T=`tsU(sUR-~YTVc!mj<+nJEXl=P1lXzbOH9f_@7%}?gR;AgQ;!JiSpV3uj) zR%a5x?wdj~!hvbcANTVUMr>sl5(!q5TcFa!%W3~!gF3-(8i}JjDA6j5qMKW6hQfQ6 zg$LmNOd6bzX1PG@T1y@P@k?Nj`1j&*qmLt`^7->|2b8XHoOFQ16f|A7-7~d~!xKah z+|O*{@Z?F|$1kO*G4AIY@{1-Yk)bj|bl>Y2&)rE*#J#6EUd{D}qQ~<M=OLs6sSE)twwE+dh9fw;WBxKZqbj$oqajAv91eTm%C}yh6}(EV`smfOus~6VJQ}#57{5R@$)(|*@s(^YgD@C^kxhBo)zHtrjo zquTsC<~{S+uH07&v|#K70@g@l`k#OIF1tQ2fHA++GQsQ~+hH&Tc{yk5N#-LX6vk^V zZhyX&h5eSb?Q(Dgxt04Vbtq-)#Y$<8>!Q>-mcr;Wrje!9#DPR}v5wW^4*^Z;MXM+T zB)VL^I`PJ0sXRE`StqRt6HO3UT5IMaOltMUoT(;ABIt27yss74QP#eiBh{f6V#Cce z`zESsWK8CMZhW3#j!-UFSM*TVPL5~KGJ_@!ane2Xk>D-7?$AwsBTe*|+#pxm0{Z@H zD8mQkRA*B(lNXyIc#=}$Xw@>V{7U<2AO>J0`RqwsMp#ecl13 zcLA#e-`~X0jTd`p%`0n9g^C^>WTuR`1dd$(2-Sb*bq`zbm7iQ*QnNk3Q73G6;*919 zYD(8yGc}s)3jC`$i8(8`%&9Dcq8Cbdq#uBTn@t1KoC?WEdIF};NF0UpVf3+ zF1^`>yH))R*mx3!3b6uTe$g*JC-F;EenCR%CBg`=W=x1TwiRJUbuCmwa_C<M}+YGb8mY@}10!H?q~kCc8w)oCJT|Ll2! zcI&PJC=a~LOvE@(yZ@qo;aLb>Ux#lQQWWphPDBmItj-oluyA&$OU2~9_!U-a@sC^9 zQiR2h>q_(A1H@GZzVv=anlSb*Q3Vp*Le+Y?D~h6KDFOKOA1eMRI*Qg=B(5;C?e|M0 zymr%C)33S~A2dMG8Ako5gF^oZU+_ZjUtxOwzH2lBt$IwnG&XXuF#TchW07G-Wi+2> zP|49%b3}!DX89o`SS-_JZukdund-zyRltPq()7S4a%-7*L>YD&H~tTRGn%_nLa-wL|M$xvkDyIZ7xRSL$Jc?4TX`+NiSWZ(9yXyHvJu$i&@stkr$Rr zM6Yvvt_2MR@XWJI>7-W0?iJN>mY=L`RKd|HxBo0o=RYrTVb7I1RaMt{u?s;u_lG$mjX;|l%CEP5m__s=wdd(e&Zv$tN7uP{6o zB<)@Q1Ov)mTaZ%uwL_sK0IPU3Pep*x%+lsW25X5kf$*`yiL~E$MFdoq7|{+PQsxp7 z;`(d#gIrN(EoWS5$n4}Ee9CuXiZ`7nFIt)6`s#b=39U#2+P|}UqZ7_do*ck4%^~!> zk`yW>MyU3HvT}R6KP_5@!+)MeO?-$!1zB4Gwvg~4X7j2xJxvi(9!ZN}SJvh#NOCxo z5a>-%UPNpZrHlu`>iEF0jq2L^+Ba|v5oD^ZUv#ZEj&Votv-D^AyhC65oD^4j$s3@~ zkxr})B)l`T6lFU6fZn48utdK?RXosX7+j5+#=Wqe!!^ckN(5+e*Uf>s5?8aw`sOk}{PFg=F z*P@xDXNN~a=rj4J`%eUwjm^jx)#QMOzHS(g9R;YB`@*sk2;FiEHIZgcF|MAsx^idt#wKhWnm~TTvSheumKE<7gq8HYpARW=(ubl&W zM?j*YKb2Fl)rrvx(1h$*BNdeEo{(Z%0SkjFW+KL#&1#m*pxH~pC$Wc5J@;?yJsCL^ z+l_t2=O@%+h>J-^pYDg&7l|-Fyeww})YkVf7ob>)W9*L)pg?`o8J8kB?%0pKIwA!y z2Mx}~9dLrXE^FnmRv(M-zSYiV_f!^D05E%lw)wl*X?T_i@BHp3bPkH^rc}NcL;Kdr zTt0+D2=A@EjLn{LM=}&a37@#~zb*rCPp8RV`Frf#Y3>W?YTdCf0{F!53gRSgiMtWL zZ6_k)nNp~dGL-Oep-8{3wRD0fFJD$Vbk$~)-ZVo6E-$nkdZ@ZEaa?p41tWGSdU56G zpZR);kTNi9nYQBZAHfx@<}tGMP*1nY&+8pY7kgj_Mc(X(dakh)X9Th}8=AH}q}^w# zGWuQBD?+`y4ED`CKd2rnP~;63dYG#oe^l~#yy^@ke^47q4z?mS;zCrk4~_}+<^zbm za6m#Rj?n$E!!tl!0m#juj<@#4VSv#y8b$@;<3M{qRp`NAWNN6%DPRsYdBQtfn=dS* z!EvVcuwm>gjoc5v+_?5P>m~9UB^+!9r5#N2&YTQ4_pdU5%T3DH#coKI)ZaOxC?=TN z@A0Cv4^C*k#b8cPlw)@fF`Fn!mtoy?7bAeuu0;H!w zH5von!zVbUng{{30%T6kYhw%#W5|%2jP&d+zUbksHKptlv zr`v8x$^osvact@<%P5z5!J%%u)iH(r6)1B#VoJr=txOc$64+_XM>!t{Hk}}`$4O{s zM}u)1MKBDjIgU46kcj$7Ui|c2ILLU2DobF!`|uUlgP~BsuF{N;Ou@W(w?F2qjDPo` z_#n=PH9|7&+az)5g<}Bm-ro(Uc1oZ7`)BVVvv@|e`?t7%7skIJ13%b!|1~0#&Zt_T z?jI<{uyIi#JvBkYPsoT2su8aOW5! zlID)H0$aG+IzfNTobG&BwY@B1d$3y#Sn_gN+e0 z3e#HC=(od?A^x%%*%%*d>*{S>d|r#fAC1{Op*!Ge=;rh=PYs^IX3=j?qk zQ&swSsgGQ7(dFsc};iGnAa$iP;q`~0; zkri`S-8+$TV)OPubzH^0f~Op3e4v{fw7Sa@C6UZgl^x+q6z7!*vr`xjAa6PodT`SB zfrFr?jhEqlE!%5i#B4Zt#rYHxz;{)o`)7Fy5KP*G)sFZFbxC7$JA{_4`+X}*N&me( zs)ECW*&EBdfq1EXR zA5nhI_?+1a6&h*dT99(}{J99JL$)UF@xxPi5XH@*(Ib$eyNjQBB((pUCu}pS^4uQ( zdeMz|A+l)|>0L=ZpWrV^2u?6VTBob;gchN!LLMfE0iqSr!9s_NeHz9$TnM50>j#3y zaZ7JBr4yDWPoMrSQcwmGL|);Koq9% z%Upz4`UtvG`i=8X0y`7bvviKJ_d5+!t_Zo$Q`$MZxJdhaQR~Ae5uK~<8#`nyCNm0{ z(y=m6cFkN(aU>~J2%MLzO@+;6k`p$ZPJ0^}4#WD&*RHrqd)mKOA1}YArYmbZ{WHcx zyXWq=$0`6SB52=U%VQ=^5HGJqoZJeoK$kzg zZyqq9CXV_NIt~XDH_f@tGe!!jTw@8js%Am!r$v!aH8v# zALm{a<>Dc2qOj}o>^BDx^_5g~nD3A*2jrtHZKH{sJE0U5jtSs(0uk|h? zMxjBD8txwIs_cmdtyOo>?VnO42oC+T)}BGYQ#mcY!XipJvG(@Xj~bAHx03e7Y+P3R zi8j28Fr>u5f8OXRufS`Yun2C#a>IVR0#g9Lv>{dYJRftEU%LU5kG79!S$3==))exz zOtx-l0aPi6(U=L=B(xb@^h!t6Z%2Vw@k4AP^Ae(<2GYHSZIC zg{dYaPuBnWtJSw z7zZtq4IYxK&Pug_$TbxeHGOZpd0^A&o+Kln$M)KZo+j@FW3%~V$YxNG|I_{AHFD;| zo@;Am+-Dymf&QudAvm!rn5gZYXG{5-86 z5tx#nO6D~G%zE+BgR2%X%5GkmH!tUMZF{kdA_&aSsRo&1nT_IOVu0!D+m@cZp*_C@ zO4G?*>i9*Rz$H;h5;BC;fQ@*(3fNR2gIPA~a^qCNjGXIkTj$}=`v4OJ0@{G^IIBVz zf+A=TX7TjXu`Gsq5MPmBlaPdL=Pd}r^ntjdOx>1xrkbBS$L}$qg-!@sCH;+^Cz^il zdOotohR`fc#EJ{tkYF+GDFg_q9G)yI02F~L{WrY{;Z>P?wB(f$16sZ);Vx1ge||** zDlS=rXViSh2p-3fKlY6V(?qvrmQJrLR7x>jtn^vJf(ZJ!}VAvLtAlCD=DfrO$hC>Y?oa{0hRPY%{GR#?6mt+bJAO zupk$CwOOfJ_g_6Z=XwN80G3+weXzBSU_17CSKhA0P`|mYt-xZb1kVS|zQ(+gC~y?l z>5f~74a5-5uw3U8m#p~1L8}+}LeKTmbw*pSrd-G);mHE*>>menylaDg)NMQ76K$Q4 z2fl2(gB-P~bc^zT#I%~JtC>wEl)zEjsRt1gLfp?c3+ESBJy{Z@L?M&NTc^OI53i?B zYkqqoB`gFA8`Y6PI%U_|JzKT|5#w%Q zbp4+I6Flt0U(&{5MU55`{w0nJDp4?iRvkN0}Ndws8{?m~4Gha=>~<5!zNkPp(w&{41ZP?ZF*o zDPo&G^;O94zRxt_h)&-c0)lK8qW!=9GrA5SrvszTV=meWJ}D4cYZfx=)4rVG8ZkGh z8v;*pZBUAW+92*Qy@q}1VLC7#j)@v#0Zh*TTa1$ffgI6urXV*5tyb(;vkgLAX5c)A z<5icG@$2+ifz8I0IhWQ5q>;_7lfPSNs6Uos67#^6H$2r{+< za2$YZ%E<{qTwvoHj{)3vC%_$dFBu7lbz^C-43YW6?||yde<(1&2n)6o(ZxZK#9Zw2 zGN2$6Hant@I)uJih-n%+qWXs?IX^z{B^A-@8ClF0dT~+?e;Z@k_XMUGfcF1$7_cIK zQucs@U;VoP&wc~o?9|Gumz%(>IClP0FTJe>T-F6qi-S-+BfFjK5#cu;0?7>W3xl%8D<0}Ar zH$lv?Jrg2G@#YI3UR6DMf21`8wu5CDt zC;)y2akz8M0)F}u0??}fX$I+f9=&f20=|TH94n3TWo5De^EbWIv<1(M_$HvIGz5e>=0XSLbByj>(->0vA4tD?ce+|=TzG=D?z5If@z5)ezD86vfbO;tq z%Mm`wxg@GWD4+r33Y)dP=)56tY%0#N&-c97Ye4}0U!z!64rM@`HJxS$kSX_H_Q*SR zaZb$u_I9Cs{ENyccn->|m*Lu{{vX8zUIBPg83e!hDTN50GroEekH6Uc7;8U0@nyLF z$xlFaARZ?5x#XCF{?%7L1K0nzzXqjJEwb~s>d@bVXP$uKu6sOIUVVqrfGlHHYlhmu0F;C@#X$i2y+=nFZf@kt(QX2Qyin;V9C#q1 z!1V<(#w6wY-`|7$zBfYlt{*TRfmkYv02D%kUE@<1|E#O*WzOb*G*ZcE9{-*jL}#y7vum z=KeQ9&cwtX0;Mk0Ho*oLm5+Y~ZvNsYVP6^j*rSl0vCJknONd#ao0H@hFDcs0beVE| z_YXqx7k>t3|Lb1`R4NJR`=Joj;QMA!95=waG8-!Sd$T=LWyl2@alupmU4C%U6J|_v z-JAWQGVKX)x0TsuAsa@}+32wfAOmRXP?4K$veeE$_+x-?f4?O}es3T4f8morN;gMl z2Ar8Evj#KN#9JL4!0s3R04gP&FTDMGV}yYiGaN;D*MIiEfaw?iCFEReL<`=^^!sxM zn;U;l4`BbXPs5qFeZXY%so%hNeLocc$$tygFDOsJb58-V%7D2k66!Sp5!%Rhi5m(r zl>3U&sQbU`UckE_H0sK2-(`9aUVlw{9M}j6&p%~?pXRP(U%Dnky*9vURskBzfvtB< zdWrz*O(aO_&`fxHHz0fPt&si5PbkT~W4@=PBlqPiKll4e`d`$>K|}nRjl4tCrMEIt zof!c$1TQF^Xp$S?zI*$f+Ms9>kjOI?)URzU|3vZAo7WW+_!Mlt>D`cNV!j6W*7rjG zAO2TR{lEVh=wJO7AR7m{ZJ7-iVi%@PA?9#pMhW-7RWY@9sO$Ft-f^G#E`QE;3-&ai z`n!AI2>1?V_xQ3hX#Vy;Hi<|O3XU|_AM2PAxY__(1u!AOr@lyN3UO(@h^U7Qps9C~ zxG>=<-43R3|fB9>F7pA}U4*|Fo*K}rx-4ZHkNNtd{Zqe=58f~*t zqGpL{LyEJDcN_J4Vr&X1>k&v#f|Ag*cM}dC`wUDTcm#5V3gG%xMX(P-_Wh3ny;IpL zKKm~KzV=yVqqu5%7+ky!@O4VUKm2y{P*R`RcsbqE%|`G=K-H<>$>Lm?_+& z{^kcBH7?12^7D%6oj1J`!Ie$G{-FWq4an_dGddkTs|grOe{bcNS%Oq*NuT}LzYFl- zn~l^|lDSewzk^@>JH{|qm7e&?>e8AKWNZsSLv);~dvFs-!E9|m&_zU>2!u4jWq018 z)QVStid@GWu&sgr9oGFd3dk(8Vf#c@==+>~>nr+i^1B}Z;^C2Fhrl{hMIZauRafW;gb5>%f=q@zK>{c25pOy z0_YN{B&_Th1^D71?j~Uz1yE0N+?%rh)`tLkO8fx^gs`9eUBI_|2=M)X!Vm)!g@V!3 zU;Ljm?A8`>-JH`(f0pw6r$wfXYnA#g6IredYQ=j#1e5oD7;OTtZSI>S+>;D>tJENTLRAiR8dhJD^tFLI!1S&%yzVvN% zzh_Msqrw_6m1;w~*K|}NRq9dfsrxT%b|cu7X7pvpXixnf$271D^S(C#@$d3$L{IqI z_Q?#XM@%5(1VG3MIIX6Dc{yY2VE}!A0BJN7Ssq|nBcI{}1)=YIlhULAEuftpW5`p) zQ~t`&DYxI(bqQ`Z`XM^^8k$N${6a_MM{~2%lXlOnh6}3 z?^?fncE{b2z3zS}KKREqLePOnpZVude)@NSUU=51BAk>2wm~Q}EWWSZtNNim2&_tY zPXcLTCf)E;pduaHq}bSJIBY_y=~)-2*N&QoPEHL`NCX=bo};EKEiq zZIiKIp!n@f{aa@y#t>K-qa)$e6x-lO7AV`f2MMIxjY9RMMGqVt zMv1S70Z_*?m*x)WqSocVX0Y|+ zABWTFfMWjJP4%mCCJ^BraMJZownz;)%J$gco$+Cet6u;0WekW-1k z{g#^$)(#&_V`rbMb+2hMS{;>PIHR90eKx)Vs7IrKd8zNCMgVj4eqTq zjA@k{j+6nd`se@9_`=!c2Ue;pR~ssK+T`E)%Srqh3$3txqGO*#g zZ1l_C`zTB<+yT?S|JRfu@MXxfx?*D#-1i%b!s%y94PYA}BN{BTP%hCC(bhTRM&uwM z_BJS^ASkz{Nt9w62-&}}efcyqptwyz(}8TM%Nj8P3XLP>Gz3NhrJHQP?j^qui-q9s(=V0o&(a_6y3a^CU4&x?s^9)UfjH^r+(ly_Kui30 z-2;<9`&R%tn1^?ZO^<4{ZIXKL@kF^Irlz_Ic&LyIo6g z#{|$dJ(UGf`8gZ(83nM;d>!L{sL1gDyn3(~LHYik`4-?SYAr69U?67<1s9)SlZbRJ z6vR+*$p3py&y&{1*t|~lM7BDz@Jyky)sJ)00Vx;NfoPE}=#@$H_%z^p0!Gi*SrLf3 zQ~`pH?=03H3Hab2bxLo!-RQV{XgT7Ieej?9XG$GV(vK8{OgIMr24wf$2a|vArvV;# z7>GRvdDbGr79-{;MD-X;6f}dvv>|7pnBhi`iaYTaBDsrVuG zaxenO?eofJ3Zn4~i z0J@&IhyLOt>+|L)zAUrZZ@Px@7F7TGR}?M0W@`JXQ&G+KA-iaQuH; zTQE8~VIOPo99SJu_h0-+{|!w4#wVcq+Lsg&Ur=+eJQJwhPZ`82VX#1$T%^hv9iMsv z;PNX_ee*F>`+zJ{k#-B$K^aNdALcMX58bhWsU^|-m_7vYOJ?Ds{@m8MvhD1tn2;fQ z2?8js2PqhWW)ku>w%a9!#vImszw6HiOkpG$$>vZ1**tifRK`sN3fAslHzMuoi%>rC z`$}@0F|q#YuwyoX$shakO7g$O*bMZE!Zx(p-C!ob%t@h`$$#)OaPZ&#C8#dH3K^ps zYG`!gY6Cb_$i+cQ!vJ(`0fj1NkADubJMRH_a!=iz z93`8&VmJqy_&IiK4@3QfCS-xB$4LB^V*rjBlnH}qDl>Ul`w3bD9r&aT(Jp@Uk$_da z%388*nXa*13*Sho%4Ywm>r8n8IJkxL>CbHI4aPmzim5-1`+o&ypZtVH0Fa13`??AcS?lg1LeepT@~Ov6Y(bt!$cg}y4l^W}0Ib&c zj|(shJ_k3g;qX9RuVKs}Bx1;H4MF?d7ZY*6lQ$HNt=S+1V<;2kP<0@MYfQ77)adn8 z1dH~bKnF9UKVP|Q>iX|og8chG4)mI02Cwcy ze*Zhv>wiQ2d)vdodQ7M{u0r;R2Yy-?FZYXqfO+Buv$CcbX`1y5agqcAQ2gYz3*Br27 zjy(=%+3q0D-7RG}e>;^vmp(}epuI@-Qb~i>gE-m|z)2d6warQpBXjGC(et2iWv(b> z`#H{6az$Lyc0G0x=}kOfpS05VFI@$E;W?nYUJv;X{V8SmdI@H~_VZBu>Hj!X0vgiL zOyC;ikN%W02r8B4#peLIlsVP&_Py%Qk;L9$m~d9YxQL1ToRTg|b5Gj38sk}JSK2e+ z44@U(Jr8Z?s|ub2lymmp56f6G6N&AfN2-N;e*y_=5b8r|?z3i;jHDYL63fs=H%Sw~ z#!k|!T7Sm?qN*fEy*5A^&2be+l2&6;Jpd_X(ypCNo4D$$r8dzD%{N0m5`J!A7LJHZiy#1E&xgxD$gNtDLr^O+ zA+)kYMtfH#_)unTlkw_A16d%*yZ3N{Px<^)P;lj5?(xUhi?>7e@H>oU9S7 z#E^;e?5>5gGf>UO5D)`IeGqE*l?r3Rfn)d z3E<@+fI0BYOL|N6QqsHOr2N!eBgm63>LHDBD5?TvrJ)OyneM~>H$DYh4=L+;`Q{Nd z%P4iF;Ou)p0_C^M8(j~FV@$%$BIyqhRRMDEbJQDG+`aaS`ssbh?^V)rYik@#fE9aX%fNSh z5a2g{!DKettVQxxeDqOun4+_U8Tbn5@(YAs`eWZR@0=aTS?GtfrPv}kOZl-t3%NiG zxu6xD`mL^Kst~Is)CaAWNQ2`N8F>*MB)-XQ!9YF8F zW&|+X2fXbrn7sQ(0dBb!0%jaK12ENw@Vg#RYQUQSzV-!E8rc=)}hs%|kE2l4xLsC2d?D!T@K z`7;oe^d(W^+s6U~eqH0Mb|KN%0Ykr>xL_E^`sUrzDd;o|FH~*ORvqkwmeE@k!aYyb zhe8?}DR>{8XRXAARfmG3qO@+0$&Kv`h_C;VWo0SVt4dH)_aE_^$|<1onHLW!0y%%t z9_}#}kw6{KkUjKPm~q*03Z=l%2Bml+5yab=`-07ZKX}w&u62#l9^&I5$q{UOjjo(z zhs5AmfK8!>*Z}YQD^Lhza<0yqjkTGhIuu&!yK}-2f6rXk)=Z``d{utP6PQAN=Oci3 zyv{Vt7!~n@ukwpr_kiOZ_V#V1V7ms=Ae&izuqp6Q?k?6}_b!Vb#liH(u~WzdKm>SU z3zIBm+yZ(#LS$3$aSE16Y=aN0_o{olT9#C?fgWqVx1qGWB-zPgU+sC52p>; z#hUAKgjWzu4*q=xUe*%YS2BZM}avasHVLc}UKBcxXyC@=uLjLla3HkaK}uCl*> zi}ZJ&>8`%px|EhF?S*jz&#??=c=1l4r@!ITdUXk}Dl|5AM1t5-T52tL&IyfIS4v;8?|}$`}n*;VZVP_?$XNaSncxUC_&^*J1%q<5#!TQhjjafA4=wKRs zaEBw4BT|KY9$O|$X98vty0?&agboJKbw{S}o~Hf)NOdN-3ZW`#!MP*thebD%G;IS$ z?Y+{uuiw5RirpKKJ^Pf>kFT0i-yAW=op(5mR@cU#Sf)_ewqdq)m}~suJNSy!*}2jN zk3XmA?bM}NnZPEN@~roBFF@U7WM7x|qUXM;=fNeve4RiUjw%9#urbpgy^0W_i$<2) z56Oomg=|K&`svt#fUE}Ot1Wkt3(%LvXr)7rL72h*<9`78t9L`TeNjCw=+;}var4|; zk6|-20dBrg*hU%52;5aS0x1GR&|P#g3yJc8tD{G@7^6rD9BkwwRo2*2#sojJ4{qzl zM1S)J(6uW-uYCt*-+D}4UpCD?_;2{$q#+Po(u_3h;Su>(4=GCqm1X_Az11Or1!-Vh z3?L5qZ6zrAnvGw(uff5M7Ze%*TR(21n|>nK!Dqr(M3Zp`o~Dv z(|lEbr|DTS3M`6HYDc05%o4)KxZng)V$rpdT@$;BY#}S%xn&t~+A=ruR0Pk@xqd(G z?Ll?(8W6V)=W=I?A#mnn<_m*_hZc_BP?n?vV@<3;v)Q?~V$h-+fdEd2_z&tXb!FJ@ ztSmTrqc63XJEJ<5JaW^ApZnzz7^0$^Geu~xYGR|Z(y-ZtOuCj+=v#Q{7vZf{C5y zq<%N!-{#x~C-Es&iAbmbHZ)MX&YGY+CCuO`aH}I?i0T5+ILiJXI&Jdp+gGKsL={$1uL1o#ERo^BytUteK&V=nT$+P# zPymLYMj%(~WyX_d<~i5$%ffR#2TJdUqUOlHfTc8)5sZUUoQ=c90`!qjtzz0uDfjEI z3fxunM;a1L3DJX>vPLa8B`)+8v7s&-m>zmAlMqp$$=DL!lX)(D)gOdpEDq zbm;NZZOVddrw(oXZ;kC9L3E6(!3RlMvr%6`7y)Jd_Vr$iIx()}T9>bNSD-lQ);NT| z)E(Le7n%5)6(N}imEbbjfO<57i|Hbu;gxQ>aC0ZL20~6IOX!5tsW0cq9M@Vv}etVtV0=8v1t5 z8MLK1PzyF&VAO1Fp>hmH_wNWl^UqN-2B|`{{03GKBDskA-v{9+>sLWswdgd&0!SBc z2k>900G&{Oeb%zb9YO@*(Gq*;cb5t2=%|~T;|hG-HLbZ5HAYMzpny!H7ffRmB6X#q zsHe{Z?o&?hl8!-CUt(Z|K~BQ_{N7S0=A3@S0W>U#>1!{DgQ0Vk#f2FCSxHMP#|S`r z>zX^wu3{1(jDdoQS=9w?OoC?y76k-k&~TfJboCkPNDG6E-4h^^e6Z?nvfVQPs!MDY`IfOEE9(cp1BksWC9M16T&&h##{! zAjzX1u|85y9veMWjeSwZIZ|U()m^T3(OpuFD^w8(HZEgLp%-puVZZhfRUvqX7cQ%U zEx{T9(V~I4E?#=JXug-c!A{fo{nk+X)Fl|J0Rag(W+0?L$Y3AI1Vk5_F~MYS1EAB9 z58#mw`4$*mxjy@)0z~A4zQLtQgUz(BU*`t+8uDZ$f32Lj`%JDm#f#t4Yrc&Mw*{!- zymwHfW_na$41p32nAa{YKrjkX;ukHEjK%d|8>?&*($51PpRJBYFBm}FF-{(GoA6>0 z09Bc>@VjWSEbb=|*#nY<+4%yK=Du8XBO$5JUsnMfSBUKaUM)z7A0uNR)_W|BMM}!R zCbTsW#;ym*J*>LBjiTGU`ey$m%9@y(IKVIg8xUk*e-?+#T1McI0X0bYI?SRY-|4)@ zGT8JD&&U!aAQ?aws|MjOa(}S~`<6u{LBn6-6GCO$~JBkAA7y%>!I^-Hz zP^6usQ~f=Gkg=c(i@%QkOALRQDD%{I*p4CS5C2^1|MH0-{)7=2HNcX)$V7~T{#-zS zC6XD8M;)jZ;IgA&a`xilIb>te)9MEFv_Wwp3xD2om)sM+NH**jWQE|U!)nZ6GXD{^ zqi1T9>up8du$4pj&OA}aE?2WJu1O$+fMnf&i3nVtf8}xm#+WrXVlPMS%p*k|^19l} zqFbybiIgG>y$l4ROc=wWGFKr7AP%LBnLu;TToQ>$OXg;TGHVwSH~_Ih&`Et+{ZYCA z-E7HslaAVG^{vy-NsdD52^cX7AQ#P9L8l~G^hMV)U2v^*mIW+baYNA?A4P`?as+}9 z!}-D8y(-$rU?5Df)eZhf_K9;`}MJz zLKD${lsJ2=Lxx34a-~5&ZSe(2aaN(MqBPoAfK$>X$Q|a6Jvlv40h)=;6Gvt<00HB$ zyTB=G2s^HnkHIzA_Uo83kYi9-)?Q~|u2&mdkV3o)ancN7?>c-f7{K6{h)OTi=niD@r&?o*wB<`H2~6lD4#9pm1ym2KeMH(LI#DK)q$A!rQ5 z;h7u7VX|XP3r-TAsI(`uyP}|dU16$oOGl^JOzcL0$7a353V(ZM;*`$_62Sb(pY%(3 zID5mke|T<|Vww*C>wp1sWlsCBb+SyRzhs6mP*67>+38Jh?Y z7rVWqe1r@Ay9@kqb%c8yA_MT@z#}#TG}Qv^i~;nW$u_x5Xc2XmfjxkYD`fyjw0-{KaCyh!6i!h(9f#J;phXDble` zsFmH%F^li6XIJU!sy6z+xr}>$Nb|ZKkKpQs8ijs{9o|pT997bfD`l1mRQ*`2-dM_g z6$46=o<}sl2;q!qeo-kfN^)7c=ndF+xFliWW<+a)W9y*P)GT?K``-0Bk*x*j=G6}y zK#wU)x=S`TfcE+KJfG_*-^V5Xj2f-rXtXSi*?#P0O>)-4t{$P zVwv+G+aQ_T{>sn!%`@t9UhH?-Fi$+jy*8m>@j%z1hZ5;rL30kqahQZ`dQ$e|O!t=o z^vqw{YleVJ`gac7i%bx0X3Mo_qH0qc;U@&r+TDmhnAnGVj&r`dM2Q_$m2YDdRd`?( zzm6D1+x=i7)Os-bs{**gmikLKwg7+7BHC|41&3t~N+Qj}m9jdqw-GfhaNV+yeI>(&naa_ZLd>?mCa`u{)J=&Y7SW1xs>AbJUqt~0d!Xoq{mXN zNB+`Y4xB?&DUs*)VF{b^79u}Pf~JSQ1u|pX=c!bcgTJ#Cejl%^{~a_JM>_6O&6UpS z!=W5pfGH-FL@9EZ*}plHAcl^UpZco;NY1+n1C9wW)lVfn&#V;BllKlI@Fr>21bfrZ z7txOwrN&eWOJbuntZTzOYD*^XElU_`-mujd(PzsB!f&%uV+-LflMtKMV;y7Bc}Rk#gh2>K zteJ6PUr!PNcSfiZZV#qL?a_!qGWZoSgx-b%*ZigHJ_ze3_Lc+WC5wdb=gnc_&rsIR zZy;{3lS(2_3H&f3z$4CK8B%yip}^_-2x68WM_z^-$-cVhTULFrYJ+A52bLkM!28pG z6<{m~piMU~1fdt=FklPkmj*LF9Q#%RNuyJ$U$!0CjazknOu_A&-7~x*7(L_giQWGq zK@ZyrIykWZ#*%CY{mlk+O)_P(h@lZX)d?MPG>|Yg!eNUvEE7py+FE&qks^47+N+Qb zk-#G#;fNp~+B5B=H|^Xk)5d-Kz1%SbG%ABr@9c9rYtaBRgMA9j;F$Z}-)z845I|pC zfY?Ih(IyM2USJIK+BQi_>{1YVD$(88hWXuyh8Q}XuC45SItKS|)^es(epea-$2|&y zLoox|66nAp1v-O<85~$hhtpiX}yAVnDnkD>{0CyqS2(}DU@P=2A~h|Mrwz;~^y*=wV>qD`vPGA1Du<1w{MXoAHfn4eY=0hXKD>duvp z9U#pRG%Da|!-+k=8WmXe;HE(a@^5>o0#Iffb!xbLLJvR+<(+|Uf`Ql@b#@Eo9c-Uj z$zHZFrL|h!U1!NLQU4;`dcY&Idlprv2LHwN(`{|&M+Pub;__fY7;09En4TNU|BbcCP z1U+;E+OkRP>voM3+FE6U;HDW0BOOG3_h?~25W6+Z8DeMYj&b`jS8^x)ed_oyfr$k` z5bHB^Vrki89Q^z!c!rz-a2<2NtL!| znXSe8H`tCe>A}Kzt)FZ`EeWPZ@F|=>4Vi6S=E-*0rqS@gN#1Z8O+8zh!9|1V=61r1@EN$Gz{NUZY8Kkq@dD&lvnX6a9ba`z`WCOe%N3_NzEi zccDnagOKppPVf%Gb7nK=7B+pnXk z0P?GuA@qpg^L7cZrMo70ild>T($pAp%Z;C_0a9YZ7)Q27(#tc3_y+F*fF7#=i%3`R zhj+yZuHv_Vk!9qytb_ryK`aOB zC(=@nb%L)fkxyH!^i5Sy+L%qmEolP)nhsRD_9FxUlrn%J&oLM0xrena3m+=$4R;pS zZ(%*OR)*C&2|uOfxaC~uRL3pLu?4s+hXKR{GC~9}CWPbETCm=%9tJfPV0HK!tarm# zBozcdgXO#BWOo%81F&HL&Fds3xt*{A{0dXtYSr*Y`X&~UDt^dD+Dc-PRT2+w^IP|uiKq5ZB>${#=s>kq3>zl`DC zC3g2+%H)Rl>+3yMBcPvOQaEF0GkT@4)Lzj$4jYx-Da!goMNq#sEkOIq3Px5MZz> zZC^X^^=9KGT-r$fIT8|r7XU|Q1QZO8hCV;3($4xjm+mV9Ne_U8OB*9#1G`SF%CgDi zXc(NCpGN>goS%zo#YCm;p=9g6Dsb92ZPweh>c={{=Y8p!xXk$>j%I#QBapJcXSyFM zz{Ufx5P|qmY3i?4`9xFn)pG|N1mrd=@&NSrO!qnU+Ax5_*>wfIK2*m&2bghv zBO3nvyiLpH06>pz0DZVGmoe3IxYP>Q9NIkjekWnCyh_{Cxpc1r zNDshl;{j-2CrY9KM;Hby=QmgcKn<)J(q3~KvFX;f=ipxzD{GSmL%&@@EEd+;|hWDXlfbXvr%*kCB45CLcm0i z;ZnB@0HcPFqgp5D0(4Q1L(T@(buH{fW)#YRZ6X1iH=YU%`O}*!K=Y-FT&J-OSAEJE zIfr@WV#4Q&-bYt6+kv8&@RBF zX4*ytXl9fyRC-J?0L}&2lnn|4It#uLhzJ25z?tp_0i;b6z;eq?D}eUH<#uWSu=2=f z0YDhesCNxCk8-91QiGt<_IMuMssOGLh^sWb(f^wdRuiKf8-tVS;6t5X8q+cWmA1P$ z0N)2d!oH38Z(Sz|E60`w>|LDwEuX#cJfaZbLD&E~Tr*h)d{YIe{b0H3vTmKmrUD38 zu&I4=cy!D(!jyyrYQIq0M9c zDgZ$}vTdk(-#XT*5TVl35i&_{I0NhA9O&c*I*-m&fKkA{H86o_odyCckHqA1^ePTc zt6^q2x_M;7n@2ZBK-ma%ApX+M)@dTvX^dHb12mkqiBe5X1Di)TZa^Q}3c;|ofdI|y z*{#!bjO#=|6X)T8;i`gaU!n-W0nKCmDuB~#9bD>p&9rW%Bl;WwJQ#M7jJcB26*(EQ zD(L3{gUZ$DMg@orfFl!XOJo2P!Q+vp0Oxk|rvv6~DCRM+Q0=T%d~xMh3K4)!2b(rm zbEwF;N}ZbI80A>z$5PT6&MM~$rU9M{MUs>ts z*6F~mQ#PV`^0Avh2yu3?AOj+vnoFC8H;?tJ0McJN-IV`o9TO2(elS8eDcU(YK``V9 zzzN2=8Uva~wpNxyloSC?%Ucg!v@P#ck&BcpX@LyD0j`%uIQFfBw8+VT_8XHfK;^LJ zAu0l`;Tpju67G@_GlApq1{Wv6M8U){rBD)l3`~HZZh=n$#)E3O=fD*K)#up;01Zf= zE!GZ~3IUh;X4$3%-@`+m;{xBU;Y91>=YzzMa$6t(Suhjk@Eux^`QU=@t@0d5*gPF@ z4M6YGb_PHglnSukH~<*|SXQBA@;V8dS_l>~baZh|D$um6LJaSdE6<(&?U9K85aKwe zesl+ob)1FDS)4x?5|TAFP}xqq=n@J2`xLj~A|Zj>K+SRH(=>RUx2)A{I&}a4u#2@6 zYvWiX8GzmR3Qlf@oOf6~F+(WUU|mln-%A-l!W?K7YcY>WZrOWrNhSHB+_n8P>9uNH zyC$aK7>8y=B;JS6!FQep)Wk4!?>r2G;9z)CGh)`VSj*62HOOrPt>?!~WSiOPV^vI{ zgqb*L;)vM>mQWrD9i+s@1rJ)26qN)b@4E_~3`{?hu@CO2sm>FlH<&mS1E4+i+4V|4 zcs}U6W`sYY!;nZc=O*L=ho~i30~yg9m0%c_L7;nHiuV&V0%t?`FYXV#7_4jp;)=Bl zXfEqj0elk>ivW-oBXn#aa2F=)q_{&8h%KxdW2r^q(7HqHrCbHg5VBZ(UFm*{?Jq;cKNnSlIG!<2>PCLoyAFP@*12MbT>v=n2z*$4(%xi+BRDPSk)H z7}Z?Nv<(3FD2O3ys0NG+fSWEyhH+Bc0E@M(&j?6K(?nSVP;Ph@h+7*Bi$M6b!;=TIJzew);;JjN}t5s*fUu`Nc+|5ZtOVm zONTL0_wUW(e;6qy8p7PDS}f&R#mN$zO`akO2=7lEbFeC%J6qE3FiRMOv{Nh#HTWhV z_O<@4p(21)9V{o^C)VeCR_T4W6$TEnaf?K$D+)x;!4#U%XH@6zcuWEx!pJRiu@GYCq~l|+g&!5AtyzP*8e ze_{{&Y`FazPsRXJ3CtUzHdu$TPA~*X@OKmg(4RA-Wa+kVrNDtz2RyM0N1cPJh)6EwW10tM1(BM zgfTQR2j2t~<6dT{nSc$b)`#oLHC>s@N^LNLTl>~ z6A#58^?}PqHpgwN!}IgKB?N)BL3Zz9BJZu#BaIc|b6W^C10`c{E=`OXj$;f5m0{TY zy(xuYrfLr38XN;~fiGx@e48b`CHfp(_SpN%Hd@PBMe z!+}s|EVZ*0e{Y3zYztSGg;l6BfmKMtV`05fdE$C@DhD$!%cSXS4srN#{80c#fGk#}vE=upeTaBE(RjaZ^i`q7aDTjP-0uHDV?_SE)g}4aIb@ z9&sqJwnQsy{TU3B-VHY?Ci;CT4YO2N+kWVkUsu6?&swgjkyJH4)hH7x&i=sW*yMIDt;AzN$c*9DnW2$9 zK?_A<6fXi2B1c=2DNF@YC?OzZnai6#@>K_UgO zK8SQ_k#x39q)=$+;&ggWLfNxKFZKE3>L|Wo0*Z>M<2vKVK1jKh{;nj}-UxMn-u9g= z1mxTtfqTVUide^>aq!6e9)46sAv0y8vCi*=A z&s`+eG9;1=2J#tzV>{_br3$sV=kicV=6VU^YWr(5FVAGby~(;VpRa7db4+>}#sNUo z&M;)^C)vN7N`s?NA6x*P3vQC?gSRP&uxIOiGtr3DVozwhKUDuL>o6{KH*3HkCf~}Z(+6{m@gfuh6!Gj57Y+=8S$Dgx4WIlj5?5P{_97TML9?KSJ zhm}-w=Z6vFo~ToqCk!Dflw)lSXBY&Cx`l!v6f0dYSuo*X{zr>oB$3Y5`F*xJkO{l956K7;hP=fF}td;@D0HC3!w=R<~&SxGL z>vY)Z2oX_cRUCUb@y19(n_ay|*#odALM6I7W4lxxT$b)cJgRT4i-#S6k8eyxnlp^s&rXA|$nUKODKkoQxbXBz;d3xF(} zZaTWg*?`OJ{}=@TC9bZqU)^(Fhg(F%-<4U2wj4u0RQH@s8y7=)Z@gNLYdh4!B@z!&tr%P)h_603_kk zDI$KY_n!|n@U-+Fo6FD5b4L{WxKWO8o?f7dnETN%fMpvq2tu_KM*atTI$Trs+$0y6^-RjgEQSGvI5WutK7^xEKCoV@=)3Q z^31Hk2oVt7n%FmHW2|QgBBB*U0?;_d@>KxoE-9P0MC4&Va{qRRCE5Ncv01PW;Z@cg7M0S5~@Gj<4>C yZD2|l3t#02FHeuxYj7y@^$kQQl(ZYsJpX@=R*P~J(2>0W0000{fXtE!5GfLY10+Pkk02o-<~I;P00Bq@ zNPrL-0U`loA;27m@AlQ*!Lh!+8k*GFgMUwWNs zt<(4A>wL{*pPisl5H&5kh4&pZ3!#zaxe^dIdZjzkciTOI$Lk(n(Mp~%*=m5RESBHC z>2D94QJ~;02bOvzYO;8qL3(&W+c@v3joY<0}X6p8d z2r}|uOXRx9=4Un@)R-<@LNjn7wk}Drx>{L&30|Loue}I9{0}(ZfY!pcmYw0g@w#lf z`y?kXThPLum55%YP#ST_*vQw$2PzP-@?*UO&YlNex&gZI6nOs;;M*^O|Nj);M)ROf zQdb~1m5q^ybbm-{38{$|u2@&}&gu4-Z-TDA0PM^`&s_&@z9SGyIP6*l`C>({gYe|N z_rq241hm$w&qSD9dKs2@;g0UYe*YD)JQjs2)CvOb&TnG1#LwG4++knf%fj8r@~+aO zVH&9dQLtWtPwoM`XMn|tC>7Yx>?aR0)I7{~N~L(})i31{14#aax_=h<>yF+xYq85{ z92du$CnVu8Rl_o;7?5)e{eDpy5EAen%(;u$NUV=;y^e=J{v3->KLLLD8oQUS0CQ2? z>;NGgtA!$#6$AsqeXF1_E+;2tIwu31A6UwluYrI5343pU5R-8J${X+(FTs8H1?WU7 zM5@9(c@g;KN6_xRCK*?)m#bpnqCaEJZGIfEPc+kZ$8H~>BKtTdk^ zNxp~Vu$jeYy7D}l>o;H|L20>+T|1O5)?U{t-IwV(|F)_8q?2;cm35lXh=Ks$!9(o~ z{`X(O-+U%LN8&x33nQg&N#K745iuyN{z0~NDS2FnfMTl-eGC>`)QNAsR%VLiq{Z^? zZEXHIls(iXnHC7#iRb`~1UL?tvS2{&a9RAneWVt(*AW_yoG$qQt> zJ*8lzADDnh>~0esx0xtKPG0-8M$3@Z;YJiS^JaRuh{@!J2Bed*XB?G@Slp)!hy>SX z+Frg;Qu9!i3+0~D09)umF2nLNg#xNP$;-r@Lj!!8SDIpf3D8W(jjjAa4g{j1ZW1!o z^@x%udcx{W>2(O9*KCKcLKknO6H$M z9|_G!XuC2DmbV4`hDMtV?~u+CE$i97O)A#!2%kK5)dA%S!?-peY@7w*MrL>4&vY)4 zU>(iY+<9IiEe_Bo9Z30d2^mgCav#+;GP52o6wdL5pPuPvls+>2u>Kp;MiXQh@V7^S}d$u7MOhccrY~beaAYIFGtERK;C9#(rK8L#1b_6-2v`Go4TPUA*aKB yQ@~UkuuD4qSRQ&mO9RV#q0000LzzK4<36ee~YG(6*3@MV=xQ+Dc1G3k3v8fe?OxMv-Vp{2`Hq#6LugKM;u~ z#s`vUOh{A+B4CIJSW%>whowLfXlW>Y(06-ZGj|?m@Adh8Ykh0)wfCGea~^x`Gp9W{ zb7syxYpw77UPyoP9)ejPgaE?=Xte-bU*Y$V?!jx(O5xVS^;Jl_7(e)EbYvTFYXGp5 z@%zNPVH$+_SFAV0ucU?8ui zTX^RViE{x8-KHpK&J<2b2`okkSUr4^r(KJ=4M%*gVd=ngU}&HW@Gg0O-NAc40ziG? zjnL{2|Dc?S32=i-Y^8BriKJpV1!DAEP_T4c8ToTrlWx6P_QmUqB&0#<#Z(vY#(7l$ z#bOC+H9!fV`goNz8mbFO*zH8M?ANQ-}OzR=+WNI@*^7^O%`0|DVm zHU!<_OH2=NCvhypn-ZRD9#sgQ5u9DLI1%KF$`EA4IDMH~Oa_}Q*a1ncbM)f2k8{mL zm{=L82w5jYna_VX{f9z{D^@wvK&_lQX322)oVjwF60H-RYb58Q3Fq1mXo>a}?0}WB zdcQaUEc7j^FR3M#AdMREhi5f_`ILxQ;9O#OIyZNob0yrD>}8c|Rfvlcz@lP=)IA9n zdP;fO;7aTSo)aM`e;b+c=fW9jV6Sz6W4|4CxZ9V+#KETq(iCY2oJd&NFSHkF(Z49gLEmpsSahk1tM){l# z3}+UGb-uVO5k;wFGd7(7@YXrj*7-PT>yT(Ya-GY>h&2J(R3pFry#WCgkok2x^D2M| z9D~H6DXAb@hr-Xng~RA~@gA&4E{e@jV)edpwgB(kc47xCrUGye&ZIfMXFpYHHA?5W zQjy6BqJUfz0XpWG0Njyqo~gK~LVSZ;Tbp5Gaxn-Y1~bc{O!b{OjyNh}t@louzKXjW zKBGY}M-;LT-oJxEPOWn;Lj}Y@lbDHcCd?5yX(Iu~i0Xjo0lyyE@tkC_Ar>W8fMpB0 zv=7&|MQEFNM5_%7ALp0}R#WKqK$t3BuzhYhvk(PyyTn?Y@h1c<%qH(e(iLVm(f6tX zf*2C&9Ly+|Dgr9}A#&po>kgeoB0C0_aItXXHY0m0ueoGTsX`NsfxU35ZkO0M9lBk6 z8w$F&uwCJN_dAt73=?sK9YKiAC7;>M-5#B*TGPKIb-PHzB<}h;LR=p+N#v3ks=&^NGVV@p`lw> zD-erFY`4HQz&(>9^Th(F{}hxC)}ut$3=djF1>HB@>P4e14Mrx4i}UqL%|+ z`&usnF1iHp#y5fexzPa)uD zG#>+F+*ye@Zf1`AX^o?r$F^BjQN@ZVJ!)qd#2Sf$?X8D?En{k#Wa;q^X$n62}~3Aq`wz1vAqSN5)O|XZk;r61d!Pp z>6xudunI+Z;P5yVIw_oL!{0-Y#%pr247e3`?=Jlrz?a^@B2~)B81Y-19{H$WR&c=O znwtP$_8R~Dl~us?GeDpHC}5U5+W@l6FBH5E6KCsE!CT+~k;FL|c7QXwjRfD!WGNUk zs;C7~XJV8e;eWS2V2v&m5p=kS28k@~;_y}=WfA~_p%+O5GU$!E?Q~`^jAt(p3{J9IB2DHNl;wlqR&R)Yd|2!B(;b-f8-=u}28W0*32d6+JE4>H@oPG_b+gLI^|7r$0OON5ICn9kj4-I@w zVa4{tl_k`9crtJx9#%cEd5mBI?RuteU?;!}Wm`&-jBH#z0`Lph0X*$84*Z;|xqH^f z=7zTuiglpJf8xJ~?Fvr-vCWa%4hX5}1K@c^I_rm~{s`*OBePdyIX zAN>$}09!2bhAjG&h^z)_`r^vqdOFYJ02qRnYD$>1NZLU39rHi^4=%-1e zr(AQt{Zy{{{QKxe1;oCnRYDL*iT}^Knl!lsgIQaf$#J^N8Mv=>;ka7bU~tJ=ar#t! zgPMbI5`fI|I)=g-EkrSZ2{n?vsDQXHFg8pAqMS#t<_*DF*OQ#U+0#H996&mLL6hqm zeF>4To=WFJs7bWTwF9UHcbq>Tl6OkMiX69}V3UciW}S^k&hybcG3ur@0wr9`E@1wW z>%p=SY47~HHzeba1a08lvn+k{sCWXaJybx?Lkx4Ay+b#U0ORAQ*Ks#R2rBJ0JUVpeG(-uVC0#f@%m-D>0JjS&fjPCigAN6`+{= zXaA18JC3Q;c-Ryhi>mQ9pjzhkxvnLAAu9TJHrz zuquv7%XUuU411C|Q`lUKsDSPzK-}Mk-d~Zb9%TJ(If*m+#7CG29`kv9TNMh9;k42h zfk+O4vwztOf00G*mRA9dgF~ID$!vNF5JJMC6N#260pjT;bMB*i8vtUUpflQxB!iy$ zT(Eb23%362Gcfomet+Z`yLA_;Z{OO3{BGqC2ae9d=3l)J4qg3f$ga8(>@A;i!6h`N zUI(L!9Yb1PkZNENRBQRQ?ex8ZX{^##sod=6HQlNt+HILKGV`l%a>y?4`7RVsJ__sq z_HlqOeiGomyM1p!TdZ;HA5K028y|WPY=89@D8Ku4Fq~P;ZnznUL(5JrP{aYj6Uf!R z2tgyj8c1CVx~dq3cAvX9^-oPnNb^NQv-e;3{P%at9uf)6wan|(I^gBchU~5HV)4BV z+kf{*9M#)|;>=U9&BTBl;?0DkpK*oick2p3i*J4f*8lk3P~80;FvpH_Am|hf`0wWW zHvpYv8{+;Sy1cEen6nIO)7?G`w8{?lN{obC5v zoU6G0;XiPx#FMJBX$I|(ro%QV`C><#Y%WaF*)#9zbc zmVb89Kq(Cu*HCniD-)OCP(G+a#<0o+!bD;3{T_4vNmopYM~^|tq2Qfc{}l$0J_try z$u55$&?D>_tR8k!1}^(qmn?!GeIMx7&jE1q2(Ne{z|HRj`uJY}N+K!?J#`Dt7YfA~ zLt5@AS&HnO8TtWR5}+$m1nv0YR|dAZ_Vs|Tek<6oei4dKa~_|KKFjLCFy{+0&9M`Z zzw*tH@n;-jgcw}aPXUL2`~6V<@GYDLybCPH59nb=CKD7fr;qNw1G1mo1Lhe&2l#YW z9Y>A>JkA{cy>9|N#-DxQJ~kdj?E9)?y!w?a8Lk5Q@@D~#p2wY-U9iXe-rTH%UmM}te^G?pExooKQod^3^;kqgkzW( z%yX{oUAPeV;n-0MTvrKp9jR~4Y4S5lz5cCRa60r;F3vCn@8*#G&0ujFO! z8~n!aLB=9q5Km{G^m&48QhB%=k5NmvZ6=m2Rx6xS7`*#Wq4?Mbfo}h@>nWs>)!>j1 zC`nGhm2OEX`uQAdkk35!paREF8F8Oy@4@vfOp*j`LaNX`Q)p1qN?>FJ#xf-Whd{?Hsk+guzX}4%s!Y`l%ls6QgC-FH?e+#{lK@jvTgcmFzD3*}GV|r% zuJmifuiGWieQcpKjxLggJzcK~$?rALg)y*is3jhzSFm zaG$t0+CAp36A2La1`5K(=N(X8LL!^p6fw&m9ce=dzuE`y1#`!(klpllz*oH0>-kwr z!S|H};^Hw^KjYb8ZoC=nXaAm!&J(@}RebbJ&3uDRLn*`n!p{rN+OK-^vM?aCB_&IR zQ$vnmtzt3{Pv4l!FkYo5VFZ;@s7fiZsYtZkPziGnzdVTQmW=^HGE*(i=iOJu zxv+O}=p?!iUPQb<)EgX>IK;qouZJSS(0T+%7$g6Aj0;3@Hv6JEA7DVf@gayPVcbn| z%b=NO57R!Pl%y-wcGbTIcJBQqtUPuVGvKx9{9^$Y2Z!+DO95YSH4u9oC_y2~MGTmKbzQhIgQ!++tN)6wvJO zZmiS%rI!G!Dt^?8#&hVny{dm3H;6E{JmbtYg3L&1#ft^bd1o{=Ap@U{46|Cc{5^f|HQ&;iJyzLkS4EDJ57> zkwdKLpvepii2oQd*?jtUlIO86;l=-^P=*yEFsec_wcB#7Tw0AJR^jb7P`e_>4gJS9 znu(7vWzS)&9!(;1lIXeY3UB<4Mv(SFKHPic1jhq7GWgg-jP%?yh*4>PP3U0|3yVfT zm7-iyDDQv(7LppC;Hy&g(o1lx?25=e6~Z_K)u`PZHphr~nhyA}#Pb@!=kr~{MdJHX z`-i3#p=yNQJvWNPHbr-PkJ7?~g%KQTP9;z}Qx?P-{F=oTmH)f1rL?=OJE zyvq%{5{t}uu9R%6$QS32TUWf{BZe(5r)hLDMiRjLcn?s5nB(g!%^t%h|S(wP91 z5WFN%2~ijQ%;;v$!Tq6GH1$=6bLR0F8^*5M#RVk5Kq`Og{8y z1co0LmH^Zt@&jcSExj=A_Ma}fB-Z_rYbI&oq!&D3i{RROfP`xr*j;VBw9X)C;M!Nc z_8AnRF=cIWvLxlyuu28=C~+EuzSx@Gs{nbFi&14KlE_XHn+XwvJxPEdX)P@5=5{Lq zDg$gW-?S4Bi4oCPI5;XiPJKQyvE*5V06H8NUQ2)jFhfsgI3?%)Nko?V{06G3;)5Xp zAOiTZCuq_bk=)hyPT>BkZ*U%@;6Cps!Fs0?3DBVmXj`VVWCEC$8z+6X(K85DzhL7T z&b;cogqmY=C#*w}s-OsF@#~mN#T%~%77hZb1n3Uv6pN*$U#heZasis9)m1}=p2LJf z%Sf`}9{NAbuiSyj{d^G;X&h491RQzEC4_-Rj-C6p71#+|Z+! zwK%#BcvnKL%@*UhvpqFT%jxmd3}>GtVT|sxD)CmLj8qyO23O6E7Me|_I2%E9bYDOO z=%Qmo2&dreaOk{7EFA-1{v2~~jNFlORp2rUlP2Fzr>|)YK}{>2VnUkGFjQ6Y2IR|o z=?+@a&lJ8{)k&bDr8@TLFz)WY07n2=7fE)d|LvH=$U3>UN#!kWrbtW*k~e5PlE)!* z#=g3yy%A06ShVSM(mI8z1657O{qwp5ChlL@oiP_Vp|GxQhW z9$XzHN;sf<#fl3m;*bMwgSJ*jPXWX#fAHLx!<#7#z*!MS@u-$WDlW{u98lf+S16%x zQY{6YWMG0g4nA45O-c;AiL5&b5IC@$GBg=`3$X~7iE%mBoE>vDBikLcY;p7$?j?*S zh)+@@UD+MgEFnspeT+x(m(g1BdL!lj4ebUJCRkNwxAHZ&83s>(bR~JwRmS~Kao@7B+Klk8^jvJSo@?lipPf|A+*#&3$0~;b0&=G-? z3i5loqIripasxw)w8hm;yGw?cH01&(YkF+&+6q74{S`hM1Vsv z1(n4x3u<8CjYvA~`v<#|02py=WSE4XYn?5~w%W1`yW`mii;L{aD5L%)K;_&g&OYjV zt*KRQn;?YQPJ)|tOoyi>fN_N!F^7w;Swl}<5FtF~?qH451n%xiKgZt{SL&qB&&Mh! z#dD$B1ymtNEwjp0lnni=n-F@`TcWtFI;Tj)-P7vhm=pWR&$malr&=eA z+*+LTdm_TECBR-TSc{!!JT84V6(7|YEW-2=a zy!SNfZk@cUX&<2H@L{CGMT~Ee(-mH%Q_~U+6qxG|We<1vP0caXeN=Kk4A~ymleq^) zcW};~I}qG5Hwun?5FuFUu!jzhC4kdQwEQe!8zH?B9MtuBsU%JC07l)d<3ho>VIAVD zB*G-WdqP2k%Ul((+}ksDAq0I`xle_2PV9`qj_0xng4WL4s zmhHjv>}x$z)f^-(Kqs)y7dF_`XvBj0v-J1n6qqe9(S`U=yUNEVC4ei`2r+^s-=^NsmA0on zkspKO*0PC=;2>$+YONayuxKo?+sIUBz$$v$Q&=zDNM_Qk;X=T1tfixKEw@17HA#=^Vp&PYL%Gcj=~bgX1-fW?kVR7=h%0>{F9;FmeF8Cufsbf0JlZ zq73V$bc2(xfpfZnVL)NfOBU*s@iKKkY0Y8S6DD5IDhx_U;|4d@pag5syb=JaQZN^o zI0z}=uqOf5Ru6fJfD5^=M{J-J9zbJ_G+xI1MxfD~C`R^R5J0pi-05*oIdmSK+x5sI zqVD?gwYe!X+>=ur5cf~GW1xE*^;8KQTGE8zQU!ptu@w`YX+8;Du47hJ#rHVwdzi6EZ~&>=Ea=_TA7xqDr&j@ast$6b>+DE`biL@A)?JmtvDH2zl2 z@o!AypfOj(@4?A&wQ+ba^^=?Jp0y6SpY-<7%E-h6AOV8qARfRdO1F(0mRQ}9tChtv zL0n(!sT|`jb!q~k{&@li$Tki|ow);OP2-4e8Jk2v!H%eA2t>mnN{W7`#ikks#m%yr zcHZlv=XshqxFvPMya6Rhihg!y34f1~DcR38t)kvEzV@(e5lVYj;jFU< zsAd$$Xqd*!$oHLw(H7%Yb)WHE=bJ?oXn-|`jL65X17ONA$Q=g|+y_c+4wLm(jH)E- zy%WUAghSyFqw?}n z*Ac`pvEh@2u8F(UoePs^sFysO<}GGw)cN*zsy&y+gtbWjm+9^!$j8pvMKAt9rcA7A z-$1xRp2fb?duRCdbh&#LUjxB37hY$!M|h8T#-`8zs|s|Du%#l-M7lX3l$sr5m6{1E zQm36b*cxmO!4Se2Y4_Et)>=qjBbE@@H33xD$D^m#Rjf;pU86|E;l^*=5dlzrPyaF= zvcDsGU*Klh&%FSF;5N$Lq1nBROjQSNoK5_B6B)>AJCPW)hegt6fa{hef954^z(J_M z8oTan)grk+knvO3nM>rr@AlEs5%csA;$cg{-YozcD!AePc1q_@*}u^ zuq6Gj1rmY`JYCdr_|$72GEVwAHJQ@(30X#Aw2)<_eY~l*@hP9*q1xaKQ%0TY@U{gV z&1M`ECqNizpr=S&Zne)o=tS)1&eKBRbI_mRNSfO zVP@Hx6DJ`9xQvIh!qK~7CyRb4(5mPcwR*Np@A8VO8LI9sIv#KkPe-?2b<3i4GeeVu11Lo>`?*)H7Ljz_&imlU!NjdL+sv@ zJ*_Fvp=#xx>KgYi3rFwsR{@|nF5MFW(0Q42W$^J)`f{&0$i%J_J~8rVP90^`%w`Se ceoF2BAFF)(DaPK+a{vGU07*qoM6N<$f=L|??EnA( literal 0 HcmV?d00001 diff --git a/apps/web/resources/tray/30x30.png b/apps/web/resources/tray/30x30.png new file mode 100644 index 0000000000000000000000000000000000000000..e05c5d9026caf9fac7c232ea6c4c558e37c98119 GIT binary patch literal 1232 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 yQ@~UkuuD4qSRQ&mO9RV#q0000 { + app.exit(0); + }, 1000); + }, + }, + ], + }, + { + label: "编辑", + submenu: [ + { + role: "undo", + label: "撤销", + }, + { + role: "redo", + label: "重做", + }, + { + type: "separator", + }, + { + role: "cut", + label: "剪切", + }, + { + role: "copy", + label: "复制", + }, + { + role: "paste", + label: "粘贴", + }, + { + role: "pasteAndMatchStyle", + label: "粘贴并匹配样式", + }, + { + role: "delete", + label: "删除", + }, + { + role: "selectAll", + label: "全选", + }, + ], + }, + { + label: "显示", + submenu: [ + { + label: isFullScreen ? "全屏" : "退出全屏", + accelerator: "Shift+Cmd+F", + click() { + isFullScreen = !isFullScreen; + + mainWindow.show(); + mainWindow.setFullScreen(isFullScreen); + }, + }, + { + label: "切换会话", + accelerator: "Shift+Cmd+M", + click() { + mainWindow.show(); + mainWindow.webContents.send("show-conversations"); + }, + }, + { + type: "separator", + }, + { + type: "separator", + }, + { + role: "toggleDevTools", + label: "切换开发者工具", + }, + { + role: "togglefullscreen", + label: "切换全屏", + }, + ], + }, + { + label: "窗口", + role: "window", + submenu: [ + { + label: "最小化", + role: "minimize", + }, + { + label: "关闭窗口", + role: "close", + }, + ], + }, + { + label: "帮助", + role: "help", + submenu: [ + { + type: "separator", + }, + { + role: "reload", + label: "刷新", + }, + { + role: "forceReload", + label: "强制刷新", + }, + ], + }, +]; + +let trayMenu: Electron.MenuItemConstructorOptions[] = [ + { + label: "显示窗口", + click() { + let isVisible = mainWindow.isVisible(); + isVisible ? mainWindow.hide() : mainWindow.show(); + }, + }, + { + type: "separator", + }, + { + label: "退出", + accelerator: "Command+Q", + click() { + forceQuit = true; + mainWindow = null; + setTimeout(() => { + app.exit(0); + }, 1000); + }, + }, +]; + +function updateTray(unread = 0): any { + settings.showOnTray = true; + + // linux 系统不支持 tray + if (process.platform === "linux") { + return; + } + + if (settings.showOnTray) { + let contextmenu = Menu.buildFromTemplate(trayMenu); + + if (!trayIcon) { + trayIcon = getNoMessageTrayIcon(); + } + + setTimeout(() => { + if (!tray) { + // Init tray icon + tray = new Tray(trayIcon); + if (process.platform === "linux") { + tray.setContextMenu(contextmenu); + } + + tray.on("right-click", () => { + tray.popUpContextMenu(contextmenu); + }); + + tray.on("click", () => { + mainWindow.show(); + }); + } + + if (isOsx) { + tray.setTitle(unread > 0 ? " " + unread : ""); + } + + tray.setImage(trayIcon); + }); + } else { + if (!tray) return; + tray.destroy(); + tray = null; + } +} + +function createMenu() { + var menu = Menu.buildFromTemplate(mainMenu); + + if (isOsx) { + Menu.setApplicationMenu(menu); + } else { + mainWindow.setMenu(null); + } +} + +function regShortcut() { + globalShortcut.register("CommandOrControl+shift+a", () => { + isMainWindowFocusedWhenStartScreenshot = mainWindow.isFocused(); + console.log( + "isMainWindowFocusedWhenStartScreenshot", + mainWindow.isFocused() + ); + screenshots.startCapture(); + }); + + globalShortcut.register("esc", () => { + if (screenshots.$win?.isFocused()) { + screenshots.endCapture(); + } + }); + + // 打开所有窗口控制台 + globalShortcut.register("ctrl+shift+i", () => { + let windows = BrowserWindow.getAllWindows(); + windows.forEach((win: any) => win.openDevTools()); + }); +} + +const createMainWindow = async () => { + const NODE_ENV = process.env.NODE_ENV; + const { width, height } = screen.getPrimaryDisplay().workAreaSize; + mainWindow = new BrowserWindow({ + width: 960, + height: 600, + minWidth: 960, + minHeight: 600, + // frame: true, // * app边框(包括关闭,全屏,最小化按钮的导航栏) @false: 隐藏 + // titleBarStyle: "hidden", + // transparent: true, // * app 背景透明 + hasShadow: false, // * app 边框阴影 + show: false, // 启动窗口时隐藏,直到渲染进程加载完成「ready-to-show 监听事件」 再显示窗口,防止加载时闪烁 + resizable: true, // 禁止手动修改窗口尺寸 + webPreferences: { + // 加载脚本 + preload: join(__dirname, "..", "preload/index"), + nodeIntegration: true, + }, + // frame: !isWin, + }); + mainWindow.center(); + mainWindow.once("ready-to-show", () => { + mainWindow.show(); // 显示窗口 + mainWindow.focus(); + }); + + mainWindow.on("close", (e: any) => { + if (forceQuit || !tray) { + mainWindow = null; + } else { + e.preventDefault(); + if (mainWindow.isFullScreen()) { + mainWindow.setFullScreen(false); + mainWindow.once("leave-full-screen", () => mainWindow.hide()); + } else { + mainWindow.hide(); + } + } + }); + if (NODE_ENV === "development") mainWindow.loadURL("http://localhost:3000"); + if (NODE_ENV !== "development") { + process.env.DIST_ELECTRON = join(__dirname, "../"); + const WEB_URL = join(process.env.DIST_ELECTRON, "../build/index.html"); + mainWindow.loadFile(WEB_URL); + } + + ipcMain.on("screenshots-start", (event, args) => { + console.log("main voip-message event", args); + screenShotWindowId = event.sender.id; + screenshots.startCapture(); + }); + + createMenu(); +}; + +function onDeepLink(url: string) { + console.log("onOpenDeepLink", url); + mainWindow.webContents.send("deep-link", url); +} + +app.setName(TSDD_FONFIG.name); +isDevelopment && app.dock && app.dock.setIcon(logo); +app.on("open-url", (event, url) => { + onDeepLink(url); +}); + +// 单例模式启动 +const gotTheLock = app.requestSingleInstanceLock(); +if (!gotTheLock) { + app.quit(); +} else { + app.on("second-instance", (event, argv) => { + if (mainWindow) { + mainWindow.show(); + if (mainWindow.isMinimized()) { + mainWindow.restore(); + } + mainWindow.focus(); + } + }); +} app.on("ready", () => { - // 设置app菜单 - // Menu.setApplicationMenu(createAppMenu()); - createWindow(); // 创建窗口 - // 通常在 macOS 上,当点击 dock 中的应用程序图标时,如果没有其他打开的窗口,那么程序会重新创建一个窗口。 - app.on( - "activate", - () => BrowserWindow.getAllWindows().length === 0 && createWindow() - ); + regShortcut(); + createMainWindow(); // 创建窗口 + + screenshots = new Screenshots({ + singleWindow: true, + }); + + const onScreenShotEnd = (result?: any) => { + console.log( + "onScreenShotEnd", + isMainWindowFocusedWhenStartScreenshot, + screenShotWindowId + ); + if (isMainWindowFocusedWhenStartScreenshot) { + if (result) { + mainWindow.webContents.send("screenshots-ok", result); + } + mainWindow.show(); + isMainWindowFocusedWhenStartScreenshot = false; + } else if (screenShotWindowId) { + let windows = BrowserWindow.getAllWindows(); + let tms = windows.filter( + (win) => win.webContents.id === screenShotWindowId + ); + if (tms.length > 0) { + if (result) { + tms[0].webContents.send("screenshots-ok", result); + } + tms[0].show(); + } + screenShotWindowId = 0; + } + }; + + // 点击确定按钮回调事件 + screenshots.on("ok", (e, buffer, bounds) => { + let filename = tmp.tmpNameSync() + '.png'; + let image = NativeImage.createFromBuffer(buffer); + fs.writeFileSync(filename, image.toPNG()); + + console.log("screenshots ok", e); + onScreenShotEnd({ filePath: filename }); + }); + + // 点击取消按钮回调事件 + screenshots.on("cancel", (e: any) => { + // 执行了preventDefault + // 点击取消不会关闭截图窗口 + // e.preventDefault() + // console.log('capture', 'cancel2') + console.log("screenshots cancel", e); + onScreenShotEnd(); + }); + // 点击保存按钮回调事件 + screenshots.on("save", (e, { viewer }) => { + console.log("screenshots save", e); + onScreenShotEnd(); + }); + + try { + updateTray(); + } catch (e) { + // do nothing + console.log("==updateTray==", e); + } +}); + +app.on("activate", () => { + if (!mainWindow) { + return createMainWindow(); + } + + if (!mainWindow.isVisible()) { + mainWindow.show(); + } +}); + +app.on("before-quit", () => { + forceQuit = true; + + if (!tray) return; + + tray.destroy(); + tray = null; }); // 除了 macOS 外,当所有窗口都被关闭的时候退出程序。 macOS窗口全部关闭时,dock中程序不会退出 app.on("window-all-closed", () => { process.platform !== "darwin" && app.quit(); -}); +}); \ No newline at end of file diff --git a/apps/web/src-election/main/logo.ts b/apps/web/src-election/main/logo.ts new file mode 100644 index 0000000..315c762 --- /dev/null +++ b/apps/web/src-election/main/logo.ts @@ -0,0 +1,16 @@ +import path from "path"; +import { app, screen } from "electron"; + +export default path.join(app.getAppPath(), "./resources/logo.png"); + +export function getNoMessageTrayIcon () { + if (process.platform === 'darwin') { + return path.join(app.getAppPath(), './resources/tray/30x30.png') + } else if (process.platform === 'win32') { + return path.join(app.getAppPath(), './resources/tray/128x128.png') + } else if (screen.getPrimaryDisplay().scaleFactor > 1) { + return path.join(app.getAppPath(), './resources/tray/128x128.png') + } else { + return path.join(app.getAppPath(), './resources/tray/128x128.png') + } +} \ No newline at end of file diff --git a/apps/web/src-election/preload/index.ts b/apps/web/src-election/preload/index.ts index 6e6f8a6..61694a0 100644 --- a/apps/web/src-election/preload/index.ts +++ b/apps/web/src-election/preload/index.ts @@ -1,3 +1,21 @@ import { contextBridge, ipcRenderer } from "electron"; -contextBridge.exposeInMainWorld("__POWERED_ELECTRON__", true); \ No newline at end of file +contextBridge.exposeInMainWorld("__POWERED_ELECTRON__", true); + +contextBridge.exposeInMainWorld("ipc", { + send: (channel: string, ...args: any[]) => ipcRenderer.send(channel, ...args), + invoke: (channel: string, ...args: any[]): Promise => + ipcRenderer.invoke(channel, ...args), + on: ( + channel: string, + listener: (event: Electron.IpcRendererEvent, ...args: any[]) => void + ) => { + ipcRenderer.on(channel, listener); + }, + once: ( + channel: string, + listener: (event: Electron.IpcRendererEvent, ...args: any[]) => void + ) => { + ipcRenderer.once(channel, listener); + }, +}); \ No newline at end of file diff --git a/package.json b/package.json index 78989dc..22e33ab 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,15 @@ ], "resolutions": { "//": "See https://github.com/facebook/create-react-app/issues/11773", - "react-error-overlay": "6.0.9" + "react-error-overlay": "6.0.11" }, "scripts": { + "bootstrap": "yarn install", "dev": "turbo run dev --parallel", "dev-ele": "turbo run dev-ele --parallel", "build": "turbo run build", "build-ele": "turbo run build-ele", + "clean": "turbo run clean && rimraf node_modules", "lint": "turbo run lint", "format": "prettier --write \"**/*.{ts,tsx,md}\"" }, @@ -20,8 +22,8 @@ "eslint": "^7.32.0", "eslint-config-custom": "*", "prettier": "^2.5.1", + "rimraf": "^5.0.5", "turbo": "latest" }, - "dependencies": {}, "version": "0.0.0" } diff --git a/packages/eslint-config-custom/index.js b/packages/eslint-config-custom/index.js index e65ff9c..5fcecf6 100644 --- a/packages/eslint-config-custom/index.js +++ b/packages/eslint-config-custom/index.js @@ -3,6 +3,7 @@ module.exports = { rules: { "@next/next/no-html-link-for-pages": "off", "react/jsx-key": "off", - "@next/next/no-img-element": "off" + "@next/next/no-img-element": "off", + "no-template-curly-in-string": "off" }, }; diff --git a/packages/eslint-config-custom/package.json b/packages/eslint-config-custom/package.json index a9ad596..3e2d85b 100644 --- a/packages/eslint-config-custom/package.json +++ b/packages/eslint-config-custom/package.json @@ -3,6 +3,9 @@ "version": "0.0.0", "main": "index.js", "license": "MIT", + "scripts": { + "clean": "rimraf node_modules out-election" + }, "dependencies": { "@typescript-eslint/parser": "^6.16.0", "eslint-config-next": "^12.0.8", diff --git a/packages/tsdaodaobase/package.json b/packages/tsdaodaobase/package.json index 024d36a..806b3d5 100644 --- a/packages/tsdaodaobase/package.json +++ b/packages/tsdaodaobase/package.json @@ -13,8 +13,9 @@ "axios": "^0.25.0", "benz-amr-recorder": "^1.1.3", "classnames": "^2.3.1", + "electron-log": "^5.1.1", + "electron-screenshots": "^0.5.26", "hotkeys-js": "^3.8.7", - "wukongimjssdk": "^1.1.2", "moment": "^2.29.3", "qrcode.react": "^1.0.1", "react": "^17.0.2", @@ -22,7 +23,8 @@ "react-mentions": "^4.3.1", "react-scroll": "^1.8.4", "react-spinners": "^0.11.0", - "react-viewer": "^3.2.2" + "react-viewer": "^3.2.2", + "wukongimjssdk": "^1.2.7" }, "devDependencies": { "@types/react-avatar-editor": "^13.0.0", diff --git a/turbo.json b/turbo.json index fdad91d..523f715 100644 --- a/turbo.json +++ b/turbo.json @@ -17,6 +17,9 @@ }, "lint": { "outputs": [] + }, + "clean": { + "dependsOn": ["^clean"] } } } diff --git a/yarn.lock b/yarn.lock index f22532f..d052da0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6104,10 +6104,10 @@ electron-builder@^24.9.1: simple-update-notifier "2.0.0" yargs "^17.6.2" -electron-log@^5.0.1: - version "5.0.2" - resolved "https://registry.npmmirror.com/electron-log/-/electron-log-5.0.2.tgz#6dae26cb7fce9feaa4605d575e02fee75da7b085" - integrity sha512-uzUXpUGZ5lJeCEIn4Hrxt6zQWiURu+EbFyTul0Y81huc6UrvWXIOMx4WxNdaGJYWPk9YLWrz2dQf3894MoZKXw== +electron-log@^5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/electron-log/-/electron-log-5.1.1.tgz#3341c0265339c6c8285a91840cb7c872008103d6" + integrity sha512-If7HU4Slbh2xfjOXOLxifkbgu6HmWDNJyXPLW+XNTOHMfFKisg0trA3d/7syyu25S+lHosfsd0VMfDSjGn1+Pw== electron-publish@24.8.1: version "24.8.1" @@ -6122,6 +6122,16 @@ electron-publish@24.8.1: lazy-val "^1.0.5" mime "^2.5.2" +electron-screenshots@^0.5.26: + version "0.5.26" + resolved "https://registry.npmmirror.com/electron-screenshots/-/electron-screenshots-0.5.26.tgz#d5e14cf11271adbd0e7f961cbe926c139d87a5d2" + integrity sha512-btr1S8arUt+rqVjgiY4+hdi9DQJGCYHG9x0A3n3rrJvCaet7XnRRnEULXDLtY86CZHeg7JsQzeMdQ4Lj2Bu8lQ== + dependencies: + debug "^4.3.4" + fs-extra "^11.1.1" + node-screenshots "^0.1.9" + react-screenshots "^0.5.22" + electron-to-chromium@^1.4.251: version "1.4.255" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.255.tgz#dc52d1095b876ed8acf25865db10265b02b1d6e1" @@ -7208,6 +7218,15 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.1.1: + version "11.2.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -7386,7 +7405,7 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^10.3.10: +glob@^10.3.10, glob@^10.3.7: version "10.3.10" resolved "https://registry.npmmirror.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== @@ -9561,6 +9580,60 @@ node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-screenshots-darwin-arm64@0.1.9: + version "0.1.9" + resolved "https://registry.npmmirror.com/node-screenshots-darwin-arm64/-/node-screenshots-darwin-arm64-0.1.9.tgz#4413a62570eb662cb259fffcca504ab3cef2a0e5" + integrity sha512-zDhuui2hsgUA5FyL1wQQ9c2lPbvqmJzi45g7J+sxEmDDvRjmVv+92wTuiWuERiVAIkpjN2h+f2IR3HtOgHJHXw== + +node-screenshots-darwin-universal@0.1.9: + version "0.1.9" + resolved "https://registry.npmmirror.com/node-screenshots-darwin-universal/-/node-screenshots-darwin-universal-0.1.9.tgz#2d0a5e9cf40dfca5ac9f734c816715db350e7ab5" + integrity sha512-4SbvokC/GvOTzYDQzcFa39c02mxWzvhIRT72J9ys82HcKgmeWWbVih2atLUvFONQrSnMt+pxrCUBqFiJVawcyQ== + +node-screenshots-darwin-x64@0.1.9: + version "0.1.9" + resolved "https://registry.npmmirror.com/node-screenshots-darwin-x64/-/node-screenshots-darwin-x64-0.1.9.tgz#9883cfd35f5753913f05183dd653708977964717" + integrity sha512-/+VYlLVbsoYYmV/by+oPZY7aUfwF02dyl0rWUxM+xaGn80o55zht05B4UaIN8vcuBByunsGv2gybECT6Gk74PA== + +node-screenshots-linux-x64-gnu@0.1.9: + version "0.1.9" + resolved "https://registry.npmmirror.com/node-screenshots-linux-x64-gnu/-/node-screenshots-linux-x64-gnu-0.1.9.tgz#21368912ce5234b428bcfb539f3140664130e0f1" + integrity sha512-n7uTdNJCMqJ3tEMRq0wAOsq8qiK8cbOV+fqDgaQnlFLY+5PTxH67r09r41CJdWwX5sGeDsKHguosh7ZcGte+TA== + +node-screenshots-linux-x64-musl@0.1.9: + version "0.1.9" + resolved "https://registry.npmmirror.com/node-screenshots-linux-x64-musl/-/node-screenshots-linux-x64-musl-0.1.9.tgz#9eddb506a82f62ccbdf450d1b5ece2d414c1c718" + integrity sha512-zOIv5rIpL+ndWH0XWLrJOIELxh4P96WcE1omaql2oeWleS4EGwb0VqVJLhjadiMm1YROq8nvp8Vxz850nw5XPQ== + +node-screenshots-win32-arm64-msvc@0.1.9: + version "0.1.9" + resolved "https://registry.npmmirror.com/node-screenshots-win32-arm64-msvc/-/node-screenshots-win32-arm64-msvc-0.1.9.tgz#c165c10230362cb5cdf3a106bc730965ef1b0382" + integrity sha512-wBw6SsRSKcLMyM3zTx38rzPJ1l5MjDvveWbacpkSkOXmlMMknhDr7wOsDM/VvbBV9RnEid6+AJ25gXc35HJrcA== + +node-screenshots-win32-ia32-msvc@0.1.9: + version "0.1.9" + resolved "https://registry.npmmirror.com/node-screenshots-win32-ia32-msvc/-/node-screenshots-win32-ia32-msvc-0.1.9.tgz#5cfc18e4a667d350c52d019be0493908b5e844de" + integrity sha512-uZW5gbKV6Hrmk2tafoAyHnn48cJ0LWRsSh8HQjiOjyeYd2E29ubPczhlt7NhAxr7ZUCzDeOigEZYm+VV2HCTrg== + +node-screenshots-win32-x64-msvc@0.1.9: + version "0.1.9" + resolved "https://registry.npmmirror.com/node-screenshots-win32-x64-msvc/-/node-screenshots-win32-x64-msvc-0.1.9.tgz#faacca9a952eef00ec51b061c62896d507958811" + integrity sha512-9HR/YaYwAImHeuptFtnQuP4/JI9OxfcqQlLiK1XgYwH18eTnv49ukG09MbDAiHvXXWYxQK3Q5w2H7da7FCoCWA== + +node-screenshots@^0.1.9: + version "0.1.9" + resolved "https://registry.npmmirror.com/node-screenshots/-/node-screenshots-0.1.9.tgz#c6a17657def4dd12ffaa9fe9832ae0154d571196" + integrity sha512-9f6yV/e7LU0KWkOJAQNR6GTEtnbnSaZKf9ukkF1VDJk0qj3aIcedQqYtd92IdEK8chVg+YbMfSuchlhq8iHI0Q== + optionalDependencies: + node-screenshots-darwin-arm64 "0.1.9" + node-screenshots-darwin-universal "0.1.9" + node-screenshots-darwin-x64 "0.1.9" + node-screenshots-linux-x64-gnu "0.1.9" + node-screenshots-linux-x64-musl "0.1.9" + node-screenshots-win32-arm64-msvc "0.1.9" + node-screenshots-win32-ia32-msvc "0.1.9" + node-screenshots-win32-x64-msvc "0.1.9" + normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -10929,10 +11002,10 @@ react-draggable@^4.0.3: clsx "^1.1.1" prop-types "^15.8.1" -react-error-overlay@6.0.9, react-error-overlay@^6.0.11: - version "6.0.9" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" - integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.npmmirror.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.4: version "16.13.1" @@ -10982,6 +11055,11 @@ react-resizable@^3.0.5: prop-types "15.x" react-draggable "^4.0.3" +react-screenshots@^0.5.22: + version "0.5.22" + resolved "https://registry.npmmirror.com/react-screenshots/-/react-screenshots-0.5.22.tgz#2d974189d2d2df74388a4a19482fd1c956641837" + integrity sha512-aooIlb1k6161BTqhhyADlMrlF0n1UdudjuhyvXaCQfwURXZNuUerMxFuOfwNCgSbPAHlxdHCWtYQ6iQT+RaF+w== + react-scripts@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-5.0.0.tgz#6547a6d7f8b64364ef95273767466cc577cb4b60" @@ -11425,6 +11503,13 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +rimraf@^5.0.5: + version "5.0.5" + resolved "https://registry.npmmirror.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" + integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== + dependencies: + glob "^10.3.7" + roarr@^2.15.3: version "2.15.4" resolved "https://registry.npmmirror.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" @@ -13565,10 +13650,10 @@ ws@^8.13.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.1.tgz#4b9586b4f70f9e6534c7bb1d3dc0baa8b8cf01e0" integrity sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A== -wukongimjssdk@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wukongimjssdk/-/wukongimjssdk-1.1.2.tgz#d1f781a1c5d4fb32217bba939b7000e09d04bf22" - integrity sha512-x1xAnn17jHZshZnt53eiccMOffYIaIy+6CHH9NWS6p2aefJibX3LfHODrQWQJkoJ4ppGtfGfuqukkYgwTIqxiw== +wukongimjssdk@^1.2.7: + version "1.2.7" + resolved "https://registry.npmmirror.com/wukongimjssdk/-/wukongimjssdk-1.2.7.tgz#db9af096efff467d6d1766c5ea50f16fe386662c" + integrity sha512-Okx+hTDLhMSDCicA2od9VBvSlfzNLtxMw4drbqaUx31hp09G5LSgthhWz9rfJl8AbmljhwPGo28B9bOZGjAgkw== dependencies: "@types/bignumber.js" "^5.0.0" "@types/crypto-js" "^4.0.2" From 48bae77b278f7ef9ecd88241c03e205e3b385376 Mon Sep 17 00:00:00 2001 From: wanglihui <1769794040@qq.com> Date: Sat, 9 Mar 2024 17:59:40 +0800 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=A5=BD?= =?UTF-8?q?=E5=8F=8B=E7=94=B3=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/src/App/index.tsx | 126 +++++++++------ packages/tsdaodaobase/src/App.tsx | 75 +++++---- .../tsdaodaocontacts/src/NewFriend/index.tsx | 136 ++++++++++------ .../tsdaodaocontacts/src/NewFriend/vm.tsx | 96 +++++++++--- packages/tsdaodaocontacts/src/module.tsx | 146 ++++++++++++------ 5 files changed, 379 insertions(+), 200 deletions(-) diff --git a/apps/web/src/App/index.tsx b/apps/web/src/App/index.tsx index 08db5b6..8c3e67d 100644 --- a/apps/web/src/App/index.tsx +++ b/apps/web/src/App/index.tsx @@ -1,60 +1,100 @@ -import { ChatPage, EndpointCategory, WKApp, Menus } from '@tsdaodao/base'; -import { ContactsList } from '@tsdaodao/contacts'; -import React from 'react'; -import './index.css'; -import AppLayout from '../Layout'; -import { WKSDK } from 'wukongimjssdk'; +import { ChatPage, EndpointCategory, WKApp, Menus } from "@tsdaodao/base"; +import { ContactsList } from "@tsdaodao/contacts"; +import React from "react"; +import "./index.css"; +import AppLayout from "../Layout"; +import { WKSDK } from "wukongimjssdk"; function App() { - registerMenus() - return ( - - ); + registerMenus(); + return ; } function registerMenus() { - WKSDK.shared().conversationManager.addConversationListener(() => { - WKApp.menus.refresh() - }) + WKApp.menus.refresh(); + }); - WKApp.endpointManager.setMethod("menus.friendapply.change", () => { - WKApp.menus.refresh() - }, { - category: EndpointCategory.friendApplyDataChange, - }) - - WKApp.menus.register("chat", (context) => { - const m = new Menus("chat", "/", "会话", - 会话, - 会话) - let badge = 0 - for (const conversation of WKSDK.shared().conversationManager.conversations) { - if (!conversation.channelInfo?.mute) { - badge += conversation.unread - } + WKApp.endpointManager.setMethod( + "menus.friendapply.change", + () => { + WKApp.menus.refresh(); + }, + { + category: EndpointCategory.friendApplyDataChange, } - m.badge = badge - return m - },1000) + ); - WKApp.menus.register("contacts", (param) => { - const m = new Menus("contacts", "/contacts", "通讯录", - 通讯录, - 通讯录) + WKApp.menus.register( + "chat", + (context) => { + const m = new Menus( + "chat", + "/", + "会话", + 会话, + ( + 会话 + ) + ); + let badge = 0; + for (const conversation of WKSDK.shared().conversationManager + .conversations) { + if (!conversation.channelInfo?.mute) { + badge += conversation.unread; + } + } + m.badge = badge; + return m; + }, + 1000 + ); - m.badge = WKApp.shared.getFriendApplysUnreadCount() - return m - },2000) + // 获取好友未申请添加数量 + let unreadCount = 0; + if (WKApp.loginInfo.isLogined()) { + WKApp.apiClient.get(`/user/reddot/friendApply`).then((res) => { + unreadCount = res.count; + WKApp.menus.refresh(); + }); + } + WKApp.menus.register( + "contacts", + (param) => { + const m = new Menus( + "contacts", + "/contacts", + "通讯录", + ( + 通讯录 + ), + ( + 通讯录 + ) + ); + + m.badge = unreadCount; + return m; + }, + 2000 + ); WKApp.route.register("/", () => { - return - }) + return ; + }); WKApp.route.register("/contacts", () => { - return - }) + return ; + }); } export default App; - diff --git a/packages/tsdaodaobase/src/App.tsx b/packages/tsdaodaobase/src/App.tsx index f994d0b..52c0b3b 100644 --- a/packages/tsdaodaobase/src/App.tsx +++ b/packages/tsdaodaobase/src/App.tsx @@ -457,9 +457,9 @@ export default class WKApp extends ProviderListener { for (const friendApplyObj of friendApplyObjs) { const f = new FriendApply() f.uid = friendApplyObj.uid - f.name = friendApplyObj.name + f.to_name = friendApplyObj.to_name f.remark = friendApplyObj.remark - f.state = friendApplyObj.state + f.status = friendApplyObj.status f.token = friendApplyObj.token f.unread = friendApplyObj.unread f.createdAt = friendApplyObj.createdAt @@ -472,35 +472,41 @@ export default class WKApp extends ProviderListener { return friendApplys } - public getFriendApplysUnreadCount() { - const friendApplys = this.getFriendApplys() + public async getFriendApplysUnreadCount() { + // const friendApplys = this.getFriendApplys() let unreadCount = 0 - if (friendApplys && friendApplys.length > 0) { - for (const friendApply of friendApplys) { - if (friendApply.unread) { - unreadCount++ - } - } - } + // if (friendApplys && friendApplys.length > 0) { + // for (const friendApply of friendApplys) { + // if (friendApply.unread) { + // unreadCount++ + // } + // } + // } + if (!WKApp.loginInfo.isLogined()) { + return unreadCount; + } + const res = await WKApp.apiClient.get(`/user/reddot/friendApply`); + unreadCount = res.count; return unreadCount } - public friendApplyMarkAllReaded() { - let friendApplys = this.getFriendApplys() - if (!friendApplys) { - friendApplys = new Array() - } - var change = false - for (const friendApply of friendApplys) { - if (friendApply.unread) { - friendApply.unread = false - change = true - } - } - if (change) { - WKApp.loginInfo.setStorageItem(this.getFriendApplysKey(), JSON.stringify(friendApplys)) - WKApp.endpointManager.invokes(EndpointCategory.friendApplyDataChange) - } + public async friendApplyMarkAllReaded(): Promise { + // let friendApplys = this.getFriendApplys() + // if (!friendApplys) { + // friendApplys = new Array() + // } + // var change = false + // for (const friendApply of friendApplys) { + // if (friendApply.unread) { + // friendApply.unread = false + // change = true + // } + // } + // if (change) { + // WKApp.loginInfo.setStorageItem(this.getFriendApplysKey(), JSON.stringify(friendApplys)) + // WKApp.endpointManager.invokes(EndpointCategory.friendApplyDataChange) + // } + await WKApp.apiClient.delete(`/user/reddot/friendApply`); } public addFriendApply(friendApply: FriendApply) { @@ -572,13 +578,14 @@ export enum FriendApplyState { } // 好友申请 export class FriendApply { - uid!: string - name!: string - remark?: string - token?: string - state!: FriendApplyState - unread: boolean = false // 是否未读 - createdAt!: number // 创建时间 + uid!: string; + to_uid!: string; + to_name!: string; + remark?: string; + token?: string; + status!: FriendApplyState; + unread: boolean = false; // 是否未读 + createdAt!: number; // 创建时间 } diff --git a/packages/tsdaodaocontacts/src/NewFriend/index.tsx b/packages/tsdaodaocontacts/src/NewFriend/index.tsx index 7d273bb..6d45cb8 100644 --- a/packages/tsdaodaocontacts/src/NewFriend/index.tsx +++ b/packages/tsdaodaocontacts/src/NewFriend/index.tsx @@ -1,58 +1,92 @@ -import { FriendApplyState, WKApp, WKViewQueueHeader, Provider } from "@tsdaodao/base"; +import { + FriendApplyState, + WKApp, + WKViewQueueHeader, + Provider, +} from "@tsdaodao/base"; import React from "react"; import { Component, ReactNode } from "react"; -import { Button } from '@douyinfe/semi-ui'; -import "./index.css" +import { Button } from "@douyinfe/semi-ui"; +import "./index.css"; import { NewFriendVM } from "./vm"; -import "./index.css" +import "./index.css"; import { FriendAdd } from "../FriendAdd"; export class NewFriend extends Component { - - render(): ReactNode { - return { - return new NewFriendVM() - }} render={(vm: NewFriendVM) => { - - return
- { - WKApp.routeLeft.pop() - }} action={
- -
}>
-
-
    - { - vm.friendApplys.map((f) => { - return
  • -
    - -
    -
    -
    - {f.name} -
    -
    - {f.remark} -
    -
    -
    - -
    -
  • - }) - } -
-
+ render(): ReactNode { + return ( + { + return new NewFriendVM(); + }} + render={(vm: NewFriendVM) => { + return ( +
+ { + WKApp.routeLeft.pop(); + }} + action={ +
+ +
+ } + >
+
+
    + {vm.friendApplys.map((f) => { + return ( +
  • +
    + +
    +
    +
    + {f.to_name} +
    +
    + {f.remark} +
    +
    +
    + +
    +
  • + ); + })} +
+
- }}> - -
- } -} \ No newline at end of file + ); + }} + > + ); + } +} diff --git a/packages/tsdaodaocontacts/src/NewFriend/vm.tsx b/packages/tsdaodaocontacts/src/NewFriend/vm.tsx index 76f0354..06b2503 100644 --- a/packages/tsdaodaocontacts/src/NewFriend/vm.tsx +++ b/packages/tsdaodaocontacts/src/NewFriend/vm.tsx @@ -1,33 +1,83 @@ +import { WKSDK, Message, CMDContent } from "wukongimjssdk"; import { FriendApplyState, WKApp, ProviderListener } from "@tsdaodao/base"; import { FriendApply } from "@tsdaodao/base"; - export class NewFriendVM extends ProviderListener { - friendApplys: FriendApply[] = [] - sureLoading:boolean = false - currentFriendApply?:FriendApply + friendApplys: FriendApply[] = []; + sureLoading: boolean = false; + currentFriendApply?: FriendApply; - didMount(): void { + async didMount(): Promise { + WKApp.shared.friendApplyMarkAllReaded(); - WKApp.shared.friendApplyMarkAllReaded() - - this.friendApplys = WKApp.shared.getFriendApplys() - this.notifyListener() + this.friendApplys = await this.getFriendApply(); + if (this.friendApplys.length === 0) { + this.clearFriendApply(); } + this.notifyListener(); + // 监听好友申请 + WKSDK.shared().chatManager.addCMDListener(this.friendRequestCMDListener); + } - friendSure(apply: FriendApply) { - this.sureLoading = true - this.currentFriendApply = apply - this.notifyListener() + didUnMount(): void { + // 监听好友申请 + WKSDK.shared().chatManager.removeCMDListener(this.friendRequestCMDListener); + } - WKApp.dataSource.commonDataSource.friendSure(apply.token || "").then(() => { - apply.state = FriendApplyState.accepted - WKApp.shared.updateFriendApply(apply) - this.sureLoading = false - this.notifyListener() - }).catch(() => { - this.sureLoading = false - this.notifyListener() - }) + friendSure(apply: FriendApply) { + this.sureLoading = true; + this.currentFriendApply = apply; + this.notifyListener(); + + WKApp.dataSource.commonDataSource + .friendSure(apply.token || "") + .then(() => { + apply.status = FriendApplyState.accepted; + WKApp.shared.updateFriendApply(apply); + this.sureLoading = false; + this.notifyListener(); + }) + .catch(() => { + this.sureLoading = false; + this.notifyListener(); + }); + } + + async getFriendApply(): Promise { + const fromData = { + page_index: 1, + page_size: 999, + }; + const res = await WKApp.apiClient.get("/friend/apply", { + param: fromData, + }); + + return res; + } + + async delFriendApply(apply: FriendApply): Promise { + WKApp.apiClient + .delete(`/friend/apply/${apply.to_uid}`) + .then(async () => { + this.friendApplys = await this.getFriendApply(); + this.sureLoading = false; + this.notifyListener(); + }) + .catch(() => { + this.sureLoading = false; + this.notifyListener(); + }); + } + + async clearFriendApply(): Promise { + await WKApp.apiClient.delete(`/user/reddot/friendApply`); + } + + public async friendRequestCMDListener(message: Message) { + console.log("收到CMD->", message); + const cmdContent = message.content as CMDContent; + if (cmdContent.cmd === "friendRequest") { + this.friendApplys = await this.getFriendApply(); } -} \ No newline at end of file + } +} diff --git a/packages/tsdaodaocontacts/src/module.tsx b/packages/tsdaodaocontacts/src/module.tsx index a047af0..38944c2 100644 --- a/packages/tsdaodaocontacts/src/module.tsx +++ b/packages/tsdaodaocontacts/src/module.tsx @@ -1,57 +1,105 @@ -import { EndpointCategory, IconListItem, IModule, WKApp, ThemeMode } from "@tsdaodao/base" -import React from "react" -import Blacklist from "./Blacklist" -import { FriendAdd } from "./FriendAdd" -import GroupSave from "./GroupSave" -import { NewFriend } from "./NewFriend" -import { ContactsListManager } from "./Service/ContactsListManager" - +import { + EndpointCategory, + IconListItem, + IModule, + WKApp, + ThemeMode, +} from "@tsdaodao/base"; +import React from "react"; +import Blacklist from "./Blacklist"; +import { FriendAdd } from "./FriendAdd"; +import GroupSave from "./GroupSave"; +import { NewFriend } from "./NewFriend"; +import { ContactsListManager } from "./Service/ContactsListManager"; export default class ContactsModule implements IModule { + id(): string { + return "ContactsModule"; + } + init(): void { + console.log("【ContactsModule】初始化"); - id(): string { - return "ContactsModule" + WKApp.endpointManager.setMethod( + "contacts.friendapply.change", + () => { + ContactsListManager.shared.refreshList(); + }, + { + category: EndpointCategory.friendApplyDataChange, + } + ); + + // 获取好友未申请添加数量 + let unreadCount = 0; + if (WKApp.loginInfo.isLogined()) { + WKApp.apiClient.get(`/user/reddot/friendApply`).then((res) => { + unreadCount = res.count; + WKApp.menus.refresh(); + }); } - init(): void { - console.log("【ContactsModule】初始化") + WKApp.endpoints.registerContactsHeader("friends.new", (param: any) => { + return ( + { + WKApp.routeLeft.push(); + }} + > + ); + }); - WKApp.endpointManager.setMethod("contacts.friendapply.change", () => { - ContactsListManager.shared.refreshList() - }, { - category: EndpointCategory.friendApplyDataChange, - }) + WKApp.endpoints.registerContactsHeader("groups.save", (param: any) => { + return ( + { + WKApp.routeLeft.push(); + }} + > + ); + }); - WKApp.endpoints.registerContactsHeader("friends.new", (param: any) => { - return { - WKApp.routeLeft.push() - }} > - }) + WKApp.endpoints.registerContactsHeader( + "contacts.blacklist", + (param: any) => { + return ( + { + WKApp.routeLeft.push(); + }} + > + ); + } + ); - WKApp.endpoints.registerContactsHeader("groups.save", (param: any) => { - return { - WKApp.routeLeft.push() - }}> - }) - - WKApp.endpoints.registerContactsHeader("contacts.blacklist", (param: any) => { - return { - WKApp.routeLeft.push() - }}> - }) - - WKApp.shared.chatMenusRegister("chatmenus.addfriend",(param)=>{ - const isDark = WKApp.config.themeMode === ThemeMode.dark - return { - title: "添加朋友", - icon: require(`${isDark?"./assets/popmenus_friendadd_dark.png":"./assets/popmenus_friendadd.png"}`), - onClick:()=>{ - WKApp.routeLeft.push({ - WKApp.routeLeft.pop() - }}>) - } - } - }) - - } -} \ No newline at end of file + WKApp.shared.chatMenusRegister("chatmenus.addfriend", (param) => { + const isDark = WKApp.config.themeMode === ThemeMode.dark; + return { + title: "添加朋友", + icon: require(`${ + isDark + ? "./assets/popmenus_friendadd_dark.png" + : "./assets/popmenus_friendadd.png" + }`), + onClick: () => { + WKApp.routeLeft.push( + { + WKApp.routeLeft.pop(); + }} + > + ); + }, + }; + }); + } +}