增加复制全部的按钮

This commit is contained in:
mcallzbl 2025-04-12 21:14:17 +08:00
parent 03e1e5662d
commit 7c64f310c9
9 changed files with 234 additions and 57 deletions

View File

@ -1,5 +1,9 @@
# LingTropy
LingTropy 是一个基于 Electron + Vue3 开发的桌面应用,用于文案和标题的智能改写。
减小包体
yarn global add depcheck
depcheck

View File

@ -8,7 +8,7 @@ export const API_ENDPOINTS = {
export const AI_CONFIG = {
DEFAULT_MODEL: 'gpt-4o',
CONTENT_MAX_TOKENS: 1800, // 约900字
TITLE_MAX_TOKENS: 50, // 约20字
TITLE_MAX_TOKENS: 50, // 约20字
TEMPERATURE: 0.8,
MAX_RETRIES: 2,
TIMEOUT: 30000
@ -16,8 +16,10 @@ export const AI_CONFIG = {
// 提示词模板
export const PROMPTS = {
CONTENT_REWRITE: '你是一个小红书文案写手,能够熟练地根据用户的输入,改写成内容相近,但表达方式不同的新文案。你的文案中需要具备吸人眼球的钩子,能够牢牢抓住用户的注意力。请直接输出新的文案,不要输出其他任何提示性词语, 以纯文本的形式输出。注意输出的文案不要超过900字。',
TITLE_REWRITE: '你是一个小红书标题写手,能够熟练地根据用户的输入,改写成内容相近,但表达方式不同的新标题。你的标题中需要具备吸人眼球的钩子,能够牢牢抓住用户的注意力。请直接输出新的标题,不要输出其他任何提示性词语, 以纯文本的形式输出。注意输出的标题不要超过20字。'
CONTENT_REWRITE:
'你是一个小红书文案写手,能够熟练地根据用户的输入,改写成内容相近,但表达方式不同的新文案。你的文案中需要具备吸人眼球的钩子,能够牢牢抓住用户的注意力。请直接输出新的文案,不要输出其他任何提示性词语, 以纯文本的形式输出。注意输出的文案不要超过900字。',
TITLE_REWRITE:
'你是一个小红书标题写手,能够熟练地根据用户的输入,改写成内容相近,但表达方式不同的新标题。你的标题中需要具备吸人眼球的钩子,能够牢牢抓住用户的注意力。请直接输出新的标题,不要输出其他任何提示性词语, 以纯文本的形式输出。注意输出的标题不要超过20字。'
} as const
// 存储键名
@ -39,4 +41,4 @@ export const UI_CONFIG = {
// export const APP_INFO = {
// VERSION: '1.0.0',
// NAME: 'LingTropy'
// } as const
// } as const

View File

@ -3,13 +3,7 @@ import Constants from './utils/Constants'
import Store from 'electron-store'
import axios from 'axios'
import OpenAI from 'openai'
import {
API_ENDPOINTS,
AI_CONFIG,
PROMPTS,
STORE_KEYS,
APP_INFO
} from '../constants'
import { API_ENDPOINTS, AI_CONFIG, PROMPTS, STORE_KEYS, APP_INFO } from '../constants'
const store = new Store()
/*
@ -123,7 +117,14 @@ export default class IPCs {
ipcMain.handle(
'call-openai-title',
async (event, baseUrl: string, apiKey: string, model: string, count: number, text: string) => {
async (
event,
baseUrl: string,
apiKey: string,
model: string,
count: number,
text: string
) => {
try {
const client = new OpenAI({
baseURL: baseUrl,
@ -139,7 +140,8 @@ export default class IPCs {
messages: [
{
role: 'system',
content: '你是一个小红书标题写手,能够熟练地根据用户的输入,改写成内容相近,但表达方式不同的新标题。你的标题中需要具备吸人眼球的钩子,能够牢牢抓住用户的注意力。请直接输出新的标题,不要输出其他任何提示性词语, 以纯文本的形式输出。注意输出的标题不要超过20字。'
content:
'你是一个小红书标题写手,能够熟练地根据用户的输入,改写成内容相近,但表达方式不同的新标题。你的标题中需要具备吸人眼球的钩子,能够牢牢抓住用户的注意力。请直接输出新的标题,不要输出其他任何提示性词语, 以纯文本的形式输出。注意输出的标题不要超过20字。'
},
{ role: 'user', content: text }
],
@ -203,7 +205,5 @@ export default class IPCs {
})
return dialogResult
})
}
}

View File

@ -49,4 +49,4 @@
font-size: 17px;
}
}
</style>
</style>

View File

@ -17,11 +17,7 @@
<span class="mode-icon">🔄</span>
单次改写
</button>
<button
:class="{ active: mode === 'batch' }"
@click="switchMode('batch')"
class="mode-tab"
>
<button :class="{ active: mode === 'batch' }" @click="switchMode('batch')" class="mode-tab">
<span class="mode-icon">🔀</span>
批量改写
</button>
@ -31,11 +27,9 @@
<div v-if="mode === 'batch'" class="generation-count">
<label for="count-input">生成数量:</label>
<div class="count-control">
<button
:disabled="generationCount <= 1"
@click="decrementCount"
class="count-button"
>-</button>
<button :disabled="generationCount <= 1" @click="decrementCount" class="count-button"
>-</button
>
<input
id="count-input"
v-model="generationCount"
@ -47,7 +41,8 @@
:disabled="generationCount >= ARTICLE_MAX_COUNT"
@click="incrementCount"
class="count-button"
>+</button>
>+</button
>
</div>
</div>
</transition>
@ -67,17 +62,17 @@
</div>
<div class="button-group">
<button
:disabled="isGenerating || isGeneratingTitle"
@click="handleRewrite('content')"
<button
:disabled="isGenerating || isGeneratingTitle"
@click="handleRewrite('content')"
class="rewrite-button"
>
<span v-if="isGenerating" class="loading-spinner"></span>
<span v-else>改写文案</span>
</button>
<button
:disabled="isGenerating || isGeneratingTitle"
@click="handleRewrite('title')"
<button
:disabled="isGenerating || isGeneratingTitle"
@click="handleRewrite('title')"
class="rewrite-button title-button"
>
<span v-if="isGeneratingTitle" class="loading-spinner"></span>
@ -358,7 +353,9 @@ const showToast = (message) => {
white-space: pre-wrap;
word-wrap: break-word;
overflow-wrap: break-word;
transition: border-color 0.3s, box-shadow 0.3s;
transition:
border-color 0.3s,
box-shadow 0.3s;
background-color: #f9f9f9;
}
@ -465,4 +462,4 @@ const showToast = (message) => {
padding: 16px;
}
}
</style>
</style>

View File

@ -1,6 +1,6 @@
<template>
<transition name="fade">
<div v-if="(results?.length > 0) || isGenerating" class="result-section">
<div v-if="results?.length > 0 || isGenerating" class="result-section">
<div class="result-header-bar">
<h2 class="section-title">
<span class="section-icon"></span>
@ -25,6 +25,13 @@
</div>
<span class="model-badge">{{ model }}</span>
<span class="count-badge">{{ results?.length || 0 }} 个结果</span>
<button
v-if="results?.length > 0 && !isGenerating"
@click="handleCopyAll"
class="copy-all-button"
>
复制全部
</button>
</div>
</div>
@ -66,9 +73,6 @@
</div>
<div :class="{ expanded: expandedResults[index] }" class="result-content">
{{ text }}
<!-- <div v-if="text.length > (type === 'title' ? 20 : 900)" class="warning-badge">
超出字数限制
</div> -->
</div>
</div>
</div>
@ -87,7 +91,12 @@
<script setup>
import { ref, reactive } from 'vue'
const { results = [], isGenerating, model, layoutMode } = defineProps({
const {
results = [],
isGenerating,
model,
layoutMode
} = defineProps({
results: {
type: Array,
default: () => []
@ -130,6 +139,19 @@ const toggleExpand = (index) => {
expandedResults[index] = !expandedResults[index]
}
const handleCopyAll = () => {
const allText = results.map((text, index) => `结果 #${index + 1}:\n${text}`).join('\n\n')
navigator.clipboard
.writeText(allText)
.then(() => {
showToast('已复制全部内容')
})
.catch((err) => {
console.error('复制失败:', err)
showToast('复制失败,请重试')
})
}
const showToast = (message) => {
const toast = document.createElement('div')
toast.className = 'toast-message'
@ -474,7 +496,9 @@ const showToast = (message) => {
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.3s, transform 0.3s;
transition:
opacity 0.3s,
transform 0.3s;
}
.fade-enter-from,
@ -540,4 +564,21 @@ const showToast = (message) => {
border-radius: 4px;
font-size: 12px;
}
</style>
.copy-all-button {
background-color: #2ecc71;
color: white;
border: none;
padding: 6px 12px;
border-radius: 20px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
}
.copy-all-button:hover {
background-color: #27ae60;
transform: translateY(-1px);
}
</style>

View File

@ -2,7 +2,7 @@
<div class="text-rewriter-container">
<div class="text-rewriter-layout">
<DisclaimerComponent />
<InputSection
<InputSection
:is-generating="isGenerating"
:is-generating-title="isGeneratingTitle"
v-model:model="currentModel"
@ -14,10 +14,10 @@
:model="currentModel"
:layout-mode="layoutMode"
:type="currentType"
@update:layout="(newLayout) => layoutMode = newLayout"
@update:layout="(newLayout) => (layoutMode = newLayout)"
/>
</div>
<h1></h1>
<FooterComponent />
</div>
</template>
@ -72,7 +72,7 @@ const handleRewrite = async ({ mode, text, count, model, key, type }) => {
try {
const baseUrl = await window.mainApi.invoke('getBaseUrl')
window.mainApi.on('openai-partial-response', (_, { index, content }) => {
if (!rewrittenText.value[index]) {
rewrittenText.value[index] = ''
@ -104,7 +104,7 @@ const handleRewrite = async ({ mode, text, count, model, key, type }) => {
try {
const baseUrl = await window.mainApi.invoke('getBaseUrl')
window.mainApi.on('openai-partial-response', (_, { index, content }) => {
if (!rewrittenText.value[index]) {
rewrittenText.value[index] = ''
@ -112,14 +112,7 @@ const handleRewrite = async ({ mode, text, count, model, key, type }) => {
rewrittenText.value[index] += content
})
const results = await window.mainApi.invoke(
'call-openai',
baseUrl,
key,
model,
count,
text
)
const results = await window.mainApi.invoke('call-openai', baseUrl, key, model, count, text)
results.forEach(({ index, response }) => {
rewrittenText.value[index] = response
@ -142,7 +135,8 @@ watch(layoutMode, (newLayout) => {
<style scoped>
.text-rewriter-container {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
font-family:
-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
display: flex;
justify-content: center;
align-items: flex-start;

View File

@ -1,5 +1,10 @@
{
"dependencies": {
"openai": "^4.87.4"
"electron-store": "^10.0.1",
"openai": "^4.87.4",
"typescript": "^5.8.2"
},
"devDependencies": {
"@types/electron-store": "^3.2.2"
}
}

134
yarn.lock
View File

@ -2,6 +2,13 @@
# yarn lockfile v1
"@types/electron-store@^3.2.2":
version "3.2.2"
resolved "https://registry.npmjs.org/@types/electron-store/-/electron-store-3.2.2.tgz#f10c0e2eb12555968aa2815ce4baea2af39d4801"
integrity sha512-N3X45mnsfnwmeZoXSZmeE7/Tne8kdbIKO1vQdbbEV04TzrMbWIeDVJJjnX2n5GH9O61zI612tet4s2jCZ55DXw==
dependencies:
electron-store "*"
"@types/node-fetch@^2.6.4":
version "2.6.12"
resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz#8ab5c3ef8330f13100a7479e2cd56d3386830a03"
@ -38,11 +45,36 @@ agentkeepalive@^4.2.1:
dependencies:
humanize-ms "^1.2.1"
ajv-formats@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578"
integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==
dependencies:
ajv "^8.0.0"
ajv@^8.0.0, ajv@^8.17.1:
version "8.17.1"
resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6"
integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
dependencies:
fast-deep-equal "^3.1.3"
fast-uri "^3.0.1"
json-schema-traverse "^1.0.0"
require-from-string "^2.0.2"
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
atomically@^2.0.3:
version "2.0.3"
resolved "https://registry.npmjs.org/atomically/-/atomically-2.0.3.tgz#27e47bbe39994d324918491ba7c0edb7783e56cb"
integrity sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==
dependencies:
stubborn-fs "^1.2.5"
when-exit "^2.1.1"
call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6"
@ -58,11 +90,40 @@ combined-stream@^1.0.8:
dependencies:
delayed-stream "~1.0.0"
conf@^13.0.0:
version "13.1.0"
resolved "https://registry.npmjs.org/conf/-/conf-13.1.0.tgz#c6e797d6157253c1baac3788bb121f2ee085f902"
integrity sha512-Bi6v586cy1CoTFViVO4lGTtx780lfF96fUmS1lSX6wpZf6330NvHUu6fReVuDP1de8Mg0nkZb01c8tAQdz1o3w==
dependencies:
ajv "^8.17.1"
ajv-formats "^3.0.1"
atomically "^2.0.3"
debounce-fn "^6.0.0"
dot-prop "^9.0.0"
env-paths "^3.0.0"
json-schema-typed "^8.0.1"
semver "^7.6.3"
uint8array-extras "^1.4.0"
debounce-fn@^6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/debounce-fn/-/debounce-fn-6.0.0.tgz#558169aed853eb3cf3a17c0a2438e1a91a7ba44f"
integrity sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==
dependencies:
mimic-function "^5.0.0"
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
dot-prop@^9.0.0:
version "9.0.0"
resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz#bae5982fe6dc6b8fddb92efef4f2ddff26779e92"
integrity sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==
dependencies:
type-fest "^4.18.2"
dunder-proto@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
@ -72,6 +133,19 @@ dunder-proto@^1.0.1:
es-errors "^1.3.0"
gopd "^1.2.0"
electron-store@*, electron-store@^10.0.1:
version "10.0.1"
resolved "https://registry.npmjs.org/electron-store/-/electron-store-10.0.1.tgz#d6c0395a3f25be6686f89738d95f6e7b7864da6a"
integrity sha512-Ok0bF13WWdTzZi9rCtPN8wUfwx+yDMmV6PAnCMqjNRKEXHmklW/rV+6DofV/Vf5qoAh+Bl9Bj7dQ+0W+IL2psg==
dependencies:
conf "^13.0.0"
type-fest "^4.20.0"
env-paths@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da"
integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==
es-define-property@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
@ -104,6 +178,16 @@ event-target-shim@^5.0.0:
resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-uri@^3.0.1:
version "3.0.6"
resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748"
integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==
form-data-encoder@1.7.2:
version "1.7.2"
resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040"
@ -187,6 +271,16 @@ humanize-ms@^1.2.1:
dependencies:
ms "^2.0.0"
json-schema-traverse@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
json-schema-typed@^8.0.1:
version "8.0.1"
resolved "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.1.tgz#826ee39e3b6cef536f85412ff048d3ff6f19dfa0"
integrity sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==
math-intrinsics@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
@ -204,6 +298,11 @@ mime-types@^2.1.12:
dependencies:
mime-db "1.52.0"
mimic-function@^5.0.0:
version "5.0.1"
resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076"
integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==
ms@^2.0.0:
version "2.1.3"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
@ -234,11 +333,41 @@ openai@^4.87.4:
formdata-node "^4.3.2"
node-fetch "^2.6.7"
require-from-string@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
semver@^7.6.3:
version "7.7.1"
resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
stubborn-fs@^1.2.5:
version "1.2.5"
resolved "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-1.2.5.tgz#e5e244223166921ddf66ed5e062b6b3bf285bfd2"
integrity sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==
tr46@~0.0.3:
version "0.0.3"
resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
type-fest@^4.18.2, type-fest@^4.20.0:
version "4.37.0"
resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz#7cf008bf77b63a33f7ca014fa2a3f09fd69e8937"
integrity sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==
typescript@^5.8.2:
version "5.8.2"
resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz#8170b3702f74b79db2e5a96207c15e65807999e4"
integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==
uint8array-extras@^1.4.0:
version "1.4.0"
resolved "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz#e42a678a6dd335ec2d21661333ed42f44ae7cc74"
integrity sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==
undici-types@~5.26.4:
version "5.26.5"
resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
@ -266,3 +395,8 @@ whatwg-url@^5.0.0:
dependencies:
tr46 "~0.0.3"
webidl-conversions "^3.0.0"
when-exit@^2.1.1:
version "2.1.4"
resolved "https://registry.npmjs.org/when-exit/-/when-exit-2.1.4.tgz#e2a0e998f7ad67eb0d2ce37e9794386663cc96f7"
integrity sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==