Merge pull request #523 from xbingW/main

更新官网
This commit is contained in:
delong.wang
2023-12-15 15:59:45 +08:00
committed by GitHub
22 changed files with 9676 additions and 172 deletions

View File

@@ -25,11 +25,20 @@ server {
} \n\
location /blazehttp { \n\
root /app/; \n\
try_files \$uri =404; \n\
try_files \$uri =404; \n\
} \n\
location /release { \n\
root /app/; \n\
try_files \$uri =404; \n\
try_files \$uri =404; \n\
} \n\
location /sitemap.xml { \n\
root /srv/website/public; \n\
} \n\
location /sitemap-0.xml { \n\
root /srv/website/public; \n\
} \n\
location /robots.txt { \n\
root /srv/website/public; \n\
} \n\
location / { \n\
rewrite /posts/guide_introduction /docs/ permanent; \n\

View File

@@ -4,6 +4,8 @@ import (
"context"
"log"
"net/http"
"slices"
"sort"
"strings"
"sync"
"time"
@@ -11,6 +13,22 @@ import (
"github.com/shurcooL/githubv4"
)
type LabelName = string
const (
LabelNameEnhancement LabelName = "enhancement"
LabelNameInProgress LabelName = "in progress"
LabelNameReleased LabelName = "released"
)
type RoadmapLabelName = string
const (
RoadmapLabelNameInConsideration RoadmapLabelName = "in_consideration"
RoadmapLabelNameInProgress RoadmapLabelName = "in_progress"
RoadmapLabelNameReleased RoadmapLabelName = "released"
)
type Label struct {
Name string `json:"name"`
Color string `json:"color"`
@@ -21,17 +39,58 @@ type User struct {
AvatarUrl string `json:"avatar_url"`
}
type IssueState = string
const (
IssueStateOpened IssueState = "OPEN"
IssueStateClosed IssueState = "CLOSED"
)
// Issue represents a GitHub issue with minimal fields.
type Issue struct {
ID string `json:"id"`
Title string `json:"title"`
Body string `json:"-"`
Url string `json:"url"`
Labels []Label `json:"labels"`
CommentCount int `json:"comment_count"`
ThumbsUpCount int `json:"thumbs_up"`
Author User `json:"author"`
CreatedAt int64 `json:"created_at"`
ID string `json:"id"`
Title string `json:"title"`
Body string `json:"-"`
State IssueState `json:"state"`
Url string `json:"url"`
Labels []Label `json:"labels"`
CommentCount int `json:"comment_count"`
ThumbsUpCount int `json:"thumbs_up"`
Author User `json:"author"`
CreatedAt int64 `json:"created_at"`
UpdatedAt int64 `json:"updated_at"`
}
func (i Issue) InConsideration() bool {
if i.State != IssueStateOpened {
return false
}
if !slices.Contains(i.LabelNames(), LabelNameEnhancement) {
return false
}
if slices.Contains(i.LabelNames(), LabelNameInProgress) {
return false
}
if slices.Contains(i.LabelNames(), LabelNameReleased) {
return false
}
return true
}
func (i Issue) InProgress() bool {
return i.State == IssueStateOpened && slices.Contains(i.LabelNames(), LabelNameInProgress)
}
func (i Issue) Released() bool {
return slices.Contains(i.LabelNames(), LabelNameReleased)
}
func (i Issue) LabelNames() []string {
var names []string
for _, v := range i.Labels {
names = append(names, v.Name)
}
return names
}
// Discussion represents a GitHub discussion.
@@ -171,30 +230,52 @@ func (s *GitHubService) refreshCache() {
}
// GetIssues tries to get the issues from cache; if not available, fetches from GitHub API.
func (s *GitHubService) GetIssues(ctx context.Context, filter string) (issues []*Issue, err error) {
func (s *GitHubService) GetIssues(ctx context.Context, filter string) (map[string][]*Issue, error) {
cachedIssues, found := s.cache.Load("issues")
if found {
return s.filterIssues(cachedIssues.([]*Issue), filter)
}
issues, err = s.fetchIssues(ctx, nil)
issues, err := s.fetchIssues(ctx, nil)
if err != nil {
return nil, err
}
return s.filterIssues(issues, filter)
}
func (s *GitHubService) filterIssues(issues []*Issue, filter string) ([]*Issue, error) {
func (s *GitHubService) filterIssues(issues []*Issue, filter string) (map[string][]*Issue, error) {
filteredIssues := issues
if filter != "" {
filteredIssues := make([]*Issue, 0)
filteredIssues = make([]*Issue, 0)
for _, issue := range issues {
if strings.Contains(issue.Title, filter) || strings.Contains(issue.Body, filter) {
filteredIssues = append(filteredIssues, issue)
}
}
return filteredIssues, nil
}
return issues, nil
out := make(map[string][]*Issue)
for _, issue := range filteredIssues {
if issue.InConsideration() {
out[RoadmapLabelNameInConsideration] = append(out[RoadmapLabelNameInConsideration], issue)
}
if issue.InProgress() {
out[RoadmapLabelNameInProgress] = append(out[RoadmapLabelNameInProgress], issue)
}
if issue.Released() {
out[RoadmapLabelNameReleased] = append(out[RoadmapLabelNameReleased], issue)
}
}
sort.Slice(out[RoadmapLabelNameInConsideration], func(i, j int) bool {
return out[RoadmapLabelNameInConsideration][i].ThumbsUpCount > out[RoadmapLabelNameInConsideration][j].ThumbsUpCount
})
sort.Slice(out[RoadmapLabelNameInProgress], func(i, j int) bool {
return out[RoadmapLabelNameInProgress][i].ThumbsUpCount > out[RoadmapLabelNameInProgress][j].ThumbsUpCount
})
sort.Slice(out[RoadmapLabelNameReleased], func(i, j int) bool {
return out[RoadmapLabelNameReleased][i].UpdatedAt > out[RoadmapLabelNameReleased][j].UpdatedAt
})
return out, nil
}
// GetRepositoryIssues queries GitHub for issues of a repository.
@@ -207,7 +288,9 @@ func (s *GitHubService) fetchIssues(ctx context.Context, afterCursor *githubv4.S
Title string
Body string
Url string
State string
CreatedAt githubv4.DateTime
UpdatedAt githubv4.DateTime
Author User
Labels struct {
Nodes []struct {
@@ -226,7 +309,7 @@ func (s *GitHubService) fetchIssues(ctx context.Context, afterCursor *githubv4.S
EndCursor githubv4.String
HasNextPage bool
}
} `graphql:"issues(first: 100, after: $afterCursor, states: OPEN, orderBy: {field: CREATED_AT, direction: DESC})"`
} `graphql:"issues(first: 100, after: $afterCursor, orderBy: {field: UPDATED_AT, direction: DESC})"`
} `graphql:"repository(owner: $owner, name: $name)"`
}
variables := map[string]interface{}{
@@ -243,19 +326,21 @@ func (s *GitHubService) fetchIssues(ctx context.Context, afterCursor *githubv4.S
issues := make([]*Issue, 0)
for _, node := range query.Repository.Issues.Nodes {
issue := &Issue{
ID: node.ID,
Title: node.Title,
Body: node.Body,
Url: node.Url,
ID: node.ID,
Title: node.Title,
Body: node.Body,
Url: node.Url,
State: node.State,
CreatedAt: node.CreatedAt.Unix(),
UpdatedAt: node.UpdatedAt.Unix(),
Author: node.Author,
CommentCount: node.Comments.TotalCount,
ThumbsUpCount: node.Reactions.TotalCount,
}
issue.Labels = make([]Label, len(node.Labels.Nodes))
for i, label := range node.Labels.Nodes {
issue.Labels[i] = Label{Name: label.Name, Color: label.Color}
}
issue.CommentCount = node.Comments.TotalCount
issue.ThumbsUpCount = node.Reactions.TotalCount
issue.Author = node.Author
issue.CreatedAt = node.CreatedAt.Unix()
issues = append(issues, issue)
}

View File

@@ -24,6 +24,8 @@ title: "配置其他"
### 人机验证
人机验证的有效时间默认是一个小时,未来可能会支持配置,敬请期待
详情查看 [人机验证 2.0](/about/challenge)
### 语义分析

View File

@@ -101,7 +101,11 @@ security_opt:
## 如何卸载
在安装目录(默认 safeline)下执行 `docker compose down`
在安装目录(默认 safeline)下
根据本地的compose版本执行 `docker compose down` 或者 `docker-compose down`
## 问题无法解决

View File

@@ -39,7 +39,7 @@ docker exec safeline-mgt-api resetadmin
如果之前未保存绑定二维码,想多人使用雷池社区版,只需要以下 3 步:
1. 重置动态口令(参考 [置认证](#重置认证)
1. 重置动态口令(参考 [新绑定动态口令](#重新绑定动态口令)
2. 进入登录页面,这时会自动跳转到 TOTP 绑定页面,保存 “绑定二维码”(注意,非 “认证二维码”)
3. 将 “绑定二维码” 分享给其他人进行绑定(“绑定二维码” 无绑定次数限制,无时效限制)

View File

@@ -186,13 +186,8 @@ real_ip_header X-Forwarded-For;
## 是否支持 WebSocket
如果需要支持 WebSocket需要参考 [自定义站点-nginx-conf](#自定义站点-nginx-conf),增加下面的配置
默认支持
```
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
```
## 问题无法解决

View File

@@ -1,14 +1,16 @@
---
title: "社区版独享福利"
title: "百川网站监控"
---
# 社区版独享福利
# 百川网站监控
安装雷池社区版,领取长亭网站监控产品 100 元体验金
### 百川网站监控联动
## 关于网站监控
除了对网站的安全防护以外,不少站长还对网站的可用性、稳定性健康监测和敏感内容监测也有强烈需求。
### 什么是网站监控
**除了对网站的安全防护以外,不少站长还对网站的可用性、稳定性健康监测和敏感内容监测也有强烈需求。**
[长亭百川网站监测](https://rivers.chaitin.cn/landing/radar) 是一款优秀的网站监测工具能够有效监测站点可用性、SSL 证书合法性、网站敏感内容等信息。

View File

@@ -16,6 +16,7 @@ a:hover {
:root {
--ifm-color-primary: #0fc6c2;
--ifm-breadcrumb-color-active: #0fc6c2;
--ifm-menu-color: #000;
--ifm-menu-color-active: #0fc6c2;
--ifm-link-hover-color: #0fc6c2;
--ifm-footer-link-hover-color: #0fc6c2;
@@ -34,12 +35,12 @@ aside.theme-doc-sidebar-container {
width: 240px !important;
}
.navbar__toggle.clean-btn svg {
/* .navbar__toggle.clean-btn svg {
color: white;
}
} */
@media (max-width: 996px) {
:root {
--ifm-menu-color: white;
--ifm-menu-color: #000;
}
}

9266
documents/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,44 @@
/** @type {import('next-sitemap').IConfig} */
const nextSiteMapConfig = {
siteUrl: 'https://waf-ce.chaitin.cn',
generateRobotsTxt: true,
robotsTxtOptions: {
policies: [{ userAgent: '*', allow: '/', disallow: '' }],
},
sitemap: {
// path: '/sitemap.xml',
routes: {
'/community': {
changefreq: 'always',
},
},
},
autoLastmod: true,
priority: 1,
changefreq: 'daily',
sitemapSize: 5000,
transform: async (config, path) => {
if (!path) {
return null
}
const customFields = config.sitemap.routes[path] || {}
return {
loc: path,
changefreq: customFields.changefreq || config.changefreq,
priority: config.priority,
lastmod: config.autoLastmod ? new Date().toISOString() : undefined,
alternateRefs: config.alternateRefs ?? [],
}
},
additionalPaths: (config) => {
const paths = ['/docs']
const result = []
paths.forEach(async (item) => {
result.push(await config.transform(config, item))
})
return result
},
}
module.exports = nextSiteMapConfig

View File

@@ -6,7 +6,8 @@
"dev": "next dev",
"build": "next build",
"start": "next start -p 3001",
"lint": "next lint"
"lint": "next lint",
"sitemap_build": "next-sitemap"
},
"dependencies": {
"@emotion/react": "11.11.1",
@@ -16,6 +17,7 @@
"@mui/material": "5.14.3",
"countup.js": "2.7.0",
"next": "14.0.1",
"next-sitemap": "^4.2.3",
"react": "^18",
"react-dom": "^18"
},

10
website/public/robots.txt Normal file
View File

@@ -0,0 +1,10 @@
# *
User-agent: *
Allow: /
Disallow:
# Host
Host: https://waf-ce.chaitin.cn
# Sitemaps
Sitemap: https://waf-ce.chaitin.cn/sitemap.xml

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<url><loc>https://waf-ce.chaitin.cn</loc><lastmod>2023-12-12T07:31:45.326Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
<url><loc>https://waf-ce.chaitin.cn/community</loc><lastmod>2023-12-12T07:31:45.326Z</lastmod><changefreq>always</changefreq><priority>1</priority></url>
<url><loc>https://waf-ce.chaitin.cn/version</loc><lastmod>2023-12-12T07:31:45.326Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
<url><loc>https://waf-ce.chaitin.cn/docs</loc><lastmod>2023-12-12T07:31:45.326Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
</urlset>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>https://waf-ce.chaitin.cn/sitemap-0.xml</loc></sitemap>
</sitemapindex>

View File

@@ -1,8 +1,9 @@
import React, { useEffect, useState } from 'react';
import { AppBar, Drawer, Grid, Toolbar, Typography, Button, Box, Container, Link, List, ListItem, ListItemText, Stack } from '@mui/material';
import { AppBar, Drawer, Grid, Toolbar, Typography, Button, Box, Container, Link, List, ListItem, ListItemText, Stack, IconButton } from '@mui/material';
import Image from 'next/image';
import dynamic from 'next/dynamic';
import Icon from "@/components/Icon";
import CloseIcon from '@mui/icons-material/Close';
import usePopupState, { bindPopover, bindHover } from '@/components/Popover/usePopupState'
const navs = [
@@ -56,32 +57,7 @@ export default function NavBar() {
<Grid container justifyContent="space-around">
<Grid item xs={10} md={6} display="flex">
<Box display="flex" alignItems="center">
<Link href="/">
<Grid container flexDirection="row" display="flex" spacing={2} sx={{ marginTop: '0px', minWidth: "192px" }}>
<Box width={{ xs: "40px", md: "24px" }} height={{ xs: "43px", md: "26px" }} position="relative">
<Image
src="/images/safeline.svg"
alt="SafeLine Logo"
layout="responsive"
width={40}
height={43}
/>
</Box>
<Typography
variant="h6"
sx={{
ml: { xs: 2, md: 1 },
mr: { xs: 0, md: 7 },
fontSize: { xs: "24px", md: "16px" },
display: 'flex',
alignItems: 'center',
fontFamily: "AlimamaShuHeiTi-Bold",
}}
>
SafeLine
</Typography>
</Grid>
</Link>
<SafelineTitle />
<Box display={{ xs: 'none', md: 'flex' }} alignItems="center">
{navs.map((nav, index) => (
<Box component="span" key={index} mr={3.5}>
@@ -172,16 +148,24 @@ export default function NavBar() {
</AppBar>
<Drawer
anchor='right'
sx={{ width: 200 }}
sx={{ width: "100%" }}
variant="temporary"
open={open}
PaperProps={{
style: {
width: '260px',
width: '100%',
},
}}
onClose={() => setOpen(false)}
>
<Stack direction="row" justifyContent="space-between" pl={4} pr={0.5} py={1} sx={{ boxShadow: "rgba(0, 0, 0, 0.1) 0px 1px 2px 0px" }}>
<Box>
<SafelineTitle />
</Box>
<IconButton onClick={() => setOpen(false)}>
<CloseIcon />
</IconButton>
</Stack>
<List>
{menus.map((menu) => (
<Link key={menu.label} href={menu.to} target={menu.target}>
@@ -191,7 +175,7 @@ export default function NavBar() {
</Link>
))}
</List>
<Box textAlign="center">
<Box ml={2}>
<Image
src="/images/wechat-230825.png"
alt="wechat"
@@ -203,3 +187,34 @@ export default function NavBar() {
</>
);
}
export const SafelineTitle: React.FC = () => {
return (
<Link href="/">
<Grid container flexDirection="row" display="flex" spacing={2} sx={{ marginTop: '0px', minWidth: "192px" }}>
<Box width={{ xs: "40px", md: "24px" }} height={{ xs: "43px", md: "26px" }} position="relative">
<Image
src="/images/safeline.svg"
alt="SafeLine Logo"
layout="responsive"
width={40}
height={43}
/>
</Box>
<Typography
variant="h6"
sx={{
ml: { xs: 2, md: 1 },
mr: { xs: 0, md: 7 },
fontSize: { xs: "24px", md: "16px" },
display: 'flex',
alignItems: 'center',
fontFamily: "AlimamaShuHeiTi-Bold",
}}
>
SafeLine
</Typography>
</Grid>
</Link>
);
};

View File

@@ -21,7 +21,7 @@ import { getIssues } from "@/api";
export default IssueList;
export type Issue = {
type Issue = {
id: string
labels: { name: string, color: string }[]
thumbs_up: number
@@ -29,63 +29,36 @@ export type Issue = {
url: string
comment_count: number
created_at: number
updated_at: number
author: {
avatar_url: string,
login: string,
}
}
export type Issues = {
in_consideration?: Issue[]
in_progress?: Issue[]
released?: Issue[]
}
interface IssueListProps {
value: Issue[];
value: Issues;
}
const ROADMAP_TABS = [
{ title: '正在考虑', key: 'inConsideration', color: '#FFBF00' },
{ title: '进行中', key: 'inProgress', color: '#0FC6C2' },
{ title: '正在考虑', key: 'in_consideration', color: '#FFBF00' },
{ title: '进行中', key: 'in_progress', color: '#0FC6C2' },
{ title: '最近完成', key: 'released', color: '#245CFF' },
]
const isExistInLabels = (labels: Issue['labels'], label: string) => {
return !!labels?.find((item: { name: string }) => item.name.includes(label))
}
/**
*
* @param issues
* @returns
* 正在考虑 = 带 enhancement且没有 in progress 和 released且 open
* 进行中 = 带 enhancement 和 in progress且 open
* 最近完成 = 带 enhancement 和 released且 open
* 按点赞数量降序排序
*/
const handleSortIssues = (issues: Issue[]) => {
const list = issues.filter((item: Issue) => isExistInLabels(item.labels, 'enhancement')).sort((item1, item2) => item2.thumbs_up - item1.thumbs_up)
const inConsideration: Issue[] = []
const inProgress: Issue[] = []
const released: Issue[] = []
list.forEach((item: Issue) => {
const { labels } = item
if (isExistInLabels(labels, 'in progress')) {
inProgress.push(item)
} else if (isExistInLabels(labels, 'released')) {
released.push(item)
} else {
inConsideration.push(item)
}
})
return {
inConsideration,
inProgress,
released,
}
}
function IssueList({ value }: IssueListProps) {
const [searchText, setSearchText] = useState<string>('');
const [issues, setIssues] = useState<Record<string, Array<Issue>>>(handleSortIssues(value || []))
const [issues, setIssues] = useState<Record<string, Array<Issue>>>(value || {})
const handleSearch = async() => {
const result = await getIssues(searchText)
setIssues(handleSortIssues(result || []))
setIssues(result || {})
}
const handleKeyDown = (event: any) => {
@@ -170,7 +143,7 @@ function IssueList({ value }: IssueListProps) {
{issues[tab.key]?.length || 0}
</Typography>
<List sx={{ py: 0, maxHeight: "790px", overflowY: "auto" }}>
{issues[tab.key].map((issue, index) => (
{issues[tab.key]?.map((issue, index) => (
<ListItem key={issue.id} sx={{ pt: index > 0 ? 2 : 0, pb: 0, px: 0 }}>
<IssueItem issue={issue} />
</ListItem>

View File

@@ -69,7 +69,7 @@ const Abilities = () => {
<Container maxWidth="lg">
<Grid container alignItems="center">
<Grid item xs={12} md={6}>
<Typography variant="h2" mb={4.5} textAlign={{ xs: "center", md: "left" }} fontSize={{ sx: "32px", md: "48px" }}>
<Typography variant="h2" mb={4.5} textAlign={{ xs: "center", md: "left" }} fontSize={{ xs: "32px", md: "48px" }}>
</Typography>
<Grid container spacing={2}>

View File

@@ -158,10 +158,7 @@ const FEATURE_LIST = [
</List>
</Grid>
<Grid item xs={12} md={6} mt={7}>
<Box
position={'relative'}
width={{ xs: "80%", md: "100%" }}
>
<Box position={'relative'}>
<Image
src="/images/feature3-bg.png"
alt=""

View File

@@ -32,7 +32,7 @@ const Version = () => {
<Button
variant="outlined"
sx={{
width: { xs: "384px", md: "146px" },
width: { xs: "100%", sm: "384px", md: "146px" },
height: { xs: "72px", md: "50px" },
mt: 4,
backgroundColor: "common.white",

View File

@@ -3,21 +3,21 @@ import { Box, Grid, Button, Typography, Container, Stack } from "@mui/material";
import Image from 'next/image';
import Head from 'next/head';
import DiscussionList, { Discussion } from '@/components/community/DiscussionList';
import IssueList, { Issue } from '@/components/community/IssueList';
import IssueList, { Issues } from '@/components/community/IssueList';
import { getDiscussions, getIssues } from "@/api";
type CommunityPropsType = {
discussions: Discussion[];
issues: Issue[];
issues: Issues;
};
export async function getServerSideProps() {
let discussions: Discussion[] = []
let issues: Issue[] = []
let issues: Issues = {}
const promises = [
getDiscussions('').then((result) => discussions = result || []),
getIssues('').then((result) => issues = result || []),
getIssues('').then((result) => issues = result || {}),
];
try {
await Promise.allSettled(promises)

View File

@@ -100,20 +100,20 @@ export default function Home({ total, starCount }: { total: number, starCount: n
quality={100}
// unoptimized={true}
/>
<Box pt={{ xs: 21, md: 26.5 }} className="relative">
<Box pt={{ xs: 21, md: 26.5 }} className="relative" display={{ xs: "none", sm: "block" }}>
<Box alignItems="center">
<Stack
direction="row"
sx={{
color: "#86909C",
letterSpacing: { xs: 0, sm: 4, md: 8 },
letterSpacing: { xs: 4, md: 8 },
}}
justifyContent="center"
>
<Typography
variant="h5"
sx={{
mr: { xs: 12, sm: 22, md: 36.5 },
mr: { xs: 22, md: 36.5 },
fontWeight: 400,
fontSize: { xs: "16px", md: "24px" },
}}
@@ -145,22 +145,45 @@ export default function Home({ total, starCount }: { total: number, starCount: n
<Typography
variant="h1"
sx={{
mr: { xs: 9.5, sm: 13.5, md: 15.5 },
fontSize: { xs: "32px", sm: "48px", md: "80px" },
mr: { xs: 13.5, md: 15.5 },
fontSize: { xs: "48px", md: "80px" },
}}
>
</Typography>
<Typography variant="h1" sx={{ fontSize: { xs: "32px", sm: "48px", md: "80px" }, }}>
<Typography variant="h1" sx={{ fontSize: { xs: "48px", md: "80px" }, }}>
</Typography>
</Stack>
</Box>
</Box>
<Box pt={{ xs: 16 }} className="relative" display={{ xs: "block", sm: "none" }}>
<Stack alignItems="center">
<Typography
variant="h1"
sx={{
fontSize: "32px",
}}
>
</Typography>
<Typography
variant="h5"
sx={{
fontWeight: 400,
mt: 2,
fontSize: "16px",
color: "#86909C",
}}
>
Web
</Typography>
</Stack>
</Box>
<Box
sx={{
position: "absolute",
bottom: { xs: 520, sm: 472, md: 351 },
bottom: { xs: 436, sm: 472, md: 351 },
left: "50%",
transform: "translateX(-50%)",
}}
@@ -222,6 +245,7 @@ export default function Home({ total, starCount }: { total: number, starCount: n
xs={12}
sm={6}
mt={{ xs: 2, sm: 0 }}
pl={{ xs: 10, sm: 0 }}
sx={{ display: "flex", justifyContent: "center" }}
>
<Link
@@ -258,7 +282,7 @@ export default function Home({ total, starCount }: { total: number, starCount: n
<Grid
key={article.title}
item
xs={4}
xs={6}
sm={4}
display="flex"
justifyContent={{ xs: 'flex-start', sm: justifyContents[index % 3] }}

View File

@@ -62,6 +62,11 @@
"@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"
"@corex/deepmerge@^4.0.43":
version "4.0.43"
resolved "https://registry.npmmirror.com/@corex/deepmerge/-/deepmerge-4.0.43.tgz#9bd42559ebb41cc5a7fb7cfeea5f231c20977dca"
integrity sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==
"@emotion/babel-plugin@^11.11.0":
version "11.11.0"
resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz"
@@ -107,7 +112,7 @@
resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz"
integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@11.11.1":
"@emotion/react@11.11.1":
version "11.11.1"
resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz"
integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==
@@ -137,7 +142,7 @@
resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz"
integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==
"@emotion/styled@^11.3.0", "@emotion/styled@11.11.0":
"@emotion/styled@11.11.0":
version "11.11.0"
resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz"
integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==
@@ -292,7 +297,7 @@
prop-types "^15.8.1"
react-is "^18.2.0"
"@mui/material@^5.0.0", "@mui/material@5.14.3":
"@mui/material@5.14.3":
version "5.14.3"
resolved "https://registry.npmjs.org/@mui/material/-/material-5.14.3.tgz"
integrity sha512-dlu4SOcCp9Cy+wkcfZ/ns9ZkP40nr/WPgqxX0HmrE0o+dkE1ropY9BbHsLrTlYJCko8yzcC8bLghrD4xqZG1og==
@@ -363,6 +368,11 @@
resolved "https://registry.npmmirror.com/@next/env/-/env-14.0.1.tgz"
integrity sha512-Ms8ZswqY65/YfcjrlcIwMPD7Rg/dVjdLapMcSHG26W6O67EJDF435ShW4H4LXi1xKO1oRc97tLXUpx8jpLe86A==
"@next/env@^13.4.3":
version "13.5.6"
resolved "https://registry.npmmirror.com/@next/env/-/env-13.5.6.tgz#c1148e2e1aa166614f05161ee8f77ded467062bc"
integrity sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==
"@next/eslint-plugin-next@14.0.1":
version "14.0.1"
resolved "https://registry.npmmirror.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.1.tgz"
@@ -370,11 +380,51 @@
dependencies:
glob "7.1.7"
"@next/swc-darwin-arm64@14.0.1":
version "14.0.1"
resolved "https://registry.npmmirror.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.1.tgz#75a5f872c4077ecd536d7496bc24f3d312d5dcd0"
integrity sha512-JyxnGCS4qT67hdOKQ0CkgFTp+PXub5W1wsGvIq98TNbF3YEIN7iDekYhYsZzc8Ov0pWEsghQt+tANdidITCLaw==
"@next/swc-darwin-x64@14.0.1":
version "14.0.1"
resolved "https://registry.npmmirror.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.1.tgz"
integrity sha512-625Z7bb5AyIzswF9hvfZWa+HTwFZw+Jn3lOBNZB87lUS0iuCYDHqk3ujuHCkiyPtSC0xFBtYDLcrZ11mF/ap3w==
"@next/swc-linux-arm64-gnu@14.0.1":
version "14.0.1"
resolved "https://registry.npmmirror.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.1.tgz#184286794e67bed192de7dbb10d7f040c996f965"
integrity sha512-iVpn3KG3DprFXzVHM09kvb//4CNNXBQ9NB/pTm8LO+vnnnaObnzFdS5KM+w1okwa32xH0g8EvZIhoB3fI3mS1g==
"@next/swc-linux-arm64-musl@14.0.1":
version "14.0.1"
resolved "https://registry.npmmirror.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.1.tgz#e8121b860ebc97a8d2a9113e5a42878430e749d5"
integrity sha512-mVsGyMxTLWZXyD5sen6kGOTYVOO67lZjLApIj/JsTEEohDDt1im2nkspzfV5MvhfS7diDw6Rp/xvAQaWZTv1Ww==
"@next/swc-linux-x64-gnu@14.0.1":
version "14.0.1"
resolved "https://registry.npmmirror.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.1.tgz#cdc4276b11a10c892fd1cb7dd31e024064db9c3b"
integrity sha512-wMqf90uDWN001NqCM/auRl3+qVVeKfjJdT9XW+RMIOf+rhUzadmYJu++tp2y+hUbb6GTRhT+VjQzcgg/QTD9NQ==
"@next/swc-linux-x64-musl@14.0.1":
version "14.0.1"
resolved "https://registry.npmmirror.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.1.tgz#4a194a484ceb34fd370e8d1af571493859fb2542"
integrity sha512-ol1X1e24w4j4QwdeNjfX0f+Nza25n+ymY0T2frTyalVczUmzkVD7QGgPTZMHfR1aLrO69hBs0G3QBYaj22J5GQ==
"@next/swc-win32-arm64-msvc@14.0.1":
version "14.0.1"
resolved "https://registry.npmmirror.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.1.tgz#71923debee50f98ef166b28cdb3ad7e7463e6598"
integrity sha512-WEmTEeWs6yRUEnUlahTgvZteh5RJc4sEjCQIodJlZZ5/VJwVP8p2L7l6VhzQhT4h7KvLx/Ed4UViBdne6zpIsw==
"@next/swc-win32-ia32-msvc@14.0.1":
version "14.0.1"
resolved "https://registry.npmmirror.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.1.tgz#b8f46da899c279fd65db76f0951849290c480ef9"
integrity sha512-oFpHphN4ygAgZUKjzga7SoH2VGbEJXZa/KL8bHCAwCjDWle6R1SpiGOdUdA8EJ9YsG1TYWpzY6FTbUA+iAJeww==
"@next/swc-win32-x64-msvc@14.0.1":
version "14.0.1"
resolved "https://registry.npmmirror.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.1.tgz#be3dd8b3729ec51c99ff04b51e2b235756d02b6e"
integrity sha512-FFp3nOJ/5qSpeWT0BZQ+YE1pSMk4IMpkME/1DwKBwhg4mJLB9L+6EXuJi4JEwaJdl5iN+UUlmUD3IsR1kx5fAg==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
@@ -383,7 +433,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@@ -449,7 +499,7 @@
dependencies:
"@types/react" "*"
"@types/react@*", "@types/react@^17.0.0 || ^18.0.0", "@types/react@^18":
"@types/react@*", "@types/react@^18":
version "18.2.34"
resolved "https://registry.npmmirror.com/@types/react/-/react-18.2.34.tgz"
integrity sha512-U6eW/alrRk37FU/MS2RYMjx0Va2JGIVXELTODaTIYgvWGCV4Y4TfTUzG8DdmpDNIT0Xpj/R7GfyHOJJrDttcvg==
@@ -518,7 +568,7 @@ acorn-jsx@^5.3.2:
resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0:
acorn@^8.9.0:
version "8.11.2"
resolved "https://registry.npmmirror.com/acorn/-/acorn-8.11.2.tgz"
integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==
@@ -736,7 +786,7 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
browserslist@^4.21.10, "browserslist@>= 4.21.0":
browserslist@^4.21.10:
version "4.22.1"
resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.22.1.tgz"
integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==
@@ -833,16 +883,16 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
commander@^4.0.0:
version "4.1.1"
resolved "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz"
@@ -1153,7 +1203,7 @@ eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0:
dependencies:
debug "^3.2.7"
eslint-plugin-import@*, eslint-plugin-import@^2.28.1:
eslint-plugin-import@^2.28.1:
version "2.29.0"
resolved "https://registry.npmmirror.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz"
integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==
@@ -1238,7 +1288,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4
resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.23.0 || ^8.0.0", eslint@^8:
eslint@^8:
version "8.52.0"
resolved "https://registry.npmmirror.com/eslint/-/eslint-8.52.0.tgz"
integrity sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==
@@ -1320,6 +1370,17 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-glob@^3.2.12:
version "3.3.2"
resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
glob-parent "^5.1.2"
merge2 "^1.3.0"
micromatch "^4.0.4"
fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1:
version "3.3.1"
resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz"
@@ -1456,7 +1517,7 @@ get-tsconfig@^4.5.0:
dependencies:
resolve-pkg-maps "^1.0.0"
glob-parent@^5.1.2:
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -1470,30 +1531,11 @@ glob-parent@^6.0.2:
dependencies:
is-glob "^4.0.3"
glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
glob-to-regexp@^0.4.1:
version "0.4.1"
resolved "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz"
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
glob@^7.1.3:
version "7.2.3"
resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.1.1"
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@7.1.6:
version "7.1.6"
resolved "https://registry.npmmirror.com/glob/-/glob-7.1.6.tgz"
@@ -1518,6 +1560,18 @@ glob@7.1.7:
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^7.1.3:
version "7.2.3"
resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.1.1"
once "^1.3.0"
path-is-absolute "^1.0.0"
globals@^13.19.0:
version "13.23.0"
resolved "https://registry.npmmirror.com/globals/-/globals-13.23.0.tgz"
@@ -1988,12 +2042,12 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
dependencies:
brace-expansion "^1.1.7"
minimist@^1.2.0, minimist@^1.2.6:
minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8:
version "1.2.8"
resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
ms@^2.1.1, ms@2.1.2:
ms@2.1.2, ms@^2.1.1:
version "2.1.2"
resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
@@ -2017,6 +2071,16 @@ natural-compare@^1.4.0:
resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
next-sitemap@^4.2.3:
version "4.2.3"
resolved "https://registry.npmmirror.com/next-sitemap/-/next-sitemap-4.2.3.tgz#5db3f650351a51e84b9fd6b58c5af2f9257b5058"
integrity sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==
dependencies:
"@corex/deepmerge" "^4.0.43"
"@next/env" "^13.4.3"
fast-glob "^3.2.12"
minimist "^1.2.8"
next@14.0.1:
version "14.0.1"
resolved "https://registry.npmmirror.com/next/-/next-14.0.1.tgz"
@@ -2269,7 +2333,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@^8, postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9, postcss@8.4.31:
postcss@8.4.31, postcss@^8, postcss@^8.4.23:
version "8.4.31"
resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.31.tgz"
integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
@@ -2302,7 +2366,7 @@ queue-microtask@^1.2.2:
resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
"react-dom@^17.0.0 || ^18.0.0", react-dom@^18, react-dom@^18.2.0, react-dom@>=16.6.0:
react-dom@^18:
version "18.2.0"
resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.2.0.tgz"
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
@@ -2330,7 +2394,7 @@ react-transition-group@^4.4.5:
loose-envify "^1.4.0"
prop-types "^15.6.2"
"react@^17.0.0 || ^18.0.0", react@^18, react@^18.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.6.0, react@>=16.8.0:
react@^18:
version "18.2.0"
resolved "https://registry.npmmirror.com/react/-/react-18.2.0.tgz"
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
@@ -2765,7 +2829,7 @@ typed-array-length@^1.0.4:
for-each "^0.3.3"
is-typed-array "^1.1.9"
typescript@^5, typescript@>=3.3.1, typescript@>=4.2.0:
typescript@^5:
version "5.2.2"
resolved "https://registry.npmmirror.com/typescript/-/typescript-5.2.2.tgz"
integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==