添加AI流式题目解析功能
实现了基于OpenAI的流式题目解析系统,支持答题后查看AI生成的详细解析。 主要功能: - 流式输出:采用SSE (Server-Sent Events) 实现实时流式输出,用户可看到解析逐字生成 - Markdown渲染:使用react-markdown渲染解析内容,支持标题、列表、代码块等格式 - 智能提示词:根据题目类型(选择题/填空题/判断题等)动态调整提示词 - 选择题优化:对选择题提供逐项分析和记忆口诀 - 重新生成:支持重新生成解析,temperature设为0确保输出一致性 - 优化加载:加载指示器显示在内容下方,不遮挡流式输出 技术实现: - 后端:新增ExplainQuestionStream方法支持流式响应 - 前端:使用ReadableStream API接收SSE流式数据 - UI:优化加载状态显示,避免阻塞内容展示 - 清理:删除不再使用的scripts脚本文件 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
201ddf5857
commit
24d098ae92
@ -5,6 +5,7 @@ import (
|
||||
"ankao/internal/models"
|
||||
"ankao/internal/services"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"sort"
|
||||
@ -702,3 +703,79 @@ func DeletePracticeQuestion(c *gin.Context) {
|
||||
"message": "删除成功",
|
||||
})
|
||||
}
|
||||
|
||||
// ExplainQuestion 生成题目解析
|
||||
func ExplainQuestion(c *gin.Context) {
|
||||
var req struct {
|
||||
QuestionID uint `json:"question_id" binding:"required"`
|
||||
}
|
||||
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"success": false,
|
||||
"message": "请求参数错误",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
db := database.GetDB()
|
||||
var question models.PracticeQuestion
|
||||
|
||||
// 查询题目
|
||||
if err := db.First(&question, req.QuestionID).Error; err != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{
|
||||
"success": false,
|
||||
"message": "题目不存在",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 解析标准答案
|
||||
var standardAnswer interface{}
|
||||
if err := json.Unmarshal([]byte(question.AnswerData), &standardAnswer); err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{
|
||||
"success": false,
|
||||
"message": "解析题目答案失败",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 将标准答案转为字符串
|
||||
var standardAnswerStr string
|
||||
switch v := standardAnswer.(type) {
|
||||
case string:
|
||||
standardAnswerStr = v
|
||||
case []interface{}:
|
||||
// 多选题或填空题,将数组转为逗号分隔的字符串
|
||||
parts := make([]string, len(v))
|
||||
for i, item := range v {
|
||||
parts[i] = fmt.Sprint(item)
|
||||
}
|
||||
standardAnswerStr = strings.Join(parts, ", ")
|
||||
case bool:
|
||||
// 判断题
|
||||
if v {
|
||||
standardAnswerStr = "正确"
|
||||
} else {
|
||||
standardAnswerStr = "错误"
|
||||
}
|
||||
default:
|
||||
standardAnswerStr = fmt.Sprint(v)
|
||||
}
|
||||
|
||||
// 设置SSE响应头
|
||||
c.Header("Content-Type", "text/event-stream")
|
||||
c.Header("Cache-Control", "no-cache")
|
||||
c.Header("Connection", "keep-alive")
|
||||
c.Header("X-Accel-Buffering", "no")
|
||||
|
||||
// 调用AI服务生成流式解析
|
||||
aiService := services.NewAIGradingService()
|
||||
err := aiService.ExplainQuestionStream(c.Writer, question.Question, standardAnswerStr, question.Type)
|
||||
if err != nil {
|
||||
log.Printf("AI流式解析失败: %v", err)
|
||||
// SSE格式的错误消息
|
||||
fmt.Fprintf(c.Writer, "data: {\"error\": \"生成解析失败\"}\n\n")
|
||||
c.Writer.(http.Flusher).Flush()
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,6 +5,8 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/sashabaranov/go-openai"
|
||||
@ -109,7 +111,7 @@ func (s *AIGradingService) GradeShortAnswer(question, standardAnswer, userAnswer
|
||||
}
|
||||
|
||||
// parseAIResponse 解析AI返回的JSON响应
|
||||
func parseAIResponse(content string, result *AIGradingResult) error {
|
||||
func parseAIResponse(content string, result interface{}) error {
|
||||
// 移除可能的markdown代码块标记
|
||||
jsonStr := removeMarkdownCodeBlock(content)
|
||||
|
||||
@ -121,6 +123,208 @@ func parseAIResponse(content string, result *AIGradingResult) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// AIExplanationResult AI解析结果
|
||||
type AIExplanationResult struct {
|
||||
Explanation string `json:"explanation"` // 题目解析
|
||||
}
|
||||
|
||||
// ExplainQuestionStream 生成题目解析(流式输出)
|
||||
// writer: HTTP响应写入器
|
||||
// question: 题目内容
|
||||
// standardAnswer: 标准答案
|
||||
// questionType: 题目类型
|
||||
func (s *AIGradingService) ExplainQuestionStream(writer http.ResponseWriter, question, standardAnswer, questionType string) error {
|
||||
// 构建解析提示词(直接输出,不使用JSON格式)
|
||||
prompt := fmt.Sprintf(`你是一位严谨、专业的老师,请对以下题目进行详细解析。
|
||||
|
||||
题目类型:%s
|
||||
|
||||
题目内容:%s
|
||||
|
||||
标准答案:%s
|
||||
|
||||
请提供一个详细的解析,要求:
|
||||
1. **必须实事求是**:只基于题目内容和标准答案进行解析,不要添加题目中没有的信息
|
||||
2. **不要胡编乱造**:如果某些信息不确定或题目没有提供,请如实说明,不要编造
|
||||
3. **使用Markdown格式**:使用标题、列表、加粗等markdown语法使内容更清晰易读
|
||||
|
||||
解析内容要求:
|
||||
- **知识点**:说明题目考查的核心知识点
|
||||
- **解题思路**:提供清晰的解题步骤和方法
|
||||
|
||||
%s
|
||||
|
||||
示例输出格式:
|
||||
## 知识点
|
||||
题目考查的是...
|
||||
|
||||
## 解题思路
|
||||
1. 首先分析...
|
||||
2. 然后判断...
|
||||
|
||||
%s
|
||||
|
||||
## 总结
|
||||
%s
|
||||
|
||||
请使用markdown格式输出解析内容。`,
|
||||
questionType,
|
||||
question,
|
||||
standardAnswer,
|
||||
// 根据题目类型添加特定要求
|
||||
func() string {
|
||||
if questionType == "single-selection" || questionType == "multiple-selection" {
|
||||
return `- **选项分析**:对于选择题,必须逐项分析每个选项的对错及原因
|
||||
- **记忆口诀**:如果适用,提供便于记忆的口诀或技巧`
|
||||
}
|
||||
return "- **答案解析**:详细说明为什么这个答案是正确的"
|
||||
}(),
|
||||
// 根据题目类型添加示例格式
|
||||
func() string {
|
||||
if questionType == "single-selection" || questionType == "multiple-selection" {
|
||||
return `## 选项分析
|
||||
- **A选项**:[分析该选项]
|
||||
- **B选项**:[分析该选项]
|
||||
- **C选项**:[分析该选项]
|
||||
- **D选项**:[分析该选项]
|
||||
|
||||
## 正确答案
|
||||
正确答案是... 因为...`
|
||||
}
|
||||
return `## 答案解析
|
||||
正确答案是... 因为...`
|
||||
}(),
|
||||
// 根据题目类型添加总结要求
|
||||
func() string {
|
||||
if questionType == "single-selection" || questionType == "multiple-selection" {
|
||||
return "对于选择题,可以提供记忆口诀或关键要点总结"
|
||||
}
|
||||
return "总结本题的关键要点和注意事项"
|
||||
}(),
|
||||
)
|
||||
|
||||
// 调用AI API(流式)
|
||||
stream, err := s.client.CreateChatCompletionStream(
|
||||
context.Background(),
|
||||
openai.ChatCompletionRequest{
|
||||
Model: s.config.Model,
|
||||
Messages: []openai.ChatCompletionMessage{
|
||||
{
|
||||
Role: openai.ChatMessageRoleSystem,
|
||||
Content: "你是一位严谨、专业的老师,擅长深入浅出地讲解题目。你必须实事求是,只基于题目和标准答案提供解析,不编造任何不确定的信息。你使用Markdown格式输出,让学生更容易理解。",
|
||||
},
|
||||
{
|
||||
Role: openai.ChatMessageRoleUser,
|
||||
Content: prompt,
|
||||
},
|
||||
},
|
||||
Temperature: 0, // 温度为0,获得最确定、最一致的输出
|
||||
Stream: true,
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("创建流式请求失败: %w", err)
|
||||
}
|
||||
defer stream.Close()
|
||||
|
||||
flusher, ok := writer.(http.Flusher)
|
||||
if !ok {
|
||||
return fmt.Errorf("响应写入器不支持Flush")
|
||||
}
|
||||
|
||||
// 读取流式响应并发送给客户端
|
||||
for {
|
||||
response, err := stream.Recv()
|
||||
if err == io.EOF {
|
||||
// 流结束
|
||||
fmt.Fprintf(writer, "data: [DONE]\n\n")
|
||||
flusher.Flush()
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return fmt.Errorf("接收流式响应失败: %w", err)
|
||||
}
|
||||
|
||||
// 获取增量内容
|
||||
if len(response.Choices) > 0 {
|
||||
delta := response.Choices[0].Delta.Content
|
||||
if delta != "" {
|
||||
// 使用SSE格式发送
|
||||
fmt.Fprintf(writer, "data: %s\n\n", delta)
|
||||
flusher.Flush()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// ExplainQuestion 生成题目解析
|
||||
// question: 题目内容
|
||||
// standardAnswer: 标准答案
|
||||
// questionType: 题目类型
|
||||
func (s *AIGradingService) ExplainQuestion(question, standardAnswer, questionType string) (*AIExplanationResult, error) {
|
||||
// 构建解析提示词
|
||||
prompt := fmt.Sprintf(`你是一位经验丰富的老师,请对以下题目进行详细解析。
|
||||
|
||||
题目类型:%s
|
||||
|
||||
题目内容:%s
|
||||
|
||||
标准答案:%s
|
||||
|
||||
请提供一个详细的解析,包括:
|
||||
1. 题目考查的知识点
|
||||
2. 解题思路和方法
|
||||
3. 为什么选择这个答案
|
||||
4. 相关的重要概念或注意事项
|
||||
|
||||
请按照以下JSON格式返回结果:
|
||||
{
|
||||
"explanation": "这道题考查的是...(200字以内的详细解析)"
|
||||
}
|
||||
|
||||
注意:只返回JSON格式的结果,不要有其他内容。`, questionType, question, standardAnswer)
|
||||
|
||||
// 调用AI API
|
||||
resp, err := s.client.CreateChatCompletion(
|
||||
context.Background(),
|
||||
openai.ChatCompletionRequest{
|
||||
Model: s.config.Model,
|
||||
Messages: []openai.ChatCompletionMessage{
|
||||
{
|
||||
Role: openai.ChatMessageRoleSystem,
|
||||
Content: "你是一位经验丰富的老师,擅长深入浅出地讲解题目,帮助学生理解知识点。",
|
||||
},
|
||||
{
|
||||
Role: openai.ChatMessageRoleUser,
|
||||
Content: prompt,
|
||||
},
|
||||
},
|
||||
Temperature: 0.7, // 中等温度以获得有创造性的解释
|
||||
},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("AI解析失败: %w", err)
|
||||
}
|
||||
|
||||
if len(resp.Choices) == 0 {
|
||||
return nil, fmt.Errorf("AI未返回解析结果")
|
||||
}
|
||||
|
||||
// 解析AI返回的JSON结果
|
||||
content := resp.Choices[0].Message.Content
|
||||
|
||||
var result AIExplanationResult
|
||||
if err := parseAIResponse(content, &result); err != nil {
|
||||
return nil, fmt.Errorf("解析AI响应失败: %w", err)
|
||||
}
|
||||
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
// removeMarkdownCodeBlock 移除markdown代码块标记
|
||||
func removeMarkdownCodeBlock(s string) string {
|
||||
// 去除可能的```json和```标记
|
||||
|
||||
1
main.go
1
main.go
@ -38,6 +38,7 @@ func main() {
|
||||
api.GET("/practice/questions/random", handlers.GetRandomPracticeQuestion) // 获取随机练习题目
|
||||
api.GET("/practice/questions/:id", handlers.GetPracticeQuestionByID) // 获取指定练习题目
|
||||
api.GET("/practice/types", handlers.GetPracticeQuestionTypes) // 获取题型列表
|
||||
api.POST("/practice/explain", handlers.ExplainQuestion) // 生成题目解析(AI)
|
||||
|
||||
// 需要认证的路由
|
||||
auth := api.Group("", middleware.Auth())
|
||||
|
||||
@ -1,26 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"ankao/internal/database"
|
||||
"ankao/internal/models"
|
||||
"fmt"
|
||||
"log"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// 初始化数据库
|
||||
if err := database.InitDB(); err != nil {
|
||||
log.Fatal("数据库初始化失败:", err)
|
||||
}
|
||||
|
||||
db := database.GetDB()
|
||||
|
||||
// 查询前5条记录
|
||||
var questions []models.PracticeQuestion
|
||||
db.Limit(5).Find(&questions)
|
||||
|
||||
fmt.Println("数据库中的题目:")
|
||||
for _, q := range questions {
|
||||
fmt.Printf("ID: %d, QuestionID: %s, Type: %s, TypeName: %s\n", q.ID, q.QuestionID, q.Type, q.TypeName)
|
||||
}
|
||||
}
|
||||
@ -1,28 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"ankao/internal/database"
|
||||
"ankao/internal/models"
|
||||
"log"
|
||||
)
|
||||
|
||||
func main() {
|
||||
log.Println("开始清空题目数据...")
|
||||
|
||||
// 初始化数据库
|
||||
if err := database.InitDB(); err != nil {
|
||||
log.Fatal("数据库初始化失败:", err)
|
||||
}
|
||||
|
||||
db := database.GetDB()
|
||||
|
||||
// 清空practice_questions表
|
||||
if err := db.Exec("DELETE FROM practice_questions").Error; err != nil {
|
||||
log.Fatal("清空题目表失败:", err)
|
||||
}
|
||||
|
||||
// 获取清空后的数量
|
||||
var count int64
|
||||
db.Model(&models.PracticeQuestion{}).Count(&count)
|
||||
log.Printf("题目数据已清空,当前数量: %d", count)
|
||||
}
|
||||
@ -1,92 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"ankao/internal/database"
|
||||
"ankao/internal/models"
|
||||
"encoding/json"
|
||||
"log"
|
||||
"os"
|
||||
)
|
||||
|
||||
// JSONQuestion JSON中的题目结构
|
||||
type JSONQuestion struct {
|
||||
ID string `json:"id"`
|
||||
Question string `json:"question"`
|
||||
Answers interface{} `json:"answers"`
|
||||
Options interface{} `json:"options,omitempty"`
|
||||
}
|
||||
|
||||
// JSONQuestionGroup JSON中的题目组结构
|
||||
type JSONQuestionGroup struct {
|
||||
Type string `json:"type"`
|
||||
TypeName string `json:"typeName"`
|
||||
List []JSONQuestion `json:"list"`
|
||||
}
|
||||
|
||||
func main() {
|
||||
log.Println("开始导入题目数据...")
|
||||
|
||||
// 初始化数据库
|
||||
if err := database.InitDB(); err != nil {
|
||||
log.Fatal("数据库初始化失败:", err)
|
||||
}
|
||||
|
||||
// 读取JSON文件
|
||||
data, err := os.ReadFile("practice_question_pool.json")
|
||||
if err != nil {
|
||||
log.Fatal("读取JSON文件失败:", err)
|
||||
}
|
||||
|
||||
// 解析JSON
|
||||
var groups []JSONQuestionGroup
|
||||
if err := json.Unmarshal(data, &groups); err != nil {
|
||||
log.Fatal("解析JSON失败:", err)
|
||||
}
|
||||
|
||||
// 导入数据
|
||||
db := database.GetDB()
|
||||
totalCount := 0
|
||||
|
||||
for _, group := range groups {
|
||||
log.Printf("导入题型: %s (%s), 题目数量: %d", group.TypeName, group.Type, len(group.List))
|
||||
|
||||
for _, q := range group.List {
|
||||
// 将答案转换为JSON字符串存储
|
||||
answerJSON, err := json.Marshal(q.Answers)
|
||||
if err != nil {
|
||||
log.Printf("序列化答案失败 (ID: %s): %v", q.ID, err)
|
||||
continue
|
||||
}
|
||||
|
||||
// 将选项转换为JSON字符串存储
|
||||
optionsJSON := ""
|
||||
if q.Options != nil {
|
||||
optJSON, err := json.Marshal(q.Options)
|
||||
if err != nil {
|
||||
log.Printf("序列化选项失败 (ID: %s): %v", q.ID, err)
|
||||
continue
|
||||
}
|
||||
optionsJSON = string(optJSON)
|
||||
}
|
||||
|
||||
// 创建题目记录 - 直接使用group.Type,不做类型映射
|
||||
question := models.PracticeQuestion{
|
||||
QuestionID: q.ID,
|
||||
Type: group.Type,
|
||||
TypeName: group.TypeName,
|
||||
Question: q.Question,
|
||||
AnswerData: string(answerJSON),
|
||||
OptionsData: optionsJSON,
|
||||
}
|
||||
|
||||
// 插入数据库
|
||||
if err := db.Create(&question).Error; err != nil {
|
||||
log.Printf("插入题目失败 (ID: %s): %v", q.ID, err)
|
||||
continue
|
||||
}
|
||||
totalCount++
|
||||
}
|
||||
}
|
||||
|
||||
log.Printf("数据导入完成! 共导入 %d 道题目", totalCount)
|
||||
}
|
||||
@ -1,82 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"os"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// 测试JSON解析
|
||||
func TestJSONParsing(t *testing.T) {
|
||||
// 读取JSON文件
|
||||
data, err := os.ReadFile("../practice_question_pool.json")
|
||||
if err != nil {
|
||||
t.Fatalf("读取JSON文件失败: %v", err)
|
||||
}
|
||||
|
||||
// 解析JSON
|
||||
var groups []JSONQuestionGroup
|
||||
if err := json.Unmarshal(data, &groups); err != nil {
|
||||
t.Fatalf("解析JSON失败: %v", err)
|
||||
}
|
||||
|
||||
t.Logf("成功解析 %d 个题目组", len(groups))
|
||||
|
||||
// 检查每个题目组的类型信息
|
||||
for i, group := range groups {
|
||||
t.Logf("\n题目组 %d:", i+1)
|
||||
t.Logf(" Type: %s", group.Type)
|
||||
t.Logf(" TypeName: %s", group.TypeName)
|
||||
t.Logf(" 题目数量: %d", len(group.List))
|
||||
|
||||
// 检查类型映射
|
||||
t.Logf(" 原始类型: %s", group.Type)
|
||||
|
||||
// 检查是否为空
|
||||
if group.Type == "" {
|
||||
t.Errorf(" ❌ 题目组 %d 的 Type 为空!", i+1)
|
||||
}
|
||||
if group.TypeName == "" {
|
||||
t.Errorf(" ❌ 题目组 %d 的 TypeName 为空!", i+1)
|
||||
}
|
||||
if len(group.List) == 0 {
|
||||
t.Errorf(" ❌ 题目组 %d 的题目列表为空!", i+1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 测试单个题目组解析
|
||||
func TestSingleGroupParsing(t *testing.T) {
|
||||
// 测试第一个题目组(填空题,type在list之后)
|
||||
jsonStr1 := `{
|
||||
"list": [{"id": "1", "question": "test", "answers": ["answer1"]}],
|
||||
"type": "fill-in-blank",
|
||||
"typeName": "填空题"
|
||||
}`
|
||||
|
||||
var group1 JSONQuestionGroup
|
||||
if err := json.Unmarshal([]byte(jsonStr1), &group1); err != nil {
|
||||
t.Fatalf("解析题目组1失败: %v", err)
|
||||
}
|
||||
t.Logf("题目组1 - Type: %s, TypeName: %s, 题目数: %d", group1.Type, group1.TypeName, len(group1.List))
|
||||
|
||||
// 测试第二个题目组(type在list之前)
|
||||
jsonStr2 := `{
|
||||
"type": "fill-in-blank",
|
||||
"typeName": "填空题",
|
||||
"list": [{"id": "1", "question": "test", "answers": ["answer1"]}]
|
||||
}`
|
||||
|
||||
var group2 JSONQuestionGroup
|
||||
if err := json.Unmarshal([]byte(jsonStr2), &group2); err != nil {
|
||||
t.Fatalf("解析题目组2失败: %v", err)
|
||||
}
|
||||
t.Logf("题目组2 - Type: %s, TypeName: %s, 题目数: %d", group2.Type, group2.TypeName, len(group2.List))
|
||||
|
||||
// 验证两种顺序解析结果是否一致
|
||||
if group1.Type != group2.Type || group1.TypeName != group2.TypeName {
|
||||
t.Errorf("不同字段顺序导致解析结果不一致!")
|
||||
} else {
|
||||
t.Log("✓ JSON字段顺序不影响解析结果")
|
||||
}
|
||||
}
|
||||
@ -15,6 +15,7 @@
|
||||
"axios": "^1.6.5",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-markdown": "^10.1.0",
|
||||
"react-router-dom": "^6.21.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@ -95,3 +95,8 @@ export const updateQuestion = (id: number, data: {
|
||||
export const deleteQuestion = (id: number) => {
|
||||
return request.delete<ApiResponse<null>>(`/practice/questions/${id}`)
|
||||
}
|
||||
|
||||
// 获取题目解析(AI)
|
||||
export const explainQuestion = (questionId: number) => {
|
||||
return request.post<ApiResponse<{ explanation: string }>>('/practice/explain', { question_id: questionId })
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import React from 'react'
|
||||
import { Alert, Typography, Card, Space, Progress } from 'antd'
|
||||
import { CheckOutlined, CloseOutlined, TrophyOutlined, CommentOutlined, BulbOutlined } from '@ant-design/icons'
|
||||
import React, { useState } from 'react'
|
||||
import { Alert, Typography, Card, Space, Progress, Button, Spin } from 'antd'
|
||||
import { CheckOutlined, CloseOutlined, TrophyOutlined, CommentOutlined, BulbOutlined, FileTextOutlined, ReloadOutlined } from '@ant-design/icons'
|
||||
import ReactMarkdown from 'react-markdown'
|
||||
import type { AnswerResult as AnswerResultType } from '../types/question'
|
||||
|
||||
const { Text, Paragraph } = Typography
|
||||
@ -9,13 +10,104 @@ interface AnswerResultProps {
|
||||
answerResult: AnswerResultType
|
||||
selectedAnswer: string | string[]
|
||||
questionType: string
|
||||
questionId: number
|
||||
}
|
||||
|
||||
const AnswerResult: React.FC<AnswerResultProps> = ({
|
||||
answerResult,
|
||||
selectedAnswer,
|
||||
questionType,
|
||||
questionId,
|
||||
}) => {
|
||||
const [explanation, setExplanation] = useState<string>('')
|
||||
const [showExplanation, setShowExplanation] = useState(false)
|
||||
const [loadingExplanation, setLoadingExplanation] = useState(false)
|
||||
|
||||
// 获取AI解析(流式)
|
||||
const fetchExplanation = async () => {
|
||||
console.log('开始获取AI解析(流式),题目ID:', questionId)
|
||||
setLoadingExplanation(true)
|
||||
setExplanation('') // 清空之前的内容
|
||||
|
||||
try {
|
||||
console.log('发送请求到 /api/practice/explain')
|
||||
const response = await fetch('/api/practice/explain', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({ question_id: questionId }),
|
||||
})
|
||||
|
||||
console.log('收到响应,状态码:', response.status)
|
||||
if (!response.ok) {
|
||||
throw new Error('请求失败')
|
||||
}
|
||||
|
||||
const reader = response.body?.getReader()
|
||||
const decoder = new TextDecoder()
|
||||
let buffer = ''
|
||||
|
||||
if (!reader) {
|
||||
throw new Error('无法读取响应流')
|
||||
}
|
||||
|
||||
console.log('开始读取流式数据...')
|
||||
let chunkCount = 0
|
||||
while (true) {
|
||||
const { done, value } = await reader.read()
|
||||
|
||||
if (done) {
|
||||
console.log('流读取完成,共接收', chunkCount, '个数据块')
|
||||
break
|
||||
}
|
||||
|
||||
chunkCount++
|
||||
buffer += decoder.decode(value, { stream: true })
|
||||
const lines = buffer.split('\n\n')
|
||||
buffer = lines.pop() || ''
|
||||
|
||||
for (const line of lines) {
|
||||
if (line.startsWith('data: ')) {
|
||||
const data = line.slice(6)
|
||||
if (data === '[DONE]') {
|
||||
console.log('收到完成信号 [DONE]')
|
||||
break
|
||||
}
|
||||
// 追加内容
|
||||
console.log('接收数据片段:', data.substring(0, 20) + '...')
|
||||
setExplanation(prev => prev + data)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log('AI解析获取成功')
|
||||
} catch (error) {
|
||||
console.error('获取解析失败', error)
|
||||
setExplanation('获取解析失败,请重试')
|
||||
} finally {
|
||||
setLoadingExplanation(false)
|
||||
}
|
||||
}
|
||||
|
||||
// 获取AI解析
|
||||
const handleGetExplanation = async () => {
|
||||
if (explanation) {
|
||||
// 如果已经有解析,直接显示/隐藏
|
||||
setShowExplanation(!showExplanation)
|
||||
return
|
||||
}
|
||||
|
||||
setShowExplanation(true)
|
||||
await fetchExplanation()
|
||||
}
|
||||
|
||||
// 重新生成解析
|
||||
const handleRegenerateExplanation = async () => {
|
||||
console.log('点击重新生成解析按钮')
|
||||
await fetchExplanation()
|
||||
}
|
||||
|
||||
// 格式化答案显示(判断题特殊处理)
|
||||
const formatAnswer = (answer: string | string[] | boolean) => {
|
||||
// 处理判断题的布尔值和字符串
|
||||
@ -54,12 +146,23 @@ const AnswerResult: React.FC<AnswerResultProps> = ({
|
||||
|
||||
return (
|
||||
<div style={{ marginTop: 20 }}>
|
||||
{/* 答题结果 */}
|
||||
<Alert
|
||||
type={answerResult.correct ? 'success' : 'error'}
|
||||
icon={answerResult.correct ? <CheckOutlined /> : <CloseOutlined />}
|
||||
message={
|
||||
<div>
|
||||
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
|
||||
<strong>{answerResult.correct ? '回答正确!' : '回答错误'}</strong>
|
||||
{/* AI解析按钮 - 放在答题结果的右上角 */}
|
||||
<Button
|
||||
type="link"
|
||||
icon={<FileTextOutlined />}
|
||||
onClick={handleGetExplanation}
|
||||
loading={loadingExplanation}
|
||||
size="small"
|
||||
>
|
||||
{showExplanation ? '隐藏解析' : 'AI解析'}
|
||||
</Button>
|
||||
</div>
|
||||
}
|
||||
description={
|
||||
@ -90,6 +193,69 @@ const AnswerResult: React.FC<AnswerResultProps> = ({
|
||||
}
|
||||
/>
|
||||
|
||||
{/* AI解析内容 */}
|
||||
{showExplanation && (
|
||||
<Card
|
||||
style={{ marginTop: 16 }}
|
||||
title={
|
||||
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
|
||||
<Space>
|
||||
<FileTextOutlined style={{ color: '#1890ff' }} />
|
||||
<Text strong>题目解析</Text>
|
||||
</Space>
|
||||
{explanation && !loadingExplanation && (
|
||||
<Button
|
||||
type="text"
|
||||
icon={<ReloadOutlined />}
|
||||
onClick={handleRegenerateExplanation}
|
||||
size="small"
|
||||
style={{ color: '#1890ff' }}
|
||||
>
|
||||
重新生成
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
}
|
||||
>
|
||||
<div style={{ color: '#595959' }}>
|
||||
{explanation ? (
|
||||
<ReactMarkdown
|
||||
components={{
|
||||
// 自定义markdown组件样式
|
||||
p: ({ children }) => <p style={{ marginBottom: '0.5em', lineHeight: '1.6' }}>{children}</p>,
|
||||
h1: ({ children }) => <h1 style={{ fontSize: '1.5em', marginTop: '0.5em', marginBottom: '0.5em' }}>{children}</h1>,
|
||||
h2: ({ children }) => <h2 style={{ fontSize: '1.3em', marginTop: '0.5em', marginBottom: '0.5em' }}>{children}</h2>,
|
||||
h3: ({ children }) => <h3 style={{ fontSize: '1.1em', marginTop: '0.5em', marginBottom: '0.5em' }}>{children}</h3>,
|
||||
ul: ({ children }) => <ul style={{ marginLeft: '1.5em', marginBottom: '0.5em' }}>{children}</ul>,
|
||||
ol: ({ children }) => <ol style={{ marginLeft: '1.5em', marginBottom: '0.5em' }}>{children}</ol>,
|
||||
li: ({ children }) => <li style={{ marginBottom: '0.3em', lineHeight: '1.6' }}>{children}</li>,
|
||||
code: ({ children }) => <code style={{ backgroundColor: '#f5f5f5', padding: '2px 6px', borderRadius: '3px', fontSize: '0.9em' }}>{children}</code>,
|
||||
pre: ({ children }) => <pre style={{ backgroundColor: '#f5f5f5', padding: '12px', borderRadius: '4px', overflow: 'auto' }}>{children}</pre>,
|
||||
blockquote: ({ children }) => <blockquote style={{ borderLeft: '4px solid #1890ff', paddingLeft: '12px', margin: '0.5em 0', color: '#666' }}>{children}</blockquote>,
|
||||
}}
|
||||
>
|
||||
{explanation}
|
||||
</ReactMarkdown>
|
||||
) : (
|
||||
loadingExplanation ? (
|
||||
<div style={{ textAlign: 'center', padding: '20px 0' }}>
|
||||
<Spin tip="AI正在生成解析中..." />
|
||||
</div>
|
||||
) : (
|
||||
<Paragraph style={{ marginBottom: 0 }}>暂无解析内容</Paragraph>
|
||||
)
|
||||
)}
|
||||
{/* 流式输出时的loading提示 */}
|
||||
{loadingExplanation && explanation && (
|
||||
<div style={{ marginTop: '10px', color: '#1890ff', fontSize: '14px' }}>
|
||||
<Spin size="small" style={{ marginRight: '8px' }} />
|
||||
正在生成中...
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</Card>
|
||||
)}
|
||||
|
||||
{/* AI评分结果 - 仅简答题显示 */}
|
||||
{answerResult.ai_grading && (
|
||||
<Card
|
||||
|
||||
@ -173,6 +173,7 @@ const QuestionCard: React.FC<QuestionCardProps> = ({
|
||||
answerResult={answerResult}
|
||||
selectedAnswer={selectedAnswer}
|
||||
questionType={question.type}
|
||||
questionId={question.id}
|
||||
/>
|
||||
)}
|
||||
|
||||
|
||||
@ -219,6 +219,9 @@ const QuestionPage: React.FC = () => {
|
||||
|
||||
// 保存进度
|
||||
saveProgress(nextIndex, correctCount, wrongCount);
|
||||
|
||||
// 滚动到页面顶部
|
||||
window.scrollTo({ top: 0, behavior: 'smooth' });
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
648
web/yarn.lock
648
web/yarn.lock
@ -723,16 +723,49 @@
|
||||
dependencies:
|
||||
"@babel/types" "^7.28.2"
|
||||
|
||||
"@types/estree@1.0.8":
|
||||
"@types/debug@^4.0.0":
|
||||
version "4.1.12"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917"
|
||||
integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==
|
||||
dependencies:
|
||||
"@types/ms" "*"
|
||||
|
||||
"@types/estree-jsx@^1.0.0":
|
||||
version "1.0.5"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18"
|
||||
integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==
|
||||
dependencies:
|
||||
"@types/estree" "*"
|
||||
|
||||
"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0":
|
||||
version "1.0.8"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/@types/estree/-/estree-1.0.8.tgz"
|
||||
integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
|
||||
|
||||
"@types/hast@^3.0.0":
|
||||
version "3.0.4"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa"
|
||||
integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==
|
||||
dependencies:
|
||||
"@types/unist" "*"
|
||||
|
||||
"@types/json-schema@^7.0.12":
|
||||
version "7.0.15"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/@types/json-schema/-/json-schema-7.0.15.tgz"
|
||||
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
|
||||
|
||||
"@types/mdast@^4.0.0":
|
||||
version "4.0.4"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6"
|
||||
integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==
|
||||
dependencies:
|
||||
"@types/unist" "*"
|
||||
|
||||
"@types/ms@*":
|
||||
version "2.1.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78"
|
||||
integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==
|
||||
|
||||
"@types/node@^20.11.5":
|
||||
version "20.19.24"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/@types/node/-/node-20.19.24.tgz"
|
||||
@ -763,6 +796,16 @@
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/@types/semver/-/semver-7.7.1.tgz"
|
||||
integrity sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==
|
||||
|
||||
"@types/unist@*", "@types/unist@^3.0.0":
|
||||
version "3.0.3"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c"
|
||||
integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==
|
||||
|
||||
"@types/unist@^2.0.0":
|
||||
version "2.0.11"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4"
|
||||
integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==
|
||||
|
||||
"@typescript-eslint/eslint-plugin@^6.19.0":
|
||||
version "6.21.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz"
|
||||
@ -849,7 +892,7 @@
|
||||
"@typescript-eslint/types" "6.21.0"
|
||||
eslint-visitor-keys "^3.4.1"
|
||||
|
||||
"@ungap/structured-clone@^1.2.0":
|
||||
"@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0":
|
||||
version "1.3.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/@ungap/structured-clone/-/structured-clone-1.3.0.tgz"
|
||||
integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==
|
||||
@ -977,6 +1020,11 @@ axios@^1.6.5:
|
||||
form-data "^4.0.4"
|
||||
proxy-from-env "^1.1.0"
|
||||
|
||||
bail@^2.0.0:
|
||||
version "2.0.2"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d"
|
||||
integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==
|
||||
|
||||
balanced-match@^1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/balanced-match/-/balanced-match-1.0.2.tgz"
|
||||
@ -1038,6 +1086,11 @@ caniuse-lite@^1.0.30001751:
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/caniuse-lite/-/caniuse-lite-1.0.30001752.tgz"
|
||||
integrity sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==
|
||||
|
||||
ccount@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5"
|
||||
integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==
|
||||
|
||||
chalk@^4.0.0:
|
||||
version "4.1.2"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/chalk/-/chalk-4.1.2.tgz"
|
||||
@ -1046,6 +1099,26 @@ chalk@^4.0.0:
|
||||
ansi-styles "^4.1.0"
|
||||
supports-color "^7.1.0"
|
||||
|
||||
character-entities-html4@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b"
|
||||
integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==
|
||||
|
||||
character-entities-legacy@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b"
|
||||
integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==
|
||||
|
||||
character-entities@^2.0.0:
|
||||
version "2.0.2"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22"
|
||||
integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==
|
||||
|
||||
character-reference-invalid@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9"
|
||||
integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==
|
||||
|
||||
classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1:
|
||||
version "2.5.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b"
|
||||
@ -1075,6 +1148,11 @@ combined-stream@^1.0.8:
|
||||
dependencies:
|
||||
delayed-stream "~1.0.0"
|
||||
|
||||
comma-separated-tokens@^2.0.0:
|
||||
version "2.0.3"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee"
|
||||
integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==
|
||||
|
||||
compute-scroll-into-view@^3.0.2:
|
||||
version "3.1.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz#02c3386ec531fb6a9881967388e53e8564f3e9aa"
|
||||
@ -1123,13 +1201,20 @@ dayjs@^1.11.11:
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/dayjs/-/dayjs-1.11.19.tgz#15dc98e854bb43917f12021806af897c58ae2938"
|
||||
integrity sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==
|
||||
|
||||
debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
|
||||
debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
|
||||
version "4.4.3"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/debug/-/debug-4.4.3.tgz"
|
||||
integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
|
||||
dependencies:
|
||||
ms "^2.1.3"
|
||||
|
||||
decode-named-character-reference@^1.0.0:
|
||||
version "1.2.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz#25c32ae6dd5e21889549d40f676030e9514cc0ed"
|
||||
integrity sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==
|
||||
dependencies:
|
||||
character-entities "^2.0.0"
|
||||
|
||||
deep-is@^0.1.3:
|
||||
version "0.1.4"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/deep-is/-/deep-is-0.1.4.tgz"
|
||||
@ -1140,6 +1225,18 @@ delayed-stream@~1.0.0:
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/delayed-stream/-/delayed-stream-1.0.0.tgz"
|
||||
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
|
||||
|
||||
dequal@^2.0.0:
|
||||
version "2.0.3"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
|
||||
integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
|
||||
|
||||
devlop@^1.0.0, devlop@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018"
|
||||
integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==
|
||||
dependencies:
|
||||
dequal "^2.0.0"
|
||||
|
||||
dir-glob@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/dir-glob/-/dir-glob-3.0.1.tgz"
|
||||
@ -1336,11 +1433,21 @@ estraverse@^5.1.0, estraverse@^5.2.0:
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/estraverse/-/estraverse-5.3.0.tgz"
|
||||
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
|
||||
|
||||
estree-util-is-identifier-name@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd"
|
||||
integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==
|
||||
|
||||
esutils@^2.0.2:
|
||||
version "2.0.3"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/esutils/-/esutils-2.0.3.tgz"
|
||||
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
|
||||
|
||||
extend@^3.0.0:
|
||||
version "3.0.2"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
|
||||
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
|
||||
|
||||
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
|
||||
version "3.1.3"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
|
||||
@ -1554,6 +1661,39 @@ hasown@^2.0.2:
|
||||
dependencies:
|
||||
function-bind "^1.1.2"
|
||||
|
||||
hast-util-to-jsx-runtime@^2.0.0:
|
||||
version "2.3.6"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz#ff31897aae59f62232e21594eac7ef6b63333e98"
|
||||
integrity sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==
|
||||
dependencies:
|
||||
"@types/estree" "^1.0.0"
|
||||
"@types/hast" "^3.0.0"
|
||||
"@types/unist" "^3.0.0"
|
||||
comma-separated-tokens "^2.0.0"
|
||||
devlop "^1.0.0"
|
||||
estree-util-is-identifier-name "^3.0.0"
|
||||
hast-util-whitespace "^3.0.0"
|
||||
mdast-util-mdx-expression "^2.0.0"
|
||||
mdast-util-mdx-jsx "^3.0.0"
|
||||
mdast-util-mdxjs-esm "^2.0.0"
|
||||
property-information "^7.0.0"
|
||||
space-separated-tokens "^2.0.0"
|
||||
style-to-js "^1.0.0"
|
||||
unist-util-position "^5.0.0"
|
||||
vfile-message "^4.0.0"
|
||||
|
||||
hast-util-whitespace@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621"
|
||||
integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==
|
||||
dependencies:
|
||||
"@types/hast" "^3.0.0"
|
||||
|
||||
html-url-attributes@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/html-url-attributes/-/html-url-attributes-3.0.1.tgz#83b052cd5e437071b756cd74ae70f708870c2d87"
|
||||
integrity sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==
|
||||
|
||||
iconv-lite@^0.6.3:
|
||||
version "0.6.3"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/iconv-lite/-/iconv-lite-0.6.3.tgz"
|
||||
@ -1597,6 +1737,29 @@ inherits@2:
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/inherits/-/inherits-2.0.4.tgz"
|
||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||
|
||||
inline-style-parser@0.2.6:
|
||||
version "0.2.6"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/inline-style-parser/-/inline-style-parser-0.2.6.tgz#e6bbb5288a635f6284a6249ce754da55c4bd1ff5"
|
||||
integrity sha512-gtGXVaBdl5mAes3rPcMedEBm12ibjt1kDMFfheul1wUAOVEJW60voNdMVzVkfLN06O7ZaD/rxhfKgtlgtTbMjg==
|
||||
|
||||
is-alphabetical@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b"
|
||||
integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==
|
||||
|
||||
is-alphanumerical@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875"
|
||||
integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==
|
||||
dependencies:
|
||||
is-alphabetical "^2.0.0"
|
||||
is-decimal "^2.0.0"
|
||||
|
||||
is-decimal@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7"
|
||||
integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==
|
||||
|
||||
is-extglob@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/is-extglob/-/is-extglob-2.1.1.tgz"
|
||||
@ -1609,6 +1772,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
|
||||
dependencies:
|
||||
is-extglob "^2.1.1"
|
||||
|
||||
is-hexadecimal@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027"
|
||||
integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==
|
||||
|
||||
is-mobile@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/is-mobile/-/is-mobile-5.0.0.tgz#1e08a0ef2c38a67bff84a52af68d67bcef445333"
|
||||
@ -1624,6 +1792,11 @@ is-path-inside@^3.0.3:
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/is-path-inside/-/is-path-inside-3.0.3.tgz"
|
||||
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
|
||||
|
||||
is-plain-obj@^4.0.0:
|
||||
version "4.1.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0"
|
||||
integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==
|
||||
|
||||
is-what@^3.14.1:
|
||||
version "3.14.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/is-what/-/is-what-3.14.1.tgz"
|
||||
@ -1722,6 +1895,11 @@ lodash.merge@^4.6.2:
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/lodash.merge/-/lodash.merge-4.6.2.tgz"
|
||||
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
|
||||
|
||||
longest-streak@^3.0.0:
|
||||
version "3.1.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4"
|
||||
integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==
|
||||
|
||||
loose-envify@^1.1.0:
|
||||
version "1.4.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/loose-envify/-/loose-envify-1.4.0.tgz"
|
||||
@ -1749,11 +1927,310 @@ math-intrinsics@^1.1.0:
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/math-intrinsics/-/math-intrinsics-1.1.0.tgz"
|
||||
integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
|
||||
|
||||
mdast-util-from-markdown@^2.0.0:
|
||||
version "2.0.2"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz#4850390ca7cf17413a9b9a0fbefcd1bc0eb4160a"
|
||||
integrity sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==
|
||||
dependencies:
|
||||
"@types/mdast" "^4.0.0"
|
||||
"@types/unist" "^3.0.0"
|
||||
decode-named-character-reference "^1.0.0"
|
||||
devlop "^1.0.0"
|
||||
mdast-util-to-string "^4.0.0"
|
||||
micromark "^4.0.0"
|
||||
micromark-util-decode-numeric-character-reference "^2.0.0"
|
||||
micromark-util-decode-string "^2.0.0"
|
||||
micromark-util-normalize-identifier "^2.0.0"
|
||||
micromark-util-symbol "^2.0.0"
|
||||
micromark-util-types "^2.0.0"
|
||||
unist-util-stringify-position "^4.0.0"
|
||||
|
||||
mdast-util-mdx-expression@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz#43f0abac9adc756e2086f63822a38c8d3c3a5096"
|
||||
integrity sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==
|
||||
dependencies:
|
||||
"@types/estree-jsx" "^1.0.0"
|
||||
"@types/hast" "^3.0.0"
|
||||
"@types/mdast" "^4.0.0"
|
||||
devlop "^1.0.0"
|
||||
mdast-util-from-markdown "^2.0.0"
|
||||
mdast-util-to-markdown "^2.0.0"
|
||||
|
||||
mdast-util-mdx-jsx@^3.0.0:
|
||||
version "3.2.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz#fd04c67a2a7499efb905a8a5c578dddc9fdada0d"
|
||||
integrity sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==
|
||||
dependencies:
|
||||
"@types/estree-jsx" "^1.0.0"
|
||||
"@types/hast" "^3.0.0"
|
||||
"@types/mdast" "^4.0.0"
|
||||
"@types/unist" "^3.0.0"
|
||||
ccount "^2.0.0"
|
||||
devlop "^1.1.0"
|
||||
mdast-util-from-markdown "^2.0.0"
|
||||
mdast-util-to-markdown "^2.0.0"
|
||||
parse-entities "^4.0.0"
|
||||
stringify-entities "^4.0.0"
|
||||
unist-util-stringify-position "^4.0.0"
|
||||
vfile-message "^4.0.0"
|
||||
|
||||
mdast-util-mdxjs-esm@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97"
|
||||
integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==
|
||||
dependencies:
|
||||
"@types/estree-jsx" "^1.0.0"
|
||||
"@types/hast" "^3.0.0"
|
||||
"@types/mdast" "^4.0.0"
|
||||
devlop "^1.0.0"
|
||||
mdast-util-from-markdown "^2.0.0"
|
||||
mdast-util-to-markdown "^2.0.0"
|
||||
|
||||
mdast-util-phrasing@^4.0.0:
|
||||
version "4.1.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3"
|
||||
integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==
|
||||
dependencies:
|
||||
"@types/mdast" "^4.0.0"
|
||||
unist-util-is "^6.0.0"
|
||||
|
||||
mdast-util-to-hast@^13.0.0:
|
||||
version "13.2.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4"
|
||||
integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==
|
||||
dependencies:
|
||||
"@types/hast" "^3.0.0"
|
||||
"@types/mdast" "^4.0.0"
|
||||
"@ungap/structured-clone" "^1.0.0"
|
||||
devlop "^1.0.0"
|
||||
micromark-util-sanitize-uri "^2.0.0"
|
||||
trim-lines "^3.0.0"
|
||||
unist-util-position "^5.0.0"
|
||||
unist-util-visit "^5.0.0"
|
||||
vfile "^6.0.0"
|
||||
|
||||
mdast-util-to-markdown@^2.0.0:
|
||||
version "2.1.2"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz#f910ffe60897f04bb4b7e7ee434486f76288361b"
|
||||
integrity sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==
|
||||
dependencies:
|
||||
"@types/mdast" "^4.0.0"
|
||||
"@types/unist" "^3.0.0"
|
||||
longest-streak "^3.0.0"
|
||||
mdast-util-phrasing "^4.0.0"
|
||||
mdast-util-to-string "^4.0.0"
|
||||
micromark-util-classify-character "^2.0.0"
|
||||
micromark-util-decode-string "^2.0.0"
|
||||
unist-util-visit "^5.0.0"
|
||||
zwitch "^2.0.0"
|
||||
|
||||
mdast-util-to-string@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814"
|
||||
integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==
|
||||
dependencies:
|
||||
"@types/mdast" "^4.0.0"
|
||||
|
||||
merge2@^1.3.0, merge2@^1.4.1:
|
||||
version "1.4.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/merge2/-/merge2-1.4.1.tgz"
|
||||
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
|
||||
|
||||
micromark-core-commonmark@^2.0.0:
|
||||
version "2.0.3"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz#c691630e485021a68cf28dbc2b2ca27ebf678cd4"
|
||||
integrity sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==
|
||||
dependencies:
|
||||
decode-named-character-reference "^1.0.0"
|
||||
devlop "^1.0.0"
|
||||
micromark-factory-destination "^2.0.0"
|
||||
micromark-factory-label "^2.0.0"
|
||||
micromark-factory-space "^2.0.0"
|
||||
micromark-factory-title "^2.0.0"
|
||||
micromark-factory-whitespace "^2.0.0"
|
||||
micromark-util-character "^2.0.0"
|
||||
micromark-util-chunked "^2.0.0"
|
||||
micromark-util-classify-character "^2.0.0"
|
||||
micromark-util-html-tag-name "^2.0.0"
|
||||
micromark-util-normalize-identifier "^2.0.0"
|
||||
micromark-util-resolve-all "^2.0.0"
|
||||
micromark-util-subtokenize "^2.0.0"
|
||||
micromark-util-symbol "^2.0.0"
|
||||
micromark-util-types "^2.0.0"
|
||||
|
||||
micromark-factory-destination@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz#8fef8e0f7081f0474fbdd92deb50c990a0264639"
|
||||
integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==
|
||||
dependencies:
|
||||
micromark-util-character "^2.0.0"
|
||||
micromark-util-symbol "^2.0.0"
|
||||
micromark-util-types "^2.0.0"
|
||||
|
||||
micromark-factory-label@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz#5267efa97f1e5254efc7f20b459a38cb21058ba1"
|
||||
integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==
|
||||
dependencies:
|
||||
devlop "^1.0.0"
|
||||
micromark-util-character "^2.0.0"
|
||||
micromark-util-symbol "^2.0.0"
|
||||
micromark-util-types "^2.0.0"
|
||||
|
||||
micromark-factory-space@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz#36d0212e962b2b3121f8525fc7a3c7c029f334fc"
|
||||
integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==
|
||||
dependencies:
|
||||
micromark-util-character "^2.0.0"
|
||||
micromark-util-types "^2.0.0"
|
||||
|
||||
micromark-factory-title@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz#237e4aa5d58a95863f01032d9ee9b090f1de6e94"
|
||||
integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==
|
||||
dependencies:
|
||||
micromark-factory-space "^2.0.0"
|
||||
micromark-util-character "^2.0.0"
|
||||
micromark-util-symbol "^2.0.0"
|
||||
micromark-util-types "^2.0.0"
|
||||
|
||||
micromark-factory-whitespace@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz#06b26b2983c4d27bfcc657b33e25134d4868b0b1"
|
||||
integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==
|
||||
dependencies:
|
||||
micromark-factory-space "^2.0.0"
|
||||
micromark-util-character "^2.0.0"
|
||||
micromark-util-symbol "^2.0.0"
|
||||
micromark-util-types "^2.0.0"
|
||||
|
||||
micromark-util-character@^2.0.0:
|
||||
version "2.1.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6"
|
||||
integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==
|
||||
dependencies:
|
||||
micromark-util-symbol "^2.0.0"
|
||||
micromark-util-types "^2.0.0"
|
||||
|
||||
micromark-util-chunked@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz#47fbcd93471a3fccab86cff03847fc3552db1051"
|
||||
integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==
|
||||
dependencies:
|
||||
micromark-util-symbol "^2.0.0"
|
||||
|
||||
micromark-util-classify-character@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz#d399faf9c45ca14c8b4be98b1ea481bced87b629"
|
||||
integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==
|
||||
dependencies:
|
||||
micromark-util-character "^2.0.0"
|
||||
micromark-util-symbol "^2.0.0"
|
||||
micromark-util-types "^2.0.0"
|
||||
|
||||
micromark-util-combine-extensions@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz#2a0f490ab08bff5cc2fd5eec6dd0ca04f89b30a9"
|
||||
integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==
|
||||
dependencies:
|
||||
micromark-util-chunked "^2.0.0"
|
||||
micromark-util-types "^2.0.0"
|
||||
|
||||
micromark-util-decode-numeric-character-reference@^2.0.0:
|
||||
version "2.0.2"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz#fcf15b660979388e6f118cdb6bf7d79d73d26fe5"
|
||||
integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==
|
||||
dependencies:
|
||||
micromark-util-symbol "^2.0.0"
|
||||
|
||||
micromark-util-decode-string@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz#6cb99582e5d271e84efca8e61a807994d7161eb2"
|
||||
integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==
|
||||
dependencies:
|
||||
decode-named-character-reference "^1.0.0"
|
||||
micromark-util-character "^2.0.0"
|
||||
micromark-util-decode-numeric-character-reference "^2.0.0"
|
||||
micromark-util-symbol "^2.0.0"
|
||||
|
||||
micromark-util-encode@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8"
|
||||
integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==
|
||||
|
||||
micromark-util-html-tag-name@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz#e40403096481986b41c106627f98f72d4d10b825"
|
||||
integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==
|
||||
|
||||
micromark-util-normalize-identifier@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz#c30d77b2e832acf6526f8bf1aa47bc9c9438c16d"
|
||||
integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==
|
||||
dependencies:
|
||||
micromark-util-symbol "^2.0.0"
|
||||
|
||||
micromark-util-resolve-all@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz#e1a2d62cdd237230a2ae11839027b19381e31e8b"
|
||||
integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==
|
||||
dependencies:
|
||||
micromark-util-types "^2.0.0"
|
||||
|
||||
micromark-util-sanitize-uri@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7"
|
||||
integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==
|
||||
dependencies:
|
||||
micromark-util-character "^2.0.0"
|
||||
micromark-util-encode "^2.0.0"
|
||||
micromark-util-symbol "^2.0.0"
|
||||
|
||||
micromark-util-subtokenize@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz#d8ade5ba0f3197a1cf6a2999fbbfe6357a1a19ee"
|
||||
integrity sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==
|
||||
dependencies:
|
||||
devlop "^1.0.0"
|
||||
micromark-util-chunked "^2.0.0"
|
||||
micromark-util-symbol "^2.0.0"
|
||||
micromark-util-types "^2.0.0"
|
||||
|
||||
micromark-util-symbol@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8"
|
||||
integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==
|
||||
|
||||
micromark-util-types@^2.0.0:
|
||||
version "2.0.2"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark-util-types/-/micromark-util-types-2.0.2.tgz#f00225f5f5a0ebc3254f96c36b6605c4b393908e"
|
||||
integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==
|
||||
|
||||
micromark@^4.0.0:
|
||||
version "4.0.2"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromark/-/micromark-4.0.2.tgz#91395a3e1884a198e62116e33c9c568e39936fdb"
|
||||
integrity sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==
|
||||
dependencies:
|
||||
"@types/debug" "^4.0.0"
|
||||
debug "^4.0.0"
|
||||
decode-named-character-reference "^1.0.0"
|
||||
devlop "^1.0.0"
|
||||
micromark-core-commonmark "^2.0.0"
|
||||
micromark-factory-space "^2.0.0"
|
||||
micromark-util-character "^2.0.0"
|
||||
micromark-util-chunked "^2.0.0"
|
||||
micromark-util-combine-extensions "^2.0.0"
|
||||
micromark-util-decode-numeric-character-reference "^2.0.0"
|
||||
micromark-util-encode "^2.0.0"
|
||||
micromark-util-normalize-identifier "^2.0.0"
|
||||
micromark-util-resolve-all "^2.0.0"
|
||||
micromark-util-sanitize-uri "^2.0.0"
|
||||
micromark-util-subtokenize "^2.0.0"
|
||||
micromark-util-symbol "^2.0.0"
|
||||
micromark-util-types "^2.0.0"
|
||||
|
||||
micromatch@^4.0.8:
|
||||
version "4.0.8"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/micromatch/-/micromatch-4.0.8.tgz"
|
||||
@ -1861,6 +2338,19 @@ parent-module@^1.0.0:
|
||||
dependencies:
|
||||
callsites "^3.0.0"
|
||||
|
||||
parse-entities@^4.0.0:
|
||||
version "4.0.2"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159"
|
||||
integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==
|
||||
dependencies:
|
||||
"@types/unist" "^2.0.0"
|
||||
character-entities-legacy "^3.0.0"
|
||||
character-reference-invalid "^2.0.0"
|
||||
decode-named-character-reference "^1.0.0"
|
||||
is-alphanumerical "^2.0.0"
|
||||
is-decimal "^2.0.0"
|
||||
is-hexadecimal "^2.0.0"
|
||||
|
||||
parse-node-version@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/parse-node-version/-/parse-node-version-1.0.1.tgz"
|
||||
@ -1915,6 +2405,11 @@ prelude-ls@^1.2.1:
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/prelude-ls/-/prelude-ls-1.2.1.tgz"
|
||||
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
|
||||
|
||||
property-information@^7.0.0:
|
||||
version "7.1.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/property-information/-/property-information-7.1.0.tgz#b622e8646e02b580205415586b40804d3e8bfd5d"
|
||||
integrity sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==
|
||||
|
||||
proxy-from-env@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
|
||||
@ -2299,6 +2794,23 @@ react-is@^18.2.0:
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
|
||||
integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
|
||||
|
||||
react-markdown@^10.1.0:
|
||||
version "10.1.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/react-markdown/-/react-markdown-10.1.0.tgz#e22bc20faddbc07605c15284255653c0f3bad5ca"
|
||||
integrity sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==
|
||||
dependencies:
|
||||
"@types/hast" "^3.0.0"
|
||||
"@types/mdast" "^4.0.0"
|
||||
devlop "^1.0.0"
|
||||
hast-util-to-jsx-runtime "^2.0.0"
|
||||
html-url-attributes "^3.0.0"
|
||||
mdast-util-to-hast "^13.0.0"
|
||||
remark-parse "^11.0.0"
|
||||
remark-rehype "^11.0.0"
|
||||
unified "^11.0.0"
|
||||
unist-util-visit "^5.0.0"
|
||||
vfile "^6.0.0"
|
||||
|
||||
react-refresh@^0.17.0:
|
||||
version "0.17.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/react-refresh/-/react-refresh-0.17.0.tgz"
|
||||
@ -2326,6 +2838,27 @@ react@^18.2.0:
|
||||
dependencies:
|
||||
loose-envify "^1.1.0"
|
||||
|
||||
remark-parse@^11.0.0:
|
||||
version "11.0.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1"
|
||||
integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==
|
||||
dependencies:
|
||||
"@types/mdast" "^4.0.0"
|
||||
mdast-util-from-markdown "^2.0.0"
|
||||
micromark-util-types "^2.0.0"
|
||||
unified "^11.0.0"
|
||||
|
||||
remark-rehype@^11.0.0:
|
||||
version "11.1.2"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/remark-rehype/-/remark-rehype-11.1.2.tgz#2addaadda80ca9bd9aa0da763e74d16327683b37"
|
||||
integrity sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==
|
||||
dependencies:
|
||||
"@types/hast" "^3.0.0"
|
||||
"@types/mdast" "^4.0.0"
|
||||
mdast-util-to-hast "^13.0.0"
|
||||
unified "^11.0.0"
|
||||
vfile "^6.0.0"
|
||||
|
||||
resize-observer-polyfill@^1.5.1:
|
||||
version "1.5.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
|
||||
@ -2452,11 +2985,24 @@ source-map@~0.6.0:
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/source-map/-/source-map-0.6.1.tgz"
|
||||
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
||||
|
||||
space-separated-tokens@^2.0.0:
|
||||
version "2.0.2"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f"
|
||||
integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==
|
||||
|
||||
string-convert@^0.2.0:
|
||||
version "0.2.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97"
|
||||
integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==
|
||||
|
||||
stringify-entities@^4.0.0:
|
||||
version "4.0.4"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3"
|
||||
integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==
|
||||
dependencies:
|
||||
character-entities-html4 "^2.0.0"
|
||||
character-entities-legacy "^3.0.0"
|
||||
|
||||
strip-ansi@^6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/strip-ansi/-/strip-ansi-6.0.1.tgz"
|
||||
@ -2469,6 +3015,20 @@ strip-json-comments@^3.1.1:
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
|
||||
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
|
||||
|
||||
style-to-js@^1.0.0:
|
||||
version "1.1.19"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/style-to-js/-/style-to-js-1.1.19.tgz#f3f671e74764c1e8eebfba95a9a672acf5c19011"
|
||||
integrity sha512-Ev+SgeqiNGT1ufsXyVC5RrJRXdrkRJ1Gol9Qw7Pb72YCKJXrBvP0ckZhBeVSrw2m06DJpei2528uIpjMb4TsoQ==
|
||||
dependencies:
|
||||
style-to-object "1.0.12"
|
||||
|
||||
style-to-object@1.0.12:
|
||||
version "1.0.12"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/style-to-object/-/style-to-object-1.0.12.tgz#03a30e7f4e555bf50845f8b55c7d5bc2248e03f0"
|
||||
integrity sha512-ddJqYnoT4t97QvN2C95bCgt+m7AAgXjVnkk/jxAfmp7EAB8nnqqZYEbMd3em7/vEomDb2LAQKAy1RFfv41mdNw==
|
||||
dependencies:
|
||||
inline-style-parser "0.2.6"
|
||||
|
||||
stylis@^4.3.4:
|
||||
version "4.3.6"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/stylis/-/stylis-4.3.6.tgz#7c7b97191cb4f195f03ecab7d52f7902ed378320"
|
||||
@ -2503,6 +3063,16 @@ toggle-selection@^1.0.6:
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
|
||||
integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==
|
||||
|
||||
trim-lines@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338"
|
||||
integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==
|
||||
|
||||
trough@^2.0.0:
|
||||
version "2.2.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f"
|
||||
integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==
|
||||
|
||||
ts-api-utils@^1.0.1:
|
||||
version "1.4.3"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/ts-api-utils/-/ts-api-utils-1.4.3.tgz"
|
||||
@ -2535,6 +3105,57 @@ undici-types@~6.21.0:
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/undici-types/-/undici-types-6.21.0.tgz"
|
||||
integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==
|
||||
|
||||
unified@^11.0.0:
|
||||
version "11.0.5"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1"
|
||||
integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==
|
||||
dependencies:
|
||||
"@types/unist" "^3.0.0"
|
||||
bail "^2.0.0"
|
||||
devlop "^1.0.0"
|
||||
extend "^3.0.0"
|
||||
is-plain-obj "^4.0.0"
|
||||
trough "^2.0.0"
|
||||
vfile "^6.0.0"
|
||||
|
||||
unist-util-is@^6.0.0:
|
||||
version "6.0.1"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/unist-util-is/-/unist-util-is-6.0.1.tgz#d0a3f86f2dd0db7acd7d8c2478080b5c67f9c6a9"
|
||||
integrity sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==
|
||||
dependencies:
|
||||
"@types/unist" "^3.0.0"
|
||||
|
||||
unist-util-position@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4"
|
||||
integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==
|
||||
dependencies:
|
||||
"@types/unist" "^3.0.0"
|
||||
|
||||
unist-util-stringify-position@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2"
|
||||
integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==
|
||||
dependencies:
|
||||
"@types/unist" "^3.0.0"
|
||||
|
||||
unist-util-visit-parents@^6.0.0:
|
||||
version "6.0.2"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz#777df7fb98652ce16b4b7cd999d0a1a40efa3a02"
|
||||
integrity sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==
|
||||
dependencies:
|
||||
"@types/unist" "^3.0.0"
|
||||
unist-util-is "^6.0.0"
|
||||
|
||||
unist-util-visit@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6"
|
||||
integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==
|
||||
dependencies:
|
||||
"@types/unist" "^3.0.0"
|
||||
unist-util-is "^6.0.0"
|
||||
unist-util-visit-parents "^6.0.0"
|
||||
|
||||
update-browserslist-db@^1.1.4:
|
||||
version "1.1.4"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz"
|
||||
@ -2550,6 +3171,22 @@ uri-js@^4.2.2:
|
||||
dependencies:
|
||||
punycode "^2.1.0"
|
||||
|
||||
vfile-message@^4.0.0:
|
||||
version "4.0.3"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/vfile-message/-/vfile-message-4.0.3.tgz#87b44dddd7b70f0641c2e3ed0864ba73e2ea8df4"
|
||||
integrity sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==
|
||||
dependencies:
|
||||
"@types/unist" "^3.0.0"
|
||||
unist-util-stringify-position "^4.0.0"
|
||||
|
||||
vfile@^6.0.0:
|
||||
version "6.0.3"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab"
|
||||
integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==
|
||||
dependencies:
|
||||
"@types/unist" "^3.0.0"
|
||||
vfile-message "^4.0.0"
|
||||
|
||||
vite@^5.0.11:
|
||||
version "5.4.21"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/vite/-/vite-5.4.21.tgz"
|
||||
@ -2587,3 +3224,8 @@ yocto-queue@^0.1.0:
|
||||
version "0.1.0"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/yocto-queue/-/yocto-queue-0.1.0.tgz"
|
||||
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
|
||||
|
||||
zwitch@^2.0.0:
|
||||
version "2.0.4"
|
||||
resolved "https://mirrors.yuchat.top/repository/npmjs/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7"
|
||||
integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user