From f4d12ce780af7f19120689023265aacec747dde0 Mon Sep 17 00:00:00 2001 From: sunlizhou <296190577@qq.com> Date: Thu, 24 Aug 2023 16:32:34 +0800 Subject: [PATCH 01/48] =?UTF-8?q?=E5=93=81=E7=89=8C=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=EF=BC=8C=E6=96=87=E7=AB=A0=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E6=B8=B2=E6=9F=93markdown=EF=BC=8C=E6=96=87=E7=AB=A0=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E5=86=85=E5=AF=BC=E8=88=AA=EF=BC=8C=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E5=86=85webView=E8=B7=B3=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + pnpm-lock.yaml | 29 +- src/api/brand.ts | 4 +- src/app.config.ts | 1 + src/pages/preview/brand/article/article.tsx | 4 +- src/pages/preview/brand/info/info.module.scss | 10 +- src/pages/preview/brand/info/info.tsx | 131 +++---- .../illness/article/article.module.scss | 25 ++ src/pages/preview/illness/article/article.tsx | 52 ++- src/pages/preview/illness/list/list.tsx | 11 +- src/pages/preview/webView/webView.config.ts | 4 + src/pages/preview/webView/webView.tsx | 9 + src/utils/marked/components/Tablink.tsx | 30 ++ src/utils/marked/marked.scss | 174 ++++++++++ src/utils/marked/marked.ts | 319 ++++++++++++++++++ src/utils/marked/utils.ts | 86 +++++ 16 files changed, 779 insertions(+), 111 deletions(-) create mode 100644 src/pages/preview/webView/webView.config.ts create mode 100644 src/pages/preview/webView/webView.tsx create mode 100644 src/utils/marked/components/Tablink.tsx create mode 100644 src/utils/marked/marked.scss create mode 100644 src/utils/marked/marked.ts create mode 100644 src/utils/marked/utils.ts diff --git a/package.json b/package.json index d2525ab..77426b6 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "@tarojs/shared": "3.6.8", "@tarojs/taro": "3.6.8", "dayjs": "^1.11.9", + "marked": "^7.0.4", "react": "^18.0.0", "react-dom": "^18.0.0", "react-refresh": "^0.11.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eae9f48..bdbe307 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,9 @@ dependencies: dayjs: specifier: ^1.11.9 version: 1.11.9 + marked: + specifier: ^7.0.4 + version: 7.0.4 react: specifier: ^18.0.0 version: 18.0.0 @@ -4993,6 +4996,13 @@ packages: - supports-color dev: true + /babel-runtime@6.26.0: + resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.11.1 + dev: false + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -5831,6 +5841,12 @@ packages: resolution: {integrity: sha512-/AnE9Y4OsJZicCzIe97JP5XoPKQJfTuEG43aEVLFJGOJpyqELod+pE6LEl63DfG1Mp8wX97LDaDpy1GmLEUxlg==} requiresBuild: true + /core-js@2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + requiresBuild: true + dev: false + /core-js@3.31.0: resolution: {integrity: sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ==} requiresBuild: true @@ -9291,6 +9307,12 @@ packages: engines: {node: '>=8'} dev: true + /marked@7.0.4: + resolution: {integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==} + engines: {node: '>= 16'} + hasBin: true + dev: false + /mathml-tag-names@2.1.3: resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} dev: true @@ -11037,7 +11059,6 @@ packages: /regenerator-runtime@0.11.1: resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} - dev: true /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} @@ -12093,6 +12114,12 @@ packages: postcss-value-parser: 3.3.1 dev: true + /taro-parse@1.1.5: + resolution: {integrity: sha512-OS8O9gPyFNQCvQuaGPMshNtxpmvSGVNTNkT/YPhozs629/f+PDEIWt1Ahlqu5uOik58x4piiaogiUdon218Rfg==} + dependencies: + babel-runtime: 6.26.0 + dev: false + /terser-webpack-plugin@5.3.9(@swc/core@1.3.23)(esbuild@0.14.54)(webpack@5.78.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} diff --git a/src/api/brand.ts b/src/api/brand.ts index 4e636c3..5fd8a85 100644 --- a/src/api/brand.ts +++ b/src/api/brand.ts @@ -30,11 +30,11 @@ export const brandApi = { return request(`/home/v1/brand/${id}`, "GET") }, /** 文章列表 */ - articleList(owner_id: number ) { + articleList(owner_id: number,page:number) { return request<{ list: ArticleRecord[], total: number - }>(`/home/v1/article/list?owner_id=${owner_id}&page=1&page_size=1000` , "GET") + }>(`/home/v1/article/list?owner_id=${owner_id}&page=${page}&page_size=10` , "GET") }, articleInfo(id: number ) { return request(`/home/v1/article/${id}` , "GET") diff --git a/src/app.config.ts b/src/app.config.ts index 95305a4..db352ba 100644 --- a/src/app.config.ts +++ b/src/app.config.ts @@ -89,6 +89,7 @@ export default defineAppConfig({ 'illness/sort/sort', 'illness/list/list', 'illness/article/article', + 'webView/webView', ] }, ], diff --git a/src/pages/preview/brand/article/article.tsx b/src/pages/preview/brand/article/article.tsx index b0c348e..a0f341f 100644 --- a/src/pages/preview/brand/article/article.tsx +++ b/src/pages/preview/brand/article/article.tsx @@ -8,7 +8,7 @@ import {Profile} from "@/store"; const article:FC = () => { - const {token} = Profile.useContainer() + const {token,empty} = Profile.useContainer() const {id} = useRouter().params as unknown as { id: number} const [articleInfo,setArticleInfo] = useState() useEffect(() => { @@ -35,7 +35,7 @@ const article:FC = () => { - + 登录查看更多内容 diff --git a/src/pages/preview/brand/info/info.module.scss b/src/pages/preview/brand/info/info.module.scss index 9362555..aebea31 100644 --- a/src/pages/preview/brand/info/info.module.scss +++ b/src/pages/preview/brand/info/info.module.scss @@ -7,7 +7,7 @@ page{ } .curIndexBox{ position: absolute; - top:450rpx; + top:500rpx; right:30rpx; background-color: rgba(0,0,0,0.5); border-radius: 30rpx; @@ -15,16 +15,16 @@ page{ color:#fff; } .body{ - border-radius: 32rpx 32rpx 0 0; background-color:#f1f8f6; width: 750rpx; box-sizing: border-box; display: flex; flex-direction: column; - min-height: 600rpx; - position: absolute; - top: 520rpx; + min-height: 500rpx; .top{ + position: sticky; + position: -webkit-sticky; + top: 0; padding:40rpx 30rpx 30rpx 30rpx; border-radius: 32rpx; background-color: #fff; diff --git a/src/pages/preview/brand/info/info.tsx b/src/pages/preview/brand/info/info.tsx index 8a923ab..10cd2c7 100644 --- a/src/pages/preview/brand/info/info.tsx +++ b/src/pages/preview/brand/info/info.tsx @@ -1,8 +1,8 @@ -import {FC, useEffect, useState} from "react"; +import {FC, useCallback, useEffect, useState} from "react"; import {Image, Swiper, SwiperItem, Text, Video, View} from "@tarojs/components"; import {ArticleRecord, brandApi, BrandRecord} from "@/api"; import styles from './info.module.scss' -import Taro, {useRouter} from "@tarojs/taro"; +import Taro, {useReachBottom, useRouter} from "@tarojs/taro"; import LineEllipsis from "@/components/textCollapse/collapse"; import Empty from "@/components/empty/empty"; @@ -12,10 +12,19 @@ type Params = { const BrandInfo: FC = () => { const {id} = useRouter().params as unknown as Params const [brandInfo, setBrandInfo] = useState() - const [articleList, setArticleList] = useState() + const [articleList, setArticleList] = useState([]) const [curIndex,setCurIndex] = useState(1) + const [page, setPage] = useState(1) + const [total, setTotal] = useState(0) useEffect(() => { + Taro.showLoading({ + title: '加载中', + mask: true + }) + setTimeout(function () { + Taro.hideLoading() + }, 1000) getData() }, [id]) @@ -24,26 +33,48 @@ const BrandInfo: FC = () => { const data = await brandApi.info(id) Taro.setNavigationBarTitle({title: data.name}) setBrandInfo(data) - const data1 = await brandApi.articleList(id) - setArticleList(data1.list) + const data1 = await brandApi.articleList(id,page) + setTotal(data1.total) + setArticleList([ + ...(articleList || []), + ...data1.list + ]) } catch (e) { // setBrandInfo({disabled: 0, graphic_introduction: "", id: 0, introductory_video: "", name: "", brand_album:['1','2','3']}) } } + useReachBottom(useCallback(() => { + if (articleList?.length < total) { + setPage(page + 1) + } + }, [total, articleList])) + + useEffect(() => { + brandApi.articleList(id,page).then(res => { + setTotal(res.total) + setArticleList([ + ...(articleList || []), + ...res.list + ]) + }) + + }, [page]) + function onChange(e){ console.log(e) setCurIndex(+e.detail.current+1) } return ( - + { brandInfo?.introductory_video_resource?.url && diff --git a/src/pages/preview/illness/article/article.module.scss b/src/pages/preview/illness/article/article.module.scss index e9d84a6..6b00ae0 100644 --- a/src/pages/preview/illness/article/article.module.scss +++ b/src/pages/preview/illness/article/article.module.scss @@ -1,5 +1,30 @@ +.botmBox{ + z-index: 99; + position: fixed; + bottom: 0; + width: 750rpx; + box-sizing: border-box; + height: 180rpx; + padding-bottom: 60rpx; + display: flex; + justify-content: center; + align-items: center; + background: #F5F8F7; + view{ + width: 560rpx; + height: 76rpx; + background: #45D4A8; + border-radius: 38rpx 38rpx 38rpx 38rpx; + color: #fff; + font-weight: 500; + font-size: 40rpx; + text-align: center; + line-height: 76rpx; + } +} .fixedBox{ position: fixed; + z-index: 100; top:0; width: 100vw; height: 100vh; diff --git a/src/pages/preview/illness/article/article.tsx b/src/pages/preview/illness/article/article.tsx index 882c6ed..3670f1a 100644 --- a/src/pages/preview/illness/article/article.tsx +++ b/src/pages/preview/illness/article/article.tsx @@ -1,16 +1,22 @@ -import {FC, useEffect, useState} from "react"; -import {Image, Text, View} from "@tarojs/components"; +import {FC, useEffect, useMemo, useState} from "react"; +import {Image, PageContainer, Text, View} from "@tarojs/components"; import Taro, {useRouter} from "@tarojs/taro"; import {ArticleRecord, brandApi} from "@/api"; import styles from './article.module.scss' import down from '@/static/img/doubleDown.png' import {Profile} from "@/store"; - +import {parse} from "@/utils/marked/marked"; const article:FC = () => { - const {token} = Profile.useContainer() + const {token, empty} = Profile.useContainer() const {id} = useRouter().params as unknown as { id: number} + const [show,setShow] = useState(false) const [articleInfo,setArticleInfo] = useState() + const { children, headings } = useMemo(() => parse(articleInfo?.content || ''), [articleInfo]) + console.log(headings,'headings') + const query = Taro.createSelectorQuery() + + useEffect(() => { getData() }, [id]) @@ -24,11 +30,33 @@ const article:FC = () => { } catch (e) { } } + function mao(id: string){ + console.log(id) + setShow(false) + Taro.nextTick(() => { + query.select(`#${id}`).boundingClientRect() + query.exec((res) => { + if(res.length){ + Taro.pageScrollTo({ + scrollTop: res[res.length-1].top, + duration: 300} + ) + } + }) + }) + } function helloWorld() { - const html = articleInfo?.content; return ( <> - + {/**/} + {/* { children }*/} + {/**/} + {setShow(true)}}> + 文章导航 + + + { children } + { !token && @@ -36,13 +64,23 @@ const article:FC = () => { - + 登录查看更多内容 } + + + {headings.length > 0 && + headings.map((d) => + {mao(d.id)}}>{d.text} + ) + } + + + ) } diff --git a/src/pages/preview/illness/list/list.tsx b/src/pages/preview/illness/list/list.tsx index 17503b9..2fae725 100644 --- a/src/pages/preview/illness/list/list.tsx +++ b/src/pages/preview/illness/list/list.tsx @@ -11,8 +11,17 @@ const BrandList: FC = () => { const [page, setPage] = useState(1) const [brands, setBrands] = useState([]) const [total, setTotal] = useState(0) + const [fetchDone,setFetchDone] = useState(false) useEffect(() => { + Taro.showLoading({ + title: '加载中', + mask: true + }) + setTimeout(function () { + Taro.hideLoading() + setFetchDone(true) + }, 800) getData() }, [page]) @@ -37,7 +46,7 @@ const BrandList: FC = () => { return ( - + { brands.length > 0 ? brands.map((d) => diff --git a/src/pages/preview/webView/webView.config.ts b/src/pages/preview/webView/webView.config.ts new file mode 100644 index 0000000..808161a --- /dev/null +++ b/src/pages/preview/webView/webView.config.ts @@ -0,0 +1,4 @@ +export default definePageConfig({ + navigationBarTitleText: '链接', + onReachBottomDistance: 30 +}) diff --git a/src/pages/preview/webView/webView.tsx b/src/pages/preview/webView/webView.tsx new file mode 100644 index 0000000..4c459ef --- /dev/null +++ b/src/pages/preview/webView/webView.tsx @@ -0,0 +1,9 @@ +import {FC} from "react"; +import {WebView} from "@tarojs/components"; +import {useRouter} from "@tarojs/taro"; + +const Web:FC = () => { + const {url} = useRouter().params as unknown as { url: string } + return +} +export default Web diff --git a/src/utils/marked/components/Tablink.tsx b/src/utils/marked/components/Tablink.tsx new file mode 100644 index 0000000..93e61dd --- /dev/null +++ b/src/utils/marked/components/Tablink.tsx @@ -0,0 +1,30 @@ +import { FC, ReactNode} from "react"; +import {View} from "@tarojs/components"; +import Taro from "@tarojs/taro"; + + + +interface TabLinkProps{ + className:string + url:string + children: ReactNode[] +} + +const TabLink:FC = (props:TabLinkProps) => { + function linkTab(){ + console.log(props.url) + let webExp= new RegExp(/http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/) + if(webExp.test(props.url)){ + //跳转webview + Taro.navigateTo({url:`/pages/preview/webView/webView?url=${props.url}`}) + }else{ + //跳转小程序页面 + } + } + + return ( + 22222 + ) +} + +export default TabLink diff --git a/src/utils/marked/marked.scss b/src/utils/marked/marked.scss new file mode 100644 index 0000000..e526abf --- /dev/null +++ b/src/utils/marked/marked.scss @@ -0,0 +1,174 @@ +.code {} + +.h1 { + font-size: 48rpx; + margin-top: 20rpx; + margin-bottom: 40rpx; +} + +.h2 { + font-size: 44rpx; + margin-top: 20rpx; + margin-bottom: 40rpx; +} + +.h3 { + font-size: 40rpx; + margin-top: 20rpx; + margin-bottom: 40rpx; +} + +.h4 { + font-size: 36rpx; + margin-top: 20rpx; + margin-bottom: 40rpx; +} + +.h5 { + font-size: 32rpx; + margin-top: 20rpx; + margin-bottom: 40rpx; +} + +.h6 { + font-size: 28rpx; + margin-top: 20rpx; + margin-bottom: 40rpx; +} + +.hr { + border-bottom: 1px solid #aaa; + margin-top: 12rpx; + margin-bottom: 12rpx; +} + +.blockquote { + border-left: 8rpx solid #aaa; + padding: 16rpx; +} + +.list, +.taskList, +.orderedList { + display: block; + margin-bottom: 12rpx; +} + +.listItem, +.taskListItem, +.orderedListItem { + padding-left: 1rem; + position: relative; +} + +.taskListItem { + padding-left: 1.5rem; +} + +.checkedTaskIndicator, +.uncheckTaskIndicator, +.listItemIndicator { + position: absolute; + top: 0; + left: 0; + user-select: none; +} + +.checkedTaskIndicator, +.uncheckTaskIndicator { + width: 1rem; + height: 1rem; + overflow: hidden; + border: 2px solid #ddd; + display: flex; + justify-content: center; + align-items: center; + font-size: 0.65rem; + border-radius: 8rpx; + color: #999; +} + +.paragraph { + margin-top: 4rpx; + margin-bottom: 12rpx; + font-size: 28rpx; + font-weight: 500; + color: #444444; + line-height: 35rpx; +} + +.blockHtml {} + +.inlineHtml {} + +.text { +} + +.def {} + +.strong { + font-weight: bold; +} + +.em { + font-style: italic; +} + +.del { + text-decoration: line-through; +} + +.codespan { + padding: 0 12rpx; + font-size: 85%; + border: 1px solid #aaa; + background-color: #ccc; + border-radius: 8rpx; +} + +//.escape {} +//.br {} + +.link { + display: inline; + text-decoration: underline; + color: blue; + // todo 取消点击时的背景 +} + +.image { + display: inline-block; + max-width: 100%; + height: auto; +} + +.video { + display: block; + max-width: 100%; +} + +// todo 自动换行 +.table { + max-width: 100%; + overflow-x: auto; + border: 1px solid #dee2e6; +} + +.tableBodyRow, +.tableHeader { + display: flex; + + &:not(:last-child) { + border-bottom: 1px solid #dee2e6; + } +} + +.tableHeaderCell, +.tableBodyCell { + flex: 1; + padding: 8rpx 12rpx; + + &:not(:last-child) { + border-right: 1px solid #dee2e6; + } +} diff --git a/src/utils/marked/marked.ts b/src/utils/marked/marked.ts new file mode 100644 index 0000000..73563a4 --- /dev/null +++ b/src/utils/marked/marked.ts @@ -0,0 +1,319 @@ +import {Token, Tokens, lexer} from "marked" +import {Attributes, ComponentType, createElement, ReactElement, ReactNode} from "react" +import {View, Text, Image, Video, Audio} from "@tarojs/components" +import {parseHeadingId, walkTokens, unescape} from "./utils" +import TabLink from "./components/Tablink"; +import './marked.scss' + +/** + * 解析 Markdown 文本 + * + * ```ts + * const Markdown: FC<{ source: string }> = ({ source }) => { + * const { children, headings } = useMemo(() => parse(source), [source]) + * console.log(headings) // => [{level: 1, text: 'heading', id: 'custom-id'}] + * return ({children}) + * } + * + * + * ``` + * + * @param {string} content 原始文本 + * + * @see {@link https://www.markdownguide.org} + * @see {@link https://marked.js.org} + */ +export const parse = (content: string) => { + const headings: Heading[] = [] + let nextKey = 0 + + const ctx: RenderContext = { + createReactElement

(type: ComponentType

, props?: Props

): ReactElement

{ + props ??= {} as Props

+ props.key ??= ++nextKey + return createElement(type, props) + }, + + ensureHeading(token: Tokens.Heading): string { + // todo(hupeh): id 不能重复 + // todo(hupeh): 第一层标题级别必须一致 + const id = parseHeadingId(token) + headings.push({id, text: token.text, level: token.depth}) + return id + }, + } + + const tokens = lexer(content) + const children = render(ctx, tokens) + + return {children, headings} +} + +export interface Heading { + level: number + text: string + id: string +} + +type Props

= Attributes & P + +interface RenderContext { + createReactElement

(type: ComponentType

, props?: Props

): ReactElement

+ + ensureHeading(token: Tokens.Heading): string +} + +function render(ctx: RenderContext, tokens: Token[]) { + return walkTokens(tokens, (token) => renderToken(ctx, token)) +} + +function renderToken(ctx: RenderContext, token: Token) { + return (renderer[token.type] ?? renderer.generic)(ctx, token) +} + +const renderer = { + space(_: RenderContext, tk: Tokens.Space) { + // todo(hupeh): 测试是否需要 Text 实现 + return tk.raw + }, + + code(ctx: RenderContext, tk: Tokens.Code) { + return ctx.createReactElement(View, { + className: 'code', + children: tk.escaped ? escape(tk.text) : tk.text, + }) + }, + + heading(ctx: RenderContext, tk: Tokens.Heading) { + const id = ctx.ensureHeading(tk) + + // todo(hupeh): 是否需要调整标题级别保证顺序一致 + return ctx.createReactElement(View, { + id, + className: `h${tk.depth}`, + children: render(ctx, tk.tokens), + }) + }, + + hr(ctx: RenderContext, _: Tokens.Hr) { + return ctx.createReactElement(View, { + className: 'hr', + }) + }, + + blockquote(ctx: RenderContext, tk: Tokens.Blockquote) { + return ctx.createReactElement(View, { + className: 'blockquote', + children: render(ctx, tk.tokens), + }) + }, + + list(ctx: RenderContext, tk: Tokens.List) { + const isTaskList = tk.items[0]?.task == true; + // todo(hupeh): 什么是 tk.loose + return ctx.createReactElement(View, { + className: isTaskList ? 'taskList' : tk.ordered ? 'orderedList' : 'list', + children: tk.items.map((item, index) => { + return ctx.createReactElement(View, { + className: isTaskList ? 'taskListItem' : tk.ordered ? 'orderedListItem' : "listItem", + children: [ + !isTaskList ? ctx.createReactElement(View, { + className: 'listItemIndicator', + children: tk.ordered ? index + 1 : '•', + }) : null, + item.task ? ctx.createReactElement(View, { + className: item.checked ? 'checkedTaskIndicator' : 'uncheckTaskIndicator', + children: item.checked ? ctx.createReactElement(Text, { + children: '✔', + }) : null, + }) : null, + ...render(ctx, item.tokens), + ], + }); + }) + }); + }, + + paragraph(ctx: RenderContext, tk: Tokens.Paragraph) { + // todo(hupeh): tk.pre + return ctx.createReactElement(View, { + className: 'paragraph', + children: render(ctx, tk.tokens), + }); + }, + + html(ctx: RenderContext, tk: Tokens.HTML) { + // todo(hupeh): 什么是 tk.pre ? 对应

 标签吗?
+    // if (tk.pre) {}
+    if (tk.block) {
+      return ctx.createReactElement(View, {
+        className: 'blockHtml',
+        children: tk.text.split(/\r?\n/).map(line => {
+          return ctx.createReactElement(View, {
+            className: 'blockHtmlItem',
+            children: ctx.createReactElement(Text, {
+              space: 'nbsp', // 空格符号渲染方式
+              decode: true, // 正确显示实体
+              children: line.trimEnd(),
+            }),
+          })
+        }),
+      })
+    }
+    return ctx.createReactElement(Text, {
+      className: 'inlineHtml',
+      children: tk.text,
+    })
+  },
+
+  text(ctx: RenderContext, tk: Tokens.Text) {
+    if (tk.tokens?.length) {
+      return render(ctx, tk.tokens)
+    }
+    // todo 转义 HTML 实体
+    return ctx.createReactElement(Text, {
+      className: 'text',
+      children: unescape(tk.text),
+      decode: true,
+    })
+  },
+
+  def(ctx: RenderContext, tk: Tokens.Def) {
+    return ctx.createReactElement(Text, {
+      className: 'def',
+      children: tk.title,
+    })
+  },
+
+  escape(ctx: RenderContext, tk: Tokens.Escape) {
+    return ctx.createReactElement(Text, {
+      className: 'escape',
+      children: escape(tk.text),
+    })
+  },
+
+  link(ctx: RenderContext, tk: Tokens.Link) {
+    // todo(hupeh): 页面内部跳转,根据 heading 的 ID 实现
+    return ctx.createReactElement(TabLink, {
+      className: 'link',
+      url: tk.href,
+      children: render(ctx, tk.tokens),
+    })
+  },
+
+  image(ctx: RenderContext, tk: Tokens.Image) {
+    // todo(hupeh): 相关控制属性可以通过 QueryString 解析出来
+    const ext = tk.href.split('?').shift()!.split('.').pop()!.toLowerCase();
+    switch (ext) {
+      case 'mp4':
+      case 'm4v':
+      case 'mov':
+      case 'qt':
+      case 'avi':
+      case 'flv':
+      case 'wmv':
+      case 'asf':
+      case 'mkv':
+      case 'rm':
+      case 'rmvb':
+      case 'vob':
+      case 'ts':
+      case 'dat':
+        return ctx.createReactElement(Video, {
+          className: 'video',
+          src: tk.href,
+        })
+      case 'mp3':
+      case 'wma':
+      case 'flac':
+      case 'wav':
+        // todo(hupeh): 使用 Taro.createInnerAudioContext 接口封装组件
+        return ctx.createReactElement(Audio, {
+          className: 'audio',
+          src: tk.href
+        })
+      default:
+        return ctx.createReactElement(Image, {
+          className: 'image',
+          src: tk.href,
+          mode: "widthFix",
+          webp: ext === 'web',
+        })
+    }
+  },
+
+  strong(ctx: RenderContext, tk: Tokens.Strong) {
+    return ctx.createReactElement(Text, {
+      className: 'strong',
+      children: render(ctx, tk.tokens),
+    })
+  },
+
+  em(ctx: RenderContext, tk: Tokens.Em) {
+    return ctx.createReactElement(Text, {
+      className: 'em',
+      children: render(ctx, tk.tokens),
+    })
+  },
+
+  codespan(ctx: RenderContext, tk: Tokens.Codespan) {
+    return ctx.createReactElement(Text, {
+      className: 'codespan',
+      children: tk.text,
+    })
+  },
+
+  br(ctx: RenderContext, _: Tokens.Br) {
+    return ctx.createReactElement(View, {
+      className: 'br',
+    })
+  },
+
+  del(ctx: RenderContext, tk: Tokens.Del) {
+    return ctx.createReactElement(Text, {
+      className: 'del',
+      children: render(ctx, tk.tokens),
+    })
+  },
+
+  table(ctx: RenderContext, tk: Tokens.Table) {
+    // todo(hupeh): 使用自定义 table 组件,检测单元格宽度
+    // return "暂不支持表格渲染";
+    return ctx.createReactElement(View, {
+      className: 'table',
+      children: [
+        ctx.createReactElement(View, {
+          className: 'tableHeader',
+          children: tk.header.map((cell, index) => {
+            return ctx.createReactElement(View, {
+              className: 'tableHeaderCell',
+              style: {textAlign: tk.align[index] || 'left'},
+              children: render(ctx, cell.tokens),
+            })
+          }),
+        }),
+        ctx.createReactElement(View, {
+          className: 'tableBody',
+          children: tk.rows.map(rows => {
+            return ctx.createReactElement(View, {
+              className: 'tableBodyRow',
+              children: rows.map((cell, index) => {
+                return ctx.createReactElement(View, {
+                  className: 'tableBodyCell',
+                  style: {textAlign: tk.align[index] || 'left'},
+                  children: render(ctx, cell.tokens),
+                })
+              })
+            })
+          }),
+        }),
+      ],
+    })
+  },
+
+  generic(ctx: RenderContext, tk: Tokens.Generic) {
+    // todo(hupeh): 验证 tk.type
+    // todo(hupeh): 调试模式下不返回 null
+    return tk.tokens?.length ? render(ctx, tk.tokens) : null
+  },
+}
diff --git a/src/utils/marked/utils.ts b/src/utils/marked/utils.ts
new file mode 100644
index 0000000..4c7c077
--- /dev/null
+++ b/src/utils/marked/utils.ts
@@ -0,0 +1,86 @@
+import {Token, Tokens, TokensList} from "@/utils/marked/marked"
+import {Attributes, ComponentType, createElement, ReactElement} from "react";
+
+
+const unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig
+
+export function unescape(html: string) {
+  // explicitly match decimal, hex, and named HTML entities
+  return html.replace(unescapeTest, (_, n) => {
+    n = n.toLowerCase()
+    if (n === 'colon') return ':'
+    if (n.charAt(0) === '#') {
+      return n.charAt(1) === 'x'
+        ? String.fromCharCode(parseInt(n.substring(2), 16))
+        : String.fromCharCode(+n.substring(1))
+    }
+    return ''
+  })
+}
+
+// This alphabet uses `A-Za-z0-9_-` symbols.
+// The order of characters is optimized for better gzip and brotli compression.
+// Same as in non-secure/index.js
+const urlAlphabet = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
+
+export function hash(str: string) {
+  const parts = Math.abs(str.split("")
+    .reduce((a, b) => {
+      a = ((a << 5) - a) + b.charCodeAt(0);
+      return a & a;
+    }, 0))
+    .toString()
+    .split('')
+
+  let id = ''
+  // We are reading directly from the random pool to avoid creating new array
+  for (const part of parts) {
+    const size = Number.parseInt(part)
+    if (!Number.isNaN(size)) {
+      // It is incorrect to use bytes exceeding the alphabet size.
+      // The following mask reduces the random byte in the 0-255 value
+      // range to the 0-63 value range. Therefore, adding hacks, such
+      // as empty string fallback or magic numbers, is unneccessary because
+      // the bitmask trims bytes down to the alphabet size.
+      id += urlAlphabet[size & 63]
+    }
+  }
+  return id.replace(/^-+|-+$/g, '')
+}
+
+export function walkTokens(tokens: Token[] | TokensList, callback: (token: Token) => T | T[]) {
+  let values: T[] = [];
+  for (const token of tokens) {
+    values = values.concat(callback.call(this, token))
+  }
+  return values
+}
+
+export function parseHeadingId(tk: Tokens.Heading) {
+  const index = tk.tokens.length - 1;
+  if (tk.tokens[index].type !== 'text') {
+    return hash(tk.raw)
+  }
+
+  // https://github.com/markedjs/marked-custom-heading-id/blob/main/src/index.js
+  const child = tk.tokens[index] as Tokens.Text
+  const headingIdRegex = /(?: +|^)\{#([a-z][\w-]*)\}(?: +|$)/i;
+  const hasId = child.text.match(headingIdRegex);
+
+  if (!hasId) {
+    return hash(tk.raw)
+  }
+
+  child.text = child.text.replace(headingIdRegex, '')
+  tk.text = tk.text.replace(headingIdRegex, '')
+
+  return hasId[1]
+}
+
+let nextKey = 0
+
+export function h(type: ComponentType, props?: Attributes & Props): ReactElement {
+  props ??= {} as Attributes & Props
+  props.key ??= ++nextKey
+  return createElement(type, props)
+}

From ec5d995611d83d6aa82cdc092c48796c6812d591 Mon Sep 17 00:00:00 2001
From: king <2229249788@qq.com>
Date: Thu, 24 Aug 2023 16:34:17 +0800
Subject: [PATCH 02/48] =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E8=AE=B0=E5=BD=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/components/video/video.tsx                     | 1 -
 src/pages/business/videoInfo/components/course.tsx | 1 +
 2 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/video/video.tsx b/src/components/video/video.tsx
index f2730e3..2a6ca6f 100644
--- a/src/components/video/video.tsx
+++ b/src/components/video/video.tsx
@@ -98,7 +98,6 @@ const HVideo: FC = (opt: HVideoOptions) => {
 
   Taro.useUnload(() => {
     unique_ident.put(undefined, currentTime)
-    unique_ident.remove()
     unique_ident.upload().then()
   })
 
diff --git a/src/pages/business/videoInfo/components/course.tsx b/src/pages/business/videoInfo/components/course.tsx
index 0b9d142..b001118 100644
--- a/src/pages/business/videoInfo/components/course.tsx
+++ b/src/pages/business/videoInfo/components/course.tsx
@@ -33,6 +33,7 @@ const Course: FC = ({id, courseId, preview, curEnd}) => {
   async function onEnded() {
     const startRecording = unique_ident.get()
     startRecording && await curriculum.curEnd(courseId, id, {...startRecording, duration: data?.duration!}) // 结束
+    unique_ident.remove()
 
     if (testId) {
       if (preview) { // 预览

From 7072675740f3f9b436885b64084367f33408fbaf Mon Sep 17 00:00:00 2001
From: king <2229249788@qq.com>
Date: Thu, 24 Aug 2023 18:30:14 +0800
Subject: [PATCH 03/48] =?UTF-8?q?=E7=96=BE=E7=97=85=E5=88=86=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/api/brand.ts                              |   2 +-
 src/api/home.ts                               |   2 +-
 src/components/empty/empty.module.scss        |   5 +-
 .../home/components/feature_recommended.tsx   |  10 +-
 src/pages/home/components/search.tsx          |  16 +-
 src/pages/home/home.module.scss               |   7 +-
 src/pages/preview/brand/list/list.tsx         |   2 +-
 .../illness/sort/components/search.tsx        |  13 ++
 src/pages/preview/illness/sort/sort.config.ts |   1 +
 .../preview/illness/sort/sort.module.scss     |  44 +++---
 src/pages/preview/illness/sort/sort.tsx       | 139 ++++++++++++------
 src/static/img/leftArrow.png                  | Bin 0 -> 406 bytes
 types/home.d.ts                               |   1 +
 13 files changed, 155 insertions(+), 87 deletions(-)
 create mode 100644 src/pages/preview/illness/sort/components/search.tsx
 create mode 100644 src/static/img/leftArrow.png

diff --git a/src/api/brand.ts b/src/api/brand.ts
index 5fd8a85..6b11f9f 100644
--- a/src/api/brand.ts
+++ b/src/api/brand.ts
@@ -21,7 +21,7 @@ export const brandApi = {
   /** 品牌列表 */
   list(page: number , page_size: number) {
     return request<{
-      data: BrandRecord[],
+      list: BrandRecord[],
       total: number
     }>(`/home/v1/brand/list?page=${page}&page_size=${page_size}` , "GET")
   },
diff --git a/src/api/home.ts b/src/api/home.ts
index 5d39f6a..5e73f53 100644
--- a/src/api/home.ts
+++ b/src/api/home.ts
@@ -49,7 +49,7 @@ export const HomeApi = {
   },
   /** 品牌 */
   brand(page: number, page_size: number) {
-    return request<{ data: Brand[], total: number }>('/home/v1/brand/list', "GET", {page, page_size})
+    return request<{ list: Brand[], total: number }>('/home/v1/brand/list', "GET", {page, page_size})
   },
   /** 技能 */
   skillTop(count: number) {
diff --git a/src/components/empty/empty.module.scss b/src/components/empty/empty.module.scss
index 31f0f58..10efb9e 100644
--- a/src/components/empty/empty.module.scss
+++ b/src/components/empty/empty.module.scss
@@ -1,5 +1,5 @@
 .empty {
-  width: 750rpx;
+  width: 100%;
   text-align: center;
   color: #6c757d;
   position: relative;
@@ -8,7 +8,8 @@
 .image {
   display: block;
   margin: auto;
-  width: 600rpx;
+  max-width: 600rpx;
+  width: 80%;
 }
 
 .name {
diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx
index f69f5cf..b251b88 100644
--- a/src/pages/home/components/feature_recommended.tsx
+++ b/src/pages/home/components/feature_recommended.tsx
@@ -59,7 +59,7 @@ const FeatureRecommended: FC = () => {
   async function getBrand(): Promise {
     try {
       const res = await HomeApi.brand(1, 3)
-      return res.data.map(d => ({
+      return res.list.map(d => ({
         id: d.id,
         title: d.name,
         imageUrl: d.brand_album,
@@ -80,7 +80,7 @@ const FeatureRecommended: FC = () => {
         title: d.title,
         imageUrl: d.url_path,
         description: d.introduction,
-        path: `?url=${d.resource.url}&poster=${d.url_path}&title=${d.resource.name}`
+        path: `?url=${d.resource?.url}&poster=${d.url_path}&title=${d.resource?.name}`
       }))
     } catch (e) {
     }
@@ -94,9 +94,9 @@ const FeatureRecommended: FC = () => {
       return res.map(d => ({
         id: d.id,
         imageUrl: d.url_path,
-        description: '',
-        title: d.resource.name,
-        path: `?url=${d.resource.url}&poster=${d.url_path}&title=${d.resource.name}`
+        description: d.introduction,
+        title: d.resource?.name,
+        path: `?url=${d.resource?.url}&poster=${d.url_path}&title=${d.resource?.name}`
       }))
     } catch (e) {
     }
diff --git a/src/pages/home/components/search.tsx b/src/pages/home/components/search.tsx
index 7910e33..aec1dce 100644
--- a/src/pages/home/components/search.tsx
+++ b/src/pages/home/components/search.tsx
@@ -1,13 +1,21 @@
 import {FC} from "react";
-import {Text, View} from "@tarojs/components";
+import {Input, View} from "@tarojs/components";
 import styles from "../home.module.scss";
 import Icon from "@/components/icon";
 
-export const Search: FC = () => {
+interface Props {
+  onConfirm: (value: string) => void
+}
+
+export const Search: FC = (props) => {
   return (
     
-      
-      搜索课程
+      
+       props.onConfirm((e.target as any).value!)}
+        className='flex-1 pl-1'/>
     
   )
 }
diff --git a/src/pages/home/home.module.scss b/src/pages/home/home.module.scss
index d2b5e90..c36351d 100644
--- a/src/pages/home/home.module.scss
+++ b/src/pages/home/home.module.scss
@@ -38,12 +38,13 @@
   width: 710rpx;
   background: #fff;
   border-radius: 100px;
-  line-height: 68rpx;
-  color: #bbb;
   font-size: 28rpx;
   display: flex;
+  padding-left: 20rpx;
   align-items: center;
-  justify-content: center;
+  box-sizing: border-box;
+  margin: 20rpx;
+  height: 76rpx;
 }
 
 .adware {
diff --git a/src/pages/preview/brand/list/list.tsx b/src/pages/preview/brand/list/list.tsx
index fac5737..474d4ff 100644
--- a/src/pages/preview/brand/list/list.tsx
+++ b/src/pages/preview/brand/list/list.tsx
@@ -19,7 +19,7 @@ const BrandList: FC = () => {
       const res = await brandApi.list(1, 10)
       setTotal(res.total)
       setBrands([
-        ...res.data
+        ...res.list
       ])
     } catch (e) {
     }
diff --git a/src/pages/preview/illness/sort/components/search.tsx b/src/pages/preview/illness/sort/components/search.tsx
new file mode 100644
index 0000000..3e30210
--- /dev/null
+++ b/src/pages/preview/illness/sort/components/search.tsx
@@ -0,0 +1,13 @@
+import {FC} from "react";
+import {Text, View} from "@tarojs/components";
+import styles from "../sort.module.scss";
+import Icon from "@/components/icon";
+
+export const Search: FC = () => {
+  return (
+    
+      
+      搜索课程
+    
+  )
+}
diff --git a/src/pages/preview/illness/sort/sort.config.ts b/src/pages/preview/illness/sort/sort.config.ts
index b7d09ab..dd92909 100644
--- a/src/pages/preview/illness/sort/sort.config.ts
+++ b/src/pages/preview/illness/sort/sort.config.ts
@@ -1,3 +1,4 @@
 export default definePageConfig({
   navigationBarTitleText: '疾病知识',
+  navigationStyle: "custom",
 })
diff --git a/src/pages/preview/illness/sort/sort.module.scss b/src/pages/preview/illness/sort/sort.module.scss
index c0c2030..3e4d4fa 100644
--- a/src/pages/preview/illness/sort/sort.module.scss
+++ b/src/pages/preview/illness/sort/sort.module.scss
@@ -1,6 +1,6 @@
 .firstOrder {
   width: 300rpx;
-  height: calc(100vh - env(safe-area-inset-bottom));
+  height: calc(100vh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 200rpx);
 
   View {
     width: 100%;
@@ -21,6 +21,7 @@
   font-weight: bold;
   position: relative;
   transition: all 200ms;
+  background: #fff;
 
   &:after {
     content: '';
@@ -37,35 +38,26 @@
   }
 }
 
-.tree {
-  padding: 0 15rpx;
+.search {
+  width: 710rpx;
   background: #fff;
-  box-sizing: border-box;
-  height: calc(100vh - env(safe-area-inset-bottom));
-}
-
-.name {
-  font-size: 32rpx;
-  font-weight: bold;
-  color: #323635;
-  padding: 40rpx 0 40rpx 15rpx;
-}
-
-.secondaryBox {
+  border-radius: 100px;
+  line-height: 68rpx;
+  color: #bbb;
+  font-size: 28rpx;
   display: flex;
-  flex-wrap: wrap;
-  align-items: flex-start;
+  align-items: center;
+  justify-content: center;
 }
 
-.secondary {
-  width: 50%;
+.tree {
   padding: 0 15rpx;
+  background: #fff;
   box-sizing: border-box;
-  color: #323635;
-  text-align: center;
-  line-height: 60rpx;
-  background: #F5F8F7;
-  border-radius: 8rpx;
-  margin-bottom: 20rpx;
-  background-clip: content-box;
+  height: calc(100vh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 200rpx)
+}
+
+.list {
+  padding: 20rpx;
+  border-bottom: 1px solid #F5F8F7;
 }
diff --git a/src/pages/preview/illness/sort/sort.tsx b/src/pages/preview/illness/sort/sort.tsx
index de5df38..230971e 100644
--- a/src/pages/preview/illness/sort/sort.tsx
+++ b/src/pages/preview/illness/sort/sort.tsx
@@ -1,69 +1,120 @@
-import {ScrollView, View} from "@tarojs/components";
-import {FC, useState} from "react";
+import {Image, ScrollView, View} from "@tarojs/components";
+import {FC, useEffect, useMemo, useState} from "react";
 import {Category, HomeApi} from "@/api";
 import Taro from "@tarojs/taro";
 import styles from './sort.module.scss'
+import Tabs, {TabList} from "@/components/tabs/tabs";
+import {Search} from "@/pages/home/components/search";
+import {illnessApi} from "@/api/illness";
+import Empty from "@/components/empty/empty";
+import leftArrow from "@/static/img/leftArrow.png"
 
 const prefix = 'SORT'
 const Sort: FC = () => {
   const [data, setData] = useState([])
-  const [select, setSelect] = useState(null)
+  const [firstId, setFirstId] = useState(undefined)
+  const [secondId, setSecondId] = useState(undefined)
+  const [list, setList] = useState([])
+
+
+  const globalData = Taro.getApp().globalData
+  const menu = Taro.getMenuButtonBoundingClientRect()
 
   async function getData() {
     const res = await HomeApi.category(3)
     setData(res)
     if (res.length) {
-      setSelect(`${prefix}-${res[0].id}`)
+      setFirstId(res[0].id)
+      setSecondId(res[0]?.resource_category?.[0].id)
     }
   }
 
   function jump(id: number) {
-    Taro.navigateTo({url: '/pages/preview/illness/list/list?id=' + id})
+    Taro.navigateTo({url: '/pages/preview/illness/article/article?id=' + id})
+  }
+
+  const getTabList = useMemo((): TabList[] => {
+    return data.map(d => ({
+      title: d.name,
+      value: d.id
+    }))
+  }, [data])
+
+  const headerStyles: React.CSSProperties = {
+    paddingTop: globalData.statusBarHeight + 'px',
+    display: 'flex',
+    alignItems: "center",
+    width: menu.left - 10 + 'px',
+    paddingLeft: '10px'
+  }
+
+  function onConfirm(value: string) {
+    console.log(value)
+  }
+
+  function firstIdChange(id: number) {
+    setFirstId(id)
+    const resource_category = data.find(d => d.id === id)?.resource_category
+    setSecondId(resource_category?.[0]?.id)
   }
 
   Taro.useLoad(getData)
 
+  useEffect(() => {
+    if (secondId) {
+      Taro.showLoading({title: '加载中'})
+      illnessApi.list(secondId, 1, 100).then(res => {
+        const data = []
+        res.list.forEach(d => {
+          data.push(...d.articles as [])
+        })
+        setList(data)
+      }).finally(() => {
+        Taro.hideLoading()
+      }).catch(() => {
+        setList([])
+      })
+    }
+  }, [secondId])
+
   return (
-    
-      
-        {
-          data.map(d =>  setSelect(`${prefix}-${d.id}`)}
-            className={`${select === `${prefix}-${d.id}` && styles.select}`}>
-            {d.name}
-          )
-        }
-      
+    
+      
+         Taro.navigateBack()}/>
+         firstIdChange(data.tab?.value as number)}/>
+      
+      
+      
+        
+          {
+            data.find(d => d.id === firstId)?.resource_category?.map(d =>  setSecondId(d.id)}
+              className={secondId === d.id && styles.select}>
+              {d.name}
+            )
+          }
+        
 
-      
-        {
-          data.map(d => 
-              {d.name}
-              
-                {
-                  d.resource_category?.map(c =>  jump(c.id)}
-                    key={d.id}
-                    className={styles.secondary}>
-                    {c.name}
-                  )
-                }
-              
-            
-          )
-        }
-      
+        
+          {
+            list.length ?
+              list.map(d =>  jump(d.id)}>{d.title})
+              : 
+          }
+        
+      
     
   )
 }
diff --git a/src/static/img/leftArrow.png b/src/static/img/leftArrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c3ceda542d53a8340edb5998173c53bf6d68fd4
GIT binary patch
literal 406
zcmV;H0crk;P)Px$P)S5VR9HvN*Ue6ZFc1fDhrWWZpy5NG!M*5u_Bl1af$^e7j~pNv4jlKqhQubc
zW184xV}MRehm~uS{(nqiVBjS3mFIbpB*}x>R%^Yfs%keE0WtGUH~>5Yz^U0+DRo!Z
z_2VjlG)*ss5KlH75#Rg1-*jE~%?=m||BzB%w{5$3Re13cED1NbMS!ugODS(CcWx^a
z4EP(awSH4dZJVa~a+UpXJqQphJm?5whI<2IhkF4y!pQ)xa1wws+zH?gp9PFGnb%<$
zZhhZ#S5KJi14U6Z0B~+LK*Sdz#I`KU-nF6c`W)aB0M35D>p@+Pf|&%YasL1NA++V=
zt_100#EBpQOf|R=WB?b!3&4T!2E;}L0b(M80b>X=3#|52I@Ko-kvtPPJ0Yc)PgH`8
zSabx3z@v_47IM_#)FQGhyAVR$BO)N;m1{iz0S~HhFsdI)hyVZp07*qoM6N<$f_zq{
AtN;K2

literal 0
HcmV?d00001

diff --git a/types/home.d.ts b/types/home.d.ts
index 8a43aaf..badd229 100644
--- a/types/home.d.ts
+++ b/types/home.d.ts
@@ -25,6 +25,7 @@ interface Resource {
 interface Kill {
   id: number
   resource: Resource
+  introduction:string
   title: string
   url_path: string
 }

From 53a6a6f92624a2b16e82d5ef3b0229afa914f1be Mon Sep 17 00:00:00 2001
From: sunlizhou <296190577@qq.com>
Date: Fri, 25 Aug 2023 09:54:09 +0800
Subject: [PATCH 04/48] =?UTF-8?q?=E5=93=81=E7=89=8C=E5=88=97=E8=A1=A8?=
 =?UTF-8?q?=E5=88=86=E9=A1=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/pages/preview/brand/list/list.tsx | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/pages/preview/brand/list/list.tsx b/src/pages/preview/brand/list/list.tsx
index 474d4ff..25ca4c8 100644
--- a/src/pages/preview/brand/list/list.tsx
+++ b/src/pages/preview/brand/list/list.tsx
@@ -16,9 +16,10 @@ const BrandList: FC = () => {
 
   const getData = useCallback(async () => {
     try {
-      const res = await brandApi.list(1, 10)
+      const res = await brandApi.list(page, 10)
       setTotal(res.total)
       setBrands([
+        ...brands,
         ...res.list
       ])
     } catch (e) {

From 6df5276b39de32596b594792143a3ef38ffe7384 Mon Sep 17 00:00:00 2001
From: king <2229249788@qq.com>
Date: Fri, 25 Aug 2023 10:14:20 +0800
Subject: [PATCH 05/48] bug

---
 .env                           |    4 +-
 src/pages/check/check.tsx      |    2 +-
 src/utils/marked/marked.esm.js | 2666 ++++++++++++++++++++++++++++++++
 src/utils/marked/marked.ts     |    3 +-
 src/utils/marked/utils.ts      |    2 +-
 5 files changed, 2672 insertions(+), 5 deletions(-)
 create mode 100644 src/utils/marked/marked.esm.js

diff --git a/.env b/.env
index ae7ac6e..a11710a 100644
--- a/.env
+++ b/.env
@@ -1,5 +1,5 @@
-TARO_APP_API=https://yjx.dev.yaojiankang.top
-#TARO_APP_API=https://mooc.yaojiankang.top
+#TARO_APP_API=https://yjx.dev.yaojiankang.top
+TARO_APP_API=https://mooc.yaojiankang.top
 #TARO_APP_API=https://shopfix.yaojiankang.top
 #TARO_APP_API=https://playedu.yaojiankang.top
 TARO_APP_LGOIN=true
diff --git a/src/pages/check/check.tsx b/src/pages/check/check.tsx
index b461897..da26136 100644
--- a/src/pages/check/check.tsx
+++ b/src/pages/check/check.tsx
@@ -50,7 +50,7 @@ const Bing: FC = () => {
         setCompany(res.company)
         setUser(res.user)
         setToken(res.token)
-        Taro.switchTab({url: '/pages/index/index'})
+        Taro.switchTab({url: '/pages/home/home'})
       }
     } catch (e) {
     }
diff --git a/src/utils/marked/marked.esm.js b/src/utils/marked/marked.esm.js
new file mode 100644
index 0000000..37a761c
--- /dev/null
+++ b/src/utils/marked/marked.esm.js
@@ -0,0 +1,2666 @@
+/**
+ * marked v7.0.4 - a markdown parser
+ * Copyright (c) 2011-2023, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/markedjs/marked
+ */
+
+/**
+ * DO NOT EDIT THIS FILE
+ * The code in this file is generated from files in ./src/
+ */
+
+/**
+ * Gets the original marked default options.
+ */
+function _getDefaults() {
+    return {
+        async: false,
+        baseUrl: null,
+        breaks: false,
+        extensions: null,
+        gfm: true,
+        headerIds: false,
+        headerPrefix: '',
+        highlight: null,
+        hooks: null,
+        langPrefix: 'language-',
+        mangle: false,
+        pedantic: false,
+        renderer: null,
+        sanitize: false,
+        sanitizer: null,
+        silent: false,
+        smartypants: false,
+        tokenizer: null,
+        walkTokens: null,
+        xhtml: false
+    };
+}
+let _defaults = _getDefaults();
+function changeDefaults(newDefaults) {
+    _defaults = newDefaults;
+}
+
+/**
+ * Helpers
+ */
+const escapeTest = /[&<>"']/;
+const escapeReplace = new RegExp(escapeTest.source, 'g');
+const escapeTestNoEncode = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/;
+const escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');
+const escapeReplacements = {
+    '&': '&',
+    '<': '<',
+    '>': '>',
+    '"': '"',
+    "'": '''
+};
+const getEscapeReplacement = (ch) => escapeReplacements[ch];
+function escape(html, encode) {
+    if (encode) {
+        if (escapeTest.test(html)) {
+            return html.replace(escapeReplace, getEscapeReplacement);
+        }
+    }
+    else {
+        if (escapeTestNoEncode.test(html)) {
+            return html.replace(escapeReplaceNoEncode, getEscapeReplacement);
+        }
+    }
+    return html;
+}
+const unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
+function unescape(html) {
+    // explicitly match decimal, hex, and named HTML entities
+    return html.replace(unescapeTest, (_, n) => {
+        n = n.toLowerCase();
+        if (n === 'colon')
+            return ':';
+        if (n.charAt(0) === '#') {
+            return n.charAt(1) === 'x'
+                ? String.fromCharCode(parseInt(n.substring(2), 16))
+                : String.fromCharCode(+n.substring(1));
+        }
+        return '';
+    });
+}
+const caret = /(^|[^\[])\^/g;
+function edit(regex, opt) {
+    regex = typeof regex === 'string' ? regex : regex.source;
+    opt = opt || '';
+    const obj = {
+        replace: (name, val) => {
+            val = typeof val === 'object' && 'source' in val ? val.source : val;
+            val = val.replace(caret, '$1');
+            regex = regex.replace(name, val);
+            return obj;
+        },
+        getRegex: () => {
+            return new RegExp(regex, opt);
+        }
+    };
+    return obj;
+}
+const nonWordAndColonTest = /[^\w:]/g;
+const originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
+function cleanUrl(sanitize, base, href) {
+    if (sanitize) {
+        let prot;
+        try {
+            prot = decodeURIComponent(unescape(href))
+                .replace(nonWordAndColonTest, '')
+                .toLowerCase();
+        }
+        catch (e) {
+            return null;
+        }
+        if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
+            return null;
+        }
+    }
+    if (base && !originIndependentUrl.test(href)) {
+        href = resolveUrl(base, href);
+    }
+    try {
+        href = encodeURI(href).replace(/%25/g, '%');
+    }
+    catch (e) {
+        return null;
+    }
+    return href;
+}
+const baseUrls = {};
+const justDomain = /^[^:]+:\/*[^/]*$/;
+const protocol = /^([^:]+:)[\s\S]*$/;
+const domain = /^([^:]+:\/*[^/]*)[\s\S]*$/;
+function resolveUrl(base, href) {
+    if (!baseUrls[' ' + base]) {
+        // we can ignore everything in base after the last slash of its path component,
+        // but we might need to add _that_
+        // https://tools.ietf.org/html/rfc3986#section-3
+        if (justDomain.test(base)) {
+            baseUrls[' ' + base] = base + '/';
+        }
+        else {
+            baseUrls[' ' + base] = rtrim(base, '/', true);
+        }
+    }
+    base = baseUrls[' ' + base];
+    const relativeBase = base.indexOf(':') === -1;
+    if (href.substring(0, 2) === '//') {
+        if (relativeBase) {
+            return href;
+        }
+        return base.replace(protocol, '$1') + href;
+    }
+    else if (href.charAt(0) === '/') {
+        if (relativeBase) {
+            return href;
+        }
+        return base.replace(domain, '$1') + href;
+    }
+    else {
+        return base + href;
+    }
+}
+const noopTest = { exec: () => null };
+function splitCells(tableRow, count) {
+    // ensure that every cell-delimiting pipe has a space
+    // before it to distinguish it from an escaped pipe
+    const row = tableRow.replace(/\|/g, (match, offset, str) => {
+        let escaped = false;
+        let curr = offset;
+        while (--curr >= 0 && str[curr] === '\\')
+            escaped = !escaped;
+        if (escaped) {
+            // odd number of slashes means | is escaped
+            // so we leave it alone
+            return '|';
+        }
+        else {
+            // add space before unescaped |
+            return ' |';
+        }
+    }), cells = row.split(/ \|/);
+    let i = 0;
+    // First/last cell in a row cannot be empty if it has no leading/trailing pipe
+    if (!cells[0].trim()) {
+        cells.shift();
+    }
+    if (cells.length > 0 && !cells[cells.length - 1].trim()) {
+        cells.pop();
+    }
+    if (count) {
+        if (cells.length > count) {
+            cells.splice(count);
+        }
+        else {
+            while (cells.length < count)
+                cells.push('');
+        }
+    }
+    for (; i < cells.length; i++) {
+        // leading or trailing whitespace is ignored per the gfm spec
+        cells[i] = cells[i].trim().replace(/\\\|/g, '|');
+    }
+    return cells;
+}
+/**
+ * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
+ * /c*$/ is vulnerable to REDOS.
+ *
+ * @param str
+ * @param c
+ * @param invert Remove suffix of non-c chars instead. Default falsey.
+ */
+function rtrim(str, c, invert) {
+    const l = str.length;
+    if (l === 0) {
+        return '';
+    }
+    // Length of suffix matching the invert condition.
+    let suffLen = 0;
+    // Step left until we fail to match the invert condition.
+    while (suffLen < l) {
+        const currChar = str.charAt(l - suffLen - 1);
+        if (currChar === c && !invert) {
+            suffLen++;
+        }
+        else if (currChar !== c && invert) {
+            suffLen++;
+        }
+        else {
+            break;
+        }
+    }
+    return str.slice(0, l - suffLen);
+}
+function findClosingBracket(str, b) {
+    if (str.indexOf(b[1]) === -1) {
+        return -1;
+    }
+    let level = 0;
+    for (let i = 0; i < str.length; i++) {
+        if (str[i] === '\\') {
+            i++;
+        }
+        else if (str[i] === b[0]) {
+            level++;
+        }
+        else if (str[i] === b[1]) {
+            level--;
+            if (level < 0) {
+                return i;
+            }
+        }
+    }
+    return -1;
+}
+function checkDeprecations(opt, callback) {
+    if (!opt || opt.silent) {
+        return;
+    }
+    if (callback) {
+        console.warn('marked(): callback is deprecated since version 5.0.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/using_pro#async');
+    }
+    if (opt.sanitize || opt.sanitizer) {
+        console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');
+    }
+    if (opt.highlight || opt.langPrefix !== 'language-') {
+        console.warn('marked(): highlight and langPrefix parameters are deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-highlight.');
+    }
+    if (opt.mangle) {
+        console.warn('marked(): mangle parameter is enabled by default, but is deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install https://www.npmjs.com/package/marked-mangle, or disable by setting `{mangle: false}`.');
+    }
+    if (opt.baseUrl) {
+        console.warn('marked(): baseUrl parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-base-url.');
+    }
+    if (opt.smartypants) {
+        console.warn('marked(): smartypants parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-smartypants.');
+    }
+    if (opt.xhtml) {
+        console.warn('marked(): xhtml parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-xhtml.');
+    }
+    if (opt.headerIds || opt.headerPrefix) {
+        console.warn('marked(): headerIds and headerPrefix parameters enabled by default, but are deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install  https://www.npmjs.com/package/marked-gfm-heading-id, or disable by setting `{headerIds: false}`.');
+    }
+}
+
+function outputLink(cap, link, raw, lexer) {
+    const href = link.href;
+    const title = link.title ? escape(link.title) : null;
+    const text = cap[1].replace(/\\([\[\]])/g, '$1');
+    if (cap[0].charAt(0) !== '!') {
+        lexer.state.inLink = true;
+        const token = {
+            type: 'link',
+            raw,
+            href,
+            title,
+            text,
+            tokens: lexer.inlineTokens(text)
+        };
+        lexer.state.inLink = false;
+        return token;
+    }
+    return {
+        type: 'image',
+        raw,
+        href,
+        title,
+        text: escape(text)
+    };
+}
+function indentCodeCompensation(raw, text) {
+    const matchIndentToCode = raw.match(/^(\s+)(?:```)/);
+    if (matchIndentToCode === null) {
+        return text;
+    }
+    const indentToCode = matchIndentToCode[1];
+    return text
+        .split('\n')
+        .map(node => {
+        const matchIndentInNode = node.match(/^\s+/);
+        if (matchIndentInNode === null) {
+            return node;
+        }
+        const [indentInNode] = matchIndentInNode;
+        if (indentInNode.length >= indentToCode.length) {
+            return node.slice(indentToCode.length);
+        }
+        return node;
+    })
+        .join('\n');
+}
+/**
+ * Tokenizer
+ */
+class _Tokenizer {
+    options;
+    // TODO: Fix this rules type
+    rules;
+    lexer;
+    constructor(options) {
+        this.options = options || _defaults;
+    }
+    space(src) {
+        const cap = this.rules.block.newline.exec(src);
+        if (cap && cap[0].length > 0) {
+            return {
+                type: 'space',
+                raw: cap[0]
+            };
+        }
+    }
+    code(src) {
+        const cap = this.rules.block.code.exec(src);
+        if (cap) {
+            const text = cap[0].replace(/^ {1,4}/gm, '');
+            return {
+                type: 'code',
+                raw: cap[0],
+                codeBlockStyle: 'indented',
+                text: !this.options.pedantic
+                    ? rtrim(text, '\n')
+                    : text
+            };
+        }
+    }
+    fences(src) {
+        const cap = this.rules.block.fences.exec(src);
+        if (cap) {
+            const raw = cap[0];
+            const text = indentCodeCompensation(raw, cap[3] || '');
+            return {
+                type: 'code',
+                raw,
+                lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, '$1') : cap[2],
+                text
+            };
+        }
+    }
+    heading(src) {
+        const cap = this.rules.block.heading.exec(src);
+        if (cap) {
+            let text = cap[2].trim();
+            // remove trailing #s
+            if (/#$/.test(text)) {
+                const trimmed = rtrim(text, '#');
+                if (this.options.pedantic) {
+                    text = trimmed.trim();
+                }
+                else if (!trimmed || / $/.test(trimmed)) {
+                    // CommonMark requires space before trailing #s
+                    text = trimmed.trim();
+                }
+            }
+            return {
+                type: 'heading',
+                raw: cap[0],
+                depth: cap[1].length,
+                text,
+                tokens: this.lexer.inline(text)
+            };
+        }
+    }
+    hr(src) {
+        const cap = this.rules.block.hr.exec(src);
+        if (cap) {
+            return {
+                type: 'hr',
+                raw: cap[0]
+            };
+        }
+    }
+    blockquote(src) {
+        const cap = this.rules.block.blockquote.exec(src);
+        if (cap) {
+            const text = cap[0].replace(/^ *>[ \t]?/gm, '');
+            const top = this.lexer.state.top;
+            this.lexer.state.top = true;
+            const tokens = this.lexer.blockTokens(text);
+            this.lexer.state.top = top;
+            return {
+                type: 'blockquote',
+                raw: cap[0],
+                tokens,
+                text
+            };
+        }
+    }
+    list(src) {
+        let cap = this.rules.block.list.exec(src);
+        if (cap) {
+            let bull = cap[1].trim();
+            const isordered = bull.length > 1;
+            const list = {
+                type: 'list',
+                raw: '',
+                ordered: isordered,
+                start: isordered ? +bull.slice(0, -1) : '',
+                loose: false,
+                items: []
+            };
+            bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`;
+            if (this.options.pedantic) {
+                bull = isordered ? bull : '[*+-]';
+            }
+            // Get next list item
+            const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\t ][^\\n]*)?(?:\\n|$))`);
+            let raw = '';
+            let itemContents = '';
+            let endsWithBlankLine = false;
+            // Check if current bullet point can start a new List Item
+            while (src) {
+                let endEarly = false;
+                if (!(cap = itemRegex.exec(src))) {
+                    break;
+                }
+                if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)
+                    break;
+                }
+                raw = cap[0];
+                src = src.substring(raw.length);
+                let line = cap[2].split('\n', 1)[0].replace(/^\t+/, (t) => ' '.repeat(3 * t.length));
+                let nextLine = src.split('\n', 1)[0];
+                let indent = 0;
+                if (this.options.pedantic) {
+                    indent = 2;
+                    itemContents = line.trimLeft();
+                }
+                else {
+                    indent = cap[2].search(/[^ ]/); // Find first non-space char
+                    indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent
+                    itemContents = line.slice(indent);
+                    indent += cap[1].length;
+                }
+                let blankLine = false;
+                if (!line && /^ *$/.test(nextLine)) { // Items begin with at most one blank line
+                    raw += nextLine + '\n';
+                    src = src.substring(nextLine.length + 1);
+                    endEarly = true;
+                }
+                if (!endEarly) {
+                    const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`);
+                    const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`);
+                    const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\`\`\`|~~~)`);
+                    const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);
+                    // Check if following lines should be included in List Item
+                    while (src) {
+                        const rawLine = src.split('\n', 1)[0];
+                        nextLine = rawLine;
+                        // Re-align to follow commonmark nesting rules
+                        if (this.options.pedantic) {
+                            nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, '  ');
+                        }
+                        // End list item if found code fences
+                        if (fencesBeginRegex.test(nextLine)) {
+                            break;
+                        }
+                        // End list item if found start of new heading
+                        if (headingBeginRegex.test(nextLine)) {
+                            break;
+                        }
+                        // End list item if found start of new bullet
+                        if (nextBulletRegex.test(nextLine)) {
+                            break;
+                        }
+                        // Horizontal rule found
+                        if (hrRegex.test(src)) {
+                            break;
+                        }
+                        if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible
+                            itemContents += '\n' + nextLine.slice(indent);
+                        }
+                        else {
+                            // not enough indentation
+                            if (blankLine) {
+                                break;
+                            }
+                            // paragraph continuation unless last line was a different block level element
+                            if (line.search(/[^ ]/) >= 4) { // indented code block
+                                break;
+                            }
+                            if (fencesBeginRegex.test(line)) {
+                                break;
+                            }
+                            if (headingBeginRegex.test(line)) {
+                                break;
+                            }
+                            if (hrRegex.test(line)) {
+                                break;
+                            }
+                            itemContents += '\n' + nextLine;
+                        }
+                        if (!blankLine && !nextLine.trim()) { // Check if current line is blank
+                            blankLine = true;
+                        }
+                        raw += rawLine + '\n';
+                        src = src.substring(rawLine.length + 1);
+                        line = nextLine.slice(indent);
+                    }
+                }
+                if (!list.loose) {
+                    // If the previous item ended with a blank line, the list is loose
+                    if (endsWithBlankLine) {
+                        list.loose = true;
+                    }
+                    else if (/\n *\n *$/.test(raw)) {
+                        endsWithBlankLine = true;
+                    }
+                }
+                let istask = null;
+                let ischecked;
+                // Check for task list items
+                if (this.options.gfm) {
+                    istask = /^\[[ xX]\] /.exec(itemContents);
+                    if (istask) {
+                        ischecked = istask[0] !== '[ ] ';
+                        itemContents = itemContents.replace(/^\[[ xX]\] +/, '');
+                    }
+                }
+                list.items.push({
+                    type: 'list_item',
+                    raw,
+                    task: !!istask,
+                    checked: ischecked,
+                    loose: false,
+                    text: itemContents,
+                    tokens: []
+                });
+                list.raw += raw;
+            }
+            // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic
+            list.items[list.items.length - 1].raw = raw.trimRight();
+            list.items[list.items.length - 1].text = itemContents.trimRight();
+            list.raw = list.raw.trimRight();
+            // Item child tokens handled here at end because we needed to have the final item to trim it first
+            for (let i = 0; i < list.items.length; i++) {
+                this.lexer.state.top = false;
+                list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);
+                if (!list.loose) {
+                    // Check if list should be loose
+                    const spacers = list.items[i].tokens.filter(t => t.type === 'space');
+                    const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\n.*\n/.test(t.raw));
+                    list.loose = hasMultipleLineBreaks;
+                }
+            }
+            // Set all items to loose if list is loose
+            if (list.loose) {
+                for (let i = 0; i < list.items.length; i++) {
+                    list.items[i].loose = true;
+                }
+            }
+            return list;
+        }
+    }
+    html(src) {
+        const cap = this.rules.block.html.exec(src);
+        if (cap) {
+            const token = {
+                type: 'html',
+                block: true,
+                raw: cap[0],
+                pre: !this.options.sanitizer
+                    && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
+                text: cap[0]
+            };
+            if (this.options.sanitize) {
+                const text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]);
+                const paragraph = token;
+                paragraph.type = 'paragraph';
+                paragraph.text = text;
+                paragraph.tokens = this.lexer.inline(text);
+            }
+            return token;
+        }
+    }
+    def(src) {
+        const cap = this.rules.block.def.exec(src);
+        if (cap) {
+            const tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
+            const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline._escapes, '$1') : '';
+            const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, '$1') : cap[3];
+            return {
+                type: 'def',
+                tag,
+                raw: cap[0],
+                href,
+                title
+            };
+        }
+    }
+    table(src) {
+        const cap = this.rules.block.table.exec(src);
+        if (cap) {
+            const item = {
+                type: 'table',
+                raw: cap[0],
+                header: splitCells(cap[1]).map(c => {
+                    return { text: c, tokens: [] };
+                }),
+                align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+                rows: cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, '').split('\n') : []
+            };
+            if (item.header.length === item.align.length) {
+                let l = item.align.length;
+                let i, j, k, row;
+                for (i = 0; i < l; i++) {
+                    const align = item.align[i];
+                    if (align) {
+                        if (/^ *-+: *$/.test(align)) {
+                            item.align[i] = 'right';
+                        }
+                        else if (/^ *:-+: *$/.test(align)) {
+                            item.align[i] = 'center';
+                        }
+                        else if (/^ *:-+ *$/.test(align)) {
+                            item.align[i] = 'left';
+                        }
+                        else {
+                            item.align[i] = null;
+                        }
+                    }
+                }
+                l = item.rows.length;
+                for (i = 0; i < l; i++) {
+                    item.rows[i] = splitCells(item.rows[i], item.header.length).map(c => {
+                        return { text: c, tokens: [] };
+                    });
+                }
+                // parse child tokens inside headers and cells
+                // header child tokens
+                l = item.header.length;
+                for (j = 0; j < l; j++) {
+                    item.header[j].tokens = this.lexer.inline(item.header[j].text);
+                }
+                // cell child tokens
+                l = item.rows.length;
+                for (j = 0; j < l; j++) {
+                    row = item.rows[j];
+                    for (k = 0; k < row.length; k++) {
+                        row[k].tokens = this.lexer.inline(row[k].text);
+                    }
+                }
+                return item;
+            }
+        }
+    }
+    lheading(src) {
+        const cap = this.rules.block.lheading.exec(src);
+        if (cap) {
+            return {
+                type: 'heading',
+                raw: cap[0],
+                depth: cap[2].charAt(0) === '=' ? 1 : 2,
+                text: cap[1],
+                tokens: this.lexer.inline(cap[1])
+            };
+        }
+    }
+    paragraph(src) {
+        const cap = this.rules.block.paragraph.exec(src);
+        if (cap) {
+            const text = cap[1].charAt(cap[1].length - 1) === '\n'
+                ? cap[1].slice(0, -1)
+                : cap[1];
+            return {
+                type: 'paragraph',
+                raw: cap[0],
+                text,
+                tokens: this.lexer.inline(text)
+            };
+        }
+    }
+    text(src) {
+        const cap = this.rules.block.text.exec(src);
+        if (cap) {
+            return {
+                type: 'text',
+                raw: cap[0],
+                text: cap[0],
+                tokens: this.lexer.inline(cap[0])
+            };
+        }
+    }
+    escape(src) {
+        const cap = this.rules.inline.escape.exec(src);
+        if (cap) {
+            return {
+                type: 'escape',
+                raw: cap[0],
+                text: escape(cap[1])
+            };
+        }
+    }
+    tag(src) {
+        const cap = this.rules.inline.tag.exec(src);
+        if (cap) {
+            if (!this.lexer.state.inLink && /^/i.test(cap[0])) {
+                this.lexer.state.inLink = false;
+            }
+            if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
+                this.lexer.state.inRawBlock = true;
+            }
+            else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
+                this.lexer.state.inRawBlock = false;
+            }
+            return {
+                type: this.options.sanitize
+                    ? 'text'
+                    : 'html',
+                raw: cap[0],
+                inLink: this.lexer.state.inLink,
+                inRawBlock: this.lexer.state.inRawBlock,
+                block: false,
+                text: this.options.sanitize
+                    ? (this.options.sanitizer
+                        ? this.options.sanitizer(cap[0])
+                        : escape(cap[0]))
+                    : cap[0]
+            };
+        }
+    }
+    link(src) {
+        const cap = this.rules.inline.link.exec(src);
+        if (cap) {
+            const trimmedUrl = cap[2].trim();
+            if (!this.options.pedantic && /^$/.test(trimmedUrl))) {
+                    return;
+                }
+                // ending angle bracket cannot be escaped
+                const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\');
+                if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
+                    return;
+                }
+            }
+            else {
+                // find closing parenthesis
+                const lastParenIndex = findClosingBracket(cap[2], '()');
+                if (lastParenIndex > -1) {
+                    const start = cap[0].indexOf('!') === 0 ? 5 : 4;
+                    const linkLen = start + cap[1].length + lastParenIndex;
+                    cap[2] = cap[2].substring(0, lastParenIndex);
+                    cap[0] = cap[0].substring(0, linkLen).trim();
+                    cap[3] = '';
+                }
+            }
+            let href = cap[2];
+            let title = '';
+            if (this.options.pedantic) {
+                // split pedantic href and title
+                const link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
+                if (link) {
+                    href = link[1];
+                    title = link[3];
+                }
+            }
+            else {
+                title = cap[3] ? cap[3].slice(1, -1) : '';
+            }
+            href = href.trim();
+            if (/^$/.test(trimmedUrl))) {
+                    // pedantic allows starting angle bracket without ending angle bracket
+                    href = href.slice(1);
+                }
+                else {
+                    href = href.slice(1, -1);
+                }
+            }
+            return outputLink(cap, {
+                href: href ? href.replace(this.rules.inline._escapes, '$1') : href,
+                title: title ? title.replace(this.rules.inline._escapes, '$1') : title
+            }, cap[0], this.lexer);
+        }
+    }
+    reflink(src, links) {
+        let cap;
+        if ((cap = this.rules.inline.reflink.exec(src))
+            || (cap = this.rules.inline.nolink.exec(src))) {
+            let link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
+            link = links[link.toLowerCase()];
+            if (!link) {
+                const text = cap[0].charAt(0);
+                return {
+                    type: 'text',
+                    raw: text,
+                    text
+                };
+            }
+            return outputLink(cap, link, cap[0], this.lexer);
+        }
+    }
+    emStrong(src, maskedSrc, prevChar = '') {
+        let match = this.rules.inline.emStrong.lDelim.exec(src);
+        if (!match)
+            return;
+        // _ can't be between two alphanumerics. \p{L}\p{N} includes non-english alphabet/numbers as well
+        if (match[3] && prevChar.match(/[\p{L}\p{N}]/u))
+            return;
+        const nextChar = match[1] || match[2] || '';
+        if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {
+            // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)
+            const lLength = [...match[0]].length - 1;
+            let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;
+            const endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;
+            endReg.lastIndex = 0;
+            // Clip maskedSrc to same section of string as src (move to lexer?)
+            maskedSrc = maskedSrc.slice(-1 * src.length + lLength);
+            while ((match = endReg.exec(maskedSrc)) != null) {
+                rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
+                if (!rDelim)
+                    continue; // skip single * in __abc*abc__
+                rLength = [...rDelim].length;
+                if (match[3] || match[4]) { // found another Left Delim
+                    delimTotal += rLength;
+                    continue;
+                }
+                else if (match[5] || match[6]) { // either Left or Right Delim
+                    if (lLength % 3 && !((lLength + rLength) % 3)) {
+                        midDelimTotal += rLength;
+                        continue; // CommonMark Emphasis Rules 9-10
+                    }
+                }
+                delimTotal -= rLength;
+                if (delimTotal > 0)
+                    continue; // Haven't found enough closing delimiters
+                // Remove extra characters. *a*** -> *a*
+                rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
+                const raw = [...src].slice(0, lLength + match.index + rLength + 1).join('');
+                // Create `em` if smallest delimiter has odd char count. *a***
+                if (Math.min(lLength, rLength) % 2) {
+                    const text = raw.slice(1, -1);
+                    return {
+                        type: 'em',
+                        raw,
+                        text,
+                        tokens: this.lexer.inlineTokens(text)
+                    };
+                }
+                // Create 'strong' if smallest delimiter has even char count. **a***
+                const text = raw.slice(2, -2);
+                return {
+                    type: 'strong',
+                    raw,
+                    text,
+                    tokens: this.lexer.inlineTokens(text)
+                };
+            }
+        }
+    }
+    codespan(src) {
+        const cap = this.rules.inline.code.exec(src);
+        if (cap) {
+            let text = cap[2].replace(/\n/g, ' ');
+            const hasNonSpaceChars = /[^ ]/.test(text);
+            const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);
+            if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
+                text = text.substring(1, text.length - 1);
+            }
+            text = escape(text, true);
+            return {
+                type: 'codespan',
+                raw: cap[0],
+                text
+            };
+        }
+    }
+    br(src) {
+        const cap = this.rules.inline.br.exec(src);
+        if (cap) {
+            return {
+                type: 'br',
+                raw: cap[0]
+            };
+        }
+    }
+    del(src) {
+        const cap = this.rules.inline.del.exec(src);
+        if (cap) {
+            return {
+                type: 'del',
+                raw: cap[0],
+                text: cap[2],
+                tokens: this.lexer.inlineTokens(cap[2])
+            };
+        }
+    }
+    autolink(src, mangle) {
+        const cap = this.rules.inline.autolink.exec(src);
+        if (cap) {
+            let text, href;
+            if (cap[2] === '@') {
+                text = escape(this.options.mangle ? mangle(cap[1]) : cap[1]);
+                href = 'mailto:' + text;
+            }
+            else {
+                text = escape(cap[1]);
+                href = text;
+            }
+            return {
+                type: 'link',
+                raw: cap[0],
+                text,
+                href,
+                tokens: [
+                    {
+                        type: 'text',
+                        raw: text,
+                        text
+                    }
+                ]
+            };
+        }
+    }
+    url(src, mangle) {
+        let cap;
+        if (cap = this.rules.inline.url.exec(src)) {
+            let text, href;
+            if (cap[2] === '@') {
+                text = escape(this.options.mangle ? mangle(cap[0]) : cap[0]);
+                href = 'mailto:' + text;
+            }
+            else {
+                // do extended autolink path validation
+                let prevCapZero;
+                do {
+                    prevCapZero = cap[0];
+                    cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];
+                } while (prevCapZero !== cap[0]);
+                text = escape(cap[0]);
+                if (cap[1] === 'www.') {
+                    href = 'http://' + cap[0];
+                }
+                else {
+                    href = cap[0];
+                }
+            }
+            return {
+                type: 'link',
+                raw: cap[0],
+                text,
+                href,
+                tokens: [
+                    {
+                        type: 'text',
+                        raw: text,
+                        text
+                    }
+                ]
+            };
+        }
+    }
+    inlineText(src, smartypants) {
+        const cap = this.rules.inline.text.exec(src);
+        if (cap) {
+            let text;
+            if (this.lexer.state.inRawBlock) {
+                text = this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0];
+            }
+            else {
+                text = escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]);
+            }
+            return {
+                type: 'text',
+                raw: cap[0],
+                text
+            };
+        }
+    }
+}
+
+/**
+ * Block-Level Grammar
+ */
+// Not all rules are defined in the object literal
+// @ts-expect-error
+const block = {
+    newline: /^(?: *(?:\n|$))+/,
+    code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
+    fences: /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,
+    hr: /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,
+    heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,
+    blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
+    list: /^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,
+    html: '^ {0,3}(?:' // optional indentation
+        + '<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)' // (1)
+        + '|comment[^\\n]*(\\n+|$)' // (2)
+        + '|<\\?[\\s\\S]*?(?:\\?>\\n*|$)' // (3)
+        + '|\\n*|$)' // (4)
+        + '|\\n*|$)' // (5)
+        + '|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (6)
+        + '|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) open tag
+        + '|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag
+        + ')',
+    def: /^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,
+    table: noopTest,
+    lheading: /^((?:(?!^bull ).|\n(?!\n|bull ))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
+    // regex template, placeholders will be replaced according to different paragraph
+    // interruption rules of commonmark and the original markdown spec:
+    _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,
+    text: /^[^\n]+/
+};
+block._label = /(?!\s*\])(?:\\.|[^\[\]\\])+/;
+block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
+block.def = edit(block.def)
+    .replace('label', block._label)
+    .replace('title', block._title)
+    .getRegex();
+block.bullet = /(?:[*+-]|\d{1,9}[.)])/;
+block.listItemStart = edit(/^( *)(bull) */)
+    .replace('bull', block.bullet)
+    .getRegex();
+block.list = edit(block.list)
+    .replace(/bull/g, block.bullet)
+    .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
+    .replace('def', '\\n+(?=' + block.def.source + ')')
+    .getRegex();
+block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
+    + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
+    + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
+    + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
+    + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
+    + '|track|ul';
+block._comment = /|$)/;
+block.html = edit(block.html, 'i')
+    .replace('comment', block._comment)
+    .replace('tag', block._tag)
+    .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
+    .getRegex();
+block.lheading = edit(block.lheading)
+    .replace(/bull/g, block.bullet) // lists can interrupt
+    .getRegex();
+block.paragraph = edit(block._paragraph)
+    .replace('hr', block.hr)
+    .replace('heading', ' {0,3}#{1,6} ')
+    .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs
+    .replace('|table', '')
+    .replace('blockquote', ' {0,3}>')
+    .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n')
+    .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
+    .replace('html', ')|<(?:script|pre|style|textarea|!--)')
+    .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
+    .getRegex();
+block.blockquote = edit(block.blockquote)
+    .replace('paragraph', block.paragraph)
+    .getRegex();
+/**
+ * Normal Block Grammar
+ */
+block.normal = { ...block };
+/**
+ * GFM Block Grammar
+ */
+block.gfm = {
+    ...block.normal,
+    table: '^ *([^\\n ].*\\|.*)\\n' // Header
+        + ' {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?' // Align
+        + '(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells
+};
+block.gfm.table = edit(block.gfm.table)
+    .replace('hr', block.hr)
+    .replace('heading', ' {0,3}#{1,6} ')
+    .replace('blockquote', ' {0,3}>')
+    .replace('code', ' {4}[^\\n]')
+    .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n')
+    .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
+    .replace('html', ')|<(?:script|pre|style|textarea|!--)')
+    .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks
+    .getRegex();
+block.gfm.paragraph = edit(block._paragraph)
+    .replace('hr', block.hr)
+    .replace('heading', ' {0,3}#{1,6} ')
+    .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs
+    .replace('table', block.gfm.table) // interrupt paragraphs with table
+    .replace('blockquote', ' {0,3}>')
+    .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n')
+    .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
+    .replace('html', ')|<(?:script|pre|style|textarea|!--)')
+    .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
+    .getRegex();
+/**
+ * Pedantic grammar (original John Gruber's loose markdown specification)
+ */
+block.pedantic = {
+    ...block.normal,
+    html: edit('^ *(?:comment *(?:\\n|\\s*$)'
+        + '|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)' // closed tag
+        + '|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
+        .replace('comment', block._comment)
+        .replace(/tag/g, '(?!(?:'
+        + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
+        + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
+        + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
+        .getRegex(),
+    def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
+    heading: /^(#{1,6})(.*)(?:\n+|$)/,
+    fences: noopTest,
+    lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
+    paragraph: edit(block.normal._paragraph)
+        .replace('hr', block.hr)
+        .replace('heading', ' *#{1,6} *[^\n]')
+        .replace('lheading', block.lheading)
+        .replace('blockquote', ' {0,3}>')
+        .replace('|fences', '')
+        .replace('|list', '')
+        .replace('|html', '')
+        .getRegex()
+};
+/**
+ * Inline-Level Grammar
+ */
+// Not all rules are defined in the object literal
+// @ts-expect-error
+const inline = {
+    escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
+    autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
+    url: noopTest,
+    tag: '^comment'
+        + '|^' // self-closing tag
+        + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
+        + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. 
+        + '|^' // declaration, e.g. 
+        + '|^',
+    link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,
+    reflink: /^!?\[(label)\]\[(ref)\]/,
+    nolink: /^!?\[(ref)\](?:\[\])?/,
+    reflinkSearch: 'reflink|nolink(?!\\()',
+    emStrong: {
+        lDelim: /^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,
+        //         (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left.  (5) and (6) can be either Left or Right.
+        //         | Skip orphan inside strong      | Consume to delim | (1) #***              | (2) a***#, a***                    | (3) #***a, ***a                  | (4) ***#                 | (5) #***#                         | (6) a***a
+        rDelimAst: /^[^_*]*?__[^_*]*?\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\*)[punct](\*+)(?=[\s]|$)|[^punct\s](\*+)(?!\*)(?=[punct\s]|$)|(?!\*)[punct\s](\*+)(?=[^punct\s])|[\s](\*+)(?!\*)(?=[punct])|(?!\*)[punct](\*+)(?!\*)(?=[punct])|[^punct\s](\*+)(?=[^punct\s])/,
+        rDelimUnd: /^[^_*]*?\*\*[^_*]*?_[^_*]*?(?=\*\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\s]|$)|[^punct\s](_+)(?!_)(?=[punct\s]|$)|(?!_)[punct\s](_+)(?=[^punct\s])|[\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])/ // ^- Not allowed for _
+    },
+    code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
+    br: /^( {2,}|\\)\n(?!\s*$)/,
+    del: noopTest,
+    text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`^|~';
+inline.punctuation = edit(inline.punctuation, 'u').replace(/punctuation/g, inline._punctuation).getRegex();
+// sequences em should skip over [title](link), `code`, 
+inline.blockSkip = /\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g;
+inline.anyPunctuation = /\\[punct]/g;
+inline._escapes = /\\([punct])/g;
+inline._comment = edit(block._comment).replace('(?:-->|$)', '-->').getRegex();
+inline.emStrong.lDelim = edit(inline.emStrong.lDelim, 'u')
+    .replace(/punct/g, inline._punctuation)
+    .getRegex();
+inline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, 'gu')
+    .replace(/punct/g, inline._punctuation)
+    .getRegex();
+inline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, 'gu')
+    .replace(/punct/g, inline._punctuation)
+    .getRegex();
+inline.anyPunctuation = edit(inline.anyPunctuation, 'gu')
+    .replace(/punct/g, inline._punctuation)
+    .getRegex();
+inline._escapes = edit(inline._escapes, 'gu')
+    .replace(/punct/g, inline._punctuation)
+    .getRegex();
+inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
+inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
+inline.autolink = edit(inline.autolink)
+    .replace('scheme', inline._scheme)
+    .replace('email', inline._email)
+    .getRegex();
+inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
+inline.tag = edit(inline.tag)
+    .replace('comment', inline._comment)
+    .replace('attribute', inline._attribute)
+    .getRegex();
+inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
+inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/;
+inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
+inline.link = edit(inline.link)
+    .replace('label', inline._label)
+    .replace('href', inline._href)
+    .replace('title', inline._title)
+    .getRegex();
+inline.reflink = edit(inline.reflink)
+    .replace('label', inline._label)
+    .replace('ref', block._label)
+    .getRegex();
+inline.nolink = edit(inline.nolink)
+    .replace('ref', block._label)
+    .getRegex();
+inline.reflinkSearch = edit(inline.reflinkSearch, 'g')
+    .replace('reflink', inline.reflink)
+    .replace('nolink', inline.nolink)
+    .getRegex();
+/**
+ * Normal Inline Grammar
+ */
+inline.normal = { ...inline };
+/**
+ * Pedantic Inline Grammar
+ */
+inline.pedantic = {
+    ...inline.normal,
+    strong: {
+        start: /^__|\*\*/,
+        middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+        endAst: /\*\*(?!\*)/g,
+        endUnd: /__(?!_)/g
+    },
+    em: {
+        start: /^_|\*/,
+        middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,
+        endAst: /\*(?!\*)/g,
+        endUnd: /_(?!_)/g
+    },
+    link: edit(/^!?\[(label)\]\((.*?)\)/)
+        .replace('label', inline._label)
+        .getRegex(),
+    reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
+        .replace('label', inline._label)
+        .getRegex()
+};
+/**
+ * GFM Inline Grammar
+ */
+inline.gfm = {
+    ...inline.normal,
+    escape: edit(inline.escape).replace('])', '~|])').getRegex(),
+    _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
+    url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
+    _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,
+    del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
+    text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\ 0.5
+            ? 'x' + text.charCodeAt(i).toString(16)
+            : text.charCodeAt(i).toString();
+        out += '&#' + ch + ';';
+    }
+    return out;
+}
+/**
+ * Block Lexer
+ */
+class _Lexer {
+    tokens;
+    options;
+    state;
+    tokenizer;
+    inlineQueue;
+    constructor(options) {
+        // TokenList cannot be created in one go
+        // @ts-expect-error
+        this.tokens = [];
+        this.tokens.links = Object.create(null);
+        this.options = options || _defaults;
+        this.options.tokenizer = this.options.tokenizer || new _Tokenizer();
+        this.tokenizer = this.options.tokenizer;
+        this.tokenizer.options = this.options;
+        this.tokenizer.lexer = this;
+        this.inlineQueue = [];
+        this.state = {
+            inLink: false,
+            inRawBlock: false,
+            top: true
+        };
+        const rules = {
+            block: block.normal,
+            inline: inline.normal
+        };
+        if (this.options.pedantic) {
+            rules.block = block.pedantic;
+            rules.inline = inline.pedantic;
+        }
+        else if (this.options.gfm) {
+            rules.block = block.gfm;
+            if (this.options.breaks) {
+                rules.inline = inline.breaks;
+            }
+            else {
+                rules.inline = inline.gfm;
+            }
+        }
+        this.tokenizer.rules = rules;
+    }
+    /**
+     * Expose Rules
+     */
+    static get rules() {
+        return {
+            block,
+            inline
+        };
+    }
+    /**
+     * Static Lex Method
+     */
+    static lex(src, options) {
+        const lexer = new _Lexer(options);
+        return lexer.lex(src);
+    }
+    /**
+     * Static Lex Inline Method
+     */
+    static lexInline(src, options) {
+        const lexer = new _Lexer(options);
+        return lexer.inlineTokens(src);
+    }
+    /**
+     * Preprocessing
+     */
+    lex(src) {
+        src = src
+            .replace(/\r\n|\r/g, '\n');
+        this.blockTokens(src, this.tokens);
+        let next;
+        while (next = this.inlineQueue.shift()) {
+            this.inlineTokens(next.src, next.tokens);
+        }
+        return this.tokens;
+    }
+    blockTokens(src, tokens = []) {
+        if (this.options.pedantic) {
+            src = src.replace(/\t/g, '    ').replace(/^ +$/gm, '');
+        }
+        else {
+            src = src.replace(/^( *)(\t+)/gm, (_, leading, tabs) => {
+                return leading + '    '.repeat(tabs.length);
+            });
+        }
+        let token;
+        let lastToken;
+        let cutSrc;
+        let lastParagraphClipped;
+        while (src) {
+            if (this.options.extensions
+                && this.options.extensions.block
+                && this.options.extensions.block.some((extTokenizer) => {
+                    if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
+                        src = src.substring(token.raw.length);
+                        tokens.push(token);
+                        return true;
+                    }
+                    return false;
+                })) {
+                continue;
+            }
+            // newline
+            if (token = this.tokenizer.space(src)) {
+                src = src.substring(token.raw.length);
+                if (token.raw.length === 1 && tokens.length > 0) {
+                    // if there's a single \n as a spacer, it's terminating the last line,
+                    // so move it there so that we don't get unecessary paragraph tags
+                    tokens[tokens.length - 1].raw += '\n';
+                }
+                else {
+                    tokens.push(token);
+                }
+                continue;
+            }
+            // code
+            if (token = this.tokenizer.code(src)) {
+                src = src.substring(token.raw.length);
+                lastToken = tokens[tokens.length - 1];
+                // An indented code block cannot interrupt a paragraph.
+                if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {
+                    lastToken.raw += '\n' + token.raw;
+                    lastToken.text += '\n' + token.text;
+                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
+                }
+                else {
+                    tokens.push(token);
+                }
+                continue;
+            }
+            // fences
+            if (token = this.tokenizer.fences(src)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // heading
+            if (token = this.tokenizer.heading(src)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // hr
+            if (token = this.tokenizer.hr(src)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // blockquote
+            if (token = this.tokenizer.blockquote(src)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // list
+            if (token = this.tokenizer.list(src)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // html
+            if (token = this.tokenizer.html(src)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // def
+            if (token = this.tokenizer.def(src)) {
+                src = src.substring(token.raw.length);
+                lastToken = tokens[tokens.length - 1];
+                if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {
+                    lastToken.raw += '\n' + token.raw;
+                    lastToken.text += '\n' + token.raw;
+                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
+                }
+                else if (!this.tokens.links[token.tag]) {
+                    this.tokens.links[token.tag] = {
+                        href: token.href,
+                        title: token.title
+                    };
+                }
+                continue;
+            }
+            // table (gfm)
+            if (token = this.tokenizer.table(src)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // lheading
+            if (token = this.tokenizer.lheading(src)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // top-level paragraph
+            // prevent paragraph consuming extensions by clipping 'src' to extension start
+            cutSrc = src;
+            if (this.options.extensions && this.options.extensions.startBlock) {
+                let startIndex = Infinity;
+                const tempSrc = src.slice(1);
+                let tempStart;
+                this.options.extensions.startBlock.forEach((getStartIndex) => {
+                    tempStart = getStartIndex.call({ lexer: this }, tempSrc);
+                    if (typeof tempStart === 'number' && tempStart >= 0) {
+                        startIndex = Math.min(startIndex, tempStart);
+                    }
+                });
+                if (startIndex < Infinity && startIndex >= 0) {
+                    cutSrc = src.substring(0, startIndex + 1);
+                }
+            }
+            if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {
+                lastToken = tokens[tokens.length - 1];
+                if (lastParagraphClipped && lastToken.type === 'paragraph') {
+                    lastToken.raw += '\n' + token.raw;
+                    lastToken.text += '\n' + token.text;
+                    this.inlineQueue.pop();
+                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
+                }
+                else {
+                    tokens.push(token);
+                }
+                lastParagraphClipped = (cutSrc.length !== src.length);
+                src = src.substring(token.raw.length);
+                continue;
+            }
+            // text
+            if (token = this.tokenizer.text(src)) {
+                src = src.substring(token.raw.length);
+                lastToken = tokens[tokens.length - 1];
+                if (lastToken && lastToken.type === 'text') {
+                    lastToken.raw += '\n' + token.raw;
+                    lastToken.text += '\n' + token.text;
+                    this.inlineQueue.pop();
+                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
+                }
+                else {
+                    tokens.push(token);
+                }
+                continue;
+            }
+            if (src) {
+                const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
+                if (this.options.silent) {
+                    console.error(errMsg);
+                    break;
+                }
+                else {
+                    throw new Error(errMsg);
+                }
+            }
+        }
+        this.state.top = true;
+        return tokens;
+    }
+    inline(src, tokens = []) {
+        this.inlineQueue.push({ src, tokens });
+        return tokens;
+    }
+    /**
+     * Lexing/Compiling
+     */
+    inlineTokens(src, tokens = []) {
+        let token, lastToken, cutSrc;
+        // String with links masked to avoid interference with em and strong
+        let maskedSrc = src;
+        let match;
+        let keepPrevChar, prevChar;
+        // Mask out reflinks
+        if (this.tokens.links) {
+            const links = Object.keys(this.tokens.links);
+            if (links.length > 0) {
+                while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
+                    if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {
+                        maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
+                    }
+                }
+            }
+        }
+        // Mask out other blocks
+        while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
+            maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
+        }
+        // Mask out escaped characters
+        while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {
+            maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);
+        }
+        while (src) {
+            if (!keepPrevChar) {
+                prevChar = '';
+            }
+            keepPrevChar = false;
+            // extensions
+            if (this.options.extensions
+                && this.options.extensions.inline
+                && this.options.extensions.inline.some((extTokenizer) => {
+                    if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
+                        src = src.substring(token.raw.length);
+                        tokens.push(token);
+                        return true;
+                    }
+                    return false;
+                })) {
+                continue;
+            }
+            // escape
+            if (token = this.tokenizer.escape(src)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // tag
+            if (token = this.tokenizer.tag(src)) {
+                src = src.substring(token.raw.length);
+                lastToken = tokens[tokens.length - 1];
+                if (lastToken && token.type === 'text' && lastToken.type === 'text') {
+                    lastToken.raw += token.raw;
+                    lastToken.text += token.text;
+                }
+                else {
+                    tokens.push(token);
+                }
+                continue;
+            }
+            // link
+            if (token = this.tokenizer.link(src)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // reflink, nolink
+            if (token = this.tokenizer.reflink(src, this.tokens.links)) {
+                src = src.substring(token.raw.length);
+                lastToken = tokens[tokens.length - 1];
+                if (lastToken && token.type === 'text' && lastToken.type === 'text') {
+                    lastToken.raw += token.raw;
+                    lastToken.text += token.text;
+                }
+                else {
+                    tokens.push(token);
+                }
+                continue;
+            }
+            // em & strong
+            if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // code
+            if (token = this.tokenizer.codespan(src)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // br
+            if (token = this.tokenizer.br(src)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // del (gfm)
+            if (token = this.tokenizer.del(src)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // autolink
+            if (token = this.tokenizer.autolink(src, mangle)) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // url (gfm)
+            if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) {
+                src = src.substring(token.raw.length);
+                tokens.push(token);
+                continue;
+            }
+            // text
+            // prevent inlineText consuming extensions by clipping 'src' to extension start
+            cutSrc = src;
+            if (this.options.extensions && this.options.extensions.startInline) {
+                let startIndex = Infinity;
+                const tempSrc = src.slice(1);
+                let tempStart;
+                this.options.extensions.startInline.forEach((getStartIndex) => {
+                    tempStart = getStartIndex.call({ lexer: this }, tempSrc);
+                    if (typeof tempStart === 'number' && tempStart >= 0) {
+                        startIndex = Math.min(startIndex, tempStart);
+                    }
+                });
+                if (startIndex < Infinity && startIndex >= 0) {
+                    cutSrc = src.substring(0, startIndex + 1);
+                }
+            }
+            if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {
+                src = src.substring(token.raw.length);
+                if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started
+                    prevChar = token.raw.slice(-1);
+                }
+                keepPrevChar = true;
+                lastToken = tokens[tokens.length - 1];
+                if (lastToken && lastToken.type === 'text') {
+                    lastToken.raw += token.raw;
+                    lastToken.text += token.text;
+                }
+                else {
+                    tokens.push(token);
+                }
+                continue;
+            }
+            if (src) {
+                const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
+                if (this.options.silent) {
+                    console.error(errMsg);
+                    break;
+                }
+                else {
+                    throw new Error(errMsg);
+                }
+            }
+        }
+        return tokens;
+    }
+}
+
+/**
+ * Renderer
+ */
+class _Renderer {
+    options;
+    constructor(options) {
+        this.options = options || _defaults;
+    }
+    code(code, infostring, escaped) {
+        const lang = (infostring || '').match(/^\S*/)?.[0];
+        if (this.options.highlight) {
+            const out = this.options.highlight(code, lang);
+            if (out != null && out !== code) {
+                escaped = true;
+                code = out;
+            }
+        }
+        code = code.replace(/\n$/, '') + '\n';
+        if (!lang) {
+            return '
'
+                + (escaped ? code : escape(code, true))
+                + '
\n'; + } + return '
'
+            + (escaped ? code : escape(code, true))
+            + '
\n'; + } + blockquote(quote) { + return `
\n${quote}
\n`; + } + html(html, block) { + return html; + } + heading(text, level, raw, slugger) { + if (this.options.headerIds) { + const id = this.options.headerPrefix + slugger.slug(raw); + return `${text}\n`; + } + // ignore IDs + return `${text}\n`; + } + hr() { + return this.options.xhtml ? '
\n' : '
\n'; + } + list(body, ordered, start) { + const type = ordered ? 'ol' : 'ul'; + const startatt = (ordered && start !== 1) ? (' start="' + start + '"') : ''; + return '<' + type + startatt + '>\n' + body + '\n'; + } + listitem(text, task, checked) { + return `
  • ${text}
  • \n`; + } + checkbox(checked) { + return ' '; + } + paragraph(text) { + return `

    ${text}

    \n`; + } + table(header, body) { + if (body) + body = `${body}`; + return '\n' + + '\n' + + header + + '\n' + + body + + '
    \n'; + } + tablerow(content) { + return `\n${content}\n`; + } + tablecell(content, flags) { + const type = flags.header ? 'th' : 'td'; + const tag = flags.align + ? `<${type} align="${flags.align}">` + : `<${type}>`; + return tag + content + `\n`; + } + /** + * span level renderer + */ + strong(text) { + return `${text}`; + } + em(text) { + return `${text}`; + } + codespan(text) { + return `${text}`; + } + br() { + return this.options.xhtml ? '
    ' : '
    '; + } + del(text) { + return `${text}`; + } + link(href, title, text) { + const cleanHref = cleanUrl(this.options.sanitize, this.options.baseUrl, href); + if (cleanHref === null) { + return text; + } + href = cleanHref; + let out = '
    '; + return out; + } + image(href, title, text) { + const cleanHref = cleanUrl(this.options.sanitize, this.options.baseUrl, href); + if (cleanHref === null) { + return text; + } + href = cleanHref; + let out = `${text}' : '>'; + return out; + } + text(text) { + return text; + } +} + +/** + * TextRenderer + * returns only the textual part of the token + */ +class _TextRenderer { + // no need for block level renderers + strong(text) { + return text; + } + em(text) { + return text; + } + codespan(text) { + return text; + } + del(text) { + return text; + } + html(text) { + return text; + } + text(text) { + return text; + } + link(href, title, text) { + return '' + text; + } + image(href, title, text) { + return '' + text; + } + br() { + return ''; + } +} + +/** + * Slugger generates header id + */ +class _Slugger { + seen; + constructor() { + this.seen = {}; + } + serialize(value) { + return value + .toLowerCase() + .trim() + // remove html tags + .replace(/<[!\/a-z].*?>/ig, '') + // remove unwanted chars + .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '') + .replace(/\s/g, '-'); + } + /** + * Finds the next safe (unique) slug to use + */ + getNextSafeSlug(originalSlug, isDryRun) { + let slug = originalSlug; + let occurenceAccumulator = 0; + if (this.seen.hasOwnProperty(slug)) { + occurenceAccumulator = this.seen[originalSlug]; + do { + occurenceAccumulator++; + slug = originalSlug + '-' + occurenceAccumulator; + } while (this.seen.hasOwnProperty(slug)); + } + if (!isDryRun) { + this.seen[originalSlug] = occurenceAccumulator; + this.seen[slug] = 0; + } + return slug; + } + /** + * Convert string to unique id + */ + slug(value, options = {}) { + const slug = this.serialize(value); + return this.getNextSafeSlug(slug, options.dryrun); + } +} + +/** + * Parsing & Compiling + */ +class _Parser { + options; + renderer; + textRenderer; + slugger; + constructor(options) { + this.options = options || _defaults; + this.options.renderer = this.options.renderer || new _Renderer(); + this.renderer = this.options.renderer; + this.renderer.options = this.options; + this.textRenderer = new _TextRenderer(); + this.slugger = new _Slugger(); + } + /** + * Static Parse Method + */ + static parse(tokens, options) { + const parser = new _Parser(options); + return parser.parse(tokens); + } + /** + * Static Parse Inline Method + */ + static parseInline(tokens, options) { + const parser = new _Parser(options); + return parser.parseInline(tokens); + } + /** + * Parse Loop + */ + parse(tokens, top = true) { + let out = ''; + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i]; + // Run any renderer extensions + if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) { + const genericToken = token; + const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken); + if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(genericToken.type)) { + out += ret || ''; + continue; + } + } + switch (token.type) { + case 'space': { + continue; + } + case 'hr': { + out += this.renderer.hr(); + continue; + } + case 'heading': { + const headingToken = token; + out += this.renderer.heading(this.parseInline(headingToken.tokens), headingToken.depth, unescape(this.parseInline(headingToken.tokens, this.textRenderer)), this.slugger); + continue; + } + case 'code': { + const codeToken = token; + out += this.renderer.code(codeToken.text, codeToken.lang, !!codeToken.escaped); + continue; + } + case 'table': { + const tableToken = token; + let header = ''; + // header + let cell = ''; + for (let j = 0; j < tableToken.header.length; j++) { + cell += this.renderer.tablecell(this.parseInline(tableToken.header[j].tokens), { header: true, align: tableToken.align[j] }); + } + header += this.renderer.tablerow(cell); + let body = ''; + for (let j = 0; j < tableToken.rows.length; j++) { + const row = tableToken.rows[j]; + cell = ''; + for (let k = 0; k < row.length; k++) { + cell += this.renderer.tablecell(this.parseInline(row[k].tokens), { header: false, align: tableToken.align[k] }); + } + body += this.renderer.tablerow(cell); + } + out += this.renderer.table(header, body); + continue; + } + case 'blockquote': { + const blockquoteToken = token; + const body = this.parse(blockquoteToken.tokens); + out += this.renderer.blockquote(body); + continue; + } + case 'list': { + const listToken = token; + const ordered = listToken.ordered; + const start = listToken.start; + const loose = listToken.loose; + let body = ''; + for (let j = 0; j < listToken.items.length; j++) { + const item = listToken.items[j]; + const checked = item.checked; + const task = item.task; + let itemBody = ''; + if (item.task) { + const checkbox = this.renderer.checkbox(!!checked); + if (loose) { + if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') { + item.tokens[0].text = checkbox + ' ' + item.tokens[0].text; + if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') { + item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text; + } + } + else { + item.tokens.unshift({ + type: 'text', + text: checkbox + }); + } + } + else { + itemBody += checkbox; + } + } + itemBody += this.parse(item.tokens, loose); + body += this.renderer.listitem(itemBody, task, !!checked); + } + out += this.renderer.list(body, ordered, start); + continue; + } + case 'html': { + const htmlToken = token; + out += this.renderer.html(htmlToken.text, htmlToken.block); + continue; + } + case 'paragraph': { + const paragraphToken = token; + out += this.renderer.paragraph(this.parseInline(paragraphToken.tokens)); + continue; + } + case 'text': { + let textToken = token; + let body = textToken.tokens ? this.parseInline(textToken.tokens) : textToken.text; + while (i + 1 < tokens.length && tokens[i + 1].type === 'text') { + textToken = tokens[++i]; + body += '\n' + (textToken.tokens ? this.parseInline(textToken.tokens) : textToken.text); + } + out += top ? this.renderer.paragraph(body) : body; + continue; + } + default: { + const errMsg = 'Token with "' + token.type + '" type was not found.'; + if (this.options.silent) { + console.error(errMsg); + return ''; + } + else { + throw new Error(errMsg); + } + } + } + } + return out; + } + /** + * Parse Inline Tokens + */ + parseInline(tokens, renderer) { + renderer = renderer || this.renderer; + let out = ''; + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i]; + // Run any renderer extensions + if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) { + const ret = this.options.extensions.renderers[token.type].call({ parser: this }, token); + if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) { + out += ret || ''; + continue; + } + } + switch (token.type) { + case 'escape': { + const escapeToken = token; + out += renderer.text(escapeToken.text); + break; + } + case 'html': { + const tagToken = token; + out += renderer.html(tagToken.text); + break; + } + case 'link': { + const linkToken = token; + out += renderer.link(linkToken.href, linkToken.title, this.parseInline(linkToken.tokens, renderer)); + break; + } + case 'image': { + const imageToken = token; + out += renderer.image(imageToken.href, imageToken.title, imageToken.text); + break; + } + case 'strong': { + const strongToken = token; + out += renderer.strong(this.parseInline(strongToken.tokens, renderer)); + break; + } + case 'em': { + const emToken = token; + out += renderer.em(this.parseInline(emToken.tokens, renderer)); + break; + } + case 'codespan': { + const codespanToken = token; + out += renderer.codespan(codespanToken.text); + break; + } + case 'br': { + out += renderer.br(); + break; + } + case 'del': { + const delToken = token; + out += renderer.del(this.parseInline(delToken.tokens, renderer)); + break; + } + case 'text': { + const textToken = token; + out += renderer.text(textToken.text); + break; + } + default: { + const errMsg = 'Token with "' + token.type + '" type was not found.'; + if (this.options.silent) { + console.error(errMsg); + return ''; + } + else { + throw new Error(errMsg); + } + } + } + } + return out; + } +} + +class _Hooks { + options; + constructor(options) { + this.options = options || _defaults; + } + static passThroughHooks = new Set([ + 'preprocess', + 'postprocess' + ]); + /** + * Process markdown before marked + */ + preprocess(markdown) { + return markdown; + } + /** + * Process HTML after marked is finished + */ + postprocess(html) { + return html; + } +} + +class Marked { + defaults = _getDefaults(); + options = this.setOptions; + parse = this.#parseMarkdown(_Lexer.lex, _Parser.parse); + parseInline = this.#parseMarkdown(_Lexer.lexInline, _Parser.parseInline); + Parser = _Parser; + parser = _Parser.parse; + Renderer = _Renderer; + TextRenderer = _TextRenderer; + Lexer = _Lexer; + lexer = _Lexer.lex; + Tokenizer = _Tokenizer; + Slugger = _Slugger; + Hooks = _Hooks; + constructor(...args) { + this.use(...args); + } + /** + * Run callback for every token + */ + walkTokens(tokens, callback) { + let values = []; + for (const token of tokens) { + values = values.concat(callback.call(this, token)); + switch (token.type) { + case 'table': { + const tableToken = token; + for (const cell of tableToken.header) { + values = values.concat(this.walkTokens(cell.tokens, callback)); + } + for (const row of tableToken.rows) { + for (const cell of row) { + values = values.concat(this.walkTokens(cell.tokens, callback)); + } + } + break; + } + case 'list': { + const listToken = token; + values = values.concat(this.walkTokens(listToken.items, callback)); + break; + } + default: { + const genericToken = token; + if (this.defaults.extensions?.childTokens?.[genericToken.type]) { + this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => { + values = values.concat(this.walkTokens(genericToken[childTokens], callback)); + }); + } + else if (genericToken.tokens) { + values = values.concat(this.walkTokens(genericToken.tokens, callback)); + } + } + } + } + return values; + } + use(...args) { + const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} }; + args.forEach((pack) => { + // copy options to new object + const opts = { ...pack }; + // set async to true if it was set to true before + opts.async = this.defaults.async || opts.async || false; + // ==-- Parse "addon" extensions --== // + if (pack.extensions) { + pack.extensions.forEach((ext) => { + if (!ext.name) { + throw new Error('extension name required'); + } + if ('renderer' in ext) { // Renderer extensions + const prevRenderer = extensions.renderers[ext.name]; + if (prevRenderer) { + // Replace extension with func to run new extension but fall back if false + extensions.renderers[ext.name] = function (...args) { + let ret = ext.renderer.apply(this, args); + if (ret === false) { + ret = prevRenderer.apply(this, args); + } + return ret; + }; + } + else { + extensions.renderers[ext.name] = ext.renderer; + } + } + if ('tokenizer' in ext) { // Tokenizer Extensions + if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) { + throw new Error("extension level must be 'block' or 'inline'"); + } + const extLevel = extensions[ext.level]; + if (extLevel) { + extLevel.unshift(ext.tokenizer); + } + else { + extensions[ext.level] = [ext.tokenizer]; + } + if (ext.start) { // Function to check for start of token + if (ext.level === 'block') { + if (extensions.startBlock) { + extensions.startBlock.push(ext.start); + } + else { + extensions.startBlock = [ext.start]; + } + } + else if (ext.level === 'inline') { + if (extensions.startInline) { + extensions.startInline.push(ext.start); + } + else { + extensions.startInline = [ext.start]; + } + } + } + } + if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens + extensions.childTokens[ext.name] = ext.childTokens; + } + }); + opts.extensions = extensions; + } + // ==-- Parse "overwrite" extensions --== // + if (pack.renderer) { + const renderer = this.defaults.renderer || new _Renderer(this.defaults); + for (const prop in pack.renderer) { + const rendererFunc = pack.renderer[prop]; + const rendererKey = prop; + const prevRenderer = renderer[rendererKey]; + // Replace renderer with func to run extension, but fall back if false + renderer[rendererKey] = (...args) => { + let ret = rendererFunc.apply(renderer, args); + if (ret === false) { + ret = prevRenderer.apply(renderer, args); + } + return ret || ''; + }; + } + opts.renderer = renderer; + } + if (pack.tokenizer) { + const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults); + for (const prop in pack.tokenizer) { + const tokenizerFunc = pack.tokenizer[prop]; + const tokenizerKey = prop; + const prevTokenizer = tokenizer[tokenizerKey]; + // Replace tokenizer with func to run extension, but fall back if false + tokenizer[tokenizerKey] = (...args) => { + let ret = tokenizerFunc.apply(tokenizer, args); + if (ret === false) { + ret = prevTokenizer.apply(tokenizer, args); + } + return ret; + }; + } + opts.tokenizer = tokenizer; + } + // ==-- Parse Hooks extensions --== // + if (pack.hooks) { + const hooks = this.defaults.hooks || new _Hooks(); + for (const prop in pack.hooks) { + const hooksFunc = pack.hooks[prop]; + const hooksKey = prop; + const prevHook = hooks[hooksKey]; + if (_Hooks.passThroughHooks.has(prop)) { + hooks[hooksKey] = (arg) => { + if (this.defaults.async) { + return Promise.resolve(hooksFunc.call(hooks, arg)).then(ret => { + return prevHook.call(hooks, ret); + }); + } + const ret = hooksFunc.call(hooks, arg); + return prevHook.call(hooks, ret); + }; + } + else { + hooks[hooksKey] = (...args) => { + let ret = hooksFunc.apply(hooks, args); + if (ret === false) { + ret = prevHook.apply(hooks, args); + } + return ret; + }; + } + } + opts.hooks = hooks; + } + // ==-- Parse WalkTokens extensions --== // + if (pack.walkTokens) { + const walkTokens = this.defaults.walkTokens; + const packWalktokens = pack.walkTokens; + opts.walkTokens = function (token) { + let values = []; + values.push(packWalktokens.call(this, token)); + if (walkTokens) { + values = values.concat(walkTokens.call(this, token)); + } + return values; + }; + } + this.defaults = { ...this.defaults, ...opts }; + }); + return this; + } + setOptions(opt) { + this.defaults = { ...this.defaults, ...opt }; + return this; + } + #parseMarkdown(lexer, parser) { + return (src, optOrCallback, callback) => { + if (typeof optOrCallback === 'function') { + callback = optOrCallback; + optOrCallback = null; + } + const origOpt = { ...optOrCallback }; + const opt = { ...this.defaults, ...origOpt }; + // Show warning if an extension set async to true but the parse was called with async: false + if (this.defaults.async === true && origOpt.async === false) { + if (!opt.silent) { + console.warn('marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored.'); + } + opt.async = true; + } + const throwError = this.#onError(!!opt.silent, !!opt.async, callback); + // throw error in case of non string input + if (typeof src === 'undefined' || src === null) { + return throwError(new Error('marked(): input parameter is undefined or null')); + } + if (typeof src !== 'string') { + return throwError(new Error('marked(): input parameter is of type ' + + Object.prototype.toString.call(src) + ', string expected')); + } + checkDeprecations(opt, callback); + if (opt.hooks) { + opt.hooks.options = opt; + } + if (callback) { + const resultCallback = callback; + const highlight = opt.highlight; + let tokens; + try { + if (opt.hooks) { + src = opt.hooks.preprocess(src); + } + tokens = lexer(src, opt); + } + catch (e) { + return throwError(e); + } + const done = (err) => { + let out; + if (!err) { + try { + if (opt.walkTokens) { + this.walkTokens(tokens, opt.walkTokens); + } + out = parser(tokens, opt); + if (opt.hooks) { + out = opt.hooks.postprocess(out); + } + } + catch (e) { + err = e; + } + } + opt.highlight = highlight; + return err + ? throwError(err) + : resultCallback(null, out); + }; + if (!highlight || highlight.length < 3) { + return done(); + } + delete opt.highlight; + if (!tokens.length) + return done(); + let pending = 0; + this.walkTokens(tokens, (token) => { + if (token.type === 'code') { + pending++; + setTimeout(() => { + highlight(token.text, token.lang, (err, code) => { + if (err) { + return done(err); + } + if (code != null && code !== token.text) { + token.text = code; + token.escaped = true; + } + pending--; + if (pending === 0) { + done(); + } + }); + }, 0); + } + }); + if (pending === 0) { + done(); + } + return; + } + if (opt.async) { + return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src) + .then(src => lexer(src, opt)) + .then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens) + .then(tokens => parser(tokens, opt)) + .then(html => opt.hooks ? opt.hooks.postprocess(html) : html) + .catch(throwError); + } + try { + if (opt.hooks) { + src = opt.hooks.preprocess(src); + } + const tokens = lexer(src, opt); + if (opt.walkTokens) { + this.walkTokens(tokens, opt.walkTokens); + } + let html = parser(tokens, opt); + if (opt.hooks) { + html = opt.hooks.postprocess(html); + } + return html; + } + catch (e) { + return throwError(e); + } + }; + } + #onError(silent, async, callback) { + return (e) => { + e.message += '\nPlease report this to https://github.com/markedjs/marked.'; + if (silent) { + const msg = '

    An error occurred:

    '
    +                    + escape(e.message + '', true)
    +                    + '
    '; + if (async) { + return Promise.resolve(msg); + } + if (callback) { + callback(null, msg); + return; + } + return msg; + } + if (async) { + return Promise.reject(e); + } + if (callback) { + callback(e); + return; + } + throw e; + }; + } +} + +const markedInstance = new Marked(); +function marked(src, opt, callback) { + return markedInstance.parse(src, opt, callback); +} +/** + * Sets the default options. + * + * @param options Hash of options + */ +marked.options = + marked.setOptions = function (options) { + markedInstance.setOptions(options); + marked.defaults = markedInstance.defaults; + changeDefaults(marked.defaults); + return marked; + }; +/** + * Gets the original marked default options. + */ +marked.getDefaults = _getDefaults; +marked.defaults = _defaults; +/** + * Use Extension + */ +marked.use = function (...args) { + markedInstance.use(...args); + marked.defaults = markedInstance.defaults; + changeDefaults(marked.defaults); + return marked; +}; +/** + * Run callback for every token + */ +marked.walkTokens = function (tokens, callback) { + return markedInstance.walkTokens(tokens, callback); +}; +/** + * Compiles markdown to HTML without enclosing `p` tag. + * + * @param src String of markdown source to be compiled + * @param options Hash of options + * @return String of compiled HTML + */ +marked.parseInline = markedInstance.parseInline; +/** + * Expose + */ +marked.Parser = _Parser; +marked.parser = _Parser.parse; +marked.Renderer = _Renderer; +marked.TextRenderer = _TextRenderer; +marked.Lexer = _Lexer; +marked.lexer = _Lexer.lex; +marked.Tokenizer = _Tokenizer; +marked.Slugger = _Slugger; +marked.Hooks = _Hooks; +marked.parse = marked; +const options = marked.options; +const setOptions = marked.setOptions; +const use = marked.use; +const walkTokens = marked.walkTokens; +const parseInline = marked.parseInline; +const parse = marked; +const parser = _Parser.parse; +const lexer = _Lexer.lex; + +export { _Hooks as Hooks, _Lexer as Lexer, Marked, _Parser as Parser, _Renderer as Renderer, _Slugger as Slugger, _TextRenderer as TextRenderer, _Tokenizer as Tokenizer, _defaults as defaults, _getDefaults as getDefaults, lexer, marked, options, parse, parseInline, parser, setOptions, use, walkTokens }; +//# sourceMappingURL=marked.esm.js.map diff --git a/src/utils/marked/marked.ts b/src/utils/marked/marked.ts index 73563a4..9534a27 100644 --- a/src/utils/marked/marked.ts +++ b/src/utils/marked/marked.ts @@ -1,4 +1,5 @@ -import {Token, Tokens, lexer} from "marked" +import type {Token, Tokens} from "marked" +import {lexer} from "./marked.esm" import {Attributes, ComponentType, createElement, ReactElement, ReactNode} from "react" import {View, Text, Image, Video, Audio} from "@tarojs/components" import {parseHeadingId, walkTokens, unescape} from "./utils" diff --git a/src/utils/marked/utils.ts b/src/utils/marked/utils.ts index 4c7c077..9cf2b12 100644 --- a/src/utils/marked/utils.ts +++ b/src/utils/marked/utils.ts @@ -1,4 +1,4 @@ -import {Token, Tokens, TokensList} from "@/utils/marked/marked" +import type {Token, Tokens, TokensList} from "marked" import {Attributes, ComponentType, createElement, ReactElement} from "react"; From af5acef0186cffb4a73986ab3aa10c6bff3953e7 Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Fri, 25 Aug 2023 11:51:55 +0800 Subject: [PATCH 06/48] =?UTF-8?q?=E7=96=BE=E7=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/illness.ts | 11 ++-- .../preview/illness/article/article.config.ts | 2 +- src/pages/preview/illness/article/article.tsx | 1 - src/pages/preview/illness/list/list.config.ts | 4 +- .../preview/illness/list/list.module.scss | 38 +++---------- src/pages/preview/illness/list/list.tsx | 53 ++++++------------- .../preview/illness/sort/sort.module.scss | 20 ++++++- src/pages/preview/illness/sort/sort.tsx | 31 ++++------- 8 files changed, 58 insertions(+), 102 deletions(-) diff --git a/src/api/illness.ts b/src/api/illness.ts index 7e1aa21..ab0f905 100644 --- a/src/api/illness.ts +++ b/src/api/illness.ts @@ -3,13 +3,10 @@ import {request} from "@/api/request"; export const illnessApi = { /** 疾病列表 */ - list(id:number,page: number , page_size: number) { - return request<{ - list: any[], - total: number, - }>(`/home/v1/illness/list?page=${page}&page_size=${page_size}&id=${id}` , "GET") + list(id: number, page: number, page_size: number) { + return request<{ list: any[], total: number }>(`/home/v1/illness/list`, "GET", {page, page_size, id}) }, - articleInfo(id: number ) { - return request<{ content: string }>(`/home/v1/article/${id}` , "GET") + articleInfo(owner_id: number, page: number, page_size: number) { + return request<{ list: any[], total: number }>(`/home/v1/article/illness_list`, "GET", {page, page_size, owner_id}) }, } diff --git a/src/pages/preview/illness/article/article.config.ts b/src/pages/preview/illness/article/article.config.ts index 2a0a86b..6901b40 100644 --- a/src/pages/preview/illness/article/article.config.ts +++ b/src/pages/preview/illness/article/article.config.ts @@ -1,4 +1,4 @@ export default definePageConfig({ navigationBarTitleText: '', - onReachBottomDistance: 30 + onReachBottomDistance: 50 }) diff --git a/src/pages/preview/illness/article/article.tsx b/src/pages/preview/illness/article/article.tsx index 3670f1a..45f3250 100644 --- a/src/pages/preview/illness/article/article.tsx +++ b/src/pages/preview/illness/article/article.tsx @@ -13,7 +13,6 @@ const article:FC = () => { const [show,setShow] = useState(false) const [articleInfo,setArticleInfo] = useState() const { children, headings } = useMemo(() => parse(articleInfo?.content || ''), [articleInfo]) - console.log(headings,'headings') const query = Taro.createSelectorQuery() diff --git a/src/pages/preview/illness/list/list.config.ts b/src/pages/preview/illness/list/list.config.ts index 9fe364f..2881f86 100644 --- a/src/pages/preview/illness/list/list.config.ts +++ b/src/pages/preview/illness/list/list.config.ts @@ -1,4 +1,4 @@ export default definePageConfig({ - navigationBarTitleText: '疾病知识列表', - onReachBottomDistance: 30 + navigationBarTitleText: '文章列表', + onReachBottomDistance: 50 }) diff --git a/src/pages/preview/illness/list/list.module.scss b/src/pages/preview/illness/list/list.module.scss index a232e59..1665d7f 100644 --- a/src/pages/preview/illness/list/list.module.scss +++ b/src/pages/preview/illness/list/list.module.scss @@ -1,34 +1,8 @@ -page{ - background-color: #fff !important; -} -.box { - display: flex; - margin-bottom: 20rpx; - background-color: #fff; - border-radius: 16rpx; - box-sizing: border-box; -} -.image{ - width: 128rpx; - height:128rpx; - background-color: pink; - border-radius: 8rpx; -} -.rightBox{ - padding-left: 24rpx; - box-sizing: border-box; - flex: 1; -} -.desc{ - font-size: 24rpx; +.brands { + font-size: 28rpx; + font-family: PingFang SC-Medium, PingFang SC; font-weight: 500; - color: #909795; - line-height: 34rpx; - display: -webkit-box; - word-break: break-all; - text-overflow: ellipsis; - overflow: hidden; - -webkit-box-orient:vertical; - -webkit-line-clamp:2; + color: #323635; + padding: 30rpx; + border-bottom: 1px solid #F5F8F7; } - diff --git a/src/pages/preview/illness/list/list.tsx b/src/pages/preview/illness/list/list.tsx index 2fae725..19eb6a5 100644 --- a/src/pages/preview/illness/list/list.tsx +++ b/src/pages/preview/illness/list/list.tsx @@ -2,7 +2,6 @@ import {FC, useCallback, useEffect, useState} from "react"; import {View} from "@tarojs/components"; import styles from './list.module.scss' import Taro, {useReachBottom, useRouter} from "@tarojs/taro"; -import Collapse from "@/components/collapse/collapse"; import {illnessApi} from "@/api/illness"; import Empty from "@/components/empty/empty"; @@ -11,32 +10,28 @@ const BrandList: FC = () => { const [page, setPage] = useState(1) const [brands, setBrands] = useState([]) const [total, setTotal] = useState(0) - const [fetchDone,setFetchDone] = useState(false) + const [fetchDone, setFetchDone] = useState(false) useEffect(() => { - Taro.showLoading({ - title: '加载中', - mask: true - }) - setTimeout(function () { - Taro.hideLoading() - setFetchDone(true) - }, 800) - getData() + Taro.showLoading({title: '加载中', mask: true}) + getData().then() }, [page]) const getData = useCallback(async () => { try { - const data = await illnessApi.list(params.id, 1, 100) + const data = await illnessApi.articleInfo(params.id, page, 20) setTotal(data.total) - setBrands([ - ...data.list - ]) - Taro.setNavigationBarTitle({title: data.list?.[0].resourceCategories?.[0]?.name ?? '文章列表'}) + setBrands([...brands, ...data.list]) } catch (e) { } + setFetchDone(true) + Taro.hideLoading() }, [page]) + function jump(id: number) { + Taro.navigateTo({url: '/pages/preview/illness/article/article?id=' + id}) + } + useReachBottom(useCallback(() => { if (brands?.length < total) { @@ -46,29 +41,13 @@ const BrandList: FC = () => { return ( - + { brands.length > 0 ? - brands.map((d) => - - - - { - d.articles?.map((d) => { - Taro.navigateTo({url: `/pages/preview/illness/article/article?id=${d.id}`}) - }} - className='py-3 font-36' - style={{borderBottom: "1px solid #ddd"}} - >{d.title} - ) - } - - }> - - - ) : + brands.map((d, index) => jump(d.id)}> + {index + 1} . {d.title} + ) + : } ) diff --git a/src/pages/preview/illness/sort/sort.module.scss b/src/pages/preview/illness/sort/sort.module.scss index 3e4d4fa..f5319b6 100644 --- a/src/pages/preview/illness/sort/sort.module.scss +++ b/src/pages/preview/illness/sort/sort.module.scss @@ -1,6 +1,16 @@ +.scrollView{ + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + display: flex; +} + .firstOrder { width: 300rpx; - height: calc(100vh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 200rpx); + height: 100%; View { width: 100%; @@ -54,10 +64,16 @@ padding: 0 15rpx; background: #fff; box-sizing: border-box; - height: calc(100vh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 200rpx) + height: 100%; } .list { padding: 20rpx; border-bottom: 1px solid #F5F8F7; + width: 100%; + min-height: 100rpx; + color: #323635; + box-sizing: border-box; + display: flex; + align-items: center; } diff --git a/src/pages/preview/illness/sort/sort.tsx b/src/pages/preview/illness/sort/sort.tsx index 230971e..3812077 100644 --- a/src/pages/preview/illness/sort/sort.tsx +++ b/src/pages/preview/illness/sort/sort.tsx @@ -4,7 +4,6 @@ import {Category, HomeApi} from "@/api"; import Taro from "@tarojs/taro"; import styles from './sort.module.scss' import Tabs, {TabList} from "@/components/tabs/tabs"; -import {Search} from "@/pages/home/components/search"; import {illnessApi} from "@/api/illness"; import Empty from "@/components/empty/empty"; import leftArrow from "@/static/img/leftArrow.png" @@ -16,10 +15,10 @@ const Sort: FC = () => { const [secondId, setSecondId] = useState(undefined) const [list, setList] = useState([]) - const globalData = Taro.getApp().globalData const menu = Taro.getMenuButtonBoundingClientRect() + async function getData() { const res = await HomeApi.category(3) setData(res) @@ -30,7 +29,7 @@ const Sort: FC = () => { } function jump(id: number) { - Taro.navigateTo({url: '/pages/preview/illness/article/article?id=' + id}) + Taro.navigateTo({url: '/pages/preview/illness/list/list?id=' + id}) } const getTabList = useMemo((): TabList[] => { @@ -48,10 +47,6 @@ const Sort: FC = () => { paddingLeft: '10px' } - function onConfirm(value: string) { - console.log(value) - } - function firstIdChange(id: number) { setFirstId(id) const resource_category = data.find(d => d.id === id)?.resource_category @@ -64,16 +59,14 @@ const Sort: FC = () => { if (secondId) { Taro.showLoading({title: '加载中'}) illnessApi.list(secondId, 1, 100).then(res => { - const data = [] - res.list.forEach(d => { - data.push(...d.articles as []) - }) - setList(data) + setList(res.list) }).finally(() => { Taro.hideLoading() }).catch(() => { setList([]) }) + } else { + setList([]) } }, [secondId]) @@ -86,13 +79,11 @@ const Sort: FC = () => { onClick={() => Taro.navigateBack()}/> firstIdChange(data.tab?.value as number)}/> - - - + + {/**/} + + + { data.find(d => d.id === firstId)?.resource_category?.map(d => { scrollWithAnimation> { list.length ? - list.map(d => jump(d.id)}>{d.title}) + list.map(d => jump(d.id)}>{d.name}) : } From da52fe659ca5bdc5f832ed40309b1158bff0df30 Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Fri, 25 Aug 2023 14:23:40 +0800 Subject: [PATCH 07/48] bug --- src/app.config.ts | 7 +++++-- src/pages/business/sort/sort.config.ts | 3 --- src/pages/business/sort/sort.tsx | 21 ------------------- .../home/components/feature_recommended.tsx | 6 +++--- src/pages/home/home.module.scss | 2 +- src/pages/index/components/videoList.tsx | 16 +++++++++----- src/pages/preview/illness/list/list.tsx | 2 +- src/pages/preview/videoFull/videoFull.tsx | 13 ++++++++++++ 8 files changed, 34 insertions(+), 36 deletions(-) delete mode 100644 src/pages/business/sort/sort.config.ts delete mode 100644 src/pages/business/sort/sort.tsx diff --git a/src/app.config.ts b/src/app.config.ts index db352ba..4001fc0 100644 --- a/src/app.config.ts +++ b/src/app.config.ts @@ -45,6 +45,10 @@ export default defineAppConfig({ 'pages/my/my': { network: 'all', packages: ['pages/manage'] + }, + 'pages/home/home': { + network: 'all', + packages: ['pages/preview'] } }, subpackages: [ @@ -57,8 +61,7 @@ export default defineAppConfig({ 'history/history', 'curHistory/curHistory', 'hourHistory/hourHistory', - 'courType/courType', - 'sort/sort', // 公共二级分类 + 'courType/courType' ] }, { diff --git a/src/pages/business/sort/sort.config.ts b/src/pages/business/sort/sort.config.ts deleted file mode 100644 index f54b62b..0000000 --- a/src/pages/business/sort/sort.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default definePageConfig({ - navigationBarTitleText: '分类' -}) diff --git a/src/pages/business/sort/sort.tsx b/src/pages/business/sort/sort.tsx deleted file mode 100644 index e2cd428..0000000 --- a/src/pages/business/sort/sort.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import {FC} from "react"; -import {View} from "@tarojs/components"; -import {useRouter} from "@tarojs/taro"; - -type SortType = '' - -interface Params { - id: number - type: SortType - jumpUrl: (data:Record) => void -} - -const Sort: FC = () => { - const params = useRouter().params as unknown as Params - - return ( - ds - ) -} - -export default Sort diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx index b251b88..8de747f 100644 --- a/src/pages/home/components/feature_recommended.tsx +++ b/src/pages/home/components/feature_recommended.tsx @@ -80,7 +80,7 @@ const FeatureRecommended: FC = () => { title: d.title, imageUrl: d.url_path, description: d.introduction, - path: `?url=${d.resource?.url}&poster=${d.url_path}&title=${d.resource?.name}` + path: `?url=${d.resource?.url}&poster=${d.url_path}&title=${d.title}` })) } catch (e) { } @@ -95,8 +95,8 @@ const FeatureRecommended: FC = () => { id: d.id, imageUrl: d.url_path, description: d.introduction, - title: d.resource?.name, - path: `?url=${d.resource?.url}&poster=${d.url_path}&title=${d.resource?.name}` + title: d.title, + path: `?url=${d.resource?.url}&poster=${d.url_path}&title=${d.title}` })) } catch (e) { } diff --git a/src/pages/home/home.module.scss b/src/pages/home/home.module.scss index c36351d..6fd3f7d 100644 --- a/src/pages/home/home.module.scss +++ b/src/pages/home/home.module.scss @@ -75,7 +75,7 @@ } .featureTitle { - height: 50rpx; + height: 42rpx; padding-bottom: 30rpx; } diff --git a/src/pages/index/components/videoList.tsx b/src/pages/index/components/videoList.tsx index 4352a77..002975c 100644 --- a/src/pages/index/components/videoList.tsx +++ b/src/pages/index/components/videoList.tsx @@ -1,4 +1,4 @@ -import {FC, useEffect, useState} from "react"; +import {FC, useEffect, useMemo, useState} from "react"; import {useDidShow} from "@tarojs/taro"; import {ScrollView, Swiper, SwiperItem, View} from "@tarojs/components"; import {Courses, CoursesKey, publicApi} from "@/api/public"; @@ -16,9 +16,9 @@ interface Props { export const VideoList: FC = ({categoryKey, setCategoryKey}) => { const [data, setData] = useState({ - is_finished: [], - is_not_required: [], is_required: [], + is_not_required: [], + is_finished: [], is_not_finished: [], }) const [page, setPage] = useState(1) @@ -105,9 +105,15 @@ export const VideoList: FC = ({categoryKey, setCategoryKey}) => { setCategoryKey(categoryKeys[index]) } + const categoryIndex = useMemo(() => { + const index = Object.keys(data).findIndex(d => d === categoryKey) + return index < 0 ? 0 : index + }, [data, categoryKey]) + return ( - d === categoryKey)}> + { Object.values(data).map((value) => setPage(page + 1)}> diff --git a/src/pages/preview/illness/list/list.tsx b/src/pages/preview/illness/list/list.tsx index 19eb6a5..4064d2b 100644 --- a/src/pages/preview/illness/list/list.tsx +++ b/src/pages/preview/illness/list/list.tsx @@ -41,7 +41,7 @@ const BrandList: FC = () => { return ( - + { brands.length > 0 ? brands.map((d, index) => jump(d.id)}> diff --git a/src/pages/preview/videoFull/videoFull.tsx b/src/pages/preview/videoFull/videoFull.tsx index 6c7bdba..6651cd1 100644 --- a/src/pages/preview/videoFull/videoFull.tsx +++ b/src/pages/preview/videoFull/videoFull.tsx @@ -34,10 +34,22 @@ const VideoFull: FC = () => { } } + function onError() { + Taro.showModal({ + title: '视频播放错误', + confirmText: '退出', + showCancel: true, + success() { + Taro.navigateBack() + } + }) + } + return ( <> {params.title && {params.title}}
    '; + return out; + } + + image(href: string, title: string | null, text: string): string { + const cleanHref = cleanUrl(this.options.sanitize, this.options.baseUrl, href); + if (cleanHref === null) { + return text; + } + href = cleanHref; + + let out = `${text}' : '>'; + return out; + } + + text(text: string) : string { + return text; + } +} diff --git a/src/utils/marked/src/Slugger.ts b/src/utils/marked/src/Slugger.ts new file mode 100644 index 0000000..e8a98cc --- /dev/null +++ b/src/utils/marked/src/Slugger.ts @@ -0,0 +1,51 @@ +import type { SluggerOptions } from './MarkedOptions'; + +/** + * Slugger generates header id + */ +export class _Slugger { + seen: { [slugValue: string]: number }; + + constructor() { + this.seen = {}; + } + + serialize(value: string) { + return value + .toLowerCase() + .trim() + // remove html tags + .replace(/<[!\/a-z].*?>/ig, '') + // remove unwanted chars + .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '') + .replace(/\s/g, '-'); + } + + /** + * Finds the next safe (unique) slug to use + */ + getNextSafeSlug(originalSlug: string, isDryRun: boolean | undefined) { + let slug = originalSlug; + let occurenceAccumulator = 0; + if (this.seen.hasOwnProperty(slug)) { + occurenceAccumulator = this.seen[originalSlug]; + do { + occurenceAccumulator++; + slug = originalSlug + '-' + occurenceAccumulator; + } while (this.seen.hasOwnProperty(slug)); + } + if (!isDryRun) { + this.seen[originalSlug] = occurenceAccumulator; + this.seen[slug] = 0; + } + return slug; + } + + /** + * Convert string to unique id + */ + slug(value: string, options: SluggerOptions = {}) { + const slug = this.serialize(value); + return this.getNextSafeSlug(slug, options.dryrun); + } +} diff --git a/src/utils/marked/src/TextRenderer.ts b/src/utils/marked/src/TextRenderer.ts new file mode 100644 index 0000000..038b6db --- /dev/null +++ b/src/utils/marked/src/TextRenderer.ts @@ -0,0 +1,42 @@ +/** + * TextRenderer + * returns only the textual part of the token + */ +export class _TextRenderer { + // no need for block level renderers + strong(text: string) { + return text; + } + + em(text: string) { + return text; + } + + codespan(text: string) { + return text; + } + + del(text: string) { + return text; + } + + html(text: string) { + return text; + } + + text(text: string) { + return text; + } + + link(href: string, title: string | null | undefined, text: string) { + return '' + text; + } + + image(href: string, title: string | null, text: string) { + return '' + text; + } + + br() { + return ''; + } +} diff --git a/src/utils/marked/src/Tokenizer.ts b/src/utils/marked/src/Tokenizer.ts new file mode 100644 index 0000000..179144f --- /dev/null +++ b/src/utils/marked/src/Tokenizer.ts @@ -0,0 +1,813 @@ +import { _defaults } from './defaults'; +import { + rtrim, + splitCells, + escape, + findClosingBracket +} from './helpers'; +import type { _Lexer } from './Lexer'; +import type { Links, Tokens } from './Tokens'; +import type { MarkedOptions } from './MarkedOptions'; + +function outputLink(cap: string[], link: Pick, raw: string, lexer: _Lexer): Tokens.Link | Tokens.Image { + const href = link.href; + const title = link.title ? escape(link.title) : null; + const text = cap[1].replace(/\\([\[\]])/g, '$1'); + + if (cap[0].charAt(0) !== '!') { + lexer.state.inLink = true; + const token: Tokens.Link = { + type: 'link', + raw, + href, + title, + text, + tokens: lexer.inlineTokens(text) + }; + lexer.state.inLink = false; + return token; + } + return { + type: 'image', + raw, + href, + title, + text: escape(text) + }; +} + +function indentCodeCompensation(raw: string, text: string) { + const matchIndentToCode = raw.match(/^(\s+)(?:```)/); + + if (matchIndentToCode === null) { + return text; + } + + const indentToCode = matchIndentToCode[1]; + + return text + .split('\n') + .map(node => { + const matchIndentInNode = node.match(/^\s+/); + if (matchIndentInNode === null) { + return node; + } + + const [indentInNode] = matchIndentInNode; + + if (indentInNode.length >= indentToCode.length) { + return node.slice(indentToCode.length); + } + + return node; + }) + .join('\n'); +} + +/** + * Tokenizer + */ +export class _Tokenizer { + options: MarkedOptions; + // TODO: Fix this rules type + rules: any; + lexer!: _Lexer; + + constructor(options?: MarkedOptions) { + this.options = options || _defaults; + } + + space(src: string): Tokens.Space | undefined { + const cap = this.rules.block.newline.exec(src); + if (cap && cap[0].length > 0) { + return { + type: 'space', + raw: cap[0] + }; + } + } + + code(src: string): Tokens.Code | undefined { + const cap = this.rules.block.code.exec(src); + if (cap) { + const text = cap[0].replace(/^ {1,4}/gm, ''); + return { + type: 'code', + raw: cap[0], + codeBlockStyle: 'indented', + text: !this.options.pedantic + ? rtrim(text, '\n') + : text + }; + } + } + + fences(src: string): Tokens.Code | undefined { + const cap = this.rules.block.fences.exec(src); + if (cap) { + const raw = cap[0]; + const text = indentCodeCompensation(raw, cap[3] || ''); + + return { + type: 'code', + raw, + lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, '$1') : cap[2], + text + }; + } + } + + heading(src: string): Tokens.Heading | undefined { + const cap = this.rules.block.heading.exec(src); + if (cap) { + let text = cap[2].trim(); + + // remove trailing #s + if (/#$/.test(text)) { + const trimmed = rtrim(text, '#'); + if (this.options.pedantic) { + text = trimmed.trim(); + } else if (!trimmed || / $/.test(trimmed)) { + // CommonMark requires space before trailing #s + text = trimmed.trim(); + } + } + + return { + type: 'heading', + raw: cap[0], + depth: cap[1].length, + text, + tokens: this.lexer.inline(text) + }; + } + } + + hr(src: string): Tokens.Hr | undefined { + const cap = this.rules.block.hr.exec(src); + if (cap) { + return { + type: 'hr', + raw: cap[0] + }; + } + } + + blockquote(src: string): Tokens.Blockquote | undefined { + const cap = this.rules.block.blockquote.exec(src); + if (cap) { + const text = cap[0].replace(/^ *>[ \t]?/gm, ''); + const top = this.lexer.state.top; + this.lexer.state.top = true; + const tokens = this.lexer.blockTokens(text); + this.lexer.state.top = top; + return { + type: 'blockquote', + raw: cap[0], + tokens, + text + }; + } + } + + list(src: string): Tokens.List | undefined { + let cap = this.rules.block.list.exec(src); + if (cap) { + let bull = cap[1].trim(); + const isordered = bull.length > 1; + + const list: Tokens.List = { + type: 'list', + raw: '', + ordered: isordered, + start: isordered ? +bull.slice(0, -1) : '', + loose: false, + items: [] as Tokens.ListItem[] + }; + + bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`; + + if (this.options.pedantic) { + bull = isordered ? bull : '[*+-]'; + } + + // Get next list item + const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\t ][^\\n]*)?(?:\\n|$))`); + let raw = ''; + let itemContents = ''; + let endsWithBlankLine = false; + // Check if current bullet point can start a new List Item + while (src) { + let endEarly = false; + if (!(cap = itemRegex.exec(src))) { + break; + } + + if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?) + break; + } + + raw = cap[0] as string; + src = src.substring(raw.length); + + let line = cap[2].split('\n', 1)[0].replace(/^\t+/, (t: string) => ' '.repeat(3 * t.length)) as string; + let nextLine = src.split('\n', 1)[0]; + + let indent = 0; + if (this.options.pedantic) { + indent = 2; + itemContents = line.trimLeft(); + } else { + indent = cap[2].search(/[^ ]/); // Find first non-space char + indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent + itemContents = line.slice(indent); + indent += cap[1].length; + } + + let blankLine = false; + + if (!line && /^ *$/.test(nextLine)) { // Items begin with at most one blank line + raw += nextLine + '\n'; + src = src.substring(nextLine.length + 1); + endEarly = true; + } + + if (!endEarly) { + const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`); + const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`); + const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\`\`\`|~~~)`); + const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`); + + // Check if following lines should be included in List Item + while (src) { + const rawLine = src.split('\n', 1)[0]; + nextLine = rawLine; + + // Re-align to follow commonmark nesting rules + if (this.options.pedantic) { + nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' '); + } + + // End list item if found code fences + if (fencesBeginRegex.test(nextLine)) { + break; + } + + // End list item if found start of new heading + if (headingBeginRegex.test(nextLine)) { + break; + } + + // End list item if found start of new bullet + if (nextBulletRegex.test(nextLine)) { + break; + } + + // Horizontal rule found + if (hrRegex.test(src)) { + break; + } + + if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible + itemContents += '\n' + nextLine.slice(indent); + } else { + // not enough indentation + if (blankLine) { + break; + } + + // paragraph continuation unless last line was a different block level element + if (line.search(/[^ ]/) >= 4) { // indented code block + break; + } + if (fencesBeginRegex.test(line)) { + break; + } + if (headingBeginRegex.test(line)) { + break; + } + if (hrRegex.test(line)) { + break; + } + + itemContents += '\n' + nextLine; + } + + if (!blankLine && !nextLine.trim()) { // Check if current line is blank + blankLine = true; + } + + raw += rawLine + '\n'; + src = src.substring(rawLine.length + 1); + line = nextLine.slice(indent); + } + } + + if (!list.loose) { + // If the previous item ended with a blank line, the list is loose + if (endsWithBlankLine) { + list.loose = true; + } else if (/\n *\n *$/.test(raw)) { + endsWithBlankLine = true; + } + } + + let istask: RegExpExecArray | null = null; + let ischecked: boolean | undefined; + // Check for task list items + if (this.options.gfm) { + istask = /^\[[ xX]\] /.exec(itemContents); + if (istask) { + ischecked = istask[0] !== '[ ] '; + itemContents = itemContents.replace(/^\[[ xX]\] +/, ''); + } + } + + list.items.push({ + type: 'list_item', + raw, + task: !!istask, + checked: ischecked, + loose: false, + text: itemContents, + tokens: [] + }); + + list.raw += raw; + } + + // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic + list.items[list.items.length - 1].raw = raw.trimRight(); + (list.items[list.items.length - 1] as Tokens.ListItem).text = itemContents.trimRight(); + list.raw = list.raw.trimRight(); + + // Item child tokens handled here at end because we needed to have the final item to trim it first + for (let i = 0; i < list.items.length; i++) { + this.lexer.state.top = false; + list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []); + + if (!list.loose) { + // Check if list should be loose + const spacers = list.items[i].tokens.filter(t => t.type === 'space'); + const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\n.*\n/.test(t.raw)); + + list.loose = hasMultipleLineBreaks; + } + } + + // Set all items to loose if list is loose + if (list.loose) { + for (let i = 0; i < list.items.length; i++) { + list.items[i].loose = true; + } + } + + return list; + } + } + + html(src: string): Tokens.HTML | Tokens.Paragraph | undefined { + const cap = this.rules.block.html.exec(src); + if (cap) { + const token: Tokens.HTML | Tokens.Paragraph = { + type: 'html', + block: true, + raw: cap[0], + pre: !this.options.sanitizer + && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'), + text: cap[0] + }; + if (this.options.sanitize) { + const text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]); + const paragraph = token as unknown as Tokens.Paragraph; + paragraph.type = 'paragraph'; + paragraph.text = text; + paragraph.tokens = this.lexer.inline(text); + } + return token; + } + } + + def(src: string): Tokens.Def | undefined { + const cap = this.rules.block.def.exec(src); + if (cap) { + const tag = cap[1].toLowerCase().replace(/\s+/g, ' '); + const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline._escapes, '$1') : ''; + const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, '$1') : cap[3]; + return { + type: 'def', + tag, + raw: cap[0], + href, + title + }; + } + } + + table(src: string): Tokens.Table | undefined { + const cap = this.rules.block.table.exec(src); + if (cap) { + const item: Tokens.Table = { + type: 'table', + raw: cap[0], + header: splitCells(cap[1]).map(c => { + return { text: c, tokens: [] }; + }), + align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), + rows: cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, '').split('\n') : [] + }; + + if (item.header.length === item.align.length) { + let l = item.align.length; + let i, j, k, row; + for (i = 0; i < l; i++) { + const align = item.align[i]; + if (align) { + if (/^ *-+: *$/.test(align)) { + item.align[i] = 'right'; + } else if (/^ *:-+: *$/.test(align)) { + item.align[i] = 'center'; + } else if (/^ *:-+ *$/.test(align)) { + item.align[i] = 'left'; + } else { + item.align[i] = null; + } + } + } + + l = item.rows.length; + for (i = 0; i < l; i++) { + item.rows[i] = splitCells(item.rows[i] as unknown as string, item.header.length).map(c => { + return { text: c, tokens: [] }; + }); + } + + // parse child tokens inside headers and cells + + // header child tokens + l = item.header.length; + for (j = 0; j < l; j++) { + item.header[j].tokens = this.lexer.inline(item.header[j].text); + } + + // cell child tokens + l = item.rows.length; + for (j = 0; j < l; j++) { + row = item.rows[j]; + for (k = 0; k < row.length; k++) { + row[k].tokens = this.lexer.inline(row[k].text); + } + } + + return item; + } + } + } + + lheading(src: string): Tokens.Heading | undefined { + const cap = this.rules.block.lheading.exec(src); + if (cap) { + return { + type: 'heading', + raw: cap[0], + depth: cap[2].charAt(0) === '=' ? 1 : 2, + text: cap[1], + tokens: this.lexer.inline(cap[1]) + }; + } + } + + paragraph(src: string): Tokens.Paragraph | undefined { + const cap = this.rules.block.paragraph.exec(src); + if (cap) { + const text = cap[1].charAt(cap[1].length - 1) === '\n' + ? cap[1].slice(0, -1) + : cap[1]; + return { + type: 'paragraph', + raw: cap[0], + text, + tokens: this.lexer.inline(text) + }; + } + } + + text(src: string): Tokens.Text | undefined { + const cap = this.rules.block.text.exec(src); + if (cap) { + return { + type: 'text', + raw: cap[0], + text: cap[0], + tokens: this.lexer.inline(cap[0]) + }; + } + } + + escape(src: string): Tokens.Escape | undefined { + const cap = this.rules.inline.escape.exec(src); + if (cap) { + return { + type: 'escape', + raw: cap[0], + text: escape(cap[1]) + }; + } + } + + tag(src: string): Tokens.Tag | undefined { + const cap = this.rules.inline.tag.exec(src); + if (cap) { + if (!this.lexer.state.inLink && /^/i.test(cap[0])) { + this.lexer.state.inLink = false; + } + if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { + this.lexer.state.inRawBlock = true; + } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { + this.lexer.state.inRawBlock = false; + } + + return { + type: this.options.sanitize + ? 'text' + : 'html', + raw: cap[0], + inLink: this.lexer.state.inLink, + inRawBlock: this.lexer.state.inRawBlock, + block: false, + text: this.options.sanitize + ? (this.options.sanitizer + ? this.options.sanitizer(cap[0]) + : escape(cap[0])) + : cap[0] + }; + } + } + + link(src: string): Tokens.Link | Tokens.Image | undefined { + const cap = this.rules.inline.link.exec(src); + if (cap) { + const trimmedUrl = cap[2].trim(); + if (!this.options.pedantic && /^$/.test(trimmedUrl))) { + return; + } + + // ending angle bracket cannot be escaped + const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\'); + if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) { + return; + } + } else { + // find closing parenthesis + const lastParenIndex = findClosingBracket(cap[2], '()'); + if (lastParenIndex > -1) { + const start = cap[0].indexOf('!') === 0 ? 5 : 4; + const linkLen = start + cap[1].length + lastParenIndex; + cap[2] = cap[2].substring(0, lastParenIndex); + cap[0] = cap[0].substring(0, linkLen).trim(); + cap[3] = ''; + } + } + let href = cap[2]; + let title = ''; + if (this.options.pedantic) { + // split pedantic href and title + const link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href); + + if (link) { + href = link[1]; + title = link[3]; + } + } else { + title = cap[3] ? cap[3].slice(1, -1) : ''; + } + + href = href.trim(); + if (/^$/.test(trimmedUrl))) { + // pedantic allows starting angle bracket without ending angle bracket + href = href.slice(1); + } else { + href = href.slice(1, -1); + } + } + return outputLink(cap, { + href: href ? href.replace(this.rules.inline._escapes, '$1') : href, + title: title ? title.replace(this.rules.inline._escapes, '$1') : title + }, cap[0], this.lexer); + } + } + + reflink(src: string, links: Links): Tokens.Link | Tokens.Image | Tokens.Text | undefined { + let cap; + if ((cap = this.rules.inline.reflink.exec(src)) + || (cap = this.rules.inline.nolink.exec(src))) { + let link = (cap[2] || cap[1]).replace(/\s+/g, ' '); + link = links[link.toLowerCase()]; + if (!link) { + const text = cap[0].charAt(0); + return { + type: 'text', + raw: text, + text + }; + } + return outputLink(cap, link, cap[0], this.lexer); + } + } + + emStrong(src: string, maskedSrc: string, prevChar = ''): Tokens.Em | Tokens.Strong | undefined { + let match = this.rules.inline.emStrong.lDelim.exec(src); + if (!match) return; + + // _ can't be between two alphanumerics. \p{L}\p{N} includes non-english alphabet/numbers as well + if (match[3] && prevChar.match(/[\p{L}\p{N}]/u)) return; + + const nextChar = match[1] || match[2] || ''; + + if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) { + // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below) + const lLength = [...match[0]].length - 1; + let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0; + + const endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd; + endReg.lastIndex = 0; + + // Clip maskedSrc to same section of string as src (move to lexer?) + maskedSrc = maskedSrc.slice(-1 * src.length + lLength); + + while ((match = endReg.exec(maskedSrc)) != null) { + rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6]; + + if (!rDelim) continue; // skip single * in __abc*abc__ + + rLength = [...rDelim].length; + + if (match[3] || match[4]) { // found another Left Delim + delimTotal += rLength; + continue; + } else if (match[5] || match[6]) { // either Left or Right Delim + if (lLength % 3 && !((lLength + rLength) % 3)) { + midDelimTotal += rLength; + continue; // CommonMark Emphasis Rules 9-10 + } + } + + delimTotal -= rLength; + + if (delimTotal > 0) continue; // Haven't found enough closing delimiters + + // Remove extra characters. *a*** -> *a* + rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); + + const raw = [...src].slice(0, lLength + match.index + rLength + 1).join(''); + + // Create `em` if smallest delimiter has odd char count. *a*** + if (Math.min(lLength, rLength) % 2) { + const text = raw.slice(1, -1); + return { + type: 'em', + raw, + text, + tokens: this.lexer.inlineTokens(text) + }; + } + + // Create 'strong' if smallest delimiter has even char count. **a*** + const text = raw.slice(2, -2); + return { + type: 'strong', + raw, + text, + tokens: this.lexer.inlineTokens(text) + }; + } + } + } + + codespan(src: string): Tokens.Codespan | undefined { + const cap = this.rules.inline.code.exec(src); + if (cap) { + let text = cap[2].replace(/\n/g, ' '); + const hasNonSpaceChars = /[^ ]/.test(text); + const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text); + if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) { + text = text.substring(1, text.length - 1); + } + text = escape(text, true); + return { + type: 'codespan', + raw: cap[0], + text + }; + } + } + + br(src: string): Tokens.Br | undefined { + const cap = this.rules.inline.br.exec(src); + if (cap) { + return { + type: 'br', + raw: cap[0] + }; + } + } + + del(src: string): Tokens.Del | undefined { + const cap = this.rules.inline.del.exec(src); + if (cap) { + return { + type: 'del', + raw: cap[0], + text: cap[2], + tokens: this.lexer.inlineTokens(cap[2]) + }; + } + } + + autolink(src: string, mangle: (cap: string) => string): Tokens.Link | undefined { + const cap = this.rules.inline.autolink.exec(src); + if (cap) { + let text, href; + if (cap[2] === '@') { + text = escape(this.options.mangle ? mangle(cap[1]) : cap[1]); + href = 'mailto:' + text; + } else { + text = escape(cap[1]); + href = text; + } + + return { + type: 'link', + raw: cap[0], + text, + href, + tokens: [ + { + type: 'text', + raw: text, + text + } + ] + }; + } + } + + url(src: string, mangle: (cap: string) => string): Tokens.Link | undefined { + let cap; + if (cap = this.rules.inline.url.exec(src)) { + let text, href; + if (cap[2] === '@') { + text = escape(this.options.mangle ? mangle(cap[0]) : cap[0]); + href = 'mailto:' + text; + } else { + // do extended autolink path validation + let prevCapZero; + do { + prevCapZero = cap[0]; + cap[0] = this.rules.inline._backpedal.exec(cap[0])[0]; + } while (prevCapZero !== cap[0]); + text = escape(cap[0]); + if (cap[1] === 'www.') { + href = 'http://' + cap[0]; + } else { + href = cap[0]; + } + } + return { + type: 'link', + raw: cap[0], + text, + href, + tokens: [ + { + type: 'text', + raw: text, + text + } + ] + }; + } + } + + inlineText(src: string, smartypants: (cap: string) => string): Tokens.Text | undefined { + const cap = this.rules.inline.text.exec(src); + if (cap) { + let text; + if (this.lexer.state.inRawBlock) { + text = this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0]; + } else { + text = escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]); + } + return { + type: 'text', + raw: cap[0], + text + }; + } + } +} diff --git a/src/utils/marked/src/Tokens.ts b/src/utils/marked/src/Tokens.ts new file mode 100644 index 0000000..c5c846a --- /dev/null +++ b/src/utils/marked/src/Tokens.ts @@ -0,0 +1,201 @@ +/* eslint-disable no-use-before-define */ +export type Token = ( + Tokens.Space + | Tokens.Code + | Tokens.Heading + | Tokens.Table + | Tokens.Hr + | Tokens.Blockquote + | Tokens.List + | Tokens.ListItem + | Tokens.Paragraph + | Tokens.HTML + | Tokens.Text + | Tokens.Def + | Tokens.Escape + | Tokens.Tag + | Tokens.Image + | Tokens.Link + | Tokens.Strong + | Tokens.Em + | Tokens.Codespan + | Tokens.Br + | Tokens.Del + | Tokens.Generic); + +export namespace Tokens { + export interface Space { + type: 'space'; + raw: string; + } + + export interface Code { + type: 'code'; + raw: string; + codeBlockStyle?: 'indented' | undefined; + lang?: string | undefined; + text: string; + escaped?: boolean; + } + + export interface Heading { + type: 'heading'; + raw: string; + depth: number; + text: string; + tokens: Token[]; + } + + export interface Table { + type: 'table'; + raw: string; + align: Array<'center' | 'left' | 'right' | null>; + header: TableCell[]; + rows: TableCell[][]; + } + + export interface TableCell { + text: string; + tokens: Token[]; + } + + export interface Hr { + type: 'hr'; + raw: string; + } + + export interface Blockquote { + type: 'blockquote'; + raw: string; + text: string; + tokens: Token[]; + } + + export interface List { + type: 'list'; + raw: string; + ordered: boolean; + start: number | ''; + loose: boolean; + items: ListItem[]; + } + + export interface ListItem { + type: 'list_item'; + raw: string; + task: boolean; + checked?: boolean | undefined; + loose: boolean; + text: string; + tokens: Token[]; + } + + export interface Paragraph { + type: 'paragraph'; + raw: string; + pre?: boolean | undefined; + text: string; + tokens: Token[]; + } + + export interface HTML { + type: 'html'; + raw: string; + pre: boolean; + text: string; + block: boolean; + } + + export interface Text { + type: 'text'; + raw: string; + text: string; + tokens?: Token[]; + } + + export interface Def { + type: 'def'; + raw: string; + tag: string; + href: string; + title: string; + } + + export interface Escape { + type: 'escape'; + raw: string; + text: string; + } + + export interface Tag { + type: 'text' | 'html'; + raw: string; + inLink: boolean; + inRawBlock: boolean; + text: string; + block: boolean; + } + + export interface Link { + type: 'link'; + raw: string; + href: string; + title?: string | null; + text: string; + tokens: Token[]; + } + + export interface Image { + type: 'image'; + raw: string; + href: string; + title: string | null; + text: string; + } + + export interface Strong { + type: 'strong'; + raw: string; + text: string; + tokens: Token[]; + } + + export interface Em { + type: 'em'; + raw: string; + text: string; + tokens: Token[]; + } + + export interface Codespan { + type: 'codespan'; + raw: string; + text: string; + } + + export interface Br { + type: 'br'; + raw: string; + } + + export interface Del { + type: 'del'; + raw: string; + text: string; + tokens: Token[]; + } + + export interface Generic { + [index: string]: any; + + type: string; + raw: string; + tokens?: Token[] | undefined; + } +} + +export type Links = Record>; + +export type TokensList = Token[] & { + links: Links; +}; diff --git a/src/utils/marked/src/defaults.ts b/src/utils/marked/src/defaults.ts new file mode 100644 index 0000000..cf36e6b --- /dev/null +++ b/src/utils/marked/src/defaults.ts @@ -0,0 +1,35 @@ +import type { MarkedOptions } from './MarkedOptions'; + +/** + * Gets the original marked default options. + */ +export function _getDefaults(): MarkedOptions { + return { + async: false, + baseUrl: null, + breaks: false, + extensions: null, + gfm: true, + headerIds: false, + headerPrefix: '', + highlight: null, + hooks: null, + langPrefix: 'language-', + mangle: false, + pedantic: false, + renderer: null, + sanitize: false, + sanitizer: null, + silent: false, + smartypants: false, + tokenizer: null, + walkTokens: null, + xhtml: false + }; +} + +export let _defaults = _getDefaults(); + +export function changeDefaults(newDefaults: MarkedOptions) { + _defaults = newDefaults; +} diff --git a/src/utils/marked/src/helpers.ts b/src/utils/marked/src/helpers.ts new file mode 100644 index 0000000..47a58ae --- /dev/null +++ b/src/utils/marked/src/helpers.ts @@ -0,0 +1,265 @@ +import type { MarkedOptions } from './MarkedOptions'; +import type { ResultCallback } from './Instance'; +import type { Rule } from './rules'; + +/** + * Helpers + */ +const escapeTest = /[&<>"']/; +const escapeReplace = new RegExp(escapeTest.source, 'g'); +const escapeTestNoEncode = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/; +const escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g'); +const escapeReplacements: {[index: string]: string} = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' +}; +const getEscapeReplacement = (ch: string) => escapeReplacements[ch]; + +export function escape(html: string, encode?: boolean) { + if (encode) { + if (escapeTest.test(html)) { + return html.replace(escapeReplace, getEscapeReplacement); + } + } else { + if (escapeTestNoEncode.test(html)) { + return html.replace(escapeReplaceNoEncode, getEscapeReplacement); + } + } + + return html; +} + +const unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig; + +export function unescape(html: string) { + // explicitly match decimal, hex, and named HTML entities + return html.replace(unescapeTest, (_, n) => { + n = n.toLowerCase(); + if (n === 'colon') return ':'; + if (n.charAt(0) === '#') { + return n.charAt(1) === 'x' + ? String.fromCharCode(parseInt(n.substring(2), 16)) + : String.fromCharCode(+n.substring(1)); + } + return ''; + }); +} + +const caret = /(^|[^\[])\^/g; + +export function edit(regex: Rule, opt?: string) { + regex = typeof regex === 'string' ? regex : regex.source; + opt = opt || ''; + const obj = { + replace: (name: string | RegExp, val: string | RegExp) => { + val = typeof val === 'object' && 'source' in val ? val.source : val; + val = val.replace(caret, '$1'); + regex = (regex as string).replace(name, val); + return obj; + }, + getRegex: () => { + return new RegExp(regex, opt); + } + }; + return obj; +} + +const nonWordAndColonTest = /[^\w:]/g; +const originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i; + +export function cleanUrl(sanitize: boolean | undefined, base: string | undefined | null, href: string) { + if (sanitize) { + let prot; + try { + prot = decodeURIComponent(unescape(href)) + .replace(nonWordAndColonTest, '') + .toLowerCase(); + } catch (e) { + return null; + } + if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) { + return null; + } + } + if (base && !originIndependentUrl.test(href)) { + href = resolveUrl(base, href); + } + try { + href = encodeURI(href).replace(/%25/g, '%'); + } catch (e) { + return null; + } + return href; +} + +const baseUrls: Record = {}; +const justDomain = /^[^:]+:\/*[^/]*$/; +const protocol = /^([^:]+:)[\s\S]*$/; +const domain = /^([^:]+:\/*[^/]*)[\s\S]*$/; + +export function resolveUrl(base: string, href: string) { + if (!baseUrls[' ' + base]) { + // we can ignore everything in base after the last slash of its path component, + // but we might need to add _that_ + // https://tools.ietf.org/html/rfc3986#section-3 + if (justDomain.test(base)) { + baseUrls[' ' + base] = base + '/'; + } else { + baseUrls[' ' + base] = rtrim(base, '/', true); + } + } + base = baseUrls[' ' + base]; + const relativeBase = base.indexOf(':') === -1; + + if (href.substring(0, 2) === '//') { + if (relativeBase) { + return href; + } + return base.replace(protocol, '$1') + href; + } else if (href.charAt(0) === '/') { + if (relativeBase) { + return href; + } + return base.replace(domain, '$1') + href; + } else { + return base + href; + } +} + +export const noopTest = { exec: () => null }; + +export function splitCells(tableRow: string, count?: number) { + // ensure that every cell-delimiting pipe has a space + // before it to distinguish it from an escaped pipe + const row = tableRow.replace(/\|/g, (_, offset, str) => { + let escaped = false; + let curr = offset; + while (--curr >= 0 && str[curr] === '\\') escaped = !escaped; + if (escaped) { + // odd number of slashes means | is escaped + // so we leave it alone + return '|'; + } else { + // add space before unescaped | + return ' |'; + } + }), + cells = row.split(/ \|/); + let i = 0; + + // First/last cell in a row cannot be empty if it has no leading/trailing pipe + if (!cells[0].trim()) { + cells.shift(); + } + if (cells.length > 0 && !cells[cells.length - 1].trim()) { + cells.pop(); + } + + if (count) { + if (cells.length > count) { + cells.splice(count); + } else { + while (cells.length < count) cells.push(''); + } + } + + for (; i < cells.length; i++) { + // leading or trailing whitespace is ignored per the gfm spec + cells[i] = cells[i].trim().replace(/\\\|/g, '|'); + } + return cells; +} + +/** + * Remove trailing 'c's. Equivalent to str.replace(/c*$/, ''). + * /c*$/ is vulnerable to REDOS. + * + * @param str + * @param c + * @param invert Remove suffix of non-c chars instead. Default falsey. + */ +export function rtrim(str: string, c: string, invert?: boolean) { + const l = str.length; + if (l === 0) { + return ''; + } + + // Length of suffix matching the invert condition. + let suffLen = 0; + + // Step left until we fail to match the invert condition. + while (suffLen < l) { + const currChar = str.charAt(l - suffLen - 1); + if (currChar === c && !invert) { + suffLen++; + } else if (currChar !== c && invert) { + suffLen++; + } else { + break; + } + } + + return str.slice(0, l - suffLen); +} + +export function findClosingBracket(str: string, b: string) { + if (str.indexOf(b[1]) === -1) { + return -1; + } + + let level = 0; + for (let i = 0; i < str.length; i++) { + if (str[i] === '\\') { + i++; + } else if (str[i] === b[0]) { + level++; + } else if (str[i] === b[1]) { + level--; + if (level < 0) { + return i; + } + } + } + return -1; +} + +export function checkDeprecations(opt: MarkedOptions, callback?: ResultCallback) { + if (!opt || opt.silent) { + return; + } + + if (callback) { + console.warn('marked(): callback is deprecated since version 5.0.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/using_pro#async'); + } + + if (opt.sanitize || opt.sanitizer) { + console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options'); + } + + if (opt.highlight || opt.langPrefix !== 'language-') { + console.warn('marked(): highlight and langPrefix parameters are deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-highlight.'); + } + + if (opt.mangle) { + console.warn('marked(): mangle parameter is enabled by default, but is deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install https://www.npmjs.com/package/marked-mangle, or disable by setting `{mangle: false}`.'); + } + + if (opt.baseUrl) { + console.warn('marked(): baseUrl parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-base-url.'); + } + + if (opt.smartypants) { + console.warn('marked(): smartypants parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-smartypants.'); + } + + if (opt.xhtml) { + console.warn('marked(): xhtml parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-xhtml.'); + } + + if (opt.headerIds || opt.headerPrefix) { + console.warn('marked(): headerIds and headerPrefix parameters enabled by default, but are deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install https://www.npmjs.com/package/marked-gfm-heading-id, or disable by setting `{headerIds: false}`.'); + } +} diff --git a/src/utils/marked/src/marked.ts b/src/utils/marked/src/marked.ts new file mode 100644 index 0000000..6fd52b0 --- /dev/null +++ b/src/utils/marked/src/marked.ts @@ -0,0 +1,143 @@ +import { _Lexer } from './Lexer'; +import { _Parser } from './Parser'; +import { _Tokenizer } from './Tokenizer'; +import { _Renderer } from './Renderer'; +import { _TextRenderer } from './TextRenderer'; +import { _Slugger } from './Slugger'; +import { _Hooks } from './Hooks'; +import { Marked } from './Instance'; +import { + _getDefaults, + changeDefaults, + _defaults +} from './defaults'; +import type { MarkedExtension, MarkedOptions } from './MarkedOptions'; +import type { Token, TokensList } from './Tokens'; +import type { ResultCallback } from './Instance'; + +const markedInstance = new Marked(); + +/** + * Compiles markdown to HTML asynchronously. + * + * @param src String of markdown source to be compiled + * @param options Hash of options, having async: true + * @return Promise of string of compiled HTML + */ +export function marked(src: string, options: MarkedOptions & { async: true }): Promise; + +/** + * Compiles markdown to HTML synchronously. + * + * @param src String of markdown source to be compiled + * @param options Optional hash of options + * @return String of compiled HTML + */ +export function marked(src: string, options?: MarkedOptions): string; + +/** + * Compiles markdown to HTML asynchronously with a callback. + * + * @param src String of markdown source to be compiled + * @param callback Function called when the markdownString has been fully parsed when using async highlighting + */ +export function marked(src: string, callback: ResultCallback): void; + +/** + * Compiles markdown to HTML asynchronously with a callback. + * + * @param src String of markdown source to be compiled + * @param options Hash of options + * @param callback Function called when the markdownString has been fully parsed when using async highlighting + */ +export function marked( + src: string, + options: MarkedOptions, + callback: ResultCallback, +): void; +export function marked(src: string, opt?: MarkedOptions | ResultCallback, callback?: ResultCallback): string | Promise | undefined { + return markedInstance.parse(src, opt, callback); +} + +/** + * Sets the default options. + * + * @param options Hash of options + */ +marked.options = +marked.setOptions = function(options: MarkedOptions) { + markedInstance.setOptions(options); + marked.defaults = markedInstance.defaults; + changeDefaults(marked.defaults); + return marked; +}; + +/** + * Gets the original marked default options. + */ +marked.getDefaults = _getDefaults; + +marked.defaults = _defaults; + +/** + * Use Extension + */ + +marked.use = function(...args: MarkedExtension[]) { + markedInstance.use(...args); + marked.defaults = markedInstance.defaults; + changeDefaults(marked.defaults); + return marked; +}; + +/** + * Run callback for every token + */ + +marked.walkTokens = function (tokens: Token[] | TokensList, callback: (token: Token) => T | T[]) { + return markedInstance.walkTokens(tokens, callback); +}; + +/** + * Compiles markdown to HTML without enclosing `p` tag. + * + * @param src String of markdown source to be compiled + * @param options Hash of options + * @return String of compiled HTML + */ +marked.parseInline = markedInstance.parseInline; + +/** + * Expose + */ +marked.Parser = _Parser; +marked.parser = _Parser.parse; +marked.Renderer = _Renderer; +marked.TextRenderer = _TextRenderer; +marked.Lexer = _Lexer; +marked.lexer = _Lexer.lex; +marked.Tokenizer = _Tokenizer; +marked.Slugger = _Slugger; +marked.Hooks = _Hooks; +marked.parse = marked; + +export const options = marked.options; +export const setOptions = marked.setOptions; +export const use = marked.use; +export const walkTokens = marked.walkTokens; +export const parseInline = marked.parseInline; +export const parse = marked; +export const parser = _Parser.parse; +export const lexer = _Lexer.lex; +export { _defaults as defaults, _getDefaults as getDefaults } from './defaults'; +export { _Lexer as Lexer } from './Lexer'; +export { _Parser as Parser } from './Parser'; +export { _Tokenizer as Tokenizer } from './Tokenizer'; +export { _Renderer as Renderer } from './Renderer'; +export { _TextRenderer as TextRenderer } from './TextRenderer'; +export { _Slugger as Slugger } from './Slugger'; +export { _Hooks as Hooks } from './Hooks'; +export { Marked } from './Instance'; +export * from './MarkedOptions'; +export * from './rules'; +export * from './Tokens'; diff --git a/src/utils/marked/src/rules.ts b/src/utils/marked/src/rules.ts new file mode 100644 index 0000000..16a510e --- /dev/null +++ b/src/utils/marked/src/rules.ts @@ -0,0 +1,384 @@ +import { + noopTest, + edit +} from './helpers'; + +export type Rule = RegExp | string; + +export interface Rules { + [ruleName: string]: Pick | Rule | Rules; +} + +type BlockRuleNames = + | 'newline' + | 'code' + | 'fences' + | 'hr' + | 'heading' + | 'blockquote' + | 'list' + | 'html' + | 'def' + | 'lheading' + | '_paragraph' + | 'text' + | '_label' + | '_title' + | 'bullet' + | 'listItemStart' + | '_tag' + | '_comment' + | 'paragraph' + | 'uote' ; + +type BlockSubRuleNames = 'normal' | 'gfm' | 'pedantic'; + +type InlineRuleNames = + | 'escape' + | 'autolink' + | 'tag' + | 'link' + | 'reflink' + | 'nolink' + | 'reflinkSearch' + | 'code' + | 'br' + | 'text' + | '_punctuation' + | 'punctuation' + | 'blockSkip' + | 'escapedEmSt' + | '_comment' + | '_escapes' + | '_scheme' + | '_email' + | '_attribute' + | '_label' + | '_href' + | '_title' + | 'strong' + | '_extended_email' + | '_backpedal'; + +type InlineSubRuleNames = 'gfm' | 'emStrong' | 'normal' | 'pedantic'| 'breaks'; + +/** + * Block-Level Grammar + */ +// Not all rules are defined in the object literal +// @ts-expect-error +export const block: Record & Record & Rules = { + newline: /^(?: *(?:\n|$))+/, + code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/, + fences: /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, + hr: /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, + heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, + blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/, + list: /^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/, + html: '^ {0,3}(?:' // optional indentation + + '<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)' // (1) + + '|comment[^\\n]*(\\n+|$)' // (2) + + '|<\\?[\\s\\S]*?(?:\\?>\\n*|$)' // (3) + + '|\\n*|$)' // (4) + + '|\\n*|$)' // (5) + + '|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (6) + + '|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) open tag + + '|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag + + ')', + def: /^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/, + table: noopTest, + lheading: /^((?:(?!^bull ).|\n(?!\n|bull ))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, + // regex template, placeholders will be replaced according to different paragraph + // interruption rules of commonmark and the original markdown spec: + _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, + text: /^[^\n]+/ +}; + +block._label = /(?!\s*\])(?:\\.|[^\[\]\\])+/; +block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/; +block.def = edit(block.def) + .replace('label', block._label) + .replace('title', block._title) + .getRegex(); + +block.bullet = /(?:[*+-]|\d{1,9}[.)])/; +block.listItemStart = edit(/^( *)(bull) */) + .replace('bull', block.bullet) + .getRegex(); + +block.list = edit(block.list) + .replace(/bull/g, block.bullet) + .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))') + .replace('def', '\\n+(?=' + block.def.source + ')') + .getRegex(); + +block._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + + '|track|ul'; +block._comment = /|$)/; +block.html = edit(block.html, 'i') + .replace('comment', block._comment) + .replace('tag', block._tag) + .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/) + .getRegex(); + +block.lheading = edit(block.lheading) + .replace(/bull/g, block.bullet) // lists can interrupt + .getRegex(); + +block.paragraph = edit(block._paragraph) + .replace('hr', block.hr) + .replace('heading', ' {0,3}#{1,6} ') + .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs + .replace('|table', '') + .replace('blockquote', ' {0,3}>') + .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') + .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt + .replace('html', ')|<(?:script|pre|style|textarea|!--)') + .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks + .getRegex(); + +block.blockquote = edit(block.blockquote) + .replace('paragraph', block.paragraph) + .getRegex(); + +/** + * Normal Block Grammar + */ + +block.normal = { ...block }; + +/** + * GFM Block Grammar + */ + +block.gfm = { + ...block.normal, + table: '^ *([^\\n ].*\\|.*)\\n' // Header + + ' {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?' // Align + + '(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells +}; + +block.gfm.table = edit(block.gfm.table as Rule) + .replace('hr', block.hr) + .replace('heading', ' {0,3}#{1,6} ') + .replace('blockquote', ' {0,3}>') + .replace('code', ' {4}[^\\n]') + .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') + .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt + .replace('html', ')|<(?:script|pre|style|textarea|!--)') + .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks + .getRegex(); + +block.gfm.paragraph = edit(block._paragraph) + .replace('hr', block.hr) + .replace('heading', ' {0,3}#{1,6} ') + .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs + .replace('table', block.gfm.table as RegExp) // interrupt paragraphs with table + .replace('blockquote', ' {0,3}>') + .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') + .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt + .replace('html', ')|<(?:script|pre|style|textarea|!--)') + .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks + .getRegex(); +/** + * Pedantic grammar (original John Gruber's loose markdown specification) + */ + +block.pedantic = { + ...block.normal, + html: edit( + '^ *(?:comment *(?:\\n|\\s*$)' + + '|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)' // closed tag + + '|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))') + .replace('comment', block._comment) + .replace(/tag/g, '(?!(?:' + + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b') + .getRegex(), + def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, + heading: /^(#{1,6})(.*)(?:\n+|$)/, + fences: noopTest, // fences not supported + lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, + paragraph: edit(block.normal._paragraph as Rule) + .replace('hr', block.hr) + .replace('heading', ' *#{1,6} *[^\n]') + .replace('lheading', block.lheading) + .replace('blockquote', ' {0,3}>') + .replace('|fences', '') + .replace('|list', '') + .replace('|html', '') + .getRegex() +}; + +/** + * Inline-Level Grammar + */ +// Not all rules are defined in the object literal +// @ts-expect-error +export const inline: Record & Record & Rules = { + escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, + autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/, + url: noopTest, + tag: '^comment' + + '|^' // self-closing tag + + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag + + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. + + '|^' // declaration, e.g. + + '|^', // CDATA section + link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/, + reflink: /^!?\[(label)\]\[(ref)\]/, + nolink: /^!?\[(ref)\](?:\[\])?/, + reflinkSearch: 'reflink|nolink(?!\\()', + emStrong: { + lDelim: /^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/, + // (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left. (5) and (6) can be either Left or Right. + // | Skip orphan inside strong | Consume to delim | (1) #*** | (2) a***#, a*** | (3) #***a, ***a | (4) ***# | (5) #***# | (6) a***a + rDelimAst: /^[^_*]*?__[^_*]*?\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\*)[punct](\*+)(?=[\s]|$)|[^punct\s](\*+)(?!\*)(?=[punct\s]|$)|(?!\*)[punct\s](\*+)(?=[^punct\s])|[\s](\*+)(?!\*)(?=[punct])|(?!\*)[punct](\*+)(?!\*)(?=[punct])|[^punct\s](\*+)(?=[^punct\s])/, + rDelimUnd: /^[^_*]*?\*\*[^_*]*?_[^_*]*?(?=\*\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\s]|$)|[^punct\s](_+)(?!_)(?=[punct\s]|$)|(?!_)[punct\s](_+)(?=[^punct\s])|[\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])/ // ^- Not allowed for _ + }, + code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, + br: /^( {2,}|\\)\n(?!\s*$)/, + del: noopTest, + text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`^|~'; +// list of punctuation marks from CommonMark spec +// without * and _ to handle the different emphasis markers * and _ +inline._uc_punctuation = '\\u00A1\\u00A7\\u00AB\\u00B6\\u00B7\\u00BB\\u00BF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E42\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65'; +inline._punctuation = '!"#$%&\'()+\\-.,/:;<=>?@\\[\\]`^{|}~\\\\' + inline._uc_punctuation; +inline.punctuation = edit(inline.punctuation, 'u').replace(/punctuation/g, inline._punctuation).getRegex(); + +// sequences em should skip over [title](link), `code`, +inline.blockSkip = /\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g; +inline.anyPunctuation = /\\[punct]/g; +inline._escapes = /\\([punct])/g; + +inline._comment = edit(block._comment).replace('(?:-->|$)', '-->').getRegex(); + +inline.emStrong.lDelim = edit(inline.emStrong.lDelim as Rule, 'u') + .replace(/punct/g, inline._punctuation) + .getRegex(); + +inline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst as Rule, 'gu') + .replace(/punct/g, inline._punctuation) + .getRegex(); + +inline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd as Rule, 'gu') + .replace(/punct/g, inline._punctuation) + .getRegex(); + +inline.anyPunctuation = edit(inline.anyPunctuation as Rule, 'gu') + .replace(/punct/g, inline._punctuation) + .getRegex(); + +inline._escapes = edit(inline._escapes, 'gu') + .replace(/punct/g, inline._punctuation) + .getRegex(); + +inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/; +inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/; +inline.autolink = edit(inline.autolink) + .replace('scheme', inline._scheme) + .replace('email', inline._email) + .getRegex(); + +inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/; + +inline.tag = edit(inline.tag) + .replace('comment', inline._comment) + .replace('attribute', inline._attribute) + .getRegex(); + +inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/; +inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/; +inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/; + +inline.link = edit(inline.link) + .replace('label', inline._label) + .replace('href', inline._href) + .replace('title', inline._title) + .getRegex(); + +inline.reflink = edit(inline.reflink) + .replace('label', inline._label) + .replace('ref', block._label) + .getRegex(); + +inline.nolink = edit(inline.nolink) + .replace('ref', block._label) + .getRegex(); + +inline.reflinkSearch = edit(inline.reflinkSearch, 'g') + .replace('reflink', inline.reflink) + .replace('nolink', inline.nolink) + .getRegex(); + +/** + * Normal Inline Grammar + */ + +inline.normal = { ...inline }; + +/** + * Pedantic Inline Grammar + */ + +inline.pedantic = { + ...inline.normal, + strong: { + start: /^__|\*\*/, + middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, + endAst: /\*\*(?!\*)/g, + endUnd: /__(?!_)/g + }, + em: { + start: /^_|\*/, + middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/, + endAst: /\*(?!\*)/g, + endUnd: /_(?!_)/g + }, + link: edit(/^!?\[(label)\]\((.*?)\)/) + .replace('label', inline._label) + .getRegex(), + reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/) + .replace('label', inline._label) + .getRegex() +}; + +/** + * GFM Inline Grammar + */ + +inline.gfm = { + ...inline.normal, + escape: edit(inline.escape).replace('])', '~|])').getRegex(), + _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/, + url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, + _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, + del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/, + text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\ Date: Fri, 25 Aug 2023 17:31:01 +0800 Subject: [PATCH 10/48] =?UTF-8?q?=E5=93=81=E7=89=8C=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E6=8B=89=E5=8A=A0=E8=BD=BD=EF=BC=8C=E5=8F=8A?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../home/components/feature_recommended.tsx | 4 +-- src/pages/preview/brand/article/article.tsx | 13 +++++---- src/pages/preview/brand/list/list.tsx | 29 ++++++++++++++++--- src/pages/preview/illness/article/article.tsx | 4 +-- 4 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx index 8de747f..01e3396 100644 --- a/src/pages/home/components/feature_recommended.tsx +++ b/src/pages/home/components/feature_recommended.tsx @@ -110,7 +110,7 @@ const FeatureRecommended: FC = () => { return res.list.map(d => ({ id: d.id, imageUrl: '', - description: d.content, + description: d.content?.replace(/[^\u4e00-\u9fa5]/gi,"") ?? '暂无描述', title: d.title, path: `?id=${d.id}` })) @@ -155,7 +155,7 @@ const FeatureRecommended: FC = () => {
    {c.title} - {c.description} + {c.description || '暂无描述'} ) } diff --git a/src/pages/preview/brand/article/article.tsx b/src/pages/preview/brand/article/article.tsx index a0f341f..64fa15c 100644 --- a/src/pages/preview/brand/article/article.tsx +++ b/src/pages/preview/brand/article/article.tsx @@ -1,16 +1,18 @@ -import {FC, useEffect, useState} from "react"; +import {FC, useEffect, useMemo, useState} from "react"; import {Image, Text, View} from "@tarojs/components"; import Taro, {useRouter} from "@tarojs/taro"; import {ArticleRecord, brandApi} from "@/api"; import styles from "@/pages/preview/illness/article/article.module.scss"; import down from "@/static/img/doubleDown.png"; import {Profile} from "@/store"; +import {parse} from "@/utils/marked/marked"; const article:FC = () => { - const {token,empty} = Profile.useContainer() + const {token,} = Profile.useContainer() const {id} = useRouter().params as unknown as { id: number} const [articleInfo,setArticleInfo] = useState() + const { children } = useMemo(() => parse(articleInfo?.content || ''), [articleInfo]) useEffect(() => { getData() }, [id]) @@ -24,10 +26,11 @@ const article:FC = () => { } } function helloWorld() { - const html = articleInfo?.content; return ( <> - + + { children } + { !token && @@ -35,7 +38,7 @@ const article:FC = () => { - + {Taro.navigateTo({url: '/pages/login/login'})}}> 登录查看更多内容 diff --git a/src/pages/preview/brand/list/list.tsx b/src/pages/preview/brand/list/list.tsx index 25ca4c8..6b315aa 100644 --- a/src/pages/preview/brand/list/list.tsx +++ b/src/pages/preview/brand/list/list.tsx @@ -9,14 +9,30 @@ const BrandList: FC = () => { const [page, setPage] = useState(1) const [brands, setBrands] = useState([]) const [total, setTotal] = useState(0) + const [text, setText] = useState('') useEffect(() => { + Taro.showLoading({ + title: '加载中', + mask: true + }) + setTimeout(function () { + Taro.hideLoading() + }, 650) getData() }, [page]) const getData = useCallback(async () => { try { + setText('加载中..') const res = await brandApi.list(page, 10) + if(page === 1){ + if(res.list.length < 10) { + setText('没有更多了~') + }else{ + setText('上拉加载更多~') + } + } setTotal(res.total) setBrands([ ...brands, @@ -34,22 +50,27 @@ const BrandList: FC = () => { useReachBottom(useCallback(() => { if (brands?.length < total) { setPage(page + 1) + }else{ + setText('没有更多了~') } }, [total, brands])) return ( - + { - brands.length ? brands.map((d) => - jumpInfo(d.id)} className={styles.box} key={d.id}> + brands.length ? + <> + { brands.map((d) => jumpInfo(d.id)} className={styles.box} key={d.id}> {d.name} {d.graphic_introduction} ) - : + } + {text} + : } ) diff --git a/src/pages/preview/illness/article/article.tsx b/src/pages/preview/illness/article/article.tsx index 45f3250..9da4689 100644 --- a/src/pages/preview/illness/article/article.tsx +++ b/src/pages/preview/illness/article/article.tsx @@ -63,14 +63,14 @@ const article:FC = () => { - + Taro.navigateTo({url: '/pages/login/login'})}> 登录查看更多内容 } - + { setShow(false)}} show={show} round={true} overlay={true} overlayStyle={'background:rgba(0,0,0,0.3)'} > {headings.length > 0 && headings.map((d) => From 9973c5b6fd429d5f9d94c8c5b27012a678d3fe4f Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Fri, 25 Aug 2023 19:13:52 +0800 Subject: [PATCH 11/48] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/home.ts | 16 +++++- src/components/tabs/tabs.scss | 15 ++++-- src/pages/home/components/adware.tsx | 42 +++++++++------ src/pages/home/components/curRecommended.tsx | 4 +- src/pages/home/components/feature.tsx | 7 +-- .../home/components/feature_recommended.tsx | 53 ++++++++++++------- src/pages/home/home.module.scss | 51 ++++++++++++++---- src/pages/home/home.tsx | 31 +++++++++-- src/pages/preview/brand/info/info.module.scss | 1 - .../preview/illness/sort/sort.module.scss | 25 ++++++--- src/pages/preview/illness/sort/sort.tsx | 17 +++--- src/pages/preview/profession/profession.tsx | 1 + types/home.d.ts | 4 +- 13 files changed, 190 insertions(+), 77 deletions(-) diff --git a/src/api/home.ts b/src/api/home.ts index 5e73f53..aa884b5 100644 --- a/src/api/home.ts +++ b/src/api/home.ts @@ -16,7 +16,7 @@ export interface AdwareLinkType { } export interface AdwareType { - image_path:string + image_path: string advert_link: AdwareLinkType scope_id: number | string id: number @@ -29,6 +29,14 @@ export interface AdwareType { end_time?: number } +export interface HomeData { + adverts: AdwareType[] + skill: Kill[] + health: Health[] + brand: Brand[] + illness: Illness[] +} + export const HomeApi = { advert(only_flag: string) { return request("/home/v1/advert/unique?only_flag=" + only_flag, "GET") @@ -61,11 +69,17 @@ export const HomeApi = { skillList(categoryId: number, page: number, page_size: number) { return request<{ data: Kill[], total: number }>('/home/v1/skill/index', "GET", {categoryId, page, page_size}) }, + skillSetPlay(id: number) { + return request(`/home/v1/skill/set_play/${id}`, "PUT") + }, /** 疾病知识 */ illness(page: number, page_size: number) { return request<{ list: Illness[], total: number }>('/home/v1/article/illness_list', "GET", {page, page_size}) }, category(type: number) { return request('/home/v1/category/index/info?type=' + type, "GET") + }, + home() { + return request('/home/v1/home/home_page', "GET", {count: 3}) } } diff --git a/src/components/tabs/tabs.scss b/src/components/tabs/tabs.scss index 77db956..3d1c9c0 100644 --- a/src/components/tabs/tabs.scss +++ b/src/components/tabs/tabs.scss @@ -17,9 +17,20 @@ View::-webkit-scrollbar { text-align: center; } + .tabs-item { + padding: 20rpx; + font-size: 36rpx; + font-family: PingFang SC-Medium, PingFang SC; + font-weight: 500; + color: #606563; + } + .current { position: relative; + font-size: 36rpx; + font-family: PingFang SC-Bold, PingFang SC; font-weight: bold; + color: #323635; &:after { position: absolute; @@ -37,10 +48,6 @@ View::-webkit-scrollbar { transition: all 200ms; } } - - .tabs-item { - padding: 20rpx; - } } @keyframes spread { diff --git a/src/pages/home/components/adware.tsx b/src/pages/home/components/adware.tsx index 37c68bd..e98856a 100644 --- a/src/pages/home/components/adware.tsx +++ b/src/pages/home/components/adware.tsx @@ -1,16 +1,25 @@ import {Image, Swiper, SwiperItem, View} from "@tarojs/components"; -import {FC, useState} from "react"; -import {AdwareType, HomeApi} from "@/api"; +import {FC, useEffect, useState} from "react"; +import {AdwareType} from "@/api"; import Taro from "@tarojs/taro"; import styles from '../home.module.scss' -const Adware: FC = () => { - const [data, setData] = useState([]) +interface Props { + data: any[] + only_flag: string + width: number +} + +const Adware: FC = ({data, only_flag, width}) => { + const [adverts, setAdverts] = useState([]) + const [space, setSpace] = useState(null) - async function getAdware() { - const res = await HomeApi.advert('home_space') - setData(res) - } + + useEffect(() => { + const res = data.find(d => d.only_flag === only_flag) + setSpace(res) + setAdverts(res?.adverts || []) + }, [data]) function jumpAdware(url: string) { if (url.substring(0, 3) === 'wx:') { @@ -20,34 +29,33 @@ const Adware: FC = () => { } } - Taro.useLoad(getAdware) - return ( { - data.length === 1 && jumpAdware(data[0].image_path)} + style={{width: width + "rpx", height: (space.height / space.width) * width + "rpx"}} + onClick={() => jumpAdware(adverts[0].image_path)} className={styles.adware}/> } { - data.length > 1 && 1 && - {data.map(d => + {adverts.map(d => jumpAdware(d.image_path)} - style={{width: "100%"}}/> + style={{width: width + "rpx", height: '100%'}}/> )} } diff --git a/src/pages/home/components/curRecommended.tsx b/src/pages/home/components/curRecommended.tsx index f15a8c5..1685a93 100644 --- a/src/pages/home/components/curRecommended.tsx +++ b/src/pages/home/components/curRecommended.tsx @@ -37,7 +37,7 @@ const CurRecommended: FC = () => { return ( <> { - data.length > 0 && + data.length > 0 && { @@ -52,7 +52,7 @@ const CurRecommended: FC = () => { } - - 暂无更多 - + - 暂无更多 - ) } diff --git a/src/pages/home/components/feature.tsx b/src/pages/home/components/feature.tsx index 7614661..d6ae52b 100644 --- a/src/pages/home/components/feature.tsx +++ b/src/pages/home/components/feature.tsx @@ -4,6 +4,7 @@ import illness from '@/static/img/illness.png' import profession from '@/static/img/profession.png' import health from '@/static/img/health.png' import article from '@/static/img/article.png' +import styles from '../home.module.scss' import Taro from "@tarojs/taro"; const Feature: FC = () => { @@ -19,11 +20,11 @@ const Feature: FC = () => { } return ( - + { list.map(d => jump(d.url)}> - - {d.text} + + {d.text} ) } diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx index afdf4c8..0145a83 100644 --- a/src/pages/home/components/feature_recommended.tsx +++ b/src/pages/home/components/feature_recommended.tsx @@ -25,9 +25,17 @@ interface Data { url: string detailsUrl: string data: DataContent[] + type?: 'health' | 'kill' } -const FeatureRecommended: FC = () => { +interface Props { + skill: Kill[] // 技能 + health: Health[] // 健康 + brand: Brand[] // 品牌 + illness: Illness[] // 疾病 +} + +const FeatureRecommended: FC = (props) => { const [data, setData] = useState([ { titleUrl: brandTop, @@ -39,13 +47,15 @@ const FeatureRecommended: FC = () => { titleUrl: healthTop, url: '/pages/preview/health/health', detailsUrl: '/pages/preview/videoFull/videoFull', - data: [] + data: [], + type: "health" }, { titleUrl: professionTop, url: '/pages/preview/profession/profession', detailsUrl: '/pages/preview/videoFull/videoFull', - data: [] + data: [], + type: 'kill' }, { titleUrl: illnessTop, @@ -58,8 +68,7 @@ const FeatureRecommended: FC = () => { /** 品牌 */ async function getBrand(): Promise { try { - const res = await HomeApi.brand(1, 3) - return res.list.map(d => ({ + return props.brand.map(d => ({ id: d.id, title: d.name, imageUrl: d.brand_album, @@ -67,6 +76,7 @@ const FeatureRecommended: FC = () => { path: `?id=${d.id}`, })) } catch (e) { + console.log(e) } return [] } @@ -74,8 +84,7 @@ const FeatureRecommended: FC = () => { /** 健康知识 */ async function getHealth(): Promise { try { - const res = await HomeApi.healthTop(3) - return res.map(d => ({ + return props.health?.map(d => ({ id: d.id, title: d.title, imageUrl: d.url_path, @@ -90,8 +99,7 @@ const FeatureRecommended: FC = () => { /** 技能 */ async function getKill(): Promise { try { - const res = await HomeApi.skillTop(3) - return res.map(d => ({ + return props.skill.map(d => ({ id: d.id, imageUrl: d.url_path, description: d.introduction, @@ -106,12 +114,11 @@ const FeatureRecommended: FC = () => { /** 疾病 */ async function getIllness(): Promise { try { - const res = await HomeApi.illness(1, 3) - return res.list.map(d => ({ + return props.illness.map(d => ({ id: d.id, imageUrl: '', - description: d.content, - title: d.title, + description: d.description, + title: d.name, path: `?id=${d.id}` })) } catch (e) { @@ -128,15 +135,23 @@ const FeatureRecommended: FC = () => { oldData[3].data = illness setData(oldData) }) - }, []) + }, [props]) - function jump(url: string) { + // TODO 后续增加播放量使用公共接口 + function jump(url: string, playId?: number, type?: 'health' | 'kill') { + if (playId && type) { + if (type === 'health') { + HomeApi.healthSetPlay(playId) + } else if (type === 'kill') { + HomeApi.skillSetPlay(playId) + } + } Taro.navigateTo({url}) } return ( - + { data.map(d => { d.data.map((c, index) => jump(d.detailsUrl + c.path)}> + onClick={() => jump(d.detailsUrl + c.path, c.id, d.type)}> - {c.title} - {c.description} + {c.title} + {c.description} ) } diff --git a/src/pages/home/home.module.scss b/src/pages/home/home.module.scss index 6fd3f7d..4fb817b 100644 --- a/src/pages/home/home.module.scss +++ b/src/pages/home/home.module.scss @@ -1,5 +1,5 @@ .tipsLogin { - padding: 24rpx; + padding: 20px; color: #fff; align-items: center; position: fixed; @@ -9,7 +9,10 @@ justify-content: space-between; width: 100%; box-sizing: border-box; - background: rgba(#000, .7); + background: rgba(#000, .6); + font-size: 28rpx; + font-family: PingFang SC-Medium, PingFang SC; + font-weight: 500; } @@ -48,18 +51,25 @@ } .adware { - //margin-top: 40rpx; - width: 100%; - height: 260rpx; border-radius: 16rpx; overflow: hidden; background: #eee; + margin-bottom: 40rpx; } .videoListBox { border-radius: 20px; } +.featureList { + font-size: 28rpx; + font-family: PingFang SC-Medium, PingFang SC; + font-weight: 500; + color: #323635; + margin-top: 10px; +} + + .courseTag { width: 200px; margin: auto; @@ -70,7 +80,7 @@ color: #323635; background: #fff; padding: 30rpx 0 30rpx 30rpx; - margin-top: 40rpx; + margin-bottom: 40rpx; border-radius: 30rpx; } @@ -83,16 +93,39 @@ width: calc(100% - 140px - 50px); } +.featureTextTitle { + font-size: 30rpx; + font-family: PingFang SC-Medium, PingFang SC; + font-weight: 500; + color: #323635; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + line-height: 2; +} + +.featureTextDescription { + font-size: 24rpx; + font-family: PingFang SC-Medium, PingFang SC; + font-weight: 500; + color: #909795; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; +} + .ranking { position: absolute; left: 24rpx; - width: 24px; - height: 24px; + width: 40px; + height: 40px; } .featureImage { width: 140px; - height: 90px; + height: 100px; background: #eee; border-radius: 12rpx; overflow: hidden; diff --git a/src/pages/home/home.tsx b/src/pages/home/home.tsx index 506d598..bbd407a 100644 --- a/src/pages/home/home.tsx +++ b/src/pages/home/home.tsx @@ -1,4 +1,4 @@ -import {FC} from "react"; +import {FC, useEffect, useState} from "react"; import {View} from "@tarojs/components"; import styles from "./home.module.scss"; // import {Search} from "@/pages/home/components/search"; @@ -8,19 +8,40 @@ import FeatureRecommended from "@/pages/home/components/feature_recommended"; import CurRecommended from "@/pages/home/components/curRecommended"; import MyButton from "@/components/button/MyButton"; import {Profile} from "@/store"; +import Taro from "@tarojs/taro"; +import {HomeApi, HomeData} from "@/api"; + const Home: FC = () => { - const {token, empty} = Profile.useContainer() + const {token} = Profile.useContainer() + const [data, setData] = useState(null) + + function unLogin() { + Taro.removeStorageSync('profile') + Taro.navigateTo({url: '/pages/login/login'}) + } + + useEffect(() => { + HomeApi.home().then(res => { + setData(res) + }) + }, []) return ( {/**/} - + - + + { - !token && + !token && 登录后享受更多学习服务~ 立即登录 diff --git a/src/pages/preview/brand/info/info.module.scss b/src/pages/preview/brand/info/info.module.scss index aebea31..60ed52f 100644 --- a/src/pages/preview/brand/info/info.module.scss +++ b/src/pages/preview/brand/info/info.module.scss @@ -26,7 +26,6 @@ page{ position: -webkit-sticky; top: 0; padding:40rpx 30rpx 30rpx 30rpx; - border-radius: 32rpx; background-color: #fff; .title{ font-size: 32rpx; diff --git a/src/pages/preview/illness/sort/sort.module.scss b/src/pages/preview/illness/sort/sort.module.scss index f5319b6..efab5db 100644 --- a/src/pages/preview/illness/sort/sort.module.scss +++ b/src/pages/preview/illness/sort/sort.module.scss @@ -1,4 +1,4 @@ -.scrollView{ +.scrollView { position: fixed; top: 0; bottom: 0; @@ -9,19 +9,18 @@ } .firstOrder { - width: 300rpx; + width: 400rpx; height: 100%; View { width: 100%; - text-align: center; min-height: 100rpx; - color: #323635; + color: #606563; display: flex; align-items: center; - padding: 10rpx; + padding: 20rpx 20rpx 20rpx 30rpx; box-sizing: border-box; - justify-content: center; + font-size: 28rpx; } } @@ -36,8 +35,8 @@ &:after { content: ''; display: block; - width: 8rpx; - height: 60rpx; + width: 6rpx; + height: 40rpx; background: #45D4A8; position: absolute; left: 0; @@ -65,6 +64,10 @@ background: #fff; box-sizing: border-box; height: 100%; + font-size: 28rpx; + font-family: PingFang SC-Bold, PingFang SC; + font-weight: bold; + color: #323635; } .list { @@ -77,3 +80,9 @@ display: flex; align-items: center; } + +.back { + padding: 25rpx 10rpx 20rpx 30rpx; + width: 30rpx; + height: 30rpx; +} diff --git a/src/pages/preview/illness/sort/sort.tsx b/src/pages/preview/illness/sort/sort.tsx index 3812077..3c0bbe7 100644 --- a/src/pages/preview/illness/sort/sort.tsx +++ b/src/pages/preview/illness/sort/sort.tsx @@ -14,11 +14,9 @@ const Sort: FC = () => { const [firstId, setFirstId] = useState(undefined) const [secondId, setSecondId] = useState(undefined) const [list, setList] = useState([]) - const globalData = Taro.getApp().globalData const menu = Taro.getMenuButtonBoundingClientRect() - async function getData() { const res = await HomeApi.category(3) setData(res) @@ -44,7 +42,6 @@ const Sort: FC = () => { display: 'flex', alignItems: "center", width: menu.left - 10 + 'px', - paddingLeft: '10px' } function firstIdChange(id: number) { @@ -75,15 +72,21 @@ const Sort: FC = () => { Taro.navigateBack()}/> - firstIdChange(data.tab?.value as number)}/> + + + firstIdChange(data.tab?.value as number)}/> + + {/**/} - + { data.find(d => d.id === firstId)?.resource_category?.map(d => { diff --git a/src/pages/preview/profession/profession.tsx b/src/pages/preview/profession/profession.tsx index 71f195a..7382144 100644 --- a/src/pages/preview/profession/profession.tsx +++ b/src/pages/preview/profession/profession.tsx @@ -68,6 +68,7 @@ const Profession = () => { } function jump(kill: Kill) { + HomeApi.skillSetPlay(kill.id) Taro.navigateTo({url: `/pages/preview/videoFull/videoFull?url=${kill.resource.url}&poster=${kill.url_path}&title=${kill.resource.name}`}) } diff --git a/types/home.d.ts b/types/home.d.ts index badd229..1c9ce4e 100644 --- a/types/home.d.ts +++ b/types/home.d.ts @@ -32,7 +32,7 @@ interface Kill { interface Illness { id: number - content: string - title: string + description: string + name: string thumb:string } From 2190944d21a2270c444282996d0cc77be2fd1017 Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Mon, 28 Aug 2023 08:42:12 +0800 Subject: [PATCH 12/48] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 -- src/pages/home/components/feature_recommended.tsx | 2 +- src/pages/preview/profession/profession.tsx | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.env b/.env index a11710a..86e2b46 100644 --- a/.env +++ b/.env @@ -3,5 +3,3 @@ TARO_APP_API=https://mooc.yaojiankang.top #TARO_APP_API=https://shopfix.yaojiankang.top #TARO_APP_API=https://playedu.yaojiankang.top TARO_APP_LGOIN=true - - diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx index 0145a83..936de39 100644 --- a/src/pages/home/components/feature_recommended.tsx +++ b/src/pages/home/components/feature_recommended.tsx @@ -117,7 +117,7 @@ const FeatureRecommended: FC = (props) => { return props.illness.map(d => ({ id: d.id, imageUrl: '', - description: d.description, + description: d.description?.replace(/[^\u4e00-\u9fa5]/gi,"") ?? '暂无描述', title: d.name, path: `?id=${d.id}` })) diff --git a/src/pages/preview/profession/profession.tsx b/src/pages/preview/profession/profession.tsx index 7382144..e3516b7 100644 --- a/src/pages/preview/profession/profession.tsx +++ b/src/pages/preview/profession/profession.tsx @@ -92,7 +92,7 @@ const Profession = () => { data.data.map(d => jump(d)}> - {d.resource.name} + {d?.resource?.name} ) } From 34ffb6ed62d197a2e65e78d886c3914f15a0ff9e Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Mon, 28 Aug 2023 14:09:08 +0800 Subject: [PATCH 13/48] =?UTF-8?q?=E9=A2=84=E8=A7=88=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/videoCover/videoCover.scss | 6 ++++- src/pages/home/components/curRecommended.tsx | 4 ++-- src/pages/home/components/feature.tsx | 2 +- src/pages/home/home.module.scss | 10 ++++---- src/pages/home/home.tsx | 2 +- .../preview/profession/profession.module.scss | 4 +++- src/pages/preview/profession/profession.tsx | 23 +++++++++++-------- 7 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/components/videoCover/videoCover.scss b/src/components/videoCover/videoCover.scss index df662ed..840c184 100644 --- a/src/components/videoCover/videoCover.scss +++ b/src/components/videoCover/videoCover.scss @@ -51,7 +51,7 @@ .box { box-sizing: border-box; - padding: 15rpx; + padding: 20rpx; .title { width: 100%; @@ -61,6 +61,10 @@ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; + font-size: 28rpx; + font-family: PingFang SC-Medium, PingFang SC; + font-weight: 500; + color: #323635; } } diff --git a/src/pages/home/components/curRecommended.tsx b/src/pages/home/components/curRecommended.tsx index 1685a93..07f5e59 100644 --- a/src/pages/home/components/curRecommended.tsx +++ b/src/pages/home/components/curRecommended.tsx @@ -37,9 +37,9 @@ const CurRecommended: FC = () => { return ( <> { - data.length > 0 && + data.length > 0 && - + { data.map(c => { } return ( - + { list.map(d => jump(d.url)}> diff --git a/src/pages/home/home.module.scss b/src/pages/home/home.module.scss index 4fb817b..8820c50 100644 --- a/src/pages/home/home.module.scss +++ b/src/pages/home/home.module.scss @@ -71,8 +71,8 @@ .courseTag { - width: 200px; - margin: auto; + width: 162px; + margin: 0 auto 30rpx; display: block; } @@ -80,7 +80,7 @@ color: #323635; background: #fff; padding: 30rpx 0 30rpx 30rpx; - margin-bottom: 40rpx; + margin-bottom: 50rpx; border-radius: 30rpx; } @@ -119,8 +119,8 @@ .ranking { position: absolute; left: 24rpx; - width: 40px; - height: 40px; + width: 30px; + height: 30px; } .featureImage { diff --git a/src/pages/home/home.tsx b/src/pages/home/home.tsx index bbd407a..acc1adf 100644 --- a/src/pages/home/home.tsx +++ b/src/pages/home/home.tsx @@ -28,7 +28,7 @@ const Home: FC = () => { }, []) return ( - + {/**/} diff --git a/src/pages/preview/profession/profession.module.scss b/src/pages/preview/profession/profession.module.scss index e2c9fc3..57291c2 100644 --- a/src/pages/preview/profession/profession.module.scss +++ b/src/pages/preview/profession/profession.module.scss @@ -13,8 +13,10 @@ Image, image { - width: 200rpx; + width: 320rpx; + max-height: 180rpx; margin-right: 20rpx; border-radius: 10rpx; + background: #eee; } } diff --git a/src/pages/preview/profession/profession.tsx b/src/pages/preview/profession/profession.tsx index e3516b7..404d374 100644 --- a/src/pages/preview/profession/profession.tsx +++ b/src/pages/preview/profession/profession.tsx @@ -21,16 +21,20 @@ const Profession = () => { * more 开启加载更多 */ async function getData(more = false) { - if (categoryId) { - const oldData = new Map(data) - const categoryData = oldData.get(categoryId) - const page = more ? (categoryData?.page || 0) + 1 : categoryData?.page || 1 + if (!categoryId) return; + const oldData = new Map(data) + const categoryData = oldData.get(categoryId) + const page = more ? (categoryData?.page || 0) + 1 : categoryData?.page || 1 + + /** 无更多 */ + if (more && categoryData && categoryData.data.length >= categoryData.total) { + return + } - /** 无更多 */ - if (more && categoryData && categoryData.data.length >= categoryData.total) { - return + try { + if (!data.has(categoryId)) { + Taro.showLoading() } - const res = await HomeApi.skillList(categoryId!, page, 10) const dataList = res.data.reduce((pre, cur) => { const index = pre.findIndex(d => d.id === cur.id) @@ -42,14 +46,15 @@ const Profession = () => { return pre }, categoryData?.data || []) oldData.delete(categoryId) - oldData.set(categoryId, { data: dataList, total: res.total, page: page }) setData(oldData) + } catch (e) { } + Taro.hideLoading() } useEffect(() => { From 7d1d3475618b49077048ea8ee931db158f8bbf70 Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Mon, 28 Aug 2023 14:35:29 +0800 Subject: [PATCH 14/48] =?UTF-8?q?=E7=96=BE=E7=97=85=E6=BB=91=E5=8A=A8?= =?UTF-8?q?=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../preview/illness/sort/sort.module.scss | 3 +- src/pages/preview/illness/sort/sort.tsx | 76 ++++++++++++------- 2 files changed, 49 insertions(+), 30 deletions(-) diff --git a/src/pages/preview/illness/sort/sort.module.scss b/src/pages/preview/illness/sort/sort.module.scss index efab5db..c59026b 100644 --- a/src/pages/preview/illness/sort/sort.module.scss +++ b/src/pages/preview/illness/sort/sort.module.scss @@ -1,11 +1,12 @@ .scrollView { + height: auto !important; position: fixed; top: 0; bottom: 0; left: 0; right: 0; + width: 100%; margin: auto; - display: flex; } .firstOrder { diff --git a/src/pages/preview/illness/sort/sort.tsx b/src/pages/preview/illness/sort/sort.tsx index 3c0bbe7..695f3ea 100644 --- a/src/pages/preview/illness/sort/sort.tsx +++ b/src/pages/preview/illness/sort/sort.tsx @@ -1,4 +1,4 @@ -import {Image, ScrollView, View} from "@tarojs/components"; +import {Image, ScrollView, Swiper, SwiperItem, View} from "@tarojs/components"; import {FC, useEffect, useMemo, useState} from "react"; import {Category, HomeApi} from "@/api"; import Taro from "@tarojs/taro"; @@ -11,8 +11,8 @@ import leftArrow from "@/static/img/leftArrow.png" const prefix = 'SORT' const Sort: FC = () => { const [data, setData] = useState([]) - const [firstId, setFirstId] = useState(undefined) - const [secondId, setSecondId] = useState(undefined) + const [firstId, setFirstId] = useState(undefined) // 一级分类 + const [secondId, setSecondId] = useState(undefined) // 二级分类 const [list, setList] = useState([]) const globalData = Taro.getApp().globalData const menu = Taro.getMenuButtonBoundingClientRect() @@ -67,6 +67,13 @@ const Sort: FC = () => { } }, [secondId]) + function swiperChange(e) { + const firstData = data[e.target.current] + if (!firstData) return; + setFirstId(firstData.id) + setSecondId(firstData?.resource_category?.[0]?.id) + } + return ( @@ -78,6 +85,7 @@ const Sort: FC = () => { firstIdChange(data.tab?.value as number)}/> @@ -85,32 +93,42 @@ const Sort: FC = () => { {/**/} - - - { - data.find(d => d.id === firstId)?.resource_category?.map(d => setSecondId(d.id)} - className={secondId === d.id && styles.select}> - {d.name} - ) - } - - - - { - list.length ? - list.map(d => jump(d.id)}>{d.name}) - : - } - - + d.id === firstId)} + style={{top: `${globalData.statusBarHeight + 59}px`}}> + { + data.map(d => + + { + d.resource_category?.map(d => setSecondId(d.id)} + className={secondId === d.id && styles.select}> + {d.name} + ) + } + + + + { + list.length ? + list.map(d => jump(d.id)}>{d.name}) + : + } + + ) + } + + + ) } From f6832b156c71016de503ee96a291bfc83f1cc8a0 Mon Sep 17 00:00:00 2001 From: sunlizhou <296190577@qq.com> Date: Mon, 28 Aug 2023 15:01:47 +0800 Subject: [PATCH 15/48] =?UTF-8?q?=E5=93=81=E7=89=8C=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E6=A0=B7=E5=BC=8F=E5=8F=8A=E5=93=81=E7=89=8C?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E6=A0=B7=E5=BC=8Fbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + pnpm-lock.yaml | 2204 +++++++++++++++-- src/app.scss | 1 + src/pages/preview/brand/info/info.tsx | 2 +- src/pages/preview/brand/list/list.module.scss | 2 +- src/pages/preview/brand/list/list.tsx | 12 +- 6 files changed, 1986 insertions(+), 236 deletions(-) diff --git a/package.json b/package.json index 77426b6..c221015 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "react": "^18.0.0", "react-dom": "^18.0.0", "react-refresh": "^0.11.0", + "taro-ui": "^3.1.1", "unstated-next": "^1.1.0" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bdbe307..8afdb16 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.1' +lockfileVersion: '6.0' settings: autoInstallPeers: true @@ -65,6 +65,9 @@ dependencies: react-refresh: specifier: ^0.11.0 version: 0.11.0 + taro-ui: + specifier: ^3.1.1 + version: 3.1.1(@tarojs/components@3.6.8)(@tarojs/react@3.6.8)(@tarojs/taro@3.6.8)(react-dom@18.0.0)(react-native@0.72.4)(react@18.0.0) unstated-next: specifier: ^1.1.0 version: 1.1.0 @@ -222,7 +225,6 @@ packages: source-map: 0.5.7 transitivePeerDependencies: - supports-color - dev: true /@babel/eslint-parser@7.22.5(@babel/core@7.8.0)(eslint@8.12.0): resolution: {integrity: sha512-C69RWYNYtrgIRE5CmTd77ZiLDXqgBipahJc/jHP3sLcAGj6AJzxNIuKNpVnICqbyK7X3pFUfEvL++rvtbQpZkQ==} @@ -284,7 +286,6 @@ packages: browserslist: 4.21.9 lru-cache: 5.1.1 semver: 6.3.0 - dev: true /@babel/helper-create-class-features-plugin@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==} @@ -323,7 +324,6 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-create-regexp-features-plugin@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==} @@ -346,7 +346,6 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.0 - dev: true /@babel/helper-define-polyfill-provider@0.4.0(@babel/core@7.22.5): resolution: {integrity: sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==} @@ -377,7 +376,6 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} @@ -460,7 +458,6 @@ packages: '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-replace-supers@7.22.5: resolution: {integrity: sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==} @@ -566,7 +563,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} @@ -589,7 +585,21 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-optional-chaining': 7.22.5(@babel/core@7.8.0) - dev: true + + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.22.5): + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.5) + transitivePeerDependencies: + - supports-color + dev: false /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.8.0): resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} @@ -604,7 +614,19 @@ packages: '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.8.0) transitivePeerDependencies: - supports-color - dev: true + + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.5): + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.5) + '@babel/helper-plugin-utils': 7.22.5 + transitivePeerDependencies: + - supports-color + dev: false /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.8.0): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} @@ -617,7 +639,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-proposal-decorators@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-h8hlezQ4dl6ixodgXkH8lUfcD7x+WAuIqPUjwGoItynrXOAv4a4Tci1zA/qjzQjjcl0v3QpLdc2LM6ZACQuY7A==} @@ -650,6 +671,17 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-export-default-from@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.22.5) + dev: false + /@babel/plugin-proposal-export-default-from@7.22.5(@babel/core@7.8.0): resolution: {integrity: sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg==} engines: {node: '>=6.9.0'} @@ -659,7 +691,17 @@ packages: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.8.0) - dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.5): + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.5) + dev: false /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.8.0): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} @@ -670,7 +712,28 @@ packages: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.8.0) - dev: true + + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.22.5): + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.5) + dev: false + + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.8.0): + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.8.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.8.0) + dev: false /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.22.5): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} @@ -697,7 +760,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.8.0) '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.8.0) - dev: true + + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.22.5): + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.5) + dev: false /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.8.0): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} @@ -708,7 +781,18 @@ packages: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.8.0) - dev: true + + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.5): + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.5) + dev: false /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.8.0): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} @@ -720,7 +804,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.8.0) - dev: true /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.5): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} @@ -737,7 +820,6 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.8.0 - dev: true /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.5): resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} @@ -758,7 +840,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.8.0) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.5): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} @@ -775,7 +856,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.5): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} @@ -792,7 +872,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.5): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -811,7 +890,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-decorators@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==} @@ -847,7 +925,16 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true + + /@babel/plugin-syntax-export-default-from@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-syntax-export-default-from@7.22.5(@babel/core@7.8.0): resolution: {integrity: sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ==} @@ -857,7 +944,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.5): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} @@ -874,7 +960,16 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true + + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.8.0): resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} @@ -884,7 +979,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} @@ -903,7 +997,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} @@ -922,7 +1015,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.5): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} @@ -939,7 +1031,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.5): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} @@ -956,7 +1047,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} @@ -975,7 +1065,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.5): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} @@ -992,7 +1081,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.5): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -1009,7 +1097,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.5): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -1026,7 +1113,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.5): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -1043,7 +1129,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.5): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -1060,7 +1145,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.5): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -1077,7 +1161,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.5): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} @@ -1096,7 +1179,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.5): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} @@ -1115,7 +1197,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} @@ -1134,7 +1215,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.5): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} @@ -1155,7 +1235,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.8.0) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} @@ -1174,7 +1253,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-async-generator-functions@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg==} @@ -1203,7 +1281,6 @@ packages: '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.8.0) transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} @@ -1230,7 +1307,6 @@ packages: '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.8.0) transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} @@ -1249,7 +1325,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-block-scoping@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==} @@ -1268,7 +1343,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} @@ -1293,7 +1367,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-class-static-block@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==} @@ -1320,7 +1393,6 @@ packages: '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.8.0) transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-classes@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==} @@ -1359,7 +1431,6 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} @@ -1380,7 +1451,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.5 - dev: true /@babel/plugin-transform-destructuring@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==} @@ -1399,7 +1469,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} @@ -1420,7 +1489,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.8.0) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} @@ -1439,7 +1507,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-dynamic-import@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==} @@ -1460,7 +1527,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.8.0) - dev: true /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} @@ -1481,7 +1547,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-export-namespace-from@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==} @@ -1502,7 +1567,17 @@ packages: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.8.0) - dev: true + + /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.5) + dev: false /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.8.0): resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} @@ -1513,7 +1588,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.8.0) - dev: true /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} @@ -1532,7 +1606,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} @@ -1555,7 +1628,6 @@ packages: '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.8.0) '@babel/helper-function-name': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-json-strings@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==} @@ -1576,7 +1648,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.8.0) - dev: true /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} @@ -1595,7 +1666,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-logical-assignment-operators@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==} @@ -1616,7 +1686,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.8.0) - dev: true /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} @@ -1635,7 +1704,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} @@ -1660,7 +1728,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} @@ -1687,7 +1754,6 @@ packages: '@babel/helper-simple-access': 7.22.5 transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-modules-systemjs@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==} @@ -1716,7 +1782,6 @@ packages: '@babel/helper-validator-identifier': 7.22.5 transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} @@ -1741,7 +1806,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} @@ -1762,7 +1826,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.8.0) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} @@ -1781,7 +1844,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-nullish-coalescing-operator@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==} @@ -1802,7 +1864,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.8.0) - dev: true /@babel/plugin-transform-numeric-separator@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==} @@ -1823,7 +1884,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.8.0) - dev: true /@babel/plugin-transform-object-rest-spread@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==} @@ -1850,7 +1910,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.8.0) '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.8.0) - dev: true /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} @@ -1875,7 +1934,6 @@ packages: '@babel/helper-replace-supers': 7.22.5 transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-optional-catch-binding@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==} @@ -1896,7 +1954,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.8.0) - dev: true /@babel/plugin-transform-optional-chaining@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ==} @@ -1919,7 +1976,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.8.0) - dev: true /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} @@ -1938,7 +1994,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} @@ -1963,7 +2018,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-private-property-in-object@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==} @@ -1992,7 +2046,6 @@ packages: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.8.0) transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} @@ -2011,7 +2064,16 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true + + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.8.0): resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} @@ -2021,7 +2083,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.8.0): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} @@ -2033,6 +2094,16 @@ packages: '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.8.0) dev: true + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.8.0): resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} engines: {node: '>=6.9.0'} @@ -2041,7 +2112,16 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true + + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.8.0): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} @@ -2051,7 +2131,20 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true + + /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.5) + '@babel/types': 7.22.5 + dev: false /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.8.0): resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} @@ -2065,7 +2158,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.8.0) '@babel/types': 7.22.5 - dev: true /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.8.0): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} @@ -2097,7 +2189,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.1 - dev: true /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} @@ -2116,7 +2207,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-runtime@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==} @@ -2149,7 +2239,6 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} @@ -2168,7 +2257,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} @@ -2189,7 +2277,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} @@ -2208,7 +2295,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} @@ -2227,7 +2313,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} @@ -2246,7 +2331,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-typescript@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==} @@ -2275,7 +2359,6 @@ packages: '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.8.0) transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-unicode-escapes@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==} @@ -2294,7 +2377,6 @@ packages: dependencies: '@babel/core': 7.8.0 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} @@ -2315,7 +2397,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.8.0) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} @@ -2336,7 +2417,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.8.0) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} @@ -2357,7 +2437,6 @@ packages: '@babel/core': 7.8.0 '@babel/helper-create-regexp-features-plugin': 7.22.5(@babel/core@7.8.0) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/preset-env@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==} @@ -2538,7 +2617,18 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true + + /@babel/preset-flow@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-ta2qZ+LSiGCrP5pgcGt8xMnnkXQrq8Sa4Ulhy06BOlF5QbLw9q5hIx7bn5MrsvyTGAfh6kTOo07Q+Pfld/8Y5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.5 + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.5) + dev: false /@babel/preset-modules@0.1.5(@babel/core@7.22.5): resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} @@ -2563,7 +2653,6 @@ packages: '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.8.0) '@babel/types': 7.22.5 esutils: 2.0.3 - dev: true /@babel/preset-react@7.22.5(@babel/core@7.8.0): resolution: {integrity: sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==} @@ -2805,6 +2894,76 @@ packages: wrap-ansi-cjs: /wrap-ansi@7.0.0 dev: true + /@jest/create-cache-key-function@29.6.3: + resolution: {integrity: sha512-kzSK9XAxtD1kRPJKxsmD0YKw2fyXveP+5ikeQkCYCHeacWW1EGYMTgjDIM/Di4Uhttx7lnHwrNpz2xn+0rTp8g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + dev: false + + /@jest/environment@29.6.4: + resolution: {integrity: sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.6.4 + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + jest-mock: 29.6.3 + dev: false + + /@jest/fake-timers@29.6.4: + resolution: {integrity: sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 18.15.11 + jest-message-util: 29.6.3 + jest-mock: 29.6.3 + jest-util: 29.6.3 + dev: false + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: false + + /@jest/types@26.6.2: + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.15.11 + '@types/yargs': 15.0.15 + chalk: 4.1.2 + dev: false + + /@jest/types@27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.15.11 + '@types/yargs': 16.0.5 + chalk: 4.1.2 + dev: false + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.15.11 + '@types/yargs': 17.0.24 + chalk: 4.1.2 + dev: false + /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} @@ -2930,6 +3089,233 @@ packages: source-map: 0.7.4 webpack: 5.78.0(@swc/core@1.3.23) + /@react-native-community/cli-clean@11.3.6: + resolution: {integrity: sha512-jOOaeG5ebSXTHweq1NznVJVAFKtTFWL4lWgUXl845bCGX7t1lL8xQNWHKwT8Oh1pGR2CI3cKmRjY4hBg+pEI9g==} + dependencies: + '@react-native-community/cli-tools': 11.3.6 + chalk: 4.1.2 + execa: 5.1.1 + prompts: 2.4.2 + transitivePeerDependencies: + - encoding + dev: false + + /@react-native-community/cli-config@11.3.6: + resolution: {integrity: sha512-edy7fwllSFLan/6BG6/rznOBCLPrjmJAE10FzkEqNLHowi0bckiAPg1+1jlgQ2qqAxV5kuk+c9eajVfQvPLYDA==} + dependencies: + '@react-native-community/cli-tools': 11.3.6 + chalk: 4.1.2 + cosmiconfig: 5.2.1 + deepmerge: 4.3.1 + glob: 7.2.3 + joi: 17.9.2 + transitivePeerDependencies: + - encoding + dev: false + + /@react-native-community/cli-debugger-ui@11.3.6: + resolution: {integrity: sha512-jhMOSN/iOlid9jn/A2/uf7HbC3u7+lGktpeGSLnHNw21iahFBzcpuO71ekEdlmTZ4zC/WyxBXw9j2ka33T358w==} + dependencies: + serve-static: 1.15.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@react-native-community/cli-doctor@11.3.6: + resolution: {integrity: sha512-UT/Tt6omVPi1j6JEX+CObc85eVFghSZwy4GR9JFMsO7gNg2Tvcu1RGWlUkrbmWMAMHw127LUu6TGK66Ugu1NLA==} + dependencies: + '@react-native-community/cli-config': 11.3.6 + '@react-native-community/cli-platform-android': 11.3.6 + '@react-native-community/cli-platform-ios': 11.3.6 + '@react-native-community/cli-tools': 11.3.6 + chalk: 4.1.2 + command-exists: 1.2.9 + envinfo: 7.10.0 + execa: 5.1.1 + hermes-profile-transformer: 0.0.6 + ip: 1.1.8 + node-stream-zip: 1.15.0 + ora: 5.4.1 + prompts: 2.4.2 + semver: 7.5.3 + strip-ansi: 5.2.0 + sudo-prompt: 9.2.1 + wcwidth: 1.0.1 + yaml: 2.3.1 + transitivePeerDependencies: + - encoding + dev: false + + /@react-native-community/cli-hermes@11.3.6: + resolution: {integrity: sha512-O55YAYGZ3XynpUdePPVvNuUPGPY0IJdctLAOHme73OvS80gNwfntHDXfmY70TGHWIfkK2zBhA0B+2v8s5aTyTA==} + dependencies: + '@react-native-community/cli-platform-android': 11.3.6 + '@react-native-community/cli-tools': 11.3.6 + chalk: 4.1.2 + hermes-profile-transformer: 0.0.6 + ip: 1.1.8 + transitivePeerDependencies: + - encoding + dev: false + + /@react-native-community/cli-platform-android@11.3.6: + resolution: {integrity: sha512-ZARrpLv5tn3rmhZc//IuDM1LSAdYnjUmjrp58RynlvjLDI4ZEjBAGCQmgysRgXAsK7ekMrfkZgemUczfn9td2A==} + dependencies: + '@react-native-community/cli-tools': 11.3.6 + chalk: 4.1.2 + execa: 5.1.1 + glob: 7.2.3 + logkitty: 0.7.1 + transitivePeerDependencies: + - encoding + dev: false + + /@react-native-community/cli-platform-ios@11.3.6: + resolution: {integrity: sha512-tZ9VbXWiRW+F+fbZzpLMZlj93g3Q96HpuMsS6DRhrTiG+vMQ3o6oPWSEEmMGOvJSYU7+y68Dc9ms2liC7VD6cw==} + dependencies: + '@react-native-community/cli-tools': 11.3.6 + chalk: 4.1.2 + execa: 5.1.1 + fast-xml-parser: 4.2.7 + glob: 7.2.3 + ora: 5.4.1 + transitivePeerDependencies: + - encoding + dev: false + + /@react-native-community/cli-plugin-metro@11.3.6(@babel/core@7.8.0): + resolution: {integrity: sha512-D97racrPX3069ibyabJNKw9aJpVcaZrkYiEzsEnx50uauQtPDoQ1ELb/5c6CtMhAEGKoZ0B5MS23BbsSZcLs2g==} + dependencies: + '@react-native-community/cli-server-api': 11.3.6 + '@react-native-community/cli-tools': 11.3.6 + chalk: 4.1.2 + execa: 5.1.1 + metro: 0.76.7 + metro-config: 0.76.7 + metro-core: 0.76.7 + metro-react-native-babel-transformer: 0.76.7(@babel/core@7.8.0) + metro-resolver: 0.76.7 + metro-runtime: 0.76.7 + readline: 1.3.0 + transitivePeerDependencies: + - '@babel/core' + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /@react-native-community/cli-server-api@11.3.6: + resolution: {integrity: sha512-8GUKodPnURGtJ9JKg8yOHIRtWepPciI3ssXVw5jik7+dZ43yN8P5BqCoDaq8e1H1yRer27iiOfT7XVnwk8Dueg==} + dependencies: + '@react-native-community/cli-debugger-ui': 11.3.6 + '@react-native-community/cli-tools': 11.3.6 + compression: 1.7.4 + connect: 3.7.0 + errorhandler: 1.5.1 + nocache: 3.0.4 + pretty-format: 26.6.2 + serve-static: 1.15.0 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /@react-native-community/cli-tools@11.3.6: + resolution: {integrity: sha512-JpmUTcDwAGiTzLsfMlIAYpCMSJ9w2Qlf7PU7mZIRyEu61UzEawyw83DkqfbzDPBuRwRnaeN44JX2CP/yTO3ThQ==} + dependencies: + appdirsjs: 1.2.7 + chalk: 4.1.2 + find-up: 5.0.0 + mime: 2.5.2 + node-fetch: 2.7.0 + open: 6.4.0 + ora: 5.4.1 + semver: 7.5.3 + shell-quote: 1.8.1 + transitivePeerDependencies: + - encoding + dev: false + + /@react-native-community/cli-types@11.3.6: + resolution: {integrity: sha512-6DxjrMKx5x68N/tCJYVYRKAtlRHbtUVBZrnAvkxbRWFD9v4vhNgsPM0RQm8i2vRugeksnao5mbnRGpS6c0awCw==} + dependencies: + joi: 17.9.2 + dev: false + + /@react-native-community/cli@11.3.6(@babel/core@7.8.0): + resolution: {integrity: sha512-bdwOIYTBVQ9VK34dsf6t3u6vOUU5lfdhKaAxiAVArjsr7Je88Bgs4sAbsOYsNK3tkE8G77U6wLpekknXcanlww==} + engines: {node: '>=16'} + hasBin: true + dependencies: + '@react-native-community/cli-clean': 11.3.6 + '@react-native-community/cli-config': 11.3.6 + '@react-native-community/cli-debugger-ui': 11.3.6 + '@react-native-community/cli-doctor': 11.3.6 + '@react-native-community/cli-hermes': 11.3.6 + '@react-native-community/cli-plugin-metro': 11.3.6(@babel/core@7.8.0) + '@react-native-community/cli-server-api': 11.3.6 + '@react-native-community/cli-tools': 11.3.6 + '@react-native-community/cli-types': 11.3.6 + chalk: 4.1.2 + commander: 9.5.0 + execa: 5.1.1 + find-up: 4.1.0 + fs-extra: 8.1.0 + graceful-fs: 4.2.11 + prompts: 2.4.2 + semver: 7.5.3 + transitivePeerDependencies: + - '@babel/core' + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /@react-native/assets-registry@0.72.0: + resolution: {integrity: sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ==} + dev: false + + /@react-native/codegen@0.72.6(@babel/preset-env@7.22.5): + resolution: {integrity: sha512-idTVI1es/oopN0jJT/0jB6nKdvTUKE3757zA5+NPXZTeB46CIRbmmos4XBiAec8ufu9/DigLPbHTYAaMNZJ6Ig==} + peerDependencies: + '@babel/preset-env': ^7.1.6 + dependencies: + '@babel/parser': 7.22.5 + '@babel/preset-env': 7.22.5(@babel/core@7.8.0) + flow-parser: 0.206.0 + jscodeshift: 0.14.0(@babel/preset-env@7.22.5) + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@react-native/gradle-plugin@0.72.11: + resolution: {integrity: sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw==} + dev: false + + /@react-native/js-polyfills@0.72.1: + resolution: {integrity: sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA==} + dev: false + + /@react-native/normalize-colors@0.72.0: + resolution: {integrity: sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw==} + dev: false + + /@react-native/virtualized-lists@0.72.8(react-native@0.72.4): + resolution: {integrity: sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw==} + peerDependencies: + react-native: '*' + dependencies: + invariant: 2.2.4 + nullthrows: 1.1.1 + react-native: 0.72.4(@babel/core@7.8.0)(@babel/preset-env@7.22.5)(react@18.0.0) + dev: false + /@sideway/address@4.1.4: resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} dependencies: @@ -2941,6 +3327,10 @@ packages: /@sideway/pinpoint@2.0.0: resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: false + /@sindresorhus/is@0.14.0: resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} engines: {node: '>=6'} @@ -2951,6 +3341,18 @@ packages: engines: {node: '>=4'} dev: true + /@sinonjs/commons@3.0.0: + resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + dependencies: + type-detect: 4.0.8 + dev: false + + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + dependencies: + '@sinonjs/commons': 3.0.0 + dev: false + /@stencil/core@2.22.3: resolution: {integrity: sha512-kmVA0M/HojwsfkeHsifvHVIYe4l5tin7J5+DLgtl8h6WWfiMClND5K3ifCXXI2ETDNKiEk21p6jql3Fx9o2rng==} engines: {node: '>=12.10.0', npm: '>=6.0.0'} @@ -3976,6 +4378,22 @@ packages: '@types/node': 18.15.11 dev: true + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: false + + /@types/istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: false + + /@types/istanbul-reports@3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: false + /@types/json-schema@7.0.12: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} @@ -4138,6 +4556,10 @@ packages: '@types/node': 18.15.11 dev: true + /@types/stack-utils@2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: false + /@types/vinyl@2.0.7: resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} dependencies: @@ -4155,6 +4577,28 @@ packages: '@types/node': 18.15.11 dev: true + /@types/yargs-parser@21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: false + + /@types/yargs@15.0.15: + resolution: {integrity: sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: false + + /@types/yargs@16.0.5: + resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: false + + /@types/yargs@17.0.24: + resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: false + /@typescript-eslint/eslint-plugin@5.20.0(@typescript-eslint/parser@5.20.0)(eslint@8.12.0)(typescript@4.1.2): resolution: {integrity: sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4503,6 +4947,13 @@ packages: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + /abortcontroller-polyfill@1.7.5: resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} dev: false @@ -4513,7 +4964,6 @@ packages: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - dev: true /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} @@ -4625,6 +5075,10 @@ packages: uri-js: 4.4.1 dev: true + /anser@1.4.10: + resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + dev: false + /ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: @@ -4637,11 +5091,24 @@ packages: dependencies: type-fest: 0.21.3 + /ansi-fragments@0.2.1: + resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} + dependencies: + colorette: 1.4.0 + slice-ansi: 2.1.0 + strip-ansi: 5.2.0 + dev: false + /ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} hasBin: true + /ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + dev: false + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -4663,6 +5130,11 @@ packages: dependencies: color-convert: 2.0.1 + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: false + /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -4679,6 +5151,10 @@ packages: normalize-path: 3.0.0 picomatch: 2.3.1 + /appdirsjs@1.2.7: + resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} + dev: false + /archive-type@4.0.0: resolution: {integrity: sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==} engines: {node: '>=4'} @@ -4698,7 +5174,6 @@ packages: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 - dev: true /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -4755,6 +5230,10 @@ packages: engines: {node: '>=8'} dev: true + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: false + /asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: @@ -4766,11 +5245,27 @@ packages: engines: {node: '>=0.8'} dev: true + /ast-types@0.15.2: + resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} + engines: {node: '>=4'} + dependencies: + tslib: 2.6.0 + dev: false + + /astral-regex@1.0.0: + resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} + engines: {node: '>=4'} + dev: false + /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} dev: true + /async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + dev: false + /async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} dependencies: @@ -4779,7 +5274,6 @@ packages: /async@3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - dev: true /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -4817,6 +5311,14 @@ packages: resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} dev: true + /babel-core@7.0.0-bridge.0(@babel/core@7.22.5): + resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: false + /babel-helper-evaluate-path@0.5.0: resolution: {integrity: sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==} dev: true @@ -4899,7 +5401,6 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true /babel-plugin-polyfill-corejs3@0.8.1(@babel/core@7.22.5): resolution: {integrity: sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==} @@ -4922,7 +5423,6 @@ packages: core-js-compat: 3.31.0 transitivePeerDependencies: - supports-color - dev: true /babel-plugin-polyfill-regenerator@0.5.0(@babel/core@7.22.5): resolution: {integrity: sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==} @@ -4943,7 +5443,26 @@ packages: '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.8.0) transitivePeerDependencies: - supports-color - dev: true + + /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: + resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} + dev: false + + /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.22.5): + resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} + dependencies: + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.5) + transitivePeerDependencies: + - '@babel/core' + dev: false + + /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.8.0): + resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} + dependencies: + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.8.0) + transitivePeerDependencies: + - '@babel/core' + dev: false /babel-plugin-transform-imports-api@1.0.0: resolution: {integrity: sha512-EtPFtwUFwXy4HyRwXiR7dCijk2b1dd12bVs39oY8aMZUnypFEMrctGX6/YrhQzhCPFweV7NTPhc+fD4zItWzUA==} @@ -4965,47 +5484,113 @@ packages: lodash: 4.17.21 dev: false - /babel-preset-taro@3.6.8(@babel/core@7.8.0): - resolution: {integrity: sha512-TQXLwtzK3PhePe7NNjytsP+pstfuoFXjsEMWEuq2FdMRBT0YctXI5d0zUFpuY1pDXn2IQeXjJEt1almUmZBbuQ==} + /babel-preset-fbjs@3.4.0(@babel/core@7.22.5): + resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: - '@babel/core': '*' + '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.8.0 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.8.0) - '@babel/plugin-proposal-decorators': 7.22.5(@babel/core@7.8.0) - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.8.0) - '@babel/plugin-transform-runtime': 7.22.5(@babel/core@7.8.0) - '@babel/preset-env': 7.22.5(@babel/core@7.8.0) - '@babel/preset-react': 7.22.5(@babel/core@7.8.0) - '@babel/preset-typescript': 7.22.5(@babel/core@7.8.0) - '@babel/runtime': 7.22.5 - '@babel/runtime-corejs3': 7.22.5 - '@tarojs/helper': 3.6.8 - '@tarojs/shared': 3.6.8 - babel-plugin-dynamic-import-node: 2.3.3 - babel-plugin-global-define: 1.0.3 - babel-plugin-jsx-attributes-array-to-object: 0.3.0 - babel-plugin-minify-dead-code-elimination: 0.5.2 - babel-plugin-transform-imports-api: 1.0.0 - babel-plugin-transform-react-jsx-to-rn-stylesheet: 3.6.8 - core-js: 3.31.0 - lodash: 4.17.21 - metro-react-native-babel-preset: 0.72.4(@babel/core@7.8.0) - react-refresh: 0.11.0 + '@babel/core': 7.22.5 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.5) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-classes': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.5) + babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 transitivePeerDependencies: - supports-color - dev: true + dev: false - /babel-runtime@6.26.0: - resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} + /babel-preset-fbjs@3.4.0(@babel/core@7.8.0): + resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - core-js: 2.6.12 - regenerator-runtime: 0.11.1 + '@babel/core': 7.8.0 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.8.0) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.8.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.8.0) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.8.0) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-classes': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.8.0) + babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 + transitivePeerDependencies: + - supports-color dev: false + /babel-preset-taro@3.6.8(@babel/core@7.8.0): + resolution: {integrity: sha512-TQXLwtzK3PhePe7NNjytsP+pstfuoFXjsEMWEuq2FdMRBT0YctXI5d0zUFpuY1pDXn2IQeXjJEt1almUmZBbuQ==} + peerDependencies: + '@babel/core': '*' + dependencies: + '@babel/core': 7.8.0 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.8.0) + '@babel/plugin-proposal-decorators': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-runtime': 7.22.5(@babel/core@7.8.0) + '@babel/preset-env': 7.22.5(@babel/core@7.8.0) + '@babel/preset-react': 7.22.5(@babel/core@7.8.0) + '@babel/preset-typescript': 7.22.5(@babel/core@7.8.0) + '@babel/runtime': 7.22.5 + '@babel/runtime-corejs3': 7.22.5 + '@tarojs/helper': 3.6.8 + '@tarojs/shared': 3.6.8 + babel-plugin-dynamic-import-node: 2.3.3 + babel-plugin-global-define: 1.0.3 + babel-plugin-jsx-attributes-array-to-object: 0.3.0 + babel-plugin-minify-dead-code-elimination: 0.5.2 + babel-plugin-transform-imports-api: 1.0.0 + babel-plugin-transform-react-jsx-to-rn-stylesheet: 3.6.8 + core-js: 3.31.0 + lodash: 4.17.21 + metro-react-native-babel-preset: 0.72.4(@babel/core@7.8.0) + react-refresh: 0.11.0 + transitivePeerDependencies: + - supports-color + dev: true + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true /balanced-match@2.0.0: resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} @@ -5108,7 +5693,6 @@ packages: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -5132,6 +5716,12 @@ packages: node-releases: 2.0.12 update-browserslist-db: 1.0.11(browserslist@4.21.9) + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: false + /buffer-alloc-unsafe@1.1.0: resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} dev: true @@ -5172,7 +5762,6 @@ packages: /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} - dev: true /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} @@ -5211,6 +5800,20 @@ packages: get-intrinsic: 1.2.1 dev: true + /caller-callsite@2.0.0: + resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} + engines: {node: '>=4'} + dependencies: + callsites: 2.0.0 + dev: false + + /caller-path@2.0.0: + resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} + engines: {node: '>=4'} + dependencies: + caller-callsite: 2.0.0 + dev: false + /callsite-record@4.1.5: resolution: {integrity: sha512-OqeheDucGKifjQRx524URgV4z4NaKjocGhygTptDea+DLROre4ZEecA4KXDq+P7qlGCohYVNOh3qr+y5XH5Ftg==} dependencies: @@ -5227,6 +5830,11 @@ packages: resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} dev: true + /callsites@2.0.0: + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} + engines: {node: '>=4'} + dev: false + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -5257,12 +5865,10 @@ packages: /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - dev: true /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - dev: true /camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} @@ -5369,7 +5975,11 @@ packages: /ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - dev: true + + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: false /classnames@2.3.2: resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} @@ -5426,6 +6036,14 @@ packages: engines: {node: '>= 10'} dev: true + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: false + /cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: @@ -5434,6 +6052,15 @@ packages: wrap-ansi: 7.0.0 dev: true + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + /clone-buffer@1.0.0: resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} engines: {node: '>= 0.10'} @@ -5513,6 +6140,10 @@ packages: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} dev: true + /colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + dev: false + /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} dev: true @@ -5524,6 +6155,14 @@ packages: delayed-stream: 1.0.0 dev: true + /command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + dev: false + + /commander@2.13.0: + resolution: {integrity: sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==} + dev: false + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -5542,6 +6181,11 @@ packages: engines: {node: '>= 12'} dev: true + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: false + /common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} @@ -5553,7 +6197,6 @@ packages: engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - dev: true /compression@1.7.4: resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} @@ -5568,11 +6211,9 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true /config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -5598,6 +6239,18 @@ packages: engines: {node: '>=0.8'} dev: true + /connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + /consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} dev: true @@ -5841,12 +6494,6 @@ packages: resolution: {integrity: sha512-/AnE9Y4OsJZicCzIe97JP5XoPKQJfTuEG43aEVLFJGOJpyqELod+pE6LEl63DfG1Mp8wX97LDaDpy1GmLEUxlg==} requiresBuild: true - /core-js@2.6.12: - resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - requiresBuild: true - dev: false - /core-js@3.31.0: resolution: {integrity: sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ==} requiresBuild: true @@ -5858,7 +6505,16 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true + + /cosmiconfig@5.2.1: + resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} + engines: {node: '>=4'} + dependencies: + import-fresh: 2.0.0 + is-directory: 0.3.1 + js-yaml: 3.14.1 + parse-json: 4.0.0 + dev: false /cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} @@ -6149,7 +6805,6 @@ packages: optional: true dependencies: ms: 2.0.0 - dev: true /debug@3.1.0: resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} @@ -6195,7 +6850,6 @@ packages: /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - dev: true /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -6290,6 +6944,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: false + /default-gateway@6.0.3: resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} engines: {node: '>= 10'} @@ -6338,6 +6997,10 @@ packages: engines: {node: '>=0.4.0'} dev: true + /denodeify@1.2.1: + resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} + dev: false + /depcheck@1.4.3: resolution: {integrity: sha512-vy8xe1tlLFu7t4jFyoirMmOR7x7N601ubU9Gkifyr9z8rjBFtEdWHDBMqXyk6OkK+94NXutzddVXJuo0JlUQKQ==} engines: {node: '>=10'} @@ -6378,7 +7041,14 @@ packages: /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dev: true + + /deprecated-react-native-prop-types@4.1.0: + resolution: {integrity: sha512-WfepZHmRbbdTvhcolb8aOKEvQdcmTMn5tKLbqbXmkBvjFjRVWAYqsXk/DBsV8TZxws8SdGHLuHaJrHSQUPRdfw==} + dependencies: + '@react-native/normalize-colors': 0.72.0 + invariant: 2.2.4 + prop-types: 15.8.1 + dev: false /deps-regex@0.1.4: resolution: {integrity: sha512-3tzwGYogSJi8HoG93R5x9NrdefZQOXgHgGih/7eivloOq6yC6O+yoFxZnkgP661twvfILONfoKRdF9GQOGx2RA==} @@ -6387,7 +7057,6 @@ packages: /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true /detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} @@ -6576,7 +7245,6 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true /ejs@3.1.9: resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} @@ -6591,7 +7259,6 @@ packages: /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -6604,7 +7271,6 @@ packages: /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - dev: true /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -6632,7 +7298,6 @@ packages: resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} engines: {node: '>=4'} hasBin: true - dev: true /errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} @@ -6647,13 +7312,20 @@ packages: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - dev: true /error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} dependencies: stackframe: 1.3.4 + /errorhandler@1.5.1: + resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} + engines: {node: '>= 0.8'} + dependencies: + accepts: 1.3.8 + escape-html: 1.0.3 + dev: false + /es-abstract@1.21.2: resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} @@ -6932,12 +7604,16 @@ packages: /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: false + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -7199,7 +7875,6 @@ packages: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - dev: true /esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} @@ -7233,7 +7908,11 @@ packages: /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - dev: true + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -7256,7 +7935,6 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true /execall@2.0.0: resolution: {integrity: sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==} @@ -7362,6 +8040,13 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-xml-parser@4.2.7: + resolution: {integrity: sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + /fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -7380,6 +8065,12 @@ packages: websocket-driver: 0.7.4 dev: true + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: false + /fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} dependencies: @@ -7465,6 +8156,21 @@ packages: resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} + /finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /finalhandler@1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} @@ -7507,7 +8213,6 @@ packages: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} @@ -7547,6 +8252,15 @@ packages: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true + /flow-enums-runtime@0.0.5: + resolution: {integrity: sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ==} + dev: false + + /flow-parser@0.206.0: + resolution: {integrity: sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==} + engines: {node: '>=0.4.0'} + dev: false + /follow-redirects@1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} @@ -7601,7 +8315,6 @@ packages: /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - dev: true /from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} @@ -7628,7 +8341,6 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} @@ -7665,7 +8377,6 @@ packages: /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: true /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} @@ -7718,7 +8429,6 @@ packages: /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - dev: true /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} @@ -7780,7 +8490,6 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true /global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} @@ -8009,6 +8718,23 @@ packages: tslib: 2.6.0 dev: false + /hermes-estree@0.12.0: + resolution: {integrity: sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw==} + dev: false + + /hermes-parser@0.12.0: + resolution: {integrity: sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw==} + dependencies: + hermes-estree: 0.12.0 + dev: false + + /hermes-profile-transformer@0.0.6: + resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} + engines: {node: '>=8'} + dependencies: + source-map: 0.7.4 + dev: false + /highlight-es@1.0.3: resolution: {integrity: sha512-s/SIX6yp/5S1p8aC/NRDC1fwEb+myGIfp8/TzZz0rtAv8fzsdX7vGl3Q1TrXCsczFq8DI3CBFBCySPClfBSdbg==} dependencies: @@ -8146,7 +8872,6 @@ packages: setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 - dev: true /http-parser-js@0.5.8: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} @@ -8215,7 +8940,6 @@ packages: /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - dev: true /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} @@ -8263,10 +8987,26 @@ packages: dev: true optional: true + /image-size@1.0.2: + resolution: {integrity: sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + queue: 6.0.2 + dev: false + /immutable@4.3.0: resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} dev: true + /import-fresh@2.0.0: + resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} + engines: {node: '>=4'} + dependencies: + caller-path: 2.0.0 + resolve-from: 3.0.0 + dev: false + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -8288,7 +9028,6 @@ packages: /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - dev: true /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} @@ -8300,7 +9039,6 @@ packages: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true /inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} @@ -8382,11 +9120,9 @@ packages: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: loose-envify: 1.4.0 - dev: true /ip@1.1.8: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} - dev: true /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -8416,7 +9152,6 @@ packages: /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} @@ -8466,6 +9201,11 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-directory@0.3.1: + resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} + engines: {node: '>=0.10.0'} + dev: false + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -8480,10 +9220,14 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + /is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: false + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: true /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} @@ -8609,7 +9353,6 @@ packages: /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - dev: true /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} @@ -8658,6 +9401,11 @@ packages: resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} dev: true + /is-wsl@1.1.0: + resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} + engines: {node: '>=4'} + dev: false + /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -8671,7 +9419,6 @@ packages: /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true /isbinaryfile@5.0.0: resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==} @@ -8729,8 +9476,90 @@ packages: resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} dev: true - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + /jest-environment-node@29.6.4: + resolution: {integrity: sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.6.4 + '@jest/fake-timers': 29.6.4 + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + jest-mock: 29.6.3 + jest-util: 29.6.3 + dev: false + + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: false + + /jest-message-util@29.6.3: + resolution: {integrity: sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.22.5 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.6.3 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: false + + /jest-mock@29.6.3: + resolution: {integrity: sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + jest-util: 29.6.3 + dev: false + + /jest-regex-util@27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: false + + /jest-util@27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 18.15.11 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: false + + /jest-util@29.6.3: + resolution: {integrity: sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.15.11 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: false + + /jest-validate@29.6.3: + resolution: {integrity: sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.6.3 + dev: false + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: '@types/node': 18.15.11 @@ -8769,7 +9598,6 @@ packages: dependencies: argparse: 1.0.10 esprima: 4.0.1 - dev: true /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} @@ -8782,6 +9610,44 @@ packages: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} dev: true + /jsc-android@250231.0.0: + resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} + dev: false + + /jsc-safe-url@0.2.4: + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + dev: false + + /jscodeshift@0.14.0(@babel/preset-env@7.22.5): + resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} + hasBin: true + peerDependencies: + '@babel/preset-env': ^7.1.6 + dependencies: + '@babel/core': 7.22.5 + '@babel/parser': 7.22.5 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.5) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.5) + '@babel/preset-env': 7.22.5(@babel/core@7.8.0) + '@babel/preset-flow': 7.22.5(@babel/core@7.22.5) + '@babel/preset-typescript': 7.22.5(@babel/core@7.22.5) + '@babel/register': 7.22.5(@babel/core@7.22.5) + babel-core: 7.0.0-bridge.0(@babel/core@7.22.5) + chalk: 4.1.2 + flow-parser: 0.206.0 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + neo-async: 2.6.2 + node-dir: 0.1.17 + recast: 0.21.5 + temp: 0.8.4 + write-file-atomic: 2.4.3 + transitivePeerDependencies: + - supports-color + dev: false + /jsdom@21.1.2: resolution: {integrity: sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ==} engines: {node: '>=14'} @@ -8836,6 +9702,10 @@ packages: resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} dev: true + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: false + /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -8918,7 +9788,6 @@ packages: /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - dev: true /klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} @@ -8985,6 +9854,11 @@ packages: - supports-color dev: true + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: false + /levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} @@ -9159,7 +10033,6 @@ packages: engines: {node: '>=8'} dependencies: p-locate: 4.1.0 - dev: true /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} @@ -9184,6 +10057,10 @@ packages: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: false + /lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: true @@ -9202,6 +10079,15 @@ packages: chalk: 4.1.2 is-unicode-supported: 0.1.0 + /logkitty@0.7.1: + resolution: {integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==} + hasBin: true + dependencies: + ansi-fragments: 0.2.1 + dayjs: 1.11.9 + yargs: 15.4.1 + dev: false + /loglevel-plugin-prefix@0.8.4: resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} dev: true @@ -9263,7 +10149,6 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 - dev: true /magic-string@0.30.0: resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} @@ -9297,6 +10182,12 @@ packages: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: false + /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -9381,6 +10272,10 @@ packages: fs-monkey: 1.0.4 dev: true + /memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + dev: false + /memoize-one@6.0.0: resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} @@ -9425,6 +10320,109 @@ packages: engines: {node: '>= 0.6'} dev: true + /metro-babel-transformer@0.76.7: + resolution: {integrity: sha512-bgr2OFn0J4r0qoZcHrwEvccF7g9k3wdgTOgk6gmGHrtlZ1Jn3oCpklW/DfZ9PzHfjY2mQammKTc19g/EFGyOJw==} + engines: {node: '>=16'} + dependencies: + '@babel/core': 7.22.5 + hermes-parser: 0.12.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /metro-cache-key@0.76.7: + resolution: {integrity: sha512-0pecoIzwsD/Whn/Qfa+SDMX2YyasV0ndbcgUFx7w1Ct2sLHClujdhQ4ik6mvQmsaOcnGkIyN0zcceMDjC2+BFQ==} + engines: {node: '>=16'} + dev: false + + /metro-cache@0.76.7: + resolution: {integrity: sha512-nWBMztrs5RuSxZRI7hgFgob5PhYDmxICh9FF8anm9/ito0u0vpPvRxt7sRu8fyeD2AHdXqE7kX32rWY0LiXgeg==} + engines: {node: '>=16'} + dependencies: + metro-core: 0.76.7 + rimraf: 3.0.2 + dev: false + + /metro-config@0.76.7: + resolution: {integrity: sha512-CFDyNb9bqxZemiChC/gNdXZ7OQkIwmXzkrEXivcXGbgzlt/b2juCv555GWJHyZSlorwnwJfY3uzAFu4A9iRVfg==} + engines: {node: '>=16'} + dependencies: + connect: 3.7.0 + cosmiconfig: 5.2.1 + jest-validate: 29.6.3 + metro: 0.76.7 + metro-cache: 0.76.7 + metro-core: 0.76.7 + metro-runtime: 0.76.7 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /metro-core@0.76.7: + resolution: {integrity: sha512-0b8KfrwPmwCMW+1V7ZQPkTy2tsEKZjYG9Pu1PTsu463Z9fxX7WaR0fcHFshv+J1CnQSUTwIGGjbNvj1teKe+pw==} + engines: {node: '>=16'} + dependencies: + lodash.throttle: 4.1.1 + metro-resolver: 0.76.7 + dev: false + + /metro-file-map@0.76.7: + resolution: {integrity: sha512-s+zEkTcJ4mOJTgEE2ht4jIo1DZfeWreQR3tpT3gDV/Y/0UQ8aJBTv62dE775z0GLsWZApiblAYZsj7ZE8P06nw==} + engines: {node: '>=16'} + dependencies: + anymatch: 3.1.3 + debug: 2.6.9 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-regex-util: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + micromatch: 4.0.5 + node-abort-controller: 3.1.1 + nullthrows: 1.1.1 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /metro-inspector-proxy@0.76.7: + resolution: {integrity: sha512-rNZ/6edTl/1qUekAhAbaFjczMphM50/UjtxiKulo6vqvgn/Mjd9hVqDvVYfAMZXqPvlusD88n38UjVYPkruLSg==} + engines: {node: '>=16'} + hasBin: true + dependencies: + connect: 3.7.0 + debug: 2.6.9 + node-fetch: 2.7.0 + ws: 7.5.9 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /metro-minify-terser@0.76.7: + resolution: {integrity: sha512-FQiZGhIxCzhDwK4LxyPMLlq0Tsmla10X7BfNGlYFK0A5IsaVKNJbETyTzhpIwc+YFRT4GkFFwgo0V2N5vxO5HA==} + engines: {node: '>=16'} + dependencies: + terser: 5.18.2 + dev: false + + /metro-minify-uglify@0.76.7: + resolution: {integrity: sha512-FuXIU3j2uNcSvQtPrAJjYWHruPiQ+EpE++J9Z+VznQKEHcIxMMoQZAfIF2IpZSrZYfLOjVFyGMvj41jQMxV1Vw==} + engines: {node: '>=16'} + dependencies: + uglify-es: 3.3.9 + dev: false + /metro-react-native-babel-preset@0.72.4(@babel/core@7.8.0): resolution: {integrity: sha512-YGCVaYe1H5fOFktdDdL9IwAyiXjPh1t2eZZFp3KFJak6fxKpN+q5PPhe1kzMa77dbCAqgImv43zkfGa6i27eyA==} peerDependencies: @@ -9473,6 +10471,298 @@ packages: - supports-color dev: true + /metro-react-native-babel-preset@0.76.7(@babel/core@7.22.5): + resolution: {integrity: sha512-R25wq+VOSorAK3hc07NW0SmN8z9S/IR0Us0oGAsBcMZnsgkbOxu77Mduqf+f4is/wnWHc5+9bfiqdLnaMngiVw==} + engines: {node: '>=16'} + peerDependencies: + '@babel/core': '*' + dependencies: + '@babel/core': 7.22.5 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.22.5) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-proposal-export-default-from': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.5) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-classes': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-runtime': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-typescript': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.5) + '@babel/template': 7.22.5 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.22.5) + react-refresh: 0.4.3 + transitivePeerDependencies: + - supports-color + dev: false + + /metro-react-native-babel-preset@0.76.7(@babel/core@7.8.0): + resolution: {integrity: sha512-R25wq+VOSorAK3hc07NW0SmN8z9S/IR0Us0oGAsBcMZnsgkbOxu77Mduqf+f4is/wnWHc5+9bfiqdLnaMngiVw==} + engines: {node: '>=16'} + peerDependencies: + '@babel/core': '*' + dependencies: + '@babel/core': 7.8.0 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.8.0) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.8.0) + '@babel/plugin-proposal-export-default-from': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.8.0) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.8.0) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.8.0) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.8.0) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.8.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.8.0) + '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.8.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.8.0) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-classes': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-runtime': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-typescript': 7.22.5(@babel/core@7.8.0) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.8.0) + '@babel/template': 7.22.5 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.8.0) + react-refresh: 0.4.3 + transitivePeerDependencies: + - supports-color + dev: false + + /metro-react-native-babel-transformer@0.76.7(@babel/core@7.8.0): + resolution: {integrity: sha512-W6lW3J7y/05ph3c2p3KKJNhH0IdyxdOCbQ5it7aM2MAl0SM4wgKjaV6EYv9b3rHklpV6K3qMH37UKVcjMooWiA==} + engines: {node: '>=16'} + peerDependencies: + '@babel/core': '*' + dependencies: + '@babel/core': 7.8.0 + babel-preset-fbjs: 3.4.0(@babel/core@7.8.0) + hermes-parser: 0.12.0 + metro-react-native-babel-preset: 0.76.7(@babel/core@7.8.0) + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /metro-resolver@0.76.7: + resolution: {integrity: sha512-pC0Wgq29HHIHrwz23xxiNgylhI8Rq1V01kQaJ9Kz11zWrIdlrH0ZdnJ7GC6qA0ErROG+cXmJ0rJb8/SW1Zp2IA==} + engines: {node: '>=16'} + dev: false + + /metro-runtime@0.76.7: + resolution: {integrity: sha512-MuWHubQHymUWBpZLwuKZQgA/qbb35WnDAKPo83rk7JRLIFPvzXSvFaC18voPuzJBt1V98lKQIonh6MiC9gd8Ug==} + engines: {node: '>=16'} + dependencies: + '@babel/runtime': 7.22.5 + react-refresh: 0.4.3 + dev: false + + /metro-runtime@0.76.8: + resolution: {integrity: sha512-XKahvB+iuYJSCr3QqCpROli4B4zASAYpkK+j3a0CJmokxCDNbgyI4Fp88uIL6rNaZfN0Mv35S0b99SdFXIfHjg==} + engines: {node: '>=16'} + dependencies: + '@babel/runtime': 7.22.5 + react-refresh: 0.4.3 + dev: false + + /metro-source-map@0.76.7: + resolution: {integrity: sha512-Prhx7PeRV1LuogT0Kn5VjCuFu9fVD68eefntdWabrksmNY6mXK8pRqzvNJOhTojh6nek+RxBzZeD6MIOOyXS6w==} + engines: {node: '>=16'} + dependencies: + '@babel/traverse': 7.22.5 + '@babel/types': 7.22.5 + invariant: 2.2.4 + metro-symbolicate: 0.76.7 + nullthrows: 1.1.1 + ob1: 0.76.7 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /metro-source-map@0.76.8: + resolution: {integrity: sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==} + engines: {node: '>=16'} + dependencies: + '@babel/traverse': 7.22.5 + '@babel/types': 7.22.5 + invariant: 2.2.4 + metro-symbolicate: 0.76.8 + nullthrows: 1.1.1 + ob1: 0.76.8 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /metro-symbolicate@0.76.7: + resolution: {integrity: sha512-p0zWEME5qLSL1bJb93iq+zt5fz3sfVn9xFYzca1TJIpY5MommEaS64Va87lp56O0sfEIvh4307Oaf/ZzRjuLiQ==} + engines: {node: '>=16'} + hasBin: true + dependencies: + invariant: 2.2.4 + metro-source-map: 0.76.7 + nullthrows: 1.1.1 + source-map: 0.5.7 + through2: 2.0.5 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /metro-symbolicate@0.76.8: + resolution: {integrity: sha512-LrRL3uy2VkzrIXVlxoPtqb40J6Bf1mlPNmUQewipc3qfKKFgtPHBackqDy1YL0njDsWopCKcfGtFYLn0PTUn3w==} + engines: {node: '>=16'} + hasBin: true + dependencies: + invariant: 2.2.4 + metro-source-map: 0.76.8 + nullthrows: 1.1.1 + source-map: 0.5.7 + through2: 2.0.5 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /metro-transform-plugins@0.76.7: + resolution: {integrity: sha512-iSmnjVApbdivjuzb88Orb0JHvcEt5veVyFAzxiS5h0QB+zV79w6JCSqZlHCrbNOkOKBED//LqtKbFVakxllnNg==} + engines: {node: '>=16'} + dependencies: + '@babel/core': 7.22.5 + '@babel/generator': 7.22.5 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.5 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /metro-transform-worker@0.76.7: + resolution: {integrity: sha512-cGvELqFMVk9XTC15CMVzrCzcO6sO1lURfcbgjuuPdzaWuD11eEyocvkTX0DPiRjsvgAmicz4XYxVzgYl3MykDw==} + engines: {node: '>=16'} + dependencies: + '@babel/core': 7.22.5 + '@babel/generator': 7.22.5 + '@babel/parser': 7.22.5 + '@babel/types': 7.22.5 + babel-preset-fbjs: 3.4.0(@babel/core@7.22.5) + metro: 0.76.7 + metro-babel-transformer: 0.76.7 + metro-cache: 0.76.7 + metro-cache-key: 0.76.7 + metro-source-map: 0.76.7 + metro-transform-plugins: 0.76.7 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /metro@0.76.7: + resolution: {integrity: sha512-67ZGwDeumEPnrHI+pEDSKH2cx+C81Gx8Mn5qOtmGUPm/Up9Y4I1H2dJZ5n17MWzejNo0XAvPh0QL0CrlJEODVQ==} + engines: {node: '>=16'} + hasBin: true + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/core': 7.22.5 + '@babel/generator': 7.22.5 + '@babel/parser': 7.22.5 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.5 + '@babel/types': 7.22.5 + accepts: 1.3.8 + async: 3.2.4 + chalk: 4.1.2 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 2.6.9 + denodeify: 1.2.1 + error-stack-parser: 2.1.4 + graceful-fs: 4.2.11 + hermes-parser: 0.12.0 + image-size: 1.0.2 + invariant: 2.2.4 + jest-worker: 27.5.1 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.76.7 + metro-cache: 0.76.7 + metro-cache-key: 0.76.7 + metro-config: 0.76.7 + metro-core: 0.76.7 + metro-file-map: 0.76.7 + metro-inspector-proxy: 0.76.7 + metro-minify-terser: 0.76.7 + metro-minify-uglify: 0.76.7 + metro-react-native-babel-preset: 0.76.7(@babel/core@7.22.5) + metro-resolver: 0.76.7 + metro-runtime: 0.76.7 + metro-source-map: 0.76.7 + metro-symbolicate: 0.76.7 + metro-transform-plugins: 0.76.7 + metro-transform-worker: 0.76.7 + mime-types: 2.1.35 + node-fetch: 2.7.0 + nullthrows: 1.1.1 + rimraf: 3.0.2 + serialize-error: 2.1.0 + source-map: 0.5.7 + strip-ansi: 6.0.1 + throat: 5.0.0 + ws: 7.5.9 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -9494,13 +10784,11 @@ packages: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true - dev: true /mime@2.5.2: resolution: {integrity: sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==} engines: {node: '>=4.0.0'} hasBin: true - dev: true /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} @@ -9540,7 +10828,6 @@ packages: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 - dev: true /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} @@ -9574,7 +10861,6 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true /minipass@6.0.2: resolution: {integrity: sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==} @@ -9611,7 +10897,6 @@ packages: hasBin: true dependencies: minimist: 1.2.8 - dev: true /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} @@ -9624,14 +10909,12 @@ packages: /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true /multicast-dns-service-types@1.1.0: resolution: {integrity: sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==} @@ -9700,7 +10983,6 @@ packages: /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - dev: true /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -9717,20 +10999,57 @@ packages: lower-case: 2.0.2 tslib: 2.6.0 + /nocache@3.0.4: + resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} + engines: {node: '>=12.0.0'} + dev: false + + /node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + dev: false + + /node-dir@0.1.17: + resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} + engines: {node: '>= 0.10.5'} + dependencies: + minimatch: 3.1.2 + dev: false + /node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} dependencies: lodash: 4.17.21 dev: true + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} dev: true + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: false + /node-releases@2.0.12: resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + /node-stream-zip@1.15.0: + resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} + engines: {node: '>=0.12.0'} + dev: false + /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: @@ -9831,7 +11150,6 @@ packages: engines: {node: '>=8'} dependencies: path-key: 3.1.1 - dev: true /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -9839,6 +11157,10 @@ packages: boolbase: 1.0.0 dev: true + /nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + dev: false + /num2fraction@1.2.2: resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} dev: true @@ -9851,6 +11173,16 @@ packages: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} dev: true + /ob1@0.76.7: + resolution: {integrity: sha512-BQdRtxxoUNfSoZxqeBGOyuT9nEYSn18xZHwGMb0mMVpn2NBcYbnyKY4BK2LIHRgw33CBGlUmE+KMaNvyTpLLtQ==} + engines: {node: '>=16'} + dev: false + + /ob1@0.76.8: + resolution: {integrity: sha512-dlBkJJV5M/msj9KYA9upc+nUWVwuOFFTbu28X6kZeGwcuW+JxaHSBZ70SYQnk5M+j5JbNLR6yKHmgW4M5E7X5g==} + engines: {node: '>=16'} + dev: false + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -9886,23 +11218,27 @@ packages: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} dev: true + /on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 - dev: true /on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} - dev: true /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - dev: true /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} @@ -9910,6 +11246,13 @@ packages: dependencies: mimic-fn: 2.1.0 + /open@6.4.0: + resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} + engines: {node: '>=8'} + dependencies: + is-wsl: 1.1.0 + dev: false + /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -10026,7 +11369,6 @@ packages: engines: {node: '>=8'} dependencies: p-limit: 2.3.0 - dev: true /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} @@ -10101,6 +11443,14 @@ packages: error-ex: 1.3.2 dev: true + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: false + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -10139,7 +11489,6 @@ packages: /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - dev: true /pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} @@ -10165,7 +11514,6 @@ packages: /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - dev: true /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} @@ -10775,6 +12123,25 @@ packages: renderkid: 3.0.0 dev: true + /pretty-format@26.6.2: + resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} + engines: {node: '>= 10'} + dependencies: + '@jest/types': 26.6.2 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + react-is: 17.0.2 + dev: false + + /pretty-format@29.6.3: + resolution: {integrity: sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: false + /pretty-time@1.1.0: resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==} engines: {node: '>=4'} @@ -10782,18 +12149,30 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true /promise-polyfill@7.1.2: resolution: {integrity: sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==} + /promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + dependencies: + asap: 2.0.6 + dev: false + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: false + /prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - dev: true /property-expr@2.0.5: resolution: {integrity: sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==} @@ -10887,6 +12266,12 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + dependencies: + inherits: 2.0.4 + dev: false + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} @@ -10900,7 +12285,6 @@ packages: /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - dev: true /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} @@ -10933,6 +12317,16 @@ packages: strip-json-comments: 2.0.1 dev: true + /react-devtools-core@4.28.0: + resolution: {integrity: sha512-E3C3X1skWBdBzwpOUbmXG8SgH6BtsluSMe+s6rRcujNKG1DGi8uIfhdhszkgDpAsMoE55hwqRUzeXCmETDBpTg==} + dependencies: + shell-quote: 1.8.1 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /react-dom@18.0.0(react@18.0.0): resolution: {integrity: sha512-XqX7uzmFo0pUceWFCt7Gff6IyIMzFUn7QMZrbrQfGxtaxXZIcGQzoNpRLE3fQLnS4XzLLPMZX2T9TRcSrasicw==} peerDependencies: @@ -10944,7 +12338,85 @@ packages: /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: false + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: false + + /react-native-animatable@1.3.3: + resolution: {integrity: sha512-2ckIxZQAsvWn25Ho+DK3d1mXIgj7tITkrS4pYDvx96WyOttSvzzFeQnM2od0+FUMzILbdHDsDEqZvnz1DYNQ1w==} + dependencies: + prop-types: 15.8.1 + dev: false + + /react-native-modal@13.0.1(react-native@0.72.4)(react@18.0.0): + resolution: {integrity: sha512-UB+mjmUtf+miaG/sDhOikRfBOv0gJdBU2ZE1HtFWp6UixW9jCk/bhGdHUgmZljbPpp0RaO/6YiMmQSSK3kkMaw==} + peerDependencies: + react: '*' + react-native: '>=0.65.0' + dependencies: + prop-types: 15.8.1 + react: 18.0.0 + react-native: 0.72.4(@babel/core@7.8.0)(@babel/preset-env@7.22.5)(react@18.0.0) + react-native-animatable: 1.3.3 + dev: false + + /react-native@0.72.4(@babel/core@7.8.0)(@babel/preset-env@7.22.5)(react@18.0.0): + resolution: {integrity: sha512-+vrObi0wZR+NeqL09KihAAdVlQ9IdplwznJWtYrjnQ4UbCW6rkzZJebRsugwUneSOKNFaHFEo1uKU89HsgtYBg==} + engines: {node: '>=16'} + hasBin: true + peerDependencies: + react: 18.2.0 + dependencies: + '@jest/create-cache-key-function': 29.6.3 + '@react-native-community/cli': 11.3.6(@babel/core@7.8.0) + '@react-native-community/cli-platform-android': 11.3.6 + '@react-native-community/cli-platform-ios': 11.3.6 + '@react-native/assets-registry': 0.72.0 + '@react-native/codegen': 0.72.6(@babel/preset-env@7.22.5) + '@react-native/gradle-plugin': 0.72.11 + '@react-native/js-polyfills': 0.72.1 + '@react-native/normalize-colors': 0.72.0 + '@react-native/virtualized-lists': 0.72.8(react-native@0.72.4) + abort-controller: 3.0.0 + anser: 1.4.10 + base64-js: 1.5.1 + deprecated-react-native-prop-types: 4.1.0 + event-target-shim: 5.0.1 + flow-enums-runtime: 0.0.5 + invariant: 2.2.4 + jest-environment-node: 29.6.4 + jsc-android: 250231.0.0 + memoize-one: 5.2.1 + metro-runtime: 0.76.8 + metro-source-map: 0.76.8 + mkdirp: 0.5.6 + nullthrows: 1.1.1 + pretty-format: 26.6.2 + promise: 8.3.0 + react: 18.0.0 + react-devtools-core: 4.28.0 + react-refresh: 0.4.3 + react-shallow-renderer: 16.15.0(react@18.0.0) + regenerator-runtime: 0.13.11 + scheduler: 0.24.0-canary-efb381bbf-20230505 + stacktrace-parser: 0.1.10 + use-sync-external-store: 1.2.0(react@18.0.0) + whatwg-fetch: 3.6.2 + ws: 6.2.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@babel/core' + - '@babel/preset-env' + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false /react-reconciler@0.27.0(react@18.0.0): resolution: {integrity: sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==} @@ -10964,7 +12436,16 @@ packages: /react-refresh@0.4.3: resolution: {integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==} engines: {node: '>=0.10.0'} - dev: true + + /react-shallow-renderer@16.15.0(react@18.0.0): + resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + object-assign: 4.1.1 + react: 18.0.0 + react-is: 16.13.1 + dev: false /react@18.0.0: resolution: {integrity: sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A==} @@ -11024,7 +12505,6 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: true /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -11040,6 +12520,20 @@ packages: dependencies: picomatch: 2.3.1 + /readline@1.3.0: + resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} + dev: false + + /recast@0.21.5: + resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} + engines: {node: '>= 4'} + dependencies: + ast-types: 0.15.2 + esprima: 4.0.1 + source-map: 0.6.1 + tslib: 2.6.0 + dev: false + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -11059,6 +12553,7 @@ packages: /regenerator-runtime@0.11.1: resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} + dev: true /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} @@ -11171,12 +12666,15 @@ packages: /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: true /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: false + /require-package-name@2.0.1: resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} dev: true @@ -11185,6 +12683,11 @@ packages: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true + /resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + dev: false + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -11240,6 +12743,13 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true + /rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true @@ -11252,7 +12762,6 @@ packages: hasBin: true dependencies: glob: 7.2.3 - dev: true /rrweb-cssom@0.6.0: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} @@ -11284,7 +12793,6 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -11359,6 +12867,12 @@ packages: dependencies: loose-envify: 1.4.0 + /scheduler@0.24.0-canary-efb381bbf-20230505: + resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} + dependencies: + loose-envify: 1.4.0 + dev: false + /schema-utils@2.7.1: resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} engines: {node: '>= 8.9.0'} @@ -11461,7 +12975,6 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 - dev: true /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} @@ -11482,7 +12995,6 @@ packages: statuses: 2.0.1 transitivePeerDependencies: - supports-color - dev: true /sentence-case@3.0.4: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} @@ -11492,6 +13004,11 @@ packages: upper-case-first: 2.0.2 dev: false + /serialize-error@2.1.0: + resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} + engines: {node: '>=0.10.0'} + dev: false + /serialize-javascript@6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: @@ -11522,7 +13039,10 @@ packages: send: 0.18.0 transitivePeerDependencies: - supports-color - dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} @@ -11530,7 +13050,6 @@ packages: /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true /shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} @@ -11548,6 +13067,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: false + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -11564,16 +13087,28 @@ packages: engines: {node: '>=14'} dev: true + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: false + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - dev: true /slash@4.0.0: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} dev: true + /slice-ansi@2.1.0: + resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} + engines: {node: '>=6'} + dependencies: + ansi-styles: 3.2.1 + astral-regex: 1.0.0 + is-fullwidth-code-point: 2.0.0 + dev: false + /slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} @@ -11644,7 +13179,6 @@ packages: /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} - dev: true /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} @@ -11713,7 +13247,6 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true /sshpk@1.17.0: resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} @@ -11739,18 +13272,30 @@ packages: deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' dev: true + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: false + /stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + /stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + dependencies: + type-fest: 0.7.1 + dev: false + /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} - dev: true /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - dev: true /std-env@3.3.3: resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} @@ -11772,7 +13317,6 @@ packages: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true /string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} @@ -11816,13 +13360,19 @@ packages: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 - dev: true /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 + /strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + dependencies: + ansi-regex: 4.1.1 + dev: false + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -11872,7 +13422,6 @@ packages: /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - dev: true /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} @@ -11898,6 +13447,10 @@ packages: escape-string-regexp: 1.0.5 dev: true + /strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: false + /style-loader@1.3.0(webpack@5.78.0): resolution: {integrity: sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==} engines: {node: '>= 8.9.0'} @@ -12013,6 +13566,10 @@ packages: - supports-color dev: true + /sudo-prompt@9.2.1: + resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} + dev: false + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -12114,10 +13671,34 @@ packages: postcss-value-parser: 3.3.1 dev: true - /taro-parse@1.1.5: - resolution: {integrity: sha512-OS8O9gPyFNQCvQuaGPMshNtxpmvSGVNTNkT/YPhozs629/f+PDEIWt1Ahlqu5uOik58x4piiaogiUdon218Rfg==} + /taro-ui@3.1.1(@tarojs/components@3.6.8)(@tarojs/react@3.6.8)(@tarojs/taro@3.6.8)(react-dom@18.0.0)(react-native@0.72.4)(react@18.0.0): + resolution: {integrity: sha512-mbVeBhguyVPr+FLyrlT+ABnpQIuqRB/xpKKZxbnpaCg8W2RDM7CKQW7VPehfzqD+jW57X21b0bcD2ALYBhQSQg==} + peerDependencies: + '@tarojs/components': '>=3' + '@tarojs/react': '>=3' + '@tarojs/taro': '>=3' + react: '>=16.13.0' + react-dom: '>=16.13.0' + react-native: '>=0.62.0' + dependencies: + '@tarojs/components': 3.6.8(@types/react@18.0.0)(react@18.0.0) + '@tarojs/react': 3.6.8(react@18.0.0) + '@tarojs/taro': 3.6.8(@types/react@18.0.0) + classnames: 2.3.2 + dayjs: 1.11.9 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.0.0 + react-dom: 18.0.0(react@18.0.0) + react-native: 0.72.4(@babel/core@7.8.0)(@babel/preset-env@7.22.5)(react@18.0.0) + react-native-modal: 13.0.1(react-native@0.72.4)(react@18.0.0) + dev: false + + /temp@0.8.4: + resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} + engines: {node: '>=6.0.0'} dependencies: - babel-runtime: 6.26.0 + rimraf: 2.6.3 dev: false /terser-webpack-plugin@5.3.9(@swc/core@1.3.23)(esbuild@0.14.54)(webpack@5.78.0): @@ -12177,10 +13758,21 @@ packages: any-promise: 1.3.0 dev: true + /throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + dev: false + /throat@6.0.2: resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} dev: true + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: false + /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true @@ -12205,6 +13797,10 @@ packages: os-tmpdir: 1.0.2 dev: true + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: false + /to-buffer@1.1.1: resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} dev: true @@ -12227,7 +13823,6 @@ packages: /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - dev: true /toposort@2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} @@ -12251,6 +13846,10 @@ packages: url-parse: 1.5.10 dev: true + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + /tr46@4.1.1: resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} engines: {node: '>=14'} @@ -12343,6 +13942,11 @@ packages: prelude-ls: 1.2.1 dev: true + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: false + /type-fest@0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} @@ -12362,6 +13966,11 @@ packages: engines: {node: '>=8'} dev: true + /type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + dev: false + /type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} @@ -12400,6 +14009,16 @@ packages: hasBin: true dev: true + /uglify-es@3.3.9: + resolution: {integrity: sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==} + engines: {node: '>=0.8.0'} + deprecated: support for ECMAScript is superseded by `uglify-js` as of v3.13.0 + hasBin: true + dependencies: + commander: 2.13.0 + source-map: 0.6.1 + dev: false + /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} @@ -12471,7 +14090,6 @@ packages: /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - dev: true /unstated-next@1.1.0: resolution: {integrity: sha512-AAn47ZncPvgBGOvMcn8tSRxsrqwf2VdAPxLASTuLJvZt4rhKfDvUkmYZLGfclImSfTVMv7tF4ynaVxin0JjDCA==} @@ -12564,6 +14182,14 @@ packages: engines: {node: '>= 4'} dev: true + /use-sync-external-store@1.2.0(react@18.0.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.0.0 + dev: false + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -12574,7 +14200,6 @@ packages: /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - dev: true /uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} @@ -12612,7 +14237,6 @@ packages: /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - dev: true /verror@1.10.0: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} @@ -12646,6 +14270,10 @@ packages: replace-ext: 1.0.1 dev: true + /vlq@1.0.1: + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + dev: false + /vm2@3.9.19: resolution: {integrity: sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==} engines: {node: '>=6.0'} @@ -12756,6 +14384,12 @@ packages: xml-name-validator: 4.0.0 dev: true + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: false + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} @@ -12774,6 +14408,10 @@ packages: dependencies: defaults: 1.0.4 + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + /webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -12971,6 +14609,13 @@ packages: webidl-conversions: 7.0.0 dev: true + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: @@ -12981,6 +14626,10 @@ packages: is-symbol: 1.0.4 dev: true + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: false + /which-pm@2.0.0: resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} engines: {node: '>=8.15'} @@ -13027,6 +14676,15 @@ packages: engines: {node: '>=0.10.0'} dev: true + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -13034,7 +14692,6 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true /wrap-ansi@8.1.0: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} @@ -13047,7 +14704,14 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + + /write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: false /write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} @@ -13066,6 +14730,33 @@ packages: signal-exit: 3.0.7 dev: true + /ws@6.2.2: + resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dependencies: + async-limiter: 1.0.1 + dev: false + + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} @@ -13109,7 +14800,6 @@ packages: /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - dev: true /xxhashjs@0.2.2: resolution: {integrity: sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==} @@ -13117,10 +14807,13 @@ packages: cuint: 0.2.2 dev: true + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: false + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: true /yallist@2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} @@ -13131,18 +14824,52 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} dev: true + /yaml@2.3.1: + resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + engines: {node: '>= 14'} + dev: false + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} dev: true + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: false + /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} @@ -13156,6 +14883,19 @@ packages: yargs-parser: 20.2.9 dev: true + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: false + /yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} dependencies: diff --git a/src/app.scss b/src/app.scss index c3aaf7e..b9402bd 100644 --- a/src/app.scss +++ b/src/app.scss @@ -1,4 +1,5 @@ @import "static/css/module"; +@import 'taro-ui/dist/style/index.scss'; .flex {display: flex !important;flex-direction:row} .flex-row{ flex-direction:row!important} diff --git a/src/pages/preview/brand/info/info.tsx b/src/pages/preview/brand/info/info.tsx index 10cd2c7..0850cb4 100644 --- a/src/pages/preview/brand/info/info.tsx +++ b/src/pages/preview/brand/info/info.tsx @@ -99,7 +99,7 @@ const BrandInfo: FC = () => { } - {curIndex} / {brandInfo?.brand_album?.split(',').length + ((brandInfo && brandInfo.introductory_video_resource) ? 1:0)} + {curIndex} / {(brandInfo?.brand_album?.split(',').length || 0) + ((brandInfo && brandInfo.introductory_video_resource) ? 1:0)} diff --git a/src/pages/preview/brand/list/list.module.scss b/src/pages/preview/brand/list/list.module.scss index 25cd50a..f2d21e8 100644 --- a/src/pages/preview/brand/list/list.module.scss +++ b/src/pages/preview/brand/list/list.module.scss @@ -9,7 +9,7 @@ .image{ width: 128rpx; height:128rpx; - background-color: pink; + background-color: #ededed; border-radius: 8rpx; } .rightBox{ diff --git a/src/pages/preview/brand/list/list.tsx b/src/pages/preview/brand/list/list.tsx index 6b315aa..f873dc1 100644 --- a/src/pages/preview/brand/list/list.tsx +++ b/src/pages/preview/brand/list/list.tsx @@ -4,6 +4,9 @@ import {brandApi, BrandRecord} from "@/api"; import styles from './list.module.scss' import Taro, {useReachBottom} from "@tarojs/taro"; import Empty from "@/components/empty/empty"; +import {AtActivityIndicator} from "taro-ui"; + + const BrandList: FC = () => { const [page, setPage] = useState(1) @@ -24,7 +27,7 @@ const BrandList: FC = () => { const getData = useCallback(async () => { try { - setText('加载中..') + setText('加载中...') const res = await brandApi.list(page, 10) if(page === 1){ if(res.list.length < 10) { @@ -69,7 +72,12 @@ const BrandList: FC = () => { ) } - {text} + { text === '加载中...' ? + + + : + {text} + } : } From 9d934feaa21802eddeb479e722430d426c429570 Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Mon, 28 Aug 2023 15:03:16 +0800 Subject: [PATCH 16/48] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/home.ts | 8 ++++++-- .../home/components/feature_recommended.tsx | 4 +--- src/pages/home/home.tsx | 6 ++---- src/static/img/arrow-right.png | Bin 0 -> 2871 bytes 4 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 src/static/img/arrow-right.png diff --git a/src/api/home.ts b/src/api/home.ts index aa884b5..70ee5e3 100644 --- a/src/api/home.ts +++ b/src/api/home.ts @@ -33,8 +33,12 @@ export interface HomeData { adverts: AdwareType[] skill: Kill[] health: Health[] - brand: Brand[] - illness: Illness[] + brand: { + list: Brand[] + } + illness: { + list: Illness[] + } } export const HomeApi = { diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx index 936de39..6283013 100644 --- a/src/pages/home/components/feature_recommended.tsx +++ b/src/pages/home/components/feature_recommended.tsx @@ -75,9 +75,7 @@ const FeatureRecommended: FC = (props) => { description: d.graphic_introduction, path: `?id=${d.id}`, })) - } catch (e) { - console.log(e) - } + } catch (e) {} return [] } diff --git a/src/pages/home/home.tsx b/src/pages/home/home.tsx index acc1adf..2cd8a6c 100644 --- a/src/pages/home/home.tsx +++ b/src/pages/home/home.tsx @@ -1,7 +1,6 @@ import {FC, useEffect, useState} from "react"; import {View} from "@tarojs/components"; import styles from "./home.module.scss"; -// import {Search} from "@/pages/home/components/search"; import Adware from "@/pages/home/components/adware"; import Feature from "@/pages/home/components/feature"; import FeatureRecommended from "@/pages/home/components/feature_recommended"; @@ -29,13 +28,12 @@ const Home: FC = () => { return ( - {/**/} diff --git a/src/static/img/arrow-right.png b/src/static/img/arrow-right.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d4acc1cf8d0e44c1105be3443ba01775867ba8 GIT binary patch literal 2871 zcmW+&c_7qV8$Q1oV=~r6q)CGrvg9(Pkz_=fF-#fj$jz30Y3xSQ5Hq@2CN%c!qAa;3 zioWcURJhY9%Qc@iWGkwhTfXuAanAF{InR0C=l$b7&y~|u8)=jZ3IHHYCRx)&_+)$S z5Et!@ZcR5t07cPkj)SJ>=y?E8Yh-Inr}(o=r4F$wW>ReFP%M2YEN-lmNIx;|T)mnT zjT@mBWu`tDY_rn0XSJB~4i0NPmJUxrgQx%3rhf6Slm+GUJU&EN-bgekL63D6JR^lo^1dai)} zg!aLe7uaq7;oJO$2vkN~g_n@M_A(O9S0;TuO@lCTG zgtWbbK9X>5d{8~3KjhUXDL{_er`TjXT~zD`+t%_^W)J2pI0|*@V;{Z1L!>L%pD9=C z82qc#>SduYx#qvZ+rI2uuU^C%T^G+OgazLSm*9TN>`@+c5dPtCyR^k06kZ@3<_^~} z{N!m@_ZYDvG>FVI|8ilmeg?}t z<=nK|xeO|LoC!TDTkZPLXkMqIaLoR68!M19^N*^2X?e7Cx(TU{F@L%G0#O8#w)VO( z?ymEUQ3uDs1vg1n=NGH`X1OAUg`d~HL;^6KOW&EZAaE4*>ZTY`|2uJfLqW%5g9veT z-{>+k1iEztOX=3D`(TL0qCkJp+OA3sq)W6P(DOscE`B0Z|+nsXE0y zCr-!XS{4N@gOTV7O77EIacY-GD;pw+>U~G{*{10_v=7umPwY5Bq#2HPyb4=r_Ly~O zyfB~^P7=32j@LrgZh_K6W{OSGT5!_C*lwfi*p(?E z>g&W79Ku@O%hR^Sh?@N0P9!EGVMN6~ErgfotO+L}ULV4)ctlG@9c87?=UvQWFKXu{ z-<(Ea##OFlmiOQ^!%TWXj{Q?(E8A_eN>fNoP(*1AkN36|C9r9OkzSoH3$W|mP*`UC zT(Sa%O5?8s9EDHy=k+cFJmpy7kjgggQlcaVZ+L9-7W-|fnFqj|adFattUgmgOxo35 z*7zQy2^S~f!=*Kf8o*k~uEK6_Wk^OT{i1Z#&_SWxbDU60zw-l{}fo4YSR z@a<*}e$W8w3U>}YbFrHlxuFhd8aW7yySuS2#pys@xuMn0^%kShZUU-yQBe9mH8#}I z?#8T|z(x}7aTrExdkEDYl z7FRsf_E9w-s3E1P$A$Y;BQvGgzW_xE7()3KE6dQ|SbGTz+h z@!yyBu!V+SG(AmXO_rIg5k=Edc%-WK;pRgU*}Yz=5**5vg!)xmJHs}}9PHRO+_-5R_= z(t_dH*_MTNx>2?(sMJb2;i_K3-D-`ctfYYSK(_^hv+^<_+eaGgeiyaqoojCr?9I286q4(sv7I`11%__ybdk;fJXBflz=I_GxYAw}IpYLQriGkev4X5#YK??gWO`STaS z(p_WrX+lW1u*8U&z(`R}t~w20&2g_)xm@C4a zGasCc`}fh&SNa;%2m6V&3bfB#iWku5QS0JJXFXiEMXMBo5xwCSvmnx{|Jd;FR+obS z0yNjHt7T2)(8mPrceMA;sO}m+#YFS3mH4hT8x^XY-|B&n5sb)^J~7q-m^B=2?y>($ zgej}94o7f-qhI}|TH7v5q&W>A<%oOvTN)L?xfwpS1-I4{K6z4>S|H^GT_E9X>s6AX z%7JGsW+CK~yJQXPK~{LjoZ2tbEQqVziqGJ`1nUC+VD22QmuFWDxGBqgfRyecaNwkp zvqM$$Sy~j=7 zifoZ0+y<;22=VC%HE+pcgdEg8pCy^@K7?hR+kIoZRNZ1xsWKod!$-#uf!TwusDLKM z^B?#z=yxQ51aIMAqUia#g84q(ap)ZTzDfeR%dj^Ya)hwN>L@GYE=#zcHqh4Ma#HK{S@R%kimhC)qGkxrX98A>Q2NrK>3iBC(24v$Go$ zz=A9q;}XuvR_dSLv`Ao-5>LSIlwx=u+N=_Xe1R{{s_Eb)`25^cq#ZrDK@`Ji{pTe> zPDhwCzF!AVKFV(U7a)+Vj9=wY-ERi14RxElQU$)Psg=)TL|;&fs_1U1M`z=$Gem_h z%Qz2H^zZL6Dk`i*W;Fa<2IbR&*eF1nXT{EbTo9`;n{n|9riUqMrL$F$S{xoX`wWLk z6#0xhs(;{6rit{9=D}c8tBJs8x17i>yfEx|#KYiRR$zPsEbFV#fZk6#-B<|)Ue4T# z^^4G&cN_MZljX$WregSZPC)k<$@asGv zP8h)sq6r(jHb?xwOedwUKe95)cEdr!o7Xp!2c$4HI&Q{bGr9LK4VNouF~X0OUIk2& zQOERhTh#K&u1sTqunz04F0^Ub$vyw8qXsW2i!MZj4V7pUBg@qDBF>=v3R{cd=R%c# z6>Zib(0E8t;>C+I;cdV5!BHNx^1Z|z zkOD~*BWX^))Wf3Kc(}>GN?U|~1V5WUDT Date: Mon, 28 Aug 2023 15:47:26 +0800 Subject: [PATCH 17/48] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pnpm-lock.yaml | 4 ++-- src/pages/manage/courseAdmin/components/search.tsx | 2 +- src/pages/manage/courseAdmin/courseAdmin.tsx | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8afdb16..2b130cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '6.1' settings: autoInstallPeers: true @@ -12444,7 +12444,7 @@ packages: dependencies: object-assign: 4.1.1 react: 18.0.0 - react-is: 16.13.1 + react-is: 18.2.0 dev: false /react@18.0.0: diff --git a/src/pages/manage/courseAdmin/components/search.tsx b/src/pages/manage/courseAdmin/components/search.tsx index 367a088..43f9fd7 100644 --- a/src/pages/manage/courseAdmin/components/search.tsx +++ b/src/pages/manage/courseAdmin/components/search.tsx @@ -88,7 +88,7 @@ export const Search: FC = ({param, setParam}) => { {deps.length ? <> { - deps.map(dep => changeDepId(dep.id)}> diff --git a/src/pages/manage/courseAdmin/courseAdmin.tsx b/src/pages/manage/courseAdmin/courseAdmin.tsx index 6eb09f5..6f9b245 100644 --- a/src/pages/manage/courseAdmin/courseAdmin.tsx +++ b/src/pages/manage/courseAdmin/courseAdmin.tsx @@ -26,7 +26,7 @@ const CourseAdmin: FC = () => { courseApi.getCourseAll({...param, page_size: param.page_size * (replace ? param.page : 1)}).then(res => { setTotal(res.total) if (param.page === 1 || replace) { - setData(res.data) + setData(res.data || []) } else { setData([ ...data, @@ -53,7 +53,7 @@ const CourseAdmin: FC = () => { if (curs.length === data.length) { setCurs([]) } else { - setCurs(data.map(d => d.id)) + setCurs(data?.map(d => d.id)) } } @@ -72,7 +72,7 @@ const CourseAdmin: FC = () => { Taro.showModal({ title: '删除警告', content: "删除后所有部门不可查看", - confirmText:'删除', + confirmText: '删除', async success({confirm}) { if (confirm) { try { @@ -108,7 +108,7 @@ const CourseAdmin: FC = () => { * @param required 批量添加为[] */ function batchChangDep(ids: number[], depList = [], required = []) { - if (!ids.length) { + if (!ids?.length) { Taro.showToast({title: '请选择课程', icon: 'none'}) return } @@ -153,7 +153,7 @@ const CourseAdmin: FC = () => { { - data.map((d, index) => + data?.map((d, index) => addCurs(d.id)}> {batch && Date: Mon, 28 Aug 2023 16:55:10 +0800 Subject: [PATCH 18/48] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E8=80=83=E9=A2=98=E5=BC=80=E5=A7=8B=E5=92=8C=E7=BB=93?= =?UTF-8?q?=E6=9D=9F=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/video/video.tsx | 4 +-- .../videoInfo/components/catalogue.tsx | 5 ++-- .../business/videoInfo/components/course.tsx | 26 +++++++++---------- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/components/video/video.tsx b/src/components/video/video.tsx index 9924471..e324452 100644 --- a/src/components/video/video.tsx +++ b/src/components/video/video.tsx @@ -45,12 +45,10 @@ const HVideo: FC = (opt: HVideoOptions) => { opt.breakpoint.forEach(d => { if (time < d + deviation && time > d - deviation) { video?.pause() - video?.seek(d - deviation) if (process.env.TARO_ENV === 'h5') { try { document?.exitFullscreen().then() - } catch (e) { - } + } catch (e) {} } video?.exitFullScreen() opt.onBreakpoint(d) diff --git a/src/pages/business/videoInfo/components/catalogue.tsx b/src/pages/business/videoInfo/components/catalogue.tsx index 601d885..fd8df74 100644 --- a/src/pages/business/videoInfo/components/catalogue.tsx +++ b/src/pages/business/videoInfo/components/catalogue.tsx @@ -175,10 +175,9 @@ const Catalogue: FC = ({data, setHors, id, playId}) => { { - playing ? {JSON.stringify(playing)}暂停 - : {JSON.stringify(playing)}立即学习 + playing ? 暂停 + : 立即学习 } - setShow(true)}>... diff --git a/src/pages/business/videoInfo/components/course.tsx b/src/pages/business/videoInfo/components/course.tsx index b001118..b8df4c7 100644 --- a/src/pages/business/videoInfo/components/course.tsx +++ b/src/pages/business/videoInfo/components/course.tsx @@ -129,24 +129,22 @@ const Course: FC = ({id, courseId, preview, curEnd}) => { setTime={videoSeek} /> - + {formatMinute(time)}考题 - {examAll?.[time]?.slice(0, 1)?.map((d) => - - {d.question_type === 2 && - setRecord([isAnswer])} - />} - - )} + { + examAll?.[time]?.slice(0, 1)?.map((d) => + + {d.question_type === 2 && + setRecord([isAnswer])} + />} + ) + } From a4177a0b2f1f36a976cee42d29b645c7b5e5dd86 Mon Sep 17 00:00:00 2001 From: sunlizhou <296190577@qq.com> Date: Mon, 28 Aug 2023 17:00:32 +0800 Subject: [PATCH 19/48] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/image/image.tsx | 60 +++++++++++++++++++ .../home/components/feature_recommended.tsx | 9 ++- src/pages/home/home.module.scss | 1 + 3 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 src/components/image/image.tsx diff --git a/src/components/image/image.tsx b/src/components/image/image.tsx new file mode 100644 index 0000000..d3591b8 --- /dev/null +++ b/src/components/image/image.tsx @@ -0,0 +1,60 @@ +import {FC, useEffect, useState} from "react"; +import {Image, View} from "@tarojs/components"; +import emptyImg from '@/static/img/empty.png' +import {AtActivityIndicator} from "taro-ui"; + +interface Props { + src: string + mode?: "scaleToFill" | "aspectFit" | "aspectFill" | "widthFix" | "heightFix" | "top" | "bottom" | "center" | "left" | "right" | "top left" | "top right" | "bottom left" | "bottom right" | undefined + width:number + height:number + fallback?: string +} + +const Img: FC = ({src,mode = 'aspectFill',width,height,fallback = emptyImg}) => { + const [isError,setIsError] = useState(false) + const [loading,setLoading] = useState(true) + + useEffect(()=>{ + console.log(src, !src) + if(!src){ + setIsError(true) + setLoading(false) + } else { + setIsError(false) + setLoading(false) + } + },[src]) + // 图片加载失败 + function onErrorHandler() { + setLoading(false) + setIsError(true) + } + function onLoadHandler() { + setLoading(false) + setIsError(false) + } + + return ( + + { !isError && + + + } + { loading && + + } + { isError && !loading && + + } + + + ) +} + +export default Img diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx index 936de39..3a16227 100644 --- a/src/pages/home/components/feature_recommended.tsx +++ b/src/pages/home/components/feature_recommended.tsx @@ -10,6 +10,7 @@ import brandTop from '@/static/img/brandTop.png' import illnessTop from '@/static/img/illnessTop.png' import healthTop from '@/static/img/healthTop.png' import professionTop from '@/static/img/professionTop.png' +import Img from "@/components/image/image"; interface DataContent { @@ -163,8 +164,12 @@ const FeatureRecommended: FC = (props) => { className='flex mb-3' key={c.id} onClick={() => jump(d.detailsUrl + c.path, c.id, d.type)}> - - + + + + + {/**/} + diff --git a/src/pages/home/home.module.scss b/src/pages/home/home.module.scss index 8820c50..1e406a9 100644 --- a/src/pages/home/home.module.scss +++ b/src/pages/home/home.module.scss @@ -117,6 +117,7 @@ } .ranking { + top:0; position: absolute; left: 24rpx; width: 30px; From f2cf8b6486fd81d5a0a3c6d23e230a93035f2621 Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Mon, 28 Aug 2023 17:24:48 +0800 Subject: [PATCH 20/48] =?UTF-8?q?=E8=A7=86=E9=A2=91=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E7=AD=94=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/topic/single.tsx | 10 ++++++++++ src/components/video/type.ts | 7 ++++--- src/components/video/video.tsx | 7 +++++-- src/pages/business/videoInfo/components/course.tsx | 9 +++++++-- src/pages/business/videoInfo/videoInfo.scss | 5 +++++ 5 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 src/components/topic/single.tsx diff --git a/src/components/topic/single.tsx b/src/components/topic/single.tsx new file mode 100644 index 0000000..9a2f92d --- /dev/null +++ b/src/components/topic/single.tsx @@ -0,0 +1,10 @@ +import {FC} from "react"; +import {View} from "@tarojs/components"; + +export const Single:FC = ()=>{ + return( + 1 + ) +} + +export default Single diff --git a/src/components/video/type.ts b/src/components/video/type.ts index 82fe90b..a0fc3fa 100644 --- a/src/components/video/type.ts +++ b/src/components/video/type.ts @@ -1,3 +1,5 @@ +import {ReactNode} from "react"; + export interface HVideoOptions { /** 视频时长s */ duration: number @@ -9,11 +11,10 @@ export interface HVideoOptions { poster?: string /** 视频断点 */ breakpoint: number[] - /** 进入断点 */ onBreakpoint: (id: number) => void /** 视频播放结束 */ onEnded: () => void - - setTime: (fn:(time:number)=>void) => void + setTime: (fn: (time: number) => void) => void + children?: ReactNode } diff --git a/src/components/video/video.tsx b/src/components/video/video.tsx index e324452..69e9501 100644 --- a/src/components/video/video.tsx +++ b/src/components/video/video.tsx @@ -48,7 +48,8 @@ const HVideo: FC = (opt: HVideoOptions) => { if (process.env.TARO_ENV === 'h5') { try { document?.exitFullscreen().then() - } catch (e) {} + } catch (e) { + } } video?.exitFullScreen() opt.onBreakpoint(d) @@ -122,7 +123,9 @@ const HVideo: FC = (opt: HVideoOptions) => { onEnded={onEnded} onPlay={onPlay} onPause={onPause} - /> + > + {opt.children} + ) } diff --git a/src/pages/business/videoInfo/components/course.tsx b/src/pages/business/videoInfo/components/course.tsx index b8df4c7..53ba61b 100644 --- a/src/pages/business/videoInfo/components/course.tsx +++ b/src/pages/business/videoInfo/components/course.tsx @@ -1,4 +1,4 @@ -import {ScrollView, Text, View} from "@tarojs/components"; +import {CoverView, ScrollView, Text, View} from "@tarojs/components"; import {FC, useEffect, useState} from "react"; import HVideo from "@/components/video/video"; import {curriculum, HourPlayData} from "@/api"; @@ -9,6 +9,7 @@ import unique_ident from "@/hooks/unique_ident"; import MyButton from "@/components/button/MyButton"; import {formatMinute} from "@/utils/time"; import CustomPageContainer from "@/components/custom-page-container/custom-page-container"; +import Single from "@/components/topic/single"; interface Props { id: number, @@ -127,7 +128,11 @@ const Course: FC = ({id, courseId, preview, curEnd}) => { breakpoint={breakpoint} onBreakpoint={onBreakpoint} setTime={videoSeek} - /> + > + {/**/} + {/* */} + {/**/} + diff --git a/src/pages/business/videoInfo/videoInfo.scss b/src/pages/business/videoInfo/videoInfo.scss index 5c0a7ad..7057f0c 100644 --- a/src/pages/business/videoInfo/videoInfo.scss +++ b/src/pages/business/videoInfo/videoInfo.scss @@ -106,3 +106,8 @@ filter: saturate(0); } +.single-cover { + position: absolute; + color: #fff; +} + From 26fbcc475a5ec2046c5915ee4bc88d5634c253fb Mon Sep 17 00:00:00 2001 From: sunlizhou <296190577@qq.com> Date: Tue, 29 Aug 2023 14:45:29 +0800 Subject: [PATCH 21/48] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../home/components/feature_recommended.tsx | 2 +- src/pages/preview/brand/info/info.module.scss | 2 +- src/pages/preview/brand/info/info.tsx | 8 +++- src/pages/preview/illness/article/article.tsx | 3 +- src/utils/day.ts | 48 +++++++++++++++++++ 5 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 src/utils/day.ts diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx index 2cd2fc9..d904c24 100644 --- a/src/pages/home/components/feature_recommended.tsx +++ b/src/pages/home/components/feature_recommended.tsx @@ -116,7 +116,7 @@ const FeatureRecommended: FC = (props) => { return props.illness.map(d => ({ id: d.id, imageUrl: '', - description: d.description?.replace(/[^\u4e00-\u9fa5]/gi,"") ?? '暂无描述', + description: d.description || '暂无简介', title: d.name, path: `?id=${d.id}` })) diff --git a/src/pages/preview/brand/info/info.module.scss b/src/pages/preview/brand/info/info.module.scss index 60ed52f..eb2bc6f 100644 --- a/src/pages/preview/brand/info/info.module.scss +++ b/src/pages/preview/brand/info/info.module.scss @@ -55,7 +55,7 @@ page{ .image{ width: 172rpx; height:128rpx; - background-color: pink; + background-color: #eee; border-radius: 8rpx; } .leftBox{ diff --git a/src/pages/preview/brand/info/info.tsx b/src/pages/preview/brand/info/info.tsx index 0850cb4..b7bced8 100644 --- a/src/pages/preview/brand/info/info.tsx +++ b/src/pages/preview/brand/info/info.tsx @@ -5,6 +5,8 @@ import styles from './info.module.scss' import Taro, {useReachBottom, useRouter} from "@tarojs/taro"; import LineEllipsis from "@/components/textCollapse/collapse"; import Empty from "@/components/empty/empty"; +import Img from "@/components/image/image"; +import {rfc33392time} from "@/utils/day"; type Params = { id: number @@ -116,9 +118,11 @@ const BrandInfo: FC = () => { {i.title} - {i.created_at} {i.page_view}阅读 + {rfc33392time(i.created_at)} {i.page_view}阅读 + + + - {/**/} ) diff --git a/src/pages/preview/illness/article/article.tsx b/src/pages/preview/illness/article/article.tsx index 9da4689..c45b470 100644 --- a/src/pages/preview/illness/article/article.tsx +++ b/src/pages/preview/illness/article/article.tsx @@ -1,4 +1,4 @@ -import {FC, useEffect, useMemo, useState} from "react"; +import {FC, useEffect, useMemo, useRef, useState} from "react"; import {Image, PageContainer, Text, View} from "@tarojs/components"; import Taro, {useRouter} from "@tarojs/taro"; import {ArticleRecord, brandApi} from "@/api"; @@ -13,6 +13,7 @@ const article:FC = () => { const [show,setShow] = useState(false) const [articleInfo,setArticleInfo] = useState() const { children, headings } = useMemo(() => parse(articleInfo?.content || ''), [articleInfo]) + const query = Taro.createSelectorQuery() diff --git a/src/utils/day.ts b/src/utils/day.ts new file mode 100644 index 0000000..9025c1a --- /dev/null +++ b/src/utils/day.ts @@ -0,0 +1,48 @@ +/** + * 将 RFC3339 标准转成常用时间格式 + * + * ```js + * rfc33392time('2020-07-31T14:27:10.035542+08:00') + * // 2020-07-31 14:28:12 + * ``` + * + * @param {string} dateStr RFC3339 标准时间字符串 + * @returns {string} 常用时间格式 + */ +export const rfc33392time = (dateStr: string): string => { + const date = new Date(dateStr).toJSON() + return (new Date(+new Date(date) + 8 * 3600 * 1000)) + .toISOString() + .replace(/T/g, ' ') + .replace(/\.[\d]{3}Z/, '') +} + +const TIME_OFFSET = (() => { + const info = (new Date().toString()).match(/GMT\+(\d{2})(\d{2})/) + return `+${info![1]} : ${info![2]}` +})() + +/** + * 将常用时间格式转为 RFC3339 标准 + * + * ```js + * time2rfc3339('2020-07-31 14:28:12') + * // 2020-07-31T14:27:10.035542+08:00 + * ``` + * + * @param {string} date 常用时间格式 + * @returns {string} RFC3339 标准时间 + */ +export function time2rfc3339(date: string) { + const time = new Date(date) + const y = time.getFullYear() + const m = time.getMonth() + 1 < 10 ? `0${time.getMonth() + 1}` : (time.getMonth() + 1) + const d = time.getDate() < 10 ? `0${time.getDate()}` : time.getDate() + const hh = time.getHours() < 10 ? `0${time.getHours()}` : time.getHours() + const mm = time.getMinutes() < 10 ? `0${time.getMinutes()}` : time.getMinutes() + const ss = time.getSeconds() < 10 ? `0${time.getSeconds()}` : time.getSeconds() + // const endDate = y + '-' + m + '-' + d + ' ' + hh + ':' + mm + ':' + ss + // endDate = endDate.replace(/\s+/g, 'T') + '+08:00' + // return endDate + return `${y}-${m}-${d}T${hh}:${mm}:${ss}${TIME_OFFSET}` +} From a704da92409c2571fa11f7ab32407f7ad3fdaaee Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Tue, 29 Aug 2023 14:46:48 +0800 Subject: [PATCH 22/48] =?UTF-8?q?=E8=A7=86=E9=A2=91=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E7=AD=94=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.tsx | 1 - src/components/image/image.tsx | 64 +++---- src/components/spinner/index.tsx | 171 ++++++++++++++++++ src/components/spinner/loading.svg | 13 ++ src/components/spinner/style.scss | 66 +++++++ src/components/topic/single.module.scss | 37 ++++ src/components/topic/single.tsx | 100 +++++++++- src/components/video/type.ts | 6 +- src/components/video/video.tsx | 23 +-- .../business/videoInfo/components/course.tsx | 107 ++--------- src/pages/business/videoInfo/videoInfo.scss | 4 - .../home/components/feature_recommended.tsx | 4 +- src/pages/preview/brand/list/list.tsx | 36 ++-- src/static/img/shard.png | Bin 0 -> 3486 bytes 14 files changed, 458 insertions(+), 174 deletions(-) create mode 100644 src/components/spinner/index.tsx create mode 100644 src/components/spinner/loading.svg create mode 100644 src/components/spinner/style.scss create mode 100644 src/components/topic/single.module.scss create mode 100644 src/static/img/shard.png diff --git a/src/app.tsx b/src/app.tsx index 14389ff..9e6d8c4 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -32,7 +32,6 @@ function updateApp() { function App(props) { - // 可以使用所有的 React Hooks Taro.useLaunch(() => { updateApp() diff --git a/src/components/image/image.tsx b/src/components/image/image.tsx index d3591b8..1ca8d81 100644 --- a/src/components/image/image.tsx +++ b/src/components/image/image.tsx @@ -1,58 +1,58 @@ import {FC, useEffect, useState} from "react"; -import {Image, View} from "@tarojs/components"; -import emptyImg from '@/static/img/empty.png' +import {Image, ImageProps, View} from "@tarojs/components"; import {AtActivityIndicator} from "taro-ui"; +import shard from '@/static/img/shard.png' -interface Props { - src: string - mode?: "scaleToFill" | "aspectFit" | "aspectFill" | "widthFix" | "heightFix" | "top" | "bottom" | "center" | "left" | "right" | "top left" | "top right" | "bottom left" | "bottom right" | undefined - width:number - height:number +interface Props extends ImageProps { + width: number + height: number fallback?: string } -const Img: FC = ({src,mode = 'aspectFill',width,height,fallback = emptyImg}) => { - const [isError,setIsError] = useState(false) - const [loading,setLoading] = useState(true) +const Img: FC = ({src, mode = 'aspectFill', width, height, fallback = shard}) => { + const [isError, setIsError] = useState(false) + const [loading, setLoading] = useState(true) + + useEffect(() => { + if (!src) { + setIsError(true) + setLoading(false) + } else { + setIsError(false) + setLoading(false) + } + }, [src]) - useEffect(()=>{ - console.log(src, !src) - if(!src){ - setIsError(true) - setLoading(false) - } else { - setIsError(false) - setLoading(false) - } - },[src]) // 图片加载失败 function onErrorHandler() { setLoading(false) setIsError(true) } - function onLoadHandler() { - setLoading(false) - setIsError(false) - } + + function onLoadHandler() { + setLoading(false) + setIsError(false) + } return ( - - { !isError && + + {!isError && } - { loading && - + { + loading && + } - { isError && !loading && - + { + isError && !loading && + } - ) } diff --git a/src/components/spinner/index.tsx b/src/components/spinner/index.tsx new file mode 100644 index 0000000..0ecfb5e --- /dev/null +++ b/src/components/spinner/index.tsx @@ -0,0 +1,171 @@ +import Taro from "@tarojs/taro"; +import { View, Image } from '@tarojs/components' +import { Component, ReactNode } from "react"; +import indicator from './loading.svg' +import './style.scss' + +// 动画状态 +type Status = + | 'dismissed' + | 'forward' + | 'reverse' + | 'completed' + +interface Props { + enable?: boolean + overlay?: boolean +} + +interface State { + status?: Status + background?: Record, + rotation?: Record, +} + +type StateSetter = (state: State) => void + +type Controller = { + setTick: (enabled: boolean | undefined) => void + clear: () => void +} + +function createController(setState: StateSetter): Controller { + const background = Taro.createAnimation({ duration: 600 }) + const rotation = Taro.createAnimation({ duration: 600 }) + let rotateTimer: ReturnType | undefined + let status: Status | undefined + + const notifyListener = () => setState({ + status, + background: background.export(), + rotation: rotation.export(), + }) + + const clearAnimation = (notify = true) => { + // 清空旋转动画定时器 + if (rotateTimer != null) { + clearTimeout(rotateTimer) + rotateTimer = undefined + } + + // 清空动画 + background.export() + rotation.export() + + // 通知 UI 刷新 + if (notify) { + notifyListener() + } + } + + const setAnimation = (opacity: number) => { + // 停止旋转动画 + if (rotateTimer != null) { + clearTimeout(rotateTimer) + } + + // 旋转动画定时器 + const rotate = () => { + rotation.opacity(opacity).rotate(360).step({ duration: 600 }) + notifyListener() + rotateTimer = setTimeout(rotate, 600) + } + + // 背景动画 + background.backgroundColor(`rgba(255,255,255,${opacity})`).step() + + // 启动旋转动画 + rotate() + } + + const onFinish = (opacity: number, nextStatus: Status) => { + const lockStatus = status + setTimeout(() => { + if (lockStatus === status) { + background.backgroundColor(`rgba(255,255,255,${opacity})`).step({ duration: 0 }) + if (nextStatus === 'dismissed') { + clearAnimation() + } + status = nextStatus + notifyListener() + } + }, 600) + } + + const setStatus = (newStatus: Status, opacity: number) => { + if (status !== newStatus) { + status = newStatus + setAnimation(opacity) + + if (status === 'reverse') { + onFinish(0, 'dismissed') + } else if (status === 'forward') { + onFinish(1, 'completed') + } + } + } + + const setTick = (enabled?: boolean) => { + if (enabled !== true) { + if (status === 'dismissed') { + clearAnimation() + } else if (status !== 'reverse') { + setStatus('reverse', 0) + } + } else if (status === 'completed') { + // ignore + } else if (status !== 'forward') { + setStatus('forward', 1) + } + } + + return { + setTick, + clear() { + clearAnimation(false) + }, + } +} + +export default class Spin extends Component { + constructor(props) { + super(props) + this.controller = createController(this.onAnimation) + this.state = {} + } + + controller: Controller + + onAnimation = (state: State) => { + this.setState((s) => ({...s, ...state})) + } + + componentDidMount(): void { + console.log(this.props.enable) + this.controller.setTick(this.props.enable) + } + + componentDidUpdate(): void { + this.controller.setTick(this.props.enable) + } + + componentWillUnmount(): void { + this.controller.clear() + } + + shouldComponentUpdate(nextProps: Readonly, nextState: Readonly): boolean { + return nextProps.enable !== this.props.enable + || nextProps.overlay !== this.props.overlay + || nextState.status != this.state.status + } + + render(): ReactNode { + return ( + + + + + + ) + } +} diff --git a/src/components/spinner/loading.svg b/src/components/spinner/loading.svg new file mode 100644 index 0000000..6a23520 --- /dev/null +++ b/src/components/spinner/loading.svg @@ -0,0 +1,13 @@ + diff --git a/src/components/spinner/style.scss b/src/components/spinner/style.scss new file mode 100644 index 0000000..1ff6261 --- /dev/null +++ b/src/components/spinner/style.scss @@ -0,0 +1,66 @@ +.spinner-wrapper { + background-color: rgba( #fff, 1.0); + transition: background-color 1200ms ease-out; + + &.is-fixed { + z-index: 99999; + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; + right: 0; + bottom: 0; + } + + &.reverse, + &.dismissed { + background-color: rgba( #fff, 0.0); + } + + &.dismissed { + position: fixed; + width: 0; + height: 0; + left: -10000px; + top: -10000px; + right: auto; + bottom: auto; + overflow: hidden; + } +} + +.spinner-wrapper, +.spinner { + display: inline-flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.spinner { + padding: 10rpx; + opacity: 1; + transition: opacity 1200ms ease-out; + + &.reverse, + &.dismissed { + opacity: 0; + } +} + +.spinner-icon { + width: 38px; + height: 38px; + animation: spinner-rotation 600ms linear infinite; +} + +@keyframes spinner-rotation { + from { + transform: rotate(0); + } + + to { + transform: rotate(360deg); + } +} diff --git a/src/components/topic/single.module.scss b/src/components/topic/single.module.scss new file mode 100644 index 0000000..c794da4 --- /dev/null +++ b/src/components/topic/single.module.scss @@ -0,0 +1,37 @@ +.single-cover { + position: absolute; + bottom: 0; + top: 0; + margin: auto; + height: 220rpx; + right: 20rpx; + max-width: 50%; + min-width: 300rpx; + padding: 25rpx; + background: rgba(#000, .7); + border-radius: 20rpx; + line-height: 40rpx; + display: flex; + flex-direction: column; + justify-content: space-between; + + view:first-child { + font-weight: bold; + color: #fff; + } + + view:not(:first-child) { + background: #fff; + border-radius: 10rpx; + padding: 15rpx; + } +} + + +.correct{ + +} + +.mistake{ + +} diff --git a/src/components/topic/single.tsx b/src/components/topic/single.tsx index 9a2f92d..030abb7 100644 --- a/src/components/topic/single.tsx +++ b/src/components/topic/single.tsx @@ -1,9 +1,101 @@ -import {FC} from "react"; +import {FC, useEffect, useMemo, useState} from "react"; import {View} from "@tarojs/components"; +import Taro from "@tarojs/taro"; +import styles from './single.module.scss' -export const Single:FC = ()=>{ - return( - 1 +interface Props { + full: boolean + topic?: ShareSubject + examination: (result: boolean) => void +} + +type AnswerType = "true" | 'false' + +export const Single: FC = (props) => { + if (!props.topic) return (<>) + + let timer: NodeJS.Timeout + const [lastState, setLastState] = useState<0 | 1>(0) // 0为竖屏,1为横屏 + const [result, setResult] = useState(undefined) + let lastTime = Date.now() + Taro.startAccelerometer() + Taro.onAccelerometerChange((res) => { + const now = Date.now(); + if (now - lastTime < 500) return; + + lastTime = now; + let nowState; + const Roll = Math.atan2(-res.x, Math.sqrt(res.y * res.y + res.z * res.z)) * 57.3; + const Pitch = Math.atan2(res.y, res.z) * 57.3; + + // 横屏状态 + if (Roll > 50) { + if ((Pitch > -180 && Pitch < -60) || (Pitch > 130)) { + nowState = 1; + } else { + nowState = lastState; + } + + } else if ((Roll > 0 && Roll < 30) || (Roll < 0 && Roll > -30)) { + let absPitch = Math.abs(Pitch); + // 如果手机平躺,保持原状态不变,40容错率 + if ((absPitch > 140 || absPitch < 40)) { + nowState = lastState; + } else if (Pitch < 0) { + // 收集竖向正立的情况 + nowState = 0; + } else { + nowState = lastState; + } + } else { + nowState = lastState; + } + + // 状态变化时,触发 + if (nowState !== lastState) { + setLastState(nowState); + } + }) + + useEffect(() => { + // timer = setTimeout(() => { + // props.examination(false) + // }, 4000) + }, [props.topic]) + + const style: React.CSSProperties = useMemo(() => ({ + transform: lastState === 0 && props.full ? "rotate(-90deg)" : 'none' + }), [lastState]) + + function examination(result: AnswerType) { + clearTimeout(timer) + setResult(result) + + setTimeout(() => { + props.examination(props.topic?.right_value === result) + setResult(undefined) + }, 2000) + } + + function judgment(answer: AnswerType): string { + if (props.topic?.right_value === answer && result === answer) { + return styles.correct + } + return styles.mistake + } + + return ( + + {props.topic.question} + examination("true")}> + {props.topic.right_value} + + examination("false")}> + {props.topic.error_value} + + ) } diff --git a/src/components/video/type.ts b/src/components/video/type.ts index a0fc3fa..1c51c51 100644 --- a/src/components/video/type.ts +++ b/src/components/video/type.ts @@ -12,9 +12,11 @@ export interface HVideoOptions { /** 视频断点 */ breakpoint: number[] /** 进入断点 */ - onBreakpoint: (id: number) => void + onBreakpoint: (time: number) => void /** 视频播放结束 */ onEnded: () => void - setTime: (fn: (time: number) => void) => void + // setTime: (fn: (time: number) => void) => void + /** 全屏改变 */ + fullChange: (fullScreen: boolean) => void children?: ReactNode } diff --git a/src/components/video/video.tsx b/src/components/video/video.tsx index 69e9501..55ea43d 100644 --- a/src/components/video/video.tsx +++ b/src/components/video/video.tsx @@ -44,26 +44,17 @@ const HVideo: FC = (opt: HVideoOptions) => { /** 判断是否进入断点 */ opt.breakpoint.forEach(d => { if (time < d + deviation && time > d - deviation) { - video?.pause() - if (process.env.TARO_ENV === 'h5') { - try { - document?.exitFullscreen().then() - } catch (e) { - } - } - video?.exitFullScreen() opt.onBreakpoint(d) - return } }) } - opt.setTime((time?: number) => { - if (typeof time === 'number') { - video?.seek(time) - } - video?.play() - }) + // opt.setTime((time?: number) => { + // if (typeof time === 'number') { + // video?.seek(time) + // } + // video?.play() + // }) function onEnded() { if (currentTime + 1 > opt.duration) { @@ -118,11 +109,11 @@ const HVideo: FC = (opt: HVideoOptions) => { poster={opt?.poster || ''} src={opt.src} enableProgressGesture={opt.preview} - direction={90} onTimeUpdate={onTimeUpdate} onEnded={onEnded} onPlay={onPlay} onPause={onPause} + onFullScreenChange={(event) => opt.fullChange((event.target as any).fullScreen)} > {opt.children} diff --git a/src/pages/business/videoInfo/components/course.tsx b/src/pages/business/videoInfo/components/course.tsx index 53ba61b..4bf9128 100644 --- a/src/pages/business/videoInfo/components/course.tsx +++ b/src/pages/business/videoInfo/components/course.tsx @@ -1,14 +1,9 @@ -import {CoverView, ScrollView, Text, View} from "@tarojs/components"; import {FC, useEffect, useState} from "react"; import HVideo from "@/components/video/video"; import {curriculum, HourPlayData} from "@/api"; import {Profile} from '@/store' import Taro from "@tarojs/taro"; -import Judge from "@/components/topic/judge"; import unique_ident from "@/hooks/unique_ident"; -import MyButton from "@/components/button/MyButton"; -import {formatMinute} from "@/utils/time"; -import CustomPageContainer from "@/components/custom-page-container/custom-page-container"; import Single from "@/components/topic/single"; interface Props { @@ -19,25 +14,24 @@ interface Props { } -let seek: (time: number) => void const Course: FC = ({id, courseId, preview, curEnd}) => { - const [breakpoint, setBreakpoint] = useState([]) // 断点 - const [show, setShow] = useState(false) // 题 + const [breakpoints, setBreakpoints] = useState([]) // 断点 + const [isFull, setIsFull] = useState(false) + + const [examAll, setExamAll] = useState>([]) // 题库 const [data, setData] = useState(null) - const [examAll, setExamAll] = useState>([]) // 题库 const [time, setTime] = useState(0) // 进入断点的时间 - const [validate, setValidate] = useState(false) // 开启验证 - const [record, setRecord] = useState([]) // 考题记录 const [testId, setTestId] = useState(null) const {user} = Profile.useContainer() async function onEnded() { + // 学习记录 const startRecording = unique_ident.get() startRecording && await curriculum.curEnd(courseId, id, {...startRecording, duration: data?.duration!}) // 结束 unique_ident.remove() if (testId) { - if (preview) { // 预览 + if (preview) { Taro.showModal({ title: "是否前往考试", success({confirm}) { @@ -58,66 +52,34 @@ const Course: FC = ({id, courseId, preview, curEnd}) => { } } - /** 进入断点 */ - function onBreakpoint(breakpoint: number) { - setTime(breakpoint) - setShow(true) - } - async function getData() { unique_ident.put(id, Date.now()) const res = await curriculum.hourPlay(courseId, id) if (res) { setData(res) - setBreakpoint(res.timeList) + setBreakpoints(res.timeList) setExamAll(res.hourExamQuestions || []) setTestId(res?.hour_test?.id || null) } } useEffect(() => { - init() getData() }, [id]) - - function init(show = true) { - show && setShow(false) - setValidate(false) - setRecord([]) - setTime(0) - } - - - useEffect(() => { - if (!record.length) return; - const pass = record.every(d => d) - /** 考题正确 */ + function examination(result: boolean) { const {id: question_id, question_type} = examAll?.[time]?.[0] curriculum.answerRecord(id, { - is_pass: pass, + is_pass: result, user_id: user?.id!, time: time, question_type, question_id - }).then() - - /** 删除断点 */ - const old: number[] = JSON.parse(JSON.stringify(breakpoint)) - const index = old.indexOf(time) - old.splice(index, 1) - setBreakpoint(old) - - if (pass) { - seek(time) - init() - } - }, [record]) - - function videoSeek(fn: (time: number) => void) { - seek = fn + }) + setTime(0) } + return ( <> = ({id, courseId, preview, curEnd}) => { preview={preview} src={data?.url || ''} onEnded={onEnded} - breakpoint={breakpoint} - onBreakpoint={onBreakpoint} - setTime={videoSeek} + breakpoint={breakpoints} + onBreakpoint={(time) => setTime(time)} + fullChange={(fullScreen) => setIsFull(fullScreen)} > - {/**/} - {/* */} - {/**/} + - - - - - {formatMinute(time)}考题 - - { - examAll?.[time]?.slice(0, 1)?.map((d) => - - {d.question_type === 2 && - setRecord([isAnswer])} - />} - ) - } - - - - { - record.length > 0 - ? { - init(); - seek(time) - }}>关闭 - : setValidate(true)}>交卷 - } - - - - ) } diff --git a/src/pages/business/videoInfo/videoInfo.scss b/src/pages/business/videoInfo/videoInfo.scss index 7057f0c..da6c6f2 100644 --- a/src/pages/business/videoInfo/videoInfo.scss +++ b/src/pages/business/videoInfo/videoInfo.scss @@ -106,8 +106,4 @@ filter: saturate(0); } -.single-cover { - position: absolute; - color: #fff; -} diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx index 2cd2fc9..f482f33 100644 --- a/src/pages/home/components/feature_recommended.tsx +++ b/src/pages/home/components/feature_recommended.tsx @@ -164,10 +164,8 @@ const FeatureRecommended: FC = (props) => { onClick={() => jump(d.detailsUrl + c.path, c.id, d.type)}> - + - {/**/} - diff --git a/src/pages/preview/brand/list/list.tsx b/src/pages/preview/brand/list/list.tsx index f873dc1..cf422a0 100644 --- a/src/pages/preview/brand/list/list.tsx +++ b/src/pages/preview/brand/list/list.tsx @@ -4,35 +4,26 @@ import {brandApi, BrandRecord} from "@/api"; import styles from './list.module.scss' import Taro, {useReachBottom} from "@tarojs/taro"; import Empty from "@/components/empty/empty"; -import {AtActivityIndicator} from "taro-ui"; - - +import Spinner from "@/components/spinner"; const BrandList: FC = () => { const [page, setPage] = useState(1) const [brands, setBrands] = useState([]) const [total, setTotal] = useState(0) const [text, setText] = useState('') + const [loading, setLoading] = useState(true) useEffect(() => { - Taro.showLoading({ - title: '加载中', - mask: true - }) - setTimeout(function () { - Taro.hideLoading() - }, 650) getData() }, [page]) const getData = useCallback(async () => { try { - setText('加载中...') const res = await brandApi.list(page, 10) - if(page === 1){ - if(res.list.length < 10) { + if (page === 1) { + if (res.list.length < 10) { setText('没有更多了~') - }else{ + } else { setText('上拉加载更多~') } } @@ -43,6 +34,7 @@ const BrandList: FC = () => { ]) } catch (e) { } + setLoading(false) }, [page]) @@ -53,32 +45,28 @@ const BrandList: FC = () => { useReachBottom(useCallback(() => { if (brands?.length < total) { setPage(page + 1) - }else{ + } else { setText('没有更多了~') } }, [total, brands])) return ( - + + { brands.length ? <> - { brands.map((d) => jumpInfo(d.id)} className={styles.box} key={d.id}> + {brands.map((d) => jumpInfo(d.id)} className={styles.box} key={d.id}> {d.name} {d.graphic_introduction} ) - } - { text === '加载中...' ? - - - : - {text} } - : + {text} + : } ) diff --git a/src/static/img/shard.png b/src/static/img/shard.png new file mode 100644 index 0000000000000000000000000000000000000000..2e16c7bd04080ccfe1394affc53e034bbc3c943b GIT binary patch literal 3486 zcmV;P4Po+$P)Px?SV=@dRCr$HU44usMHR2tvpajYd%InI?wH+~Rk@sSd$;CRMo)J@1Q)dVv zZb8J;qcpaOvLE1_UldfIWmz`?z|BF+wSfQMnx@^++uOSZ0Lr9)Nr317v9|-jrWP0( znMzI5F6is)dpL*!MC^7P=MBc#n}U>UB`*N{gE6*Q*Y)QQ0eEU^>S)(>e+K}$RvH(;Fu>({T}1psS;l#3hh9KfYg=|e(@N8)CjLVIrHoZlKm zp5r*15b^FHW#Y&?2e571FEGYVh@*ijY)YroL*3oo`5>}v+uq3-J1R(-IP!vJS?>gZ z9dR^HkxjqnoWD1SEZeqeu6$pRGI8Yv$8l~(#GB%3U|73^5Sv!7UVTpxIZ67WQ48J% z07;2dEyi(bdU|>wo6Szk0z5f6`F>5)ek02tcRsLfd!kL_%D%n@fV*^E|F|#X0tU;n zo(6z-2PqS0UIJLu3R%Y4a2eYW@hrnIw#x7lk7Zf!0f0Zr^0xyY0gUZnXahF>hjV^d zkaD(d|CTX!PLMKj=T#0cA~M%?=N=&hqu)dTz&biQ=AKk4)eOIUgLD2RSw*&O(=?GH zU3D{Tvhw1>rxak%^Vsa{>>RN5D4k9-dLkqQfOWdA|4UYfZQJ)V#u69FQwA`#*qNCb zS%1#8;uR}a%(d(Y=vmJByJY1~OiUb|N~QkJ7}I3SvpPn8X`v0PsrF1HBV@OX<$VItT5Ew-OV&D{P+d{MtAJk zk=wX&qm)68O1Oj}m~%5v`0x1Hk3FuK&UhknP*I zcdlK#_B8+)^5ad)du0HVLt2qdLd3ncZD-c3S>v1OuqQ?8sI@`qxd956W&fTMCq zExCyJBIkSq0Mt)J|8EUA0Zc$Qov0h5KR-Q-bLIqawE?JH5RnLg=aIUGb54nax->aC zdAg=)+x+-czL)K~syYc^S`eWE=p+GbO;1lBk7-NC9 zv;+Z4MF_X5kMiXdGiZd81~B>Hd0p2}27tQDfgQ&=1rh(+h|~PaP^+cZtCAXx_$3iw z^6QnH^Pl)R*tYG*8DmlrFh5z<_dx?bvT_@Z`Xv%z02mWO9AOxSUC)7zlxsnVpeb)YL7>4goLC0|(M#S?PaX5iX zEw{Qwrx6)J$^@M@B^u!QzH75#7(c7$#Q9SW=opJYt+?6XQXQ!EQY)6F!~;xcIqJH8 z1OSwLKz;}S&X;u@wODGoe*3Uw3rP_B@(`FQ4rzgljLZYIs5aNW@t5?$ovw8zA-yMdn2DfUw?3SOV z0$klYT+J2NbGFKi%6wnE%`l8J>gn9Ocki*T>%Ls86_fq6Ot{f~SQ39kX%_Mif$T?3 z1DJvU6ut{O+ElsCRAy<9ZQH+Oj4iphNyQp)KR|-KmkD1s1z;79k^Lmqa}XV%?Yi!| zOeQl`i*I6L;+Rw_^~&PC!Yb+z1UwmDnZQS+0MiJQ9HVNa878Yzbr=BLrtA6*K7H}M zjIm3rJSx(DGJrM0;}`gd4B)6jcM3puQ>oN(y}iA!)^cd6R60@!L5FHX60B&~Jj{Z#4l4T=0i%~+v;r;vfud8>=p=p{=2q7X{ z^`YvYQ!jj}1mGz1pngsW*^OXH?zN$aYzV|FX5cmJR5psWMre~c~8mM z&}yEgVg(HWOj975-v*6JMeP8;DZ>)_ck8--H~`c<1IjebdxQ{|M{T6TF1gx>x@UbMoahn2#1)0iM0j9cjbab3O zFfee))CUneP1Ae{5sy}(vz0QcfsaD~j_VXim9qfg_lx zx^C+rfa5*|QsJ;vDs{!+;NT%w))kAzb1Ibz?Ny3>SW?yx6!@3}m_A#S;tRW%RaSAU z_%ux`X0zFW#rjRt>_@~`5wX8jwnd?r#vd>_If*J)T|{B1Dw&$5-H^>@Z(A%cpU*#v zh#yp?Cr)x;cz8Ie*XkVPX8@Q6fXw3bV4+aB(skWC;{=LITb2#Lnx=g>o6UZ1q4UPa z$B&$unW1H}kzN6#60o4MmJ7gimeygpT#indog+llOw)W05l;;2w07cO761dly}4ZO zvW39p^Z8p5@$>BjRwK419$-4FBb`p4l*wdh_uw3jjEtP&c^=(qn3yS1E%28Ez}s@U z+<`4CV`F2zv$M0bWH#4Gi)gnpi3hl&qvQO6fq_RBwBBENo_BG(0oACzNeB3~p`oF* zRp%56h09#m^*wgDQD?@nT%rNiH0_#fHamBIrDa)%?c2AHb}Ptjtc@dD4cJ5gC-s78 zJD1D#SJzwR^Z92G@w5hf)Ye77G|ed?gu1K8V&V<}_-Zbf`x==uJUo08W9;UbnATJ? zAfL}ai-;#TRcrLh%Duh4gSxIynx=W85Q2_L3V*d)^mZ%PK%eL@GsbRFF1dvQHBGxS zo6TOed-v`Y>2&%PL_EBO=Co8b6pO{se zE|O!K=JP@bI`OUT2>>3=<#Oklrg?!7;=#7BP{<0*0X#A?@;=vfA8V%t-nHtTN~O-6 zot@p)(b2JUIb2=mhyQ_CtZAC}2_Y`>D-h@Rnx?&w&1N^`^Z6$cu_YI8#LYhk0Hzpi zxm7=>CLv4`h?p)E3U_#(x49j1rnG^KlKMi3Pqc&cqqY$MXzqW-(9qCJbrasjV)0bhb-zM) z3?X7{KYN;{y(omB#q5bs;Me`2j#4{1`t(29C z!`T({*V)Y?qW{5-Q8%3?$_Ie5rfK7Jm<%HRv8$`=vHt%4L+)? Date: Tue, 29 Aug 2023 15:36:55 +0800 Subject: [PATCH 23/48] =?UTF-8?q?=E8=A7=86=E9=A2=91=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E7=AD=94=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/topic/single.module.scss | 13 ++++-- src/components/topic/single.tsx | 46 ++++++++++--------- src/components/video/video.tsx | 7 --- .../business/videoInfo/components/course.tsx | 15 +++--- src/pages/business/videoInfo/videoInfo.scss | 1 - 5 files changed, 40 insertions(+), 42 deletions(-) diff --git a/src/components/topic/single.module.scss b/src/components/topic/single.module.scss index c794da4..0905d35 100644 --- a/src/components/topic/single.module.scss +++ b/src/components/topic/single.module.scss @@ -1,4 +1,5 @@ -.single-cover { + +.singleCover { position: absolute; bottom: 0; top: 0; @@ -28,10 +29,12 @@ } -.correct{ - +.correct { + background: #bdf6c1 !important; + color: #fff !important; } -.mistake{ - +.mistake { + background: #e7abab !important; + color: #fff !important; } diff --git a/src/components/topic/single.tsx b/src/components/topic/single.tsx index 030abb7..9ac6022 100644 --- a/src/components/topic/single.tsx +++ b/src/components/topic/single.tsx @@ -12,8 +12,6 @@ interface Props { type AnswerType = "true" | 'false' export const Single: FC = (props) => { - if (!props.topic) return (<>) - let timer: NodeJS.Timeout const [lastState, setLastState] = useState<0 | 1>(0) // 0为竖屏,1为横屏 const [result, setResult] = useState(undefined) @@ -58,18 +56,19 @@ export const Single: FC = (props) => { }) useEffect(() => { - // timer = setTimeout(() => { - // props.examination(false) - // }, 4000) + timer = setTimeout(() => { + props.examination(false) + }, 4000) }, [props.topic]) const style: React.CSSProperties = useMemo(() => ({ - transform: lastState === 0 && props.full ? "rotate(-90deg)" : 'none' - }), [lastState]) + transform: lastState === 1 && props.full ? "rotate(90deg)" : 'none' + }), [lastState, props.full]) - function examination(result: AnswerType) { + function examination(answer: AnswerType) { + if (result) return; clearTimeout(timer) - setResult(result) + setResult(answer) setTimeout(() => { props.examination(props.topic?.right_value === result) @@ -78,24 +77,29 @@ export const Single: FC = (props) => { } function judgment(answer: AnswerType): string { - if (props.topic?.right_value === answer && result === answer) { + if (result !== answer) return '' + if (props.topic?.right_answer === answer && result === answer) { return styles.correct } return styles.mistake } return ( - - {props.topic.question} - examination("true")}> - {props.topic.right_value} - - examination("false")}> - {props.topic.error_value} - - + <> + { + props.topic && + {props.topic.question} + examination("true")}> + {props.topic.right_value} + + examination("false")}> + {props.topic.error_value} + + + } + ) } diff --git a/src/components/video/video.tsx b/src/components/video/video.tsx index 55ea43d..6e3707b 100644 --- a/src/components/video/video.tsx +++ b/src/components/video/video.tsx @@ -49,13 +49,6 @@ const HVideo: FC = (opt: HVideoOptions) => { }) } - // opt.setTime((time?: number) => { - // if (typeof time === 'number') { - // video?.seek(time) - // } - // video?.play() - // }) - function onEnded() { if (currentTime + 1 > opt.duration) { opt.onEnded() diff --git a/src/pages/business/videoInfo/components/course.tsx b/src/pages/business/videoInfo/components/course.tsx index 4bf9128..0ed8eb1 100644 --- a/src/pages/business/videoInfo/components/course.tsx +++ b/src/pages/business/videoInfo/components/course.tsx @@ -1,4 +1,4 @@ -import {FC, useEffect, useState} from "react"; +import {FC, useCallback, useEffect, useState} from "react"; import HVideo from "@/components/video/video"; import {curriculum, HourPlayData} from "@/api"; import {Profile} from '@/store' @@ -13,11 +13,9 @@ interface Props { curEnd: (test?: boolean) => void } - const Course: FC = ({id, courseId, preview, curEnd}) => { const [breakpoints, setBreakpoints] = useState([]) // 断点 const [isFull, setIsFull] = useState(false) - const [examAll, setExamAll] = useState>([]) // 题库 const [data, setData] = useState(null) const [time, setTime] = useState(0) // 进入断点的时间 @@ -67,7 +65,8 @@ const Course: FC = ({id, courseId, preview, curEnd}) => { getData() }, [id]) - function examination(result: boolean) { + const examination = useCallback((result: boolean) => { + if (!time) return const {id: question_id, question_type} = examAll?.[time]?.[0] curriculum.answerRecord(id, { is_pass: result, @@ -77,8 +76,7 @@ const Course: FC = ({id, courseId, preview, curEnd}) => { question_id }) setTime(0) - } - + }, [time]) return ( <> @@ -88,9 +86,10 @@ const Course: FC = ({id, courseId, preview, curEnd}) => { src={data?.url || ''} onEnded={onEnded} breakpoint={breakpoints} - onBreakpoint={(time) => setTime(time)} fullChange={(fullScreen) => setIsFull(fullScreen)} - > + onBreakpoint={(now) => { + time !== now && setTime(now) + }}> Date: Tue, 29 Aug 2023 16:01:53 +0800 Subject: [PATCH 24/48] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/request.ts | 22 ++++++++++++------- src/components/image/image.tsx | 13 +++++------ src/pages/home/components/adware.tsx | 21 +++++++++--------- .../home/components/feature_recommended.tsx | 15 +++++++------ src/pages/home/home.module.scss | 4 +++- 5 files changed, 42 insertions(+), 33 deletions(-) diff --git a/src/api/request.ts b/src/api/request.ts index 3195e31..59d2501 100644 --- a/src/api/request.ts +++ b/src/api/request.ts @@ -44,6 +44,8 @@ export const ERROR_STATUS: Record = { 'OVERSTEP': '请求越界~' } +let notLoging = false + export function request( url: string, method: keyof Method, @@ -82,15 +84,19 @@ export function request( const data = res?.data as any if (data?.code === 0 && res?.statusCode === 200) { resolve(data?.data) + notLoging = false } else if (res.statusCode === 401) { - // Taro.showModal({ - // title: "登录过期,需重新登陆", - // showCancel: false, - // success() { - Taro.clearStorageSync() - Taro.redirectTo({url: '/pages/login/login'}) - // } - // }) + if (notLoging) return + notLoging = true + Taro.showModal({ + title: "请登录", + content: token ? '登录过期' : "完成登录开启功能", + showCancel: false, + success() { + Taro.clearStorageSync() + Taro.redirectTo({url: '/pages/login/login'}) + } + }) } else { reject(null) Taro.showToast({ diff --git a/src/components/image/image.tsx b/src/components/image/image.tsx index 1ca8d81..4297130 100644 --- a/src/components/image/image.tsx +++ b/src/components/image/image.tsx @@ -9,7 +9,7 @@ interface Props extends ImageProps { fallback?: string } -const Img: FC = ({src, mode = 'aspectFill', width, height, fallback = shard}) => { +const Img: FC = ({src, mode = 'aspectFill', width, height, fallback = shard, ...props}) => { const [isError, setIsError] = useState(false) const [loading, setLoading] = useState(true) @@ -35,23 +35,22 @@ const Img: FC = ({src, mode = 'aspectFill', width, height, fallback = sha } return ( - + {!isError && } - { - loading && - - } + {loading && } { isError && !loading && - + } ) diff --git a/src/pages/home/components/adware.tsx b/src/pages/home/components/adware.tsx index e98856a..f30f547 100644 --- a/src/pages/home/components/adware.tsx +++ b/src/pages/home/components/adware.tsx @@ -1,8 +1,9 @@ -import {Image, Swiper, SwiperItem, View} from "@tarojs/components"; +import {Swiper, SwiperItem, View} from "@tarojs/components"; import {FC, useEffect, useState} from "react"; import {AdwareType} from "@/api"; import Taro from "@tarojs/taro"; import styles from '../home.module.scss' +import Img from "@/components/image/image"; interface Props { data: any[] @@ -30,16 +31,16 @@ const Adware: FC = ({data, only_flag, width}) => { } return ( - + { - adverts.length === 1 && jumpAdware(adverts[0].image_path)} - className={styles.adware}/> + width={width} + height={(space.height / space.width) * width}/> } { adverts.length > 1 && = ({data, only_flag, width}) => { autoplay circular style={{width: width + "rpx", height: (space.height / space.width) * width + "rpx", overflow: 'hidden'}} - indicatorActiveColor='rgba(255,255,255,0.5)' - className={styles.adware}> + indicatorActiveColor='rgba(255,255,255,0.5)'> {adverts.map(d => - jumpAdware(d.image_path)} - style={{width: width + "rpx", height: '100%'}}/> + width={width} + height={(space.height / space.width) * width} + onClick={() => jumpAdware(d.image_path)}/> )} } diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx index 5c46994..8aef137 100644 --- a/src/pages/home/components/feature_recommended.tsx +++ b/src/pages/home/components/feature_recommended.tsx @@ -76,7 +76,8 @@ const FeatureRecommended: FC = (props) => { description: d.graphic_introduction, path: `?id=${d.id}`, })) - } catch (e) {} + } catch (e) { + } return [] } @@ -149,8 +150,8 @@ const FeatureRecommended: FC = (props) => { } return ( - - + + {data.every(d => d.data.length) && { data.map(d => = (props) => { className='flex mb-3' key={c.id} onClick={() => jump(d.detailsUrl + c.path, c.id, d.type)}> - - - + + + @@ -176,7 +177,7 @@ const FeatureRecommended: FC = (props) => { } ) } - + } ) } diff --git a/src/pages/home/home.module.scss b/src/pages/home/home.module.scss index 1e406a9..d18c670 100644 --- a/src/pages/home/home.module.scss +++ b/src/pages/home/home.module.scss @@ -72,6 +72,7 @@ .courseTag { width: 162px; + height: 46rpx; margin: 0 auto 30rpx; display: block; } @@ -85,6 +86,7 @@ } .featureTitle { + max-width: 212px; height: 42rpx; padding-bottom: 30rpx; } @@ -117,7 +119,7 @@ } .ranking { - top:0; + top: 0; position: absolute; left: 24rpx; width: 30px; From 8e465b9d03e675216a66a49f06ebde2325fd7cef Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Tue, 29 Aug 2023 16:20:25 +0800 Subject: [PATCH 25/48] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=94=B6=E7=9B=8A?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/home/components/adware.tsx | 55 ++++++++++--------- .../home/components/feature_recommended.tsx | 6 +- src/pages/home/home.tsx | 8 +-- 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/pages/home/components/adware.tsx b/src/pages/home/components/adware.tsx index f30f547..16724f8 100644 --- a/src/pages/home/components/adware.tsx +++ b/src/pages/home/components/adware.tsx @@ -15,7 +15,6 @@ const Adware: FC = ({data, only_flag, width}) => { const [adverts, setAdverts] = useState([]) const [space, setSpace] = useState(null) - useEffect(() => { const res = data.find(d => d.only_flag === only_flag) setSpace(res) @@ -31,36 +30,40 @@ const Adware: FC = ({data, only_flag, width}) => { } return ( - - { - adverts.length === 1 && jumpAdware(adverts[0].image_path)} - width={width} - height={(space.height / space.width) * width}/> - } + <> { - adverts.length > 1 && - {adverts.map(d => - 0 && + { + adverts.length === 1 && jumpAdware(adverts[0].image_path)} width={width} - height={(space.height / space.width) * width} - onClick={() => jumpAdware(d.image_path)}/> - )} - + height={(space.height / space.width) * width}/> + } + { + adverts.length > 1 && + {adverts.map(d => + jumpAdware(d.image_path)}/> + )} + + } + } - + ) } diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx index 8aef137..289b9bb 100644 --- a/src/pages/home/components/feature_recommended.tsx +++ b/src/pages/home/components/feature_recommended.tsx @@ -151,7 +151,7 @@ const FeatureRecommended: FC = (props) => { return ( - {data.every(d => d.data.length) && + { data.map(d => = (props) => { className={styles.featureTitle} onClick={() => jump(d.url)} src={d.titleUrl}/> { - d.data.map((c, index) => 0 && d.data.map((c, index) => jump(d.detailsUrl + c.path, c.id, d.type)}> @@ -177,7 +177,7 @@ const FeatureRecommended: FC = (props) => { } ) } - } + ) } diff --git a/src/pages/home/home.tsx b/src/pages/home/home.tsx index 2cd8a6c..b91c4b0 100644 --- a/src/pages/home/home.tsx +++ b/src/pages/home/home.tsx @@ -1,4 +1,4 @@ -import {FC, useEffect, useState} from "react"; +import {FC, useState} from "react"; import {View} from "@tarojs/components"; import styles from "./home.module.scss"; import Adware from "@/pages/home/components/adware"; @@ -20,11 +20,11 @@ const Home: FC = () => { Taro.navigateTo({url: '/pages/login/login'}) } - useEffect(() => { + Taro.useLoad(() => { HomeApi.home().then(res => { setData(res) }) - }, []) + }) return ( @@ -37,7 +37,7 @@ const Home: FC = () => { skill={data?.skill || []} /> - + {data && } { !token && 登录后享受更多学习服务~ From 1eb468a69923a8a27ae10932132a244c2a1c0ca8 Mon Sep 17 00:00:00 2001 From: sunlizhou <296190577@qq.com> Date: Tue, 29 Aug 2023 17:55:10 +0800 Subject: [PATCH 26/48] =?UTF-8?q?=E7=96=BE=E7=97=85=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/illness.ts | 3 ++- .../home/components/feature_recommended.tsx | 2 +- src/pages/preview/illness/list/list.config.ts | 2 +- src/pages/preview/illness/list/list.module.scss | 2 +- src/pages/preview/illness/list/list.tsx | 17 ++++++++++------- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/api/illness.ts b/src/api/illness.ts index ab0f905..1fd9c3e 100644 --- a/src/api/illness.ts +++ b/src/api/illness.ts @@ -7,6 +7,7 @@ export const illnessApi = { return request<{ list: any[], total: number }>(`/home/v1/illness/list`, "GET", {page, page_size, id}) }, articleInfo(owner_id: number, page: number, page_size: number) { - return request<{ list: any[], total: number }>(`/home/v1/article/illness_list`, "GET", {page, page_size, owner_id}) + return request<{ illness:{name:string;description:string;resource:any;album:string[]};list:{list: any[], total: number} }> + (`/home/v1/article/illness_list`, "GET", {page, page_size, owner_id}) }, } diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx index 289b9bb..31fbb5f 100644 --- a/src/pages/home/components/feature_recommended.tsx +++ b/src/pages/home/components/feature_recommended.tsx @@ -61,7 +61,7 @@ const FeatureRecommended: FC = (props) => { { titleUrl: illnessTop, url: '/pages/preview/illness/sort/sort', - detailsUrl: '/pages/preview/illness/article/article', + detailsUrl: '/pages/preview/illness/list/list', data: [] }, ]) diff --git a/src/pages/preview/illness/list/list.config.ts b/src/pages/preview/illness/list/list.config.ts index 2881f86..6901b40 100644 --- a/src/pages/preview/illness/list/list.config.ts +++ b/src/pages/preview/illness/list/list.config.ts @@ -1,4 +1,4 @@ export default definePageConfig({ - navigationBarTitleText: '文章列表', + navigationBarTitleText: '', onReachBottomDistance: 50 }) diff --git a/src/pages/preview/illness/list/list.module.scss b/src/pages/preview/illness/list/list.module.scss index 1665d7f..78a510d 100644 --- a/src/pages/preview/illness/list/list.module.scss +++ b/src/pages/preview/illness/list/list.module.scss @@ -1,4 +1,4 @@ -.brands { +.articles { font-size: 28rpx; font-family: PingFang SC-Medium, PingFang SC; font-weight: 500; diff --git a/src/pages/preview/illness/list/list.tsx b/src/pages/preview/illness/list/list.tsx index 4064d2b..a146c9b 100644 --- a/src/pages/preview/illness/list/list.tsx +++ b/src/pages/preview/illness/list/list.tsx @@ -8,7 +8,8 @@ import Empty from "@/components/empty/empty"; const BrandList: FC = () => { const params = useRouter().params as unknown as { id: number } const [page, setPage] = useState(1) - const [brands, setBrands] = useState([]) + const [articles, setArticles] = useState([]) + const [illness,setIllness] = useState<{name:string;description:string;resource:any;album:string[]}>() const [total, setTotal] = useState(0) const [fetchDone, setFetchDone] = useState(false) @@ -20,8 +21,10 @@ const BrandList: FC = () => { const getData = useCallback(async () => { try { const data = await illnessApi.articleInfo(params.id, page, 20) - setTotal(data.total) - setBrands([...brands, ...data.list]) + Taro.setNavigationBarTitle({title:data.illness.name}) + setIllness(data.illness) + setTotal(data.list.total) + setArticles([...articles, ...data.list.list]) } catch (e) { } setFetchDone(true) @@ -34,17 +37,17 @@ const BrandList: FC = () => { useReachBottom(useCallback(() => { - if (brands?.length < total) { + if (articles?.length < total) { setPage(page + 1) } - }, [total, brands])) + }, [total, articles])) return ( { - brands.length > 0 ? - brands.map((d, index) => jump(d.id)}> + articles.length > 0 ? + articles.map((d, index) => jump(d.id)}> {index + 1} . {d.title} ) : From 20564f42fb2d4bcf82e471e53fe621fe0adb60d2 Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Wed, 30 Aug 2023 14:56:11 +0800 Subject: [PATCH 27/48] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E7=BA=A7=E5=8A=A0=E8=BD=BD=20=E5=92=8C=20=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/image/image.module.scss | 12 +++++ src/components/image/image.tsx | 51 +++++++++++-------- src/components/spinner/index.tsx | 50 +++++++++--------- src/components/spinner/style.scss | 14 ++++- src/pages/business/videoInfo/videoInfo.scss | 6 +-- src/pages/business/videoInfo/videoInfo.tsx | 24 +++++---- .../home/components/feature_recommended.tsx | 4 +- src/pages/home/home.module.scss | 2 +- src/pages/preview/health/health.tsx | 13 +++-- src/pages/preview/illness/sort/sort.tsx | 35 +++++++++---- src/pages/preview/profession/profession.tsx | 23 ++++++--- 11 files changed, 145 insertions(+), 89 deletions(-) create mode 100644 src/components/image/image.module.scss diff --git a/src/components/image/image.module.scss b/src/components/image/image.module.scss new file mode 100644 index 0000000..44a776b --- /dev/null +++ b/src/components/image/image.module.scss @@ -0,0 +1,12 @@ +.imgBox { + position: relative; +} + +.imgError { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin: auto; +} diff --git a/src/components/image/image.tsx b/src/components/image/image.tsx index 4297130..9651106 100644 --- a/src/components/image/image.tsx +++ b/src/components/image/image.tsx @@ -1,7 +1,8 @@ import {FC, useEffect, useState} from "react"; import {Image, ImageProps, View} from "@tarojs/components"; -import {AtActivityIndicator} from "taro-ui"; import shard from '@/static/img/shard.png' +import styles from './image.module.scss' +import Taro from "@tarojs/taro"; interface Props extends ImageProps { width: number @@ -13,14 +14,12 @@ const Img: FC = ({src, mode = 'aspectFill', width, height, fallback = sha const [isError, setIsError] = useState(false) const [loading, setLoading] = useState(true) + const imgAnimation = Taro.createAnimation({duration: 0}).opacity(0).step() + const [animationData, setAnimationData] = useState(imgAnimation.export()) + useEffect(() => { - if (!src) { - setIsError(true) - setLoading(false) - } else { - setIsError(false) - setLoading(false) - } + setIsError(!src) + setLoading(!!src) }, [src]) // 图片加载失败 @@ -32,25 +31,37 @@ const Img: FC = ({src, mode = 'aspectFill', width, height, fallback = sha function onLoadHandler() { setLoading(false) setIsError(false) + imgAnimation.opacity(1).step({duration: 200}) + setAnimationData(imgAnimation.export()) } return ( - + {!isError && - - + + + } - {loading && } { isError && !loading && - + } ) diff --git a/src/components/spinner/index.tsx b/src/components/spinner/index.tsx index 0ecfb5e..a99d6f9 100644 --- a/src/components/spinner/index.tsx +++ b/src/components/spinner/index.tsx @@ -1,6 +1,6 @@ import Taro from "@tarojs/taro"; -import { View, Image } from '@tarojs/components' -import { Component, ReactNode } from "react"; +import {View, Image} from '@tarojs/components' +import {Component, ReactNode} from "react"; import indicator from './loading.svg' import './style.scss' @@ -12,8 +12,9 @@ type Status = | 'completed' interface Props { - enable?: boolean - overlay?: boolean + enable?: boolean // 控制显现 + overlay?: boolean // 页面覆盖 + block?: boolean // 块级 } interface State { @@ -30,8 +31,8 @@ type Controller = { } function createController(setState: StateSetter): Controller { - const background = Taro.createAnimation({ duration: 600 }) - const rotation = Taro.createAnimation({ duration: 600 }) + const background = Taro.createAnimation({duration: 600}) + const rotation = Taro.createAnimation({duration: 600}) let rotateTimer: ReturnType | undefined let status: Status | undefined @@ -49,8 +50,8 @@ function createController(setState: StateSetter): Controller { } // 清空动画 - background.export() - rotation.export() + background.step().export() + rotation.step().export() // 通知 UI 刷新 if (notify) { @@ -66,7 +67,7 @@ function createController(setState: StateSetter): Controller { // 旋转动画定时器 const rotate = () => { - rotation.opacity(opacity).rotate(360).step({ duration: 600 }) + rotation.opacity(opacity).rotate(360).step({duration: 600}) notifyListener() rotateTimer = setTimeout(rotate, 600) } @@ -80,23 +81,20 @@ function createController(setState: StateSetter): Controller { const onFinish = (opacity: number, nextStatus: Status) => { const lockStatus = status - setTimeout(() => { - if (lockStatus === status) { - background.backgroundColor(`rgba(255,255,255,${opacity})`).step({ duration: 0 }) - if (nextStatus === 'dismissed') { - clearAnimation() - } - status = nextStatus - notifyListener() + if (lockStatus === status) { + background.backgroundColor(`rgba(255,255,255,${opacity})`).step({duration: 0}) + if (nextStatus === 'dismissed') { + clearAnimation() } - }, 600) + status = nextStatus + notifyListener() + } } const setStatus = (newStatus: Status, opacity: number) => { if (status !== newStatus) { status = newStatus setAnimation(opacity) - if (status === 'reverse') { onFinish(0, 'dismissed') } else if (status === 'forward') { @@ -140,17 +138,16 @@ export default class Spin extends Component { this.setState((s) => ({...s, ...state})) } - componentDidMount(): void { - console.log(this.props.enable) - this.controller.setTick(this.props.enable) - } + // componentDidMount(): void { + // this.controller.setTick(this.props.enable) + // } componentDidUpdate(): void { this.controller.setTick(this.props.enable) } componentWillUnmount(): void { - this.controller.clear() + this.controller.clear() } shouldComponentUpdate(nextProps: Readonly, nextState: Readonly): boolean { @@ -161,9 +158,10 @@ export default class Spin extends Component { render(): ReactNode { return ( - + - + ) diff --git a/src/components/spinner/style.scss b/src/components/spinner/style.scss index 1ff6261..dbaa3e9 100644 --- a/src/components/spinner/style.scss +++ b/src/components/spinner/style.scss @@ -1,8 +1,17 @@ .spinner-wrapper { - background-color: rgba( #fff, 1.0); transition: background-color 1200ms ease-out; + &.is-block { + width: auto; + position: absolute; + z-index: 99999; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + } + &.is-fixed { + background-color: rgba(#fff, 1.0); z-index: 99999; position: fixed; width: 100%; @@ -15,7 +24,7 @@ &.reverse, &.dismissed { - background-color: rgba( #fff, 0.0); + background-color: rgba(#fff, 0.0); } &.dismissed { @@ -36,6 +45,7 @@ flex-direction: column; justify-content: center; align-items: center; + width: 100%; } .spinner { diff --git a/src/pages/business/videoInfo/videoInfo.scss b/src/pages/business/videoInfo/videoInfo.scss index 5c0a7ad..1e6f13a 100644 --- a/src/pages/business/videoInfo/videoInfo.scss +++ b/src/pages/business/videoInfo/videoInfo.scss @@ -7,11 +7,7 @@ height: 500rpx; } - .image { - width: 100%; - height: 100%; - display: block; - } + .header { margin-bottom: 10px; diff --git a/src/pages/business/videoInfo/videoInfo.tsx b/src/pages/business/videoInfo/videoInfo.tsx index bec6f10..731c360 100644 --- a/src/pages/business/videoInfo/videoInfo.tsx +++ b/src/pages/business/videoInfo/videoInfo.tsx @@ -1,4 +1,4 @@ -import {Image, Text, View} from "@tarojs/components"; +import {Text, View} from "@tarojs/components"; import {FC, useCallback, useEffect, useState} from "react"; import {CourseDepData, curriculum} from "@/api"; import './videoInfo.scss' @@ -9,6 +9,8 @@ import eventsIndex from "@/hooks/eventsIndex"; import {formatMinute} from "@/utils/time"; import videoEvents from "@/hooks/videoEvents"; import unique_ident from "@/hooks/unique_ident"; +import Spin from "@/components/spinner"; +import Img from "@/components/image/image"; const VideoInfo: FC = () => { const {id, depId} = Taro.getCurrentInstance()?.router?.params as any @@ -16,15 +18,16 @@ const VideoInfo: FC = () => { const [playId, setPlayId] = useState(null) const [preview, setPreview] = useState(false) // 预览 const [playing, setPlaying] = useState(false) // 学习中 + const [enable, setEnable] = useState(true) const getData = useCallback(async (playing: boolean) => { - const res = await curriculum.courseDep(id, depId) - if (res) { - setData(res) - } - if (playId != null) { // 用于自动播放 判断当前课程是否完成 - currentVideo(res, playing) + try { + const res = await curriculum.courseDep(id, depId) + res && setData(res) + playId != null && currentVideo(res, playing) // 用于自动播放 判断当前课程是否完成 + } catch (e) { } + setEnable(false) }, [playing, playId]) const curEnd = (test?: boolean) => { @@ -73,9 +76,7 @@ const VideoInfo: FC = () => { } }, [playId, data, preview]) - /** - * 判断当前课程是否完成 - */ + /** 判断当前课程是否完成 */ const currentVideo = useCallback((data: CourseDepData, playing: boolean) => { const courseHourRecordsFinish = data?.learn_hour_records.find(d => d.id === playId)?.courseHourRecordsFinish if (typeof courseHourRecordsFinish === 'number') { @@ -106,12 +107,13 @@ const VideoInfo: FC = () => { }) return ( <> + { playId ? - : + : } diff --git a/src/pages/home/components/feature_recommended.tsx b/src/pages/home/components/feature_recommended.tsx index 31fbb5f..cb08eab 100644 --- a/src/pages/home/components/feature_recommended.tsx +++ b/src/pages/home/components/feature_recommended.tsx @@ -150,8 +150,8 @@ const FeatureRecommended: FC = (props) => { } return ( - - + + { data.map(d => { const [page, setPage] = useState(1) const [data, setData] = useState([]) const [total, setTotal] = useState(0) + const [enable, setEnable] = useState(true) async function getData(page: number) { - const res = await HomeApi.health(page, 10) - setData(res.data) - setTotal(res.total) + try { + const res = await HomeApi.health(page, 10) + setData(res.data) + setTotal(res.total) + } catch (e) { + } + setEnable(false) } useReachBottom(() => { @@ -32,6 +38,7 @@ const Health: FC = () => { return ( + { data.length > 0 diff --git a/src/pages/preview/illness/sort/sort.tsx b/src/pages/preview/illness/sort/sort.tsx index 695f3ea..54e4b82 100644 --- a/src/pages/preview/illness/sort/sort.tsx +++ b/src/pages/preview/illness/sort/sort.tsx @@ -7,6 +7,7 @@ import Tabs, {TabList} from "@/components/tabs/tabs"; import {illnessApi} from "@/api/illness"; import Empty from "@/components/empty/empty"; import leftArrow from "@/static/img/leftArrow.png" +import Spin from "@/components/spinner"; const prefix = 'SORT' const Sort: FC = () => { @@ -14,16 +15,24 @@ const Sort: FC = () => { const [firstId, setFirstId] = useState(undefined) // 一级分类 const [secondId, setSecondId] = useState(undefined) // 二级分类 const [list, setList] = useState([]) + const [enable, setEnable] = useState(true) + const [loading, setLoading] = useState(false) const globalData = Taro.getApp().globalData const menu = Taro.getMenuButtonBoundingClientRect() async function getData() { - const res = await HomeApi.category(3) - setData(res) - if (res.length) { - setFirstId(res[0].id) - setSecondId(res[0]?.resource_category?.[0].id) + try { + + const res = await HomeApi.category(3) + setData(res) + if (res.length) { + setFirstId(res[0].id) + setSecondId(res[0]?.resource_category?.[0].id) + } + } catch (e) { + setLoading(false) } + setEnable(false) } function jump(id: number) { @@ -54,17 +63,16 @@ const Sort: FC = () => { useEffect(() => { if (secondId) { - Taro.showLoading({title: '加载中'}) + setLoading(true) illnessApi.list(secondId, 1, 100).then(res => { setList(res.list) - }).finally(() => { - Taro.hideLoading() }).catch(() => { setList([]) }) } else { setList([]) } + setLoading(false) }, [secondId]) function swiperChange(e) { @@ -76,6 +84,7 @@ const Sort: FC = () => { return ( + { className={styles.tree} scrollWithAnimation> { - list.length ? - list.map(d => jump(d.id)}>{d.name}) - : + loading ? : <> + { + list.length ? + list.map(d => jump(d.id)}>{d.name}) + : + } + } ) diff --git a/src/pages/preview/profession/profession.tsx b/src/pages/preview/profession/profession.tsx index 404d374..bafc47d 100644 --- a/src/pages/preview/profession/profession.tsx +++ b/src/pages/preview/profession/profession.tsx @@ -5,6 +5,7 @@ import Tabs, {OnChangOpt, TabList} from "@/components/tabs/tabs"; import Empty from "@/components/empty/empty"; import Taro from "@tarojs/taro"; import styles from './profession.module.scss' +import Spin from "@/components/spinner"; interface KillData { data: Kill[] @@ -16,6 +17,8 @@ const Profession = () => { const [tabs, setTabs] = useState([]) const [categoryId, setCategoryId] = useState(null) const [data, setData] = useState>(new Map) + const [enable, setEnable] = useState(true) + const [loading, setLoading] = useState(false) /** * more 开启加载更多 @@ -32,9 +35,7 @@ const Profession = () => { } try { - if (!data.has(categoryId)) { - Taro.showLoading() - } + setLoading(true) const res = await HomeApi.skillList(categoryId!, page, 10) const dataList = res.data.reduce((pre, cur) => { const index = pre.findIndex(d => d.id === cur.id) @@ -54,7 +55,7 @@ const Profession = () => { setData(oldData) } catch (e) { } - Taro.hideLoading() + setLoading(false) } useEffect(() => { @@ -62,10 +63,14 @@ const Profession = () => { }, [categoryId]) async function getCategory() { - const res = await HomeApi.skillCategory() - const newTabs = res.map(d => ({title: d.name, value: d.id})) - setTabs(newTabs) - setCategoryId(newTabs[0].value as number) + try { + const res = await HomeApi.skillCategory() + const newTabs = res.map(d => ({title: d.name, value: d.id})) + setTabs(newTabs) + setCategoryId(newTabs[0].value as number) + } catch (e) { + } + setEnable(false) } function tabsChange(tab: OnChangOpt) { @@ -101,6 +106,7 @@ const Profession = () => { ) } + ) } @@ -108,6 +114,7 @@ const Profession = () => { return ( <> + From bcbf3b8e416ac7c8e0e9ddc2f06e07310ba63dde Mon Sep 17 00:00:00 2001 From: king <2229249788@qq.com> Date: Wed, 30 Aug 2023 15:43:49 +0800 Subject: [PATCH 28/48] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E7=8A=B6=E6=80=81=20&&=20=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E7=BD=91=E7=BB=9C=E5=9B=BE=E7=89=87=E5=8A=A0=E8=BD=BD=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/empty/empty.tsx | 2 +- src/components/popPut/popPut.tsx | 7 +- src/pages/business/videoInfo/videoInfo.tsx | 44 ++++------ src/pages/home/home.tsx | 2 +- src/pages/index/index.config.ts | 2 +- src/pages/manage/courseAdmin/courseAdmin.tsx | 4 + src/pages/manage/depAdmin/depAdmin.tsx | 4 + src/pages/manage/selectDep/selectDep.tsx | 4 + src/pages/manage/userInfo/components/info.tsx | 5 +- .../manage/userInfo/userInfo.module.scss | 1 - src/pages/preview/brand/info/info.tsx | 88 +++++++++---------- src/pages/preview/brand/list/list.tsx | 7 +- src/pages/preview/health/health.module.scss | 7 -- src/pages/preview/health/health.tsx | 3 +- src/pages/preview/illness/list/list.tsx | 23 +++-- .../preview/profession/profession.module.scss | 13 ++- src/pages/preview/profession/profession.tsx | 9 +- src/static/css/module.scss | 5 -- 18 files changed, 112 insertions(+), 118 deletions(-) diff --git a/src/components/empty/empty.tsx b/src/components/empty/empty.tsx index 57ec81d..1702395 100644 --- a/src/components/empty/empty.tsx +++ b/src/components/empty/empty.tsx @@ -10,7 +10,7 @@ interface Props { const Empty: FC = ({name}) => { return ( - + {name} ) diff --git a/src/components/popPut/popPut.tsx b/src/components/popPut/popPut.tsx index 4184ffc..ed2f6dc 100644 --- a/src/components/popPut/popPut.tsx +++ b/src/components/popPut/popPut.tsx @@ -1,7 +1,8 @@ import {FC, ReactNode, useEffect, useState} from "react"; -import {View, Image} from "@tarojs/components"; +import {View} from "@tarojs/components"; import Icon from "@/components/icon"; import CustomPageContainer from "@/components/custom-page-container/custom-page-container"; +import Img from "@/components/image/image"; interface Props { height?: number | string @@ -46,13 +47,13 @@ const PopPut: FC = ({title, chevron, content, image, isProp, children, sh <> - {opt.leftImage != null && } + {opt.leftImage != null && } {title} {content} {!chevron && } - {image && } + {image && } { diff --git a/src/pages/business/videoInfo/videoInfo.tsx b/src/pages/business/videoInfo/videoInfo.tsx index 731c360..5dee99c 100644 --- a/src/pages/business/videoInfo/videoInfo.tsx +++ b/src/pages/business/videoInfo/videoInfo.tsx @@ -9,7 +9,6 @@ import eventsIndex from "@/hooks/eventsIndex"; import {formatMinute} from "@/utils/time"; import videoEvents from "@/hooks/videoEvents"; import unique_ident from "@/hooks/unique_ident"; -import Spin from "@/components/spinner"; import Img from "@/components/image/image"; const VideoInfo: FC = () => { @@ -18,7 +17,6 @@ const VideoInfo: FC = () => { const [playId, setPlayId] = useState(null) const [preview, setPreview] = useState(false) // 预览 const [playing, setPlaying] = useState(false) // 学习中 - const [enable, setEnable] = useState(true) const getData = useCallback(async (playing: boolean) => { try { @@ -27,7 +25,6 @@ const VideoInfo: FC = () => { playId != null && currentVideo(res, playing) // 用于自动播放 判断当前课程是否完成 } catch (e) { } - setEnable(false) }, [playing, playId]) const curEnd = (test?: boolean) => { @@ -106,31 +103,28 @@ const VideoInfo: FC = () => { videoEvents.videoOff() }) return ( - <> - - - - { - playId - ? - : - } - + + + { + playId + ? + : + } + - - - {data?.is_required ? '必修' : '选修'} - {data?.course.class_hour}课时 - - {data?.course.title} - - 时长:{formatMinute(data?.duration || 0)} - 学习进度{((data?.learn_hour_records.length || 0) / (data?.course.class_hour || 1) * 100).toFixed(0)}% - + + + {data?.is_required ? '必修' : '选修'} + {data?.course.class_hour}课时 + + {data?.course.title} + + 时长:{formatMinute(data?.duration || 0)} + 学习进度{((data?.learn_hour_records.length || 0) / (data?.course.class_hour || 1) * 100).toFixed(0)}% - - + + ) } diff --git a/src/pages/home/home.tsx b/src/pages/home/home.tsx index b91c4b0..c2f9131 100644 --- a/src/pages/home/home.tsx +++ b/src/pages/home/home.tsx @@ -40,7 +40,7 @@ const Home: FC = () => { {data && } { !token && - 登录后享受更多学习服务~ + 登录后享受更多服务~ 立即登录 } diff --git a/src/pages/index/index.config.ts b/src/pages/index/index.config.ts index 3637195..752ef7b 100644 --- a/src/pages/index/index.config.ts +++ b/src/pages/index/index.config.ts @@ -1,5 +1,5 @@ export default definePageConfig({ - navigationBarTitleText: '医学道', + navigationBarTitleText: '学习课程', navigationBarBackgroundColor: '#92ecc5', navigationBarTextStyle: 'white', }) diff --git a/src/pages/manage/courseAdmin/courseAdmin.tsx b/src/pages/manage/courseAdmin/courseAdmin.tsx index 6f9b245..ad087dd 100644 --- a/src/pages/manage/courseAdmin/courseAdmin.tsx +++ b/src/pages/manage/courseAdmin/courseAdmin.tsx @@ -6,12 +6,14 @@ import styles from './courseAdmin.module.scss' import Taro, {useReachBottom} from "@tarojs/taro"; import MyButton from "@/components/button/MyButton"; import storageDep from "@/hooks/storageDep"; +import Spin from "@/components/spinner"; const CourseAdmin: FC = () => { const [total, setTotal] = useState(0) const [data, setData] = useState([]) const [batch, setBatch] = useState(false) const [curs, setCurs] = useState([]) + const [enable, setEnable] = useState(true) const [param, setParam] = useState({ page: 1, page_size: 10, @@ -34,6 +36,7 @@ const CourseAdmin: FC = () => { ]) } }) + setEnable(false) } useEffect(() => { @@ -149,6 +152,7 @@ const CourseAdmin: FC = () => { return ( + diff --git a/src/pages/manage/depAdmin/depAdmin.tsx b/src/pages/manage/depAdmin/depAdmin.tsx index df6af00..41a8e22 100644 --- a/src/pages/manage/depAdmin/depAdmin.tsx +++ b/src/pages/manage/depAdmin/depAdmin.tsx @@ -8,6 +8,7 @@ import folder from '@/static/img/folder.png' import ShowModel from "@/components/showModel/showModel"; import Empty from "@/components/empty/empty"; import {Profile} from '@/store' +import Spin from "@/components/spinner"; const DepAdmin: FC = () => { const router = useRouter() @@ -17,6 +18,7 @@ const DepAdmin: FC = () => { const [isPut, setIsPut] = useState(false) const [depName, setDepName] = useState('') const [reset, setReset] = useState(false) + const [enable, setEnable] = useState(true) const {company} = Profile.useContainer() @@ -31,6 +33,7 @@ const DepAdmin: FC = () => { } } catch (e) { } + setEnable(false) } function showPop(name: string | undefined) { @@ -137,6 +140,7 @@ const DepAdmin: FC = () => { return ( <> + {manages.map(d => { const [ids, setIds] = useState([]) const [deps, setDeps] = useState([]) const [required, setRequired] = useState([]) + const [enable, setEnable] = useState(true) useEffect(() => { curriculum.department().then(res => { setDeps(res.data) }) + setEnable(false) setIds(JSON.parse(params.depIds)) setRequired(JSON.parse(params.required || "[]")) }, []) @@ -79,6 +82,7 @@ const SelectDep: FC = () => { return ( + {deps.map((d) => onChange(d.id)}> diff --git a/src/pages/manage/userInfo/components/info.tsx b/src/pages/manage/userInfo/components/info.tsx index db7f5fc..973fdf0 100644 --- a/src/pages/manage/userInfo/components/info.tsx +++ b/src/pages/manage/userInfo/components/info.tsx @@ -1,6 +1,7 @@ import {FC} from "react"; -import {Image, Text, View} from "@tarojs/components"; +import { Text, View} from "@tarojs/components"; import styles from '../userInfo.module.scss' +import Img from "@/components/image/image"; interface Props { data: User | null @@ -12,7 +13,7 @@ const Info: FC = ({data}) => { return ( <> - + {data?.name} diff --git a/src/pages/manage/userInfo/userInfo.module.scss b/src/pages/manage/userInfo/userInfo.module.scss index 11d96fc..9cbc680 100644 --- a/src/pages/manage/userInfo/userInfo.module.scss +++ b/src/pages/manage/userInfo/userInfo.module.scss @@ -15,7 +15,6 @@ .image { width: 120rpx; height: 120rpx; - background: #ddd; border-radius: 10rpx; overflow: hidden; } diff --git a/src/pages/preview/brand/info/info.tsx b/src/pages/preview/brand/info/info.tsx index b7bced8..b797fed 100644 --- a/src/pages/preview/brand/info/info.tsx +++ b/src/pages/preview/brand/info/info.tsx @@ -7,6 +7,7 @@ import LineEllipsis from "@/components/textCollapse/collapse"; import Empty from "@/components/empty/empty"; import Img from "@/components/image/image"; import {rfc33392time} from "@/utils/day"; +import Spin from "@/components/spinner"; type Params = { id: number @@ -15,18 +16,12 @@ const BrandInfo: FC = () => { const {id} = useRouter().params as unknown as Params const [brandInfo, setBrandInfo] = useState() const [articleList, setArticleList] = useState([]) - const [curIndex,setCurIndex] = useState(1) + const [curIndex, setCurIndex] = useState(1) const [page, setPage] = useState(1) const [total, setTotal] = useState(0) + const [enable, setEnable] = useState(true) useEffect(() => { - Taro.showLoading({ - title: '加载中', - mask: true - }) - setTimeout(function () { - Taro.hideLoading() - }, 1000) getData() }, [id]) @@ -35,7 +30,7 @@ const BrandInfo: FC = () => { const data = await brandApi.info(id) Taro.setNavigationBarTitle({title: data.name}) setBrandInfo(data) - const data1 = await brandApi.articleList(id,page) + const data1 = await brandApi.articleList(id, page) setTotal(data1.total) setArticleList([ ...(articleList || []), @@ -44,6 +39,7 @@ const BrandInfo: FC = () => { } catch (e) { // setBrandInfo({disabled: 0, graphic_introduction: "", id: 0, introductory_video: "", name: "", brand_album:['1','2','3']}) } + setEnable(false) } useReachBottom(useCallback(() => { @@ -53,7 +49,7 @@ const BrandInfo: FC = () => { }, [total, articleList])) useEffect(() => { - brandApi.articleList(id,page).then(res => { + brandApi.articleList(id, page).then(res => { setTotal(res.total) setArticleList([ ...(articleList || []), @@ -63,46 +59,46 @@ const BrandInfo: FC = () => { }, [page]) - function onChange(e){ - console.log(e) - setCurIndex(+e.detail.current+1) + function onChange(e) { + setCurIndex(+e.detail.current + 1) } return ( - - + + - { brandInfo?.introductory_video_resource?.url && - } - {brandInfo?.brand_album?.length - && brandInfo?.brand_album?.split(',').map((d) => - - - ) - } - - - {curIndex} / {(brandInfo?.brand_album?.split(',').length || 0) + ((brandInfo && brandInfo.introductory_video_resource) ? 1:0)} - + > + {brandInfo?.introductory_video_resource?.url && + } + {brandInfo?.brand_album?.length + && brandInfo?.brand_album?.split(',').map((d) => + + + ) + } + + + {curIndex} / {(brandInfo?.brand_album?.split(',').length || 0) + ((brandInfo && brandInfo.introductory_video_resource) ? 1 : 0)} + {brandInfo?.name} diff --git a/src/pages/preview/brand/list/list.tsx b/src/pages/preview/brand/list/list.tsx index cf422a0..224a82b 100644 --- a/src/pages/preview/brand/list/list.tsx +++ b/src/pages/preview/brand/list/list.tsx @@ -1,10 +1,11 @@ import {FC, useCallback, useEffect, useState} from "react"; -import {Image, View} from "@tarojs/components"; +import {View} from "@tarojs/components"; import {brandApi, BrandRecord} from "@/api"; import styles from './list.module.scss' import Taro, {useReachBottom} from "@tarojs/taro"; import Empty from "@/components/empty/empty"; import Spinner from "@/components/spinner"; +import Img from "@/components/image/image"; const BrandList: FC = () => { const [page, setPage] = useState(1) @@ -52,13 +53,13 @@ const BrandList: FC = () => { return ( - + { brands.length ? <> {brands.map((d) => jumpInfo(d.id)} className={styles.box} key={d.id}> - + {d.name} {d.graphic_introduction} diff --git a/src/pages/preview/health/health.module.scss b/src/pages/preview/health/health.module.scss index f28a403..bd705b8 100644 --- a/src/pages/preview/health/health.module.scss +++ b/src/pages/preview/health/health.module.scss @@ -13,13 +13,6 @@ overflow: hidden; margin-bottom: 20rpx; position: relative; - - image, - Image { - background: #eee; - width: 100%; - min-height: 345rpx; - } } .play { diff --git a/src/pages/preview/health/health.tsx b/src/pages/preview/health/health.tsx index 7eede9d..a715fed 100644 --- a/src/pages/preview/health/health.tsx +++ b/src/pages/preview/health/health.tsx @@ -6,6 +6,7 @@ import styles from './health.module.scss' import play from '@/static/img/play.png' import Empty from "@/components/empty/empty"; import Spin from "@/components/spinner"; +import Img from "@/components/image/image"; const Health: FC = () => { const [page, setPage] = useState(1) @@ -43,7 +44,7 @@ const Health: FC = () => { { data.length > 0 ? data.map(d => jump(d)}> - + {d.title} {d.video_view}观看 diff --git a/src/pages/preview/illness/list/list.tsx b/src/pages/preview/illness/list/list.tsx index a146c9b..c1b893a 100644 --- a/src/pages/preview/illness/list/list.tsx +++ b/src/pages/preview/illness/list/list.tsx @@ -4,29 +4,31 @@ import styles from './list.module.scss' import Taro, {useReachBottom, useRouter} from "@tarojs/taro"; import {illnessApi} from "@/api/illness"; import Empty from "@/components/empty/empty"; +import Spin from "@/components/spinner"; const BrandList: FC = () => { const params = useRouter().params as unknown as { id: number } const [page, setPage] = useState(1) const [articles, setArticles] = useState([]) - const [illness,setIllness] = useState<{name:string;description:string;resource:any;album:string[]}>() + // const [illness, setIllness] = useState<{ name: string; description: string; resource: any; album: string[] }>() const [total, setTotal] = useState(0) const [fetchDone, setFetchDone] = useState(false) + const [enable, setEnable] = useState(true) useEffect(() => { - Taro.showLoading({title: '加载中', mask: true}) getData().then() }, [page]) const getData = useCallback(async () => { try { const data = await illnessApi.articleInfo(params.id, page, 20) - Taro.setNavigationBarTitle({title:data.illness.name}) - setIllness(data.illness) + Taro.setNavigationBarTitle({title: data?.illness?.name || '暂无文章'}) + // setIllness(data.illness) setTotal(data.list.total) setArticles([...articles, ...data.list.list]) } catch (e) { } + setEnable(false) setFetchDone(true) Taro.hideLoading() }, [page]) @@ -44,12 +46,17 @@ const BrandList: FC = () => { return ( - + + { articles.length > 0 ? - articles.map((d, index) => jump(d.id)}> - {index + 1} . {d.title} - ) + + { + articles.map((d, index) => jump(d.id)}> + {index + 1} . {d.title} + ) + } + : } diff --git a/src/pages/preview/profession/profession.module.scss b/src/pages/preview/profession/profession.module.scss index 57291c2..a1ee13c 100644 --- a/src/pages/preview/profession/profession.module.scss +++ b/src/pages/preview/profession/profession.module.scss @@ -10,13 +10,10 @@ box-sizing: border-box; display: flex; margin-bottom: 20rpx; +} + - Image, - image { - width: 320rpx; - max-height: 180rpx; - margin-right: 20rpx; - border-radius: 10rpx; - background: #eee; - } +.image { + margin-right: 20rpx; + border-radius: 10rpx; } diff --git a/src/pages/preview/profession/profession.tsx b/src/pages/preview/profession/profession.tsx index bafc47d..82ce6bd 100644 --- a/src/pages/preview/profession/profession.tsx +++ b/src/pages/preview/profession/profession.tsx @@ -1,4 +1,4 @@ -import {Image, ScrollView, Swiper, SwiperItem, View} from "@tarojs/components"; +import {ScrollView, Swiper, SwiperItem, View} from "@tarojs/components"; import {HomeApi} from "@/api"; import {useEffect, useState} from "react"; import Tabs, {OnChangOpt, TabList} from "@/components/tabs/tabs"; @@ -6,6 +6,7 @@ import Empty from "@/components/empty/empty"; import Taro from "@tarojs/taro"; import styles from './profession.module.scss' import Spin from "@/components/spinner"; +import Img from "@/components/image/image"; interface KillData { data: Kill[] @@ -18,7 +19,6 @@ const Profession = () => { const [categoryId, setCategoryId] = useState(null) const [data, setData] = useState>(new Map) const [enable, setEnable] = useState(true) - const [loading, setLoading] = useState(false) /** * more 开启加载更多 @@ -35,7 +35,6 @@ const Profession = () => { } try { - setLoading(true) const res = await HomeApi.skillList(categoryId!, page, 10) const dataList = res.data.reduce((pre, cur) => { const index = pre.findIndex(d => d.id === cur.id) @@ -55,7 +54,6 @@ const Profession = () => { setData(oldData) } catch (e) { } - setLoading(false) } useEffect(() => { @@ -101,12 +99,11 @@ const Profession = () => { { data.data.map(d => jump(d)}> - + {d?.resource?.name} ) } - ) } diff --git a/src/static/css/module.scss b/src/static/css/module.scss index 8f57891..b021177 100644 --- a/src/static/css/module.scss +++ b/src/static/css/module.scss @@ -59,11 +59,6 @@ taro-button-core::after { align-items: center; justify-content: center; } - - .image { - width: 68px; - height: 68px; - } } .Textarea { From 1775c391367d76b2338a533b36fae66de8619b5d Mon Sep 17 00:00:00 2001 From: sunlizhou <296190577@qq.com> Date: Wed, 30 Aug 2023 16:07:08 +0800 Subject: [PATCH 29/48] =?UTF-8?q?=E6=9C=AA=E7=99=BB=E5=BD=95=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=B1=95=E7=A4=BA=E7=99=BB=E5=BD=95=E8=A7=86=E5=9B=BE?= =?UTF-8?q?=EF=BC=8C=E4=B8=AA=E4=BA=BA=E4=B8=AD=E5=BF=83=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E5=85=AC=E5=8F=B8=EF=BC=8C=E5=B9=B6=E5=8F=AF=E4=BB=A5=E5=88=87?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/request.ts | 18 ++++----- src/app.tsx | 1 + src/components/loginView/index.module.scss | 36 ++++++++++++++++++ src/components/loginView/index.tsx | 31 +++++++++++++++ src/pages/index/index.tsx | 16 +++++++- src/pages/login/login.module.scss | 2 + src/pages/login/login.tsx | 6 ++- src/pages/my/components/header/header.tsx | 10 ++++- src/pages/my/my.module.scss | 42 +++++++++++++++++++++ src/pages/my/my.tsx | 37 ++++++++++++++++-- src/pages/preview/brand/info/info.tsx | 2 +- src/static/img/blacktriangle.png | Bin 0 -> 291 bytes src/static/img/greenNike.png | Bin 0 -> 624 bytes src/static/img/noLogin.png | Bin 0 -> 22962 bytes src/store/profile.ts | 2 +- 15 files changed, 183 insertions(+), 20 deletions(-) create mode 100644 src/components/loginView/index.module.scss create mode 100644 src/components/loginView/index.tsx create mode 100644 src/static/img/blacktriangle.png create mode 100644 src/static/img/greenNike.png create mode 100644 src/static/img/noLogin.png diff --git a/src/api/request.ts b/src/api/request.ts index 59d2501..5c1712f 100644 --- a/src/api/request.ts +++ b/src/api/request.ts @@ -88,15 +88,15 @@ export function request( } else if (res.statusCode === 401) { if (notLoging) return notLoging = true - Taro.showModal({ - title: "请登录", - content: token ? '登录过期' : "完成登录开启功能", - showCancel: false, - success() { - Taro.clearStorageSync() - Taro.redirectTo({url: '/pages/login/login'}) - } - }) + // Taro.showModal({ + // title: "请登录", + // content: token ? '登录过期' : "完成登录开启功能", + // showCancel: false, + // success() { + // Taro.clearStorageSync() + // Taro.redirectTo({url: '/pages/login/login'}) + // } + // }) } else { reject(null) Taro.showToast({ diff --git a/src/app.tsx b/src/app.tsx index 9e6d8c4..61fca2e 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -44,6 +44,7 @@ function App(props) { statusBarHeight: res.statusBarHeight || 0, screenWidth: res.screenWidth, screenHeight: res.screenHeight, + windowHeight: res.windowHeight, safeArea: res.safeArea, } } diff --git a/src/components/loginView/index.module.scss b/src/components/loginView/index.module.scss new file mode 100644 index 0000000..e7e2337 --- /dev/null +++ b/src/components/loginView/index.module.scss @@ -0,0 +1,36 @@ +.content { + position: relative; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + image{ + width: 320rpx; + height: 208rpx; + } + .title{ + font-size: 28rpx; + font-weight: bold; + color: #323635; + line-height: 80rpx; + } + .label{ + font-size: 24rpx; + font-weight: 500; + color: #909795; + line-height: 24rpx; + margin-bottom: 40rpx; + } + .button{ + width: 70%; + height: 76rpx; + background: #45D4A8; + border-radius: 38rpx 38rpx 38rpx 38rpx; + color: #fff; + line-height: 76rpx; + text-align: center; + font-size: 32rpx; + font-weight: 500; + } +} diff --git a/src/components/loginView/index.tsx b/src/components/loginView/index.tsx new file mode 100644 index 0000000..367e61e --- /dev/null +++ b/src/components/loginView/index.tsx @@ -0,0 +1,31 @@ +import {CSSProperties,FC} from "react"; +import {View,Image} from "@tarojs/components"; +import styles from './index.module.scss' +import NoLogin from '@/static/img/noLogin.png' +import {Profile} from "@/store"; + +interface Props { + tips?: string + height?: number +} + +const LoginView: FC = (props) => { + const {empty} = Profile.useContainer() + const text = props.tips ?? '登录后可查看更多内容' + const size: string = props.height? `${props.height}px`:'750rpx' + const sizeStyle: CSSProperties = { + height:size, + } + + + return ( + + + 暂未登录 + {text} + {empty()}} className={styles.button}>立即登录 + + ) +} + +export default LoginView diff --git a/src/pages/index/index.tsx b/src/pages/index/index.tsx index 99032e0..6eb859a 100644 --- a/src/pages/index/index.tsx +++ b/src/pages/index/index.tsx @@ -4,8 +4,13 @@ import styles from './index.module.scss' import {VideoList} from "@/pages/index/components/videoList"; import Tabs, {OnChangOpt, TabList} from "@/components/tabs/tabs"; import {CoursesKey} from "@/api/public"; +import LoginView from "@/components/loginView"; +import Taro from "@tarojs/taro"; +import {Profile} from "@/store" const Index: FC = () => { + const globalData = Taro.getApp().globalData + const {token} = Profile.useContainer() const category: TabList[] = [ {title: "必修", value: 'is_required'}, {title: "选修", value: 'is_not_required'}, @@ -22,8 +27,15 @@ const Index: FC = () => { return ( <> - - setCategoryKey(categoryKey)}/> + { !token ? + + : + <> + + setCategoryKey(categoryKey)}/> + + } + ) diff --git a/src/pages/login/login.module.scss b/src/pages/login/login.module.scss index 43518ce..b568542 100644 --- a/src/pages/login/login.module.scss +++ b/src/pages/login/login.module.scss @@ -59,3 +59,5 @@ height: 50vh; padding: 50px 30px 0; } + + diff --git a/src/pages/login/login.tsx b/src/pages/login/login.tsx index 42ccd03..86b9750 100644 --- a/src/pages/login/login.tsx +++ b/src/pages/login/login.tsx @@ -1,6 +1,6 @@ import {FC, useEffect, useState} from "react"; import {Profile} from "@/store"; -import {Image, Text, View} from "@tarojs/components"; +import {Image, PageContainer, Text, View} from "@tarojs/components"; import Taro from "@tarojs/taro"; import styles from './login.module.scss' import Icon from "@/components/icon"; @@ -8,11 +8,13 @@ import {userApi} from "@/api"; import {loginApi, LoginParams} from "@/api/login"; import MyButton from "@/components/button/MyButton"; + const Login: FC = () => { const [isLoading, setLoading] = useState(false) const [error, setError] = useState(null) const {setUser, setToken, setCompany} = Profile.useContainer() const [h5params, setH5Params] = useState(null) + const [show,setShow] = useState(true) useEffect(() => { @@ -58,7 +60,9 @@ const Login: FC = () => { setCompany(company) setLoading(false) Taro.switchTab({url: '/pages/home/home'}) + } else { + Taro.setStorageSync('openid', catch_key) Taro.reLaunch({url: '/pages/check/check'}) } diff --git a/src/pages/my/components/header/header.tsx b/src/pages/my/components/header/header.tsx index 35de45f..c590a7c 100644 --- a/src/pages/my/components/header/header.tsx +++ b/src/pages/my/components/header/header.tsx @@ -2,6 +2,7 @@ import {Profile} from "@/store"; import {Image, Text, View} from "@tarojs/components"; import styles from "@/pages/my/my.module.scss"; import avatar from "@/static/img/avatar.png" +import blacktriang from "@/static/img/blacktriangle.png" const Header = () => { const {user} = Profile.useContainer() @@ -12,9 +13,14 @@ const Header = () => { {user?.name} - - 手机号:{user?.phone_number} + + + 江苏康缘药业股份有限公司 + + {/**/} + {/* 手机号:{user?.phone_number}*/} + {/**/} diff --git a/src/pages/my/my.module.scss b/src/pages/my/my.module.scss index 648a4d9..c5098a2 100644 --- a/src/pages/my/my.module.scss +++ b/src/pages/my/my.module.scss @@ -89,3 +89,45 @@ page { padding: 30rpx 20px; margin: 20rpx; } + +.box { + display: flex; + background-color: #fff; + border-radius: 16rpx; + padding: 16rpx 0; + box-sizing: border-box; + border-bottom: 2rpx solid #F5F8F7; + .image{ + width: 68rpx; + height:68rpx; + background-color: #eee; + border-radius: 8rpx; + overflow: hidden; + } + .innerBox{ + height: 68rpx; + align-items: center; + margin-left: 24rpx; + box-sizing: border-box; + flex: 1; + display: flex; + justify-content: space-between; + .title{ + font-size: 32rpx; + font-weight: 500; + color: #323635; + flex: 1; + display: -webkit-box; + text-overflow: ellipsis; + overflow: hidden; + -webkit-box-orient:vertical; + -webkit-line-clamp:1; + } + .icon{ + margin-left: 24rpx; + width:24rpx; + height:24rpx; + } + } + +} diff --git a/src/pages/my/my.tsx b/src/pages/my/my.tsx index a784b3a..df47fc9 100644 --- a/src/pages/my/my.tsx +++ b/src/pages/my/my.tsx @@ -1,19 +1,48 @@ -import {View} from "@tarojs/components"; +import {PageContainer, View, Image} from "@tarojs/components"; import Taro from "@tarojs/taro"; import styles from './my.module.scss' import Header from "./components/header/header"; import {FC} from "react"; import Time from "@/pages/my/components/header/time"; import Service from "@/pages/my/components/header/service"; +import LoginView from "@/components/loginView"; +import {Profile} from "@/store"; +import {rfc33392time} from "@/utils/day"; +import Img from "@/components/image/image"; +import GreenNike from "@/static/img/greenNike.png" const My: FC = () => { const globalData = Taro.getApp().globalData + const {token,empty} = Profile.useContainer() return ( -
    -