refactor(后台富文本): 编辑器从 wangEditor 换成 Tiptap,老题面的图片尺寸、缩进、颜色打开再保存都不丢
Deploy / deploy (push) Canceled after 0s

拿库里全部 3384 条题面 / 提示 / 公告 / 比赛说明做过往返比对,补上图片 style、base64 图片、
段落缩进三处后文字和格式都对得上。工具栏照画布做成一行浅灰小图标,四套档位不变,
加了行内代码、光标在表格里出加删行列。表格格子里的段落在学生端不再把行撑高。
编辑器 JS 638 kB → 455 kB,wangEditor 的 39 kB 样式不用了;polyfill 清单重新审过,
去掉只有 wangEditor 用到的 web.immediate。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-10-20 20:20:13 +08:00
1 parent a2dcafae14
commit 9e2217e09d
8 files changed
+874 -230

No files matched your search

+4
View File
@@ -168,6 +168,10 @@ Naive 的日期选择器按浏览器本地时区渲染、没有 `timezone` 属
- `utils/functions.ts` — `parseTime` / `zonedParts` / `zonedYear`(东八区时间口径,见上)、
`duration`、压缩与剪贴板等杂项
- `utils/judge.ts` — Judge-related utilities
- `shared/richText.ts` — 后台富文本(`shared/components/TextEditor.vue`,Tiptap)的扩展配置。
库里是 wangEditor 时代的 HTML,Tiptap 认不出的东西打开再保存就悄悄没了 —— **动扩展之前
拿全量存量内容做一遍往返比对**(HTML → Tiptap → HTML,再过 markdown-it 比学生看到的),
图片尺寸、缩进那两个补丁就是这么比出来的
### Environment Variables
+8 -2
View File
@@ -22,10 +22,16 @@
"@codemirror/view": "^6.43.14",
"@lezer/highlight": "^1.2.5",
"@oj2/contract": "workspace:*",
"@tiptap/core": "3.32.0",
"@tiptap/extension-image": "3.32.0",
"@tiptap/extension-table": "3.32.0",
"@tiptap/extension-text-align": "3.32.0",
"@tiptap/extension-text-style": "3.32.0",
"@tiptap/pm": "3.32.0",
"@tiptap/starter-kit": "3.32.0",
"@tiptap/vue-3": "3.32.0",
"@vueuse/core": "^15.0.0",
"@vueuse/router": "^15.0.0",
"@wangeditor-next/editor": "^6.5.0",
"@wangeditor-next/editor-for-vue": "^6.5.0",
"canvas-confetti": "^1.9.4",
"chart.js": "^4.5.1",
"chartjs-chart-wordcloud": "^4.4.5",
+1 -14
View File
@@ -1530,10 +1530,7 @@ onMounted(async () => {
font-size: 13px;
}
/*
* align-items: start 不能省:wangEditor 给内容区写死了 height: 100%,格子把 .field 拉伸成
* 确定高度之后这个 100% 就按外框算,工具栏的高度被挤出去,编辑框盖到下面的知识点那行上
*/
/* 输入、输出两格各按自己的内容长高,不互相拉齐 */
.io {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -1712,16 +1709,6 @@ onMounted(async () => {
grid-template-columns: minmax(0, 1fr);
}
/* 老题面里的图片带着写死的像素宽(有 1118px 的),把整页撑出横向滚动 */
.card :deep(.w-e-image-container) {
max-width: 100%;
height: auto !important;
}
.card :deep(.w-e-image-container img) {
height: auto !important;
}
.inlineRow {
flex-wrap: wrap;
}
@@ -103,6 +103,12 @@ onKeyStroke("Escape", () => {
margin: 0.25em 0;
}
/* 后台富文本(Tiptap)存的表格,格子里的字包在 <p> 里;不收掉边距,每行都被撑高一截 */
.oj-markdown td > p,
.oj-markdown th > p {
margin: 0;
}
.oj-markdown a {
color: v-bind("theme.primaryColor");
text-decoration: none;
+680 -102
View File
@@ -1,7 +1,8 @@
<script setup lang="ts">
import type { IDomEditor, IEditorConfig, IToolbarConfig } from "@wangeditor-next/editor"
import { Editor, Toolbar } from "@wangeditor-next/editor-for-vue"
import "@wangeditor-next/editor/dist/css/style.css"
import { Icon } from "@iconify/vue"
import { EditorContent, useEditor } from "@tiptap/vue-3"
import { useThemeVars } from "naive-ui"
import { richTextExtensions, toEditorHtml } from "shared/richText"
import { uploadImage } from "../../admin/api"
interface Props {
@@ -15,148 +16,522 @@ interface Props {
}
const rawHtml = defineModel<string>("value")
type InsertFnType = (url: string, alt: string, href: string) => void
const { title, minHeight = 0, simple = false, compact = false, mini = false } = defineProps<Props>()
const message = useMessage()
const theme = useThemeVars()
const editorRef = shallowRef<IDomEditor>()
const toolbarEditorRef = shallowRef<IDomEditor>()
type Tool =
| "heading"
| "fontSize"
| "blockquote"
| "bold"
| "italic"
| "underline"
| "strike"
| "code"
| "color"
| "bgColor"
| "bulletList"
| "orderedList"
| "alignLeft"
| "alignCenter"
| "alignRight"
| "image"
| "emoji"
| "link"
| "table"
| "codeBlock"
| "hr"
| "clear"
| "undo"
| "redo"
| "|"
const toolbarConfig: Partial<IToolbarConfig> = {
toolbarKeys: [
"blockquote",
"headerSelect",
const TOOLBARS: Record<"full" | "simple" | "compact" | "mini", Tool[]> = {
full: [
"heading",
"fontSize",
"lineHeight",
"blockquote",
"|",
"bold",
"underline",
"italic",
"through",
"strike",
"code",
"color",
"bgColor",
"|",
"bulletedList",
"numberedList",
"justifyLeft",
"justifyCenter",
"justifyRight",
"bulletList",
"orderedList",
"alignLeft",
"alignCenter",
"alignRight",
"|",
"uploadImage",
"emotion",
"insertLink",
"insertTable",
"divider",
"image",
"emoji",
"link",
"table",
"codeBlock",
"hr",
"|",
"clearStyle",
"clear",
"undo",
"redo",
],
}
const toolbarConfigSimple: Partial<IToolbarConfig> = {
toolbarKeys: [
"bold",
"color",
"bgColor",
"emotion",
"uploadImage",
"insertLink",
"clearStyle",
"undo",
"redo",
],
}
const toolbarConfigCompact: Partial<IToolbarConfig> = {
toolbarKeys: [
simple: ["bold", "color", "bgColor", "emoji", "image", "link", "clear", "undo", "redo"],
compact: [
"bold",
"code",
"color",
"bgColor",
"|",
"bulletedList",
"numberedList",
"bulletList",
"orderedList",
"|",
"uploadImage",
"insertTable",
"insertLink",
"emotion",
"image",
"table",
"link",
"emoji",
"|",
"clearStyle",
"clear",
"undo",
"redo",
],
mini: ["bold", "color", "image", "link", "undo", "redo"],
}
const toolbarConfigMini: Partial<IToolbarConfig> = {
toolbarKeys: ["bold", "color", "uploadImage", "insertLink", "undo", "redo"],
}
const tools = computed(
() => TOOLBARS[mini ? "mini" : simple ? "simple" : compact ? "compact" : "full"],
)
const editorConfig: Partial<IEditorConfig> = {
scroll: false,
MENU_CONF: {
// @ts-ignore
uploadImage: { customUpload },
/** 最后一次交出去的值:v-model 回来的是它就不用再 setContent,不然光标会跳到开头 */
let lastEmitted: string | undefined
const editor = useEditor({
content: toEditorHtml(rawHtml.value ?? ""),
extensions: richTextExtensions,
editorProps: {
// 截图直接粘贴、拖进来的图片文件走上传;从网页复制的带 HTML,照常粘
handlePaste: (_view, event) => uploadFiles(event.clipboardData),
handleDrop: (_view, event) => uploadFiles((event as DragEvent).dataTransfer),
},
onUpdate({ editor }) {
// 空编辑器交空串,不交 `<p></p>`:调用方拿「空」判断必填
lastEmitted = editor.isEmpty ? "" : editor.getHTML()
rawHtml.value = lastEmitted
},
}
onBeforeUnmount(() => {
const editor = editorRef.value
if (editor) editor.destroy()
})
function onClick() {
if (!editorRef.value) return
editorRef.value.blur()
editorRef.value.focus()
watch(rawHtml, (value) => {
if (!editor.value || value === lastEmitted) return
lastEmitted = value
editor.value.commands.setContent(toEditorHtml(value ?? ""), { emitUpdate: false })
})
/** 工具栏一律用它:保住编辑区的选区,点完按钮光标还在原处 */
function chain() {
return editor.value!.chain().focus()
}
async function handleCreated(editor: IDomEditor) {
editorRef.value = editor
await nextTick()
toolbarEditorRef.value = editor
function isActive(name: string, attributes?: Record<string, unknown>) {
return editor.value?.isActive(name, attributes) ?? false
}
async function customUpload(file: File, insertFn: InsertFnType) {
const path = await uploadImage(file)
function isAligned(align: "left" | "center" | "right") {
return editor.value?.isActive({ textAlign: align }) ?? false
}
function uploadFiles(data: DataTransfer | null | undefined) {
if (!data || data.getData("text/html")) return false
const images = Array.from(data.files).filter((file) => file.type.startsWith("image/"))
if (!images.length) return false
images.forEach(insertUploaded)
return true
}
async function insertUploaded(file: File) {
const path = await uploadImage(file).catch(() => "")
if (!path) {
message.error("图片上传失败")
return
}
const url = path
const alt = "图片"
const href = ""
insertFn(url, alt, href)
chain().setImage({ src: path, alt: "图片" }).run()
}
const fileInput = ref<HTMLInputElement>()
function onPickImage(event: Event) {
const input = event.target as HTMLInputElement
Array.from(input.files ?? []).forEach(insertUploaded)
input.value = ""
}
const HEADINGS = [
{ label: "正文", key: 0 },
{ label: "标题 1", key: 1 },
{ label: "标题 2", key: 2 },
{ label: "标题 3", key: 3 },
]
const headingLabel = computed(() => {
const level = [1, 2, 3].find((level) => isActive("heading", { level }))
return level ? `标题 ${level}` : "正文"
})
function onHeading(level: number) {
if (level === 0) chain().setParagraph().run()
else
chain()
.setHeading({ level: level as 1 | 2 | 3 })
.run()
}
const FONT_SIZES = ["12px", "14px", "16px", "18px", "20px", "24px", "28px", "32px"]
const fontSizeOptions = [
{ label: "默认", key: "default" },
...FONT_SIZES.map((size) => ({ label: size.replace("px", ""), key: size })),
]
const fontSizeLabel = computed(() => {
const size = editor.value?.getAttributes("textStyle").fontSize as string | undefined
return size ? size.replace("px", "") : "字号"
})
function onFontSize(size: string) {
if (size !== "default") chain().setFontSize(size).run()
else chain().unsetFontSize().run()
}
// 红是 wangEditor 的那个红:库里 163 处强调都是它
const COLORS = [
"#e13c39",
"#e67e22",
"#d4a017",
"#18a058",
"#2080f0",
"#8e44ad",
"#8a8f96",
"#1f2225",
]
const BG_COLORS = ["#f5db4d", "#fde2e1", "#ffe8cc", "#e7f5ed", "#e6f0fd", "#f0f0f3"]
const showColor = ref(false)
const showBgColor = ref(false)
const currentColor = computed(
() => editor.value?.getAttributes("textStyle").color as string | undefined,
)
function onColor(color: string | null) {
if (color) chain().setColor(color).run()
else chain().unsetColor().run()
showColor.value = false
}
function onBgColor(color: string | null) {
if (color) chain().setBackgroundColor(color).run()
else chain().unsetBackgroundColor().run()
showBgColor.value = false
}
// 机房没有彩色 emoji 字体,靠站点自带的 Noto 兜底;数字键帽、↔️ 那批兜不住,别往这里加
const EMOJIS = [..."😀😄😂🤣😊😍😎🤔😅😭😡😱👍👎👏🙏💪👉👆👇✅❌❗❓💡📌📝🎯🔥⭐🎉🏆🚀💻📚⏰"]
const showEmoji = ref(false)
function onEmoji(emoji: string) {
chain().insertContent(emoji).run()
showEmoji.value = false
}
const showLink = ref(false)
const linkUrl = ref("")
watch(showLink, (show) => {
if (show) linkUrl.value = (editor.value?.getAttributes("link").href as string) ?? ""
})
function applyLink() {
const url = linkUrl.value.trim()
showLink.value = false
if (!url) {
chain().extendMarkRange("link").unsetLink().run()
} else if (editor.value!.state.selection.empty && !isActive("link")) {
// 没选字就把网址本身插进去当链接文字
chain()
.insertContent({ type: "text", text: url, marks: [{ type: "link", attrs: { href: url } }] })
.run()
} else {
chain().extendMarkRange("link").setLink({ href: url }).run()
}
}
interface Button {
icon: string
label: string
run: () => void
active?: () => boolean
}
const BUTTONS: Partial<Record<Tool, Button>> = {
blockquote: {
icon: "ph:quotes",
label: "引用",
run: () => chain().toggleBlockquote().run(),
active: () => isActive("blockquote"),
},
bold: {
icon: "ph:text-b-bold",
label: "加粗",
run: () => chain().toggleBold().run(),
active: () => isActive("bold"),
},
italic: {
icon: "ph:text-italic",
label: "斜体",
run: () => chain().toggleItalic().run(),
active: () => isActive("italic"),
},
underline: {
icon: "ph:text-underline",
label: "下划线",
run: () => chain().toggleUnderline().run(),
active: () => isActive("underline"),
},
strike: {
icon: "ph:text-strikethrough",
label: "删除线",
run: () => chain().toggleStrike().run(),
active: () => isActive("strike"),
},
code: {
icon: "ph:code",
label: "行内代码",
run: () => chain().toggleCode().run(),
active: () => isActive("code"),
},
bulletList: {
icon: "ph:list-bullets",
label: "无序列表",
run: () => chain().toggleBulletList().run(),
active: () => isActive("bulletList"),
},
orderedList: {
icon: "ph:list-numbers",
label: "有序列表",
run: () => chain().toggleOrderedList().run(),
active: () => isActive("orderedList"),
},
alignLeft: {
icon: "ph:text-align-left",
label: "靠左",
run: () => chain().setTextAlign("left").run(),
active: () => isAligned("left"),
},
alignCenter: {
icon: "ph:text-align-center",
label: "居中",
run: () => chain().setTextAlign("center").run(),
active: () => isAligned("center"),
},
alignRight: {
icon: "ph:text-align-right",
label: "靠右",
run: () => chain().setTextAlign("right").run(),
active: () => isAligned("right"),
},
image: { icon: "ph:image", label: "插入图片", run: () => fileInput.value?.click() },
table: {
icon: "ph:table",
label: "插入表格",
run: () => chain().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run(),
},
codeBlock: {
icon: "ph:code-block",
label: "代码块",
run: () => chain().toggleCodeBlock().run(),
active: () => isActive("codeBlock"),
},
hr: { icon: "ph:minus", label: "分割线", run: () => chain().setHorizontalRule().run() },
clear: {
icon: "ph:eraser",
label: "清除格式",
run: () => chain().unsetAllMarks().clearNodes().run(),
},
undo: { icon: "ph:arrow-counter-clockwise", label: "撤销", run: () => chain().undo().run() },
redo: { icon: "ph:arrow-clockwise", label: "重做", run: () => chain().redo().run() },
}
/** 光标在表格里才出来的那几个 */
const TABLE_BUTTONS: Button[] = [
{ icon: "ph:rows-plus-bottom", label: "下面加一行", run: () => chain().addRowAfter().run() },
{
icon: "ph:columns-plus-right",
label: "右边加一列",
run: () => chain().addColumnAfter().run(),
},
{ icon: "ph:rows", label: "删掉这一行", run: () => chain().deleteRow().run() },
{ icon: "ph:columns", label: "删掉这一列", run: () => chain().deleteColumn().run() },
{ icon: "ph:trash", label: "删掉表格", run: () => chain().deleteTable().run() },
]
const items = computed(() => tools.value.map((tool) => ({ tool, button: BUTTONS[tool] })))
const inTable = computed(() => isActive("table"))
</script>
<template>
<div class="title" v-if="title">{{ title }}</div>
<div class="editorWrapper">
<Toolbar
class="toolbar"
:editor="toolbarEditorRef"
:defaultConfig="
mini
? toolbarConfigMini
: simple
? toolbarConfigSimple
: compact
? toolbarConfigCompact
: toolbarConfig
"
mode="simple"
/>
<Editor
@click="onClick"
:style="{ minHeight: minHeight + 'px' }"
v-model="rawHtml"
:defaultConfig="editorConfig"
mode="simple"
@onCreated="handleCreated"
<div class="rte">
<div class="bar" v-if="editor">
<template v-for="({ tool, button }, index) in items" :key="index">
<span v-if="tool === '|'" class="sep" />
<button
v-else-if="button"
type="button"
class="tb"
:class="{ on: button.active?.() }"
:title="button.label"
@mousedown.prevent
@click="button.run()"
>
<Icon :icon="button.icon" />
</button>
<n-dropdown
v-else-if="tool === 'heading'"
trigger="click"
:options="HEADINGS"
@select="onHeading"
>
<button type="button" class="tb text" title="段落格式" @mousedown.prevent>
{{ headingLabel }}<Icon icon="ph:caret-down" width="10" />
</button>
</n-dropdown>
<n-dropdown
v-else-if="tool === 'fontSize'"
trigger="click"
:options="fontSizeOptions"
@select="onFontSize"
>
<button type="button" class="tb text" title="字号" @mousedown.prevent>
{{ fontSizeLabel }}<Icon icon="ph:caret-down" width="10" />
</button>
</n-dropdown>
<n-popover v-else-if="tool === 'color'" v-model:show="showColor" trigger="click">
<template #trigger>
<button type="button" class="tb" title="文字颜色" @mousedown.prevent>
<Icon icon="ph:text-a-underline" :style="{ color: currentColor }" />
</button>
</template>
<div class="swatches">
<button
v-for="color in COLORS"
:key="color"
type="button"
class="swatch"
:style="{ background: color }"
@mousedown.prevent
@click="onColor(color)"
/>
</div>
<n-button size="tiny" quaternary block @mousedown.prevent @click="onColor(null)">
去掉颜色
</n-button>
</n-popover>
<n-popover v-else-if="tool === 'bgColor'" v-model:show="showBgColor" trigger="click">
<template #trigger>
<button type="button" class="tb" title="背景色" @mousedown.prevent>
<Icon icon="ph:highlighter" />
</button>
</template>
<div class="swatches">
<button
v-for="color in BG_COLORS"
:key="color"
type="button"
class="swatch"
:style="{ background: color }"
@mousedown.prevent
@click="onBgColor(color)"
/>
</div>
<n-button size="tiny" quaternary block @mousedown.prevent @click="onBgColor(null)">
去掉背景色
</n-button>
</n-popover>
<n-popover v-else-if="tool === 'emoji'" v-model:show="showEmoji" trigger="click">
<template #trigger>
<button type="button" class="tb" title="表情" @mousedown.prevent>
<Icon icon="ph:smiley" />
</button>
</template>
<div class="emojis">
<button
v-for="emoji in EMOJIS"
:key="emoji"
type="button"
class="emoji"
@mousedown.prevent
@click="onEmoji(emoji)"
>
{{ emoji }}
</button>
</div>
</n-popover>
<n-popover v-else-if="tool === 'link'" v-model:show="showLink" trigger="click">
<template #trigger>
<button
type="button"
class="tb"
:class="{ on: isActive('link') }"
title="链接"
@mousedown.prevent
>
<Icon icon="ph:link" />
</button>
</template>
<n-flex :size="6" :wrap="false" style="width: 280px">
<n-input
v-model:value="linkUrl"
size="small"
placeholder="https://"
@keydown.enter.prevent="applyLink"
/>
<n-button size="small" type="primary" @click="applyLink">确定</n-button>
</n-flex>
</n-popover>
</template>
<template v-if="inTable">
<span class="sep" />
<button
v-for="button in TABLE_BUTTONS"
:key="button.label"
type="button"
class="tb"
:title="button.label"
@mousedown.prevent
@click="button.run()"
>
<Icon :icon="button.icon" />
</button>
</template>
</div>
<EditorContent
:editor="editor"
class="content"
:style="{ '--min-height': minHeight + 'px' }"
@click.self="editor?.commands.focus('end')"
/>
<input ref="fileInput" type="file" accept="image/*" multiple hidden @change="onPickImage" />
</div>
</template>
@@ -165,12 +540,215 @@ async function customUpload(file: File, insertFn: InsertFnType) {
margin-bottom: 12px;
}
.toolbar {
border-bottom: 1px solid #ddd;
.rte {
border: 1px solid v-bind("theme.borderColor");
border-radius: 4px;
margin-bottom: 20px;
background: v-bind("theme.cardColor");
}
.editorWrapper {
border: 1px solid #ddd;
margin-bottom: 20px;
.bar {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 2px;
padding: 3px 6px;
border-bottom: 1px solid v-bind("theme.dividerColor");
}
.tb {
height: 24px;
min-width: 24px;
padding: 0 4px;
border: 0;
border-radius: 3px;
background: none;
color: v-bind("theme.textColor3");
font: inherit;
font-size: 12px;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 2px;
cursor: pointer;
}
.tb svg {
width: 16px;
height: 16px;
}
.tb.text svg {
width: 10px;
height: 10px;
}
.tb:hover {
background: v-bind("theme.hoverColor");
color: v-bind("theme.textColor1");
}
.tb.on {
color: v-bind("theme.primaryColor");
background: v-bind("theme.primaryColorSuppl + '1f'");
}
.sep {
width: 1px;
height: 14px;
margin: 0 4px;
background: v-bind("theme.dividerColor");
}
.swatches {
display: grid;
grid-template-columns: repeat(4, 22px);
gap: 6px;
margin-bottom: 6px;
}
.swatch {
width: 22px;
height: 22px;
border: 1px solid rgba(0, 0, 0, 0.08);
border-radius: 3px;
cursor: pointer;
}
.emojis {
display: grid;
grid-template-columns: repeat(8, 28px);
gap: 2px;
}
.emoji {
width: 28px;
height: 28px;
border: 0;
border-radius: 3px;
background: none;
font-size: 18px;
cursor: pointer;
}
.emoji:hover {
background: v-bind("theme.hoverColor");
}
/* 正文样式往学生端 .oj-markdown 靠,写的时候看到的和学生看到的差不多 */
.content {
padding: 8px 10px;
font-size: 13px;
line-height: 1.7;
cursor: text;
}
.content :deep(.ProseMirror) {
min-height: var(--min-height);
outline: none;
overflow-wrap: break-word;
}
.content :deep(.ProseMirror > :first-child) {
margin-top: 0;
}
.content :deep(.ProseMirror > :last-child) {
margin-bottom: 0;
}
.content :deep(p) {
margin: 0.4em 0;
}
.content :deep(h1),
.content :deep(h2),
.content :deep(h3),
.content :deep(h4) {
margin: 0.8em 0 0.4em;
line-height: 1.4;
}
.content :deep(ul),
.content :deep(ol) {
padding-left: 1.6em;
margin: 0.4em 0;
}
.content :deep(li > p),
.content :deep(td > p),
.content :deep(th > p) {
margin: 0;
}
.content :deep(a) {
color: v-bind("theme.primaryColor");
}
/* 老题面里有写死 1118px 宽的图,别把编辑框撑出横向滚动 */
.content :deep(img) {
max-width: 100%;
height: auto !important;
vertical-align: middle;
}
.content :deep(.ProseMirror-selectednode) {
outline: 2px solid v-bind("theme.primaryColor");
}
.content :deep(blockquote) {
margin: 0.4em 0;
padding-left: 10px;
border-left: 3px solid v-bind("theme.dividerColor");
color: v-bind("theme.textColor3");
}
.content :deep(code) {
padding: 1px 4px;
border-radius: 3px;
background: v-bind("theme.codeColor");
font-family: v-bind("theme.fontFamilyMono");
font-size: 0.92em;
}
.content :deep(pre) {
margin: 0.4em 0;
padding: 8px 10px;
border-radius: 4px;
background: v-bind("theme.codeColor");
overflow-x: auto;
}
.content :deep(pre code) {
padding: 0;
background: none;
}
.content :deep(hr) {
border: 0;
border-top: 1px solid v-bind("theme.dividerColor");
margin: 0.8em 0;
}
.content :deep(table) {
border-collapse: collapse;
margin: 0.4em 0;
}
.content :deep(td),
.content :deep(th) {
min-width: 40px;
padding: 4px 8px;
border: 1px solid v-bind("theme.dividerColor");
vertical-align: top;
}
.content :deep(th) {
font-weight: 600;
background: rgba(128, 128, 128, 0.08);
}
.content :deep(.selectedCell) {
background: v-bind("theme.primaryColorSuppl + '1f'");
}
</style>
+66
View File
@@ -0,0 +1,66 @@
import { Extension } from "@tiptap/core"
import { Image } from "@tiptap/extension-image"
import { TableKit } from "@tiptap/extension-table"
import { TextAlign } from "@tiptap/extension-text-align"
import { TextStyleKit } from "@tiptap/extension-text-style"
import { StarterKit } from "@tiptap/starter-kit"
/**
* 后台富文本(题面、提示、公告、比赛说明)的 Tiptap 配置。
*
* 库里存的是 wangEditor 时代写下的 HTML,Tiptap 只认 schema 里有的东西,认不出的
* 打开再保存就**悄悄没了**。换编辑器前拿全量 3384 条做过往返比对(HTML → Tiptap → HTML,
* 再过一遍 markdown-it 比学生看到的),下面两个补丁就是比出来的:不补的话 232 条的
* 图片尺寸、28 条的缩进会丢。base64 内嵌图片(12 条)靠 `allowBase64`。
* 改这里的扩展之前,照那次的办法重新比一遍。
*/
/** 图片的宽高大多写在 style 里(`width: 384px; height: 435px`,也有百分比),原样留着 */
const StyledImage = Image.extend({
addAttributes() {
return {
...this.parent?.(),
style: {
default: null,
parseHTML: (element) => element.getAttribute("style"),
renderHTML: (attributes) => (attributes.style ? { style: attributes.style } : {}),
},
}
},
})
/** 段落的首行缩进、左边距。老题面里有 `text-indent: 28pt`、`padding-left: 40px` 这种 */
const Indent = Extension.create({
name: "indent",
addGlobalAttributes() {
return (["text-indent", "padding-left", "margin-left"] as const).map((property) => ({
types: ["paragraph", "heading"],
attributes: {
[property]: {
default: null,
parseHTML: (element: HTMLElement) => element.style.getPropertyValue(property) || null,
renderHTML: (attributes: Record<string, string | null>) =>
attributes[property] ? { style: `${property}: ${attributes[property]}` } : {},
},
},
}))
},
})
export const richTextExtensions = [
StarterKit.configure({ link: { openOnClick: false } }),
TextStyleKit,
TextAlign.configure({ types: ["heading", "paragraph"] }),
TableKit,
StyledImage.configure({ inline: true, allowBase64: true }),
Indent,
]
/**
* 交给编辑器之前的整理。没有标签的纯文本(库里 125 条)原样喂进去,换行会被当成空白
* 吞掉 —— 学生端是 markdown-it(breaks: true)渲染的,原来那些换行是真的会换行
*/
export function toEditorHtml(value: string) {
if (value.includes("<")) return value
return value.replace(/&/g, "&amp;").replace(/\n/g, "<br>")
}
+1 -10
View File
@@ -9,7 +9,7 @@ import { NaiveUiResolver } from "unplugin-vue-components/resolvers"
// 但比 vite 8 的默认构建 target(chrome111)低。所以这个插件必须留着:它同时管两件事
// —— 把 build.target 压到 chrome105/es2020,再给现代产物补 core-js 的 API polyfill。
//
// 下面这份清单是 `modernPolyfills: true` 自动探测出来的 50 项,抄下来写死:自动探测要
// 下面这份清单是 `modernPolyfills: true` 自动探测出来的 49 项,抄下来写死:自动探测要
// 对每个产物跑一遍 Babel 扫描,构建从 3 秒涨到 12 秒。**升级前端依赖后重新审计一次**:
// 临时把下面的 modernPolyfills 改成 true,再 DEBUG=vite:legacy bun run build
// (写死清单时它只回显这份清单,不会重新探测)
@@ -60,7 +60,6 @@ const polyfills = [
"es.weak-map.get-or-insert-computed",
"esnext.array.group",
"web.dom-exception.stack",
"web.immediate",
"web.url-search-params.delete",
"web.url-search-params.has",
"web.url-search-params.size",
@@ -126,14 +125,6 @@ export default defineConfig(() => {
// 这里直接读它。tsconfig.json 是 references 空壳也没关系,会顺着找过去(实测)
tsconfigPaths: true,
},
build: {
// 超过 500 kB 的 chunk 只有懒加载的 wangeditor(后台富文本,TextEditor-*.js),
// 640 kB 上下。默认阈值下这条警告每次构建都在报,真涨了反而没人看,所以抬到比它
// 略高。首屏入口 index-*.js 在 175 kB 左右。
// (原来还有 Python 语法检查用的 skulpt、mermaid 的 @mermaid-js/parser,前者挪到
// 服务端的 CPython、后者换成 pele 之后都没了)
chunkSizeWarningLimit: 1000,
},
server: {
port: 5173,
proxy: {
+108 -102
View File
@@ -51,10 +51,16 @@
"@codemirror/view": "^6.43.14",
"@lezer/highlight": "^1.2.5",
"@oj2/contract": "workspace:*",
"@tiptap/core": "3.32.0",
"@tiptap/extension-image": "3.32.0",
"@tiptap/extension-table": "3.32.0",
"@tiptap/extension-text-align": "3.32.0",
"@tiptap/extension-text-style": "3.32.0",
"@tiptap/pm": "3.32.0",
"@tiptap/starter-kit": "3.32.0",
"@tiptap/vue-3": "3.32.0",
"@vueuse/core": "^15.0.0",
"@vueuse/router": "^15.0.0",
"@wangeditor-next/editor": "^6.5.0",
"@wangeditor-next/editor-for-vue": "^6.5.0",
"canvas-confetti": "^1.9.4",
"chart.js": "^4.5.1",
"chartjs-chart-wordcloud": "^4.4.5",
@@ -376,6 +382,12 @@
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "https://registry.npmjs.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
"@floating-ui/core": ["@floating-ui/core@1.8.0", "", { "dependencies": { "@floating-ui/utils": "^0.2.12" } }, "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ=="],
"@floating-ui/dom": ["@floating-ui/dom@1.8.0", "", { "dependencies": { "@floating-ui/core": "^1.8.0", "@floating-ui/utils": "^0.2.12" } }, "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg=="],
"@floating-ui/utils": ["@floating-ui/utils@0.2.12", "", {}, "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="],
"@iconify/types": ["@iconify/types@2.0.0", "https://registry.npmjs.com/@iconify/types/-/types-2.0.0.tgz", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="],
"@iconify/vue": ["@iconify/vue@5.0.3", "https://registry.npmjs.com/@iconify/vue/-/vue-5.0.3.tgz", { "dependencies": { "@iconify/types": "^2.0.0" }, "peerDependencies": { "vue": ">=3.0.0" } }, "sha512-e9x6QZe2/HyeHUog0jzZJSZts7m/YntPYp/p4OqtZEXpHznxWnQpcX30YpuaUH43h69l3YeR1FCJ8V1t3qd7qA=="],
@@ -596,7 +608,69 @@
"@testing-library/user-event": ["@testing-library/user-event@14.6.7", "https://registry.npmjs.com/@testing-library/user-event/-/user-event-14.6.7.tgz", { "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "sha512-MPCpX8bxe8zS+JmmTwLp8jd0dy1rAm60Te/SL8JrQM3qvQJcBOs1d7IefJMyZzqM3EWBrDn/LWDt1BCGu4ASfg=="],
"@transloadit/prettier-bytes": ["@transloadit/prettier-bytes@0.3.5", "https://registry.npmjs.com/@transloadit/prettier-bytes/-/prettier-bytes-0.3.5.tgz", {}, "sha512-xF4A3d/ZyX2LJWeQZREZQw+qFX4TGQ8bGVP97OLRt6sPO6T0TNHBFTuRHOJh7RNmYOBmQ9MHxpolD9bXihpuVA=="],
"@tiptap/core": ["@tiptap/core@3.32.0", "", { "peerDependencies": { "@tiptap/pm": "3.32.0" } }, "sha512-Ghh2h02GKSqzytQGcLV4espYOG4EHxjj0MsrUB2Vnr47xmlZYRf6r7k2J09H+JpBdaGrWwrTkyBEi5i3c3yy2Q=="],
"@tiptap/extension-blockquote": ["@tiptap/extension-blockquote@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0", "@tiptap/pm": "3.32.0" } }, "sha512-wmuthEdlYVArNoUbqFPH35giutBABFu7fqEB0lTD1k0UXJUs4dFvcbRyGWWgnHFZgP3TT4u8e+xiayYw0eQ0NQ=="],
"@tiptap/extension-bold": ["@tiptap/extension-bold@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0" } }, "sha512-SQYewnYDoIBN+8oH53IDcD8p+Pz+Jnyq3hrxjy/FAo5ctc+96d3ZLdqc9gzLVSqFFo/SUINv2FVGoq9PvU7yqw=="],
"@tiptap/extension-bubble-menu": ["@tiptap/extension-bubble-menu@3.32.0", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "@tiptap/core": "3.32.0", "@tiptap/pm": "3.32.0" } }, "sha512-X3ll8i9Z8QNvt7+tcqlwopJG+68ugO13Av0Ox4Ico+jXcTnFdDuKQJBSI9sLuMR5vTQOeTHhKYXhjF88aahMSA=="],
"@tiptap/extension-bullet-list": ["@tiptap/extension-bullet-list@3.32.0", "", { "peerDependencies": { "@tiptap/extension-list": "3.32.0" } }, "sha512-Y5P/l06pVCUG46vXpBl3z0fW2b6JpSMX4Cvr+5sfQh8zB3TxwSiLQaaPwI3R5MFD1KfRk3AjiPRieEyXdWcNHw=="],
"@tiptap/extension-code": ["@tiptap/extension-code@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0" } }, "sha512-I+aEVl0dTmkfnU6HzBGEefb9U7ja2MkucwBBwrmoMwU+uIKpC4xw8NcHC9X6sjAcom3Pxs2HX+8WEo4Vp13R/Q=="],
"@tiptap/extension-code-block": ["@tiptap/extension-code-block@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0", "@tiptap/pm": "3.32.0" } }, "sha512-9NZW/yXP9j9XKr+hRS5m58xiyZI+tQo1PJ7eLHXjGNFWaF601NG/h6741mbKh5uCY51XsbyqG+7que+RavngPA=="],
"@tiptap/extension-document": ["@tiptap/extension-document@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0" } }, "sha512-GugeKE6AnZDluRXJUNBuX43TPcaJxy5wck6vT2J4a0/EnKStJ43suSZZf1IPfb1ij9EL9bYvAwg9DOcrvdEzTQ=="],
"@tiptap/extension-dropcursor": ["@tiptap/extension-dropcursor@3.32.0", "", { "peerDependencies": { "@tiptap/extensions": "3.32.0" } }, "sha512-t4Ug8hFLt30dwwYvrh63BVUt6N1Yg5PVI3tMllhCmN3Q68oD47v4MB/i5nGfzIsQqMyXUOetwHJWcZ4MoLTx4Q=="],
"@tiptap/extension-floating-menu": ["@tiptap/extension-floating-menu@3.32.0", "", { "peerDependencies": { "@floating-ui/dom": "^1.0.0", "@tiptap/core": "3.32.0", "@tiptap/pm": "3.32.0" } }, "sha512-AzKCWceL+4Q1pTc8Whw1kPqN/aYGPQ70/jXPsblWl501t/pXi6Kz0Pi/NggKkuu73VGjykh68YYf/dcOJ/mPZQ=="],
"@tiptap/extension-gapcursor": ["@tiptap/extension-gapcursor@3.32.0", "", { "peerDependencies": { "@tiptap/extensions": "3.32.0" } }, "sha512-HUpKKWJLtthnpQY5LIjHlJJOmh562RusmOMIe/4iP/H7y+WUR9ZFiZjEs1NBkRjig9fwj8F3BfsrVPYBnM4nLA=="],
"@tiptap/extension-hard-break": ["@tiptap/extension-hard-break@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0" } }, "sha512-IKUYvK+bO2hGrDWhhTVg0CSh9C2belWg9GyLzvpyd3SZyQ9EgdccLfoytNjOBKbAE/TQ4Oo3kSP+XF6RsUIKPA=="],
"@tiptap/extension-heading": ["@tiptap/extension-heading@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0" } }, "sha512-XRiZxZuhfjvbgwCvoBHj04gOsPANEXxxRwrFCQVuFi5yeTHYIzMEioc81j6iAH9pV7aQeJCwLxuh6VHNz3dXEQ=="],
"@tiptap/extension-horizontal-rule": ["@tiptap/extension-horizontal-rule@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0", "@tiptap/pm": "3.32.0" } }, "sha512-Iry7ynsG4xgcxnH1cm+uXJnEtUzoop4sGA10NUN9I+08TOjhj/GrDiRKMQHKAiVI/R7t2MVav1MJlxFf2FdzGw=="],
"@tiptap/extension-image": ["@tiptap/extension-image@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0" } }, "sha512-nv/YlOMwFUp2ItffQbHb14yAJjrn9sdxKl0WK5rH8PPiNoXVkvasieoBLNTHan9gjhrSp7LjVG2ZsMoSe/I7gg=="],
"@tiptap/extension-italic": ["@tiptap/extension-italic@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0" } }, "sha512-KB/i1xoHilbBGcQ+UotDWhi60KpdCde3RzRIpl2na0Yol4z4Fe2IRWg8ljIrlsssDRwel/fsHJbG7a13EP8oKA=="],
"@tiptap/extension-link": ["@tiptap/extension-link@3.32.0", "", { "dependencies": { "linkifyjs": "^4.3.3" }, "peerDependencies": { "@tiptap/core": "3.32.0", "@tiptap/pm": "3.32.0" } }, "sha512-DRdQSgWPSEjrDg5EDBB5yxRygHtUVLhceVGzAsTz8RziiFyvcwAvzBHCO9hd9jutjCXQ2DLIuZB8P+aHhFWnpg=="],
"@tiptap/extension-list": ["@tiptap/extension-list@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0", "@tiptap/pm": "3.32.0" } }, "sha512-QdzS5nFz9agAQhBgIuQluobWib39W2cMKx1XB6tYSue7bHMJdgPFP0EnGfFajaeVX42CG6RXtQWrNfyQGKhBvg=="],
"@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.32.0", "", { "peerDependencies": { "@tiptap/extension-list": "3.32.0" } }, "sha512-FdJTCAeALixzyyGSSEmroXmkIEclbo/4t2Pl03aRERqpPOSPJcC3evDtIhLazTuP6v+FjCmJ+pXNql6ov7qitA=="],
"@tiptap/extension-list-keymap": ["@tiptap/extension-list-keymap@3.32.0", "", { "peerDependencies": { "@tiptap/extension-list": "3.32.0" } }, "sha512-vXFre18Dk2m5N/gjo408C02GSrolZ8ZIf0wz6/U8lNC4FcYOISgZFj3BND6uabVntGh2GCSPrVFuNpVPhFnn/A=="],
"@tiptap/extension-ordered-list": ["@tiptap/extension-ordered-list@3.32.0", "", { "peerDependencies": { "@tiptap/extension-list": "3.32.0" } }, "sha512-htZ5hoMLBkGiDP6M5mGemjOoaBmkrj911wiGoTmMMKzO7qJq9QxUBkLY7ILPaKlUWL8U3ccLdDV2TB/nysp4Jg=="],
"@tiptap/extension-paragraph": ["@tiptap/extension-paragraph@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0" } }, "sha512-afKLMc7fWMkkar9H5FilizStSbhFzUoCzdwwdZf6DDsn3LUt8tJlFHACK78cAyx/TzMJBo0N8/8T1u9bL+N67Q=="],
"@tiptap/extension-strike": ["@tiptap/extension-strike@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0" } }, "sha512-J9Vw6wmh/wV6SxSsN9RhurvAGcXSY5J3p4EQrROD5PARBl0VOnDFi7/UVoz1RkSdqOKPgAiqDZpaLRgtdBO9Rg=="],
"@tiptap/extension-table": ["@tiptap/extension-table@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0", "@tiptap/pm": "3.32.0" } }, "sha512-uOqCzWzxXvMccapZo+1CDxp3JGegxqNl11Lj8XiiWLxwmg81B/bKwMJW7+YlIdffgGNYJETk5YwL8T0IVBD2QQ=="],
"@tiptap/extension-text": ["@tiptap/extension-text@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0" } }, "sha512-sF0jIK67IHdZMnzv2mz5vPTyK7R0ui6/YZgFg+/bLnFCNmweVAoYcHZLlC7ISRnwu0mqJr+epNtzJepY1ZDCjg=="],
"@tiptap/extension-text-align": ["@tiptap/extension-text-align@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0" } }, "sha512-DdV/V86ds9VtQ1MkbovgI28xwSvOW03I8SexsaKljGqSN/HovBXEjlefSnbK4tlWmQLJPH9eNsxRcpHJMftYCA=="],
"@tiptap/extension-text-style": ["@tiptap/extension-text-style@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0" } }, "sha512-+U8FkrNAU45+fHgo4DYfndS/WuhhyttZ+zTyObF1W4VJ8wDiAYqXkl71nQcmMJyyK47yeNUY9CfjUomIaEHhpA=="],
"@tiptap/extension-underline": ["@tiptap/extension-underline@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0" } }, "sha512-rMLdd4vg6sed/JnaXnaupLbCtYiWikTnQ8qir9ItKOXwf1Ui9P1Y4G0bYU4+gcnMsFzaSGtrOhMqG4/c66AogQ=="],
"@tiptap/extensions": ["@tiptap/extensions@3.32.0", "", { "peerDependencies": { "@tiptap/core": "3.32.0", "@tiptap/pm": "3.32.0" } }, "sha512-qO+ndNvlOjzU2MWCtQHoRg1tIortCXLvqPjDx58F1pUYFNCOVZegXi+jqLGDODUA31er+TVz66umzRbbN1bO1Q=="],
"@tiptap/pm": ["@tiptap/pm@3.32.0", "", { "dependencies": { "prosemirror-changeset": "^2.4.4", "prosemirror-commands": "^1.7.2", "prosemirror-dropcursor": "^1.8.4", "prosemirror-gapcursor": "^1.4.1", "prosemirror-history": "^1.5.1", "prosemirror-inputrules": "^1.5.1", "prosemirror-keymap": "^1.2.3", "prosemirror-model": "^1.25.12", "prosemirror-schema-list": "^1.5.1", "prosemirror-state": "^1.4.4", "prosemirror-tables": "^1.8.5", "prosemirror-transform": "^1.12.2", "prosemirror-view": "^1.42.6" } }, "sha512-H9eN+xHFboJybE7KPGVsu24S8aBlCIgYz38vCHRSnNv17nwmqm06owq/IQ5scza0n3Y7IfUfpgPOtm9SgeHmNQ=="],
"@tiptap/starter-kit": ["@tiptap/starter-kit@3.32.0", "", { "dependencies": { "@tiptap/core": "3.32.0", "@tiptap/extension-blockquote": "3.32.0", "@tiptap/extension-bold": "3.32.0", "@tiptap/extension-bullet-list": "3.32.0", "@tiptap/extension-code": "3.32.0", "@tiptap/extension-code-block": "3.32.0", "@tiptap/extension-document": "3.32.0", "@tiptap/extension-dropcursor": "3.32.0", "@tiptap/extension-gapcursor": "3.32.0", "@tiptap/extension-hard-break": "3.32.0", "@tiptap/extension-heading": "3.32.0", "@tiptap/extension-horizontal-rule": "3.32.0", "@tiptap/extension-italic": "3.32.0", "@tiptap/extension-link": "3.32.0", "@tiptap/extension-list": "3.32.0", "@tiptap/extension-list-item": "3.32.0", "@tiptap/extension-list-keymap": "3.32.0", "@tiptap/extension-ordered-list": "3.32.0", "@tiptap/extension-paragraph": "3.32.0", "@tiptap/extension-strike": "3.32.0", "@tiptap/extension-text": "3.32.0", "@tiptap/extension-underline": "3.32.0", "@tiptap/extensions": "3.32.0", "@tiptap/pm": "3.32.0" } }, "sha512-aPYxaevci4PgMrTLsg+baiqI7M1ICd4V9H+zTTdrqs8OUZIbAvj/pNDuHU8uWZyKMu3Dh72t2D6ZdqRu/6aSWw=="],
"@tiptap/vue-3": ["@tiptap/vue-3@3.32.0", "", { "optionalDependencies": { "@tiptap/extension-bubble-menu": "3.32.0", "@tiptap/extension-floating-menu": "3.32.0" }, "peerDependencies": { "@floating-ui/dom": "^1.0.0", "@tiptap/core": "3.32.0", "@tiptap/pm": "3.32.0", "vue": "^3.0.0" } }, "sha512-FpYquLlZpfFzgWcQuOrXuUXDNn8YYomD3dLx92b61XxVMlwKkOH3p1XS/wlNNRBLaA7oSB5VRzy5E7EXtfgqpg=="],
"@types/aria-query": ["@types/aria-query@5.0.4", "https://registry.npmjs.com/@types/aria-query/-/aria-query-5.0.4.tgz", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="],
@@ -616,8 +690,6 @@
"@types/estree": ["@types/estree@1.0.9", "https://registry.npmjs.com/@types/estree/-/estree-1.0.9.tgz", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
"@types/event-emitter": ["@types/event-emitter@0.3.5", "https://registry.npmjs.com/@types/event-emitter/-/event-emitter-0.3.5.tgz", {}, "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ=="],
"@types/linkify-it": ["@types/linkify-it@5.0.0", "https://registry.npmjs.com/@types/linkify-it/-/linkify-it-5.0.0.tgz", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="],
"@types/lodash": ["@types/lodash@4.17.25", "https://registry.npmjs.com/@types/lodash/-/lodash-4.17.25.tgz", {}, "sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ=="],
@@ -630,8 +702,6 @@
"@types/node": ["@types/node@26.6.5", "https://registry.npmjs.com/@types/node/-/node-26.6.5.tgz", { "dependencies": { "undici-types": "~8.9.0" } }, "sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg=="],
"@types/retry": ["@types/retry@0.12.2", "https://registry.npmjs.com/@types/retry/-/retry-0.12.2.tgz", {}, "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow=="],
"@types/sql.js": ["@types/sql.js@1.4.11", "https://registry.npmjs.com/@types/sql.js/-/sql.js-1.4.11.tgz", { "dependencies": { "@types/emscripten": "*", "@types/node": "*" } }, "sha512-QXIx38p2ZThJaK9vP5ZdqdlRe1FG9I8SmCZOS7FHfB/2qPAjZwkL7/vlfPg6N/oWHuuOaGg/P/IRwfP2W0kWVQ=="],
"@types/web-bluetooth": ["@types/web-bluetooth@0.0.21", "https://registry.npmjs.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", {}, "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="],
@@ -676,16 +746,6 @@
"@typescript/typescript-win32-x64": ["@typescript/typescript-win32-x64@7.0.2", "https://registry.npmjs.com/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", { "os": "win32", "cpu": "x64" }, "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g=="],
"@uppy/companion-client": ["@uppy/companion-client@5.1.1", "https://registry.npmjs.com/@uppy/companion-client/-/companion-client-5.1.1.tgz", { "dependencies": { "@uppy/utils": "^7.1.1", "namespace-emitter": "^2.0.1", "p-retry": "^6.1.0" }, "peerDependencies": { "@uppy/core": "^5.1.1" } }, "sha512-DzrOWTbIZHvtgAFXBMYHk2wD27NjpBSVhY2tEiEIUhPd2CxbFRZjHM/N3HOt3VwZEAP471QWFLlJRWPcIY3A2Q=="],
"@uppy/core": ["@uppy/core@5.2.0", "https://registry.npmjs.com/@uppy/core/-/core-5.2.0.tgz", { "dependencies": { "@transloadit/prettier-bytes": "^0.3.4", "@uppy/store-default": "^5.0.0", "@uppy/utils": "^7.1.4", "lodash": "^4.17.21", "mime-match": "^1.0.2", "namespace-emitter": "^2.0.1", "nanoid": "^5.0.9", "preact": "^10.5.13" } }, "sha512-uvfNyz4cnaplt7LYJmEZHuqOuav0tKp4a9WKJIaH6iIj7XiqYvS2J5SEByexAlUFlzefOAyjzj4Ja2dd/8aMrw=="],
"@uppy/store-default": ["@uppy/store-default@5.0.0", "https://registry.npmjs.com/@uppy/store-default/-/store-default-5.0.0.tgz", {}, "sha512-hQtCSQ1yGiaval/wVYUWquYGDJ+bpQ7e4FhUUAsRQz1x1K+o7NBtjfp63O9I4Ks1WRoKunpkarZ+as09l02cPw=="],
"@uppy/utils": ["@uppy/utils@7.2.0", "https://registry.npmjs.com/@uppy/utils/-/utils-7.2.0.tgz", { "dependencies": { "lodash": "^4.17.23", "preact": "^10.26.10" } }, "sha512-6lC246qszMv6bTyl/+QyHwrudgeguWkA94ME1wHn+a6uRAvmtAEaUManIfGqTJfoKvWAiCJqdJPl5xRJjhAloQ=="],
"@uppy/xhr-upload": ["@uppy/xhr-upload@5.2.0", "https://registry.npmjs.com/@uppy/xhr-upload/-/xhr-upload-5.2.0.tgz", { "dependencies": { "@uppy/companion-client": "^5.1.1", "@uppy/utils": "^7.2.0" }, "peerDependencies": { "@uppy/core": "^5.2.0" } }, "sha512-3LV/X5Of6BINnKplP+CwUJ0a4/7cRFfzxwGyXnW+uCrNQHoo09dttcz3begWHejGvzenQHuUnMO3Fxyc71Pryg=="],
"@vitejs/plugin-legacy": ["@vitejs/plugin-legacy@8.2.3", "https://registry.npmjs.com/@vitejs/plugin-legacy/-/plugin-legacy-8.2.3.tgz", { "dependencies": { "@babel/core": "^7.29.7", "@babel/plugin-transform-dynamic-import": "^7.29.7", "@babel/plugin-transform-modules-systemjs": "^7.29.8", "@babel/preset-env": "^7.29.7", "babel-plugin-polyfill-corejs3": "^0.14.2", "babel-plugin-polyfill-regenerator": "^0.6.8", "browserslist": "^4.28.7", "browserslist-to-esbuild": "^2.1.1", "core-js": "^3.49.0", "magic-string": "^1.1.0", "regenerator-runtime": "^0.14.1", "systemjs": "^6.15.1" }, "peerDependencies": { "terser": "^5.16.0", "vite": "^8.0.0" } }, "sha512-MMHLsn/0FrBkCQyb1x44cPYGwkfqcGr2FblcEP2ne79aXe7d5tFKoZ09xs5C4wuh8fOu2JRaNhgAS3K3uvUeJA=="],
"@vitejs/plugin-vue": ["@vitejs/plugin-vue@6.0.10", "https://registry.npmjs.com/@vitejs/plugin-vue/-/plugin-vue-6.0.10.tgz", { "dependencies": { "@rolldown/pluginutils": "^1.0.1" }, "peerDependencies": { "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "vue": "^3.2.25 || ^3.6.0-rc.10" } }, "sha512-b80aUQh3n+qEzzZm5oQp3rT2QImeCx58K6eFl/RkJ3d65KW0kTuv5lNsLRVAjbW9YRUpo/wzmvzMgV34bTAItA=="],
@@ -766,24 +826,6 @@
"@vueuse/shared": ["@vueuse/shared@15.0.0", "https://registry.npmjs.com/@vueuse/shared/-/shared-15.0.0.tgz", { "peerDependencies": { "vue": "^3.5.0" } }, "sha512-vbNXhGrbV53xPOMSyOzMHQRvhMgZf7oNDw2RChUetVxwTIEkInQ1joZ9JbT0G3z2n2AJNjvmCWeM9ySYrnvogA=="],
"@wangeditor-next/basic-modules": ["@wangeditor-next/basic-modules@6.5.0", "https://registry.npmjs.com/@wangeditor-next/basic-modules/-/basic-modules-6.5.0.tgz", { "dependencies": { "is-url": "^1.2.4" }, "peerDependencies": { "@wangeditor-next/core": "^6.5.0", "dom7": "^3.0.0 || ^4.0.0", "lodash.throttle": "^4.1.1", "nanoid": "^5.0.0", "slate": "^0.124.0 || ^0.126.2", "snabbdom": "^3.6.0" } }, "sha512-b4lcEfkR9SqlA7GseHctKU49urHqN8XJRy8bgQDWmP9VxhC0OJyIhVSn7qgD43YMm5Ya1hTXM53VD4/rMrkQ0g=="],
"@wangeditor-next/code-highlight": ["@wangeditor-next/code-highlight@6.5.0", "https://registry.npmjs.com/@wangeditor-next/code-highlight/-/code-highlight-6.5.0.tgz", { "dependencies": { "prismjs": "^1.23.0" }, "peerDependencies": { "@wangeditor-next/core": "^6.5.0", "dom7": "^3.0.0 || ^4.0.0", "slate": "^0.124.0 || ^0.126.2", "snabbdom": "^3.6.0" } }, "sha512-WHSapv5iS/9HAUnPKoGL7F+6xWTkDnE2BvtUwIb3ZDXbsARn0DTZ94fvFqwCfWiRiwc/iy5M1K8e+lsVDU+Jgw=="],
"@wangeditor-next/core": ["@wangeditor-next/core@6.5.0", "https://registry.npmjs.com/@wangeditor-next/core/-/core-6.5.0.tgz", { "dependencies": { "@types/event-emitter": "^0.3.3", "event-emitter": "^0.3.5", "html-void-elements": "^3.0.0", "i18next": "^23.0.0", "scroll-into-view-if-needed": "^3.0.0", "slate-history": "^0.115.0" }, "peerDependencies": { "@uppy/core": "^2.1.1 || ^5.0.0", "@uppy/xhr-upload": "^2.0.3 || ^5.0.0", "dom7": "^3.0.0 || ^4.0.0", "is-hotkey": "^0.2.0", "lodash.camelcase": "^4.3.0", "lodash.clonedeep": "^4.5.0", "lodash.debounce": "^4.0.8", "lodash.foreach": "^4.5.0", "lodash.throttle": "^4.1.1", "lodash.toarray": "^4.4.0", "nanoid": "^5.0.0", "slate": "^0.124.0 || ^0.126.2", "snabbdom": "^3.6.0" } }, "sha512-A+J/lAmSfT7vx+DRxXcfUXTXSbQSVaySnsqQHlF4u2aRiCtO+LSUWBXEolVuIZANMnNR6nNOT/NtWRvIudf6JQ=="],
"@wangeditor-next/editor": ["@wangeditor-next/editor@6.5.0", "https://registry.npmjs.com/@wangeditor-next/editor/-/editor-6.5.0.tgz", { "dependencies": { "@uppy/core": "^5.0.0", "@uppy/xhr-upload": "^5.0.0", "@wangeditor-next/basic-modules": "^6.5.0", "@wangeditor-next/code-highlight": "^6.5.0", "@wangeditor-next/core": "^6.5.0", "@wangeditor-next/list-module": "^6.5.0", "@wangeditor-next/table-module": "^6.5.0", "@wangeditor-next/upload-image-module": "^6.5.0", "@wangeditor-next/video-module": "^6.5.0", "dom7": "^4.0.0", "is-hotkey": "^0.2.0", "lodash.camelcase": "^4.3.0", "lodash.clonedeep": "^4.5.0", "lodash.debounce": "^4.0.8", "lodash.foreach": "^4.5.0", "lodash.throttle": "^4.1.1", "lodash.toarray": "^4.4.0", "nanoid": "^5.1.16", "slate": "^0.126.2", "snabbdom": "^3.6.4" } }, "sha512-hjf/pODV0pkSmHhOqAybVWeOUvOHTXOSt8oQZ4oEnuX+vLuaaEpYO0AUn4tMDTfUL/AvivR5A/D/13o0UvcINA=="],
"@wangeditor-next/editor-for-vue": ["@wangeditor-next/editor-for-vue@6.5.0", "https://registry.npmjs.com/@wangeditor-next/editor-for-vue/-/editor-for-vue-6.5.0.tgz", { "peerDependencies": { "@wangeditor-next/editor": "^6.5.0", "vue": "^3.0.5" } }, "sha512-+wmLrJI55NjeB5nTnaQTUfZEmEBFT8S1u3hmrAt64TwrNOEsS6Tm8ULfxlzsgeDIlHMKcs4vn5CAB5LiBL0yOg=="],
"@wangeditor-next/list-module": ["@wangeditor-next/list-module@6.5.0", "https://registry.npmjs.com/@wangeditor-next/list-module/-/list-module-6.5.0.tgz", { "peerDependencies": { "@wangeditor-next/core": "^6.5.0", "dom7": "^3.0.0 || ^4.0.0", "slate": "^0.124.0 || ^0.126.2", "snabbdom": "^3.6.0" } }, "sha512-JN44zqDG+aBHyRibeaToZKha7JyWpy1GRT/EzNGkhv9lTDg4AaY/Il0KS3RwhpDe4EfbhzqPhq/HT4EmGginJA=="],
"@wangeditor-next/table-module": ["@wangeditor-next/table-module@6.5.0", "https://registry.npmjs.com/@wangeditor-next/table-module/-/table-module-6.5.0.tgz", { "peerDependencies": { "@wangeditor-next/core": "^6.5.0", "dom7": "^3.0.0 || ^4.0.0", "lodash.debounce": "^4.0.8", "lodash.throttle": "^4.1.1", "nanoid": "^5.0.0", "slate": "^0.124.0 || ^0.126.2", "snabbdom": "^3.6.0" } }, "sha512-548i34XoGGBs/0ghQ1yhRgL25pjhNzn+OyynRmHzqmmpYW0S8MFwqHGSDOHyaGTG2rwqjJ8UNF7avtxMruQC5w=="],
"@wangeditor-next/upload-image-module": ["@wangeditor-next/upload-image-module@6.5.0", "https://registry.npmjs.com/@wangeditor-next/upload-image-module/-/upload-image-module-6.5.0.tgz", { "peerDependencies": { "@uppy/core": "^2.0.3 || ^5.0.0", "@uppy/xhr-upload": "^2.0.3 || ^5.0.0", "@wangeditor-next/basic-modules": "^6.5.0", "@wangeditor-next/core": "^6.5.0", "dom7": "^3.0.0 || ^4.0.0", "lodash.foreach": "^4.5.0", "slate": "^0.124.0 || ^0.126.2", "snabbdom": "^3.6.0" } }, "sha512-EX+yRTTJiFYBi2yPTsKIpWbgI7oC+enkv/chUVHT6rGC5LGy7gUuMKLdYY3DlmS3m/ACf+ukxQthg9Vc8p1Ejg=="],
"@wangeditor-next/video-module": ["@wangeditor-next/video-module@6.5.0", "https://registry.npmjs.com/@wangeditor-next/video-module/-/video-module-6.5.0.tgz", { "peerDependencies": { "@uppy/core": "^2.1.4 || ^5.0.0", "@uppy/xhr-upload": "^2.0.7 || ^5.0.0", "@wangeditor-next/core": "^6.5.0", "dom7": "^3.0.0 || ^4.0.0", "nanoid": "^5.0.0", "slate": "^0.124.0 || ^0.126.2", "snabbdom": "^3.6.0" } }, "sha512-HCJR7yUdSiswQkEeAJ+fwh0Oi0HTHWoMMmi8ZEDdPOAT0pyx7Zqa7lCeS0T7JSkOPD9zUnkWKpRjcnB7Ghj0xQ=="],
"@yuku-codegen/binding-android-arm64": ["@yuku-codegen/binding-android-arm64@0.9.5", "https://registry.npmjs.com/@yuku-codegen/binding-android-arm64/-/binding-android-arm64-0.9.5.tgz", { "os": "android", "cpu": "arm64" }, "sha512-jrOY5WM+AaAqkv51fHP1x28ifto4WgcZVzodLUyMU1jMWn5Sq+VciRdk/n8E0Ey5w4p4cWWE+m5GfXWOYh7Kzw=="],
"@yuku-codegen/binding-darwin-arm64": ["@yuku-codegen/binding-darwin-arm64@0.9.5", "https://registry.npmjs.com/@yuku-codegen/binding-darwin-arm64/-/binding-darwin-arm64-0.9.5.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-4O4lkCQIzPZGjiNB1GORSI6hBECbiiSBS/APZXPvNKYH+nhY4uuqv03LNXA+SET3hoBjvr95P5rIhY8KQaQUBA=="],
@@ -892,8 +934,6 @@
"commander": ["commander@2.20.3", "https://registry.npmjs.com/commander/-/commander-2.20.3.tgz", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
"compute-scroll-into-view": ["compute-scroll-into-view@3.1.1", "https://registry.npmjs.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", {}, "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw=="],
"confbox": ["confbox@0.3.1", "https://registry.npmjs.com/confbox/-/confbox-0.3.1.tgz", {}, "sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA=="],
"convert-source-map": ["convert-source-map@2.0.0", "https://registry.npmjs.com/convert-source-map/-/convert-source-map-2.0.0.tgz", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
@@ -912,8 +952,6 @@
"csstype": ["csstype@3.2.3", "https://registry.npmjs.com/csstype/-/csstype-3.2.3.tgz", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
"d": ["d@1.0.2", "https://registry.npmjs.com/d/-/d-1.0.2.tgz", { "dependencies": { "es5-ext": "^0.10.64", "type": "^2.7.2" } }, "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw=="],
"d3-cloud": ["d3-cloud@1.2.9", "https://registry.npmjs.com/d3-cloud/-/d3-cloud-1.2.9.tgz", { "dependencies": { "d3-dispatch": "^1.0.3" } }, "sha512-leL1GLneC9ZQtnV+6TGWrNlGfI1WX7S2arcTv2vae12DaXo5wjm6GBCkskXbrDlyOymd/A75Pyj1H37MW4BZ/Q=="],
"d3-dispatch": ["d3-dispatch@1.0.6", "https://registry.npmjs.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz", {}, "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA=="],
@@ -932,8 +970,6 @@
"dom-accessibility-api": ["dom-accessibility-api@0.5.16", "https://registry.npmjs.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="],
"dom7": ["dom7@4.0.6", "https://registry.npmjs.com/dom7/-/dom7-4.0.6.tgz", { "dependencies": { "ssr-window": "^4.0.0" } }, "sha512-emjdpPLhpNubapLFdjNL9tP06Sr+GZkrIHEXLWvOGsytACUrkbeIdjO5g77m00BrHTznnlcNqgmn7pCN192TBA=="],
"drizzle-kit": ["drizzle-kit@0.31.11", "https://registry.npmjs.com/drizzle-kit/-/drizzle-kit-0.31.11.tgz", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", "tsx": "^4.21.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-YCYqxTLIB2OCqf6w9/Vef13baBVbwQIPcbT4Y56AfO6B9ajZhDhD8Jkveg/hJvT/iuMloKD/IYYkyMMNhr7Kqg=="],
"drizzle-orm": ["drizzle-orm@0.45.4", "https://registry.npmjs.com/drizzle-orm/-/drizzle-orm-0.45.4.tgz", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@netlify/db": ">=0.4.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "prisma": "*", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@netlify/db", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "prisma", "sql.js", "sqlite3"] }, "sha512-NiM1YZpJ2UxyeE67DpDDZ+Tsw4YLX3trSlkNT7Tm9eKoUNb1LvaAaQzXgYQsWs+AQ9TUmmwMmBOCXuqqxUWKKQ=="],
@@ -946,34 +982,22 @@
"es-module-lexer": ["es-module-lexer@2.3.2", "https://registry.npmjs.com/es-module-lexer/-/es-module-lexer-2.3.2.tgz", {}, "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw=="],
"es5-ext": ["es5-ext@0.10.64", "https://registry.npmjs.com/es5-ext/-/es5-ext-0.10.64.tgz", { "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", "esniff": "^2.0.1", "next-tick": "^1.1.0" } }, "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg=="],
"es6-iterator": ["es6-iterator@2.0.3", "https://registry.npmjs.com/es6-iterator/-/es6-iterator-2.0.3.tgz", { "dependencies": { "d": "1", "es5-ext": "^0.10.35", "es6-symbol": "^3.1.1" } }, "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g=="],
"es6-symbol": ["es6-symbol@3.1.4", "https://registry.npmjs.com/es6-symbol/-/es6-symbol-3.1.4.tgz", { "dependencies": { "d": "^1.0.2", "ext": "^1.7.0" } }, "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg=="],
"esbuild": ["esbuild@0.25.12", "https://registry.npmjs.com/esbuild/-/esbuild-0.25.12.tgz", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
"escalade": ["escalade@3.2.0", "https://registry.npmjs.com/escalade/-/escalade-3.2.0.tgz", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
"escape-string-regexp": ["escape-string-regexp@5.0.0", "https://registry.npmjs.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
"esniff": ["esniff@2.0.1", "https://registry.npmjs.com/esniff/-/esniff-2.0.1.tgz", { "dependencies": { "d": "^1.0.1", "es5-ext": "^0.10.62", "event-emitter": "^0.3.5", "type": "^2.7.2" } }, "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg=="],
"estree-walker": ["estree-walker@3.0.3", "https://registry.npmjs.com/estree-walker/-/estree-walker-3.0.3.tgz", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="],
"esutils": ["esutils@2.0.3", "https://registry.npmjs.com/esutils/-/esutils-2.0.3.tgz", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
"event-emitter": ["event-emitter@0.3.5", "https://registry.npmjs.com/event-emitter/-/event-emitter-0.3.5.tgz", { "dependencies": { "d": "1", "es5-ext": "~0.10.14" } }, "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA=="],
"evtd": ["evtd@0.2.4", "https://registry.npmjs.com/evtd/-/evtd-0.2.4.tgz", {}, "sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw=="],
"expect-type": ["expect-type@1.4.0", "https://registry.npmjs.com/expect-type/-/expect-type-1.4.0.tgz", {}, "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA=="],
"exsolve": ["exsolve@1.1.1", "https://registry.npmjs.com/exsolve/-/exsolve-1.1.1.tgz", {}, "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g=="],
"ext": ["ext@1.7.0", "https://registry.npmjs.com/ext/-/ext-1.7.0.tgz", { "dependencies": { "type": "^2.7.2" } }, "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw=="],
"fdir": ["fdir@6.5.0", "https://registry.npmjs.com/fdir/-/fdir-6.5.0.tgz", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
"fflate": ["fflate@0.8.3", "https://registry.npmjs.com/fflate/-/fflate-0.8.3.tgz", {}, "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA=="],
@@ -996,20 +1020,10 @@
"hookable": ["hookable@5.5.3", "https://registry.npmjs.com/hookable/-/hookable-5.5.3.tgz", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="],
"html-void-elements": ["html-void-elements@3.0.0", "https://registry.npmjs.com/html-void-elements/-/html-void-elements-3.0.0.tgz", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],
"i18next": ["i18next@23.16.8", "https://registry.npmjs.com/i18next/-/i18next-23.16.8.tgz", { "dependencies": { "@babel/runtime": "^7.23.2" } }, "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg=="],
"ioredis": ["ioredis@6.0.0", "https://registry.npmjs.com/ioredis/-/ioredis-6.0.0.tgz", { "dependencies": { "@ioredis/commands": "2.0.0", "cluster-key-slot": "1.1.1", "debug": "4.4.3", "denque": "2.1.0", "redis-errors": "1.2.0", "standard-as-callback": "2.1.0" } }, "sha512-f+Dtubxfpf6KYFq7WVXJoOLn0bk4TJrMrN9SzeE+jrWrCWj7XX3fA6vkryafhADX+GMymRxgDJDOI33COkJc0w=="],
"is-core-module": ["is-core-module@2.16.2", "https://registry.npmjs.com/is-core-module/-/is-core-module-2.16.2.tgz", { "dependencies": { "hasown": "^2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="],
"is-hotkey": ["is-hotkey@0.2.0", "https://registry.npmjs.com/is-hotkey/-/is-hotkey-0.2.0.tgz", {}, "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="],
"is-network-error": ["is-network-error@1.3.2", "https://registry.npmjs.com/is-network-error/-/is-network-error-1.3.2.tgz", {}, "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA=="],
"is-url": ["is-url@1.2.4", "https://registry.npmjs.com/is-url/-/is-url-1.2.4.tgz", {}, "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="],
"isomorphic.js": ["isomorphic.js@0.2.5", "https://registry.npmjs.com/isomorphic.js/-/isomorphic.js-0.2.5.tgz", {}, "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw=="],
"js-tokens": ["js-tokens@4.0.0", "https://registry.npmjs.com/js-tokens/-/js-tokens-4.0.0.tgz", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
@@ -1046,24 +1060,16 @@
"linkify-it": ["linkify-it@5.0.2", "https://registry.npmjs.com/linkify-it/-/linkify-it-5.0.2.tgz", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q=="],
"linkifyjs": ["linkifyjs@4.3.3", "", {}, "sha512-P8aEP5U/D1/IlTY2OeYsErdwh9bGuLE30NcXtKEjgdHcahveQoQwM2yZNsioQHsWFz0P7KKudisbrzCgR0sDHg=="],
"local-pkg": ["local-pkg@1.2.1", "https://registry.npmjs.com/local-pkg/-/local-pkg-1.2.1.tgz", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", "quansync": "^0.2.11" } }, "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q=="],
"lodash": ["lodash@4.18.1", "https://registry.npmjs.com/lodash/-/lodash-4.18.1.tgz", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="],
"lodash-es": ["lodash-es@4.18.1", "https://registry.npmjs.com/lodash-es/-/lodash-es-4.18.1.tgz", {}, "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A=="],
"lodash.camelcase": ["lodash.camelcase@4.3.0", "https://registry.npmjs.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="],
"lodash.clonedeep": ["lodash.clonedeep@4.5.0", "https://registry.npmjs.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", {}, "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="],
"lodash.debounce": ["lodash.debounce@4.0.8", "https://registry.npmjs.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="],
"lodash.foreach": ["lodash.foreach@4.5.0", "https://registry.npmjs.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz", {}, "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="],
"lodash.throttle": ["lodash.throttle@4.1.1", "https://registry.npmjs.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz", {}, "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="],
"lodash.toarray": ["lodash.toarray@4.4.0", "https://registry.npmjs.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz", {}, "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="],
"lru-cache": ["lru-cache@5.1.1", "https://registry.npmjs.com/lru-cache/-/lru-cache-5.1.1.tgz", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
"luxon": ["luxon@3.7.2", "https://registry.npmjs.com/luxon/-/luxon-3.7.2.tgz", {}, "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="],
@@ -1080,8 +1086,6 @@
"meow": ["meow@13.2.0", "https://registry.npmjs.com/meow/-/meow-13.2.0.tgz", {}, "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA=="],
"mime-match": ["mime-match@1.0.2", "https://registry.npmjs.com/mime-match/-/mime-match-1.0.2.tgz", { "dependencies": { "wildcard": "^1.1.0" } }, "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg=="],
"mlly": ["mlly@1.8.2", "https://registry.npmjs.com/mlly/-/mlly-1.8.2.tgz", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="],
"mrmime": ["mrmime@2.0.1", "https://registry.npmjs.com/mrmime/-/mrmime-2.0.1.tgz", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
@@ -1096,11 +1100,7 @@
"naive-ui": ["naive-ui@2.45.3", "https://registry.npmjs.com/naive-ui/-/naive-ui-2.45.3.tgz", { "dependencies": { "@css-render/plugin-bem": "^0.15.14", "@css-render/vue3-ssr": "^0.15.14", "@types/lodash": "^4.17.20", "@types/lodash-es": "^4.17.12", "async-validator": "^4.2.5", "css-render": "^0.15.14", "csstype": "^3.1.3", "date-fns": "^4.1.0", "date-fns-tz": "^3.2.0", "evtd": "^0.2.4", "highlight.js": "^11.8.0", "lodash": "^4.17.21", "lodash-es": "^4.17.21", "seemly": "^0.3.10", "treemate": "^0.3.11", "vdirs": "^0.1.8", "vooks": "^0.2.12", "vueuc": "^0.4.66" }, "peerDependencies": { "vue": "^3.0.0" } }, "sha512-D83gJ+6zUdkQ5DuUbmlfyaM1t8pV5WMPa6KmL9mByqQuiL12qBdA0n/iEIth4dQw1x/duNGpOS2anpt5FKO1kw=="],
"namespace-emitter": ["namespace-emitter@2.0.1", "https://registry.npmjs.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz", {}, "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="],
"nanoid": ["nanoid@5.1.16", "https://registry.npmjs.com/nanoid/-/nanoid-5.1.16.tgz", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ=="],
"next-tick": ["next-tick@1.1.0", "https://registry.npmjs.com/next-tick/-/next-tick-1.1.0.tgz", {}, "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="],
"nanoid": ["nanoid@3.3.20", "https://registry.npmjs.com/nanoid/-/nanoid-3.3.20.tgz", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ=="],
"node-abort-controller": ["node-abort-controller@3.1.1", "https://registry.npmjs.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz", {}, "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="],
@@ -1118,14 +1118,14 @@
"obug": ["obug@2.1.4", "https://registry.npmjs.com/obug/-/obug-2.1.4.tgz", {}, "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA=="],
"orderedmap": ["orderedmap@2.1.1", "", {}, "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g=="],
"oxfmt": ["oxfmt@0.70.0", "https://registry.npmjs.com/oxfmt/-/oxfmt-0.70.0.tgz", { "dependencies": { "tinypool": "2.1.2" }, "optionalDependencies": { "@oxfmt/binding-android-arm-eabi": "0.70.0", "@oxfmt/binding-android-arm64": "0.70.0", "@oxfmt/binding-darwin-arm64": "0.70.0", "@oxfmt/binding-darwin-x64": "0.70.0", "@oxfmt/binding-freebsd-x64": "0.70.0", "@oxfmt/binding-linux-arm-gnueabihf": "0.70.0", "@oxfmt/binding-linux-arm-musleabihf": "0.70.0", "@oxfmt/binding-linux-arm64-gnu": "0.70.0", "@oxfmt/binding-linux-arm64-musl": "0.70.0", "@oxfmt/binding-linux-ppc64-gnu": "0.70.0", "@oxfmt/binding-linux-riscv64-gnu": "0.70.0", "@oxfmt/binding-linux-riscv64-musl": "0.70.0", "@oxfmt/binding-linux-s390x-gnu": "0.70.0", "@oxfmt/binding-linux-x64-gnu": "0.70.0", "@oxfmt/binding-linux-x64-musl": "0.70.0", "@oxfmt/binding-openharmony-arm64": "0.70.0", "@oxfmt/binding-win32-arm64-msvc": "0.70.0", "@oxfmt/binding-win32-ia32-msvc": "0.70.0", "@oxfmt/binding-win32-x64-msvc": "0.70.0" }, "peerDependencies": { "svelte": "^5.0.0", "vite-plus": "*" }, "optionalPeers": ["svelte", "vite-plus"], "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-IsHxZ4y0wQLLMhnrJblBJgZsLDzfULrJnAw5j/QqsTlMa/m3AqsbToi+W71uhBGaqlqq/PbbjvHc09TJwdv3Tw=="],
"oxlint": ["oxlint@1.85.0", "https://registry.npmjs.com/oxlint/-/oxlint-1.85.0.tgz", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.85.0", "@oxlint/binding-android-arm64": "1.85.0", "@oxlint/binding-darwin-arm64": "1.85.0", "@oxlint/binding-darwin-x64": "1.85.0", "@oxlint/binding-freebsd-x64": "1.85.0", "@oxlint/binding-linux-arm-gnueabihf": "1.85.0", "@oxlint/binding-linux-arm-musleabihf": "1.85.0", "@oxlint/binding-linux-arm64-gnu": "1.85.0", "@oxlint/binding-linux-arm64-musl": "1.85.0", "@oxlint/binding-linux-ppc64-gnu": "1.85.0", "@oxlint/binding-linux-riscv64-gnu": "1.85.0", "@oxlint/binding-linux-riscv64-musl": "1.85.0", "@oxlint/binding-linux-s390x-gnu": "1.85.0", "@oxlint/binding-linux-x64-gnu": "1.85.0", "@oxlint/binding-linux-x64-musl": "1.85.0", "@oxlint/binding-openharmony-arm64": "1.85.0", "@oxlint/binding-win32-arm64-msvc": "1.85.0", "@oxlint/binding-win32-ia32-msvc": "1.85.0", "@oxlint/binding-win32-x64-msvc": "1.85.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2001", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-bc26s97nuvPj1ViyPsqmKecVkUWFMEdtayO8MaQ6oiLfs1pj94cQlZZhrh4BPNlr9HQosjhIlwgZKsfcwmcNgg=="],
"oxlint-tsgolint": ["oxlint-tsgolint@7.0.2003", "https://registry.npmjs.com/oxlint-tsgolint/-/oxlint-tsgolint-7.0.2003.tgz", { "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "7.0.2003", "@oxlint-tsgolint/darwin-x64": "7.0.2003", "@oxlint-tsgolint/linux-arm64": "7.0.2003", "@oxlint-tsgolint/linux-x64": "7.0.2003", "@oxlint-tsgolint/win32-arm64": "7.0.2003", "@oxlint-tsgolint/win32-x64": "7.0.2003" }, "bin": { "tsgolint": "./bin/tsgolint.js" } }, "sha512-VnK4zlqgmgq/7ZcjzCk/WpN8kKFsYGcB85Io9qT3wL4K8Un3RKmJkp793crNETieMusPMKOA4a+Mw2wbteI6TQ=="],
"p-retry": ["p-retry@6.2.1", "https://registry.npmjs.com/p-retry/-/p-retry-6.2.1.tgz", { "dependencies": { "@types/retry": "0.12.2", "is-network-error": "^1.0.0", "retry": "^0.13.1" } }, "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ=="],
"path-browserify": ["path-browserify@1.0.1", "https://registry.npmjs.com/path-browserify/-/path-browserify-1.0.1.tgz", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
"path-parse": ["path-parse@1.0.7", "https://registry.npmjs.com/path-parse/-/path-parse-1.0.7.tgz", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
@@ -1152,11 +1152,33 @@
"postgres": ["postgres@3.4.9", "https://registry.npmjs.com/postgres/-/postgres-3.4.9.tgz", {}, "sha512-GD3qdB0x1z9xgFI6cdRD6xu2Sp2WCOEoe3mtnyB5Ee0XrrL5Pe+e4CCnJrRMnL1zYtRDZmQQVbvOttLnKDLnaw=="],
"preact": ["preact@10.29.8", "https://registry.npmjs.com/preact/-/preact-10.29.8.tgz", { "peerDependencies": { "preact-render-to-string": ">=5" }, "optionalPeers": ["preact-render-to-string"] }, "sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q=="],
"pretty-format": ["pretty-format@27.5.1", "https://registry.npmjs.com/pretty-format/-/pretty-format-27.5.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="],
"prismjs": ["prismjs@1.30.0", "https://registry.npmjs.com/prismjs/-/prismjs-1.30.0.tgz", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="],
"prosemirror-changeset": ["prosemirror-changeset@2.4.4", "", { "dependencies": { "prosemirror-transform": "^1.0.0" } }, "sha512-Gyuz9jYdrAeA9I7AholyOes9KUmv/lEwsC5O9s5xF5VB3EgTPsXMGUxz4+H1B+wKVPdZbvRcg1Cp3x8qX+8ofA=="],
"prosemirror-commands": ["prosemirror-commands@1.7.2", "", { "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.10.2" } }, "sha512-q6Q6szxqdu9Xd6EcdKsqXghu5nQdZTpB4Q9yd04WRc7/jt763e/rT60Owh0L1GYY+T46o5rD+9lEN36dZS43tw=="],
"prosemirror-dropcursor": ["prosemirror-dropcursor@1.8.4", "", { "dependencies": { "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0", "prosemirror-view": "^1.1.0" } }, "sha512-VmKxhcA6a+h5oPSYmfF1ZNeQqPbyYaIxqZsKqeYCyTlPtrjUgNaHL3P8vVaO19oqAV0zuaM/axkowZHrB1P3Tg=="],
"prosemirror-gapcursor": ["prosemirror-gapcursor@1.4.1", "", { "dependencies": { "prosemirror-keymap": "^1.0.0", "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", "prosemirror-view": "^1.0.0" } }, "sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw=="],
"prosemirror-history": ["prosemirror-history@1.5.1", "", { "dependencies": { "prosemirror-state": "^1.2.2", "prosemirror-transform": "^1.0.0", "prosemirror-view": "^1.31.0", "rope-sequence": "^1.3.0" } }, "sha512-onlwnqKvgtFg6srZOmDOAhlAy1FIHQpOExORybX0S+DvJepE5tPALrB9iGet/2sqqqrelSnB10OoiOJqAvu2DA=="],
"prosemirror-inputrules": ["prosemirror-inputrules@1.5.1", "", { "dependencies": { "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.0.0" } }, "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw=="],
"prosemirror-keymap": ["prosemirror-keymap@1.2.3", "", { "dependencies": { "prosemirror-state": "^1.0.0", "w3c-keyname": "^2.2.0" } }, "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw=="],
"prosemirror-model": ["prosemirror-model@1.25.12", "", { "dependencies": { "orderedmap": "^2.0.0" } }, "sha512-Ue2gTmXMa7EhpLNhC7J+h4+ykD8ha12K6rrZFFKKJHBForfIStw5gJ6Zrf1mqqAa9NmpmEB4wp9bKmA4eUVjWg=="],
"prosemirror-schema-list": ["prosemirror-schema-list@1.5.1", "", { "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.7.3" } }, "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q=="],
"prosemirror-state": ["prosemirror-state@1.4.4", "", { "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-transform": "^1.0.0", "prosemirror-view": "^1.27.0" } }, "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw=="],
"prosemirror-tables": ["prosemirror-tables@1.8.5", "", { "dependencies": { "prosemirror-keymap": "^1.2.3", "prosemirror-model": "^1.25.4", "prosemirror-state": "^1.4.4", "prosemirror-transform": "^1.10.5", "prosemirror-view": "^1.41.4" } }, "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw=="],
"prosemirror-transform": ["prosemirror-transform@1.12.2", "", { "dependencies": { "prosemirror-model": "^1.21.0" } }, "sha512-PE/aY0HEY4zczvmqrilgkUK/WautF0chvMqkmM/iN5/aPHvwrCWaQZjS6CIZp+K84YrvPFqrL+YArrfJX8xX7g=="],
"prosemirror-view": ["prosemirror-view@1.42.6", "", { "dependencies": { "prosemirror-model": "^1.25.12", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0" } }, "sha512-3g25f6hKV2bBxo3puH3EcYWmmVNSH0iWmNsMVT7sugDSpA025jgpOLarcDWr39SdzPjYMaiYtRdNtXialPSjEQ=="],
"punycode.js": ["punycode.js@2.3.1", "https://registry.npmjs.com/punycode.js/-/punycode.js-2.3.1.tgz", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="],
@@ -1184,11 +1206,9 @@
"resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "https://registry.npmjs.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
"retry": ["retry@0.13.1", "https://registry.npmjs.com/retry/-/retry-0.13.1.tgz", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="],
"rolldown": ["rolldown@1.2.13", "https://registry.npmjs.com/rolldown/-/rolldown-1.2.13.tgz", { "dependencies": { "@oxc-project/types": "=0.153.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.13", "@rolldown/binding-android-arm64": "1.2.13", "@rolldown/binding-darwin-arm64": "1.2.13", "@rolldown/binding-darwin-x64": "1.2.13", "@rolldown/binding-freebsd-x64": "1.2.13", "@rolldown/binding-linux-arm-gnueabihf": "1.2.13", "@rolldown/binding-linux-arm64-gnu": "1.2.13", "@rolldown/binding-linux-arm64-musl": "1.2.13", "@rolldown/binding-linux-ppc64-gnu": "1.2.13", "@rolldown/binding-linux-s390x-gnu": "1.2.13", "@rolldown/binding-linux-x64-gnu": "1.2.13", "@rolldown/binding-linux-x64-musl": "1.2.13", "@rolldown/binding-openharmony-arm64": "1.2.13", "@rolldown/binding-win32-arm64-msvc": "1.2.13", "@rolldown/binding-win32-x64-msvc": "1.2.13" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-/5apOkwWxtACcQtZ5WlrAsKS4JwXVThQPJZ3RqIruRY9UG9M8e0VlXN068xum/JRKA4aIUoJ13ghe/kGCvidiQ=="],
"scroll-into-view-if-needed": ["scroll-into-view-if-needed@3.1.0", "https://registry.npmjs.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", { "dependencies": { "compute-scroll-into-view": "^3.0.2" } }, "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ=="],
"rope-sequence": ["rope-sequence@1.3.4", "", {}, "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ=="],
"scule": ["scule@1.3.0", "https://registry.npmjs.com/scule/-/scule-1.3.0.tgz", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="],
@@ -1200,12 +1220,6 @@
"sirv": ["sirv@3.0.2", "https://registry.npmjs.com/sirv/-/sirv-3.0.2.tgz", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g=="],
"slate": ["slate@0.126.2", "https://registry.npmjs.com/slate/-/slate-0.126.2.tgz", {}, "sha512-38C8GU9awiEbroZm+DzXEFUWKptb1QV9xcgcUjseas4PtqQdBnEPITocosYzFHXEVrlkafjZEv8KH8pjhe0esQ=="],
"slate-history": ["slate-history@0.115.0", "https://registry.npmjs.com/slate-history/-/slate-history-0.115.0.tgz", { "peerDependencies": { "slate": ">=0.114.3" } }, "sha512-QdUm9aVyQFz6JG4a84Z6Um+tJpZJmsh9bjXwTVTvYiN4rdKbqL6+/4HT94on1WYxe10Q4vY6mA6BCpoYxgF3tQ=="],
"snabbdom": ["snabbdom@3.6.4", "https://registry.npmjs.com/snabbdom/-/snabbdom-3.6.4.tgz", {}, "sha512-VmxEfuw1/Y/eFj5VtMhYnukExpYiPkNzoo3+N3qwAOUDMl8wXgbli5ebR+j0knE3lZ/0eYskLxNcX64uy10N9w=="],
"source-map": ["source-map@0.6.1", "https://registry.npmjs.com/source-map/-/source-map-0.6.1.tgz", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
"source-map-js": ["source-map-js@1.2.2", "https://registry.npmjs.com/source-map-js/-/source-map-js-1.2.2.tgz", {}, "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw=="],
@@ -1214,8 +1228,6 @@
"sql.js": ["sql.js@1.14.2", "https://registry.npmjs.com/sql.js/-/sql.js-1.14.2.tgz", {}, "sha512-3ZGPovObMFrdw79zrUHbfdE/DLIsy8jdNdssmMSQuRAymedU6q84asPt0kgiqrdMYlPegDItiIMfmIXzZnYFcw=="],
"ssr-window": ["ssr-window@4.0.2", "https://registry.npmjs.com/ssr-window/-/ssr-window-4.0.2.tgz", {}, "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ=="],
"stackback": ["stackback@0.0.2", "https://registry.npmjs.com/stackback/-/stackback-0.0.2.tgz", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="],
"standard-as-callback": ["standard-as-callback@2.1.0", "https://registry.npmjs.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz", {}, "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="],
@@ -1256,8 +1268,6 @@
"tsx": ["tsx@4.23.9", "https://registry.npmjs.com/tsx/-/tsx-4.23.9.tgz", { "dependencies": { "esbuild": "~0.28.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-6q8uTORRGauQVjqMQnKUucLFoeXZAfw6zKvG35GLbdKWbLdeOtZ3H4mhyA5mxuUd2o2cRTskhj59nLLQseUvUw=="],
"type": ["type@2.7.3", "https://registry.npmjs.com/type/-/type-2.7.3.tgz", {}, "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ=="],
"typescript": ["typescript@5.9.3", "https://registry.npmjs.com/typescript/-/typescript-5.9.3.tgz", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
"uc.micro": ["uc.micro@2.1.0", "https://registry.npmjs.com/uc.micro/-/uc.micro-2.1.0.tgz", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="],
@@ -1316,8 +1326,6 @@
"why-is-node-running": ["why-is-node-running@2.3.0", "https://registry.npmjs.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="],
"wildcard": ["wildcard@1.1.2", "https://registry.npmjs.com/wildcard/-/wildcard-1.1.2.tgz", {}, "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng=="],
"ws": ["ws@8.22.0", "https://registry.npmjs.com/ws/-/ws-8.22.0.tgz", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg=="],
"y-codemirror.next": ["y-codemirror.next@0.3.6", "https://registry.npmjs.com/y-codemirror.next/-/y-codemirror.next-0.3.6.tgz", { "dependencies": { "lib0": "^0.2.42" }, "peerDependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "yjs": "^13.5.6" } }, "sha512-GnmVXhTe+UtoFbbaSdwhq6gdAQZdIY9az0Xj6HR2J4PO6Yw4w3xaaSssU+6T72WhXAI0wf9FbuY2s0Ms+WrexA=="],
@@ -1384,8 +1392,6 @@
"pkg-types/confbox": ["confbox@0.2.4", "https://registry.npmjs.com/confbox/-/confbox-0.2.4.tgz", {}, "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ=="],
"postcss/nanoid": ["nanoid@3.3.20", "https://registry.npmjs.com/nanoid/-/nanoid-3.3.20.tgz", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ=="],
"rolldown/@oxc-project/types": ["@oxc-project/types@0.153.0", "https://registry.npmjs.com/@oxc-project/types/-/types-0.153.0.tgz", {}, "sha512-jSNrRIyvPVLL5E1z/tS5zLAprosGz/FuI1PWwEOz59j3E4TTTzSpqKb/RDGqJhhW0QHYISGXxq582wGx6T11Tw=="],
"strip-literal/js-tokens": ["js-tokens@10.0.0", "https://registry.npmjs.com/js-tokens/-/js-tokens-10.0.0.tgz", {}, "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q=="],