作者 202304001

新增腾讯COS文件上传

... ... @@ -20,6 +20,7 @@ import { handle as zuotangHandler } from "../../zuotang";
//20250328新增PPT API
import { handle as docmeeHandler } from "../../docmee";
import { handle as generateImgHandler } from "../../generateImg";
import { handle as tencentCosHandler } from "../../tencentCos";
async function handle(
req: NextRequest,
... ... @@ -63,6 +64,8 @@ async function handle(
return docmeeHandler(req, { params });
case ApiPath.OpenAiImg:
return generateImgHandler(req, { params });
case ApiPath.TencentCos:
return tencentCosHandler(req, { params });
default:
return proxyHandler(req, { params });
}
... ...
import { NextRequest, NextResponse } from "next/server";
export async function handle(
req: NextRequest,
{ params }: { params: { path: string[] } },
) {
return NextResponse.json(
{
success: true,
data: {
msg: "success",
},
},
{ status: 200 },
);
}
... ...
... ... @@ -75,14 +75,14 @@ export async function handle(
}
// 准备API请求
const imageFile = formData.get("image_file");
if (!(imageFile instanceof Blob)) {
return createErrorResponse("无效图片文件", 400);
const imageFile = formData.get("image_url");
if (!imageFile) {
return createErrorResponse("缺少请求参数", 400);
}
const headers = new Headers({ "X-API-KEY": config.bgRemovalApiKey });
const newFormData = new FormData();
newFormData.append("image_file", imageFile);
newFormData.append("image_url", imageFile);
if (subPath === "visual/r-background") {
newFormData.append("batch_size", "1");
... ...
... ... @@ -3,14 +3,16 @@ import { IconButton } from "../button";
import styles from "./bg-removal-panel.module.scss";
import { useState } from "react";
import { message } from "antd";
import type { LocalData, FileProps } from "@/app/types/zuotang";
import { ApiPath } from "@/app/constant";
import type { LocalData, PanelProps } from "@/app/types/zuotang";
import { ApiPath, Path } from "@/app/constant";
import { useAccessStore } from "@/app/store";
import Locale from "@/app/locales";
import LoadingIcon from "@/app/icons/three-dots.svg";
import WriteIcon from "@/app/icons/write.svg";
import { useChatStore } from "@/app/store";
import { getBgPrompt } from "@/app/utils/prompt";
import { cosUploadImage } from "@/app/utils/tencentCos";
import { getFileByUrl } from "@/app/utils/fileUtil";
// 错误消息映射函数
const getErrorMessage = (state: number): string => {
... ... @@ -29,7 +31,8 @@ const getErrorMessage = (state: number): string => {
const urlToBlob = async (url: string): Promise<Blob> => {
const response = await fetch(url);
if (!response.ok) throw new Error(Locale.BgRemoval.error.imgLoadingErr);
return await response.blob();
const blob = await response.blob();
return blob;
};
// 通用轮询函数
... ... @@ -278,21 +281,14 @@ const PromptListComponent: React.FC<PromptListProps> = ({
);
};
export function BgPanel(props: FileProps) {
export function BgPanel(props: PanelProps) {
const [prompt, setPrompt] = useState(""); //背景提示词
const [promptList, setPromptList] = useState<string[]>([]); //背景提示词优化列表
const [isGenerate, setIsGenerate] = useState(false);
const [sceneTypeList, setSceneTypeList] = useState([]);
const chatStore = useChatStore();
const [loading, setLoading] = useState(false); //是否优化文案
const {
previewUrl,
setPreviewUrl,
fileData,
setFileData,
isLoading,
setIsLoading,
} = props;
const { previewUrl, setPreviewUrl, isLoading, setIsLoading } = props;
const accessStore = useAccessStore();
const { pollTask } = useTaskPoller();
const { updateLocalUsage, getLocalData } = useLocalStorage();
... ... @@ -312,13 +308,21 @@ export function BgPanel(props: FileProps) {
throw new Error(errorData.message || Locale.BgRemoval.error.reqErr);
}
const responseData = await res.json();
// 获取新图片的Blob
const newBlob = await urlToBlob(responseData.data.data[0].url);
// 创建新的对象URL
const newUrl = URL.createObjectURL(newBlob);
// 同步更新所有相关状态
setPreviewUrl(newUrl);
setFileData(newBlob);
setPreviewUrl(responseData.data.data[0].url);
//异步上传保存图片
setTimeout(async () => {
try {
const file: File = await getFileByUrl(responseData.data.data[0].url);
const imageUrl = await cosUploadImage(file, Path.BgRemoval);
setPreviewUrl(
imageUrl.startsWith("https://") ? imageUrl : `https://${imageUrl}`,
);
} catch (error) {
console.log(error);
message.error(Locale.ComError.UploadErr);
}
}, 0);
} catch (error) {
message.error(Locale.BgRemoval.error.reqErr);
} finally {
... ... @@ -345,7 +349,7 @@ export function BgPanel(props: FileProps) {
const localData = getLocalData(accessStore.accessCode); // 获取本地数据
formData.append("accessCode", accessStore.accessCode);
formData.append("localData", JSON.stringify(localData));
formData.append("image_file", fileData as Blob);
formData.append("image_url", previewUrl);
if (endpoint === "visual/r-background") {
formData.append("prompt", prompt);
} //生成背景添加提示词
... ... @@ -380,14 +384,25 @@ export function BgPanel(props: FileProps) {
endpoint,
async (data) => {
try {
// 获取新图片的Blob
const newBlob = await urlToBlob(data.image || data.image_1);
// 创建新的对象URL
const newUrl = URL.createObjectURL(newBlob);
// 同步更新所有相关状态
setPreviewUrl(newUrl);
setFileData(newBlob);
setPreviewUrl(data.image || data.image_1);
message.success(Locale.BgRemoval.success);
//异步上传保存图片
setTimeout(async () => {
try {
const file: File = await getFileByUrl(
data.image || data.image_1,
);
const imageUrl = await cosUploadImage(file, Path.BgRemoval);
setPreviewUrl(
imageUrl.startsWith("https://")
? imageUrl
: `https://${imageUrl}`,
);
} catch (error) {
console.log(error);
message.error(Locale.ComError.UploadErr);
}
}, 0);
} catch (error) {
message.error(Locale.BgRemoval.error.resultErr);
} finally {
... ... @@ -434,6 +449,7 @@ export function BgPanel(props: FileProps) {
setLoading(false);
}
};
return (
<>
<ControlParamItem title={Locale.BgRemoval.subTitle}>
... ... @@ -466,6 +482,13 @@ export function BgPanel(props: FileProps) {
onClick={() => handleProcessImage("visual/r-background")}
disabled={isLoading}
/>
<IconButton
text={Locale.BgRemoval.generateBg}
type="primary"
shadow
onClick={() => console.log(Path.BgRemoval)}
disabled={isLoading}
/>
</div>
</ControlParamItem>
<ControlParamItem title={Locale.BgRemoval.promptTitle} required={true}>
... ...
import { useMobileScreen } from "@/app/utils";
import dynamic from "next/dynamic";
import {
SideBarContainer,
SideBarBody,
SideBarHeader,
SideBarTail,
useDragSideBar,
useHotKey,
SideBarContainer,
SideBarBody,
SideBarHeader,
useDragSideBar,
useHotKey,
} from "@/app/components/sidebar";
import { IconButton } from "@/app/components/button";
import ReturnIcon from "@/app/icons/return.svg";
... ... @@ -15,102 +14,87 @@ import Locale from "@/app/locales";
import { Path } from "@/app/constant";
import { useNavigate } from "react-router-dom";
import SDIcon from "@/app/icons/sd.svg";
import type { LocalData } from '@/app/types/zuotang';
import { ApiPath } from '@/app/constant';
import { message } from 'antd';
const BgPanel = dynamic(
async () => (await import("@/app/components/bgRemoval")).BgPanel,
{
loading: () => null,
},
async () => (await import("@/app/components/bgRemoval")).BgPanel,
{
loading: () => null,
},
);
export interface BgSiderBarProps {
className?: string;
fileData: Blob | null;
setFileData: React.Dispatch<React.SetStateAction<Blob | null>>;
previewUrl: string | null;
setPreviewUrl: React.Dispatch<React.SetStateAction<string | null>>;
isLoading: boolean;
setIsLoading: React.Dispatch<React.SetStateAction<boolean>>;
className?: string;
previewUrl: string | null;
setPreviewUrl: React.Dispatch<React.SetStateAction<string | null>>;
isLoading: boolean;
setIsLoading: React.Dispatch<React.SetStateAction<boolean>>;
}
export function BgSiderBar(props: BgSiderBarProps) {
const isMobileScreen = useMobileScreen();
const { onDragStart, shouldNarrow } = useDragSideBar();
const navigate = useNavigate();
useHotKey();
const {
className,
fileData,
setFileData,
previewUrl,
setPreviewUrl,
isLoading,
setIsLoading,
} = props;
return (
<SideBarContainer
onDragStart={onDragStart}
shouldNarrow={shouldNarrow}
className={className}
const isMobileScreen = useMobileScreen();
const { onDragStart, shouldNarrow } = useDragSideBar();
const navigate = useNavigate();
useHotKey();
const { className, previewUrl, setPreviewUrl, isLoading, setIsLoading } =
props;
return (
<SideBarContainer
onDragStart={onDragStart}
shouldNarrow={shouldNarrow}
className={className}
>
{isMobileScreen ? (
<div
className="window-header"
data-tauri-drag-region
style={{
paddingLeft: 0,
paddingRight: 0,
}}
>
{isMobileScreen ? (
<div
className="window-header"
data-tauri-drag-region
style={{
paddingLeft: 0,
paddingRight: 0,
}}
>
<div className="window-actions">
<div className="window-action-button">
<IconButton
icon={<ReturnIcon />}
bordered
title={Locale.Sd.Actions.ReturnHome}
onClick={() => navigate(Path.Home)}
/>
</div>
</div>
<SDIcon width={50} height={50} />
<div className="window-actions">
<div className="window-action-button">
<IconButton
icon={<HistoryIcon />}
bordered
title={Locale.Sd.Actions.History}
onClick={() => navigate(Path.SdNew)}
/>
</div>
</div>
</div>
) : (
<SideBarHeader
title={
<IconButton
icon={<ReturnIcon />}
bordered
title={Locale.Sd.Actions.ReturnHome}
onClick={() => navigate(Path.Home)}
/>
}
logo={<SDIcon width={38} height={"100%"} />}
></SideBarHeader>
)}
<SideBarBody>
<BgPanel
fileData={fileData}
setFileData={setFileData}
previewUrl={previewUrl}
setPreviewUrl={setPreviewUrl}
isLoading={isLoading}
setIsLoading={setIsLoading}
/>
</SideBarBody>
</SideBarContainer>
)
}
\ No newline at end of file
<div className="window-actions">
<div className="window-action-button">
<IconButton
icon={<ReturnIcon />}
bordered
title={Locale.Sd.Actions.ReturnHome}
onClick={() => navigate(Path.Home)}
/>
</div>
</div>
<SDIcon width={50} height={50} />
<div className="window-actions">
<div className="window-action-button">
<IconButton
icon={<HistoryIcon />}
bordered
title={Locale.Sd.Actions.History}
onClick={() => navigate(Path.SdNew)}
/>
</div>
</div>
</div>
) : (
<SideBarHeader
title={
<IconButton
icon={<ReturnIcon />}
bordered
title={Locale.Sd.Actions.ReturnHome}
onClick={() => navigate(Path.Home)}
/>
}
logo={<SDIcon width={38} height={"100%"} />}
></SideBarHeader>
)}
<SideBarBody>
<BgPanel
previewUrl={previewUrl}
setPreviewUrl={setPreviewUrl}
isLoading={isLoading}
setIsLoading={setIsLoading}
/>
</SideBarBody>
</SideBarContainer>
);
}
... ...
... ... @@ -15,7 +15,6 @@ import { useAppConfig } from "@/app/store";
import { BgSiderBar } from "./bg-siderBar";
import { Button, Flex, Upload, message } from "antd";
import { UploadOutlined } from "@ant-design/icons";
import type { UploadFile } from "antd";
import ReturnIcon from "@/app/icons/return.svg";
import MinIcon from "@/app/icons/min.svg";
... ... @@ -24,6 +23,7 @@ import SDIcon from "@/app/icons/sd.svg";
import LoadingIcon from "@/app/icons/three-dots.svg";
import BotIcon from "@/app/icons/bot.svg";
import CloseIcon from "@/app/icons/close.svg";
import { cosUploadImage } from "@/app/utils/tencentCos";
export function BgRemoval() {
const isMobileScreen = useMobileScreen();
... ... @@ -35,45 +35,47 @@ export function BgRemoval() {
const isBgRemoval = location.pathname === Path.BgRemoval;
const [isLoading, setIsLoading] = useState(false);
const [fileData, setFileData] = useState<Blob | null>(null); //储存上传图片
const [previewUrl, setPreviewUrl] = useState<string | null>("");
const [previewUrl, setPreviewUrl] = useState<string | null>(
localStorage.getItem("image") || "",
);
// 关闭图片
const closePic = () => {
setFileData(null);
setPreviewUrl("");
};
//上传图片
const onChange = (info: any) => {
const onChange = async (info: any) => {
if (info.file.status === "uploading") {
return;
}
if (info.file.status === "done") {
// 获取上传的文件对象
const file = info.file as UploadFile;
const blob = file.originFileObj as Blob;
setFileData(blob);
const file = info.file.originFileObj;
setIsLoading(true);
try {
const imageUrl = await cosUploadImage(file, Path.BgRemoval);
setPreviewUrl(
imageUrl.startsWith("https://") ? imageUrl : `https://${imageUrl}`,
);
} catch (error) {
console.log(error);
message.error(Locale.ComError.UploadErr);
} finally {
setIsLoading(false);
}
} else if (info.file.status === "error") {
message.error(`${info.file.name} file upload failed.`);
}
};
// 修改 useEffect 监听 fileData
useEffect(() => {
if (fileData) {
// 创建 Blob 的临时 URL
const objectUrl = URL.createObjectURL(fileData);
setPreviewUrl(objectUrl);
// 组件卸载时释放内存
return () => URL.revokeObjectURL(objectUrl);
}
}, [fileData]);
previewUrl && localStorage.setItem("image", previewUrl);
}, [previewUrl]);
return (
<>
<BgSiderBar
className={clsx({ [homeStyles["sidebar-show"]]: isBgRemoval })}
fileData={fileData}
setFileData={setFileData}
previewUrl={previewUrl}
setPreviewUrl={setPreviewUrl}
isLoading={isLoading}
... ... @@ -150,10 +152,6 @@ export function BgRemoval() {
) : (
<Upload
onChange={onChange}
beforeUpload={(file) => {
setFileData(file);
return false;
}}
showUploadList={false}
accept="image/*"
>
... ...
... ... @@ -6,15 +6,6 @@
pointer-events: none; /* 可选,禁用所有鼠标事件 */
}
.message-file{
align-items: center;
padding: 6px 12px;
background-color: var(--white);
border: 1px solid rgba(136, 136, 136, 0.2);
border-radius: 5px;
}
.attach-file {
position: absolute;
left: 30px;
... ...
... ... @@ -137,12 +137,12 @@ import clsx from "clsx";
import { getAvailableClientsCount, isMcpEnabled } from "../mcp/actions";
//20250317新增
import { getExcelData, toExcel } from "../utils/fileExport/export2Excel";
import { exportWord, getWordData } from "../utils/fileExport/word";
import { toExcel } from "../utils/fileExport/export2Excel";
import { exportWord } from "../utils/fileExport/word";
import { getMindPrompt } from "../utils/prompt";
import { message as msgModal } from "antd";
import { getPdfData } from "../utils/fileExport/toPdf";
import { removeDeepThink } from "../utils/deepThink";
import { processChatFile } from "../utils/fileUtil";
const localStorage = safeLocalStorage();
const ttsPlayer = createTTSPlayer();
... ... @@ -1785,62 +1785,15 @@ function _Chat() {
const [fileName, setFileName] = useState("");
async function uploadFile() {
const fileInput = document.createElement("input");
fileInput.type = "file";
fileInput.accept = ".xlsx, .xls, .pdf, .docx, .doc";
fileInput.multiple = false;
fileInput.style.display = "none";
const handleFileResult = (fileName: string, data: any) => {
if (!data) {
msgModal.error(Locale.ComError.Notread);
return;
}
setFileData(`'''filedata
${fileName}
${JSON.stringify(data)}
'''filedata`);
setFileName(fileName);
};
const handleError = (
error: any,
defaultMsg = Locale.ComError.UploadErr,
) => {
console.error(`${defaultMsg}:`, error);
msgModal.error(defaultMsg);
};
// 文件处理器映射
const fileHandlers: Record<string, (file: File) => Promise<any>> = {
".xlsx": getExcelData,
".xls": getExcelData,
".doc": getWordData,
".docx": getWordData,
".pdf": getPdfData,
};
fileInput.onchange = async (event: Event) => {
try {
const file = (event.target as HTMLInputElement).files?.[0];
if (!file) return;
const fileExt = file.name
.toLowerCase()
.slice(file.name.lastIndexOf("."));
// 校验文件类型
if (!Object.keys(fileHandlers).includes(fileExt)) {
msgModal.error(Locale.ComError.UnsupportedFile);
return;
}
// 获取处理器并执行
const handler = fileHandlers[fileExt];
const data = await handler(file);
handleFileResult(file.name, data);
} catch (error) {
handleError(error);
} finally {
fileInput.remove();
}
};
document.body.appendChild(fileInput);
fileInput.click();
try {
const { data, name } = await processChatFile();
setFileData(data);
setFileName(name);
} catch (err) {
msgModal.error(Locale.ComError.UploadErr);
}
}
return (
<>
<div className={styles.chat} key={session.id}>
... ...
import React, { useEffect, useRef, useState } from "react";
import { Editor } from "@tinymce/tinymce-react";
import tinymce from "tinymce";
import { message } from "antd";
import { cosUploadImage } from "@/app/utils/tencentCos";
import { Path } from "@/app/constant";
export function EditorComponent(props: {
htmlCode: string;
... ... @@ -8,14 +11,9 @@ export function EditorComponent(props: {
}) {
const editorRef = useRef<tinymce.Editor | null>(null);
const [editorValue, setEditorValue] = useState(props.htmlCode);
useEffect(() => {
setEditorValue(props.htmlCode);
}, [props.htmlCode]);
function uploadImageToServer(file: File) {
const blob = file as Blob;
return URL.createObjectURL(blob);
}
return (
<Editor
apiKey="l4kgoxhh8dtkv4thb22g4wskoq4obivan58l38asxk32an6f"
... ... @@ -73,13 +71,13 @@ export function EditorComponent(props: {
const file = (e.target as HTMLInputElement).files?.[0];
if (!file) return;
if (!file.type.startsWith("image/")) {
alert("请选择有效的图片文件");
message.error("请选择有效的图片文件");
return;
}
try {
const imageUrl = await uploadImageToServer(file);
const imageUrl = await cosUploadImage(file, Path.Writing);
editor.insertContent(
`<img src="${imageUrl}" alt="上传的图片"/>`,
`<img src="https://${imageUrl}" alt="上传的图片"/>`,
);
} catch (error) {
alert(
... ...
... ... @@ -7,6 +7,10 @@ import { message } from "antd";
import { useChatStore } from "@/app/store";
import { getWrtingPrompt } from "@/app/utils/prompt";
import type { writePromptParam } from "@/app/types/prompt";
import { processChatFile } from "@/app/utils/fileUtil";
import Locale from "@/app/locales";
import styles from "./wrtie-panel.module.scss";
import DeleteIcon from "@/app/icons/delete.svg";
export const mergedData = [
{
... ... @@ -141,6 +145,9 @@ export function WritingPanel(props: WritePanelProps) {
const [prompt, setPrompt] = useState(""); // 提示词
const [isLoading, setIsLoading] = useState(false);
const [fileData, setFileData] = useState("");
const [fileName, setFileName] = useState("");
// 生成动态数据
const dynamicMergedData = mergedData.map((item) => {
if (item.title === "写作风格") {
... ... @@ -196,6 +203,21 @@ export function WritingPanel(props: WritePanelProps) {
setPrompt(e.target.value);
};
//上传文件
const uploadFile = async () => {
try {
const { data, name } = await processChatFile();
console.log(data);
setFileData(data);
console.log(fileData);
setFileName(name);
} catch {
message.error(Locale.ComError.UploadErr);
}
};
// 提交表单时的处理函数
const handleSubmit = async () => {
if (!prompt.trim()) {
... ... @@ -210,6 +232,7 @@ export function WritingPanel(props: WritePanelProps) {
writingTypeName,
isImgName,
writingCount,
fileData,
};
const input = getWrtingPrompt(param);
setLoading(true);
... ... @@ -304,6 +327,28 @@ export function WritingPanel(props: WritePanelProps) {
/>
</ControlParamItem>
<IconButton
text="上传文件"
type="primary"
shadow
onClick={uploadFile}
disabled={loading}
></IconButton>
{fileName && fileData && (
<div className={styles["attach-file"]}>
<span className={styles["file-name"]}>{fileName}</span>
<div
className={styles["delete-file"]}
onClick={() => {
setFileData("");
setFileName("");
}}
>
<DeleteIcon />
</div>
</div>
)}
{/* 提示词文本区域 */}
<ControlParamItem title="提示词" required={true}>
<textarea
... ...
... ... @@ -92,6 +92,7 @@ export function WritingPage() {
writingTypeName: mergedData[4].default,
isImgName: mergedData[5].default,
writingCount: "200",
fileData: "",
};
const input = getWrtingPrompt(param);
setLoading(true);
... ... @@ -160,6 +161,8 @@ export function WritingPage() {
await navigator.clipboard.write([clipboardItem]);
message.success("复制成功!");
} catch (error) {
console.log(error);
message.error("复制失败");
}
};
... ...
/* 在你的样式文件中 */
.attach-file {
display: flex;
align-items: center;
/* 垂直居中对齐 */
gap: 10px;
/* 文件名和删除按钮之间的间距 */
padding: 8px 12px;
border-radius: 4px;
background-color: #f5f5f5;
/* 背景颜色 */
cursor: pointer;
/* 鼠标悬停效果 */
transition: background-color 0.2s;
/* 平滑过渡效果 */
}
.attach-file:hover {
background-color: #e9e9e9;
/* 悬停时的背景颜色 */
}
.file-name {
flex-grow: 1;
/* 文件名占据剩余空间 */
font-size: 14px;
color: #333;
overflow: hidden;
/* 防止文件名过长溢出 */
text-overflow: ellipsis;
/* 超出部分显示省略号 */
white-space: nowrap;
}
.delete-file {
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
/* 圆形按钮 */
background-color: #fff;
cursor: pointer;
transition: all 0.2s;
}
.delete-file:hover {
background-color: #f0f0f0;
/* 悬停时的按钮背景 */
transform: scale(1.1);
/* 悬停时轻微放大 */
}
\ No newline at end of file
... ...
... ... @@ -98,12 +98,19 @@ declare global {
BACKGROUND_REMOVAL_API_KEY: string;
MAX_DAILY_USES: number;
//AI PPT
DOCMEE_URL: string;
DOCMEE_API_KEY: string;
DOCMEE_MAX_DAILY_USES: number;
NXET_PUBLIC_BGREMOVAL_MODEL: string;
NXET_PUBLIC_WRITING_MODEL: string;
//腾讯云
TENCENT_COS_SECRETKEY: string;
TENCENT_COS_SECRETID: string;
TENCENT_COS_BUCKET: string;
TENCENT_COS_URL: string;
}
}
}
... ... @@ -287,7 +294,15 @@ export const getServerSideConfig = () => {
docmeeApiKey: process.env.DOCMEE_API_KEY ?? "",
docmeeMaxDailyUses: process.env.DOCMEE_MAX_DAILY_USES,
//生成图片模型名称
bgRemovalModel: process.env.NXET_PUBLIC_BGREMOVAL_MODEL,
//生成文章模型名称
writingModel: process.env.NXET_PUBLIC_WRITING_MODEL,
//腾讯云
tencentCosSecretKey: process.env.TENCENT_COS_SECRETKEY,
tencentCosSecretId: process.env.TENCENT_COS_SECRETID,
tencentCosBucket: process.env.TENCENT_COS_BUCKET,
tencentCosUrl: process.env.TENCENT_COS_URL,
};
};
... ...
... ... @@ -81,6 +81,7 @@ export enum ApiPath {
ZuoTang = "/api/tasks",
Docmee = "/api/ppt",
OpenAiImg = "/api/v1",
TencentCos = "/api/cos",
}
///api/tasks/visual/segmentation
//api/tasks/visual/segmentation/{task_id}
... ...
... ... @@ -880,7 +880,7 @@ const cn = {
timeoutErr: "处理超时,请稍后重试",
imgLoadingErr: "图片加载失败",
},
success: "图片处理成功,请在一小时内保存图片!",
success: "图片处理成功",
generateImg: "生成图片",
bgRemoveBtn: "一键抠图",
downloadImg: "下载图片",
... ... @@ -894,6 +894,7 @@ const cn = {
UploadErr: "上传失败",
UnsupportedFile: "不支持的文件类型",
Notread: "未读取到内容",
ImageUploadFail: "文件上传失败,请在30分钟内保存图片",
},
};
... ...
... ... @@ -6,4 +6,5 @@ export type writePromptParam = {
writingTypeName: string;
isImgName: string;
writingCount: string;
fileData: string;
};
... ...
declare module "cos-js-sdk-v5" {
// 进度信息接口
export interface ProgressInfo {
loaded: number;
total: number;
speed: number;
percent: number;
}
// 鉴权凭证回调类型
export interface Credentials {
TmpSecretId: string;
TmpSecretKey: string;
SecurityToken: string;
StartTime: number;
ExpiredTime: number;
}
// 获取签名回调参数
type GetAuthorizationCallback =
| string // 格式一:直接返回签名字符串
| {
// 格式二:返回对象形式
Authorization: string;
SecurityToken?: string;
};
// 鉴权回调选项
type GetAuthorizationOptions =
| {
// 格式一:临时密钥模式
Bucket: string;
Region: string;
}
| {
// 格式二:签名计算模式
Method: string;
Pathname: string;
Key: string;
Query: Record<string, any>;
Headers: Record<string, any>;
};
// SDK 配置项
export interface COSOptions {
// 基础鉴权参数
SecretId?: string;
SecretKey?: string;
SecurityToken?: string;
getAuthorization?: (
options: GetAuthorizationOptions,
callback: (credentials: Credentials | GetAuthorizationCallback) => void,
) => void;
// 并发控制参数
FileParallelLimit?: number;
ChunkParallelLimit?: number;
CopyChunkParallelLimit?: number;
ChunkRetryTimes?: number;
// 分片配置
ChunkSize?: number;
SliceSize?: number;
CopyChunkSize?: number;
CopySliceSize?: number;
// 网络配置
Protocol?: "http" | "https";
ServiceDomain?: string;
Domain?: string;
Proxy?: string;
Timeout?: number;
KeepAlive?: boolean;
StrictSsl?: boolean;
// 高级配置
UploadQueueSize?: number;
UploadCheckContentMd5?: boolean;
ProgressInterval?: number;
UseAccelerate?: boolean;
}
// 上传参数
export interface UploadParams {
Bucket: string;
Region: string;
Key: string;
Body: File | Blob | string | Buffer;
CacheControl?: string;
ContentDisposition?: string;
ContentEncoding?: string;
ContentType?: string;
Expires?: string;
StorageClass?: string;
onProgress?: (progressData: ProgressInfo) => void;
}
// 响应数据结构
export interface ResponseData {
statusCode: number;
headers: Record<string, string>;
Location: string;
ETag: string;
}
// 错误处理
export interface ErrorData {
statusCode?: number;
error?: Error;
message?: string;
}
// 回调函数类型
type Callback<T> = (error: ErrorData | null, data: T & ResponseData) => void;
// COS 核心类
export class COS {
constructor(options: COSOptions);
// 对象操作
uploadFile(
params: UploadParams,
callback?: Callback<{ Location: string; ETag: string }>,
): Promise<ResponseData>;
getObject(
params: {
Bucket: string;
Region: string;
Key: string;
ResponseContentType?: string;
},
callback?: Callback<{ Body: Buffer }>,
): Promise<ResponseData & { Body: Buffer }>;
deleteObject(
params: {
Bucket: string;
Region: string;
Key: string;
},
callback?: Callback<void>,
): Promise<ResponseData>;
// 存储桶操作
getBucket(
params: {
Bucket: string;
Region: string;
Prefix?: string;
Marker?: string;
MaxKeys?: number;
},
callback?: Callback<{
Contents: {
Key: string;
LastModified: string;
ETag: string;
Size: number;
StorageClass: string;
}[];
}>,
): Promise<ResponseData>;
// 分片上传
sliceUploadFile(
params: UploadParams & {
TaskReady?: (taskId: string) => void;
onHashProgress?: (progressData: ProgressInfo) => void;
onProgress?: (progressData: ProgressInfo) => void;
},
callback?: Callback<{ Location: string; ETag: string }>,
): Promise<ResponseData>;
}
// 浏览器环境 File 类型扩展
export interface File extends Blob {
readonly lastModified: number;
readonly name: string;
}
export default COS;
}
... ...
export type FileProps = {
fileData: Blob | null;
setFileData: React.Dispatch<React.SetStateAction<Blob | null>>;
export type PanelProps = {
previewUrl: string | null;
setPreviewUrl: React.Dispatch<React.SetStateAction<string | null>>;
isLoading: boolean;
... ...
import { getExcelData } from "./fileExport/export2Excel";
import { getWordData } from "./fileExport/word";
import { getPdfData } from "./fileExport/toPdf";
/**
* 提取文件的扩展名
* @param filename 原始文件名
* @returns 文件扩展名(例如 ".jpg")
*/
function getFileExtension(filename: string): string {
const lastDotIndex = filename.lastIndexOf(".");
return lastDotIndex === -1 ? "" : filename.substring(lastDotIndex);
}
/**
* 清理文件名,替换非字母数字字符为下划线并截断长度
* @param filename 待处理的文件名(不含扩展名)
* @param maxLength 文件名最大长度,默认50
* @returns 清理后的文件名
*/
function cleanFileName(filename: string, maxLength: number = 50): string {
const cleaned = filename
.replace(/[^a-zA-Z0-9]/g, "_") // 非字母数字替换为下划线
.replace(/_+/g, "_") // 合并连续下划线
.replace(/^_+|_+$/g, "") // 去除首尾下划线
.substring(0, maxLength); // 截断到指定长度
return cleaned;
}
/**
* 生成安全的随机字符串
* @param length 字符串长度,默认8
* @returns 随机字符串
*/
function generateRandomString(length: number = 8): string {
const characters =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let result = "";
// 优先使用加密安全的随机数生成器
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
const values = new Uint8Array(length);
crypto.getRandomValues(values);
for (let i = 0; i < length; i++) {
result += characters[values[i] % characters.length];
}
} else {
// 降级方案:使用 Math.random()
for (let i = 0; i < length; i++) {
result += characters[Math.floor(Math.random() * characters.length)];
}
}
return result;
}
/**
* 生成唯一文件名
* @param originalFileName 原始文件名
* @returns 格式为 [清理后的名称]_[时间戳]_[随机字符串].[扩展名]
*/
export function generateUniqueFileName(originalFileName: string): string {
const ext = getFileExtension(originalFileName);
const nameWithoutExt = originalFileName.slice(0, -ext.length);
const cleanedName = cleanFileName(nameWithoutExt);
const timestamp = Date.now().toString();
const randomStr = generateRandomString(8);
// 组合最终文件名
const uniquePart = `${timestamp}_${randomStr}`;
const newName = cleanedName ? `${cleanedName}_${uniquePart}` : uniquePart;
return `${newName}${ext}`;
}
export async function getFileByUrl(url: string): Promise<File> {
try {
// 1. 发起网络请求获取图片数据
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
// 2. 提取文件名(处理URL中的特殊字符)
const parsedUrl = new URL(url);
let filename = "image.png";
// 移除文件名中的查询参数和哈希片段(如 "image.jpg?param=1#section" → "image.jpg")
filename = filename.split(/[?#]/)[0];
// 3. 获取 MIME 类型(优先使用响应头类型)
const mimeType = response.headers.get("Content-Type") || "";
// 4. 转换为 Blob 并生成 File 对象
const blob = await response.blob();
return new File([blob], filename, {
type: mimeType || blob.type, // 双重保障类型
lastModified: Date.now(),
});
} catch (error) {
throw new Error("Failed to download image");
}
}
export async function processChatFile(): Promise<{
data: string;
name: string;
}> {
return new Promise((resolve, reject) => {
// 创建隐藏的文件输入元素
const fileInput = document.createElement("input");
fileInput.type = "file";
fileInput.accept = ".xlsx, .xls, .pdf, .docx, .doc";
fileInput.multiple = false;
fileInput.style.display = "none";
// 文件类型与处理函数映射
const fileHandlers: Record<string, (file: File) => Promise<any>> = {
".xlsx": getExcelData,
".xls": getExcelData,
".doc": getWordData,
".docx": getWordData,
".pdf": getPdfData,
};
fileInput.onchange = async (event: Event) => {
try {
const input = event.target as HTMLInputElement;
const file = input.files?.[0];
if (!file) throw new Error("No file selected");
// 获取文件扩展名并校验类型
const fileExt = file.name
.toLowerCase()
.slice(file.name.lastIndexOf("."));
if (!Object.keys(fileHandlers).includes(fileExt)) {
throw new Error("Unsupported file type");
}
// 处理文件内容
const handler = fileHandlers[fileExt];
const filedata = await handler(file);
// 格式化返回数据
const data = `'''filedata
${file.name}
${JSON.stringify(filedata)}
'''filedata`;
resolve({ data: data, name: file.name });
} catch (error) {
reject(error instanceof Error ? error : new Error(String(error)));
} finally {
fileInput.remove();
}
};
// 触发文件选择
document.body.appendChild(fileInput);
fileInput.click();
});
}
... ...
... ... @@ -10,7 +10,10 @@ export function getWrtingPrompt(param: writePromptParam): string {
writingLanguageName,
prompt,
writingCount,
fileData,
} = param;
console.log("********************", fileData);
console.log("**********************", prompt);
// 根据用途调整文案类型描述
const purposeMap: Record<string, string> = {
... ... @@ -41,7 +44,6 @@ export function getWrtingPrompt(param: writePromptParam): string {
if (isImgName === "是") {
const purpose = purposeMap[rawPurpose] || "公司官网的介绍";
const style = styleMap[rawStyle] || "专业的风格";
isImg = `要求图文混排,需符合以下要求:
文案要配上图片,实现图文混排,要美观,要符合${purpose}的排版标准和写作风格,写作风格要${style},
你没有图片没关系,把图文混排的效果实现,并在你认为要插入图片的地方将图片的Prompt用英文输出给:![description](https://image.pollinations.ai/prompt/description?nologo=true),记得图片地址后面的?nologo=true一定不能去掉了,
... ... @@ -49,8 +51,16 @@ export function getWrtingPrompt(param: writePromptParam): string {
}
const writingTypeName = typeMap[rawType] || "产品推广文案";
let filePrompt = "";
if (fileData) {
filePrompt = `并结合以下文件内容:
${fileData}
`;
}
return `请用${writingLanguageName}撰写一篇关于【${prompt}】的${writingTypeName}:
${isImg}
${filePrompt}
具体要求:
1. 写作风格:${styleMap[rawStyle] || "专业"}
2. 字数要求:不少于${writingCount}字(不计代码)
... ...
import COS from "cos-js-sdk-v5";
import { generateUniqueFileName } from "./fileUtil";
const cos = new COS({
SecretId: "AKIDMWTChxzmKejaChy0sWv50h9NM7g17ze6",
SecretKey: "GMEWfZFilbCYfYDeqoX2IJ6g292g5GCu",
});
export async function cosUploadImage(file: File, dir: string): Promise<string> {
return new Promise((resolve, reject) => {
cos.uploadFile(
{
Bucket: "baolinaitanjie-1253433799",
Region: "ap-guangzhou",
Key: `${dir}/${generateUniqueFileName(file.name)}`,
Body: file,
},
(err, data) => {
if (err) {
reject(err);
} else {
resolve(data.Location);
}
},
);
});
}
... ...
... ... @@ -15,7 +15,9 @@
"@radix-ui/react-slot": "^1.1.2",
"@svgr/webpack": "^6.5.1",
"@tinymce/tinymce-react": "^6.1.0",
"@types/html-to-pdfmake": "^2.4.4",
"@types/mdast": "^4.0.4",
"@types/pdfmake": "^0.2.11",
"@types/tinymce": "^4.6.9",
"@vercel/analytics": "^0.1.11",
"@vercel/speed-insights": "^1.0.2",
... ... @@ -24,12 +26,12 @@
"axios": "^1.7.5",
"cheerio": "^1.0.0",
"clsx": "^2.1.1",
"cos-js-sdk-v5": "^1.8.7",
"docx": "^9.3.0",
"docxtemplater": "^3.60.1",
"echarts": "^5.6.0",
"emoji-picker-react": "^4.9.2",
"file-saver": "^2.0.5",
"fs-extra": "^11.3.0",
"fuse.js": "^7.0.0",
"heic2any": "^0.0.4",
"html-to-image": "^1.11.11",
... ... @@ -71,7 +73,6 @@
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.1.0",
"@types/file-saver": "^2.0.7",
"@types/fs-extra": "^11.0.4",
"@types/html-docx-js": "^0.3.4",
"@types/html-to-draftjs": "^1.5.0",
"@types/jest": "^29.5.14",
... ... @@ -4815,17 +4816,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/@types/fs-extra": {
"version": "11.0.4",
"resolved": "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-11.0.4.tgz",
"integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/jsonfile": "*",
"@types/node": "*"
}
},
"node_modules/@types/graceful-fs": {
"version": "4.1.9",
"resolved": "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
... ... @@ -4875,6 +4865,16 @@
"@types/draft-js": "*"
}
},
"node_modules/@types/html-to-pdfmake": {
"version": "2.4.4",
"resolved": "https://registry.npmmirror.com/@types/html-to-pdfmake/-/html-to-pdfmake-2.4.4.tgz",
"integrity": "sha512-2dt44vpbftXWuObFP3UmQwsl6BGCuByxa6IXaIVLn1TqvWDJ6ithkKbiTuWjxmlpCG9vrLJNZYnckbuKQPf19w==",
"license": "MIT",
"dependencies": {
"@types/jsdom": "*",
"@types/pdfmake": "*"
}
},
"node_modules/@types/istanbul-lib-coverage": {
"version": "2.0.6",
"resolved": "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
... ... @@ -4933,7 +4933,6 @@
"version": "20.0.1",
"resolved": "https://registry.npmmirror.com/@types/jsdom/-/jsdom-20.0.1.tgz",
"integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*",
... ... @@ -4955,16 +4954,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/@types/jsonfile": {
"version": "6.1.4",
"resolved": "https://registry.npmmirror.com/@types/jsonfile/-/jsonfile-6.1.4.tgz",
"integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/jszip": {
"version": "3.4.0",
"resolved": "https://registry.npmmirror.com/@types/jszip/-/jszip-3.4.0.tgz",
... ... @@ -5017,7 +5006,6 @@
"version": "20.17.24",
"resolved": "https://registry.npmmirror.com/@types/node/-/node-20.17.24.tgz",
"integrity": "sha512-d7fGCyB96w9BnWQrOsJtpyiSaBcAYYr75bnK6ZRjDbql2cGLj/3GsL5OYmLPNq76l7Gf2q4Rv9J2o6h5CrD9sA==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~6.19.2"
... ... @@ -5029,6 +5017,25 @@
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
"license": "MIT"
},
"node_modules/@types/pdfkit": {
"version": "0.13.9",
"resolved": "https://registry.npmmirror.com/@types/pdfkit/-/pdfkit-0.13.9.tgz",
"integrity": "sha512-RDG8Yb1zT7I01FfpwK7nMSA433XWpblMqSCtA5vJlSyavWZb303HUYPCel6JTiDDFqwGLvtAnYbH8N/e0Cb89g==",
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/pdfmake": {
"version": "0.2.11",
"resolved": "https://registry.npmmirror.com/@types/pdfmake/-/pdfmake-0.2.11.tgz",
"integrity": "sha512-gglgMQhnG6C2kco13DJlvokqTxL+XKxHwCejElH8fSCNF9ZCkRK6Mzo011jQ0zuug+YlIgn6BpcpZrARyWdW3Q==",
"license": "MIT",
"dependencies": {
"@types/node": "*",
"@types/pdfkit": "*"
}
},
"node_modules/@types/prop-types": {
"version": "15.7.5",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
... ... @@ -5112,7 +5119,6 @@
"version": "4.0.5",
"resolved": "https://registry.npmmirror.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
"integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/trusted-types": {
... ... @@ -6922,18 +6928,6 @@
"node": ">= 0.4.0"
}
},
"node_modules/buffer": {
"version": "4.9.2",
"resolved": "https://registry.npmmirror.com/buffer/-/buffer-4.9.2.tgz",
"integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
"license": "MIT",
"peer": true,
"dependencies": {
"base64-js": "^1.0.2",
"ieee754": "^1.1.4",
"isarray": "^1.0.0"
}
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
... ... @@ -6947,13 +6941,6 @@
"license": "MIT",
"peer": true
},
"node_modules/buffer/node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"license": "MIT",
"peer": true
},
"node_modules/builtin-status-codes": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
... ... @@ -7979,6 +7966,37 @@
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"license": "MIT"
},
"node_modules/cos-js-sdk-v5": {
"version": "1.8.7",
"resolved": "https://registry.npmmirror.com/cos-js-sdk-v5/-/cos-js-sdk-v5-1.8.7.tgz",
"integrity": "sha512-KK3PYbUiLxcjvVhyvEeBQRWzDgAmuldDZQL1lTRM0aeQaI+hlm84xQQQyv+oIRxPnnAIleZF2vUgB4sJFUzcxQ==",
"license": "ISC",
"dependencies": {
"fast-xml-parser": "4.5.0"
}
},
"node_modules/cos-js-sdk-v5/node_modules/fast-xml-parser": {
"version": "4.5.0",
"resolved": "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz",
"integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/NaturalIntelligence"
},
{
"type": "paypal",
"url": "https://paypal.me/naturalintelligence"
}
],
"license": "MIT",
"dependencies": {
"strnum": "^1.0.5"
},
"bin": {
"fxparser": "src/cli/cli.js"
}
},
"node_modules/cose-base": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/cose-base/-/cose-base-1.0.3.tgz",
... ... @@ -11001,29 +11019,6 @@
"readable-stream": "^2.0.0"
}
},
"node_modules/fs-extra": {
"version": "11.3.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.0.tgz",
"integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=14.14"
}
},
"node_modules/fs-extra/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/fs-minipass": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz",
... ... @@ -11435,13 +11430,13 @@
}
},
"node_modules/has-tostringtag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dev": true,
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.2"
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
... ... @@ -12494,14 +12489,16 @@
"license": "MIT"
},
"node_modules/is-regex": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz",
"integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
"call-bound": "^1.0.2",
"gopd": "^1.2.0",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
... ... @@ -14554,27 +14551,6 @@
"node": ">=6"
}
},
"node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/jsonfile/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/jspdf": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/jspdf/-/jspdf-3.0.1.tgz",
... ... @@ -15678,6 +15654,19 @@
"web-worker": "^1.2.0"
}
},
"node_modules/mermaid/node_modules/uuid": {
"version": "9.0.1",
"resolved": "https://registry.npmmirror.com/uuid/-/uuid-9.0.1.tgz",
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
],
"license": "MIT",
"bin": {
"uuid": "dist/bin/uuid"
}
},
"node_modules/micromark": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz",
... ... @@ -16797,6 +16786,32 @@
"vm-browserify": "^1.0.1"
}
},
"node_modules/node-libs-browser/node_modules/buffer": {
"version": "4.9.2",
"resolved": "https://registry.npmmirror.com/buffer/-/buffer-4.9.2.tgz",
"integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
"license": "MIT",
"peer": true,
"dependencies": {
"base64-js": "^1.0.2",
"ieee754": "^1.1.4",
"isarray": "^1.0.0"
}
},
"node_modules/node-libs-browser/node_modules/inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
"license": "ISC",
"peer": true
},
"node_modules/node-libs-browser/node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"license": "MIT",
"peer": true
},
"node_modules/node-libs-browser/node_modules/punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz",
... ... @@ -16804,6 +16819,27 @@
"license": "MIT",
"peer": true
},
"node_modules/node-libs-browser/node_modules/stream-browserify": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/stream-browserify/-/stream-browserify-2.0.2.tgz",
"integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
"license": "MIT",
"peer": true,
"dependencies": {
"inherits": "~2.0.1",
"readable-stream": "^2.0.2"
}
},
"node_modules/node-libs-browser/node_modules/util": {
"version": "0.11.1",
"resolved": "https://registry.npmmirror.com/util/-/util-0.11.1.tgz",
"integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"inherits": "2.0.3"
}
},
"node_modules/node-releases": {
"version": "2.0.19",
"resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz",
... ... @@ -20044,15 +20080,18 @@
}
},
"node_modules/safe-regex-test": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
"integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
"integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.1.3",
"is-regex": "^1.1.4"
"call-bound": "^1.0.2",
"es-errors": "^1.3.0",
"is-regex": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
... ... @@ -20831,17 +20870,6 @@
"node": ">= 0.4"
}
},
"node_modules/stream-browserify": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/stream-browserify/-/stream-browserify-2.0.2.tgz",
"integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
"license": "MIT",
"peer": true,
"dependencies": {
"inherits": "~2.0.1",
"readable-stream": "^2.0.2"
}
},
"node_modules/stream-each": {
"version": "1.2.3",
"resolved": "https://registry.npmmirror.com/stream-each/-/stream-each-1.2.3.tgz",
... ... @@ -21073,6 +21101,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/strnum": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/strnum/-/strnum-1.1.2.tgz",
"integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/NaturalIntelligence"
}
],
"license": "MIT"
},
"node_modules/style-to-object": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz",
... ... @@ -21774,7 +21814,6 @@
"version": "6.19.8",
"resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
"dev": true,
"license": "MIT"
},
"node_modules/unicode-canonical-property-names-ecmascript": {
... ... @@ -22204,29 +22243,12 @@
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/util": {
"version": "0.11.1",
"resolved": "https://registry.npmmirror.com/util/-/util-0.11.1.tgz",
"integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"inherits": "2.0.3"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
"node_modules/util/node_modules/inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
"license": "ISC",
"peer": true
},
"node_modules/utrie": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/utrie/-/utrie-1.0.2.tgz",
... ... @@ -22236,15 +22258,6 @@
"base64-arraybuffer": "^1.0.2"
}
},
"node_modules/uuid": {
"version": "9.0.0",
"resolved": "https://registry.npmmirror.com/uuid/-/uuid-9.0.0.tgz",
"integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
"license": "MIT",
"bin": {
"uuid": "dist/bin/uuid"
}
},
"node_modules/uvu": {
"version": "0.5.6",
"resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz",
... ...
... ... @@ -40,8 +40,8 @@
"axios": "^1.7.5",
"cheerio": "^1.0.0",
"clsx": "^2.1.1",
"cos-js-sdk-v5": "^1.8.7",
"docx": "^9.3.0",
"docxtemplater": "^3.60.1",
"echarts": "^5.6.0",
"emoji-picker-react": "^4.9.2",
"file-saver": "^2.0.5",
... ...
... ... @@ -2299,7 +2299,7 @@
"@tinymce/tinymce-react@^6.1.0":
version "6.1.0"
resolved "https://registry.npmmirror.com/@tinymce/tinymce-react/-/tinymce-react-6.1.0.tgz#1c53bc9790f46e5f0502764c2c421562b03176c2"
resolved "https://registry.npmmirror.com/@tinymce/tinymce-react/-/tinymce-react-6.1.0.tgz"
integrity sha512-K0MP3yYVKe8+etUwsg6zyRq+q9TGLaVf005WiBHiB8JZEomAwbBPERGunhU9uOqNQ5gJs8yVOPZ68Xcd1UHclA==
dependencies:
prop-types "^15.6.2"
... ... @@ -2512,7 +2512,7 @@
"@types/html-to-pdfmake@^2.4.4":
version "2.4.4"
resolved "https://registry.npmmirror.com/@types/html-to-pdfmake/-/html-to-pdfmake-2.4.4.tgz#42f97eaaf69ecb68f701b686e56fd914e1780b81"
resolved "https://registry.npmmirror.com/@types/html-to-pdfmake/-/html-to-pdfmake-2.4.4.tgz"
integrity sha512-2dt44vpbftXWuObFP3UmQwsl6BGCuByxa6IXaIVLn1TqvWDJ6ithkKbiTuWjxmlpCG9vrLJNZYnckbuKQPf19w==
dependencies:
"@types/jsdom" "*"
... ... @@ -2547,7 +2547,7 @@
"@types/jquery@*":
version "3.5.32"
resolved "https://registry.npmmirror.com/@types/jquery/-/jquery-3.5.32.tgz#3eb0da20611b92c7c49ebed6163b52a4fdc57def"
resolved "https://registry.npmmirror.com/@types/jquery/-/jquery-3.5.32.tgz"
integrity sha512-b9Xbf4CkMqS02YH8zACqN1xzdxc3cO735Qe5AbSUFmyOiaWAbcpqh9Wna+Uk0vgACvoQHpWDg2rGdHkYPLmCiQ==
dependencies:
"@types/sizzle" "*"
... ... @@ -2557,16 +2557,7 @@
resolved "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz"
integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==
"@types/jsdom@*":
version "21.1.7"
resolved "https://registry.npmmirror.com/@types/jsdom/-/jsdom-21.1.7.tgz#9edcb09e0b07ce876e7833922d3274149c898cfa"
integrity sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==
dependencies:
"@types/node" "*"
"@types/tough-cookie" "*"
parse5 "^7.0.0"
"@types/jsdom@^20.0.0":
"@types/jsdom@*", "@types/jsdom@^20.0.0":
version "20.0.1"
resolved "https://registry.npmmirror.com/@types/jsdom/-/jsdom-20.0.1.tgz"
integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==
... ... @@ -2654,14 +2645,14 @@
"@types/pdfkit@*":
version "0.13.9"
resolved "https://registry.npmmirror.com/@types/pdfkit/-/pdfkit-0.13.9.tgz#0acf17575737c8856a946e5dfad35ad444b510a1"
resolved "https://registry.npmmirror.com/@types/pdfkit/-/pdfkit-0.13.9.tgz"
integrity sha512-RDG8Yb1zT7I01FfpwK7nMSA433XWpblMqSCtA5vJlSyavWZb303HUYPCel6JTiDDFqwGLvtAnYbH8N/e0Cb89g==
dependencies:
"@types/node" "*"
"@types/pdfmake@*", "@types/pdfmake@^0.2.11":
version "0.2.11"
resolved "https://registry.npmmirror.com/@types/pdfmake/-/pdfmake-0.2.11.tgz#ca5475efe44c966e88aed90040670f562ac1eebc"
resolved "https://registry.npmmirror.com/@types/pdfmake/-/pdfmake-0.2.11.tgz"
integrity sha512-gglgMQhnG6C2kco13DJlvokqTxL+XKxHwCejElH8fSCNF9ZCkRK6Mzo011jQ0zuug+YlIgn6BpcpZrARyWdW3Q==
dependencies:
"@types/node" "*"
... ... @@ -2707,7 +2698,7 @@
"@types/sizzle@*":
version "2.3.9"
resolved "https://registry.npmmirror.com/@types/sizzle/-/sizzle-2.3.9.tgz#d4597dbd4618264c414d7429363e3f50acb66ea2"
resolved "https://registry.npmmirror.com/@types/sizzle/-/sizzle-2.3.9.tgz"
integrity sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==
"@types/spark-md5@^3.0.4":
... ... @@ -2722,7 +2713,7 @@
"@types/tinymce@^4.6.9":
version "4.6.9"
resolved "https://registry.npmmirror.com/@types/tinymce/-/tinymce-4.6.9.tgz#4d347b3831b35d59514fab2ab90c5d500e844ee2"
resolved "https://registry.npmmirror.com/@types/tinymce/-/tinymce-4.6.9.tgz"
integrity sha512-pDxBUlV4v1jgJ97SlnVOSyf3KUy3OQ3s5Ddpfh1L9M5lXlBmX7TJ2OLSozx1WBxp91acHvYPWDwz2U/kMM1oxQ==
dependencies:
"@types/jquery" "*"
... ... @@ -2971,11 +2962,6 @@
resolved "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz"
integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==
"@xmldom/xmldom@^0.9.7":
version "0.9.8"
resolved "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.9.8.tgz"
integrity sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
resolved "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz"
... ... @@ -3888,6 +3874,13 @@ core-util-is@~1.0.0:
resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz"
integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
cos-js-sdk-v5@^1.8.7:
version "1.8.7"
resolved "https://registry.npmmirror.com/cos-js-sdk-v5/-/cos-js-sdk-v5-1.8.7.tgz"
integrity sha512-KK3PYbUiLxcjvVhyvEeBQRWzDgAmuldDZQL1lTRM0aeQaI+hlm84xQQQyv+oIRxPnnAIleZF2vUgB4sJFUzcxQ==
dependencies:
fast-xml-parser "4.5.0"
cose-base@^1.0.0:
version "1.0.3"
resolved "https://registry.npmmirror.com/cose-base/-/cose-base-1.0.3.tgz"
... ... @@ -4546,13 +4539,6 @@ docx@^9.3.0:
xml "^1.0.1"
xml-js "^1.6.8"
docxtemplater@^3.60.1:
version "3.60.1"
resolved "https://registry.npmmirror.com/docxtemplater/-/docxtemplater-3.60.1.tgz"
integrity sha512-xf9C8AbA2GhmUSJQSNomjWpPjVD38k60yP+21eRsVtawTyl+tQ8N9V+alZbuG0dbDvA04OQtpxnEpNL2gF5AkA==
dependencies:
"@xmldom/xmldom" "^0.9.7"
dom-accessibility-api@^0.5.9:
version "0.5.16"
resolved "https://registry.npmmirror.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz"
... ... @@ -5232,6 +5218,13 @@ fast-levenshtein@^2.0.6:
resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
fast-xml-parser@4.5.0:
version "4.5.0"
resolved "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz"
integrity sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==
dependencies:
strnum "^1.0.5"
fastq@^1.6.0:
version "1.15.0"
resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz"
... ... @@ -5569,7 +5562,7 @@ gopd@^1.0.1, gopd@^1.2.0:
graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
version "4.2.11"
resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
graphemer@^1.4.0:
... ... @@ -5609,12 +5602,12 @@ has-symbols@^1.0.2, has-symbols@^1.0.3, has-symbols@^1.1.0:
resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz"
integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
has-tostringtag@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz"
integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz"
integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
dependencies:
has-symbols "^1.0.2"
has-symbols "^1.0.3"
has@^1.0.3:
version "1.0.3"
... ... @@ -6060,13 +6053,15 @@ is-potential-custom-element-name@^1.0.1:
resolved "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz"
integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
is-regex@^1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz"
integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
is-regex@^1.1.4, is-regex@^1.2.1:
version "1.2.1"
resolved "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz"
integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==
dependencies:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
call-bound "^1.0.2"
gopd "^1.2.0"
has-tostringtag "^1.0.2"
hasown "^2.0.2"
is-set@^2.0.1, is-set@^2.0.2:
version "2.0.2"
... ... @@ -8907,13 +8902,13 @@ safe-buffer@^5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-regex-test@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz"
integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==
version "1.1.0"
resolved "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz"
integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==
dependencies:
call-bind "^1.0.2"
get-intrinsic "^1.1.3"
is-regex "^1.1.4"
call-bound "^1.0.2"
es-errors "^1.3.0"
is-regex "^1.2.1"
"safer-buffer@>= 2.1.2 < 3.0.0":
version "2.1.2"
... ... @@ -9370,6 +9365,11 @@ strip-json-comments@^3.1.1:
resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
strnum@^1.0.5:
version "1.1.2"
resolved "https://registry.npmmirror.com/strnum/-/strnum-1.1.2.tgz"
integrity sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==
style-to-object@^0.4.0:
version "0.4.1"
resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz"
... ... @@ -9893,9 +9893,9 @@ utrie@^1.0.2:
base64-arraybuffer "^1.0.2"
uuid@^9.0.0:
version "9.0.0"
resolved "https://registry.npmmirror.com/uuid/-/uuid-9.0.0.tgz"
integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==
version "9.0.1"
resolved "https://registry.npmmirror.com/uuid/-/uuid-9.0.1.tgz"
integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==
uvu@^0.5.0:
version "0.5.6"
... ...