diff --git a/apps/admin/src/api/dto.ts b/apps/admin/src/api/dto.ts index fb27447..cfce04e 100644 --- a/apps/admin/src/api/dto.ts +++ b/apps/admin/src/api/dto.ts @@ -7,3 +7,14 @@ export interface IGetVodeResponse { MediaInfoSet: any[]; TotalCount: number; } + +export interface ICourseBasic { + course_title: string; + course_cover_url: string; + course_summary: string; +} + +export interface ICreateCourseRequest extends ICourseBasic { + course_chapterList: []; + course_guide: {}; +} diff --git a/apps/admin/src/api/index.ts b/apps/admin/src/api/index.ts index 26c45eb..b8983fc 100644 --- a/apps/admin/src/api/index.ts +++ b/apps/admin/src/api/index.ts @@ -1,9 +1,12 @@ import R from "./request"; import P from "./process"; -import { IgetVodRequest } from "./dto"; +import { ICreateCourseRequest, IgetVodRequest } from "./dto"; /** * 腾讯vod媒资 */ export const getVod = (p: IgetVodRequest) => R.post("/api/vod/media/select", { ...p }).then((d: any) => P.getVod(d.data)); + +export const createCourse = (p: ICreateCourseRequest) => + R.post("/api/course/create", { ...p }); diff --git a/apps/admin/src/api/request.ts b/apps/admin/src/api/request.ts index 94f30af..bb6638b 100644 --- a/apps/admin/src/api/request.ts +++ b/apps/admin/src/api/request.ts @@ -11,7 +11,7 @@ const instance = axios.create(config); instance.interceptors.request.use( (config) => { - console.log(config) + console.log(config); return config; }, (error) => { @@ -24,10 +24,11 @@ instance.interceptors.response.use( (response) => { if (response.data.code === 10000) message.success(`接口: ${response.config.url}, 请求成功`); + if (response.data.code === 20000) + message.error(`接口: ${response.config.url}, 遇到错误`); return response?.data; }, (error) => { - message.error(error); return Promise.reject(error); } ); diff --git a/apps/admin/src/store/media.tsx b/apps/admin/src/store/media.tsx index e5fe691..a4fc738 100644 --- a/apps/admin/src/store/media.tsx +++ b/apps/admin/src/store/media.tsx @@ -4,16 +4,9 @@ import { getVod } from "../api"; export const useMediaStore = create((set) => ({ list: [], listFilter: [], - getListFilter: (state: any) => { - return state.list.length === 0 - ? getVod({ offset: 0, limit: 5000 }).then((res: any) => - set({ list: res.mediaList, listFilter: res.mediaList }) - ) - : state.list; - }, setList: (newState: any) => set(() => ({ list: newState, listFilter: newState })), - filterList: (keyword: string) => + useFilter: (keyword: string) => set((state: any) => ({ listFilter: !keyword ? state.list diff --git a/apps/admin/src/view/Course/Create/BasicForm/index.tsx b/apps/admin/src/view/Course/Create/BasicForm/index.tsx index 492c276..0cbf145 100644 --- a/apps/admin/src/view/Course/Create/BasicForm/index.tsx +++ b/apps/admin/src/view/Course/Create/BasicForm/index.tsx @@ -11,9 +11,9 @@ interface IProps { const BasicForm = (props: IProps) => { const [preview, setPreivew] = useState({ - coverUrl: "", - title: "", - summary: "", + course_cover_url: "", + course_title: "", + course_summary: "", }); const [form] = Form.useForm(); @@ -32,7 +32,7 @@ const BasicForm = (props: IProps) => { if (code === 10000) { message.success(`${info.file.name} 文件上传成功`); const { MediaUrl } = data; - setPreivew((p) => ({ ...p, coverUrl: MediaUrl })); + setPreivew((p) => ({ ...p, course_cover_url: MediaUrl })); } } else if (status === "error") { message.error(`${info.file.name} 文件上传失败`); @@ -52,7 +52,7 @@ const BasicForm = (props: IProps) => {
{ #976bc4, #5678ce )` - : `url(${preview.coverUrl})`, + : `url(${preview.course_cover_url})`, }} >
-

{!preview.title ? "标题" : preview.title}

+

+ {!preview.course_title ? "标题" : preview.course_title} +

- {!preview.summary ? "摘要" : preview.summary}{" "} + {!preview.course_summary ? "摘要" : preview.course_summary}{" "}

@@ -85,11 +87,11 @@ const BasicForm = (props: IProps) => {
- + diff --git a/apps/admin/src/view/Course/Create/Chatpter/index.tsx b/apps/admin/src/view/Course/Create/Chatpter/index.tsx index 33f90c2..17bedc4 100644 --- a/apps/admin/src/view/Course/Create/Chatpter/index.tsx +++ b/apps/admin/src/view/Course/Create/Chatpter/index.tsx @@ -21,9 +21,9 @@ interface IProps { } interface IChapter { - level: string; - title: string; - fileId?: string; + chapter_level: string; + chapter_title: string; + chapter_file_id?: string; } const Chatpter = (props: IProps) => { @@ -32,10 +32,15 @@ const Chatpter = (props: IProps) => { const onTocChange = () => { const { toc } = form.getFieldsValue(); - const process = toc.split("\n").map((row: string) => { - const [level, title, fileId] = row.split("|"); - return !fileId ? { level, title } : { level, title, fileId }; - }); + const process = toc + .split("\n") + .filter((i: string) => i.replace(/\s/, "").length > 0) + .map((row: string, index: number) => { + const [chapter_level, chapter_title, chapter_file_id] = row.split("|"); + return !chapter_file_id + ? { order: index, chapter_level, chapter_title } + : { order: index, chapter_level, chapter_title, chapter_file_id }; + }); setChapterList(process); }; @@ -50,7 +55,7 @@ const Chatpter = (props: IProps) => { @@ -58,17 +63,17 @@ const Chatpter = (props: IProps) => {
    - {chapterList.map((chapter, index) => ( + {chapterList.map((c, index) => (
  • - - {chapter.title} + + {c.chapter_title} - {chapter.fileId && ( - {chapter.fileId} + {c.chapter_file_id && ( + {c.chapter_file_id} )}
  • ))} diff --git a/apps/admin/src/view/Course/Create/Guide/index.tsx b/apps/admin/src/view/Course/Create/Guide/index.tsx index e4f0029..0a3a256 100644 --- a/apps/admin/src/view/Course/Create/Guide/index.tsx +++ b/apps/admin/src/view/Course/Create/Guide/index.tsx @@ -86,11 +86,10 @@ const Guide = (props: IProps) => { vditorRef.current = new Vditor("vditor", { height: 600, toolbar: [...toolbar, "|", submitTool], - hint: { - delay: 200, - emoji, - }, + hint: { delay: 200, emoji }, + counter: { enable: true }, preview: { actions: ["desktop", "mobile"] }, + after: () => console.log("[info] vditor init success..."), upload: { accept: "image/*", url: "/api/vod/oss/image/upload", @@ -107,23 +106,9 @@ const Guide = (props: IProps) => { } }, }, - counter: { - enable: true, - }, - after: () => { - console.log("[info] vditor init success..."); - }, }); }, []); - // useEffect(() => { - // if (props.onChange) - // props.onChange({ - // value: vditorRef.current?.getValue(), - // html: vditorRef.current?.getHTML(), - // }); - // }, [vditorRef.current?.getValue()]); - return (
    diff --git a/apps/admin/src/view/Course/Create/index.less b/apps/admin/src/view/Course/Create/index.less index df07870..f84c7c7 100644 --- a/apps/admin/src/view/Course/Create/index.less +++ b/apps/admin/src/view/Course/Create/index.less @@ -7,8 +7,7 @@ } .drawer-media-item { - border: 1px solid rgba(5, 5, 5, 0.06); - border-radius: 6px; + border-bottom: 1px solid rgba(5, 5, 5, 0.06); padding: 8px; margin-bottom: 8px; } diff --git a/apps/admin/src/view/Course/Create/index.tsx b/apps/admin/src/view/Course/Create/index.tsx index 11d8ca6..a4977b2 100644 --- a/apps/admin/src/view/Course/Create/index.tsx +++ b/apps/admin/src/view/Course/Create/index.tsx @@ -5,14 +5,32 @@ import BasicForm from "./BasicForm"; import Chatpter from "./Chatpter"; import "./index.less"; import { useMediaStore } from "../../../store/media"; +import { createCourse } from "../../../api"; +import { ICourseBasic } from "../../../api/dto"; const { Text } = Typography; +interface ICourse { + basicInfo: ICourseBasic; + course_chapterList: []; + course_guide: { + guide_value: string; + guide_html: string; + }; +} + const CourseCreate = () => { const [current, setCurrent] = useState(0); - const [course, setCourse] = useState({ - basicInfo: {}, - chapters: [], - guide: {}, + const [course, setCourse] = useState({ + basicInfo: { + course_cover_url: "", + course_title: "", + course_summary: "", + }, + course_chapterList: [], + course_guide: { + guide_value: "", + guide_html: "", + }, }); const onBasicFormChange = (form: any) => @@ -30,32 +48,31 @@ const CourseCreate = () => { }, ]; - const [createBtnValid, setCreateBtnValid] = useState(true); - const items = steps.map((item) => ({ key: item.title, title: item.title })); const onChapterChange = (chapters: any) => - setCourse((p) => ({ ...p, chapters })); + setCourse((p) => ({ ...p, course_chapterList: chapters })); const onGuideChange = ({ value, html }: { value: string; html: string }) => { - setCourse((p) => ({ ...p, guide: { value, html } })); + setCourse((p) => ({ + ...p, + course_guide: { guide_value: value, guide_html: html }, + })); }; + /** + * 创建课程 + */ const onClickCreate = () => { - console.log(course); - message.info("撒打算"); + const { basicInfo, ...rest } = course; + createCourse({ ...basicInfo, ...rest }).then((res) => { + console.log(res); + }); }; - useEffect(() => { - const basicValid = !Object.values(course.basicInfo).includes(""); - const chaptersValid = course.chapters.length !== 0; - const guideValid = !Object.values(course.guide).includes(""); - setCreateBtnValid(basicValid && chaptersValid && guideValid); - }, [course]); - const mediaList = useMediaStore((s: any) => s.listFilter); - const mediaListFilter = useMediaStore((s: any) => s.filterList); + const useFilter = useMediaStore((s: any) => s.useFilter); const [open, setOpen] = useState(false); @@ -68,7 +85,7 @@ const CourseCreate = () => { }; const onSearchChange = (e: any) => { - mediaListFilter(e.target.value); + useFilter(e.target.value); }; return ( @@ -113,11 +130,7 @@ const CourseCreate = () => { )} {current === steps.length - 1 && ( - )} diff --git a/apps/server/src/controller/course.controller.ts b/apps/server/src/controller/course.controller.ts new file mode 100644 index 0000000..c3d2d3b --- /dev/null +++ b/apps/server/src/controller/course.controller.ts @@ -0,0 +1,60 @@ +import { Body, Context, Controller, Inject, Post } from '@midwayjs/core'; +import { BizCode } from '../biz/code'; +import { CourseCreateDTO } from '../dto/course.dto'; +import { ChapterService } from '../service/chapter.service'; +import { CourseService } from '../service/course.service'; +import { GuideService } from '../service/guide.service'; + +@Controller('/course') +export class CourseController { + @Inject() + ctx: Context; + + @Inject() + courseService: CourseService; + + @Inject() + chapterService: ChapterService; + + @Inject() + guideService: GuideService; + + @Post('/create') + async create(@Body() param: CourseCreateDTO) { + try { + const { course_chapterList, course_guide, ...rest } = param; + const courseId = await this.courseService.create({ ...rest }); + await this.chapterService.create( + course_chapterList.map((i: any) => ({ + ...i, + chapter_course_id: courseId, + })) + ); + await this.guideService.create({ + ...course_guide, + guide_course_id: courseId, + }); + return { code: BizCode.OK }; + } catch (error) { + this.ctx.logger.error(error); + return { + code: BizCode.ERROR, + msg: `[error] course/create error happened`, + }; + } + } + + @Post('/select/all') + async selectAll() { + const courseList = await this.courseService.selectAll(); + return { code: BizCode.OK, data: courseList }; + } + + @Post('/chapter/select') + async selectChapterByCourseId(@Body() params) { + const { course_id } = params; + const chapterList = await this.chapterService.select(course_id); + const guide = await this.guideService.select(course_id); + return { code: BizCode.OK, data: { chapterList, guide } }; + } +} diff --git a/apps/server/src/controller/vod.controller.ts b/apps/server/src/controller/vod.controller.ts index 768855c..8085f21 100644 --- a/apps/server/src/controller/vod.controller.ts +++ b/apps/server/src/controller/vod.controller.ts @@ -1,15 +1,18 @@ -import { Inject, Post, Body, Files, Controller } from '@midwayjs/core'; -import { Context } from 'koa'; +import { Inject, Post, Body, Files, Controller, Context } from '@midwayjs/core'; import { BizCode } from '../biz/code'; -import * as tencentcloud from 'tencentcloud-sdk-nodejs'; import { VodSearchDTO } from '../dto/vod.dto'; import { uploadImagePromise } from '../util/vod'; import { IVodResponse } from '../interface'; +import { VodService } from '../service/vod.service'; @Controller('/vod') export class VodController { @Inject() ctx: Context; + + @Inject() + vodService: VodService; + /** * 腾讯媒资管理查询 * API调用demo: https://console.cloud.tencent.com/api/explorer?Product=vod&Version=2018-07-17&Action=SearchMedia @@ -17,33 +20,19 @@ export class VodController { */ @Post('/media/select') async getCourseMediaList(@Body() param: VodSearchDTO) { - const { offset: Offset = 0, limit: Limit = 5000 } = param; - const VodClient = tencentcloud.vod.v20180717.Client; - const clientConfig = { - credential: { - secretId: process.env.SECRET_ID, - secretKey: process.env.SECRET_KEY, - }, - profile: { - httpProfile: { - endpoint: 'vod.tencentcloudapi.com', - }, - }, - }; - const client = new VodClient(clientConfig); - const params = { - SubAppId: +process.env.SUBAPPID, - Categories: ['Video'], - Offset, - Limit, - }; - return await client.SearchMedia(params).then( - data => ({ code: BizCode.OK, data }), - err => { - this.ctx.logger.error(err); - throw new Error(err); + const { offset: Offset = 0, limit: Limit = 5000, fileId } = param; + try { + // 单个媒体查询 + if (fileId) { + const { data } = await this.vodService.selectMediaByFileId(fileId); + if (data) return { code: BizCode.OK, data }; } - ); + const { data } = await this.vodService.selectMediaList({ Offset, Limit }); + if (data) return { code: BizCode.OK, data }; + } catch (err) { + this.ctx.logger.error(err); + return { code: BizCode.ERROR, msg: '[error] vod create error' }; + } } /** diff --git a/apps/server/src/dto/course.dto.ts b/apps/server/src/dto/course.dto.ts new file mode 100644 index 0000000..314d968 --- /dev/null +++ b/apps/server/src/dto/course.dto.ts @@ -0,0 +1,18 @@ +import { Rule, RuleType } from '@midwayjs/validate'; + +export class CourseCreateDTO { + @Rule(RuleType.string().required()) + course_title: string; + + @Rule(RuleType.string().required()) + course_cover_url: string; + + @Rule(RuleType.string().required()) + course_summary: string; + + @Rule(RuleType.required()) + course_chapterList: []; + + @Rule(RuleType.required()) + course_guide: { guide_value: string; guide_html: string }; +} diff --git a/apps/server/src/dto/vod.dto.ts b/apps/server/src/dto/vod.dto.ts index 7f61032..4fd04a2 100644 --- a/apps/server/src/dto/vod.dto.ts +++ b/apps/server/src/dto/vod.dto.ts @@ -7,4 +7,7 @@ export class VodSearchDTO { @Rule(RuleType.number().required()) limit: number; + + @Rule(RuleType.string()) + fileId?: string; } diff --git a/apps/server/src/entity/chapter.entity.ts b/apps/server/src/entity/chapter.entity.ts new file mode 100644 index 0000000..2a3c797 --- /dev/null +++ b/apps/server/src/entity/chapter.entity.ts @@ -0,0 +1,31 @@ +import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity('chapter') +export class Chapter { + @PrimaryGeneratedColumn('uuid') + chapter_id?: string; + + @Column({ type: 'text' }) + chapter_title: string; + + @Column() + chapter_level: '1' | '2'; + + @Column({ default: '' }) + chapter_file_id?: string; + + @Column() + chapter_course_id: string; + + @Column() + order?: number; + + @Column({ default: '' }) + media_time?: string; + + @Column({ default: '' }) + media_url?: string; + + @Column({ default: ''}) + media_cover_url?: string; +} diff --git a/apps/server/src/entity/course.entity.ts b/apps/server/src/entity/course.entity.ts new file mode 100644 index 0000000..a1ca1d8 --- /dev/null +++ b/apps/server/src/entity/course.entity.ts @@ -0,0 +1,22 @@ +import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity('course') +export class Course { + @PrimaryGeneratedColumn('uuid') + course_id?: string; + + @Column({ unique: true }) + course_title?: string; + + @Column({ type: 'text' }) + course_summary?: string; + + @Column({ length: 1000 }) + course_cover_url?: string; + + @Column({ default: 1 }) + valid?: boolean; + + @Column({ default: Date.now() }) + course_createtime?: string; +} diff --git a/apps/server/src/entity/guide.entity.ts b/apps/server/src/entity/guide.entity.ts new file mode 100644 index 0000000..f54ed27 --- /dev/null +++ b/apps/server/src/entity/guide.entity.ts @@ -0,0 +1,16 @@ +import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity('guide') +export class Guide { + @PrimaryGeneratedColumn('uuid') + guide_id?: string; + + @Column({ type: 'text' }) + guide_value: string; + + @Column({ type: 'text' }) + guide_html: string; + + @Column() + guide_course_id: string; +} diff --git a/apps/server/src/service/chapter.service.ts b/apps/server/src/service/chapter.service.ts new file mode 100644 index 0000000..6ba0b8c --- /dev/null +++ b/apps/server/src/service/chapter.service.ts @@ -0,0 +1,39 @@ +import { Context, Inject, Provide } from '@midwayjs/core'; +import { InjectEntityModel } from '@midwayjs/typeorm'; +import { Repository } from 'typeorm'; +import { Chapter } from '../entity/chapter.entity'; +import { VodService } from './vod.service'; + +@Provide() +export class ChapterService { + @Inject() + ctx: Context; + + @Inject() + vodService: VodService; + + @InjectEntityModel(Chapter) + chapterModel: Repository; + + async create(chapterList: Chapter[]) { + for (const chapter of chapterList) { + const { chapter_file_id: fileID } = chapter; + if (fileID) { + const { data } = await this.vodService.selectMediaByFileId(fileID); + chapter.media_cover_url = data.MediaInfoSet[0].BasicInfo.CoverUrl; + chapter.media_time = '' + data.MediaInfoSet[0].MetaData.Duration; + chapter.media_url = + data.MediaInfoSet[0].AdaptiveDynamicStreamingInfo.AdaptiveDynamicStreamingSet[0].Url; + } + await this.chapterModel.save(chapter); + } + } + + async select(course_id: string) { + const result = await this.chapterModel.find({ + where: { chapter_course_id: course_id }, + order: { order: 'asc' }, + }); + return result; + } +} diff --git a/apps/server/src/service/course.service.ts b/apps/server/src/service/course.service.ts new file mode 100644 index 0000000..929334e --- /dev/null +++ b/apps/server/src/service/course.service.ts @@ -0,0 +1,28 @@ +import { Context, Inject, Provide } from '@midwayjs/core'; +import { InjectEntityModel } from '@midwayjs/typeorm'; +import { Repository } from 'typeorm'; +import { Course } from '../entity/course.entity'; + +export interface ICourseCreate { + course_title: string; + course_summary: string; + course_cover_url: string; +} + +@Provide() +export class CourseService { + @Inject() + ctx: Context; + + @InjectEntityModel(Course) + courseModel: Repository; + + async create(course: Course) { + const courseCreateRes = await this.courseModel.save(course); + return courseCreateRes.course_id; + } + + async selectAll() { + return await this.courseModel.find({ where: { valid: true } }); + } +} diff --git a/apps/server/src/service/guide.service.ts b/apps/server/src/service/guide.service.ts new file mode 100644 index 0000000..0c6f6c3 --- /dev/null +++ b/apps/server/src/service/guide.service.ts @@ -0,0 +1,24 @@ +import { Context, Inject, Provide } from '@midwayjs/core'; +import { InjectEntityModel } from '@midwayjs/typeorm'; +import { Repository } from 'typeorm'; +import { Guide } from '../entity/guide.entity'; + +@Provide() +export class GuideService { + @Inject() + ctx: Context; + + @InjectEntityModel(Guide) + guideModel: Repository; + + async create(guide: Guide) { + const guideCreateRes = await this.guideModel.save(guide); + return guideCreateRes.guide_id; + } + + async select(course_id: string) { + return await this.guideModel.findOne({ + where: { guide_course_id: course_id }, + }); + } +} diff --git a/apps/server/src/service/vod.service.ts b/apps/server/src/service/vod.service.ts new file mode 100644 index 0000000..c11462d --- /dev/null +++ b/apps/server/src/service/vod.service.ts @@ -0,0 +1,54 @@ +import { Provide } from '@midwayjs/core'; +import * as tencentcloud from 'tencentcloud-sdk-nodejs'; + +const VodClient = tencentcloud.vod.v20180717.Client; +const clientConfig = { + credential: { + secretId: process.env.SECRET_ID, + secretKey: process.env.SECRET_KEY, + }, + profile: { + httpProfile: { + endpoint: 'vod.tencentcloudapi.com', + }, + }, +}; + +@Provide() +export class VodService { + /** + * 根据FileId查询单个媒体资源 + */ + async selectMediaByFileId(fileId: string) { + const client = new VodClient(clientConfig); + const params = { + SubAppId: +process.env.SUBAPPID, + FileIds: [fileId], + }; + return await client.SearchMedia(params).then( + data => ({ data }), + err => { + throw new Error(err); + } + ); + } + + /** + * 查询全部媒体列表 + */ + async selectMediaList({ Offset = 0, Limit = 5000 }) { + const client = new VodClient(clientConfig); + const params = { + SubAppId: +process.env.SUBAPPID, + Categories: ['Video'], + Offset, + Limit, + }; + return await client.SearchMedia(params).then( + data => ({ data }), + err => { + throw new Error(err); + } + ); + } +} diff --git a/apps/web/package.json b/apps/web/package.json index 4b294a5..c6912fa 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -16,7 +16,8 @@ "@arco-design/web-react": "2.45.0", "@ricons/fluent": "0.12.0", "@ricons/utils": "0.1.6", - "dplayer": "1.27.1" + "dplayer": "1.27.1", + "highlight.js": "11.7.0" }, "devDependencies": { "@types/react": "^18.0.27", diff --git a/apps/web/src/api/index.ts b/apps/web/src/api/index.ts new file mode 100644 index 0000000..f3602a2 --- /dev/null +++ b/apps/web/src/api/index.ts @@ -0,0 +1,6 @@ +import R from "./request"; + +export const getCourseList = () => R.post("/api/course/select/all"); + +export const getChapterGuideById = (course_id: string) => + R.post("/api/course/chapter/select", { course_id }); diff --git a/apps/web/src/api/request.ts b/apps/web/src/api/request.ts new file mode 100644 index 0000000..de4191f --- /dev/null +++ b/apps/web/src/api/request.ts @@ -0,0 +1,32 @@ +// import { message } from "antd"; +import axios from "axios"; + +const config = { + baseURL: "", + timeout: 1000 * 15, + headers: {}, +}; + +const instance = axios.create(config); + +instance.interceptors.request.use( + (config) => { + console.log(config); + return config; + }, + (error) => { + return Promise.reject(error); + } +); + +// Add a response interceptor +instance.interceptors.response.use( + (response) => { + return response?.data; + }, + (error) => { + return Promise.reject(error); + } +); + +export default instance; diff --git a/apps/web/src/view/Course/index.tsx b/apps/web/src/view/Course/index.tsx index 3c30300..503cea8 100644 --- a/apps/web/src/view/Course/index.tsx +++ b/apps/web/src/view/Course/index.tsx @@ -1,22 +1,17 @@ import "./index.less"; -import { - Select, - Message, - Space, - Tooltip, - Dropdown, - Button, - Menu, -} from "@arco-design/web-react"; +import { Space, Tooltip, Dropdown, Button, Menu } from "@arco-design/web-react"; import BsCard from "../../components/Card"; import Timeline, { IOnScrollParam } from "./components/Timeline"; import Tab20Regular from "@ricons/fluent/Tab20Regular"; import Table20Regular from "@ricons/fluent/Table20Regular"; import Filter20Regular from "@ricons/fluent/Filter20Regular"; import { useEffect, useRef, useState } from "react"; -import { courseTimeListDefault } from "./mock"; +// import { courseTimeListDefault } from "./mock"; import { Icon } from "@ricons/utils"; import { useNavigate } from "react-router-dom"; +import { useMount } from "../../hook"; +import { getCourseList } from "../../api"; +import { processTime } from "./util"; export default function Index() { const navigate = useNavigate(); @@ -50,7 +45,13 @@ export default function Index() { }, ]); - const [courseTimeList, setCourseTimeList] = useState(courseTimeListDefault); + useMount(() => { + getCourseList().then((res) => { + setCourseTimeList(processTime(res.data)); + }); + }); + + const [courseTimeList, setCourseTimeList] = useState([]); const onClickActionItem = (action: any) => { setActions((p) => p.map((a) => ({ ...a, active: a.key === action.key }))); @@ -79,7 +80,7 @@ export default function Index() { }; const onClickCourseItem = (d: any) => { - navigate(`/course/detail/${d.id}`); + navigate(`/course/detail/${d.course_id}`); }; return ( @@ -121,7 +122,7 @@ export default function Index() {
    - {courseTimeList.map((item, index) => ( + {courseTimeList.map((item: any, index: number) => (
    {item.year}年{item.month}月 @@ -133,9 +134,9 @@ export default function Index() { {item.data.map((d: any) => ( onClickCourseItem(d)} - key={d.id} - imgUrl={d.img} - title={d.title} + key={d.course_id} + imgUrl={d.course_cover_url} + title={d.course_title} /> ))}
    diff --git a/apps/web/src/view/Course/mock.ts b/apps/web/src/view/Course/mock.ts deleted file mode 100644 index 02dfc4d..0000000 --- a/apps/web/src/view/Course/mock.ts +++ /dev/null @@ -1,124 +0,0 @@ -import dayjs from "dayjs"; - -export const courseTimeList = [ - { - id: 1, - title: "这个非常OK啊1", - time: "1661990400000", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, - { - id: 2, - title: "这个非常OK啊2", - time: "1630454400000", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, - { - id: 3, - title: "这个非常OK啊333", - time: "1625097600000", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, - { - id: 4, - title: "这个非常OK啊444", - time: "1625284000000", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, - { - id: 5, - title: "这个非常OK啊3", - time: "1598938400000", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, - { - id: 6, - title: "这个非常OK啊3", - time: "1528948400000", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, - { - id: 7, - title: "这个非常OK啊3", - time: "1538958400000", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, - { - id: 8, - title: "这个非常OK啊3", - time: "1538958400100", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, - { - id: 9, - title: "这个非常OK啊3", - time: "1538958400200", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, - { - id: 10, - title: "这个非常OK啊3", - time: "1538958400400", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, - { - id: 11, - title: "这个非常OK啊3", - time: "1538958400500", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, - { - id: 12, - title: "这个非常OK啊3", - time: "1538958400600", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, - { - id: 13, - title: "这个非常OK啊3", - time: "1591918400000", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, - { - id: 15, - title: "这个非常OK啊3", - time: "1592918400000", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, - { - id: 16, - title: "这个非常OK啊3", - time: "1543918400000", - img: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a8c8cdb109cb051163646151a4a5083b.png~tplv-uwbnlip3yd-webp.webp", - }, -]; - -const process = (before: any[]) => { - const after: any = {}; - // 提取月份,塞入数据 - before.forEach((item) => { - const year = dayjs(+item.time).year(); - const month = dayjs(+item.time).month() + 1; - if (!(year in after)) after[year] = { [month]: [] }; - if (!(month in after[year])) after[year][month] = []; - after[year][month].push(item); - }); - // 年月为key,倒叙排列 - const compare = (key: string) => (a: any, b: any) => b[key] - a[key]; - const ymArray = Object.keys(after) - .reverse() - .map((year) => { - return Object.keys(after[year]).map((month) => ({ - year, - month, - index: +`${year}.${+month >= 10 ? month : "0" + month}`, - data: after[year][month], - })); - }) - .flat() - .sort(compare("index")); - - return ymArray; -}; - -export const courseTimeListDefault = process(courseTimeList); diff --git a/apps/web/src/view/Course/util.ts b/apps/web/src/view/Course/util.ts new file mode 100644 index 0000000..1eae6e3 --- /dev/null +++ b/apps/web/src/view/Course/util.ts @@ -0,0 +1,29 @@ +import dayjs from "dayjs"; + +export const processTime = (before: any[]) => { + const after: any = {}; + // 提取月份,塞入数据 + before.forEach((item) => { + const year = dayjs(+item.course_createtime).year(); + const month = dayjs(+item.course_createtime).month() + 1; + if (!(year in after)) after[year] = { [month]: [] }; + if (!(month in after[year])) after[year][month] = []; + after[year][month].push(item); + }); + // 年月为key,倒叙排列 + const compare = (key: string) => (a: any, b: any) => b[key] - a[key]; + const ymArray = Object.keys(after) + .reverse() + .map((year) => { + return Object.keys(after[year]).map((month) => ({ + year, + month, + index: +`${year}.${+month >= 10 ? month : "0" + month}`, + data: after[year][month], + })); + }) + .flat() + .sort(compare("index")); + + return ymArray; +}; diff --git a/apps/web/src/view/CourseDetail/components/Guide/index.tsx b/apps/web/src/view/CourseDetail/components/Guide/index.tsx index b47f245..14205cd 100644 --- a/apps/web/src/view/CourseDetail/components/Guide/index.tsx +++ b/apps/web/src/view/CourseDetail/components/Guide/index.tsx @@ -1,9 +1,38 @@ -import { useLocation } from "react-router-dom"; +import { useEffect, useRef, useState } from "react"; +import { useMount, useScript } from "../../../../hook"; +import hljs from "highlight.js"; +import "highlight.js/styles/atom-one-dark.css"; -function Material() { - const location = useLocation(); - - return
    {location.pathname}
    ; +interface IProps { + html: string; } -export default Material; +function Guide(props: IProps) { + const [html, setHtml] = useState(""); + + const highlightRender = () => + document.querySelectorAll("code").forEach((block) => { + hljs.highlightBlock(block); + }); + + useEffect(() => { + if (props.html) { + setHtml(props.html); + } + }, [props.html]); + + useEffect(() => { + highlightRender(); + }, [html]); + + return ( +
    +
    +
    + ); +} + +export default Guide; diff --git a/apps/web/src/view/CourseDetail/components/Player/index.less b/apps/web/src/view/CourseDetail/components/Player/index.less deleted file mode 100644 index c4d1731..0000000 --- a/apps/web/src/view/CourseDetail/components/Player/index.less +++ /dev/null @@ -1,54 +0,0 @@ -.vjs-button-icon-custom { - cursor: pointer; - > svg { - transition: color 0.25s; - color: rgba(37, 41, 47, 0.2); - &:hover { - color: rgba(37, 41, 47, 1); - } - } -} - -.tcp-skin .vjs-control-bar { - // transform: translateY(39px) !important; - // background: rgb(0, 0, 0, 0.777) !important; - background: rgba(37, 41, 47, 0.3) !important; -} - -// 进度条颜色 -.tcp-skin .vjs-play-progress { -} - -.video-js .vjs-progress-control .vjs-progress-holder { - margin: 0 !important; -} - -.tcp-skin .vjs-progress-control { - .vjs-load-progress > div { - left: 0 !important; - } - - .video-js .vjs-progress-control .vjs-progress-holder { - margin: 0 !important; - .video-js .vjs-slider { - margin: 0 !important; - } - } -} - -// 圆角 -// .vjs-poster, -// .video-js { -// border-radius: 10px !important; -// video { -// border-radius: 10px !important; -// } -// } - -// .video-js { -// // box-shadow: 0 0 100px #c8c8c8 !important; -// } - -// .vjs-control-bar { -// border-radius: 0 0 10px 10px !important; -// } diff --git a/apps/web/src/view/CourseDetail/components/Player/index.tsx b/apps/web/src/view/CourseDetail/components/Player/index.tsx deleted file mode 100644 index 9ec72ca..0000000 --- a/apps/web/src/view/CourseDetail/components/Player/index.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { useEffect, useRef, useState } from "react"; -import { useScript } from "../../../../hook"; -import "./index.less"; - -export interface IVideo { - fileID: string; - appID: string; - psign?: string; - className?: string; -} - -interface IProps { - video: IVideo | null; -} - -/** - * demo页面:https://tcplayer.vcube.tencent.com/ - * - * 1. fill填满变形,cover等比例会裁剪, contain等比例有黑边 - * 2. TCPlayer('container', video)如果video为空,初始化会失败 - */ -function Player(props: IProps) { - const playerRef = useRef(); - const [libReady, setLibReady] = useState(false); - - useScript( - ["/player/libs/hls.min.0.13.2m.js", "/player/tcplayer.v4.7.2.min.js"], - () => { - console.log("[tcplayer] libs ready..."); - setLibReady(true); - } - ); - - useEffect(() => { - if (libReady) { - const TCPlayer = (window as any).TCPlayer; - playerRef.current = TCPlayer("player", { - // fileID: "243791579995468466", - // appID: "1500018521", - ...props.video, - plugins: { - ContinuePlay: { - auto: true, - }, - }, - }); - console.log("[tcplayer] init success..."); - } - }, [libReady]); - - useEffect(() => { - if (props.video) { - console.log("[tcplayer] video change", props.video); - playerRef.current.loadVideoByID(props.video); - } - }, [props.video]); - - return ( - - ); -} - -export default Player; diff --git a/apps/web/src/view/CourseDetail/index.less b/apps/web/src/view/CourseDetail/index.less index 6c0e555..67204d5 100644 --- a/apps/web/src/view/CourseDetail/index.less +++ b/apps/web/src/view/CourseDetail/index.less @@ -1,7 +1,7 @@ .course-detail { padding-top: 60px; - aside { + .table-of-content { padding: 20px; > h2 { margin-bottom: 10px; @@ -10,12 +10,12 @@ .toc { .level-1 { color: var(--color-text-4); - padding: 30px 0 5px 0; + padding: 20px 0 5px 0; } .level-2 { display: grid; padding-left: 10px; - line-height: 30px; + line-height: 24px; grid-template-columns: 9fr 1fr; color: var(--color-text-2); cursor: pointer; @@ -27,41 +27,9 @@ } .time { color: var(--color-text-4); + font-size: 13px; text-align: right; - } - } - } - } - - article { - position: relative; - height: 100%; - .mask { - position: absolute; - left: 0; - right: 0; - bottom: 0; - top: 0; - z-index: 30; - background: rgba(255, 255, 255, 1); - display: flex; - justify-content: center; - align-items: center; - } - > main { - height: 100%; - .player-container { - height: 100%; - position: relative; - overflow: hidden; - &.float { - position: fixed !important; - left: 0; - top: 60px; - bottom: 0; - height: auto !important; - right: calc((100% - 1120px) / 2); - z-index: 20; + width: 100px; } } } diff --git a/apps/web/src/view/CourseDetail/index.tsx b/apps/web/src/view/CourseDetail/index.tsx index 59e4284..cc651be 100644 --- a/apps/web/src/view/CourseDetail/index.tsx +++ b/apps/web/src/view/CourseDetail/index.tsx @@ -1,105 +1,68 @@ import { useEffect, useState } from "react"; import "./index.less"; import { ResizeBox, Space, Result, Button } from "@arco-design/web-react"; -import { Icon } from "@ricons/utils"; import Guide from "./components/Guide"; import { useMount } from "../../hook"; import Player from "./components/DPlayer"; +import { useParams } from "react-router-dom"; +import { getChapterGuideById } from "../../api"; +import { ms2Time } from "./util"; function CourseDetail() { - const [toc, setToc] = useState([ - { - title: "起步", - level: 1, - }, - { - title: "导读", - level: 2, - active: true, - view: , - }, - { - title: "第一讲:特殊K线的量化描述", - level: 2, - time: "00:14:05", - active: false, - view: ( - - ), - }, - { - title: "学习 html, css, javascript 前的准备", - level: 2, - time: "3:23", - active: false, - view: ( - - ), - }, - { - title: "Vite + React + TS - Google Chrome 2023-02-15 09-55-08", - level: 2, - time: "4:13", - active: false, - view: ( - - ), - }, - { - title: "使用CSS", - level: 1, - }, - { - title: "使用 css:行内样式", - level: 2, - time: "5:55", - active: false, - }, - { - title: "使用 css:行内样式2", - level: 2, - time: "6:55", - active: false, - }, - ]); - + const { id: course_id = "" } = useParams(); + const [toc, setToc] = useState([]); const [view, setView] = useState(null); - const notFound = ( - 订阅} - > - ); useMount(() => { - const first = toc.find((t) => t.level === 2) as any; - setToc((p: any) => - p.map((i: any) => ({ ...i, active: i.title === first.title })) - ); - setView(first?.view); + if (!!course_id) + getChapterGuideById(course_id).then((res) => { + const { data } = res; + const processToc = data?.chapterList.map((item: any) => { + return { + title: item.chapter_title, + level: +item.chapter_level, + time: ms2Time(+item.media_time), + active: false, + view: ( + + ), + }; + }); + const append = [ + { + title: "导读", + level: 1, + time: "", + }, + { + title: "介绍 / 下载", + level: 2, + time: "", + active: true, + view: , + }, + ...processToc, + ]; + setToc(append as any); + setView(); + }); }); const onclickItem = (i: any) => { setToc((t: any) => t.map((p: any) => ({ ...p, active: i.title === p.title })) ); - setView(i.view ?? notFound); + setView( + i.view ?? ( + 订阅} + /> + ) + ); }; return ( @@ -111,7 +74,7 @@ function CourseDetail() { min={0.1} size={0.2} panes={[ -
    diff --git a/apps/web/src/view/CourseDetail/util.ts b/apps/web/src/view/CourseDetail/util.ts new file mode 100644 index 0000000..e291442 --- /dev/null +++ b/apps/web/src/view/CourseDetail/util.ts @@ -0,0 +1,6 @@ +export const ms2Time = (time: number) => { + const mind = time % (60 * 60); + const minutes = Math.floor(mind / 60); + const seconds = Math.ceil(mind % 60); + return minutes + "分" + seconds + "秒"; +}; diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 88ec496..0e39688 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -5,4 +5,13 @@ import tsconfigPaths from "vite-tsconfig-paths"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [react(), tsconfigPaths()], + server: { + proxy: { + "/api": { + rewrite: (path) => path.replace(/^\/api/, ""), + target: "http://127.0.0.1:7001/api/v1", + changeOrigin: true, + }, + }, + }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c786e20..e71e7d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -202,6 +202,7 @@ importers: '@types/react-router-dom': 5.3.3 '@vitejs/plugin-react': ^3.1.0 dplayer: 1.27.1 + highlight.js: 11.7.0 less: ^4.1.3 react: ^18.2.0 react-dom: ^18.2.0 @@ -214,6 +215,7 @@ importers: '@ricons/fluent': 0.12.0 '@ricons/utils': 0.1.6_biqbaboplfbrettd7655fr4n2y dplayer: 1.27.1 + highlight.js: 11.7.0 less: 4.1.3 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -282,6 +284,38 @@ packages: - '@types/react' dev: false + /@aws-sdk/credential-providers/3.272.0: + resolution: {integrity: sha512-ucd6Xq6aBMf+nM4uz5zkjL11mwaE5BV1Q4hkulaGu2v1dRA8n6zhLJk/sb4hOJ7leelqMJMErlbQ2T3MkYvlJQ==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + '@aws-sdk/client-cognito-identity': registry.npmmirror.com/@aws-sdk/client-cognito-identity/3.272.0 + '@aws-sdk/client-sso': registry.npmmirror.com/@aws-sdk/client-sso/3.272.0 + '@aws-sdk/client-sts': registry.npmmirror.com/@aws-sdk/client-sts/3.272.0 + '@aws-sdk/credential-provider-cognito-identity': registry.npmmirror.com/@aws-sdk/credential-provider-cognito-identity/3.272.0 + '@aws-sdk/credential-provider-env': registry.npmmirror.com/@aws-sdk/credential-provider-env/3.272.0 + '@aws-sdk/credential-provider-imds': registry.npmmirror.com/@aws-sdk/credential-provider-imds/3.272.0 + '@aws-sdk/credential-provider-ini': registry.npmmirror.com/@aws-sdk/credential-provider-ini/3.272.0 + '@aws-sdk/credential-provider-node': registry.npmmirror.com/@aws-sdk/credential-provider-node/3.272.0 + '@aws-sdk/credential-provider-process': registry.npmmirror.com/@aws-sdk/credential-provider-process/3.272.0 + '@aws-sdk/credential-provider-sso': registry.npmmirror.com/@aws-sdk/credential-provider-sso/3.272.0 + '@aws-sdk/credential-provider-web-identity': registry.npmmirror.com/@aws-sdk/credential-provider-web-identity/3.272.0 + '@aws-sdk/property-provider': registry.npmmirror.com/@aws-sdk/property-provider/3.272.0 + '@aws-sdk/shared-ini-file-loader': registry.npmmirror.com/@aws-sdk/shared-ini-file-loader/3.272.0 + '@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types/3.272.0 + tslib: 2.5.0 + transitivePeerDependencies: + - aws-crt + optional: true + + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': registry.npmmirror.com/@babel/highlight/7.18.6 + dev: true + optional: true + /@babel/compat-data/7.20.14: resolution: {integrity: sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==} engines: {node: '>=6.9.0'} @@ -1445,6 +1479,204 @@ packages: resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} dev: false + /@esbuild/android-arm/0.16.17: + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.16.17: + resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.16.17: + resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.16.17: + resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.16.17: + resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.16.17: + resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.16.17: + resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.16.17: + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.16.17: + resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.16.17: + resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.16.17: + resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.16.17: + resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.16.17: + resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.16.17: + resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.16.17: + resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.16.17: + resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.16.17: + resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.16.17: + resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.16.17: + resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.16.17: + resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.16.17: + resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.16.17: + resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@jridgewell/gen-mapping/0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} @@ -1775,34 +2007,42 @@ packages: - debug dev: false + /errno/0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + requiresBuild: true + dependencies: + prr: 1.0.1 + optional: true + /esbuild/0.16.17: resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': registry.npmmirror.com/@esbuild/android-arm/0.16.17 - '@esbuild/android-arm64': registry.npmmirror.com/@esbuild/android-arm64/0.16.17 - '@esbuild/android-x64': registry.npmmirror.com/@esbuild/android-x64/0.16.17 - '@esbuild/darwin-arm64': registry.npmmirror.com/@esbuild/darwin-arm64/0.16.17 - '@esbuild/darwin-x64': registry.npmmirror.com/@esbuild/darwin-x64/0.16.17 - '@esbuild/freebsd-arm64': registry.npmmirror.com/@esbuild/freebsd-arm64/0.16.17 - '@esbuild/freebsd-x64': registry.npmmirror.com/@esbuild/freebsd-x64/0.16.17 - '@esbuild/linux-arm': registry.npmmirror.com/@esbuild/linux-arm/0.16.17 - '@esbuild/linux-arm64': registry.npmmirror.com/@esbuild/linux-arm64/0.16.17 - '@esbuild/linux-ia32': registry.npmmirror.com/@esbuild/linux-ia32/0.16.17 - '@esbuild/linux-loong64': registry.npmmirror.com/@esbuild/linux-loong64/0.16.17 - '@esbuild/linux-mips64el': registry.npmmirror.com/@esbuild/linux-mips64el/0.16.17 - '@esbuild/linux-ppc64': registry.npmmirror.com/@esbuild/linux-ppc64/0.16.17 - '@esbuild/linux-riscv64': registry.npmmirror.com/@esbuild/linux-riscv64/0.16.17 - '@esbuild/linux-s390x': registry.npmmirror.com/@esbuild/linux-s390x/0.16.17 - '@esbuild/linux-x64': registry.npmmirror.com/@esbuild/linux-x64/0.16.17 - '@esbuild/netbsd-x64': registry.npmmirror.com/@esbuild/netbsd-x64/0.16.17 - '@esbuild/openbsd-x64': registry.npmmirror.com/@esbuild/openbsd-x64/0.16.17 - '@esbuild/sunos-x64': registry.npmmirror.com/@esbuild/sunos-x64/0.16.17 - '@esbuild/win32-arm64': registry.npmmirror.com/@esbuild/win32-arm64/0.16.17 - '@esbuild/win32-ia32': registry.npmmirror.com/@esbuild/win32-ia32/0.16.17 - '@esbuild/win32-x64': registry.npmmirror.com/@esbuild/win32-x64/0.16.17 + '@esbuild/android-arm': 0.16.17 + '@esbuild/android-arm64': 0.16.17 + '@esbuild/android-x64': 0.16.17 + '@esbuild/darwin-arm64': 0.16.17 + '@esbuild/darwin-x64': 0.16.17 + '@esbuild/freebsd-arm64': 0.16.17 + '@esbuild/freebsd-x64': 0.16.17 + '@esbuild/linux-arm': 0.16.17 + '@esbuild/linux-arm64': 0.16.17 + '@esbuild/linux-ia32': 0.16.17 + '@esbuild/linux-loong64': 0.16.17 + '@esbuild/linux-mips64el': 0.16.17 + '@esbuild/linux-ppc64': 0.16.17 + '@esbuild/linux-riscv64': 0.16.17 + '@esbuild/linux-s390x': 0.16.17 + '@esbuild/linux-x64': 0.16.17 + '@esbuild/netbsd-x64': 0.16.17 + '@esbuild/openbsd-x64': 0.16.17 + '@esbuild/sunos-x64': 0.16.17 + '@esbuild/win32-arm64': 0.16.17 + '@esbuild/win32-ia32': 0.16.17 + '@esbuild/win32-x64': 0.16.17 dev: true /esutils/2.0.3: @@ -1844,6 +2084,14 @@ packages: mime-types: 2.1.35 dev: true + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} @@ -1873,12 +2121,25 @@ packages: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + optional: true + /has/1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 + /highlight.js/10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: false + + /highlight.js/11.7.0: + resolution: {integrity: sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==} + engines: {node: '>=12.0.0'} + dev: false + /https-proxy-agent/5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -1889,6 +2150,13 @@ packages: - supports-color dev: false + /image-size/0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + requiresBuild: true + optional: true + /is-arrayish/0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} dev: false @@ -1963,13 +2231,13 @@ packages: parse-node-version: 1.0.1 tslib: 2.5.0 optionalDependencies: - errno: registry.npmmirror.com/errno/0.1.8 - graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 - image-size: registry.npmmirror.com/image-size/0.5.5 - make-dir: registry.npmmirror.com/make-dir/2.1.0 - mime: registry.npmmirror.com/mime/1.6.0 - needle: registry.npmmirror.com/needle/3.2.0 - source-map: registry.npmmirror.com/source-map/0.6.1 + errno: 0.1.8 + graceful-fs: 4.2.10 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.2.0 + source-map: 0.6.1 transitivePeerDependencies: - supports-color @@ -1995,6 +2263,15 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /make-dir/2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + pify: 4.0.1 + semver: 5.7.1 + optional: true + /mime-db/1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -2006,12 +2283,32 @@ packages: mime-db: 1.52.0 dev: true + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + requiresBuild: true + optional: true + /nanoid/3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true + /needle/3.2.0: + resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + requiresBuild: true + dependencies: + debug: registry.npmmirror.com/debug/3.2.7 + iconv-lite: registry.npmmirror.com/iconv-lite/0.6.3 + sax: 1.2.4 + transitivePeerDependencies: + - supports-color + optional: true + /node-fetch/2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} engines: {node: 4.x || >=6.0.0} @@ -2237,9 +2534,17 @@ packages: engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: - fsevents: registry.npmmirror.com/fsevents/2.3.2 + fsevents: 2.3.2 dev: true + /saslprep/1.0.3: + resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + sparse-bitfield: registry.npmmirror.com/sparse-bitfield/3.0.3 + optional: true + /sax/1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} optional: true @@ -2280,6 +2585,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + optional: true + /strip-json-comments/2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -2435,7 +2745,7 @@ packages: resolve: 1.22.1 rollup: 3.17.2 optionalDependencies: - fsevents: registry.npmmirror.com/fsevents/2.3.2 + fsevents: 2.3.2 dev: true registry.npmmirror.com/@ampproject/remapping/2.2.0: @@ -2882,32 +3192,6 @@ packages: tslib: 2.5.0 optional: true - registry.npmmirror.com/@aws-sdk/credential-providers/3.272.0: - resolution: {integrity: sha512-ucd6Xq6aBMf+nM4uz5zkjL11mwaE5BV1Q4hkulaGu2v1dRA8n6zhLJk/sb4hOJ7leelqMJMErlbQ2T3MkYvlJQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@aws-sdk/credential-providers/-/credential-providers-3.272.0.tgz} - name: '@aws-sdk/credential-providers' - version: 3.272.0 - engines: {node: '>=14.0.0'} - requiresBuild: true - dependencies: - '@aws-sdk/client-cognito-identity': registry.npmmirror.com/@aws-sdk/client-cognito-identity/3.272.0 - '@aws-sdk/client-sso': registry.npmmirror.com/@aws-sdk/client-sso/3.272.0 - '@aws-sdk/client-sts': registry.npmmirror.com/@aws-sdk/client-sts/3.272.0 - '@aws-sdk/credential-provider-cognito-identity': registry.npmmirror.com/@aws-sdk/credential-provider-cognito-identity/3.272.0 - '@aws-sdk/credential-provider-env': registry.npmmirror.com/@aws-sdk/credential-provider-env/3.272.0 - '@aws-sdk/credential-provider-imds': registry.npmmirror.com/@aws-sdk/credential-provider-imds/3.272.0 - '@aws-sdk/credential-provider-ini': registry.npmmirror.com/@aws-sdk/credential-provider-ini/3.272.0 - '@aws-sdk/credential-provider-node': registry.npmmirror.com/@aws-sdk/credential-provider-node/3.272.0 - '@aws-sdk/credential-provider-process': registry.npmmirror.com/@aws-sdk/credential-provider-process/3.272.0 - '@aws-sdk/credential-provider-sso': registry.npmmirror.com/@aws-sdk/credential-provider-sso/3.272.0 - '@aws-sdk/credential-provider-web-identity': registry.npmmirror.com/@aws-sdk/credential-provider-web-identity/3.272.0 - '@aws-sdk/property-provider': registry.npmmirror.com/@aws-sdk/property-provider/3.272.0 - '@aws-sdk/shared-ini-file-loader': registry.npmmirror.com/@aws-sdk/shared-ini-file-loader/3.272.0 - '@aws-sdk/types': registry.npmmirror.com/@aws-sdk/types/3.272.0 - tslib: 2.5.0 - transitivePeerDependencies: - - aws-crt - optional: true - registry.npmmirror.com/@aws-sdk/fetch-http-handler/3.272.0: resolution: {integrity: sha512-1Qhm9e0RbS1Xf4CZqUbQyUMkDLd7GrsRXWIvm9b86/vgeV8/WnjO3CMue9D51nYgcyQORhYXv6uVjAYCWbUExA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz} name: '@aws-sdk/fetch-http-handler' @@ -3736,248 +4020,6 @@ packages: version: 0.7.5 dev: false - registry.npmmirror.com/@esbuild/android-arm/0.16.17: - resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz} - name: '@esbuild/android-arm' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/android-arm64/0.16.17: - resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz} - name: '@esbuild/android-arm64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/android-x64/0.16.17: - resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz} - name: '@esbuild/android-x64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/darwin-arm64/0.16.17: - resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz} - name: '@esbuild/darwin-arm64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/darwin-x64/0.16.17: - resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz} - name: '@esbuild/darwin-x64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/freebsd-arm64/0.16.17: - resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz} - name: '@esbuild/freebsd-arm64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/freebsd-x64/0.16.17: - resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz} - name: '@esbuild/freebsd-x64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-arm/0.16.17: - resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz} - name: '@esbuild/linux-arm' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-arm64/0.16.17: - resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz} - name: '@esbuild/linux-arm64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-ia32/0.16.17: - resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz} - name: '@esbuild/linux-ia32' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-loong64/0.16.17: - resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz} - name: '@esbuild/linux-loong64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-mips64el/0.16.17: - resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz} - name: '@esbuild/linux-mips64el' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-ppc64/0.16.17: - resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz} - name: '@esbuild/linux-ppc64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-riscv64/0.16.17: - resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz} - name: '@esbuild/linux-riscv64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-s390x/0.16.17: - resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz} - name: '@esbuild/linux-s390x' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-x64/0.16.17: - resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz} - name: '@esbuild/linux-x64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/netbsd-x64/0.16.17: - resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz} - name: '@esbuild/netbsd-x64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/openbsd-x64/0.16.17: - resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz} - name: '@esbuild/openbsd-x64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/sunos-x64/0.16.17: - resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz} - name: '@esbuild/sunos-x64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/win32-arm64/0.16.17: - resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz} - name: '@esbuild/win32-arm64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/win32-ia32/0.16.17: - resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz} - name: '@esbuild/win32-ia32' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/win32-x64/0.16.17: - resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz} - name: '@esbuild/win32-x64' - version: 0.16.17 - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - registry.npmmirror.com/@eslint/eslintrc/0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz} name: '@eslint/eslintrc' @@ -6406,7 +6448,7 @@ packages: normalize-path: registry.npmmirror.com/normalize-path/3.0.0 readdirp: registry.npmmirror.com/readdirp/3.6.0 optionalDependencies: - fsevents: registry.npmmirror.com/fsevents/2.3.2 + fsevents: 2.3.2 dev: true registry.npmmirror.com/chownr/1.1.4: @@ -6464,7 +6506,7 @@ packages: hasBin: true dependencies: chalk: registry.npmmirror.com/chalk/4.1.2 - highlight.js: registry.npmmirror.com/highlight.js/10.7.3 + highlight.js: 10.7.3 mz: registry.npmmirror.com/mz/2.7.0 parse5: registry.npmmirror.com/parse5/5.1.1 parse5-htmlparser2-tree-adapter: registry.npmmirror.com/parse5-htmlparser2-tree-adapter/6.0.1 @@ -7455,6 +7497,7 @@ packages: requiresBuild: true dependencies: prr: 1.0.1 + dev: true optional: true registry.npmmirror.com/error-ex/1.3.2: @@ -7493,28 +7536,28 @@ packages: hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': registry.npmmirror.com/@esbuild/android-arm/0.16.17 - '@esbuild/android-arm64': registry.npmmirror.com/@esbuild/android-arm64/0.16.17 - '@esbuild/android-x64': registry.npmmirror.com/@esbuild/android-x64/0.16.17 - '@esbuild/darwin-arm64': registry.npmmirror.com/@esbuild/darwin-arm64/0.16.17 - '@esbuild/darwin-x64': registry.npmmirror.com/@esbuild/darwin-x64/0.16.17 - '@esbuild/freebsd-arm64': registry.npmmirror.com/@esbuild/freebsd-arm64/0.16.17 - '@esbuild/freebsd-x64': registry.npmmirror.com/@esbuild/freebsd-x64/0.16.17 - '@esbuild/linux-arm': registry.npmmirror.com/@esbuild/linux-arm/0.16.17 - '@esbuild/linux-arm64': registry.npmmirror.com/@esbuild/linux-arm64/0.16.17 - '@esbuild/linux-ia32': registry.npmmirror.com/@esbuild/linux-ia32/0.16.17 - '@esbuild/linux-loong64': registry.npmmirror.com/@esbuild/linux-loong64/0.16.17 - '@esbuild/linux-mips64el': registry.npmmirror.com/@esbuild/linux-mips64el/0.16.17 - '@esbuild/linux-ppc64': registry.npmmirror.com/@esbuild/linux-ppc64/0.16.17 - '@esbuild/linux-riscv64': registry.npmmirror.com/@esbuild/linux-riscv64/0.16.17 - '@esbuild/linux-s390x': registry.npmmirror.com/@esbuild/linux-s390x/0.16.17 - '@esbuild/linux-x64': registry.npmmirror.com/@esbuild/linux-x64/0.16.17 - '@esbuild/netbsd-x64': registry.npmmirror.com/@esbuild/netbsd-x64/0.16.17 - '@esbuild/openbsd-x64': registry.npmmirror.com/@esbuild/openbsd-x64/0.16.17 - '@esbuild/sunos-x64': registry.npmmirror.com/@esbuild/sunos-x64/0.16.17 - '@esbuild/win32-arm64': registry.npmmirror.com/@esbuild/win32-arm64/0.16.17 - '@esbuild/win32-ia32': registry.npmmirror.com/@esbuild/win32-ia32/0.16.17 - '@esbuild/win32-x64': registry.npmmirror.com/@esbuild/win32-x64/0.16.17 + '@esbuild/android-arm': 0.16.17 + '@esbuild/android-arm64': 0.16.17 + '@esbuild/android-x64': 0.16.17 + '@esbuild/darwin-arm64': 0.16.17 + '@esbuild/darwin-x64': 0.16.17 + '@esbuild/freebsd-arm64': 0.16.17 + '@esbuild/freebsd-x64': 0.16.17 + '@esbuild/linux-arm': 0.16.17 + '@esbuild/linux-arm64': 0.16.17 + '@esbuild/linux-ia32': 0.16.17 + '@esbuild/linux-loong64': 0.16.17 + '@esbuild/linux-mips64el': 0.16.17 + '@esbuild/linux-ppc64': 0.16.17 + '@esbuild/linux-riscv64': 0.16.17 + '@esbuild/linux-s390x': 0.16.17 + '@esbuild/linux-x64': 0.16.17 + '@esbuild/netbsd-x64': 0.16.17 + '@esbuild/openbsd-x64': 0.16.17 + '@esbuild/sunos-x64': 0.16.17 + '@esbuild/win32-arm64': 0.16.17 + '@esbuild/win32-ia32': 0.16.17 + '@esbuild/win32-x64': 0.16.17 dev: true registry.npmmirror.com/escalade/3.1.1: @@ -8118,16 +8161,6 @@ packages: name: fs.realpath version: 1.0.0 - registry.npmmirror.com/fsevents/2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz} - name: fsevents - version: 2.3.2 - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - registry.npmmirror.com/function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz} name: function-bind @@ -8359,6 +8392,7 @@ packages: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz} name: graceful-fs version: 4.2.10 + dev: true registry.npmmirror.com/grapheme-splitter/1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz} @@ -8448,12 +8482,6 @@ packages: engines: {node: '>=8'} dev: true - registry.npmmirror.com/highlight.js/10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz} - name: highlight.js - version: 10.7.3 - dev: false - registry.npmmirror.com/hosted-git-info/2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz} name: hosted-git-info @@ -8609,6 +8637,7 @@ packages: engines: {node: '>=0.10.0'} hasBin: true requiresBuild: true + dev: true optional: true registry.npmmirror.com/immutable/4.2.4: @@ -9148,7 +9177,7 @@ packages: name: jsonfile version: 4.0.0 optionalDependencies: - graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 + graceful-fs: 4.2.10 dev: true registry.npmmirror.com/jsonwebtoken/9.0.0: @@ -9369,13 +9398,13 @@ packages: parse-node-version: registry.npmmirror.com/parse-node-version/1.0.1 tslib: registry.npmmirror.com/tslib/2.5.0 optionalDependencies: - errno: registry.npmmirror.com/errno/0.1.8 - graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 - image-size: registry.npmmirror.com/image-size/0.5.5 - make-dir: registry.npmmirror.com/make-dir/2.1.0 - mime: registry.npmmirror.com/mime/1.6.0 - needle: registry.npmmirror.com/needle/3.2.0 - source-map: registry.npmmirror.com/source-map/0.6.1 + errno: 0.1.8 + graceful-fs: 4.2.10 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.2.0 + source-map: 0.6.1 transitivePeerDependencies: - supports-color @@ -9608,6 +9637,7 @@ packages: dependencies: pify: 4.0.1 semver: 5.7.1 + dev: true registry.npmmirror.com/make-dir/3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz} @@ -9734,6 +9764,7 @@ packages: engines: {node: '>=4'} hasBin: true requiresBuild: true + dev: true optional: true registry.npmmirror.com/mime/2.6.0: @@ -9876,8 +9907,8 @@ packages: mongodb-connection-string-url: registry.npmmirror.com/mongodb-connection-string-url/2.6.0 socks: registry.npmmirror.com/socks/2.7.1 optionalDependencies: - '@aws-sdk/credential-providers': registry.npmmirror.com/@aws-sdk/credential-providers/3.272.0 - saslprep: registry.npmmirror.com/saslprep/1.0.3 + '@aws-sdk/credential-providers': 3.272.0 + saslprep: 1.0.3 transitivePeerDependencies: - aws-crt @@ -10043,21 +10074,6 @@ packages: hasBin: true dev: true - registry.npmmirror.com/needle/3.2.0: - resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/needle/-/needle-3.2.0.tgz} - name: needle - version: 3.2.0 - engines: {node: '>= 4.4.x'} - hasBin: true - requiresBuild: true - dependencies: - debug: registry.npmmirror.com/debug/3.2.7 - iconv-lite: registry.npmmirror.com/iconv-lite/0.6.3 - sax: 1.2.4 - transitivePeerDependencies: - - supports-color - optional: true - registry.npmmirror.com/negotiator/0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz} name: negotiator @@ -12211,7 +12227,7 @@ packages: rollup: registry.npmmirror.com/rollup/3.17.2 typescript: registry.npmmirror.com/typescript/4.9.5 optionalDependencies: - '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6 + '@babel/code-frame': 7.18.6 dev: true registry.npmmirror.com/rollup-plugin-postcss/4.0.2_postcss@8.4.21: @@ -12256,7 +12272,7 @@ packages: engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: - fsevents: registry.npmmirror.com/fsevents/2.3.2 + fsevents: 2.3.2 dev: true registry.npmmirror.com/run-async/2.4.1: @@ -12320,16 +12336,6 @@ packages: name: safer-buffer version: 2.1.2 - registry.npmmirror.com/saslprep/1.0.3: - resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/saslprep/-/saslprep-1.0.3.tgz} - name: saslprep - version: 1.0.3 - engines: {node: '>=6'} - requiresBuild: true - dependencies: - sparse-bitfield: registry.npmmirror.com/sparse-bitfield/3.0.3 - optional: true - registry.npmmirror.com/sass-loader/13.2.0_sass@1.58.3+webpack@5.75.0: resolution: {integrity: sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sass-loader/-/sass-loader-13.2.0.tgz} id: registry.npmmirror.com/sass-loader/13.2.0 @@ -12648,6 +12654,7 @@ packages: name: source-map version: 0.6.1 engines: {node: '>=0.10.0'} + dev: true registry.npmmirror.com/sparse-bitfield/3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz} @@ -13734,7 +13741,7 @@ packages: resolve: registry.npmmirror.com/resolve/1.22.1 rollup: registry.npmmirror.com/rollup/3.17.2 optionalDependencies: - fsevents: registry.npmmirror.com/fsevents/2.3.2 + fsevents: 2.3.2 dev: true registry.npmmirror.com/vod-node-sdk/1.1.0: