feat: 课程

This commit is contained in:
mozzie 2023-03-12 22:30:09 +08:00
parent 475b2932ef
commit 0a7b4046a7
34 changed files with 981 additions and 883 deletions

View File

@ -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: {};
}

View File

@ -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 });

View File

@ -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);
}
);

View File

@ -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

View File

@ -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) => {
<div
className="preview-course"
style={{
backgroundImage: !preview.coverUrl
backgroundImage: !preview.course_cover_url
? `linear-gradient(
to right,
#e95659,
@ -61,13 +61,15 @@ const BasicForm = (props: IProps) => {
#976bc4,
#5678ce
)`
: `url(${preview.coverUrl})`,
: `url(${preview.course_cover_url})`,
}}
>
<div className="mask">
<p className="title">{!preview.title ? "标题" : preview.title}</p>
<p className="title">
{!preview.course_title ? "标题" : preview.course_title}
</p>
<p className="summary">
{!preview.summary ? "摘要" : preview.summary}{" "}
{!preview.course_summary ? "摘要" : preview.course_summary}{" "}
</p>
</div>
</div>
@ -85,11 +87,11 @@ const BasicForm = (props: IProps) => {
</Col>
<Col span={12}>
<Form form={form} onValuesChange={onValuesChange}>
<Form.Item name="title" rules={[{ required: true }]}>
<Form.Item name="course_title" rules={[{ required: true }]}>
<Input size="large" type="text" placeholder="标题" />
</Form.Item>
<Form.Item
name="summary"
name="course_summary"
rules={[{ required: true }]}
style={{ marginBottom: 0 }}
>

View File

@ -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,9 +32,14 @@ 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) => {
<Form form={form} onChange={onTocChange}>
<Form.Item name="toc">
<Input.TextArea
placeholder="级别|标题|FileId"
placeholder="级别 | 标题 | FileId"
style={{ minHeight: 600, lineHeight: 2, fontSize: 16 }}
></Input.TextArea>
</Form.Item>
@ -58,17 +63,17 @@ const Chatpter = (props: IProps) => {
</Col>
<Col span={12}>
<ul className="chapter-list">
{chapterList.map((chapter, index) => (
{chapterList.map((c, index) => (
<li
key={index}
className={+chapter.level === 1 ? "l1" : ""}
style={{ paddingLeft: +chapter.level === 1 ? 0 : 20 }}
className={+c.chapter_level === 1 ? "l1" : ""}
style={{ paddingLeft: +c.chapter_level === 1 ? 0 : 20 }}
>
<Text style={{ fontSize: +chapter.level === 1 ? 18 : 16 }}>
{chapter.title}
<Text style={{ fontSize: +c.chapter_level === 1 ? 18 : 16 }}>
{c.chapter_title}
</Text>
{chapter.fileId && (
<Text type="secondary">{chapter.fileId}</Text>
{c.chapter_file_id && (
<Text type="secondary">{c.chapter_file_id}</Text>
)}
</li>
))}

View File

@ -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 (
<div style={{ ...props.styles }}>
<div id="vditor" className="vditor" />

View File

@ -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;
}

View File

@ -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<ICourse>({
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 = () => {
</Button>
)}
{current === steps.length - 1 && (
<Button
type="primary"
onClick={onClickCreate}
disabled={!createBtnValid}
>
<Button type="primary" onClick={onClickCreate}>
</Button>
)}

View File

@ -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 } };
}
}

View File

@ -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' };
}
);
}
/**

View File

@ -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 };
}

View File

@ -7,4 +7,7 @@ export class VodSearchDTO {
@Rule(RuleType.number().required())
limit: number;
@Rule(RuleType.string())
fileId?: string;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<Chapter>;
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;
}
}

View File

@ -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<Course>;
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 } });
}
}

View File

@ -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<Guide>;
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 },
});
}
}

View File

@ -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);
}
);
}
}

View File

@ -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",

View File

@ -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 });

View File

@ -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;

View File

@ -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<any>([]);
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() {
<div className="thumbnail-timeline">
<div className="thumbnail-container">
<article ref={thumbnailRef} onScroll={onThumbnailScroll}>
{courseTimeList.map((item, index) => (
{courseTimeList.map((item: any, index: number) => (
<section key={index}>
<div className="time">
{item.year}{item.month}
@ -133,9 +134,9 @@ export default function Index() {
{item.data.map((d: any) => (
<BsCard
onClick={() => onClickCourseItem(d)}
key={d.id}
imgUrl={d.img}
title={d.title}
key={d.course_id}
imgUrl={d.course_cover_url}
title={d.course_title}
/>
))}
</div>

View File

@ -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);

View File

@ -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;
};

View File

@ -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 <div>{location.pathname}</div>;
interface IProps {
html: string;
}
export default Material;
function Guide(props: IProps) {
const [html, setHtml] = useState<string>("");
const highlightRender = () =>
document.querySelectorAll("code").forEach((block) => {
hljs.highlightBlock(block);
});
useEffect(() => {
if (props.html) {
setHtml(props.html);
}
}, [props.html]);
useEffect(() => {
highlightRender();
}, [html]);
return (
<div style={{ width: 1120, margin: "0 auto", overflow: "hidden" }}>
<article
dangerouslySetInnerHTML={{ __html: html }}
className="markdown-body"
/>
</div>
);
}
export default Guide;

View File

@ -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;
// }

View File

@ -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<any>();
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 (
<video
onContextMenu={(e) => e.preventDefault()}
id="player"
style={{ width: "100%", height: "100%", objectFit: "contain" }}
preload="auto"
playsInline
></video>
);
}
export default Player;

View File

@ -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;
}
}
}

View File

@ -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: <Guide />,
},
{
title: "第一讲特殊K线的量化描述",
level: 2,
time: "00:14:05",
active: false,
view: (
<Player
video={{
url: "https://1500018521.vod2.myqcloud.com/a28b6648vodtranssh1500018521/8a1352da243791580308966554/adp.10.m3u8",
pic: "https://1500018521.vod2.myqcloud.com/a28b6648vodtranssh1500018521/8a1352da243791580308966554/coverBySnapshot_10_0.jpg",
}}
/>
),
},
{
title: "学习 html, css, javascript 前的准备",
level: 2,
time: "3:23",
active: false,
view: (
<Player
video={{
url: "https://1500018521.vod2.myqcloud.com/a28b6648vodtranssh1500018521/3fb96ced243791579995468466/adp.10.m3u8",
pic: "https://1500018521.vod2.myqcloud.com/a28b6648vodtranssh1500018521/3fb96ced243791579995468466/coverBySnapshot_10_0.jpg",
}}
/>
),
},
{
title: "Vite + React + TS - Google Chrome 2023-02-15 09-55-08",
level: 2,
time: "4:13",
active: false,
view: (
<Player
video={{
url: "https://1500018521.vod2.myqcloud.com/a28b6648vodtranssh1500018521/29226db4243791580097740418/adp.10.m3u8",
pic: "https://1500018521.vod2.myqcloud.com/a28b6648vodtranssh1500018521/29226db4243791580097740418/coverBySnapshot/coverBySnapshot_10_0.jpg",
}}
/>
),
},
{
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<any>(null);
const notFound = (
<Result
status="403"
subTitle="无权访问"
extra={<Button type="text"></Button>}
></Result>
);
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: (
<Player
video={{ url: item.media_url, pic: item.media_cover_url }}
/>
),
};
});
const append = [
{
title: "导读",
level: 1,
time: "",
},
{
title: "介绍 / 下载",
level: 2,
time: "",
active: true,
view: <Guide html={data?.guide.guide_html} />,
},
...processToc,
];
setToc(append as any);
setView(<Guide html={data?.guide.guide_html} />);
});
});
const onclickItem = (i: any) => {
setToc((t: any) =>
t.map((p: any) => ({ ...p, active: i.title === p.title }))
);
setView(i.view ?? notFound);
setView(
i.view ?? (
<Result
status="403"
subTitle="无权访问"
extra={<Button type="text"></Button>}
/>
)
);
};
return (
@ -111,7 +74,7 @@ function CourseDetail() {
min={0.1}
size={0.2}
panes={[
<aside>
<aside className="table-of-content">
<h2>K线</h2>
<div>
<Space style={{ color: "var(--color-text-3)" }}>
@ -119,7 +82,7 @@ function CourseDetail() {
</Space>
</div>
<div className="toc">
{toc.map((i) => {
{toc.map((i: any) => {
if (i.level === 1) {
return (
<div className="level-1" key={i.title}>
@ -141,9 +104,7 @@ function CourseDetail() {
})}
</div>
</aside>,
<article>
<main>{view}</main>
</article>,
view,
]}
/>
</div>

View File

@ -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 + "秒";
};

View File

@ -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,
},
},
},
});

View File

@ -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: