mirror of
https://github.com/Kuingsmile/PicList.git
synced 2025-03-13 08:28:13 -04:00
Merge branch 'dev' into release
This commit is contained in:
commit
6d2884f190
23
CHANGELOG.md
23
CHANGELOG.md
@ -1,3 +1,26 @@
|
|||||||
|
## :tada: 2.9.3 (2024-08-22)
|
||||||
|
|
||||||
|
|
||||||
|
### :sparkles: Features
|
||||||
|
|
||||||
|
* **custom:** add advanced picbed manual link ([26149ad](https://github.com/Kuingsmile/piclist/commit/26149ad))
|
||||||
|
* **custom:** remove some dev output ([a046b40](https://github.com/Kuingsmile/piclist/commit/a046b40))
|
||||||
|
* **custom:** support avif picture preview ([630eb03](https://github.com/Kuingsmile/piclist/commit/630eb03))
|
||||||
|
* **custom:** support secondary picbed upload ([8962a46](https://github.com/Kuingsmile/piclist/commit/8962a46)), closes [#226](https://github.com/Kuingsmile/piclist/issues/226)
|
||||||
|
|
||||||
|
|
||||||
|
### :bug: Bug Fixes
|
||||||
|
|
||||||
|
* **custom:** fix piclist picbed bugs ([893da24](https://github.com/Kuingsmile/piclist/commit/893da24)), closes [#236](https://github.com/Kuingsmile/piclist/issues/236)
|
||||||
|
* **custom:** fix type error ([6bf6d6b](https://github.com/Kuingsmile/piclist/commit/6bf6d6b))
|
||||||
|
|
||||||
|
|
||||||
|
### :pencil: Documentation
|
||||||
|
|
||||||
|
* **custom:** prepare for new version ([0007d9a](https://github.com/Kuingsmile/piclist/commit/0007d9a))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## :tada: 2.9.2 (2024-07-30)
|
## :tada: 2.9.2 (2024-07-30)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
### ✨ Features
|
### ✨ Features
|
||||||
|
|
||||||
- 新增高级自定义图床
|
- 新增第二图床上传支持
|
||||||
- 相册页面现在加载图片时会显示loading图
|
- 现在管理页面支持预览avif图片
|
||||||
- 优化了相册页面的加载速度
|
- 调整了图床配置页面的日期显示格式
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- 修复了PicList图床对core版的兼容性问题
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
### ✨ Features
|
### ✨ Features
|
||||||
|
|
||||||
- Add advanced custom image bed
|
- Added support for the second image bed upload
|
||||||
- The album page now displays a loading image when loading pictures
|
- Now the management page supports previewing avif images
|
||||||
- Optimized the loading speed of the album page
|
- Adjusted the date display format on the image bed configuration page
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- Fixed the compatibility issue of PicList image bed with the core version
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "piclist",
|
"name": "piclist",
|
||||||
"version": "2.9.2",
|
"version": "2.9.3",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Kuingsmile",
|
"name": "Kuingsmile",
|
||||||
"email": "pkukuing@gmail.com"
|
"email": "pkukuing@gmail.com"
|
||||||
@ -67,7 +67,7 @@
|
|||||||
"multer": "^1.4.5-lts.1",
|
"multer": "^1.4.5-lts.1",
|
||||||
"node-ssh-no-cpu-features": "^2.0.0",
|
"node-ssh-no-cpu-features": "^2.0.0",
|
||||||
"nodejs-file-downloader": "^4.12.1",
|
"nodejs-file-downloader": "^4.12.1",
|
||||||
"piclist": "^1.9.1",
|
"piclist": "^1.9.3",
|
||||||
"pinia": "^2.1.7",
|
"pinia": "^2.1.7",
|
||||||
"pinia-plugin-persistedstate": "^3.2.1",
|
"pinia-plugin-persistedstate": "^3.2.1",
|
||||||
"proxy-agent": "^5.0.0",
|
"proxy-agent": "^5.0.0",
|
||||||
@ -97,7 +97,7 @@
|
|||||||
"@types/lowdb": "^1.0.15",
|
"@types/lowdb": "^1.0.15",
|
||||||
"@types/mime-types": "^2.1.4",
|
"@types/mime-types": "^2.1.4",
|
||||||
"@types/multer": "^1.4.11",
|
"@types/multer": "^1.4.11",
|
||||||
"@types/node": "^16.10.2",
|
"@types/node": "^22.0.0",
|
||||||
"@types/semver": "^7.5.6",
|
"@types/semver": "^7.5.6",
|
||||||
"@types/tunnel": "^0.0.7",
|
"@types/tunnel": "^0.0.7",
|
||||||
"@types/upyun": "^3.4.3",
|
"@types/upyun": "^3.4.3",
|
||||||
|
@ -25,6 +25,7 @@ NO_MORE_NOTICE: No More Notice
|
|||||||
SHOW_DEVTOOLS: Show Devtools
|
SHOW_DEVTOOLS: Show Devtools
|
||||||
FEEDBACK: Feedback
|
FEEDBACK: Feedback
|
||||||
CURRENT_PICBED: Current Picbed
|
CURRENT_PICBED: Current Picbed
|
||||||
|
CURRENT_SECOND_PICBED: Current Second Picbed
|
||||||
START_WATCH_CLIPBOARD: Start Watch Clipboard
|
START_WATCH_CLIPBOARD: Start Watch Clipboard
|
||||||
STOP_WATCH_CLIPBOARD: Stop Watch Clipboard
|
STOP_WATCH_CLIPBOARD: Stop Watch Clipboard
|
||||||
OPEN_TOOLBOX: Open Toolbox
|
OPEN_TOOLBOX: Open Toolbox
|
||||||
@ -183,6 +184,8 @@ SETTINGS_TIMESTAMP_RENAME: Timestamp Rename
|
|||||||
SETTINGS_ADVANCED_RENAME: Advanced Rename
|
SETTINGS_ADVANCED_RENAME: Advanced Rename
|
||||||
SETTINGS_ADVANCED_RENAME_ENABLE: Enable Advanced Rename
|
SETTINGS_ADVANCED_RENAME_ENABLE: Enable Advanced Rename
|
||||||
SETTINGS_ADVANCED_RENAME_FORMAT: Advanced Rename Format
|
SETTINGS_ADVANCED_RENAME_FORMAT: Advanced Rename Format
|
||||||
|
SETTINGS_ENABLE_SECOND_PICBED: Enable Second Picbed
|
||||||
|
SETTINGS_SET_SECOND_PICBED: Set Second Picbed
|
||||||
SETTINGS_OPEN_UPLOAD_TIPS: Open Upload Tips
|
SETTINGS_OPEN_UPLOAD_TIPS: Open Upload Tips
|
||||||
SETTINGS_OPEN_UPLOAD_RESULT_TIPS: Open Upload Result Tips
|
SETTINGS_OPEN_UPLOAD_RESULT_TIPS: Open Upload Result Tips
|
||||||
SETTINGS_MINI_WINDOW_ON_TOP: Mini Window On Top
|
SETTINGS_MINI_WINDOW_ON_TOP: Mini Window On Top
|
||||||
|
@ -25,6 +25,7 @@ NO_MORE_NOTICE: 以后不再提醒
|
|||||||
SHOW_DEVTOOLS: 打开开发者工具
|
SHOW_DEVTOOLS: 打开开发者工具
|
||||||
FEEDBACK: 反馈问题
|
FEEDBACK: 反馈问题
|
||||||
CURRENT_PICBED: 当前图床
|
CURRENT_PICBED: 当前图床
|
||||||
|
CURRENT_SECOND_PICBED: 当前第二图床
|
||||||
START_WATCH_CLIPBOARD: 开始监听剪贴板
|
START_WATCH_CLIPBOARD: 开始监听剪贴板
|
||||||
STOP_WATCH_CLIPBOARD: 停止监听剪贴板
|
STOP_WATCH_CLIPBOARD: 停止监听剪贴板
|
||||||
OPEN_TOOLBOX: 打开修复工具箱
|
OPEN_TOOLBOX: 打开修复工具箱
|
||||||
@ -185,6 +186,8 @@ SETTINGS_TIMESTAMP_RENAME: 时间戳重命名
|
|||||||
SETTINGS_ADVANCED_RENAME: 高级重命名
|
SETTINGS_ADVANCED_RENAME: 高级重命名
|
||||||
SETTINGS_ADVANCED_RENAME_ENABLE: 开启高级重命名
|
SETTINGS_ADVANCED_RENAME_ENABLE: 开启高级重命名
|
||||||
SETTINGS_ADVANCED_RENAME_FORMAT: 重命名格式
|
SETTINGS_ADVANCED_RENAME_FORMAT: 重命名格式
|
||||||
|
SETTINGS_ENABLE_SECOND_PICBED: 启用第二图床同步上传
|
||||||
|
SETTINGS_SET_SECOND_PICBED: 设置第二图床
|
||||||
SETTINGS_OPEN_UPLOAD_TIPS: 开启上传进度提示
|
SETTINGS_OPEN_UPLOAD_TIPS: 开启上传进度提示
|
||||||
SETTINGS_OPEN_UPLOAD_RESULT_TIPS: 开启上传结果提示
|
SETTINGS_OPEN_UPLOAD_RESULT_TIPS: 开启上传结果提示
|
||||||
SETTINGS_MINI_WINDOW_ON_TOP: Mini窗口置顶
|
SETTINGS_MINI_WINDOW_ON_TOP: Mini窗口置顶
|
||||||
|
@ -25,6 +25,7 @@ NO_MORE_NOTICE: 以後不再提醒
|
|||||||
SHOW_DEVTOOLS: 開啟開發者工具
|
SHOW_DEVTOOLS: 開啟開發者工具
|
||||||
FEEDBACK: 問題反饋
|
FEEDBACK: 問題反饋
|
||||||
CURRENT_PICBED: 當前圖床
|
CURRENT_PICBED: 當前圖床
|
||||||
|
CURRENT_SECOND_PICBED: 當前第二圖床
|
||||||
START_WATCH_CLIPBOARD: 開始監聽剪貼簿
|
START_WATCH_CLIPBOARD: 開始監聽剪貼簿
|
||||||
STOP_WATCH_CLIPBOARD: 停止監聽剪貼簿
|
STOP_WATCH_CLIPBOARD: 停止監聽剪貼簿
|
||||||
OPEN_TOOLBOX: 開啟修復工具箱
|
OPEN_TOOLBOX: 開啟修復工具箱
|
||||||
@ -183,6 +184,8 @@ SETTINGS_TIMESTAMP_RENAME: 以時間戳命名
|
|||||||
SETTINGS_ADVANCED_RENAME: 高級命名
|
SETTINGS_ADVANCED_RENAME: 高級命名
|
||||||
SETTINGS_ADVANCED_RENAME_ENABLE: 啟用高級命名
|
SETTINGS_ADVANCED_RENAME_ENABLE: 啟用高級命名
|
||||||
SETTINGS_ADVANCED_RENAME_FORMAT: 高級命名格式
|
SETTINGS_ADVANCED_RENAME_FORMAT: 高級命名格式
|
||||||
|
SETTINGS_ENABLE_SECOND_PICBED: 啟用第二圖床同步上傳
|
||||||
|
SETTINGS_SET_SECOND_PICBED: 設定第二圖床
|
||||||
SETTINGS_OPEN_UPLOAD_TIPS: 開啟上傳提示
|
SETTINGS_OPEN_UPLOAD_TIPS: 開啟上傳提示
|
||||||
SETTINGS_OPEN_UPLOAD_RESULT_TIPS: 開啟上傳結果提示
|
SETTINGS_OPEN_UPLOAD_RESULT_TIPS: 開啟上傳結果提示
|
||||||
SETTINGS_MINI_WINDOW_ON_TOP: Mini視窗置頂
|
SETTINGS_MINI_WINDOW_ON_TOP: Mini視窗置頂
|
||||||
|
@ -16,7 +16,7 @@ import db, { GalleryDB } from '@core/datastore'
|
|||||||
import picgo from '@core/picgo'
|
import picgo from '@core/picgo'
|
||||||
|
|
||||||
import uploader from 'apis/app/uploader'
|
import uploader from 'apis/app/uploader'
|
||||||
import { uploadClipboardFiles } from 'apis/app/uploader/apis'
|
import { handleSecondaryUpload, uploadClipboardFiles } from 'apis/app/uploader/apis'
|
||||||
import windowManager from 'apis/app/window/windowManager'
|
import windowManager from 'apis/app/window/windowManager'
|
||||||
|
|
||||||
import { buildPicBedListMenu } from '~/events/remotes/menu'
|
import { buildPicBedListMenu } from '~/events/remotes/menu'
|
||||||
@ -309,6 +309,7 @@ export function createTray(tooltip: string) {
|
|||||||
const pasteStyle = db.get(configPaths.settings.pasteStyle) || IPasteStyle.MARKDOWN
|
const pasteStyle = db.get(configPaths.settings.pasteStyle) || IPasteStyle.MARKDOWN
|
||||||
const rawInput = cloneDeep(files)
|
const rawInput = cloneDeep(files)
|
||||||
const trayWindow = windowManager.get(IWindowList.TRAY_WINDOW)!
|
const trayWindow = windowManager.get(IWindowList.TRAY_WINDOW)!
|
||||||
|
await handleSecondaryUpload(trayWindow.webContents, files, 'tray')
|
||||||
const imgs = await uploader.setWebContents(trayWindow.webContents).upload(files)
|
const imgs = await uploader.setWebContents(trayWindow.webContents).upload(files)
|
||||||
const deleteLocalFile = db.get(configPaths.settings.deleteLocalFile) || false
|
const deleteLocalFile = db.get(configPaths.settings.deleteLocalFile) || false
|
||||||
if (imgs !== false) {
|
if (imgs !== false) {
|
||||||
|
@ -14,6 +14,7 @@ import pasteTemplate from '~/utils/pasteTemplate'
|
|||||||
|
|
||||||
import { IPasteStyle, IWindowList } from '#/types/enum'
|
import { IPasteStyle, IWindowList } from '#/types/enum'
|
||||||
import { configPaths } from '#/utils/configPaths'
|
import { configPaths } from '#/utils/configPaths'
|
||||||
|
import { changeCurrentUploader } from '~/utils/handleUploaderConfig'
|
||||||
|
|
||||||
const handleClipboardUploading = async (): Promise<false | ImgInfo[]> => {
|
const handleClipboardUploading = async (): Promise<false | ImgInfo[]> => {
|
||||||
const useBuiltinClipboard =
|
const useBuiltinClipboard =
|
||||||
@ -28,6 +29,7 @@ const handleClipboardUploading = async (): Promise<false | ImgInfo[]> => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const uploadClipboardFiles = async (): Promise<IStringKeyMap> => {
|
export const uploadClipboardFiles = async (): Promise<IStringKeyMap> => {
|
||||||
|
await handleSecondaryUpload(undefined, undefined, 'clipboard')
|
||||||
const img = await handleClipboardUploading()
|
const img = await handleClipboardUploading()
|
||||||
if (img !== false) {
|
if (img !== false) {
|
||||||
if (img.length > 0) {
|
if (img.length > 0) {
|
||||||
@ -84,6 +86,7 @@ export const uploadChoosedFiles = async (
|
|||||||
): Promise<IStringKeyMap[]> => {
|
): Promise<IStringKeyMap[]> => {
|
||||||
const input = files.map(item => item.path)
|
const input = files.map(item => item.path)
|
||||||
const rawInput = cloneDeep(input)
|
const rawInput = cloneDeep(input)
|
||||||
|
await handleSecondaryUpload(webContents, input)
|
||||||
const imgs = await uploader.setWebContents(webContents).upload(input)
|
const imgs = await uploader.setWebContents(webContents).upload(input)
|
||||||
const result = []
|
const result = []
|
||||||
if (imgs !== false) {
|
if (imgs !== false) {
|
||||||
@ -132,3 +135,65 @@ export const uploadChoosedFiles = async (
|
|||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const handleSecondaryUpload = async (
|
||||||
|
webContents?: WebContents,
|
||||||
|
input?: string[],
|
||||||
|
uploadType: 'clipboard' | 'file' | 'tray' = 'file'
|
||||||
|
): Promise<void> => {
|
||||||
|
const enableSecondUploader = db.get(configPaths.settings.enableSecondUploader) || false
|
||||||
|
let currentPicBedType = ''
|
||||||
|
let currentPicBedConfig = {} as IStringKeyMap
|
||||||
|
let currentPicBedConfigId = ''
|
||||||
|
let needRestore = false
|
||||||
|
if (enableSecondUploader) {
|
||||||
|
const secondUploader = db.get(configPaths.picBed.secondUploader)
|
||||||
|
const secondUploaderConfig = db.get(configPaths.picBed.secondUploaderConfig)
|
||||||
|
const secondUploaderId = db.get(configPaths.picBed.secondUploaderId)
|
||||||
|
const currentPicBed = db.get('picBed') || ({} as IStringKeyMap)
|
||||||
|
currentPicBedType = currentPicBed.uploader || currentPicBed.current || 'smms'
|
||||||
|
currentPicBedConfig = currentPicBed[currentPicBedType] || ({} as IStringKeyMap)
|
||||||
|
currentPicBedConfigId = currentPicBedConfig._id
|
||||||
|
if (
|
||||||
|
secondUploader === currentPicBedType &&
|
||||||
|
secondUploaderConfig._configName === currentPicBedConfig._configName &&
|
||||||
|
secondUploaderId === currentPicBedConfigId
|
||||||
|
) {
|
||||||
|
picgo.log.info('second uploader is the same as current uploader')
|
||||||
|
} else {
|
||||||
|
needRestore = true
|
||||||
|
let secondImgs: ImgInfo[] | false = false
|
||||||
|
changeCurrentUploader(secondUploader, secondUploaderConfig, secondUploaderId)
|
||||||
|
if (uploadType === 'clipboard') {
|
||||||
|
secondImgs = await handleClipboardUploading()
|
||||||
|
} else {
|
||||||
|
secondImgs = await uploader.setWebContents(webContents!).upload(input)
|
||||||
|
}
|
||||||
|
if (secondImgs !== false) {
|
||||||
|
const trayWindow = windowManager.get(IWindowList.TRAY_WINDOW)
|
||||||
|
if (uploadType === 'clipboard') {
|
||||||
|
if (secondImgs.length > 0) {
|
||||||
|
await GalleryDB.getInstance().insert(secondImgs[0])
|
||||||
|
trayWindow?.webContents?.send('clipboardFiles', [])
|
||||||
|
trayWindow?.webContents?.send('uploadFiles', secondImgs)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (let i = 0; i < secondImgs.length; i++) {
|
||||||
|
await GalleryDB.getInstance().insert(secondImgs[i])
|
||||||
|
}
|
||||||
|
if (uploadType === 'tray') {
|
||||||
|
trayWindow?.webContents?.send('dragFiles', secondImgs)
|
||||||
|
} else {
|
||||||
|
trayWindow?.webContents?.send('uploadFiles', secondImgs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (windowManager.has(IWindowList.SETTING_WINDOW) && uploadType !== 'tray') {
|
||||||
|
windowManager.get(IWindowList.SETTING_WINDOW)!.webContents?.send('updateGallery')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (needRestore) {
|
||||||
|
changeCurrentUploader(currentPicBedType, currentPicBedConfig, currentPicBedConfigId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -233,19 +233,9 @@ windowList.set(IWindowList.RENAME_WINDOW, {
|
|||||||
window.loadURL(handleWindowParams(RENAME_WINDOW_URL))
|
window.loadURL(handleWindowParams(RENAME_WINDOW_URL))
|
||||||
const currentWindow = windowManager.getAvailableWindow(true)
|
const currentWindow = windowManager.getAvailableWindow(true)
|
||||||
if (currentWindow && currentWindow.isVisible()) {
|
if (currentWindow && currentWindow.isVisible()) {
|
||||||
// bounds: { x: 821, y: 75, width: 800, height: 450 }
|
const { x, y, width, height } = currentWindow.getBounds()
|
||||||
const bounds = currentWindow.getBounds()
|
const positionX = Math.floor(x + width / 2 - 150)
|
||||||
let positionX = bounds.x + bounds.width / 2 - 150
|
const positionY = Math.floor(y + height / 2 - (height > 400 ? 88 : 0))
|
||||||
let positionY
|
|
||||||
// if is the settingWindow
|
|
||||||
if (bounds.height > 400) {
|
|
||||||
positionY = bounds.y + bounds.height / 2 - 88
|
|
||||||
} else {
|
|
||||||
// if is the miniWindow
|
|
||||||
positionY = bounds.y + bounds.height / 2
|
|
||||||
}
|
|
||||||
positionX = Math.floor(positionX)
|
|
||||||
positionY = Math.floor(positionY)
|
|
||||||
window.setPosition(positionX, positionY, false)
|
window.setPosition(positionX, positionY, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -259,16 +249,9 @@ windowList.set(IWindowList.TOOLBOX_WINDOW, {
|
|||||||
window.loadURL(TOOLBOX_WINDOW_URL)
|
window.loadURL(TOOLBOX_WINDOW_URL)
|
||||||
const currentWindow = windowManager.getAvailableWindow(true)
|
const currentWindow = windowManager.getAvailableWindow(true)
|
||||||
if (currentWindow && currentWindow.isVisible()) {
|
if (currentWindow && currentWindow.isVisible()) {
|
||||||
const bounds = currentWindow.getBounds()
|
const { x, y, width, height } = currentWindow.getBounds()
|
||||||
let positionX = bounds.x + bounds.width / 2 - 400
|
const positionX = Math.floor(x + width / 2 - 400)
|
||||||
let positionY
|
const positionY = Math.floor(y + height / 2 - (height > 400 ? 225 : 0))
|
||||||
if (bounds.height > 400) {
|
|
||||||
positionY = bounds.y + bounds.height / 2 - 225
|
|
||||||
} else {
|
|
||||||
positionY = bounds.y + bounds.height / 2
|
|
||||||
}
|
|
||||||
positionX = Math.floor(positionX)
|
|
||||||
positionY = Math.floor(positionY)
|
|
||||||
window.setPosition(positionX, positionY, false)
|
window.setPosition(positionX, positionY, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,36 +9,31 @@ class WindowManager implements IWindowManager {
|
|||||||
|
|
||||||
create(name: IWindowList) {
|
create(name: IWindowList) {
|
||||||
const windowConfig: IWindowListItem = windowList.get(name)!
|
const windowConfig: IWindowListItem = windowList.get(name)!
|
||||||
if (windowConfig.isValid) {
|
if (!windowConfig.isValid) return null
|
||||||
|
|
||||||
if (!windowConfig.multiple) {
|
if (!windowConfig.multiple) {
|
||||||
if (this.has(name)) return this.#windowMap.get(name)!
|
if (this.has(name)) return this.#windowMap.get(name)!
|
||||||
}
|
}
|
||||||
|
|
||||||
const window = new BrowserWindow(windowConfig.options())
|
const window = new BrowserWindow(windowConfig.options())
|
||||||
const id = window.id
|
const id = window.id
|
||||||
if (windowConfig.multiple) {
|
const windowName = windowConfig.multiple ? `${name}_${id}` : name
|
||||||
this.#windowMap.set(`${name}_${window.id}`, window)
|
|
||||||
this.#windowIdMap.set(window.id, `${name}_${window.id}`)
|
this.#windowMap.set(windowName, window)
|
||||||
} else {
|
this.#windowIdMap.set(id, windowName)
|
||||||
this.#windowMap.set(name, window)
|
|
||||||
this.#windowIdMap.set(window.id, name)
|
|
||||||
}
|
|
||||||
windowConfig.callback(window, this)
|
windowConfig.callback(window, this)
|
||||||
window.on('close', () => {
|
window.on('close', () => {
|
||||||
this.deleteById(id)
|
this.deleteById(id)
|
||||||
})
|
})
|
||||||
return window
|
return window
|
||||||
} else {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get(name: IWindowList) {
|
get(name: IWindowList) {
|
||||||
if (this.has(name)) {
|
if (this.has(name)) {
|
||||||
return this.#windowMap.get(name)!
|
return this.#windowMap.get(name)!
|
||||||
} else {
|
|
||||||
const window = this.create(name)
|
|
||||||
return window
|
|
||||||
}
|
}
|
||||||
|
return this.create(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
has(name: IWindowList) {
|
has(name: IWindowList) {
|
||||||
@ -57,11 +52,15 @@ class WindowManager implements IWindowManager {
|
|||||||
const miniWindow = this.#windowMap.get(IWindowList.MINI_WINDOW)
|
const miniWindow = this.#windowMap.get(IWindowList.MINI_WINDOW)
|
||||||
if (miniWindow && miniWindow.isVisible() && !isSkipMiniWindow) {
|
if (miniWindow && miniWindow.isVisible() && !isSkipMiniWindow) {
|
||||||
return miniWindow
|
return miniWindow
|
||||||
} else {
|
|
||||||
const settingWindow = this.#windowMap.get(IWindowList.SETTING_WINDOW)
|
|
||||||
const trayWindow = this.#windowMap.get(IWindowList.TRAY_WINDOW)
|
|
||||||
return settingWindow || trayWindow || this.create(IWindowList.SETTING_WINDOW)!
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const settingWindow = this.#windowMap.get(IWindowList.SETTING_WINDOW)
|
||||||
|
if (settingWindow) return settingWindow
|
||||||
|
|
||||||
|
const trayWindow = this.#windowMap.get(IWindowList.TRAY_WINDOW)
|
||||||
|
if (trayWindow) return trayWindow
|
||||||
|
|
||||||
|
return this.create(IWindowList.SETTING_WINDOW)!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ import pasteTemplate from '~/utils/pasteTemplate'
|
|||||||
import { SHOW_INPUT_BOX } from '#/events/constants'
|
import { SHOW_INPUT_BOX } from '#/events/constants'
|
||||||
import { IPasteStyle } from '#/types/enum'
|
import { IPasteStyle } from '#/types/enum'
|
||||||
import { configPaths } from '#/utils/configPaths'
|
import { configPaths } from '#/utils/configPaths'
|
||||||
|
import { handleSecondaryUpload } from '../app/uploader/apis'
|
||||||
|
|
||||||
// Cross-process support may be required in the future
|
// Cross-process support may be required in the future
|
||||||
class GuiApi implements IGuiApi {
|
class GuiApi implements IGuiApi {
|
||||||
@ -78,6 +79,7 @@ class GuiApi implements IGuiApi {
|
|||||||
this.windowId = await getWindowId()
|
this.windowId = await getWindowId()
|
||||||
const webContents = this.getWebcontentsByWindowId(this.windowId)
|
const webContents = this.getWebcontentsByWindowId(this.windowId)
|
||||||
const rawInput = cloneDeep(input)
|
const rawInput = cloneDeep(input)
|
||||||
|
await handleSecondaryUpload(webContents!, input)
|
||||||
const imgs = await uploader.setWebContents(webContents!).upload(input)
|
const imgs = await uploader.setWebContents(webContents!).upload(input)
|
||||||
if (imgs !== false) {
|
if (imgs !== false) {
|
||||||
const pasteStyle = db.get(configPaths.settings.pasteStyle) || IPasteStyle.MARKDOWN
|
const pasteStyle = db.get(configPaths.settings.pasteStyle) || IPasteStyle.MARKDOWN
|
||||||
|
@ -13,7 +13,7 @@ import { T } from '~/i18n'
|
|||||||
import clipboardPoll from '~/utils/clipboardPoll'
|
import clipboardPoll from '~/utils/clipboardPoll'
|
||||||
import { setTrayToolTip } from '~/utils/common'
|
import { setTrayToolTip } from '~/utils/common'
|
||||||
import getPicBeds from '~/utils/getPicBeds'
|
import getPicBeds from '~/utils/getPicBeds'
|
||||||
import { changeCurrentUploader } from '~/utils/handleUploaderConfig'
|
import { changeCurrentUploader, changeSecondUploader } from '~/utils/handleUploaderConfig'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
PICGO_CONFIG_PLUGIN,
|
PICGO_CONFIG_PLUGIN,
|
||||||
@ -139,6 +139,59 @@ const buildMainPageMenu = (win: BrowserWindow) => {
|
|||||||
return Menu.buildFromTemplate(template)
|
return Menu.buildFromTemplate(template)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const buildSecondPicBedMenu = () => {
|
||||||
|
const picBeds = getPicBeds()
|
||||||
|
const secondUploader = picgo.getConfig(configPaths.picBed.secondUploader)
|
||||||
|
const defaultSecondUploaderId = picgo.getConfig(configPaths.picBed.secondUploaderId)
|
||||||
|
const currentPicBedName = picBeds.find(item => item.type === secondUploader)?.name
|
||||||
|
const picBedConfigList = picgo.getConfig<IUploaderConfig>('uploader')
|
||||||
|
const currentPicBedMenuItem = [
|
||||||
|
{
|
||||||
|
label: `${T('CURRENT_SECOND_PICBED')} - ${currentPicBedName || 'None'}`,
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'separator'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
let submenu = picBeds
|
||||||
|
.filter(item => item.visible)
|
||||||
|
.map(item => {
|
||||||
|
const configList = picBedConfigList?.[item.type]?.configList
|
||||||
|
const hasSubmenu = !!configList
|
||||||
|
return {
|
||||||
|
label: item.name,
|
||||||
|
type: !hasSubmenu ? 'checkbox' : undefined,
|
||||||
|
checked: !hasSubmenu ? secondUploader === item.type : undefined,
|
||||||
|
submenu: hasSubmenu
|
||||||
|
? configList.map(config => {
|
||||||
|
return {
|
||||||
|
label: config._configName || 'Default',
|
||||||
|
// if only one config, use checkbox, or radio will checked as default
|
||||||
|
// see: https://github.com/electron/electron/issues/21292
|
||||||
|
type: 'checkbox',
|
||||||
|
checked: config._id === defaultSecondUploaderId && item.type === secondUploader,
|
||||||
|
click: function () {
|
||||||
|
changeSecondUploader(item.type, config, config._id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
: undefined,
|
||||||
|
click: !hasSubmenu
|
||||||
|
? function () {
|
||||||
|
picgo.saveConfig({
|
||||||
|
[configPaths.picBed.secondUploader]: item.type
|
||||||
|
})
|
||||||
|
}
|
||||||
|
: undefined
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// @ts-expect-error submenu type
|
||||||
|
submenu = currentPicBedMenuItem.concat(submenu)
|
||||||
|
// @ts-expect-error submenu type
|
||||||
|
return Menu.buildFromTemplate(submenu)
|
||||||
|
}
|
||||||
|
|
||||||
const buildPicBedListMenu = () => {
|
const buildPicBedListMenu = () => {
|
||||||
const picBeds = getPicBeds()
|
const picBeds = getPicBeds()
|
||||||
const currentPicBed = picgo.getConfig(configPaths.picBed.uploader)
|
const currentPicBed = picgo.getConfig(configPaths.picBed.uploader)
|
||||||
@ -339,4 +392,4 @@ const buildPluginPageMenu = (plugin: IPicGoPlugin) => {
|
|||||||
return Menu.buildFromTemplate(menu)
|
return Menu.buildFromTemplate(menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
export { buildMiniPageMenu, buildMainPageMenu, buildPicBedListMenu, buildPluginPageMenu }
|
export { buildMiniPageMenu, buildMainPageMenu, buildPicBedListMenu, buildPluginPageMenu, buildSecondPicBedMenu }
|
||||||
|
@ -15,17 +15,12 @@ import { manageRouter } from '~/events/rpc/routes/manage'
|
|||||||
import { IRPCActionType, IRPCType } from '#/types/enum'
|
import { IRPCActionType, IRPCType } from '#/types/enum'
|
||||||
import { RPC_ACTIONS, RPC_ACTIONS_INVOKE } from '#/events/constants'
|
import { RPC_ACTIONS, RPC_ACTIONS_INVOKE } from '#/events/constants'
|
||||||
|
|
||||||
const isDevelopment = process.env.NODE_ENV !== 'production'
|
|
||||||
|
|
||||||
class RPCServer implements IRPCServer {
|
class RPCServer implements IRPCServer {
|
||||||
private routes: IRPCRoutes = new Map()
|
private routes: IRPCRoutes = new Map()
|
||||||
private routesWithResponse: IRPCRoutes = new Map()
|
private routesWithResponse: IRPCRoutes = new Map()
|
||||||
|
|
||||||
private rpcEventHandler = async (event: IpcMainEvent, action: IRPCActionType, args: any[]) => {
|
private rpcEventHandler = async (event: IpcMainEvent, action: IRPCActionType, args: any[]) => {
|
||||||
try {
|
try {
|
||||||
if (isDevelopment) {
|
|
||||||
console.log(`action: ${action} args: ${JSON.stringify(args)}`)
|
|
||||||
}
|
|
||||||
const route = this.routes.get(action)
|
const route = this.routes.get(action)
|
||||||
await route?.handler?.(event, args)
|
await route?.handler?.(event, args)
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
@ -35,9 +30,6 @@ class RPCServer implements IRPCServer {
|
|||||||
|
|
||||||
private rpcEventHandlerWithResponse = async (event: IpcMainInvokeEvent, action: IRPCActionType, args: any[]) => {
|
private rpcEventHandlerWithResponse = async (event: IpcMainInvokeEvent, action: IRPCActionType, args: any[]) => {
|
||||||
try {
|
try {
|
||||||
if (isDevelopment) {
|
|
||||||
console.log(`action: ${action} args: ${JSON.stringify(args)}`)
|
|
||||||
}
|
|
||||||
const route = this.routesWithResponse.get(action)
|
const route = this.routesWithResponse.get(action)
|
||||||
return await route?.handler?.(event, args)
|
return await route?.handler?.(event, args)
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
|
@ -2,7 +2,13 @@ import { app, BrowserWindow } from 'electron'
|
|||||||
|
|
||||||
import windowManager from 'apis/app/window/windowManager'
|
import windowManager from 'apis/app/window/windowManager'
|
||||||
|
|
||||||
import { buildMainPageMenu, buildMiniPageMenu, buildPicBedListMenu, buildPluginPageMenu } from '~/events/remotes/menu'
|
import {
|
||||||
|
buildMainPageMenu,
|
||||||
|
buildMiniPageMenu,
|
||||||
|
buildPicBedListMenu,
|
||||||
|
buildPluginPageMenu,
|
||||||
|
buildSecondPicBedMenu
|
||||||
|
} from '~/events/remotes/menu'
|
||||||
import { openMiniWindow } from '~/utils/windowHelper'
|
import { openMiniWindow } from '~/utils/windowHelper'
|
||||||
|
|
||||||
import { IRPCActionType, IWindowList } from '#/types/enum'
|
import { IRPCActionType, IWindowList } from '#/types/enum'
|
||||||
@ -83,6 +89,16 @@ export default [
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
action: IRPCActionType.SHOW_SECOND_UPLOADER_MENU,
|
||||||
|
handler: async () => {
|
||||||
|
const window = windowManager.get(IWindowList.SETTING_WINDOW)!
|
||||||
|
const menu = buildSecondPicBedMenu()
|
||||||
|
menu.popup({
|
||||||
|
window
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
action: IRPCActionType.SHOW_PLUGIN_PAGE_MENU,
|
action: IRPCActionType.SHOW_PLUGIN_PAGE_MENU,
|
||||||
handler: async (_: IIPCEvent, args: [plugin: IPicGoPlugin]) => {
|
handler: async (_: IIPCEvent, args: [plugin: IPicGoPlugin]) => {
|
||||||
|
@ -56,6 +56,25 @@ export const getPicBedConfig = (type: string) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const changeSecondUploader = (type: string, config?: IStringKeyMap, id?: string) => {
|
||||||
|
if (!type) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (id) {
|
||||||
|
picgo.saveConfig({
|
||||||
|
[configPaths.picBed.secondUploaderId]: id
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if (config) {
|
||||||
|
picgo.saveConfig({
|
||||||
|
[configPaths.picBed.secondUploaderConfig]: config
|
||||||
|
})
|
||||||
|
}
|
||||||
|
picgo.saveConfig({
|
||||||
|
[configPaths.picBed.secondUploader]: type
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export const changeCurrentUploader = (type: string, config?: IStringKeyMap, id?: string) => {
|
export const changeCurrentUploader = (type: string, config?: IStringKeyMap, id?: string) => {
|
||||||
if (!type) {
|
if (!type) {
|
||||||
return
|
return
|
||||||
|
@ -6,6 +6,8 @@ export default class PiclistApi {
|
|||||||
static async delete(configMap: IStringKeyMap): Promise<boolean> {
|
static async delete(configMap: IStringKeyMap): Promise<boolean> {
|
||||||
const { config, fullResult } = configMap
|
const { config, fullResult } = configMap
|
||||||
const { host, port } = config
|
const { host, port } = config
|
||||||
|
if (!fullResult) return true
|
||||||
|
|
||||||
if (!host) {
|
if (!host) {
|
||||||
deleteLog(fullResult, 'Piclist', false, 'PiclistApi.delete: invalid params')
|
deleteLog(fullResult, 'Piclist', false, 'PiclistApi.delete: invalid params')
|
||||||
return false
|
return false
|
||||||
|
@ -1292,7 +1292,7 @@ const tableData = reactive([] as any[])
|
|||||||
const isShowUploadPanel = ref(false)
|
const isShowUploadPanel = ref(false)
|
||||||
const activeUpLoadTab = ref('uploading')
|
const activeUpLoadTab = ref('uploading')
|
||||||
const uploadTaskList = ref([] as IUploadTask[])
|
const uploadTaskList = ref([] as IUploadTask[])
|
||||||
const refreshUploadTaskId = ref<NodeJS.Timer | null>(null)
|
const refreshUploadTaskId = ref<NodeJS.Timeout | undefined>(undefined)
|
||||||
const uploadPanelFilesList = ref([] as any[])
|
const uploadPanelFilesList = ref([] as any[])
|
||||||
const cancelToken = ref('')
|
const cancelToken = ref('')
|
||||||
const isLoadingUploadPanelFiles = ref(false)
|
const isLoadingUploadPanelFiles = ref(false)
|
||||||
@ -1309,7 +1309,7 @@ const isLoadingDownloadData = ref(false)
|
|||||||
const activeDownLoadTab = ref('downloading')
|
const activeDownLoadTab = ref('downloading')
|
||||||
const currentDownloadFileList = reactive([] as any[])
|
const currentDownloadFileList = reactive([] as any[])
|
||||||
const downloadTaskList = ref([] as IDownloadTask[])
|
const downloadTaskList = ref([] as IDownloadTask[])
|
||||||
const refreshDownloadTaskId = ref<NodeJS.Timer | null>(null)
|
const refreshDownloadTaskId = ref<NodeJS.Timeout | undefined>(undefined)
|
||||||
const downloadCancelToken = ref('')
|
const downloadCancelToken = ref('')
|
||||||
const downloadingTaskList = computed(() =>
|
const downloadingTaskList = computed(() =>
|
||||||
downloadTaskList.value.filter(item => ['downloading', 'queuing', 'paused'].includes(item.status))
|
downloadTaskList.value.filter(item => ['downloading', 'queuing', 'paused'].includes(item.status))
|
||||||
@ -1365,8 +1365,8 @@ const batchRenameReplace = ref('')
|
|||||||
const isRenameIncludeExt = ref(false)
|
const isRenameIncludeExt = ref(false)
|
||||||
const isSingleRename = ref(false)
|
const isSingleRename = ref(false)
|
||||||
const itemToBeRenamed = ref({} as any)
|
const itemToBeRenamed = ref({} as any)
|
||||||
let fileTransferInterval: NodeJS.Timer | null = null
|
let fileTransferInterval: NodeJS.Timeout | undefined
|
||||||
let downloadInterval: NodeJS.Timer | null = null
|
let downloadInterval: NodeJS.Timeout | undefined
|
||||||
|
|
||||||
// 当前页面信息相关
|
// 当前页面信息相关
|
||||||
const currentPicBedName = computed<string>(() => manageStore.config.picBed[configMap.alias].picBedName)
|
const currentPicBedName = computed<string>(() => manageStore.config.picBed[configMap.alias].picBedName)
|
||||||
|
BIN
src/renderer/manage/pages/assets/icons/avif.webp
Normal file
BIN
src/renderer/manage/pages/assets/icons/avif.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.3 KiB |
@ -21,6 +21,7 @@ export const availableIconList = [
|
|||||||
'au',
|
'au',
|
||||||
'avc',
|
'avc',
|
||||||
'avi',
|
'avi',
|
||||||
|
'avif',
|
||||||
'avs',
|
'avs',
|
||||||
'bak',
|
'bak',
|
||||||
'bas',
|
'bas',
|
||||||
|
@ -215,6 +215,18 @@
|
|||||||
<el-option v-for="item in picBedGlobal" :key="item.type" :label="item.name" :value="item.type" />
|
<el-option v-for="item in picBedGlobal" :key="item.type" :label="item.name" :value="item.type" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item :label="$T('SETTINGS_ENABLE_SECOND_PICBED')">
|
||||||
|
<el-switch
|
||||||
|
v-model="formOfSetting.enableSecondUploader"
|
||||||
|
:active-text="$T('SETTINGS_OPEN')"
|
||||||
|
:inactive-text="$T('SETTINGS_CLOSE')"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$T('SETTINGS_SET_SECOND_PICBED')">
|
||||||
|
<el-button type="primary" round size="small" @click="handleChangeSecondPicBed">
|
||||||
|
{{ $T('SETTINGS_CLICK_TO_SET') }}
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
<el-form-item :label="$T('SETTINGS_SYNC_DELETE_CLOUD')">
|
<el-form-item :label="$T('SETTINGS_SYNC_DELETE_CLOUD')">
|
||||||
<el-switch
|
<el-switch
|
||||||
v-model="formOfSetting.deleteCloudFile"
|
v-model="formOfSetting.deleteCloudFile"
|
||||||
@ -1048,7 +1060,8 @@ const formOfSetting = ref<ISettingForm>({
|
|||||||
registry: '',
|
registry: '',
|
||||||
proxy: '',
|
proxy: '',
|
||||||
mainWindowWidth: 1200,
|
mainWindowWidth: 1200,
|
||||||
mainWindowHeight: 800
|
mainWindowHeight: 800,
|
||||||
|
enableSecondUploader: false
|
||||||
})
|
})
|
||||||
|
|
||||||
const proxy = ref('')
|
const proxy = ref('')
|
||||||
@ -1080,7 +1093,8 @@ const autoWatchKeys = [
|
|||||||
'proxy',
|
'proxy',
|
||||||
'autoCopy',
|
'autoCopy',
|
||||||
'encodeOutputURL',
|
'encodeOutputURL',
|
||||||
'useShortUrl'
|
'useShortUrl',
|
||||||
|
'enableSecondUploader'
|
||||||
]
|
]
|
||||||
|
|
||||||
const addWatch = () => {
|
const addWatch = () => {
|
||||||
@ -1259,6 +1273,10 @@ function initArray(arrayT: string | string[], defaultValue: string[]) {
|
|||||||
return arrayT
|
return arrayT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function handleChangeSecondPicBed() {
|
||||||
|
sendRPC(IRPCActionType.SHOW_SECOND_UPLOADER_MENU)
|
||||||
|
}
|
||||||
|
|
||||||
function openFile(file: string) {
|
function openFile(file: string) {
|
||||||
sendRPC(IRPCActionType.PICLIST_OPEN_FILE, file)
|
sendRPC(IRPCActionType.PICLIST_OPEN_FILE, file)
|
||||||
}
|
}
|
||||||
|
@ -80,13 +80,13 @@ import { saveConfig } from '@/utils/dataSender'
|
|||||||
import { T as $T } from '@/i18n/index'
|
import { T as $T } from '@/i18n/index'
|
||||||
import { useStore } from '@/hooks/useStore'
|
import { useStore } from '@/hooks/useStore'
|
||||||
import { PICBEDS_PAGE, UPLOADER_CONFIG_PAGE } from '@/router/config'
|
import { PICBEDS_PAGE, UPLOADER_CONFIG_PAGE } from '@/router/config'
|
||||||
|
import { sendRPC, triggerRPC } from '@/utils/common'
|
||||||
|
|
||||||
import { IRPCActionType } from '#/types/enum'
|
import { IRPCActionType } from '#/types/enum'
|
||||||
import { configPaths } from '#/utils/configPaths'
|
import { configPaths } from '#/utils/configPaths'
|
||||||
import { sendRPC, triggerRPC } from '@/utils/common'
|
|
||||||
|
|
||||||
const $router = useRouter()
|
const router = useRouter()
|
||||||
const $route = useRoute()
|
const route = useRoute()
|
||||||
|
|
||||||
const type = ref('')
|
const type = ref('')
|
||||||
const curConfigList = ref<IStringKeyMap[]>([])
|
const curConfigList = ref<IStringKeyMap[]>([])
|
||||||
@ -113,7 +113,7 @@ onBeforeRouteUpdate((to, _, next) => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
onBeforeMount(() => {
|
onBeforeMount(() => {
|
||||||
type.value = $route.params.type as string
|
type.value = route.params.type as string
|
||||||
getCurrentConfigList()
|
getCurrentConfigList()
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -124,7 +124,7 @@ async function getCurrentConfigList() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function openEditPage(configId: string) {
|
function openEditPage(configId: string) {
|
||||||
$router.push({
|
router.push({
|
||||||
name: PICBEDS_PAGE,
|
name: PICBEDS_PAGE,
|
||||||
params: {
|
params: {
|
||||||
type: type.value,
|
type: type.value,
|
||||||
@ -137,7 +137,7 @@ function openEditPage(configId: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function formatTime(time: number): string {
|
function formatTime(time: number): string {
|
||||||
return dayjs(time).format('YY/MM/DD HH:mm')
|
return dayjs(time).format('YY-MM-DD HH:mm')
|
||||||
}
|
}
|
||||||
|
|
||||||
async function deleteConfig(id: string) {
|
async function deleteConfig(id: string) {
|
||||||
@ -148,7 +148,7 @@ async function deleteConfig(id: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function addNewConfig() {
|
function addNewConfig() {
|
||||||
$router.push({
|
router.push({
|
||||||
name: PICBEDS_PAGE,
|
name: PICBEDS_PAGE,
|
||||||
params: {
|
params: {
|
||||||
type: type.value,
|
type: type.value,
|
||||||
|
@ -4,19 +4,14 @@ import { isReactive, isRef, toRaw, unref } from 'vue'
|
|||||||
import { RPC_ACTIONS, RPC_ACTIONS_INVOKE } from '#/events/constants'
|
import { RPC_ACTIONS, RPC_ACTIONS_INVOKE } from '#/events/constants'
|
||||||
import { IRPCActionType } from '#/types/enum'
|
import { IRPCActionType } from '#/types/enum'
|
||||||
|
|
||||||
const isDevelopment = process.env.NODE_ENV !== 'production'
|
|
||||||
|
|
||||||
export const handleTalkingDataEvent = (data: ITalkingDataOptions) => {
|
export const handleTalkingDataEvent = (data: ITalkingDataOptions) => {
|
||||||
|
try {
|
||||||
const { EventId, Label = '', MapKv = {} } = data
|
const { EventId, Label = '', MapKv = {} } = data
|
||||||
MapKv.from = window.location.href
|
MapKv.from = window.location.href
|
||||||
try {
|
|
||||||
window.TDAPP.onEvent(EventId, Label, MapKv)
|
window.TDAPP.onEvent(EventId, Label, MapKv)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e)
|
console.error(e)
|
||||||
}
|
}
|
||||||
if (isDevelopment) {
|
|
||||||
console.log('talkingData', data)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,26 +36,14 @@ export function sendToMain(channel: string, ...args: any[]) {
|
|||||||
ipcRenderer.send(channel, ...data)
|
ipcRenderer.send(channel, ...data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* send a rpc request & do not need to wait for the response
|
|
||||||
*
|
|
||||||
* or the response will be handled by other listener
|
|
||||||
*/
|
|
||||||
export function sendRPC(action: IRPCActionType, ...args: any[]): void {
|
export function sendRPC(action: IRPCActionType, ...args: any[]): void {
|
||||||
const data = getRawData(args)
|
ipcRenderer.send(RPC_ACTIONS, action, getRawData(args))
|
||||||
ipcRenderer.send(RPC_ACTIONS, action, data)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function sendRpcSync(action: IRPCActionType, ...args: any[]) {
|
export function sendRpcSync(action: IRPCActionType, ...args: any[]) {
|
||||||
const data = getRawData(args)
|
return ipcRenderer.sendSync(RPC_ACTIONS, action, getRawData(args))
|
||||||
return ipcRenderer.sendSync(RPC_ACTIONS, action, data)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* trigger RPC action
|
|
||||||
* TODO: create an isolate rpc handler
|
|
||||||
*/
|
|
||||||
export async function triggerRPC<T>(action: IRPCActionType, ...args: any[]): Promise<T | undefined> {
|
export async function triggerRPC<T>(action: IRPCActionType, ...args: any[]): Promise<T | undefined> {
|
||||||
const data = getRawData(args)
|
return await ipcRenderer.invoke(RPC_ACTIONS_INVOKE, action, getRawData(args))
|
||||||
return await ipcRenderer.invoke(RPC_ACTIONS_INVOKE, action, data)
|
|
||||||
}
|
}
|
||||||
|
@ -96,6 +96,7 @@ export enum IRPCActionType {
|
|||||||
SHOW_MINI_PAGE_MENU = 'SHOW_MINI_PAGE_MENU',
|
SHOW_MINI_PAGE_MENU = 'SHOW_MINI_PAGE_MENU',
|
||||||
SHOW_MAIN_PAGE_MENU = 'SHOW_MAIN_PAGE_MENU',
|
SHOW_MAIN_PAGE_MENU = 'SHOW_MAIN_PAGE_MENU',
|
||||||
SHOW_UPLOAD_PAGE_MENU = 'SHOW_UPLOAD_PAGE_MENU',
|
SHOW_UPLOAD_PAGE_MENU = 'SHOW_UPLOAD_PAGE_MENU',
|
||||||
|
SHOW_SECOND_UPLOADER_MENU = 'SHOW_SECOND_UPLOADER_MENU',
|
||||||
SHOW_PLUGIN_PAGE_MENU = 'SHOW_PLUGIN_PAGE_MENU',
|
SHOW_PLUGIN_PAGE_MENU = 'SHOW_PLUGIN_PAGE_MENU',
|
||||||
SET_MINI_WINDOW_POS = 'SET_MINI_WINDOW_POS',
|
SET_MINI_WINDOW_POS = 'SET_MINI_WINDOW_POS',
|
||||||
MINI_WINDOW_ON_TOP = 'MINI_WINDOW_ON_TOP',
|
MINI_WINDOW_ON_TOP = 'MINI_WINDOW_ON_TOP',
|
||||||
|
3
src/universal/types/i18n.d.ts
vendored
3
src/universal/types/i18n.d.ts
vendored
@ -26,6 +26,7 @@ interface ILocales {
|
|||||||
SHOW_DEVTOOLS: string
|
SHOW_DEVTOOLS: string
|
||||||
FEEDBACK: string
|
FEEDBACK: string
|
||||||
CURRENT_PICBED: string
|
CURRENT_PICBED: string
|
||||||
|
CURRENT_SECOND_PICBED: string
|
||||||
START_WATCH_CLIPBOARD: string
|
START_WATCH_CLIPBOARD: string
|
||||||
STOP_WATCH_CLIPBOARD: string
|
STOP_WATCH_CLIPBOARD: string
|
||||||
OPEN_TOOLBOX: string
|
OPEN_TOOLBOX: string
|
||||||
@ -178,6 +179,8 @@ interface ILocales {
|
|||||||
SETTINGS_ADVANCED_RENAME: string
|
SETTINGS_ADVANCED_RENAME: string
|
||||||
SETTINGS_ADVANCED_RENAME_ENABLE: string
|
SETTINGS_ADVANCED_RENAME_ENABLE: string
|
||||||
SETTINGS_ADVANCED_RENAME_FORMAT: string
|
SETTINGS_ADVANCED_RENAME_FORMAT: string
|
||||||
|
SETTINGS_ENABLE_SECOND_PICBED: string
|
||||||
|
SETTINGS_SET_SECOND_PICBED: string
|
||||||
SETTINGS_OPEN_UPLOAD_TIPS: string
|
SETTINGS_OPEN_UPLOAD_TIPS: string
|
||||||
SETTINGS_OPEN_UPLOAD_RESULT_TIPS: string
|
SETTINGS_OPEN_UPLOAD_RESULT_TIPS: string
|
||||||
SETTINGS_MINI_WINDOW_ON_TOP: string
|
SETTINGS_MINI_WINDOW_ON_TOP: string
|
||||||
|
1
src/universal/types/view.d.ts
vendored
1
src/universal/types/view.d.ts
vendored
@ -37,6 +37,7 @@ interface ISettingForm {
|
|||||||
proxy: string
|
proxy: string
|
||||||
mainWindowWidth: number
|
mainWindowWidth: number
|
||||||
mainWindowHeight: number
|
mainWindowHeight: number
|
||||||
|
enableSecondUploader: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IShortKeyMap {
|
interface IShortKeyMap {
|
||||||
|
@ -66,14 +66,15 @@ export function encodeFilePath(filePath: string) {
|
|||||||
export const getExtension = (fileName: string) => path.extname(fileName).slice(1)
|
export const getExtension = (fileName: string) => path.extname(fileName).slice(1)
|
||||||
|
|
||||||
export const isImage = (fileName: string) =>
|
export const isImage = (fileName: string) =>
|
||||||
['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'ico', 'svg'].includes(getExtension(fileName))
|
['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'ico', 'svg', 'avif'].includes(getExtension(fileName))
|
||||||
|
|
||||||
export const formatEndpoint = (endpoint: string, sslEnabled: boolean): string =>
|
export const formatEndpoint = (endpoint: string, sslEnabled: boolean): string => {
|
||||||
!/^https?:\/\//.test(endpoint)
|
const hasProtocol = /^https?:\/\//.test(endpoint)
|
||||||
? `${sslEnabled ? 'https' : 'http'}://${endpoint}`
|
if (!hasProtocol) {
|
||||||
: sslEnabled
|
return `${sslEnabled ? 'https' : 'http'}://${endpoint}`
|
||||||
? endpoint.replace('http://', 'https://')
|
}
|
||||||
: endpoint.replace('https://', 'http://')
|
return sslEnabled ? endpoint.replace(/^http:\/\//, 'https://') : endpoint.replace(/^https:\/\//, 'http://')
|
||||||
|
}
|
||||||
|
|
||||||
export const trimPath = (path: string) => path.replace(/^\/+|\/+$/g, '').replace(/\/+/g, '/')
|
export const trimPath = (path: string) => path.replace(/^\/+|\/+$/g, '').replace(/\/+/g, '/')
|
||||||
|
|
||||||
|
@ -107,6 +107,9 @@ export const configPaths = {
|
|||||||
picBed: {
|
picBed: {
|
||||||
current: 'picBed.current',
|
current: 'picBed.current',
|
||||||
uploader: 'picBed.uploader',
|
uploader: 'picBed.uploader',
|
||||||
|
secondUploader: 'picBed.secondUploader',
|
||||||
|
secondUploaderId: 'picBed.secondUploaderId',
|
||||||
|
secondUploaderConfig: 'picBed.secondUploaderConfig',
|
||||||
proxy: 'picBed.proxy',
|
proxy: 'picBed.proxy',
|
||||||
transformer: 'picBed.transformer',
|
transformer: 'picBed.transformer',
|
||||||
list: 'picBed.list'
|
list: 'picBed.list'
|
||||||
@ -165,7 +168,8 @@ export const configPaths = {
|
|||||||
useBuiltinClipboard: 'settings.useBuiltinClipboard',
|
useBuiltinClipboard: 'settings.useBuiltinClipboard',
|
||||||
autoStart: 'settings.autoStart',
|
autoStart: 'settings.autoStart',
|
||||||
autoImport: 'settings.autoImport',
|
autoImport: 'settings.autoImport',
|
||||||
autoImportPicBed: 'settings.autoImportPicBed'
|
autoImportPicBed: 'settings.autoImportPicBed',
|
||||||
|
enableSecondUploader: 'settings.enableSecondUploader'
|
||||||
},
|
},
|
||||||
needReload: 'needReload',
|
needReload: 'needReload',
|
||||||
picgoPlugins: 'picgoPlugins',
|
picgoPlugins: 'picgoPlugins',
|
||||||
|
@ -31,6 +31,7 @@ export const picBedsCanbeDeleted = [
|
|||||||
|
|
||||||
export const picBedManualUrlList: IStringKeyMap = {
|
export const picBedManualUrlList: IStringKeyMap = {
|
||||||
zh_cn: {
|
zh_cn: {
|
||||||
|
advancedpiclist: 'https://piclist.cn/configure.html#%E9%AB%98%E7%BA%A7%E8%87%AA%E5%AE%9A%E4%B9%89',
|
||||||
aliyun: 'https://piclist.cn/configure.html#%E9%98%BF%E9%87%8C%E4%BA%91oss',
|
aliyun: 'https://piclist.cn/configure.html#%E9%98%BF%E9%87%8C%E4%BA%91oss',
|
||||||
alistplist: 'https://piclist.cn/configure.html#alist',
|
alistplist: 'https://piclist.cn/configure.html#alist',
|
||||||
'aws-s3': 'https://piclist.cn/configure.html#%E5%86%85%E7%BD%AEaws-s3',
|
'aws-s3': 'https://piclist.cn/configure.html#%E5%86%85%E7%BD%AEaws-s3',
|
||||||
@ -51,6 +52,7 @@ export const picBedManualUrlList: IStringKeyMap = {
|
|||||||
webdavplist: 'https://piclist.cn/configure.html#webdav'
|
webdavplist: 'https://piclist.cn/configure.html#webdav'
|
||||||
},
|
},
|
||||||
en: {
|
en: {
|
||||||
|
advancedpiclist: 'https://piclist.cn/en/configure.html#advanced',
|
||||||
aliyun: 'https://piclist.cn/en/configure.html#alibaba-cloud',
|
aliyun: 'https://piclist.cn/en/configure.html#alibaba-cloud',
|
||||||
alistplist: 'https://piclist.cn/en/configure.html#alist',
|
alistplist: 'https://piclist.cn/en/configure.html#alist',
|
||||||
'aws-s3': 'https://piclist.cn/en/configure.html#built-in-aws-s3',
|
'aws-s3': 'https://piclist.cn/en/configure.html#built-in-aws-s3',
|
||||||
|
@ -3,10 +3,11 @@
|
|||||||
### 图片
|
### 图片
|
||||||
|
|
||||||
| 格式 | 描述 | 格式 | 描述 |
|
| 格式 | 描述 | 格式 | 描述 |
|
||||||
| :-----------------------------------------------------: | :----------: | :-------------------------------------------------------------: | :----------------: |
|
| :---: | :----------: | :--------: | :----------------: |
|
||||||
| [.bmp](https://en.wikipedia.org/wiki/BMP_file_format) | 位图文件格式 | [.jpeg/.jpg](https://en.wikipedia.org/wiki/JPEG) | 联合照片专家组格式 |
|
| .bmp | 位图文件格式 | .jpeg/.jpg | 联合照片专家组格式 |
|
||||||
| [.gif](https://en.wikipedia.org/wiki/GIF) | 图形交换格式 | [.png](https://en.wikipedia.org/wiki/Portable_Network_Graphics) | 可移植网络图形格式 |
|
| .gif | 图形交换格式 | .png | 可移植网络图形格式 |
|
||||||
| [.ico](https://en.wikipedia.org/wiki/ICO_(file_format)) | 图标文件格式 | [.webp](https://developers.google.com/speed/webp/) | WebP格式 |
|
| .ico | 图标文件格式 | .webp | WebP格式 |
|
||||||
|
| .svg | 可缩放矢量图 | .avif | AVIF格式 |
|
||||||
|
|
||||||
### 文本
|
### 文本
|
||||||
|
|
||||||
|
51
yarn.lock
51
yarn.lock
@ -3494,6 +3494,13 @@
|
|||||||
resolved "https://registry.npmjs.org/@types/node/-/node-16.11.18.tgz#39ed7c52943b0cee6d7299b717707bd51b1f90b9"
|
resolved "https://registry.npmjs.org/@types/node/-/node-16.11.18.tgz#39ed7c52943b0cee6d7299b717707bd51b1f90b9"
|
||||||
integrity sha512-7N8AOYWWYuw0g+K+GKCmIwfU1VMHcexYNpLPYzFZ4Uq2W6C/ptfeC7XhXgy/4pcwhz/9KoS5yijMfnYQ0u0Udw==
|
integrity sha512-7N8AOYWWYuw0g+K+GKCmIwfU1VMHcexYNpLPYzFZ4Uq2W6C/ptfeC7XhXgy/4pcwhz/9KoS5yijMfnYQ0u0Udw==
|
||||||
|
|
||||||
|
"@types/node@^22.0.0":
|
||||||
|
version "22.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.4.1.tgz#9b595d292c65b94c20923159e2ce947731b6fdce"
|
||||||
|
integrity sha512-1tbpb9325+gPnKK0dMm+/LMriX0vKxf6RnB0SZUqfyVkQ4fMgUSySqhxE/y8Jvs4NyF1yHzTfG9KlnkIODxPKg==
|
||||||
|
dependencies:
|
||||||
|
undici-types "~6.19.2"
|
||||||
|
|
||||||
"@types/normalize-package-data@^2.4.0", "@types/normalize-package-data@^2.4.1":
|
"@types/normalize-package-data@^2.4.0", "@types/normalize-package-data@^2.4.1":
|
||||||
version "2.4.1"
|
version "2.4.1"
|
||||||
resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
|
resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
|
||||||
@ -11949,10 +11956,10 @@ performance-now@^2.1.0:
|
|||||||
resolved "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
|
resolved "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
|
||||||
integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
|
integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
|
||||||
|
|
||||||
piclist@^1.9.1:
|
piclist@^1.9.3:
|
||||||
version "1.9.1"
|
version "1.9.3"
|
||||||
resolved "https://registry.yarnpkg.com/piclist/-/piclist-1.9.1.tgz#19be64573c06d824b43d8c4dab7e4819dbaca7f4"
|
resolved "https://registry.yarnpkg.com/piclist/-/piclist-1.9.3.tgz#3aa769237935a70fdb786a46f5ed46b762e38dd9"
|
||||||
integrity sha512-esSNT3tkIv3bi+78vmTsRdjmtIL71mP7vsEjadjQR9cuIulu0eN1+aovarAmNqf+RjdRLHB7XffxtPQEMuv4lQ==
|
integrity sha512-nWorUUyBmDJ6ZtHXHVa1dn4PHiKjION9izdj+xcgGkwgQj4xegKWLsivEgdMEV8e+iuulO6e+n1+pQcqOqqasg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@aws-sdk/client-s3" "3.421.0"
|
"@aws-sdk/client-s3" "3.421.0"
|
||||||
"@aws-sdk/lib-storage" "3.421.0"
|
"@aws-sdk/lib-storage" "3.421.0"
|
||||||
@ -13951,7 +13958,16 @@ strict-uri-encode@^1.0.0:
|
|||||||
resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
|
resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
|
||||||
integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==
|
integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==
|
||||||
|
|
||||||
"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
|
"string-width-cjs@npm:string-width@^4.2.0":
|
||||||
|
version "4.2.3"
|
||||||
|
resolved "https://registry.npmjs.org/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@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
|
||||||
version "4.2.3"
|
version "4.2.3"
|
||||||
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||||
@ -14017,7 +14033,7 @@ string_decoder@~1.1.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
safe-buffer "~5.1.0"
|
safe-buffer "~5.1.0"
|
||||||
|
|
||||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
|
||||||
version "6.0.1"
|
version "6.0.1"
|
||||||
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||||
@ -14045,6 +14061,13 @@ strip-ansi@^5.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ansi-regex "^4.1.0"
|
ansi-regex "^4.1.0"
|
||||||
|
|
||||||
|
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
||||||
|
version "6.0.1"
|
||||||
|
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||||
|
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||||
|
dependencies:
|
||||||
|
ansi-regex "^5.0.1"
|
||||||
|
|
||||||
strip-ansi@^7.0.1, strip-ansi@^7.1.0:
|
strip-ansi@^7.0.1, strip-ansi@^7.1.0:
|
||||||
version "7.1.0"
|
version "7.1.0"
|
||||||
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
|
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
|
||||||
@ -14707,6 +14730,11 @@ unbzip2-stream@^1.0.9:
|
|||||||
buffer "^5.2.1"
|
buffer "^5.2.1"
|
||||||
through "^2.3.8"
|
through "^2.3.8"
|
||||||
|
|
||||||
|
undici-types@~6.19.2:
|
||||||
|
version "6.19.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
|
||||||
|
integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
|
||||||
|
|
||||||
unescape@^1.0.1:
|
unescape@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz#956e430f61cad8a4d57d82c518f5e6cc5d0dda96"
|
resolved "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz#956e430f61cad8a4d57d82c518f5e6cc5d0dda96"
|
||||||
@ -15525,7 +15553,7 @@ wordwrap@^1.0.0:
|
|||||||
resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
|
resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
|
||||||
integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
|
integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
|
||||||
|
|
||||||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
|
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
|
||||||
version "7.0.0"
|
version "7.0.0"
|
||||||
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||||
@ -15542,6 +15570,15 @@ wrap-ansi@^3.0.1:
|
|||||||
string-width "^2.1.1"
|
string-width "^2.1.1"
|
||||||
strip-ansi "^4.0.0"
|
strip-ansi "^4.0.0"
|
||||||
|
|
||||||
|
wrap-ansi@^7.0.0:
|
||||||
|
version "7.0.0"
|
||||||
|
resolved "https://registry.npmjs.org/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@^8.1.0:
|
wrap-ansi@^8.1.0:
|
||||||
version "8.1.0"
|
version "8.1.0"
|
||||||
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
|
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
|
||||||
|
Loading…
Reference in New Issue
Block a user