diff --git a/docs/.vitepress/theme/styles/overrides.css b/docs/.vitepress/theme/styles/overrides.css index 67bfc5e9..6c2d128c 100644 --- a/docs/.vitepress/theme/styles/overrides.css +++ b/docs/.vitepress/theme/styles/overrides.css @@ -62,7 +62,7 @@ .container .VPFeature.link:hover { border: 1px solid var(--vp-c-brand-light) !important; } -.container .VPFeature > article .details{ +.container .VPFeature > article .details { line-height: 1em !important; } .container .VPFeature > article { diff --git "a/docs/BackEnd/NodeJS/Node\345\255\246\344\271\240\347\254\224\350\256\260.md" "b/docs/BackEnd/NodeJS/Node\345\255\246\344\271\240\347\254\224\350\256\260.md" index ebb21ee5..cada58b4 100644 --- "a/docs/BackEnd/NodeJS/Node\345\255\246\344\271\240\347\254\224\350\256\260.md" +++ "b/docs/BackEnd/NodeJS/Node\345\255\246\344\271\240\347\254\224\350\256\260.md" @@ -255,9 +255,8 @@ console.log(m1.age) // 20 **前端两种服务器:** -​ Web 网站服务器:专门对外提供 Web 网页资源服务器 - -​ API 接口服务器:专门对外提供 API 接口服务器 +Web 网站服务器:专门对外提供 Web 网页资源服务器 +API 接口服务器:专门对外提供 API 接口服务器 ### 1.Express 创建服务器 @@ -315,20 +314,19 @@ app.listen(80, () => { - **局部中间件** ```js - -... -const mw1 = (req,res,next) => { - console.log('中间件mw1被执行了'); - req.age= 18 +// ... +function mw1(req, res, next) { + console.log('中间件mw1被执行了') + req.age = 18 next() } -//在路由加一个参数, -app.get('/mw1',mw1,(req,res)=>{ - console.log('req.age: ', req.age); - console.log('mw1被访问'); +// 在路由加一个参数, +app.get('/mw1', mw1, (req, res) => { + console.log('req.age: ', req.age) + console.log('mw1被访问') res.send('mw1被访问哈哈哈') }) -... +// ... ``` - **多个局部中间件** diff --git "a/docs/BackEnd/Server/Docker\345\255\246\344\271\240\347\254\224\350\256\260.md" "b/docs/BackEnd/Server/Docker\345\255\246\344\271\240\347\254\224\350\256\260.md" index cad1c572..022fc8da 100644 --- "a/docs/BackEnd/Server/Docker\345\255\246\344\271\240\347\254\224\350\256\260.md" +++ "b/docs/BackEnd/Server/Docker\345\255\246\344\271\240\347\254\224\350\256\260.md" @@ -27,7 +27,7 @@ ## 五、CentOS安装Docker -```bash +```zsh sudo yum install -y yum-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin @@ -45,7 +45,7 @@ docker run hello-world #测试 ### 1. Docker -```bash +```zsh systemctl enable docker #开机启动 docker system df #负载查看 @@ -53,7 +53,7 @@ docker system df #负载查看 ### 2. 镜像 -```bash +```zsh docker images #展示本地镜像 -a 所有,-q只显示ID docker search mongo #搜索镜像 docker search redis --limit 5 #展示Stars排名前五条 @@ -67,7 +67,7 @@ docker rmi -f hello-world #强制删除镜像 **生成新镜像** -```bash +```zsh agt-get update apt-get -y install vim docker commit -m="vim is ok" -a="fxj" 容器id myubt:1.1 @@ -75,7 +75,7 @@ docker commit -m="vim is ok" -a="fxj" 容器id myubt:1.1 **本地镜像推送到阿里云** -```bash +```zsh #发布和拉取 docker login --username=yunzhishangfxj registry.cn-hangzhou.aliyuncs.com docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/fanxj/mubt:[镜像版本号] @@ -87,7 +87,7 @@ docker run -it registry.cn-hangzhou.aliyuncs.com/fanxj/mubt:1.1 /bin/bash #记 ### 3. 容器 -```bash +```zsh docker ps #列出正在运行容器 -a -s docker run -it --name="ub01" ubuntu /bin/bash #-p: 外部主机端口:docker容器端口 -P:随机分配主机端口映射到内部容器端口 @@ -109,21 +109,21 @@ docker ps -a -q | xargs docker rm #一次性删除多个再运行的 #### 启动守护式 -```bash +```zsh docker run -it #前台交互启动 docker run -d #后台守护启动 ``` #### 查看容器日志 -```bash +```zsh docker logs 容器id #查看容器日志 docker inspect 容器id #查看容器内部细节 ``` #### 容器备份到主机 -```bash +```zsh docker cp 容器id:容器文件路径 目的主机路径 #备份文件 docker export 容器id > xxx.tar #备份整个容器 cat ub.tar | docker import - 恢复后的镜像名 #从tar包中恢复成镜像 @@ -194,7 +194,7 @@ USER ## 九、Docker网络 -```bash +```zsh docker network ls #查看网络 docker network inspect 网络名 #查看网络源数据 docker network rm 网络名 #删除网络 @@ -210,14 +210,14 @@ docker run -d --network none --name 容器名 镜像名 #只有lo网卡 #### 共用网卡 -```bash +```zsh docker run -d --network container:另一个容器名 --name 容器名 /bin/bash 镜像名 #共用的容器关闭,这个容器网卡也没有啦 ``` #### 自定义网络 -```bash +```zsh #启动两个网桥模式容器 docker run -d -p 8081:8080 --name tomcat81 tomcat docker run -d -p 8082:8080 --name tomcat82 tomcat @@ -225,7 +225,7 @@ docker run -d -p 8082:8080 --name tomcat82 tomcat #两个ip可以相互ping通,痛点:按域名ping不通 ``` -```bash +```zsh docker run -d -p 8081:8080 --network my_network --name tomcat81 tomcat docker run -d -p 8082:8080 --network my_network --name tomcat82 tomcat #ip、域名互ping都能通(维护好主机和ip的关系) @@ -237,7 +237,7 @@ docker run -d -p 8082:8080 --network my_network --name tomcat82 tomcat #### 1. [安装Compose](https://docs.docker.com/compose/install/) -```bash +```zsh curl -SL https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose ``` diff --git "a/docs/BackEnd/Server/Nginx\345\255\246\344\271\240\347\254\224\350\256\260.md" "b/docs/BackEnd/Server/Nginx\345\255\246\344\271\240\347\254\224\350\256\260.md" index 8190d150..61ff7215 100644 --- "a/docs/BackEnd/Server/Nginx\345\255\246\344\271\240\347\254\224\350\256\260.md" +++ "b/docs/BackEnd/Server/Nginx\345\255\246\344\271\240\347\254\224\350\256\260.md" @@ -26,7 +26,7 @@ kill -INT 进程号 | 快速停止 | ## 编写配置 -```bash +```zsh nginx -t #检查配置文件有没有问题 grep -Ei "\{|\}" nginx.conf #检查配置文件括号配对问题 nginx -s reload #重载配置 @@ -40,7 +40,7 @@ nginx -s reload #重载配置 ## CentOS7联网 -```bash +```zsh ip a #查看网卡 cd /etc/sysconfig/network-scripts vi ifcfg-ens160 #把ONBOOT=no ===> 改为yes diff --git "a/docs/Framework/Angular/Angular\345\237\272\347\241\200\346\200\273\347\273\223\344\270\200.md" "b/docs/Framework/Angular/Angular\345\237\272\347\241\200\346\200\273\347\273\223\344\270\200.md" deleted file mode 100644 index 21fbc9a7..00000000 --- "a/docs/Framework/Angular/Angular\345\237\272\347\241\200\346\200\273\347\273\223\344\270\200.md" +++ /dev/null @@ -1,394 +0,0 @@ -# Angular基础总结一 - -## 一、NgModule - -::: warning - -被@NgModule所装饰的类被称为angular module - -::: - -#### @NgModule元数据 - -- **declarations** —— 该模块的依赖项(该模块用到的组件、指令、管道)。 -- **imports** —— 导入其他的ngModule。 -- **providers** —— 提供各种服务。 -- **bootstrap** —— 根组件,Angular 创建它并插入 index.html 宿主页面 - -#### declarations 数组 - -```js -1.模块中使用的组件必须先在declarations 数组中声名 -2.一个组件只能被一个模块声名 -3.在declarations中的组件默认只能在当前模块中使用,在其他模块使用必须exports导出 -``` - -#### imports 数组 - -```js -1.只会出现在@NgModule装饰器中。 -2.模块想要正常工作,除了本身的依赖项(declarations),还可能需要其他模块导出的依赖项。 -3.只要是angular module,都可以导入imports数组中,比如ng内置、第三方、自定义的模块。 -``` - -#### providers 数组 - -```js -该数组为当前模块提供一系列服务 -``` - -#### bootstrap 数组 - -```js -应用是通过引导根模块 AppModule 来启动的,引导过程还会创建 bootstrap 数组中列出的组件,并把它们逐个插入到浏览器的 DOM 中。 -该数组中的每个组件,都作为组件树的根(根组件),后续所有组件都是基于根组件的(如图)。 -虽然也可以在宿主页面中放多个组件,但是大多数应用只有一个组件树,并且只从一个根组件开始引导。 -这个根组件通常叫做 AppComponent,并且位于根模块的 bootstrap 数组中。 -``` - -::: details 结构图 - - - -::: - -## 二、模板基础语法 - -#### 1. 模板表达式 - -> **模版中还可以写些简单的逻辑,比如判断或运算** - -```typescript -import { Component } from "@angular/core"; -@Component({ - selector: "app-root", - template: `

{{ title }}

-

sum : {{ 1 + 1 }}

-

price: {{ price * 0.7 }}

-

与方法结合: {{ price * 0.7 + getVal() }}.

`, //内联模板 - styles: [ - ` - h1 { - color: yellow; - } - `, - ], //内联样式 -}) -export class AppComponent { - title = "my-angular-title"; - price = 30; - getVal(): number { - return 33; - } -} -``` - -::: warning 模板表达式遵循原则: - -- 非常简单 -- 执行迅速 -- 没有可见的副作用(即模版中的逻辑不能改变组件的变量) - -::: - -#### 2. 模板来源 - -```typescript -import { Component } from "@angular/core"; -@Component({ - selector: "app-root", - templateUrl: "./app.component.html", - styleUrls: ["./app.component.scss"], //注意: styleUrls -}) -export class AppComponent {} -``` - -#### 3. 属性绑定 - -```html -madao -zorro - -zorro - - - - -``` - -#### 4. 自定义属性绑定 - -```html -

一行文字

-

测试自定义标题属性

- -``` - -#### 5. 插值表达式属性绑定 - -```html -{{ picInfo }} - - -``` - -#### 6. 单个class样式绑定 - -```typescript -import { Component } from "@angular/core"; -@Component({ - selector: "app-root", - template: ` - - - - - - - `, - styles: [], -}) -export class AppComponent { - theme = "primary"; - isSuccess = true; -} -``` - -#### 7. 绑定多个class - -```typescript -import { Component } from "@angular/core"; -@Component({ - selector: "app-root", - template: ` - - - - - - - - - `, - styles: [], -}) -export class AppComponent { - btnCls = "btn btn-primary"; - btnCls2 = ["btn", "btn-success"]; - btnCls3 = { - btn: true, - "btn-info": true, - }; -} -``` - -#### 8. 绑定单个style - -```typescript -import { Component } from "@angular/core"; -@Component({ - selector: "app-root", - template: ` -

一段文字

-

设置高度

-

设置高度

- `, - styles: [], -}) -export class AppComponent {} -``` - -#### 9. 绑定多个style - -```typescript -import { Component } from '@angular/core'; -@Component({ - selector: 'app-root', - template: ` -

style1

-

style2

-

style3

- - - - - - -

style3

- `, - styles: [] -}) -export class AppComponent { - style1 = 'width: 200px;height: 50px;text-align: center;border: 1px solid;'; - style2 = ['width', '200px', 'height', '50px', 'text-align', 'center', 'border', '1px solid']; // 有问题 - style3 = { - width: '200px', - height: '50px', - 'text-align': 'center', - border: '1px solid' - }; -``` - -::: warning 样式优先级 - -1.某个类或样式绑定越具体,它的优先级就越高 - -2.绑定总是优先于静态属性 - -::: - -#### 10. 绑定事件 - -```typescript -import { Component } from "@angular/core"; -@Component({ - selector: "app-root", - template: ` - - - `, - styles: [], -}) -export class AppComponent { - onClick() { - console.log("onClick"); - } - onClick1(event: MouseEvent) { - console.log("onClick1", event.target); - } -} -``` - -#### 11. 输入与输出属性 - -> 输入属性:用于父组件传值给子组件(父传子)` @Input()` -> -> 输出属性:用于子组件传值给父组件(子传父)`@Output()` - -#### 输入属性`@Input` - -:memo:父组件 - -```typescript -import { Component } from "@angular/core"; -@Component({ - selector: "app-root", - template: ` - - - - `, -}) -export class AppComponent { - currentItem = "Television"; -} -``` - -:memo:子组件 - -```typescript -import { Component, Input } from "@angular/core"; -@Component({ - selector: "app-mycpn", - template: `

Today's item: {{ item }}

`, -}) -export class MycpnComponent { - @Input() item: string; - //@Input('aliasItem') item: string; 提供别名,item变量只可以在本组件使用 - //相当于对父组件传入的aliasItem变量进行重命名 -} -``` - -#### 输出属性`@Output()` - -:memo:父组件 - -```typescript -import { Component } from "@angular/core"; -@Component({ - selector: "app-root", - template: ` `, -}) -export class AppComponent { - items = ["item1", "item2", "item3", "item4"]; - addItem(newItem: string) { - this.items.push(newItem); - } -} -``` - -:memo:子组件 - -```typescript -import { Component, Input } from "@angular/core"; -@Component({ - selector: "app-mycpn", - template: ` - `, -}) -export class MycpnComponent { - @Output() newItemEvent = new EventEmitter(); - // @Output('newItem') newItemEvent = new EventEmitter(); - addNewItem(value: string) { - this.newItemEvent.emit(value); - } -} -``` - -> 还可以元数据中声名输入、输出属性。[(不推荐)](https://angular.cn/guide/styleguide##decorate-input-and-output-properties) - -## 三、组件样式 - -#### 宿主选择器 - -> `:host`选择是是把宿主元素作为目标的唯一方式 - -```md -它选中的是组件模板标签,比如,相当于在父组件的style中使用标签选择器选择 app-child {} -``` - -当宿主标签上有 `active` 类名时生效 - -```css -:host(.active) { - border-width: 3px solid ##ccc; -} - -``` - -#### 祖先选择器 - -> 当某个祖先元素有 CSS 类 light 时,才会把 background-color 样式应用到组件内部的所有 .title 元素中,找到根元素(html标签)为止 - -```css -:host-context(.light) .title { - background-color: ##bfa; -} - -``` - -#### 样式模块化 - -> 在 @Component 的元数据中指定的样式只会对该组件的模板生效 -> -> 组件的样式不会影响到子组件中的模板 -> -> 组件的样式不会影响到投影内容 - -#### 视图封装模式 - -> ShadowDom -- **不进不出**,没有样式能进来,组件样式出不去, 就自己玩 -> -> Emulated --**只进不出**, 默认选项,全局样式能进来,组件样式出不去 -> -> None -- **能进能出**,此时组件的样式是全局生效的,注意与其他组件发生样式冲突,(对父组件样式也能生效) diff --git "a/docs/Framework/Angular/Angular\345\237\272\347\241\200\346\200\273\347\273\223\344\270\211.md" "b/docs/Framework/Angular/Angular\345\237\272\347\241\200\346\200\273\347\273\223\344\270\211.md" deleted file mode 100644 index 8ba2cb8f..00000000 --- "a/docs/Framework/Angular/Angular\345\237\272\347\241\200\346\200\273\347\273\223\344\270\211.md" +++ /dev/null @@ -1,699 +0,0 @@ -## 组件投影 - -:memo:shadow.component.html - -```html -

- shadow works! - - - -

- -``` - -:memo:app.component.html - -```html - - -

头部投影内容

-
标签选择器投影内容
-

自定义属性选择器投影内容

-
- -``` - -:medal_military:结果展示 - - - -## ViewChild - -:memo:parent.component.ts - -```typescript -import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { ChildComponent } from './child/child.component'; - -@Component({ - selector: 'app-parent', - templateUrl: './parent.component.html', - styleUrls: ['./parent.component.css'] -}) - export class ParentComponent implements OnInit,AfterViewInit { - - // @ViewChild('box',{static:true}) private box:ElementRef //获取dom - // @ViewChild(ChildComponent,{static:true}) private instance:ChildComponent //获取子组件方式一 - @ViewChild('childcomponent',{static:true}) private childInstance:ChildComponent //获取子组件实例方式二 - - constructor() { //执行秩序(1) - // console.log('constructor',this.box); - // console.log('constructor',this.instance?.childdata); - // console.log('constructor',this.childInstance?.childdata); - console.log('constructor',this.childInstance); - - } - ngOnInit(): void {//(2) - // console.log('ngOnInit',this.box.nativeElement); - // console.log('ngOnInit',this.instance.childdata); - console.log('ngOnInit',this.childInstance); - // console.log('ngOnInit',this.childInstance.childdata); - - } - ngAfterViewInit(): void { //(3)在变更检测后执行,能保证获取到元素 - // console.log('ngAfterViewInit',this.box.nativeElement); - // console.log('ngAfterViewInit',this.instance.childdata); - console.log('ngAfterViewInit',this.childInstance.childdata); - - } -``` - -## ViewChildren - -:memo:parent.component.html - -```html - -
mybox
-
mybox
-
mybox
- - - - -``` - -:memo:parent.component.ts - -```typescript -import { AfterViewInit, Component, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core'; -import { ChildComponent } from './child/child.component'; - -@Component({ - selector: 'app-parent', - templateUrl: './parent.component.html', - styleUrls: ['./parent.component.css'] -}) -export class ParentComponent implements OnInit,AfterViewInit { - - // ViewChildren批量获取元素和组件 - @ViewChildren(ChildComponent) private childs:QueryList - @ViewChildren('boxs') private childs1:QueryList - constructor() { - } - ngOnInit(): void { - } - ngAfterViewInit(): void { //(3) - console.log(this.childs); - console.log(this.childs1); //输出QueryList数组 - //QueryList中监听子组件变化的回调函数 - this.childs1.changes.subscribe((changes)=>{ - console.log(changes); - - }) - } -} -``` - -## ContentChild - -> 获取投影中的dom元素、指令、组件 - -:memo:content-parent.html - -```html - -
head
-
main
- - - - - -
- -``` - -📝content-child.html - -```html -

content-child works!

- - -``` - -:memo:content-child.ts - -```typescript -import { AfterViewInit, Component, ContentChild, ElementRef, OnInit } from '@angular/core'; -import { ContentBoxComponent } from '../content-box/content-box.component'; - -@Component({ - selector: 'app-content-child', - templateUrl: './content-child.component.html', - styleUrls: ['./content-child.component.css'] -}) -export class ContentChildComponent implements OnInit,AfterViewInit { - @ContentChild('head',{static:true}) private head:ElementRef //获取投影中的dom元素 - @ContentChild(ContentBoxComponent) private contentbox:ElementRef //获取组件 - @ContentChild('cbox',{static:true}) private cbox:ElementRef // 有多个只会获取第一个 - constructor() { } - - ngOnInit(): void { - } - ngAfterViewInit(): void { - console.log(this.head); - console.log(this.contentbox); - console.log(this.cbox); - - } -} -``` - -## ContentChildren - -> **用法类似ViewChildren, 批量获取投影中到组件或指令。** -> -> **默认只批量获取直属组件,获取所有组件需开启:{ descendants: true }** - -:memo:content-parent.html - -```html -

content-parent works!

- - - - - -
- - -
-
- -``` - -:memo:content-child.ts - -```typescript -import { AfterViewInit, Component,ContentChildren,OnInit, QueryList } from '@angular/core'; -import { ContentBoxComponent } from '../content-box/content-box.component'; - -@Component({ - selector: 'app-content-child', - templateUrl: './content-child.component.html', - styleUrls: ['./content-child.component.css'] -}) -export class ContentChildComponent implements OnInit,AfterViewInit { - //ContentChildren没有{static:true}属性 - @ContentChildren(ContentBoxComponent) private cboxs:QueryList - @ContentChildren('cbox',{descendants: true}) private cboxss:QueryList - constructor() { } - - ngOnInit(): void { - } - ngAfterViewInit(): void { - console.log(this.cboxs);//只获取直属投影组件 - console.log(this.cboxss);//获取全部投影组件 - } -} -``` - -## 自定义管道 - -```typescript -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'pipepow' -}) -export class PipepowPipe implements PipeTransform { - - transform(value: number, exponent?: number): number { - //value:底数 exponent:指数 - return Math.pow(value,isNaN(exponent) ? 1: exponent); - } -} -``` - -> 在相应的Module中导入并使用 - -```html -
{{8| pipepow}}
-
{{8| pipepow:3}}
-
{{value | pipepow:2}}
-
Boost factor:
-
Normal power:
-
{{factor | pipepow:power}}
- -``` - -## 非纯管道 - -> 默认的管道都是纯的,Angular 会忽略复合对象中的变化,即管道只会检查原始值或对象引用 - -::: warning - -可如果数组中的元素变化,增删改,由于引用没有变化,不会执行变更检测,所以不会执行管道的逻辑 - -::: - -::: details Pipe2Pipe - -```typescript -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'pipe2', - pure: false //非纯管道开启方式一 -}) -export class Pipe2Pipe implements PipeTransform { - - transform(allheros: any): any { //赛选会飞的英雄 - return allheros.filter((item) => item.canFly); - } - -} -``` - -::: - -::: details AppComponent - -```typescript -import { Component } from '@angular/core'; -interface Hero { - id: string; - name: string; - canFly?: boolean; -} - -const HEROES = [ - { - id: 'hero_0', - name: '盖伦', - canFly: false - }, - { - id: 'hero_1', - name: '赵信', - canFly: false - }, - { - id: 'hero_2', - name: '嘉文', - canFly: false - }, - { - id: 'hero_3', - name: '易大师', - canFly: false - }, - { - id: 'hero_3', - name: '泰达米尔', - canFly: true - } - ]; -@Component({ - selector: 'app-root', - template: ` - - -
- {{hero.name}} -
- `, -}) -export class AppComponent { - heroes: Hero[] = []; - canFly = true; - constructor() { - this.reset(); - } - - ngOnInit(): void { - } - addHero(name: string) { - name = name.trim(); - if (name) { - // 不改变引用没有用 - this.heroes.push({ id: 'flier_' + Date.now(), name, canFly: this.canFly }); - // 开启非纯管道方式二、改变引用,触发变更检测 - // this.heroes = [...this.heroes,{id:'flier'+Date.now(),name,canFly:this.canFly}] - } - } - - reset() { this.heroes = HEROES.slice(); } -} -``` - -::: - -## 生命周期 - -> 生命周期函数:组件创建、组件更新、组件销毁的时候会触发的一系列的方法。 -> -> 当 Angular 使用构造函数新建一个组件或指令后,就会按下面的顺序在特定时刻调用这些 生命周期钩子函数。 - - - -::: details 所有生命周期钩子函数执行顺序 - -```typescript -import { AfterContentChecked, AfterContentInit, AfterViewChecked, AfterViewInit, Component, - DoCheck, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.css'] -}) -export class AppComponent implements OnInit,OnChanges,DoCheck,AfterContentInit, - AfterContentChecked,AfterViewInit,AfterViewChecked,OnDestroy{ - constructor(){} //组件初始化,写简单的逻辑和数据初始化操作,(获取不到最新输入属性值) - ngOnChanges(changes: SimpleChanges): void { - console.log('changes ', changes); - //可最早获取到输入属性最新值,输入属性更新时触发,但组件内部改变输入属性是不会触发的 - } - ngOnInit(): void { - console.log('ngOnInit '); //适合请求数据初始化组件,只调用一次 - } - ngDoCheck(): void { - console.log('ngDoCheck '); - } - - ngAfterContentInit(): void { - //在组件内容初始化之后调用,只调用一次。 - console.log('ngAfterContentInit'); - } - - ngAfterContentChecked(): void { - //组件每次检查内容时调用 - console.log('ngAfterContentChecked '); - } - - ngAfterViewInit(): void { - //组件相应的视图初始化之后调用,只调用一次。 - console.log('ngAfterViewInit '); - } - - ngAfterViewChecked(): void { - //组件每次检查视图时调用 - console.log('ngAfterViewChecked'); - - } - - ngOnDestroy(): void { - //指令销毁前调用,适合理一些残存的状态操作: - //取消订阅可观察对象和 DOM 事件、停止 interval 计时器、 - //反注册该指令在全局或应用服务中注册过的所有回调 - console.log('ngOnDestroy'); - } - -} -``` - -::: - - - -> 当组件、父组件发生变更检测后都会调用这三个钩子: -> -> 模板中的DOM事件触发就会进行变更检测(``) -> -> ngDoCheck -> ngAfterContentChecked -> ngAfterViewChecked - -- **指令与组件共有的钩子** - - ngOnChanges - - ngOnInit - - ngDoCheck - - ngOnDestroy -- **组件特有的钩子** - - ngAfterContentInit - - ngAfterContentChecked - - ngAfterViewInit - - ngAfterViewChecked - -## 变更检测 - -## 默认策略下触发变更检测的时机 - -```typescript -changeDetection:ChangeDetectionStrategy.Default -``` - -- 事件:页面 click、submit、mouse down…… -- XHR:从后端服务器拿到数据 -- 定时器:setTimeout()、setInterval() - -> 只要某个组件触发了以上中的一个,就会从顶级组件从上至下开始进行变更检测,每个组件都会进行变更检测, -> -> 检测组件中的值是否应该改变 - -::: warning 注意 - -已经检测完的组件,不允许在被子组件修改,(子组件不能修改检测完的父组件数据),这就是单向数据流 - -::: - - - -## onPush下触发变更检测时机 - -```typescript -changeDetection:ChangeDetectionStrategy.OnPush -``` - -::: warning - -onPush策略会把组件从组件树中剥离出去,他和他的子组件都不会检测了; - -定时器会触发变更检测,但是依然会跳过onPush策略组件。 - -::: - -::: tip - -- 组件的@Input引用发生变化。 -- 组件的 DOM 事件,包括它子组件的 DOM 事件,比如 click、submit、mouse down。 -- Observable 订阅事件,同时设置 Async pipe。 -- 手动调用:ChangeDetectorRef.detectChanges()、ChangeDetectorRef.markForCheck()、ApplicationRef.tick()方法 - -```js -markForCheck() // 把该视图显式标记为已更改(脏的),以便它下一轮再次进行检查。 -detectChanges() // 检查该视图及其子视图。与 detach 结合使用可以实现局部变更检测。(强行检测) -``` - -::: - - - -## 动态组件 - -> 如果说,之前在模版中调用的组件为静态组件(比如:app-xxx) -> -> 那么不用在模版里声明,而是通过ts动态插入到dom中到组件,可以视为动态组件 - -:memo:alert.component.ts: - -```typescript -import {Component, OnInit, ChangeDetectionStrategy, Output, EventEmitter} from '@angular/core'; -type AlertTheme = 'primary' | 'danger' | 'warning'; - -export interface AlertOption { - content: string; - theme?: AlertTheme; -} - -@Component({ - selector: 'app-alert', - template: ` -
- {{ options.content }} - × -
- `, - styles: [` - .close { - display: block; - width: 20px; - height: 20px; - position: absolute; - right: 10px; - top: 50%; - margin-top: -10px; - cursor: pointer; - } - `], - changeDetection: ChangeDetectionStrategy.OnPush -}) -export class AlertComponent implements OnInit { - options: Required = { - content: '', - theme: 'primary' - } - - @Output() closed = new EventEmitter(); - constructor() { } - - ngOnInit(): void {} - - get wrapCls(): string { - return 'alert alert-' + this.options.theme + ' fixed-top'; - } - - setOptions(options: AlertOption) { - this.options = { ...this.options, ...options }; - } -} -``` - -> 调用 `alert.component` - -```typescript -import {ApplicationRef, Component, ComponentFactoryResolver, ComponentRef, EmbeddedViewRef, Injector, OnInit} from '@angular/core'; -import {AlertComponent} from '../../components/alert/alert.component'; - -@Component({ - selector: 'app-show-data', - templateUrl: './show-data.component.html', - styleUrls: ['./show-data.component.scss'] -}) -export class ShowDataComponent implements OnInit { - private container: AlertComponent; - private componentRef: ComponentRef; - constructor( - private cfr: ComponentFactoryResolver, - private inject: Injector, - private appRef: ApplicationRef - ) {} - - ngOnInit(): void { - - } - - showAlert() { - if (!this.container) { - this.container = this.getContainer(); - } - - // 调用组件的某个方法执行逻辑,比如下面这个传参 - this.container.setOptions({ content: '一段提示', theme: 'warning' }); - } - - private getContainer(): AlertComponent { - // 创建指定类型的组件工厂(生产指定类型的组件) - const factory = this.cfr.resolveComponentFactory(AlertComponent); - - // 根据指定的类型,创建组件的示例 - this.componentRef = factory.create(this.inject); - - // 将组件试图添加到试图树中,以激活变更检测 - this.appRef.attachView(this.componentRef.hostView); - - // 将组件到模版(包括app-alert标签),添加到body最后 - document.body.appendChild((this.componentRef.hostView as EmbeddedViewRef<{}>).rootNodes[0] as HTMLElement); - - // 监听组件销毁事件 - this.componentRef.onDestroy(() => { - console.log('componentRef destory'); - }); - - // 获取组件实例,相当于用@ViewChild获取子组件一样 - const { instance } = this.componentRef; - - // 监听组件到output事件 - instance.closed.subscribe(() => { - this.componentRef.destroy(); - this.container = null; - }); - - return instance; - } -} -``` - -> v9和v10,动态组件都不需要entryComponents了,当然写了也没有问题 -> 从v11开始,entryComponents可能被删除 -> v8及以前,动态组件一定要声明entryComponents - -## NgTemplateOutlet指令 - -> NgTemplateOutlet是一个结构型指令 - -:memo:app.component.html - -```html - - -
一段父组件传入的内容
-
- - - -
一段父组件传入的内容
-
使用outlet中的context:{{context}}
-
使用outlet中的value:{{val}}
-
- -``` - -:memo:tmp-outlet.component.html - -```html -

tmp-outlet works!

- - - - - - - - - - -
一段组价默认的内容
-
- - - -
一段组价默认的内容
-
context:{{context}}
-
value:{{val}}
-
- -``` - -:memo:tmp-outlet.component.ts - -```typescript -import { Component, Input, OnInit } from '@angular/core'; - -@Component({ - selector: 'app-tmp-outlet', - templateUrl: './tmp-outlet.component.html', - styleUrls: ['./tmp-outlet.component.css'] -}) -export class TmpOutletComponent implements OnInit { - - @Input() render - myContext = {$implicit: 'tmp-outlet组件里的context', value: 'tmp-outlet组件里的value'}; - constructor() { } - - ngOnInit(): void { - } - -} -``` diff --git "a/docs/Framework/Angular/Angular\345\237\272\347\241\200\346\200\273\347\273\223\344\272\214.md" "b/docs/Framework/Angular/Angular\345\237\272\347\241\200\346\200\273\347\273\223\344\272\214.md" deleted file mode 100644 index c36650fd..00000000 --- "a/docs/Framework/Angular/Angular\345\237\272\347\241\200\346\200\273\347\273\223\344\272\214.md" +++ /dev/null @@ -1,739 +0,0 @@ -## 双向绑定 - -### 1. 基本双向绑定 - -**方法一:** - -:memo:父组件: - -```typescript -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-root', - template: ` - - -

APP 字体大小: {{fontSizePx}}px

-`, - styleUrls: ['./app.component.css'] -}) -export class AppComponent { - fontSizePx = 16 -} - -``` - -:memo:子组件: - -```typescript -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; - -@Component({ - selector: 'app-sbind', - template: `
- - -

sbind 字体大小: {{size}}px

-
`, - styleUrls: ['./sbind.component.css'] -}) -export class SbindComponent implements OnInit { - - //默认值 - @Input() size=16; - - @Output() change = new EventEmitter(); - - dec() { - this.change.emit(this.size-1) - } - inc() { - this.change.emit(this.size+1) - } - - constructor() { } - ngOnInit(): void { - } -} - -``` - -**方法二:**(联合写法) - -:memo:父组件:`app.component.html` - -```html - -

APP 字体大小: {{fontSizePx}}px

- -``` - -:memo:父组件:`app.component.ts` - -```typescript -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-root', - template: './app.component.html', - styleUrls: ['./app.component.css'] -}) -export class AppComponent { - fontSizePx = 16 -} -``` - -:memo:子组件:`sbind.component.html` - -```html -
- - -

sbind 字体大小: {{size}}px

-
- -``` - -:memo:子组件:`sbind.component.ts` - -```typescript -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; - -@Component({ - selector: 'app-sbind', - templateUrl: './sbind.component.html', - styleUrls: ['./sbind.component.css'] -}) -export class SbindComponent implements OnInit { - - //默认值 - @Input() size=16; - - // 双向绑定语法:output变量名=输入属性名+Change - @Output() sizeChange = new EventEmitter(); - constructor() { } - - dec() {//减 - this.sizeChange.emit(this.size-1) - } - inc() {//加 - this.sizeChange.emit(this.size+1) - } - ngOnInit(): void { - } -} -``` - -### 2. input双向绑定 - -**普通写法:** - -```typescript - -

{{inputVal}}

//默认值 inputVal='' -``` - -**简写形式:** - -::: warning - -**ngMoel 指令来源于FormsModule模块** - -`[(ngMoel)]`可拆解为: - -1. 名为ngModel的输入属性 - -2. 名为ngModelChange的输出属性 - -::: - -```html - -

{{inputVal}}

-//默认值 inputVal='' - - -``` - -### 3. 表单Form中双向绑定 - -::: tip - -表单中使用[(ngModel)],满足下列两个条件之一: - -- 给控件加上name属性 -- 将ngModelOptions.standalone设为true - -::: - -```html -
- - - - -
- -``` - -::: details ngModel拓展 - -```typescript -@ViewChild(NgModel) private ngModel : NgModel; -getVal(){ - console.log(this.ngModel.viewModel)//获取[(ngModel)]所绑定input的值 -} -setVal(){ - this.ngModel.viewToModelUpdate( 'newValue')//赋值(不太好使) -} -``` - -::: - -## 属性型指令 - -> 指令:**用于改变DOM元素的外观或行为的指令**(组件是一种特殊的指令) - -::: details 组件改为属性型指令 - -:memo:AppComponent - -```html -
dasfsada
-``` - -```typescript -import {Component} from '@angular/core'; -@Component({ - selector: '[app-decr]',//属性选择器 - template: ` - `, -}) -export class DecrComponent { - constructor() {} -} -``` - -::: - -## 结构型指令 - -### `*ngIf`指令 - -```html -

一段文字 {{ isShow }}

- -isShow:true显示,反之(取决于绑定的值是否为真) - -``` - -::: warning - -会改变DOM结构,原理:移除和插入DOM节点 - -::: - -::: details \*ngIf 完整写法 - -```html - -

一段文字 {{ isShow }} {{s}}

-
- -``` - -::: - -**ngIfElese** - -```typescript -import {Component} from '@angular/core'; -@Component({ - selector: 'app-if', - template: ` -
condition为真时显示
- - -

condition为假时显示

-
- `, -}) // ##elseBlock:模板的引用 -export class IfComp { - condition = true; -} -``` - -**ngIfThen** - -```typescript -import {Component} from '@angular/core'; -@Component({ - selector: 'app-if', - template: ` -
- condition为true时显示 - condition为false时显示 - `, -})//只会显示一个ng-template,第一个div只是用于承载,并不会显示 -export class IfComp { - condition = true; -} -``` - -::: details TemplateRef拓展 - -```typescript -import {Component, OnInit, ChangeDetectionStrategy, ViewChild, TemplateRef, AfterViewInit} from '@angular/core'; -@Component({ - selector: 'app-if', - template: ` - toggle block -

{{ condition }} === true 时显示

- - -

{{ condition }} === false 时显示

-
- `, -}) -export class IfComponent implements OnInit, AfterViewInit { - elseBlocks: TemplateRef = null; //获取组件的变量elseBlocks - @ViewChild('firstTpl', {static: true}) primaryBlock: TemplateRef = null; - condition = false; - constructor() { - - } - ngOnInit(): void { - console.log('ngOnInit', this.primaryBlock); - this.elseBlocks = this.primaryBlock; - //获取到##firstTpl模板引用赋值给elseBlocks变量 - } -} -//运行效果和ngIfElese案例一样 -``` - -::: - -### `*ngFor`指令 - -```typescript -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-for', - template: ` -
    -
  • {{ item.name }}
  • -
- `, -}) -export class ForComponent { - Persons = [ - { - id: 'p1', - name: '张三' - }, - { - id: 'p2', - name: '李四' - }, - { - id: 'p3', - name: '王五' - }, - -]; -trackByPerson(index,item){ - return item.id //追踪id,id值不变不刷新(提升性能) - } -} -``` - -::: details ngFor局部变量 - -```js - index: number //可迭代对象中当前条目的索引。 - count: number //可迭代对象的长度。 - first: boolean //如果当前条目是可迭代对象中的第一个条目则为 true。 - last: boolean //如果当前条目是可迭代对象中的最后一个条目则为 true。 - even: boolean //如果当前条目在可迭代对象中的索引号为偶数则为 true。 - odd: boolean //如果当前条目在可迭代对象中的索引号为奇数则为 true。 - $implicit: T //迭代目标(绑定到ngForOf)中每个条目的值。 - ngForOf: NgIterable //迭代表达式的值。当表达式不局限于访问某个属性时,这会非常有用,比如在使用 async 管道时(userStreams | async)。 -``` - -::: - -::: details \*ngFor展开写法 - -```html -
    - -
  • -

    index: {{ i }}

    -

    count: {{ len }}

    -

    name: {{ item.name }}

    -

    first: {{ f }} -- last: {{ l }}

    -
    -
  • -
    -
- -``` - -::: - -### `[ngSwitch]`指令 - -::: warning - -`[ngSwitch]` 为属性型指令 - -`*ngSwitchCase`为结构型指令 - -::: - -```typescript -import {Component} from '@angular/core'; -@Component({ - selector: 'app-switch', - template: ` -

- - -

-

- - -

-

- - -

-

- - -

- - selected fruit: {{ fruit }} - -
-

这是 苹果

-

这是 梨

-

这是 葡萄

-

啥都不是

-
- `, -}) -export class SwitchComponent { - fruit = ''; -} -``` - -::: details [ngSwitch]展开写法 - -```typescript -
- -

这是苹果

-
- -

这是梨

-
- -

这是葡萄

-
- -

啥都不是

-
-
-``` - -::: - -## 自定义指令 - -使用: - -```html -

-

-

- - -``` - -### 自定义高亮指令(属性型) - -```typescript -import {Directive, ElementRef, EventEmitter, HostListener, Input, Output} from '@angular/core'; - -@Directive({ - selector: '[appHighlight]' -}) -export class HighlightDirective { - @Input() highlightColor: string; - // @Input('appHighlight') highlightColor: string;起别名 - @Output() colorChange = new EventEmitter(); - //1.获取dom - constructor(private el: ElementRef) { - console.log('appHighlight'); - } - - @HostListener('mouseenter') onMouseEnter() { - this.highlight(this.highlightColor || 'yellow'); - } - //内部事件监听 - @HostListener('mouseleave',['$event']) onMouseLeave() { - this.highlight(''); - console.log(event) //传递事件对象 - } - - private highlight(color: string) { - //2.操作dom (操作dom备用选择) - this.el.nativeElement.style.backgroundColor = color; - this.colorChange.emit(color); - } -} -``` - -::: tip 相对于原生事件监听 addEventListener()  的优点 : - -1. 会自动销毁,不会导致内存泄漏 - -2. 不用必须确保每个DOM API都能用 - -::: - -### 自定义unless指令(结构型) - -::: details 定义 - -```typescript -import {Directive, Input, OnChanges, SimpleChanges, TemplateRef, ViewContainerRef} from '@angular/core'; -export class UnlessContext { - $implicit: T = null; - appUnless: T = null; - attr: T = null; -} -@Directive({ - selector: '[appUnless]' -}) -export class UnlessDirective implements OnChanges { - @Input('appUnless') unless: boolean; - private hasView = false;//是否已显示 - private context = new UnlessContext(); - - constructor(private templateRef: TemplateRef, private viewContainer: ViewContainerRef) { - // console.log(this.templateRef); - // console.log(this.viewContainer); - } - //监听输入属性变化 - ngOnChanges(changes: SimpleChanges): void { - if (changes['unless']) { - this.context.$implicit = this.context.appUnless = this.unless; - this.context.attr = 'aaab'; - if (this.unless) { - if (this.hasView) { - this.viewContainer.clear(); - this.hasView = false; - } - } else { - if (!this.hasView) { - // 这里使用的构造提供的模版(this.templateRef) - // 实战中可以通过一个input属性传入模版 - this.viewContainer.createEmbeddedView(this.templateRef, this.context); - this.hasView = true; - } - } - } - } -} -``` - -::: - -::: details 调用 - -```typescript -import { Component } from '@angular/core'; -@Component({ - selector: 'app-root', - template: ` -
-

unless

- -

测试unless driective -- {{ showUnless }}

-

测试unless driective alias un -- {{ un }}

-

别名: {{ un }} attr: {{ attr }}

-
- `, -}) -export class AppComponent { - show = false; //false: 显示 true: 隐藏 -} -``` - -::: - -## 模板元素 - -### `ng-template` - -```html -是一个 Angular 元素,用来渲染 HTML。 它永远不会直接显示出来。 - 事实上,在渲染视图之前,Angular 会把 - 及其内容替换为一个注释。 - -``` - -::: warning - -没有使用结构型指令,ng-template中的元素是不可见的 - -::: - -### `ng-container` - -```html -Angular 的 - - 是一个分组元素,但它不会污染样式或元素布局,因为 Angular 压根不会把它放进 DOM - 中。 - - 是一个由 Angular 解析器负责识别处理的语法元素。 - 它不是一个指令、组件、类或接口,更像是 JavaScript 中 if 块中的花括号。 - - -``` - -```js -if (someCondition) { - statement1 - statement2 - statement3 -} -``` - -### 模板引用变量 - -> 使用井号(##)声明模板引用变量,可以获取DOM 元素、指令、组件、TemplateRef 或 Web Component。 - -```typescript -import {Component} from '@angular/core'; -@Component({ - selector: 'app-tpl-var', - template: ` - - - - `, -}) //两种写法 -export class TplVarComponent { - constructor() { } - callPhone(value: string) { - console.log('callPhone', value); - } -} -``` - -> 在外部获取组件引用,绑定组件内方法 - -```typescript -import {Component} from '@angular/core'; -@Component({ - selector: 'app-root', - template: ` - - - - size: {{ size }} - - `, -}) -export class AppComponent { - size = 16; - constructor() { } -} -``` - -## 操作符 - -### 管道 `|` - -::: warning - -模板变量可以通过一条或多条管道格式化数据, - -默认的管道都是纯的,Angular 会忽略复合对象中的变化,即管道只会检查原始值或对象引用, - -如果数组中的元素变化,增删改,引用没有变化,而不会执行管道的逻辑。 - -::: - -| 管道名称 | 作用 | -| :----------------------------------------------------------: | :---------------------------------: | -| [DatePipe](https://angular.cn/api/common/DatePipe) | 格式化日期 | -| [DecimalPipe](https://angular.cn/api/common/DecimalPipe) | 数字转字符串,并可以指定格式 | -| [KeyValuePipe](https://angular.cn/api/common/KeyValuePipe) | 使ngFor可以循环Object或Map对象 | -| [JsonPipe](https://angular.cn/api/common/JsonPipe) | 将值转成json格式 | -| [TitleCasePipe](https://angular.cn/api/common/TitleCasePipe) | 把首字母大写,其它小写 | -| [SlicePipe](https://angular.cn/api/common/SlicePipe) | 截取Array或String | -| [PercentPipe](https://angular.cn/api/common/PercentPipe) | 数字转百分比 | -| [LowerCasePipe](https://angular.cn/api/common/LowerCasePipe) | 转化为小写 | -| [UpperCasePipe](https://angular.cn/api/common/UpperCasePipe) | 转化为大写 | -| [AsyncPipe](https://angular.cn/api/common/AsyncPipe) | 自动订阅模板中的Observable或Promise | - -### 安全链`?` - -> 用于可能为空的引用需要使用时,对null、undefined进行保护,保证数据请求前能正常渲染模板 - -```html -

{{person?.name}}

-``` - -### 非空断言`!` - -::: danger - -在ts中,开启--strictNullChecks后,将一个可能是undefined或null的变量赋给一个有确切类型的变量时,会报错。在特定情况下,我们断定变量一定不是undefined或null,就可以使用非空断言操作符。 - -::: - -> **使用非空断言的两个步骤:** -> -> tsconfig.json中设置`"strictNullChecks": true` -> -> tslint.json中设置` "no-non-null-assertion": false` - -### 类型转换函数`$any()` - -> 绑定的表达式不能或很难指定类型时使用 - -假设无法确定item的类型,也就不能确定item是否有bestByDate,这时就会报错。 - -可以用$any()把item视为any类型,避免其报错(也可以用这个函数绑定组件中不存在的变量) - -```typescript -

{{$any(item).bestByDate}}

-``` diff --git "a/docs/Framework/React/React\345\237\272\347\241\200\346\200\273\347\273\223\344\270\200.md" "b/docs/Framework/React/React\345\237\272\347\241\200\346\200\273\347\273\223\344\270\200.md" index 76d6a57a..c21b9f0e 100644 --- "a/docs/Framework/React/React\345\237\272\347\241\200\346\200\273\347\273\223\344\270\200.md" +++ "b/docs/Framework/React/React\345\237\272\347\241\200\346\200\273\347\273\223\344\270\200.md" @@ -367,7 +367,6 @@ saveFormData = (dataType, event) => { 1. react/vue中的key有什么作用?(key的内部原理是什么?) 2. 为什么遍历列表时,key最好不要用index? - 3. 虚拟DOM中key的作用: 1. 简单的说: key是虚拟DOM对象的标识, 在更新显示时key起着极其重要的作用。 diff --git "a/docs/FrontEnd/Git/Git\345\270\270\347\224\250\346\223\215\344\275\234.md" "b/docs/FrontEnd/Git/Git\345\270\270\347\224\250\346\223\215\344\275\234.md" index 7cf560de..2f17cbfd 100644 --- "a/docs/FrontEnd/Git/Git\345\270\270\347\224\250\346\223\215\344\275\234.md" +++ "b/docs/FrontEnd/Git/Git\345\270\270\347\224\250\346\223\215\344\275\234.md" @@ -42,6 +42,7 @@ git reset --hard HEAD^1 #回退到上一个版本:最新一次提交的所有 ``` ## 忽略文件并删除已经提交到远程仓库的文件 + > `.gitignore` 只会影响未提交到远程仓库的文件,已经提交到远程仓库的文件不会受影响 ```zsh diff --git "a/docs/FrontEnd/Git/Terminal\347\273\210\347\253\257\347\276\216\345\214\226.md" "b/docs/FrontEnd/Git/Terminal\347\273\210\347\253\257\347\276\216\345\214\226.md" index c2290bb4..8ba7e8f9 100644 --- "a/docs/FrontEnd/Git/Terminal\347\273\210\347\253\257\347\276\216\345\214\226.md" +++ "b/docs/FrontEnd/Git/Terminal\347\273\210\347\253\257\347\276\216\345\214\226.md" @@ -2,7 +2,7 @@ > 可以先去Microsofe Store 安装winget,会比较方便 -```bash +```zsh winget install JanDeDobbeleer.OhMyPosh ``` @@ -12,7 +12,7 @@ winget install JanDeDobbeleer.OhMyPosh ## 预览所有主题命令 -```bash +```zsh Get-PoshThemes ``` @@ -20,7 +20,7 @@ Get-PoshThemes ## 初始化并应用主题 -```bash +```zsh oh-my-posh --init --shell pwsh --config "自己的安装目录\oh-my-posh\themes\schema.json" | Invoke-Expression #schema.json ---- 选择themes目录下的一款主题文件 ``` @@ -43,7 +43,7 @@ PS:刚开始以为没有我常用的`JetBrain Mono`字体,就没在意这种 - 获取到PowerShell配置文件绝对路径 -```bash +```zsh $PROFILE ``` @@ -51,7 +51,7 @@ $PROFILE - 找到这个文件位置,打开并添加需要Power Shell启动时执行的脚本,保存文件重新打开Terminal看效果 -```bash +```zsh oh-my-posh --init --shell pwsh --config "自己的安装目录\oh-my-posh\themes\schema.json" | Invoke-Expression ``` @@ -59,7 +59,7 @@ oh-my-posh --init --shell pwsh --config "自己的安装目录\oh-my-posh\themes > 如果安装了VS Code,如下命令可以直接打开Power Shell配置文件 -```bash +```zsh code $PROFILE ``` @@ -73,7 +73,7 @@ code $PROFILE 没有配置打开VS Code终端报错: -```bash +```zsh The term 'oh-my-posh' is not recognized as a name of a cmdlet, function, script file, or executable program. Check the spelling of the name, or if a path was included, verify | that the path is correct and try again. ``` diff --git "a/docs/FrontEnd/Git/\351\205\215\347\275\256 Ubuntu \346\234\215\345\212\241\345\231\250\345\205\215\345\257\206\347\231\273\345\275\225.md" "b/docs/FrontEnd/Git/\351\205\215\347\275\256 Ubuntu \346\234\215\345\212\241\345\231\250\345\205\215\345\257\206\347\231\273\345\275\225.md" index ac70ea4b..dc1d060a 100644 --- "a/docs/FrontEnd/Git/\351\205\215\347\275\256 Ubuntu \346\234\215\345\212\241\345\231\250\345\205\215\345\257\206\347\231\273\345\275\225.md" +++ "b/docs/FrontEnd/Git/\351\205\215\347\275\256 Ubuntu \346\234\215\345\212\241\345\231\250\345\205\215\345\257\206\347\231\273\345\275\225.md" @@ -1,6 +1,6 @@ ## 1.生成公钥和私钥 -```bash +```zsh cd ~/.ssh # 进入.ssh目录 ssh-keygen # 第一步输入生成的公、私钥文件名,例如:aws-root @@ -9,14 +9,14 @@ ssh-keygen ## 2.将公钥拷贝到服务器 -```bash +```zsh ssh-copy-id -i 公钥 服务器ip # ssh-copy-id -i aws-root.pub 192.227.112.172 ``` ## 3.查看服务器是否配置成功 -```bash +```zsh ssh root@192.227.112.172 cd ~/.ssh cat authorized_keys # 查看是否有上传的公钥 @@ -24,7 +24,7 @@ cat authorized_keys # 查看是否有上传的公钥 ## 4.配置 ssh config文件 -```bash +```zsh vim /etc/ssh/sshd_config PermitRootLogin yes # no改为yes # 允许root用户登录:解决root用户登录报错 Permission denied 问题 PubkeyAuthentication yes # no改为yes @@ -36,7 +36,7 @@ systemctl restart sshd.service ## 5.测试连接、配置本地ssh config文件,使用 VSCODE插件 ([Remote - SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)) 连接 -```bash +```zsh # 测试连接 ssh -i ~/.ssh/aws-root root@192.227.112.172 diff --git "a/docs/FrontEnd/Git/\351\205\215\347\275\256\345\244\232\344\270\252\345\271\263\345\217\260SSH.md" "b/docs/FrontEnd/Git/\351\205\215\347\275\256\345\244\232\344\270\252\345\271\263\345\217\260SSH.md" index 8a4fadc4..47f72c4a 100644 --- "a/docs/FrontEnd/Git/\351\205\215\347\275\256\345\244\232\344\270\252\345\271\263\345\217\260SSH.md" +++ "b/docs/FrontEnd/Git/\351\205\215\347\275\256\345\244\232\344\270\252\345\271\263\345\217\260SSH.md" @@ -1,6 +1,6 @@ ## 1.生成公钥和私钥 -```bash +```zsh ssh-keygen -t rsa -C '88888@qq.com' #换成自己邮箱,可以随便填,相当于一个标识 #密码不用填 直接回车 ``` @@ -22,7 +22,7 @@ ssh-keygen -t rsa -C '88888@qq.com' #换成自己邮箱,可以随便填,相当 > 定义一系列 SSH 连接的配置信息,当你使用 SSH 连接到这些平台时,SSH 客户端会根据这个配置文件选择正确的私钥进行身份验证。 -```bash +```zsh Host github.com #Github主机地址 HostName github.com #Github主机名 PreferredAuthentications publickey @@ -51,7 +51,7 @@ IdentityFile ~/.ssh/gitlab #私钥地址 `Hi CoderFXJ! You've successfully authenticated, but GitHub does not provide shell access.` - ```bash + ```zsh ssh -T git@gitee.com ssh -T git@github.com diff --git "a/docs/FrontEnd/JavaScript/\345\237\272\347\241\200\345\244\215\344\271\240\344\272\214.md" "b/docs/FrontEnd/JavaScript/\345\237\272\347\241\200\345\244\215\344\271\240\344\272\214.md" index 4ef12fec..60663bdb 100644 --- "a/docs/FrontEnd/JavaScript/\345\237\272\347\241\200\345\244\215\344\271\240\344\272\214.md" +++ "b/docs/FrontEnd/JavaScript/\345\237\272\347\241\200\345\244\215\344\271\240\344\272\214.md" @@ -51,9 +51,9 @@ fn.apply() ::: ```js -fn2.call(obj, "hello", true)//会立即执行 -fn2.apply(obj, ["hello", true])//会立即执行 -let newfn = fn.bind(obj, 10, 20, 30)//不会立即执行, 返回一个新函数 newfn() +fn2.call(obj, 'hello', true)// 会立即执行 +fn2.apply(obj, ['hello', true])// 会立即执行 +const newfn = fn.bind(obj, 10, 20, 30)// 不会立即执行, 返回一个新函数 newfn() ``` 箭头函数没有自身的this,它的this由定义时外层作用域决定, @@ -177,15 +177,15 @@ const map2 = new Map([ ```js // [0,1) - Math.random() -//生成 0-max之间的随机整数: +Math.random() +// 生成 0-max之间的随机整数: Math.round(Math.random() * max) Math.floor(Math.random() * (max + 1)) -//生成 x-y 之间的随机数 -Math.round(Math.random() * (y-x) + x) +// 生成 x-y 之间的随机数 +Math.round(Math.random() * (y - x) + x) -// (min,max) +// (min,max) // Math.round(Math.random()*(max-min-2)+min+1) // [min,max] @@ -199,17 +199,22 @@ Math.round(Math.random() * (y-x) + x) ``` ### 打印 0-max 以内的质数 + ```js function isPrime(num) { - if (num <= 1) return false; // 质数必须大于1 - if (num <= 3) return true; // 2和3是质数 - if (num % 2 === 0 || num % 3 === 0) return false; // 排除能被2和3整除的数 + if (num <= 1) + return false // 质数必须大于1 + if (num <= 3) + return true // 2和3是质数 + if (num % 2 === 0 || num % 3 === 0) + return false // 排除能被2和3整除的数 // 只检查到sqrt(num),因为如果一个数不是质数,它必有一个因子小于或等于它的平方根 for (let i = 5; i * i <= num; i += 6) { - if (num % i === 0 || num % (i + 2) === 0) return false; + if (num % i === 0 || num % (i + 2) === 0) + return false } - return true; + return true } function printPrimes(max) { @@ -223,8 +228,8 @@ function printPrimes(max) { } // 假设max是一个正整数 -let max = 100; // 你可以将100替换为任何你想要检查的上限 -printPrimes(max); +const max = 100 // 你可以将100替换为任何你想要检查的上限 +printPrimes(max) ``` ### 时间格式化 @@ -510,10 +515,11 @@ function MyClass() { 3. **自定义对象**: 由开发人员自己创建的对象(Vue, React) ### 提取URL参数 + ```js const url = 'https://www.baidu.com?a=1&b=2#hash' -function getURLParams(url){ - let params = url.split('?')[1].split('#')[0] +function getURLParams(url) { + const params = url.split('?')[1].split('#')[0] const usp = new URLSearchParams(params) return Object.fromEntries(usp.entries()) } diff --git "a/docs/FrontEnd/JavaScript/\346\225\260\346\215\256\345\216\273\351\207\215.md" "b/docs/FrontEnd/JavaScript/\346\225\260\346\215\256\345\216\273\351\207\215.md" index 0a2e750b..090532fd 100644 --- "a/docs/FrontEnd/JavaScript/\346\225\260\346\215\256\345\216\273\351\207\215.md" +++ "b/docs/FrontEnd/JavaScript/\346\225\260\346\215\256\345\216\273\351\207\215.md" @@ -73,7 +73,7 @@ uniqueArr(arr) // ['a', 'b', 1, '/abc/', 1678519417983] 3. 处理数组类型,对比项的数量,再递归对比每个项是否相等; 4. 处理朴素对象,对比键的数量,相等则再递归对比值是否相等。 -```javascript +```js function isEqual(obj1, obj2) { const equalType = (val1, val2) => Object.prototype.toString.call(val1) !== Object.prototype.toString.call(val2) // 判断类型是否一致 diff --git "a/docs/FrontEnd/JavaScript/\346\225\260\347\273\204\346\261\202\351\233\206\345\220\210.md" "b/docs/FrontEnd/JavaScript/\346\225\260\347\273\204\346\261\202\351\233\206\345\220\210.md" index f456fc40..789ce4d1 100644 --- "a/docs/FrontEnd/JavaScript/\346\225\260\347\273\204\346\261\202\351\233\206\345\220\210.md" +++ "b/docs/FrontEnd/JavaScript/\346\225\260\347\273\204\346\261\202\351\233\206\345\220\210.md" @@ -12,20 +12,20 @@ const b = [4, 3, 2] ### 一、并集(A∪B) ```js -//方法一: +// 方法一: ; // 虽然 NaN 和 NaN 不相等,但是在 Set 集合里面只会存在一个 // undefined 和 Infinity 在 Set 集合里面也只会存在一个 -let a = [1, 2, 3, NaN]; -let b = [2, 4, 5, NaN]; -const union = (arr1,arr2) => [...new Set([...arr1, ...arr2])]// [1, 2, 3, NaN, 4, 5] +const a = [1, 2, 3, Number.NaN] +const b = [2, 4, 5, Number.NaN] +const union = (arr1, arr2) => [...new Set([...arr1, ...arr2])]// [1, 2, 3, NaN, 4, 5] -//方法二: -const union = (arr1,arr2) => Array.from(new Set(arr1.concat(arr2))) +// 方法二: +const union1 = (arr1, arr2) => Array.from(new Set(arr1.concat(arr2))) -//先b筛选a中没有的,再连接数组 -const union = (arr1,arr2) => arr1.concat(arr2.filter(val => !arr1.includes(val))) -const union = (arr1,arr2) => arr1.concat(arr2.filter(val=> arr2.indexOf(val) === -1)); +// 先b筛选a中没有的,再连接数组 +const union2 = (arr1, arr2) => arr1.concat(arr2.filter(val => !arr1.includes(val))) +const union3 = (arr1, arr2) => arr1.concat(arr2.filter(val => !arr2.includes(val))) ``` ### 二、交集(*A*∩B) @@ -82,47 +82,47 @@ const b = [ ```js // 用额外对象记录当前项 id 相同的是否收集,此 id 未收集,则进行收集 -//写法一: -const union = (arr1,arr2) =>{ - let obj = {}; - let arr = arr1.concat(arr2); - return arr.reduce( (pre,cur) => { - if(!obj[cur.id]){ - pre.push(cur) - obj[cur.id] = true - } - return pre - },[]) +// 写法一: +function union(arr1, arr2) { + const obj = {} + const arr = arr1.concat(arr2) + return arr.reduce((pre, cur) => { + if (!obj[cur.id]) { + pre.push(cur) + obj[cur.id] = true + } + return pre + }, []) } -//写法二: -const union = (arr1,arr2)=>{ - let arr = arr1.concat(arr2) - let res = [] - for(let i = 0; i < arr.length; i++){ - if(res.findIndex(item => item.id === arr[i].id)===-1){ +// 写法二: +function union2(arr1, arr2) { + const arr = arr1.concat(arr2) + const res = [] + for (let i = 0; i < arr.length; i++) { + if (res.findIndex(item => item.id === arr[i].id) === -1) { res.push(c[i]) } } return res } - //简化 - //判断目标在数组中相同的 id 是否存在 -const isExist = (arr,target,attr) => arr.findIndex(item => item[attr] == target[attr]) != -1 -//合并数组并遍历,判断新数组不存在当前项,则收集 -const union = (arr1,arr2) => arr1.concat(arr2).reduce((pre,cur) => isExist(pre,cur,'id') ? pre : [...pre,cur],[]) +// 简化 +// 判断目标在数组中相同的 id 是否存在 +const isExist = (arr, target, attr) => arr.findIndex(item => item[attr] == target[attr]) != -1 +// 合并数组并遍历,判断新数组不存在当前项,则收集 +const union3 = (arr1, arr2) => arr1.concat(arr2).reduce((pre, cur) => isExist(pre, cur, 'id') ? pre : [...pre, cur], []) ``` ### 二、交集(*A*∩B) ```js -//方法一: -const intersection = (arr1,arr2) => { - const aids = a.map(item => item.id) - return arr2.filter(item => aids.includes(item.id)) +// 方法一: +function intersection(arr1, arr2) { + const aids = a.map(item => item.id) + return arr2.filter(item => aids.includes(item.id)) } -//方法二: -const intersection = (arr1,arr2) => arr1.reduce((pre,cur) => arr2.findIndex(item => item.id == cur.id) != -1 ? [...pre,cur] : pre,[]) +// 方法二: +const intersection1 = (arr1, arr2) => arr1.reduce((pre, cur) => arr2.findIndex(item => item.id == cur.id) != -1 ? [...pre, cur] : pre, []) ``` ### 三、差集(A-B) diff --git "a/docs/FrontEnd/JavaScript/\346\226\207\344\273\266\347\263\273\347\273\237.md" "b/docs/FrontEnd/JavaScript/\346\226\207\344\273\266\347\263\273\347\273\237.md" index f87a4d63..67e44e4e 100644 --- "a/docs/FrontEnd/JavaScript/\346\226\207\344\273\266\347\263\273\347\273\237.md" +++ "b/docs/FrontEnd/JavaScript/\346\226\207\344\273\266\347\263\273\347\273\237.md" @@ -57,20 +57,20 @@ console.log('[ dataView.getUint8(0) ]-20', dataView.getUint8(0)) ## FilePicker ```js -const openFilePicker = async (e: any) => { - const option = { - title: 'Open File', - accept: { +async function openFilePicker(e) { + const option = { + title: 'Open File', + accept: { 'image/*': ['.png', '.jpg', '.jpeg'], - }, - } - const [fileHandle] = await (window as any).showOpenFilePicker(option) - const file = await fileHandle.getFile() - const fileReader = new FileReader() - fileReader.readAsArrayBuffer(file) - fileReader.onload = (e) => { - console.log('[ e ]-11', e.target?.result) - } + }, + } + const [fileHandle] = await (window).showOpenFilePicker(option) + const file = await fileHandle.getFile() + const fileReader = new FileReader() + fileReader.readAsArrayBuffer(file) + fileReader.onload = (e) => { + console.log('[ e ]-11', e.target?.result) + } } ``` diff --git "a/docs/FrontEnd/JavaScript/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md" "b/docs/FrontEnd/JavaScript/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md" index 6f43aef3..90d9f32e 100644 --- "a/docs/FrontEnd/JavaScript/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md" +++ "b/docs/FrontEnd/JavaScript/\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md" @@ -12,14 +12,14 @@ ## 1. 或者 `|` -```javascript +```js const tel = '020-99999999' console.log(/(010|020)-\d{8}/.test(tel))// true ``` ## 2. 原子表`[]`、原子组`()` -```javascript +```js //原子表 let reg = /[123456]/ //出现在其中就匹配成功 console.log(reg.test("2")) //true @@ -37,7 +37,7 @@ console.log(reg.test("hdjfaks35fjj")) //false ## 3. 边界符`^`、`$` -```javascript +```js let tel = "12020-99999999" console.log(/^(010|020)\-\d{8}/.test(tel));//false 以010开头 @@ -51,14 +51,14 @@ console.log(/^(010|020)\-\d{8}$/.test(tel));//false 以8位数结尾 ## 5. 匹配所有字符 -```javascript +```js /[\s\S]/ /[\d\D]/ ``` ## 6. 模式修正符号`i`、`g` -```javascript +```js const hd = 'djfkdjakDJFKJD' hd.match(/[a-z]/gi) // i 不区分大小写 @@ -75,7 +75,7 @@ hdstr.match(/\p{L}/gu) // 匹配所有字母 ## 7. 原子组中的原子表`([-\/])` -```javascript +```js let dateStr = '2022-08-30' 或 '2022/08/30'//true let reg = /^\d{4}([-\/])\d{2}\1\d{2}/ console.log(reg.test('2022-08/30') //false @@ -113,7 +113,7 @@ let mailReg = /^\w[\w-]+@[\w]([\w-]+.)+(com|cn|cc|net|org)/ ## 8.贪婪匹配`+`、`*`、`?` -```javascript +```js + //一个或多个 * //0个或多个 ? //0个或1个 @@ -137,7 +137,7 @@ let newhtml= html.replace(regbaidu1,(v,p1)=> `

${p1}

`) ### 批量验证密码 -```javascript +```js let psdRegs = [/^[0-9a-z]{6,10}$/i,/[A-Z]/,/[0-9]/] let result = psdRegs.every(reg => reg.test('fdkafad')) //false let result = psdRegs.every(reg => reg.test('1f12aA')) //true @@ -145,14 +145,14 @@ let result = psdRegs.every(reg => reg.test('1f12aA')) //true ## 9. matchAll -```javascript +```js const hstr = `

www.baidu.com

www.map.baidu.com

百度一下

` const breg = /<(h[1-6])>([\s\S]+)<\/\1>/gi hstr.match(breg) // 全局匹配拿不到它每个原子组 - ['

www.baidu.com

', '

www.map.baidu.com

', '

百度一下

'] +// ['

www.baidu.com

', '

www.map.baidu.com

', '

百度一下

'] // 解决方法:使用matchAll for (it of hstr.matchAll(breg)) { @@ -171,8 +171,8 @@ for (it of hstr.matchAll(breg)) { ## 10. 断言匹配`` -```javascript -let reg = /百度(?=地图)/g +```js +/* let reg = /百度(?=地图)/g // 只有百度后面有地图两字的才满足要求 let htm =

百度一下,百度地图

p.innerHTML.replace(reg,`$&`) @@ -190,7 +190,7 @@ let reg = /^(?!.*百度.*)[a-z]{4,5}$/i ? { return n < 100 @@ -183,7 +183,7 @@ Vue.component('ele', { render(createElement) { return createElement( 'div', - Array.apply(null, { length: 5 }).map(() => createElement(Child)) + Array.prototype.apply(null, { length: 5 }).map(() => createElement(Child)) ) }, }) diff --git "a/docs/FrontEnd/Shell/\350\207\252\345\212\250\351\203\250\347\275\262\350\204\232\346\234\254.md" "b/docs/FrontEnd/Shell/\350\207\252\345\212\250\351\203\250\347\275\262\350\204\232\346\234\254.md" index 4c65953d..0497361c 100644 --- "a/docs/FrontEnd/Shell/\350\207\252\345\212\250\351\203\250\347\275\262\350\204\232\346\234\254.md" +++ "b/docs/FrontEnd/Shell/\350\207\252\345\212\250\351\203\250\347\275\262\350\204\232\346\234\254.md" @@ -102,5 +102,4 @@ jobs: gitee-repo: ${{ env.REPO_NAME }} # 要部署的分支,默认是 master,若是其他分支,则需要指定(指定的分支必须存在) branch: gh-pages - ``` diff --git "a/docs/FrontEnd/Shell/\350\216\267\345\217\226\351\241\265\351\235\242\346\211\200\346\234\211\345\237\237\345\220\215\345\271\266\345\216\273\351\207\215.md" "b/docs/FrontEnd/Shell/\350\216\267\345\217\226\351\241\265\351\235\242\346\211\200\346\234\211\345\237\237\345\220\215\345\271\266\345\216\273\351\207\215.md" index 5ed66cde..476d68b0 100644 --- "a/docs/FrontEnd/Shell/\350\216\267\345\217\226\351\241\265\351\235\242\346\211\200\346\234\211\345\237\237\345\220\215\345\271\266\345\216\273\351\207\215.md" +++ "b/docs/FrontEnd/Shell/\350\216\267\345\217\226\351\241\265\351\235\242\346\211\200\346\234\211\345\237\237\345\220\215\345\271\266\345\216\273\351\207\215.md" @@ -1,6 +1,7 @@ - ## 获取当前页所有域名并写入剪切板 + > 快捷使用:新建浏览器书签,写入脚本 + ```js javascript:(async function () { const domains = new Set() diff --git "a/docs/FrontEnd/TypeScript/\345\210\235\345\255\246\347\254\224\350\256\260.md" "b/docs/FrontEnd/TypeScript/\345\210\235\345\255\246\347\254\224\350\256\260.md" index f4582288..06c2c5c9 100644 --- "a/docs/FrontEnd/TypeScript/\345\210\235\345\255\246\347\254\224\350\256\260.md" +++ "b/docs/FrontEnd/TypeScript/\345\210\235\345\255\246\347\254\224\350\256\260.md" @@ -17,25 +17,25 @@ undefined // 默认情况下null和undefined是所有类型的子类型。可以 ::: warning **object 类型常见用法** ::: -```typescript +```ts twoslash //1.严格要求 let b :{name: string ,age: number} b = { name:'zhangsan ',age :18} ``` -```typescript +```ts //2.可选 let b :{name: string ,age?: number} b = { name:'zhangsna '} ``` -```typescript +```ts //3.多个可选 let b :{name: string ,[porname:string]:string} b = { name:'zhangsna ',address:'上海',gender:'男'} ``` -```typescript +```ts //4.箭头函数设置函数结构 let d: (c:number,d:number)=>number d = function(n1,n2){ @@ -46,7 +46,7 @@ d = function(n1,n2){ ::: warning **数组** ::: -```typescript +```ts let arr: string[] //字符串数组 arr = ['zhansan','lisi'] let arr1:Array //数值数组 arr1 = [1,2,3,4,5] ``` @@ -54,7 +54,7 @@ let arr1:Array //数值数组 arr1 = [1,2,3,4,5] ::: warning **元组** ::: -```typescript +```ts let h: [string ,number] h = ['hello', 123] ``` @@ -62,7 +62,7 @@ h = ['hello', 123] ::: warning **枚举** ::: -```typescript +```ts enum Color {Red = 1, Green = 2, Blue = 4} let c: Color = Color.Green; //c为2 Color[2] // Green 枚举的值得到它的名字 @@ -70,7 +70,7 @@ Color[2] // Green 枚举的值得到它的名字 #### TS新增类型 -```typescript +```ts 字面量 //限制类型在几个值之间(联合类型)例:let b : 'male'|'amale' 、 enum //枚举类型 tuple //元组 [string, number]; @@ -84,13 +84,13 @@ never //永远不返回结果,没有类型是never的子类型、没有类型 ::: warning `unknown`与`any`区别 ::: -```typescript +```ts let a: any let b: string b = a // OK any类型可以赋值任意类型 ``` -```typescript +```ts let e: unknown e = 'TypeScript' let f: string @@ -108,7 +108,7 @@ f = e ::: warning `|`和`&` :表示或,&:表示且 ::: -```typescript +```ts let g: string | boolean g = 'sdfj' g = true @@ -123,14 +123,14 @@ f = { ### 二、类型声名 -```typescript +```ts let name:string //声名string类型变量 let age = 19 //类型声名可省略,会自动类型推断,age推断为number ``` ### 三、as const 断言 -```typescript +```ts let a = 99 as const //a值只能为99,指定明确的值、类型 let b:string = 'asfghj' let obj = { @@ -138,7 +138,7 @@ let obj = { } as const ``` -```typescript +```ts let x = 1024 let y = '2048' @@ -151,7 +151,7 @@ let arr = [x,y] as const // 指定为元组,arr[1]类型只能为 number ### 一、类 -```typescript +```ts class 类名 { 属性名: 类型; @@ -169,7 +169,7 @@ class 类名 { **栗子:** -```typescript +```ts class Person{ name: string; age: number; @@ -189,7 +189,7 @@ class 类名 { > **注1:在TS中只能有一个构造器方法!** -```typescript +```ts class Person{ name: string; age: number @@ -204,7 +204,7 @@ class Person{ > **注2:子类继承父类时,必须调用父类的构造方法(如果子类中也定义了构造方法)!** -```typescript +```ts class A { protected num: number; constructor(num: number) { @@ -240,7 +240,7 @@ class X extends A { ::: details public -```typescript +```ts class Person{ public name: string; // 写或什么都不写都是public public age: number; @@ -271,7 +271,7 @@ p.name = '猪八戒';// 可以通过对象修改 ::: details protected -```typescript +```ts class Person{ protected name: string; protected age: number; @@ -303,7 +303,7 @@ p.name = '猪八戒';// 不能修改 ::: details private -```typescript +```ts class Person{ private name: string; private age: number; @@ -345,7 +345,7 @@ p.name = '猪八戒';// 不能修改 ::: details 示例 -```typescript +```ts class Person{ private _name: string; @@ -379,7 +379,7 @@ p1.name = '猪八戒'; > > 静态属性(方法)使用static开头 -```typescript +```ts class Tools{ static PI = 3.1415926; @@ -397,7 +397,7 @@ console.log(Tools.sum(123, 456)); > 通过继承可以将其他类中的属性和方法引入到当前类中,通过继承可以在不修改类的情况下完成对类的扩展 -```typescript +```ts class Animal{ name: string; age: number; @@ -424,7 +424,7 @@ dog.bark(); > 发生继承时,如果子类中的方法会替换掉父类中的同名方法,这就称为方法的重写 -```typescript +```ts class Animal{ name: string; age: number; @@ -461,7 +461,7 @@ dog.bark(); > > 使用abstract开头的方法叫做抽象方法,抽象方法没有方法体只能定义在抽象类中,继承抽象类时抽象方法必须要实现; -```typescript +```ts abstract class Animal{ abstract run(): void; bark(){ @@ -479,7 +479,7 @@ class Dog extends Animals{ ### 六、接口 -```typescript +```ts //用于类型检查 interface Person { firstName: string; @@ -602,7 +602,7 @@ function greeter(person: Person) { #### 2. 下载构建工具 -```bash +```zsh npm i -D webpack webpack-cli webpack-dev-server typescript ts-loader clean-webpack-plugin ``` @@ -724,7 +724,7 @@ module.exports = { #### 5 .修改package.json配置 -```typescript {6} +```ts {6} { ... "scripts": { @@ -767,40 +767,39 @@ module.exports = { #### 7.2 修改webpack.config.js配置文件 ```js -... +// ... module: { - rules: [ + rules: [ + { + test: /\.ts$/, + use: [ { - test: /\.ts$/, - use: [ - { - loader: "babel-loader", - options:{ - presets: [ - [ - "@babel/preset-env", - { //支持的目标版本 - "targets":{ - "chrome": "58", - "ie": "11" - }, - //corejs版本 - "corejs":"3", - "useBuiltIns": "usage" - } - ] - ] - } - }, - { - loader: "ts-loader", - + loader: 'babel-loader', + options: { + presets: [ + [ + '@babel/preset-env', + { // 支持的目标版本 + targets: { + chrome: '58', + ie: '11' + }, + // corejs版本 + corejs: '3', + useBuiltIns: 'usage' } - ], - exclude: /node_modules/ + ] + ] + } + }, + { + loader: 'ts-loader', + } - ] + ], + exclude: /node_modules/ + } + ] } -... - +// ... ``` diff --git "a/docs/FrontEnd/TypeScript/\351\205\215\347\275\256\346\226\207\344\273\266\350\257\246\350\247\243.md" "b/docs/FrontEnd/TypeScript/\351\205\215\347\275\256\346\226\207\344\273\266\350\257\246\350\247\243.md" index 3d8c12af..7ca688d0 100644 --- "a/docs/FrontEnd/TypeScript/\351\205\215\347\275\256\346\226\207\344\273\266\350\257\246\350\247\243.md" +++ "b/docs/FrontEnd/TypeScript/\351\205\215\347\275\256\346\226\207\344\273\266\350\257\246\350\247\243.md" @@ -111,23 +111,22 @@ TypeScript是ES6的超集,所以你可以使用ES6来编写ts代码(通常 这是一个非常有用的选项,比如我们经常使用'@/util/help'来代替'./src/util/help',省的每次在不同层级文件import模块时,都纠结于是'./'还是'../'。该选项告诉编译器遇到匹配的值时,去映射的路径下加载模块。 ```ts -{ - "baseUrl": ".", // 注意:baseUrl不可少 - "paths": { - // 映射列表 - "@/*": [ - "src/*" - ], - "moduleA": [ - "src/libs/moduleA" - ] - } -} - // in ts code +import TestModule from 'moduleA/index.js' import Setting from '@/components/Setting.vue' // 模块实际位置: src/components/Setting.vue -import TestModule from 'moduleA/index.js' // 模块实际位置: src/libs/moduleA/index.js +export default { + baseUrl: '.', // 注意:baseUrl不可少 + paths: { + // 映射列表 + '@/*': [ + 'src/*' + ], + 'moduleA': [ + 'src/libs/moduleA' + ] + } +} // 模块实际位置: src/libs/moduleA/index.js ``` ## 9. strictNullChecks @@ -181,18 +180,17 @@ foo && foo.push('1') // okay 未设置include时,编译器默认包含当前目录和子目录下所有的TypeScript文件(.ts, .d.ts 和 .tsx)。如果allowJs被设置成true,JS文件(.js和.jsx)也被包含进来。exclude排除那些不需要编译的文件或文件夹。 -```ts +```json { - "compilerOptions": {}, - "include": [ - "src/**/*" - ], - "exclude": [ - "node_modules", - "**/*.spec.ts" - ] + "compilerOptions": {}, + "include": [ + "src/**/*" + ], + "exclude": [ + "node_modules", + "**/*.spec.ts" + ] } - ``` ## tsconfig.json全解析 diff --git "a/docs/Interview/ALGO/\345\270\270\350\247\201\347\256\227\346\263\225.md" "b/docs/Interview/ALGO/\345\270\270\350\247\201\347\256\227\346\263\225.md" index b79e066a..47e6fa7b 100644 --- "a/docs/Interview/ALGO/\345\270\270\350\247\201\347\256\227\346\263\225.md" +++ "b/docs/Interview/ALGO/\345\270\270\350\247\201\347\256\227\346\263\225.md" @@ -2,7 +2,7 @@ ```js const str1 = '{[]}' // true -const str2 = '{(?:\.\d+)/ false +const str2 = '{(?:\.\d+)' // false const str3 = '{[]}[' // false const str4 = '{[()]}' // true ``` @@ -116,7 +116,6 @@ function flat(arr) { } const array1 = [2, 3, 4, [4, 6, 5, 8]] flat(array1)[(2, 3, 4, 4, 6, 5, 8)] - ``` ```js @@ -445,7 +444,6 @@ function findMedianSortedArrays(nums1, nums2) { } ``` - ## [生成随机十六进制颜色](https://css-tricks.com/snippets/javascript/random-hex-color/) 方案一: @@ -690,7 +688,7 @@ function printLinkedList(head) { - 中序遍历:先访问左子树,然后访问节点,最后访问右子树。 - 后序遍历:先访问左子树,然后访问右子树,最后访问节点。 -```javascript +```js // 定义二叉树节点类 class TreeNode { constructor(val) { @@ -878,7 +876,7 @@ BST.prototype.search = function (value) { ## 字符串搜索算法 -```javascript +```js // KMP算法是一种高效的字符串搜索算法,在对文本串和模式串进行匹配时,通过利用前缀表来避免不必要的比较,从而实现快速匹配。 function kmp(text, pattern) { const n = text.length @@ -919,7 +917,7 @@ function kmp(text, pattern) { 接下来,我们可以使用这个函数来测试一下: -```javascript +```js const text = 'hello world' const pattern = 'world' const index = kmp(text, pattern) @@ -930,7 +928,7 @@ console.log(index) // 输出5 这里还可以尝试一些其他的测试用例,例如: -```javascript +```js const text = 'abababaababacb' const pattern = 'ababacb' const index = kmp(text, pattern) @@ -947,7 +945,7 @@ console.log(index) // 输出7 ```js function numberToChinese(num, upper = false) { - if (!/^-?\d+(\.\d+)?$/.test(num)) + if (!/^-?\d+\.\d+$/.test(num)) return '不是一个合法的数字!' const digitMap = { @@ -1012,7 +1010,7 @@ function numberToChinese(num) { .split('') .reverse() .join('') - .match(/(\d{1,4})/g) + .match(/\d{1,4}/g) .join(',') .split('') .reverse() @@ -1081,7 +1079,6 @@ const n = bigChinese(1000100001) // 拾億零壹拾萬零壹 console.log('[ n ]-66', n) ``` - ## 深度优先和广度优先 ```js @@ -1177,23 +1174,25 @@ JavaScript 中 BFS 的时间复杂度为 O(n),其中 n 是节点数。空间 ```js function bfs(root) { - let nodes = [] - const queue = [root]; + const nodes = [] + const queue = [root] while (queue.length > 0) { - const node = queue.shift(); + const node = queue.shift() nodes.push(node.id) - node.children?.forEach(child => { - queue.push(child); - }); + node.children?.forEach((child) => { + queue.push(child) + }) } return nodes } -//简化后 -function bfs(root){ - let nodes = [] - let node,queue = [root] - while(node = queue.shift()){ +// 简化后 +function bfs1(root) { + const nodes = [] + let node + const queue = [root] + // eslint-disable-next-line no-cond-assign + while (node = queue.shift()) { nodes.push(node.id) node.children && queue.push(...node.children) } @@ -1202,19 +1201,6 @@ function bfs(root){ ``` -```js -function bfs(node) { - const nodes = [] - if (node !== null) { - nodes.push(node) - let i = 0 - while (node = nodes[i++]) - node.children && nodes.push(...node.children) - } - return nodes -} -``` - ### 两者的区别 - 广度优先遍历需要使用队列逐层扫描节点,而深度优先遍历需要使用递归或栈来遍历节点。 diff --git "a/docs/Interview/Brower/\346\265\217\350\247\210\345\231\250\347\275\221\351\241\265\350\257\267\346\261\202\350\277\207\347\250\213.md" "b/docs/Interview/Brower/\346\265\217\350\247\210\345\231\250\347\275\221\351\241\265\350\257\267\346\261\202\350\277\207\347\250\213.md" index ede52201..3b85929f 100644 --- "a/docs/Interview/Brower/\346\265\217\350\247\210\345\231\250\347\275\221\351\241\265\350\257\267\346\261\202\350\277\207\347\250\213.md" +++ "b/docs/Interview/Brower/\346\265\217\350\247\210\345\231\250\347\275\221\351\241\265\350\257\267\346\261\202\350\277\207\347\250\213.md" @@ -158,20 +158,17 @@ reflow 的本质就是重新计算 layout 树。 ### 重绘repaint repaint 的本质就是重新根据分层信息计算了绘制指令。 - 当改动了可见样式后,就需要重新计算,会引发 repaint。 - 由于元素的布局信息也属于可见样式,所以reflow 一定会引起 repaint。 - +需要更新属性,只是影响元素的外观、风格,不影响布局。(不影响布局的属性,如:color、background-color、visibility 等) ![2023-03-06-22-20-02](https://zerdocs.oss-cn-shanghai.aliyuncs.com/febasis/2023-03-06-22-20-02.png){data-zoomable} :::details 为什么 transform 的效率高? 因为 transform 既不会影响布局也不会影响绘制指令,它影响的只是渲染流程的最后一个「draw」 阶段由于 draw 阶段在合成线程中; 所以 transform 的变化几乎不会影响渲染主线程。反之,渲染主线程无论如何忙碌.也不会影响 transform 的变化。 -::: -> 需要更新属性,只是影响元素的外观、风格,不影响布局。改变 `​color​​​,​ ​background-color​​​, ​​visibility` 等属性 +::: [参考链接](https://blog.51cto.com/u_15499114/4971560) diff --git "a/docs/Interview/CSS/\351\235\242\350\257\225\351\242\230\344\270\200.md" "b/docs/Interview/CSS/\351\235\242\350\257\225\351\242\230\344\270\200.md" index f6295eb9..e83d31e1 100644 --- "a/docs/Interview/CSS/\351\235\242\350\257\225\351\242\230\344\270\200.md" +++ "b/docs/Interview/CSS/\351\235\242\350\257\225\351\242\230\344\270\200.md" @@ -177,6 +177,7 @@ **黏性定位**`sticky`:相对于*最近滚动祖先*定位,滚动到元素top小于设定值(top:20px;)则转为固定定位。(relative+fixed) ## `z-index` 不生效 + 1. 父元素没有定位(position: static)时 2. `z-index` 同时设置了 `float`时 @@ -332,8 +333,8 @@ Canvas是一种基于位图的绘图技术,它使用JavaScript在HTML5画布 | `xl` | 1280px | `@media (min-width: 1280px) { ... }` | 小型笔记本 | | `2xl` | 1536px | `@media (min-width: 1536px) { ... }` | 电脑显示器 | - ## CSS 工程化 + 1. 预处理器(Sass/Less/Stylus) 2. 模块化(CSS Modules/CSS in JS) 3. 规范化(BEM/OOCSS/SMACSS) @@ -343,12 +344,14 @@ Canvas是一种基于位图的绘图技术,它使用JavaScript在HTML5画布 7. 代码规范(ESLint/Prettier) ## JS 动画 与 CSS 动画 + JS动画: + 1. 优点:兼容性强,写得好可以兼容IE6,控制能力强,可以实现复杂动画。 2. 缺点:性能没有CSS好。 -CSS动画: - 1. 优点:CSS性能更好,因为CSS动画是通过浏览器渲染引擎来实现的,对CSS3 做了性能优化。 - 2. 缺点: 不能精细化控制,不够灵活,兼容性不好。 + CSS动画: +3. 优点:CSS性能更好,因为CSS动画是通过浏览器渲染引擎来实现的,对CSS3 做了性能优化。 +4. 缺点: 不能精细化控制,不够灵活,兼容性不好。 ## 实现一个元素的宽高比 diff --git "a/docs/Interview/JavaScript/Promise\347\233\270\345\205\263.md" "b/docs/Interview/JavaScript/Promise\347\233\270\345\205\263.md" index 29570a47..d930eb41 100644 --- "a/docs/Interview/JavaScript/Promise\347\233\270\345\205\263.md" +++ "b/docs/Interview/JavaScript/Promise\347\233\270\345\205\263.md" @@ -60,7 +60,7 @@ function createTask(delay) { }) } } -const task = new taskQueue() +const task = new TaskQueue() const times = [100, 2600, 400, 300, 500, 600, 900, 800, 700, 1000] times.forEach((item) => { task.addTask(createTask(item)) @@ -156,7 +156,7 @@ worker.terminate() ```js // 写法 1 -self.addEventListener('message', (e) => { +globalThis.addEventListener('message', (e) => { // ... }) diff --git "a/docs/Interview/JavaScript/\345\216\237\345\236\213\344\270\216\345\216\237\345\236\213\351\223\276.md" "b/docs/Interview/JavaScript/\345\216\237\345\236\213\344\270\216\345\216\237\345\236\213\351\223\276.md" index 020ff492..2a002d24 100644 --- "a/docs/Interview/JavaScript/\345\216\237\345\236\213\344\270\216\345\216\237\345\236\213\351\223\276.md" +++ "b/docs/Interview/JavaScript/\345\216\237\345\236\213\344\270\216\345\216\237\345\236\213\351\223\276.md" @@ -30,9 +30,9 @@ function Star() { } const star1 = new Star() -star1.__proto__ === star1.constructor.prototype +// star1.__proto__ === star1.constructor.prototype Star === Start.prototype.constructor -Object.prototype.__proto__ // null +// Object.prototype.__proto__ // null Object instanceof Function // Object顶级对象是 顶级构造器 Fcuntion 的实例 ``` @@ -44,7 +44,7 @@ Object instanceof Function // Object顶级对象是 顶级构造器 Fcuntion 的 ```js function test() {} -test.__proto__ == Function.prototype // ture +// test.__proto__ == Function.prototype // ture ``` 本身 ---> 构造函数.prototype(本身`.__proto__`) ---> 构造函数原型对象的原型`.prototype.__proto__`...--->Object.prototype ---> null @@ -87,14 +87,14 @@ console.log(o2, o2.name, o2.age) ### 方式三:借用构造函数继承 -``` -function Parent(){ - this.age = 22; +```js +function Parent() { + this.age = 22 } -function Child(){ - this.name = '张三' - Parent.call(this); +function Child() { + this.name = '张三' + Parent.call(this) } -let o3 = new Child(); -console.log( o3,o3.name,o3.age ); +const o3 = new Child() +console.log(o3, o3.name, o3.age) ``` diff --git "a/docs/Interview/JavaScript/\345\237\272\347\241\200\351\235\242\350\257\225\351\242\230.md" "b/docs/Interview/JavaScript/\345\237\272\347\241\200\351\235\242\350\257\225\351\242\230.md" index 90ddfb3e..fe1374ed 100644 --- "a/docs/Interview/JavaScript/\345\237\272\347\241\200\351\235\242\350\257\225\351\242\230.md" +++ "b/docs/Interview/JavaScript/\345\237\272\347\241\200\351\235\242\350\257\225\351\242\230.md" @@ -56,8 +56,10 @@ const isObj = option => option !== null && (typeof option === 'object' || typeof - 最后再把宇符串基于Number方法转换为数字 ```js -parseInt(val,radix) parseFloat(val) -parseInt(null) 和 parseInt(undefined) -> NaN +Number.parseInt(val, radix) +Number.parseFloat(val) +Number.parseInt(null) +Number.parseInt(undefined) // -> NaN /* 规则:val 必须是字符串,不是则自动转为字符串; 然后再 从左往右 找符合 radix(进制)有效数字,一个没找到则返回 NaN, 遇到一个非有效数字字符,则停止查找,并 parseInt(之前符合的字符串) parseInt('12px') -> 12 @@ -102,8 +104,8 @@ const n = a++ // 10(数字) ++a / a++ 一定是数字运算 ```js //题1: -[] == false -> 0 == 0 -> false -![] == false -> false == false -> true +[] == false // -> 0 == 0 -> false +![] == false // -> false == false -> true //题2: var a = ?; @@ -212,30 +214,36 @@ function debounce(func, delay = 500) { ::: details 防抖拓展写法 ```js -function debounce(func,delay = 500,immediate=false){ - //参数判断处理 - if(typeof func !== 'function') throw new TypeError('func is not a funciton') - //debounce(func,true) - if(typeof delay === 'boolean'){ - immediate = delay - delay = undefined +function debounce(func, delay = 500, immediate = false) { + // 参数判断处理 + if (typeof func !== 'function') + throw new TypeError('func is not a funciton') + // debounce(func,true) + if (typeof delay === 'boolean') { + immediate = delay + delay = undefined } - isNaN(delay = +delay) ? 500 : delay //若不是数字则默认 500 - if(typeof immediate !== 'boolean') immediate = false + delay = +delay + Number.isNaN(delay) ? 500 : delay // 若不是数字则默认 500 + if (typeof immediate !== 'boolean') + immediate = false let timer = null - return function(...args){ - //第一次自执行完,timer 已经有值, - let now = !timer && immediate - if(timer) clearTimeout(timer) //清除上一次 - timer = setTimeout(() =>{ - //结束边界触发 - if(!immediate) func.apply(this,args) - //清除最后一个定时器 + return function (...args) { + // 第一次自执行完,timer 已经有值, + const now = !timer && immediate + if (timer) + clearTimeout(timer) // 清除上一次 + timer = setTimeout(() => { + // 结束边界触发 + if (!immediate) + func.apply(this, args) + // 清除最后一个定时器 timer = clearTimeout(timer) - },delay) - //若为立即执行,则第一次,开启边界触发 - if(now) func.apply(this,args) + }, delay) + // 若为立即执行,则第一次,开启边界触发 + if (now) + func.apply(this, args) } } ``` @@ -245,38 +253,40 @@ function debounce(func,delay = 500,immediate=false){ ### 节流 ```js -//实现原理:每次触发事件时,判断当前是否存在等待执行的延时函数 -//方法一:定时器存在则什么都不做 -function throttle(func,delay){ +// 实现原理:每次触发事件时,判断当前是否存在等待执行的延时函数 +// 方法一:定时器存在则什么都不做 +function throttle1(func, delay) { let timer = null - return function(...args){ - if(timer) return - timer = setTimeout(()=>{ - func.apply(this,...args) + return function (...args) { + if (timer) + return + timer = setTimeout(() => { + func.apply(this, ...args) timer = null }, delay) } } -//方法二: -function throttle(func,delay){ - let flag = true //节流阀:开启状态 - return function(...args){ - if(!flag) return - flag = false //已经在处理:关闭 - setTimeout(() =>{ - func.apply(this,args) - flag = true //处理完:重新打开 - },delay) - } +// 方法二: +function throttle2(func, delay) { + let flag = true // 节流阀:开启状态 + return function (...args) { + if (!flag) + return + flag = false // 已经在处理:关闭 + setTimeout(() => { + func.apply(this, args) + flag = true // 处理完:重新打开 + }, delay) } -//实现三:当前时间-上次执行时间 > 设定时间,才执行 -funtion throttle(func,delay){ +} +// 实现三:当前时间-上次执行时间 > 设定时间,才执行 +function throttle3(func, delay) { let start = 0 - return function(...args){ - let now = Data.now() - if(now - start > delay){ - func.apply(this,args) - start = now + return function (...args) { + const now = Data.now() + if (now - start > delay) { + func.apply(this, args) + start = now } } } @@ -284,9 +294,8 @@ funtion throttle(func,delay){ ::: tip 应用 -​ 防抖:输入框搜索、编辑框实时保存,(手机息屏策略,王者荣耀回城操作) - -​ 节流:滚动到底部加载更多、图标跟随鼠标(地铁发车时间,王者荣耀技能冷却) +防抖:输入框搜索、编辑框实时保存,(手机息屏策略,王者荣耀回城操作) +节流:滚动到底部加载更多、图标跟随鼠标(地铁发车时间,王者荣耀技能冷却) ::: @@ -355,42 +364,39 @@ hw.next(123) // a = 123 ### 异步流程同步化 ```js -function* test(){ - let res1 = yield new Promise((resolve) =>{ - setTimeout(function(){ +function* test() { + const res1 = yield new Promise((resolve) => { + setTimeout(() => { resolve('第一秒执行') - },1000) + }, 1000) }) - console.log(res1) //第一秒执行 + console.log(res1) // 第一秒执行 - let res2 = yield new Promise((resolve) =>{ - setTimeout(function(){ + const res2 = yield new Promise((resolve) => { + setTimeout(() => { resolve('第二秒执行') - },1000) + }, 1000) }) } -function generatorRunner(fn){ - let generator = fn() - let step = generator.next() - //定义递归函数 - function loop(stepArg,generator){ - //获取本次 yield 右侧的结果 - let value = stepArg.value - if(value instanceof Promise){ - //如果是 Promise 对象就在 then 函数的回调中获取本次程序结果 - //并且等待回调执行的时候进入下一次递归 - value.then((function(promiseValue){ - if(!stepArg.done){ - loop(generator.next(promiseValue),generator) +function generatorRunner(fn) { + const generator = fn() + const step = generator.next() + // 定义递归函数 + function loop(stepArg, generator) { + // 获取本次 yield 右侧的结果 + const value = stepArg.value + if (value instanceof Promise) { + // 如果是 Promise 对象就在 then 函数的回调中获取本次程序结果 + // 并且等待回调执行的时候进入下一次递归 + value.then((promiseValue) => { + if (!stepArg.done) { + loop(generator.next(promiseValue), generator) } - } - }else{ - //判断程序没有执行完就将本次结果传入下一步进入下一次递归 - if(!stepArg.done) loop(generator.next(stepArg.value),generator) - } + }) + } } - loop(step,generator) + loop(step, generator) } ``` @@ -419,24 +425,24 @@ function generatorRunner(fn){ 浅拷贝 ```js -let newObj = Object.assign({},obj) //只拷贝对象自身的可枚举的属性 -let newObj = [...obj] +const newObj = Object.assign({}, obj) // 只拷贝对象自身的可枚举的属性 +const newObj1 = [...obj] -//数组 +// 数组 Array.prototype.slice() Array.prototype.concat() -let arr = [ +const arr = [ { - name:'zhan', - age:23 + name: 'zhan', + age: 23 }, 123, 456 ] -let newArr1 = arr.slice() -let newArr2 = arr.concat() -//改变内部的引用类型两者都会有影响 +const newArr1 = arr.slice() +const newArr2 = arr.concat() +// 改变内部的引用类型两者都会有影响 ``` ```js @@ -454,7 +460,7 @@ function deepClone(obj) { return new RegExp(obj) const newObj = Array.isArray(obj) ? [] : {} for (const key in obj) { - if (obj.hasOwnProperty(key)) + if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = deepClone(obj[key]) } return newObj diff --git "a/docs/Interview/JavaScript/\345\255\227\347\254\246\344\270\262\345\270\270\347\224\250\346\226\271\346\263\225.md" "b/docs/Interview/JavaScript/\345\255\227\347\254\246\344\270\262\345\270\270\347\224\250\346\226\271\346\263\225.md" index cdf0340c..dafe9401 100644 --- "a/docs/Interview/JavaScript/\345\255\227\347\254\246\344\270\262\345\270\270\347\224\250\346\226\271\346\263\225.md" +++ "b/docs/Interview/JavaScript/\345\255\227\347\254\246\344\270\262\345\270\270\347\224\250\346\226\271\346\263\225.md" @@ -1,6 +1,6 @@ ## 字符串常用方法 -​ **都不会影响原字符串:因为字符串是不可变的!** +**都不会影响原字符串:因为字符串是不可变的!** 1. 增删改:`replace,replaceAll` @@ -9,10 +9,10 @@ 3. 删:`substr,substring,slice,trim,trimStart,trimEnd` 4. 改:`split,toLowerCase,toUpperCase,toLocaleLowerCase,` - ​ `toLocaleUpperCase,` `String.fromCharCode()` + `toLocaleUpperCase,` `String.fromCharCode()` 5. 查:`valueOf,at,charAt,charCodeAt,indexOf,lastIndexOf,` - ​ `search,includes,match,startsWith,endsWith` + `search,includes,match,startsWith,endsWith` ### charCodeAt与fromCharCode @@ -32,19 +32,18 @@ String.fromCharCode(65, 66, 67) // 'ABC' 返回 ASCII 码对应的字符 ::: ```js {3,4} -let y = "www.map.baidu.com"; -console.log(y.slice(4,11)); //map.bai -console.log(y.slice(11,4)); //'' -console.log(y.slice(3,-4)); //.map.baidu -console.log(y.slice(3,0)); //'' -console.log(y.slice(4)); //map.baidu.com - -let y = "www.map.baidu.com"; -console.log(y.substring(4,11)); //map.bai -console.log(y.substring(11,4)); //map.bai -console.log(y.substring(3,-4)); //www -console.log(y.substring(3,0)); //www -console.log(y.substring(4)); //map.baidu.com +const y = 'www.map.baidu.com' +console.log(y.slice(4, 11)) // map.bai +console.log(y.slice(11, 4)) // '' +console.log(y.slice(3, -4)) // .map.baidu +console.log(y.slice(3, 0)) // '' +console.log(y.slice(4)) // map.baidu.com + +console.log(y.substring(4, 11)) // map.bai +console.log(y.substring(11, 4)) // map.bai +console.log(y.substring(3, -4)) // www +console.log(y.substring(3, 0)) // www +console.log(y.substring(4)) // map.baidu.com ``` ### valueOf 与 toString 的异同 diff --git "a/docs/Interview/JavaScript/\347\246\201\346\255\242\344\270\213\350\275\275\345\233\276\347\211\207.md" "b/docs/Interview/JavaScript/\347\246\201\346\255\242\344\270\213\350\275\275\345\233\276\347\211\207.md" index 6104d2be..c2cefbd1 100644 --- "a/docs/Interview/JavaScript/\347\246\201\346\255\242\344\270\213\350\275\275\345\233\276\347\211\207.md" +++ "b/docs/Interview/JavaScript/\347\246\201\346\255\242\344\270\213\350\275\275\345\233\276\347\211\207.md" @@ -1,5 +1,4 @@ - ->怎么禁止下载图片(midjourney实现) +> 怎么禁止下载图片(midjourney实现) **方案一:禁止右键** @@ -43,21 +42,21 @@ window.onload = function () { **方案四:转换为 canvas** -```js -export async function imageToCanvas(url: string, canvas: HTMLCanvasElement) { +```ts +export async function imageToCanvas(url, canvas) { return new Promise((resolve, reject) => { - //新建Image对象,引入当前目录下的图片 + // 新建Image对象,引入当前目录下的图片 const img = new Image() img.src = url - const c = canvas.getContext('2d')! + const c = canvas.getContext('2d') - //图片初始化完成后调用 + // 图片初始化完成后调用 img.onload = function () { - //将canvas的宽高设置为图像的宽高 + // 将canvas的宽高设置为图像的宽高 canvas.width = img.width canvas.height = img.height - //canvas画图片 + // canvas画图片 c.drawImage(img, 0, 0, img.width, img.height) resolve() } @@ -68,26 +67,24 @@ export async function imageToCanvas(url: string, canvas: HTMLCanvasElement) { } ``` -```ts -const throwFn = () => { +```js +function throwFn() { throw new Error( - "Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.", + 'Uncaught DOMException: Failed to execute \'toDataURL\' on \'HTMLCanvasElement\': Tainted canvases may not be exported.', ) } -const $canvasRef = useRef(null) - useEffect(() => { - ;(async () => { - await imageToCanvas(props.url, $canvasRef.current!) - $canvasRef.current!.toBlob = throwFn - $canvasRef.current!.toDataURL = throwFn - })() - }, []) - return ( - (null) +useEffect(() => { + ;(async () => { + await imageToCanvas(props.url, $canvasRef.current) + $canvasRef.current.toBlob = throwFn + $canvasRef.current.toDataURL = throwFn + })() +}, []) +/* - ) + /> */ ``` diff --git "a/docs/Interview/JavaScript/\350\256\276\350\256\241\346\250\241\345\274\217.md" "b/docs/Interview/JavaScript/\350\256\276\350\256\241\346\250\241\345\274\217.md" index 6960a4ac..9f9755a0 100644 --- "a/docs/Interview/JavaScript/\350\256\276\350\256\241\346\250\241\345\274\217.md" +++ "b/docs/Interview/JavaScript/\350\256\276\350\256\241\346\250\241\345\274\217.md" @@ -3,94 +3,95 @@ ```js // 可以添加事件侦听器,触发事件,并处理异步事件 class EventEmitter { - constructor() { - this.events = {}; - } + constructor() { + this.events = {} + } - // 添加事件侦听器 - on(eventName, listener) { - if (!this.events[eventName]) { - this.events[eventName] = []; - } - this.events[eventName].push(listener); + // 添加事件侦听器 + on(eventName, listener) { + if (!this.events[eventName]) { + this.events[eventName] = [] } + this.events[eventName].push(listener) + } - // 触发事件 - emit(eventName, ...args) { - if (this.events[eventName]) { - this.events[eventName].forEach(listener => { - listener(...args); - }); - } + // 触发事件 + emit(eventName, ...args) { + if (this.events[eventName]) { + this.events[eventName].forEach((listener) => { + listener(...args) + }) } + } - // 添加一次性事件 - once(eventName, listener) { - const onceWrapper = (...args) => { - listener(...args); - this.off(eventName, onceWrapper); - }; - this.on(eventName, onceWrapper); + // 添加一次性事件 + once(eventName, listener) { + const onceWrapper = (...args) => { + listener(...args) + this.off(eventName, onceWrapper) } + this.on(eventName, onceWrapper) + } - // 移除事件 - off(eventName, listenerToRemove) { - if (this.events[eventName]) { - this.events[eventName] = this.events[eventName].filter(listener => { - return listener !== listenerToRemove; - }); - } + // 移除事件 + off(eventName, listenerToRemove) { + if (this.events[eventName]) { + this.events[eventName] = this.events[eventName].filter((listener) => { + return listener !== listenerToRemove + }) } + } - // 处理异步事件 - async emitAsync(eventName, ...args) { - if (this.events[eventName]) { - // Use Promise.all to wait for all listeners to resolve - await Promise.all(this.events[eventName].map(listener => listener(...args))); - } + // 处理异步事件 + async emitAsync(eventName, ...args) { + if (this.events[eventName]) { + // Use Promise.all to wait for all listeners to resolve + await Promise.all(this.events[eventName].map(listener => listener(...args))) } + } } - ``` ```js // 示例用法 -const emitter = new EventEmitter(); +const emitter = new EventEmitter() // 添加事件侦听器 emitter.on('event1', () => { - console.log('event1 emitted'); -}); + console.log('event1 emitted') +}) // 触发事件 -emitter.emit('event1'); // 输出: event1 emitted +emitter.emit('event1') // 输出: event1 emitted // 添加一次性事件 emitter.once('event2', () => { - console.log('event2 emitted once'); -}); + console.log('event2 emitted once') +}) // 触发事件 -emitter.emit('event2'); // 输出: event2 emitted once -emitter.emit('event2'); // 不会再输出,因为是一次性事件 +emitter.emit('event2') // 输出: event2 emitted once +emitter.emit('event2') // 不会再输出,因为是一次性事件 // 移除事件 -const event3Handler = () => { - console.log('event3 emitted'); -}; -emitter.on('event3', event3Handler); -emitter.emit('event3'); // 输出: event3 emitted -emitter.off('event3', event3Handler); -emitter.emit('event3'); // 不会再输出,因为事件已被移除 +function event3Handler() { + console.log('event3 emitted') +} +emitter.on('event3', event3Handler) +emitter.emit('event3') // 输出: event3 emitted +emitter.off('event3', event3Handler) +emitter.emit('event3') // 不会再输出,因为事件已被移除 // 处理异步事件 emitter.on('asyncEvent', async () => { - await new Promise(resolve => setTimeout(resolve, 1000)); - console.log('asyncEvent handled'); -}); -emitter.emitAsync('asyncEvent'); // 等待1秒后输出: asyncEvent handled + await new Promise(resolve => setTimeout(resolve, 1000)) + console.log('asyncEvent handled') +}) +emitter.emitAsync('asyncEvent') // 等待1秒后输出: asyncEvent handled ``` + ### 异步文件读取案例 + ```js const fs = require('node:fs') const event = { @@ -125,7 +126,6 @@ fs.readFile('./age.txt', (_, data) => { }) ``` - ## 观察者模式 ```js @@ -140,7 +140,6 @@ class Observer { } } - // 主题对象 class Subject { constructor() { @@ -152,10 +151,11 @@ class Subject { this.arr.push(observer) } - // 移除观察者 + // 移除观察者 remove(observer) { - this.arr = this.arr.filter(obs => obs !== observer); + this.arr = this.arr.filter(obs => obs !== observer) } + setState(newValue) { this.state = newValue this.notify() diff --git "a/docs/Interview/JavaScript/\350\277\233\351\230\266\351\235\242\350\257\225\351\242\230.md" "b/docs/Interview/JavaScript/\350\277\233\351\230\266\351\235\242\350\257\225\351\242\230.md" index 93216265..41ddfcf6 100644 --- "a/docs/Interview/JavaScript/\350\277\233\351\230\266\351\235\242\350\257\225\351\242\230.md" +++ "b/docs/Interview/JavaScript/\350\277\233\351\230\266\351\235\242\350\257\225\351\242\230.md" @@ -29,35 +29,36 @@ fn()// 10 ``` ```js -function fn(){ +function fn() { const data = {} return { - set: function(key,val){ + set(key, val) { data[key] = val - } - get:function(key){ + }, + get(key) { return data[key] } } } const handle = fn() -handle.set('name','zhangsan') +handle.set('name', 'zhangsan') handle.get('name') ``` ```js -const btns = document.querySelectorAll('.btn') //5个按钮 -for(val i = 0;i < btns.length; i++){ //改用 let 形成闭包 - btns[i].onclick = function(){ - console.log(i) //输出结果都是 5 +const btns = document.querySelectorAll('.btn') // 5个按钮 +for (let i = 0; i < btns.length; i++) { // 改用 let 形成闭包 + btns[i].onclick = function () { + console.log(i) // 输出结果都是 5 } } -//==> -for(val i = 0;i < btns.length; i++){ -(function(){ - btns[i].onclick = function(){ - console.log(i) //输出结果: 01234 - }})(i) +// ==> +for (let i = 0; i < btns.length; i++) { + (function () { + btns[i].onclick = function () { + console.log(i) // 输出结果: 01234 + } + })(i) } ``` @@ -83,7 +84,9 @@ function after(times, callback) { } } } -const fn = after(3, () => { console.log('ready') }) +const fn = after(3, () => { + console.log('ready') +}) fn() fn() fn() @@ -191,16 +194,17 @@ operate(10) // 10 ### 闭包惰性思想 ```js -function getCss(ele, attr){ - //加载判断样式兼容问题,没有更换刷新浏览器每次都需要做多余的判断 - if(window.getComputedStyle){ - return window.getComputedStyle(ele)[attr] - }else{ - return window.getCurrentStyle(ele)[attr] +function getCss(ele, attr) { + // 加载判断样式兼容问题,没有更换刷新浏览器每次都需要做多余的判断 + if (window.getComputedStyle) { + return window.getComputedStyle(ele)[attr] + } + else { + return window.getCurrentStyle(ele)[attr] } } -//优化后 -function getCss(ele, attr){ +// 优化后 +/* function getCss(ele, attr){ //第一次运行,根据兼容情况,重构 getCss if(window.getComputedStyle){ getCss = function(ele, attr){ @@ -214,7 +218,7 @@ function getCss(ele, attr){ return getCss(ele, attr) } getCss(body, 'width') -getCss(body, 'padding') +getCss(body, 'padding') */ ``` ## loader和plugin区别 diff --git "a/docs/Interview/JavaScript/\351\235\242\350\257\225\351\242\230\344\270\200.md" "b/docs/Interview/JavaScript/\351\235\242\350\257\225\351\242\230\344\270\200.md" index f24bf661..549f8592 100644 --- "a/docs/Interview/JavaScript/\351\235\242\350\257\225\351\242\230\344\270\200.md" +++ "b/docs/Interview/JavaScript/\351\235\242\350\257\225\351\242\230\344\270\200.md" @@ -1,6 +1,7 @@ ## 手写 bind、call、apply + ```js -Function.prototype.myBind = function(ctx){ +function myBind(ctx) { ctx.fn = this ctx.fn() delete ctx.fn @@ -8,8 +9,9 @@ Function.prototype.myBind = function(ctx){ ``` ## 手写 new + ```js -function myNew(fn, ...args){ +function myNew(fn, ...args) { const obj = Object.create(fn.prototype) const res = fn.apply(obj, args) return res instanceof Object ? res : obj @@ -17,11 +19,21 @@ function myNew(fn, ...args){ ``` ## 手写 unshift + ```js -Array.prototype.myUnshift = function (...args){ - for(let i = args.length - 1; i >= 0; i--){ - this.splice(0,0,args[i]) - } - return this.length +function myUnshift(...args) { + for (let i = args.length - 1; i >= 0; i--) { + this.splice(0, 0, args[i]) + } + return this.length } ``` + +## 实现管道函数 + + ```js + const pipe = (...fns) => x => fns.reduce((v, fn) => fn(v), x); + const double = x => x * 2; + const square = x => x * x; + const squareDouble = pipe(double, square); + ``` diff --git "a/docs/Interview/Vue/\345\211\215\347\253\257\351\241\271\347\233\256\344\274\230\345\214\226.md" "b/docs/Interview/Vue/\345\211\215\347\253\257\351\241\271\347\233\256\344\274\230\345\214\226.md" index 50dd3598..a32823ae 100644 --- "a/docs/Interview/Vue/\345\211\215\347\253\257\351\241\271\347\233\256\344\274\230\345\214\226.md" +++ "b/docs/Interview/Vue/\345\211\215\347\253\257\351\241\271\347\233\256\344\274\230\345\214\226.md" @@ -28,39 +28,42 @@ module.exports = { ### 分包和共享依赖 ```js - configureWebpack: { +// webpack.config.js +module.exports = { + configureWebpack: { resolve: { alias: { - "@": resolve("src"), + '@': resolve('src'), }, }, optimization: { - runtimeChunk: "single", + runtimeChunk: 'single', splitChunks: { - chunks: "all", + chunks: 'all', maxInitialRequests: Infinity, minSize: 20000, cacheGroups: { common: { - name: "common", - chunks: "all", - minSize: 0, //只要大于0字节就抽离 + name: 'common', + chunks: 'all', + minSize: 0, // 只要大于0字节就抽离 minChunks: 2, }, vendor: { test: /[\\/]node_modules[\\/]/, - chunks: "initial", //从入口文件抽离 - minSize: 0, //只要大于0字节就抽离 - minChunks: 2, //只要使用2次以上就抽离 + chunks: 'initial', // 从入口文件抽离 + minSize: 0, // 只要大于0字节就抽离 + minChunks: 2, // 只要使用2次以上就抽离 name(module) { const packageName = module.context.match( /[\\/]node_modules[\\/](.*?)([\\/]|$)/ - )[1]; - return `npm.${packageName.replace("@", "")}`; + )[1] + return `npm.${packageName.replace('@', '')}` }, }, }, }, }, - }, + } +} ``` diff --git "a/docs/Interview/Vue/\345\270\270\350\247\201Path\345\214\272\345\210\253.md" "b/docs/Interview/Vue/\345\270\270\350\247\201Path\345\214\272\345\210\253.md" index 704eca2f..7f4dc784 100644 --- "a/docs/Interview/Vue/\345\270\270\350\247\201Path\345\214\272\345\210\253.md" +++ "b/docs/Interview/Vue/\345\270\270\350\247\201Path\345\214\272\345\210\253.md" @@ -4,7 +4,7 @@ VueRouter的base属性是指应用的基路径,它会影响到所有使用了v 在router对象中,base属性可以通过以下方式设置: -```javascript +```js const router = new VueRouter({ base: '/my-app/' }) @@ -14,7 +14,7 @@ const router = new VueRouter({ 例如,假设你的应用被部署在`http://example.com/my-app/`这个路径下,那么你就需要设置如下的base属性: -```javascript +```js const router = new VueRouter({ base: '/my-app/' }) @@ -42,7 +42,7 @@ const router = new VueRouter({ 则构建出的静态文件实际上会被部署到类似于 http://example.com/my-app/ 这样的路径下。代码示例: -```javascript +```js module.exports = { publicPath: process.env.NODE_ENV === 'production' ? '/my-app/' @@ -53,17 +53,19 @@ module.exports = { 通常可以在根目录配置环境变量,相对于不同环境打包时的打包命令 ```json -//package.json -"scripts": { +// package.json +{ + "scripts": { "serve": "vue-cli-service serve --open --port 9999", "build:server": "vue-cli-service build ", "build:local": "vue-cli-service build --mode buildlocal" - }, + } +} ``` -```js -//.env.production --服务器打包预览环境变量 +```zsh +#.env.production --服务器打包预览环境变量 OUTPUT_DIR=/opt/nginx/www/html/music BASE_URL=/music/ ``` diff --git "a/docs/Problem/Graphical/Antv\344\273\243\347\240\201\347\211\207\346\256\265\351\233\206\351\224\246.md" "b/docs/Problem/Graphical/Antv\344\273\243\347\240\201\347\211\207\346\256\265\351\233\206\351\224\246.md" deleted file mode 100644 index d710f07d..00000000 --- "a/docs/Problem/Graphical/Antv\344\273\243\347\240\201\347\211\207\346\256\265\351\233\206\351\224\246.md" +++ /dev/null @@ -1,604 +0,0 @@ -# 网络拓扑图代码 - -## 图实例化 - -```js -import { commonRegister ,viewRegister} from './registerElements.js' - -//1.初始化实例 -initChart() { - let halfWidth = this.width / 2; - let halfHeight = this.height / 2; - if (!this.graph) { - commonRegister() - viewRegister() - const toolbar = new G6.ToolBar({ - position: { x: 10, y: 10 }, - getContent: () => { - const outDiv = document.createElement('div'); - let style = 'cursor: pointer;vertical-align: middle;line-height:24px;font-size:18px;' - outDiv.innerHTML = `
    -
  • -
  • -
  • -
` - return outDiv - }, - handleClick: (code) => { - if (code === 'zoomOut') { - toolbar.zoomOut() - } else if (code === 'zoomIn') { - toolbar.zoomIn() - }else if(code === 'autoZoom'){ - toolbar.autoZoom() - } - } - }); - this.graph = new G6.Graph({ - container: "topoChart", - width: this.width, - height: this.height, - fitView: true, - fitViewPadding: 100, - groupByTypes: false, - linkCenter: false, - layout: { - pipes: [ - { - // 该子图所使用的布局类型 - type: "circular", - center: [halfWidth, halfHeight], - radius: 80, - nodesFilter: (node) => node.sysType === "vpe", - }, - ], - }, - //交互行为相关配置 - modes: { - default: ["drag-canvas", "zoom-canvas", {type: "drag-combo", shouldEnd(e, parent) { - if(parent) { - return false; - } - return true; - }}], - }, - plugins: [toolbar], - defaultNode: { - type: "bubble", - labelCfg: { - position: "center", - style: { - fill: "white", - stroke: "#fff", - }, - }, - }, - defaultEdge: { - color: "#888", - type: "animate-line", - }, - defaultCombo: { - padding: 1, - style: { - cursor: "all-scroll", - }, - labelCfg: { - style: { - opacity: 0, - fill: "#303133", - fontSize: 12, - stroke: "#fff", - }, - }, - }, - }); - //监听事件 - this.graphBehaviors(); - } -}, -graphBehaviors(){ - this.graph.on('node:click',this.debounce(this.eventHandle, 300)); - //this.graph.on('edge:click'... -}, -debounce(fn, delay) { - const delays = delay || 300; - let timer; - return function() { - const th = this; - const args = arguments; - if (timer) { - clearTimeout(timer); - } - timer = setTimeout(function() { - timer = null; - fn.apply(th, args); - }, delays); - }; -}, - //2.查询数据 -queryChartData(){ - //处理数据 - this.dealData(data) -} -//3.处理数据 -dealData(data ) { - //VPE节点 - nodes = ... - edges = ... - combos = ... - this.drawChart(...); -} -//4.渲染数据 -drawChart() { - this.graph.read({ - nodes, - edges, - combos, - }); -}, - -``` - -```js -mounted() { - this.chartLoading = true - this.width = document.getElementById("topoChart").scrollWidth; - this.height = document.getElementById("topoChart").scrollHeight || 600; - this.initChart(); - this.queryChartData(); - this.chartLoading = false - //监听窗口大小变化,重绘网络拓扑 - window.addEventListener('resize',this.rePaint ) - }, -beforeDestroy() { - if (this.graph) { - this.graph.clear(); - this.graph.destroy(); - } - this.data = Object.assign(this.$data, this.$options.data()); -}, -``` - -## 注册节点 - -```js -// registerElements.js -import G6 from '@antv/g6' -// 共同节点注册 -export function commonRegister() { - // 注册实线动画 - G6.registerEdge('animate-line', { - drawShape(cfg, group) { - const self = this - let shapeStyle = self.getShapeStyle(cfg) - shapeStyle = Object.assign(shapeStyle, { - opacity: 0, - strokeOpacity: 0, - }) - const keyShape = group.addShape('path', { - attrs: shapeStyle, - name: 'path-shape', - }) - return keyShape - }, - afterDraw(cfg, group) { - const shape = group.get('children')[0] - // 线条动画 - shape.animate( - (ratio) => { - const opacity = ratio * cfg.style.opacity - const strokeOpacity = ratio * cfg.style.strokeOpacity - return { - opacity: ratio || opacity, - strokeOpacity: ratio || strokeOpacity, - } - }, - { - duration: 300, - } - ) - // 箭头动画 - const startPoint = shape.getPoint(0) - const circle = group.addShape('circle', { - attrs: { - x: startPoint.x, - y: startPoint.y, - fill: '#1890ff', - r: 2, - }, - name: 'circle-shape', - }) - circle.animate( - (ratio) => { - const tmpPoint = shape.getPoint(ratio) - return { - x: tmpPoint.x, - y: tmpPoint.y, - } - }, - { - repeat: true, - duration: 3000, - } - ) - }, - setState(name, value, item) { - const shape = item.get('keyShape') - if (name === 'disappearing' && value) { - shape.animate( - (ratio) => { - return { - opacity: 1 - ratio, - strokeOpacity: 1 - ratio, - } - }, - { - duration: 200, - } - ) - } - else if (name === 'dark') { - if (value) - shape.attr('opacity', 0.2) - else shape.attr('opacity', 1) - } - }, - }, 'line') - // 注册iconfont节点 - G6.registerNode('iconfontHub', { - draw(cfg, group) { - const { style, labelCfg: labelStyle, size } = cfg - group.addShape('circle', { - attrs: { - x: 0, - y: size / 2, - r: size, - }, - name: 'hub-bg-shape', - }) - // 添加图标 - const keyShape = group.addShape('text', { - attrs: { - x: 0, - y: size / 2, - fontFamily: 'iconfont', - textAlign: 'center', - text: cfg.text, - fontSize: Math.round(size), - ...style, - }, - name: 'hub-shape', - }) - // 添加label - group.addShape('text', { - attrs: { - x: 0, - y: Math.round(size / 4), - textAlign: 'center', - textBaseline: 'middle', - text: cfg.label, - ...labelStyle.style, - }, - name: 'hub-label', - }) - return keyShape - }, - // afterDraw(cfg, group) { - // const shape = group.get('children')[0]; - // shape.animate( - // (ratio) => { - // let fill = '#C396ED' - // if(ratio > 0.6){ - // fill = '#FFCF8B' - // }else if(ratio > 0.3){ - // fill = '#C396ED' - // }else { - // fill = '#75D882' - // } - // return { - // fill, - // }; - // }, - // { - // repeat: true, - // duration: 1500, - // // easing: 'easeCubic', - // }, - // ); - // }, - }) - // 自定义节点和节点动画 - G6.registerNode('vpe-rect-animate', { - afterDraw(cfg, group) { - const { width, height, stroke, radius } = this.getShapeStyle(cfg) - const x = -width / 2 - const y = -height / 2 - const back1 = group.addShape('rect', { - zIndex: -3, - attrs: { - x, - y, - width, - height, - fill: stroke, - opacity: 0.6, - radius, - }, - name: 'rback1-shape', - }) - const back2 = group.addShape('rect', { - zIndex: -2, - attrs: { - x, - y, - width, - height, - fill: stroke, - opacity: 0.6, - radius, - }, - name: 'rback2-shape', - }) - const back3 = group.addShape('circle', { - zIndex: -1, - attrs: { - x, - y, - width, - height, - fill: stroke, - opacity: 0.6, - radius, - }, - name: 'rback3-shape', - }) - group.sort() // Sort according to the zIndex - back1.animate( - { - width: width + 10, - height: height + 10, - opacity: 0.1, - x: x - 5, - y: y - 5, - }, - { - duration: 3000, - easing: 'easeCubic', - delay: -300, - repeat: true, // repeat - } - ) // no delay - back2.animate( - { - width: width + 10, - height: height + 10, - opacity: 0.1, - x: x - 5, - y: y - 5, - }, - { - duration: 3000, - easing: 'easeCubic', - delay: 1000, - repeat: true, - } - ) - back3.animate( - { - width: width + 10, - height: height + 10, - opacity: 0.1, - x: x - 5, - y: y - 5, - }, - { - duration: 3000, - easing: 'easeCubic', - delay: 2000, - repeat: true, // repeat - } - ) // 3s delay - }, - }, 'rect') -} -// 弹窗特有节点注册 -export function dialogRegister() { - // 注册iconfont节点 - G6.registerNode('iconfontCpe', { - draw(cfg, group) { - const { style, labelCfg: labelStyle } = cfg - // 添加图标 - const keyShape = group.addShape('text', { - attrs: { - x: 0, - y: 0, - fontFamily: 'iconfont', - textAlign: 'center', - textBaseline: 'middle', - text: cfg.text, - fontSize: cfg.size, - ...style, - }, - name: 'cpe-shape', - }) - // 添加label - group.addShape('text', { - attrs: { - x: 0, - y: 10, - textAlign: 'center', - text: cfg.label, - ...labelStyle.style, - }, - name: 'cpe-label', - }) - - return keyShape - }, - afterDraw(cfg, group) { - const shape = group.get('children')[0] - shape.animate( - (ratio) => { - let text = '\uE604' - if (ratio > 0.6) - text = '\uE604' - - else if (ratio > 0.3) - text = '\uE606' - - else - text = '\uE605' - - return { - text, - } - }, - { - repeat: true, - duration: 1500, - delay: 3000, - // easing: 'easeCubic', - }, - ) - }, - }) - // 注册虚线动画 - // G6.registerEdge("vpn-line-dash", - // { - // afterDraw(cfg, group) { - // const shape = group.get("children")[0]; - // let index = 0; - // shape.animate( - // () => { - // index = index+0.2; - // if (index > 9) { - // index = 0; - // } - // const res = { - // lineDash: [4, 4], - // lineDashOffset: -index, - // }; - // return res; - // }, - // { - // repeat: true, - // duration:10000, - // } - // ); - // }, - // }, - // "line" - // ); -} - -// 网络拓扑总览特有节点注册 -export function viewRegister() { - // 注册iconfont combos - // G6.registerCombo("cloudCombo", - // { - // drawShape: function drawShape(cfg, group) { - // // const { labelCfg: labelStyle } = cfg; - // const keyShape = group.addShape("text", { - // attrs: { - // y: 0, - // x: 0, - // fill: cfg.style.fill, - // stroke: cfg.style.fill, - // fontFamily: "iconfont", - // textAlign: "center", - // textBaseline: "middle", - // text: "\ue603", - // fontSize: 320, - // zIndex: 8, - // }, - // name: "cloud", - // }); - // //添加label - // // group.addShape("text", { - // // attrs: { - // // x: 0, - // // y: -80, - // // textAlign: "center", - // // textBaseline: "middle", - // // text: cfg.label, - // // ...labelStyle.style, - // // }, - // // name: "hubCombo-label", - // // }); - // return keyShape; - // }, - // }, - // "cicle" - // ); - // 注册SVG combo - G6.registerCombo( - 'cloudCombo', - { - drawShape: function drawShape(cfg, group) { - const { labelCfg } = cfg - const str = 'M 448 102.875 c 0 -82.09 -56.678 -150.9 -132.996 -169.48 C 311.762 -195.305 206.546 -298.667 77.142 -298.667 c -75.792 0 -143.266 35.494 -186.854 90.732 c -24.442 -31.598 -62.69 -51.96 -105.708 -51.96 c -73.81 0 -133.642 59.874 -133.642 133.722 c 0 6.436 0.48 12.76 1.364 18.954 c -11.222 -2.024 -22.766 -3.138 -34.57 -3.138 C -489.266 -110.359 -576 -23.5707 -576 83.4853 C -576 190.547 -489.266 277.333 -382.27 277.333 l 656.262 0 l 0 -0.012 C 370.13 277.137 448 199.109 448 102.875 Z' - const pathArr = str.split(' ') - const opath = [] - pathArr.forEach((item) => { - if (/[a-z]/i.test(item)) - opath.push([item]) - - else - opath[opath.length - 1].push(Number.parseFloat(item)) - }) - - opath.forEach((item) => { - item.forEach((p, i) => { - if (i > 0) - item[i] = item[i] / 3 - }) - }) - const keyShape = group.addShape('path', { - attrs: { - ...cfg.style, - width: cfg.style.width, - height: cfg.style.height, - path: opath, - }, - id: cfg.id, - name: 'cloud', - }) - group.addShape('text', { - attrs: { - x: 0, - y: -100, - textAlign: 'center', - text: cfg.label, - fill: '#303133', - }, - name: 'hubCombo-label', - }) - return keyShape - }, - - }, - 'single-combo' - ) -} - -// 节点文本溢出省略处理 -export function fittingString(str, maxWidth, fontSize) { - const ellipsis = '...' - const ellipsisLength = G6.Util.getTextSize(ellipsis, fontSize)[0] - let currentWidth = 0 - let res = str - const pattern = new RegExp('[\u4E00-\u9FA5]+') - str.split('').forEach((letter, i) => { - if (currentWidth > maxWidth - ellipsisLength) - return - if (pattern.test(letter)) - currentWidth += fontSize - else - currentWidth += G6.Util.getLetterWidth(letter, fontSize) - - if (currentWidth > maxWidth - ellipsisLength) - res = `${str.substr(0, i)}${ellipsis}` - }) - return res -} -``` diff --git "a/docs/Problem/Graphical/Echarts\351\227\256\351\242\230\346\200\273\347\273\223.md" "b/docs/Problem/Graphical/Echarts\351\227\256\351\242\230\346\200\273\347\273\223.md" index c073e9ce..f4f496da 100644 --- "a/docs/Problem/Graphical/Echarts\351\227\256\351\242\230\346\200\273\347\273\223.md" +++ "b/docs/Problem/Graphical/Echarts\351\227\256\351\242\230\346\200\273\347\273\223.md" @@ -24,39 +24,42 @@ $designHeight: 1080; ## 左侧菜单折叠响应式 ```js - mounted() { -// 监听窗口大小,所有echart实例尺寸尺寸改变 - window.addEventListener("resize", () => { - this.chartsInstance.forEach(chart => { +export default { + mounted() { + // 监听窗口大小,所有echart实例尺寸尺寸改变 + window.addEventListener('resize', () => { + this.chartsInstance.forEach((chart) => { chart.resize() - }); - }); - //监听div容器的无效 - /*this.$refs.onlineIspRef.addEventListener("resize",() => { + }) + }) + // 监听div容器的无效 + /* this.$refs.onlineIspRef.addEventListener("resize",() => { this.chartsInstance.forEach(chart => { chart.resize() }); - })*/ + }) */ + } } ``` > 方案: 侧边栏按钮点击展开/折叠时, 手动触发`window.resize` ```js - toggleLeftMenu() { - Cookies.set('sidebar', this.leftMenuOpen ? 'close' : 'open', {path: '/'}); - this.$store.commit('toggleLeftMenu', !this.leftMenuOpen); - this.doResize() +export default { + toggleLeftMenu() { + Cookies.set('sidebar', this.leftMenuOpen ? 'close' : 'open', { path: '/' }) + this.$store.commit('toggleLeftMenu', !this.leftMenuOpen) + this.doResize() }, -doResize(){ - setTimeout(function(){ - var ev = new Event("resize", {"bubbles":true, "cancelable":false}); - window.dispatchEvent(ev); - },120);//不使用定时器没反应 + doResize() { + setTimeout(() => { + const ev = new Event('resize', { bubbles: true, cancelable: false }) + window.dispatchEvent(ev) + }, 120)// 不使用定时器没反应 - //有效, 而且提示event.initEvent方法已经过时(deprecated) - //但是折线图左侧收缩/延伸会有抖动问题,需要调节定时器时间使比较不突兀 - /*setTimeout(function(){ + // 有效, 而且提示event.initEvent方法已经过时(deprecated) + // 但是折线图左侧收缩/延伸会有抖动问题,需要调节定时器时间使比较不突兀 + /* setTimeout(function(){ if(document.createEvent) { var event = document.createEvent("HTMLEvents"); event.initEvent("resize", true, true); @@ -64,8 +67,9 @@ doResize(){ } else if(document.createEventObject) { window.fireEvent("onresize"); } - },120);*/ -}, + },120); */ + }, +} ``` ## 地图缩放重叠问题 diff --git "a/docs/Problem/Nuxt3/Nuxt3\351\241\271\347\233\256\350\270\251\345\235\221.md" "b/docs/Problem/Nuxt3/Nuxt3\351\241\271\347\233\256\350\270\251\345\235\221.md" index 13d3ea10..2570c0ec 100644 --- "a/docs/Problem/Nuxt3/Nuxt3\351\241\271\347\233\256\350\270\251\345\235\221.md" +++ "b/docs/Problem/Nuxt3/Nuxt3\351\241\271\347\233\256\350\270\251\345\235\221.md" @@ -96,12 +96,14 @@ async function getImgCode() { 打包时报错:解析到错误 URL ```js -nitro: { +export default defineNuxtConfig({ + nitro: { prerender: { crawlLinks: true, - routes: ['/'], //去掉: ,'sitemap.xml' + routes: ['/'], // 去掉: ,'sitemap.xml' }, -} + } +}) ``` > 测试环境能访问`sitemap.xml` 页面 diff --git "a/docs/Problem/VitePress/VitePress\350\270\251\345\235\221\350\256\260\345\275\225.md" "b/docs/Problem/VitePress/VitePress\350\270\251\345\235\221\350\256\260\345\275\225.md" index a6b0f4c3..c679e599 100644 --- "a/docs/Problem/VitePress/VitePress\350\270\251\345\235\221\350\256\260\345\275\225.md" +++ "b/docs/Problem/VitePress/VitePress\350\270\251\345\235\221\350\256\260\345\275\225.md" @@ -160,7 +160,7 @@ function deepGenerateSidebar(arr) { ### 安装插件 -```bash +```zsh npm i vitepress-plugin-search markdown-it flexsearch -D ``` @@ -176,7 +176,7 @@ npm i vitepress-plugin-search markdown-it flexsearch -D ![image-20230205233032922](https://zerdocs.oss-cn-shanghai.aliyuncs.com/202302052330956.png){data-zoomable} -```typescript +```ts // vite.config.ts import { SearchPlugin } from 'vitepress-plugin-search' import { defineConfig } from 'vite' diff --git "a/docs/Problem/VueProject/Vue\351\241\271\347\233\256\350\270\251\345\235\221\344\270\200.md" "b/docs/Problem/VueProject/Vue\351\241\271\347\233\256\350\270\251\345\235\221\344\270\200.md" index 9ea9a053..f2bc6324 100644 --- "a/docs/Problem/VueProject/Vue\351\241\271\347\233\256\350\270\251\345\235\221\344\270\200.md" +++ "b/docs/Problem/VueProject/Vue\351\241\271\347\233\256\350\270\251\345\235\221\344\270\200.md" @@ -38,36 +38,6 @@ - - ``` ## 文本溢出隐藏处理后对不齐问题 @@ -183,12 +75,12 @@ this.$bus.$emit('searchDone') ``` ```js {3} -//B路由组件 -{ - mounted(){ - this.$bus.$off('searchDone') //在每次绑定事件前,先解绑该事件 +// B路由组件 +export default { + mounted() { + this.$bus.$off('searchDone') // 在每次绑定事件前,先解绑该事件 - this.$bus.$on('searchDone',this.handleCurrentChange) + this.$bus.$on('searchDone', this.handleCurrentChange) } } ``` @@ -242,37 +134,36 @@ window.addEventListener('scroll', handleScroll) 不会生效原因: div 元素默认不会触发 resize 事件。在 window 对象上,浏览器会自动跟踪窗口的大小变化并触发 resize 事件,但在其他元素上,您需要自己编写代码来检测大小变化。可以使用 MutationObserver 或者 ResizeObserver 来监听元素大小变化。以下是使用 ResizeObserver 的示例代码: ```js -{ +export default { + mounted() { + this.tagListRef = this.$refs.tagListRef + this.tagBoxRef = this.$refs.tagBoxRef + this.resizeHandler() -} -mounted() { - this.tagListRef = this.$refs.tagListRef; - this.tagBoxRef = this.$refs.tagBoxRef; - this.resizeHandler() - - // 创建 ResizeObserver 实例 - this.tagListResizeObserver = new ResizeObserver(this.resizeHandler); - // 监听 tagListRef 元素的大小变化 - this.tagListResizeObserver.observe(this.tagListRef); - - this.tagListRef.addEventListener('wheel', this.handleScroll); -}, -beforeUnmount() { - // 在组件卸载前,停止 ResizeObserver 实例 - this.tagListResizeObserver.disconnect(); -}, -methods: { - handleScroll(e) { - e.preventDefault(); - this.tagListRef.scrollLeft += e.deltaY * 100; + // 创建 ResizeObserver 实例 + this.tagListResizeObserver = new ResizeObserver(this.resizeHandler) + // 监听 tagListRef 元素的大小变化 + this.tagListResizeObserver.observe(this.tagListRef) + + this.tagListRef.addEventListener('wheel', this.handleScroll) }, - scrollHandler(direction) { - this.tagListRef.scrollLeft += direction * this.tagListWidth; + beforeUnmount() { + // 在组件卸载前,停止 ResizeObserver 实例 + this.tagListResizeObserver.disconnect() }, - resizeHandler(entries) { + methods: { + handleScroll(e) { + e.preventDefault() + this.tagListRef.scrollLeft += e.deltaY * 100 + }, + scrollHandler(direction) { + this.tagListRef.scrollLeft += direction * this.tagListWidth + }, + resizeHandler(entries) { // entries 是 ResizeObserver 的回调参数,包含被观察的元素的信息 - this.tagListWidth = this.tagListRef.clientWidth - this.tagBoxWidth = this.tagBoxRef.clientWidth + this.tagListWidth = this.tagListRef.clientWidth + this.tagBoxWidth = this.tagBoxRef.clientWidth + } } } ``` diff --git a/eslint.config.js b/eslint.config.js index e58f8017..97ecee26 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -2,5 +2,4 @@ import antfu from '@antfu/eslint-config' export default antfu({ formatters: true, - rules: { "regexp/no-unused-capturing-group": false } }) diff --git a/package.json b/package.json index fe8c07e9..92095095 100644 --- a/package.json +++ b/package.json @@ -17,22 +17,22 @@ "vite-plugin-vitepress-auto-sidebar": "^1.6.5" }, "devDependencies": { - "@antfu/eslint-config": "^2.24.0", + "@antfu/eslint-config": "^2.24.1", "@iconify/json": "^2.2.232", "@shikijs/vitepress-twoslash": "^1.12.0", "eslint": "^9.8.0", "eslint-plugin-format": "^0.1.2", "lint-staged": "^15.2.7", - "puppeteer": "^22.14.0", + "puppeteer": "^22.15.0", "sass": "^1.77.8", "simple-git-hooks": "^2.11.1", - "unocss": "^0.61.8", + "unocss": "^0.61.9", "unplugin-auto-import": "^0.18.2", "unplugin-icons": "^0.19.1", "unplugin-vue-components": "^0.27.3", "vite": "^5.4.0-beta.0", "vitepress": "1.2.3", - "vue": "^3.5.0-alpha.4" + "vue": "^3.5.0-alpha.5" }, "simple-git-hooks": {}, "lint-staged": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e310c863..75142d8b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,8 +19,8 @@ importers: version: 1.6.5(eslint@9.8.0)(typescript@5.3.3)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0))(vitepress@1.2.3(@algolia/client-search@4.20.0)(@types/node@20.9.1)(axios@1.6.2)(less@4.2.0)(postcss@8.4.40)(sass@1.77.8)(search-insights@2.11.0)(terser@5.24.0)(typescript@5.3.3)) devDependencies: '@antfu/eslint-config': - specifier: ^2.24.0 - version: 2.24.0(@vue/compiler-sfc@3.5.0-alpha.4)(eslint-plugin-format@0.1.2(eslint@9.8.0))(eslint@9.8.0)(typescript@5.3.3) + specifier: ^2.24.1 + version: 2.24.1(@vue/compiler-sfc@3.5.0-alpha.5)(eslint-plugin-format@0.1.2(eslint@9.8.0))(eslint@9.8.0)(typescript@5.3.3) '@iconify/json': specifier: ^2.2.232 version: 2.2.232 @@ -37,8 +37,8 @@ importers: specifier: ^15.2.7 version: 15.2.7 puppeteer: - specifier: ^22.14.0 - version: 22.14.0(typescript@5.3.3) + specifier: ^22.15.0 + version: 22.15.0(typescript@5.3.3) sass: specifier: ^1.77.8 version: 1.77.8 @@ -46,17 +46,17 @@ importers: specifier: ^2.11.1 version: 2.11.1 unocss: - specifier: ^0.61.8 - version: 0.61.8(postcss@8.4.40)(rollup@4.18.0)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0)) + specifier: ^0.61.9 + version: 0.61.9(postcss@8.4.40)(rollup@4.18.0)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0)) unplugin-auto-import: specifier: ^0.18.2 - version: 0.18.2(@nuxt/kit@3.8.1(rollup@4.18.0))(@vueuse/core@10.11.0(vue@3.5.0-alpha.4(typescript@5.3.3)))(rollup@4.18.0) + version: 0.18.2(@nuxt/kit@3.8.1(rollup@4.18.0))(@vueuse/core@10.11.0(vue@3.5.0-alpha.5(typescript@5.3.3)))(rollup@4.18.0) unplugin-icons: specifier: ^0.19.1 - version: 0.19.1(@vue/compiler-sfc@3.5.0-alpha.4)(vue-template-compiler@2.7.16) + version: 0.19.1(@vue/compiler-sfc@3.5.0-alpha.5)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: ^0.27.3 - version: 0.27.3(@babel/parser@7.25.0)(@nuxt/kit@3.8.1(rollup@4.18.0))(rollup@4.18.0)(vue@3.5.0-alpha.4(typescript@5.3.3)) + version: 0.27.3(@babel/parser@7.25.0)(@nuxt/kit@3.8.1(rollup@4.18.0))(rollup@4.18.0)(vue@3.5.0-alpha.5(typescript@5.3.3)) vite: specifier: ^5.4.0-beta.0 version: 5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0) @@ -64,8 +64,8 @@ importers: specifier: 1.2.3 version: 1.2.3(@algolia/client-search@4.20.0)(@types/node@20.9.1)(axios@1.6.2)(less@4.2.0)(postcss@8.4.40)(sass@1.77.8)(search-insights@2.11.0)(terser@5.24.0)(typescript@5.3.3) vue: - specifier: ^3.5.0-alpha.4 - version: 3.5.0-alpha.4(typescript@5.3.3) + specifier: ^3.5.0-alpha.5 + version: 3.5.0-alpha.5(typescript@5.3.3) packages: @@ -139,8 +139,8 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@antfu/eslint-config@2.24.0': - resolution: {integrity: sha512-F5wG5lP+f16aeQMVn1l5Wetd8973NsyaWirc9s3YCoe7LTBMpkxnduzTT/wP4L5OlLNLDTRQbH9GUMedTixcsA==} + '@antfu/eslint-config@2.24.1': + resolution: {integrity: sha512-vk2zqPO3HFHxhlIZbMxjo185qvMmCUUc6H58TrXHjMxnCCkw9SqBDWemV6uKUmPSphaOipjzoXYYSyeFYhGa1w==} hasBin: true peerDependencies: '@eslint-react/eslint-plugin': ^1.5.8 @@ -206,10 +206,6 @@ packages: resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.7': - resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.25.0': resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} engines: {node: '>=6.9.0'} @@ -236,10 +232,6 @@ packages: resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.24.7': - resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.24.7': resolution: {integrity: sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==} engines: {node: '>=6.9.0'} @@ -248,12 +240,6 @@ packages: resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.24.7': - resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.25.2': resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} @@ -294,10 +280,6 @@ packages: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.7': - resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.8': resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} @@ -349,18 +331,10 @@ packages: resolution: {integrity: sha512-ZfB6wyLVqr9ANl1F0l/0aqoNUE1/kcWlQHmk0wF9OTEKDK1whkXYLruRMt53zY556yS2+84EsOpr1hpjZISTRg==} engines: {node: '>=6.9.0'} - '@babel/template@7.24.7': - resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} - engines: {node: '>=6.9.0'} - '@babel/template@7.25.0': resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.7': - resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.2': resolution: {integrity: sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==} engines: {node: '>=6.9.0'} @@ -783,31 +757,31 @@ packages: '@shikijs/vitepress-twoslash@1.12.0': resolution: {integrity: sha512-ogFziKJAWcI7Fgl2MnkVS59gDggPjnUNZHNCvpHEkzs7Q1y/7Vdg4aphAkLjD//K0pRhgHZW8xqG/qfBdXj0Xw==} - '@stylistic/eslint-plugin-js@2.6.0-beta.1': - resolution: {integrity: sha512-XfCUkArkh8nbMZRczJGwW92jvrvKcHsz7jjA166f+37SQJ0dcBBvoJFTS84GuvQlyE9ZUdoIPvG+9daRz25lBg==} + '@stylistic/eslint-plugin-js@2.6.0': + resolution: {integrity: sha512-6oN0Djdy8gTRhx2qS1m4P+CeDKqmZZwc4ibgzzJS+8iBW3Ts1c2mAvi+OH6TN4bt0AHm0FnDv2+KtTqqueMATw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.40.0' - '@stylistic/eslint-plugin-jsx@2.6.0-beta.1': - resolution: {integrity: sha512-w13pjsE10gAjfSra00+xfgHbvx/fQQW7IjZAKmon246UYRw01+8KKYukRLSJ9wINe7fUKka//LAbqSbm8VKxmg==} + '@stylistic/eslint-plugin-jsx@2.6.0': + resolution: {integrity: sha512-Hm7YODwBwAsYtacY9hR5ONiBS7K9og4YZFjBr8mfqsmlCYVFje1HsOKG+tylePkwcu0Qhi+lY86cP3rlV4PhAA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.40.0' - '@stylistic/eslint-plugin-plus@2.6.0-beta.1': - resolution: {integrity: sha512-Hm7pq1KB8s5LeuatMvIVQvsHANnd9sNkkXY7naGcasz2W/f9at9IhozmN+/Oq5O2nRtrzb5rovQ/FclGiaO49w==} + '@stylistic/eslint-plugin-plus@2.6.0': + resolution: {integrity: sha512-9GfLF08zx/pNFpQQlNMz6f4IixoS8zdSBFdJLWLTorMilNUjd4dDuA5ej4Z32+mTZf4u6lduzQcUrAYiGKTLTg==} peerDependencies: eslint: '*' - '@stylistic/eslint-plugin-ts@2.6.0-beta.1': - resolution: {integrity: sha512-pgRqZiC9NpvO7zPbs713WW8dhns61i7syhDKxSpgMecbvcS7I/uTFFEihmIbzBgWbebhuFLEFS6FC9Lh/j5tlQ==} + '@stylistic/eslint-plugin-ts@2.6.0': + resolution: {integrity: sha512-9ooVm+BRNqdyI/p10eKGAdbdLKU5lllc7mX4Xqp76hKDsh5cCxmZM6zMgK3CLKkYrW0RUunFORkg8dAnmc1qIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.40.0' - '@stylistic/eslint-plugin@2.6.0-beta.1': - resolution: {integrity: sha512-ff+7KkbtAzYzJvNH3MEtn+ImWMtoFkYowIakeFexMzDdurQHGu5wQ2D7YGc0jsM1/qnF2cxJ/ucVYQgeRZYH8g==} + '@stylistic/eslint-plugin@2.6.0': + resolution: {integrity: sha512-BYzdgwz/4WgDTGmkPMKXFLRBKnYNVnmgD4NDsDCGJulqLFLF6sW1gr6gAJSFnkxwsdhEg+GApF4m5e3OMDpd6g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.40.0' @@ -869,8 +843,8 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.0.0-alpha.40': - resolution: {integrity: sha512-yku4NjpP0UujYq8d1GWXYELpKYwuoESSgvXPd9uAiO24OszGxQhPsGWTe4fmZV05J47qILfaGANO9SCa9fEU0w==} + '@typescript-eslint/eslint-plugin@8.0.0': + resolution: {integrity: sha512-STIZdwEQRXAHvNUS6ILDf5z3u95Gc8jzywunxSNqX00OooIemaaNIA0vEgynJlycL5AjabYLLrIyHd4iazyvtg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -890,8 +864,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.0.0-alpha.40': - resolution: {integrity: sha512-cjIgiaxmGtjlA6rRSs0Gsh0mWR08kPv1W+HsrZcuFwWxoGavBZPKtNctXND0NVf6MgSKyIcd4AHqBwE0htp5uw==} + '@typescript-eslint/parser@8.0.0': + resolution: {integrity: sha512-pS1hdZ+vnrpDIxuFXYQpLTILglTjSYJ9MbetZctrUawogUsPdz31DIIRZ9+rab0LhYNTsk88w4fIzVheiTbWOQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -904,24 +878,16 @@ packages: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@7.15.0': - resolution: {integrity: sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@7.18.0': resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.0.0-alpha.40': - resolution: {integrity: sha512-KQL502sCGZW+dYvxIzF6rEozbgppN0mBkYV6kT8ciY5OtFIRlLDTP7NdVAMMDk7q35T7Ad8negaQ9AGpZ8+Y5w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.0.0-alpha.58': - resolution: {integrity: sha512-bGgJXn8B3Pf3mzEOUQTPxEqhux54MOJSqw4HcgBReuP7dudz/hsN4TH9GqHbMXkFv8N4Ed1iqVRfgGeC8b1mGw==} + '@typescript-eslint/scope-manager@8.0.0': + resolution: {integrity: sha512-V0aa9Csx/ZWWv2IPgTfY7T4agYwJyILESu/PVqFtTFz9RIS823mAze+NbnBI8xiwdX3iqeQbcTYlvB04G9wyQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.0.0-alpha.40': - resolution: {integrity: sha512-/Aynkgxy3x22i6Zxy73MR/r0y1OELOMC9Atn7MO97NsjBOrQQYJHi/UEklZ423aB8SCkYH34lO6EAzXX/lIN3g==} + '@typescript-eslint/type-utils@8.0.0': + resolution: {integrity: sha512-mJAFP2mZLTBwAn5WI4PMakpywfWFH5nQZezUQdSKV23Pqo6o9iShQg1hP2+0hJJXP2LnZkWPphdIq4juYYwCeg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -933,20 +899,12 @@ packages: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@7.15.0': - resolution: {integrity: sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@7.18.0': resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.0.0-alpha.40': - resolution: {integrity: sha512-44mUq4VZVydxNlOM8Xtp/BXDkyfuvvjgPIBf7vRQDutrLDeNS0pJ9pcSloSbop5MwKLfJjBU+PbwnJPQM+DWNg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.0.0-alpha.58': - resolution: {integrity: sha512-6+jM4y31a6pwKeV3MVQuVXPZl6d3I1ySMvP5WjZdZ+n57uovMvasZ3ZJstXngoRpa7JtkjVZ7NrMhQ1J8dxKCQ==} + '@typescript-eslint/types@8.0.0': + resolution: {integrity: sha512-wgdSGs9BTMWQ7ooeHtu5quddKKs5Z5dS+fHLbrQI+ID0XWJLODGMHRfhwImiHoeO2S5Wir2yXuadJN6/l4JRxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -958,15 +916,6 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@7.15.0': - resolution: {integrity: sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@7.18.0': resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -976,8 +925,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.0.0-alpha.40': - resolution: {integrity: sha512-bz1rX5GXvGdx686FghDxPqGwgntlseZCQSRrVGDDOZlLSoWJnbfkzxXGOWch9c3ttcGkdFy/DiCyKKga3hrq0g==} + '@typescript-eslint/typescript-estree@8.0.0': + resolution: {integrity: sha512-5b97WpKMX+Y43YKi4zVcCVLtK5F98dFls3Oxui8LbnmRsseKenbbDinmvxrWegKDMmlkIq/XHuyy0UGLtpCDKg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -985,35 +934,14 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.0.0-alpha.58': - resolution: {integrity: sha512-hm4nsoJnQcA7axMopUJrH7CD0MJhAMtE2zQt65uMFCy+U2YDdKPwE0g6qEAUBoKn6UBLQJWthJgUmwDbWrnwZg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@7.15.0': - resolution: {integrity: sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - '@typescript-eslint/utils@7.18.0': resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@8.0.0-alpha.40': - resolution: {integrity: sha512-ijxO1Hs3YWveuWK+Vbt25D05Q41UeK08JwEJbWTzV38LmkdCBktQd7X1sTw4W9Qku692HWuHgesZf6OhC8t3aA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - - '@typescript-eslint/utils@8.0.0-alpha.58': - resolution: {integrity: sha512-lZuGnpK23jr3huebgY4/qqrOKsWJ8dX0Q1Fo4oVYcyAy+sK6p+6nObK4VEPJG098gUmrriiavRiDKIhPDFm4Ig==} + '@typescript-eslint/utils@8.0.0': + resolution: {integrity: sha512-k/oS/A/3QeGLRvOWCg6/9rATJL5rec7/5s1YmdS0ZU6LHveJyGFwBvLhSRBv6i9xaj7etmosp+l+ViN1I9Aj/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1022,20 +950,12 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@7.15.0': - resolution: {integrity: sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@7.18.0': resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.0.0-alpha.40': - resolution: {integrity: sha512-y1stojSPb5D3M8VlGGpaiBU5XxGLe+sPuW0YbLe09Lxvo4AwKGvhAr5lhqJZo4z6qHNz385+6+BS63+qIQdYLw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.0.0-alpha.58': - resolution: {integrity: sha512-V//E9PRY2216kh9fN/ihRvTtjpobAXEtmrsr3utlVUwHa2iklcofq1J12yl3KOjx9QBRfBrtfQnYaeruF7L0Fw==} + '@typescript-eslint/visitor-keys@8.0.0': + resolution: {integrity: sha512-oN0K4nkHuOyF3PVMyETbpP5zp6wfyOvm7tWhTMfoqxSSsPmJIh6JNASuZDlODE8eE+0EB9uar+6+vxr9DBTYOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/vfs@1.5.0': @@ -1044,89 +964,89 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@unocss/astro@0.61.8': - resolution: {integrity: sha512-79xWWbi5bPWTnL7NLH2bHzRF3RSdPkEAE85BpgxYn9uXfLkv+QEdmMVY9FJsaiIjwoDZodoTMVR7pJPMq7EXlA==} + '@unocss/astro@0.61.9': + resolution: {integrity: sha512-adOXz4itYHxqhvQgJHlEU58EHDTtY2qrcEPVmQVk4qI1W+ezQV6nQMQvti8mS/HbFw3MOJhIY1MlJoZK36/cyw==} peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 peerDependenciesMeta: vite: optional: true - '@unocss/cli@0.61.8': - resolution: {integrity: sha512-e+eQIoMAUcf+hXvHpARz3eAvjlDFcDUmRyoGHHfGyW9ko8ANKJZmyLyzjIHco7Ncg68rGqU/fZUMRYSMTZFulw==} + '@unocss/cli@0.61.9': + resolution: {integrity: sha512-W5pN2cOKAOkeKKXMqsGD/J7dpEAmxODtOH2Afjk41qsjqUlzGlUbmgG9PjAz7TDHrAmvuf3nvmMeeT3fii2UFg==} engines: {node: '>=14'} hasBin: true - '@unocss/config@0.61.8': - resolution: {integrity: sha512-q+QlX+X4kkKwOWCR+CEWzMdLJhC+m+MsbL7BI+KNE25ntoDTVEaN2AhC8T4lznlPc04ykKl/U8VxVCju9m0Y/A==} + '@unocss/config@0.61.9': + resolution: {integrity: sha512-ATvZEFMQiW3/oUaaplVMBYuagEELtnLbHSYH4pUGbJ5MALAfV98mZRyk4FkKkYoMYqWLGdCylzpgMPFDOuFQlQ==} engines: {node: '>=14'} - '@unocss/core@0.61.8': - resolution: {integrity: sha512-WFCJVGrhyNyF5i2SBTO3vR9HE+hMi7aP+e3VpAkveiqoCh3QBm2AeoEGUGpBPTLTZpb7AhcqOkRPiPeYk3+z+A==} + '@unocss/core@0.61.9': + resolution: {integrity: sha512-2W1YZQIWXcueGdbXU/ZCqn/8yQhWk8e8kAHFkVlbc9rictkd2UmPB9nIZ8Ii1tMwt6F0TT6vfHbLJEGCV08o2g==} - '@unocss/extractor-arbitrary-variants@0.61.8': - resolution: {integrity: sha512-4vFExQhUBNWtrZS7jOYJrX9VzNLE6ynUFK+W1E5NJpozQqHbzFvbNYT5KC6+IMzmWPQQswd2ktMuDQwL+C1Qpg==} + '@unocss/extractor-arbitrary-variants@0.61.9': + resolution: {integrity: sha512-ii42/hKbhgeBBOy86729t6/HeGmxUcHM8FprPeb/v/DfYsCkjDvMYVynX3FN/K5pR2WV+HHp6TQS7GbTmRIN0g==} - '@unocss/inspector@0.61.8': - resolution: {integrity: sha512-e6xuMkJB3CHp/fr6uzU3lJjkvhQiMmiiwIDhWnDDZV7VMNbvqlULijhEwu4A1Y/SKAsSMQMqLGioND7W9xZuvA==} + '@unocss/inspector@0.61.9': + resolution: {integrity: sha512-kUcQ/h8/yAfkqL2eCGVFyB0IGSPdR0dx2HH4V+mdSMfd8yKFR/BQys3mBvqZwSZu5a0+iisFHHq9wr+/I5DtHQ==} - '@unocss/postcss@0.61.8': - resolution: {integrity: sha512-0ZIIwLXBQv5cLOXDHJfN+VaJkZlh18i7dzG5+wI1FlGEYBckL7/4oeV4MJX0NAV7l03AzMEbChsIv+MMPZEGOQ==} + '@unocss/postcss@0.61.9': + resolution: {integrity: sha512-HuFE/TUH6tt5f/AwiKNhQ/FO/lvFeW0JHPkx9SCURcKKoD3rpJUbhTqVv7c0zlCVQnRFX0hxpimoetp5Dh8qdA==} engines: {node: '>=14'} peerDependencies: postcss: ^8.4.21 - '@unocss/preset-attributify@0.61.8': - resolution: {integrity: sha512-p0eo9m1UfUw0O1usBsYDRQErjpvPKwHpuBlJc+No4zXz5b+0+hCFg1QuzT9fqpAZh1YfqJUNeLhu02Mao0cPOg==} + '@unocss/preset-attributify@0.61.9': + resolution: {integrity: sha512-AHlEF7PiIBz1jHZZ62+AZ1u5ITrPNL/mgN8XyKwocoAr9HH8aQ3xzUgIuEX6vfV4a8rTdawffY99BQ12msePWQ==} - '@unocss/preset-icons@0.61.8': - resolution: {integrity: sha512-dOMtDCVCQJgMas8gjAXeE0AtzfUJlvpdqFDmoScf66N8pmWFkcWa1VWW3uUtUJjirjWRn0OVW7fpMvMcwbmSxg==} + '@unocss/preset-icons@0.61.9': + resolution: {integrity: sha512-5XZO511ksu3EVwpV2nIZKa5NzyJAb+JARKaUpQIXssHUVdRKk5nJYr1XtrpBDLgB6VEf/1skViLEa1bpOUI5Wg==} - '@unocss/preset-mini@0.61.8': - resolution: {integrity: sha512-woLvWUn9hgR8+UOk9KGA7bjIFq2WrGgw5KyYnA0uZ27yFtwkvaAq3FZ7voKF5mdNnhepnDL8mw8IgnaQnDRiAg==} + '@unocss/preset-mini@0.61.9': + resolution: {integrity: sha512-qhagWfdM7ytRWf4wFfrAcdeCUCVD9wDVrM+9evAmuOnMXWEiVZCjfwhjjFu+8lM7g+38n+gi7VcrNuTiZ8fHBA==} - '@unocss/preset-tagify@0.61.8': - resolution: {integrity: sha512-zcXfc/WYayrWU1fksSQQhcKC/HeW9pDZYfAgYbXBf2oliNkEcI1uvtDtXBTiGOpPad738oagF4BSd6Qs698ESA==} + '@unocss/preset-tagify@0.61.9': + resolution: {integrity: sha512-E+54+uSe+btOnQDlh8XjDUXhwxJd6/TL/8Rdl+7Pg6m+JNXudEt7xOd81L/KlDPD2tYYH9g/dQUaDN5aJyfRPQ==} - '@unocss/preset-typography@0.61.8': - resolution: {integrity: sha512-qkoC59R69evxNokNorED2qGzqq/tnBNlT7A7lAy4ZGehmePWNU/3zohyHp7i2/NEra+fkzsrUCTw/2UctJ1vkg==} + '@unocss/preset-typography@0.61.9': + resolution: {integrity: sha512-ZDoRViHtzI1Ny0sZyjajeCGEdFQCBn5CeIYgxO/KCpN107KTGLnYfoabv0gHtj/qaeAh30obeOMxZaIuxYoW3Q==} - '@unocss/preset-uno@0.61.8': - resolution: {integrity: sha512-+7mK5sTEk0KvMf/Phw2QqfL3WxuwK4Drz7BLGD8bzHZAJWLMUDifbcERM2b9rbZWdJW8yhwxI7PXa+q/2Ww0PA==} + '@unocss/preset-uno@0.61.9': + resolution: {integrity: sha512-N4R/BCMphrHvAMZ+qgR/FPoh724uXDuZ/1DEGuirUQJMg7makqrI6czL+P99q1bP8nWzxWEXiRXnKKLiyD9pJw==} - '@unocss/preset-web-fonts@0.61.8': - resolution: {integrity: sha512-N4NIP2S4a2b0pThP9F9vxcBL4rujDEWIXU7T3BVZki2endLJoZvEX2un5l+WHUfewlVojIjUYex8FIiQQ+9oTA==} + '@unocss/preset-web-fonts@0.61.9': + resolution: {integrity: sha512-fjQv74+FiAvGJM5vSLkD15Taku0cbi5F7qAr5T85EIQOpUB1fiH2kPoXIOT1WS2lKbQZh6pNGBxLrbBRgnVPew==} - '@unocss/preset-wind@0.61.8': - resolution: {integrity: sha512-rYUBzRKAPN1+x57u4NFH+wTp26hI/8barFoI440d24Z5IhGq5Amtjmi5WJpZ5wDTbOdresgpp+Fbbaan+7MhSw==} + '@unocss/preset-wind@0.61.9': + resolution: {integrity: sha512-AzbjJrNL9Rb2BzTiREyssd8v7KFVVLERQ/PNILGzo6yYelYMl4AhKXZ3jgxWEsIABArVa3UkGBigG4h/L+2JHA==} - '@unocss/reset@0.61.8': - resolution: {integrity: sha512-tG2FhdT3OXDM+tLZj9vXKlloHYxeXVxLR5TKpNjD/WQr4p6/xUFKGHvNfLHpiz4EsXLugEn0prqTxASB4c5gNg==} + '@unocss/reset@0.61.9': + resolution: {integrity: sha512-A1KtJiFgLM0N3FqJ9r5M3mVULcwsn+14tq5WkvSPF9ik3zQeJh8/NhxKdJImWClwBOzn795NQFXXFB70Ja+2RA==} - '@unocss/rule-utils@0.61.8': - resolution: {integrity: sha512-Sz4JTTOoXX32Dq+T3U761RIHsf+VCnrw/mKSqbn6XUruxivFBr80YC22dKxawzRjBHGdUAIGDRv38ZKgui+4KA==} + '@unocss/rule-utils@0.61.9': + resolution: {integrity: sha512-54Hw0nF+3ga70ETo3kes4He62wdsB4dHMgEiD/DEmJzyVY3ZuG/sIVAgkxjMQDo5w4SSYU/Ys1QaY+IQmeJHFQ==} engines: {node: '>=14'} - '@unocss/scope@0.61.8': - resolution: {integrity: sha512-m8A3gmcYlWs3NIRhEAunfibnkdR05xBessusmXndHSgL4/Fyeo/P2TNaFbEACXOm7Q7wjzi0+q0DnOp876uLLg==} + '@unocss/scope@0.61.9': + resolution: {integrity: sha512-a9/vdg7YTFZEnJSaJBh/GqkLokYh3ZjEd3gHUxl/TZDSkGOz3WnkR2h+lgaLZm9MJ7RlSvJxYP8ySezH7jU1Pw==} - '@unocss/transformer-attributify-jsx-babel@0.61.8': - resolution: {integrity: sha512-SL+1bryAX1G3fSBTN7naEgAFjm0W4xHx2eTj8r1LVWIMjDL02y1RtLC/sVJdU3jkUvzhtgcNEx/YpxwQCD3aSw==} + '@unocss/transformer-attributify-jsx-babel@0.61.9': + resolution: {integrity: sha512-+fojHVJhA2MVd3VTCjlEKXf8Vnoy4N+lEl0CrYOD+im44sH5CWogm0RWs9rbeemy1uel6NI1wkP4xTfIA4vEgQ==} - '@unocss/transformer-attributify-jsx@0.61.8': - resolution: {integrity: sha512-zecigX25BGPKEMiz42N2cL1Cp60iEUFC33VEOre9C+aotf6drKCHDB3cobAuvYxgKczeYoBSXwixkE1dixdBuA==} + '@unocss/transformer-attributify-jsx@0.61.9': + resolution: {integrity: sha512-tKZpZ64Lr6/CX96PhDtKEsqWDo1qjtswEulzIDLxpS90SMyann3azTs6mSuOwGbkbwc4gaJe6H38eCNos0ZqHg==} - '@unocss/transformer-compile-class@0.61.8': - resolution: {integrity: sha512-3EWjP+8oVIHx37GU122VV7FBqK3Ig2eZpTIo1/HSdOyex7G2Arz+7ZMhTUETVn398LukC0wfDI+P19YfM2erfA==} + '@unocss/transformer-compile-class@0.61.9': + resolution: {integrity: sha512-jezMpssFJGIaZNE/rw5U+9Rk1RoDrZqXZokRkqt4tamEn1SiXjRMPWoE/hLg5Kw4oybxwCXTuAk2OsD+kTb7iA==} - '@unocss/transformer-directives@0.61.8': - resolution: {integrity: sha512-pXjnvscGtLXCLs2lXwMxd9JtYh20SHTl4qPrSV9JOQGYSnytLFVnUUwIa4K1NV/fX7CFJsAn6UDEZziaSuO2qQ==} + '@unocss/transformer-directives@0.61.9': + resolution: {integrity: sha512-e4uIbHYdAYJSVpvxOv6kAsyI18X3gHkBsmBYWcUlPLVv+8tYo4eZtc0rn6ZvpiLzkFywG9e9cmpqVQwOR6pBVg==} - '@unocss/transformer-variant-group@0.61.8': - resolution: {integrity: sha512-KSW2llbc/epl8iI+GRuVFt3+EagKj7sFVAa8Qpm9hsqq94gsDXNTlTVbK5sesJ++wdsjRCAccU1pl0rkr2lGRQ==} + '@unocss/transformer-variant-group@0.61.9': + resolution: {integrity: sha512-iewADYlY0LoeCb80E/4feHVSCKHl+QzGH4xUvW0zU85evMqNOa0/t0dCIoEG22wr/9piyEsg6OdHprZ2QliYqg==} - '@unocss/vite@0.61.8': - resolution: {integrity: sha512-CWv0VFXoghQbuXXbeiVUyoiJv9Yc7BgH/ZuDY1mHJcXfB4h0nk2g1ImoXjMPUpzgwckoII2dJaREG2qXOI2HYw==} + '@unocss/vite@0.61.9': + resolution: {integrity: sha512-hP/sL9rq1DvVCbSSx05m+bwYqen1nHm9tW6elKFkfV7X5jBUywu24WRq551NZI33KmgHA525ApX++DSWye+0uw==} peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 @@ -1146,26 +1066,26 @@ packages: '@vue/compiler-core@3.4.34': resolution: {integrity: sha512-Z0izUf32+wAnQewjHu+pQf1yw00EGOmevl1kE+ljjjMe7oEfpQ+BI3/JNK7yMB4IrUsqLDmPecUrpj3mCP+yJQ==} - '@vue/compiler-core@3.5.0-alpha.4': - resolution: {integrity: sha512-zoA8vLZubb+xMvB3Kgk5EhQNEVgkz6DifMHW6IVFhy6M5hWcVuTJR+AGq5ifEx92lPUcr1vrz31YGY+2mEvmag==} + '@vue/compiler-core@3.5.0-alpha.5': + resolution: {integrity: sha512-Ey7t5nvWl2nmaDt5vOeMlOwpLiH1yZ4QGH2d+xACm8/TSusiCPHiTBIwkE6B4IXqQPv1Ry7cJbLbeyAIYH/jHw==} '@vue/compiler-dom@3.4.34': resolution: {integrity: sha512-3PUOTS1h5cskdOJMExCu2TInXuM0j60DRPpSCJDqOCupCfUZCJoyQmKtRmA8EgDNZ5kcEE7vketamRZfrEuVDw==} - '@vue/compiler-dom@3.5.0-alpha.4': - resolution: {integrity: sha512-5v3yrGLxR2Z44clbAWqDqxJBuZz0ZM11wiarV30QzjrHUI0mjr6zFRoAef9GlObfh3igkcWE6QMwCpw+tYOOYg==} + '@vue/compiler-dom@3.5.0-alpha.5': + resolution: {integrity: sha512-4gevEN4aEs0iFmFDUXX7oQWTLulNsF+ep5OcAnPa0xA2aal+qW8vSCpOdtnEXbtP1rrux48CBqSvend33eO25w==} '@vue/compiler-sfc@3.4.34': resolution: {integrity: sha512-x6lm0UrM03jjDXTPZgD9Ad8bIVD1ifWNit2EaWQIZB5CULr46+FbLQ5RpK7AXtDHGjx9rmvC7QRCTjsiGkAwRw==} - '@vue/compiler-sfc@3.5.0-alpha.4': - resolution: {integrity: sha512-lQP0deRwcHwsZtSBCiB7oGRmjzH0p7HPQsAlFRqVB1fkLtqGWh8Llwd3pSTm8l1/oXb/4OwBS9ykbFW4MZDG5A==} + '@vue/compiler-sfc@3.5.0-alpha.5': + resolution: {integrity: sha512-A8pErWdOwG63qLeaz5Qnz810jdd7JkPf7LdUux4c19ZgPaKBkbD0PRSsuEAkUo81MSJ8YUx5EypQyipWJThqgQ==} '@vue/compiler-ssr@3.4.34': resolution: {integrity: sha512-8TDBcLaTrFm5rnF+Qm4BlliaopJgqJ28Nsrc80qazynm5aJO+Emu7y0RWw34L8dNnTRdcVBpWzJxhGYzsoVu4g==} - '@vue/compiler-ssr@3.5.0-alpha.4': - resolution: {integrity: sha512-O/2EChIkkB4Fdcu7nVY6BDvVWnU3PoxIh8ZGFwnL0XuTlwdFxtXTyqvxXXhQ5XbcW5SxMGijp9g++P6m9TA6Gg==} + '@vue/compiler-ssr@3.5.0-alpha.5': + resolution: {integrity: sha512-XuvOD6v1iAtyA3i+innnsTpWGwOLfjNa85R6gF5juJAJEk32/hF2ccUhwoUTVpoCEVhidYUYnWEUHoDmMjivWg==} '@vue/devtools-api@7.3.5': resolution: {integrity: sha512-BSdBBu5hOIv+gBJC9jzYMh5bC27FQwjWLSb8fVAniqlL9gvsqvK27xTgczMf+hgctlszMYQnRm3bpY/j8vhPqw==} @@ -1187,30 +1107,30 @@ packages: '@vue/reactivity@3.4.34': resolution: {integrity: sha512-ua+Lo+wBRlBEX9TtgPOShE2JwIO7p6BTZ7t1KZVPoaBRfqbC7N3c8Mpzicx173fXxx5VXeU6ykiHo7WgLzJQDA==} - '@vue/reactivity@3.5.0-alpha.4': - resolution: {integrity: sha512-qJtb2CrcpVIvEnIVUatUehllWPf7NNRikwAnIauif/cBRukxUESxJyUuNW8tNNBKIetXc+/8QGwWaGc6py2tlw==} + '@vue/reactivity@3.5.0-alpha.5': + resolution: {integrity: sha512-UfFZdZ1odkzuoZnNRJgFqfhsb6rOYNxRGrag+6LDh8OmA0FHUVooOUz4N31IUTpmXp/lGocf25FCxXP0uCrsSA==} '@vue/runtime-core@3.4.34': resolution: {integrity: sha512-PXhkiRPwcPGJ1BnyBZFI96GfInCVskd0HPNIAZn7i3YOmLbtbTZpB7/kDTwC1W7IqdGPkTVC63IS7J2nZs4Ebg==} - '@vue/runtime-core@3.5.0-alpha.4': - resolution: {integrity: sha512-49esFddSTf1Uk9f/dQ016LgFVhXgWl9HiAjmt7htWmsU1Rs0qoPRBNdnFMFSUp01m+Tb6C5tyxttOlRXnUbxow==} + '@vue/runtime-core@3.5.0-alpha.5': + resolution: {integrity: sha512-IVwnGfCiriz1/55R7q208dws3iLMdR+3cSbODqjQhai770hDjadrcM3bhWkoTUR2qV5rcqzXAc/0+6B4GU54yQ==} '@vue/runtime-dom@3.4.34': resolution: {integrity: sha512-dXqIe+RqFAK2Euak4UsvbIupalrhc67OuQKpD7HJ3W2fv8jlqvI7szfBCsAEcE8o/wyNpkloxB6J8viuF/E3gw==} - '@vue/runtime-dom@3.5.0-alpha.4': - resolution: {integrity: sha512-OHal4G5ncZ8YzRmF00rP59gmpB+nEOxyhkwhtcQ9PYCFwnXJtO4OlpSyJv2PClcrLHrcVFnKNF8oTfjEg6H4cg==} + '@vue/runtime-dom@3.5.0-alpha.5': + resolution: {integrity: sha512-5tAp7JPm5x1rf1HLTKJka4jEuV1dfa82304FDOMNYhFJVN8ZG9pHdMI10y2tsH9Kv28ffMFXFX2l3t2/PdQ4eQ==} '@vue/server-renderer@3.4.34': resolution: {integrity: sha512-GeyEUfMVRZMD/mZcNONEqg7MiU10QQ1DB3O/Qr6+8uXpbwdlmVgQ5Qs1/ZUAFX1X2UUtqMoGrDRbxdWfOJFT7Q==} peerDependencies: vue: 3.4.34 - '@vue/server-renderer@3.5.0-alpha.4': - resolution: {integrity: sha512-ixmcBgt2HRifD+Ug7FU8yoBxzABBjgd85f3+HI1f9uwheeqNt0ZM1daCwZm9s9A84mbqcjdYr3y3TvG6LQsFkQ==} + '@vue/server-renderer@3.5.0-alpha.5': + resolution: {integrity: sha512-gaFeIyREVGA0znLgH2tbT/bMKu1tW7xdCMcIL627d8O6bNVlCA4vfv9UTzx/zObyCGnrKw47TzYyDQujy37Y3A==} peerDependencies: - vue: 3.5.0-alpha.4 + vue: 3.5.0-alpha.5 '@vue/shared@3.4.27': resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} @@ -1218,8 +1138,8 @@ packages: '@vue/shared@3.4.34': resolution: {integrity: sha512-x5LmiRLpRsd9KTjAB8MPKf0CDPMcuItjP0gbNqFCIgL1I8iYp4zglhj9w9FPCdIbHG2M91RVeIbArFfFTz9I3A==} - '@vue/shared@3.5.0-alpha.4': - resolution: {integrity: sha512-HnZ0pSThWLDwu+SlLQbSpK14mzMrr1pgLlPwggJ46rYWutqAmlJQYaJG1Fhpmz7ZESg1QyOkxL+Canrc03XfvA==} + '@vue/shared@3.5.0-alpha.5': + resolution: {integrity: sha512-yJocICWJRB5vwMMg3DHXrm7x4igmNCBY/gkCVhkpfVudLixLsuIBCd4oi+7qeq3THfYAlSSxr+WTEuabPlPNwg==} '@vueuse/core@10.11.0': resolution: {integrity: sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==} @@ -1392,11 +1312,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - browserslist@4.23.2: resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -1435,9 +1350,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001629: - resolution: {integrity: sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw==} - caniuse-lite@1.0.30001644: resolution: {integrity: sha512-YGvlOZB4QhZuiis+ETS0VXR+MExbFf4fZYYeMTEE0aTQd/RdIjkTyZjLrbYVKnHzppDvnOhritRVv+i7Go6mHw==} @@ -1476,8 +1388,8 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - chromium-bidi@0.6.2: - resolution: {integrity: sha512-4WVBa6ijmUTVr9cZD4eicQD8Mdy/HCX3bzEIYYpmk0glqYLoWH+LqQEvV9RpDRzoQSbY1KJHloYXbDMXMbDPhg==} + chromium-bidi@0.6.3: + resolution: {integrity: sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==} peerDependencies: devtools-protocol: '*' @@ -1670,9 +1582,6 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - electron-to-chromium@1.4.793: - resolution: {integrity: sha512-eGGzOCtlwNLVoMgOAXKLvesX6X7HM/KMJ+3x/yjcCBbZfpFhQvZUFvhnHxJT3jHJ8RpstR5npd0krWLPTCoh0g==} - electron-to-chromium@1.5.3: resolution: {integrity: sha512-QNdYSS5i8D9axWp/6XIezRObRHqaav/ur9z1VzCDUCH1XIFOr9WQk5xmgunhsTpjjgDy3oLxO/WMOVZlpUQrlA==} @@ -1712,10 +1621,6 @@ packages: engines: {node: '>=12'} hasBin: true - escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -1804,8 +1709,8 @@ packages: peerDependencies: eslint: ^8.56.0 || ^9.0.0-0 - eslint-plugin-jsdoc@48.10.1: - resolution: {integrity: sha512-dxV7ytazLW9CdPahds07FljQ960vLQG65mUnFi8/6Pc6u6miCZNGYrnKVHrnnrcj+LikhiKAayjrUiNttzRMEg==} + eslint-plugin-jsdoc@48.10.2: + resolution: {integrity: sha512-xTkf/MmEeVrTbezc6kDqCJmK9RcseIKo8X4oyoDCMvV4LY8dqrQi8kmfRrv9n0gNBkCclevaOh2Lkmu6Fs8SLg==} engines: {node: '>=18'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -2893,12 +2798,12 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@22.14.0: - resolution: {integrity: sha512-rl4tOY5LcA3e374GAlsGGHc05HL3eGNf5rZ+uxkl6id9zVZKcwcp1Z+Nd6byb6WPiPeecT/dwz8f/iUm+AZQSw==} + puppeteer-core@22.15.0: + resolution: {integrity: sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==} engines: {node: '>=18'} - puppeteer@22.14.0: - resolution: {integrity: sha512-MGTR6/pM8zmWbTdazb6FKnwIihzsSEXBPH49mFFU96DNZpQOevCAZMnjBZGlZRGRzRK6aADCavR6SQtrbv5dQw==} + puppeteer@22.15.0: + resolution: {integrity: sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q==} engines: {node: '>=18'} hasBin: true @@ -3335,11 +3240,11 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - unocss@0.61.8: - resolution: {integrity: sha512-N7uq3NxLd5RZ3olnXWumg3FkouLa4+NacxvC4FE+kBHRZ1bA+J+ze6yqhsOqiAgv7jACjtvQEHeSToE422OvCg==} + unocss@0.61.9: + resolution: {integrity: sha512-D7nEObT1lhCUwXU5MoQ2Msh5S5g1EHVVSqDNM2ODs6dqWSboDCsRTPZQiyQmV9vCobrjYcvAFno9ZAgO7pvurw==} engines: {node: '>=14'} peerDependencies: - '@unocss/webpack': 0.61.8 + '@unocss/webpack': 0.61.9 vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 peerDependenciesMeta: '@unocss/webpack': @@ -3404,12 +3309,6 @@ packages: resolution: {integrity: sha512-Egkr/s4zcMTEuulcIb7dgURS6QpN7DyqQYdf+jBtiaJvQ+eRsrtWUoX84SbvQWuLkXsOjM+8sJC9u6KoMK/U7Q==} hasBin: true - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - update-browserslist-db@1.1.0: resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true @@ -3541,8 +3440,8 @@ packages: typescript: optional: true - vue@3.5.0-alpha.4: - resolution: {integrity: sha512-uzQp71mYYFaO7+oqIdD+AcpB4W3SjRDx7lJN4u8PCOcXnQKZQcZ201jC2YmMpvaiskguAtzC6C5PJ4uKBlDeNA==} + vue@3.5.0-alpha.5: + resolution: {integrity: sha512-PH56EmpV7jvXZG67rBnp6cHxa/83QYAUOXVed4o4w35qaUrPE78/99k/da3xHX4NIejc5jGDCdAt+ttcOJWxJQ==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -3727,13 +3626,13 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@antfu/eslint-config@2.24.0(@vue/compiler-sfc@3.5.0-alpha.4)(eslint-plugin-format@0.1.2(eslint@9.8.0))(eslint@9.8.0)(typescript@5.3.3)': + '@antfu/eslint-config@2.24.1(@vue/compiler-sfc@3.5.0-alpha.5)(eslint-plugin-format@0.1.2(eslint@9.8.0))(eslint@9.8.0)(typescript@5.3.3)': dependencies: '@antfu/install-pkg': 0.3.3 '@clack/prompts': 0.7.0 - '@stylistic/eslint-plugin': 2.6.0-beta.1(eslint@9.8.0)(typescript@5.3.3) - '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3) - '@typescript-eslint/parser': 8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3) + '@stylistic/eslint-plugin': 2.6.0(eslint@9.8.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3) + '@typescript-eslint/parser': 8.0.0(eslint@9.8.0)(typescript@5.3.3) eslint: 9.8.0 eslint-config-flat-gitignore: 0.1.8 eslint-flat-config-utils: 0.3.0 @@ -3742,7 +3641,7 @@ snapshots: eslint-plugin-command: 0.2.3(eslint@9.8.0) eslint-plugin-eslint-comments: 3.2.0(eslint@9.8.0) eslint-plugin-import-x: 3.1.0(eslint@9.8.0)(typescript@5.3.3) - eslint-plugin-jsdoc: 48.10.1(eslint@9.8.0) + eslint-plugin-jsdoc: 48.10.2(eslint@9.8.0) eslint-plugin-jsonc: 2.16.0(eslint@9.8.0) eslint-plugin-markdown: 5.1.0(eslint@9.8.0) eslint-plugin-n: 17.10.1(eslint@9.8.0) @@ -3751,11 +3650,11 @@ snapshots: eslint-plugin-regexp: 2.6.0(eslint@9.8.0) eslint-plugin-toml: 0.11.1(eslint@9.8.0) eslint-plugin-unicorn: 55.0.0(eslint@9.8.0) - eslint-plugin-unused-imports: 4.0.1(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0) - eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3) + eslint-plugin-unused-imports: 4.0.1(@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0) + eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3) eslint-plugin-vue: 9.27.0(eslint@9.8.0) eslint-plugin-yml: 1.14.0(eslint@9.8.0) - eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.5.0-alpha.4)(eslint@9.8.0) + eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.5.0-alpha.5)(eslint@9.8.0) globals: 15.8.0 jsonc-eslint-parser: 2.4.0 local-pkg: 0.5.0 @@ -3805,20 +3704,13 @@ snapshots: '@babel/traverse': 7.25.2 '@babel/types': 7.25.2 convert-source-map: 2.0.0 - debug: 4.3.5 + debug: 4.3.6 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.24.7': - dependencies: - '@babel/types': 7.25.2 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - '@babel/generator@7.25.0': dependencies: '@babel/types': 7.25.2 @@ -3859,16 +3751,12 @@ snapshots: '@babel/helper-function-name@7.24.7': dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.25.2 - - '@babel/helper-hoist-variables@7.24.7': - dependencies: + '@babel/template': 7.25.0 '@babel/types': 7.25.2 '@babel/helper-member-expression-to-functions@7.24.7': dependencies: - '@babel/traverse': 7.24.7 + '@babel/traverse': 7.25.2 '@babel/types': 7.25.2 transitivePeerDependencies: - supports-color @@ -3880,17 +3768,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -3925,7 +3802,7 @@ snapshots: '@babel/helper-skip-transparent-expression-wrappers@7.24.7': dependencies: - '@babel/traverse': 7.24.7 + '@babel/traverse': 7.25.2 '@babel/types': 7.25.2 transitivePeerDependencies: - supports-color @@ -3938,8 +3815,6 @@ snapshots: '@babel/helper-validator-identifier@7.24.7': {} - '@babel/helper-validator-option@7.24.7': {} - '@babel/helper-validator-option@7.24.8': {} '@babel/helpers@7.25.0': @@ -3971,7 +3846,7 @@ snapshots: '@babel/plugin-transform-modules-commonjs@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.24.7(@babel/core@7.25.2) + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-simple-access': 7.24.7 transitivePeerDependencies: @@ -3991,7 +3866,7 @@ snapshots: dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-validator-option': 7.24.7 + '@babel/helper-validator-option': 7.24.8 '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.25.2) @@ -4001,33 +3876,12 @@ snapshots: '@babel/standalone@7.23.3': optional: true - '@babel/template@7.24.7': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.0 - '@babel/types': 7.25.2 - '@babel/template@7.25.0': dependencies: '@babel/code-frame': 7.24.7 '@babel/parser': 7.25.0 '@babel/types': 7.25.2 - '@babel/traverse@7.24.7': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-function-name': 7.24.7 - '@babel/helper-hoist-variables': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.25.0 - '@babel/types': 7.25.2 - debug: 4.3.5 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - '@babel/traverse@7.25.2': dependencies: '@babel/code-frame': 7.24.7 @@ -4035,7 +3889,7 @@ snapshots: '@babel/parser': 7.25.0 '@babel/template': 7.25.0 '@babel/types': 7.25.2 - debug: 4.3.5 + debug: 4.3.6 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -4091,7 +3945,7 @@ snapshots: dependencies: '@types/eslint': 8.56.10 '@types/estree': 1.0.5 - '@typescript-eslint/types': 7.15.0 + '@typescript-eslint/types': 7.18.0 comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 4.0.0 @@ -4240,7 +4094,7 @@ snapshots: '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.1': {} @@ -4260,7 +4114,7 @@ snapshots: '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jsdevtools/ez-spawn@3.0.4': dependencies: @@ -4332,7 +4186,7 @@ snapshots: '@puppeteer/browsers@2.3.0': dependencies: - debug: 4.3.5 + debug: 4.3.6 extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.4.0 @@ -4433,7 +4287,7 @@ snapshots: - supports-color - typescript - '@stylistic/eslint-plugin-js@2.6.0-beta.1(eslint@9.8.0)': + '@stylistic/eslint-plugin-js@2.6.0(eslint@9.8.0)': dependencies: '@types/eslint': 9.6.0 acorn: 8.12.1 @@ -4441,39 +4295,39 @@ snapshots: eslint-visitor-keys: 4.0.0 espree: 10.1.0 - '@stylistic/eslint-plugin-jsx@2.6.0-beta.1(eslint@9.8.0)': + '@stylistic/eslint-plugin-jsx@2.6.0(eslint@9.8.0)': dependencies: - '@stylistic/eslint-plugin-js': 2.6.0-beta.1(eslint@9.8.0) + '@stylistic/eslint-plugin-js': 2.6.0(eslint@9.8.0) '@types/eslint': 9.6.0 eslint: 9.8.0 estraverse: 5.3.0 picomatch: 4.0.2 - '@stylistic/eslint-plugin-plus@2.6.0-beta.1(eslint@9.8.0)(typescript@5.3.3)': + '@stylistic/eslint-plugin-plus@2.6.0(eslint@9.8.0)(typescript@5.3.3)': dependencies: '@types/eslint': 9.6.0 - '@typescript-eslint/utils': 8.0.0-alpha.58(eslint@9.8.0)(typescript@5.3.3) + '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.3.3) eslint: 9.8.0 transitivePeerDependencies: - supports-color - typescript - '@stylistic/eslint-plugin-ts@2.6.0-beta.1(eslint@9.8.0)(typescript@5.3.3)': + '@stylistic/eslint-plugin-ts@2.6.0(eslint@9.8.0)(typescript@5.3.3)': dependencies: - '@stylistic/eslint-plugin-js': 2.6.0-beta.1(eslint@9.8.0) + '@stylistic/eslint-plugin-js': 2.6.0(eslint@9.8.0) '@types/eslint': 9.6.0 - '@typescript-eslint/utils': 8.0.0-alpha.58(eslint@9.8.0)(typescript@5.3.3) + '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.3.3) eslint: 9.8.0 transitivePeerDependencies: - supports-color - typescript - '@stylistic/eslint-plugin@2.6.0-beta.1(eslint@9.8.0)(typescript@5.3.3)': + '@stylistic/eslint-plugin@2.6.0(eslint@9.8.0)(typescript@5.3.3)': dependencies: - '@stylistic/eslint-plugin-js': 2.6.0-beta.1(eslint@9.8.0) - '@stylistic/eslint-plugin-jsx': 2.6.0-beta.1(eslint@9.8.0) - '@stylistic/eslint-plugin-plus': 2.6.0-beta.1(eslint@9.8.0)(typescript@5.3.3) - '@stylistic/eslint-plugin-ts': 2.6.0-beta.1(eslint@9.8.0)(typescript@5.3.3) + '@stylistic/eslint-plugin-js': 2.6.0(eslint@9.8.0) + '@stylistic/eslint-plugin-jsx': 2.6.0(eslint@9.8.0) + '@stylistic/eslint-plugin-plus': 2.6.0(eslint@9.8.0)(typescript@5.3.3) + '@stylistic/eslint-plugin-ts': 2.6.0(eslint@9.8.0)(typescript@5.3.3) '@types/eslint': 9.6.0 eslint: 9.8.0 transitivePeerDependencies: @@ -4541,14 +4395,14 @@ snapshots: '@types/node': 20.9.1 optional: true - '@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3)': + '@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 8.0.0-alpha.40 - '@typescript-eslint/type-utils': 8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3) - '@typescript-eslint/utils': 8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 8.0.0-alpha.40 + '@typescript-eslint/parser': 8.0.0(eslint@9.8.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 8.0.0 + '@typescript-eslint/type-utils': 8.0.0(eslint@9.8.0)(typescript@5.3.3) + '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 8.0.0 eslint: 9.8.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -4571,13 +4425,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3)': + '@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.3.3)': dependencies: - '@typescript-eslint/scope-manager': 8.0.0-alpha.40 - '@typescript-eslint/types': 8.0.0-alpha.40 - '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 8.0.0-alpha.40 - debug: 4.3.5 + '@typescript-eslint/scope-manager': 8.0.0 + '@typescript-eslint/types': 8.0.0 + '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 8.0.0 + debug: 4.3.6 eslint: 9.8.0 optionalDependencies: typescript: 5.3.3 @@ -4589,31 +4443,21 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@7.15.0': - dependencies: - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/visitor-keys': 7.15.0 - '@typescript-eslint/scope-manager@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.0.0-alpha.40': + '@typescript-eslint/scope-manager@8.0.0': dependencies: - '@typescript-eslint/types': 8.0.0-alpha.40 - '@typescript-eslint/visitor-keys': 8.0.0-alpha.40 + '@typescript-eslint/types': 8.0.0 + '@typescript-eslint/visitor-keys': 8.0.0 - '@typescript-eslint/scope-manager@8.0.0-alpha.58': + '@typescript-eslint/type-utils@8.0.0(eslint@9.8.0)(typescript@5.3.3)': dependencies: - '@typescript-eslint/types': 8.0.0-alpha.58 - '@typescript-eslint/visitor-keys': 8.0.0-alpha.58 - - '@typescript-eslint/type-utils@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.3.3) - '@typescript-eslint/utils': 8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3) - debug: 4.3.5 + '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.3.3) + '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.3.3) + debug: 4.3.6 ts-api-utils: 1.3.0(typescript@5.3.3) optionalDependencies: typescript: 5.3.3 @@ -4623,13 +4467,9 @@ snapshots: '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@7.15.0': {} - '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.0.0-alpha.40': {} - - '@typescript-eslint/types@8.0.0-alpha.58': {} + '@typescript-eslint/types@8.0.0': {} '@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3)': dependencies: @@ -4645,77 +4485,36 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.15.0(typescript@5.3.3)': - dependencies: - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/visitor-keys': 7.15.0 - debug: 4.3.5 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.3.3) - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.3.3)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.5 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.3.3) - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.0.0-alpha.40(typescript@5.3.3)': - dependencies: - '@typescript-eslint/types': 8.0.0-alpha.40 - '@typescript-eslint/visitor-keys': 8.0.0-alpha.40 - debug: 4.3.5 + debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.2 + semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.3.3) optionalDependencies: typescript: 5.3.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.0.0-alpha.58(typescript@5.3.3)': + '@typescript-eslint/typescript-estree@8.0.0(typescript@5.3.3)': dependencies: - '@typescript-eslint/types': 8.0.0-alpha.58 - '@typescript-eslint/visitor-keys': 8.0.0-alpha.58 - debug: 4.3.5 + '@typescript-eslint/types': 8.0.0 + '@typescript-eslint/visitor-keys': 8.0.0 + debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.2 + semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.3.3) optionalDependencies: typescript: 5.3.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.15.0(eslint@9.8.0)(typescript@5.3.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.3.3) - eslint: 9.8.0 - transitivePeerDependencies: - - supports-color - - typescript - '@typescript-eslint/utils@7.18.0(eslint@9.8.0)(typescript@5.3.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) @@ -4727,23 +4526,12 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3)': + '@typescript-eslint/utils@8.0.0(eslint@9.8.0)(typescript@5.3.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - '@typescript-eslint/scope-manager': 8.0.0-alpha.40 - '@typescript-eslint/types': 8.0.0-alpha.40 - '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.3.3) - eslint: 9.8.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@8.0.0-alpha.58(eslint@9.8.0)(typescript@5.3.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - '@typescript-eslint/scope-manager': 8.0.0-alpha.58 - '@typescript-eslint/types': 8.0.0-alpha.58 - '@typescript-eslint/typescript-estree': 8.0.0-alpha.58(typescript@5.3.3) + '@typescript-eslint/scope-manager': 8.0.0 + '@typescript-eslint/types': 8.0.0 + '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.3.3) eslint: 9.8.0 transitivePeerDependencies: - supports-color @@ -4754,24 +4542,14 @@ snapshots: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.15.0': - dependencies: - '@typescript-eslint/types': 7.15.0 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.0.0-alpha.40': + '@typescript-eslint/visitor-keys@8.0.0': dependencies: - '@typescript-eslint/types': 8.0.0-alpha.40 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@8.0.0-alpha.58': - dependencies: - '@typescript-eslint/types': 8.0.0-alpha.58 + '@typescript-eslint/types': 8.0.0 eslint-visitor-keys: 3.4.3 '@typescript/vfs@1.5.0': @@ -4782,24 +4560,24 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@unocss/astro@0.61.8(rollup@4.18.0)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0))': + '@unocss/astro@0.61.9(rollup@4.18.0)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0))': dependencies: - '@unocss/core': 0.61.8 - '@unocss/reset': 0.61.8 - '@unocss/vite': 0.61.8(rollup@4.18.0)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0)) + '@unocss/core': 0.61.9 + '@unocss/reset': 0.61.9 + '@unocss/vite': 0.61.9(rollup@4.18.0)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0)) optionalDependencies: vite: 5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0) transitivePeerDependencies: - rollup - supports-color - '@unocss/cli@0.61.8(rollup@4.18.0)': + '@unocss/cli@0.61.9(rollup@4.18.0)': dependencies: '@ampproject/remapping': 2.3.0 '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - '@unocss/config': 0.61.8 - '@unocss/core': 0.61.8 - '@unocss/preset-uno': 0.61.8 + '@unocss/config': 0.61.9 + '@unocss/core': 0.61.9 + '@unocss/preset-uno': 0.61.9 cac: 6.7.14 chokidar: 3.6.0 colorette: 2.0.20 @@ -4812,31 +4590,31 @@ snapshots: - rollup - supports-color - '@unocss/config@0.61.8': + '@unocss/config@0.61.9': dependencies: - '@unocss/core': 0.61.8 + '@unocss/core': 0.61.9 unconfig: 0.5.4 transitivePeerDependencies: - supports-color - '@unocss/core@0.61.8': {} + '@unocss/core@0.61.9': {} - '@unocss/extractor-arbitrary-variants@0.61.8': + '@unocss/extractor-arbitrary-variants@0.61.9': dependencies: - '@unocss/core': 0.61.8 + '@unocss/core': 0.61.9 - '@unocss/inspector@0.61.8': + '@unocss/inspector@0.61.9': dependencies: - '@unocss/core': 0.61.8 - '@unocss/rule-utils': 0.61.8 + '@unocss/core': 0.61.9 + '@unocss/rule-utils': 0.61.9 gzip-size: 6.0.0 sirv: 2.0.4 - '@unocss/postcss@0.61.8(postcss@8.4.40)': + '@unocss/postcss@0.61.9(postcss@8.4.40)': dependencies: - '@unocss/config': 0.61.8 - '@unocss/core': 0.61.8 - '@unocss/rule-utils': 0.61.8 + '@unocss/config': 0.61.9 + '@unocss/core': 0.61.9 + '@unocss/rule-utils': 0.61.9 css-tree: 2.3.1 fast-glob: 3.3.2 magic-string: 0.30.11 @@ -4844,96 +4622,96 @@ snapshots: transitivePeerDependencies: - supports-color - '@unocss/preset-attributify@0.61.8': + '@unocss/preset-attributify@0.61.9': dependencies: - '@unocss/core': 0.61.8 + '@unocss/core': 0.61.9 - '@unocss/preset-icons@0.61.8': + '@unocss/preset-icons@0.61.9': dependencies: '@iconify/utils': 2.1.29 - '@unocss/core': 0.61.8 + '@unocss/core': 0.61.9 ofetch: 1.3.4 transitivePeerDependencies: - supports-color - '@unocss/preset-mini@0.61.8': + '@unocss/preset-mini@0.61.9': dependencies: - '@unocss/core': 0.61.8 - '@unocss/extractor-arbitrary-variants': 0.61.8 - '@unocss/rule-utils': 0.61.8 + '@unocss/core': 0.61.9 + '@unocss/extractor-arbitrary-variants': 0.61.9 + '@unocss/rule-utils': 0.61.9 - '@unocss/preset-tagify@0.61.8': + '@unocss/preset-tagify@0.61.9': dependencies: - '@unocss/core': 0.61.8 + '@unocss/core': 0.61.9 - '@unocss/preset-typography@0.61.8': + '@unocss/preset-typography@0.61.9': dependencies: - '@unocss/core': 0.61.8 - '@unocss/preset-mini': 0.61.8 + '@unocss/core': 0.61.9 + '@unocss/preset-mini': 0.61.9 - '@unocss/preset-uno@0.61.8': + '@unocss/preset-uno@0.61.9': dependencies: - '@unocss/core': 0.61.8 - '@unocss/preset-mini': 0.61.8 - '@unocss/preset-wind': 0.61.8 - '@unocss/rule-utils': 0.61.8 + '@unocss/core': 0.61.9 + '@unocss/preset-mini': 0.61.9 + '@unocss/preset-wind': 0.61.9 + '@unocss/rule-utils': 0.61.9 - '@unocss/preset-web-fonts@0.61.8': + '@unocss/preset-web-fonts@0.61.9': dependencies: - '@unocss/core': 0.61.8 + '@unocss/core': 0.61.9 ofetch: 1.3.4 - '@unocss/preset-wind@0.61.8': + '@unocss/preset-wind@0.61.9': dependencies: - '@unocss/core': 0.61.8 - '@unocss/preset-mini': 0.61.8 - '@unocss/rule-utils': 0.61.8 + '@unocss/core': 0.61.9 + '@unocss/preset-mini': 0.61.9 + '@unocss/rule-utils': 0.61.9 - '@unocss/reset@0.61.8': {} + '@unocss/reset@0.61.9': {} - '@unocss/rule-utils@0.61.8': + '@unocss/rule-utils@0.61.9': dependencies: - '@unocss/core': 0.61.8 + '@unocss/core': 0.61.9 magic-string: 0.30.11 - '@unocss/scope@0.61.8': {} + '@unocss/scope@0.61.9': {} - '@unocss/transformer-attributify-jsx-babel@0.61.8': + '@unocss/transformer-attributify-jsx-babel@0.61.9': dependencies: '@babel/core': 7.25.2 '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) '@babel/preset-typescript': 7.24.7(@babel/core@7.25.2) - '@unocss/core': 0.61.8 + '@unocss/core': 0.61.9 transitivePeerDependencies: - supports-color - '@unocss/transformer-attributify-jsx@0.61.8': + '@unocss/transformer-attributify-jsx@0.61.9': dependencies: - '@unocss/core': 0.61.8 + '@unocss/core': 0.61.9 - '@unocss/transformer-compile-class@0.61.8': + '@unocss/transformer-compile-class@0.61.9': dependencies: - '@unocss/core': 0.61.8 + '@unocss/core': 0.61.9 - '@unocss/transformer-directives@0.61.8': + '@unocss/transformer-directives@0.61.9': dependencies: - '@unocss/core': 0.61.8 - '@unocss/rule-utils': 0.61.8 + '@unocss/core': 0.61.9 + '@unocss/rule-utils': 0.61.9 css-tree: 2.3.1 - '@unocss/transformer-variant-group@0.61.8': + '@unocss/transformer-variant-group@0.61.9': dependencies: - '@unocss/core': 0.61.8 + '@unocss/core': 0.61.9 - '@unocss/vite@0.61.8(rollup@4.18.0)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0))': + '@unocss/vite@0.61.9(rollup@4.18.0)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0))': dependencies: '@ampproject/remapping': 2.3.0 '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - '@unocss/config': 0.61.8 - '@unocss/core': 0.61.8 - '@unocss/inspector': 0.61.8 - '@unocss/scope': 0.61.8 - '@unocss/transformer-directives': 0.61.8 + '@unocss/config': 0.61.9 + '@unocss/core': 0.61.9 + '@unocss/inspector': 0.61.9 + '@unocss/scope': 0.61.9 + '@unocss/transformer-directives': 0.61.9 chokidar: 3.6.0 fast-glob: 3.3.2 magic-string: 0.30.11 @@ -4961,10 +4739,10 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.0 - '@vue/compiler-core@3.5.0-alpha.4': + '@vue/compiler-core@3.5.0-alpha.5': dependencies: '@babel/parser': 7.25.0 - '@vue/shared': 3.5.0-alpha.4 + '@vue/shared': 3.5.0-alpha.5 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.0 @@ -4974,10 +4752,10 @@ snapshots: '@vue/compiler-core': 3.4.34 '@vue/shared': 3.4.34 - '@vue/compiler-dom@3.5.0-alpha.4': + '@vue/compiler-dom@3.5.0-alpha.5': dependencies: - '@vue/compiler-core': 3.5.0-alpha.4 - '@vue/shared': 3.5.0-alpha.4 + '@vue/compiler-core': 3.5.0-alpha.5 + '@vue/shared': 3.5.0-alpha.5 '@vue/compiler-sfc@3.4.34': dependencies: @@ -4991,16 +4769,16 @@ snapshots: postcss: 8.4.39 source-map-js: 1.2.0 - '@vue/compiler-sfc@3.5.0-alpha.4': + '@vue/compiler-sfc@3.5.0-alpha.5': dependencies: '@babel/parser': 7.25.0 - '@vue/compiler-core': 3.5.0-alpha.4 - '@vue/compiler-dom': 3.5.0-alpha.4 - '@vue/compiler-ssr': 3.5.0-alpha.4 - '@vue/shared': 3.5.0-alpha.4 + '@vue/compiler-core': 3.5.0-alpha.5 + '@vue/compiler-dom': 3.5.0-alpha.5 + '@vue/compiler-ssr': 3.5.0-alpha.5 + '@vue/shared': 3.5.0-alpha.5 estree-walker: 2.0.2 magic-string: 0.30.11 - postcss: 8.4.39 + postcss: 8.4.40 source-map-js: 1.2.0 '@vue/compiler-ssr@3.4.34': @@ -5008,10 +4786,10 @@ snapshots: '@vue/compiler-dom': 3.4.34 '@vue/shared': 3.4.34 - '@vue/compiler-ssr@3.5.0-alpha.4': + '@vue/compiler-ssr@3.5.0-alpha.5': dependencies: - '@vue/compiler-dom': 3.5.0-alpha.4 - '@vue/shared': 3.5.0-alpha.4 + '@vue/compiler-dom': 3.5.0-alpha.5 + '@vue/shared': 3.5.0-alpha.5 '@vue/devtools-api@7.3.5': dependencies: @@ -5048,19 +4826,19 @@ snapshots: dependencies: '@vue/shared': 3.4.34 - '@vue/reactivity@3.5.0-alpha.4': + '@vue/reactivity@3.5.0-alpha.5': dependencies: - '@vue/shared': 3.5.0-alpha.4 + '@vue/shared': 3.5.0-alpha.5 '@vue/runtime-core@3.4.34': dependencies: '@vue/reactivity': 3.4.34 '@vue/shared': 3.4.34 - '@vue/runtime-core@3.5.0-alpha.4': + '@vue/runtime-core@3.5.0-alpha.5': dependencies: - '@vue/reactivity': 3.5.0-alpha.4 - '@vue/shared': 3.5.0-alpha.4 + '@vue/reactivity': 3.5.0-alpha.5 + '@vue/shared': 3.5.0-alpha.5 '@vue/runtime-dom@3.4.34': dependencies: @@ -5069,11 +4847,11 @@ snapshots: '@vue/shared': 3.4.34 csstype: 3.1.3 - '@vue/runtime-dom@3.5.0-alpha.4': + '@vue/runtime-dom@3.5.0-alpha.5': dependencies: - '@vue/reactivity': 3.5.0-alpha.4 - '@vue/runtime-core': 3.5.0-alpha.4 - '@vue/shared': 3.5.0-alpha.4 + '@vue/reactivity': 3.5.0-alpha.5 + '@vue/runtime-core': 3.5.0-alpha.5 + '@vue/shared': 3.5.0-alpha.5 csstype: 3.1.3 '@vue/server-renderer@3.4.34(vue@3.4.34(typescript@5.3.3))': @@ -5082,17 +4860,17 @@ snapshots: '@vue/shared': 3.4.34 vue: 3.4.34(typescript@5.3.3) - '@vue/server-renderer@3.5.0-alpha.4(vue@3.5.0-alpha.4(typescript@5.3.3))': + '@vue/server-renderer@3.5.0-alpha.5(vue@3.5.0-alpha.5(typescript@5.3.3))': dependencies: - '@vue/compiler-ssr': 3.5.0-alpha.4 - '@vue/shared': 3.5.0-alpha.4 - vue: 3.5.0-alpha.4(typescript@5.3.3) + '@vue/compiler-ssr': 3.5.0-alpha.5 + '@vue/shared': 3.5.0-alpha.5 + vue: 3.5.0-alpha.5(typescript@5.3.3) '@vue/shared@3.4.27': {} '@vue/shared@3.4.34': {} - '@vue/shared@3.5.0-alpha.4': {} + '@vue/shared@3.5.0-alpha.5': {} '@vueuse/core@10.11.0(vue@3.4.34(typescript@5.3.3))': dependencies: @@ -5104,12 +4882,12 @@ snapshots: - '@vue/composition-api' - vue - '@vueuse/core@10.11.0(vue@3.5.0-alpha.4(typescript@5.3.3))': + '@vueuse/core@10.11.0(vue@3.5.0-alpha.5(typescript@5.3.3))': dependencies: '@types/web-bluetooth': 0.0.20 '@vueuse/metadata': 10.11.0 - '@vueuse/shared': 10.11.0(vue@3.5.0-alpha.4(typescript@5.3.3)) - vue-demi: 0.14.8(vue@3.5.0-alpha.4(typescript@5.3.3)) + '@vueuse/shared': 10.11.0(vue@3.5.0-alpha.5(typescript@5.3.3)) + vue-demi: 0.14.8(vue@3.5.0-alpha.5(typescript@5.3.3)) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -5136,9 +4914,9 @@ snapshots: - '@vue/composition-api' - vue - '@vueuse/shared@10.11.0(vue@3.5.0-alpha.4(typescript@5.3.3))': + '@vueuse/shared@10.11.0(vue@3.5.0-alpha.5(typescript@5.3.3))': dependencies: - vue-demi: 0.14.8(vue@3.5.0-alpha.4(typescript@5.3.3)) + vue-demi: 0.14.8(vue@3.5.0-alpha.5(typescript@5.3.3)) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -5152,7 +4930,7 @@ snapshots: agent-base@7.1.0: dependencies: - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -5277,13 +5055,6 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.23.0: - dependencies: - caniuse-lite: 1.0.30001629 - electron-to-chromium: 1.4.793 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) - browserslist@4.23.2: dependencies: caniuse-lite: 1.0.30001644 @@ -5331,8 +5102,6 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001629: {} - caniuse-lite@1.0.30001644: {} ccount@2.0.1: {} @@ -5373,7 +5142,7 @@ snapshots: chownr@2.0.0: optional: true - chromium-bidi@0.6.2(devtools-protocol@0.0.1312386): + chromium-bidi@0.6.3(devtools-protocol@0.0.1312386): dependencies: devtools-protocol: 0.0.1312386 mitt: 3.0.1 @@ -5448,7 +5217,7 @@ snapshots: core-js-compat@3.37.1: dependencies: - browserslist: 4.23.0 + browserslist: 4.23.2 cosmiconfig@9.0.0(typescript@5.3.3): dependencies: @@ -5534,8 +5303,6 @@ snapshots: duplexer@0.1.2: {} - electron-to-chromium@1.4.793: {} - electron-to-chromium@1.5.3: {} emoji-regex@10.3.0: {} @@ -5592,8 +5359,6 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - escalade@3.1.1: {} - escalade@3.1.2: {} escape-string-regexp@1.0.5: {} @@ -5617,7 +5382,7 @@ snapshots: eslint-compat-utils@0.5.1(eslint@9.8.0): dependencies: eslint: 9.8.0 - semver: 7.6.2 + semver: 7.6.3 eslint-config-flat-gitignore@0.1.8: dependencies: @@ -5684,27 +5449,27 @@ snapshots: eslint-plugin-import-x@3.1.0(eslint@9.8.0)(typescript@5.3.3): dependencies: - '@typescript-eslint/utils': 7.15.0(eslint@9.8.0)(typescript@5.3.3) - debug: 4.3.5 + '@typescript-eslint/utils': 7.18.0(eslint@9.8.0)(typescript@5.3.3) + debug: 4.3.6 doctrine: 3.0.0 eslint: 9.8.0 eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.7.5 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.2 + semver: 7.6.3 stable-hash: 0.0.4 tslib: 2.6.2 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jsdoc@48.10.1(eslint@9.8.0): + eslint-plugin-jsdoc@48.10.2(eslint@9.8.0): dependencies: '@es-joy/jsdoccomment': 0.46.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 - debug: 4.3.5 + debug: 4.3.6 escape-string-regexp: 4.0.0 eslint: 9.8.0 espree: 10.1.0 @@ -5744,7 +5509,7 @@ snapshots: globals: 15.8.0 ignore: 5.3.1 minimatch: 9.0.5 - semver: 7.6.2 + semver: 7.6.3 eslint-plugin-no-only-tests@3.1.0: {} @@ -5774,7 +5539,7 @@ snapshots: eslint-plugin-toml@0.11.1(eslint@9.8.0): dependencies: - debug: 4.3.5 + debug: 4.3.6 eslint: 9.8.0 eslint-compat-utils: 0.5.1(eslint@9.8.0) lodash: 4.17.21 @@ -5799,22 +5564,22 @@ snapshots: read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 - semver: 7.6.2 + semver: 7.6.3 strip-indent: 3.0.0 - eslint-plugin-unused-imports@4.0.1(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0): + eslint-plugin-unused-imports@4.0.1(@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0): dependencies: eslint: 9.8.0 eslint-rule-composer: 0.3.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3) - eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3): + eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3): dependencies: - '@typescript-eslint/utils': 7.15.0(eslint@9.8.0)(typescript@5.3.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.8.0)(typescript@5.3.3) eslint: 9.8.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.3.3))(eslint@9.8.0)(typescript@5.3.3) transitivePeerDependencies: - supports-color - typescript @@ -5827,7 +5592,7 @@ snapshots: natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.0 - semver: 7.6.2 + semver: 7.6.3 vue-eslint-parser: 9.4.3(eslint@9.8.0) xml-name-validator: 4.0.0 transitivePeerDependencies: @@ -5835,7 +5600,7 @@ snapshots: eslint-plugin-yml@1.14.0(eslint@9.8.0): dependencies: - debug: 4.3.5 + debug: 4.3.6 eslint: 9.8.0 eslint-compat-utils: 0.5.1(eslint@9.8.0) lodash: 4.17.21 @@ -5844,9 +5609,9 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.5.0-alpha.4)(eslint@9.8.0): + eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.5.0-alpha.5)(eslint@9.8.0): dependencies: - '@vue/compiler-sfc': 3.5.0-alpha.4 + '@vue/compiler-sfc': 3.5.0-alpha.5 eslint: 9.8.0 eslint-rule-composer@0.3.0: {} @@ -5964,7 +5729,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.5 + debug: 4.3.6 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -6092,7 +5857,7 @@ snapshots: dependencies: basic-ftp: 5.0.3 data-uri-to-buffer: 6.0.1 - debug: 4.3.5 + debug: 4.3.6 fs-extra: 8.1.0 transitivePeerDependencies: - supports-color @@ -6174,14 +5939,14 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.0 - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.4: dependencies: agent-base: 7.1.0 - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -6318,7 +6083,7 @@ snapshots: acorn: 8.12.1 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.6.2 + semver: 7.6.3 jsonfile@4.0.0: optionalDependencies: @@ -6682,7 +6447,7 @@ snapshots: micromark@2.11.4: dependencies: - debug: 4.3.5 + debug: 4.3.6 parse-entities: 2.0.0 transitivePeerDependencies: - supports-color @@ -6876,7 +6641,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.0 - debug: 4.3.5 + debug: 4.3.6 get-uri: 6.0.2 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 @@ -6996,7 +6761,7 @@ snapshots: proxy-agent@6.4.0: dependencies: agent-base: 7.1.0 - debug: 4.3.5 + debug: 4.3.6 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 lru-cache: 7.18.3 @@ -7018,11 +6783,11 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@22.14.0: + puppeteer-core@22.15.0: dependencies: '@puppeteer/browsers': 2.3.0 - chromium-bidi: 0.6.2(devtools-protocol@0.0.1312386) - debug: 4.3.5 + chromium-bidi: 0.6.3(devtools-protocol@0.0.1312386) + debug: 4.3.6 devtools-protocol: 0.0.1312386 ws: 8.18.0 transitivePeerDependencies: @@ -7030,12 +6795,12 @@ snapshots: - supports-color - utf-8-validate - puppeteer@22.14.0(typescript@5.3.3): + puppeteer@22.15.0(typescript@5.3.3): dependencies: '@puppeteer/browsers': 2.3.0 cosmiconfig: 9.0.0(typescript@5.3.3) devtools-protocol: 0.0.1312386 - puppeteer-core: 22.14.0 + puppeteer-core: 22.15.0 transitivePeerDependencies: - bufferutil - supports-color @@ -7215,7 +6980,7 @@ snapshots: socks-proxy-agent@8.0.2: dependencies: agent-base: 7.1.0 - debug: 4.3.5 + debug: 4.3.6 socks: 2.7.1 transitivePeerDependencies: - supports-color @@ -7518,28 +7283,28 @@ snapshots: universalify@0.1.2: {} - unocss@0.61.8(postcss@8.4.40)(rollup@4.18.0)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0)): - dependencies: - '@unocss/astro': 0.61.8(rollup@4.18.0)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0)) - '@unocss/cli': 0.61.8(rollup@4.18.0) - '@unocss/core': 0.61.8 - '@unocss/extractor-arbitrary-variants': 0.61.8 - '@unocss/postcss': 0.61.8(postcss@8.4.40) - '@unocss/preset-attributify': 0.61.8 - '@unocss/preset-icons': 0.61.8 - '@unocss/preset-mini': 0.61.8 - '@unocss/preset-tagify': 0.61.8 - '@unocss/preset-typography': 0.61.8 - '@unocss/preset-uno': 0.61.8 - '@unocss/preset-web-fonts': 0.61.8 - '@unocss/preset-wind': 0.61.8 - '@unocss/reset': 0.61.8 - '@unocss/transformer-attributify-jsx': 0.61.8 - '@unocss/transformer-attributify-jsx-babel': 0.61.8 - '@unocss/transformer-compile-class': 0.61.8 - '@unocss/transformer-directives': 0.61.8 - '@unocss/transformer-variant-group': 0.61.8 - '@unocss/vite': 0.61.8(rollup@4.18.0)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0)) + unocss@0.61.9(postcss@8.4.40)(rollup@4.18.0)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0)): + dependencies: + '@unocss/astro': 0.61.9(rollup@4.18.0)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0)) + '@unocss/cli': 0.61.9(rollup@4.18.0) + '@unocss/core': 0.61.9 + '@unocss/extractor-arbitrary-variants': 0.61.9 + '@unocss/postcss': 0.61.9(postcss@8.4.40) + '@unocss/preset-attributify': 0.61.9 + '@unocss/preset-icons': 0.61.9 + '@unocss/preset-mini': 0.61.9 + '@unocss/preset-tagify': 0.61.9 + '@unocss/preset-typography': 0.61.9 + '@unocss/preset-uno': 0.61.9 + '@unocss/preset-web-fonts': 0.61.9 + '@unocss/preset-wind': 0.61.9 + '@unocss/reset': 0.61.9 + '@unocss/transformer-attributify-jsx': 0.61.9 + '@unocss/transformer-attributify-jsx-babel': 0.61.9 + '@unocss/transformer-compile-class': 0.61.9 + '@unocss/transformer-directives': 0.61.9 + '@unocss/transformer-variant-group': 0.61.9 + '@unocss/vite': 0.61.9(rollup@4.18.0)(vite@5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0)) optionalDependencies: vite: 5.4.0-beta.0(@types/node@20.9.1)(less@4.2.0)(sass@1.77.8)(terser@5.24.0) transitivePeerDependencies: @@ -7547,7 +7312,7 @@ snapshots: - rollup - supports-color - unplugin-auto-import@0.18.2(@nuxt/kit@3.8.1(rollup@4.18.0))(@vueuse/core@10.11.0(vue@3.5.0-alpha.4(typescript@5.3.3)))(rollup@4.18.0): + unplugin-auto-import@0.18.2(@nuxt/kit@3.8.1(rollup@4.18.0))(@vueuse/core@10.11.0(vue@3.5.0-alpha.5(typescript@5.3.3)))(rollup@4.18.0): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@4.18.0) @@ -7559,11 +7324,11 @@ snapshots: unplugin: 1.11.0 optionalDependencies: '@nuxt/kit': 3.8.1(rollup@4.18.0) - '@vueuse/core': 10.11.0(vue@3.5.0-alpha.4(typescript@5.3.3)) + '@vueuse/core': 10.11.0(vue@3.5.0-alpha.5(typescript@5.3.3)) transitivePeerDependencies: - rollup - unplugin-icons@0.19.1(@vue/compiler-sfc@3.5.0-alpha.4)(vue-template-compiler@2.7.16): + unplugin-icons@0.19.1(@vue/compiler-sfc@3.5.0-alpha.5)(vue-template-compiler@2.7.16): dependencies: '@antfu/install-pkg': 0.3.3 '@antfu/utils': 0.7.10 @@ -7573,12 +7338,12 @@ snapshots: local-pkg: 0.5.0 unplugin: 1.12.0 optionalDependencies: - '@vue/compiler-sfc': 3.5.0-alpha.4 + '@vue/compiler-sfc': 3.5.0-alpha.5 vue-template-compiler: 2.7.16 transitivePeerDependencies: - supports-color - unplugin-vue-components@0.27.3(@babel/parser@7.25.0)(@nuxt/kit@3.8.1(rollup@4.18.0))(rollup@4.18.0)(vue@3.5.0-alpha.4(typescript@5.3.3)): + unplugin-vue-components@0.27.3(@babel/parser@7.25.0)(@nuxt/kit@3.8.1(rollup@4.18.0))(rollup@4.18.0)(vue@3.5.0-alpha.5(typescript@5.3.3)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@4.18.0) @@ -7590,7 +7355,7 @@ snapshots: minimatch: 9.0.5 mlly: 1.7.1 unplugin: 1.11.0 - vue: 3.5.0-alpha.4(typescript@5.3.3) + vue: 3.5.0-alpha.5(typescript@5.3.3) optionalDependencies: '@babel/parser': 7.25.0 '@nuxt/kit': 3.8.1(rollup@4.18.0) @@ -7625,12 +7390,6 @@ snapshots: - supports-color optional: true - update-browserslist-db@1.0.13(browserslist@4.23.0): - dependencies: - browserslist: 4.23.0 - escalade: 3.1.1 - picocolors: 1.0.1 - update-browserslist-db@1.1.0(browserslist@4.23.2): dependencies: browserslist: 4.23.2 @@ -7747,21 +7506,21 @@ snapshots: dependencies: vue: 3.4.34(typescript@5.3.3) - vue-demi@0.14.8(vue@3.5.0-alpha.4(typescript@5.3.3)): + vue-demi@0.14.8(vue@3.5.0-alpha.5(typescript@5.3.3)): dependencies: - vue: 3.5.0-alpha.4(typescript@5.3.3) + vue: 3.5.0-alpha.5(typescript@5.3.3) optional: true vue-eslint-parser@9.4.3(eslint@9.8.0): dependencies: - debug: 4.3.5 + debug: 4.3.6 eslint: 9.8.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 esquery: 1.6.0 lodash: 4.17.21 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -7784,13 +7543,13 @@ snapshots: optionalDependencies: typescript: 5.3.3 - vue@3.5.0-alpha.4(typescript@5.3.3): + vue@3.5.0-alpha.5(typescript@5.3.3): dependencies: - '@vue/compiler-dom': 3.5.0-alpha.4 - '@vue/compiler-sfc': 3.5.0-alpha.4 - '@vue/runtime-dom': 3.5.0-alpha.4 - '@vue/server-renderer': 3.5.0-alpha.4(vue@3.5.0-alpha.4(typescript@5.3.3)) - '@vue/shared': 3.5.0-alpha.4 + '@vue/compiler-dom': 3.5.0-alpha.5 + '@vue/compiler-sfc': 3.5.0-alpha.5 + '@vue/runtime-dom': 3.5.0-alpha.5 + '@vue/server-renderer': 3.5.0-alpha.5(vue@3.5.0-alpha.5(typescript@5.3.3)) + '@vue/shared': 3.5.0-alpha.5 optionalDependencies: typescript: 5.3.3 @@ -7840,7 +7599,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3