diff --git a/.dockerignore b/.dockerignore index 6431dcd7..175d4553 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,7 @@ data .vscode release +custom *Dockerfile* web/node_modules web/src-tauri/target diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..3f03bf4c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,16 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "gomod" + directory: "/" + schedule: + interval: "weekly" + reviewers: + - "rocboss" + - "alimy" + commit-message: + prefix: "mod:" diff --git a/.github/desktop-tauri.jpeg b/.github/desktop-tauri.jpeg deleted file mode 100644 index cf4d691e..00000000 Binary files a/.github/desktop-tauri.jpeg and /dev/null differ diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 00000000..f0d0f7ce --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,80 @@ +name: Go +on: + push: + branches: + - main + - beta + - dev + - 'jc/**' + - 'feature/**' + - 'r/**' + - 'x/**' + - 't/**' + paths: + - '**.go' + - 'go.mod' + - '.golangci.yml' + - '.github/workflows/go.yml' + pull_request: + paths: + - '**.go' + - 'go.mod' + - '.golangci.yml' + - '.github/workflows/go.yml' +env: + GOPROXY: "https://proxy.golang.org" + +permissions: + contents: read + +jobs: + # lint: + # permissions: + # contents: read # for actions/checkout to fetch code + # pull-requests: read # for golangci/golangci-lint-action to fetch pull requests + # name: Lint + # runs-on: ubuntu-latest + # steps: + # - name: Checkout code + # uses: actions/checkout@v3 + # - name: Run golangci-lint + # uses: golangci/golangci-lint-action@v3 + # with: + # version: latest + # args: --timeout=30m + + test: + name: Test + strategy: + matrix: + go-version: [ 1.18.x, 1.19.x ] + platform: [ ubuntu-latest, macos-latest ] + runs-on: ${{ matrix.platform }} + steps: + - name: Install Go + uses: actions/setup-go@v3 + with: + go-version: ${{ matrix.go-version }} + - name: Checkout code + uses: actions/checkout@v3 + - name: Run tests + run: go test -v -race ./... + + # Running tests with race detection consumes too much memory on Windows, + # see https://github.com/golang/go/issues/46099 for details. + test-windows: + name: TestOnWindows + strategy: + matrix: + go-version: [ 1.18.x, 1.19.x ] + platform: [ windows-latest ] + runs-on: ${{ matrix.platform }} + steps: + - name: Install Go + uses: actions/setup-go@v3 + with: + go-version: ${{ matrix.go-version }} + - name: Checkout code + uses: actions/checkout@v3 + - name: Run tests + run: go test -v ./... diff --git a/.gitignore b/.gitignore index 61bdf2ca..c67a6e18 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,9 @@ .idea .vscode !*.example -config.yaml +/config.yaml *.log paopao-ce* -release -data +/release +/data +/custom diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 00000000..a86bdf46 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,24 @@ +linters-settings: + staticcheck: + checks: [ + "all", + "-SA1019" # There are valid use cases of strings.Title + ] + nakedret: + max-func-lines: 0 # Disallow any unnamed return statement + +linters: + enable: + # - unused + # - errcheck + # - gosimple + - govet + # - ineffassign + # - staticcheck + # - typecheck + # - nakedret + - gofmt + # - rowserrcheck + # - unconvert + - goimports + # - unparam diff --git a/Dockerfile b/Dockerfile index 2a52418f..ce76dd07 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,8 +25,8 @@ WORKDIR /paopao-ce COPY . . COPY --from=frontend /web/dist ./web/dist ENV GOPROXY=https://goproxy.cn -RUN [ $EMBED_UI != yes ] || make build TAGS='embed jsoniter' -RUN [ $EMBED_UI = yes ] || make build TAGS='jsoniter' +RUN [ $EMBED_UI != yes ] || make build TAGS='embed go_json' +RUN [ $EMBED_UI = yes ] || make build TAGS='go_json' FROM alpine:3.16 ARG API_HOST @@ -38,9 +38,8 @@ RUN apk update && apk add --no-cache ca-certificates && update-ca-certificates WORKDIR /app/paopao-ce COPY --from=backend /paopao-ce/release/paopao-ce . -COPY configs ./configs -VOLUME ["/app/paopao-ce/configs"] +VOLUME ["/app/paopao-ce/custom"] EXPOSE 8008 HEALTHCHECK --interval=5s --timeout=3s --retries=3 CMD ps -ef | grep paopao-ce || exit 1 ENTRYPOINT ["/app/paopao-ce/paopao-ce"] diff --git a/Makefile b/Makefile index 4d0b94a2..5366bcca 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ CGO_ENABLED := 1 endif RELEASE_ROOT = release -RELEASE_FILES = LICENSE README.md config.yaml.sample scripts configs +RELEASE_FILES = LICENSE README.md config.yaml.sample scripts RELEASE_LINUX_AMD64 = $(RELEASE_ROOT)/linux-amd64/$(TARGET) RELEASE_DARWIN_AMD64 = $(RELEASE_ROOT)/darwin-amd64/$(TARGET) RELEASE_DARWIN_ARM64 = $(RELEASE_ROOT)/darwin-arm64/$(TARGET) @@ -68,6 +68,28 @@ windows-x64: @echo Build paopao-ce [windows-x64] CGO_ENABLED=$(CGO_ENABLED) @CGO_ENABLED=$(CGO_ENABLED) GOOS=windows GOARCH=amd64 go build -trimpath -tags '$(TAGS)' -ldflags '$(LDFLAGS)' -o $(RELEASE_WINDOWS_AMD64)/$(basename $(TARGET)).exe +.PHONY: generate +generate: gen-mir gen-grpc + +.PHONY: gen-mir +gen-mir: + @go generate mirc/gen.go + @go fmt ./auto/api/... + +.PHONY: gen-grpc +gen-grpc: + @rm -rf auto/rpc + @buf generate proto + @go fmt ./auto/rpc/... + +.PHONY: proto-mod +proto-mod: + @cd proto/ && buf mod update + +.PHONY: proto-lint +proto-lint: + @cd proto/ && buf lint + clean: @go clean @find ./release -type f -exec rm -r {} + @@ -83,7 +105,15 @@ test: @go test ./... pre-commit: fmt - go mod tidy + @go mod tidy + +.PHONY: install-protobuf-plugins +install-protobuf-plugins: + @go install github.com/bufbuild/buf/cmd/buf@v1.11.0 + @go install github.com/bufbuild/buf/cmd/protoc-gen-buf-breaking@v1.11.0 + @go install github.com/bufbuild/buf/cmd/protoc-gen-buf-lint@v1.11.0 + @go install google.golang.org/protobuf/cmd/protoc-gen-go@latest + @go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest help: @echo "make: make" diff --git a/README.md b/README.md index 56946ab3..d2b7ddc8 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,13 @@
+[![Go](https://github.com/rocboss/paopao-ce/actions/workflows/go.yml/badge.svg)](https://github.com/rocboss/paopao-ce/actions/workflows/go.yml) [![Go Report Card][goreport-shield]][goreport-url] [![Forks][forks-shield]][forks-url] [![Stargazers][stars-shield]][stars-url] [![MIT License][license-shield]][license-url] [![Contributors][contributors-shield]][contributors-url] +[![Sourcegraph](https://img.shields.io/badge/view%20on-Sourcegraph-brightgreen.svg)](https://sourcegraph.com/github.com/rocboss/paopao-ce)
@@ -37,33 +39,39 @@ Web端: 更多演示请前往[官网](https://www.paopao.info)体验(谢绝灌水) 桌面端: -![](.github/desktop-tauri.jpeg) +![](docs/proposal/.assets/000-00.png)

(back to top)

## 🛠 技术栈 -PaoPao主要由以下优秀的开源项目/工具构建 +PaoPao主要由以下优秀的开源项目/工具构建 +#### 后端: +* [Go](https://go.dev/ 'go') +* [Gin](https://gin-gonic.com/ 'gin') +* [Mir](https://github.com/alimy/mir 'go-mir') +* [Buf](https://github.com/bufbuild/buf 'buf') +* [gRPC](https://github.com/grpc/grpc-go 'grpc-go') +* [Zinc](https://zinclabs.io/ 'zinc') -* [Go](https://go.dev/) -* [Gin](https://gin-gonic.com/) -* [Zinc](https://zinclabs.io/) +#### 前端: * [Naive UI](https://www.naiveui.com/) * [Vue.js](https://vuejs.org/) * [Vite.js](https://vitejs.dev/) +* [tauri](https://github.com/tauri-apps/tauri 'tauri') ## 🏗 快速开始 ### 环境要求 -* Go (1.17+) +* Go (1.18+) * Node.js (14+) * MySQL (5.7+) * Redis * Zinc -\* Zinc是一款轻量级全文搜索引擎,可以查阅 安装 +> Zinc是一款轻量级全文搜索引擎,可以查阅 安装 以上环境版本为PaoPao官方的开发版本,仅供参考,其他版本的环境未进行充分测试 @@ -238,17 +246,36 @@ docker compose up --build > 注意:默认提供的 docker-compose.yaml 初衷是搭建本机开发调试环境,如果需要产品部署供外网访问,请自行调优配置参数或使用其他方式部署。 -### API 文档 -构建时将 `docs` 添加到TAGS中: +### 开发文档 +#### Docs文档说明 +`docs`目录提供了各种开发文档,包括: +* [deploy](docs/deploy/) - paopao-ce部署文档 +* [discuss](docs/discuss/) - 开发相关的问题交流论述文档 +* [openapi](docs/openapi/) - paopao-ce后端导出API文档 +* [proposal](docs/proposal/) - paopao-ce功能特性提按文档 +> 比如,关于paopao-ce的设计定位,可以参考[docs/proposal/001-关于paopao-ce的设计定位](docs/proposal/001-关于paopao-ce的设计定位.md),简要阐述了paopao-ce是如何定位自身的。 + +#### API文档 +开发者可以在本地开启`Docs`服务,浏览后端导出的API服务接口文档。 +* `config.yaml` 添加 `Docs` 功能项: +```yaml +... +Features: + Default: ["Base", "MySQL", "Option", "LocalOSS", "LoggerFile", "Docs"] + Docs: ["Docs:OpenAPI"] +... +``` + +* 构建时将 `docs` 添加到TAGS中: ```sh make run TAGS='docs' -# visit http://127.0.0.1:8008/docs +# visit http://127.0.0.1:8011/docs/openapi ``` ### 配置说明 -`config.yaml.sample` 是一份完整的配置文件模版,paopao-ce启动时会读取`./configs/config.yaml`、`./config.yaml`任意一份配置文件(优先读取最先找到的文件)。 +`config.yaml.sample` 是一份完整的配置文件模版,paopao-ce启动时会读取`./custom/config.yaml`、`./config.yaml`任意一份配置文件(优先读取最先找到的文件)。 ```sh cp config.yaml.sample config.yaml @@ -303,35 +330,51 @@ release/paopao-ce --no-default-features --features sqlite3,localoss,loggerfile,r ``` 目前支持的功能集合: -* 数据库: MySQL/Sqlite3/PostgreSQL - `Gorm` + `MySQL`/`Sqlite3`/`PostgreSQL` 使用[gorm](https://github.com/go-gorm/gorm)作为数据库的ORM,默认使用 `Grom` + `MySQL`组合(目前状态:稳定,默认,推荐使用); - `Sqlx` + `MySQL`/`PostgreSQL` 使用[sqlx](https://github.com/jmoiron/sqlx)作为数据库的ORM(目前状态:WIP); -* 对象存储: AliOSS/COS/HuaweiOBS/MinIO/LocalOSS - `AliOSS` 阿里云对象存储服务; - `COS` 腾讯云对象存储服务; - `HuaweiOBS` 华为云对象存储服务; - `MinIO` [MinIO](https://github.com/minio/minio)对象存储服务; - `S3` AWS S3兼容的对象存储服务; - `LocalOSS` 提供使用本地目录文件作为对象存储的功能,仅用于开发调试环境; -* 缓存: Redis/SimpleCacheIndex/BigCacheIndex - `SimpleCacheIndex` 提供简单的 广场推文列表 的缓存功能; - `BigCacheIndex` 使用[BigCache](https://github.com/allegro/bigcache)缓存 广场推文列表,缓存每个用户每一页,简单做到千人千面(推荐使用); -* 搜索: Zinc/Meili - `Zinc` 基于[Zinc](https://github.com/zinclabs/zinc)搜索引擎提供推文搜索服务(目前状态: 稳定,推荐使用); - `Meili` 基于[Meilisearch](https://github.com/meilisearch/meilisearch)搜索引擎提供推文搜索服务(目前状态: 稳定,推荐使用); -* 日志: LoggerFile/LoggerZinc/LoggerMeili - `LoggerFile` 使用文件写日志(目前状态: 稳定); - `LoggerZinc` 使用[Zinc](https://github.com/zinclabs/zinc)写日志(目前状态: 稳定,推荐使用); - `LoggerMeili` 使用[Meilisearch](https://github.com/meilisearch/meilisearch)写日志(目前状态: 内测阶段); -* 支付: Alipay - `Alipay` 开启基于[支付宝开放平台](https://open.alipay.com/)的钱包功能; -* 短信验证码: SmsJuhe(需要开启sms) - `Sms` 开启短信验证码功能,用于手机绑定验证手机是否注册者的;功能如果没有开启,手机绑定时任意短信验证码都可以绑定手机; -* 其他: PhoneBind/OSS:Retention/OSS:TempDir - `PhoneBind` 手机绑定功能; - `OSS:Retention` 基于对象存储系统的对象过期自动删除特性实现 先创建临时对象再持久化的功能(目前状态: 内测阶段); - `OSS:TempDir` 基于对象存储系统的对象拷贝/移动特性实现 先创建临时对象再持久化的功能(目前状态: 内测阶段); - +| 功能项 | 类别 | 状态 | 备注 | +| ----- | ----- | ----- | ----- | +|`Web` | 子服务 | 内测 | 开启Web服务| +|`Admin` | 子服务 | WIP | 开启Admin后台运维服务| +|`SpaceX` | 子服务 | WIP | 开启SpaceX服务| +|`Bot` | 子服务 | WIP | 开启Bot服务| +|`NativeOBS` | 子服务 | WIP | 开启NativeOBS服务| +|`Docs` | 子服务 | WIP | 开启开发者文档服务| +|`Frontend:Web` | 子服务 | 稳定 | 开启独立前端服务| +|`Frontend:EmbedWeb` | 子服务 | 稳定 | 开启内嵌于后端Web API服务中的前端服务| +|`Deprecated:Web` | 子服务 | 稳定 | 开启旧的Web服务| +|`Gorm` | 数据库 | 稳定(默认) | 使用[gorm](https://github.com/go-gorm/gorm)作为数据库的ORM,默认使用 `Gorm` + `MySQL`组合| +|`Sqlx`| 数据库 | WIP | 使用[sqlx](https://github.com/jmoiron/sqlx)作为数据库的ORM| +|`Sqlc`| 数据库 | WIP | 使用[sqlc](https://github.com/kyleconroy/sqlc)自动生成ORM代码| +|`MySQL`| 数据库 | 稳定(默认) | 使用MySQL作为数据库| +|`Postgres`| 数据库 | 稳定 | 使用PostgreSQL作为数据库| +|`Sqlite3`| 数据库 | 稳定 | 使用Sqlite3作为数据库| +|`AliOSS` | 对象存储 | 稳定(推荐) |阿里云对象存储服务| +|`COS` | 对象存储 | 内测 |腾讯云对象存储服务| +|`HuaweiOBS` | 对象存储 | 内测 |华为云对象存储服务| +|`MinIO` | 对象存储 | 稳定 |[MinIO](https://github.com/minio/minio)对象存储服务| +|`S3` | 对象存储 | 内测 |AWS S3兼容的对象存储服务| +|`LocalOSS` | 对象存储 | 内测 |提供使用本地目录文件作为对象存储的功能,仅用于开发调试环境| +|`OSS:Retention` | 对象存储 | 内测 |基于对象存储系统的对象过期自动删除特性实现 先创建临时对象再持久化的功能| +|`OSS:TempDir` | 对象存储 | 内测 |基于对象存储系统的对象拷贝/移动特性实现 先创建临时对象再持久化的功能| +|`Redis` | 缓存 | 稳定 | Redis缓存功能 | +|`SimpleCacheIndex` | 缓存 | Deprecated | 提供简单的 广场推文列表 的缓存功能 | +|`BigCacheIndex` | 缓存 | 稳定(推荐) | 使用[BigCache](https://github.com/allegro/bigcache)缓存 广场推文列表,缓存每个用户每一页,简单做到千人千面 | +|`Zinc` | 搜索 | 稳定(推荐) | 基于[Zinc](https://github.com/zinclabs/zinc)搜索引擎提供推文搜索服务 | +|`Meili` | 搜索 | 稳定(推荐) | 基于[Meilisearch](https://github.com/meilisearch/meilisearch)搜索引擎提供推文搜索服务 | +|`Bleve` | 搜索 | WIP | 基于[Bleve](https://github.com/blevesearch/bleve)搜索引擎提供推文搜索服务 | +|`LoggerFile` | 日志 | 稳定 | 使用文件写日志 | +|`LoggerZinc` | 日志 | 稳定(推荐) | 使用[Zinc](https://github.com/zinclabs/zinc)写日志 | +|`LoggerMeili` | 日志 | 内测 | 使用[Meilisearch](https://github.com/meilisearch/meilisearch)写日志 | +|[`Friendship`](docs/proposal/002-关于Friendship功能项的设计.md) | 关系模式 | 内测 | 弱关系好友模式,类似微信朋友圈 | +|[`Followship`](docs/proposal/003-关于Followship功能项的设计.md) | 关系模式 | WIP | 关注者模式,类似Twitter的Follow模式 | +|[`Lightship`](docs/proposal/011-关于Lightship功能项的设计.md) | 关系模式 | 内测(默认) | 开放模式,所有推文都公开可见 | +|`Alipay` | 支付 | 稳定 | 开启基于[支付宝开放平台](https://open.alipay.com/)的钱包功能 | +|`Sms` | 短信验证 | 稳定 | 开启短信验证码功能,用于手机绑定验证手机是否注册者的;功能如果没有开启,手机绑定时任意短信验证码都可以绑定手机 | +|`Docs:OpenAPI` | 开发文档 | 稳定 | 开启openapi文档功能,提供web api文档说明(visit http://127.0.0.1:8008/docs/openapi) | +|[`Pyroscope`](docs/proposal/016-关于使用pyroscope用于性能调试的设计.md)| 性能优化 | 内测 | 开启Pyroscope功能用于性能调试 | +|`PhoneBind` | 其他 | 稳定 | 手机绑定功能 | + +> 功能项状态详情参考 [features-status](features-status.md). + ### 搭建依赖环境 #### [Zinc](https://github.com/zinclabs/zinc) 搜索引擎: * Zinc运行 @@ -380,7 +423,7 @@ Zinc: # Zinc搜索配置 mkdir -p data/meili/data # 使用Docker运行 -docker run -d --name meili -v ${PWD}/data/meili/data:/meili_data -p 7700:7700 -e MEILI_MASTER_KEY=paopao-meilisearch getmeili/meilisearch:v0.27.0 +docker run -d --name meili -v ${PWD}/data/meili/data:/meili_data -p 7700:7700 -e MEILI_MASTER_KEY=paopao-meilisearch getmeili/meilisearch:v0.29.0 # visit http://localhost:7700 打开自带的搜索前端ui # 使用docker compose运行,需要删除docker-compose.yaml中关于meili的注释 @@ -450,17 +493,96 @@ MinIO: # MinIO 存储配置 ... ``` +#### [Pyroscope](https://github.com/pyroscope-io/pyroscope) 性能剖析 +* Pyroscope运行 +```sh +mkdir -p data/minio/data + +# 使用Docker运行 +docker run -it -p 4040:4040 pyroscope/pyroscope:latest server +# 使用docker compose运行, 需要删除docker-compose.yaml中关于pyroscope的注释 +docker compose up -d pyroscope +# visit http://loclahost:4040 +``` + +* 修改Pyroscope配置 +```yaml +# features中加上 MinIO +Features: + Default: ["Meili", "LoggerMeili", "Base", "Sqlite3", "BigCacheIndex", "Pyroscope"] +... +Pyroscope: # Pyroscope配置 + AppName: "paopao-ce" + Endpoint: "http://localhost:4040" # Pyroscope server address + AuthToken: # Pyroscope authentication token + Logger: none # Pyroscope logger (standard | logrus | none) +... +``` + +### 源代码分支管理 +**主代码库`github.com/rocboss/paopao-ce`** +```bash +git branch +main +beta +dev +feature/bleve +feature/followship +feature/mir +feature/localoss +jc/alimy +r/paopao-plus +r/paopao-pro +x/sqlc +x/sqlx +``` +**分支说明** +| 名称 | 说明 | 备注| +| ----- | ----- | ----- | +| [`main`](https://github.com/rocboss/paopao-ce) | 主分支 |分支`main`是主分支,也是paopao-ce的稳定版本发布分支,只有经过内部测试,没有重大bug出现的稳定代码才会推进到这个分支;该分支主要由`beta`分支代码演进而来,原则上**只接受bug修复PR**。`rc版本/稳定版本` 发布都应该在`main`主分支中进行。| +| [`beta`](https://github.com/rocboss/paopao-ce/tree/beta) | 公测分支 |分支`beta`是公测分支,代码推进到`main`主分支的候选分支;该分支主要由`dev`分支代码演进而来,**接受bug修复以及新功能优化的PR**,原则上不接受新功能PR。`alpha/beta版本` 发布都应该在`beta`公测分支下进行。| +| [`dev`](https://github.com/rocboss/paopao-ce/tree/dev) | 开发分支 | 分支`dev`是开发分支,**不定期频繁更新**,接受 *新功能PR、代码优化PR、bug修复PR*;**新功能PR** 都应该首先提交给`dev`分支进行合并,bug修复/代码优化 后 **冻结新功能** 将代码演进合并到`beta`分支。| +| `feature/*` | 子功能分支 |`feature/*`是新功能子分支,一般新功能子分支都是 *从`dev`开发分支fork出来的*;子功能分支 **只专注于该新功能** 代码的开发/优化,待开发接近内测阶段 *提交新功能PR给`dev`分支进行review/merge*,待新功能代码演进到`beta`分支后,原则上是可以删除该分支,但也可以保留到稳定版本发布。**该分支专注于新功能的开发,只接受新功能的bug修复/优化PR**。| +| `jc/*` |维护者的开发分支|`jc/*`是代码库维护者的开发分支,一般包含一些局部优化或者bug修复代码,有时可以直接将代码merge到`dev/beta`分支,原则上不允许直接merge代码到`main`主分支。| +| `x/*` |实验分支|`x/*`是技术实验分支,某些技术的引入需要经过具体的代码实现与真实场景的测评,考量评估后如果某项技术适合引入到paopao-ce,就fork出一个`feature/*`分支,作为新功能引入到paopao-ce。一般一些比较激进的技术,从`dev`分支fork出一个新的`x/*`分支,各种尝试、考量、评估后,或丢弃、或引入到paopao-ce。| +| `t/*` | 临时分支 |`t/*`是临时发版本分支,一般 `beta` 分支演进到正式版本发布前的最后某个beta版本(比如v0.2.0-beta)就从beta分支fork出一个 `t/*` 分支用于向 `main` 分支提交 PR 用于Review,待 PR Reviewed 合并到 `main` 分支后,可以删除这个临时创建的分支。这样设计主要是考虑到有时合并到 `main` 分支时,需要Review的时间可能会长一些,而dev分支的代码又急需推进到beta分支以发布下一个alpha版本用于内测,相当于为下一个测试版本发布腾地方。| +| `r/*` |发行版本分支|`r/*`是不同发行版本分支,不同发行版本各有不同的侧重点,可以根据需要选择适合的发行版本。| + +**发行版本分支说明** +| 名称 | 说明 | 维护者 | 备注 | +| ----- | ----- | ----- | ----- | +|[`paopao-ce`](https://github.com/rocboss/paopao-ce/tree/dev)|paopao-ce 主发行版本|[ROC](https://github.com/rocboss 'ROC')|该分支 [数据逻辑层](https://github.com/rocboss/paopao-ce/tree/dev/internal/dao/jinzhu) 使用[gorm](https://github.com/go-gorm/gorm)作为数据逻辑层的ORM框架,适配MySQL/PostgreSQL/Sqlite3数据库。| +|[`r/paopao-ce-plus`](https://github.com/rocboss/paopao-ce/tree/r/paopao-ce-plus)|paopao-ce-plus 发行版本|[北野](https://github.com/alimy 'Michael Li')|该分支 [数据逻辑层](https://github.com/rocboss/paopao-ce/tree/r/paopao-ce-plus/internal/dao/sakila) 使用[sqlx](https://github.com/jmoiron/sqlx)作为数据逻辑层的ORM框架,专注于为MySQL/PostgreSQL/Sqlite3使用更优化的查询语句以提升数据检索效率。建议熟悉[sqlx](https://github.com/jmoiron/sqlx)的开发人员可以基于此版本来做 二次开发。| +|[`r/paopao-ce-pro`](https://github.com/rocboss/paopao-ce/tree/r/paopao-ce-pro)|paopao-ce-pro 发行版本|[北野](https://github.com/alimy 'Michael Li')|该分支 [数据逻辑层](https://github.com/rocboss/paopao-ce/tree/r/paopao-ce-pro/internal/dao/slonik) 使用[sqlc](https://github.com/kyleconroy/sqlc)作为sql语句生成器自动生成ORM代码,专门针对特定数据库MySQL/PostgreSQL进行查询优化,熟悉[sqlc](https://github.com/kyleconroy/sqlc)的开发人员可以基于此版本来做 二次开发。(另:分支目前只使用[pgx-v5](https://github.com/jackc/pgx)适配了PostgreSQL数据库,后续或许会适配MySQL/TiDB数据库。)| + +**代码分支演进图** +![](docs/proposal/.assets/000-01.png) + +### 部署站点信息 +* [官方 paopao.info](https://www.paopao.info) +> 具体部署站点信息请查阅 [deployed-sites](./deployed-sites.md 'deployed sites'). 欢迎站长将已部署PaoPao实例的站点信息添加到 [deployed-sites](./deployed-sites.md 'deployed sites') 列表中。 + +#### Collaborator's paopao account +| 昵称 | [@GitHub](https://github.com 'github.com') | [@PaoPao](https://www.paopao.info 'paopao.info') | +| ----- | ----- | ----- | +| ROC | [ROC](https://github.com/rocboss 'ROC')|[ROC](https://www.paopao.info/#/user?username=roc 'ROC @roc')| +| [北野](https://alimy.me '糊涂小栈') | [Michael Li](https://github.com/alimy 'Michael Li') | [alimy](https://www.paopao.info/#/user?username=alimy '北野 @alimy')| +| orzi!| [orzi!](https://github.com/orziz 'orzi!')|| + ### 其他说明 建议后端服务使用 `supervisor` 守护进程,并通过 `nginx` 反向代理后,提供API给前端服务调用。 短信通道使用的[聚合数据](https://www.juhe.cn/),如果申请不下来,可以考虑替换其他服务商。 -代码结构比较简单,很方便扩展 +代码结构比较简单,很方便扩展,开发文档请参阅[docs](docs '开发文档'). ## 👯‍♀️ 贡献 +paopao-ce 是一个利用 *业余时间* 本着 **"Just for fun just do it."** 的心态 *持续有序* **开发/优化/维护**的开源项目,没有KPI考核、没有Roadmap进度压力、没有技术支持日程安排,或许有些许不足之处,但是重在精神可嘉。 借用网络中的话 **"F\*k talk, f\*k of tech innovation, Shut up and show me your code."** 一切都因更好的体验,一切都是为了爱好,一切都在代码里;期待老铁们加入,一起开发、一起折腾、一起快乐。 + +喜欢的朋友记得给个Star,欢迎贡献PR。 -喜欢的朋友欢迎给个Star、贡献PR。 +[![Star History Chart](https://api.star-history.com/svg?repos=rocboss/paopao-ce&type=Date)](https://star-history.com/#rocboss/paopao-ce&Date) ## License diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 00000000..7ef7c15b --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,57 @@ +## Roadmap for paopao-ce +[paopao-ce](https://github.com/rocboss/paopao-ce/tree/dev)/[paopao-ce-plus](https://github.com/rocboss/paopao-ce/tree/r/paopao-ce-plus)/[paopao-ce-pro](https://github.com/rocboss/paopao-ce/tree/r/paopao-ce-pro) features develop or optimize and bug fix roadmap. + +## paopao-ce roadmap +#### v0.3.0 +* [ ] add `Followship` feature +* [ ] add `Auth:Bcrypt` feature +* [ ] add `Auth:MD5` feature (just for compatible) +* [ ] add extend base ORM code for implement data logic base sqlx/sqlc +* [ ] optimize media tweet submit logic +* [ ] optimize search logic service +* [ ] remove `Deprecated:OldWeb` feature + + +#### v0.2.0 +* [x] add `Friendship` feature +* [x] add `Lightship` feature +* [x] add `Pyroscope` feature +* [x] add new `Web` service +* [x] add `Frontend:Web` feature +* [x] add `Deprecated:OldWeb` feature +* [x] support run multiple service in single paopao-ce instance +* [x] use [go-mir](https://github.com/alimy/mir) optimize paopao-ce source code architecture + +#### Next +* [ ] add `Bleve` feature +* [ ] add `SpaceX` feature +* [ ] add `Bot` feature +* [ ] add `Admin` feature +* [ ] add `NativeOBS` feature +* [ ] add `Mobile` gRPC API service feature +* [ ] add admin web frontend +* [ ] add tweet forwarding support +* [ ] add tweet resource access control base on simple RBAC support +* [ ] add user's `Activation Code` feature support +* [ ] add user block feature support +* [ ] add i18n support +* [ ] add reactions support +* [ ] add tweet thread like twitter support +* [ ] add short link support +* [ ] optimize current message push logic service use `ims` module +* [ ] optimize topics service +* [ ] optimize backend data logic service(optimize database CRUD operate) + +## paopao-ce-plus roadmap +#### paopao-ce-plus/v0.3.0 +* [ ] adapt for paopao-ce v0.3.0 + +#### paopao-ce-plus/v0.2.0 +* [ ] adapt for paopao-ce v0.2.0 + +## paopao-ce-pro roadmap +#### paopao-ce-pro/v0.3.0 +* [ ] adapt for paopao-ce v0.3.0 + +#### paopao-ce-pro/v0.2.0 +* [ ] adapt for paopao-ce v0.2.0 diff --git a/auto/api/m/v1/user.go b/auto/api/m/v1/user.go new file mode 100644 index 00000000..394b86b7 --- /dev/null +++ b/auto/api/m/v1/user.go @@ -0,0 +1,142 @@ +// Code generated by go-mir. DO NOT EDIT. +// versions: +// - mir v3.1.1 + +package v1 + +import ( + "net/http" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" +) + +type LoginReq struct { + AgentInfo AgentInfo `json:"agent_info"` + Name string `json:"name"` + Passwd string `json:"passwd"` +} + +type AgentInfo struct { + Platform string `json:"platform"` + UserAgent string `json:"user_agent"` +} + +type LoginResp struct { + UserInfo + ServerInfo ServerInfo `json:"server_info"` + JwtToken string `json:"jwt_token"` +} + +type ServerInfo struct { + ApiVer string `json:"api_ver"` +} + +type UserInfo struct { + Name string `json:"name"` +} + +type User interface { + // Chain provide handlers chain for gin + Chain() gin.HandlersChain + + Logout() mir.Error + Login(*LoginReq) (*LoginResp, mir.Error) + + mustEmbedUnimplementedUserServant() +} + +type UserBinding interface { + BindLogin(*gin.Context) (*LoginReq, mir.Error) + + mustEmbedUnimplementedUserBinding() +} + +type UserRender interface { + RenderLogout(*gin.Context, mir.Error) + RenderLogin(*gin.Context, *LoginResp, mir.Error) + + mustEmbedUnimplementedUserRender() +} + +// RegisterUserServant register User servant to gin +func RegisterUserServant(e *gin.Engine, s User, b UserBinding, r UserRender) { + router := e.Group("m/v1") + // use chain for router + middlewares := s.Chain() + router.Use(middlewares...) + + // register routes info to router + router.Handle("POST", "/user/logout/", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + r.RenderLogout(c, s.Logout()) + }) + + router.Handle("POST", "/user/login/", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindLogin(c) + if err != nil { + r.RenderLogin(c, nil, err) + return + } + resp, err := s.Login(req) + r.RenderLogin(c, resp, err) + }) + +} + +// UnimplementedUserServant can be embedded to have forward compatible implementations. +type UnimplementedUserServant struct { +} + +func (UnimplementedUserServant) Chain() gin.HandlersChain { + return nil +} + +func (UnimplementedUserServant) Logout() mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedUserServant) Login(req *LoginReq) (*LoginResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedUserServant) mustEmbedUnimplementedUserServant() {} + +// UnimplementedUserRender can be embedded to have forward compatible implementations. +type UnimplementedUserRender struct { + RenderAny func(*gin.Context, any, mir.Error) +} + +func (r *UnimplementedUserRender) RenderLogout(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedUserRender) RenderLogin(c *gin.Context, data *LoginResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedUserRender) mustEmbedUnimplementedUserRender() {} + +// UnimplementedUserBinding can be embedded to have forward compatible implementations. +type UnimplementedUserBinding struct { + BindAny func(*gin.Context, any) mir.Error +} + +func (b *UnimplementedUserBinding) BindLogin(c *gin.Context) (*LoginReq, mir.Error) { + obj := new(LoginReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedUserBinding) mustEmbedUnimplementedUserBinding() {} diff --git a/auto/api/r/v1/user.go b/auto/api/r/v1/user.go new file mode 100644 index 00000000..40782a83 --- /dev/null +++ b/auto/api/r/v1/user.go @@ -0,0 +1,142 @@ +// Code generated by go-mir. DO NOT EDIT. +// versions: +// - mir v3.1.1 + +package v1 + +import ( + "net/http" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" +) + +type LoginReq struct { + AgentInfo AgentInfo `json:"agent_info"` + Name string `json:"name"` + Passwd string `json:"passwd"` +} + +type AgentInfo struct { + Platform string `json:"platform"` + UserAgent string `json:"user_agent"` +} + +type LoginResp struct { + UserInfo + ServerInfo ServerInfo `json:"server_info"` + JwtToken string `json:"jwt_token"` +} + +type ServerInfo struct { + ApiVer string `json:"api_ver"` +} + +type UserInfo struct { + Name string `json:"name"` +} + +type User interface { + // Chain provide handlers chain for gin + Chain() gin.HandlersChain + + Logout() mir.Error + Login(*LoginReq) (*LoginResp, mir.Error) + + mustEmbedUnimplementedUserServant() +} + +type UserBinding interface { + BindLogin(*gin.Context) (*LoginReq, mir.Error) + + mustEmbedUnimplementedUserBinding() +} + +type UserRender interface { + RenderLogout(*gin.Context, mir.Error) + RenderLogin(*gin.Context, *LoginResp, mir.Error) + + mustEmbedUnimplementedUserRender() +} + +// RegisterUserServant register User servant to gin +func RegisterUserServant(e *gin.Engine, s User, b UserBinding, r UserRender) { + router := e.Group("r/v1") + // use chain for router + middlewares := s.Chain() + router.Use(middlewares...) + + // register routes info to router + router.Handle("POST", "/user/logout/", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + r.RenderLogout(c, s.Logout()) + }) + + router.Handle("POST", "/user/login/", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindLogin(c) + if err != nil { + r.RenderLogin(c, nil, err) + return + } + resp, err := s.Login(req) + r.RenderLogin(c, resp, err) + }) + +} + +// UnimplementedUserServant can be embedded to have forward compatible implementations. +type UnimplementedUserServant struct { +} + +func (UnimplementedUserServant) Chain() gin.HandlersChain { + return nil +} + +func (UnimplementedUserServant) Logout() mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedUserServant) Login(req *LoginReq) (*LoginResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedUserServant) mustEmbedUnimplementedUserServant() {} + +// UnimplementedUserRender can be embedded to have forward compatible implementations. +type UnimplementedUserRender struct { + RenderAny func(*gin.Context, any, mir.Error) +} + +func (r *UnimplementedUserRender) RenderLogout(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedUserRender) RenderLogin(c *gin.Context, data *LoginResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedUserRender) mustEmbedUnimplementedUserRender() {} + +// UnimplementedUserBinding can be embedded to have forward compatible implementations. +type UnimplementedUserBinding struct { + BindAny func(*gin.Context, any) mir.Error +} + +func (b *UnimplementedUserBinding) BindLogin(c *gin.Context) (*LoginReq, mir.Error) { + obj := new(LoginReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedUserBinding) mustEmbedUnimplementedUserBinding() {} diff --git a/auto/api/s/v1/user.go b/auto/api/s/v1/user.go new file mode 100644 index 00000000..f4a7c1dd --- /dev/null +++ b/auto/api/s/v1/user.go @@ -0,0 +1,152 @@ +// Code generated by go-mir. DO NOT EDIT. +// versions: +// - mir v3.1.1 + +package v1 + +import ( + "net/http" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" +) + +type LoginReq struct { + AgentInfo AgentInfo `json:"agent_info"` + Name string `json:"name"` + Passwd string `json:"passwd"` +} + +type AgentInfo struct { + Platform string `json:"platform"` + UserAgent string `json:"user_agent"` +} + +type LoginResp struct { + UserInfo + ServerInfo ServerInfo `json:"server_info"` + JwtToken string `json:"jwt_token"` +} + +type ServerInfo struct { + ApiVer string `json:"api_ver"` +} + +type UserInfo struct { + Name string `json:"name"` +} + +type User interface { + Logout() mir.Error + Login(*LoginReq) (*LoginResp, mir.Error) + Index() mir.Error + + mustEmbedUnimplementedUserServant() +} + +type UserBinding interface { + BindLogin(*gin.Context) (*LoginReq, mir.Error) + + mustEmbedUnimplementedUserBinding() +} + +type UserRender interface { + RenderLogout(*gin.Context, mir.Error) + RenderLogin(*gin.Context, *LoginResp, mir.Error) + RenderIndex(*gin.Context, mir.Error) + + mustEmbedUnimplementedUserRender() +} + +// RegisterUserServant register User servant to gin +func RegisterUserServant(e *gin.Engine, s User, b UserBinding, r UserRender) { + router := e.Group("s/v1") + + // register routes info to router + router.Handle("POST", "/user/logout/", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + r.RenderLogout(c, s.Logout()) + }) + + router.Handle("POST", "/user/login/", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindLogin(c) + if err != nil { + r.RenderLogin(c, nil, err) + return + } + resp, err := s.Login(req) + r.RenderLogin(c, resp, err) + }) + + router.Handle("GET", "/index/", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + r.RenderIndex(c, s.Index()) + }) + +} + +// UnimplementedUserServant can be embedded to have forward compatible implementations. +type UnimplementedUserServant struct { +} + +func (UnimplementedUserServant) Logout() mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedUserServant) Login(req *LoginReq) (*LoginResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedUserServant) Index() mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedUserServant) mustEmbedUnimplementedUserServant() {} + +// UnimplementedUserRender can be embedded to have forward compatible implementations. +type UnimplementedUserRender struct { + RenderAny func(*gin.Context, any, mir.Error) +} + +func (r *UnimplementedUserRender) RenderLogout(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedUserRender) RenderLogin(c *gin.Context, data *LoginResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedUserRender) RenderIndex(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedUserRender) mustEmbedUnimplementedUserRender() {} + +// UnimplementedUserBinding can be embedded to have forward compatible implementations. +type UnimplementedUserBinding struct { + BindAny func(*gin.Context, any) mir.Error +} + +func (b *UnimplementedUserBinding) BindLogin(c *gin.Context) (*LoginReq, mir.Error) { + obj := new(LoginReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedUserBinding) mustEmbedUnimplementedUserBinding() {} diff --git a/auto/api/v1/admin.go b/auto/api/v1/admin.go new file mode 100644 index 00000000..27b7a999 --- /dev/null +++ b/auto/api/v1/admin.go @@ -0,0 +1,97 @@ +// Code generated by go-mir. DO NOT EDIT. +// versions: +// - mir v3.1.1 + +package v1 + +import ( + "net/http" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +type Admin interface { + // Chain provide handlers chain for gin + Chain() gin.HandlersChain + + ChangeUserStatus(*web.ChangeUserStatusReq) mir.Error + + mustEmbedUnimplementedAdminServant() +} + +type AdminBinding interface { + BindChangeUserStatus(*gin.Context) (*web.ChangeUserStatusReq, mir.Error) + + mustEmbedUnimplementedAdminBinding() +} + +type AdminRender interface { + RenderChangeUserStatus(*gin.Context, mir.Error) + + mustEmbedUnimplementedAdminRender() +} + +// RegisterAdminServant register Admin servant to gin +func RegisterAdminServant(e *gin.Engine, s Admin, b AdminBinding, r AdminRender) { + router := e.Group("v1") + // use chain for router + middlewares := s.Chain() + router.Use(middlewares...) + + // register routes info to router + router.Handle("POST", "/admin/user/status", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindChangeUserStatus(c) + if err != nil { + r.RenderChangeUserStatus(c, err) + return + } + r.RenderChangeUserStatus(c, s.ChangeUserStatus(req)) + }) + +} + +// UnimplementedAdminServant can be embedded to have forward compatible implementations. +type UnimplementedAdminServant struct { +} + +func (UnimplementedAdminServant) Chain() gin.HandlersChain { + return nil +} + +func (UnimplementedAdminServant) ChangeUserStatus(req *web.ChangeUserStatusReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedAdminServant) mustEmbedUnimplementedAdminServant() {} + +// UnimplementedAdminRender can be embedded to have forward compatible implementations. +type UnimplementedAdminRender struct { + RenderAny func(*gin.Context, any, mir.Error) +} + +func (r *UnimplementedAdminRender) RenderChangeUserStatus(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedAdminRender) mustEmbedUnimplementedAdminRender() {} + +// UnimplementedAdminBinding can be embedded to have forward compatible implementations. +type UnimplementedAdminBinding struct { + BindAny func(*gin.Context, any) mir.Error +} + +func (b *UnimplementedAdminBinding) BindChangeUserStatus(c *gin.Context) (*web.ChangeUserStatusReq, mir.Error) { + obj := new(web.ChangeUserStatusReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedAdminBinding) mustEmbedUnimplementedAdminBinding() {} diff --git a/auto/api/v1/alipay_priv.go b/auto/api/v1/alipay_priv.go new file mode 100644 index 00000000..c9784968 --- /dev/null +++ b/auto/api/v1/alipay_priv.go @@ -0,0 +1,164 @@ +// Code generated by go-mir. DO NOT EDIT. +// versions: +// - mir v3.1.1 + +package v1 + +import ( + "net/http" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +type AlipayPriv interface { + // Chain provide handlers chain for gin + Chain() gin.HandlersChain + + UserWalletBills(*web.UserWalletBillsReq) (*web.UserWalletBillsResp, mir.Error) + UserRechargeResult(*web.UserRechargeResultReq) (*web.UserRechargeResultResp, mir.Error) + UserRechargeLink(*web.UserRechargeLinkReq) (*web.UserRechargeLinkResp, mir.Error) + + mustEmbedUnimplementedAlipayPrivServant() +} + +type AlipayPrivBinding interface { + BindUserWalletBills(*gin.Context) (*web.UserWalletBillsReq, mir.Error) + BindUserRechargeResult(*gin.Context) (*web.UserRechargeResultReq, mir.Error) + BindUserRechargeLink(*gin.Context) (*web.UserRechargeLinkReq, mir.Error) + + mustEmbedUnimplementedAlipayPrivBinding() +} + +type AlipayPrivRender interface { + RenderUserWalletBills(*gin.Context, *web.UserWalletBillsResp, mir.Error) + RenderUserRechargeResult(*gin.Context, *web.UserRechargeResultResp, mir.Error) + RenderUserRechargeLink(*gin.Context, *web.UserRechargeLinkResp, mir.Error) + + mustEmbedUnimplementedAlipayPrivRender() +} + +// RegisterAlipayPrivServant register AlipayPriv servant to gin +func RegisterAlipayPrivServant(e *gin.Engine, s AlipayPriv, b AlipayPrivBinding, r AlipayPrivRender) { + router := e.Group("v1") + // use chain for router + middlewares := s.Chain() + router.Use(middlewares...) + + // register routes info to router + router.Handle("GET", "/user/wallet/bills", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindUserWalletBills(c) + if err != nil { + r.RenderUserWalletBills(c, nil, err) + return + } + resp, err := s.UserWalletBills(req) + r.RenderUserWalletBills(c, resp, err) + }) + + router.Handle("GET", "/user/recharge", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindUserRechargeResult(c) + if err != nil { + r.RenderUserRechargeResult(c, nil, err) + return + } + resp, err := s.UserRechargeResult(req) + r.RenderUserRechargeResult(c, resp, err) + }) + + router.Handle("POST", "/user/recharge", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindUserRechargeLink(c) + if err != nil { + r.RenderUserRechargeLink(c, nil, err) + return + } + resp, err := s.UserRechargeLink(req) + r.RenderUserRechargeLink(c, resp, err) + }) + +} + +// UnimplementedAlipayPrivServant can be embedded to have forward compatible implementations. +type UnimplementedAlipayPrivServant struct { +} + +func (UnimplementedAlipayPrivServant) Chain() gin.HandlersChain { + return nil +} + +func (UnimplementedAlipayPrivServant) UserWalletBills(req *web.UserWalletBillsReq) (*web.UserWalletBillsResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedAlipayPrivServant) UserRechargeResult(req *web.UserRechargeResultReq) (*web.UserRechargeResultResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedAlipayPrivServant) UserRechargeLink(req *web.UserRechargeLinkReq) (*web.UserRechargeLinkResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedAlipayPrivServant) mustEmbedUnimplementedAlipayPrivServant() {} + +// UnimplementedAlipayPrivRender can be embedded to have forward compatible implementations. +type UnimplementedAlipayPrivRender struct { + RenderAny func(*gin.Context, any, mir.Error) +} + +func (r *UnimplementedAlipayPrivRender) RenderUserWalletBills(c *gin.Context, data *web.UserWalletBillsResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedAlipayPrivRender) RenderUserRechargeResult(c *gin.Context, data *web.UserRechargeResultResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedAlipayPrivRender) RenderUserRechargeLink(c *gin.Context, data *web.UserRechargeLinkResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedAlipayPrivRender) mustEmbedUnimplementedAlipayPrivRender() {} + +// UnimplementedAlipayPrivBinding can be embedded to have forward compatible implementations. +type UnimplementedAlipayPrivBinding struct { + BindAny func(*gin.Context, any) mir.Error +} + +func (b *UnimplementedAlipayPrivBinding) BindUserWalletBills(c *gin.Context) (*web.UserWalletBillsReq, mir.Error) { + obj := new(web.UserWalletBillsReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedAlipayPrivBinding) BindUserRechargeResult(c *gin.Context) (*web.UserRechargeResultReq, mir.Error) { + obj := new(web.UserRechargeResultReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedAlipayPrivBinding) BindUserRechargeLink(c *gin.Context) (*web.UserRechargeLinkReq, mir.Error) { + obj := new(web.UserRechargeLinkReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedAlipayPrivBinding) mustEmbedUnimplementedAlipayPrivBinding() {} diff --git a/auto/api/v1/alipay_pub.go b/auto/api/v1/alipay_pub.go new file mode 100644 index 00000000..7ac65188 --- /dev/null +++ b/auto/api/v1/alipay_pub.go @@ -0,0 +1,87 @@ +// Code generated by go-mir. DO NOT EDIT. +// versions: +// - mir v3.1.1 + +package v1 + +import ( + "net/http" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +type AlipayPub interface { + AlipayNotify(*web.AlipayNotifyReq) mir.Error + + mustEmbedUnimplementedAlipayPubServant() +} + +type AlipayPubBinding interface { + BindAlipayNotify(*gin.Context) (*web.AlipayNotifyReq, mir.Error) + + mustEmbedUnimplementedAlipayPubBinding() +} + +type AlipayPubRender interface { + RenderAlipayNotify(*gin.Context, mir.Error) + + mustEmbedUnimplementedAlipayPubRender() +} + +// RegisterAlipayPubServant register AlipayPub servant to gin +func RegisterAlipayPubServant(e *gin.Engine, s AlipayPub, b AlipayPubBinding, r AlipayPubRender) { + router := e.Group("v1") + + // register routes info to router + router.Handle("POST", "/alipay/notify", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindAlipayNotify(c) + if err != nil { + r.RenderAlipayNotify(c, err) + return + } + r.RenderAlipayNotify(c, s.AlipayNotify(req)) + }) + +} + +// UnimplementedAlipayPubServant can be embedded to have forward compatible implementations. +type UnimplementedAlipayPubServant struct { +} + +func (UnimplementedAlipayPubServant) AlipayNotify(req *web.AlipayNotifyReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedAlipayPubServant) mustEmbedUnimplementedAlipayPubServant() {} + +// UnimplementedAlipayPubRender can be embedded to have forward compatible implementations. +type UnimplementedAlipayPubRender struct { + RenderAny func(*gin.Context, any, mir.Error) +} + +func (r *UnimplementedAlipayPubRender) RenderAlipayNotify(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedAlipayPubRender) mustEmbedUnimplementedAlipayPubRender() {} + +// UnimplementedAlipayPubBinding can be embedded to have forward compatible implementations. +type UnimplementedAlipayPubBinding struct { + BindAny func(*gin.Context, any) mir.Error +} + +func (b *UnimplementedAlipayPubBinding) BindAlipayNotify(c *gin.Context) (*web.AlipayNotifyReq, mir.Error) { + obj := new(web.AlipayNotifyReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedAlipayPubBinding) mustEmbedUnimplementedAlipayPubBinding() {} diff --git a/auto/api/v1/core.go b/auto/api/v1/core.go new file mode 100644 index 00000000..4685ceba --- /dev/null +++ b/auto/api/v1/core.go @@ -0,0 +1,586 @@ +// Code generated by go-mir. DO NOT EDIT. +// versions: +// - mir v3.1.1 + +package v1 + +import ( + "net/http" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +type Core interface { + // Chain provide handlers chain for gin + Chain() gin.HandlersChain + + TweetCollectionStatus(*web.TweetCollectionStatusReq) (*web.TweetCollectionStatusResp, mir.Error) + TweetStarStatus(*web.TweetStarStatusReq) (*web.TweetStarStatusResp, mir.Error) + SuggestTags(*web.SuggestTagsReq) (*web.SuggestTagsResp, mir.Error) + SuggestUsers(*web.SuggestUsersReq) (*web.SuggestUsersResp, mir.Error) + ChangeAvatar(*web.ChangeAvatarReq) mir.Error + ChangeNickname(*web.ChangeNicknameReq) mir.Error + ChangePassword(*web.ChangePasswordReq) mir.Error + UserPhoneBind(*web.UserPhoneBindReq) mir.Error + GetStars(*web.GetStarsReq) (*web.GetStarsResp, mir.Error) + GetCollections(*web.GetCollectionsReq) (*web.GetCollectionsResp, mir.Error) + SendUserWhisper(*web.SendWhisperReq) mir.Error + ReadMessage(*web.ReadMessageReq) mir.Error + GetMessages(*web.GetMessagesReq) (*web.GetMessagesResp, mir.Error) + GetUnreadMsgCount(*web.GetUnreadMsgCountReq) (*web.GetUnreadMsgCountResp, mir.Error) + GetUserInfo(*web.UserInfoReq) (*web.UserInfoResp, mir.Error) + SyncSearchIndex(*web.SyncSearchIndexReq) mir.Error + + mustEmbedUnimplementedCoreServant() +} + +type CoreBinding interface { + BindTweetCollectionStatus(*gin.Context) (*web.TweetCollectionStatusReq, mir.Error) + BindTweetStarStatus(*gin.Context) (*web.TweetStarStatusReq, mir.Error) + BindSuggestTags(*gin.Context) (*web.SuggestTagsReq, mir.Error) + BindSuggestUsers(*gin.Context) (*web.SuggestUsersReq, mir.Error) + BindChangeAvatar(*gin.Context) (*web.ChangeAvatarReq, mir.Error) + BindChangeNickname(*gin.Context) (*web.ChangeNicknameReq, mir.Error) + BindChangePassword(*gin.Context) (*web.ChangePasswordReq, mir.Error) + BindUserPhoneBind(*gin.Context) (*web.UserPhoneBindReq, mir.Error) + BindGetStars(*gin.Context) (*web.GetStarsReq, mir.Error) + BindGetCollections(*gin.Context) (*web.GetCollectionsReq, mir.Error) + BindSendUserWhisper(*gin.Context) (*web.SendWhisperReq, mir.Error) + BindReadMessage(*gin.Context) (*web.ReadMessageReq, mir.Error) + BindGetMessages(*gin.Context) (*web.GetMessagesReq, mir.Error) + BindGetUnreadMsgCount(*gin.Context) (*web.GetUnreadMsgCountReq, mir.Error) + BindGetUserInfo(*gin.Context) (*web.UserInfoReq, mir.Error) + BindSyncSearchIndex(*gin.Context) (*web.SyncSearchIndexReq, mir.Error) + + mustEmbedUnimplementedCoreBinding() +} + +type CoreRender interface { + RenderTweetCollectionStatus(*gin.Context, *web.TweetCollectionStatusResp, mir.Error) + RenderTweetStarStatus(*gin.Context, *web.TweetStarStatusResp, mir.Error) + RenderSuggestTags(*gin.Context, *web.SuggestTagsResp, mir.Error) + RenderSuggestUsers(*gin.Context, *web.SuggestUsersResp, mir.Error) + RenderChangeAvatar(*gin.Context, mir.Error) + RenderChangeNickname(*gin.Context, mir.Error) + RenderChangePassword(*gin.Context, mir.Error) + RenderUserPhoneBind(*gin.Context, mir.Error) + RenderGetStars(*gin.Context, *web.GetStarsResp, mir.Error) + RenderGetCollections(*gin.Context, *web.GetCollectionsResp, mir.Error) + RenderSendUserWhisper(*gin.Context, mir.Error) + RenderReadMessage(*gin.Context, mir.Error) + RenderGetMessages(*gin.Context, *web.GetMessagesResp, mir.Error) + RenderGetUnreadMsgCount(*gin.Context, *web.GetUnreadMsgCountResp, mir.Error) + RenderGetUserInfo(*gin.Context, *web.UserInfoResp, mir.Error) + RenderSyncSearchIndex(*gin.Context, mir.Error) + + mustEmbedUnimplementedCoreRender() +} + +// RegisterCoreServant register Core servant to gin +func RegisterCoreServant(e *gin.Engine, s Core, b CoreBinding, r CoreRender) { + router := e.Group("v1") + // use chain for router + middlewares := s.Chain() + router.Use(middlewares...) + + // register routes info to router + router.Handle("GET", "/post/collection", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindTweetCollectionStatus(c) + if err != nil { + r.RenderTweetCollectionStatus(c, nil, err) + return + } + resp, err := s.TweetCollectionStatus(req) + r.RenderTweetCollectionStatus(c, resp, err) + }) + + router.Handle("GET", "/post/star", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindTweetStarStatus(c) + if err != nil { + r.RenderTweetStarStatus(c, nil, err) + return + } + resp, err := s.TweetStarStatus(req) + r.RenderTweetStarStatus(c, resp, err) + }) + + router.Handle("GET", "/suggest/tags", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindSuggestTags(c) + if err != nil { + r.RenderSuggestTags(c, nil, err) + return + } + resp, err := s.SuggestTags(req) + r.RenderSuggestTags(c, resp, err) + }) + + router.Handle("GET", "/suggest/users", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindSuggestUsers(c) + if err != nil { + r.RenderSuggestUsers(c, nil, err) + return + } + resp, err := s.SuggestUsers(req) + r.RenderSuggestUsers(c, resp, err) + }) + + router.Handle("POST", "/user/avatar", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindChangeAvatar(c) + if err != nil { + r.RenderChangeAvatar(c, err) + return + } + r.RenderChangeAvatar(c, s.ChangeAvatar(req)) + }) + + router.Handle("POST", "/user/nickname", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindChangeNickname(c) + if err != nil { + r.RenderChangeNickname(c, err) + return + } + r.RenderChangeNickname(c, s.ChangeNickname(req)) + }) + + router.Handle("POST", "/user/password", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindChangePassword(c) + if err != nil { + r.RenderChangePassword(c, err) + return + } + r.RenderChangePassword(c, s.ChangePassword(req)) + }) + + router.Handle("POST", "/user/phone", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindUserPhoneBind(c) + if err != nil { + r.RenderUserPhoneBind(c, err) + return + } + r.RenderUserPhoneBind(c, s.UserPhoneBind(req)) + }) + + router.Handle("GET", "/user/stars", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindGetStars(c) + if err != nil { + r.RenderGetStars(c, nil, err) + return + } + resp, err := s.GetStars(req) + r.RenderGetStars(c, resp, err) + }) + + router.Handle("GET", "/user/collections", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindGetCollections(c) + if err != nil { + r.RenderGetCollections(c, nil, err) + return + } + resp, err := s.GetCollections(req) + r.RenderGetCollections(c, resp, err) + }) + + router.Handle("POST", "/user/whisper", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindSendUserWhisper(c) + if err != nil { + r.RenderSendUserWhisper(c, err) + return + } + r.RenderSendUserWhisper(c, s.SendUserWhisper(req)) + }) + + router.Handle("POST", "/user/message/read", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindReadMessage(c) + if err != nil { + r.RenderReadMessage(c, err) + return + } + r.RenderReadMessage(c, s.ReadMessage(req)) + }) + + router.Handle("GET", "/user/messages", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindGetMessages(c) + if err != nil { + r.RenderGetMessages(c, nil, err) + return + } + resp, err := s.GetMessages(req) + r.RenderGetMessages(c, resp, err) + }) + + router.Handle("GET", "/user/msgcount/unread", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindGetUnreadMsgCount(c) + if err != nil { + r.RenderGetUnreadMsgCount(c, nil, err) + return + } + resp, err := s.GetUnreadMsgCount(req) + r.RenderGetUnreadMsgCount(c, resp, err) + }) + + router.Handle("GET", "/user/info", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindGetUserInfo(c) + if err != nil { + r.RenderGetUserInfo(c, nil, err) + return + } + resp, err := s.GetUserInfo(req) + r.RenderGetUserInfo(c, resp, err) + }) + + router.Handle("GET", "/sync/index", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindSyncSearchIndex(c) + if err != nil { + r.RenderSyncSearchIndex(c, err) + return + } + r.RenderSyncSearchIndex(c, s.SyncSearchIndex(req)) + }) + +} + +// UnimplementedCoreServant can be embedded to have forward compatible implementations. +type UnimplementedCoreServant struct { +} + +func (UnimplementedCoreServant) Chain() gin.HandlersChain { + return nil +} + +func (UnimplementedCoreServant) TweetCollectionStatus(req *web.TweetCollectionStatusReq) (*web.TweetCollectionStatusResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) TweetStarStatus(req *web.TweetStarStatusReq) (*web.TweetStarStatusResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) SuggestTags(req *web.SuggestTagsReq) (*web.SuggestTagsResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) SuggestUsers(req *web.SuggestUsersReq) (*web.SuggestUsersResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) ChangeAvatar(req *web.ChangeAvatarReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) ChangeNickname(req *web.ChangeNicknameReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) ChangePassword(req *web.ChangePasswordReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) UserPhoneBind(req *web.UserPhoneBindReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) GetStars(req *web.GetStarsReq) (*web.GetStarsResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) GetCollections(req *web.GetCollectionsReq) (*web.GetCollectionsResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) SendUserWhisper(req *web.SendWhisperReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) ReadMessage(req *web.ReadMessageReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) GetMessages(req *web.GetMessagesReq) (*web.GetMessagesResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) GetUnreadMsgCount(req *web.GetUnreadMsgCountReq) (*web.GetUnreadMsgCountResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) GetUserInfo(req *web.UserInfoReq) (*web.UserInfoResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) SyncSearchIndex(req *web.SyncSearchIndexReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedCoreServant) mustEmbedUnimplementedCoreServant() {} + +// UnimplementedCoreRender can be embedded to have forward compatible implementations. +type UnimplementedCoreRender struct { + RenderAny func(*gin.Context, any, mir.Error) +} + +func (r *UnimplementedCoreRender) RenderTweetCollectionStatus(c *gin.Context, data *web.TweetCollectionStatusResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedCoreRender) RenderTweetStarStatus(c *gin.Context, data *web.TweetStarStatusResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedCoreRender) RenderSuggestTags(c *gin.Context, data *web.SuggestTagsResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedCoreRender) RenderSuggestUsers(c *gin.Context, data *web.SuggestUsersResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedCoreRender) RenderChangeAvatar(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedCoreRender) RenderChangeNickname(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedCoreRender) RenderChangePassword(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedCoreRender) RenderUserPhoneBind(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedCoreRender) RenderGetStars(c *gin.Context, data *web.GetStarsResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedCoreRender) RenderGetCollections(c *gin.Context, data *web.GetCollectionsResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedCoreRender) RenderSendUserWhisper(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedCoreRender) RenderReadMessage(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedCoreRender) RenderGetMessages(c *gin.Context, data *web.GetMessagesResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedCoreRender) RenderGetUnreadMsgCount(c *gin.Context, data *web.GetUnreadMsgCountResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedCoreRender) RenderGetUserInfo(c *gin.Context, data *web.UserInfoResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedCoreRender) RenderSyncSearchIndex(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedCoreRender) mustEmbedUnimplementedCoreRender() {} + +// UnimplementedCoreBinding can be embedded to have forward compatible implementations. +type UnimplementedCoreBinding struct { + BindAny func(*gin.Context, any) mir.Error +} + +func (b *UnimplementedCoreBinding) BindTweetCollectionStatus(c *gin.Context) (*web.TweetCollectionStatusReq, mir.Error) { + obj := new(web.TweetCollectionStatusReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindTweetStarStatus(c *gin.Context) (*web.TweetStarStatusReq, mir.Error) { + obj := new(web.TweetStarStatusReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindSuggestTags(c *gin.Context) (*web.SuggestTagsReq, mir.Error) { + obj := new(web.SuggestTagsReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindSuggestUsers(c *gin.Context) (*web.SuggestUsersReq, mir.Error) { + obj := new(web.SuggestUsersReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindChangeAvatar(c *gin.Context) (*web.ChangeAvatarReq, mir.Error) { + obj := new(web.ChangeAvatarReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindChangeNickname(c *gin.Context) (*web.ChangeNicknameReq, mir.Error) { + obj := new(web.ChangeNicknameReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindChangePassword(c *gin.Context) (*web.ChangePasswordReq, mir.Error) { + obj := new(web.ChangePasswordReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindUserPhoneBind(c *gin.Context) (*web.UserPhoneBindReq, mir.Error) { + obj := new(web.UserPhoneBindReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindGetStars(c *gin.Context) (*web.GetStarsReq, mir.Error) { + obj := new(web.GetStarsReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindGetCollections(c *gin.Context) (*web.GetCollectionsReq, mir.Error) { + obj := new(web.GetCollectionsReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindSendUserWhisper(c *gin.Context) (*web.SendWhisperReq, mir.Error) { + obj := new(web.SendWhisperReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindReadMessage(c *gin.Context) (*web.ReadMessageReq, mir.Error) { + obj := new(web.ReadMessageReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindGetMessages(c *gin.Context) (*web.GetMessagesReq, mir.Error) { + obj := new(web.GetMessagesReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindGetUnreadMsgCount(c *gin.Context) (*web.GetUnreadMsgCountReq, mir.Error) { + obj := new(web.GetUnreadMsgCountReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindGetUserInfo(c *gin.Context) (*web.UserInfoReq, mir.Error) { + obj := new(web.UserInfoReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) BindSyncSearchIndex(c *gin.Context) (*web.SyncSearchIndexReq, mir.Error) { + obj := new(web.SyncSearchIndexReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedCoreBinding) mustEmbedUnimplementedCoreBinding() {} diff --git a/auto/api/v1/followship.go b/auto/api/v1/followship.go new file mode 100644 index 00000000..971ce7d6 --- /dev/null +++ b/auto/api/v1/followship.go @@ -0,0 +1,195 @@ +// Code generated by go-mir. DO NOT EDIT. +// versions: +// - mir v3.1.1 + +package v1 + +import ( + "net/http" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +type Followship interface { + // Chain provide handlers chain for gin + Chain() gin.HandlersChain + + ListFollowers(*web.ListFollowersReq) (*web.ListFollowersResp, mir.Error) + ListFollowings(*web.ListFollowingsReq) (*web.ListFollowingsResp, mir.Error) + DeleteFollowing(*web.DeleteFollowingReq) mir.Error + AddFollowing(*web.AddFollowingReq) mir.Error + + mustEmbedUnimplementedFollowshipServant() +} + +type FollowshipBinding interface { + BindListFollowers(*gin.Context) (*web.ListFollowersReq, mir.Error) + BindListFollowings(*gin.Context) (*web.ListFollowingsReq, mir.Error) + BindDeleteFollowing(*gin.Context) (*web.DeleteFollowingReq, mir.Error) + BindAddFollowing(*gin.Context) (*web.AddFollowingReq, mir.Error) + + mustEmbedUnimplementedFollowshipBinding() +} + +type FollowshipRender interface { + RenderListFollowers(*gin.Context, *web.ListFollowersResp, mir.Error) + RenderListFollowings(*gin.Context, *web.ListFollowingsResp, mir.Error) + RenderDeleteFollowing(*gin.Context, mir.Error) + RenderAddFollowing(*gin.Context, mir.Error) + + mustEmbedUnimplementedFollowshipRender() +} + +// RegisterFollowshipServant register Followship servant to gin +func RegisterFollowshipServant(e *gin.Engine, s Followship, b FollowshipBinding, r FollowshipRender) { + router := e.Group("v1") + // use chain for router + middlewares := s.Chain() + router.Use(middlewares...) + + // register routes info to router + router.Handle("GET", "/follower/list", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindListFollowers(c) + if err != nil { + r.RenderListFollowers(c, nil, err) + return + } + resp, err := s.ListFollowers(req) + r.RenderListFollowers(c, resp, err) + }) + + router.Handle("GET", "/following/list", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindListFollowings(c) + if err != nil { + r.RenderListFollowings(c, nil, err) + return + } + resp, err := s.ListFollowings(req) + r.RenderListFollowings(c, resp, err) + }) + + router.Handle("POST", "/following/delete", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindDeleteFollowing(c) + if err != nil { + r.RenderDeleteFollowing(c, err) + return + } + r.RenderDeleteFollowing(c, s.DeleteFollowing(req)) + }) + + router.Handle("POST", "/following/add", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindAddFollowing(c) + if err != nil { + r.RenderAddFollowing(c, err) + return + } + r.RenderAddFollowing(c, s.AddFollowing(req)) + }) + +} + +// UnimplementedFollowshipServant can be embedded to have forward compatible implementations. +type UnimplementedFollowshipServant struct { +} + +func (UnimplementedFollowshipServant) Chain() gin.HandlersChain { + return nil +} + +func (UnimplementedFollowshipServant) ListFollowers(req *web.ListFollowersReq) (*web.ListFollowersResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedFollowshipServant) ListFollowings(req *web.ListFollowingsReq) (*web.ListFollowingsResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedFollowshipServant) DeleteFollowing(req *web.DeleteFollowingReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedFollowshipServant) AddFollowing(req *web.AddFollowingReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedFollowshipServant) mustEmbedUnimplementedFollowshipServant() {} + +// UnimplementedFollowshipRender can be embedded to have forward compatible implementations. +type UnimplementedFollowshipRender struct { + RenderAny func(*gin.Context, any, mir.Error) +} + +func (r *UnimplementedFollowshipRender) RenderListFollowers(c *gin.Context, data *web.ListFollowersResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedFollowshipRender) RenderListFollowings(c *gin.Context, data *web.ListFollowingsResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedFollowshipRender) RenderDeleteFollowing(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedFollowshipRender) RenderAddFollowing(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedFollowshipRender) mustEmbedUnimplementedFollowshipRender() {} + +// UnimplementedFollowshipBinding can be embedded to have forward compatible implementations. +type UnimplementedFollowshipBinding struct { + BindAny func(*gin.Context, any) mir.Error +} + +func (b *UnimplementedFollowshipBinding) BindListFollowers(c *gin.Context) (*web.ListFollowersReq, mir.Error) { + obj := new(web.ListFollowersReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedFollowshipBinding) BindListFollowings(c *gin.Context) (*web.ListFollowingsReq, mir.Error) { + obj := new(web.ListFollowingsReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedFollowshipBinding) BindDeleteFollowing(c *gin.Context) (*web.DeleteFollowingReq, mir.Error) { + obj := new(web.DeleteFollowingReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedFollowshipBinding) BindAddFollowing(c *gin.Context) (*web.AddFollowingReq, mir.Error) { + obj := new(web.AddFollowingReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedFollowshipBinding) mustEmbedUnimplementedFollowshipBinding() {} diff --git a/auto/api/v1/friendship.go b/auto/api/v1/friendship.go new file mode 100644 index 00000000..ef9e6fbe --- /dev/null +++ b/auto/api/v1/friendship.go @@ -0,0 +1,226 @@ +// Code generated by go-mir. DO NOT EDIT. +// versions: +// - mir v3.1.1 + +package v1 + +import ( + "net/http" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +type Friendship interface { + // Chain provide handlers chain for gin + Chain() gin.HandlersChain + + GetContacts(*web.GetContactsReq) (*web.GetContactsResp, mir.Error) + DeleteFriend(*web.DeleteFriendReq) mir.Error + RejectFriend(*web.RejectFriendReq) mir.Error + AddFriend(*web.AddFriendReq) mir.Error + RequestingFriend(*web.RequestingFriendReq) mir.Error + + mustEmbedUnimplementedFriendshipServant() +} + +type FriendshipBinding interface { + BindGetContacts(*gin.Context) (*web.GetContactsReq, mir.Error) + BindDeleteFriend(*gin.Context) (*web.DeleteFriendReq, mir.Error) + BindRejectFriend(*gin.Context) (*web.RejectFriendReq, mir.Error) + BindAddFriend(*gin.Context) (*web.AddFriendReq, mir.Error) + BindRequestingFriend(*gin.Context) (*web.RequestingFriendReq, mir.Error) + + mustEmbedUnimplementedFriendshipBinding() +} + +type FriendshipRender interface { + RenderGetContacts(*gin.Context, *web.GetContactsResp, mir.Error) + RenderDeleteFriend(*gin.Context, mir.Error) + RenderRejectFriend(*gin.Context, mir.Error) + RenderAddFriend(*gin.Context, mir.Error) + RenderRequestingFriend(*gin.Context, mir.Error) + + mustEmbedUnimplementedFriendshipRender() +} + +// RegisterFriendshipServant register Friendship servant to gin +func RegisterFriendshipServant(e *gin.Engine, s Friendship, b FriendshipBinding, r FriendshipRender) { + router := e.Group("v1") + // use chain for router + middlewares := s.Chain() + router.Use(middlewares...) + + // register routes info to router + router.Handle("GET", "/user/contacts", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindGetContacts(c) + if err != nil { + r.RenderGetContacts(c, nil, err) + return + } + resp, err := s.GetContacts(req) + r.RenderGetContacts(c, resp, err) + }) + + router.Handle("POST", "/friend/delete", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindDeleteFriend(c) + if err != nil { + r.RenderDeleteFriend(c, err) + return + } + r.RenderDeleteFriend(c, s.DeleteFriend(req)) + }) + + router.Handle("POST", "/friend/reject", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindRejectFriend(c) + if err != nil { + r.RenderRejectFriend(c, err) + return + } + r.RenderRejectFriend(c, s.RejectFriend(req)) + }) + + router.Handle("POST", "/friend/add", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindAddFriend(c) + if err != nil { + r.RenderAddFriend(c, err) + return + } + r.RenderAddFriend(c, s.AddFriend(req)) + }) + + router.Handle("POST", "/friend/requesting", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindRequestingFriend(c) + if err != nil { + r.RenderRequestingFriend(c, err) + return + } + r.RenderRequestingFriend(c, s.RequestingFriend(req)) + }) + +} + +// UnimplementedFriendshipServant can be embedded to have forward compatible implementations. +type UnimplementedFriendshipServant struct { +} + +func (UnimplementedFriendshipServant) Chain() gin.HandlersChain { + return nil +} + +func (UnimplementedFriendshipServant) GetContacts(req *web.GetContactsReq) (*web.GetContactsResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedFriendshipServant) DeleteFriend(req *web.DeleteFriendReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedFriendshipServant) RejectFriend(req *web.RejectFriendReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedFriendshipServant) AddFriend(req *web.AddFriendReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedFriendshipServant) RequestingFriend(req *web.RequestingFriendReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedFriendshipServant) mustEmbedUnimplementedFriendshipServant() {} + +// UnimplementedFriendshipRender can be embedded to have forward compatible implementations. +type UnimplementedFriendshipRender struct { + RenderAny func(*gin.Context, any, mir.Error) +} + +func (r *UnimplementedFriendshipRender) RenderGetContacts(c *gin.Context, data *web.GetContactsResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedFriendshipRender) RenderDeleteFriend(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedFriendshipRender) RenderRejectFriend(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedFriendshipRender) RenderAddFriend(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedFriendshipRender) RenderRequestingFriend(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedFriendshipRender) mustEmbedUnimplementedFriendshipRender() {} + +// UnimplementedFriendshipBinding can be embedded to have forward compatible implementations. +type UnimplementedFriendshipBinding struct { + BindAny func(*gin.Context, any) mir.Error +} + +func (b *UnimplementedFriendshipBinding) BindGetContacts(c *gin.Context) (*web.GetContactsReq, mir.Error) { + obj := new(web.GetContactsReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedFriendshipBinding) BindDeleteFriend(c *gin.Context) (*web.DeleteFriendReq, mir.Error) { + obj := new(web.DeleteFriendReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedFriendshipBinding) BindRejectFriend(c *gin.Context) (*web.RejectFriendReq, mir.Error) { + obj := new(web.RejectFriendReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedFriendshipBinding) BindAddFriend(c *gin.Context) (*web.AddFriendReq, mir.Error) { + obj := new(web.AddFriendReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedFriendshipBinding) BindRequestingFriend(c *gin.Context) (*web.RequestingFriendReq, mir.Error) { + obj := new(web.RequestingFriendReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedFriendshipBinding) mustEmbedUnimplementedFriendshipBinding() {} diff --git a/auto/api/v1/loose.go b/auto/api/v1/loose.go new file mode 100644 index 00000000..832f6fc3 --- /dev/null +++ b/auto/api/v1/loose.go @@ -0,0 +1,164 @@ +// Code generated by go-mir. DO NOT EDIT. +// versions: +// - mir v3.1.1 + +package v1 + +import ( + "net/http" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +type Loose interface { + // Chain provide handlers chain for gin + Chain() gin.HandlersChain + + GetUserProfile(*web.GetUserProfileReq) (*web.GetUserProfileResp, mir.Error) + GetUserTweets(*web.GetUserTweetsReq) (*web.GetUserTweetsResp, mir.Error) + Timeline(*web.TimelineReq) (*web.TimelineResp, mir.Error) + + mustEmbedUnimplementedLooseServant() +} + +type LooseBinding interface { + BindGetUserProfile(*gin.Context) (*web.GetUserProfileReq, mir.Error) + BindGetUserTweets(*gin.Context) (*web.GetUserTweetsReq, mir.Error) + BindTimeline(*gin.Context) (*web.TimelineReq, mir.Error) + + mustEmbedUnimplementedLooseBinding() +} + +type LooseRender interface { + RenderGetUserProfile(*gin.Context, *web.GetUserProfileResp, mir.Error) + RenderGetUserTweets(*gin.Context, *web.GetUserTweetsResp, mir.Error) + RenderTimeline(*gin.Context, *web.TimelineResp, mir.Error) + + mustEmbedUnimplementedLooseRender() +} + +// RegisterLooseServant register Loose servant to gin +func RegisterLooseServant(e *gin.Engine, s Loose, b LooseBinding, r LooseRender) { + router := e.Group("v1") + // use chain for router + middlewares := s.Chain() + router.Use(middlewares...) + + // register routes info to router + router.Handle("GET", "/user/profile", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindGetUserProfile(c) + if err != nil { + r.RenderGetUserProfile(c, nil, err) + return + } + resp, err := s.GetUserProfile(req) + r.RenderGetUserProfile(c, resp, err) + }) + + router.Handle("GET", "/user/posts", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindGetUserTweets(c) + if err != nil { + r.RenderGetUserTweets(c, nil, err) + return + } + resp, err := s.GetUserTweets(req) + r.RenderGetUserTweets(c, resp, err) + }) + + router.Handle("GET", "/posts", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindTimeline(c) + if err != nil { + r.RenderTimeline(c, nil, err) + return + } + resp, err := s.Timeline(req) + r.RenderTimeline(c, resp, err) + }) + +} + +// UnimplementedLooseServant can be embedded to have forward compatible implementations. +type UnimplementedLooseServant struct { +} + +func (UnimplementedLooseServant) Chain() gin.HandlersChain { + return nil +} + +func (UnimplementedLooseServant) GetUserProfile(req *web.GetUserProfileReq) (*web.GetUserProfileResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedLooseServant) GetUserTweets(req *web.GetUserTweetsReq) (*web.GetUserTweetsResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedLooseServant) Timeline(req *web.TimelineReq) (*web.TimelineResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedLooseServant) mustEmbedUnimplementedLooseServant() {} + +// UnimplementedLooseRender can be embedded to have forward compatible implementations. +type UnimplementedLooseRender struct { + RenderAny func(*gin.Context, any, mir.Error) +} + +func (r *UnimplementedLooseRender) RenderGetUserProfile(c *gin.Context, data *web.GetUserProfileResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedLooseRender) RenderGetUserTweets(c *gin.Context, data *web.GetUserTweetsResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedLooseRender) RenderTimeline(c *gin.Context, data *web.TimelineResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedLooseRender) mustEmbedUnimplementedLooseRender() {} + +// UnimplementedLooseBinding can be embedded to have forward compatible implementations. +type UnimplementedLooseBinding struct { + BindAny func(*gin.Context, any) mir.Error +} + +func (b *UnimplementedLooseBinding) BindGetUserProfile(c *gin.Context) (*web.GetUserProfileReq, mir.Error) { + obj := new(web.GetUserProfileReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedLooseBinding) BindGetUserTweets(c *gin.Context) (*web.GetUserTweetsReq, mir.Error) { + obj := new(web.GetUserTweetsReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedLooseBinding) BindTimeline(c *gin.Context) (*web.TimelineReq, mir.Error) { + obj := new(web.TimelineReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedLooseBinding) mustEmbedUnimplementedLooseBinding() {} diff --git a/auto/api/v1/priv.go b/auto/api/v1/priv.go new file mode 100644 index 00000000..a29d2858 --- /dev/null +++ b/auto/api/v1/priv.go @@ -0,0 +1,524 @@ +// Code generated by go-mir. DO NOT EDIT. +// versions: +// - mir v3.1.1 + +package v1 + +import ( + "net/http" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +type Priv interface { + // Chain provide handlers chain for gin + Chain() gin.HandlersChain + + DeleteCommentReply(*web.DeleteCommentReplyReq) mir.Error + CreateCommentReply(*web.CreateCommentReplyReq) (*web.CreateCommentReplyResp, mir.Error) + DeleteComment(*web.DeleteCommentReq) mir.Error + CreateComment(*web.CreateCommentReq) (*web.CreateCommentResp, mir.Error) + VisibleTweet(*web.VisibleTweetReq) (*web.VisibleTweetResp, mir.Error) + StickTweet(*web.StickTweetReq) (*web.StickTweetResp, mir.Error) + LockTweet(*web.LockTweetReq) (*web.LockTweetResp, mir.Error) + CollectionTweet(*web.CollectionTweetReq) (*web.CollectionTweetResp, mir.Error) + StarTweet(*web.StarTweetReq) (*web.StarTweetResp, mir.Error) + DeleteTweet(*web.DeleteTweetReq) mir.Error + CreateTweet(*web.CreateTweetReq) (*web.CreateTweetResp, mir.Error) + DownloadAttachment(*web.DownloadAttachmentReq) (*web.DownloadAttachmentResp, mir.Error) + DownloadAttachmentPrecheck(*web.DownloadAttachmentPrecheckReq) (*web.DownloadAttachmentPrecheckResp, mir.Error) + UploadAttachment(*web.UploadAttachmentReq) (*web.UploadAttachmentResp, mir.Error) + + mustEmbedUnimplementedPrivServant() +} + +type PrivBinding interface { + BindDeleteCommentReply(*gin.Context) (*web.DeleteCommentReplyReq, mir.Error) + BindCreateCommentReply(*gin.Context) (*web.CreateCommentReplyReq, mir.Error) + BindDeleteComment(*gin.Context) (*web.DeleteCommentReq, mir.Error) + BindCreateComment(*gin.Context) (*web.CreateCommentReq, mir.Error) + BindVisibleTweet(*gin.Context) (*web.VisibleTweetReq, mir.Error) + BindStickTweet(*gin.Context) (*web.StickTweetReq, mir.Error) + BindLockTweet(*gin.Context) (*web.LockTweetReq, mir.Error) + BindCollectionTweet(*gin.Context) (*web.CollectionTweetReq, mir.Error) + BindStarTweet(*gin.Context) (*web.StarTweetReq, mir.Error) + BindDeleteTweet(*gin.Context) (*web.DeleteTweetReq, mir.Error) + BindCreateTweet(*gin.Context) (*web.CreateTweetReq, mir.Error) + BindDownloadAttachment(*gin.Context) (*web.DownloadAttachmentReq, mir.Error) + BindDownloadAttachmentPrecheck(*gin.Context) (*web.DownloadAttachmentPrecheckReq, mir.Error) + BindUploadAttachment(*gin.Context) (*web.UploadAttachmentReq, mir.Error) + + mustEmbedUnimplementedPrivBinding() +} + +type PrivRender interface { + RenderDeleteCommentReply(*gin.Context, mir.Error) + RenderCreateCommentReply(*gin.Context, *web.CreateCommentReplyResp, mir.Error) + RenderDeleteComment(*gin.Context, mir.Error) + RenderCreateComment(*gin.Context, *web.CreateCommentResp, mir.Error) + RenderVisibleTweet(*gin.Context, *web.VisibleTweetResp, mir.Error) + RenderStickTweet(*gin.Context, *web.StickTweetResp, mir.Error) + RenderLockTweet(*gin.Context, *web.LockTweetResp, mir.Error) + RenderCollectionTweet(*gin.Context, *web.CollectionTweetResp, mir.Error) + RenderStarTweet(*gin.Context, *web.StarTweetResp, mir.Error) + RenderDeleteTweet(*gin.Context, mir.Error) + RenderCreateTweet(*gin.Context, *web.CreateTweetResp, mir.Error) + RenderDownloadAttachment(*gin.Context, *web.DownloadAttachmentResp, mir.Error) + RenderDownloadAttachmentPrecheck(*gin.Context, *web.DownloadAttachmentPrecheckResp, mir.Error) + RenderUploadAttachment(*gin.Context, *web.UploadAttachmentResp, mir.Error) + + mustEmbedUnimplementedPrivRender() +} + +// RegisterPrivServant register Priv servant to gin +func RegisterPrivServant(e *gin.Engine, s Priv, b PrivBinding, r PrivRender) { + router := e.Group("v1") + // use chain for router + middlewares := s.Chain() + router.Use(middlewares...) + + // register routes info to router + router.Handle("DELETE", "/post/comment/reply", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindDeleteCommentReply(c) + if err != nil { + r.RenderDeleteCommentReply(c, err) + return + } + r.RenderDeleteCommentReply(c, s.DeleteCommentReply(req)) + }) + + router.Handle("POST", "/post/comment/reply", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindCreateCommentReply(c) + if err != nil { + r.RenderCreateCommentReply(c, nil, err) + return + } + resp, err := s.CreateCommentReply(req) + r.RenderCreateCommentReply(c, resp, err) + }) + + router.Handle("DELETE", "/post/comment", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindDeleteComment(c) + if err != nil { + r.RenderDeleteComment(c, err) + return + } + r.RenderDeleteComment(c, s.DeleteComment(req)) + }) + + router.Handle("POST", "/post/comment", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindCreateComment(c) + if err != nil { + r.RenderCreateComment(c, nil, err) + return + } + resp, err := s.CreateComment(req) + r.RenderCreateComment(c, resp, err) + }) + + router.Handle("POST", "/post/visibility", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindVisibleTweet(c) + if err != nil { + r.RenderVisibleTweet(c, nil, err) + return + } + resp, err := s.VisibleTweet(req) + r.RenderVisibleTweet(c, resp, err) + }) + + router.Handle("POST", "/post/stick", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindStickTweet(c) + if err != nil { + r.RenderStickTweet(c, nil, err) + return + } + resp, err := s.StickTweet(req) + r.RenderStickTweet(c, resp, err) + }) + + router.Handle("POST", "/post/lock", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindLockTweet(c) + if err != nil { + r.RenderLockTweet(c, nil, err) + return + } + resp, err := s.LockTweet(req) + r.RenderLockTweet(c, resp, err) + }) + + router.Handle("POST", "/post/collection", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindCollectionTweet(c) + if err != nil { + r.RenderCollectionTweet(c, nil, err) + return + } + resp, err := s.CollectionTweet(req) + r.RenderCollectionTweet(c, resp, err) + }) + + router.Handle("POST", "/post/start", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindStarTweet(c) + if err != nil { + r.RenderStarTweet(c, nil, err) + return + } + resp, err := s.StarTweet(req) + r.RenderStarTweet(c, resp, err) + }) + + router.Handle("DELETE", "/post", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindDeleteTweet(c) + if err != nil { + r.RenderDeleteTweet(c, err) + return + } + r.RenderDeleteTweet(c, s.DeleteTweet(req)) + }) + + router.Handle("POST", "/post", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindCreateTweet(c) + if err != nil { + r.RenderCreateTweet(c, nil, err) + return + } + resp, err := s.CreateTweet(req) + r.RenderCreateTweet(c, resp, err) + }) + + router.Handle("GET", "/attachment", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindDownloadAttachment(c) + if err != nil { + r.RenderDownloadAttachment(c, nil, err) + return + } + resp, err := s.DownloadAttachment(req) + r.RenderDownloadAttachment(c, resp, err) + }) + + router.Handle("GET", "/attachment/precheck", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindDownloadAttachmentPrecheck(c) + if err != nil { + r.RenderDownloadAttachmentPrecheck(c, nil, err) + return + } + resp, err := s.DownloadAttachmentPrecheck(req) + r.RenderDownloadAttachmentPrecheck(c, resp, err) + }) + + router.Handle("POST", "/attachment", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindUploadAttachment(c) + if err != nil { + r.RenderUploadAttachment(c, nil, err) + return + } + resp, err := s.UploadAttachment(req) + r.RenderUploadAttachment(c, resp, err) + }) + +} + +// UnimplementedPrivServant can be embedded to have forward compatible implementations. +type UnimplementedPrivServant struct { +} + +func (UnimplementedPrivServant) Chain() gin.HandlersChain { + return nil +} + +func (UnimplementedPrivServant) DeleteCommentReply(req *web.DeleteCommentReplyReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPrivServant) CreateCommentReply(req *web.CreateCommentReplyReq) (*web.CreateCommentReplyResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPrivServant) DeleteComment(req *web.DeleteCommentReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPrivServant) CreateComment(req *web.CreateCommentReq) (*web.CreateCommentResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPrivServant) VisibleTweet(req *web.VisibleTweetReq) (*web.VisibleTweetResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPrivServant) StickTweet(req *web.StickTweetReq) (*web.StickTweetResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPrivServant) LockTweet(req *web.LockTweetReq) (*web.LockTweetResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPrivServant) CollectionTweet(req *web.CollectionTweetReq) (*web.CollectionTweetResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPrivServant) StarTweet(req *web.StarTweetReq) (*web.StarTweetResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPrivServant) DeleteTweet(req *web.DeleteTweetReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPrivServant) CreateTweet(req *web.CreateTweetReq) (*web.CreateTweetResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPrivServant) DownloadAttachment(req *web.DownloadAttachmentReq) (*web.DownloadAttachmentResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPrivServant) DownloadAttachmentPrecheck(req *web.DownloadAttachmentPrecheckReq) (*web.DownloadAttachmentPrecheckResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPrivServant) UploadAttachment(req *web.UploadAttachmentReq) (*web.UploadAttachmentResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPrivServant) mustEmbedUnimplementedPrivServant() {} + +// UnimplementedPrivRender can be embedded to have forward compatible implementations. +type UnimplementedPrivRender struct { + RenderAny func(*gin.Context, any, mir.Error) +} + +func (r *UnimplementedPrivRender) RenderDeleteCommentReply(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedPrivRender) RenderCreateCommentReply(c *gin.Context, data *web.CreateCommentReplyResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPrivRender) RenderDeleteComment(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedPrivRender) RenderCreateComment(c *gin.Context, data *web.CreateCommentResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPrivRender) RenderVisibleTweet(c *gin.Context, data *web.VisibleTweetResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPrivRender) RenderStickTweet(c *gin.Context, data *web.StickTweetResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPrivRender) RenderLockTweet(c *gin.Context, data *web.LockTweetResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPrivRender) RenderCollectionTweet(c *gin.Context, data *web.CollectionTweetResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPrivRender) RenderStarTweet(c *gin.Context, data *web.StarTweetResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPrivRender) RenderDeleteTweet(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedPrivRender) RenderCreateTweet(c *gin.Context, data *web.CreateTweetResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPrivRender) RenderDownloadAttachment(c *gin.Context, data *web.DownloadAttachmentResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPrivRender) RenderDownloadAttachmentPrecheck(c *gin.Context, data *web.DownloadAttachmentPrecheckResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPrivRender) RenderUploadAttachment(c *gin.Context, data *web.UploadAttachmentResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPrivRender) mustEmbedUnimplementedPrivRender() {} + +// UnimplementedPrivBinding can be embedded to have forward compatible implementations. +type UnimplementedPrivBinding struct { + BindAny func(*gin.Context, any) mir.Error +} + +func (b *UnimplementedPrivBinding) BindDeleteCommentReply(c *gin.Context) (*web.DeleteCommentReplyReq, mir.Error) { + obj := new(web.DeleteCommentReplyReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPrivBinding) BindCreateCommentReply(c *gin.Context) (*web.CreateCommentReplyReq, mir.Error) { + obj := new(web.CreateCommentReplyReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPrivBinding) BindDeleteComment(c *gin.Context) (*web.DeleteCommentReq, mir.Error) { + obj := new(web.DeleteCommentReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPrivBinding) BindCreateComment(c *gin.Context) (*web.CreateCommentReq, mir.Error) { + obj := new(web.CreateCommentReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPrivBinding) BindVisibleTweet(c *gin.Context) (*web.VisibleTweetReq, mir.Error) { + obj := new(web.VisibleTweetReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPrivBinding) BindStickTweet(c *gin.Context) (*web.StickTweetReq, mir.Error) { + obj := new(web.StickTweetReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPrivBinding) BindLockTweet(c *gin.Context) (*web.LockTweetReq, mir.Error) { + obj := new(web.LockTweetReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPrivBinding) BindCollectionTweet(c *gin.Context) (*web.CollectionTweetReq, mir.Error) { + obj := new(web.CollectionTweetReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPrivBinding) BindStarTweet(c *gin.Context) (*web.StarTweetReq, mir.Error) { + obj := new(web.StarTweetReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPrivBinding) BindDeleteTweet(c *gin.Context) (*web.DeleteTweetReq, mir.Error) { + obj := new(web.DeleteTweetReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPrivBinding) BindCreateTweet(c *gin.Context) (*web.CreateTweetReq, mir.Error) { + obj := new(web.CreateTweetReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPrivBinding) BindDownloadAttachment(c *gin.Context) (*web.DownloadAttachmentReq, mir.Error) { + obj := new(web.DownloadAttachmentReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPrivBinding) BindDownloadAttachmentPrecheck(c *gin.Context) (*web.DownloadAttachmentPrecheckReq, mir.Error) { + obj := new(web.DownloadAttachmentPrecheckReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPrivBinding) BindUploadAttachment(c *gin.Context) (*web.UploadAttachmentReq, mir.Error) { + obj := new(web.UploadAttachmentReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPrivBinding) mustEmbedUnimplementedPrivBinding() {} diff --git a/auto/api/v1/pub.go b/auto/api/v1/pub.go new file mode 100644 index 00000000..3417cacd --- /dev/null +++ b/auto/api/v1/pub.go @@ -0,0 +1,294 @@ +// Code generated by go-mir. DO NOT EDIT. +// versions: +// - mir v3.1.1 + +package v1 + +import ( + "net/http" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +type Pub interface { + TopicList(*web.TopicListReq) (*web.TopicListResp, mir.Error) + TweetComments(*web.TweetCommentsReq) (*web.TweetCommentsResp, mir.Error) + TweetDetail(*web.TweetDetailReq) (*web.TweetDetailResp, mir.Error) + SendCaptcha(*web.SendCaptchaReq) mir.Error + GetCaptcha() (*web.GetCaptchaResp, mir.Error) + Register(*web.RegisterReq) (*web.RegisterResp, mir.Error) + Login(*web.LoginReq) (*web.LoginResp, mir.Error) + Version() (*web.VersionResp, mir.Error) + + mustEmbedUnimplementedPubServant() +} + +type PubBinding interface { + BindTopicList(*gin.Context) (*web.TopicListReq, mir.Error) + BindTweetComments(*gin.Context) (*web.TweetCommentsReq, mir.Error) + BindTweetDetail(*gin.Context) (*web.TweetDetailReq, mir.Error) + BindSendCaptcha(*gin.Context) (*web.SendCaptchaReq, mir.Error) + BindRegister(*gin.Context) (*web.RegisterReq, mir.Error) + BindLogin(*gin.Context) (*web.LoginReq, mir.Error) + + mustEmbedUnimplementedPubBinding() +} + +type PubRender interface { + RenderTopicList(*gin.Context, *web.TopicListResp, mir.Error) + RenderTweetComments(*gin.Context, *web.TweetCommentsResp, mir.Error) + RenderTweetDetail(*gin.Context, *web.TweetDetailResp, mir.Error) + RenderSendCaptcha(*gin.Context, mir.Error) + RenderGetCaptcha(*gin.Context, *web.GetCaptchaResp, mir.Error) + RenderRegister(*gin.Context, *web.RegisterResp, mir.Error) + RenderLogin(*gin.Context, *web.LoginResp, mir.Error) + RenderVersion(*gin.Context, *web.VersionResp, mir.Error) + + mustEmbedUnimplementedPubRender() +} + +// RegisterPubServant register Pub servant to gin +func RegisterPubServant(e *gin.Engine, s Pub, b PubBinding, r PubRender) { + router := e.Group("v1") + + // register routes info to router + router.Handle("GET", "/tags", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindTopicList(c) + if err != nil { + r.RenderTopicList(c, nil, err) + return + } + resp, err := s.TopicList(req) + r.RenderTopicList(c, resp, err) + }) + + router.Handle("GET", "/post/comments", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindTweetComments(c) + if err != nil { + r.RenderTweetComments(c, nil, err) + return + } + resp, err := s.TweetComments(req) + r.RenderTweetComments(c, resp, err) + }) + + router.Handle("GET", "/post", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindTweetDetail(c) + if err != nil { + r.RenderTweetDetail(c, nil, err) + return + } + resp, err := s.TweetDetail(req) + r.RenderTweetDetail(c, resp, err) + }) + + router.Handle("POST", "/captcha", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindSendCaptcha(c) + if err != nil { + r.RenderSendCaptcha(c, err) + return + } + r.RenderSendCaptcha(c, s.SendCaptcha(req)) + }) + + router.Handle("GET", "/captcha", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + resp, err := s.GetCaptcha() + r.RenderGetCaptcha(c, resp, err) + }) + + router.Handle("POST", "/auth/register", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindRegister(c) + if err != nil { + r.RenderRegister(c, nil, err) + return + } + resp, err := s.Register(req) + r.RenderRegister(c, resp, err) + }) + + router.Handle("POST", "/auth/login", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindLogin(c) + if err != nil { + r.RenderLogin(c, nil, err) + return + } + resp, err := s.Login(req) + r.RenderLogin(c, resp, err) + }) + + router.Handle("GET", "/", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + resp, err := s.Version() + r.RenderVersion(c, resp, err) + }) + +} + +// UnimplementedPubServant can be embedded to have forward compatible implementations. +type UnimplementedPubServant struct { +} + +func (UnimplementedPubServant) TopicList(req *web.TopicListReq) (*web.TopicListResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPubServant) TweetComments(req *web.TweetCommentsReq) (*web.TweetCommentsResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPubServant) TweetDetail(req *web.TweetDetailReq) (*web.TweetDetailResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPubServant) SendCaptcha(req *web.SendCaptchaReq) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPubServant) GetCaptcha() (*web.GetCaptchaResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPubServant) Register(req *web.RegisterReq) (*web.RegisterResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPubServant) Login(req *web.LoginReq) (*web.LoginResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPubServant) Version() (*web.VersionResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedPubServant) mustEmbedUnimplementedPubServant() {} + +// UnimplementedPubRender can be embedded to have forward compatible implementations. +type UnimplementedPubRender struct { + RenderAny func(*gin.Context, any, mir.Error) +} + +func (r *UnimplementedPubRender) RenderTopicList(c *gin.Context, data *web.TopicListResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPubRender) RenderTweetComments(c *gin.Context, data *web.TweetCommentsResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPubRender) RenderTweetDetail(c *gin.Context, data *web.TweetDetailResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPubRender) RenderSendCaptcha(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedPubRender) RenderGetCaptcha(c *gin.Context, data *web.GetCaptchaResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPubRender) RenderRegister(c *gin.Context, data *web.RegisterResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPubRender) RenderLogin(c *gin.Context, data *web.LoginResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPubRender) RenderVersion(c *gin.Context, data *web.VersionResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedPubRender) mustEmbedUnimplementedPubRender() {} + +// UnimplementedPubBinding can be embedded to have forward compatible implementations. +type UnimplementedPubBinding struct { + BindAny func(*gin.Context, any) mir.Error +} + +func (b *UnimplementedPubBinding) BindTopicList(c *gin.Context) (*web.TopicListReq, mir.Error) { + obj := new(web.TopicListReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPubBinding) BindTweetComments(c *gin.Context) (*web.TweetCommentsReq, mir.Error) { + obj := new(web.TweetCommentsReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPubBinding) BindTweetDetail(c *gin.Context) (*web.TweetDetailReq, mir.Error) { + obj := new(web.TweetDetailReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPubBinding) BindSendCaptcha(c *gin.Context) (*web.SendCaptchaReq, mir.Error) { + obj := new(web.SendCaptchaReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPubBinding) BindRegister(c *gin.Context) (*web.RegisterReq, mir.Error) { + obj := new(web.RegisterReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPubBinding) BindLogin(c *gin.Context) (*web.LoginReq, mir.Error) { + obj := new(web.LoginReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedPubBinding) mustEmbedUnimplementedPubBinding() {} diff --git a/auto/api/x/v1/user.go b/auto/api/x/v1/user.go new file mode 100644 index 00000000..a7b16a8c --- /dev/null +++ b/auto/api/x/v1/user.go @@ -0,0 +1,142 @@ +// Code generated by go-mir. DO NOT EDIT. +// versions: +// - mir v3.1.1 + +package v1 + +import ( + "net/http" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" +) + +type LoginReq struct { + AgentInfo AgentInfo `json:"agent_info"` + Name string `json:"name"` + Passwd string `json:"passwd"` +} + +type AgentInfo struct { + Platform string `json:"platform"` + UserAgent string `json:"user_agent"` +} + +type LoginResp struct { + UserInfo + ServerInfo ServerInfo `json:"server_info"` + JwtToken string `json:"jwt_token"` +} + +type ServerInfo struct { + ApiVer string `json:"api_ver"` +} + +type UserInfo struct { + Name string `json:"name"` +} + +type User interface { + // Chain provide handlers chain for gin + Chain() gin.HandlersChain + + Logout() mir.Error + Login(*LoginReq) (*LoginResp, mir.Error) + + mustEmbedUnimplementedUserServant() +} + +type UserBinding interface { + BindLogin(*gin.Context) (*LoginReq, mir.Error) + + mustEmbedUnimplementedUserBinding() +} + +type UserRender interface { + RenderLogout(*gin.Context, mir.Error) + RenderLogin(*gin.Context, *LoginResp, mir.Error) + + mustEmbedUnimplementedUserRender() +} + +// RegisterUserServant register User servant to gin +func RegisterUserServant(e *gin.Engine, s User, b UserBinding, r UserRender) { + router := e.Group("x/v1") + // use chain for router + middlewares := s.Chain() + router.Use(middlewares...) + + // register routes info to router + router.Handle("POST", "/user/logout/", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + r.RenderLogout(c, s.Logout()) + }) + + router.Handle("POST", "/user/login/", func(c *gin.Context) { + select { + case <-c.Request.Context().Done(): + return + default: + } + + req, err := b.BindLogin(c) + if err != nil { + r.RenderLogin(c, nil, err) + return + } + resp, err := s.Login(req) + r.RenderLogin(c, resp, err) + }) + +} + +// UnimplementedUserServant can be embedded to have forward compatible implementations. +type UnimplementedUserServant struct { +} + +func (UnimplementedUserServant) Chain() gin.HandlersChain { + return nil +} + +func (UnimplementedUserServant) Logout() mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedUserServant) Login(req *LoginReq) (*LoginResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedUserServant) mustEmbedUnimplementedUserServant() {} + +// UnimplementedUserRender can be embedded to have forward compatible implementations. +type UnimplementedUserRender struct { + RenderAny func(*gin.Context, any, mir.Error) +} + +func (r *UnimplementedUserRender) RenderLogout(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedUserRender) RenderLogin(c *gin.Context, data *LoginResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedUserRender) mustEmbedUnimplementedUserRender() {} + +// UnimplementedUserBinding can be embedded to have forward compatible implementations. +type UnimplementedUserBinding struct { + BindAny func(*gin.Context, any) mir.Error +} + +func (b *UnimplementedUserBinding) BindLogin(c *gin.Context) (*LoginReq, mir.Error) { + obj := new(LoginReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedUserBinding) mustEmbedUnimplementedUserBinding() {} diff --git a/auto/rpc/v1/auth.pb.go b/auto/rpc/v1/auth.pb.go new file mode 100644 index 00000000..ab5109a6 --- /dev/null +++ b/auto/rpc/v1/auth.pb.go @@ -0,0 +1,371 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc (unknown) +// source: v1/auth.proto + +package v1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PhoneNum string `protobuf:"bytes,1,opt,name=phoneNum,proto3" json:"phoneNum,omitempty"` +} + +func (x *User) Reset() { + *x = User{} + if protoimpl.UnsafeEnabled { + mi := &file_v1_auth_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_v1_auth_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_v1_auth_proto_rawDescGZIP(), []int{0} +} + +func (x *User) GetPhoneNum() string { + if x != nil { + return x.PhoneNum + } + return "" +} + +type UserVerify struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PhoneNum string `protobuf:"bytes,1,opt,name=phoneNum,proto3" json:"phoneNum,omitempty"` + VerificationCode string `protobuf:"bytes,2,opt,name=VerificationCode,proto3" json:"VerificationCode,omitempty"` +} + +func (x *UserVerify) Reset() { + *x = UserVerify{} + if protoimpl.UnsafeEnabled { + mi := &file_v1_auth_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserVerify) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserVerify) ProtoMessage() {} + +func (x *UserVerify) ProtoReflect() protoreflect.Message { + mi := &file_v1_auth_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserVerify.ProtoReflect.Descriptor instead. +func (*UserVerify) Descriptor() ([]byte, []int) { + return file_v1_auth_proto_rawDescGZIP(), []int{1} +} + +func (x *UserVerify) GetPhoneNum() string { + if x != nil { + return x.PhoneNum + } + return "" +} + +func (x *UserVerify) GetVerificationCode() string { + if x != nil { + return x.VerificationCode + } + return "" +} + +type LoginReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StatuCode int32 `protobuf:"varint,1,opt,name=statuCode,proto3" json:"statuCode,omitempty"` + Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` +} + +func (x *LoginReply) Reset() { + *x = LoginReply{} + if protoimpl.UnsafeEnabled { + mi := &file_v1_auth_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LoginReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoginReply) ProtoMessage() {} + +func (x *LoginReply) ProtoReflect() protoreflect.Message { + mi := &file_v1_auth_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LoginReply.ProtoReflect.Descriptor instead. +func (*LoginReply) Descriptor() ([]byte, []int) { + return file_v1_auth_proto_rawDescGZIP(), []int{2} +} + +func (x *LoginReply) GetStatuCode() int32 { + if x != nil { + return x.StatuCode + } + return 0 +} + +func (x *LoginReply) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +type ActionReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StatusCode int32 `protobuf:"varint,1,opt,name=statusCode,proto3" json:"statusCode,omitempty"` +} + +func (x *ActionReply) Reset() { + *x = ActionReply{} + if protoimpl.UnsafeEnabled { + mi := &file_v1_auth_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ActionReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActionReply) ProtoMessage() {} + +func (x *ActionReply) ProtoReflect() protoreflect.Message { + mi := &file_v1_auth_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ActionReply.ProtoReflect.Descriptor instead. +func (*ActionReply) Descriptor() ([]byte, []int) { + return file_v1_auth_proto_rawDescGZIP(), []int{3} +} + +func (x *ActionReply) GetStatusCode() int32 { + if x != nil { + return x.StatusCode + } + return 0 +} + +var File_v1_auth_proto protoreflect.FileDescriptor + +var file_v1_auth_proto_rawDesc = []byte{ + 0x0a, 0x0d, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x04, 0x61, 0x75, 0x74, 0x68, 0x22, 0x22, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x22, 0x54, 0x0a, 0x0a, 0x55, 0x73, 0x65, + 0x72, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x68, 0x6f, 0x6e, 0x65, + 0x4e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x68, 0x6f, 0x6e, 0x65, + 0x4e, 0x75, 0x6d, 0x12, 0x2a, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x22, + 0x40, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, + 0x09, 0x73, 0x74, 0x61, 0x74, 0x75, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x75, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x22, 0x2d, 0x0a, 0x0b, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, + 0x32, 0x89, 0x01, 0x0a, 0x0c, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x12, 0x29, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x0a, 0x2e, + 0x61, 0x75, 0x74, 0x68, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x11, 0x2e, 0x61, 0x75, 0x74, 0x68, + 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x05, + 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x0a, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x1a, 0x10, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x0a, 0x2e, + 0x61, 0x75, 0x74, 0x68, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x11, 0x2e, 0x61, 0x75, 0x74, 0x68, + 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x6f, 0x0a, 0x08, + 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x42, 0x09, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x72, 0x6f, 0x63, 0x62, 0x6f, 0x73, 0x73, 0x2f, 0x70, 0x61, 0x6f, 0x70, 0x61, 0x6f, + 0x2d, 0x63, 0x65, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x76, 0x31, 0xa2, + 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x04, 0x41, 0x75, 0x74, 0x68, 0xca, 0x02, 0x04, 0x41, + 0x75, 0x74, 0x68, 0xe2, 0x02, 0x10, 0x41, 0x75, 0x74, 0x68, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x04, 0x41, 0x75, 0x74, 0x68, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_v1_auth_proto_rawDescOnce sync.Once + file_v1_auth_proto_rawDescData = file_v1_auth_proto_rawDesc +) + +func file_v1_auth_proto_rawDescGZIP() []byte { + file_v1_auth_proto_rawDescOnce.Do(func() { + file_v1_auth_proto_rawDescData = protoimpl.X.CompressGZIP(file_v1_auth_proto_rawDescData) + }) + return file_v1_auth_proto_rawDescData +} + +var file_v1_auth_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_v1_auth_proto_goTypes = []interface{}{ + (*User)(nil), // 0: auth.User + (*UserVerify)(nil), // 1: auth.UserVerify + (*LoginReply)(nil), // 2: auth.LoginReply + (*ActionReply)(nil), // 3: auth.ActionReply +} +var file_v1_auth_proto_depIdxs = []int32{ + 0, // 0: auth.Authenticate.preLogin:input_type -> auth.User + 0, // 1: auth.Authenticate.login:input_type -> auth.User + 0, // 2: auth.Authenticate.logout:input_type -> auth.User + 3, // 3: auth.Authenticate.preLogin:output_type -> auth.ActionReply + 2, // 4: auth.Authenticate.login:output_type -> auth.LoginReply + 3, // 5: auth.Authenticate.logout:output_type -> auth.ActionReply + 3, // [3:6] is the sub-list for method output_type + 0, // [0:3] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_v1_auth_proto_init() } +func file_v1_auth_proto_init() { + if File_v1_auth_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_v1_auth_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_v1_auth_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserVerify); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_v1_auth_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LoginReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_v1_auth_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActionReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_v1_auth_proto_rawDesc, + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_v1_auth_proto_goTypes, + DependencyIndexes: file_v1_auth_proto_depIdxs, + MessageInfos: file_v1_auth_proto_msgTypes, + }.Build() + File_v1_auth_proto = out.File + file_v1_auth_proto_rawDesc = nil + file_v1_auth_proto_goTypes = nil + file_v1_auth_proto_depIdxs = nil +} diff --git a/auto/rpc/v1/auth_grpc.pb.go b/auto/rpc/v1/auth_grpc.pb.go new file mode 100644 index 00000000..64fdc1d1 --- /dev/null +++ b/auto/rpc/v1/auth_grpc.pb.go @@ -0,0 +1,177 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc (unknown) +// source: v1/auth.proto + +package v1 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// AuthenticateClient is the client API for Authenticate service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type AuthenticateClient interface { + PreLogin(ctx context.Context, in *User, opts ...grpc.CallOption) (*ActionReply, error) + Login(ctx context.Context, in *User, opts ...grpc.CallOption) (*LoginReply, error) + Logout(ctx context.Context, in *User, opts ...grpc.CallOption) (*ActionReply, error) +} + +type authenticateClient struct { + cc grpc.ClientConnInterface +} + +func NewAuthenticateClient(cc grpc.ClientConnInterface) AuthenticateClient { + return &authenticateClient{cc} +} + +func (c *authenticateClient) PreLogin(ctx context.Context, in *User, opts ...grpc.CallOption) (*ActionReply, error) { + out := new(ActionReply) + err := c.cc.Invoke(ctx, "/auth.Authenticate/preLogin", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authenticateClient) Login(ctx context.Context, in *User, opts ...grpc.CallOption) (*LoginReply, error) { + out := new(LoginReply) + err := c.cc.Invoke(ctx, "/auth.Authenticate/login", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authenticateClient) Logout(ctx context.Context, in *User, opts ...grpc.CallOption) (*ActionReply, error) { + out := new(ActionReply) + err := c.cc.Invoke(ctx, "/auth.Authenticate/logout", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AuthenticateServer is the server API for Authenticate service. +// All implementations must embed UnimplementedAuthenticateServer +// for forward compatibility +type AuthenticateServer interface { + PreLogin(context.Context, *User) (*ActionReply, error) + Login(context.Context, *User) (*LoginReply, error) + Logout(context.Context, *User) (*ActionReply, error) + mustEmbedUnimplementedAuthenticateServer() +} + +// UnimplementedAuthenticateServer must be embedded to have forward compatible implementations. +type UnimplementedAuthenticateServer struct { +} + +func (UnimplementedAuthenticateServer) PreLogin(context.Context, *User) (*ActionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method PreLogin not implemented") +} +func (UnimplementedAuthenticateServer) Login(context.Context, *User) (*LoginReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Login not implemented") +} +func (UnimplementedAuthenticateServer) Logout(context.Context, *User) (*ActionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Logout not implemented") +} +func (UnimplementedAuthenticateServer) mustEmbedUnimplementedAuthenticateServer() {} + +// UnsafeAuthenticateServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AuthenticateServer will +// result in compilation errors. +type UnsafeAuthenticateServer interface { + mustEmbedUnimplementedAuthenticateServer() +} + +func RegisterAuthenticateServer(s grpc.ServiceRegistrar, srv AuthenticateServer) { + s.RegisterService(&Authenticate_ServiceDesc, srv) +} + +func _Authenticate_PreLogin_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(User) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthenticateServer).PreLogin(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/auth.Authenticate/preLogin", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthenticateServer).PreLogin(ctx, req.(*User)) + } + return interceptor(ctx, in, info, handler) +} + +func _Authenticate_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(User) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthenticateServer).Login(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/auth.Authenticate/login", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthenticateServer).Login(ctx, req.(*User)) + } + return interceptor(ctx, in, info, handler) +} + +func _Authenticate_Logout_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(User) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthenticateServer).Logout(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/auth.Authenticate/logout", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthenticateServer).Logout(ctx, req.(*User)) + } + return interceptor(ctx, in, info, handler) +} + +// Authenticate_ServiceDesc is the grpc.ServiceDesc for Authenticate service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Authenticate_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "auth.Authenticate", + HandlerType: (*AuthenticateServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "preLogin", + Handler: _Authenticate_PreLogin_Handler, + }, + { + MethodName: "login", + Handler: _Authenticate_Login_Handler, + }, + { + MethodName: "logout", + Handler: _Authenticate_Logout_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "v1/auth.proto", +} diff --git a/buf.gen.yaml b/buf.gen.yaml new file mode 100644 index 00000000..bf9ba452 --- /dev/null +++ b/buf.gen.yaml @@ -0,0 +1,16 @@ +version: v1 +managed: + enabled: true + go_package_prefix: + default: github.com/rocboss/paopao-ce/auto/rpc + except: + - buf.build/googleapis/googleapis +plugins: + - plugin: go + out: auto/rpc + opt: paths=source_relative + - plugin: go-grpc + out: auto/rpc + opt: + - paths=source_relative + - require_unimplemented_servers=true diff --git a/buf.work.yaml b/buf.work.yaml new file mode 100644 index 00000000..1878b341 --- /dev/null +++ b/buf.work.yaml @@ -0,0 +1,3 @@ +version: v1 +directories: + - proto diff --git a/config.yaml.sample b/config.yaml.sample index 1fee92cb..ec33d9eb 100644 --- a/config.yaml.sample +++ b/config.yaml.sample @@ -1,4 +1,5 @@ App: # APP基础设置项 + RunMode: debug AttachmentIncomeRate: 0.8 MaxCommentCount: 10 DefaultContextTimeout: 60 @@ -11,21 +12,65 @@ Server: # 服务设置 ReadTimeout: 60 WriteTimeout: 60 Features: - Default: ["Base", "MySQL", "Option", "Zinc", "LocalOSS", "LoggerFile"] + Default: ["Base", "MySQL", "Option", "Zinc", "LocalOSS", "LoggerFile", "Friendship", "Deprecated"] Develop: ["Base", "MySQL", "BigCacheIndex", "Meili", "Sms", "AliOSS", "LoggerMeili", "OSS:Retention"] Demo: ["Base", "MySQL", "Option", "Zinc", "Sms", "MinIO", "LoggerZinc", "Migration"] Slim: ["Base", "Sqlite3", "LocalOSS", "LoggerFile", "OSS:TempDir"] - Base: ["Redis", "Alipay", "PhoneBind"] + Base: ["Redis", "PhoneBind"] + Docs: ["Docs:OpenAPI"] + Deprecated: ["Deprecated:OldWeb"] + Service: ["Web", "Admin", "SpaceX", "Bot", "LocalOSS", "Mobile", "Frontend:Web", "Fronetend:EmbedWeb", "Docs"] Option: ["SimpleCacheIndex"] Sms: "SmsJuhe" +WebServer: # Web服务 + HttpIp: 0.0.0.0 + HttpPort: 8010 + ReadTimeout: 60 + WriteTimeout: 60 +AdminServer: # Admin后台运维服务 + HttpIp: 0.0.0.0 + HttpPort: 8014 + ReadTimeout: 60 + WriteTimeout: 60 +SpaceXServer: # SpaceX服务 + HttpIp: 0.0.0.0 + HttpPort: 8012 + ReadTimeout: 60 + WriteTimeout: 60 +BotServer: # Bot服务 + HttpIp: 0.0.0.0 + HttpPort: 8016 + ReadTimeout: 60 + WriteTimeout: 60 +LocalossServer: # Localoss服务 + HttpIp: 0.0.0.0 + HttpPort: 8018 + ReadTimeout: 60 + WriteTimeout: 60 +FrontendWebServer: # Web前端服务 + HttpIp: 0.0.0.0 + HttpPort: 8006 + ReadTimeout: 60 + WriteTimeout: 60 +DocsServer: # 开发文档服务 + HttpIp: 0.0.0.0 + HttpPort: 8011 + ReadTimeout: 60 + WriteTimeout: 60 +MobileServer: # 移动端grpc api服务 + Host: 0.0.0.0 + Port: 8020 SmsJuhe: Gateway: https://v.juhe.cn/sms/send Key: TplID: - TplVal: "#code#=%d&#m#=%d" + TplVal: "#code#=%s&#m#=%d" Alipay: - AppID: - PrivateKey: + AppID: + InProduction: True + RootCertFile: "custom/alipay/RootCert.crt" + PublicCertFile: "custom/alipay/CertPublicKey_RSA2.crt" + AppPublicCertFile: "custom/alipay/AppCertPublicKey.crt" CacheIndex: MaxUpdateQPS: 100 # 最大添加/删除/更新Post的QPS, 设置范围[10, 10000], 默认100 SimpleCacheIndex: # 缓存泡泡广场消息流 diff --git a/configs/alipayAppCertPublicKey.crt b/configs/alipayAppCertPublicKey.crt deleted file mode 100644 index e69de29b..00000000 diff --git a/configs/alipayCertPublicKey_RSA2.crt b/configs/alipayCertPublicKey_RSA2.crt deleted file mode 100644 index e69de29b..00000000 diff --git a/configs/alipayRootCert.crt b/configs/alipayRootCert.crt deleted file mode 100644 index e69de29b..00000000 diff --git a/deployed-sites.md b/deployed-sites.md new file mode 100644 index 00000000..27a3fa43 --- /dev/null +++ b/deployed-sites.md @@ -0,0 +1,7 @@ +## 部署站点 +PaoPao部署站点信息。 + +| 名称 | 网址 | 站长 | 备注 | +| ----- | ----- | ----- | ----- | +|泡泡|[www.paopao.info](https://www.paopao.info)|[ROC](https://www.paopao.info/#/user?username=roc 'roc(@paopao.info)')|PaoPao官方站点| +|布里塔|[bulita.net](https://bulita.net)|[chendong](https://www.paopao.info/#/user?username=chendong 'chendong(@paopao.info)')|布里塔 - 招聘求职转发| diff --git a/docker-compose.yaml b/docker-compose.yaml index 6e92b829..6f40f0eb 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -56,7 +56,7 @@ services: - paopao-network # meili: - # image: getmeili/meilisearch:v0.27.0 + # image: getmeili/meilisearch:v0.29.0 # restart: always # ports: # - 7700:7700 @@ -76,6 +76,16 @@ services: # networks: # - paopao-network + pyroscope: + image: pyroscope/pyroscope:latest + restart: always + ports: + - 4040:4040 + command: + - 'server' + networks: + - paopao-network + phpmyadmin: image: phpmyadmin:5.2 depends_on: diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..fda64147 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,7 @@ +## 开发文档 +本目录包含一些开发者文档。 + +* [openapi](openapi): api相关文档 +* [proposal](proposal): 开发/设计 提按相关文档 +* [deploy](deploy): 部署相关文档 +* [discuss](discuss): 开发者交流 diff --git a/docs/assets/rapidoc-min.js.map b/docs/assets/rapidoc-min.js.map deleted file mode 100644 index e0947588..00000000 --- a/docs/assets/rapidoc-min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"rapidoc-min.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACDA;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;ACKA;;ACKA;AC2QA;AACA;AACA;AAIA;AAIA;AAIA;AAEA;;;AAIA;;AAEA;AACA;AACA;AACA;;;;;AAKA;AAGA;;AAGA;AACA;AACA;;AAIA;;AAGA;AACA;;;;AAIA;AAGA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAKA;;AAGA;AACA;;;AAKA;;AAOA;AAqBA;;;;AAIA;AAEA;;AAEA;;AAIA;;AAGA;AACA;;;AAGA;AACA;AAEA;AACA;AACA;;AAIA;;AAGA;AACA;;AAIA;;AAGA;;;AAMA;AAEA;;;AAGA;AACA;AACA;AAGA;AAGA;;;;;AAMA;AACA;;AAEA;;;AAGA;;AAEA;;;AAKA;;;AAIA;;;AAGA;;AAIA;;;AA5FA;;;;;;;AAwIA;;AAEA;AAEA;;;AAGA;;;AAMA;;AAEA;;;;;AAOA;;AAEA;AAKA;;AAGA;AAIA;AACA;AACA;;AAIA;AACA;AACA;AACA;;AAGA;AACA;AACA;;;;;AAOA;;;AAQA;;;AC1jBA;;AAYA;;AAEA;AACA;AACA;AACA;;ACxBA;;AAGA;;AAEA;AACA;;;AAGA;;;AAGA;;AAEA;;AAEA;;;;AAIA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;AAQA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACpDA;;;;;;;;;;;;;;;;;;;;;ACLA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACgFA;;;AAUA;;AAEA;;AAKA;AAUA;;AAEA;;AAEA;AACA;;;AAIA;AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC0PA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AApRA;AAQA;;AAEA;AACA;;AAGA;AACA;;AAEA;;AAIA;AAIA;AAEA;;AAWA;AAwBA;AACA;AASA;AA0DA;AACA;AACA;AAMA;AACA;AACA;AAGA;AACA;;AAEA;;AAEA;AACA;AAGA;AACA;;;;AA4BA;AAQA;AA4BA;AACA;AACA;AACA;AAMA;AACA;AACA;;;;AAIA;AACA;AAEA;AACA;AAOA;AACA;AACA;AACA;;;AAOA;;AC9UA;AACA;;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC29CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAxzCA;AAOA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;;AAMA;AAuBA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA;;AAKA;;AAEA;AA4EA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;;AAMA;AAEA;AACA;;;AAIA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;;AAIA;AAOA;AACA;;AAEA;;;;AAKA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;AAMA;AACA;AACA;AACA;AACA;AACA;;;;;;AAOA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;;AAGA;AAGA;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAUA;;AAGA;;;AAKA;;AAEA;AACA;;;AAMA;AACA;;;AAGA;;AAKA;AA8DA;AACA;AACA;AACA;;;AAOA;AAqBA;;AAEA;AAGA;AACA;AACA;;;;AAKA;AAGA;AACA;AACA;;;AAGA;;AAEA;;AAEA;;;;;;;AAOA;AACA;AACA;;AAEA;;;;;;AAQA;;AAoBA;;AAOA;AAIA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAIA;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAQA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAGA;AACA;AACA;;AAEA;AAIA;AAEA;AACA;;AAMA;;;AAiBA;AAiBA;AACA;;;AAGA;AACA;;;;;;AAMA;AACA;AACA;AACA;;;;AAIA;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;;;AAQA;AAcA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AAGA;;;;;;AAMA;AACA;;;;;;;;AAQA;;;AAIA;AACA;AACA;;;AAGA;;;AAGA;AAEA;AAGA;AAEA;;AAEA;;;AAGA;AACA;AACA;;AAEA;;;AAOA;;AAIA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAWA;;AAIA;;;AAMA;;;;AAMA;AACA;;;AAMA;;AAEA;;AAKA;;AAEA;;;;AAIA;AACA;;;AAGA;AAIA;;AAIA;;AAEA;;;AAGA;AAIA;AACA;AACA;;AAEA;AAEA;AACA;;;AAGA;AAIA;AAEA;AACA;AACA;;AAMA;AACA;AACA;;AAEA;AACA;AACA;;AAKA;AAKA;AACA;;AAIA;;AAEA;AACA;;;AAIA;;AAEA;;AAMA;;;;AAIA;;;;AAIA;AAEA;AAEA;AAIA;;;AAOA;AAGA;;;AAGA;;AAEA;AAGA;;AAEA;AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC77BA;AAQA;;AAEA;AACA;;AAGA;AACA;;AAEA;;AAIA;;;;;;;AAUA;AAEA;;;AAYA;AAuBA;AACA;AACA;AAUA;AAsCA;AAEA;AACA;AACA;;AAGA;AACA;AACA;;AAEA;AACA;AAGA;AAMA;;AAEA;AACA;AACA;;AAEA;AACA;AAEA;;;;AAKA;;;AAGA;;;AAMA;AAGA;AACA;;;;AAgCA;AAWA;AACA;AAGA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAMA;AACA;AACA;AACA;AAEA;AACA;AAOA;AACA;AACA;AACA;;;AAOA;ACzSA;AACA;AACA;AACA;AACA;AACA;;AAGA;;AAKA;AAGA;AACA;;AAIA;AACA;;;AAIA;AAEA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AAMA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AASA;AAGA;AACA;AACA;AACA;;AAEA;;;;AASA;;;AAhBA;;AC/GA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAGA;AACA;AACA;AACA;AACA;;AAEA;;;AAOA;;AAMA;AACA;AACA;AACA;;AAGA;AACA;;;AAOA;AAGA;AACA;AACA;;AAEA;;;;AAIA;;;AAVA;;AC9CA;AACA;;AAGA;AACA;;AAEA;AAFA;;;AAOA;AAEA;AACA;AAGA;AAIA;AAEA;AAMA;AAIA;;AAGA;AACA;AAIA;;;;AAMA;;AASA;;ACpEA;;;AAmCA;;AAEA;;AAEA;;AAGA;AACA;;AAEA;;;AAIA;AACA;AACA;;AAGA;AACA;;AAGA;;;;;AAMA;AACA;AACA;;;;AAIA;;;AAMA;AAOA;;;AAGA;AAGA;;;AAGA;AACA;AACA;AACA;;;AAGA;AACA;;;;AAbA;AAkBA;;;AAGA;AC3GA;;;;AA0CA;AACA;;AAEA;AAGA;AACA;;;;;;;AASA;;;;;AAKA;AAEA;;AAEA;;AAKA;AAGA;;;;;;AAQA;AACA;AAGA;AAEA;AAEA;AACA;;AAIA;;AAEA;AACA;AACA;AACA;;AAEA;;;AAIA;AACA;AAEA;;AA1BA;;AAgCA;AAIA;;AAKA;;AAEA;AAEA;AACA;;;;;;AAQA;AAGA;AACA;;;AAKA;AACA;AACA;AACA;;AAQA;AACA;;;;AASA;AAEA;;AAIA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;AAQA;;;AAQA;AACA;AACA;AACA;;AAIA;AACA;AACA;;AAGA;AACA;;;;;;;;AAYA;;;;;AAMA;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;ACvOA;;AASA;AAIA;AAeA;AACA;;AAGA;AAMA;AAMA;;;AAoBA;AC5BA;AACA;AACA;AACA;AACA;;AAEA;;;AAIA;AAGA;;AAGA;;AAOA;AAmBA;;AAEA;AAMA;;AAGA;;AAKA;;AAIA;AACA;AACA;AACA;;;AAGA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AAMA;;;;AAIA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;AASA;AAGA;;AAGA;;;;AAIA;;;;AAIA;AAGA;AACA;AAEA;AACA;AACA;;;AAGA;;AAEA;;AAEA;AAMA;AACA;AACA;;;AAIA;;AAGA;AAMA;AACA;AACA;;;;AAnDA;;;;ACxKA;AAEA;;;;;;;;;;;;;ACOA;;;AAGA;;;;;;;AASA;AACA;;;;;AAMA;;;;;AAOA;AACA;;;AAGA;;;AAIA;AAGA;;;;AAKA;AAGA;;;;;ADtDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AE0EA;AAOA;AACA;AACA;;;AAGA;;;AAMA;AA8CA;AAEA;AACA;;AAIA;AAQA;AACA;;;AAGA;AACA;;;AAOA;AACA;;AAEA;AACA;;AAKA;;AAIA;AACA;AACA;;AAEA;;AAKA;AAEA;AACA;AAEA;;;;AAUA;;;AAIA;;;AAGA;;;AAGA;;;AAGA;;;AAGA;;;;AAOA;AAEA;AACA;AAIA;AAgBA;AAEA;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAGA;AACA;;AAEA;;;;;AAxCA;AACA;AAkDA;AAOA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAxBA;AACA;AC1SA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACEA;;;AAOA;;;;;;;;;AASA;;;;AAIA;;;;AAIA;;;;AAIA;;;;AAIA;;;;AAIA;;;;;;AAMA;;;AAGA;AACA;;AAEA;;AASA;AACA;AACA;;;;ACSA;AA1BA;;;;AAKA;AACA;;;;;;AAMA;;;;;;;AC2IA;AACA;AACA;;AAEA;;AAMA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;ACzQA;AAsBA;AACA;AAGA;AACA;;AAEA;;;;AAIA;AACA;;;AAKA;AAEA;;;AAGA;;;;AAOA;AACA;;;AAGA;;;AAGA;;AAEA;;AAEA;;;;;AASA;AACA;AAGA;AAGA;AACA;AAGA;AACA;AACA;;;;AAIA;;;;;;;;ACxEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkWA;;;;;;;;;AASA;;;;;;;;;;;;;;;;;;;;;;;ACtQA;;;;;;;;;AC3GA;;;;;;AAMA;AACA;AACA;;AAIA;;;;AASA;AAEA;;AAEA;AAIA;;AAEA;AACA;;;;;AAKA;AACA;AACA;AACA;;;;;;AAMA;AAEA;AACA;AACA;;AAGA;AAGA;;AAEA;AACA;;AAEA;;;;;;AAcA;AAoBA;AACA;AAGA;AACA;;AAEA;;;;;AAKA;AACA;;;AAKA;AAEA;;;AAGA;;;;AAOA;AACA;;;AAGA;;AAEA;;;AAGA;;;;;AAKA;AACA;AAGA;AAGA;AACA;;;;;;;ACrHA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC0HA","sources":["webpack://rapidoc/./src/styles/input-styles.js","webpack://rapidoc/./src/styles/flex-styles.js","webpack://rapidoc/./src/styles/table-styles.js","webpack://rapidoc/./src/styles/endpoint-styles.js","webpack://rapidoc/./src/styles/prism-styles.js","webpack://rapidoc/./src/styles/tab-styles.js","webpack://rapidoc/./src/styles/nav-styles.js","webpack://rapidoc/./src/styles/info-styles.js","webpack://rapidoc/./src/styles/custom-styles.js","webpack://rapidoc/./src/utils/common-utils.js","webpack://rapidoc/./src/templates/security-scheme-template.js","webpack://rapidoc/./src/templates/code-samples-template.js","webpack://rapidoc/./src/templates/callback-template.js","webpack://rapidoc/./node_modules/lit-html/directives/guard.js","webpack://rapidoc/./src/utils/schema-utils.js","webpack://rapidoc/./src/components/json-tree.js","webpack://rapidoc/./src/components/schema-tree.js","webpack://rapidoc/./src/components/tag-input.js","webpack://rapidoc/./src/components/api-request.js","webpack://rapidoc/./src/components/schema-table.js","webpack://rapidoc/./src/templates/expanded-endpoint-template.js","webpack://rapidoc/./src/templates/components-template.js","webpack://rapidoc/./src/templates/overview-template.js","webpack://rapidoc/./src/templates/server-template.js","webpack://rapidoc/./src/templates/navbar-template.js","webpack://rapidoc/./src/templates/focused-endpoint-template.js","webpack://rapidoc/./src/templates/endpoint-template.js","webpack://rapidoc/./src/templates/logo-template.js","webpack://rapidoc/./src/templates/header-template.js","webpack://rapidoc/./src/components/api-response.js","webpack://rapidoc/./src/styles/dialog-box-styles.js","webpack://rapidoc/./src/templates/advance-search-template.js","webpack://rapidoc/./src/components/dialog-box.js","webpack://rapidoc/./src/utils/theme.js","webpack://rapidoc/./src/templates/main-body-template.js","webpack://rapidoc/./src/rapidoc.js","webpack://rapidoc/./src/rapidoc-mini.js","webpack://rapidoc/./src/templates/json-schema-viewer-template.js","webpack://rapidoc/./src/oauth-receiver.js","webpack://rapidoc/./src/json-schema-viewer.js"],"sourcesContent":["import { css } from 'lit';\n\n/* eslint-disable max-len */\nexport default css`\n/* Button */\n.m-btn {\n border-radius: var(--border-radius);\n font-weight: 600;\n display: inline-block;\n padding: 6px 16px;\n font-size: var(--font-size-small);\n outline: 0;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n border: 2px solid var(--primary-color);\n background-color:transparent;\n transition: background-color 0.2s;\n user-select: none;\n cursor: pointer;\n box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);\n}\n.m-btn.primary {\n background-color: var(--primary-color);\n color: var(--primary-color-invert);\n}\n.m-btn.thin-border { border-width: 1px; }\n.m-btn.large { padding:8px 14px; }\n.m-btn.small { padding:5px 12px; }\n.m-btn.tiny { padding:5px 6px; }\n.m-btn.circle { border-radius: 50%; }\n.m-btn:hover { \n background-color: var(--primary-color);\n color: var(--primary-color-invert);\n}\n.m-btn.nav { border: 2px solid var(--nav-accent-color); }\n.m-btn.nav:hover { \n background-color: var(--nav-accent-color);\n}\n.m-btn:disabled{ \n background-color: var(--bg3);\n color: var(--fg3);\n border-color: var(--fg3);\n cursor: not-allowed;\n opacity: 0.4;\n}\n.toolbar-btn{\n cursor: pointer;\n padding: 4px;\n margin:0 2px;\n font-size: var(--font-size-small);\n min-width: 50px;\n color: var(--primary-color-invert);\n border-radius: 2px;\n border: none;\n background-color: var(--primary-color);\n}\n\ninput, textarea, select, button, pre {\n color:var(--fg);\n outline: none;\n background-color: var(--input-bg);\n border: 1px solid var(--border-color);\n border-radius: var(--border-radius);\n}\nbutton {\n font-family: var(--font-regular);\n}\n\n/* Form Inputs */\npre,\nselect,\ntextarea,\ninput[type=\"file\"],\ninput[type=\"text\"],\ninput[type=\"password\"] {\n font-family: var(--font-mono);\n font-weight: 400;\n font-size: var(--font-size-small);\n transition: border .2s;\n padding: 6px 5px;\n}\n\nselect {\n font-family: var(--font-regular);\n padding: 5px 30px 5px 5px;\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2212%22%20height%3D%2212%22%3E%3Cpath%20d%3D%22M10.3%203.3L6%207.6%201.7%203.3A1%201%200%2000.3%204.7l5%205a1%201%200%20001.4%200l5-5a1%201%200%2010-1.4-1.4z%22%20fill%3D%22%23777777%22%2F%3E%3C%2Fsvg%3E\"); \n background-position: calc(100% - 5px) center;\n background-repeat: no-repeat; \n background-size: 10px;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n cursor: pointer;\n}\n\nselect:hover {\n border-color: var(--primary-color);\n}\n\ntextarea::placeholder,\ninput[type=\"text\"]::placeholder,\ninput[type=\"password\"]::placeholder {\n color: var(--placeholder-color);\n opacity:1;\n}\n\nselect:focus,\ntextarea:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"password\"]:focus,\ntextarea:active,\ninput[type=\"text\"]:active,\ninput[type=\"password\"]:active {\n border:1px solid var(--primary-color);\n}\n\ninput[type=\"file\"]{\n font-family: var(--font-regular);\n padding:2px;\n cursor:pointer;\n border: 1px solid var(--primary-color);\n min-height: calc(var(--font-size-small) + 18px);\n}\n\ninput[type=\"file\"]::-webkit-file-upload-button {\n font-family: var(--font-regular);\n font-size: var(--font-size-small);\n outline: none;\n cursor:pointer;\n padding: 3px 8px;\n border: 1px solid var(--primary-color);\n background-color: var(--primary-color);\n color: var(--primary-color-invert);\n border-radius: var(--border-radius);;\n -webkit-appearance: none;\n}\n\npre,\ntextarea {\n scrollbar-width: thin;\n scrollbar-color: var(--border-color) var(--input-bg);\n}\n\npre::-webkit-scrollbar,\ntextarea::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\npre::-webkit-scrollbar-track,\ntextarea::-webkit-scrollbar-track {\n background:var(--input-bg);\n}\n \npre::-webkit-scrollbar-thumb,\ntextarea::-webkit-scrollbar-thumb {\n border-radius: 2px;\n background-color: var(--border-color);\n}\n\n.link {\n font-size:var(--font-size-small);\n text-decoration: underline;\n color:var(--blue);\n font-family:var(--font-mono);\n margin-bottom:2px;\n}\n\ninput[type=\"checkbox\"]:focus{\n outline:0;\n}\n\n/* Toggle Body */\ninput[type=\"checkbox\"] {\n appearance: none;\n display: inline-block;\n background-color: var(--light-bg);\n border: 1px solid var(--light-bg);\n border-radius: 9px;\n cursor: pointer;\n height: 18px;\n position: relative;\n transition: border .25s .15s, box-shadow .25s .3s, padding .25s;\n min-width: 36px;\n width: 36px;\n vertical-align: top;\n}\n/* Toggle Thumb */\ninput[type=\"checkbox\"]:after {\n position: absolute;\n background-color: var(--bg);\n border: 1px solid var(--light-bg);\n border-radius: 8px;\n content: '';\n top: 0px;\n left: 0px;\n right: 16px;\n display: block;\n height: 16px;\n transition: border .25s .15s, left .25s .1s, right .15s .175s;\n}\n\n/* Toggle Body - Checked */\ninput[type=\"checkbox\"]:checked {\n box-shadow: inset 0 0 0 13px var(--green);\n border-color: var(--green);\n}\n/* Toggle Thumb - Checked*/\ninput[type=\"checkbox\"]:checked:after {\n border: 1px solid var(--green);\n left: 16px;\n right: 1px;\n transition: border .25s, left .15s .25s, right .25s .175s;\n}\n`;\n","import { css } from 'lit';\n\nexport default css`\n.row, .col{\n display:flex;\n} \n.row {\n align-items:center;\n flex-direction: row;\n}\n.col {\n align-items:stretch;\n flex-direction: column;\n}\n`;\n","import { css } from 'lit';\n\nexport default css`\n.m-table {\n border-spacing: 0; \n border-collapse: separate;\n border: 1px solid var(--light-border-color);\n border-radius: var(--border-radius);\n margin: 0;\n max-width: 100%;\n direction: ltr;\n}\n.m-table tr:first-child td,\n.m-table tr:first-child th {\n border-top: 0 none;\n}\n.m-table td, \n.m-table th {\n font-size: var(--font-size-small);\n line-height: calc(var(--font-size-small) + 4px);\n padding: 4px 5px 4px;\n vertical-align: top;\n}\n\n.m-table.padded-12 td, \n.m-table.padded-12 th {\n padding: 12px;\n}\n\n.m-table td:not([align]), \n.m-table th:not([align]) {\n text-align: left;\n}\n\n.m-table th {\n color: var(--fg2);\n font-size: var(--font-size-small);\n line-height: calc(var(--font-size-small) + 18px);\n font-weight: 600;\n letter-spacing: normal;\n background-color: var(--bg2);\n vertical-align: bottom;\n border-bottom: 1px solid var(--light-border-color);\n}\n\n.m-table > tbody > tr > td,\n.m-table > tr > td {\n border-top: 1px solid var(--light-border-color);\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.table-title {\n font-size:var(--font-size-small);\n font-weight:bold;\n vertical-align: middle;\n margin: 12px 0 4px 0;\n}\n`;\n","import { css } from 'lit';\n\nexport default css`\n.only-large-screen { display:none; }\n.endpoint-head .path{\n display: flex;\n font-family:var(--font-mono);\n font-size: var(--font-size-small);\n align-items: center;\n overflow-wrap: break-word;\n word-break: break-all;\n}\n\n.endpoint-head .descr {\n font-size: var(--font-size-small);\n color:var(--light-fg);\n font-weight:400;\n align-items: center;\n overflow-wrap: break-word;\n word-break: break-all;\n display:none;\n}\n\n.m-endpoint.expanded{margin-bottom:16px; }\n.m-endpoint > .endpoint-head{\n border-width:1px 1px 1px 5px;\n border-style:solid;\n border-color:transparent;\n border-top-color:var(--light-border-color);\n display:flex;\n padding:6px 16px;\n align-items: center;\n cursor: pointer;\n}\n.m-endpoint > .endpoint-head.put:hover,\n.m-endpoint > .endpoint-head.put.expanded{\n border-color:var(--orange); \n background-color:var(--light-orange); \n}\n.m-endpoint > .endpoint-head.post:hover,\n.m-endpoint > .endpoint-head.post.expanded {\n border-color:var(--green); \n background-color:var(--light-green); \n}\n.m-endpoint > .endpoint-head.get:hover,\n.m-endpoint > .endpoint-head.get.expanded {\n border-color:var(--blue); \n background-color:var(--light-blue); \n}\n.m-endpoint > .endpoint-head.delete:hover,\n.m-endpoint > .endpoint-head.delete.expanded {\n border-color:var(--red); \n background-color:var(--light-red); \n}\n\n.m-endpoint > .endpoint-head.head:hover,\n.m-endpoint > .endpoint-head.head.expanded,\n.m-endpoint > .endpoint-head.patch:hover,\n.m-endpoint > .endpoint-head.patch.expanded,\n.m-endpoint > .endpoint-head.options:hover,\n.m-endpoint > .endpoint-head.options.expanded {\n border-color:var(--yellow); \n background-color:var(--light-yellow); \n}\n\n.m-endpoint > .endpoint-head.deprecated:hover,\n.m-endpoint > .endpoint-head.deprecated.expanded {\n border-color:var(--border-color); \n filter:opacity(0.6);\n}\n\n.m-endpoint .endpoint-body {\n flex-wrap:wrap;\n padding:16px 0px 0 0px;\n border-width:0px 1px 1px 5px;\n border-style:solid;\n box-shadow: 0px 4px 3px -3px rgba(0, 0, 0, 0.15);\n}\n.m-endpoint .endpoint-body.delete{ border-color:var(--red); }\n.m-endpoint .endpoint-body.put{ border-color:var(--orange); }\n.m-endpoint .endpoint-body.post{border-color:var(--green);}\n.m-endpoint .endpoint-body.get{ border-color:var(--blue); }\n.m-endpoint .endpoint-body.head,\n.m-endpoint .endpoint-body.patch,\n.m-endpoint .endpoint-body.options { \n border-color:var(--yellow); \n}\n\n.m-endpoint .endpoint-body.deprecated{ \n border-color:var(--border-color);\n filter:opacity(0.6);\n}\n\n.endpoint-head .deprecated{\n color: var(--light-fg);\n filter:opacity(0.6);\n}\n\n.summary{\n padding:8px 8px;\n}\n.summary .title{\n font-size:calc(var(--font-size-regular) + 2px);\n margin-bottom: 6px;\n word-break: break-all;\n}\n\n.endpoint-head .method{\n padding:2px 5px;\n vertical-align: middle;\n font-size:var(--font-size-small);\n height: calc(var(--font-size-small) + 16px);\n line-height: calc(var(--font-size-small) + 8px);\n width: 60px;\n border-radius: 2px;\n display:inline-block;\n text-align: center;\n font-weight: bold;\n text-transform:uppercase;\n margin-right:5px;\n}\n.endpoint-head .method.delete{ border: 2px solid var(--red);}\n.endpoint-head .method.put{ border: 2px solid var(--orange); }\n.endpoint-head .method.post{ border: 2px solid var(--green); }\n.endpoint-head .method.get{ border: 2px solid var(--blue); }\n.endpoint-head .method.get.deprecated{ border: 2px solid var(--border-color); }\n.endpoint-head .method.head,\n.endpoint-head .method.patch,\n.endpoint-head .method.options { \n border: 2px solid var(--yellow); \n}\n\n.req-resp-container{\n display: flex;\n margin-top:16px;\n align-items: stretch;\n flex-wrap: wrap;\n flex-direction: column;\n border-top:1px solid var(--light-border-color);\n}\n\n.view-mode-request,\napi-response.view-mode {\n flex:1; \n min-height:100px;\n padding:16px 8px;\n overflow:hidden;\n}\n.view-mode-request {\n border-width:0 0 1px 0;\n border-style:dashed;\n}\n\n.head .view-mode-request,\n.patch .view-mode-request,\n.options .view-mode-request { \n border-color:var(--yellow); \n}\n.put .view-mode-request { \n border-color:var(--orange); \n}\n.post .view-mode-request { \n border-color:var(--green); \n}\n.get .view-mode-request { \n border-color:var(--blue); \n}\n.delete .view-mode-request { \n border-color:var(--red); \n}\n\n@media only screen and (min-width: 1024px) {\n .only-large-screen { display:block; }\n .endpoint-head .path{\n font-size: var(--font-size-regular);\n }\n .endpoint-head .descr{\n display: flex;\n }\n .endpoint-head .m-markdown-small,\n .descr .m-markdown-small{\n display:block;\n }\n .req-resp-container{\n flex-direction: var(--layout, row);\n flex-wrap: nowrap;\n }\n api-response.view-mode {\n padding:16px;\n }\n .view-mode-request.row-layout {\n border-width:0 1px 0 0;\n padding:16px;\n }\n .summary{\n padding:8px 16px;\n }\n}\n`;\n","import { css } from 'lit';\n\nexport default css`\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n text-align: left;\n white-space: pre;\n word-spacing: normal;\n word-break: normal;\n word-wrap: normal;\n line-height: 1.5;\n tab-size: 2;\n\n -webkit-hyphens: none;\n -moz-hyphens: none;\n -ms-hyphens: none;\n hyphens: none;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n padding: 1em;\n margin: .5em 0;\n overflow: auto;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n white-space: normal;\n}\n\n.token.comment,\n.token.block-comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n color: var(--light-fg)\n}\n\n.token.punctuation {\n color: var(--fg);\n}\n\n.token.tag,\n.token.attr-name,\n.token.namespace,\n.token.deleted {\n color:var(--pink);\n}\n\n.token.function-name {\n color: var(--blue);\n}\n\n.token.boolean,\n.token.number,\n.token.function {\n color: var(--red);\n}\n\n.token.property,\n.token.class-name,\n.token.constant,\n.token.symbol {\n color: var(--code-property-color);\n}\n\n.token.selector,\n.token.important,\n.token.atrule,\n.token.keyword,\n.token.builtin {\n color: var(--code-keyword-color);\n}\n\n.token.string,\n.token.char,\n.token.attr-value,\n.token.regex,\n.token.variable { \n color: var(--green);\n}\n\n.token.operator,\n.token.entity,\n.token.url {\n color: var(--code-operator-color);\n}\n\n.token.important,\n.token.bold {\n font-weight: bold;\n}\n.token.italic {\n font-style: italic;\n}\n\n.token.entity {\n cursor: help;\n}\n\n.token.inserted {\n color: green;\n}\n`;\n","import { css } from 'lit';\n\nexport default css`\n.tab-panel {\n border: none;\n}\n.tab-buttons {\n height:30px;\n border-bottom: 1px solid var(--light-border-color) ;\n align-items: stretch;\n overflow-y: hidden;\n overflow-x: auto;\n scrollbar-width: thin;\n}\n.tab-buttons::-webkit-scrollbar {\n height: 1px;\n background-color: var(--border-color);\n}\n.tab-btn {\n border: none;\n border-bottom: 3px solid transparent; \n color: var(--light-fg);\n background-color: transparent;\n white-space: nowrap;\n cursor:pointer;\n outline:none;\n font-family:var(--font-regular); \n font-size:var(--font-size-small);\n margin-right:16px;\n padding:1px;\n}\n.tab-btn.active {\n border-bottom: 3px solid var(--primary-color); \n font-weight:bold;\n color:var(--primary-color);\n}\n\n.tab-btn:hover {\n color:var(--primary-color);\n}\n.tab-content {\n margin:-1px 0 0 0;\n position:relative;\n min-height: 50px;\n}\n`;\n","import { css } from 'lit';\n\nexport default css`\n.nav-bar {\n width:0;\n height:100%;\n overflow: hidden;\n color:var(--nav-text-color);\n background-color: var(--nav-bg-color);\n background-blend-mode: multiply;\n line-height: calc(var(--font-size-small) + 4px);\n display:none;\n position:relative;\n flex-direction:column;\n flex-wrap:nowrap;\n word-break:break-word;\n}\n::slotted([slot=nav-logo]){\n padding:16px 16px 0 16px;\n}\n.nav-scroll {\n overflow-x: hidden;\n overflow-y: auto;\n overflow-y: overlay;\n scrollbar-width: thin;\n scrollbar-color: var(--nav-hover-bg-color) transparent;\n}\n\n.nav-bar-tag {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-direction: row;\n}\n.nav-bar.read .nav-bar-tag-icon {\n display:none;\n}\n\n.nav-bar-tag-icon {\n color: var(--nav-text-color);\n font-size: 20px; \n}\n.nav-bar-tag-icon:hover {\n color:var(--nav-hover-text-color);\n}\n.nav-bar.focused .nav-bar-tag-and-paths.collapsed .nav-bar-paths-under-tag {\n display:none;\n}\n.nav-bar.focused .nav-bar-tag-and-paths.collapsed .nav-bar-tag-icon::after {\n content: '⌵';\n width:16px;\n height:16px;\n text-align: center;\n display: inline-block;\n transform: rotate(-90deg);\n transition: transform 0.2s ease-out 0s;\n}\n.nav-bar.focused .nav-bar-tag-and-paths.expanded .nav-bar-tag-icon::after {\n content: '⌵';\n width:16px;\n height:16px;\n text-align: center;\n display: inline-block;\n transition: transform 0.2s ease-out 0s;\n}\n.nav-scroll::-webkit-scrollbar {\n width: var(--scroll-bar-width, 8px);\n}\n.nav-scroll::-webkit-scrollbar-track {\n background:transparent;\n}\n.nav-scroll::-webkit-scrollbar-thumb {\n background-color: var(--nav-hover-bg-color);\n}\n\n.nav-bar-tag {\n font-size: var(--font-size-regular);\n color: var(--nav-accent-color);\n border-left:4px solid transparent;\n font-weight:bold;\n padding: 15px 15px 15px 10px;\n text-transform: capitalize;\n}\n\n.nav-bar-components,\n.nav-bar-h1,\n.nav-bar-h2,\n.nav-bar-info,\n.nav-bar-tag,\n.nav-bar-path {\n display:flex;\n cursor:pointer;\n border-left:4px solid transparent;\n}\n\n.nav-bar-h1,\n.nav-bar-h2,\n.nav-bar-path {\n font-size: calc(var(--font-size-small) + 1px);\n padding: var(--nav-item-padding);\n}\n.nav-bar-path.small-font {\n font-size: var(--font-size-small);\n}\n\n.nav-bar-info {\n font-size: var(--font-size-regular);\n padding: 16px 10px;\n font-weight:bold;\n}\n.nav-bar-section {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n font-size: var(--font-size-small);\n color: var(--nav-text-color);\n padding: var(--nav-item-padding);\n font-weight:bold;\n}\n.nav-bar-section.operations {\n cursor:pointer;\n}\n.nav-bar-section.operations:hover {\n color:var(--nav-hover-text-color);\n background-color:var(--nav-hover-bg-color);\n}\n\n.nav-bar-section:first-child {\n display: none;\n}\n.nav-bar-h2 {margin-left:12px;}\n\n.nav-bar-h1.active,\n.nav-bar-h2.active,\n.nav-bar-info.active,\n.nav-bar-tag.active,\n.nav-bar-path.active,\n.nav-bar-section.operations.active {\n border-left:4px solid var(--nav-accent-color);\n color:var(--nav-hover-text-color);\n}\n\n.nav-bar-h1:hover,\n.nav-bar-h2:hover,\n.nav-bar-info:hover,\n.nav-bar-tag:hover,\n.nav-bar-path:hover {\n color:var(--nav-hover-text-color);\n background-color:var(--nav-hover-bg-color);\n}\n`;\n","import { css } from 'lit';\n\nexport default css`\n#api-info {\n font-size:calc(var(--font-size-regular) - 1px);margin-top:8px\n margin-left: -15px;\n}\n\n#api-info span:before {\n content: \"|\";\n display: inline-block;\n opacity: 0.5;\n width: 15px;\n text-align: center;\n}\n#api-info span:first-child:before {\n content: \"\";\n width: 0px;\n}\n`;\n","import { css } from 'lit';\n\n/*\nThis file is reserved for any custom css that developers want to add to\ncustomize their theme. Simply add your css to this file and yarn build.\n*/\n\nexport default css`\n\n`;\n","/* For Delayed Event Handler Execution */\nexport function debounce(fn, delay) {\n let timeoutID = null;\n return (...args) => {\n clearTimeout(timeoutID);\n const that = this;\n timeoutID = setTimeout(() => {\n fn.apply(that, args);\n }, delay);\n };\n}\n\nexport const invalidCharsRegEx = /[\\s#:?&={}]/g; // used for generating valid html element ids by replacing the invalid chars with hyphen (-)\nexport const rapidocApiKey = '_rapidoc_api_key';\n\nexport function sleep(ms) {\n // eslint-disable-next-line no-promise-executor-return\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function copyToClipboard(data, e) {\n const btnEl = e.currentTarget;\n const textArea = document.createElement('textarea');\n textArea.value = data;\n textArea.style.position = 'fixed'; // avoid scrolling to bottom\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n try {\n document.execCommand('copy');\n btnEl.innerText = 'Copied';\n setTimeout(() => {\n btnEl.innerText = 'Copy';\n }, 5000);\n } catch (err) {\n console.error('Unable to copy', err); // eslint-disable-line no-console\n }\n document.body.removeChild(textArea);\n}\n\nexport function getBaseUrlFromUrl(url) {\n const pathArray = url.split('/');\n return `${pathArray[0]}//${pathArray[2]}`;\n}\n\nexport async function wait(ms) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport function componentIsInSearch(searchVal, component) {\n return component.name.toLowerCase().includes(searchVal.toLowerCase());\n}\n\nexport function pathIsInSearch(searchVal, path, matchType = 'includes') {\n if (matchType === 'includes') {\n const stringToSearch = `${path.method} ${path.path} ${path.summary || path.description || ''} ${path.operationId || ''}`.toLowerCase();\n return stringToSearch.includes(searchVal.toLowerCase());\n }\n const regex = new RegExp(searchVal, 'i');\n return regex.test(`${path.method} ${path.path}`);\n}\n\nexport function schemaKeys(schemaProps, result = new Set()) {\n if (!schemaProps) {\n return result;\n }\n Object.keys(schemaProps).forEach((key) => {\n result.add(key);\n if (schemaProps[key].properties) {\n schemaKeys(schemaProps[key].properties, result);\n } else if (schemaProps[key].items?.properties) {\n schemaKeys(schemaProps[key].items?.properties, result);\n }\n });\n return result;\n}\n\nexport function advancedSearch(searchVal, allSpecTags, searchOptions = []) {\n if (!searchVal.trim() || searchOptions.length === 0) {\n return;\n }\n\n const pathsMatched = [];\n allSpecTags.forEach((tag) => {\n tag.paths.forEach((path) => {\n let stringToSearch = '';\n if (searchOptions.includes('search-api-path')) {\n stringToSearch = path.path;\n }\n if (searchOptions.includes('search-api-descr')) {\n stringToSearch = `${stringToSearch} ${path.summary || path.description || ''}`;\n }\n if (searchOptions.includes('search-api-params')) {\n stringToSearch = `${stringToSearch} ${path.parameters?.map((v) => v.name).join(' ') || ''}`;\n }\n\n if (searchOptions.includes('search-api-request-body') && path.requestBody) {\n let schemaKeySet = new Set();\n for (const contentType in path.requestBody?.content) {\n if (path.requestBody.content[contentType].schema?.properties) {\n schemaKeySet = schemaKeys(path.requestBody.content[contentType].schema?.properties);\n }\n stringToSearch = `${stringToSearch} ${[...schemaKeySet].join(' ')}`;\n }\n }\n\n if (searchOptions.includes('search-api-resp-descr')) {\n stringToSearch = `${stringToSearch} ${Object.values(path.responses).map((v) => v.description || '').join(' ')}`;\n }\n\n if (stringToSearch.toLowerCase().includes(searchVal.trim().toLowerCase())) {\n pathsMatched.push({\n elementId: path.elementId,\n method: path.method,\n path: path.path,\n summary: path.summary || path.description || '',\n deprecated: path.deprecated,\n });\n }\n });\n });\n return pathsMatched;\n}\n\nexport function prettyXml(sourceXmlString) {\n const xmlDoc = new DOMParser().parseFromString(sourceXmlString, 'text/xml');\n const xsltDoc = new DOMParser().parseFromString([\n // describes how we want to modify the XML - indent everything\n `\n \n \n \n \n \n \n \n \n `,\n ].join('\\n'), 'application/xml');\n const xsltProcessor = new XSLTProcessor();\n xsltProcessor.importStylesheet(xsltDoc);\n const resultDoc = xsltProcessor.transformToDocument(xmlDoc);\n return new XMLSerializer().serializeToString(resultDoc);\n}\n/*\nexport function hasValidPathInUrlHash(tags) {\n return tags.find((tag) => tag.paths.find((path) => window.location.hash.substring(1) === path.elementId));\n}\n*/\n\nexport function downloadResource(url, fileName) {\n if (url) {\n const a = document.createElement('a');\n document.body.appendChild(a);\n a.style = 'display: none';\n a.href = url;\n a.download = fileName;\n a.click();\n a.remove();\n }\n}\n\nexport function viewResource(url) {\n if (url) {\n const a = document.createElement('a');\n document.body.appendChild(a);\n a.style = 'display: none';\n a.href = url;\n a.target = '_blank';\n a.click();\n a.remove();\n }\n}\n","/* eslint-disable arrow-body-style */\nimport { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\n\nconst codeVerifier = '731DB1C3F7EA533B85E29492D26AA-1234567890-1234567890';\nconst codeChallenge = '4FatVDBJKPAo4JgLLaaQFMUcQPn5CrPRvLlaob9PTYc'; // Base64 encoded SHA-256\n\nconst localStorageKey = 'rapidoc';\n\nexport function applyApiKey(securitySchemeId, username = '', password = '', providedApikeyVal = '') {\n const securityObj = this.resolvedSpec.securitySchemes?.find((v) => (v.securitySchemeId === securitySchemeId));\n if (!securityObj) {\n return false;\n }\n let finalApiKeyValue = '';\n if (securityObj.scheme?.toLowerCase() === 'basic') {\n if (username) {\n finalApiKeyValue = `Basic ${btoa(`${username}:${password}`)}`;\n }\n } else if (providedApikeyVal) {\n securityObj.value = providedApikeyVal;\n finalApiKeyValue = `${securityObj.scheme?.toLowerCase() === 'bearer' ? 'Bearer ' : ''}${providedApikeyVal}`;\n }\n if (finalApiKeyValue) {\n securityObj.finalKeyValue = finalApiKeyValue;\n this.requestUpdate();\n return true;\n }\n return false;\n}\n\nexport function onClearAllApiKeys() {\n this.resolvedSpec.securitySchemes?.forEach((v) => {\n v.user = '';\n v.password = '';\n v.value = '';\n v.finalKeyValue = '';\n });\n this.requestUpdate();\n}\n\nfunction getPersistedApiKeys() {\n return JSON.parse(localStorage.getItem(localStorageKey)) || {};\n}\n\nfunction setPersistedApiKeys(obj) {\n localStorage.setItem(localStorageKey, JSON.stringify(obj));\n}\n\nexport function recoverPersistedApiKeys() {\n const rapidocLs = getPersistedApiKeys.call(this);\n Object.values(rapidocLs).forEach((p) => {\n applyApiKey.call(this, p.securitySchemeId, p.username, p.password, p.value);\n });\n}\n\nfunction onApiKeyChange(securitySchemeId) {\n let apiKeyValue = '';\n const securityObj = this.resolvedSpec.securitySchemes.find((v) => (v.securitySchemeId === securitySchemeId));\n if (securityObj) {\n const trEl = this.shadowRoot.getElementById(`security-scheme-${securitySchemeId}`);\n if (trEl) {\n if (securityObj.type && securityObj.scheme && securityObj.type === 'http' && securityObj.scheme.toLowerCase() === 'basic') {\n const userVal = trEl.querySelector('.api-key-user').value.trim();\n const passwordVal = trEl.querySelector('.api-key-password').value.trim();\n applyApiKey.call(this, securitySchemeId, userVal, passwordVal);\n } else {\n apiKeyValue = trEl.querySelector('.api-key-input').value.trim();\n applyApiKey.call(this, securitySchemeId, '', '', apiKeyValue);\n }\n if (this.persistAuth === 'true') {\n const rapidocLs = getPersistedApiKeys.call(this);\n rapidocLs[securitySchemeId] = securityObj;\n setPersistedApiKeys.call(this, rapidocLs);\n }\n }\n }\n}\n\n// Updates the OAuth Access Token (API key), so it reflects in UI and gets used in TRY calls\nfunction updateOAuthKey(securitySchemeId, accessToken, tokenType = 'Bearer') {\n const securityObj = this.resolvedSpec.securitySchemes.find((v) => (v.securitySchemeId === securitySchemeId));\n securityObj.finalKeyValue = `${(tokenType.toLowerCase() === 'bearer' ? 'Bearer' : (tokenType.toLowerCase() === 'mac' ? 'MAC' : tokenType))} ${accessToken}`;\n this.requestUpdate();\n}\n\n/* eslint-disable no-console */\n// Gets Access-Token in exchange of Authorization Code\nasync function fetchAccessToken(tokenUrl, clientId, clientSecret, redirectUrl, grantType, authCode, securitySchemeId, authFlowDivEl, sendClientSecretIn = 'header', scopes = null, username = null, password = null) {\n const respDisplayEl = authFlowDivEl ? authFlowDivEl.querySelector('.oauth-resp-display') : undefined;\n const urlFormParams = new URLSearchParams();\n const headers = new Headers();\n urlFormParams.append('grant_type', grantType);\n if (grantType !== 'client_credentials' && grantType !== 'password') {\n urlFormParams.append('redirect_uri', redirectUrl);\n }\n if (authCode) {\n urlFormParams.append('code', authCode);\n urlFormParams.append('code_verifier', codeVerifier); // for PKCE\n }\n if (sendClientSecretIn === 'header') {\n headers.set('Authorization', `Basic ${btoa(`${clientId}:${clientSecret}`)}`);\n } else {\n urlFormParams.append('client_id', clientId);\n urlFormParams.append('client_secret', clientSecret);\n }\n if (grantType === 'password') {\n urlFormParams.append('username', username);\n urlFormParams.append('password', password);\n }\n if (scopes) {\n urlFormParams.append('scope', scopes);\n }\n\n try {\n const resp = await fetch(tokenUrl, { method: 'POST', headers, body: urlFormParams });\n const tokenResp = await resp.json();\n if (resp.ok) {\n if (tokenResp.token_type && tokenResp.access_token) {\n updateOAuthKey.call(this, securitySchemeId, tokenResp.access_token, tokenResp.token_type);\n if (respDisplayEl) {\n respDisplayEl.innerHTML = 'Access Token Received';\n }\n return true;\n }\n } else {\n if (respDisplayEl) {\n respDisplayEl.innerHTML = `${tokenResp.error_description || tokenResp.error_description || 'Unable to get access token'}`;\n }\n return false;\n }\n } catch (err) {\n if (respDisplayEl) {\n respDisplayEl.innerHTML = 'Failed to get access token';\n }\n return false;\n }\n}\n\n// Gets invoked when it receives the Authorization Code from the other window via message-event\nasync function onWindowMessageEvent(msgEvent, winObj, tokenUrl, clientId, clientSecret, redirectUrl, grantType, sendClientSecretIn, securitySchemeId, authFlowDivEl) {\n sessionStorage.removeItem('winMessageEventActive');\n winObj.close();\n if (msgEvent.data.fake) {\n return;\n }\n if (!msgEvent.data) {\n console.warn('RapiDoc: Received no data with authorization message');\n }\n if (msgEvent.data.error) {\n console.warn('RapiDoc: Error while receiving data');\n }\n if (msgEvent.data) {\n if (msgEvent.data.responseType === 'code') {\n // Authorization Code flow\n fetchAccessToken.call(this, tokenUrl, clientId, clientSecret, redirectUrl, grantType, msgEvent.data.code, securitySchemeId, authFlowDivEl, sendClientSecretIn);\n } else if (msgEvent.data.responseType === 'token') {\n // Implicit flow\n updateOAuthKey.call(this, securitySchemeId, msgEvent.data.access_token, msgEvent.data.token_type);\n }\n }\n}\n\n// code_challenge generator for PKCE flow\n// TODO: Implement dynamic generation of code-challenge based on code-verifier\n/*\nasync function generateCodeChallenge() {\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const sha256Hash = await window.crypto.subtle.digest('SHA-256', data); // returns Unit8Array\n // const utf8Decoder = new TextDecoder();\n // const b64EncodedSha256 = btoa(utf8Decoder.decode(sha256Hash));\n const b64EncodedSha256 = base64encode(sha256Hash);\n return b64EncodedSha256;\n}\n*/\n\nasync function onInvokeOAuthFlow(securitySchemeId, flowType, authUrl, tokenUrl, e) {\n const authFlowDivEl = e.target.closest('.oauth-flow');\n const clientId = authFlowDivEl.querySelector('.oauth-client-id') ? authFlowDivEl.querySelector('.oauth-client-id').value.trim() : '';\n const clientSecret = authFlowDivEl.querySelector('.oauth-client-secret') ? authFlowDivEl.querySelector('.oauth-client-secret').value.trim() : '';\n const username = authFlowDivEl.querySelector('.api-key-user') ? authFlowDivEl.querySelector('.api-key-user').value.trim() : '';\n const password = authFlowDivEl.querySelector('.api-key-password') ? authFlowDivEl.querySelector('.api-key-password').value.trim() : '';\n const sendClientSecretIn = authFlowDivEl.querySelector('.oauth-send-client-secret-in') ? authFlowDivEl.querySelector('.oauth-send-client-secret-in').value.trim() : 'header';\n const checkedScopeEls = [...authFlowDivEl.querySelectorAll('.scope-checkbox:checked')];\n const pkceCheckboxEl = authFlowDivEl.querySelector(`#${securitySchemeId}-pkce`);\n const state = (`${Math.random().toString(36)}random`).slice(2, 9);\n const nonce = (`${Math.random().toString(36)}random`).slice(2, 9);\n // const codeChallenge = await generateCodeChallenge(codeVerifier);\n const redirectUrlObj = new URL(`${window.location.origin}${window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/'))}/${this.oauthReceiver}`);\n let grantType = '';\n let responseType = '';\n let newWindow;\n\n // clear previous error messages\n const errEls = [...authFlowDivEl.parentNode.querySelectorAll('.oauth-resp-display')];\n errEls.forEach((v) => { v.innerHTML = ''; });\n\n if (flowType === 'authorizationCode' || flowType === 'implicit') {\n const authUrlObj = new URL(authUrl);\n if (flowType === 'authorizationCode') {\n grantType = 'authorization_code';\n responseType = 'code';\n } else if (flowType === 'implicit') {\n responseType = 'token';\n }\n const authCodeParams = new URLSearchParams(authUrlObj.search);\n const selectedScopes = checkedScopeEls.map((v) => v.value).join(' ');\n if (selectedScopes) {\n authCodeParams.set('scope', selectedScopes);\n }\n authCodeParams.set('client_id', clientId);\n authCodeParams.set('redirect_uri', redirectUrlObj.toString());\n authCodeParams.set('response_type', responseType);\n authCodeParams.set('state', state);\n authCodeParams.set('nonce', nonce);\n if (pkceCheckboxEl && pkceCheckboxEl.checked) {\n authCodeParams.set('code_challenge', codeChallenge);\n authCodeParams.set('code_challenge_method', 'S256');\n }\n authCodeParams.set('show_dialog', true);\n authUrlObj.search = authCodeParams.toString();\n // If any older message-event-listener is active then fire a fake message to remove it (these are single time listeners)\n if (sessionStorage.getItem('winMessageEventActive') === 'true') {\n window.postMessage({ fake: true }, this);\n }\n setTimeout(() => {\n newWindow = window.open(authUrlObj.toString());\n if (!newWindow) {\n console.error(`RapiDoc: Unable to open ${authUrlObj.toString()} in a new window`);\n } else {\n sessionStorage.setItem('winMessageEventActive', 'true');\n window.addEventListener(\n 'message',\n (msgEvent) => onWindowMessageEvent.call(this, msgEvent, newWindow, tokenUrl, clientId, clientSecret, redirectUrlObj.toString(), grantType, sendClientSecretIn, securitySchemeId, authFlowDivEl),\n { once: true },\n );\n }\n }, 10);\n } else if (flowType === 'clientCredentials') {\n grantType = 'client_credentials';\n const selectedScopes = checkedScopeEls.map((v) => v.value).join(' ');\n fetchAccessToken.call(this, tokenUrl, clientId, clientSecret, redirectUrlObj.toString(), grantType, '', securitySchemeId, authFlowDivEl, sendClientSecretIn, selectedScopes);\n } else if (flowType === 'password') {\n grantType = 'password';\n const selectedScopes = checkedScopeEls.map((v) => v.value).join(' ');\n fetchAccessToken.call(this, tokenUrl, clientId, clientSecret, redirectUrlObj.toString(), grantType, '', securitySchemeId, authFlowDivEl, sendClientSecretIn, selectedScopes, username, password);\n }\n}\n/* eslint-enable no-console */\n\n/* eslint-disable indent */\n\nfunction oAuthFlowTemplate(flowName, clientId, clientSecret, securitySchemeId, authFlow, defaultScopes = [], receiveTokenIn = 'header') {\n let { authorizationUrl, tokenUrl, refreshUrl } = authFlow;\n const isUrlAbsolute = (url) => (url.indexOf('://') > 0 || url.indexOf('//') === 0);\n if (refreshUrl && !isUrlAbsolute(refreshUrl)) {\n refreshUrl = `${this.selectedServer.computedUrl}/${refreshUrl.replace(/^\\//, '')}`;\n }\n if (tokenUrl && !isUrlAbsolute(tokenUrl)) {\n tokenUrl = `${this.selectedServer.computedUrl}/${tokenUrl.replace(/^\\//, '')}`;\n }\n if (authorizationUrl && !isUrlAbsolute(authorizationUrl)) {\n authorizationUrl = `${this.selectedServer.computedUrl}/${authorizationUrl.replace(/^\\//, '')}`;\n }\n let flowNameDisplay;\n if (flowName === 'authorizationCode') {\n flowNameDisplay = 'Authorization Code Flow';\n } else if (flowName === 'clientCredentials') {\n flowNameDisplay = 'Client Credentials Flow';\n } else if (flowName === 'implicit') {\n flowNameDisplay = 'Implicit Flow';\n } else if (flowName === 'password') {\n flowNameDisplay = 'Password Flow';\n } else {\n flowNameDisplay = flowName;\n }\n return html`\n
\n
${flowNameDisplay}
\n ${authorizationUrl\n ? html`
Auth URL ${authorizationUrl}
`\n : ''\n }\n ${tokenUrl\n ? html`
Token URL ${tokenUrl}
`\n : ''\n }\n ${refreshUrl\n ? html`
Refresh URL ${refreshUrl}
`\n : ''\n }\n ${flowName === 'authorizationCode' || flowName === 'clientCredentials' || flowName === 'implicit' || flowName === 'password'\n ? html`\n ${authFlow.scopes\n ? html`\n Scopes \n
\n ${Object.entries(authFlow.scopes).map((scopeAndDescr, index) => html`\n
\n \n \n
\n `)}\n
\n `\n : ''\n }\n ${flowName === 'password'\n ? html`\n
\n \n \n
`\n : ''\n }\n
\n ${flowName === 'authorizationCode'\n ? html`\n
\n \n \n
\n `\n : ''\n }\n \n ${flowName === 'authorizationCode' || flowName === 'clientCredentials' || flowName === 'password'\n ? html`\n \n ${flowName === 'authorizationCode' || flowName === 'clientCredentials' || flowName === 'password'\n ? html`\n `\n : ''\n }`\n : ''\n }\n ${flowName === 'authorizationCode' || flowName === 'clientCredentials' || flowName === 'implicit' || flowName === 'password'\n ? html`\n `\n : ''\n }\n
\n
\n `\n : ''\n }\n
\n `;\n}\n\nfunction removeApiKey(securitySchemeId) {\n const securityObj = this.resolvedSpec.securitySchemes?.find((v) => (v.securitySchemeId === securitySchemeId));\n securityObj.user = '';\n securityObj.password = '';\n securityObj.value = '';\n securityObj.finalKeyValue = '';\n if (this.persistAuth === 'true') {\n const rapidocLs = getPersistedApiKeys.call(this);\n delete rapidocLs[securityObj.securitySchemeId];\n setPersistedApiKeys.call(this, rapidocLs);\n }\n this.requestUpdate();\n}\n\nexport default function securitySchemeTemplate() {\n if (!this.resolvedSpec) { return ''; }\n const providedApiKeys = this.resolvedSpec.securitySchemes?.filter((v) => (v.finalKeyValue));\n if (!providedApiKeys) {\n return;\n }\n return html`\n
\n
AUTHENTICATION
\n\n
\n ${providedApiKeys.length > 0\n ? html`\n
${providedApiKeys.length} API key applied
\n
\n `\n : html`
No API key applied
`\n }\n
\n ${this.resolvedSpec.securitySchemes && this.resolvedSpec.securitySchemes.length > 0\n ? html`\n \n ${this.resolvedSpec.securitySchemes.map((v) => html`\n \n \n \n ${v.type.toLowerCase() === 'oauth2'\n ? html`\n \n \n \n `\n : ''\n }\n `)}\n
\n
\n ${v.typeDisplay}\n ${v.finalKeyValue\n ? html`\n ${v.finalKeyValue ? 'Key Applied' : ''} \n \n `\n : ''\n }\n
\n ${v.description\n ? html`\n
\n ${unsafeHTML(marked(v.description || ''))}\n
`\n : ''\n }\n\n ${(v.type.toLowerCase() === 'apikey') || (v.type.toLowerCase() === 'http' && v.scheme.toLowerCase() === 'bearer')\n ? html`\n
\n ${v.type.toLowerCase() === 'apikey'\n ? html`Send ${v.name} in ${v.in}`\n : html`Send Authorization in header containing the word Bearer followed by a space and a Token String.`\n }\n
\n
\n ${v.in !== 'cookie'\n ? html`\n \n `\n : html` cookies cannot be set from here`\n }\n
`\n : ''\n }\n ${v.type.toLowerCase() === 'http' && v.scheme.toLowerCase() === 'basic'\n ? html`\n
\n Send Authorization in header containing the word Basic followed by a space and a base64 encoded string of username:password.\n
\n
\n \n \n \n
`\n : ''\n }\n
\n ${Object.keys(v.flows).map((f) => oAuthFlowTemplate.call(this, f, v['x-client-id'], v['x-client-secret'], v.securitySchemeId, v.flows[f], v['x-default-scopes'], v['x-receive-token-in']))}\n
`\n : ''\n }\n \n
\n`;\n}\n\nexport function pathSecurityTemplate(pathSecurity) {\n if (this.resolvedSpec.securitySchemes && pathSecurity) {\n const orSecurityKeys1 = [];\n pathSecurity.forEach((pSecurity) => {\n const andSecurityKeys1 = [];\n const andKeyTypes = [];\n if (Object.keys(pSecurity).length === 0) {\n orSecurityKeys1.push({\n securityTypes: 'None',\n securityDefs: [],\n });\n } else {\n Object.keys(pSecurity).forEach((pathSecurityKey) => {\n let pathScopes = '';\n const s = this.resolvedSpec.securitySchemes.find((ss) => ss.securitySchemeId === pathSecurityKey);\n if (pSecurity[pathSecurityKey] && Array.isArray(pSecurity[pathSecurityKey])) {\n pathScopes = pSecurity[pathSecurityKey].join(', ');\n }\n if (s) {\n andKeyTypes.push(s.typeDisplay);\n andSecurityKeys1.push({ ...s, ...({ scopes: pathScopes }) });\n }\n });\n orSecurityKeys1.push({\n securityTypes: andKeyTypes.length > 1 ? `${andKeyTypes[0]} + ${andKeyTypes.length - 1} more` : andKeyTypes[0],\n securityDefs: andSecurityKeys1,\n });\n }\n });\n return html`
\n
\n \n \n \n \n \n ${orSecurityKeys1.map((orSecurityItem1, i) => html`\n\n ${orSecurityItem1.securityTypes\n ? html`\n ${i !== 0 ? html`
OR
` : ''}\n
\n
\n ${this.updateRoute === 'true' && this.allowAuthentication === 'true'\n ? html` ${orSecurityItem1.securityTypes} `\n : html`${orSecurityItem1.securityTypes}`\n }\n
\n
\n ${orSecurityItem1.securityDefs.length > 1 ? html`
Requires all of the following
` : ''}\n
\n ${orSecurityItem1.securityDefs.map((andSecurityItem, j) => {\n const scopeHtml = html`${andSecurityItem.scopes !== ''\n ? html`\n
\n Required scopes:\n
\n
\n ${andSecurityItem.scopes.split(',').map((scope, cnt) => html`${cnt === 0 ? '' : '┃'}${scope}`)}\n
\n
`\n : ''\n }`;\n\n return html`\n ${andSecurityItem.type === 'oauth2'\n ? html`\n
\n ${orSecurityItem1.securityDefs.length > 1\n ? html`${j + 1}.  `\n : 'Needs'\n }\n OAuth Token ${andSecurityItem.securitySchemeId} in Authorization header\n ${scopeHtml}\n
`\n : andSecurityItem.type === 'http'\n ? html`\n
\n ${orSecurityItem1.securityDefs.length > 1 ? html`${j + 1}.  ` : html`Requires`}\n ${andSecurityItem.scheme === 'basic' ? 'Base 64 encoded username:password' : 'Bearer Token'} in Authorization header\n ${scopeHtml}\n
`\n : html`\n
\n ${orSecurityItem1.securityDefs.length > 1 ? html`${j + 1}.  ` : html`Requires`}\n Token in ${andSecurityItem.name} ${andSecurityItem.in}\n ${scopeHtml}\n
`\n }`;\n })}\n
\n
\n
\n `\n : ''\n }\n `)\n }\n
\n `;\n }\n return '';\n}\n\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport Prism from 'prismjs';\nimport { copyToClipboard } from '~/utils/common-utils';\n\n/* eslint-disable indent */\nexport default function codeSamplesTemplate(xCodeSamples) {\n return html`\n
CODE SAMPLES
\n
{\n if (!e.target.classList.contains('tab-btn')) { return; }\n const clickedTab = e.target.dataset.tab;\n\n const tabButtons = [...e.currentTarget.querySelectorAll('.tab-btn')];\n const tabContents = [...e.currentTarget.querySelectorAll('.tab-content')];\n tabButtons.forEach((tabBtnEl) => tabBtnEl.classList[tabBtnEl.dataset.tab === clickedTab ? 'add' : 'remove']('active'));\n tabContents.forEach((tabBodyEl) => { tabBodyEl.style.display = (tabBodyEl.dataset.tab === clickedTab ? 'block' : 'none'); });\n }\n }\">\n
\n ${xCodeSamples.map((v, i) => html``)}\n
\n ${xCodeSamples.map((v, i) => html`\n
\n \n
${Prism.languages[v.lang?.toLowerCase()] ? unsafeHTML(Prism.highlight(v.source, Prism.languages[v.lang?.toLowerCase()], v.lang?.toLowerCase())) : v.source}
\n
`)\n }\n `;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\n\n/* eslint-disable indent */\nexport default function callbackTemplate(callbacks) {\n return html`\n
CALLBACKS
\n ${Object.entries(callbacks).map((kv) => html`\n
\n ${kv[0]}\n ${Object.entries(kv[1]).map((pathObj) => html`\n
\n
\n ${Object.entries(pathObj[1]).map((method) => html`\n
\n
\n
\n \n ${method[0]} \n
\n ${pathObj[0]} \n
\n
\n \n\n \n
\n
\n `)}\n
\n
\n `)}\n
\n `)}\n `;\n}\n/* eslint-enable indent */\n","import{noChange as r}from\"../lit-html.js\";import{directive as t,Directive as s}from\"../directive.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst e={},i=t(class extends s{constructor(){super(...arguments),this.nt=e}render(r,t){return t()}update(t,[s,e]){if(Array.isArray(s)){if(Array.isArray(this.nt)&&this.nt.length===s.length&&s.every(((r,t)=>r===this.nt[t])))return r}else if(this.nt===s)return r;return this.nt=Array.isArray(s)?Array.from(s):s,this.render(s,e)}});export{i as guard};\n//# sourceMappingURL=guard.js.map\n","/* Generates an schema object containing type and constraint info */\nexport function getTypeInfo(schema) {\n if (!schema) {\n return;\n }\n let dataType = '';\n let constrain = '';\n // let examples;\n\n if (schema.$ref) {\n const n = schema.$ref.lastIndexOf('/');\n const schemaNode = schema.$ref.substring(n + 1);\n dataType = `{recursive: ${schemaNode}} `;\n } else if (schema.type) {\n dataType = Array.isArray(schema.type) ? schema.type.join(schema.length === 2 ? ' or ' : '┃') : schema.type;\n if (schema.format || schema.enum) {\n dataType = dataType.replace('string', schema.enum ? 'enum' : schema.format);\n }\n if (schema.nullable) {\n dataType += '┃null';\n }\n } else if (Object.keys(schema).length === 0) {\n dataType = 'any';\n } else {\n dataType = '{missing-type-info}';\n }\n\n const info = {\n type: dataType,\n format: schema.format || '',\n pattern: (schema.pattern && !schema.enum) ? schema.pattern : '',\n readOrWriteOnly: (schema.readOnly ? '🆁' : schema.writeOnly ? '🆆' : ''),\n deprecated: schema.deprecated ? '❌' : '',\n examples: schema.examples || schema.example,\n default: schema.default != null ? `${schema.default}` : '',\n description: schema.description || '',\n constrain: '',\n allowedValues: '',\n arrayType: '',\n html: '',\n };\n\n if (info.type === '{recursive}') {\n info.description = schema.$ref.substring(schema.$ref.lastIndexOf('/') + 1);\n } else if (info.type === '{missing-type-info}' || info.type === 'any') {\n info.description = info.description || '';\n }\n\n // Set Allowed Values\n info.allowedValues = Array.isArray(schema.enum) ? schema.enum.join('┃') : '';\n if (dataType === 'array' && schema.items) {\n const arrayItemType = schema.items?.type;\n const arrayItemDefault = schema.items?.default !== undefined ? schema.items.default : '';\n\n info.arrayType = `${schema.type} of ${Array.isArray(arrayItemType) ? arrayItemType.join('') : arrayItemType}`;\n info.default = arrayItemDefault;\n info.allowedValues = Array.isArray(schema.items?.enum) ? schema.items.enum.join('┃') : '';\n }\n if (dataType.match(/integer|number/g)) {\n if (schema.minimum !== undefined || schema.exclusiveMinimum !== undefined) {\n constrain += schema.minimum !== undefined ? `Min ${schema.minimum}` : `More than ${schema.exclusiveMinimum}`;\n }\n if (schema.maximum !== undefined || schema.exclusiveMaximum !== undefined) {\n constrain += schema.maximum !== undefined ? `${constrain ? '┃' : ''}Max ${schema.maximum}` : `${constrain ? '┃' : ''}Less than ${schema.exclusiveMaximum}`;\n }\n if (schema.multipleOf !== undefined) {\n constrain += `${constrain ? '┃' : ''} multiple of ${schema.multipleOf}`;\n }\n }\n if (dataType.match(/string/g)) {\n if (schema.minLength !== undefined && schema.maxLength !== undefined) {\n constrain += `${constrain ? '┃' : ''}${schema.minLength} to ${schema.maxLength} chars`;\n } else if (schema.minLength !== undefined) {\n constrain += `${constrain ? '┃' : ''}Min ${schema.minLength} chars`;\n } else if (schema.maxLength !== undefined) {\n constrain += `Max ${constrain ? '┃' : ''}${schema.maxLength} chars`;\n }\n }\n info.constrain = constrain;\n info.html = `${info.type}~|~${info.readOrWriteOnly}~|~${info.constrain}~|~${info.default}~|~${info.allowedValues}~|~${info.pattern}~|~${info.description}~|~${schema.title || ''}~|~${info.deprecated ? 'deprecated' : ''}`;\n return info;\n}\nexport function nestExampleIfPresent(example) {\n return example ? { Example: { value: example } } : example;\n}\nexport function normalizeExamples(examples, dataType = 'string') {\n let exampleVal;\n let exampleList;\n if (examples) {\n if (examples.constructor === Object) {\n const exampleValAndDescr = Object.values(examples);\n exampleVal = exampleValAndDescr.length > 0\n ? typeof exampleValAndDescr[0].value === 'boolean' || typeof exampleValAndDescr[0].value === 'number'\n ? exampleValAndDescr[0].value.toString()\n : exampleValAndDescr[0].value\n : '';\n exampleList = Object.values(examples).map((v) => ({\n value: typeof v.value === 'boolean' || typeof v.value === 'number' ? v.value.toString() : v.value,\n description: v.description || v.summary || v.value,\n }));\n } else {\n // This is non standard way to provide example but will support for now\n if (!Array.isArray(examples)) {\n examples = examples ? [examples] : [];\n }\n if (examples.length > 0) {\n if (dataType === 'array') {\n [exampleVal] = examples;\n exampleList = examples.map((v) => ({ value: v, description: Array.isArray(v) ? v.join(' , ') : v }));\n } else {\n exampleVal = examples[0].toString();\n exampleList = examples.map((v) => ({ value: v.toString(), description: v }));\n }\n }\n }\n return {\n exampleVal,\n exampleList,\n };\n }\n return {\n exampleVal: '',\n exampleList: [],\n };\n}\nexport function getSampleValueByType(schemaObj) {\n const example = schemaObj.examples\n ? schemaObj.examples[0]\n : schemaObj.example === null\n ? null\n : schemaObj.example || undefined;\n if (example === '') { return ''; }\n if (example === null) { return null; }\n if (example === 0) { return 0; }\n if (example) { return example; }\n\n if (Object.keys(schemaObj).length === 0) {\n return null;\n }\n if (schemaObj.$ref) {\n // Indicates a Circular ref\n return schemaObj.$ref;\n }\n const typeValue = Array.isArray(schemaObj.type) ? schemaObj.type[0] : schemaObj.type;\n if (!typeValue) {\n return '?';\n }\n if (typeValue.match(/^integer|^number/g)) {\n const multipleOf = Number.isNaN(Number(schemaObj.multipleOf)) ? undefined : Number(schemaObj.multipleOf);\n const maximum = Number.isNaN(Number(schemaObj.maximum)) ? undefined : Number(schemaObj.maximum);\n const minimumPossibleVal = Number.isNaN(Number(schemaObj.minimum))\n ? Number.isNaN(Number(schemaObj.exclusiveMinimum))\n ? maximum || 0\n : Number(schemaObj.exclusiveMinimum) + (typeValue.startsWith('integer') ? 1 : 0.001)\n : Number(schemaObj.minimum);\n const finalVal = multipleOf\n ? multipleOf >= minimumPossibleVal\n ? multipleOf\n : minimumPossibleVal % multipleOf === 0\n ? minimumPossibleVal\n : Math.ceil(minimumPossibleVal / multipleOf) * multipleOf\n : minimumPossibleVal;\n return finalVal;\n }\n if (typeValue.match(/^boolean/g)) { return false; }\n if (typeValue.match(/^null/g)) { return null; }\n if (typeValue.match(/^string/g)) {\n if (schemaObj.enum) { return schemaObj.enum[0]; }\n if (schemaObj.pattern) { return schemaObj.pattern; }\n if (schemaObj.format) {\n const u = `${Date.now().toString(16)}${Math.random().toString(16)}0`.repeat(16);\n switch (schemaObj.format.toLowerCase()) {\n case 'url':\n case 'uri':\n return 'http://example.com';\n case 'date':\n return (new Date(0)).toISOString().split('T')[0];\n case 'time':\n return (new Date(0)).toISOString().split('T')[1];\n case 'date-time':\n return (new Date(0)).toISOString();\n case 'duration':\n return 'P3Y6M4DT12H30M5S'; // P=Period 3-Years 6-Months 4-Days 12-Hours 30-Minutes 5-Seconds\n case 'email':\n case 'idn-email':\n return 'user@example.com';\n case 'hostname':\n case 'idn-hostname':\n return 'www.example.com';\n case 'ipv4':\n return '198.51.100.42';\n case 'ipv6':\n return '2001:0db8:5b96:0000:0000:426f:8e17:642a';\n case 'uuid':\n return [u.substr(0, 8), u.substr(8, 4), `4000-8${u.substr(13, 3)}`, u.substr(16, 12)].join('-');\n default:\n return '';\n }\n } else {\n const minLength = Number.isNaN(schemaObj.minLength) ? undefined : Number(schemaObj.minLength);\n const maxLength = Number.isNaN(schemaObj.maxLength) ? undefined : Number(schemaObj.maxLength);\n const finalLength = minLength || (maxLength > 6 ? 6 : maxLength || undefined);\n return finalLength ? 'A'.repeat(finalLength) : 'string';\n }\n }\n // If type cannot be determined\n return '?';\n}\n\n/*\njson2xml- TestCase\n {\n 'prop1' : 'one',\n 'prop2' : 'two',\n 'prop3' : [ 'a', 'b', 'c' ],\n 'prop4' : {\n 'ob1' : 'val-1',\n 'ob2' : 'val-2'\n }\n }\n \n simple\n \n <0> a \n <1> b \n <2> c \n \n \n val-1\n val-2\n \n \n*/\nexport function json2xml(obj, level = 1) {\n const indent = ' '.repeat(level);\n let xmlText = '';\n if (level === 1 && typeof obj !== 'object') {\n return `\\n${indent}${obj.toString()}`;\n }\n for (const prop in obj) {\n if (Array.isArray(obj[prop])) {\n xmlText = `${xmlText}\\n${indent}<${prop}> ${json2xml(obj[prop], level + 1)}\\n${indent}`;\n } else if (typeof obj[prop] === 'object') {\n xmlText = `${xmlText}\\n${indent}<${prop}> ${json2xml(obj[prop], level + 1)}\\n${indent}`;\n } else {\n xmlText = `${xmlText}\\n${indent}<${prop}> ${obj[prop].toString()} `;\n }\n }\n return xmlText;\n}\n\nfunction addSchemaInfoToExample(schema, obj) {\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n if (schema.title) {\n obj['::TITLE'] = schema.title;\n }\n if (schema.description) {\n obj['::DESCRIPTION'] = schema.description;\n }\n}\n\nfunction removeTitlesAndDescriptions(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n delete obj['::TITLE'];\n delete obj['::DESCRIPTION'];\n for (const k in obj) {\n removeTitlesAndDescriptions(obj[k]);\n }\n}\n\nfunction addPropertyExampleToObjectExamples(example, obj, propertyKey) {\n for (const key in obj) {\n obj[key][propertyKey] = example;\n }\n}\n\nfunction mergePropertyExamples(obj, propertyName, propExamples) {\n // Create an example for each variant of the propertyExample, merging them with the current (parent) example\n let i = 0;\n const maxCombinations = 10;\n const mergedObj = {};\n for (const exampleKey in obj) {\n for (const propExampleKey in propExamples) {\n mergedObj[`example-${i}`] = { ...obj[exampleKey] };\n mergedObj[`example-${i}`][propertyName] = propExamples[propExampleKey];\n i++;\n if (i >= maxCombinations) {\n break;\n }\n }\n if (i >= maxCombinations) {\n break;\n }\n }\n return mergedObj;\n}\n\n/* For changing JSON-Schema to a Sample Object, as per the schema (to generate examples based on schema) */\nexport function schemaToSampleObj(schema, config = { }) {\n let obj = {};\n if (!schema) {\n return;\n }\n\n if (schema.allOf) {\n const objWithAllProps = {};\n\n if (schema.allOf.length === 1 && !schema.allOf[0].properties && !schema.allOf[0].items) {\n // If allOf has single item and the type is not an object or array, then its a primitive\n if (schema.allOf[0].$ref) {\n return '{ }';\n }\n if (schema.allOf[0].readOnly && config.includeReadOnly) {\n const tempSchema = schema.allOf[0];\n return getSampleValueByType(tempSchema);\n }\n return;\n }\n\n schema.allOf.forEach((v) => {\n if (v.type === 'object' || v.properties || v.allOf || v.anyOf || v.oneOf) {\n const partialObj = schemaToSampleObj(v, config);\n Object.assign(objWithAllProps, partialObj);\n } else if (v.type === 'array' || v.items) {\n const partialObj = [schemaToSampleObj(v, config)];\n Object.assign(objWithAllProps, partialObj);\n } else if (v.type) {\n const prop = `prop${Object.keys(objWithAllProps).length}`;\n objWithAllProps[prop] = getSampleValueByType(v);\n } else {\n return '';\n }\n });\n\n obj = objWithAllProps;\n } else if (schema.oneOf) {\n // 1. First create example with scheme.properties\n const objWithSchemaProps = {};\n if (schema.properties) {\n for (const propertyName in schema.properties) {\n objWithSchemaProps[propertyName] = getSampleValueByType(schema.properties[propertyName]);\n }\n }\n\n if (schema.oneOf.length > 0) {\n /*\n oneOf:\n - type: object\n properties:\n option1_PropA:\n type: string\n option1_PropB:\n type: string\n - type: object\n properties:\n option2_PropX:\n type: string\n properties:\n prop1:\n type: string\n prop2:\n type: string\n minLength: 10\n\n The aboove Schem should generate the following 2 examples\n\n Example-1\n {\n prop1: 'string',\n prop2: 'AAAAAAAAAA', <-- min-length 10\n option1_PropA: 'string',\n option1_PropB: 'string'\n }\n\n Example-2\n {\n prop1: 'string',\n prop2: 'AAAAAAAAAA', <-- min-length 10\n option2_PropX: 'string'\n }\n */\n let i = 0;\n // Merge all examples of each oneOf-schema\n for (const key in schema.oneOf) {\n const oneOfSamples = schemaToSampleObj(schema.oneOf[key], config);\n for (const sampleKey in oneOfSamples) {\n // 2. In the final example include a one-of item along with properties\n let finalExample;\n if (Object.keys(objWithSchemaProps).length > 0) {\n if (oneOfSamples[sampleKey] === null || typeof oneOfSamples[sampleKey] !== 'object') {\n // This doesn't really make sense since every oneOf schema _should_ be an object if there are common properties, so we'll skip this\n continue;\n } else {\n finalExample = Object.assign(oneOfSamples[sampleKey], objWithSchemaProps);\n }\n } else {\n finalExample = oneOfSamples[sampleKey];\n }\n obj[`example-${i}`] = finalExample;\n addSchemaInfoToExample(schema.oneOf[key], obj[`example-${i}`]);\n i++;\n }\n }\n }\n } else if (schema.anyOf) {\n // First generate values for regular properties\n let commonObj;\n if (schema.type === 'object' || schema.properties) {\n commonObj = { 'example-0': {} };\n for (const propertyName in schema.properties) {\n if (schema.example) {\n commonObj = schema;\n break;\n }\n if (schema.properties[propertyName].deprecated && !config.includeDeprecated) { continue; }\n if (schema.properties[propertyName].readOnly && !config.includeReadOnly) { continue; }\n if (schema.properties[propertyName].writeOnly && !config.includeWriteOnly) { continue; }\n commonObj = mergePropertyExamples(commonObj, propertyName, schemaToSampleObj(schema.properties[propertyName], config));\n }\n }\n\n // Combine every variant of the regular properties with every variant of the anyOf samples\n let i = 0;\n for (const key in schema.anyOf) {\n const anyOfSamples = schemaToSampleObj(schema.anyOf[key], config);\n for (const sampleKey in anyOfSamples) {\n if (typeof commonObj !== 'undefined') {\n for (const commonKey in commonObj) {\n obj[`example-${i}`] = { ...commonObj[commonKey], ...anyOfSamples[sampleKey] };\n }\n } else {\n obj[`example-${i}`] = anyOfSamples[sampleKey];\n }\n addSchemaInfoToExample(schema.anyOf[key], obj[`example-${i}`]);\n i++;\n }\n }\n } else if (schema.type === 'object' || schema.properties) {\n obj['example-0'] = {};\n addSchemaInfoToExample(schema, obj['example-0']);\n if (schema.example) {\n obj['example-0'] = schema.example;\n } else {\n for (const propertyName in schema.properties) {\n if (schema.properties[propertyName]?.deprecated && !config.includeDeprecated) { continue; }\n if (schema.properties[propertyName]?.readOnly && !config.includeReadOnly) { continue; }\n if (schema.properties[propertyName]?.writeOnly && !config.includeWriteOnly) { continue; }\n if (schema.properties[propertyName]?.type === 'array' || schema.properties[propertyName]?.items) {\n if (schema.properties[propertyName].example) {\n addPropertyExampleToObjectExamples(schema.properties[propertyName].example, obj, propertyName);\n } else if (schema.properties[propertyName]?.items?.example) { // schemas and properties support single example but not multiple examples.\n addPropertyExampleToObjectExamples([schema.properties[propertyName].items.example], obj, propertyName);\n } else {\n const itemSamples = schemaToSampleObj(schema.properties[propertyName].items, config);\n const arraySamples = [];\n for (const key in itemSamples) {\n arraySamples[key] = [itemSamples[key]];\n }\n obj = mergePropertyExamples(obj, propertyName, arraySamples);\n }\n continue;\n }\n obj = mergePropertyExamples(obj, propertyName, schemaToSampleObj(schema.properties[propertyName], config));\n }\n }\n } else if (schema.type === 'array' || schema.items) {\n if (schema.items || schema.example) {\n if (schema.example) {\n obj['example-0'] = schema.example;\n } else if (schema.items?.example) { // schemas and properties support single example but not multiple examples.\n obj['example-0'] = [schema.items.example];\n } else {\n const samples = schemaToSampleObj(schema.items, config);\n let i = 0;\n for (const key in samples) {\n obj[`example-${i}`] = [samples[key]];\n addSchemaInfoToExample(schema.items, obj[`example-${i}`]);\n i++;\n }\n }\n } else {\n obj['example-0'] = [];\n }\n } else {\n return { 'example-0': getSampleValueByType(schema) };\n }\n return obj;\n}\n\nfunction generateMarkdownForArrayAndObjectDescription(schema, level = 0) {\n let markdown = '';\n if (schema.title) {\n markdown = `**${schema.title}:** `;\n }\n if (schema.description) {\n markdown = `${markdown} ${schema.description} ${schema.minItems || schema.maxItems ? '
' : ''}`;\n }\n if (schema.minItems) {\n markdown = `${markdown} **Min Items:** ${schema.minItems}`;\n }\n if (schema.maxItems) {\n markdown = `${markdown} **Max Items:** ${schema.maxItems}`;\n }\n if (level > 0 && schema.items?.description) {\n let itemsMarkdown = '';\n if (schema.items.minProperties) {\n itemsMarkdown = `**Min Properties:** ${schema.items.minProperties}`;\n }\n if (schema.items.maxProperties) {\n itemsMarkdown = `${itemsMarkdown} **Max Properties:** ${schema.items.maxProperties}`;\n }\n markdown = `${markdown} ⮕ ${itemsMarkdown} [ ${schema.items.description} ] `;\n }\n return markdown;\n}\n/**\n * For changing OpenAPI-Schema to an Object Notation,\n * This Object would further be an input to UI Components to generate an Object-Tree\n * @param {object} schema - Schema object from OpenAPI spec\n * @param {object} obj - recursivly pass this object to generate object notation\n * @param {number} level - recursion level\n * @param {string} suffix - used for suffixing property names to avoid duplicate props during object composion\n */\nexport function schemaInObjectNotation(schema, obj, level = 0, suffix = '') {\n if (!schema) {\n return;\n }\n if (schema.allOf) {\n const objWithAllProps = {};\n if (schema.allOf.length === 1 && !schema.allOf[0].properties && !schema.allOf[0].items) {\n // If allOf has single item and the type is not an object or array, then its a primitive\n const tempSchema = schema.allOf[0];\n return `${getTypeInfo(tempSchema).html}`;\n }\n // If allOf is an array of multiple elements, then all the keys makes a single object\n schema.allOf.map((v, i) => {\n if (v.type === 'object' || v.properties || v.allOf || v.anyOf || v.oneOf) {\n const propSuffix = (v.anyOf || v.oneOf) && i > 0 ? i : '';\n const partialObj = schemaInObjectNotation(v, {}, (level + 1), propSuffix);\n Object.assign(objWithAllProps, partialObj);\n } else if (v.type === 'array' || v.items) {\n const partialObj = schemaInObjectNotation(v, {}, (level + 1));\n Object.assign(objWithAllProps, partialObj);\n } else if (v.type) {\n const prop = `prop${Object.keys(objWithAllProps).length}`;\n const typeObj = getTypeInfo(v);\n objWithAllProps[prop] = `${typeObj.html}`;\n } else {\n return '';\n }\n });\n obj = objWithAllProps;\n } else if (schema.anyOf || schema.oneOf) {\n obj['::description'] = schema.description || '';\n // 1. First iterate the regular properties\n if (schema.type === 'object' || schema.properties) {\n obj['::description'] = schema.description || '';\n obj['::type'] = 'object';\n // obj['::deprecated'] = schema.deprecated || false;\n for (const key in schema.properties) {\n if (schema.required && schema.required.includes(key)) {\n obj[`${key}*`] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n } else {\n obj[key] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n }\n }\n }\n // 2. Then show allof/anyof objects\n const objWithAnyOfProps = {};\n const xxxOf = schema.anyOf ? 'anyOf' : 'oneOf';\n schema[xxxOf].forEach((v, index) => {\n if (v.type === 'object' || v.properties || v.allOf || v.anyOf || v.oneOf) {\n const partialObj = schemaInObjectNotation(v, {});\n objWithAnyOfProps[`::OPTION~${index + 1}${v.title ? `~${v.title}` : ''}`] = partialObj;\n objWithAnyOfProps['::type'] = 'xxx-of-option';\n } else if (v.type === 'array' || v.items) {\n // This else-if block never seems to get executed\n const partialObj = schemaInObjectNotation(v, {});\n objWithAnyOfProps[`::OPTION~${index + 1}${v.title ? `~${v.title}` : ''}`] = partialObj;\n objWithAnyOfProps['::type'] = 'xxx-of-array';\n } else {\n const prop = `::OPTION~${index + 1}${v.title ? `~${v.title}` : ''}`;\n objWithAnyOfProps[prop] = `${getTypeInfo(v).html}`;\n objWithAnyOfProps['::type'] = 'xxx-of-option';\n }\n });\n obj[(schema.anyOf ? `::ANY~OF ${suffix}` : `::ONE~OF ${suffix}`)] = objWithAnyOfProps;\n obj['::type'] = 'xxx-of';\n } else if (Array.isArray(schema.type)) {\n // When a property has multiple types, then check further if any of the types are array or object, if yes then modify the schema using one-of\n // Clone the schema - as it will be modified to replace multi-data-types with one-of;\n const subSchema = JSON.parse(JSON.stringify(schema));\n const primitiveType = [];\n const complexTypes = [];\n subSchema.type.forEach((v) => {\n if (v.match(/integer|number|string|null|boolean/g)) {\n primitiveType.push(v);\n } else if (v === 'array' && typeof subSchema.items?.type === 'string' && subSchema.items?.type.match(/integer|number|string|null|boolean/g)) {\n // Array with primitive types should also be treated as primitive type\n if (subSchema.items.type === 'string' && subSchema.items.format) {\n primitiveType.push(`[${subSchema.items.format}]`);\n } else {\n primitiveType.push(`[${subSchema.items.type}]`);\n }\n } else {\n complexTypes.push(v);\n }\n });\n let multiPrimitiveTypes;\n if (primitiveType.length > 0) {\n subSchema.type = primitiveType.join(primitiveType.length === 2 ? ' or ' : '┃');\n multiPrimitiveTypes = getTypeInfo(subSchema);\n if (complexTypes.length === 0) {\n return `${multiPrimitiveTypes?.html || ''}`;\n }\n }\n if (complexTypes.length > 0) {\n obj['::type'] = 'xxx-of';\n const multiTypeOptions = {\n '::type': 'xxx-of-option',\n };\n\n // Generate ONE-OF options for complexTypes\n complexTypes.forEach((v, i) => {\n if (v === 'null') {\n multiTypeOptions[`::OPTION~${i + 1}`] = 'NULL~|~~|~~|~~|~~|~~|~~|~~|~';\n } else if ('integer, number, string, boolean,'.includes(`${v},`)) {\n subSchema.type = Array.isArray(v) ? v.join('┃') : v;\n const primitiveTypeInfo = getTypeInfo(subSchema);\n multiTypeOptions[`::OPTION~${i + 1}`] = primitiveTypeInfo.html;\n } else if (v === 'object') {\n // If object type iterate all the properties and create an object-type-option\n const objTypeOption = {\n '::title': schema.title || '',\n '::description': schema.description || '',\n '::type': 'object',\n '::deprecated': schema.deprecated || false,\n };\n for (const key in schema.properties) {\n if (schema.required && schema.required.includes(key)) {\n objTypeOption[`${key}*`] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n } else {\n objTypeOption[key] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n }\n }\n multiTypeOptions[`::OPTION~${i + 1}`] = objTypeOption;\n } else if (v === 'array') {\n multiTypeOptions[`::OPTION~${i + 1}`] = {\n '::title': schema.title || '',\n '::description': schema.description || '',\n '::type': 'array',\n '::props': schemaInObjectNotation(schema.items, {}, (level + 1)),\n };\n }\n });\n multiTypeOptions[`::OPTION~${complexTypes.length + 1}`] = multiPrimitiveTypes?.html || '';\n obj['::ONE~OF'] = multiTypeOptions;\n }\n } else if (schema.type === 'object' || schema.properties) { // If Object\n obj['::title'] = schema.title || '';\n obj['::description'] = generateMarkdownForArrayAndObjectDescription(schema, level);\n obj['::type'] = 'object';\n obj['::deprecated'] = schema.deprecated || false;\n obj['::readwrite'] = schema.readOnly ? 'readonly' : schema.writeOnly ? 'writeonly' : '';\n for (const key in schema.properties) {\n if (schema.required && schema.required.includes(key)) {\n obj[`${key}*`] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n } else {\n obj[key] = schemaInObjectNotation(schema.properties[key], {}, (level + 1));\n }\n }\n if (schema.additionalProperties) {\n obj[''] = schemaInObjectNotation(schema.additionalProperties, {});\n }\n } else if (schema.type === 'array' || schema.items) { // If Array\n obj['::title'] = schema.title || '';\n obj['::description'] = generateMarkdownForArrayAndObjectDescription(schema, level);\n obj['::type'] = 'array';\n obj['::deprecated'] = schema.deprecated || false;\n obj['::readwrite'] = schema.readOnly ? 'readonly' : schema.writeOnly ? 'writeonly' : '';\n if (schema.items?.items) {\n obj['::array-type'] = schema.items.items.type;\n }\n obj['::props'] = schemaInObjectNotation(schema.items, {}, (level + 1));\n } else {\n const typeObj = getTypeInfo(schema);\n if (typeObj?.html) {\n return `${typeObj.html}`;\n }\n return '';\n }\n return obj;\n}\n\n/* Create Example object */\nexport function generateExample(schema, mimeType, examples = '', example = '', includeReadOnly = true, includeWriteOnly = true, outputType = 'json', includeGeneratedExample = false) {\n const finalExamples = [];\n // First check if examples is provided\n if (examples) {\n for (const eg in examples) {\n let egContent = '';\n let egFormat = 'json';\n if (mimeType?.toLowerCase().includes('json')) {\n if (outputType === 'text') {\n egContent = typeof examples[eg].value === 'string' ? examples[eg].value : JSON.stringify(examples[eg].value, undefined, 2);\n egFormat = 'text';\n } else {\n egContent = examples[eg].value;\n if (typeof examples[eg].value === 'string') {\n try {\n const fixedJsonString = examples[eg].value.replace((/([\\w]+)(:)/g), '\"$1\"$2').replace((/'/g), '\"');\n egContent = JSON.parse(fixedJsonString);\n egFormat = 'json';\n } catch (err) {\n egFormat = 'text';\n egContent = examples[eg].value;\n }\n }\n }\n } else {\n egContent = examples[eg].value;\n egFormat = 'text';\n }\n\n finalExamples.push({\n exampleId: eg,\n exampleSummary: examples[eg].summary || eg,\n exampleDescription: examples[eg].description || '',\n exampleType: mimeType,\n exampleValue: egContent,\n exampleFormat: egFormat,\n });\n }\n } else if (example) {\n let egContent = '';\n let egFormat = 'json';\n if (mimeType?.toLowerCase().includes('json')) {\n if (outputType === 'text') {\n egContent = typeof example === 'string' ? example : JSON.stringify(example, undefined, 2);\n egFormat = 'text';\n } else if (typeof example === 'object') {\n egContent = example;\n egFormat = 'json';\n } else if (typeof example === 'string') {\n try {\n egContent = JSON.parse(example);\n egFormat = 'json';\n } catch (err) {\n egFormat = 'text';\n egContent = example;\n }\n }\n } else {\n egContent = example;\n egFormat = 'text';\n }\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: '',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: egContent,\n exampleFormat: egFormat,\n });\n }\n // If schema-level examples are not provided or includeGeneratedExample === true then generate one based on the schema field types\n if (finalExamples.length === 0 || includeGeneratedExample === true) {\n if (schema) {\n if (schema.example) { // Note: schema.examples (plurals) is not allowed as per spec\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: '',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: schema.example,\n exampleFormat: ((mimeType?.toLowerCase().includes('json') && typeof schema.example === 'object') ? 'json' : 'text'),\n });\n } else if (mimeType?.toLowerCase().includes('json') || mimeType?.toLowerCase().includes('text') || mimeType?.toLowerCase().includes('*/*') || mimeType?.toLowerCase().includes('xml')) {\n let xmlRootStart = '';\n let xmlRootEnd = '';\n let exampleFormat = '';\n let exampleValue = '';\n if (mimeType?.toLowerCase().includes('xml')) {\n xmlRootStart = (schema.xml && schema.xml.name) ? `<${schema.xml.name}>` : '';\n xmlRootEnd = (schema.xml && schema.xml.name) ? `` : '';\n exampleFormat = 'text';\n } else {\n exampleFormat = outputType;\n }\n\n const samples = schemaToSampleObj(\n schema,\n {\n includeReadOnly,\n includeWriteOnly,\n deprecated: true,\n },\n );\n\n let i = 0;\n for (const samplesKey in samples) {\n if (!samples[samplesKey]) {\n continue;\n }\n const summary = samples[samplesKey]['::TITLE'] || `Example ${++i}`;\n const description = samples[samplesKey]['::DESCRIPTION'] || '';\n removeTitlesAndDescriptions(samples[samplesKey]);\n\n if (mimeType?.toLowerCase().includes('xml')) {\n exampleValue = `${xmlRootStart}${json2xml(samples[samplesKey])}\\n${xmlRootEnd}`;\n } else {\n exampleValue = outputType === 'text' ? JSON.stringify(samples[samplesKey], null, 2) : samples[samplesKey];\n }\n\n finalExamples.push({\n exampleId: samplesKey,\n exampleSummary: summary,\n exampleDescription: description,\n exampleType: mimeType,\n exampleFormat,\n exampleValue,\n });\n }\n } else if (mimeType?.toLowerCase().includes('jose')) {\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: 'Base64 Encoded',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: schema.pattern || 'bXJpbg==',\n exampleFormat: 'text',\n });\n } else {\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: '',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: '',\n exampleFormat: 'text',\n });\n }\n } else {\n // No Example or Schema provided (should never reach here)\n finalExamples.push({\n exampleId: 'Example',\n exampleSummary: '',\n exampleDescription: '',\n exampleType: mimeType,\n exampleValue: '',\n exampleFormat: 'text',\n });\n }\n }\n return finalExamples;\n}\n\nfunction getSerializeStyleForContentType(contentType) {\n if (contentType === 'application/json') {\n return 'json';\n }\n if (contentType === 'application/xml') {\n return 'xml';\n }\n return null;\n}\n\nexport function getSchemaFromParam(param) {\n if (param.schema) {\n return [param.schema, null, null];\n }\n if (param.content) {\n // we gonna use the first content-encoding\n for (const contentType of Object.keys(param.content)) {\n if (param.content[contentType].schema) {\n return [param.content[contentType].schema, getSerializeStyleForContentType(contentType), param.content[contentType]];\n }\n }\n }\n return [null, null, null];\n}\n","import { LitElement, html, css } from 'lit';\nimport { copyToClipboard } from '~/utils/common-utils';\nimport FontStyles from '~/styles/font-styles';\nimport BorderStyles from '~/styles/border-styles';\nimport InputStyles from '~/styles/input-styles';\nimport CustomStyles from '~/styles/custom-styles';\n\nexport default class JsonTree extends LitElement {\n static get properties() {\n return {\n data: { type: Object },\n renderStyle: { type: String, attribute: 'render-style' },\n };\n }\n\n static get styles() {\n return [\n FontStyles,\n BorderStyles,\n InputStyles,\n css`\n :host{\n display:flex;\n }\n .json-tree {\n position: relative;\n font-family: var(--font-mono);\n font-size: var(--font-size-small);\n display:inline-block;\n overflow:hidden;\n word-break: break-all;\n flex:1;\n line-height: calc(var(--font-size-small) + 6px);\n direction: ltr; \n text-align: left;\n }\n\n .open-bracket {\n display:inline-block;\n padding: 0 20px 0 0;\n cursor:pointer;\n border: 1px solid transparent;\n border-radius:3px;\n }\n .close-bracket {\n border: 1px solid transparent;\n border-radius:3px;\n display:inline-block;\n }\n .open-bracket:hover {\n color:var(--primary-color);\n background-color:var(--hover-color);\n border: 1px solid var(--border-color);\n }\n .open-bracket.expanded:hover ~ .inside-bracket {\n border-left: 1px solid var(--fg3);\n }\n .open-bracket.expanded:hover ~ .close-bracket {\n color:var(--primary-color);\n }\n .inside-bracket{\n padding-left:12px;\n border-left:1px dotted var(--border-color);\n }\n .open-bracket.collapsed + .inside-bracket,\n .open-bracket.collapsed + .inside-bracket + .close-bracket {\n display:none;\n }\n\n .string{color:var(--green);}\n .number{color:var(--blue);}\n .null{color:var(--red);}\n .boolean{color:var(--purple);}\n .object{color:var(--fg)}\n .toolbar {\n position: absolute;\n top:5px;\n right:6px;\n display:flex;\n padding:2px;\n align-items: center;\n }`,\n CustomStyles,\n ];\n }\n\n /* eslint-disable indent */\n render() {\n return html`\n
\n
\n \n
\n ${this.generateTree(this.data, true)}\n
\n `;\n }\n\n generateTree(data, isLast = false) {\n if (data === null) {\n return html`
null
`;\n }\n if (typeof data === 'object' && (data instanceof Date === false)) {\n const detailType = Array.isArray(data) ? 'array' : 'pure_object';\n if (Object.keys(data).length === 0) {\n return html`${(Array.isArray(data) ? '[ ],' : '{ },')}`;\n }\n return html`\n
${detailType === 'array' ? '[' : '{'}
\n
\n ${Object.keys(data).map((key, i, a) => html`\n
\n ${detailType === 'pure_object' ? html`\"${key}\":` : ''}\n ${this.generateTree(data[key], i === (a.length - 1))}\n
`)\n }\n
\n
${detailType === 'array' ? ']' : '}'}${isLast ? '' : ','}
\n `;\n }\n\n return (typeof data === 'string' || data instanceof Date)\n ? html`\"${data}\"${isLast ? '' : ','}`\n : html`${data}${isLast ? '' : ','}`;\n }\n /* eslint-enable indent */\n\n toggleExpand(e) {\n const openBracketEl = e.target;\n if (openBracketEl.classList.contains('expanded')) {\n openBracketEl.classList.replace('expanded', 'collapsed');\n e.target.innerHTML = e.target.classList.contains('array') ? '[...]' : '{...}';\n } else {\n openBracketEl.classList.replace('collapsed', 'expanded');\n e.target.innerHTML = e.target.classList.contains('array') ? '[' : '{';\n }\n }\n}\n// Register the element with the browser\ncustomElements.define('json-tree', JsonTree);\n","import { LitElement, html, css } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport FontStyles from '~/styles/font-styles';\nimport SchemaStyles from '~/styles/schema-styles';\nimport BorderStyles from '~/styles/border-styles';\nimport CustomStyles from '~/styles/custom-styles';\n\nexport default class SchemaTree extends LitElement {\n static get properties() {\n return {\n data: { type: Object },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n schemaHideReadOnly: { type: String, attribute: 'schema-hide-read-only' },\n schemaHideWriteOnly: { type: String, attribute: 'schema-hide-write-only' },\n };\n }\n\n connectedCallback() {\n super.connectedCallback();\n if (!this.schemaExpandLevel || this.schemaExpandLevel < 1) { this.schemaExpandLevel = 99999; }\n if (!this.schemaDescriptionExpanded || !'true false'.includes(this.schemaDescriptionExpanded)) { this.schemaDescriptionExpanded = 'false'; }\n if (!this.schemaHideReadOnly || !'true false'.includes(this.schemaHideReadOnly)) { this.schemaHideReadOnly = 'true'; }\n if (!this.schemaHideWriteOnly || !'true false'.includes(this.schemaHideWriteOnly)) { this.schemaHideWriteOnly = 'true'; }\n }\n\n static get styles() {\n return [\n FontStyles,\n SchemaStyles,\n BorderStyles,\n css`\n .tree {\n font-size:var(--font-size-small);\n text-align: left;\n direction: ltr;\n line-height:calc(var(--font-size-small) + 6px);\n }\n .tree .tr:hover{\n background-color:var(--hover-color);\n }\n .collapsed-descr .tr {\n max-height:calc(var(--font-size-small) + 8px);\n }\n .collapsed-descr .m-markdown-small p {\n line-height:calc(var(--font-size-small) + 6px);\n }\n\n .tree .key {\n max-width: 300px;\n }\n .key.deprecated .key-label {\n color: var(--red);\n }\n .tr.expanded:hover > .td.key > .open-bracket {\n color: var(--primary-color);\n }\n .tr.expanded:hover + .inside-bracket {\n border-left: 1px solid var(--fg3);\n }\n .tr.expanded:hover + .inside-bracket + .close-bracket {\n color: var(--primary-color);\n }\n\n .open-bracket{\n display:inline-block;\n padding: 0 20px 0 0;\n cursor:pointer;\n border: 1px solid transparent;\n border-radius:3px;\n }\n .open-bracket:hover {\n color:var(--primary-color);\n background-color:var(--hover-color);\n border: 1px solid var(--border-color);\n }\n .close-bracket{\n display:inline-block;\n font-family: var(--font-mono);\n }\n .tr.collapsed + .inside-bracket,\n .tr.collapsed + .inside-bracket + .close-bracket{\n display:none;\n }\n .inside-bracket.object,\n .inside-bracket.array {\n border-left: 1px dotted var(--border-color);\n }\n .inside-bracket.xxx-of {\n padding:5px 0px;\n border-style: dotted;\n border-width: 0 0 1px 0;\n border-color:var(--primary-color);\n }`,\n CustomStyles,\n ];\n }\n\n /* eslint-disable indent */\n render() {\n return html`\n
\n
\n
${this.data?.['::type'] || ''}
\n ${this.allowSchemaDescriptionExpandToggle === 'true'\n ? html`\n
\n
\n ${this.schemaDescriptionExpanded === 'true' ? 'Single line description' : 'Multiline description'}\n
\n `\n : ''\n }\n
\n ${this.data?.['::description']\n ? html` ${unsafeHTML(marked(this.data['::description'] || ''))}`\n : ''\n }\n ${this.data\n ? html`\n ${this.generateTree(\n this.data['::type'] === 'array' ? this.data['::props'] : this.data,\n this.data['::type'],\n this.data['::array-type'] || '',\n )}`\n : html` Schema not found `\n }\n
\n `;\n }\n\n generateTree(data, dataType = 'object', arrayType = '', key = '', description = '', schemaLevel = 0, indentLevel = 0, readOrWrite = '') {\n if (this.schemaHideReadOnly === 'true') {\n if (dataType === 'array') {\n if (readOrWrite === 'readonly') {\n return;\n }\n }\n if (data && data['::readwrite'] === 'readonly') {\n return;\n }\n }\n if (this.schemaHideWriteOnly === 'true') {\n if (dataType === 'array') {\n if (readOrWrite === 'writeonly') {\n return;\n }\n }\n if (data && data['::readwrite'] === 'writeonly') {\n return;\n }\n }\n\n if (!data) {\n return html`
\n ${key.replace('::OPTION~', '')}\n ${\n dataType === 'array'\n ? html` [ ] `\n : dataType === 'object'\n ? html` { } `\n : html` schema undefined `\n }\n
`;\n }\n if (Object.keys(data).length === 0) {\n return html`${key}:{ }`;\n }\n let keyLabel = '';\n let keyDescr = '';\n if (key.startsWith('::ONE~OF') || key.startsWith('::ANY~OF')) {\n keyLabel = key.replace('::', '').replace('~', ' ');\n } else if (key.startsWith('::OPTION')) {\n const parts = key.split('~');\n keyLabel = parts[1]; // eslint-disable-line prefer-destructuring\n keyDescr = parts[2]; // eslint-disable-line prefer-destructuring\n } else {\n keyLabel = key;\n }\n\n const leftPadding = 12;\n const minFieldColWidth = 400 - (indentLevel * leftPadding);\n let openBracket = '';\n let closeBracket = '';\n const newSchemaLevel = data['::type']?.startsWith('xxx-of') ? schemaLevel : (schemaLevel + 1);\n // const newIndentLevel = dataType === 'xxx-of-option' || data['::type'] === 'xxx-of-option' ? indentLevel : (indentLevel + 1);\n const newIndentLevel = dataType === 'xxx-of-option' || data['::type'] === 'xxx-of-option' || key.startsWith('::OPTION') ? indentLevel : (indentLevel + 1);\n if (data['::type'] === 'object') {\n if (dataType === 'array') {\n if (schemaLevel < this.schemaExpandLevel) {\n openBracket = html`[{`;\n } else {\n openBracket = html`[{...}]`;\n }\n closeBracket = '}]';\n } else {\n if (schemaLevel < this.schemaExpandLevel) {\n openBracket = html`{`;\n } else {\n openBracket = html`{...}`;\n }\n closeBracket = '}';\n }\n } else if (data['::type'] === 'array') {\n if (dataType === 'array') {\n const arrType = arrayType !== 'object' ? arrayType : '';\n if (schemaLevel < this.schemaExpandLevel) {\n openBracket = html`[[ ${arrType} `;\n } else {\n openBracket = html`[[...]]`;\n }\n closeBracket = ']]';\n } else {\n if (schemaLevel < this.schemaExpandLevel) {\n openBracket = html`[`;\n } else {\n openBracket = html`[...]`;\n }\n closeBracket = ']';\n }\n }\n if (typeof data === 'object') {\n return html`\n
\n
\n ${data['::type'] === 'xxx-of-option' || data['::type'] === 'xxx-of-array' || key.startsWith('::OPTION')\n ? html` ${keyLabel}${keyDescr}`\n : keyLabel === '::props' || keyLabel === '::ARRAY~OF'\n ? ''\n : schemaLevel > 0\n ? html`\n ${data['::deprecated'] ? '✗' : ''}\n ${keyLabel.replace(/\\*$/, '')}${keyLabel.endsWith('*') ? html`*` : ''}${readOrWrite === 'readonly' ? html` 🆁` : readOrWrite === 'writeonly' ? html` 🆆` : readOrWrite}:\n `\n : ''\n }\n ${data['::type'] === 'xxx-of' && dataType === 'array' ? html`ARRAY` : ''} \n ${openBracket}\n
\n
${unsafeHTML(marked(description || ''))}
\n
\n
\n ${Array.isArray(data) && data[0]\n ? html`${this.generateTree(data[0], 'xxx-of-option', '', '::ARRAY~OF', '', newSchemaLevel, newIndentLevel, data[0]['::readwrite'])}`\n : html`\n ${Object.keys(data).map((dataKey) => html`\n ${['::title', '::description', '::type', '::props', '::deprecated', '::array-type', '::readwrite'].includes(dataKey)\n ? data[dataKey]['::type'] === 'array' || data[dataKey]['::type'] === 'object'\n ? html`${this.generateTree(\n data[dataKey]['::type'] === 'array' ? data[dataKey]['::props'] : data[dataKey],\n data[dataKey]['::type'],\n data[dataKey]['::array-type'] || '',\n dataKey,\n data[dataKey]['::description'],\n newSchemaLevel,\n newIndentLevel,\n data[dataKey]['::readwrite'] ? data[dataKey]['::readwrite'] : '',\n )}`\n : ''\n : html`${this.generateTree(\n data[dataKey]['::type'] === 'array' ? data[dataKey]['::props'] : data[dataKey],\n data[dataKey]['::type'],\n data[dataKey]['::array-type'] || '',\n dataKey,\n data[dataKey]['::description'],\n newSchemaLevel,\n newIndentLevel,\n data[dataKey]['::readwrite'] ? data[dataKey]['::readwrite'] : '',\n )}`\n }\n `)}\n `\n }\n
\n ${data['::type'] && data['::type'].includes('xxx-of')\n ? ''\n : html`
${closeBracket}
`\n }\n `;\n }\n\n // For Primitive types and array of Primitives\n const [type, primitiveReadOrWrite, constraint, defaultValue, allowedValues, pattern, schemaDescription, schemaTitle, deprecated] = data.split('~|~');\n if (primitiveReadOrWrite === '🆁' && this.schemaHideReadOnly === 'true') {\n return;\n }\n if (primitiveReadOrWrite === '🆆' && this.schemaHideWriteOnly === 'true') {\n return;\n }\n const dataTypeCss = type.replace(/┃.*/g, '').replace(/[^a-zA-Z0-9+]/g, '').substring(0, 4).toLowerCase();\n\n let finalReadWriteText = '';\n let finalReadWriteTip = '';\n if (dataType === 'array') {\n if (readOrWrite === 'readonly') {\n finalReadWriteText = '🆁';\n finalReadWriteTip = 'Read-Only';\n } else if (readOrWrite === 'writeonly') {\n finalReadWriteText = '🆆';\n finalReadWriteTip = 'Write-Only';\n }\n } else if (primitiveReadOrWrite === '🆁') {\n finalReadWriteText = '🆁';\n finalReadWriteTip = 'Read-Only';\n } else if (primitiveReadOrWrite === '🆆') {\n finalReadWriteText = '🆆';\n finalReadWriteTip = 'Write-Only';\n }\n\n return html`\n
\n
\n ${deprecated ? html`` : ''}\n ${keyLabel.endsWith('*')\n ? html`${keyLabel.substring(0, keyLabel.length - 1)}*:`\n : key.startsWith('::OPTION')\n ? html`${keyLabel}${keyDescr}`\n : html`${keyLabel}:`\n }\n \n ${dataType === 'array' ? `[${type}]` : `${type}`}\n ${finalReadWriteText}\n \n
\n
\n ${dataType === 'array' ? html`${unsafeHTML(marked(description))}` : ''}\n ${schemaDescription\n ? html`\n ${unsafeHTML(marked(`${schemaTitle ? `**${schemaTitle}:**` : ''} ${schemaDescription} ${constraint || defaultValue || allowedValues || pattern ? '' : ''}`))}\n `\n : schemaTitle\n ? html`${schemaTitle} ${constraint || defaultValue || allowedValues || pattern\n ? html``\n : ''}`\n : ''\n }\n ${constraint ? html`
Constraints: ${constraint}
` : ''}\n ${defaultValue ? html`
Default: ${defaultValue}
` : ''}\n ${allowedValues ? html`
Allowed: ${allowedValues}
` : ''}\n ${pattern ? html`
Pattern: ${pattern}
` : ''}\n
\n
\n `;\n }\n /* eslint-enable indent */\n\n toggleObjectExpand(e) {\n const rowEl = e.target.closest('.tr');\n if (rowEl.classList.contains('expanded')) {\n rowEl.classList.replace('expanded', 'collapsed');\n e.target.innerHTML = e.target.classList.contains('array-of-object')\n ? '[{...}]'\n : e.target.classList.contains('array-of-array')\n ? '[[...]]'\n : e.target.classList.contains('array')\n ? '[...]'\n : '{...}';\n } else {\n rowEl.classList.replace('collapsed', 'expanded');\n e.target.innerHTML = e.target.classList.contains('array-of-object')\n ? '[{'\n : e.target.classList.contains('array-of-array')\n ? `[[ ${e.target.dataset.arrayType}`\n : e.target.classList.contains('object')\n ? '{'\n : '[';\n }\n }\n}\ncustomElements.define('schema-tree', SchemaTree);\n","import { LitElement, html, css } from 'lit';\n\nexport default class TagInput extends LitElement {\n /* eslint-disable indent */\n render() {\n let tagItemTmpl = '';\n if (Array.isArray(this.value)) {\n tagItemTmpl = html`${this.value\n .filter((v) => v.trim() !== '')\n .map((v) => html`${v}`)\n }`;\n }\n return html`\n
\n ${tagItemTmpl}\n this.afterPaste(e)}\" @keydown=\"${this.afterKeyDown}\" @blur=\"${this.onBlur}\" placeholder=\"${this.placeholder || ''}\">\n
\n `;\n }\n /* eslint-enable indent */\n\n static get properties() {\n return {\n placeholder: { type: String },\n value: { type: Array, attribute: 'value' },\n };\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (name === 'value') {\n if (newVal && oldVal !== newVal) {\n this.value = newVal.split(',').filter((v) => v.trim() !== '');\n }\n }\n super.attributeChangedCallback(name, oldVal, newVal);\n }\n\n afterPaste(e) {\n const clipboardData = e.clipboardData || window.clipboardData;\n const pastedData = clipboardData.getData('Text');\n const pastedArray = pastedData ? pastedData.split(',').filter((v) => v.trim() !== '') : '';\n if (pastedArray) {\n if (Array.isArray(this.value)) {\n this.value = [...this.value, ...pastedArray];\n } else {\n this.value = pastedArray;\n }\n }\n e.preventDefault();\n }\n\n afterKeyDown(e) {\n if (e.keyCode === 13) {\n e.stopPropagation();\n e.preventDefault();\n if (e.target.value) {\n if (Array.isArray(this.value)) {\n this.value = [...this.value, e.target.value];\n } else {\n this.value = [e.target.value];\n }\n e.target.value = '';\n }\n } else if (e.keyCode === 8) {\n if (e.target.value.length === 0) {\n if (Array.isArray(this.value) && this.value.length > 0) {\n this.value.splice(-1);\n this.value = [...this.value];\n }\n }\n }\n }\n\n onBlur(e) {\n if (e.target.value) {\n if (Array.isArray(this.value)) {\n this.value = [...this.value, e.target.value];\n } else {\n this.value = [e.target.value];\n }\n e.target.value = '';\n }\n }\n\n static get styles() {\n return [css`\n .tags{\n display:flex;\n flex-wrap: wrap;\n outline: none;\n padding:0;\n border-radius:var(--border-radius);\n border:1px solid var(--border-color);\n cursor:text;\n overflow:hidden;\n background:var(--input-bg);\n }\n .tag, .editor {\n padding:3px;\n margin:2px;\n }\n .tag{\n border:1px solid var(--border-color);\n background-color:var(--bg3);\n color:var(--fg3);\n border-radius:var(--border-radius);\n word-break: break-all;\n font-size: var(--font-size-small);\n }\n .tag:hover ~ #cursor {\n display: block;\n }\n .editor{\n flex:1;\n border:1px solid transparent;\n color:var(--fg);\n min-width:60px;\n outline: none;\n line-height: inherit;\n font-family:inherit;\n background:transparent;\n font-size: calc(var(--font-size-small) + 1px);\n }\n .editor::placeholder {\n color: var(--placeholder-color);\n opacity:1;\n }\n `];\n }\n}\n// Register the element with the browser\ncustomElements.define('tag-input', TagInput);\n","import { LitElement, html, css } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { guard } from 'lit/directives/guard.js'; // eslint-disable-line import/extensions\nimport { live } from 'lit/directives/live.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport Prism from 'prismjs';\nimport TableStyles from '~/styles/table-styles';\nimport FlexStyles from '~/styles/flex-styles';\nimport InputStyles from '~/styles/input-styles';\nimport FontStyles from '~/styles/font-styles';\nimport BorderStyles from '~/styles/border-styles';\nimport TabStyles from '~/styles/tab-styles';\nimport PrismStyles from '~/styles/prism-styles';\nimport CustomStyles from '~/styles/custom-styles';\nimport { copyToClipboard, prettyXml, downloadResource, viewResource } from '~/utils/common-utils';\nimport { schemaInObjectNotation, getTypeInfo, generateExample, normalizeExamples, getSchemaFromParam, json2xml, nestExampleIfPresent } from '~/utils/schema-utils';\nimport '~/components/json-tree';\nimport '~/components/schema-tree';\nimport '~/components/tag-input';\n\nexport default class ApiRequest extends LitElement {\n constructor() {\n super();\n this.responseMessage = '';\n this.responseStatus = 'success';\n this.responseHeaders = '';\n this.responseText = '';\n this.responseUrl = '';\n this.curlSyntax = '';\n this.activeResponseTab = 'response'; // allowed values: response, headers, curl\n this.selectedRequestBodyType = '';\n this.selectedRequestBodyExample = '';\n this.activeParameterSchemaTabs = {};\n }\n\n static get properties() {\n return {\n serverUrl: { type: String, attribute: 'server-url' },\n servers: { type: Array },\n method: { type: String },\n path: { type: String },\n security: { type: Array },\n parameters: { type: Array },\n request_body: { type: Object },\n api_keys: { type: Array },\n parser: { type: Object },\n accept: { type: String },\n callback: { type: String },\n responseMessage: { type: String, attribute: false },\n responseText: { type: String, attribute: false },\n responseHeaders: { type: String, attribute: false },\n responseStatus: { type: String, attribute: false },\n responseUrl: { type: String, attribute: false },\n fillRequestFieldsWithExample: { type: String, attribute: 'fill-request-fields-with-example' },\n useSummaryToListExamples: { type: String, attribute: 'use-summary-to-list-example' },\n allowTry: { type: String, attribute: 'allow-try' },\n renderStyle: { type: String, attribute: 'render-style' },\n schemaStyle: { type: String, attribute: 'schema-style' },\n activeSchemaTab: { type: String, attribute: 'active-schema-tab' },\n activeParameterSchemaTabs: {\n type: Object,\n converter: {\n fromAttribute: (attr) => JSON.parse(attr),\n toAttribute: (prop) => JSON.stringify(prop),\n },\n attribute: 'active-parameter-schema-tabs',\n },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n schemaHideReadOnly: { type: String, attribute: 'schema-hide-read-only' },\n schemaHideWriteOnly: { type: String, attribute: 'schema-hide-write-only' },\n fetchCredentials: { type: String, attribute: 'fetch-credentials' },\n\n // properties for internal tracking\n activeResponseTab: { type: String }, // internal tracking of response-tab not exposed as a attribute\n selectedRequestBodyType: { type: String, attribute: 'selected-request-body-type' }, // internal tracking of selected request-body type\n selectedRequestBodyExample: { type: String, attribute: 'selected-request-body-example' }, // internal tracking of selected request-body example\n };\n }\n\n static get styles() {\n return [\n TableStyles,\n InputStyles,\n FontStyles,\n FlexStyles,\n BorderStyles,\n TabStyles,\n PrismStyles,\n css`\n *, *:before, *:after { box-sizing: border-box; }\n \n .read-mode {\n margin-top: 24px;\n }\n .param-name,\n .param-type {\n margin: 1px 0;\n text-align: right;\n line-height: var(--font-size-small);\n }\n .param-name {\n color: var(--fg); \n font-family: var(--font-mono);\n }\n .param-name.deprecated { \n color: var(--red);\n }\n .param-type{\n color: var(--light-fg); \n font-family: var(--font-regular);\n }\n .param-constraint{\n min-width:100px;\n }\n .param-constraint:empty{\n display:none;\n }\n .top-gap{margin-top:24px;}\n\n .textarea {\n min-height:220px; \n padding:5px;\n resize:vertical;\n direction: ltr;\n }\n .example:first-child {\n margin-top: -9px;\n }\n\n .response-message{\n font-weight:bold;\n text-overflow: ellipsis;\n }\n .response-message.error {\n color:var(--red);\n }\n .response-message.success {\n color:var(--blue);\n }\n\n .file-input-container {\n align-items:flex-end;\n }\n .file-input-container .input-set:first-child .file-input-remove-btn{\n visibility:hidden;\n }\n\n .file-input-remove-btn{\n font-size:16px;\n color:var(--red);\n outline: none;\n border: none;\n background:none;\n cursor:pointer;\n }\n\n .v-tab-btn {\n font-size: var(--smal-font-size);\n height:24px; \n border:none; \n background:none; \n opacity: 0.3;\n cursor: pointer;\n padding: 4px 8px;\n }\n .v-tab-btn.active {\n font-weight: bold;\n background: var(--bg);\n opacity: 1;\n }\n\n @media only screen and (min-width: 768px) {\n .textarea {\n padding:8px;\n }\n }\n\n @media only screen and (max-width: 470px) {\n .hide-in-small-screen {\n display:none;\n }\n }\n `,\n CustomStyles,\n ];\n }\n\n render() {\n return html`\n
\n
\n ${this.callback === 'true' ? 'CALLBACK REQUEST' : 'REQUEST'}\n
\n
\n ${guard([this.allowTry, this.parameters, this.activeParameterSchemaTabs], () => this.inputParametersTemplate('path'))}\n ${guard([this.allowTry, this.parameters, this.activeParameterSchemaTabs], () => this.inputParametersTemplate('query'))}\n ${this.requestBodyTemplate()}\n ${guard([this.allowTry, this.parameters, this.activeParameterSchemaTabs], () => this.inputParametersTemplate('header'))}\n ${guard([this.allowTry, this.parameters, this.activeParameterSchemaTabs], () => this.inputParametersTemplate('cookie'))}\n ${this.allowTry === 'false' ? '' : html`${this.apiCallTemplate()}`}\n
\n
\n `;\n }\n\n updated(changedProperties) {\n // In focused mode after rendering the request component, update the text-areas(which contains examples) using\n // the original values from hidden textareas\n // This is done coz, user may update the dom by editing the textarea's and once the DOM is updated externally change detection wont happen, therefore update the values manually\n if (this.renderStyle === 'focused') {\n if (changedProperties.size === 1 && changedProperties.has('activeSchemaTab')) {\n // dont update example as only tabs is switched\n } else {\n const exampleTextAreaEls = [...this.shadowRoot.querySelectorAll('textarea[data-ptype=\"form-data\"]')];\n exampleTextAreaEls.forEach((el) => {\n const origExampleEl = this.shadowRoot.querySelector(`textarea[data-pname='hidden-${el.dataset.pname}']`);\n if (origExampleEl) {\n el.value = origExampleEl.value;\n }\n });\n }\n }\n }\n\n /* eslint-disable indent */\n\n exampleListTemplate(paramName, paramType, exampleList = []) {\n return html`\n ${(exampleList.length > 0\n ? html`Example: \n ${exampleList.map((v, i) => html`\n ${i === 0 ? '' : '┃'}\n ${paramType === 'array' ? '[' : ''}\n {\n const inputEl = e.target.closest('table').querySelector(`[data-pname=\"${paramName}\"]`);\n if (inputEl) {\n if (e.target.dataset.exampleType === 'array') {\n inputEl.value = e.target.dataset.example.split('~|~');\n } else {\n inputEl.value = e.target.dataset.example;\n }\n }\n }\n }\"\n >\n ${this.useSummaryToListExamples === 'true'\n ? v.description || v.summary || (v.value && Array.isArray(v.value) ? (v.value?.join(', ')) : (v.value || ''))\n : v.value && Array.isArray(v.value) ? (v.value?.join(', ')) : (v.value || '')\n }\n \n ${paramType === 'array' ? '] ' : ''}\n `)}\n `\n : ''\n )}`;\n }\n\n inputParametersTemplate(paramType) {\n const filteredParams = this.parameters ? this.parameters.filter((param) => param.in === paramType) : [];\n if (filteredParams.length === 0) {\n return '';\n }\n let title = '';\n if (paramType === 'path') {\n title = 'PATH PARAMETERS';\n } else if (paramType === 'query') {\n title = 'QUERY-STRING PARAMETERS';\n } else if (paramType === 'header') {\n title = 'REQUEST HEADERS';\n } else if (paramType === 'cookie') {\n title = 'COOKIES';\n }\n\n const tableRows = [];\n for (const param of filteredParams) {\n const [declaredParamSchema, serializeStyle, mimeTypeElem] = getSchemaFromParam(param);\n if (!declaredParamSchema) {\n continue; // eslint-disable-line no-continue\n }\n const paramSchema = getTypeInfo(declaredParamSchema);\n if (!paramSchema) {\n continue; // eslint-disable-line no-continue\n }\n const schemaAsObj = schemaInObjectNotation(declaredParamSchema, {});\n // let exampleVal = '';\n // let exampleList = [];\n let paramStyle = 'form';\n let paramExplode = true;\n let paramAllowReserved = false;\n if (paramType === 'query') {\n if (param.style && 'form spaceDelimited pipeDelimited'.includes(param.style)) {\n paramStyle = param.style;\n } else if (serializeStyle) {\n paramStyle = serializeStyle;\n }\n if (typeof param.explode === 'boolean') {\n paramExplode = param.explode;\n }\n if (typeof param.allowReserved === 'boolean') {\n paramAllowReserved = param.allowReserved;\n }\n }\n\n // openapi 3.1.0 spec based examples (which must be Object(string : { value:any, summary?: string, description?: string})\n const example = normalizeExamples(\n (param.examples\n || nestExampleIfPresent(param.example)\n || nestExampleIfPresent(mimeTypeElem?.example)\n || mimeTypeElem?.examples\n || paramSchema.examples\n || nestExampleIfPresent(paramSchema.example)\n ),\n paramSchema.type,\n );\n if (!example.exampleVal && paramSchema.type === 'object') {\n example.exampleVal = generateExample(\n declaredParamSchema,\n serializeStyle || 'json',\n '',\n '',\n !(this.schemaHideReadOnly && (this.schemaHideReadOnly.includes(this.method) || this.schemaHideReadOnly === 'true')),\n !(this.schemaHideWriteOnly && (this.schemaHideWriteOnly.includes(this.method) || this.schemaHideWriteOnly === 'true')),\n 'text',\n false,\n )[0].exampleValue;\n }\n const labelColWidth = 'read focused'.includes(this.renderStyle) ? '200px' : '160px';\n tableRows.push(html`\n \n \n
\n ${param.deprecated ? html`` : ''}\n ${param.required ? html`*` : ''}\n ${param.name}\n
\n
\n ${paramSchema.type === 'array'\n ? `${paramSchema.arrayType}`\n : `${paramSchema.format ? paramSchema.format : paramSchema.type}`\n }\n
\n \n ${this.allowTry === 'true'\n ? html`\n \n ${paramSchema.type === 'array'\n ? html`\n \n `\n : paramSchema.type === 'object'\n ? html`\n
\n
{\n if (e.target.tagName.toLowerCase() === 'button') {\n const newState = { ...this.activeParameterSchemaTabs };\n newState[param.name] = e.target.dataset.tab;\n this.activeParameterSchemaTabs = newState;\n }\n }}\">\n \n \n
\n ${this.activeParameterSchemaTabs[param.name] === 'example'\n ? html`
\n \n
`\n : html`\n
\n \n
`\n }\n
`\n : html`\n `\n }\n `\n : ''\n }\n ${paramSchema.default || paramSchema.constrain || paramSchema.allowedValues || paramSchema.pattern\n ? html`\n \n
\n ${paramSchema.default ? html`Default: ${paramSchema.default}
` : ''}\n ${paramSchema.pattern ? html`Pattern: ${paramSchema.pattern}
` : ''}\n ${paramSchema.constrain ? html`${paramSchema.constrain}
` : ''}\n ${paramSchema.allowedValues && paramSchema.allowedValues.split('┃').map((v, i) => html`\n ${i > 0 ? '┃' : html`Allowed: `}\n ${html`\n {\n const inputEl = e.target.closest('table').querySelector(`[data-pname=\"${param.name}\"]`);\n if (inputEl) {\n if (e.target.dataset.type === 'array') {\n inputEl.value = [e.target.dataset.enum];\n } else {\n inputEl.value = e.target.dataset.enum;\n }\n }\n }}\"\n >${v}`\n }`)}\n
\n `\n : html``\n }\n \n \n ${this.allowTry === 'true' ? html` ` : ''}\n \n ${unsafeHTML(marked(param.description || ''))}\n ${this.exampleListTemplate.call(this, param.name, paramSchema.type, example.exampleList)}\n \n \n `);\n }\n\n return html`\n
${title}
\n
\n \n ${tableRows}\n
\n
`;\n }\n\n resetRequestBodySelection() {\n this.selectedRequestBodyType = '';\n this.selectedRequestBodyExample = '';\n this.clearResponseData();\n }\n\n // Request-Body Event Handlers\n onSelectExample(e) {\n this.selectedRequestBodyExample = e.target.value;\n const exampleDropdownEl = e.target;\n window.setTimeout((selectEl) => {\n const readOnlyExampleEl = selectEl.closest('.example-panel').querySelector('.request-body-param');\n const userInputExampleTextareaEl = selectEl.closest('.example-panel').querySelector('.request-body-param-user-input');\n userInputExampleTextareaEl.value = readOnlyExampleEl.innerText;\n }, 0, exampleDropdownEl);\n }\n\n onMimeTypeChange(e) {\n this.selectedRequestBodyType = e.target.value;\n const mimeDropdownEl = e.target;\n this.selectedRequestBodyExample = '';\n window.setTimeout((selectEl) => {\n const readOnlyExampleEl = selectEl.closest('.request-body-container').querySelector('.request-body-param');\n if (readOnlyExampleEl) {\n const userInputExampleTextareaEl = selectEl.closest('.request-body-container').querySelector('.request-body-param-user-input');\n userInputExampleTextareaEl.value = readOnlyExampleEl.innerText;\n }\n }, 0, mimeDropdownEl);\n }\n\n requestBodyTemplate() {\n if (!this.request_body) {\n return '';\n }\n if (Object.keys(this.request_body).length === 0) {\n return '';\n }\n\n // Variable to store partial HTMLs\n let reqBodyTypeSelectorHtml = '';\n let reqBodyFileInputHtml = '';\n let reqBodyFormHtml = '';\n let reqBodySchemaHtml = '';\n let reqBodyExampleHtml = '';\n\n const requestBodyTypes = [];\n const { content } = this.request_body;\n for (const mimeType in content) {\n requestBodyTypes.push({\n mimeType,\n schema: content[mimeType].schema,\n example: content[mimeType].example,\n examples: content[mimeType].examples,\n });\n if (!this.selectedRequestBodyType) {\n this.selectedRequestBodyType = mimeType;\n }\n }\n // MIME Type selector\n reqBodyTypeSelectorHtml = requestBodyTypes.length === 1\n ? ''\n : html`\n \n `;\n\n // For Loop - Main\n requestBodyTypes.forEach((reqBody) => {\n let schemaAsObj;\n let reqBodyExamples = [];\n\n if (this.selectedRequestBodyType.includes('json') || this.selectedRequestBodyType.includes('xml') || this.selectedRequestBodyType.includes('text') || this.selectedRequestBodyType.includes('jose')) {\n // Generate Example\n if (reqBody.mimeType === this.selectedRequestBodyType) {\n reqBodyExamples = generateExample(\n reqBody.schema,\n reqBody.mimeType,\n reqBody.examples,\n reqBody.example,\n !(this.schemaHideReadOnly && (this.schemaHideReadOnly.includes(this.method) || this.schemaHideReadOnly === 'true')),\n !(this.schemaHideWriteOnly && (this.schemaHideWriteOnly.includes(this.method) || this.schemaHideWriteOnly === 'true')),\n 'text',\n false,\n );\n if (!this.selectedRequestBodyExample) {\n this.selectedRequestBodyExample = (reqBodyExamples.length > 0 ? reqBodyExamples[0].exampleId : '');\n }\n reqBodyExampleHtml = html`\n ${reqBodyExampleHtml}\n
\n ${reqBodyExamples.length === 1\n ? ''\n : html`\n \n `\n }\n ${reqBodyExamples\n .filter((v) => v.exampleId === this.selectedRequestBodyExample)\n .map((v) => html`\n
\n ${v.exampleSummary && v.exampleSummary.length > 80 ? html`
${v.exampleSummary}
` : ''}\n ${v.exampleDescription ? html`
${unsafeHTML(marked(v.exampleDescription || ''))}
` : ''}\n \n
${(v.exampleFormat === 'text' ? v.exampleValue : JSON.stringify(v.exampleValue, null, 2))}
\n\n \n \n
\n `)}\n\n
\n `;\n }\n } else if (this.selectedRequestBodyType.includes('form-urlencoded') || this.selectedRequestBodyType.includes('form-data')) {\n if (reqBody.mimeType === this.selectedRequestBodyType) {\n const ex = generateExample(\n reqBody.schema,\n reqBody.mimeType,\n reqBody.examples,\n reqBody.example,\n !(this.schemaHideReadOnly && (this.schemaHideReadOnly.includes(this.method) || this.schemaHideReadOnly === 'true')),\n !(this.schemaHideWriteOnly && (this.schemaHideWriteOnly.includes(this.method) || this.schemaHideWriteOnly === 'true')),\n 'text',\n false,\n );\n if (reqBody.schema) {\n reqBodyFormHtml = this.formDataTemplate(reqBody.schema, reqBody.mimeType, (ex[0] ? ex[0].exampleValue : ''));\n }\n }\n } else if ((/^audio\\/|^image\\/|^video\\/|^font\\/|tar$|zip$|7z$|rtf$|msword$|excel$|\\/pdf$|\\/octet-stream$/.test(this.selectedRequestBodyType))) {\n if (reqBody.mimeType === this.selectedRequestBodyType) {\n reqBodyFileInputHtml = html`\n
\n \n
\n `;\n }\n }\n\n // Generate Schema\n if (reqBody.mimeType.includes('json') || reqBody.mimeType.includes('xml') || reqBody.mimeType.includes('text') || this.selectedRequestBodyType.includes('jose')) {\n schemaAsObj = schemaInObjectNotation(reqBody.schema, {});\n if (this.schemaStyle === 'table') {\n reqBodySchemaHtml = html`\n ${reqBodySchemaHtml}\n \n `;\n } else if (this.schemaStyle === 'tree') {\n reqBodySchemaHtml = html`\n ${reqBodySchemaHtml}\n \n `;\n }\n }\n });\n\n return html`\n
\n
\n REQUEST BODY ${this.request_body.required ? html`*` : ''} \n ${this.selectedRequestBodyType}\n \n ${reqBodyTypeSelectorHtml}\n
\n ${this.request_body.description ? html`
${unsafeHTML(marked(this.request_body.description))}
` : ''}\n \n ${(this.selectedRequestBodyType.includes('json') || this.selectedRequestBodyType.includes('xml') || this.selectedRequestBodyType.includes('text') || this.selectedRequestBodyType.includes('jose'))\n ? html`\n
\n
{ if (e.target.tagName.toLowerCase() === 'button') { this.activeSchemaTab = e.target.dataset.tab; } }}\">\n \n \n
\n ${this.activeSchemaTab === 'example'\n ? html`
${reqBodyExampleHtml}
`\n : html`
${reqBodySchemaHtml}
`\n }\n
`\n : html` \n ${reqBodyFileInputHtml}\n ${reqBodyFormHtml}`\n }\n
\n `;\n }\n\n formDataParamAsObjectTemplate(fieldName, fieldSchema, mimeType) {\n // This template is used when form-data param should be send as a object (application/json, application/xml)\n const formdataPartSchema = schemaInObjectNotation(fieldSchema, {});\n const formdataPartExample = generateExample(\n fieldSchema,\n 'json',\n fieldSchema.examples,\n fieldSchema.example,\n !(this.schemaHideReadOnly && (this.schemaHideReadOnly.includes(this.method) || this.schemaHideReadOnly === 'true')),\n !(this.schemaHideWriteOnly && (this.schemaHideWriteOnly.includes(this.method) || this.schemaHideWriteOnly === 'true')),\n 'text',\n false,\n );\n\n return html`\n
\n
\n
{\n if (e.target.classList.contains('v-tab-btn')) {\n const { tab } = e.target.dataset;\n if (tab) {\n const tabPanelEl = e.target.closest('.tab-panel');\n const selectedTabBtnEl = tabPanelEl.querySelector(`.v-tab-btn[data-tab=\"${tab}\"]`);\n const otherTabBtnEl = [...tabPanelEl.querySelectorAll(`.v-tab-btn:not([data-tab=\"${tab}\"])`)];\n const selectedTabContentEl = tabPanelEl.querySelector(`.tab-content[data-tab=\"${tab}\"]`);\n const otherTabContentEl = [...tabPanelEl.querySelectorAll(`.tab-content:not([data-tab=\"${tab}\"])`)];\n selectedTabBtnEl.classList.add('active');\n selectedTabContentEl.style.display = 'block';\n otherTabBtnEl.forEach((el) => { el.classList.remove('active'); });\n otherTabContentEl.forEach((el) => { el.style.display = 'none'; });\n }\n }\n if (e.target.tagName.toLowerCase() === 'button') { this.activeSchemaTab = e.target.dataset.tab; }\n }}\">\n \n \n
\n
\n ${html`\n
\n \n \n \n
`\n }\n ${html`\n
\n \n
`\n }\n
\n `;\n }\n\n formDataTemplate(schema, mimeType, exampleValue = '') {\n const formDataTableRows = [];\n if (schema.properties) {\n for (const fieldName in schema.properties) {\n const fieldSchema = schema.properties[fieldName];\n if (fieldSchema.readOnly) {\n continue;\n }\n const fieldExamples = fieldSchema.examples || fieldSchema.example || '';\n const fieldType = fieldSchema.type;\n const paramSchema = getTypeInfo(fieldSchema);\n const labelColWidth = 'read focused'.includes(this.renderStyle) ? '200px' : '160px';\n const example = normalizeExamples((paramSchema.examples || paramSchema.example), paramSchema.type);\n formDataTableRows.push(html`\n \n \n
\n ${fieldName}${(schema.required?.includes(fieldName) || fieldSchema.required) ? html`*` : ''}\n
\n
${paramSchema.type}
\n \n \n ${fieldType === 'array'\n ? fieldSchema.items?.format === 'binary'\n ? html`\n
this.onAddRemoveFileInput(e, fieldName, mimeType)}\">\n
\n \n \n
\n \n
\n `\n : html`\n \n \n `\n : html`\n ${fieldType === 'object'\n ? this.formDataParamAsObjectTemplate.call(this, fieldName, fieldSchema, mimeType)\n : html`\n ${this.allowTry === 'true'\n ? html``\n : ''\n }\n `\n }`\n }\n \n ${fieldType === 'object'\n ? ''\n : html`\n \n ${paramSchema.default || paramSchema.constrain || paramSchema.allowedValues || paramSchema.pattern\n ? html`\n
\n ${paramSchema.default ? html`Default: ${paramSchema.default}
` : ''}\n ${paramSchema.pattern ? html`Pattern: ${paramSchema.pattern}
` : ''}\n ${paramSchema.constrain ? html`${paramSchema.constrain}
` : ''}\n ${paramSchema.allowedValues && paramSchema.allowedValues.split('┃').map((v, i) => html`\n ${i > 0 ? '┃' : html`Allowed: `}\n ${html`\n {\n const inputEl = e.target.closest('table').querySelector(`[data-pname=\"${fieldName}\"]`);\n if (inputEl) {\n if (e.target.dataset.type === 'array') {\n inputEl.value = [e.target.dataset.enum];\n } else {\n inputEl.value = e.target.dataset.enum;\n }\n }\n }}\"\n > \n ${v} \n `\n }`)\n }\n
`\n : ''\n }\n `\n }\n \n ${fieldType === 'object'\n ? ''\n : html`\n \n \n \n ${unsafeHTML(marked(fieldSchema.description || ''))}\n ${this.exampleListTemplate.call(this, fieldName, paramSchema.type, example.exampleList)}\n \n \n `\n }`);\n }\n return html`\n \n ${formDataTableRows}\n
\n `;\n }\n\n return html`\n \n ${schema.description ? html`${unsafeHTML(marked(schema.description))}` : ''}\n `;\n }\n\n apiResponseTabTemplate() {\n const responseFormat = this.responseHeaders.includes('json') ? 'json' : (this.responseHeaders.includes('html') || this.responseHeaders.includes('xml')) ? 'html' : '';\n return html`\n
\n
Response Status: ${this.responseMessage}
\n
\n \n
\n
\n
{\n if (e.target.classList.contains('tab-btn') === false) { return; }\n this.activeResponseTab = e.target.dataset.tab;\n }}\">\n \n \n \n
\n ${this.responseIsBlob\n ? html`\n
\n \n ${this.responseBlobType === 'view'\n ? html``\n : ''\n }\n
`\n : html`\n
\n \n
${responseFormat\n                ? html`${unsafeHTML(Prism.highlight(this.responseText, Prism.languages[responseFormat], responseFormat))}`\n                : `${this.responseText}`\n              }
\n
`\n }\n
\n \n
${unsafeHTML(Prism.highlight(this.responseHeaders, Prism.languages.css, 'css'))}
\n
\n
\n \n
${unsafeHTML(Prism.highlight(this.curlSyntax.trim().replace(/\\\\$/, ''), Prism.languages.shell, 'shell'))}
\n
\n
`;\n }\n\n apiCallTemplate() {\n let selectServerDropdownHtml = '';\n\n if (this.servers && this.servers.length > 0) {\n selectServerDropdownHtml = html`\n \n `;\n }\n const selectedServerHtml = html`\n
\n ${selectServerDropdownHtml}\n ${this.serverUrl\n ? html`\n
\n
API Server
\n ${this.serverUrl} \n
\n `\n : ''\n }\n
\n `;\n\n return html`\n
\n
\n
\n ${selectedServerHtml}\n
\n
\n
Authentication
\n ${this.security?.length > 0\n ? html`\n ${this.api_keys.length > 0\n ? html`
\n ${this.api_keys.length === 1\n ? `${this.api_keys[0]?.typeDisplay} in ${this.api_keys[0].in}`\n : `${this.api_keys.length} API keys applied`\n } \n
`\n : html`
Required (None Applied)`\n }`\n : html` Not Required `\n }\n
\n
\n ${\n this.parameters.length > 0 || this.request_body\n ? html`\n \n `\n : ''\n }\n \n
\n ${this.responseMessage === '' ? '' : this.apiResponseTabTemplate()}\n `;\n }\n /* eslint-enable indent */\n\n async onFillRequestData(e) {\n const requestPanelEl = e.target.closest('.request-panel');\n const requestPanelInputEls = [...requestPanelEl.querySelectorAll('input, tag-input, textarea:not(.is-hidden)')];\n requestPanelInputEls.forEach((el) => {\n if (el.dataset.example) {\n if (el.tagName.toUpperCase() === 'TAG-INPUT') {\n el.value = el.dataset.example.split('~|~');\n } else {\n el.value = el.dataset.example;\n }\n }\n });\n }\n\n async onClearRequestData(e) {\n const requestPanelEl = e.target.closest('.request-panel');\n const requestPanelInputEls = [...requestPanelEl.querySelectorAll('input, tag-input, textarea:not(.is-hidden)')];\n requestPanelInputEls.forEach((el) => { el.value = ''; });\n }\n\n async onTryClick(e) {\n // const me = this;\n const tryBtnEl = e.target;\n let fetchUrl;\n let curlUrl;\n let curl = '';\n let curlHeaders = '';\n let curlData = '';\n let curlForm = '';\n const respEl = this.closest('.expanded-req-resp-container, .req-resp-container')?.getElementsByTagName('api-response')[0];\n const acceptHeader = respEl?.selectedMimeType;\n const requestPanelEl = e.target.closest('.request-panel');\n const pathParamEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='path']\")];\n const queryParamEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='query']\")];\n const queryParamObjTypeEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='query-object']\")];\n const headerParamEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='header']\")];\n const requestBodyContainerEl = requestPanelEl.querySelector('.request-body-container');\n fetchUrl = this.path;\n const fetchOptions = {\n method: this.method.toUpperCase(),\n };\n // Generate URL using Path Params\n pathParamEls.map((el) => {\n fetchUrl = fetchUrl.replace(`{${el.dataset.pname}}`, encodeURIComponent(el.value));\n });\n\n // Query Params\n const urlQueryParamsMap = new Map();\n const queryParamsWithReservedCharsAllowed = [];\n if (queryParamEls.length > 0) {\n queryParamEls.forEach((el) => {\n const queryParam = new URLSearchParams();\n if (el.dataset.paramAllowReserved === 'true') {\n queryParamsWithReservedCharsAllowed.push(el.dataset.pname);\n }\n if (el.dataset.array === 'false') {\n if (el.value !== '') {\n queryParam.append(el.dataset.pname, el.value);\n }\n } else {\n const { paramSerializeStyle, paramSerializeExplode } = el.dataset;\n let vals = ((el.value && Array.isArray(el.value)) ? el.value : []);\n vals = Array.isArray(vals) ? vals.filter((v) => v !== '') : [];\n if (vals.length > 0) {\n if (paramSerializeStyle === 'spaceDelimited') {\n queryParam.append(el.dataset.pname, vals.join(' ').replace(/^\\s|\\s$/g, ''));\n } else if (paramSerializeStyle === 'pipeDelimited') {\n queryParam.append(el.dataset.pname, vals.join('|').replace(/^\\||\\|$/g, ''));\n } else {\n if (paramSerializeExplode === 'true') { // eslint-disable-line no-lonely-if\n vals.forEach((v) => { queryParam.append(el.dataset.pname, v); });\n } else {\n queryParam.append(el.dataset.pname, vals.join(',').replace(/^,|,$/g, ''));\n }\n }\n }\n }\n if (queryParam.toString()) {\n urlQueryParamsMap.set(el.dataset.pname, queryParam);\n }\n });\n }\n\n // Query Params (Dynamic - create from JSON)\n if (queryParamObjTypeEls.length > 0) {\n queryParamObjTypeEls.map((el) => {\n const queryParam = new URLSearchParams();\n try {\n let queryParamObj = {};\n const { paramSerializeStyle, paramSerializeExplode } = el.dataset;\n queryParamObj = Object.assign(queryParamObj, JSON.parse(el.value.replace(/\\s+/g, ' ')));\n if (el.dataset.paramAllowReserved === 'true') {\n queryParamsWithReservedCharsAllowed.push(el.dataset.pname);\n }\n if ('json xml'.includes(paramSerializeStyle)) {\n if (paramSerializeStyle === 'json') {\n queryParam.append(el.dataset.pname, JSON.stringify(queryParamObj));\n } else if (paramSerializeStyle === 'xml') {\n queryParam.append(el.dataset.pname, json2xml(queryParamObj));\n }\n } else {\n for (const key in queryParamObj) {\n if (typeof queryParamObj[key] === 'object') {\n if (Array.isArray(queryParamObj[key])) {\n if (paramSerializeStyle === 'spaceDelimited') {\n queryParam.append(key, queryParamObj[key].join(' '));\n } else if (paramSerializeStyle === 'pipeDelimited') {\n queryParam.append(key, queryParamObj[key].join('|'));\n } else {\n if (paramSerializeExplode === 'true') { // eslint-disable-line no-lonely-if\n queryParamObj[key].forEach((v) => {\n queryParam.append(key, v);\n });\n } else {\n queryParam.append(key, queryParamObj[key]);\n }\n }\n }\n } else {\n queryParam.append(key, queryParamObj[key]);\n }\n }\n }\n } catch (err) {\n console.log('RapiDoc: unable to parse %s into object', el.value); // eslint-disable-line no-console\n }\n if (queryParam.toString()) {\n urlQueryParamsMap.set(el.dataset.pname, queryParam);\n }\n });\n }\n let urlQueryParamString = '';\n if (urlQueryParamsMap.size) {\n urlQueryParamString = '?';\n urlQueryParamsMap.forEach((val, pname) => {\n if (queryParamsWithReservedCharsAllowed.includes(pname)) {\n urlQueryParamString += `${pname}=`;\n urlQueryParamString += val.getAll(pname).join(`&${pname}=`);\n urlQueryParamString += '&';\n } else {\n urlQueryParamString += `${val.toString()}&`;\n }\n });\n urlQueryParamString = urlQueryParamString.slice(0, -1);\n }\n fetchUrl = `${fetchUrl}${urlQueryParamString}`;\n\n // Add authentication Query-Param if provided\n this.api_keys\n .filter((v) => (v.in === 'query'))\n .forEach((v) => {\n fetchUrl = `${fetchUrl}${fetchUrl.includes('?') ? '&' : '?'}${v.name}=${encodeURIComponent(v.finalKeyValue)}`;\n });\n\n // Final URL for API call\n fetchUrl = `${this.serverUrl.replace(/\\/$/, '')}${fetchUrl}`;\n if (fetchUrl.startsWith('http') === false) {\n const url = new URL(fetchUrl, window.location.href);\n curlUrl = url.href;\n } else {\n curlUrl = fetchUrl;\n }\n curl = `curl -X ${this.method.toUpperCase()} \"${curlUrl}\" \\\\\\n`;\n const reqHeaders = new Headers();\n if (acceptHeader) {\n // Uses the acceptHeader from Response panel\n reqHeaders.append('Accept', acceptHeader);\n curlHeaders += ` -H \"Accept: ${acceptHeader}\" \\\\\\n`;\n } else if (this.accept) {\n reqHeaders.append('Accept', this.accept);\n curlHeaders += ` -H \"Accept: ${this.accept}\" \\\\\\n`;\n }\n\n // Add Authentication Header if provided\n this.api_keys\n .filter((v) => (v.in === 'header'))\n .forEach((v) => {\n reqHeaders.append(v.name, v.finalKeyValue);\n curlHeaders += ` -H \"${v.name}: ${v.finalKeyValue}\" \\\\\\n`;\n });\n\n // Add Header Params\n headerParamEls.map((el) => {\n if (el.value) {\n reqHeaders.append(el.dataset.pname, el.value);\n curlHeaders += ` -H \"${el.dataset.pname}: ${el.value}\" \\\\\\n`;\n }\n });\n\n // Request Body Params\n if (requestBodyContainerEl) {\n const requestBodyType = requestBodyContainerEl.dataset.selectedRequestBodyType;\n if (requestBodyType.includes('form-urlencoded')) {\n // url-encoded Form Params (dynamic) - Parse JSON and generate Params\n const formUrlDynamicTextAreaEl = requestPanelEl.querySelector(\"[data-ptype='dynamic-form']\");\n if (formUrlDynamicTextAreaEl) {\n const val = formUrlDynamicTextAreaEl.value;\n const formUrlDynParams = new URLSearchParams();\n let proceed = true;\n let tmpObj;\n if (val) {\n try {\n tmpObj = JSON.parse(val);\n } catch (err) {\n proceed = false;\n console.warn('RapiDoc: Invalid JSON provided', err); // eslint-disable-line no-console\n }\n } else {\n proceed = false;\n }\n if (proceed) {\n for (const prop in tmpObj) {\n formUrlDynParams.append(prop, JSON.stringify(tmpObj[prop]));\n }\n fetchOptions.body = formUrlDynParams;\n curlData = ` -d ${formUrlDynParams.toString()} \\\\\\n`;\n }\n } else {\n // url-encoded Form Params (regular)\n const formUrlEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='form-urlencode']\")];\n const formUrlParams = new URLSearchParams();\n formUrlEls\n .filter((v) => (v.type !== 'file'))\n .forEach((el) => {\n if (el.dataset.array === 'false') {\n if (el.value) {\n formUrlParams.append(el.dataset.pname, el.value);\n }\n } else {\n const vals = (el.value && Array.isArray(el.value)) ? el.value.join(',') : '';\n formUrlParams.append(el.dataset.pname, vals);\n }\n });\n fetchOptions.body = formUrlParams;\n curlData = ` -d ${formUrlParams.toString()} \\\\\\n`;\n }\n } else if (requestBodyType.includes('form-data')) {\n const formDataParams = new FormData();\n const formDataEls = [...requestPanelEl.querySelectorAll(\"[data-ptype='form-data']\")];\n formDataEls.forEach((el) => {\n if (el.dataset.array === 'false') {\n if (el.type === 'file' && el.files[0]) {\n formDataParams.append(el.dataset.pname, el.files[0], el.files[0].name);\n curlForm += ` -F \"${el.dataset.pname}=@${el.files[0].name}\" \\\\\\n`;\n } else if (el.value) {\n formDataParams.append(el.dataset.pname, el.value);\n curlForm += ` -F \"${el.dataset.pname}=${el.value}\" \\\\\\n`;\n }\n } else if (el.value && Array.isArray(el.value)) {\n el.value.forEach((v) => {\n curlForm = `${curlForm} -F \"${el.dataset.pname}[]=${v}\" \\\\\\n`;\n });\n formDataParams.append(el.dataset.pname, el.value.join(','));\n }\n });\n fetchOptions.body = formDataParams;\n } else if (/^audio\\/|^image\\/|^video\\/|^font\\/|tar$|zip$|7z$|rtf$|msword$|excel$|\\/pdf$|\\/octet-stream$/.test(requestBodyType)) {\n const bodyParamFileEl = requestPanelEl.querySelector('.request-body-param-file');\n if (bodyParamFileEl?.files[0]) {\n fetchOptions.body = bodyParamFileEl.files[0]; // eslint-disable-line prefer-destructuring\n curlData = ` --data-binary @${bodyParamFileEl.files[0].name} \\\\\\n`;\n }\n } else if (requestBodyType.includes('json') || requestBodyType.includes('xml') || requestBodyType.includes('text')) {\n const exampleTextAreaEl = requestPanelEl.querySelector('.request-body-param-user-input');\n if (exampleTextAreaEl?.value) {\n fetchOptions.body = exampleTextAreaEl.value;\n if (requestBodyType.includes('json')) {\n try {\n curlData = ` -d '${JSON.stringify(JSON.parse(exampleTextAreaEl.value))}' \\\\\\n`;\n } catch (err) {\n // Ignore.\n }\n }\n if (!curlData) {\n curlData = ` -d '${exampleTextAreaEl.value.replace(/'/g, '\\'\"\\'\"\\'')}' \\\\\\n`;\n }\n }\n }\n // Common for all request-body\n if (!requestBodyType.includes('form-data')) {\n // For multipart/form-data dont set the content-type to allow creation of browser generated part boundaries\n reqHeaders.append('Content-Type', requestBodyType);\n }\n curlHeaders += ` -H \"Content-Type: ${requestBodyType}\" \\\\\\n`;\n }\n this.responseUrl = '';\n this.responseHeaders = [];\n this.curlSyntax = '';\n this.responseStatus = 'success';\n this.responseIsBlob = false;\n\n this.respContentDisposition = '';\n if (this.responseBlobUrl) {\n URL.revokeObjectURL(this.responseBlobUrl);\n this.responseBlobUrl = '';\n }\n this.curlSyntax = `${curl}${curlHeaders}${curlData}${curlForm}`;\n if (this.fetchCredentials) {\n fetchOptions.credentials = this.fetchCredentials;\n }\n const controller = new AbortController();\n const { signal } = controller;\n fetchOptions.headers = reqHeaders;\n const fetchRequest = new Request(fetchUrl, fetchOptions);\n this.dispatchEvent(new CustomEvent('before-try', {\n bubbles: true,\n composed: true,\n detail: {\n request: fetchRequest,\n controller,\n },\n }));\n\n let fetchResponse;\n let responseClone;\n try {\n let respBlob;\n let respJson;\n let respText;\n tryBtnEl.disabled = true;\n const startTime = performance.now();\n fetchResponse = await fetch(fetchRequest, { signal });\n const endTime = performance.now();\n responseClone = fetchResponse.clone(); // create a response clone to allow reading response body again (response.json, response.text etc)\n tryBtnEl.disabled = false;\n this.responseMessage = html`${fetchResponse.statusText ? `${fetchResponse.statusText}:${fetchResponse.status}` : fetchResponse.status}
Took ${Math.round(endTime - startTime)} milliseconds
`;\n this.responseUrl = fetchResponse.url;\n const respHeadersObj = {};\n fetchResponse.headers.forEach((hdrVal, hdr) => {\n respHeadersObj[hdr] = hdrVal;\n this.responseHeaders = `${this.responseHeaders}${hdr}: ${hdrVal}\\n`;\n });\n const contentType = fetchResponse.headers.get('content-type');\n const respEmpty = (await fetchResponse.clone().text()).length === 0;\n if (respEmpty) {\n this.responseText = '';\n } else if (contentType) {\n if (contentType.includes('json')) {\n if ((/charset=[^\"']+/).test(contentType)) {\n const encoding = contentType.split('charset=')[1];\n const buffer = await fetchResponse.arrayBuffer();\n try {\n respText = new TextDecoder(encoding).decode(buffer);\n } catch {\n respText = new TextDecoder('utf-8').decode(buffer);\n }\n try {\n respJson = JSON.parse(respText);\n this.responseText = JSON.stringify(respJson, null, 2);\n } catch {\n this.responseText = respText;\n }\n } else {\n respJson = await fetchResponse.json();\n this.responseText = JSON.stringify(respJson, null, 2);\n }\n // eslint-disable-next-line no-useless-escape\n } else if (/^font\\/|tar$|zip$|7z$|rtf$|msword$|excel$|\\/pdf$|\\/octet-stream$|^application\\/vnd\\./.test(contentType)) {\n this.responseIsBlob = true;\n this.responseBlobType = 'download';\n } else if (/^audio|^image|^video/.test(contentType)) {\n this.responseIsBlob = true;\n this.responseBlobType = 'view';\n } else {\n respText = await fetchResponse.text();\n if (contentType.includes('xml')) {\n this.responseText = prettyXml(respText);\n }\n this.responseText = respText;\n }\n if (this.responseIsBlob) {\n const contentDisposition = fetchResponse.headers.get('content-disposition');\n this.respContentDisposition = contentDisposition ? contentDisposition.split('filename=')[1].replace(/\"|'/g, '') : 'filename';\n respBlob = await fetchResponse.blob();\n this.responseBlobUrl = URL.createObjectURL(respBlob);\n }\n } else {\n respText = await fetchResponse.text();\n this.responseText = respText;\n }\n this.dispatchEvent(new CustomEvent('after-try', {\n bubbles: true,\n composed: true,\n detail: {\n request: fetchRequest,\n response: responseClone,\n responseHeaders: respHeadersObj,\n responseBody: respJson || respText || respBlob,\n responseStatus: responseClone.ok,\n },\n }));\n } catch (err) {\n tryBtnEl.disabled = false;\n if (err.name === 'AbortError') {\n this.dispatchEvent(new CustomEvent('request-aborted', {\n bubbles: true,\n composed: true,\n detail: {\n err,\n request: fetchRequest,\n },\n }));\n this.responseMessage = 'Request Aborted';\n } else {\n this.dispatchEvent(new CustomEvent('after-try', {\n bubbles: true,\n composed: true,\n detail: {\n err,\n request: fetchRequest,\n },\n }));\n this.responseMessage = `${err.message} (CORS or Network Issue)`;\n }\n }\n this.requestUpdate();\n }\n\n onAddRemoveFileInput(e, pname, ptype) {\n if (e.target.tagName.toLowerCase() !== 'button') {\n return;\n }\n\n if (e.target.classList.contains('file-input-remove-btn')) {\n // Remove File Input Set\n const el = e.target.closest('.input-set');\n el.remove();\n return;\n }\n const el = e.target.closest('.file-input-container');\n\n // Add File Input Set\n\n // Container\n const newInputContainerEl = document.createElement('div');\n newInputContainerEl.setAttribute('class', 'input-set row');\n\n // File Input\n const newInputEl = document.createElement('input');\n newInputEl.type = 'file';\n newInputEl.style = 'width:200px; margin-top:2px;';\n newInputEl.setAttribute('data-pname', pname);\n newInputEl.setAttribute('data-ptype', ptype.includes('form-urlencode') ? 'form-urlencode' : 'form-data');\n newInputEl.setAttribute('data-array', 'false');\n newInputEl.setAttribute('data-file-array', 'true');\n\n // Remover Button\n const newRemoveBtnEl = document.createElement('button');\n newRemoveBtnEl.setAttribute('class', 'file-input-remove-btn');\n newRemoveBtnEl.innerHTML = '✕';\n\n newInputContainerEl.appendChild(newInputEl);\n newInputContainerEl.appendChild(newRemoveBtnEl);\n el.insertBefore(newInputContainerEl, e.target);\n // el.appendChild(newInputContainerEl);\n }\n\n clearResponseData() {\n this.responseUrl = '';\n this.responseHeaders = '';\n this.responseText = '';\n this.responseStatus = 'success';\n this.responseMessage = '';\n this.responseIsBlob = false;\n this.responseBlobType = '';\n this.respContentDisposition = '';\n if (this.responseBlobUrl) {\n URL.revokeObjectURL(this.responseBlobUrl);\n this.responseBlobUrl = '';\n }\n }\n\n disconnectedCallback() {\n // Cleanup ObjectURL forthe blob data if this component created one\n if (this.responseBlobUrl) {\n URL.revokeObjectURL(this.responseBlobUrl);\n this.responseBlobUrl = '';\n }\n super.disconnectedCallback();\n }\n}\n\n// Register the element with the browser\ncustomElements.define('api-request', ApiRequest);\n","import { LitElement, html, css } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport FontStyles from '~/styles/font-styles';\nimport SchemaStyles from '~/styles/schema-styles';\nimport CustomStyles from '~/styles/custom-styles';\n\nexport default class SchemaTable extends LitElement {\n static get properties() {\n return {\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n schemaHideReadOnly: { type: String, attribute: 'schema-hide-read-only' },\n schemaHideWriteOnly: { type: String, attribute: 'schema-hide-write-only' },\n data: { type: Object },\n };\n }\n\n connectedCallback() {\n super.connectedCallback();\n if (!this.schemaExpandLevel || this.schemaExpandLevel < 1) { this.schemaExpandLevel = 99999; }\n if (!this.schemaDescriptionExpanded || !'true false'.includes(this.schemaDescriptionExpanded)) { this.schemaDescriptionExpanded = 'false'; }\n if (!this.schemaHideReadOnly || !'true false'.includes(this.schemaHideReadOnly)) { this.schemaHideReadOnly = 'true'; }\n if (!this.schemaHideWriteOnly || !'true false'.includes(this.schemaHideWriteOnly)) { this.schemaHideWriteOnly = 'true'; }\n }\n\n static get styles() {\n return [\n FontStyles,\n SchemaStyles,\n css`\n .table {\n font-size: var(--font-size-small);\n text-align: left;\n line-height: calc(var(--font-size-small) + 6px);\n }\n .table .tr {\n width: calc(100% - 5px);\n padding: 0 0 0 5px;\n border-bottom: 1px dotted var(--light-border-color);\n }\n .table .td {\n padding: 4px 0;\n }\n .table .key {\n width: 240px;\n }\n .key.deprecated .key-label {\n color: var(--red);\n }\n\n .table .key-type {\n white-space: normal;\n width: 150px;\n }\n .collapsed-descr .tr {\n max-height: calc(var(--font-size-small) + var(--font-size-small) + 4px);\n }\n\n .obj-toggle {\n padding: 0 2px;\n border-radius:2px;\n border: 1px solid transparent;\n display: inline-block;\n margin-left: -16px;\n color:var(--primary-color);\n cursor:pointer;\n font-size: calc(var(--font-size-small) + 4px);\n font-family: var(--font-mono);\n background-clip: border-box;\n }\n .obj-toggle:hover {\n border-color: var(--primary-color);\n }\n .tr.expanded + .object-body {\n display:block;\n }\n .tr.collapsed + .object-body {\n display:none;\n }`,\n CustomStyles,\n ];\n }\n\n /* eslint-disable indent */\n render() {\n return html`\n
\n
\n
${this.data?.['::type'] || ''}
\n ${this.allowSchemaDescriptionExpandToggle === 'true'\n ? html`\n
\n
\n ${this.schemaDescriptionExpanded === 'true' ? 'Single line description' : 'Multiline description'}\n
\n `\n : ''\n }\n
\n ${this.data?.['::description']\n ? html` ${unsafeHTML(marked(this.data['::description'] || ''))}`\n : ''\n }\n
\n
\n
Field
\n
Type
\n
Description
\n
\n ${this.data\n ? html`\n ${this.generateTree(\n this.data['::type'] === 'array' ? this.data['::props'] : this.data,\n this.data['::type'],\n this.data['::array-type'],\n )}`\n : ''\n } \n
\n
\n `;\n }\n\n generateTree(data, dataType = 'object', arrayType = '', key = '', description = '', schemaLevel = 0, indentLevel = 0, readOrWrite = '') {\n if (this.schemaHideReadOnly === 'true') {\n if (dataType === 'array') {\n if (readOrWrite === 'readonly') {\n return;\n }\n }\n if (data && data['::readwrite'] === 'readonly') {\n return;\n }\n }\n if (this.schemaHideWriteOnly === 'true') {\n if (dataType === 'array') {\n if (readOrWrite === 'writeonly') {\n return;\n }\n }\n if (data && data['::readwrite'] === 'writeonly') {\n return;\n }\n }\n if (!data) {\n return html`
\n   \n ${key.replace('::OPTION~', '')}\n ${\n dataType === 'array'\n ? html` [ ] `\n : dataType === 'object'\n ? html` { } `\n : html` schema undefined `\n }\n
`;\n }\n\n const newSchemaLevel = data['::type']?.startsWith('xxx-of') ? schemaLevel : (schemaLevel + 1);\n const newIndentLevel = dataType === 'xxx-of-option' || data['::type'] === 'xxx-of-option' || key.startsWith('::OPTION') ? indentLevel : (indentLevel + 1);\n const leftPadding = 16 * newIndentLevel; // 2 space indentation at each level\n if (Object.keys(data).length === 0) {\n return html`${key}`;\n }\n let keyLabel = '';\n let keyDescr = '';\n let isOneOfLabel = false;\n if (key.startsWith('::ONE~OF') || key.startsWith('::ANY~OF')) {\n keyLabel = key.replace('::', '').replace('~', ' ');\n isOneOfLabel = true;\n } else if (key.startsWith('::OPTION')) {\n const parts = key.split('~');\n keyLabel = parts[1]; // eslint-disable-line prefer-destructuring\n keyDescr = parts[2]; // eslint-disable-line prefer-destructuring\n } else {\n keyLabel = key;\n }\n\n let detailObjType = '';\n if (data['::type'] === 'object') {\n if (dataType === 'array') {\n detailObjType = 'array of object'; // Array of Object\n } else {\n detailObjType = 'object';\n }\n } else if (data['::type'] === 'array') {\n if (dataType === 'array') {\n // detailObjType = 'array of array'; // Array of array\n detailObjType = `array of array ${arrayType !== 'object' ? `of ${arrayType}` : ''}`; // Array of array\n } else {\n detailObjType = 'array';\n }\n }\n\n if (typeof data === 'object') {\n return html`\n ${newSchemaLevel >= 0 && key\n ? html`\n
\n
\n ${(keyLabel || keyDescr)\n ? html`\n this.toggleObjectExpand(e, keyLabel)} \n >\n ${schemaLevel < this.schemaExpandLevel ? '-' : '+'}\n `\n : ''\n }\n ${data['::type'] === 'xxx-of-option' || data['::type'] === 'xxx-of-array' || key.startsWith('::OPTION')\n ? html`${keyLabel}${keyDescr}`\n : keyLabel.endsWith('*')\n ? html`${data['::deprecated'] ? '✗' : ''} ${keyLabel.substring(0, keyLabel.length - 1)}*`\n : html`${data['::deprecated'] ? '✗' : ''} ${keyLabel === '::props' ? '' : keyLabel}`\n }\n ${data['::type'] === 'xxx-of' && dataType === 'array' ? html`ARRAY` : ''} \n
\n
\n ${(data['::type'] || '').includes('xxx-of') ? '' : detailObjType}\n ${data['::readwrite'] === 'readonly' ? ' 🆁' : data['::readwrite'] === 'writeonly' ? ' 🆆' : ''}\n
\n
${unsafeHTML(marked(description || ''))}
\n
`\n : html`\n ${data['::type'] === 'array' && dataType === 'array'\n ? html`\n
\n
\n
\n ${arrayType && arrayType !== 'object' ? `${dataType} of ${arrayType}` : dataType}\n
\n
\n
`\n : ''\n }\n `\n }\n
\n ${Array.isArray(data) && data[0]\n ? html`${this.generateTree(data[0], 'xxx-of-option', '', '::ARRAY~OF', '', newSchemaLevel, newIndentLevel, '')}`\n : html`\n ${Object.keys(data).map((dataKey) => html`\n ${['::title', '::description', '::type', '::props', '::deprecated', '::array-type', '::readwrite'].includes(dataKey)\n ? data[dataKey]['::type'] === 'array' || data[dataKey]['::type'] === 'object'\n ? html`${this.generateTree(\n data[dataKey]['::type'] === 'array' ? data[dataKey]['::props'] : data[dataKey],\n data[dataKey]['::type'],\n data[dataKey]['::array-type'] || '',\n dataKey,\n data[dataKey]['::description'],\n newSchemaLevel,\n newIndentLevel,\n data[dataKey]['::readwrite'] ? data[dataKey]['::readwrite'] : '',\n )}`\n : ''\n : html`${this.generateTree(\n data[dataKey]['::type'] === 'array' ? data[dataKey]['::props'] : data[dataKey],\n data[dataKey]['::type'],\n data[dataKey]['::array-type'] || '',\n dataKey,\n data[dataKey]['::description'],\n newSchemaLevel,\n newIndentLevel,\n data[dataKey]['::readwrite'] ? data[dataKey]['::readwrite'] : '',\n )}`\n }\n `)}\n `\n }\n
\n `;\n }\n\n // For Primitive Data types\n const [type, readOrWriteOnly, constraint, defaultValue, allowedValues, pattern, schemaDescription, schemaTitle, deprecated] = data.split('~|~');\n if (readOrWriteOnly === '🆁' && this.schemaHideReadOnly === 'true') {\n return;\n }\n if (readOrWriteOnly === '🆆' && this.schemaHideWriteOnly === 'true') {\n return;\n }\n const dataTypeCss = type.replace(/┃.*/g, '').replace(/[^a-zA-Z0-9+]/g, '').substring(0, 4).toLowerCase();\n let dataTypeHtml = '';\n if (dataType === 'array') {\n dataTypeHtml = html` \n
\n [${type}] ${readOrWrite === 'readonly' ? '🆁' : readOrWrite === 'writeonly' ? '🆆' : ''}\n
`;\n } else {\n dataTypeHtml = html` \n
\n ${type} ${readOrWriteOnly}\n
`;\n }\n return html`\n
\n
\n ${deprecated ? html`` : ''}\n ${keyLabel?.endsWith('*')\n ? html`\n ${keyLabel.substring(0, keyLabel.length - 1)}\n *`\n : key.startsWith('::OPTION')\n ? html`${keyLabel}${keyDescr}`\n : html`${keyLabel ? html` ${keyLabel}` : html`${schemaTitle}`}`\n }\n
\n ${dataTypeHtml}\n
{ this.schemaDescriptionExpanded = 'true'; }}\">\n ${dataType === 'array' ? html`${unsafeHTML(marked(description))}` : ''}\n ${schemaDescription\n ? html`\n ${unsafeHTML(marked(`${schemaTitle ? `**${schemaTitle}:**` : ''} ${schemaDescription} ${constraint || defaultValue || allowedValues || pattern ? '' : ''}`))}\n `\n : schemaTitle\n ? html`${schemaTitle} ${constraint || defaultValue || allowedValues || pattern\n ? html``\n : ''}`\n : ''\n }\n ${constraint ? html`
Constraints: ${constraint}
` : ''}\n ${defaultValue ? html`
Default: ${defaultValue}
` : ''}\n ${allowedValues ? html`
Allowed: ${allowedValues}
` : ''}\n ${pattern ? html`
Pattern: ${pattern}
` : ''}\n
\n
\n `;\n }\n /* eslint-enable indent */\n\n toggleObjectExpand(e) {\n const rowEl = e.target.closest('.tr');\n if (rowEl.classList.contains('expanded')) {\n rowEl.classList.add('collapsed');\n rowEl.classList.remove('expanded');\n e.target.innerText = '+';\n } else {\n rowEl.classList.remove('collapsed');\n rowEl.classList.add('expanded');\n e.target.innerText = '-';\n }\n }\n}\ncustomElements.define('schema-table', SchemaTable);\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { rapidocApiKey } from '~/utils/common-utils';\nimport { pathSecurityTemplate } from '~/templates/security-scheme-template';\nimport codeSamplesTemplate from '~/templates/code-samples-template';\nimport callbackTemplate from '~/templates/callback-template';\nimport '~/components/api-request';\nimport '~/components/api-response';\n\n/* eslint-disable indent */\nfunction headingRenderer(tagElementId) {\n const renderer = new marked.Renderer();\n renderer.heading = ((text, level, raw, slugger) => `${text}`);\n return renderer;\n}\n\nexport function expandedEndpointBodyTemplate(path, tagName = '') {\n const acceptContentTypes = new Set();\n for (const respStatus in path.responses) {\n for (const acceptContentType in (path.responses[respStatus]?.content)) {\n acceptContentTypes.add(acceptContentType.trim());\n }\n }\n const accept = [...acceptContentTypes].join(', ');\n\n // Filter API Keys that are non-empty and are applicable to the the path\n const nonEmptyApiKeys = this.resolvedSpec.securitySchemes.filter((v) => (v.finalKeyValue && path.security?.some((ps) => (v.securitySchemeId in ps)))) || [];\n\n // If a RapiDoc API Key is specified on the element and its value is not hyphen(-) then include it for all paths\n const rapiDocApiKey = this.resolvedSpec.securitySchemes.find((v) => (v.securitySchemeId === rapidocApiKey && v.value !== '-'));\n if (rapiDocApiKey) {\n nonEmptyApiKeys.push(rapiDocApiKey);\n }\n\n const codeSampleTabPanel = path.xCodeSamples ? codeSamplesTemplate.call(this, path.xCodeSamples) : '';\n return html`\n ${this.renderStyle === 'read' ? html`
` : ''}\n
\n ${(this.renderStyle === 'focused' && tagName !== 'General ⦂') ? html`

${tagName}

` : ''}\n ${path.deprecated ? html`
DEPRECATED
` : ''}\n ${html`\n ${path.xBadges && path.xBadges?.length > 0\n ? html`\n
\n ${path.xBadges.map((v) => (\n html`${v.label}`\n ))\n }\n
\n `\n : ''\n }\n

${path.shortSummary || `${path.method.toUpperCase()} ${path.path}`}

\n ${path.isWebhook\n ? html` WEBHOOK `\n : html`\n
\n ${path.method} \n ${path.path}\n
\n `\n }\n `\n }\n ${path.description ? html`
${unsafeHTML(marked(path.description))}
` : ''}\n ${pathSecurityTemplate.call(this, path.security)}\n ${codeSampleTabPanel}\n
\n \n\n ${path.callbacks ? callbackTemplate.call(this, path.callbacks) : ''}\n\n \n
\n
\n `;\n}\n\nexport default function expandedEndpointTemplate() {\n if (!this.resolvedSpec) { return ''; }\n return html`\n ${this.resolvedSpec.tags.map((tag) => html`\n
\n
${tag.name}
\n \n
\n ${\n unsafeHTML(`\n
\n ${marked(tag.description || '', this.infoDescriptionHeadingsInNavBar === 'true' ? { renderer: headingRenderer(tag.elementId) } : undefined)}\n
`)\n }\n
\n
\n
\n ${tag.paths.map((path) => expandedEndpointBodyTemplate.call(this, path, 'BBB'))}\n
\n `)\n }\n`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { schemaInObjectNotation } from '~/utils/schema-utils';\nimport '~/components/json-tree';\nimport '~/components/schema-tree';\nimport '~/components/schema-table';\n\nfunction schemaBodyTemplate(sComponent) {\n return html`\n
\n
\n
${sComponent.name} Schema
\n ${this.schemaStyle === 'table'\n ? html`\n `\n : html`\n `\n}\n
`;\n}\n\nfunction componentBodyTemplate(sComponent, componentType) {\n if (sComponent.id.indexOf('schemas-') !== -1) {\n return schemaBodyTemplate.call(this, sComponent);\n }\n return html`\n
\n
\n ${html`\n
${sComponent.name} ${componentType}
\n ${sComponent.component\n ? html`\n
\n \n
`\n : ''}\n `}\n
\n `;\n}\n\nexport default function componentsTemplate() {\n if (!this.resolvedSpec) { return ''; }\n return html`\n ${this.resolvedSpec.components.map((component) => html`\n
\n
${component.name}
\n
\n ${unsafeHTML(`
${marked(component.description ? component.description : '')}
`)}\n
\n
\n
\n ${component.subComponents.filter((c) => c.expanded !== false).map((sComponent) => componentBodyTemplate.call(this, sComponent, component.name))}\n
\n `)\n}\n`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { downloadResource, viewResource } from '~/utils/common-utils';\n\n/* eslint-disable indent */\nfunction headingRenderer() {\n const renderer = new marked.Renderer();\n renderer.heading = ((text, level, raw, slugger) => `${text}`);\n return renderer;\n}\n\nexport default function overviewTemplate() {\n return html`\n
\n ${this.resolvedSpec?.info\n ? html`\n
\n ${this.resolvedSpec.info.title}\n ${!this.resolvedSpec.info.version ? '' : html`\n \n ${this.resolvedSpec.info.version}\n `\n }\n
\n
\n ${this.resolvedSpec.info.contact?.email\n ? html`${this.resolvedSpec.info.contact.name || 'Email'}: \n ${this.resolvedSpec.info.contact.email}\n `\n : ''\n }\n ${this.resolvedSpec.info.contact?.url\n ? html`URL: ${this.resolvedSpec.info.contact.url}`\n : ''\n }\n ${this.resolvedSpec.info.license\n ? html`License: \n ${this.resolvedSpec.info.license.url\n ? html`${this.resolvedSpec.info.license.name}`\n : this.resolvedSpec.info.license.name\n } `\n : ''\n }\n ${this.resolvedSpec.info.termsOfService\n ? html`Terms of Service`\n : ''\n }\n ${this.specUrl && this.allowSpecFileDownload === 'true'\n ? html`\n
\n \n ${this.specUrl?.trim().toLowerCase().endsWith('json')\n ? html``\n : ''\n }\n
`\n : ''\n }\n
\n \n
\n ${this.resolvedSpec.info.description\n ? html`${\n unsafeHTML(`\n
\n ${marked(this.resolvedSpec.info.description, this.infoDescriptionHeadingsInNavBar === 'true' ? { renderer: headingRenderer() } : undefined)}\n
`)}`\n : ''\n }\n
\n `\n : ''\n }\n
\n `;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\n\nexport function setApiServer(serverUrl) {\n const serverObj = this.resolvedSpec?.servers.find((s) => s.url === serverUrl);\n if (!serverObj) {\n return false;\n }\n this.selectedServer = serverObj;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent('api-server-change', {\n bubbles: true,\n composed: true,\n detail: {\n selectedServer: serverObj,\n },\n }));\n return true;\n}\n\nfunction onApiServerVarChange(e, serverObj) {\n const inputEls = [...e.currentTarget.closest('table').querySelectorAll('input, select')];\n let tempUrl = serverObj.url;\n inputEls.forEach((v) => {\n const regex = new RegExp(`{${v.dataset.var}}`, 'g');\n tempUrl = tempUrl.replace(regex, v.value);\n });\n serverObj.computedUrl = tempUrl;\n this.requestUpdate();\n}\n\n/* eslint-disable indent */\nfunction serverVarsTemplate() {\n // const selectedServerObj = this.resolvedSpec.servers.find((v) => (v.url === this.selectedServer));\n return this.selectedServer && this.selectedServer.variables\n ? html`\n
SERVER VARIABLES
\n \n ${Object.entries(this.selectedServer.variables).map((kv) => html`\n \n \n \n \n ${kv[1].description\n ? html``\n : ''\n }\n `)}\n
${kv[0]}\n ${kv[1].enum\n ? html`\n { onApiServerVarChange.call(this, e, this.selectedServer); }}\n >\n ${Object.entries(kv[1].enum).map((e) => (kv[1].default === e[1]\n ? html`\n `\n : html`\n `\n ))}\n `\n : html`\n { onApiServerVarChange.call(this, e, this.selectedServer); }}\n />`}\n
${unsafeHTML(marked(kv[1].description))}
\n `\n : '';\n}\n\nexport default function serverTemplate() {\n if (!this.resolvedSpec || this.resolvedSpec.specLoadError) { return ''; }\n return html`\n
\n
API SERVER
\n
\n ${!this.resolvedSpec.servers || this.resolvedSpec.servers?.length === 0\n ? ''\n : html`\n ${this.resolvedSpec?.servers.map((server, i) => html`\n { setApiServer.call(this, server.url); }}\n .checked = '${this.selectedServer.url === server.url}'\n style = 'margin:4px 0; cursor:pointer'\n />\n \n
\n `)}\n `}\n
SELECTED: ${this.selectedServer?.computedUrl || 'none'}
\n
\n \n ${serverVarsTemplate.call(this)}\n
`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { marked } from 'marked';\nimport { pathIsInSearch } from '~/utils/common-utils';\n\nexport function expandCollapseNavBarTag(navLinkEl, action = 'toggle') {\n const tagAndPathEl = navLinkEl?.closest('.nav-bar-tag-and-paths');\n if (tagAndPathEl) {\n const isExpanded = tagAndPathEl.classList.contains('expanded');\n if (isExpanded && (action === 'toggle' || action === 'collapse')) {\n tagAndPathEl.classList.replace('expanded', 'collapsed');\n } else if (!isExpanded && (action === 'toggle' || action === 'expand')) {\n tagAndPathEl.classList.replace('collapsed', 'expanded');\n }\n }\n}\n\nexport function expandCollapseAll(navEl, action = 'expand-all') {\n const elList = [...navEl.querySelectorAll('.nav-bar-tag-and-paths')];\n if (action === 'expand-all') {\n elList.map((el) => {\n el.classList.replace('collapsed', 'expanded');\n });\n } else {\n elList.map((el) => {\n el.classList.replace('expanded', 'collapsed');\n });\n }\n}\n\nfunction onExpandCollapse(e) {\n expandCollapseNavBarTag(e.target, 'toggle');\n}\n\nfunction onExpandCollapseAll(e, action = 'expand-all') {\n expandCollapseAll(e.target.closest('.nav-scroll'), action);\n}\n\n/* eslint-disable indent */\nexport default function navbarTemplate() {\n if (!this.resolvedSpec || this.resolvedSpec.specLoadError) {\n return html`\n \n `;\n }\n return html`\n \n`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { expandedEndpointBodyTemplate } from '~/templates/expanded-endpoint-template';\nimport '~/components/api-request';\nimport '~/components/api-response';\nimport componentsTemplate from '~/templates/components-template';\nimport overviewTemplate from '~/templates/overview-template';\nimport serverTemplate from '~/templates/server-template';\nimport securitySchemeTemplate from '~/templates/security-scheme-template';\nimport { expandCollapseNavBarTag } from '~/templates/navbar-template';\n\nfunction headingRenderer(tagElementId) {\n const renderer = new marked.Renderer();\n renderer.heading = ((text, level, raw, slugger) => `${text}`);\n return renderer;\n}\n\nfunction wrapFocusedTemplate(templateToWrap) {\n return html`\n
\n ${templateToWrap}\n
`;\n}\n\nfunction defaultContentTemplate() {\n // In focused mode default content is overview or first path\n if (this.showInfo === 'true') {\n return wrapFocusedTemplate(overviewTemplate.call(this));\n }\n const selectedTagObj = this.resolvedSpec.tags[0];\n const selectedPathObj = this.resolvedSpec.tags[0]?.paths[0];\n return (selectedTagObj && selectedPathObj)\n ? wrapFocusedTemplate(expandedEndpointBodyTemplate.call(this, selectedPathObj, selectedTagObj.name))\n : wrapFocusedTemplate('');\n}\n\n/* eslint-disable indent */\nfunction focusedTagBodyTemplate(tag) {\n return html`\n

${tag.name}

\n ${this.onNavTagClick === 'show-description' && tag.description\n ? html`\n
\n ${\n unsafeHTML(`\n
\n ${marked(tag.description || '', this.infoDescriptionHeadingsInNavBar === 'true' ? { renderer: headingRenderer(tag.elementId) } : undefined)}\n
`)\n }\n
`\n : ''\n }\n `;\n}\n\nexport default function focusedEndpointTemplate() {\n if (!this.focusedElementId || !this.resolvedSpec) {\n return;\n }\n const focusElId = this.focusedElementId;\n let selectedPathObj = null;\n let selectedTagObj = null;\n let focusedTemplate;\n let i = 0;\n if (focusElId.startsWith('overview') && this.showInfo === 'true') {\n focusedTemplate = overviewTemplate.call(this);\n } else if (focusElId === 'auth' && this.allowAuthentication === 'true') {\n focusedTemplate = securitySchemeTemplate.call(this);\n } else if (focusElId === 'servers' && this.allowServerSelection === 'true') {\n focusedTemplate = serverTemplate.call(this);\n } else if (focusElId === 'operations-top') {\n focusedTemplate = html`\n
\n \n
`;\n } else if (focusElId.startsWith('cmp--') && this.showComponents === 'true') {\n focusedTemplate = componentsTemplate.call(this);\n } else if (focusElId.startsWith('tag--')) {\n const idToFocus = focusElId.indexOf('--', 4) > 0 ? focusElId.substring(0, focusElId.indexOf('--', 5)) : focusElId;\n selectedTagObj = this.resolvedSpec.tags.find((v) => v.elementId === idToFocus);\n if (selectedTagObj) {\n focusedTemplate = wrapFocusedTemplate.call(this, focusedTagBodyTemplate.call(this, selectedTagObj));\n } else {\n focusedTemplate = defaultContentTemplate.call(this);\n }\n } else {\n for (i = 0; i < this.resolvedSpec.tags.length; i += 1) {\n selectedTagObj = this.resolvedSpec.tags[i];\n selectedPathObj = this.resolvedSpec.tags[i].paths.find((v) => `${v.elementId}` === focusElId);\n if (selectedPathObj) {\n break;\n }\n }\n if (selectedPathObj) {\n // In focused mode we must expand the nav-bar tag element if it is collapsed\n const newNavEl = this.shadowRoot.getElementById(`link-${focusElId}`);\n expandCollapseNavBarTag(newNavEl, 'expand');\n focusedTemplate = wrapFocusedTemplate.call(this, expandedEndpointBodyTemplate.call(this, selectedPathObj, selectedTagObj.name));\n } else {\n // if focusedElementId is not found then show the default content (overview or first-path)\n focusedTemplate = defaultContentTemplate.call(this);\n }\n }\n return focusedTemplate;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport '~/components/api-request';\nimport '~/components/api-response';\nimport codeSamplesTemplate from '~/templates/code-samples-template';\nimport callbackTemplate from '~/templates/callback-template';\nimport { pathSecurityTemplate } from '~/templates/security-scheme-template';\nimport { pathIsInSearch, rapidocApiKey } from '~/utils/common-utils';\n\nfunction toggleExpand(path) {\n if (path.expanded) {\n path.expanded = false; // collapse\n if (this.updateRoute === 'true') {\n window.history.replaceState(null, null, `${window.location.href.split('#')[0]}${this.routePrefix === '#' ? '' : `${this.routePrefix}`}`);\n }\n } else {\n path.expanded = true; // Expand\n if (this.updateRoute === 'true') {\n const newHash = `${this.routePrefix || '#'}${path.elementId}`;\n if (window.location.hash !== newHash) {\n window.history.replaceState(null, null, `${window.location.href.split('#')[0]}${newHash}`);\n }\n }\n }\n this.requestUpdate();\n}\n\nexport function expandCollapseAll(operationsRootEl, action = 'expand-all') {\n const elList = [...operationsRootEl.querySelectorAll('.section-tag')];\n if (action === 'expand-all') {\n elList.map((el) => {\n el.classList.replace('collapsed', 'expanded');\n });\n } else {\n elList.map((el) => {\n el.classList.replace('expanded', 'collapsed');\n });\n }\n}\n\nfunction onExpandCollapseAll(e, action = 'expand-all') {\n expandCollapseAll.call(this, e.target.closest('.operations-root'), action);\n}\n\n/* eslint-disable indent */\nfunction endpointHeadTemplate(path, pathsExpanded = false) {\n return html`\n { toggleExpand.call(this, path, e); }}\" part=\"section-endpoint-head-${path.expanded ? 'expanded' : 'collapsed'}\" class='endpoint-head ${path.method} ${path.deprecated ? 'deprecated' : ''} ${pathsExpanded || path.expanded ? 'expanded' : 'collapsed'}'>\n
${path.method}
\n
\n ${path.path} \n ${path.isWebhook ? html` Webhook` : ''}\n
\n ${path.deprecated\n ? html`\n \n deprecated \n `\n : ''\n }\n ${this.showSummaryWhenCollapsed\n ? html`\n
\n
${path.summary || path.shortSummary}
`\n : ''\n }\n
\n `;\n}\n\nfunction endpointBodyTemplate(path) {\n const acceptContentTypes = new Set();\n for (const respStatus in path.responses) {\n for (const acceptContentType in (path.responses[respStatus]?.content)) {\n acceptContentTypes.add(acceptContentType.trim());\n }\n }\n const accept = [...acceptContentTypes].join(', ');\n // Filter API Keys that are non-empty and are applicable to the the path\n const nonEmptyApiKeys = this.resolvedSpec.securitySchemes.filter((v) => (v.finalKeyValue && path.security?.some((ps) => (v.securitySchemeId in ps)))) || [];\n\n // If a RapiDoc API Key is specified on the element and its value is not hyphen(-) then include it for all paths\n const rapiDocApiKey = this.resolvedSpec.securitySchemes.find((v) => (v.securitySchemeId === rapidocApiKey && v.value !== '-'));\n if (rapiDocApiKey) {\n nonEmptyApiKeys.push(rapiDocApiKey);\n }\n\n const codeSampleTabPanel = path.xCodeSamples ? codeSamplesTemplate(path.xCodeSamples) : '';\n return html`\n
\n
\n ${path.summary\n ? html`
${path.summary}
`\n : path.shortSummary !== path.description\n ? html`
${path.shortSummary}
`\n : ''\n }\n ${path.xBadges && path.xBadges?.length > 0\n ? html`\n
\n ${path.xBadges.map((v) => (\n html`${v.label}`\n ))\n }\n
\n `\n : ''\n }\n\n ${path.description ? html`
${unsafeHTML(marked(path.description))}
` : ''}\n \n ${pathSecurityTemplate.call(this, path.security)}\n ${codeSampleTabPanel}\n
\n
\n
\n 0 ? path.servers[0].url : this.selectedServer.computedUrl}\" \n active-schema-tab = \"${this.defaultSchemaTab}\"\n fill-request-fields-with-example = \"${this.fillRequestFieldsWithExample}\"\n use-summary-to-list-example = \"${this.useSummaryToListExamples}\"\n allow-try = \"${this.allowTry}\"\n accept = \"${accept}\"\n render-style=\"${this.renderStyle}\" \n schema-style = \"${this.schemaStyle}\" \n schema-expand-level = \"${this.schemaExpandLevel}\"\n schema-description-expanded = \"${this.schemaDescriptionExpanded}\"\n allow-schema-description-expand-toggle = \"${this.allowSchemaDescriptionExpandToggle}\"\n schema-hide-read-only = \"${path.isWebhook ? this.schemaHideWriteOnly : this.schemaHideReadOnly}\"\n schema-hide-write-only = \"${path.isWebhook ? this.schemaHideReadOnly : this.schemaHideWriteOnly}\"\n fetch-credentials = \"${this.fetchCredentials}\"\n exportparts = \"btn:btn, btn-fill:btn-fill, btn-outline:btn-outline, btn-try:btn-try, btn-clear:btn-clear, btn-clear-resp:btn-clear-resp,\n file-input:file-input, textbox:textbox, textbox-param:textbox-param, textarea:textarea, textarea-param:textarea-param, \n anchor:anchor, anchor-param-example:anchor-param-example, schema-description:schema-description, schema-multiline-toggle:schema-multiline-toggle\"\n > \n\n ${path.callbacks ? callbackTemplate.call(this, path.callbacks) : ''}\n
\n\n \n
\n
`;\n}\n\nexport default function endpointTemplate(showExpandCollapse = true, showTags = true, pathsExpanded = false) {\n if (!this.resolvedSpec) { return ''; }\n return html`\n ${showExpandCollapse\n ? html`\n
\n onExpandCollapseAll(e, 'expand-all')}\" style=\"color:var(--primary-color); cursor:pointer;\">\n Expand all\n \n  |  \n onExpandCollapseAll(e, 'collapse-all')}\" style=\"color:var(--primary-color); cursor:pointer;\" >\n Collapse all\n \n   sections\n
`\n : ''\n }\n ${this.resolvedSpec.tags.map((tag) => html`\n ${showTags\n ? html` \n `\n : html`\n \n `\n }\n `)\n }`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\n\n/* eslint-disable indent */\nexport default function logoTemplate(style) {\nreturn html`\n
\n \n \n \n \n \n \n \n \n
\n`;\n}\n/* eslint-enable indent */\n","import { html } from 'lit';\nimport logoTemplate from '~/templates/logo-template';\n\n/* eslint-disable indent */\nexport default function headerTemplate() {\n return html`\n
\n
\n \n ${logoTemplate('height:36px;width:36px;margin-left:5px')}\n \n \n
${this.headingText}
\n
\n
\n ${(this.allowSpecUrlLoad === 'false')\n ? ''\n : html`\n \n
\n `\n } \n ${(this.allowSpecFileLoad === 'false')\n ? ''\n : html`\n \n \n `\n }\n \n ${(this.allowSearch === 'false' || 'read focused'.includes(this.renderStyle))\n ? ''\n : html` \n \n
\n `\n }\n \n ${(this.allowAdvancedSearch === 'false' || 'read focused'.includes(this.renderStyle))\n ? ''\n : html`\n \n `\n }\n
\n
`;\n }\n/* eslint-enable indent */\n","import { LitElement, html, css } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\nimport { schemaInObjectNotation, generateExample } from '~/utils/schema-utils';\nimport FontStyles from '~/styles/font-styles';\nimport FlexStyles from '~/styles/flex-styles';\nimport TableStyles from '~/styles/table-styles';\nimport InputStyles from '~/styles/input-styles';\nimport TabStyles from '~/styles/tab-styles';\nimport BorderStyles from '~/styles/border-styles';\nimport CustomStyles from '~/styles/custom-styles';\nimport '~/components/schema-tree';\nimport '~/components/schema-table';\n\nexport default class ApiResponse extends LitElement {\n constructor() {\n super();\n this.selectedStatus = '';\n this.headersForEachRespStatus = {};\n this.mimeResponsesForEachStatus = {};\n this.activeSchemaTab = 'schema';\n }\n\n static get properties() {\n return {\n callback: { type: String },\n responses: { type: Object },\n parser: { type: Object },\n schemaStyle: { type: String, attribute: 'schema-style' },\n renderStyle: { type: String, attribute: 'render-style' },\n selectedStatus: { type: String, attribute: 'selected-status' },\n selectedMimeType: { type: String, attribute: 'selected-mime-type' },\n activeSchemaTab: { type: String, attribute: 'active-schema-tab' },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n schemaHideReadOnly: { type: String, attribute: 'schema-hide-read-only' },\n schemaHideWriteOnly: { type: String, attribute: 'schema-hide-write-only' },\n };\n }\n\n static get styles() {\n return [\n FontStyles,\n FlexStyles,\n TabStyles,\n TableStyles,\n InputStyles,\n BorderStyles,\n css`\n .resp-head{\n vertical-align: middle;\n padding:16px 0 8px;\n }\n .resp-head.divider{\n border-top: 1px solid var(--border-color);\n margin-top:10px;\n }\n .resp-status{ \n font-weight:bold;\n font-size:calc(var(--font-size-small) + 1px);\n }\n .resp-descr{\n font-size:calc(var(--font-size-small) + 1px);\n color:var(--light-fg);\n text-align:left;\n }\n .top-gap{margin-top:16px;}\n .example-panel{\n font-size:var(--font-size-small);\n margin:0;\n }\n .focused-mode,\n .read-mode {\n padding-top:24px;\n margin-top:12px;\n border-top: 1px dashed var(--border-color);\n }`,\n CustomStyles,\n ];\n }\n\n render() {\n return html`\n
\n
\n ${this.callback === 'true' ? 'CALLBACK RESPONSE' : 'RESPONSE'}\n
\n
\n ${this.responseTemplate()}\n
\n
\n `;\n }\n\n resetSelection() {\n this.selectedStatus = '';\n this.selectedMimeType = '';\n }\n\n /* eslint-disable indent */\n responseTemplate() {\n if (!this.responses) { return ''; }\n for (const statusCode in this.responses) {\n if (!this.selectedStatus) {\n this.selectedStatus = statusCode;\n }\n const allMimeResp = {};\n for (const mimeResp in this.responses[statusCode]?.content) {\n const mimeRespObj = this.responses[statusCode].content[mimeResp];\n if (!this.selectedMimeType) {\n this.selectedMimeType = mimeResp;\n }\n // Generate Schema\n const schemaTree = schemaInObjectNotation(mimeRespObj.schema, {});\n // Generate Example\n const respExamples = generateExample(\n mimeRespObj.schema,\n mimeResp,\n mimeRespObj.examples,\n mimeRespObj.example,\n !(this.schemaHideReadOnly && (this.schemaHideReadOnly.includes(this.method) || this.schemaHideReadOnly === 'true')),\n !(this.schemaHideWriteOnly && (this.schemaHideWriteOnly.includes(this.method) || this.schemaHideWriteOnly === 'true')),\n mimeResp.includes('json') ? 'json' : 'text',\n );\n allMimeResp[mimeResp] = {\n description: this.responses[statusCode].description,\n examples: respExamples,\n selectedExample: respExamples[0]?.exampleId || '',\n schemaTree,\n };\n }\n // Headers for each response status\n const tempHeaders = [];\n for (const key in this.responses[statusCode]?.headers) {\n tempHeaders.push({ name: key, ...this.responses[statusCode].headers[key] });\n }\n this.headersForEachRespStatus[statusCode] = tempHeaders;\n this.mimeResponsesForEachStatus[statusCode] = allMimeResp;\n }\n return html`\n ${Object.keys(this.responses).length > 1\n ? html`
\n ${Object.keys(this.responses).map((respStatus) => html`\n ${respStatus === '$$ref' // Swagger-Client parser creates '$$ref' object if JSON references are used to create responses - this should be ignored\n ? ''\n : html`\n `\n }`)\n }`\n : html`${Object.keys(this.responses)[0]}`\n }\n
\n\n ${Object.keys(this.responses).map((status) => html`\n
\n
\n ${unsafeHTML(marked(this.responses[status]?.description || ''))}\n ${(this.headersForEachRespStatus[status] && this.headersForEachRespStatus[status]?.length > 0)\n ? html`${this.responseHeaderListTemplate(this.headersForEachRespStatus[status])}`\n : ''\n }\n
\n ${Object.keys(this.mimeResponsesForEachStatus[status]).length === 0\n ? ''\n : html` \n
\n
{ if (e.target.tagName.toLowerCase() === 'button') { this.activeSchemaTab = e.target.dataset.tab; } }}\" >\n \n \n
\n ${Object.keys(this.mimeResponsesForEachStatus[status]).length === 1\n ? html` ${Object.keys(this.mimeResponsesForEachStatus[status])[0]} `\n : html`${this.mimeTypeDropdownTemplate(Object.keys(this.mimeResponsesForEachStatus[status]))}`\n }\n
\n ${this.activeSchemaTab === 'example'\n ? html`
\n ${this.mimeExampleTemplate(this.mimeResponsesForEachStatus[status][this.selectedMimeType])}\n
`\n : html`
\n ${this.mimeSchemaTemplate(this.mimeResponsesForEachStatus[status][this.selectedMimeType])}\n
`\n }\n
\n `\n }`)\n }\n `;\n }\n\n responseHeaderListTemplate(respHeaders) {\n return html`\n
RESPONSE HEADERS
\n \n ${respHeaders.map((v) => html`\n \n \n \n \n \n \n `)}\n
\n ${v.name || ''}\n \n ${v.schema.type || ''}\n \n
${unsafeHTML(marked(v.description || ''))}
\n
\n ${v.schema.example || ''}\n
`;\n }\n\n mimeTypeDropdownTemplate(mimeTypes) {\n return html`\n `;\n }\n\n onSelectExample(e) {\n const exampleContainerEl = e.target.closest('.example-panel');\n const exampleEls = [...exampleContainerEl.querySelectorAll('.example')];\n\n exampleEls.forEach((v) => {\n v.style.display = v.dataset.example === e.target.value ? 'block' : 'none';\n });\n }\n\n mimeExampleTemplate(mimeRespDetails) {\n if (!mimeRespDetails) {\n return html`\n
 No example provided 
\n `;\n }\n return html`\n ${mimeRespDetails.examples.length === 1\n ? html`\n ${mimeRespDetails.examples[0].exampleFormat === 'json'\n ? html`\n ${mimeRespDetails.examples[0].exampleSummary && mimeRespDetails.examples[0].exampleSummary.length > 80 ? html`
${mimeRespDetails.examples[0].exampleSummary}
` : ''}\n ${mimeRespDetails.examples[0].exampleDescription ? html`
${unsafeHTML(marked(mimeRespDetails.examples[0].exampleDescription || ''))}
` : ''}\n `\n : html`\n ${mimeRespDetails.examples[0].exampleSummary && mimeRespDetails.examples[0].exampleSummary.length > 80 ? html`
${mimeRespDetails.examples[0].exampleSummary}
` : ''}\n ${mimeRespDetails.examples[0].exampleDescription ? html`
${unsafeHTML(marked(mimeRespDetails.examples[0].exampleDescription || ''))}
` : ''}\n
${mimeRespDetails.examples[0].exampleValue}
\n `\n }`\n : html`\n \n \n ${mimeRespDetails.examples.map((v) => html`\n
\n ${v.exampleSummary && v.exampleSummary.length > 80 ? html`
${v.exampleSummary}
` : ''}\n ${v.exampleDescription ? html`
${unsafeHTML(marked(v.exampleDescription || ''))}
` : ''}\n ${v.exampleFormat === 'json'\n ? html`\n `\n : html`
${v.exampleValue}
`\n }\n
\n `)}\n
\n `\n }\n `;\n }\n\n mimeSchemaTemplate(mimeRespDetails) {\n if (!mimeRespDetails) {\n return html`\n
 Schema not found
\n `;\n }\n return html`\n ${this.schemaStyle === 'table'\n ? html`\n `\n : html`\n `\n }`;\n }\n /* eslint-enable indent */\n}\n\n// Register the element with the browser\ncustomElements.define('api-response', ApiResponse);\n","import { css } from 'lit';\n\nexport default css`\n *, *:before, *:after { box-sizing: border-box; }\n\n .dialog-box-overlay {\n background-color: var(--overlay-bg);\n position: fixed;\n left: 0;\n top: 0;\n width: 100vw;\n height: 100vh;\n overflow: hidden;\n z-index: var(--dialog-z-index);\n }\n \n .dialog-box {\n position: fixed;\n top: 100px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: column;\n width: 70vw;\n background-color: var(--bg2);\n color: var(--fg2);\n border-radius: 4px;\n max-height: 500px;\n overflow: hidden;\n border: 1px solid var(--border-color);\n box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22);\n }\n \n .dialog-box-header {\n position: sticky;\n top: 0;\n align-self: stretch;\n display: flex;\n align-items: center;\n padding: 0px 16px;\n min-height: 60px;\n max-height: 60px;\n border-bottom: 1px solid var(--light-border-color);\n overflow: hidden;\n }\n \n .dialog-box-header button {\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: var(--fg);\n border: none;\n outline: none;\n background-color: transparent;\n cursor:pointer;\n border: 1px solid transparent;\n border-radius: 50%;\n margin-right: -8px;\n }\n .dialog-box-header button:hover {\n border-color: var(--primary-color);\n }\n\n .dialog-box-content {\n padding: 16px;\n display:block;\n overflow: auto;\n height: 100%;\n }\n\n .dialog-box-title {\n flex-grow: 1;\n font-size:24px;\n }\n`;\n","import { html } from 'lit';\nimport '~/components/dialog-box';\n\n/* eslint-disable indent */\nexport default function searchByPropertiesModalTemplate() {\n document.addEventListener('close', () => { this.showAdvancedSearchDialog = false; });\n document.addEventListener('open', this.onOpenSearchDialog);\n\n return html`\n \n \n this.onAdvancedSearch(e, 400)}\"\n >\n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n this.onAdvancedSearch(e, 0)}\">\n \n
\n
\n
\n \n ${this.advancedSearchMatches?.map((path) => html`\n {\n this.matchPaths = ''; // clear quick filter if applied\n this.showAdvancedSearchDialog = false; // Hide Search Dialog\n this.requestUpdate();\n this.scrollToEventTarget(e, true);\n }\n }\"\n > \n ${path.method} \n ${path.path}\n ${path.summary}\n
\n `)\n }\n \n `;\n}\n/* eslint-enable indent */\n","import { LitElement, html } from 'lit';\nimport DialogBoxStyles from '~/styles/dialog-box-styles';\n\nexport default class DialogBox extends LitElement {\n static get properties() {\n return {\n heading: { type: String, attribute: 'heading' },\n show: { type: String, attribute: 'show' },\n };\n }\n\n static get styles() {\n return [DialogBoxStyles];\n }\n\n connectedCallback() {\n super.connectedCallback();\n document.addEventListener('keydown', (e) => {\n if (e.code === 'Escape') {\n this.onClose();\n }\n });\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (oldVal !== newVal) {\n if (name === 'heading') {\n this.heading = newVal;\n }\n if (name === 'show') {\n this.show = newVal;\n if (newVal === 'true') {\n document.dispatchEvent(new CustomEvent('open', {\n bubbles: true,\n composed: true,\n detail: this,\n }));\n }\n }\n }\n super.attributeChangedCallback(name, oldVal, newVal);\n }\n\n /* eslint-disable indent */\n render() {\n return html`\n ${this.show === 'true'\n ? html`\n
\n
\n
\n ${this.heading}\n \n
\n
\n \n
\n
\n
`\n : ''\n }`;\n }\n /* eslint-enable indent */\n\n onClose() {\n document.dispatchEvent(new CustomEvent('close', {\n bubbles: true,\n composed: true,\n }));\n }\n}\n\ncustomElements.define('dialog-box', DialogBox);\n","import { html } from 'lit';\nimport ColorUtils from '~/utils/color-utils';\n/* Generates an schema object containing type and constraint info */\nexport default function setTheme(baseTheme, theme = {}) {\n let newTheme = {};\n\n // Common Theme colors\n const primaryColor = theme.primaryColor ? theme.primaryColor : baseTheme === 'dark' ? '#f76b39' : '#ff591e';\n const primaryColorInvert = ColorUtils.color.invert(primaryColor);\n const primaryColorTrans = ColorUtils.color.opacity(primaryColor, '0.8');\n\n // Dark and Light Theme colors\n if (baseTheme === 'dark') {\n const bg1 = theme.bg1 ? theme.bg1 : '#2a2b2c';\n const fg1 = theme.fg1 ? theme.fg1 : '#bbb';\n\n const bg2 = theme.bg2 ? theme.bg2 : ColorUtils.color.brightness(bg1, 5); // or #383838;\n const bg3 = theme.bg3 ? theme.bg3 : ColorUtils.color.brightness(bg1, 17); // or #444;\n const lightBg = theme.bg3 ? theme.bg3 : ColorUtils.color.brightness(bg1, 35);\n const fg2 = theme.fg2 ? theme.fg2 : ColorUtils.color.brightness(fg1, -15); // or #ababab\n const fg3 = theme.fg3 ? theme.fg3 : ColorUtils.color.brightness(fg1, -20); // or #aaa\n const lightFg = theme.fg3 ? theme.fg3 : ColorUtils.color.brightness(fg1, -65); // or #777\n const inlineCodeFg = theme.inlineCodeFg ? theme.inlineCodeFg : '#aaa';\n const selectionBg = '#bbb';\n const selectionFg = '#eee';\n\n const headerColor = theme.headerColor ? theme.headerColor : ColorUtils.color.brightness(bg1, 10);\n\n const navBgColor = theme.navBgColor ? theme.navBgColor : ColorUtils.color.brightness(bg1, 10);\n const navTextColor = theme.navTextColor ? theme.navTextColor : ColorUtils.color.opacity(ColorUtils.color.invert(navBgColor), '0.50');\n const navHoverBgColor = theme.navHoverBgColor ? theme.navHoverBgColor : ColorUtils.color.brightness(navBgColor, -15);\n const navHoverTextColor = theme.navHoverTextColor ? theme.navHoverTextColor : ColorUtils.color.invert(navBgColor);\n const navAccentColor = theme.navAccentColor ? theme.navAccentColor : ColorUtils.color.brightness(primaryColor, 25);\n const overlayBg = 'rgba(80, 80, 80, 0.4)';\n\n newTheme = {\n bg1,\n bg2,\n bg3,\n lightBg,\n fg1,\n fg2,\n fg3,\n lightFg,\n inlineCodeFg,\n primaryColor,\n primaryColorTrans,\n primaryColorInvert,\n selectionBg,\n selectionFg,\n overlayBg,\n navBgColor,\n navTextColor,\n navHoverBgColor,\n navHoverTextColor,\n navAccentColor,\n\n headerColor,\n headerColorInvert: ColorUtils.color.invert(headerColor),\n headerColorDarker: ColorUtils.color.brightness(headerColor, -20),\n headerColorBorder: ColorUtils.color.brightness(headerColor, 10),\n\n borderColor: theme.borderColor || ColorUtils.color.brightness(bg1, 20), // #555\n lightBorderColor: theme.lightBorderColor || ColorUtils.color.brightness(bg1, 15), // #444\n codeBorderColor: theme.codeBorderColor || ColorUtils.color.brightness(bg1, 30),\n\n inputBg: theme.inputBg || ColorUtils.color.brightness(bg1, -5), // #2f2f2f\n placeHolder: theme.placeHolder || ColorUtils.color.opacity(fg1, '0.3'),\n hoverColor: theme.hoverColor || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n red: theme.red ? theme.red : '#F06560',\n lightRed: theme.lightRed ? theme.lightRed : ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n pink: theme.pink ? theme.pink : '#ffb2b2',\n lightPink: theme.lightPink || ColorUtils.color.brightness(bg1, -10),\n\n green: theme.green || '#7ec699',\n lightGreen: theme.lightGreen || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n blue: theme.blue || '#71b7ff',\n lightBlue: theme.lightBlue || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n orange: theme.orange ? theme.orange : '#f08d49',\n lightOrange: theme.lightOrange || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n yellow: theme.yellow || '#827717',\n lightYellow: theme.lightYellow || ColorUtils.color.brightness(bg1, -10), // #2a2a2a\n\n purple: theme.purple || '#786FF1',\n brown: theme.brown || '#D4AC0D',\n\n codeBg: theme.codeBg || ColorUtils.color.opacity(ColorUtils.color.brightness(bg1, -15), 0.7),\n codeFg: theme.codeFg || '#aaa',\n codePropertyColor: theme.codePropertyColor || '#f8c555',\n codeKeywordColor: theme.codeKeywordColor || '#cc99cd',\n codeOperatorColor: theme.codeOperatorColor || '#67cdcc',\n };\n } else {\n const bg1 = (theme.bg1 ? theme.bg1 : '#fafbfc');\n const fg1 = (theme.fg1 ? theme.fg1 : '#444444');\n const bg2 = theme.bg2 ? theme.bg2 : ColorUtils.color.brightness(bg1, -5); // or '#fafafa'\n const bg3 = theme.bg3 ? theme.bg3 : ColorUtils.color.brightness(bg1, -15); // or '#f6f6f6'\n const lightBg = theme.bg3 ? theme.bg3 : ColorUtils.color.brightness(bg1, -45);\n const fg2 = theme.fg2 ? theme.fg2 : ColorUtils.color.brightness(fg1, 17); // or '#555'\n const fg3 = theme.fg3 ? theme.fg3 : ColorUtils.color.brightness(fg1, 30); // or #666\n const lightFg = theme.fg3 ? theme.fg3 : ColorUtils.color.brightness(fg1, 70); // or #999\n const inlineCodeFg = theme.inlineCodeFg ? theme.inlineCodeFg : 'brown';\n\n const selectionBg = '#444';\n const selectionFg = '#eee';\n\n const headerColor = theme.headerColor ? theme.headerColor : ColorUtils.color.brightness(bg1, -180);\n\n /*\n const navBgColor = theme.navBgColor ? theme.navBgColor : ColorUtils.color.brightness(bg1, -10);\n const navTextColor = theme.navTextColor ? theme.navTextColor : ColorUtils.color.brightness(fg1, 5);\n const navHoverBgColor = theme.navHoverBgColor ? theme.navHoverBgColor : bg1;\n const navHoverTextColor = theme.navHoverTextColor ? theme.navHoverTextColor : primaryColor;\n const navAccentColor = theme.navAccentColor ? theme.navAccentColor : primaryColor;\n */\n const navBgColor = theme.navBgColor ? theme.navBgColor : ColorUtils.color.brightness(bg1, -200);\n const navTextColor = theme.navTextColor ? theme.navTextColor : ColorUtils.color.opacity(ColorUtils.color.invert(navBgColor), '0.65');\n const navHoverBgColor = theme.navHoverBgColor ? theme.navHoverBgColor : ColorUtils.color.brightness(navBgColor, -15);\n const navHoverTextColor = theme.navHoverTextColor ? theme.navHoverTextColor : ColorUtils.color.invert(navBgColor);\n const navAccentColor = theme.navAccentColor ? theme.navAccentColor : ColorUtils.color.brightness(primaryColor, 25);\n const overlayBg = 'rgba(0, 0, 0, 0.4)';\n\n newTheme = {\n bg1,\n bg2,\n bg3,\n lightBg,\n fg1,\n fg2,\n fg3,\n lightFg,\n inlineCodeFg,\n primaryColor,\n primaryColorTrans,\n primaryColorInvert,\n selectionBg,\n selectionFg,\n overlayBg,\n navBgColor,\n navTextColor,\n navHoverBgColor,\n navHoverTextColor,\n navAccentColor,\n\n headerColor,\n headerColorInvert: ColorUtils.color.invert(headerColor),\n headerColorDarker: ColorUtils.color.brightness(headerColor, -20),\n headerColorBorder: ColorUtils.color.brightness(headerColor, 10),\n\n borderColor: theme.borderColor || ColorUtils.color.brightness(bg1, -38),\n lightBorderColor: theme.lightBorderColor || ColorUtils.color.brightness(bg1, -23),\n codeBorderColor: theme.codeBorderColor || 'transparent',\n\n inputBg: theme.inputBg || ColorUtils.color.brightness(bg1, 10), // #fff\n placeHolder: theme.placeHolder || ColorUtils.color.brightness(lightFg, 20), // #dedede\n hoverColor: theme.hoverColor || ColorUtils.color.brightness(bg1, -5), // # f1f1f1\n\n red: theme.red || '#F06560',\n lightRed: theme.lightRed || '#fff0f0',\n\n pink: theme.pink ? theme.pink : '#990055',\n lightPink: theme.lightPink ? theme.lightPink : '#ffb2b2',\n\n green: theme.green || '#690',\n lightGreen: theme.lightGreen || '#fbfff0',\n\n blue: theme.blue || '#47AFE8',\n lightBlue: theme.lightBlue || '#eff8fd',\n\n orange: theme.orange || '#FF9900',\n lightOrange: theme.lightOrange || '#fff5e6',\n\n yellow: theme.yellow || '#827717',\n lightYellow: theme.lightYellow || '#fff5cc',\n\n purple: theme.purple || '#786FF1',\n brown: theme.brown || '#D4AC0D',\n\n codeBg: theme.codeBg || ColorUtils.color.opacity(ColorUtils.color.brightness(bg1, -15), 0.7),\n codeFg: theme.codeFg || '#666',\n codePropertyColor: theme.codePropertyColor || '#905',\n codeKeywordColor: theme.codeKeywordColor || '#07a',\n codeOperatorColor: theme.codeOperatorColor || '#9a6e3a',\n };\n }\n return html`\n `;\n}\n","import { html } from 'lit';\n\n// Templates\nimport expandedEndpointTemplate from '~/templates/expanded-endpoint-template';\nimport focusedEndpointTemplate from '~/templates/focused-endpoint-template';\nimport overviewTemplate from '~/templates/overview-template';\nimport endpointTemplate from '~/templates/endpoint-template';\nimport serverTemplate from '~/templates/server-template';\nimport securitySchemeTemplate, { recoverPersistedApiKeys } from '~/templates/security-scheme-template';\nimport headerTemplate from '~/templates/header-template';\nimport navbarTemplate from '~/templates/navbar-template';\nimport advancedSearchTemplate from '~/templates/advance-search-template';\nimport SetTheme from '~/utils/theme';\nimport { isValidHexColor } from '~/utils/color-utils';\n\nexport default function mainBodyTemplate(isMini = false, showExpandCollapse = true, showTags = true, pathsExpanded = false) {\n if (!this.resolvedSpec) {\n return '';\n }\n if (this.persistAuth === 'true') {\n recoverPersistedApiKeys.call(this);\n }\n const newTheme = {\n bg1: isValidHexColor(this.bgColor) ? this.bgColor : '',\n fg1: isValidHexColor(this.textColor) ? this.textColor : '',\n headerColor: isValidHexColor(this.headerColor) ? this.headerColor : '',\n primaryColor: isValidHexColor(this.primaryColor) ? this.primaryColor : '',\n navBgColor: isValidHexColor(this.navBgColor) ? this.navBgColor : '',\n navTextColor: isValidHexColor(this.navTextColor) ? this.navTextColor : '',\n navHoverBgColor: isValidHexColor(this.navHoverBgColor) ? this.navHoverBgColor : '',\n navHoverTextColor: isValidHexColor(this.navHoverTextColor) ? this.navHoverTextColor : '',\n navAccentColor: isValidHexColor(this.navAccentColor) ? this.navAccentColor : '',\n };\n /* eslint-disable indent */\n if (this.resolvedSpec.specLoadError) {\n if (isMini) {\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n
${this.resolvedSpec.info.description}
\n `;\n }\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n \n ${headerTemplate.call(this)}\n
\n \n
\n

${this.resolvedSpec.info.title}

\n
${this.resolvedSpec.info.description}
\n
\n
\n `;\n }\n if (this.resolvedSpec.isSpecLoading) {\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n
\n \n
\n
\n
\n
\n `;\n }\n\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n\n \n ${this.showHeader === 'false' ? '' : headerTemplate.call(this)}\n \n \n ${this.allowAdvancedSearch === 'false' ? '' : advancedSearchTemplate.call(this)}\n\n
\n \n ${((this.renderStyle === 'read' || this.renderStyle === 'focused')\n && this.showSideNav === 'true'\n && this.resolvedSpec\n ) ? navbarTemplate.call(this) : ''\n }\n\n \n
\n \n
\n ${this.loading === true\n ? html`
`\n : html`\n ${this.loadFailed === true\n ? html`
Unable to load the Spec
`\n : html`\n
{ this.handleHref(e); }}\">\n ${this.renderStyle === 'focused'\n ? html`${focusedEndpointTemplate.call(this)}`\n : html`\n ${this.showInfo === 'true' ? overviewTemplate.call(this) : ''}\n ${this.allowServerSelection === 'true' ? serverTemplate.call(this) : ''}\n ${this.allowAuthentication === 'true' ? securitySchemeTemplate.call(this) : ''}\n
\n \n
\n ${this.renderStyle === 'read'\n ? expandedEndpointTemplate.call(this)\n : endpointTemplate.call(this, showExpandCollapse, showTags, pathsExpanded)\n }\n `\n }\n
\n `\n }`\n }\n
\n \n
\n
\n `;\n}\n/* eslint-enable indent */\n","import { css, LitElement, unsafeCSS } from 'lit';\nimport { marked } from 'marked';\nimport Prism from 'prismjs';\nimport 'prismjs/components/prism-css';\nimport 'prismjs/components/prism-yaml';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-http';\nimport 'prismjs/components/prism-csharp';\n\n// Styles\nimport FontStyles from '~/styles/font-styles';\nimport InputStyles from '~/styles/input-styles';\nimport FlexStyles from '~/styles/flex-styles';\nimport TableStyles from '~/styles/table-styles';\nimport EndpointStyles from '~/styles/endpoint-styles';\nimport PrismStyles from '~/styles/prism-styles';\nimport TabStyles from '~/styles/tab-styles';\nimport NavStyles from '~/styles/nav-styles';\nimport InfoStyles from '~/styles/info-styles';\nimport CustomStyles from '~/styles/custom-styles';\n// import { expandCollapseNavBarTag } from '@/templates/navbar-template';\nimport { advancedSearch, pathIsInSearch, componentIsInSearch, rapidocApiKey, sleep } from '~/utils/common-utils';\nimport ProcessSpec from '~/utils/spec-parser';\nimport mainBodyTemplate from '~/templates/main-body-template';\nimport { applyApiKey, onClearAllApiKeys } from '~/templates/security-scheme-template';\nimport { setApiServer } from '~/templates/server-template';\n\nexport default class RapiDoc extends LitElement {\n constructor() {\n super();\n const intersectionObserverOptions = {\n root: this.getRootNode().host,\n rootMargin: '-50px 0px -50px 0px', // when the element is visible 100px from bottom\n threshold: 0,\n };\n this.showSummaryWhenCollapsed = true;\n this.isIntersectionObserverActive = true;\n this.intersectionObserver = new IntersectionObserver((entries) => { this.onIntersect(entries); }, intersectionObserverOptions);\n }\n\n static get properties() {\n return {\n // Heading\n headingText: { type: String, attribute: 'heading-text' },\n gotoPath: { type: String, attribute: 'goto-path' },\n\n // Spec\n updateRoute: { type: String, attribute: 'update-route' },\n routePrefix: { type: String, attribute: 'route-prefix' },\n specUrl: { type: String, attribute: 'spec-url' },\n sortTags: { type: String, attribute: 'sort-tags' },\n generateMissingTags: { type: String, attribute: 'generate-missing-tags' },\n sortEndpointsBy: { type: String, attribute: 'sort-endpoints-by' },\n specFile: { type: String, attribute: false },\n\n // UI Layouts\n layout: { type: String },\n renderStyle: { type: String, attribute: 'render-style' },\n defaultSchemaTab: { type: String, attribute: 'default-schema-tab' },\n responseAreaHeight: { type: String, attribute: 'response-area-height' },\n fillRequestFieldsWithExample: { type: String, attribute: 'fill-request-fields-with-example' },\n useSummaryToListExamples: { type: String, attribute: 'use-summary-to-list-example' },\n persistAuth: { type: String, attribute: 'persist-auth' },\n onNavTagClick: { type: String, attribute: 'on-nav-tag-click' },\n\n // Schema Styles\n schemaStyle: { type: String, attribute: 'schema-style' },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n schemaHideReadOnly: { type: String, attribute: 'schema-hide-read-only' },\n schemaHideWriteOnly: { type: String, attribute: 'schema-hide-write-only' },\n\n // API Server\n apiKeyName: { type: String, attribute: 'api-key-name' },\n apiKeyLocation: { type: String, attribute: 'api-key-location' },\n apiKeyValue: { type: String, attribute: 'api-key-value' },\n defaultApiServerUrl: { type: String, attribute: 'default-api-server' },\n serverUrl: { type: String, attribute: 'server-url' },\n oauthReceiver: { type: String, attribute: 'oauth-receiver' },\n\n // Hide/Show Sections & Enable Disable actions\n showHeader: { type: String, attribute: 'show-header' },\n showSideNav: { type: String, attribute: 'show-side-nav' },\n showInfo: { type: String, attribute: 'show-info' },\n allowAuthentication: { type: String, attribute: 'allow-authentication' },\n allowTry: { type: String, attribute: 'allow-try' },\n allowSpecUrlLoad: { type: String, attribute: 'allow-spec-url-load' },\n allowSpecFileLoad: { type: String, attribute: 'allow-spec-file-load' },\n allowSpecFileDownload: { type: String, attribute: 'allow-spec-file-download' },\n allowSearch: { type: String, attribute: 'allow-search' },\n allowAdvancedSearch: { type: String, attribute: 'allow-advanced-search' },\n allowServerSelection: { type: String, attribute: 'allow-server-selection' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n showComponents: { type: String, attribute: 'show-components' },\n pageDirection: { type: String, attribute: 'page-direction' },\n\n // Main Colors and Font\n theme: { type: String },\n bgColor: { type: String, attribute: 'bg-color' },\n textColor: { type: String, attribute: 'text-color' },\n headerColor: { type: String, attribute: 'header-color' },\n primaryColor: { type: String, attribute: 'primary-color' },\n fontSize: { type: String, attribute: 'font-size' },\n regularFont: { type: String, attribute: 'regular-font' },\n monoFont: { type: String, attribute: 'mono-font' },\n loadFonts: { type: String, attribute: 'load-fonts' },\n cssFile: { type: String, attribute: 'css-file' },\n cssClasses: { type: String, attribute: 'css-classes' },\n\n // Nav Bar Colors\n navBgColor: { type: String, attribute: 'nav-bg-color' },\n navTextColor: { type: String, attribute: 'nav-text-color' },\n navHoverBgColor: { type: String, attribute: 'nav-hover-bg-color' },\n navHoverTextColor: { type: String, attribute: 'nav-hover-text-color' },\n navAccentColor: { type: String, attribute: 'nav-accent-color' },\n navItemSpacing: { type: String, attribute: 'nav-item-spacing' },\n showMethodInNavBar: { type: String, attribute: 'show-method-in-nav-bar' },\n usePathInNavBar: { type: String, attribute: 'use-path-in-nav-bar' },\n infoDescriptionHeadingsInNavBar: { type: String, attribute: 'info-description-headings-in-navbar' },\n\n // Fetch Options\n fetchCredentials: { type: String, attribute: 'fetch-credentials' },\n\n // Filters\n matchPaths: { type: String, attribute: 'match-paths' },\n matchType: { type: String, attribute: 'match-type' },\n\n // Internal Properties\n loading: { type: Boolean }, // indicates spec is being loaded\n focusedElementId: { type: String }, // updating the focusedElementId will automatically render appropriate section in focused mode\n showAdvancedSearchDialog: { type: Boolean },\n advancedSearchMatches: { type: Object },\n };\n }\n\n static get styles() {\n return [\n FontStyles,\n InputStyles,\n FlexStyles,\n TableStyles,\n EndpointStyles,\n PrismStyles,\n TabStyles,\n NavStyles,\n InfoStyles,\n css`\n :host {\n display:flex;\n flex-direction: column;\n min-width:360px;\n width:100%;\n height:100%;\n margin:0;\n padding:0;\n overflow: hidden;\n letter-spacing:normal;\n color:var(--fg);\n background-color:var(--bg);\n font-family:var(--font-regular);\n }\n .body {\n display:flex;\n height:100%;\n width:100%;\n overflow:hidden;\n }\n\n .main-content { \n margin:0;\n padding: 0; \n display:block;\n flex:1;\n height:100%;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: thin;\n scrollbar-color: var(--border-color) transparent;\n }\n\n .main-content-inner--view-mode {\n padding: 0 8px;\n }\n .main-content::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n .main-content::-webkit-scrollbar-track {\n background:transparent;\n }\n .main-content::-webkit-scrollbar-thumb {\n background-color: var(--border-color);\n }\n\n .section-gap.section-tag {\n border-bottom:1px solid var(--border-color);\n }\n .section-gap,\n .section-gap--focused-mode,\n .section-gap--read-mode { \n padding: 0px 4px; \n }\n .section-tag-header {\n position:relative;\n cursor: n-resize;\n padding: 12px 0;\n }\n .collapsed .section-tag-header:hover{\n cursor: s-resize;\n }\n\n .section-tag-header:hover{\n background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-color), rgba(0,0,0,0));\n }\n\n .section-tag-header:hover::after {\n position:absolute;\n margin-left:-24px;\n font-size:20px;\n top: calc(50% - 14px);\n color:var(--primary-color);\n content: '⬆'; \n }\n\n .collapsed .section-tag-header::after {\n position:absolute;\n margin-left:-24px;\n font-size:20px;\n top: calc(50% - 14px);\n color: var(--border-color);\n content: '⬇'; \n }\n .collapsed .section-tag-header:hover::after {\n color:var(--primary-color);\n }\n\n .collapsed .section-tag-body {\n display:none;\n }\n\n .logo {\n height:36px;\n width:36px;\n margin-left:5px; \n }\n .only-large-screen-flex,\n .only-large-screen{\n display:none;\n }\n .tag.title {\n text-transform: uppercase;\n }\n .main-header {\n background-color:var(--header-bg);\n color:var(--header-fg);\n width:100%;\n }\n .header-title {\n font-size:calc(var(--font-size-regular) + 8px); \n padding:0 8px;\n }\n input.header-input{\n background:var(--header-color-darker);\n color:var(--header-fg);\n border:1px solid var(--header-color-border);\n flex:1; \n padding-right:24px;\n border-radius:3px;\n }\n input.header-input::placeholder {\n opacity:0.4;\n }\n .loader {\n margin: 16px auto 16px auto; \n border: 4px solid var(--bg3);\n border-radius: 50%;\n border-top: 4px solid var(--primary-color);\n width: 36px;\n height: 36px;\n animation: spin 2s linear infinite;\n }\n .expanded-endpoint-body{ \n position: relative;\n padding: 6px 0px; \n }\n .expanded-endpoint-body.deprecated{ filter:opacity(0.6); }\n .divider { \n border-top: 2px solid var(--border-color);\n margin: 24px 0;\n width:100%;\n }\n\n .tooltip {\n cursor:pointer;\n border: 1px solid var(--border-color);\n border-left-width: 4px;\n margin-left:2px;\n }\n .tooltip a {\n color: var(--fg2);\n text-decoration: none;\n }\n .tooltip-text {\n color: var(--fg2);\n max-width: 400px;\n position: absolute;\n z-index:1;\n background-color: var(--bg2);\n visibility: hidden;\n\n overflow-wrap: break-word;\n }\n .tooltip:hover {\n color: var(--primary-color);\n border-color: var(--primary-color);\n }\n .tooltip:hover a:hover {\n color: var(--primary-color);\n }\n\n .tooltip:hover .tooltip-text {\n visibility: visible;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .nav-method { font-weight: bold; margin-right: 4px; font-size: calc(var(--font-size-small) - 2px); white-space: nowrap; }\n .nav-method.false { display: none; }\n\n .nav-method.as-colored-text.get { color:var(--nav-get-color); }\n .nav-method.as-colored-text.put { color:var(--nav-put-color); }\n .nav-method.as-colored-text.post { color:var(--nav-post-color); }\n .nav-method.as-colored-text.delete { color:var(--nav-delete-color); }\n .nav-method.as-colored-text.head, .nav-method.as-colored-text.patch, .nav-method.as-colored-text.options { color:var(--nav-head-color); }\n \n .nav-method.as-colored-block {\n padding: 1px 4px;\n min-width: 30px;\n border-radius: 4px 0 0 4px;\n color: #000;\n }\n\n .nav-method.as-colored-block.get { background-color: var(--blue); }\n .nav-method.as-colored-block.put { background-color: var(--orange); }\n .nav-method.as-colored-block.post { background-color: var(--green); }\n .nav-method.as-colored-block.delete { background-color: var(--red); }\n .nav-method.as-colored-block.head, .nav-method.as-colored-block.patch , .nav-method.as-colored-block.options { \n background-color: var(--yellow); \n }\n\n @media only screen and (min-width: 768px) {\n .nav-bar {\n width: 260px;\n display:flex;\n }\n .only-large-screen{\n display:block;\n }\n .only-large-screen-flex{\n display:flex;\n }\n .section-gap { \n padding: 0 0 0 24px; \n }\n .section-gap--focused-mode {\n padding: 24px 8px; \n }\n .section-gap--read-mode { \n padding: 24px 8px; \n }\n .endpoint-body {\n position: relative;\n padding:36px 0 48px 0;\n }\n }\n\n @media only screen and (min-width: 1024px) {\n .nav-bar {\n width: ${unsafeCSS(this.fontSize === 'default' ? '300px' : this.fontSize === 'large' ? '315px' : '330px')};\n display:flex;\n }\n .section-gap--focused-mode { \n padding: 12px 80px 12px 80px; \n }\n .section-gap--read-mode { \n padding: 24px 80px 12px 80px; \n }\n }`,\n CustomStyles,\n ];\n }\n\n // Startup\n connectedCallback() {\n super.connectedCallback();\n const parent = this.parentElement;\n if (parent) {\n if (parent.offsetWidth === 0 && parent.style.width === '') {\n parent.style.width = '100vw';\n }\n if (parent.offsetHeight === 0 && parent.style.height === '') {\n parent.style.height = '100vh';\n }\n if (parent.tagName === 'BODY') {\n if (!parent.style.marginTop) { parent.style.marginTop = '0'; }\n if (!parent.style.marginRight) { parent.style.marginRight = '0'; }\n if (!parent.style.marginBottom) { parent.style.marginBottom = '0'; }\n if (!parent.style.marginLeft) { parent.style.marginLeft = '0'; }\n }\n }\n\n if (this.loadFonts !== 'false') {\n const fontDescriptor = {\n family: 'Open Sans',\n style: 'normal',\n weight: '300',\n unicodeRange: 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD',\n };\n const fontWeight300 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UN_r8OUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontDescriptor.weight = '600';\n const fontWeight600 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UNirkOUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontWeight300.load().then((font) => { document.fonts.add(font); });\n fontWeight600.load().then((font) => { document.fonts.add(font); });\n }\n\n if (!this.layout || !'row, column,'.includes(`${this.layout},`)) { this.layout = 'row'; }\n if (!this.renderStyle || !'read, view, focused,'.includes(`${this.renderStyle},`)) { this.renderStyle = 'read'; }\n if (!this.schemaStyle || !'tree, table,'.includes(`${this.schemaStyle},`)) { this.schemaStyle = 'tree'; }\n if (!this.theme || !'light, dark,'.includes(`${this.theme},`)) {\n this.theme = (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) ? 'light' : 'dark';\n }\n if (!this.defaultSchemaTab || !'example, schema, model,'.includes(`${this.defaultSchemaTab},`)) {\n this.defaultSchemaTab = 'example';\n } else if (this.defaultSchemaTab === 'model') {\n this.defaultSchemaTab = 'schema';\n }\n if (!this.schemaExpandLevel || this.schemaExpandLevel < 1) { this.schemaExpandLevel = 99999; }\n if (!this.schemaDescriptionExpanded || !'true, false,'.includes(`${this.schemaDescriptionExpanded},`)) { this.schemaDescriptionExpanded = 'false'; }\n const writeMethodsWithBody = ['post', 'put', 'patch'];\n if (!this.schemaHideReadOnly) {\n this.schemaHideReadOnly = writeMethodsWithBody;\n } else if (this.schemaHideReadOnly !== 'never') {\n this.schemaHideReadOnly = writeMethodsWithBody.filter((value) => this.schemaHideReadOnly.includes(value));\n if (this.schemaHideReadOnly.length === 0) {\n this.schemaHideReadOnly = writeMethodsWithBody;\n }\n }\n this.schemaHideReadOnly += ['get', 'head', 'delete', 'options'];\n this.schemaHideWriteOnly = this.schemaHideWriteOnly !== 'never';\n if (!this.fillRequestFieldsWithExample || !'true, false,'.includes(`${this.fillRequestFieldsWithExample},`)) { this.fillRequestFieldsWithExample = 'true'; }\n if (!this.useSummaryToListExamples || !'true, false,'.includes(`${this.useSummaryToListExamples},`)) { this.useSummaryToListExamples = 'false'; }\n if (!this.persistAuth || !'true, false,'.includes(`${this.persistAuth},`)) { this.persistAuth = 'false'; }\n if (!this.onNavTagClick || !'expand-collapse, show-description,'.includes(`${this.onNavTagClick},`)) { this.onNavTagClick = 'expand-collapse'; }\n if (!this.responseAreaHeight) {\n this.responseAreaHeight = '300px';\n }\n\n if (!this.allowSearch || !'true, false,'.includes(`${this.allowSearch},`)) { this.allowSearch = 'true'; }\n if (!this.allowAdvancedSearch || !'true, false,'.includes(`${this.allowAdvancedSearch},`)) { this.allowAdvancedSearch = 'true'; }\n\n if (!this.allowTry || !'true, false,'.includes(`${this.allowTry},`)) { this.allowTry = 'true'; }\n if (!this.apiKeyValue) { this.apiKeyValue = '-'; }\n if (!this.apiKeyLocation) { this.apiKeyLocation = 'header'; }\n if (!this.apiKeyName) { this.apiKeyName = ''; }\n\n if (!this.oauthReceiver) { this.oauthReceiver = 'oauth-receiver.html'; }\n if (!this.updateRoute || !'true, false,'.includes(`${this.updateRoute},`)) { this.updateRoute = 'true'; }\n if (!this.routePrefix) { this.routePrefix = '#'; }\n if (!this.sortTags || !'true, false,'.includes(`${this.sortTags},`)) { this.sortTags = 'false'; }\n if (!this.generateMissingTags || !'true, false,'.includes(`${this.generateMissingTags},`)) { this.generateMissingTags = 'false'; }\n if (!this.sortEndpointsBy || !'method, path, summary, none,'.includes(`${this.sortEndpointsBy},`)) { this.sortEndpointsBy = 'path'; }\n if (!this.navItemSpacing || !'compact, relaxed, default,'.includes(`${this.navItemSpacing},`)) { this.navItemSpacing = 'default'; }\n if (!this.showMethodInNavBar || !'false, as-plain-text, as-colored-text, as-colored-block,'.includes(`${this.showMethodInNavBar},`)) { this.showMethodInNavBar = 'false'; }\n if (!this.usePathInNavBar || !'true, false,'.includes(`${this.usePathInNavBar},`)) { this.usePathInNavBar = 'false'; }\n if (!this.fontSize || !'default, large, largest,'.includes(`${this.fontSize},`)) { this.fontSize = 'default'; }\n\n if (!this.showInfo || !'true, false,'.includes(`${this.showInfo},`)) { this.showInfo = 'true'; }\n if (!this.allowServerSelection || !'true, false,'.includes(`${this.allowServerSelection},`)) { this.allowServerSelection = 'true'; }\n if (!this.allowAuthentication || !'true, false,'.includes(`${this.allowAuthentication},`)) { this.allowAuthentication = 'true'; }\n if (!this.allowSchemaDescriptionExpandToggle || !'true, false,'.includes(`${this.allowSchemaDescriptionExpandToggle},`)) { this.allowSchemaDescriptionExpandToggle = 'true'; }\n\n if (!this.showSideNav || !'true false'.includes(this.showSideNav)) { this.showSideNav = 'true'; }\n if (!this.showComponents || !'true false'.includes(this.showComponents)) { this.showComponents = 'false'; }\n if (!this.infoDescriptionHeadingsInNavBar || !'true, false,'.includes(`${this.infoDescriptionHeadingsInNavBar},`)) { this.infoDescriptionHeadingsInNavBar = 'false'; }\n if (!this.fetchCredentials || !'omit, same-origin, include,'.includes(`${this.fetchCredentials},`)) { this.fetchCredentials = ''; }\n if (!this.matchType || !'includes regex'.includes(this.matchType)) { this.matchType = 'includes'; }\n\n if (!this.showAdvancedSearchDialog) { this.showAdvancedSearchDialog = false; }\n\n if (!this.cssFile) { this.cssFile = null; }\n if (!this.cssClasses) { this.cssClasses = ''; }\n\n marked.setOptions({\n highlight: (code, lang) => {\n if (Prism.languages[lang]) {\n return Prism.highlight(code, Prism.languages[lang], lang);\n }\n return code;\n },\n });\n\n window.addEventListener('hashchange', () => {\n const regEx = new RegExp(`^${this.routePrefix}`, 'i');\n const elementId = window.location.hash.replace(regEx, '');\n this.scrollTo(elementId);\n }, true);\n }\n\n // Cleanup\n disconnectedCallback() {\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n }\n super.disconnectedCallback();\n }\n\n infoDescriptionHeadingRenderer() {\n const renderer = new marked.Renderer();\n renderer.heading = ((text, level, raw, slugger) => `${text}`);\n return renderer;\n }\n\n render() {\n // return render(mainBodyTemplate(this), this.shadowRoot, { eventContext: this });\n const cssLinkEl = document.querySelector(`link[href*=\"${this.cssFile}\"]`);\n // adding custom style for RapiDoc\n if (cssLinkEl) {\n this.shadowRoot.appendChild(cssLinkEl.cloneNode());\n }\n return mainBodyTemplate.call(this);\n }\n\n observeExpandedContent() {\n // Main Container\n const observeOverviewEls = this.shadowRoot.querySelectorAll('.observe-me');\n observeOverviewEls.forEach((targetEl) => {\n this.intersectionObserver.observe(targetEl);\n });\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (name === 'spec-url') {\n if (oldVal !== newVal) {\n // put it at the end of event-loop to load all the attributes\n window.setTimeout(async () => {\n await this.loadSpec(newVal);\n // If goto-path is provided and no location-hash is present then try to scroll there\n if (this.gotoPath && !window.location.hash) {\n this.scrollTo(this.gotoPath);\n }\n }, 0);\n }\n }\n if (name === 'render-style') {\n if (newVal === 'read') {\n window.setTimeout(() => {\n this.observeExpandedContent();\n }, 100);\n } else {\n this.intersectionObserver.disconnect();\n }\n }\n if (name === 'api-key-name' || name === 'api-key-location' || name === 'api-key-value') {\n let updateSelectedApiKey = false;\n let apiKeyName = '';\n let apiKeyLocation = '';\n let apiKeyValue = '';\n\n if (name === 'api-key-name') {\n if (this.getAttribute('api-key-location') && this.getAttribute('api-key-value')) {\n apiKeyName = newVal;\n apiKeyLocation = this.getAttribute('api-key-location');\n apiKeyValue = this.getAttribute('api-key-value');\n updateSelectedApiKey = true;\n }\n } else if (name === 'api-key-location') {\n if (this.getAttribute('api-key-name') && this.getAttribute('api-key-value')) {\n apiKeyLocation = newVal;\n apiKeyName = this.getAttribute('api-key-name');\n apiKeyValue = this.getAttribute('api-key-value');\n updateSelectedApiKey = true;\n }\n } else if (name === 'api-key-value') {\n if (this.getAttribute('api-key-name') && this.getAttribute('api-key-location')) {\n apiKeyValue = newVal;\n apiKeyLocation = this.getAttribute('api-key-location');\n apiKeyName = this.getAttribute('api-key-name');\n updateSelectedApiKey = true;\n }\n }\n\n if (updateSelectedApiKey) {\n if (this.resolvedSpec) {\n const rapiDocApiKey = this.resolvedSpec.securitySchemes.find((v) => v.securitySchemeId === rapidocApiKey);\n if (!rapiDocApiKey) {\n this.resolvedSpec.securitySchemes.push({\n securitySchemeId: rapidocApiKey,\n description: 'api-key provided in rapidoc element attributes',\n type: 'apiKey',\n name: apiKeyName,\n in: apiKeyLocation,\n value: apiKeyValue,\n finalKeyValue: apiKeyValue,\n });\n } else {\n rapiDocApiKey.name = apiKeyName;\n rapiDocApiKey.in = apiKeyLocation;\n rapiDocApiKey.value = apiKeyValue;\n rapiDocApiKey.finalKeyValue = apiKeyValue;\n }\n this.requestUpdate();\n }\n }\n }\n super.attributeChangedCallback(name, oldVal, newVal);\n }\n\n onSepcUrlChange() {\n this.setAttribute('spec-url', this.shadowRoot.getElementById('spec-url').value);\n }\n\n onSepcFileChange(e) {\n this.setAttribute('spec-file', this.shadowRoot.getElementById('spec-file').value);\n const specFile = e.target.files[0];\n const reader = new FileReader();\n reader.onload = () => {\n try {\n const specObj = JSON.parse(reader.result);\n this.loadSpec(specObj);\n this.shadowRoot.getElementById('spec-url').value = '';\n } catch (err) {\n console.error('RapiDoc: Unable to read or parse json'); // eslint-disable-line no-console\n }\n };\n // Read the Text file\n reader.readAsText(specFile);\n }\n\n onFileLoadClick() {\n this.shadowRoot.getElementById('spec-file').click();\n }\n\n onSearchChange(e) {\n this.matchPaths = e.target.value;\n this.resolvedSpec.tags.forEach((tag) => tag.paths.filter((v) => {\n if (this.matchPaths) {\n // v.expanded = false;\n if (pathIsInSearch(this.matchPaths, v, this.matchType)) {\n tag.expanded = true;\n }\n }\n }));\n this.resolvedSpec.components.forEach((component) => component.subComponents.filter((v) => {\n v.expanded = false;\n if (!this.matchPaths || componentIsInSearch(this.matchPaths, v)) {\n v.expanded = true;\n }\n }));\n this.requestUpdate();\n }\n\n onClearSearch() {\n const searchEl = this.shadowRoot.getElementById('nav-bar-search');\n searchEl.value = '';\n this.matchPaths = '';\n this.resolvedSpec.components.forEach((component) => component.subComponents.filter((v) => {\n v.expanded = true;\n }));\n }\n\n onShowSearchModalClicked() {\n this.showAdvancedSearchDialog = true;\n }\n\n // Event Handler on Dialog-Box is opened\n async onOpenSearchDialog(e) {\n // Set focus to text input\n const inputEl = e.detail.querySelector('input');\n await sleep(0);\n if (inputEl) {\n inputEl.focus();\n }\n }\n\n // Public Method\n async loadSpec(specUrl) {\n if (!specUrl) {\n return;\n }\n this.matchPaths = '';\n try {\n this.resolvedSpec = {\n specLoadError: false,\n isSpecLoading: true,\n tags: [],\n };\n this.loading = true;\n this.loadFailed = false;\n const spec = await ProcessSpec.call(\n this,\n specUrl,\n this.generateMissingTags === 'true',\n this.sortTags === 'true',\n this.getAttribute('sort-endpoints-by'),\n this.getAttribute('api-key-name'),\n this.getAttribute('api-key-location'),\n this.getAttribute('api-key-value'),\n this.getAttribute('server-url'),\n );\n this.loading = false;\n this.afterSpecParsedAndValidated(spec);\n } catch (err) {\n this.loading = false;\n this.loadFailed = true;\n this.resolvedSpec = null;\n console.error(`RapiDoc: Unable to resolve the API spec.. ${err.message}`); // eslint-disable-line no-console\n }\n }\n\n async afterSpecParsedAndValidated(spec) {\n this.resolvedSpec = spec;\n this.selectedServer = undefined;\n if (this.defaultApiServerUrl) {\n if (this.defaultApiServerUrl === this.serverUrl) {\n this.selectedServer = {\n url: this.serverUrl,\n computedUrl: this.serverUrl,\n };\n } else if (this.resolvedSpec.servers) {\n this.selectedServer = this.resolvedSpec.servers.find((v) => (v.url === this.defaultApiServerUrl));\n }\n }\n if (!this.selectedServer) {\n if (this.resolvedSpec.servers) {\n this.selectedServer = this.resolvedSpec.servers[0]; // eslint-disable-line prefer-destructuring\n }\n }\n this.requestUpdate();\n // eslint-disable-next-line no-await-in-loop\n while (!await this.updateComplete);\n const specLoadedEvent = new CustomEvent('spec-loaded', { detail: spec });\n this.dispatchEvent(specLoadedEvent);\n\n // Initiate IntersectionObserver and put it at the end of event loop, to allow loading all the child elements (must for larger specs)\n this.intersectionObserver.disconnect();\n if (this.renderStyle === 'read') {\n await sleep(100);\n this.observeExpandedContent(); // This will auto-highlight the selected nav-item in read-mode\n }\n\n // On first time Spec load, try to navigate to location hash if provided\n const locationHash = window.location.hash?.substring(1);\n if (locationHash) {\n const regEx = new RegExp(`^${this.routePrefix}`, 'i');\n const elementId = window.location.hash.replace(regEx, '');\n if (this.renderStyle === 'view') {\n this.expandAndGotoOperation(elementId, true, true);\n } else {\n this.scrollTo(elementId);\n }\n } else if (this.renderStyle === 'focused') {\n const defaultElementId = this.showInfo ? 'overview' : this.resolvedSpec.tags[0]?.paths[0];\n this.scrollTo(defaultElementId);\n }\n }\n\n expandAndGotoOperation(elementId, scrollToElement = true) {\n if (!this.resolvedSpec) {\n return;\n }\n // Expand full operation and tag\n let isExpandingNeeded = true;\n const tmpElementId = elementId.indexOf('#') === -1 ? elementId : elementId.substring(1);\n if (tmpElementId.startsWith('overview') || tmpElementId === 'servers' || tmpElementId === 'auth') {\n isExpandingNeeded = false;\n } else {\n for (let i = 0; i < this.resolvedSpec.tags?.length; i++) {\n const tag = this.resolvedSpec.tags[i];\n const path = tag.paths?.find((p) => p.elementId === elementId);\n if (path) {\n if (path.expanded && tag.expanded) {\n isExpandingNeeded = false;\n } else {\n path.expanded = true;\n tag.expanded = true;\n }\n }\n }\n }\n if (scrollToElement) {\n // requestUpdate() and delay required, else we cant find element\n if (isExpandingNeeded) {\n this.requestUpdate();\n }\n window.setTimeout(() => {\n const gotoEl = this.shadowRoot.getElementById(tmpElementId);\n if (gotoEl) {\n gotoEl.scrollIntoView({ behavior: 'auto', block: 'start' });\n if (this.updateRoute === 'true') {\n window.history.replaceState(null, null, `${this.routePrefix || '#'}${tmpElementId}`);\n }\n }\n }, isExpandingNeeded ? 150 : 0);\n }\n }\n\n isValidTopId(id) {\n return (id.startsWith('overview') || id === 'servers' || id === 'auth');\n }\n\n isValidPathId(id) {\n if (id === 'overview' && this.showInfo) {\n return true;\n }\n if (id === 'servers' && this.allowServerSelection) {\n return true;\n }\n if (id === 'auth' && this.allowAuthentication) {\n return true;\n }\n if (id.startsWith('tag--')) {\n return this.resolvedSpec?.tags?.find((tag) => tag.elementId === id);\n }\n return this.resolvedSpec?.tags?.find((tag) => tag.paths.find((path) => path.elementId === id));\n }\n\n onIntersect(entries) {\n if (this.isIntersectionObserverActive === false) {\n return;\n }\n entries.forEach((entry) => {\n if (entry.isIntersecting && entry.intersectionRatio > 0) {\n const oldNavEl = this.shadowRoot.querySelector('.nav-bar-tag.active, .nav-bar-path.active, .nav-bar-info.active, .nav-bar-h1.active, .nav-bar-h2.active, .operations.active');\n const newNavEl = this.shadowRoot.getElementById(`link-${entry.target.id}`);\n\n // Add active class in the new element\n if (newNavEl) {\n if (this.updateRoute === 'true') {\n window.history.replaceState(null, null, `${window.location.href.split('#')[0]}${this.routePrefix || '#'}${entry.target.id}`);\n }\n newNavEl.scrollIntoView({ behavior: 'auto', block: 'center' });\n newNavEl.classList.add('active');\n }\n // Remove active class from previous element\n if (oldNavEl) {\n oldNavEl.classList.remove('active');\n }\n }\n });\n }\n\n // Called by anchor tags created using markdown\n handleHref(e) {\n if (e.target.tagName.toLowerCase() === 'a') {\n if (e.target.getAttribute('href').startsWith('#')) {\n const gotoEl = this.shadowRoot.getElementById(e.target.getAttribute('href').replace('#', ''));\n if (gotoEl) {\n gotoEl.scrollIntoView({ behavior: 'auto', block: 'start' });\n }\n }\n }\n }\n\n /**\n * Called by\n * - onClick of Navigation Bar\n * - onClick of Advanced Search items\n *\n * Functionality:\n * 1. First deactivate IntersectionObserver\n * 2. Scroll to the element\n * 3. Activate IntersectionObserver (after little delay)\n *\n */\n async scrollToEventTarget(event, scrollNavItemToView = true) {\n const navEl = event.currentTarget;\n if (!navEl.dataset.contentId) {\n return;\n }\n this.isIntersectionObserverActive = false;\n this.scrollTo(navEl.dataset.contentId, true, scrollNavItemToView);\n setTimeout(() => {\n this.isIntersectionObserverActive = true;\n }, 300);\n }\n\n // Public Method (scrolls to a given path and highlights the left-nav selection)\n async scrollTo(elementId, expandPath = true, scrollNavItemToView = true) {\n if (this.renderStyle === 'focused') {\n // for focused mode update this.focusedElementId to update the rendering, else it wont find the needed html elements\n // focusedElementId will get validated in the template\n this.focusedElementId = elementId;\n await sleep(0);\n }\n if (this.renderStyle === 'view') {\n this.expandAndGotoOperation(elementId, expandPath, true);\n } else {\n let isValidElementId = false;\n const contentEl = this.shadowRoot.getElementById(elementId);\n if (contentEl) {\n isValidElementId = true;\n contentEl.scrollIntoView({ behavior: 'auto', block: 'start' });\n } else {\n isValidElementId = false;\n }\n if (isValidElementId) {\n // for focused style it is important to reset request-body-selection and response selection which maintains the state for in case of multiple req-body or multiple response mime-type\n if (this.renderStyle === 'focused') {\n const requestEl = this.shadowRoot.querySelector('api-request');\n if (requestEl) {\n requestEl.resetRequestBodySelection();\n }\n const responseEl = this.shadowRoot.querySelector('api-response');\n if (responseEl) {\n responseEl.resetSelection();\n }\n }\n\n // Update Location Hash\n if (this.updateRoute === 'true') {\n window.history.replaceState(null, null, `${this.routePrefix || '#'}${elementId}`);\n }\n\n // Update NavBar View and Styles\n const newNavEl = this.shadowRoot.getElementById(`link-${elementId}`);\n\n if (newNavEl) {\n if (scrollNavItemToView) {\n newNavEl.scrollIntoView({ behavior: 'auto', block: 'center' });\n }\n await sleep(0);\n const oldNavEl = this.shadowRoot.querySelector('.nav-bar-tag.active, .nav-bar-path.active, .nav-bar-info.active, .nav-bar-h1.active, .nav-bar-h2.active, .operations.active');\n if (oldNavEl) {\n oldNavEl.classList.remove('active');\n }\n newNavEl.classList.add('active'); // must add the class after scrolling\n // this.requestUpdate();\n }\n }\n }\n }\n\n // Public Method - to update security-scheme of type http\n setHttpUserNameAndPassword(securitySchemeId, username, password) {\n return applyApiKey.call(this, securitySchemeId, username, password);\n }\n\n // Public Method - to update security-scheme of type apiKey or OAuth\n setApiKey(securitySchemeId, apiKeyValue) {\n return applyApiKey.call(this, securitySchemeId, '', '', apiKeyValue);\n }\n\n // Public Method\n removeAllSecurityKeys() {\n return onClearAllApiKeys.call(this);\n }\n\n // Public Method\n setApiServer(apiServerUrl) {\n // return apiServerUrl;\n return setApiServer.call(this, apiServerUrl);\n }\n\n // Event handler for Advanced Search text-inputs and checkboxes\n onAdvancedSearch(ev, delay) {\n const eventTargetEl = ev.target;\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(() => {\n let searchInputEl;\n if (eventTargetEl.type === 'text') {\n searchInputEl = eventTargetEl;\n } else {\n searchInputEl = eventTargetEl.closest('.advanced-search-options').querySelector('input[type=text]');\n }\n const searcOptions = [...eventTargetEl.closest('.advanced-search-options').querySelectorAll('input:checked')].map((v) => v.id);\n this.advancedSearchMatches = advancedSearch(searchInputEl.value, this.resolvedSpec.tags, searcOptions);\n }, delay);\n }\n}\ncustomElements.define('rapi-doc', RapiDoc);\n","import { css, LitElement } from 'lit';\nimport { marked } from 'marked';\nimport Prism from 'prismjs';\nimport 'prismjs/components/prism-css';\nimport 'prismjs/components/prism-yaml';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-http';\nimport 'prismjs/components/prism-csharp';\n\n// Styles\nimport FontStyles from '~/styles/font-styles';\nimport InputStyles from '~/styles/input-styles';\nimport FlexStyles from '~/styles/flex-styles';\nimport TableStyles from '~/styles/table-styles';\nimport PrismStyles from '~/styles/prism-styles';\nimport TabStyles from '~/styles/tab-styles';\nimport NavStyles from '~/styles/nav-styles';\nimport InfoStyles from '~/styles/info-styles';\n\nimport EndpointStyles from '~/styles/endpoint-styles';\nimport { rapidocApiKey } from '~/utils/common-utils';\nimport ProcessSpec from '~/utils/spec-parser';\nimport mainBodyTemplate from '~/templates/main-body-template';\nimport { applyApiKey, onClearAllApiKeys } from '~/templates/security-scheme-template';\nimport { setApiServer } from '~/templates/server-template';\n\nexport default class RapiDocMini extends LitElement {\n constructor() {\n super();\n this.isMini = true;\n this.updateRoute = 'false';\n this.renderStyle = 'view';\n this.showHeader = 'false';\n this.allowAdvancedSearch = 'false';\n }\n\n static get properties() {\n return {\n // Spec\n specUrl: { type: String, attribute: 'spec-url' },\n sortEndpointsBy: { type: String, attribute: 'sort-endpoints-by' },\n\n // UI Layouts\n layout: { type: String },\n pathsExpanded: { type: String, attribute: 'paths-expanded' },\n defaultSchemaTab: { type: String, attribute: 'default-schema-tab' },\n responseAreaHeight: { type: String, attribute: 'response-area-height' },\n showSummaryWhenCollapsed: { type: String, attribute: 'show-summary-when-collapsed' },\n fillRequestFieldsWithExample: { type: String, attribute: 'fill-request-fields-with-example' },\n useSummaryToListExamples: { type: String, attribute: 'use-summary-to-list-example' },\n persistAuth: { type: String, attribute: 'persist-auth' },\n\n // Schema Styles\n schemaStyle: { type: String, attribute: 'schema-style' },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n\n // API Server\n apiKeyName: { type: String, attribute: 'api-key-name' },\n apiKeyLocation: { type: String, attribute: 'api-key-location' },\n apiKeyValue: { type: String, attribute: 'api-key-value' },\n defaultApiServerUrl: { type: String, attribute: 'default-api-server' },\n serverUrl: { type: String, attribute: 'server-url' },\n oauthReceiver: { type: String, attribute: 'oauth-receiver' },\n\n allowTry: { type: String, attribute: 'allow-try' },\n\n // Main Colors and Font\n theme: { type: String },\n bgColor: { type: String, attribute: 'bg-color' },\n textColor: { type: String, attribute: 'text-color' },\n primaryColor: { type: String, attribute: 'primary-color' },\n fontSize: { type: String, attribute: 'font-size' },\n regularFont: { type: String, attribute: 'regular-font' },\n monoFont: { type: String, attribute: 'mono-font' },\n loadFonts: { type: String, attribute: 'load-fonts' },\n\n // Fetch Options\n fetchCredentials: { type: String, attribute: 'fetch-credentials' },\n\n // Filters\n matchPaths: { type: String, attribute: 'match-paths' },\n matchType: { type: String, attribute: 'match-type' },\n\n // Internal Properties\n loading: { type: Boolean }, // indicates spec is being loaded\n };\n }\n\n static get styles() {\n return [\n FontStyles,\n InputStyles,\n FlexStyles,\n TableStyles,\n EndpointStyles,\n PrismStyles,\n TabStyles,\n NavStyles,\n InfoStyles,\n css`\n :host {\n display:flex;\n flex-direction: column;\n min-width:360px;\n width:100%;\n height:100%;\n margin:0;\n padding:0;\n overflow: hidden;\n letter-spacing:normal;\n color:var(--fg);\n background-color:var(--bg);\n font-family:var(--font-regular);\n }\n\n @media only screen and (min-width: 768px) {\n .only-large-screen{\n display:block;\n }\n .only-large-screen-flex{\n display:flex;\n }\n }`,\n ];\n }\n\n // Startup\n connectedCallback() {\n super.connectedCallback();\n\n if (this.loadFonts !== 'false') {\n const fontDescriptor = {\n family: 'Open Sans',\n style: 'normal',\n weight: '300',\n unicodeRange: 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD',\n };\n const fontWeight300 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UN_r8OUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontDescriptor.weight = '600';\n const fontWeight600 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UNirkOUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontWeight300.load().then((font) => { document.fonts.add(font); });\n fontWeight600.load().then((font) => { document.fonts.add(font); });\n }\n\n if (!this.showSummaryWhenCollapsed || !'true, false,'.includes(`${this.showSummaryWhenCollapsed},`)) { this.showSummaryWhenCollapsed = 'true'; }\n if (!this.layout || !'row, column,'.includes(`${this.layout},`)) { this.layout = 'row'; }\n if (!this.schemaStyle || !'tree, table,'.includes(`${this.schemaStyle},`)) { this.schemaStyle = 'tree'; }\n if (!this.theme || !'light, dark,'.includes(`${this.theme},`)) {\n this.theme = (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) ? 'light' : 'dark';\n }\n if (!this.defaultSchemaTab || !'example, schema, model,'.includes(`${this.defaultSchemaTab},`)) {\n this.defaultSchemaTab = 'example';\n } else if (this.defaultSchemaTab === 'model') {\n this.defaultSchemaTab = 'schema';\n }\n this.pathsExpanded = this.pathsExpanded === 'true';\n if (!this.schemaExpandLevel || this.schemaExpandLevel < 1) { this.schemaExpandLevel = 99999; }\n if (!this.schemaDescriptionExpanded || !'true, false,'.includes(`${this.schemaDescriptionExpanded},`)) { this.schemaDescriptionExpanded = 'false'; }\n if (!this.fillRequestFieldsWithExample || !'true, false,'.includes(`${this.fillRequestFieldsWithExample},`)) { this.fillRequestFieldsWithExample = 'true'; }\n if (!this.useSummaryToListExamples || !'true, false,'.includes(`${this.useSummaryToListExamples},`)) { this.useSummaryToListExamples = 'false'; }\n if (!this.persistAuth || !'true, false,'.includes(`${this.persistAuth},`)) { this.persistAuth = 'false'; }\n if (!this.responseAreaHeight) { this.responseAreaHeight = '300px'; }\n\n if (!this.allowTry || !'true, false,'.includes(`${this.allowTry},`)) { this.allowTry = 'true'; }\n if (!this.apiKeyValue) { this.apiKeyValue = '-'; }\n if (!this.apiKeyLocation) { this.apiKeyLocation = 'header'; }\n if (!this.apiKeyName) { this.apiKeyName = ''; }\n\n if (!this.oauthReceiver) { this.oauthReceiver = 'oauth-receiver.html'; }\n if (!this.sortTags || !'true, false,'.includes(`${this.sortTags},`)) { this.sortTags = 'false'; }\n if (!this.sortEndpointsBy || !'method, path, summary,'.includes(`${this.sortEndpointsBy},`)) { this.sortEndpointsBy = 'path'; }\n if (!this.fontSize || !'default, large, largest,'.includes(`${this.fontSize},`)) { this.fontSize = 'default'; }\n if (!this.matchType || !'includes regex'.includes(this.matchType)) { this.matchType = 'includes'; }\n\n if (!this.allowSchemaDescriptionExpandToggle || !'true, false,'.includes(`${this.allowSchemaDescriptionExpandToggle},`)) { this.allowSchemaDescriptionExpandToggle = 'true'; }\n if (!this.fetchCredentials || !'omit, same-origin, include,'.includes(`${this.fetchCredentials},`)) { this.fetchCredentials = ''; }\n\n marked.setOptions({\n highlight: (code, lang) => {\n if (Prism.languages[lang]) {\n return Prism.highlight(code, Prism.languages[lang], lang);\n }\n return code;\n },\n });\n }\n\n render() {\n return mainBodyTemplate.call(this, true, false, false, this.pathsExpanded);\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (name === 'spec-url') {\n if (oldVal !== newVal) {\n // put it at the end of event-loop to load all the attributes\n window.setTimeout(async () => {\n await this.loadSpec(newVal);\n }, 0);\n }\n }\n if (name === 'api-key-name' || name === 'api-key-location' || name === 'api-key-value') {\n let updateSelectedApiKey = false;\n let apiKeyName = '';\n let apiKeyLocation = '';\n let apiKeyValue = '';\n\n if (name === 'api-key-name') {\n if (this.getAttribute('api-key-location') && this.getAttribute('api-key-value')) {\n apiKeyName = newVal;\n apiKeyLocation = this.getAttribute('api-key-location');\n apiKeyValue = this.getAttribute('api-key-value');\n updateSelectedApiKey = true;\n }\n } else if (name === 'api-key-location') {\n if (this.getAttribute('api-key-name') && this.getAttribute('api-key-value')) {\n apiKeyLocation = newVal;\n apiKeyName = this.getAttribute('api-key-name');\n apiKeyValue = this.getAttribute('api-key-value');\n updateSelectedApiKey = true;\n }\n } else if (name === 'api-key-value') {\n if (this.getAttribute('api-key-name') && this.getAttribute('api-key-location')) {\n apiKeyValue = newVal;\n apiKeyLocation = this.getAttribute('api-key-location');\n apiKeyName = this.getAttribute('api-key-name');\n updateSelectedApiKey = true;\n }\n }\n\n if (updateSelectedApiKey) {\n if (this.resolvedSpec) {\n const rapiDocApiKey = this.resolvedSpec.securitySchemes.find((v) => v.securitySchemeId === rapidocApiKey);\n if (!rapiDocApiKey) {\n this.resolvedSpec.securitySchemes.push({\n apiKeyId: rapidocApiKey,\n description: 'api-key provided in rapidoc element attributes',\n type: 'apiKey',\n name: apiKeyName,\n in: apiKeyLocation,\n value: apiKeyValue,\n finalKeyValue: apiKeyValue,\n });\n } else {\n rapiDocApiKey.name = apiKeyName;\n rapiDocApiKey.in = apiKeyLocation;\n rapiDocApiKey.value = apiKeyValue;\n rapiDocApiKey.finalKeyValue = apiKeyValue;\n }\n this.requestUpdate();\n }\n }\n }\n super.attributeChangedCallback(name, oldVal, newVal);\n }\n\n onSepcUrlChange() {\n this.setAttribute('spec-url', this.shadowRoot.getElementById('spec-url').value);\n }\n\n // Public Method\n async loadSpec(specUrl) {\n if (!specUrl) {\n return;\n }\n try {\n this.resolvedSpec = {\n specLoadError: false,\n isSpecLoading: true,\n tags: [],\n };\n this.loading = true;\n this.loadFailed = false;\n this.requestUpdate();\n const spec = await ProcessSpec.call(\n this,\n specUrl,\n this.generateMissingTags === 'true',\n this.sortTags === 'true',\n this.getAttribute('sort-endpoints-by'),\n this.getAttribute('api-key-name'),\n this.getAttribute('api-key-location'),\n this.getAttribute('api-key-value'),\n this.getAttribute('server-url'),\n );\n this.loading = false;\n this.afterSpecParsedAndValidated(spec);\n } catch (err) {\n this.loading = false;\n this.loadFailed = true;\n this.resolvedSpec = null;\n console.error(`RapiDoc: Unable to resolve the API spec.. ${err.message}`); // eslint-disable-line no-console\n }\n }\n\n // Public Method - to update security-scheme of type http\n setHttpUserNameAndPassword(securitySchemeId, username, password) {\n return applyApiKey.call(this, securitySchemeId, username, password);\n }\n\n // Public Method - to update security-scheme of type apiKey or OAuth\n setApiKey(securitySchemeId, apiKeyValue) {\n return applyApiKey.call(this, securitySchemeId, '', '', apiKeyValue);\n }\n\n // Public Method\n removeAllSecurityKeys() {\n return onClearAllApiKeys.call(this);\n }\n\n // Public Method\n setApiServer(apiServerUrl) {\n // return apiServerUrl;\n return setApiServer.call(this, apiServerUrl);\n }\n\n async afterSpecParsedAndValidated(spec) {\n this.resolvedSpec = spec;\n this.selectedServer = undefined;\n if (this.defaultApiServerUrl) {\n if (this.defaultApiServerUrl === this.serverUrl) {\n this.selectedServer = {\n url: this.serverUrl,\n computedUrl: this.serverUrl,\n };\n } else if (this.resolvedSpec.servers) {\n this.selectedServer = this.resolvedSpec.servers.find((v) => (v.url === this.defaultApiServerUrl));\n }\n }\n if (!this.selectedServer) {\n if (this.resolvedSpec.servers) {\n this.selectedServer = this.resolvedSpec.servers[0]; // eslint-disable-line prefer-destructuring\n }\n }\n this.requestUpdate();\n // eslint-disable-next-line no-await-in-loop\n while (!await this.updateComplete);\n const specLoadedEvent = new CustomEvent('spec-loaded', { detail: spec });\n this.dispatchEvent(specLoadedEvent);\n }\n\n // Called by anchor tags created using markdown\n handleHref(e) {\n if (e.target.tagName.toLowerCase() === 'a') {\n if (e.target.getAttribute('href').startsWith('#')) {\n const gotoEl = this.shadowRoot.getElementById(e.target.getAttribute('href').replace('#', ''));\n if (gotoEl) {\n gotoEl.scrollIntoView({ behavior: 'auto', block: 'start' });\n }\n }\n }\n }\n}\ncustomElements.define('rapi-doc-mini', RapiDocMini);\n","import { html } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'; // eslint-disable-line import/extensions\nimport { marked } from 'marked';\n\n// Templates\nimport overviewTemplate from '~/templates/overview-template';\nimport headerTemplate from '~/templates/header-template';\nimport { schemaInObjectNotation, generateExample } from '~/utils/schema-utils';\nimport '~/components/json-tree';\nimport '~/components/schema-tree';\nimport SetTheme from '~/utils/theme';\nimport { isValidHexColor } from '~/utils/color-utils';\n\n/* eslint-disable indent */\n// Json Schema Nav Template\nfunction jsonSchemaNavTemplate() {\n return html`\n \n `;\n}\n\n// Json Schema Body Template\nfunction jsonSchemaBodyTemplate() {\n return html`\n ${this.showInfo === 'true' ? overviewTemplate.call(this) : ''}\n
\n ${this.resolvedSpec.schemaAndExamples.map((jSchemaBody) => {\n const examplesObj = generateExample(jSchemaBody.schema, 'json', jSchemaBody.examples, jSchemaBody.example, true, false, 'json', true);\n jSchemaBody.selectedExample = examplesObj[0]?.exampleId;\n return html`\n
\n
\n
${jSchemaBody.name}
\n ${unsafeHTML(marked(jSchemaBody.description || ''))}\n
\n
\n
\n \n
\n
\n ${examplesObj.length > 1\n ? html``\n : html`
${examplesObj[0].exampleSummary}
`\n }\n ${examplesObj.map((v) => html`\n `)\n }\n
\n
\n
`;\n })\n }\n
\n `;\n}\n/* eslint-enable indent */\n\n// Json Schema Root Template\nexport default function jsonSchemaViewerTemplate(isMini = false) {\n// export default function jsonSchemaViewerTemplate(isMini = false, showExpandCollapse = true, showTags = true, pathsExpanded = false) {\n if (!this.resolvedSpec) {\n return '';\n }\n const newTheme = {\n bg1: isValidHexColor(this.bgColor) ? this.bgColor : '',\n fg1: isValidHexColor(this.textColor) ? this.textColor : '',\n headerColor: isValidHexColor(this.headerColor) ? this.headerColor : '',\n primaryColor: isValidHexColor(this.primaryColor) ? this.primaryColor : '',\n navBgColor: isValidHexColor(this.navBgColor) ? this.navBgColor : '',\n navTextColor: isValidHexColor(this.navTextColor) ? this.navTextColor : '',\n navHoverBgColor: isValidHexColor(this.navHoverBgColor) ? this.navHoverBgColor : '',\n navHoverTextColor: isValidHexColor(this.navHoverTextColor) ? this.navHoverTextColor : '',\n navAccentColor: isValidHexColor(this.navAccentColor) ? this.navAccentColor : '',\n };\n /* eslint-disable indent */\n if (this.resolvedSpec.specLoadError) {\n if (isMini) {\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n
${this.resolvedSpec.info.description}
\n `;\n }\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n \n ${headerTemplate.call(this)}\n

Header

\n
\n \n
\n

${this.resolvedSpec.info.title}

\n
${this.resolvedSpec.info.description}
\n
\n
\n `;\n }\n if (this.resolvedSpec.isSpecLoading) {\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n
\n \n
\n
\n
\n
\n `;\n }\n\n return html`\n ${this.theme === 'dark' ? SetTheme.call(this, 'dark', newTheme) : SetTheme.call(this, 'light', newTheme)}\n\n \n ${this.showHeader === 'false' ? '' : headerTemplate.call(this)}\n \n
\n\n \n ${jsonSchemaNavTemplate.call(this)}\n\n \n
\n \n
\n ${this.loading === true\n ? html`
`\n : html`\n ${this.loadFailed === true\n ? html`
Unable to load the Spec
`\n : html`\n
{ this.handleHref(e); }}\">\n ${jsonSchemaBodyTemplate.call(this)}\n
\n `\n }`\n }\n
\n \n
\n
\n `;\n}\n/* eslint-enable indent */\n","export default class OauthReceiver extends HTMLElement {\n connectedCallback() {\n this.receiveAuthParms();\n window.addEventListener('storage', (e) => this.receiveStorage(e), true);\n }\n\n /**\n * Read OAuth2 parameters and sends them off\n * to the window opener through `window.postMessage`.\n */\n receiveAuthParms() {\n let authData = {};\n if (document.location.search) { // Applies to authorizationCode flow\n const params = new URLSearchParams(document.location.search);\n const code = params.get('code');\n const error = params.get('error');\n const state = params.get('state');\n authData = {\n code,\n error,\n state,\n responseType: 'code',\n };\n } else if (window.location.hash) { // Applies to Implicit flow\n const token_type = this.parseQueryString(window.location.hash.substring(1), 'token_type'); // eslint-disable-line camelcase\n const access_token = this.parseQueryString(window.location.hash.substring(1), 'access_token'); // eslint-disable-line camelcase\n authData = { token_type, access_token, responseType: 'token' }; // eslint-disable-line camelcase\n }\n\n if (window.opener) {\n window.opener.postMessage(authData, this.target);\n return;\n }\n sessionStorage.setItem('rapidoc-oauth-data', JSON.stringify(authData)); // Fallback to session storage if window.opener dont exist\n }\n\n relayAuthParams(e) {\n if (window.parent) {\n if (e.key === 'rapidoc-oauth-data') {\n const authData = JSON.parse(e.newValue);\n window.parent.postMessage(authData, this.target);\n }\n }\n }\n\n parseQueryString(queryString, key) {\n const vars = queryString.split('&');\n for (let i = 0; i < vars.length; i++) {\n const pair = vars[i].split('=');\n if (decodeURIComponent(pair[0]) === key) {\n return decodeURIComponent(pair[1]);\n }\n }\n }\n}\ncustomElements.define('oauth-receiver', OauthReceiver);\n","import { css, LitElement } from 'lit';\nimport { marked } from 'marked';\nimport Prism from 'prismjs';\nimport 'prismjs/components/prism-css';\nimport 'prismjs/components/prism-yaml';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-http';\nimport 'prismjs/components/prism-csharp';\n\n// Styles\nimport FontStyles from '~/styles/font-styles';\nimport InputStyles from '~/styles/input-styles';\nimport FlexStyles from '~/styles/flex-styles';\nimport TableStyles from '~/styles/table-styles';\nimport PrismStyles from '~/styles/prism-styles';\nimport TabStyles from '~/styles/tab-styles';\nimport NavStyles from '~/styles/nav-styles';\nimport InfoStyles from '~/styles/info-styles';\n\nimport EndpointStyles from '~/styles/endpoint-styles';\nimport ProcessSpec from '~/utils/spec-parser';\nimport jsonSchemaViewerTemplate from '~/templates/json-schema-viewer-template';\n\nexport default class JsonSchemaViewer extends LitElement {\n constructor() {\n super();\n this.isMini = false;\n this.updateRoute = 'false';\n this.renderStyle = 'focused';\n this.showHeader = 'true';\n this.allowAdvancedSearch = 'false';\n this.selectedExampleForEachSchema = {};\n }\n\n static get properties() {\n return {\n // Spec\n specUrl: { type: String, attribute: 'spec-url' },\n\n // Schema Styles\n schemaStyle: { type: String, attribute: 'schema-style' },\n schemaExpandLevel: { type: Number, attribute: 'schema-expand-level' },\n schemaDescriptionExpanded: { type: String, attribute: 'schema-description-expanded' },\n allowSchemaDescriptionExpandToggle: { type: String, attribute: 'allow-schema-description-expand-toggle' },\n\n // Hide/show Sections\n showHeader: { type: String, attribute: 'show-header' },\n showSideNav: { type: String, attribute: 'show-side-nav' },\n showInfo: { type: String, attribute: 'show-info' },\n\n // Allow or restrict features\n allowSpecUrlLoad: { type: String, attribute: 'allow-spec-url-load' },\n allowSpecFileLoad: { type: String, attribute: 'allow-spec-file-load' },\n allowSpecFileDownload: { type: String, attribute: 'allow-spec-file-download' },\n allowSearch: { type: String, attribute: 'allow-search' },\n\n // Main Colors and Font\n theme: { type: String },\n bgColor: { type: String, attribute: 'bg-color' },\n textColor: { type: String, attribute: 'text-color' },\n primaryColor: { type: String, attribute: 'primary-color' },\n fontSize: { type: String, attribute: 'font-size' },\n regularFont: { type: String, attribute: 'regular-font' },\n monoFont: { type: String, attribute: 'mono-font' },\n loadFonts: { type: String, attribute: 'load-fonts' },\n\n // Internal Properties\n loading: { type: Boolean }, // indicates spec is being loaded\n };\n }\n\n static get styles() {\n return [\n FontStyles,\n InputStyles,\n FlexStyles,\n TableStyles,\n EndpointStyles,\n PrismStyles,\n TabStyles,\n NavStyles,\n InfoStyles,\n css`\n :host {\n display:flex;\n flex-direction: column;\n min-width:360px;\n width:100%;\n height:100%;\n margin:0;\n padding:0;\n overflow: hidden;\n letter-spacing:normal;\n color:var(--fg);\n background-color:var(--bg);\n font-family:var(--font-regular);\n }\n .body {\n display:flex;\n height:100%;\n width:100%;\n overflow:hidden;\n }\n .nav-bar {\n width: 230px;\n display:flex;\n }\n\n .main-content { \n margin:0;\n padding: 16px; \n display:block;\n flex:1;\n height:100%;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: thin;\n scrollbar-color: var(--border-color) transparent;\n }\n .main-content-inner--view-mode {\n padding: 0 8px;\n }\n .main-content::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n .main-content::-webkit-scrollbar-track {\n background:transparent;\n }\n .main-content::-webkit-scrollbar-thumb {\n background-color: var(--border-color);\n }\n .main-header {\n background-color:var(--header-bg);\n color:var(--header-fg);\n width:100%;\n }\n .header-title {\n font-size:calc(var(--font-size-regular) + 8px); \n padding:0 8px;\n }\n input.header-input{\n background:var(--header-color-darker);\n color:var(--header-fg);\n border:1px solid var(--header-color-border);\n flex:1; \n padding-right:24px;\n border-radius:3px;\n }\n input.header-input::placeholder {\n opacity:0.4;\n }\n .loader {\n margin: 16px auto 16px auto; \n border: 4px solid var(--bg3);\n border-radius: 50%;\n border-top: 4px solid var(--primary-color);\n width: 36px;\n height: 36px;\n animation: spin 2s linear infinite;\n }\n @media only screen and (min-width: 768px) {\n .only-large-screen{\n display:block;\n }\n .only-large-screen-flex{\n display:flex;\n }\n }`,\n ];\n }\n\n // Startup\n connectedCallback() {\n super.connectedCallback();\n const parent = this.parentElement;\n if (parent) {\n if (parent.offsetWidth === 0 && parent.style.width === '') {\n parent.style.width = '100vw';\n }\n if (parent.offsetHeight === 0 && parent.style.height === '') {\n parent.style.height = '100vh';\n }\n if (parent.tagName === 'BODY') {\n if (!parent.style.marginTop) { parent.style.marginTop = '0'; }\n if (!parent.style.marginRight) { parent.style.marginRight = '0'; }\n if (!parent.style.marginBottom) { parent.style.marginBottom = '0'; }\n if (!parent.style.marginLeft) { parent.style.marginLeft = '0'; }\n }\n }\n\n if (this.loadFonts !== 'false') {\n const fontDescriptor = {\n family: 'Open Sans',\n style: 'normal',\n weight: '300',\n unicodeRange: 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD',\n };\n const fontWeight300 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UN_r8OUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontDescriptor.weight = '600';\n const fontWeight600 = new FontFace(\n 'Open Sans',\n \"url(https://fonts.gstatic.com/s/opensans/v18/mem5YaGs126MiZpBA-UNirkOUuhpKKSTjw.woff2) format('woff2')\",\n fontDescriptor,\n );\n fontWeight300.load().then((font) => { document.fonts.add(font); });\n fontWeight600.load().then((font) => { document.fonts.add(font); });\n }\n\n this.renderStyle = 'focused';\n this.pathsExpanded = this.pathsExpanded === 'true';\n\n if (!this.showInfo || !'true, false,'.includes(`${this.showInfo},`)) { this.showInfo = 'true'; }\n if (!this.showSideNav || !'true false'.includes(this.showSideNav)) { this.showSideNav = 'true'; }\n if (!this.showHeader || !'true, false,'.includes(`${this.showHeader},`)) { this.showHeader = 'true'; }\n\n if (!this.schemaStyle || !'tree, table,'.includes(`${this.schemaStyle},`)) { this.schemaStyle = 'tree'; }\n if (!this.theme || !'light, dark,'.includes(`${this.theme},`)) {\n this.theme = (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) ? 'light' : 'dark';\n }\n if (!this.allowSearch || !'true, false,'.includes(`${this.allowSearch},`)) { this.allowSearch = 'true'; }\n if (!this.schemaExpandLevel || this.schemaExpandLevel < 1) { this.schemaExpandLevel = 99999; }\n if (!this.schemaDescriptionExpanded || !'true, false,'.includes(`${this.schemaDescriptionExpanded},`)) { this.schemaDescriptionExpanded = 'false'; }\n if (!this.responseAreaHeight) { this.responseAreaHeight = '300px'; }\n if (!this.fontSize || !'default, large, largest,'.includes(`${this.fontSize},`)) { this.fontSize = 'default'; }\n if (!this.matchType || !'includes regex'.includes(this.matchType)) { this.matchType = 'includes'; }\n if (!this.allowSchemaDescriptionExpandToggle || !'true, false,'.includes(`${this.allowSchemaDescriptionExpandToggle},`)) { this.allowSchemaDescriptionExpandToggle = 'true'; }\n\n marked.setOptions({\n highlight: (code, lang) => {\n if (Prism.languages[lang]) {\n return Prism.highlight(code, Prism.languages[lang], lang);\n }\n return code;\n },\n });\n }\n\n render() {\n return jsonSchemaViewerTemplate.call(this, true, false, false, this.pathsExpanded);\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (name === 'spec-url') {\n if (oldVal !== newVal) {\n // put it at the end of event-loop to load all the attributes\n window.setTimeout(async () => {\n await this.loadSpec(newVal);\n }, 0);\n }\n }\n super.attributeChangedCallback(name, oldVal, newVal);\n }\n\n onSepcUrlChange() {\n this.setAttribute('spec-url', this.shadowRoot.getElementById('spec-url').value);\n }\n\n onSearchChange(e) {\n // Todo: Filter Search\n this.matchPaths = e.target.value;\n }\n\n // Public Method\n async loadSpec(specUrl) {\n if (!specUrl) {\n return;\n }\n try {\n this.resolvedSpec = {\n specLoadError: false,\n isSpecLoading: true,\n tags: [],\n };\n this.loading = true;\n this.loadFailed = false;\n this.requestUpdate();\n const spec = await ProcessSpec.call(\n this,\n specUrl,\n this.generateMissingTags === 'true',\n this.sortTags === 'true',\n this.getAttribute('sort-endpoints-by'),\n );\n this.loading = false;\n this.afterSpecParsedAndValidated(spec);\n } catch (err) {\n this.loading = false;\n this.loadFailed = true;\n this.resolvedSpec = null;\n console.error(`RapiDoc: Unable to resolve the API spec.. ${err.message}`); // eslint-disable-line no-console\n }\n }\n\n async afterSpecParsedAndValidated(spec) {\n this.resolvedSpec = spec;\n const specLoadedEvent = new CustomEvent('spec-loaded', { detail: spec });\n this.dispatchEvent(specLoadedEvent);\n }\n\n // Called by anchor tags created using markdown\n handleHref(e) {\n if (e.target.tagName.toLowerCase() === 'a') {\n if (e.target.getAttribute('href').startsWith('#')) {\n const gotoEl = this.shadowRoot.getElementById(e.target.getAttribute('href').replace('#', ''));\n if (gotoEl) {\n gotoEl.scrollIntoView({ behavior: 'auto', block: 'start' });\n }\n }\n }\n }\n\n // Example Dropdown @change Handler\n onSelectExample(e) {\n const exampleContainerEl = e.target.closest('.json-schema-example-panel');\n const exampleEls = [...exampleContainerEl.querySelectorAll('.example')];\n exampleEls.forEach((v) => {\n v.style.display = v.dataset.example === e.target.value ? 'flex' : 'none';\n });\n }\n\n async scrollToEventTarget(event) {\n const navEl = event.currentTarget;\n if (!navEl.dataset.contentId) {\n return;\n }\n const contentEl = this.shadowRoot.getElementById(navEl.dataset.contentId);\n if (contentEl) {\n contentEl.scrollIntoView({ behavior: 'auto', block: 'start' });\n }\n }\n}\ncustomElements.define('json-schema-viewer', JsonSchemaViewer);\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/docs/deploy/README.md b/docs/deploy/README.md new file mode 100644 index 00000000..cedbe93f --- /dev/null +++ b/docs/deploy/README.md @@ -0,0 +1,9 @@ +## 部署文档 +本目录包含一些paopao-ce部署相关的帮助文档 + +* [core](./core) - paopao-ce部署帮助文档 +* [aliyun](./aliyun) - Aliyun平台部署文档 +* [huawei](./huawei) - Huawei Cloud平台部署文档 +* [tencnet](./tencent) - Tencent Cloud平台部署文档 +* [local](./local) - 本地部署文档 +* [k8s](./k8s) - 使用Kubernetes部署paopao-ce相关文档 diff --git a/docs/deploy/aliyun/README.md b/docs/deploy/aliyun/README.md new file mode 100644 index 00000000..bae5e98a --- /dev/null +++ b/docs/deploy/aliyun/README.md @@ -0,0 +1,2 @@ +### Aliyun平台部署文档 +本目录包含一些阿里云平台部署paopao-ce的一些帮助文档。 diff --git a/docs/deploy/core/001-配置文件说明.md b/docs/deploy/core/001-配置文件说明.md new file mode 100644 index 00000000..aa3cc526 --- /dev/null +++ b/docs/deploy/core/001-配置文件说明.md @@ -0,0 +1,150 @@ +### 配置文件说明 +paopao-ce使用YAML格式的`conf.yml`作为配置文件。[`config.yaml.sample`](../../../config.yaml.sample) 是一份完整的配置文件模版,paopao-ce启动时会读取`./custom/config.yaml`、`./config.yaml`任意一份配置文件(优先读取最先找到的文件)。 + +```sh +cp config.yaml.sample config.yaml +vim config.yaml # 修改参数 +paopao-ce +``` + +配置文件中的 `Features` 小节是声明paopao-ce运行时开启哪些功能项: + +```yaml +... + +Features: + Default: ["Base", "MySQL", "Option", "LocalOSS", "LoggerFile"] + Develop: ["Base", "MySQL", "Option", "Sms", "AliOSS", "LoggerZinc"] + Demo: ["Base", "MySQL", "Option", "Sms", "MinIO", "LoggerZinc"] + Slim: ["Base", "Sqlite3", "LocalOSS", "LoggerFile"] + Base: ["Zinc", "Redis", "Alipay",] + Option: ["SimpleCacheIndex"] + Sms: "SmsJuhe" + +... +``` + +如上: +Default/Develop/Demo/Slim 是不同 功能集套件(Features Suite), Base/Option 是子功能套件, Sms是关于短信验证码功能的参数选项。 + +这里 `Default`套件 代表的意思是: 使用`Base/Option` 中的功能,外加 `MySQL/LocalOSS/LoggerFile`功能,也就是说开启了`Zinc/Redis/Alipay/SimpleCacheIndex/MySQL/LocalOSS/LoggerFile` 7项功能; +`Develop`套件依例类推。 + +使用Feautures: + +```sh +release/paopao-ce --help +Usage of release/paopao-ce: + -features value + use special features + -no-default-features + whether use default features + +# 默认使用 Default 功能套件 +release/paopao-ce + +# 不包含 default 中的功能集,仅仅使用 develop 中声明的功能集 +release/paopao-ce --no-default-features --features develop + +# 使用 default 中的功能集,外加 sms 功能 +release/paopao-ce --features sms + +# 手动指定需要开启的功能集 +release/paopao-ce --no-default-features --features sqlite3,localoss,loggerfile,redis +``` + +目前支持的功能集合: +| 功能项 | 类别 | 状态 | 备注 | +| ----- | ----- | ----- | ----- | +|`Web` | 子服务 | 内测 | 开启Web服务| +|`Admin` | 子服务 | WIP | 开启Admin后台运维服务| +|`SpaceX` | 子服务 | WIP | 开启SpaceX服务| +|`Bot` | 子服务 | WIP | 开启Bot服务| +|`NativeOBS` | 子服务 | WIP | 开启NativeOBS服务| +|`Docs` | 子服务 | WIP | 开启开发者文档服务| +|`Frontend:Web` | 子服务 | 稳定 | 开启独立前端服务| +|`Frontend:EmbedWeb` | 子服务 | 稳定 | 开启内嵌于后端Web API服务中的前端服务| +|`Deprecated:Web` | 子服务 | 稳定 | 开启旧的Web服务| +|`Gorm` | 数据库 | 稳定(默认) | 使用[gorm](https://github.com/go-gorm/gorm)作为数据库的ORM,默认使用 `Gorm` + `MySQL`组合| +|`Sqlx`| 数据库 | WIP | 使用[sqlx](https://github.com/jmoiron/sqlx)作为数据库的ORM| +|`MySQL`| 数据库 | 稳定(默认) | 使用MySQL作为数据库| +|`Postgres`| 数据库 | 稳定 | 使用PostgreSQL作为数据库| +|`Sqlite3`| 数据库 | 稳定 | 使用Sqlite3作为数据库| +|`AliOSS` | 对象存储 | 稳定(推荐) |阿里云对象存储服务| +|`COS` | 对象存储 | 内测 |腾讯云对象存储服务| +|`HuaweiOBS` | 对象存储 | 内测 |华为云对象存储服务| +|`MinIO` | 对象存储 | 稳定 |[MinIO](https://github.com/minio/minio)对象存储服务| +|`S3` | 对象存储 | 内测 |AWS S3兼容的对象存储服务| +|`LocalOSS` | 对象存储 | 内测 |提供使用本地目录文件作为对象存储的功能,仅用于开发调试环境| +|`OSS:Retention` | 对象存储 | 内测 |基于对象存储系统的对象过期自动删除特性实现 先创建临时对象再持久化的功能| +|`OSS:TempDir` | 对象存储 | 内测 |基于对象存储系统的对象拷贝/移动特性实现 先创建临时对象再持久化的功能| +|`Redis` | 缓存 | 稳定 | Redis缓存功能 | +|`SimpleCacheIndex` | 缓存 | Deprecated | 提供简单的 广场推文列表 的缓存功能 | +|`BigCacheIndex` | 缓存 | 稳定(推荐) | 使用[BigCache](https://github.com/allegro/bigcache)缓存 广场推文列表,缓存每个用户每一页,简单做到千人千面 | +|`Zinc` | 搜索 | 稳定(推荐) | 基于[Zinc](https://github.com/zinclabs/zinc)搜索引擎提供推文搜索服务 | +|`Meili` | 搜索 | 稳定(推荐) | 基于[Meilisearch](https://github.com/meilisearch/meilisearch)搜索引擎提供推文搜索服务 | +|`Bleve` | 搜索 | WIP | 基于[Bleve](https://github.com/blevesearch/bleve)搜索引擎提供推文搜索服务 | +|`LoggerFile` | 日志 | 稳定 | 使用文件写日志 | +|`LoggerZinc` | 日志 | 稳定(推荐) | 使用[Zinc](https://github.com/zinclabs/zinc)写日志 | +|`LoggerMeili` | 日志 | 内测 | 使用[Meilisearch](https://github.com/meilisearch/meilisearch)写日志 | +|[`Friendship`](../../docs/proposal/002-关于Friendship功能项的设计.md) | 关系模式 | 内测 | 弱关系好友模式,类似微信朋友圈 | +|[`Followship`](../../docs/proposal/003-关于Followship功能项的设计.md) | 关系模式 | WIP | 关注者模式,类似Twitter的Follow模式 | +|[`Lightship`](../../docs/proposal/011-关于Lightship功能项的设计.md) | 关系模式 | 内测(默认) | 开放模式,所有推文都公开可见 | +|`Alipay` | 支付 | 稳定 | 开启基于[支付宝开放平台](https://open.alipay.com/)的钱包功能 | +|`Sms` | 短信验证 | 稳定 | 开启短信验证码功能,用于手机绑定验证手机是否注册者的;功能如果没有开启,手机绑定时任意短信验证码都可以绑定手机 | +|`Docs:OpenAPI` | 开发文档 | 稳定 | 开启openapi文档功能,提供web api文档说明(visit http://127.0.0.1:8008/docs/openapi) | +|`PhoneBind` | 其他 | 稳定 | 手机绑定功能 | + +> 功能项状态详情参考 [features-status](../../../features-status.md). + +### 按需添加自定义配置 +paopao-ce提供了按需添加配置的机制,paopao-ce在internal/conf/config.yaml中内嵌了一份完整的默认配置,内嵌的默认配置与自定义配置config.yaml在paopao-ce启动时自动进行了配置项合并,自定义的配置(./config.yaml或者./custom/config.yaml)中只需要自定义 运行时 声明Features 的相应配置即可。比如只运行Web 子服务,config.yaml可以只包含如下配置(其他配置使用默认值): +```yaml +# file: config.yaml + +Features: + Default: ["Sqlite3", "Zinc", "LocalOSS", "BigCacheIndex", "Web"] +WebServer: # Web服务 + HttpIp: 0.0.0.0 + HttpPort: 8010 + ReadTimeout: 60 + WriteTimeout: 60 +LocalOSS: # 本地文件OSS存储配置 + SavePath: data/paopao-ce/oss + Secure: True + Bucket: paopao + Domain: api.paopao.info +Zinc: # Zinc搜索配置 + Host: 127.0.0.1:4080 + Index: paopao-data + User: admin + Password: admin + Secure: False +``` +部署paopao-ce实例时,可以按需自定义配置运行时所需的配置项, 多个实例部署可以使用不同配置项组合,运行不同的子服务,再通过一个统一的 Proxy(Nginx或云端proxy) 将请求桥接到具体的paopao-ce部署实例。 + +### 多服务同端口运行 +paopao-ce提供的机制是各个子服务(gRPC/RESTful API服务)可以在一个独立端口提供业务服务,也可以多个同类型的子服务(RESTful API服务 或者 gRPC 服务)共享同一个端口提供服务,比如 Web/Admin/Bot 三个子服务在8010端口提供服务, 只需要配置三个子服务的HttpIp/HttpPort为相同值即可: +```yaml +# file: config.yaml + +Features: + Default: ["Sqlite3", "Zinc", "LocalOSS", "BigCacheIndex", "Web", "Admin", "Bot"] +WebServer: # Web服务 + HttpIp: 0.0.0.0 + HttpPort: 8010 + ReadTimeout: 60 + WriteTimeout: 60 +AdminServer: # Admin后台运维服务 + HttpIp: 0.0.0.0 + HttpPort: 8010 + ReadTimeout: 60 + WriteTimeout: 60 +BotServer: # Bot服务 + HttpIp: 0.0.0.0 + HttpPort: 8010 + ReadTimeout: 60 + WriteTimeout: 60 + +... +``` diff --git a/docs/deploy/core/README.md b/docs/deploy/core/README.md new file mode 100644 index 00000000..fc82b4c2 --- /dev/null +++ b/docs/deploy/core/README.md @@ -0,0 +1,4 @@ +### paopao-ce部署帮助文档 +本目录包含一些部署paopao-ce的一些帮助文档。 + +* [001-配置文件说明](./001-配置文件说明.md '001-配置文件说明') diff --git a/docs/deploy/huawei/README.md b/docs/deploy/huawei/README.md new file mode 100644 index 00000000..8052deaf --- /dev/null +++ b/docs/deploy/huawei/README.md @@ -0,0 +1,2 @@ +### Huawei Cloud平台部署文档 +本目录包含一些华为云平台部署paopao-ce的一些帮助文档。 diff --git a/docs/deploy/k8s/README.md b/docs/deploy/k8s/README.md new file mode 100644 index 00000000..e3b23686 --- /dev/null +++ b/docs/deploy/k8s/README.md @@ -0,0 +1,2 @@ +### 使用Kubernetes部署paopao-ce相关文档 +本目录包含一些k8s环境部署paopao-ce的一些帮助文档。 diff --git a/docs/deploy/local/001-本地开发依赖环境部署.md b/docs/deploy/local/001-本地开发依赖环境部署.md new file mode 100644 index 00000000..9fd293f4 --- /dev/null +++ b/docs/deploy/local/001-本地开发依赖环境部署.md @@ -0,0 +1,119 @@ +### 本地开发依赖环境部署 +本地开发依赖的环境部署帮助文档,包括Zinc/Meili/Minio的部署。 + +#### [Zinc](https://github.com/zinclabs/zinc) 搜索引擎: +* Zinc运行 +```sh +# 创建用于存放zinc数据的目录 +mkdir -p data/zinc/data + +# 使用Docker运行zinc +docker run -d --name zinc --user root -v ${PWD}/data/zinc/data:/data -p 4080:4080 -e ZINC_FIRST_ADMIN_USER=admin -e ZINC_FIRST_ADMIN_PASSWORD=admin -e DATA_PATH=/data public.ecr.aws/zinclabs/zinc:latest + +# 查看zinc运行状态 +docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +41465feea2ff getmeili/meilisearch:v0.27.0 "tini -- /bin/sh -c …" 20 hours ago Up 20 hours 0.0.0.0:7700->7700/tcp paopao-ce-meili-1 +7daf982ca062 public.ecr.aws/prabhat/zinc:latest "/go/bin/zinc" 3 weeks ago Up 6 days 0.0.0.0:4080->4080/tcp zinc + +# 使用docker compose运行 +docker compose up -d zinc +# visit http://localhost:4080 打开自带的ui管理界面 +``` + +* 修改Zinc配置 +```yaml +# features中加上 Zinc 和 LoggerZinc +Features: + Default: ["Zinc", "LoggerZinc", "Base", "Sqlite3", "BigCacheIndex","MinIO"] +... +LoggerZinc: # 使用Zinc写日志 + Host: 127.0.0.1:4080 # 这里的host就是paopao-ce能访问到的zinc主机 + Index: paopao-log + User: admin + Password: admin + Secure: False # 如果使用https访问zinc就设置为True +... +Zinc: # Zinc搜索配置 + Host: 127.0.0.1:4080 + Index: paopao-data + User: admin + Password: admin + Secure: False +``` + +#### [Meilisearch](https://github.com/meilisearch/meilisearch) 搜索引擎: +* Meili运行 +```sh +mkdir -p data/meili/data + +# 使用Docker运行 +docker run -d --name meili -v ${PWD}/data/meili/data:/meili_data -p 7700:7700 -e MEILI_MASTER_KEY=paopao-meilisearch getmeili/meilisearch:v0.29.0 +# visit http://localhost:7700 打开自带的搜索前端ui + +# 使用docker compose运行,需要删除docker-compose.yaml中关于meili的注释 +docker compose up -d meili + +# 使用docker运行meilisearch的ui管理前端 +docker run -d --name uirecord -p 7701:3000 bitriory/uirecord +# visit http://localhost:7701 + +# 使用docker compose运行meilisearch的ui管理前端,需要删除docker-compose.yaml中关于uirecord的注释 +docker compose up -d uirecord +# visit http://loclahost:7701 + +# 查看meili运行状态 +docker compose ps +NAME COMMAND SERVICE STATUS PORTS +paopao-ce-meili-1 "tini -- /bin/sh -c …" meili running 0.0.0.0:7700->7700/tcp +paopao-ce-uirecord-1 "docker-entrypoint.s…" uirecord running 0.0.0.0:7701->3000/tcp +``` + +* 修改Meili配置 +```yaml +# features中加上 Meili 和 LoggerMeili +Features: + Default: ["Meili", "LoggerMeili", "Base", "Sqlite3", "BigCacheIndex","MinIO"] +... +LoggerMeili: # 使用Meili写日志 + Host: 127.0.0.1:7700 + Index: paopao-log + ApiKey: paopao-meilisearch + Secure: False + MinWorker: 5 # 最小后台工作者, 设置范围[5, 100], 默认5 + MaxLogBuffer: 100 # 最大log缓存条数, 设置范围[10, 10000], 默认100 +... +Meili: # Meili搜索配置 + Host: 127.0.0.1:7700 # 这里的host就是paopao-ce能访问到的meili主机 + Index: paopao-data + ApiKey: paopao-meilisearch + Secure: False # 如果使用https访问meili就设置为True +``` + +#### [MinIO](https://github.com/minio/minio) 对象存储服务 +* MinIO运行 +```sh +mkdir -p data/minio/data + +# 使用Docker运行 +docker run -d --name minio -v ${PWD}/data/minio/data:/data -p 9000:9000 -p 9001:9001 -e MINIO_ROOT_USER=minio-root-user -e MINIO_ROOT_PASSWORD=minio-root-password -e MINIO_DEFAULT_BUCKETS=paopao:public bitnami/minio:latest + +# 使用docker compose运行, 需要删除docker-compose.yaml中关于minio的注释 +docker compose up -d minio +``` + +* 修改Minio配置 +```yaml +# features中加上 MinIO +Features: + Default: ["MinIO", "Meili", "LoggerMeili", "Base", "Sqlite3", "BigCacheIndex"] +... +MinIO: # MinIO 存储配置 + AccessKey: Q3AM3UQ867SPQQA43P2F # AccessKey/SecretKey 需要登入minio管理界面手动创建,管理界面地址: http://127.0.0.1:9001 + SecretKey: zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG + Secure: False + Endpoint: 127.0.0.1:9000 # 根据部署的minio主机修改对应地址 + Bucket: paopao # 如上,需要在管理界面创建bucket并赋予外部可读写权限 + Domain: 127.0.0.1:9000 # minio外网访问的地址(如果想让外网访问,这里需要设置为外网可访问到的minio主机地址) +... +``` \ No newline at end of file diff --git a/docs/deploy/local/README.md b/docs/deploy/local/README.md new file mode 100644 index 00000000..a04b93e1 --- /dev/null +++ b/docs/deploy/local/README.md @@ -0,0 +1,4 @@ +### 本地部署文档 +本目录包含一些本地开发环境部署paopao-ce的一些帮助文档。 + +* [001-本地开发依赖环境部署](001-本地开发依赖环境部署.md '001-本地开发依赖环境部署') diff --git a/docs/deploy/tencent/README.md b/docs/deploy/tencent/README.md new file mode 100644 index 00000000..4674183d --- /dev/null +++ b/docs/deploy/tencent/README.md @@ -0,0 +1,2 @@ +### Tencent Cloud平台部署文档 +本目录包含一些腾讯云平台部署paopao-ce的一些帮助文档。 diff --git a/docs/discuss/0000-讨论样式模版.md b/docs/discuss/0000-讨论样式模版.md new file mode 100644 index 00000000..a7e50871 --- /dev/null +++ b/docs/discuss/0000-讨论样式模版.md @@ -0,0 +1,26 @@ +### <主题标题> +====== <这里写主题描述> ===== + +#### <话题标题> +====== <这里写话题描述> ===== +* [北野](https://alimy.me) - 2022/12/14 10:07 + > 这里就是你的观点论述了 + +* [北野](https://alimy.me) - 2022/12/14 10:07 + > 这里就是你的观点论述了 + +* [北野](https://alimy.me) - 2022/12/14 10:07 + > 这里就是你的观点论述了 + +* [北野](https://alimy.me) - 2022/12/14 10:07 + > 这里就是你的观点论述了 + +* [北野](https://alimy.me) - 2022/12/14 10:07 + > 这里就是你的回复 + >> 这里就是你的观点论述了 + +* [北野](https://alimy.me) - 2022/12/14 10:07 + > 你的回复 + >> 这里就是你的回复 + >>> 这里就是你的观点论述了 + diff --git a/docs/discuss/0001-FAQs.md b/docs/discuss/0001-FAQs.md new file mode 100644 index 00000000..83fb01e9 --- /dev/null +++ b/docs/discuss/0001-FAQs.md @@ -0,0 +1,19 @@ +### FAQs 常见问题 +一些常见问题的解答。 + + +#### 为什么要在代码库[docs](../../docs/)中写开发文档,比如[proposal](../proposal/)提按文档? +* [北野](https://alimy.me) - 2022/12/14 10:20 + > 这里有几个原因 + > * 开发文档跟随代码库对开发者友好; + > * paopao-ce的开发是离散组织式开发,代码寄存在GitHub,并没有一个统一的开发平台; + > * 为什么没有使用GitHub的Wiki写档?这个后续会把一些文档Copy到WiKi。 + > * 文档跟随代码,将更好的与代码共存,而且Markdown足够用于写文档,这才是最核心的,怎么简单怎么来。 + + +#### 为什么要在代码库[docs](../../docs/)中包含一个[discuss](../discuss/)?难道没有其他可用工具更好完成这种工作吗,比瑞slack/discord? +* [北野](https://alimy.me) - 2022/12/14 10:32 + > discuss目录包含一些关于代码库开发的一些方案讨论,偏静态内容,代码库内置这些方案讨论,也便于git进行跟踪归档。 + > 确实有其他一些社交类开发聊天工具可用,比如slack/discord,但是目前paopao-ce的开发者社区还比较小,暂时还没有开通的必要。 +* [北野](https://alimy.me) - 2022/12/14 10:50 + > 再一个国内访问也不是特别方便,暂时采用目前这种土办法过渡一下,或许后期会选择一个社交平台供开发者交流,比如飞书~ diff --git a/docs/discuss/README.md b/docs/discuss/README.md new file mode 100644 index 00000000..3b983ca6 --- /dev/null +++ b/docs/discuss/README.md @@ -0,0 +1,5 @@ +### Discuss 开发者交流 +本目录包含一些开发相关的问题交流论述。 + +* [0000-讨论样式模版](./0000-讨论样式模版.md "讨论样式模版") +* [0001-FAQs](./0001-FAQs.md "FAQs") diff --git a/docs/assets/rapidoc-min.js b/docs/openapi/assets/rapidoc-min.js similarity index 100% rename from docs/assets/rapidoc-min.js rename to docs/openapi/assets/rapidoc-min.js diff --git a/docs/embed.go b/docs/openapi/embed.go similarity index 61% rename from docs/embed.go rename to docs/openapi/embed.go index f3d9556b..e72721fb 100644 --- a/docs/embed.go +++ b/docs/openapi/embed.go @@ -1,7 +1,11 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + //go:build docs // +build docs -package docs +package openapi import ( "embed" diff --git a/docs/index.html b/docs/openapi/index.html similarity index 79% rename from docs/index.html rename to docs/openapi/index.html index 2fcd59c8..cec190fe 100644 --- a/docs/index.html +++ b/docs/openapi/index.html @@ -8,12 +8,12 @@ diff --git a/docs/openapi.json b/docs/openapi/openapi.json similarity index 100% rename from docs/openapi.json rename to docs/openapi/openapi.json diff --git a/docs/proposal/.assets/000-00.png b/docs/proposal/.assets/000-00.png new file mode 100644 index 00000000..43eeb839 Binary files /dev/null and b/docs/proposal/.assets/000-00.png differ diff --git a/docs/proposal/.assets/000-01.png b/docs/proposal/.assets/000-01.png new file mode 100644 index 00000000..62a107a8 Binary files /dev/null and b/docs/proposal/.assets/000-01.png differ diff --git a/docs/proposal/.assets/001-01.drawio b/docs/proposal/.assets/001-01.drawio new file mode 100644 index 00000000..e3bd7cc0 --- /dev/null +++ b/docs/proposal/.assets/001-01.drawio @@ -0,0 +1 @@ +7V1rc+I4Fv01fEzKevj1MaQzs1vVvd1b2arpmW8GHOJtglnjdJL59SuDZawrGYTxQ26c6qrGxjZw79HR1dGV7oTcv7z/ngSb5y/xIlxNsLV4n5BPE4yRSyn7LzvzsT/jk/zEMokW+UWHE4/R32F+0srPvkaLcCtcmMbxKo024sl5vF6H81Q4FyRJ/CZe9hSvxE/dBMtQOvE4D1by2T+iRfq8P+th93D+H2G0fOafjBx//85LwC/Of8n2OVjEb6VT5GFC7pM4TvevXt7vw1VmPG6X/X2/VbxbfLEkXKc6N0Tf//rvNEbTP5LHT/aN/Z+3zQzdYC//IT+D1Wv+k/Ovm35wGyTx63oRZo+xJmT69hyl4eMmmGfvvjGvs3PP6cuKHSH2sviZ2bXLVbDd5q+3P8J0/pwfPMXrNHd2ZonpMgkWEfsh9/EqTtjJdbwOs8ui1Qqc2qZJ/CMEJ2Vb5Ob5GSZp+F46ldvm9zB+CdPkg12Sv0tyN+U4tfPDt4PTkU3zk88lj7v8yiBH2rJ49MEZ7EXuj7N843XuG6Twze44/8Ts/cymEWshd6touWbn0jj7mCA/WoVPaTMeQVh0iSO7xPYVHnH89jziSx7ZBDH7d8MszvwSJj+jOaOri7xUtj8C9rcU9p/FaRq/QI+WXS24twHPYJcKniGW7Bqscg2yWnMN/7iSa/4IZx23F+R0Z+DClmUDk/bsiyT77gz3faAmpg4wMenfxFgy8d3iJVr/KhY2AMREsvCXeBYxuw7TxMRAnqCSiacsxB2mfSUeNoAkbMm+t7u/gZpYgrABJnYkE0vGZfbaZC9fX1Z38zQbixRx2edgFq6+xdsojWIhPlMHziUnxK/pKlqzwQ0fy2YOEN14fgjfVMxHfMFPSEE1RBWNt+cmjaHr9bmJAjeh3t2kMYq9PjfZwE24dzfJQ9vRTYRzjCmkVwR4o5vKIw0LuKlv0iOWPFoe3UQRcFPfpEcsecQ9usm2kWmkJw/bRzfZDnBT/6QnD/1HN9muOIthAOnJCoLkJvacaLMNT+sGwXazN/lT9J4Z2xSzE9DXFLqJICvIZkftmV1DVRi82SmYsyvkwP7MrqESDN7sNvJNM7vGqH/wZseOaHZCZW7v2Owao/jBm922XcPMjjRG5Qez8xhovopfF6fdYIjVPZHZiSKOcRRGby09hiB5jP2vMH2Lkx/G2H43SVLO33AacITrgD4WK8geK1zhOq254oxxNIvUfxwzsjZ0w4WQuifbSzWDlISrII1+hsKTVAbJH/ctjtjHlmZBsGB7xPPn+CO28WsyD/O7DmaVH8Rl8aoHpUGyDFPpQXdJEnyULttkF2yrv3DREYPPqfxe7tHr2Yv9NziApTD4Jfg5Y4A/aPwQHx13uy5+KOgD28IPddSfU/m9yNHr28LPGcrDoPFj04b4x6nghabx46Dz+Mf2euGfa5BEMBQMvb4HiegqJBEwNjfA7FchibgQ7X0LgEhHElkv7rJVK5NiaYN2P8VMlXx8z968tfnhn/mdu4NP7/md+6MPfvQepaXb2NGfpXcON2UH/J5K/+y7n2NW4Orzvn/RIeVz+ln7yAj00tANDICpB5CiHbqBpSYUZrJVdL3N9XaySKRKlc/svpuTAQ0+n4WZM9+H5fkbPj3zEi0W2TOmSbiN/g5mxcKFPFZgD7enE/uTYqgs4+pEU4J0UCwEyz92Ul5rpaIJ6xYVS9LqAoRfEj89bcN2XIZ1BKYeuaPEHKg15nC0mcMZmaMdGMqSW/T1MQvK14skZvcOiEOKJtUAh2Aw6r0ZAKPgjhilXizilBjlhpE0i1mP0Up28C1MImaWDE8XUk2xEkeDatyRatrBpywJ/jMji3WQ3ateF2Uy2/Dm1gDbWD62RbpB5tONrNB9CthvDtgYE//2dZp1Io9hkLAhIfRqB+tY1BlGK5CQJOEHZiwVOAKLocUV1JePbRER/U9VS6NVk3EY0kFzo1usktCcVfbzt5tgLbjU+d9rzO1ys9354Y5dgOjmfdek+Pvs1XL3/wOdTL3JdMqfyL7i/qH5+/npWXLRx3z5ePz3Zwl+xYzhxypiOEzIaRDO9oj9PCtOBPMfyx2Ov+5T1ThacwzaEkhEjFII4AZAhIFAYvOc5RKIPKVA0h6GZD1wxwymeqTNNfbI9oxzj6wb3gfzZ3nxrDEOatgnMLqyFWsVu/aJLCrybtR6WC8zu12LdyiP2g1qMbLSVrFYtw+nEDBua4PGbJ6JaE6TIQotLQswphPvIXs0DDbGqOKcbgv42zHA34q1WKO/m+oSQUKUCf5WKFsP9uSOTrJcgtHHF3esJvhYI2GsnnqJuPJ47pyoSoIszasgqj2zckNvSXFxc6pm0fGdVjWxWVOvFIl6hw3FSG1V0wHCCdRD2lY1iSyDGY5bz+4ft3zjz6HhFlMiEmddNR57/q3tl/7Ex1Ln1rGt4g98z9YxrZM8dzmmURnRBb7rYLqM59KEd9WclArNi2D7vPvGR7vYJimZNwJjoA3ifFoX2r51DNpWv9DWSVBsgK6bgjZqANqXoBkPFM3EE+OC2mgm1L2lloRXQ9As67el3WsBrFveWLhoDuVxTGm35wkmiyD0nuYTuOUze8eZe+HsqSHB4vQuw8rFVK1tP0dIe3miYo4FPiNIPASE+KwMsQvYhE8Zn2STYltmQ9iEUhFS1K07XPHBg3DXwxXVcuK9ghLBydcMZxeJKrupvmJ+d/848SPY6dLHwiZhbvIHaTBd1XLFMYX5mWa8NbTOZ7XobGSzU5E+iI1qsxmxnVvwKLjYom0+o/JUgErI7ZhKKIiFsC6vFC2riRRWh4jEgs0nFtwRsbi1mMUdqeVUoIQbohaKRdmge2KR5yMqshl74BZtOuHtqZFVNWBf70tzVMFjuqCX9rR6KtALKie7s4jkfAFoP0LmBarwZXSCzNJmpNFUXREd7sRHqN0xSbQnlIuA8sQO6xJF8YaNODCQFanTsa7I2Xx4HVxT2JWUgK6XY1CVEl6hBLzWlgZQhTTw8F6s/Lhnt4S7LSdOSQXS1zBJPlBz9AneuLhfzlZS8TmNC6HdYT/cfYlCqFb3WQbP5z+3WqDuuAweobJCfY1l8JDFd1TjEUX/dfAIlSXb4dbB07Jwt9WBCA8NfokCVwg7wMC9l18itizSDbkMnmxiAzAsK2eDroOHkIE8oZCEhlwwU+ZiA6hClmgGXQxPxrEBNtZQLa6uqgOy+FTSB3BKb2Ud7LFqocpPsJhN71VS7LFsocpPcHPK3suk2GPdQlUHBRJ0DeA9jZIH1+cnbAE/9c57jjxuHv2EMNwdtnfec+Th9+gnVAznjOE9Rx7Dj35CxAF+6p/3xuKFKj+52DTe00n3GPqu2AhJlcL63hbbuYa991GRT1nYve9d4J1r2HwfFVvWmmP3a9h9H1lgd7n+a7Q511CREBXDYXPsfsb4fNC1eZBFxJTX2sV5UPGVqp7UUHUeVITH4IMqv5nlHb1h0k59HvcM7WDYGEI+Oe55bQxhwAStYQhWQT2JIUyO3tAWhs7QNYaNIUKb4iFaQQ+NYwjWjT6JIeL3wkMamsvwYwgLaii9V6xydbb7GrzdMRirGGD3q9BEiAvx3rcm4ra2UuSwlqPG8ueOS4VxRe70djKclw1Z9oGQhwVE1V73gWDB4c4XfriyTDSwYmFuY8snBlIszNVRmH7xYmGOdplBTv4jdzQPRFlyG2y5sKJRXWe5MFdDxbvWcmHFigUNsqEj2bRENp6sEQ65YFjR4K60YJgny3VjwbDaa0hBh2NCwTDOPK0UDOPb/B+rIDZTrA9voaoYc3e6TEJTCgaA3redIiBwkzoDSvF4soR4tbXFfMcyzj2y0nhdtcWkUMyASkmeLENea3ExhGEhKwPajCzNXVl1MUR8cb2kCY1Gpb6pwpGq+lOq0GSMQc7u4wAyDCha5Cky0OoWInvLv3LmdmpZR6Pg4+G0zpPK+KmIlQ2AVTfdNEjyMgFXCm3unIJnI5YMiSkMwJIvq2iSP8wqUGVAYTXe5Z/Wf3mMb4r+i5EoDNWurIawAySmrkur+Rr5fWYh14DSajwkGR5yLQpK9tSeubB8dAtixX4LqvFym2NBtVap2DMN0BCE9QGNIaD7LTzld1SttSlAowYAfQmG/aFiuMgPvxjDiPq3IDjuGcOyQG1y8bQQLewwS4KQiqf5jkuCrNksk2ARMXTy9/JmVwncRres7bimmt9eQq2YiGJ4TTU+q36aWqhh1IKpiKnatULYqBs8qeuqav4Ze6mPVdVOt+mrrKrmt5fkWzfVv4eqasPlMwuESvX5DNle33XVfHlmY8h11fwmc32HV1fNV8wntEIthtdVGy65YNwUuWBeqbsnaqGWPCExvMpqRYsaK6vtfKqS6osAWCPYxSfyPodZgciMWnL1CZNahi2lomAbFanimzYNwu3quq4dRy3cVp88hNpxrdQ3HF63zogPRPqXIFpsG12v1ynIQm9vgSIHZBW/Lk5rqqZsLUBhPQfFNpeqdRd2W0ootTS2dKixDQ5gkTKHHF/jW2/lX1PThZb2VAtPb+hjRx8P7I5DITx0W71/6kGtN3qVDl8Rs5WTYIOX3fqq7OjxYz0XojBrmpmd19axviVxGs/jVXEXjMBU635eTRFAzxhVHJpyE3UhLWyJXYvxOgW1dHYwPcRE84z4o/nRjkKIM1Q5gJWTNuXjRuaJT1MSH4obEp6AWrcEJilq12mGRXM7j0zOk9abxhUBIbM3wqqMhrqwQhYMnYtgujNg6WxB2x6wkCMCyx4JSwSEVxdZ3q3tl/7A1sdQfG0dZufp9xfDDGwK5Hn99ovGyVC201DPiBzUc9fIP78vaLkg5hqh1ZTCaRPv1jtk13G9sb/OEqkmCTqEWq9BmPlAg9Xl9YFGjwLN7h5oWAE0WYI4ax4JV81QZW9OHtzJ3XSSTQqemkGaVeoSbMSftidJBK9pzJfGTWASaT65UM445adAe6psAPoSKgEbzruKZFJXAXyYedycgopUwnVbeJmOeDkPLwh5TleAYYdJnLnrwEdJsHn+Ei8yufDh/w== \ No newline at end of file diff --git a/docs/proposal/.assets/001-01.png b/docs/proposal/.assets/001-01.png new file mode 100644 index 00000000..35fc33a3 Binary files /dev/null and b/docs/proposal/.assets/001-01.png differ diff --git a/docs/proposal/.assets/001-02.drawio b/docs/proposal/.assets/001-02.drawio new file mode 100644 index 00000000..e87a4da3 --- /dev/null +++ b/docs/proposal/.assets/001-02.drawio @@ -0,0 +1 @@ +7Ztbc6M2FIB/jWbah2SQhAA/+rbdmaZNut6Zbh4xyDYNRh4ir+3++kpGYJDkeNPgS2s7mQQdXYDznSN0DjLA/fn6lzxczH5jMU0BcuI1wAOAEPRdV/yTkk0h6WAlmOZJrBrtBKPkb6qEjpIuk5i+NhpyxlKeLJrCiGUZjXhDFuY5WzWbTVjaPOsinFJDMIrC1JT+mcR8VkgD5O/kn2kynZVnhl6nqJmHZWN1J6+zMGarmggPAe7njPHiaL7u01Qqr9RL0e/TntrqwnKa8R/p8OUJr1d3vz4/Pj0PvqGHh8Fw9eWuo2h8D9OlumN1tXxTqiBnyyymchQH4N5qlnA6WoSRrF0J6EI24/NUlKA4fH2hPJqptpMkTUdqoHDJmRSxjCvK0FNN+ixluRBkLKNyCJ6zF6oJ1WXSnNP1XgXASq3CHimbU55vRJOyA1RolCkiR5FZ7cCSjpLNalCJr4ShMqZpNfZO3+JAqfw96ieG+hchE793Qr0f4lDTM3LKshqrwQlqEADCFMaE+gYJUdPxfBx6drItEMLEbRByPWgQgshCyD0aIM/0jyEBAQE9DIa+/NvrgaEHBMmeIw+CAegOZZteF3RwS84ELZ4jNZ2IiaqbJtNMCDlbaJyJKIeqNqUT3pIb4aYbkcCERIgFEjyeG/kGpdEfD4buxQy8kIfRJk0EhBwfJjAucD2MK0EYvUy3EB+XXAxT+ZMiQzRSwV5SJlx1pagNSKQJyUMWT8IWSJ2jMQoMRr+HPPne3jwHkaHIt+e5OKTBJLLNc14U0PFEm+deWSrvsBUfCjQ8pXZqeHwLHUSORadz8yDtWeSigx6ET+pBsFyv1CAJhWyW2flcaDKZoMjqQrE39oi+VGjRhbAPL8uFoAMNPF9pFsn7ucIpzi3XZJfDBxl8Pi/DFU3O6D5BRO3uMw6IS/QYqkU8BF4cHmzgud9+2sPjaXjwITxE/qhONXnxsXrV9rMHm/4UmydxnLYU3Far8MvhaUktiLCo+wn0OmAYgB4EXbiVDIC4WBlVIdANPkb7PxExIctS4sQRE3TMzMNjb3TNCz49ZEL+uUMm6JjZh1vMVPLB7tlnODPt8Dga/fQ4/ktmopEz4iyX6WVxtHnldP7zNbuXHk/Z3OvU8ZSZkjhLPKU7y/tjrDb4aPHUBbiXmZO4xVMXxAea6YhbPHVBeMx0xMnjqb0Rz3EDrTZ4BhfH00xfbF88OaDT376KckF3G2H1+vJtlKzCIBh+jPZFxlNEe5HrQstK3QYHHu09IYRm9mILpS8pVEHu/4+FHttaWXgnZmFmHkY0zIXukDPMpnKJfMULcaItxF0X3xOT2WmX4tBMR5wl0j2wFP+B5V8bhPwmITHfWQid+OljpiL6YTS7ak+CRPckdAGeZCYlrjlnpHtScH5PMrMOBhqaxV25eRFU+99qKJrc9I1eQjP55pusvCdl8Vn13BYGa9WzKG3K0jrhtW6i9Fyr2XWShbJPcd00NrZQanzEvbFlHtE31FLuhONhPqX8Lf0V7xVM5PVkum0Tn5LlNC3coX55NsrqDE8skQmHKgzX1juepw1R3KnqtbMVcyB9CwjUBio0YQy0Nbrqtj9ih2Z65WaH1Ya/g3ZYGOzNDD9qhsjMIrVqhsqcYN2YKtOym9POdOuGW7PjPabbohlW8eTNDk9lh2a67DjT4fts6t/Y71key0V66maHe+1QFHdf9iia774yg4f/AA== \ No newline at end of file diff --git a/docs/proposal/.assets/001-02.png b/docs/proposal/.assets/001-02.png new file mode 100644 index 00000000..488c0a4e Binary files /dev/null and b/docs/proposal/.assets/001-02.png differ diff --git a/docs/proposal/.assets/001-03.drawio b/docs/proposal/.assets/001-03.drawio new file mode 100644 index 00000000..a28d892b --- /dev/null +++ b/docs/proposal/.assets/001-03.drawio @@ -0,0 +1 @@ +7Vxdc5s4FP01zOw+JAMS4uPRjp3tzrZNd/LQ7dOObGSbDQYX48Tur18JJBAI2ySBGCdOOwm6ErK45+j66iDQ4M1y+0eMV4svkUcCDejeVoMjDQADIUD/MMsus7jQzAzz2Pd4o8Jw7/8i3Khz68b3yLrUMImiIPFXZeM0CkMyTUo2HMfRU7nZLArKn7rCc6IY7qc4UK3ffS9ZZFYH2IX9E/HnC/HJhuVmNUssGvMrWS+wFz1JJjjW4E0cRUl2tNzekIA5T/glO+92T20+sJiESZMTfv5aPPl/TR7n/66mzv1/Xx6/bu+uLD64Rxxs+BXz0SY74YI42oQeYb3oGhw+LfyE3K/wlNU+UdCpbZEsA1oy6GGAJyQY4unDPD3tJgqimFaFUUjbD9cPJJkueE/rJI4ecq+yk2dRmHAKGBYr+0FQ7SE9qWLk10DihGz3esfIfU7JSqIlSeIdbZIzlXuC89TkxacCdCRsCwlwSxAVc6LN864LLOgBh+M50BgKNN/iaLt7HT6Si4EuyrwvJCNkVPyvAegh4nimAgKtccAEWgIx0R3eJBE1MVh8OqEGgT8PqTmJ2JAwL00pPiRuB0Mg5h7HEECggAj1GhDtzjAECoYrHNH/VxSeznA0juBIDIqkXYeja9kQ78GxjUnmlgGCDlQAMkANQGZnAMELQBJAEPUOIFMB6Dr9+YDoIL136KDj6QMJvQFLxIqvawmHMmhk6yf/sONrxEs/pJrRVi7sRCGkF5KdBJAo/+Ddp4XivLQkTswGSjwl/6vAQS8m2sRT0iDMJziek+Tod7oKsJxl1OAnbDEJcOI/lgdcByr/hG+RTy+lmN1uOcdBeoUX2YXys+RUstKRaVaSJVTpKHOE0lHKsfyyX0E7q0+0Oxnr4IV1b8o6u0+ss09GO/NCuzelnaPQboQTPMFrmqHe3g3v6e97gmOaroDbGzxddJi4HlshzmbEmk7rUiPPdie6fvIVom6WSQHUDMqEhkpKt7MMylXQvf/7s4LgeoFX7HC6C3wKZQyP4zjJQP88yQ25KnO3SWg3ea7LFRcF3DYcDsopK3JUXcWqk1W68rdY6kv+TqeQFSTs8lc4LDne+rlh+txwmjF5wOLSfIJ/o73Qz9crf35PnaazGXM1w0s/2GWnLKMwWmdA5fWZ11mtvtpmdurm5IrTfpAOA8dJWiWGQY/m2V9U1VwRdQKzpoJiXhJOQalbqGXEjtkaATE3IOrLY22NvK3A/UXdgKKbzPd5Tcp3UZe5Pq/LeM+KBfNpSeY+q0zZz+wp/5nFSIvSHJCMyjwo6lJU0iLKytl8KBpIV5HNiyZ+yqtyFxUzBbG5UnhJ8qm+K+zIluzZ3MnrLKmKz6HaOjqXcvtc+vwqgGkxR1E2lrnF2ykkzKYSnZ3ZbBKMfScRDRp6zyKaqhPXZwFn63EX9MzjqqorEjB9HM7TiPJOfG8KdvXG96pgu0cPPFeXI9Q3l6sSrOLs56x7X6icFOtl0HzBrLW47uXrsOPrXlCP74nWvdUblC9e91YJ1vG6125ZW3417XrOOnhhXRusa1lafjXr7J7TzrzQrg3aqdryV5pIbhXuPUvKa13NcZySl4DIhCW03Rq0YWepiaqNfhq0sEumrHFKAqjeghehiDG98aKqQbZxj32vE40WnGhaPXOiyNIPfXGIJclmGQymCRMUc+37M9s39y1a+4kfMdV7EiVJtNwrjktujrKVyU2+AVJXvoXyrYesMA/wei0qFIi48N9WwIBlvd1SlzLwLZcyjqqVXECiX34lkOxTg6TKKxeQACqDVCMKvC1Iqg5zAamqVJ483DVQbj4cSKZeBunk4a6BzvHxQDLKIJ083DWQBT4cSMgs5+AnD3cNNmh9PJBQGaSThzt1yX4BCYmN1H0Jd6oisBck6tSHQxJovbuOq5QHNUVD7OZ7pYAIxIN83PGGaZe7aCogAhce7miPgDiIY7yTmq1Yg/X+AUO9/nP2jss+2J4eZCNoVc10n6GFnDV9oGMdRr2x/iyek+2YPqZV/zl7xwUPtu+IPs9Qac6aPgi2FH2sPVGhbfpYxvOiD3JOEX0a6Ee0G3+1JsdFbLxeZdnCzN8yUvUlYwCoGnn4Wr9EU01JGTp7XNltIAidvddNw+yZ15vszTl3ryOrynV0Yq9ftqZILyg4ukfA7dXWFOX5nRfvEag+UdTxHgG3ToM68txC5VEDw+LPGlQfKPDv2GNEg9CLI7Zpv9kWbsaidD1eCSPVB3eqS/Ol73msj2FM6NDwhN9Zh0OeftDO0VBDo0PRg7/vhZ+s5W9ZkYl8YO7ujTX6tY7cyq3l19FQNIlmszXphhgtP5h4rhs0G8cjcIlHbdCuTslrKR59J5P3HYXsI1HIMPXy2vAKtsK+q8oZHUalBhriR9hJ2Tgq9Won5dlGpVyb6SIs/cliSYjZIAbe0g/fd4xyj8UoB5h9z40MvYGYmD3ZU/NCurrdjMz9Hl4v0sjU0grXcN3r8h0gKO73yE+m172ArrNFriH2SfTcc+WvSbPm/uZb+62BEtYDv1UZB/TTe65GzRrbGv1mHDja2NIcRxvaii/78X5K9vYLxP7lZ0o1Vvqjqe8ZY2WpXfbTGsIlfI2am8ri6U4ZXhHTO4C3RjYbI8251ZwRO6ApiGtoY1MbDrUBTJHXNXGHrY+AN3khZsv73pVXKBonR7VGlhq7mgPTSWtrw5E2THEejDV3nMI71hw1R+oNqk3e79c6quVYnGffp0O1RlOiEZiOc6inoXjE8GSojjTXSacxYID3FtXZbAb2vJrImljoTVC11btFLaGq8ZdzSLlz8VoOOP4f \ No newline at end of file diff --git a/docs/proposal/.assets/001-03.png b/docs/proposal/.assets/001-03.png new file mode 100644 index 00000000..7626ab79 Binary files /dev/null and b/docs/proposal/.assets/001-03.png differ diff --git a/docs/proposal/.assets/002-01.png b/docs/proposal/.assets/002-01.png new file mode 100644 index 00000000..c02c979d Binary files /dev/null and b/docs/proposal/.assets/002-01.png differ diff --git a/docs/proposal/.assets/002-02.png b/docs/proposal/.assets/002-02.png new file mode 100644 index 00000000..9c18a943 Binary files /dev/null and b/docs/proposal/.assets/002-02.png differ diff --git a/docs/proposal/.assets/002-07.png b/docs/proposal/.assets/002-07.png new file mode 100644 index 00000000..bebcfbb3 Binary files /dev/null and b/docs/proposal/.assets/002-07.png differ diff --git a/docs/proposal/.assets/002-08.png b/docs/proposal/.assets/002-08.png new file mode 100644 index 00000000..d45dce84 Binary files /dev/null and b/docs/proposal/.assets/002-08.png differ diff --git a/docs/proposal/.assets/006-01.drawio b/docs/proposal/.assets/006-01.drawio new file mode 100644 index 00000000..898d599f --- /dev/null +++ b/docs/proposal/.assets/006-01.drawio @@ -0,0 +1 @@ +7V1de6I4GP01XE4fkhA+LrV1di46z3an8+zuXO2DEJUdKi7gtJ1fv0EIQoI1Uj7iaG8qUVHec0jynvckauj26eW32N2sPkc+CTWo+y8autMgBBhD+i9rec1bHGTkDcs48IsX7Rseg5+kaNSL1m3gk6T2wjSKwjTY1Bu9aL0mXlprc+M4eq6/bBGF9U/duEsiNDx6bii2/hX46SpvtaG1b/9EguWKfTIwnfyZJ5e9uLiSZOX60XOlCc00dBtHUZo/enq5JWEWPBaX/H0fDzxbfrGYrFOZN3y6/4b++fjzT2/6w8Tb1dTx/l19gFZxIT/ccFtccvF101cWgzjarn2SnUbX0PR5FaTkceN62bPPFHXatkqfQnoE6MMkjaPv5DYKo5i2rKM1KRtZALOXLaJ1WqANjOKYvUmDSN/9Ze1BGHInW8auH5D9y4vm4jpInJKXgyECZeApY0n0RNL4lb6keINVQPXKwCyOn/fIW3rRtqqgXja6BduW5an3gNAHBSYn4WML+HwO4vdBtIt98V5Ej7OYBZTykzBYrmlbGm04hGwRIccpEOog7gDatcAjJAYeWkAMPMD9Bd45fmMcibObbPIuaRG8ZNh0EirDqYcKIiFUADdFqq9A2bqSgUImUi1QQAjUI4l/uOs06e5+5vpWqL/Rt3ZBR7NOR0NvuHObu8zewgyV5CPUuRvXwSIfGwIF+gsUUjJQSDdUC5RxPFBk7U+y6SY98kI3SQKvHqn6DU1DEb/+nR3cYHb4rfrc3Uvt6JUdvQTp35XH3/anoEf7N2UH7D35VyW+MM/lAKGXE21jj7wVCaeIROrGS5IeHz5FkCsg4gYQWVtMQjcNftS/chOyxSc8RAG9mP3Nxo2S0OTIkV9q8a7qpJk7ET/cCifKIyGcaEe08rLfwz3cOfcYh0refKvSppFDJV9Bja178h7ga5fcY/OM49zLWToW9xCqUwbzyYEs96A9NvfMYbgH5Lh3Yl/ZJfdYMnCce/ns4+y5hzjuGXyi1Tv3JHSJAfs9jntgyH4PSXNP167c64J7ouYyDdZ+sF4KFKTT3FRC/2pQsdxCbPEoI0jcoMI8Bb6ffUxj9len9hsJ4E5c07pI9LhZOSyOK+QyG8iF+puViwLNF9oj0FheLEhI5zWPsUFyRHHowY3dJ1HxUA8kqwNEgMNl/aaYzA6MiKhCfSHJNkwvBBFoKoeIKFh9If9tSSIDiXyoY5IEP9357lRZYDfZ+Lm7GDzV8F12rm0aJUWPdALadYTqHRvuqkDApUIsGayAZg8Lmiie0dtoE60TckWNDUfAOIoaaBKHe4RNRsoLw2CTHOqd3lI/e4ghxMYNrkfREqMIG4II+wviaZpUQbiDiRkftTaJWr3ADLOWlbvJThkG6++9qKDK5FlttU1ocsTiE7a+8yxH1Jc+ff36IHKJonbvzknYXyda5aCpiSXyk4vfhR+l+FCtvBurhHvr7jrYIeg3wORKSR9gJ8T6UE8e+HpKtFgkpCciiGLP8svDrUCE83Y5GHzpXgGXgyNKHULUR6gBGpwTZ/zivSOqDSoEyrR5WWbkQCFdzPgzlwOJz9fkYDh1No5vckC6mMWrQEeMuPt27No90sXkWoVAmRCrFigJN8hFmBwQkC645KPnWIkA5gbJ1iYHfrQdutBcOn4UKfaNaHJg04yj3CtYOhb3TLNOmdbFPhOMzb2BDDbqmxxYLnCce/qBwe3MuGdx3Bu60Iz0gQw2ypscymmaxJg7qrHwF+KeqLncES/yZcoXY9cBeyqfGzY3KR+7fI50UZ6ZrS8bJBPyisfoIInS0EV5HDCsd2WjV9QR61sv1eOAHeUQaXKdXD0OtdEHc5nQ2B4HBETt7Opx4IcjhI+iNqzHodSvzsbjgC2smsehtK5cqMdBNXmprbSJ2RqWkTwOCIjy0tXjUNxdl+RxQEDUes5/9bdV77YNXaw+D1wYBaKscf7lZ1O5KKtpG1FujT0CatpGlFtjj6CYsqsQKPUMDVDMpFUIlHqGBhaXtwLFJtBeHCXJ3I2PjwP7QSM78t1kVR7Us1KfLNxMcZIfKuS3uhIzgQ4QtLi+E4ujjNmkP/SXg0GJRPaK4EEEMasejIigRBZ9RfAggqBBTBoaQRl7RCkmMSz9aEuTwllrkekQjGLQuwe2AxgNUB8MSwP3aHIWPM1pcEzOao9DG3NfxaAALVM7yZy1O3ogcUADmQkonTsX2A1y3DUDx102xNWEMC9Ayy8b4uoUQ0tq8LStQfrnMmjHZQtfqdyKygaXlIHWVLbwDU3R93/cetXBmS0hq/wy06XkO0m9FbsJ2ebIHWlm3ETKNMafSEkoQe/YaPnQHOkUrbKK5v58/U2TxLXNGIlmHgTMm4YVTHZvSCEJKerSkDIFpAwVkBK1sDs3deduZlD4+JhGcba7O/x463or+l+/j5aB985CQCswm5aWtgOzXofoAFlLQBargKyEeDcAbKZC9yBA9TKQ6YhjGm5ydYH+NFYkKnSPf9wfnrO8hkG2Qxc6jtc8B/d+Xja43vflDvLftyk9DWHAVlwVrWQDaZB7lw3K+WaBsKXLWVt7vA1F/a7oS68It0EYqYewqO/9Pn284tsSXwerhm+T7YTewho0d4GdxzWgzf+2EUsAP+TATOgLgLl52UWIPU8fLbP/s/UyA/JKl1Z0MWz7RjnCiOraze7vvEDuSLaoe+TejzhmPwKiDt4SmtMwamrLZYhtrLRah6opS1WOq6Zo1GWzpcWG5Xk8p6T3Z+a2CxAqCX3LpEhCShuasrAlZ+GVtJdBWkNCVRyatFZL0lpX0l4IaSXMhmcyORirowWynM0XCFw5+27OSkjHZ8LZsfpZec5aV852wtnTNl8bwJ41UjIFD2x+OxKh+MqJ9I5qnBtecKj0TihRuJ+tmV5wHuu2ZcS6jtUZ5MAbbkkb0MfeOsFocODOTM2eaROszbBm4+LBFGi22G38MgB3Ue3m1DfAfgyl9gPfg4Lb4MudGdrU1pzJDtyJNgHazNHo0DadajNbm840+q0vAW56FVEc/KRtLruWMFsh/UC/QhpEjdd0z72gvLYuyMPt2MV+gGq8nR6MBics7RocSg5910fcaZPZhbKnc7wxGB/vBq2+AW86INxpjr3rP6A2sa8wnwCzicUxwRkWZQl5Oy+VNbiX/CAmXtH50dlq1l7FeVOxj2e1tzmNfcVS3oBmlNflbvO9HrRqgvGmb1ja8jbAahyLn9WVy06PrE7tcQk9S1mqmyvNHr8utqFKtysFzfRsMl9woNF23yX2wuNAN/qYlRvCrLwJv2H3xsKiMtr4kyXjYmfDOTLNBuwwsX1jAOwMiI4C11E6RQ/jKDOn7BPp2N2sPkd+tqnO7H8= \ No newline at end of file diff --git a/docs/proposal/.assets/006-01.png b/docs/proposal/.assets/006-01.png new file mode 100644 index 00000000..7a717383 Binary files /dev/null and b/docs/proposal/.assets/006-01.png differ diff --git a/docs/proposal/.assets/README.md b/docs/proposal/.assets/README.md new file mode 100644 index 00000000..0f598677 --- /dev/null +++ b/docs/proposal/.assets/README.md @@ -0,0 +1 @@ +### 图片等资源目录 diff --git a/docs/proposal/.proposal.md b/docs/proposal/.proposal.md new file mode 100644 index 00000000..10a33c29 --- /dev/null +++ b/docs/proposal/.proposal.md @@ -0,0 +1,26 @@ +| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 | +| ----- | ----- | ----- | ----- | ----- | ----- | +| 000 | 北野 | 2022-11-04 |2022-11-04 | v1.0| 提议 | + +## <我是标题> + ---- 这里写简要介绍 ---- + +## 场景 + + ---- 这里描述在什么使用场景下会需要本提按 ---- + +## 需求 + + ---- 这里表述具体需求,在上面描述的场景下,我们需要获得的具体状态 ---- + +## 方案 + + ---- 这里提出可能的解决方案 ---- + +## 疑问 + + ---- 这里描述上述内容中的疑问,比如方案落地将会遇到的坑,其他方案与本文档的比较 ---- + +## 更新记录 +#### v1.0(2022-11-04) - 北野 +* 初始文档 \ No newline at end of file diff --git a/docs/proposal/001-关于paopao-ce的设计定位.md b/docs/proposal/001-关于paopao-ce的设计定位.md new file mode 100644 index 00000000..005feb0d --- /dev/null +++ b/docs/proposal/001-关于paopao-ce的设计定位.md @@ -0,0 +1,80 @@ +| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 | +| ----- | ----- | ----- | ----- | ----- | ----- | +| 001| 北野 | 2022-11-04 | 2023-01-13 | v1.1 | 提议 | + +## 概述 +paopao-ce是一个清新文艺的微社区,提供类似Twiter/微博的推文分享服务。paopao-ce的运营形态有点类似WordPress,只不过WordPress是使用PHP语言开发的博客平台,提供的是博客服务,而paopao-ce提供的是类似Twitter的推文分享服务。paopao-ce 让 **个人或小组织** 可以快速、方便的部署一个提供**推文分享服务**的小站点,在有限范围内形成一个友善的社交小圈子微社区。 +![](.assets/001-01.png) + +## 从运维角度思考 + +| 实例部署 | 站点部署 | +| ----- | ----- | +| ![](.assets/001-02.png)| ![](.assets/001-03.png) | + +部署paopao-ce实例 数据存储需要使用 关系数据库、对象存储、搜索引擎、缓存;paopao-ce支持多实例部署,具体文档请参考[deploy](../deploy/)。 +#### 关系数据库 +* 本地(Native) - 部署 MySQL/PostgreSQL或者paopao-ce内嵌Sqlite3数据库 + MySQL/PostgreSQL 可以采用 一主多从+备、一主+备、多主+备 的模式部署,具体部署方式由运维者决定,paopao-ce本身不关心 关系数据库 的部署方式,仅仅使用标准的方式连接关系数据库使用其数据存储服务。 +* 云关系数据库 - 部署 云关系数据库 + 阿里云、腾讯云、华为云都提供云关系数据库服务,如何开启服务请参考相应文档进行部署。paopao-ce采用标准方式连接其相应的数据库使用数据存储服务。 + +#### 对象存储 +paopao-ce使用对象存储服务存储 图片/视频/附件 等推文资源。 + +* 本地(Native) - 部署OBS(Object Blob Storage System) + 目前开发环境可以使用`localoss`功能提供简单的OBS服务, 也可以自行部署[MinIO](https://github.com/minio/minio)来提供对象存储服务。 +* 云对象存储服务 + 阿里云、腾讯云、华为云都提供云对象存储服务,如何开启服务请参考相应文档进行部署。 + +#### 搜索引擎 +paopao-ce目前支持 使用[Zinc](https://github.com/zinclabs/zinc) /[Meilisearch](https://github.com/meilisearch/meilisearch) 提供推文搜索服务,搜索引擎实例的部署请参考相应官方文档。 + +#### 缓存 +paopao-ce目前支持Redis作为缓存存储引擎提供缓存服务,请参考Redis官方文档进行实例部署。 + +## 从代码实现角度思考 +paopao-ce在代码实现上采用 **单体架构模式、分层设计、功能模块化**,架构设计上可能略显保守,但是在使用新技术上却非常积极,比如搜索引擎就采用了近来新星[Zinc](https://github.com/zinclabs/zinc) /[Meilisearch](https://github.com/meilisearch/meilisearch),同时也不排斥各种云端服务,包括阿里云、腾讯云、华为云的对象存储服务、关系数据库服务等。paopao-ce始终秉持着 **包容并蓄、能用就上、去繁就简** 的架构思维,努力打造一个能 **稳定运行、代码清晰、功能可扩展** 的开源项目。 +![](.assets/006-01.png) + +## 从技术探索角度思考 +IT世界是非常激动人心的,新技术层出不穷,在各自领域大展身手、大放异彩。作为开发者的我们首要目标当然是以产品为核心,不断的优化服务体验,也不吝啬于新技术的采用以达到更好的产品服务质量。新技术或者某种技术本身,是需要一个环境来支撑其运行、演进,脱离实际环境的技术演进,犹如纸上谈兵,实际效果是存疑的。开发者在研究一项(新)技术时,首先当然是知其然,了解其功能特性、适用场景;再而知其所以然,深入了解其设计原理、知悉其存在的局限等;进而知其不以为然,通过实践,找到技术的最适合场景、知悉其不适合的场景,或与其他技术配合使用,扬长避短,发挥各自的最佳效力以解决具体的事务。这些都是技术探索的通用流程,可以看出,一项技术的探索从陌生到一知半解再到了如指掌,需要一个漫长的过程以及一个技术探索的环境。有些技术的探索,确实需要一个具体的环境,才能更好的研究与实践,比如OBS、Search、Recommended discovery亦或各种云服务的使用、k8s的服务部署等,都需要一个具体的环境来进行技术探索。可以说以需求驱动的技术探索,也更能推进技术本身的不断演进。 +说这么多,这就引出了本节所要说的一个观点了,paopao-ce不仅仅是作为一个提供推文分享服务的产品,也能作为一些(新)技术的探索环境。比如OBS(对象存储服务)、推文搜索服务、推文/用户推荐发现服务、广场推文消息流服务等,都可以作为相应技术领域的技术探索环境,从实践中去检验技术的有效性,更好的推进技术的学习、实践、演进。作为开发者/学习者,也能在理论学习与实际环境中实践(新)技术找到一个平衡,更好、更快的掌握一项(新)技术,这也是paopao-ce的另一价值所在。**路漫漫其修远兮,吾将上下而求索**,用我们开发者的话来说,带着 **上下文(环境/需求)** 去探索(新)技术,或能事半功倍、得心应手。 + +## 从人文角度思考 +现在的互联网世界已经非常精彩,各种社交媒体平台琳琅满目,使用体验也非常友好。每个社交平台都有自己的运营方式,都有自己的核心用户群体,也有自己的产品灵魂,都在不断的进行生态演进。比如Twitter、微博都已经从最初的推文分享服务演进到一个成熟的传媒平台,注册用户非常庞大,日均访问PV也是一个惊人的数字,这就注定了平台的运营思维是多维度考量均衡的结果,只能做到让用户群体的大多数人用户体验友好,并不能满足所有人的需求。大平台有大平台的运营模式,小站点有小站点的维系空间。对于类似Twitter这样的推文分享服务,paopao-ce提供一种小站点部署模式,采用类似WordPress的运维模式,让 **个人/小组织** 能快速、便捷的拥有一个提供推文分享服务的小站点,以填补那些在大平台下难以享受到的用户体验,享受小圈子内的自由空间。 + +就像许巍唱的「曾经的你」这首歌中所说:*"曾梦想仗剑走天涯~ 看一看世界的繁华~ 年少的心总有些轻狂~ 如今你四海为家~ ......"* 曾经的你我也在 疯狂刷朋友圈、狂奔微博空间、畅游Twitter世界,但是随着环境的改变、岁月的洗礼、心路的淬炼后,你我可能已经不复当年的热情,逐渐淡出朋友圈、沦为微博的稀客,或许Twitter世界还有点吸引力,但是总感觉表达的欲望不复从前了。是什么原因变成这样的呢,原因可能很多,也各自有自己的不同情形所至于此。但是总归一条,那就是 **自由**; 如果有那么一个有限空间内,可以自由的 **谈天说地、品头论足、唠唠叨叨亦或自言自语**,你我是否又能燃起表达的激情呢?!从这个角度来说,paopao-ce就很契合这种需求,曾经你我想拥有一个自己的博客小站点而使用WordPress,那么今天想拥有一个自己的类似Twitter的推文分享服务小站点,部署paopao-ce或许也是一个不错的选择。 + +一个产品应该有一个**属于自己的灵魂**,可以说 paopao-ce的宗旨就是 **打造一个清新文艺的微社区**。 + +## 疑问 + +1. paopao-ce主要针对哪些站点运营者? +其实paopao-ce的运营形态有点类似WordPress,只不过WordPress是使用PHP语言开发的博客平台,提供的是博客服务,而paopao-ce提供的是类似Twitter的推文分享服务。paopao-ce 让 **个人或小组织** 可以快速、方便的部署一个提供**推文分享服务**的小站点,有限范围内形成一个友善的社交小圈子微社区。 +1. paopao-ce是一个清新文艺的微社区,微社区的 `微` 是如何界定的? + * 首先从站点用户流量层面,paopao-ce的部署一般针对的是小站点,注册用户不是很多,用户流量(QPS)也不会很高,这种情形本身很契合paopao-ce对自身微社区的服务定位; + * 从代码实现层面思考,在数据存储层面的架构设计中已经假定paopao-ce提供服务的QPS不会很高,因此不会考虑类似数据库 **分库分表** 这样的设计优化来应对数据库CRUD的流量冲击,对站点推文数据的总容量也假定是单个SQL数据库提供满足查询需求的数据容量极限。 +1. paopao-ce在代码实现上为什么采用单体架构模式? +一个项目的架构设计是多方面考量均衡的结果,最终的目的是满足项目的需求与长远发展。 + * 从架构模式的角度来说,单体架构模式可以满足paopao-ce对自身服务定位的需求,完全有能力承载预期的用户流量QPS,所以采用单体模式架构设计是没有问题的; + * 从运营者的角度来说,在能保障服务质量的前提下,最看重的还是运营成本的考量。提供一项保质保量的服务,可持续性是评价一项服务的重要指标。单体架构模式的项目部署简单,成本相对于分布式架构模式的项目也更低,架设门槛也没有那么高。*黑猫白猫,能抓老鼠就是好猫*, 在什么阶段就用什么技术,根据部署运营场景选择适合的技术来支撑服务,才是运营者明智的选择。 + * 现在不管是单体架构模式亦或是云原生的分布式架构模式,相应的技术栈生态都已经非常成熟,技术本身没有优劣之分,需要根据具体环境来适配合适的技术,这样才能在你保证服务质量的同时保证服务的可持续性与经济性。说白了就是paopao-ce目前采用单体架构模式的设计,满足优质服务的同时性价比最高。 +1. 如果一个paopao-ce部署站点运营一段时间后QPS逐渐提高到一定程度,目前架构的paopao-ce无法满足进一步的用户流量冲击,是否会采用分布式技术栈进行优化? +不会。paopao-ce将保守的采用目前的单体架构模式提供极致的QPS用户体验,如果确实需要超高QPS需求的实例部署,将另起炉灶开发另一款相应的产品,或许会采用云原生的分布式技术栈生态进行架构设计,这将是另一个paopao产品的故事序章了(前提是paopao能火出圈)。 + +## 更新记录 +#### v0.0(2022-11-04) - 北野 +* 初始文档,先占个位置 + +#### v0.1(2022-12-17) - 北野 +* 添加部署结构示意图 + +#### v0.2(2022-12-18) - 北野 +* 添加部分内容 + +#### v1.0(2022-12-19) - 北野 +* 补充部分内容 + +#### v1.1(2023-01-13) - 北野 +* 补充 从技术探索角度思考 描述 diff --git a/docs/proposal/002-关于Friendship功能项的设计.md b/docs/proposal/002-关于Friendship功能项的设计.md new file mode 100644 index 00000000..f0c1a35a --- /dev/null +++ b/docs/proposal/002-关于Friendship功能项的设计.md @@ -0,0 +1,67 @@ +| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 | +| ----- | ----- | ----- | ----- | ----- | ----- | +| 002| 北野 | 2022-11-04 | 2023-01-04 | v1.0 | 提议 | + +### Friendship功能项的设计概要 +Friendship功能提供好友间分享推文信息的机制,更好的帮助用户建立自己的推文分享小圈子。Friendship本质上想优化的是泡泡广场页面推文列表的生成机制,开启功能后,推文列表只能获取 `公开/私密/好友` 的推文,每个用户都有属于自己的个性化推文列表。在提供个性化推文列表生成机制的同时,好友体系的建立也顺便帮助用户建立自己的个性化有限范围内的灵魂社交小圈子,只有相互间拥有个性化认同感的用户才能互为好友。 + +### 场景 + +* 私域小站点,流量小,但是希望控制推文访问权限; +* 公域大站点或者小站点,推文数量庞大,更新频率高,泡泡广场列表有刷屏风险,需要一种更好的推文列表生成机制,为用户提供个性化推文列表服务,优化用户体验; +* 单纯想建立一个好友体系; + +### 需求 + +* 需要类似微信朋友圈这样的在好友间进行推文分享; +* 希望对推文访问权限进行控制,实现推文在有限空间内自由访问; +* 部署站点推文数量庞大,需要一种更好的推文列表生成机制,为用户提供个性化推文列表服务; +* 建立一个类似于微信朋友圈的弱关系好友体系,使得用户可以控制每一条推文的授权访问(公开/私密/好友可见); + +### 方案 + +#### 设计要点 +* 建立好友体系,提供添加/解除好友关系的机制; +* 浏览好友列表的机制; +* 发送推文时可以设置推文的访问权限(可见性设置); +* 推文展示时标记推文的可见性描述; + +#### 设计细节 +* 参考实现(PR): +[add support Friendship feature #192](https://github.com/rocboss/paopao-ce/pull/192) + +* 预览 + +| | +| ----- | +| **泡泡广场** | +| ![](.assets/002-02.png)![](.assets/002-01.png)| +| ![](.assets/002-07.png)| +| ![](.assets/002-08.png)| + +### 疑问 + +1. 什么是弱关系好友体系? +**弱关系好友** 在Friendship中的表现就是 **你只能通过对方发表的推文去判断这个人的思想三观是否符合你的脾胃进而让你决定是否要与对方建立好友关系;这种好友关系前期是非常薄弱,只能通过相互间的推文产生灵魂共鸣,进而互为兴趣、互为好友。** 有别于弱关系,微信的生态就天然建立在强关系之上,微信好友大部分都是自己熟人、朋友甚至亲人,因此微信的朋友圈就是强关系好友体系下的小圈子社交,有时谨言慎行就非常必要,导致有很多人随着年龄成长到某个阶段,对微信朋友圈非常不感冒,很少甚至没有发朋友圈的欲望了,究其原因有一部分可能是圈内好友太熟了甚至有点“严肃”。需要注意的是,有些人的表达欲望并没有因为微信朋友圈这种 **强关系好友** *圈内社交环境* 而降低,仅仅只是被压抑住了,那么一个**弱关系好友**体系或许可以打开这部分人的表达欲望,使得他们可以在有限可控圈子内尽情表达、享受言论的自由。 +2. 如何形成这种好友体系? +形成好友体系分 **建立、维持、解除** 好友关系。Friendship提供 *建立/解除* 好友关系的机制,泡泡广场的推文列表依据这个好友体系为每个用户生成个性化推文列表。而好友关系的**维持**,本质上就是用户推文的持久更新、思想的持续演化,使得好友对你一直保持兴趣;Friendship也为每一条推文的访问权限进行**标记(私密/好友可见)**,这可以传达这样一种信息: **“时刻让好友知道我非常在乎好友、对好友特殊关照,你看这条推文就是只有我的好友(也就是你)才可以看到,够意思吧”!** 顺便一说,每一条推文的访问权限标记(公开/私密/好友可见)是建立Friendship弱关系体系的隐性催化剂,可以加速Friendship的形成。 +3. 如何开启这个功能? +在配置文件config.yaml中的`Features`中添加`Friendship`功能项开启该功能: + ```yaml + ... + # features中加上 Friendship + Features: + Default: ["Meili", "LoggerMeili", "Base", "Sqlite3", "BigCacheIndex", "MinIO", "Friendship"] + Base: ["Redis", "PhoneBind"] + ... + ``` + +### 更新记录 +#### v0.1(2022-11-04) - 北野 +* 初始文档 + +#### v0.2(2022-11-06) - 北野 +* 添加初始文档内容 + +#### v1.0(2023-01-04) - 北野 +* 添加参考实现PR信息 diff --git a/docs/proposal/003-关于Followship功能项的设计.md b/docs/proposal/003-关于Followship功能项的设计.md new file mode 100644 index 00000000..b315ad87 --- /dev/null +++ b/docs/proposal/003-关于Followship功能项的设计.md @@ -0,0 +1,28 @@ +| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 | +| ----- | ----- | ----- | ----- | ----- | ----- | +| 003| 北野 | 2022-11-04 | 2022-11-04 | v0.0 | 提议 | + +### 关于Followship功能项的设计 + ---- 这里写简要介绍 ---- + +### 场景 + + ---- 这里描述在什么使用场景下会需要本提按 ---- + +### 需求 +实现类似于Twitter的追随者关注模式的推文传播模型,使得广场页面可以浏览已关注用户的推文。 +TODO-TL;DR... + +### 方案 + +TODO + +### 疑问 + +1. 如何开启这个功能? + +TODO + +### 更新记录 +#### v0.0(2022-11-04) - 北野 +* 初始文档, 先占个位置 \ No newline at end of file diff --git a/docs/proposal/005-引入go-mir优化后端架构设计.md b/docs/proposal/005-引入go-mir优化后端架构设计.md new file mode 100644 index 00000000..ae696ca3 --- /dev/null +++ b/docs/proposal/005-引入go-mir优化后端架构设计.md @@ -0,0 +1,43 @@ +| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 | +| ----- | ----- | ----- | ----- | ----- | ----- | +| 005| 北野 | 2022-11-21 | 2023-01-04 | v1.1 | 提议 | + +### 引入go-mir优化后端架构设计 + 引入[github.com/alimy/mir/v3](https://github.com/alimy/mir)优化后端的架构设计,使得后端代码更具扩展型。 +![](.assets/06-01.png) + +### 需求 +* 更方便添加后端功能项的实现; +* 优化代码结构,模块化、清晰化代码布局,使得更具扩展性; +* 兼容RESTful/gRPC 服务代码,RESTful API是服务于Web/Admin,gRPC API是提供给移动端(iOS/Android)的服务; + +### 方案 + +依赖库: +* [go-mir](https://github.com/alimy/mir) + +参考实现(PR): +* [引入go-mir重构paopao-ce的接入层与业务逻辑层 #196](https://github.com/rocboss/paopao-ce/pull/196) + +### 疑问 + +1. 为什么引入go-mir? + * [go-mir](https://github.com/alimy/mir)是一套提供类似gRPC服务开发体验的快速开发RESTful API后端开发脚手架,巧妙的借用golang语法作为DSL描述RESTful API,通过代码生成的方式自动生成相对应的API接口、HTTP服务器框架初始化代码等,提供类似gRPC的开发体验,对后端开发者非常友好; + * 引入go-mir的另一个主要目的是加速后端服务的开发,更好的保证代码风格的一致性; + * 践行 [006-关于paopao-ce的结构设计](006-关于paopao-ce的结构设计.md); +1. 为什么要兼容RESTful/gRPC服务? + * RESTful API是提供给Web端使用的,包括paopao-ce web端以及后期的运维端admin; gRPC API是提供给移动端(iOS/Android)使用的服务; + * RESTful API天然对web端浏览器友好,而gRPC生态对后端、移动端天然友好,可以根据google-protocol-buffers DSL定义服务API自动生成服务端、客户端代码,非常利于开发,特别是移动端开发,省去了编写客户端网络数据服务相关的业务逻辑,只需要专注于页面逻辑编写,后端数据获取的网络数据访问逻辑直接调用自动生成的gRPC API客户端代码即可,大大的减轻移动端开发的心智负担; + * 后端引入gRPC主要就是考虑到移动端(iOS/Android)开发的开发效率,在减轻移动端开发网络数据获取业务逻辑的心智负担上,gRPC生态与RESTful生态相比优势明显,因此强力引入; + * 再一个就是[go-mir](https://github.com/alimy/mir) v3为RESTful服务的开发提供类似gRPC服务的开发体验,也为后端兼容RESTful/gRPC服务创造了很好的条件,只要代码结构组织清晰,将会有很好的后端开发体验; + >*目前移动端 iOS/Android APP还在规划中,这里后续的后端gRPC API服务也是为此做准备,敬请期待~* + +### 更新记录 +#### v0.0(2022-11-21) - 北野 +* 初始文档 + +#### v1.0(2022-12-10) - 北野 +* 添加内容 + +#### v1.1(2023-01-04) - 北野 +* 添加参考实现PR信息 diff --git a/docs/proposal/006-关于paopao-ce的结构设计.md b/docs/proposal/006-关于paopao-ce的结构设计.md new file mode 100644 index 00000000..61ee3b54 --- /dev/null +++ b/docs/proposal/006-关于paopao-ce的结构设计.md @@ -0,0 +1,71 @@ +| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 | +| ----- | ----- | ----- | ----- | ----- | ----- | +| 006| 北野 | 2022-11-23 | 2022-01-01 | v1.0 | 提议 | + +### 关于paopao-ce的结构设计 +本文档主要讨论paopao-ce目前的代码结构,简要清晰的描述一个**API请求**从 **接受解析->逻辑处理->结果响应**的大概路径,帮助开发人员快速了解paopao-ce代码基的基本面,更好的融入paopao-ce的开发中做出PR贡献。 +![](.assets/006-01.png) + +### 两种服务 - RESTful API服务 与 gRPC服务 +paopao-ce提供RESTful API与gRPC两种类型子服务,并且拥有**单实例多服务运行**的机制。RESTful API服务基于[gin](https://github.com/gin-gonic/gin)引擎实现,使用[go-mir](https://github.com/alimy/mir)脚手架辅助工具集实现RESTFul API从接口定义到代码自动生成的便捷开发体验。 gRPC服务使用[buf](https://github.com/bufbuild/buf)自动化辅助工具对gRPC服务从 `*.proto` DSL服务接口定义到接口代码自动生成的全流程管理。 + +### 结构说明 +paopao-ce采用清晰的分层结构设计,主要包括 **接入层、业务逻辑层、数据逻辑层、数据存储**。 +* 接入层 + RESTful API服务的接入层由 [gin](https://github.com/gin-gonic/gin)引擎 与 [go-mir](https://github.com/alimy/mir)生成的 **Binding/Render** 代码共同组成。当一个HTTP Request被http server接受后,通过[gin](https://github.com/gin-gonic/gin)的路由机制,由相应的[go-mir](https://github.com/alimy/mir)生成的`Binding`将请求解析后传入 **业务逻辑层**中相对应的 子服务Servants 完成业务处理后获得结果,[go-mir](https://github.com/alimy/mir)生成的`Render`把结果渲染后生成对应的 HTTP Response发送出去以完成一个HTTP请求。 + gRPC服务的接入层由其对应的gRPC服务器引擎组成,当一个RPC请求过来后,先把请求解码解析后传入 **业务逻辑层**中相对应的 子服务Servers 完成业务处理后获得结果,将处理结果编码后生成对应的 HTTP Response发送出去就完成了一个RPC请求的完整流程。 +* 业务逻辑层 + RESTful API服务的业务逻辑层是由[go-mir](https://github.com/alimy/mir)依据接口定义自动生成的**Servants服务接口**组成,开发人员需要实现这些接口以提供相应的业务逻辑。gRPC也是一样的,业务逻辑需要通过实现gRPC依据proto DSL定义接口自动生成的服务接口来提供相应业务处理服务。 +* 数据逻辑层 + paopao-ce将所有与数据存储相关的服务都统一定义成接口,包括**SQL服务、缓存服务、OBS服务、Search服务** 等,然后根据具体的部署环境选择适配的相应存储服务实现。比如OBS服务,定义了统一的操作对象存储的服务接口,然后提供阿里云、腾讯云、华为云、MinIO、S3、Localoss等的服务适配实现,这样就可以根据不同的部署环境切换使用不同的对象存储服务实现。 +* 数据存储 + 数据存储包括 SQL存储(MySQL/PostgreSQL/Sqlite3)、Cache、OBS、Search Engine(Zinc/Meilisearch)等,paopao-ce本身不关心具体的数据存储是如何部署的,一般是通过对应的标准方式连接部署实例以获取相应存储服务。 + +### paopao-ce代码目录的说明 +```sh +tree -L 2 +. +|-- auto +| |-- api +| `-- rpc +|-- internal +| |-- conf +| |-- core +| |-- dao +| |-- ims +| |-- migration +| |-- model +| |-- obs +| |-- servants +| `-- service +|-- main.go +|-- mirc +|-- proto +|-- release +`-- web +``` +* 根目录的`mirc`包含RESTful API的[go-mir](https://github.com/alimy/mir)服务接口定义文件, `auto/api`目录包含[go-mir](https://github.com/alimy/mir)自动生成的服务接口代码; +* 目录`proto`包含gRPC的proto服务接口定义文件,自动生成的服务接口代码包含在`auto/rpc`目录中; +* 业务逻辑层的代码都包含在`internal/servants`目录,包括RESTful服务以及gRPC服务的业务逻辑处理代码都包含在这个目录中; +* `internal/core`包含所有数据逻辑层的服务接口定义,相应的数据逻辑层服务接口实现代码都包含在`internal/dao`目录中; +* 一些大的功能模块统一放置于`internal`目录中,以降低代码目录深度;比如数据库迁移功能模块`migration`的代码包含在`internal/migration`目录、 消息推送功能模块`ims` -> `internal/ims`, 简单本地OBS功能`obs` -> `internal/obs` 等; +* `internal/service`目录包含paopao-ce所有子服务(`Web`、`Admin`、`Bot`、`SpaceX`、`Mobile` ...)的初始化逻辑代码; +* `internal/conf`目录包含全局配置相关的逻辑代码; + + +### 疑问 + +1. 为什么要引入[go-mir](https://github.com/alimy/mir)? +**工欲善其事,必先利其器**。为了RESTFul API的后端开发体验可以媲美gRPC,本人特意打造[go-mir](https://github.com/alimy/mir) v3版本来满足需求。[go-mir](https://github.com/alimy/mir)是一套使用golang自身语言生态实现的RESTFul API从接口定义到代码自动生成的脚手架辅助工具集,便捷的实现快速后端开发体验,颇有 *“程咬金的三板斧,简单抡着就完事”* 的韵味。而从[go-mir](https://github.com/alimy/mir)的官方文档参考也可以看出,其生成的代码也确实就将一个HTTP的请求/响应简单分成 `请求绑定`->`业务逻辑`->`结果渲染`三个步骤去完成,生成的代码结构简单清晰,与gRPC的生成代码有点类似。 +1. 为什么要兼容RESTful服务与gRPC服务? +RESTful服务与gRPC服务各自有擅长的场景,在合适的场景使用最适合的技术去做相应的适配,这是paopao-ce秉持的代码开发原则之一。 + +### 更新记录 +#### v0.0(2022-11-23) - 北野 +* 初始文档, 先占个位置 + +#### v0.1(2022-12-23) - 北野 +* 添加部分内容 + +#### v1.0(2023-01-01) - 北野 +* 添加部分内容 diff --git a/docs/proposal/011-关于Lightship功能项的设计.md b/docs/proposal/011-关于Lightship功能项的设计.md new file mode 100644 index 00000000..b7426d6d --- /dev/null +++ b/docs/proposal/011-关于Lightship功能项的设计.md @@ -0,0 +1,47 @@ +| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 | +| ----- | ----- | ----- | ----- | ----- | ----- | +| 011| 北野 | 2022-12-14 | 2022-01-09 | v1.1 | 提议 | + +### 关于Lightship功能项的设计 +Lightship(开放模式)功能提供完全公开的推文分享服务,有别于[Friendship](002-关于Friendship功能项的设计.md "关于Friendship功能项的设计")、[Followship](003-关于Followship功能项的设计.md "关于Followship功能项的设计"),使用Lightship用户模式部署paopao-ce,用户发布的所有推文都是公开可访问的,广场推文列表展示的是全站所有公开推文的Timeline Tweets。 + +### 场景 +一般用于非常小的站点,或者推文更新不频繁的站点。 +* 推文更新不频繁站点; +* 个人推文站点; +* 单纯想要所有推文公开访问; + +### 需求 +* 广场推文列表只展示公开可访问推文; +* 推文访问权限只能是 `公开/私密`; + +### 方案 + +#### 实现细节 +* 广场推文列表只展示公开可访问推文 - 前端/后端 +* 推文访问权限只能是 `公开/私密` - 前端/后端 + +#### 参考实现(PR): +[add Lightship feature support #198](https://github.com/rocboss/paopao-ce/pull/198) + +### 疑问 + +1. 公开模式为什么命名为Lightship? +Lightship有灯塔的意思,灯塔是为航行船只指明方向的公共设施,这里取其公有设施的属性指喻 开放模式下paopao-ce不需要授权公开访问推 文的意思。 +1. 如何开启这个功能? +在配置文件config.yaml中的`Features`中添加`Lightship`功能项开启该功能: +```yaml +... +# features中加上 Lightship +Features: + Default: ["Meili", "LoggerMeili", "Base", "Sqlite3", "BigCacheIndex", "MinIO", "Lightship"] + Base: ["Redis", "PhoneBind"] +... +``` + +### 更新记录 +#### v1.0(2022-12-14) - 北野 +* 初始文档 + +#### v1.1(2022-01-09) - 北野 +* 添加参考实现PR信息 diff --git a/docs/proposal/012-优化前端运行时配置获取机制的设计.md b/docs/proposal/012-优化前端运行时配置获取机制的设计.md new file mode 100644 index 00000000..cf60291f --- /dev/null +++ b/docs/proposal/012-优化前端运行时配置获取机制的设计.md @@ -0,0 +1,28 @@ +| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 | +| ----- | ----- | ----- | ----- | ----- | ----- | +| 012| 北野 | 2023-01-13 | 2023-01-13 | v0.0 | 提议 | + +### 概述 +目前的Web前端运行时配置是通过编译时配置[.env](../../web/.env)进行静态配置,虽然能满足简单的功能需求,但是非常不灵活。本提按提议一种由paopao-ce后端服务控制的前端运行时配置获取机制,让前端更灵活的依据运行时配置提供产品服务。 + +### 场景 +前端依据paopao-ce后端服务提供的运行时配置按需提供产品服务,也可以扩展到按用户喜好自定义的配置提供产品服务,比如用户设置的语言、Theme、功能特性等。 + +### 需求 +* 前端依据运行时配置提供业务服务 - 前端 +* 前端在启动时从paopao-ce后端服务获取运行时配置 - 前端/后端 +* 用户可以自定义前端运行时配置,如语言、Theme、功能特性等 - 前端/后端 +* 用户自定义的前端运行时配置可以 创建/更新 - 前端/后端 +* 后端服务提供默认前端运行时配置 - 后端 + +### 方案 +TODO; + +### 疑问 + +1. 为什么要提供这种机制? +TODO; + +### 更新记录 +#### v0.0(2023-01-13) - 北野 +* 初始文档, 先占个位置 diff --git a/docs/proposal/013-优化paopao-ce前后端国际化i18n的设计.md b/docs/proposal/013-优化paopao-ce前后端国际化i18n的设计.md new file mode 100644 index 00000000..570634c0 --- /dev/null +++ b/docs/proposal/013-优化paopao-ce前后端国际化i18n的设计.md @@ -0,0 +1,21 @@ +| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 | +| ----- | ----- | ----- | ----- | ----- | ----- | +| 013| 北野 | 2023-01-13 | 2023-01-13 | v0.0 | 提议 | + +### 概述 +目前paopao-ce前端/后端 都使用中文提供业务服务,暂时还没有提供国际化i18n机制提供国际化的业务服务。本提按提议提过在前端/后端中引入i8n机制,以提供国际化业务服务。 本提按建立在[012-优化前端运行时配置获取机制的设计](012-优化前端运行时配置获取机制的设计.md)基础之上。 + +### 需求 +* 提供i18n机制以实现业务服务的国际化 - 前端/后端 + +### 方案 +TODO; + +### 疑问 + +1. 为什么要提供这种机制? +TODO; + +### 更新记录 +#### v0.0(2023-01-13) - 北野 +* 初始文档, 先占个位置 diff --git a/docs/proposal/014-关于paopao-ce引入sqlx与sqlc作为数据逻辑层ORM的构想 copy.md b/docs/proposal/014-关于paopao-ce引入sqlx与sqlc作为数据逻辑层ORM的构想 copy.md new file mode 100644 index 00000000..84ce1b95 --- /dev/null +++ b/docs/proposal/014-关于paopao-ce引入sqlx与sqlc作为数据逻辑层ORM的构想 copy.md @@ -0,0 +1,21 @@ +| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 | +| ----- | ----- | ----- | ----- | ----- | ----- | +| 014| 北野 | 2023-02-09 | 2023-02-09 | v0.0 | 提议 | + +### 概述 +TODO; + +### 需求 +TODO; + +### 方案 +TODO; + +### 疑问 + +1. 为什么要引入sqlx/sqlc? +TODO; + +### 更新记录 +#### v0.0(2023-02-09) - 北野 +* 初始文档, 先占个位置 diff --git a/docs/proposal/015-关于paopao-ce引入bcrypt作为用户密码加密算法的设计.md b/docs/proposal/015-关于paopao-ce引入bcrypt作为用户密码加密算法的设计.md new file mode 100644 index 00000000..6ae0367a --- /dev/null +++ b/docs/proposal/015-关于paopao-ce引入bcrypt作为用户密码加密算法的设计.md @@ -0,0 +1,25 @@ +| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 | +| ----- | ----- | ----- | ----- | ----- | ----- | +| 015| 北野 | 2023-02-13 | 2023-02-13 | v0.0 | 提议 | + +### 概述 +TODO; + +### 需求 +TODO; + +### 方案 +TODO; + +### 疑问 + +1. 为什么要引入bcrypt? +TODO; + +### 参考文档 +* [bcrypt](https://github.com/golang/crypto/blob/master/bcrypt/bcrypt.go) +* [bcrypt module](https://pkg.go.dev/golang.org/x/crypto@v0.6.0/bcrypt) + +### 更新记录 +#### v0.0(2023-02-13) - 北野 +* 初始文档, 先占个位置 diff --git a/docs/proposal/016-关于使用pyroscope用于性能调试的设计.md b/docs/proposal/016-关于使用pyroscope用于性能调试的设计.md new file mode 100644 index 00000000..b8926cd5 --- /dev/null +++ b/docs/proposal/016-关于使用pyroscope用于性能调试的设计.md @@ -0,0 +1,53 @@ +| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 | +| ----- | ----- | ----- | ----- | ----- | ----- | +| 016| 北野 | 2023-02-15 | 2023-02-16 | v1.1 | 提议 | + +### 概述 +Pyroscope 是一个开源的持续性能剖析平台。它能够帮你: +* 找出源代码中的性能问题和瓶颈 +* 解决 CPU 利用率高的问题 +* 理解应用程序的调用树(call tree) +* 追踪随一段时间内变化的情况 + +### 需求 +* 开发环境下启用Pyroscope,但是部署环境下禁用。 + +### 方案 +#### 设计要点 +* 使用//go:build pyroscope 可选编译app集成Pyroscope功能 +* config.yaml中添加`Pyroscope` 功能来启用Pyroscope + +#### 设计细节 +* 参考实现(PR): +[add Pyroscope support #199](https://github.com/rocboss/paopao-ce/pull/199) + +### 疑问 + +1. 为什么要引入Pyroscope? +用于开发环境下对paopao-ce进行性能优化。 + +2. 如何开启这个功能? +* 构建时将 `pyroscope` 添加到TAGS中: + ```sh + make run TAGS='pyroscope' + ``` +* 在配置文件config.yaml中的`Features`中添加`Pyroscope`功能项开启该功能: + ```yaml + ... + # features中加上 Friendship + Features: + Default: ["Meili", "LoggerMeili", "Base", "Sqlite3", "BigCacheIndex", "MinIO", "Pyroscope"] + Base: ["Redis", "PhoneBind"] + ... + ``` + +### 参考文档 +* [pyroscope](https://github.com/pyroscope-io/pyroscope) +* [pyroscope client](https://github.com/pyroscope-io/client) + +### 更新记录 +#### v1.0(2023-02-15) - 北野 +* 初始文档 + +#### v1.1(2023-02-16) - 北野 +* 添加参考实现 diff --git a/docs/proposal/README.md b/docs/proposal/README.md new file mode 100644 index 00000000..12f8096e --- /dev/null +++ b/docs/proposal/README.md @@ -0,0 +1,6 @@ +## Draft +* [001-关于paopao-ce的设计定位](001-关于paopao-ce的设计定位.md "关于paopao-ce的设计定位") +* [002-关于Friendship功能项的设计](002-关于Friendship功能项的设计.md "关于Friendship功能项的设计") +* [003-关于Followship功能项的设计](003-关于Followship功能项的设计.md "关于Followship功能项的设计") +* [005-引入go-mir优化后端架构设计](005-引入go-mir优化后端架构设计.md "引入go-mir优化后端架构设计") +* [006-关于paopao-ce的结构设计](006-关于paopao-ce的结构设计.md "关于paopao-ce的结构设计") diff --git a/docs/proposal/提案模板.md b/docs/proposal/提案模板.md new file mode 100644 index 00000000..4d44a79d --- /dev/null +++ b/docs/proposal/提案模板.md @@ -0,0 +1,33 @@ +| 编号 | 作者 | 发表时间 | 变更时间 | 版本 | 状态 | +| ----- | ----- | ----- | ----- | ----- | ----- | +| <编号000> | <作者> | <发表时间> | <变更时间> | <版本号v1.0> | <提议/提案/决议/冻结> | + +* 编号: 填写提案编号,三位数,比如001。 +* 作者: 填写发表者。 +* 发表时间: 填写首次发表时间,之后保持不变。 +* 变更时间: 填写变更时间,首次发表时,变更时间和发表时间一样。 +* 版本: 当前文档版本号, 样式为v1.0/v2.0 保持两位数,微调加次版本号, 大调加大版本号。 +* 状态: 首次发表 状态为 **提议**; 经过讨论,多数人认同,状态为 **提案**; 审议通过,决定对方案落地,状态为 **决议**; 审议未通过,方案暂时不落地,状态变更为 **冻结**。 + +### <我是标题> + ---- 这里写简要介绍 ---- + +### 场景 + + ---- 这里描述在什么使用场景下会需要本提按 ---- + +### 需求 + + ---- 这里表述具体需求,在上面描述的场景下,我们需要获得的具体状态 ---- + +### 方案 + + ---- 这里提出可能的解决方案 ---- + +### 疑问 + + ---- 这里描述上述内容中的疑问,比如方案落地将会遇到的坑,其他方案与本文档的比较 ---- + + ### 更新记录 +#### <版本号v1.0>(<变更时间>) - <作者> +* 变更描述 \ No newline at end of file diff --git a/features-status.md b/features-status.md new file mode 100644 index 00000000..132121da --- /dev/null +++ b/features-status.md @@ -0,0 +1,181 @@ +## Features Status +功能项状态说明。 + +## 目前支持的功能集合 +#### 子服务 +* `OldWeb` 开启旧的Web服务(目前状态: 默认) + * [ ] 提按文档 + * [x] 服务初始化逻辑 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `Web` 开启Web服务(目前状态: WIP) + * [ ] 提按文档 + * [x] 服务初始化逻辑 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `Admin` 开启Admin后台运维服务(目前状态: WIP) + * [ ] 提按文档 + * [x] 服务初始化逻辑 + * [ ] 接口定义 + * [ ] 业务逻辑实现 +* `SpaceX` 开启SpaceX服务(目前状态: WIP) + * [ ] 提按文档 + * [x] 服务初始化逻辑 + * [ ] 接口定义 + * [ ] 业务逻辑实现 +* `Bot` 开启Bot服务(目前状态: WIP) + * [ ] 提按文档 + * [x] 服务初始化逻辑 + * [ ] 接口定义 + * [ ] 业务逻辑实现 +* `NativeOBS` 开启NativeOBS服务(目前状态: WIP) + * [ ] 提按文档 + * [ ] 服务初始化逻辑 + * [ ] 接口定义 + * [ ] 业务逻辑实现 +* `Docs` 开启NativeOBS服务(目前状态: WIP) + * [ ] 提按文档 + * [x] 服务初始化逻辑 +* `Frontend:Web` 开启独立前端服务(目前状态: 内测) + * [ ] 提按文档 + * [x] 服务初始化逻辑 +* `Frontend:EmbedWeb` 开启内嵌于后端Web API服务中的前端服务(目前状态: 内测) + * [ ] 提按文档 + * [x] 服务初始化逻辑 +* `Deprecated:OldWeb` 开启旧的Web服务(目前状态: 内测) + * [ ] 提按文档 + * [x] 服务初始化逻辑 + +#### 数据库: +* `Gorm` + `MySQL`/`Sqlite3`/`PostgreSQL` +使用[gorm](https://github.com/go-gorm/gorm)作为数据库的ORM,默认使用 `Grom` + `MySQL`组合(目前状态:稳定,默认,推荐使用); + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `Sqlx` + `MySQL`/`PostgreSQL` +使用[sqlx](https://github.com/jmoiron/sqlx)作为数据库的ORM(目前状态:WIP); + * [ ] 提按文档 + * [ ] 接口定义 + * [ ] 业务逻辑实现 + +#### 对象存储: +* `AliOSS` 阿里云对象存储服务; + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `COS` 腾讯云对象存储服务; + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `HuaweiOBS` 华为云对象存储服务; + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `MinIO` [MinIO](https://github.com/minio/minio)对象存储服务; + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `S3` AWS S3兼容的对象存储服务; + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `LocalOSS` 提供使用本地目录文件作为对象存储的功能,仅用于开发调试环境; + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `OSS:Retention` 基于对象存储系统的对象过期自动删除特性实现 先创建临时对象再持久化的功能(目前状态: 内测阶段); + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `OSS:TempDir` 基于对象存储系统的对象拷贝/移动特性实现 先创建临时对象再持久化的功能(目前状态: 内测阶段); + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 + +#### 缓存: +* `Redis` Redis缓存 + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `SimpleCacheIndex` 提供简单的 广场推文列表 的缓存功能能(目前状态: Deprecated); + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `BigCacheIndex` 使用[BigCache](https://github.com/allegro/bigcache)缓存 广场推文列表,缓存每个用户每一页,简单做到千人千面(推荐使用); + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 + +#### 搜索: +* `Zinc` 基于[Zinc](https://github.com/zinclabs/zinc)搜索引擎提供推文搜索服务(目前状态: 稳定,推荐使用); + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `Meili` 基于[Meilisearch](https://github.com/meilisearch/meilisearch)搜索引擎提供推文搜索服务(目前状态: 稳定,推荐使用); + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `Bleve` 基于[Bleve](https://github.com/blevesearch/bleve)搜索引擎提供推文搜索服务(目前状态: WIP); + * [ ] 提按文档 + * [ ] 接口定义 + * [ ] 业务逻辑实现 +#### 日志: +* `LoggerFile` 使用文件写日志(目前状态: 稳定); + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `LoggerZinc` 使用[Zinc](https://github.com/zinclabs/zinc)写日志(目前状态: 稳定,推荐使用); + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `LoggerMeili` 使用[Meilisearch](https://github.com/meilisearch/meilisearch)写日志(目前状态: 内测阶段); + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 + +#### 关系模式: +* `Friendship` 弱关系好友模式,类似微信朋友圈(目前状态: 内测); + * [x] [提按文档](docs/proposal/002-关于Friendship功能项的设计.md) + * [x] 接口定义 + * [x] 业务逻辑实现 +* `Followship` 关注者模式,类似Twitter的Follow模式(目前状态: WIP); + * [ ] [提按文档](docs/proposal/003-关于Followship功能项的设计.md) + * [ ] 接口定义 + * [ ] 业务逻辑实现 +* `Lightship` 开放模式,所有推文都公开可见(目前状态: 内测、默认); + * [x] [提按文档](docs/proposal/011-关于Lightship功能项的设计.md) + * [x] 接口定义 + * [x] 业务逻辑实现 + +### 支付: +* `Alipay` 开启基于[支付宝开放平台](https://open.alipay.com/)的钱包功能; + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 + +### 短信验证: +* SmsJuhe(需要开启sms) + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 +* `Sms` 开启短信验证码功能,用于手机绑定验证手机是否注册者的;功能如果没有开启,手机绑定时任意短信验证码都可以绑定手机; + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 + +### 开发文档: +* `Docs:OpenAPI` 开启openapi文档功能,提供web api文档说明(visit http://127.0.0.1:8008/docs/openapi); + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 + +### 性能优化 +* [`Pyroscope`](docs/proposal/016-关于使用pyroscope用于性能调试的设计.md) 开启Pyroscope功能用于性能调试(目前状态: 内测); + * [x] 提按文档 + * [x] 业务逻辑实现 + +### 其他: +* `PhoneBind` 手机绑定功能; + * [ ] 提按文档 + * [x] 接口定义 + * [x] 业务逻辑实现 diff --git a/go.mod b/go.mod index faacfb23..8a40225f 100644 --- a/go.mod +++ b/go.mod @@ -1,42 +1,39 @@ module github.com/rocboss/paopao-ce -go 1.16 +go 1.18 require ( github.com/Masterminds/semver/v3 v3.1.1 github.com/afocus/captcha v0.0.0-20191010092841-4bd1f21c8868 + github.com/alimy/cfg v0.3.0 + github.com/alimy/mir/v3 v3.1.1 github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible github.com/allegro/bigcache/v3 v3.0.2 - github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect - github.com/dgrijalva/jwt-go v3.2.0+incompatible + github.com/bytedance/sonic v1.5.0 github.com/disintegration/imaging v1.6.2 github.com/ethereum/go-ethereum v1.10.16 github.com/fatih/color v1.13.0 github.com/fbsobreira/gotron-sdk v0.0.0-20211102183839-58a64f4da5f4 github.com/gin-contrib/cors v1.3.1 - github.com/gin-gonic/gin v1.7.7 - github.com/go-playground/validator/v10 v10.10.1 // indirect + github.com/gin-gonic/gin v1.8.1 github.com/go-redis/redis/v8 v8.11.4 github.com/go-resty/resty/v2 v2.7.0 github.com/goccy/go-json v0.9.7 github.com/gofrs/uuid v4.0.0+incompatible + github.com/golang-jwt/jwt/v4 v4.4.2 github.com/golang-migrate/migrate/v4 v4.15.2 - github.com/google/go-cmp v0.5.7 // indirect github.com/huaweicloud/huaweicloud-sdk-go-obs v3.21.12+incompatible github.com/json-iterator/go v1.1.12 - github.com/meilisearch/meilisearch-go v0.19.1 - github.com/minio/minio-go/v7 v7.0.27 - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mozillazg/go-httpheader v0.3.1 // indirect - github.com/sirupsen/logrus v1.8.1 + github.com/meilisearch/meilisearch-go v0.21.0 + github.com/minio/minio-go/v7 v7.0.45 + github.com/pyroscope-io/client v0.6.0 + github.com/sirupsen/logrus v1.9.0 github.com/smartwalle/alipay/v3 v3.1.7 - github.com/spf13/viper v1.10.1 + github.com/spf13/viper v1.14.0 github.com/tencentyun/cos-go-sdk-v5 v0.7.35 - github.com/ugorji/go v1.2.7 // indirect github.com/yinheli/mahonia v0.0.0-20131226213531-0eef680515cc - golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70 // indirect - golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 // indirect - google.golang.org/protobuf v1.27.1 + google.golang.org/grpc v1.50.1 + google.golang.org/protobuf v1.28.1 gopkg.in/natefinch/lumberjack.v2 v2.0.0 gopkg.in/resty.v1 v1.12.0 gorm.io/driver/mysql v1.3.4 @@ -47,3 +44,93 @@ require ( gorm.io/plugin/soft_delete v1.1.0 modernc.org/sqlite v1.17.3 ) + +require ( + github.com/andybalholm/brotli v1.0.4 // indirect + github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect + github.com/btcsuite/btcd v0.22.0-beta // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06 // indirect + github.com/clbanning/mxj v1.8.4 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-playground/locales v0.14.0 // indirect + github.com/go-playground/universal-translator v0.18.0 // indirect + github.com/go-playground/validator/v10 v10.10.1 // indirect + github.com/go-sql-driver/mysql v1.6.0 // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgconn v1.12.1 // indirect + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect + github.com/jackc/pgtype v1.11.0 // indirect + github.com/jackc/pgx/v4 v4.16.1 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/klauspost/compress v1.15.9 // indirect + github.com/klauspost/cpuid/v2 v2.1.0 // indirect + github.com/leodido/go-urn v1.2.1 // indirect + github.com/lib/pq v1.10.2 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-sqlite3 v1.14.12 // indirect + github.com/minio/md5-simd v1.1.2 // indirect + github.com/minio/sha256-simd v1.0.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mozillazg/go-httpheader v0.3.1 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.5 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pyroscope-io/godeltaprof v0.1.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect + github.com/rs/xid v1.4.0 // indirect + github.com/smartwalle/crypto4go v1.0.2 // indirect + github.com/spf13/afero v1.9.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/subosito/gotenv v1.4.1 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.7 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.37.1-0.20220607072126-8a320890c08d // indirect + go.uber.org/atomic v1.9.0 // indirect + golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect + golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect + golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/net v0.0.0-20221014081412-f15817d10f9b // indirect + golang.org/x/sys v0.0.0-20220908164124-27713097b956 // indirect + golang.org/x/text v0.4.0 // indirect + golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect + golang.org/x/tools v0.1.12 // indirect + google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + lukechampine.com/uint128 v1.1.1 // indirect + modernc.org/cc/v3 v3.36.0 // indirect + modernc.org/ccgo/v3 v3.16.6 // indirect + modernc.org/libc v1.16.7 // indirect + modernc.org/mathutil v1.4.1 // indirect + modernc.org/memory v1.1.1 // indirect + modernc.org/opt v0.1.1 // indirect + modernc.org/strutil v1.1.1 // indirect + modernc.org/token v1.0.0 // indirect +) diff --git a/go.sum b/go.sum index abd6b0f1..8a90f8f9 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,7 @@ cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSR cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -19,6 +20,7 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= @@ -41,7 +43,6 @@ cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -52,6 +53,7 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= @@ -95,7 +97,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= @@ -144,9 +145,12 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= +github.com/alimy/cfg v0.3.0 h1:9xgA0QWVCPSq9fFNRcYahVCAX22IL9ts2wrTQPfAStY= +github.com/alimy/cfg v0.3.0/go.mod h1:rOxbasTH2srl6StAjNF5Vyi8bfrdkl3fLGmOYtSw81c= +github.com/alimy/mir/v3 v3.1.1 h1:3tz7uGOwuA1IKU0BysyBvGbyqKtEVMuhPBD/APk1ANw= +github.com/alimy/mir/v3 v3.1.1/go.mod h1:ybhT2ijOiDn0lLwWzIY6vXdv+uzZrctS7VFfczcXBWU= github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible h1:9gWa46nstkJ9miBReJcN8Gq34cBFbzSpQZVVT9N09TM= github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache/v3 v3.0.2 h1:AKZCw+5eAaVyNTBmI2fgyPVJhHkdWder3O9IrprcQfI= github.com/allegro/bigcache/v3 v3.0.2/go.mod h1:aPyh7jEvrog9zAwx5N7+JUQX5dZTSGpxF1LAR4dr35I= @@ -157,13 +161,10 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/apache/arrow/go/arrow v0.0.0-20210818145353-234c94e4ce64/go.mod h1:2qMFB56yOP3KzkB3PbYZ4AlUFg3a88F67TIx5lB/WwY= github.com/apache/arrow/go/arrow v0.0.0-20211013220434-5962184e7a30/go.mod h1:Q7yQnSMnLvcXlZ8RV+jwz/6y1rQTqbX6C82SndT52Zs= -github.com/araddon/dateparse v0.0.0-20200409225146-d820a6159ab1/go.mod h1:SLqhdZcd+dF3TEVL2RMoob5bBP5R1P1qkox+HtCBgGI= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -240,6 +241,8 @@ github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx2 github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/bytedance/sonic v1.5.0 h1:XWdTi8bwPgxIML+eNV1IwNuTROK6EUrQ65ey8yd6fRQ= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= @@ -248,7 +251,6 @@ github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= @@ -256,6 +258,8 @@ github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06 h1:1sDoSuDPWzhkdzNVxCxtIaKiAe96ESVPv8coGwc1gZ4= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -265,8 +269,6 @@ github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -424,8 +426,6 @@ github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= -github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= @@ -433,7 +433,6 @@ github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRk github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= @@ -489,16 +488,13 @@ github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go. github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= -github.com/ethereum/go-ethereum v1.10.11/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= github.com/ethereum/go-ethereum v1.10.16 h1:3oPrumn0bCW/idjcxMn5YYVCdK7VzJYIvwGZUGLEaoc= github.com/ethereum/go-ethereum v1.10.16/go.mod h1:Anj6cxczl+AHy63o4X9O8yWNHuN5wMpfb8MAnHkWn7Y= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fbsobreira/gotron-sdk v0.0.0-20211102183839-58a64f4da5f4 h1:zlN+of+l+or/Y6CYgpX99wwaTf4zN0myVj6YAXiE3xk= github.com/fbsobreira/gotron-sdk v0.0.0-20211102183839-58a64f4da5f4/go.mod h1:h93/Km+mJz1q4a+4fjYE+dMxzTRTrJjxaVIc/Tm9uV0= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= @@ -509,10 +505,11 @@ github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoD github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/gabriel-vasile/mimetype v1.3.1/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= @@ -529,8 +526,8 @@ github.com/gin-contrib/cors v1.3.1/go.mod h1:jjEJ4268OPZUcU7k9Pm653S7lXUGcqMADzF github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= -github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs= -github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= @@ -575,14 +572,11 @@ github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/ github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig= github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg= @@ -644,10 +638,10 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-migrate/migrate/v4 v4.15.2 h1:vU+M05vs6jWHKDdmE1Ecwj0BznygFc4QsdRe2E/L7kc= github.com/golang-migrate/migrate/v4 v4.15.2/go.mod h1:f2toGLkYqD3JH+Todi4aZ2ZdbeUNx4sIwiOK96rE9Lw= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= @@ -712,8 +706,7 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= github.com/google/go-github/v39 v39.2.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= @@ -736,6 +729,7 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -756,6 +750,7 @@ github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0 github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= @@ -766,7 +761,6 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -778,30 +772,20 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -809,17 +793,13 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -850,7 +830,6 @@ github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1: github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= -github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -875,7 +854,6 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= @@ -916,7 +894,6 @@ github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= @@ -944,7 +921,6 @@ github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -960,8 +936,6 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= -github.com/karalabe/hid v1.0.0/go.mod h1:Vr51f8rUOLYrfrWDFlV12GGQgM5AT8sVh+2fY4MPeu8= -github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= @@ -979,14 +953,17 @@ github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.0 h1:xqfchp4whNFxn5A4XFyyYtitiWI8Hy5EW59jEwcyL6U= github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.6/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= -github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0= +github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1011,7 +988,6 @@ github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4F github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -1026,8 +1002,8 @@ github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1043,7 +1019,6 @@ github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIG github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -1059,8 +1034,6 @@ github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= @@ -1081,23 +1054,19 @@ github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4f github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/meilisearch/meilisearch-go v0.19.1 h1:CDi7p5Ev18h0hMXaJZ/1GzSKu3lvPCsaJfrLco3bMEM= -github.com/meilisearch/meilisearch-go v0.19.1/go.mod h1:PnFFq9tELcH5mLVKCoTHRS58B3HEA8vKdBSoG6g/FCE= +github.com/meilisearch/meilisearch-go v0.21.0 h1:SwYMWJVi6vDdSDJdOmbkJ4T26PavjYc4MlZcJZF9+Qs= +github.com/meilisearch/meilisearch-go v0.21.0/go.mod h1:3dvPYZGUWu40qHoTK187fmqF2lrarboPa5m2Yu2Seh4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4= -github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= -github.com/minio/minio-go/v7 v7.0.27 h1:yJCvm78B+2+ll1PqO9eSD1as6Ibw3IYnnD8PyBEB2zo= -github.com/minio/minio-go/v7 v7.0.27/go.mod h1:x81+AX5gHSfCSqw7jxRKHvxUXMlE5uKX0Vb75Xk5yYg= -github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= -github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.45 h1:g4IeM9M9pW/Lo8AGGNOjBZYlvmtlE1N5TQEYWXRWzIs= +github.com/minio/minio-go/v7 v7.0.45/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= @@ -1216,15 +1185,15 @@ github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFSt github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= -github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= @@ -1242,18 +1211,17 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -1266,7 +1234,6 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= @@ -1283,12 +1250,15 @@ github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pyroscope-io/client v0.6.0 h1:rcUFgcnfmuyVYDYT+4d0zfqc8YedOyruHSsUb9ImaBw= +github.com/pyroscope-io/client v0.6.0/go.mod h1:4h21iOU4pUOq0prKyDlvYRL+SCKsBc5wKiEtV+rJGqU= +github.com/pyroscope-io/godeltaprof v0.1.0 h1:UBqtjt0yZi4jTxqZmLAs34XG6ycS3vUTlhEUSq4NHLE= +github.com/pyroscope-io/godeltaprof v0.1.0/go.mod h1:psMITXp90+8pFenXkKIpNhrfmI9saQnPbba27VIaiQE= github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rjeczalik/notify v0.9.2/go.mod h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa4QEjJeqM= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -1298,8 +1268,9 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -1307,7 +1278,6 @@ github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfF github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= @@ -1318,7 +1288,6 @@ github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shengdoushi/base58 v1.0.0/go.mod h1:m5uIILfzcKMw6238iWAhP4l3s5+uXyF3+bJKUNhAL9I= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -1333,8 +1302,9 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartwalle/alipay/v3 v3.1.7 h1:J4U5slABafKVD/b9gPCZe/3HAPB8Pa2NOYOPcugEJBo= github.com/smartwalle/alipay/v3 v3.1.7/go.mod h1:cZUMCCnsux9YAxA0/f3PWUR+7wckWtE1BqxbVRtGij0= github.com/smartwalle/crypto4go v1.0.2 h1:9DUEOOsPhmp00438L4oBdcL8EZG1zumecft5bWj5phI= @@ -1349,11 +1319,12 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= @@ -1369,8 +1340,8 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= -github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= +github.com/spf13/viper v1.14.0 h1:Rg7d3Lo706X9tHsJMUjdiwMpHB7W8WnSVOssIY+JElU= +github.com/spf13/viper v1.14.0/go.mod h1:WT//axPky3FdvXHzGw33dNdXXXfFQqmEalje+egj8As= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= @@ -1378,6 +1349,7 @@ github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -1386,10 +1358,12 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -1406,13 +1380,12 @@ github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZF github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= @@ -1424,8 +1397,8 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.36.0 h1:NhqfO/cB7Ajn1czkKnWkMHyPYr5nyND14ZGPk23g0/c= -github.com/valyala/fasthttp v1.36.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= +github.com/valyala/fasthttp v1.37.1-0.20220607072126-8a320890c08d h1:xS9QTPgKl9ewGsAOPc+xW7DeStJDqYPfisDmeSCcbco= +github.com/valyala/fasthttp v1.37.1-0.20220607072126-8a320890c08d/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= @@ -1469,11 +1442,8 @@ go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= @@ -1512,8 +1482,9 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -1524,8 +1495,9 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1543,7 +1515,6 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1554,18 +1525,19 @@ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70 h1:syTAU9FwmvzEoIYMqcPHOcVm4H3U5u90WsvuYgwpETU= -golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1615,8 +1587,9 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0 h1:UG21uOlmZabA4fW5i7ZX6bjw1xELEGg/ZLgZq9auk/Q= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1644,7 +1617,6 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1675,7 +1647,6 @@ golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -1690,8 +1661,9 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220111093109-d55c255bac03/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b h1:tvrvnPFcdzp294diPnrdZZZ8XUt2Tyj7svb7X52iDuU= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1709,7 +1681,6 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1728,7 +1699,6 @@ golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1757,11 +1727,8 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1816,7 +1783,7 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1849,16 +1816,17 @@ golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211102061401-a2f17f7b995c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220317061510-51cd9980dadf h1:Fm4IcnUL803i92qDlmB0obyHmosDrxZWxJL3gIeNqOw= golang.org/x/sys v0.0.0-20220317061510-51cd9980dadf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956 h1:XeJjHH1KiLpKGb6lvMiksZ9l0fVUh+AmGcm0nOMEBOY= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1872,8 +1840,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1883,8 +1852,9 @@ golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 h1:M73Iuj3xbbb9Uk1DYhzydthsj6oOd6l9bpuFcNoUvTs= golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U= +golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1913,7 +1883,6 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1960,19 +1929,20 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= @@ -2013,10 +1983,8 @@ google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6 google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/appengine v1.0.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2070,7 +2038,9 @@ google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -2092,16 +2062,15 @@ google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106 h1:ErU+UA6wxadoU8nWrsy5MZUVBs75K17zUCsUCIfrXCE= google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e h1:S9GbmC1iCgvbLyAokVCwiO6tVIrU9Y7c5oMx1V/ki/Y= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -2134,8 +2103,9 @@ google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2149,8 +2119,9 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2169,9 +2140,8 @@ gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWd gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= -gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= @@ -2197,8 +2167,9 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.0.3/go.mod h1:twGxftLBlFgNVNakL7F+P/x9oYqoymG3YYT8cAfI9oI= gorm.io/driver/mysql v1.3.4 h1:/KoBMgsUHC3bExsekDcmNYaBnfH2WNeFuXqqrqMc98Q= gorm.io/driver/mysql v1.3.4/go.mod h1:s4Tq0KmD0yhPGHbZEwg1VPlH0vT/GBHJZorPzhcxBUE= diff --git a/internal/conf/conf.go b/internal/conf/conf.go index 76a2536d..77e3d5b1 100644 --- a/internal/conf/conf.go +++ b/internal/conf/conf.go @@ -1,9 +1,15 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package conf import ( "log" "sync" "time" + + "github.com/alimy/cfg" ) var ( @@ -12,13 +18,21 @@ var ( loggerZincSetting *LoggerZincSettingS loggerMeiliSetting *LoggerMeiliSettingS redisSetting *RedisSettingS - features *FeaturesSettingS + PyroscopeSetting *PyroscopeSettingS DatabaseSetting *DatabaseSetingS MysqlSetting *MySQLSettingS PostgresSetting *PostgresSettingS Sqlite3Setting *Sqlite3SettingS - ServerSetting *ServerSettingS + ServerSetting *HttpServerSettingS + WebServerSetting *HttpServerSettingS + AdminServerSetting *HttpServerSettingS + SpaceXServerSetting *HttpServerSettingS + BotServerSetting *HttpServerSettingS + LocalossServerSetting *HttpServerSettingS + FrontendWebSetting *HttpServerSettingS + DocsServerSetting *HttpServerSettingS + MobileServerSetting *GRPCServerSettingS AppSetting *AppSettingS CacheIndexSetting *CacheIndexSettingS SimpleCacheIndexSetting *SimpleCacheIndexSettingS @@ -45,49 +59,56 @@ func setupSetting(suite []string, noDefault bool) error { return err } - features = setting.FeaturesFrom("Features") + // initialize features configure + ss, kv := setting.featuresInfoFrom("Features") + cfg.Initial(ss, kv) if len(suite) > 0 { - if err = features.Use(suite, noDefault); err != nil { - return err - } + cfg.Use(suite, noDefault) } - objects := map[string]interface{}{ - "App": &AppSetting, - "Server": &ServerSetting, - "CacheIndex": &CacheIndexSetting, - "SimpleCacheIndex": &SimpleCacheIndexSetting, - "BigCacheIndex": &BigCacheIndexSetting, - "Alipay": &AlipaySetting, - "SmsJuhe": &SmsJuheSetting, - "Logger": &loggerSetting, - "LoggerFile": &loggerFileSetting, - "LoggerZinc": &loggerZincSetting, - "LoggerMeili": &loggerMeiliSetting, - "Database": &DatabaseSetting, - "MySQL": &MysqlSetting, - "Postgres": &PostgresSetting, - "Sqlite3": &Sqlite3Setting, - "TweetSearch": &TweetSearchSetting, - "Zinc": &ZincSetting, - "Meili": &MeiliSetting, - "Redis": &redisSetting, - "JWT": &JWTSetting, - "ObjectStorage": &ObjectStorage, - "AliOSS": &AliOSSSetting, - "COS": &COSSetting, - "HuaweiOBS": &HuaweiOBSSetting, - "MinIO": &MinIOSetting, - "LocalOSS": &LocalOSSSetting, - "S3": &S3Setting, + objects := map[string]any{ + "App": &AppSetting, + "Server": &ServerSetting, + "WebServer": &WebServerSetting, + "AdminServer": &AdminServerSetting, + "SpaceXServer": &SpaceXServerSetting, + "BotServer": &BotServerSetting, + "LocalossServer": &LocalossServerSetting, + "FrontendWebServer": &FrontendWebSetting, + "DocsServer": &DocsServerSetting, + "MobileServer": &MobileServerSetting, + "CacheIndex": &CacheIndexSetting, + "SimpleCacheIndex": &SimpleCacheIndexSetting, + "BigCacheIndex": &BigCacheIndexSetting, + "Alipay": &AlipaySetting, + "SmsJuhe": &SmsJuheSetting, + "Pyroscope": &PyroscopeSetting, + "Logger": &loggerSetting, + "LoggerFile": &loggerFileSetting, + "LoggerZinc": &loggerZincSetting, + "LoggerMeili": &loggerMeiliSetting, + "Database": &DatabaseSetting, + "MySQL": &MysqlSetting, + "Postgres": &PostgresSetting, + "Sqlite3": &Sqlite3Setting, + "TweetSearch": &TweetSearchSetting, + "Zinc": &ZincSetting, + "Meili": &MeiliSetting, + "Redis": &redisSetting, + "JWT": &JWTSetting, + "ObjectStorage": &ObjectStorage, + "AliOSS": &AliOSSSetting, + "COS": &COSSetting, + "HuaweiOBS": &HuaweiOBSSetting, + "MinIO": &MinIOSetting, + "LocalOSS": &LocalOSSSetting, + "S3": &S3Setting, } if err = setting.Unmarshal(objects); err != nil { return err } JWTSetting.Expire *= time.Second - ServerSetting.ReadTimeout *= time.Second - ServerSetting.WriteTimeout *= time.Second SimpleCacheIndexSetting.CheckTickDuration *= time.Second SimpleCacheIndexSetting.ExpireTickDuration *= time.Second BigCacheIndexSetting.ExpireInSecond *= time.Second @@ -106,39 +127,26 @@ func Initialize(suite []string, noDefault bool) { setupDBEngine() } -// Cfg get value by key if exist -func Cfg(key string) (string, bool) { - return features.Cfg(key) -} - -// CfgIf check expression is true. if expression just have a string like -// `Sms` is mean `Sms` whether define in suite feature settings. expression like -// `Sms = SmsJuhe` is mean whether `Sms` define in suite feature settings and value -// is `SmsJuhe`` -func CfgIf(expression string) bool { - return features.CfgIf(expression) -} - func GetOssDomain() string { uri := "https://" - if CfgIf("AliOSS") { + if cfg.If("AliOSS") { return uri + AliOSSSetting.Domain + "/" - } else if CfgIf("COS") { + } else if cfg.If("COS") { return uri + COSSetting.Domain + "/" - } else if CfgIf("HuaweiOBS") { + } else if cfg.If("HuaweiOBS") { return uri + HuaweiOBSSetting.Domain + "/" - } else if CfgIf("MinIO") { + } else if cfg.If("MinIO") { if !MinIOSetting.Secure { uri = "http://" } return uri + MinIOSetting.Domain + "/" + MinIOSetting.Bucket + "/" - } else if CfgIf("S3") { + } else if cfg.If("S3") { if !S3Setting.Secure { uri = "http://" } // TODO: will not work well need test in real world return uri + S3Setting.Domain + "/" + S3Setting.Bucket + "/" - } else if CfgIf("LocalOSS") { + } else if cfg.If("LocalOSS") { if !LocalOSSSetting.Secure { uri = "http://" } @@ -146,3 +154,10 @@ func GetOssDomain() string { } return uri + AliOSSSetting.Domain + "/" } + +func RunMode() string { + if !cfg.If("Deprecated:OldWeb") { + return ServerSetting.RunMode + } + return AppSetting.RunMode +} diff --git a/internal/conf/config.yaml b/internal/conf/config.yaml new file mode 100644 index 00000000..6ea7d3c6 --- /dev/null +++ b/internal/conf/config.yaml @@ -0,0 +1,184 @@ +App: # APP基础设置项 + RunMode: debug + AttachmentIncomeRate: 0.8 + MaxCommentCount: 10 + DefaultContextTimeout: 60 + DefaultPageSize: 10 + MaxPageSize: 100 +Server: # 服务设置 + RunMode: debug + HttpIp: 0.0.0.0 + HttpPort: 8008 + ReadTimeout: 60 + WriteTimeout: 60 +Features: + Default: [] +WebServer: # Web服务 + HttpIp: 0.0.0.0 + HttpPort: 8010 + ReadTimeout: 60 + WriteTimeout: 60 +AdminServer: # Admin后台运维服务 + HttpIp: 0.0.0.0 + HttpPort: 8014 + ReadTimeout: 60 + WriteTimeout: 60 +SpaceXServer: # SpaceX服务 + HttpIp: 0.0.0.0 + HttpPort: 8012 + ReadTimeout: 60 + WriteTimeout: 60 +BotServer: # Bot服务 + HttpIp: 0.0.0.0 + HttpPort: 8016 + ReadTimeout: 60 + WriteTimeout: 60 +LocalossServer: # Localoss服务 + HttpIp: 0.0.0.0 + HttpPort: 8018 + ReadTimeout: 60 + WriteTimeout: 60 +FrontendWebServer: # Web前端静态资源服务 + HttpIp: 0.0.0.0 + HttpPort: 8006 + ReadTimeout: 60 + WriteTimeout: 60 +DocsServer: # 开发文档服务 + HttpIp: 0.0.0.0 + HttpPort: 8011 + ReadTimeout: 60 + WriteTimeout: 60 +MobileServer: # 移动端grpc api服务 + Host: 0.0.0.0 + Port: 8020 +SmsJuhe: + Gateway: https://v.juhe.cn/sms/send + Key: + TplID: + TplVal: "#code#=%s&#m#=%d" +Alipay: + AppID: + InProduction: True + RootCertFile: "custom/alipay/RootCert.crt" + PublicCertFile: "custom/alipay/CertPublicKey_RSA2.crt" + AppPublicCertFile: "custom/alipay/AppCertPublicKey.crt" +CacheIndex: + MaxUpdateQPS: 100 # 最大添加/删除/更新Post的QPS, 设置范围[10, 10000], 默认100 +SimpleCacheIndex: # 缓存泡泡广场消息流 + MaxIndexSize: 200 # 最大缓存条数 + CheckTickDuration: 60 # 循环自检查每多少秒一次 + ExpireTickDuration: 300 # 每多少秒后强制过期缓存, 设置为0禁止强制使缓存过期 +BigCacheIndex: # 使用BigCache缓存泡泡广场消息流 + MaxIndexPage: 1024 # 最大缓存页数,必须是2^n, 代表最大同时缓存多少页数据 + HardMaxCacheSize: 256 # 最大缓存大小(MB),0表示无限制 + Verbose: False # 是否打印cache操作的log + ExpireInSecond: 300 # 多少秒(>0)后强制过期缓存 +Pyroscope: # Pyroscope配置 + AppName: "paopao-ce" # application name + Endpoint: "http://localhost:4040" # Pyroscope server address + AuthToken: # Pyroscope authentication token + Logger: none # Pyroscope logger (standard | logrus | none) +Logger: # 日志通用配置 + Level: debug # 日志级别 panic|fatal|error|warn|info|debug|trace +LoggerFile: # 使用File写日志 + SavePath: data/paopao-ce/logs + FileName: app + FileExt: .log +LoggerZinc: # 使用Zinc写日志 + Host: zinc:4080 + Index: paopao-log + User: admin + Password: admin + Secure: False +LoggerMeili: # 使用Meili写日志 + Host: meili:7700 + Index: paopao-log + ApiKey: paopao-meilisearch + Secure: False + MinWorker: 5 # 最小后台工作者, 设置范围[5, 100], 默认5 + MaxLogBuffer: 100 # 最大log缓存条数, 设置范围[10, 10000], 默认100 +JWT: # 鉴权加密 + Secret: 18a6413dc4fe394c66345ebe501b2f26 + Issuer: paopao-api + Expire: 86400 +TweetSearch: # 推文关键字搜索相关配置 + MaxUpdateQPS: 100 # 最大添加/删除/更新Post的QPS,设置范围[10, 10000], 默认100 + MinWorker: 10 # 最小后台更新工作者, 设置范围[5, 1000], 默认10 +Zinc: # Zinc搜索配置 + Host: zinc:4080 + Index: paopao-data + User: admin + Password: admin + Secure: False +Meili: # Meili搜索配置 + Host: meili:7700 + Index: paopao-data + ApiKey: paopao-meilisearch + Secure: False +ObjectStorage: # 对象存储通用配置 + RetainInDays: 2 # 临时对象过期时间多少天 + TempDir: tmp # 临时对象存放目录名 +AliOSS: # 阿里云OSS存储配置 + Endpoint: + AccessKeyID: + AccessKeySecret: + Bucket: + Domain: +COS: # 腾讯云COS存储配置 + SecretID: + SecretKey: + Region: ap-shanghai + Bucket: demo-1888888888 + Domain: +HuaweiOBS: # 华为云OBS存储配置 + AccessKey: + SecretKey: + Endpoint: + Bucket: paopao + Domain: +MinIO: # MinIO 存储配置 + AccessKey: Q3AM3UQ867SPQQA43P2F + SecretKey: zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG + Secure: False + Endpoint: minio:9000 + Bucket: paopao + Domain: 127.0.0.1:9000 +S3: # Amazon S3 存储配置 + AccessKey: "YOUR-ACCESSKEYID" + SecretKey: "YOUR-SECRETACCESSKEY" + Secure: True + Endpoint: s3.amazonaws.com + Bucket: paopao + Domain: +LocalOSS: # 本地文件OSS存储配置 + SavePath: data/paopao-ce/oss + Secure: False + Bucket: paopao + Domain: 127.0.0.1:8008 +Database: # Database通用配置 + LogLevel: error # 日志级别 silent|error|warn|info + TablePrefix: p_ # 表名前缀 +MySQL: # MySQL数据库 + Username: paopao + Password: paopao + Host: db:3306 + DBName: paopao + Charset: utf8mb4 + ParseTime: True + MaxIdleConns: 10 + MaxOpenConns: 30 +Postgres: # PostgreSQL数据库 + User: paopao + Password: paopao + DBName: paopao + Host: localhost + Port: 5432 + SSLMode: disable + TimeZone: Asia/Shanghai +Sqlite3: # Sqlite3数据库 + Path: data/sqlite3/paopao-ce.db +Redis: + Host: redis:6379 + Password: + DB: + \ No newline at end of file diff --git a/internal/conf/db.go b/internal/conf/db.go index ddca7030..62ad7fe3 100644 --- a/internal/conf/db.go +++ b/internal/conf/db.go @@ -1,9 +1,14 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package conf import ( "sync" "time" + "github.com/alimy/cfg" "github.com/go-redis/redis/v8" "github.com/sirupsen/logrus" "gorm.io/driver/mysql" @@ -59,15 +64,15 @@ func newDBEngine() (*gorm.DB, error) { db *gorm.DB err error ) - if CfgIf("MySQL") { + if cfg.If("MySQL") { logrus.Debugln("use MySQL as db") if db, err = gorm.Open(mysql.Open(MysqlSetting.Dsn()), config); err == nil { db.Use(plugin) } - } else if CfgIf("Postgres") { + } else if cfg.If("Postgres") { logrus.Debugln("use PostgreSQL as db") db, err = gorm.Open(postgres.Open(PostgresSetting.Dsn()), config) - } else if CfgIf("Sqlite3") { + } else if cfg.If("Sqlite3") { logrus.Debugf("use Sqlite3 as db path:%s sqlite3InCgoEnabled:%t", Sqlite3Setting.Path, sqlite3InCgoEnabled) db, err = gormOpenSqlite3(config) } else { diff --git a/internal/conf/db_cgo.go b/internal/conf/db_cgo.go index 3ec8a218..218512a5 100644 --- a/internal/conf/db_cgo.go +++ b/internal/conf/db_cgo.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + //go:build cgo // +build cgo diff --git a/internal/conf/db_nocgo.go b/internal/conf/db_nocgo.go index 37937484..977a6695 100644 --- a/internal/conf/db_nocgo.go +++ b/internal/conf/db_nocgo.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + //go:build !cgo // +build !cgo diff --git a/internal/conf/logger.go b/internal/conf/logger.go index ef466079..cbe3cc1b 100644 --- a/internal/conf/logger.go +++ b/internal/conf/logger.go @@ -1,8 +1,13 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package conf import ( "io" + "github.com/alimy/cfg" "github.com/sirupsen/logrus" "gopkg.in/natefinch/lumberjack.v2" ) @@ -20,16 +25,20 @@ func setupLogger() { logrus.SetFormatter(&logrus.JSONFormatter{}) logrus.SetLevel(loggerSetting.logLevel()) - if CfgIf("LoggerFile") { - out := newFileLogger() - logrus.SetOutput(out) - } else if CfgIf("LoggerZinc") { - hook := newZincLogHook() - logrus.SetOutput(io.Discard) - logrus.AddHook(hook) - } else if CfgIf("LoggerMeili") { - hook := newMeiliLogHook() - logrus.SetOutput(io.Discard) - logrus.AddHook(hook) - } + cfg.In(cfg.Actions{ + "LoggerFile": func() { + out := newFileLogger() + logrus.SetOutput(out) + }, + "LoggerZinc": func() { + hook := newZincLogHook() + logrus.SetOutput(io.Discard) + logrus.AddHook(hook) + }, + "LoggerMeili": func() { + hook := newMeiliLogHook() + logrus.SetOutput(io.Discard) + logrus.AddHook(hook) + }, + }) } diff --git a/internal/conf/logger_meili.go b/internal/conf/logger_meili.go index ec47f91a..2d3d439d 100644 --- a/internal/conf/logger_meili.go +++ b/internal/conf/logger_meili.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package conf import ( @@ -5,7 +9,7 @@ import ( "github.com/sirupsen/logrus" ) -type meiliLogData []map[string]interface{} +type meiliLogData []map[string]any type meiliLogHook struct { config meilisearch.ClientConfig diff --git a/internal/conf/logger_zinc.go b/internal/conf/logger_zinc.go index 211270c0..4f804cf8 100644 --- a/internal/conf/logger_zinc.go +++ b/internal/conf/logger_zinc.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package conf import ( diff --git a/internal/conf/seting_test.go b/internal/conf/seting_test.go deleted file mode 100644 index 895a69ad..00000000 --- a/internal/conf/seting_test.go +++ /dev/null @@ -1,114 +0,0 @@ -package conf - -import ( - "testing" -) - -func TestUseDefault(t *testing.T) { - suites := map[string][]string{ - "default": {"Sms", "Alipay", "Zinc", "MySQL", "Redis", "AliOSS", "LogZinc"}, - "develop": {"Zinc", "MySQL", "AliOSS", "LogFile"}, - "slim": {"Zinc", "MySQL", "Redis", "AliOSS", "LogFile"}, - } - kv := map[string]string{ - "sms": "SmsJuhe", - } - features := newFeatures(suites, kv) - for _, data := range []struct { - key string - expect string - exist bool - }{ - {"Sms", "SmsJuhe", true}, - {"Alipay", "", true}, - {"Zinc", "", true}, - {"Redis", "", true}, - {"Database", "", false}, - } { - if v, ok := features.Cfg(data.key); ok != data.exist || v != data.expect { - t.Errorf("key: %s expect: %s exist: %t got v: %s ok: %t", data.key, data.expect, data.exist, v, ok) - } - } - for exp, res := range map[string]bool{ - "Sms": true, - "Sms = SmsJuhe": true, - "SmsJuhe": false, - "default": true, - } { - if ok := features.CfgIf(exp); res != ok { - t.Errorf("CfgIf(%s) want %t got %t", exp, res, ok) - } - } -} - -func TestUse(t *testing.T) { - suites := map[string][]string{ - "default": {"Sms", "Alipay", "Zinc", "MySQL", "Redis", "AliOSS", "LogZinc"}, - "develop": {"Zinc", "MySQL", "AliOSS", "LogFile"}, - "slim": {"Zinc", "MySQL", "Redis", "AliOSS", "LogFile"}, - } - kv := map[string]string{ - "sms": "SmsJuhe", - } - features := newFeatures(suites, kv) - - features.Use([]string{"develop"}, true) - for _, data := range []struct { - key string - expect string - exist bool - }{ - {"Sms", "", false}, - {"Alipay", "", false}, - {"Zinc", "", true}, - {"Redis", "", false}, - {"Database", "", false}, - } { - if v, ok := features.Cfg(data.key); ok != data.exist || v != data.expect { - t.Errorf("key: %s expect: %s exist: %t got v: %s ok: %t", data.key, data.expect, data.exist, v, ok) - } - } - for exp, res := range map[string]bool{ - "Sms": false, - "Sms = SmsJuhe": false, - "SmsJuhe": false, - "default": false, - "develop": true, - } { - if ok := features.CfgIf(exp); res != ok { - t.Errorf("CfgIf(%s) want %t got %t", exp, res, ok) - } - } - - features.UseDefault() - features.Use([]string{"slim", "", "demo"}, false) - for _, data := range []struct { - key string - expect string - exist bool - }{ - {"Sms", "SmsJuhe", true}, - {"Alipay", "", true}, - {"Zinc", "", true}, - {"Redis", "", true}, - {"Database", "", false}, - {"demo", "", true}, - } { - if v, ok := features.Cfg(data.key); ok != data.exist || v != data.expect { - t.Errorf("key: %s expect: %s exist: %t got v: %s ok: %t", data.key, data.expect, data.exist, v, ok) - } - } - for exp, res := range map[string]bool{ - "Sms": true, - "Sms = SmsJuhe": true, - "SmsJuhe": false, - "default": true, - "develop": false, - "slim": true, - "demo": true, - } { - if ok := features.CfgIf(exp); res != ok { - t.Errorf("CfgIf(%s) want %t got %t", exp, res, ok) - } - } -} diff --git a/internal/conf/settting.go b/internal/conf/settting.go index e644fe89..a9b2643d 100644 --- a/internal/conf/settting.go +++ b/internal/conf/settting.go @@ -1,19 +1,35 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package conf import ( + "embed" "fmt" "strings" "time" + "github.com/pyroscope-io/client/pyroscope" "github.com/sirupsen/logrus" "github.com/spf13/viper" "gorm.io/gorm/logger" ) +//go:embed config.yaml +var files embed.FS + type Setting struct { vp *viper.Viper } +type PyroscopeSettingS struct { + AppName string + Endpoint string + AuthToken string + Logger string +} + type LoggerSettingS struct { Level string } @@ -41,7 +57,7 @@ type LoggerMeiliSettingS struct { MinWorker int } -type ServerSettingS struct { +type HttpServerSettingS struct { RunMode string HttpIp string HttpPort string @@ -49,7 +65,13 @@ type ServerSettingS struct { WriteTimeout time.Duration } +type GRPCServerSettingS struct { + Host string + Port string +} + type AppSettingS struct { + RunMode string MaxCommentCount int64 AttachmentIncomeRate float64 DefaultContextTimeout time.Duration @@ -69,14 +91,19 @@ type SimpleCacheIndexSettingS struct { } type BigCacheIndexSettingS struct { - MaxIndexPage int - ExpireInSecond time.Duration - Verbose bool + MaxIndexPage int + HardMaxCacheSize int + ExpireInSecond time.Duration + Verbose bool } type AlipaySettingS struct { - AppID string - PrivateKey string + AppID string + PrivateKey string + RootCertFile string + PublicCertFile string + AppPublicCertFile string + InProduction bool } type SmsJuheSettings struct { @@ -86,12 +113,6 @@ type SmsJuheSettings struct { TplVal string } -type FeaturesSettingS struct { - kv map[string]string - suites map[string][]string - features map[string]string -} - type TweetSearchS struct { MaxUpdateQPS int MinWorker int @@ -201,29 +222,36 @@ type JWTSettingS struct { } func NewSetting() (*Setting, error) { + cfgFile, err := files.Open("config.yaml") + if err != nil { + return nil, err + } + defer cfgFile.Close() + vp := viper.New() vp.SetConfigName("config") vp.AddConfigPath(".") - vp.AddConfigPath("configs/") + vp.AddConfigPath("custom/") vp.SetConfigType("yaml") - err := vp.ReadInConfig() - if err != nil { + if err = vp.ReadConfig(cfgFile); err != nil { + return nil, err + } + if err = vp.MergeInConfig(); err != nil { return nil, err } return &Setting{vp}, nil } -func (s *Setting) ReadSection(k string, v interface{}) error { +func (s *Setting) ReadSection(k string, v any) error { err := s.vp.UnmarshalKey(k, v) if err != nil { return err } - return nil } -func (s *Setting) Unmarshal(objects map[string]interface{}) error { +func (s *Setting) Unmarshal(objects map[string]any) error { for k, v := range objects { err := s.vp.UnmarshalKey(k, v) if err != nil { @@ -233,7 +261,7 @@ func (s *Setting) Unmarshal(objects map[string]interface{}) error { return nil } -func (s *Setting) FeaturesFrom(k string) *FeaturesSettingS { +func (s *Setting) featuresInfoFrom(k string) (map[string][]string, map[string]string) { sub := s.vp.Sub(k) keys := sub.AllKeys() @@ -244,77 +272,19 @@ func (s *Setting) FeaturesFrom(k string) *FeaturesSettingS { switch v := val.(type) { case string: kv[key] = v - case []interface{}: + case []any: suites[key] = sub.GetStringSlice(key) } } - return newFeatures(suites, kv) -} - -func newFeatures(suites map[string][]string, kv map[string]string) *FeaturesSettingS { - features := &FeaturesSettingS{ - suites: suites, - kv: kv, - features: make(map[string]string), - } - features.UseDefault() - return features + return suites, kv } -func (f *FeaturesSettingS) UseDefault() { - f.Use([]string{"default"}, true) -} - -func (f *FeaturesSettingS) Use(suite []string, noDefault bool) error { - if noDefault && len(f.features) != 0 { - f.features = make(map[string]string) - } - features := f.flatFeatures(suite) - for _, feature := range features { - if len(feature) == 0 { - continue - } - f.features[feature] = f.kv[feature] - } - return nil +func (s *HttpServerSettingS) GetReadTimeout() time.Duration { + return s.ReadTimeout * time.Second } -func (f *FeaturesSettingS) flatFeatures(suite []string) []string { - features := make([]string, 0, len(suite)+10) - for s := suite[:]; len(s) > 0; s = s[:len(s)-1] { - item := strings.TrimSpace(strings.ToLower(s[0])) - if len(item) > 0 { - if items, exist := f.suites[item]; exist { - s = append(s, items...) - } - features = append(features, item) - } - s[0] = s[len(s)-1] - } - return features -} - -// Cfg get value by key if exist -func (f *FeaturesSettingS) Cfg(key string) (string, bool) { - key = strings.ToLower(key) - value, exist := f.features[key] - return value, exist -} - -// CfgIf check expression is true. if expression just have a string like -// `Sms` is mean `Sms` whether define in suite feature settings. expression like -// `Sms = SmsJuhe` is mean whether `Sms` define in suite feature settings and value -// is `SmsJuhe`` -func (f *FeaturesSettingS) CfgIf(expression string) bool { - kv := strings.Split(expression, "=") - key := strings.Trim(strings.ToLower(kv[0]), " ") - v, ok := f.features[key] - if len(kv) == 2 && ok && strings.Trim(kv[1], " ") == v { - return true - } else if len(kv) == 1 && ok { - return true - } - return false +func (s *HttpServerSettingS) GetWriteTimeout() time.Duration { + return s.WriteTimeout * time.Second } func (s *MySQLSettingS) Dsn() string { @@ -420,6 +390,16 @@ func (s *MeiliSettingS) Endpoint() string { return endpoint(s.Host, s.Secure) } +func (s *PyroscopeSettingS) GetLogger() (logger pyroscope.Logger) { + switch strings.ToLower(s.Logger) { + case "standard": + logger = pyroscope.StandardLogger + case "logrus": + logger = logrus.StandardLogger() + } + return +} + func endpoint(host string, secure bool) string { schema := "http" if secure { diff --git a/internal/core/authority.go b/internal/core/authority.go index 35264485..05e3742a 100644 --- a/internal/core/authority.go +++ b/internal/core/authority.go @@ -1,7 +1,10 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package core import ( - "github.com/rocboss/paopao-ce/internal/model" "github.com/rocboss/paopao-ce/pkg/types" ) @@ -33,31 +36,25 @@ const ( ActCreateActivationCode ) -type act uint8 - -type FriendFilter map[int64]types.Empty +type ( + act uint8 -type Action struct { - Act act - UserId int64 -} + FriendFilter map[int64]types.Empty + FriendSet map[string]types.Empty -// AuthorizationManageService 授权管理服务 -type AuthorizationManageService interface { - IsAllow(user *model.User, action *Action) bool - BeFriendFilter(userId int64) FriendFilter - BeFriendIds(userId int64) ([]int64, error) -} + Action struct { + Act act + UserId int64 + } +) func (f FriendFilter) IsFriend(userId int64) bool { - // _, yesno := f[userId] - // return yesno - // so, you are friend with all world now - return true + _, yeah := f[userId] + return yeah } // IsAllow default true if user is admin -func (a act) IsAllow(user *model.User, userId int64, isFriend bool, isActivation bool) bool { +func (a act) IsAllow(user *User, userId int64, isFriend bool, isActivation bool) bool { if user.IsAdmin { return true } @@ -116,3 +113,11 @@ func (a act) IsAllow(user *model.User, userId int64, isFriend bool, isActivation return false } + +// AuthorizationManageService 授权管理服务 +type AuthorizationManageService interface { + IsAllow(user *User, action *Action) bool + BeFriendFilter(userId int64) FriendFilter + BeFriendIds(userId int64) ([]int64, error) + MyFriendSet(userId int64) FriendSet +} diff --git a/internal/core/cache.go b/internal/core/cache.go index e4cf4cd9..d8b8cd10 100644 --- a/internal/core/cache.go +++ b/internal/core/cache.go @@ -1,6 +1,12 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package core -import "github.com/rocboss/paopao-ce/internal/model" +import ( + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" +) const ( IdxActNop IdxAct = iota + 1 @@ -15,7 +21,7 @@ type IdxAct uint8 type IndexAction struct { Act IdxAct - Post *model.Post + Post *dbr.Post } func (a IdxAct) String() string { @@ -37,7 +43,7 @@ func (a IdxAct) String() string { } } -func NewIndexAction(act IdxAct, post *model.Post) *IndexAction { +func NewIndexAction(act IdxAct, post *dbr.Post) *IndexAction { return &IndexAction{ Act: act, Post: post, @@ -48,5 +54,5 @@ func NewIndexAction(act IdxAct, post *model.Post) *IndexAction { type CacheIndexService interface { IndexPostsService - SendAction(act IdxAct, post *model.Post) + SendAction(act IdxAct, post *dbr.Post) } diff --git a/internal/core/comments.go b/internal/core/comments.go index 9be29ed3..c5501b4b 100644 --- a/internal/core/comments.go +++ b/internal/core/comments.go @@ -1,24 +1,36 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package core import ( - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" +) + +type ( + Comment = dbr.Comment + CommentFormated = dbr.CommentFormated + CommentReply = dbr.CommentReply + CommentContent = dbr.CommentContent + CommentReplyFormated = dbr.CommentReplyFormated ) // CommentService 评论检索服务 type CommentService interface { - GetComments(conditions *model.ConditionsT, offset, limit int) ([]*model.Comment, error) - GetCommentByID(id int64) (*model.Comment, error) - GetCommentCount(conditions *model.ConditionsT) (int64, error) - GetCommentReplyByID(id int64) (*model.CommentReply, error) - GetCommentContentsByIDs(ids []int64) ([]*model.CommentContent, error) - GetCommentRepliesByID(ids []int64) ([]*model.CommentReplyFormated, error) + GetComments(conditions *ConditionsT, offset, limit int) ([]*Comment, error) + GetCommentByID(id int64) (*Comment, error) + GetCommentCount(conditions *ConditionsT) (int64, error) + GetCommentReplyByID(id int64) (*CommentReply, error) + GetCommentContentsByIDs(ids []int64) ([]*CommentContent, error) + GetCommentRepliesByID(ids []int64) ([]*CommentReplyFormated, error) } // CommentManageService 评论管理服务 type CommentManageService interface { - DeleteComment(comment *model.Comment) error - CreateComment(comment *model.Comment) (*model.Comment, error) - CreateCommentReply(reply *model.CommentReply) (*model.CommentReply, error) - DeleteCommentReply(reply *model.CommentReply) error - CreateCommentContent(content *model.CommentContent) (*model.CommentContent, error) + DeleteComment(comment *Comment) error + CreateComment(comment *Comment) (*Comment, error) + CreateCommentReply(reply *CommentReply) (*CommentReply, error) + DeleteCommentReply(reply *CommentReply) error + CreateCommentContent(content *CommentContent) (*CommentContent, error) } diff --git a/internal/core/core.go b/internal/core/core.go index 0c86d5ed..9a8eb26f 100644 --- a/internal/core/core.go +++ b/internal/core/core.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package core // DataService 数据服务集成 @@ -19,16 +23,15 @@ type DataService interface { TweetManageService TweetHelpService - // 附件检测服务 - AttachmentCheckService - // 评论服务 CommentService CommentManageService // 用户服务 UserManageService + ContactManageService // 安全服务 SecurityService + AttachmentCheckService } diff --git a/internal/core/messages.go b/internal/core/messages.go index aa08a1f8..57816480 100644 --- a/internal/core/messages.go +++ b/internal/core/messages.go @@ -1,15 +1,36 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package core import ( - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" +) + +const ( + MsgTypePost = dbr.MsgTypePost + MsgtypeComment = dbr.MsgtypeComment + MsgTypeReply = dbr.MsgTypeReply + MsgTypeWhisper = dbr.MsgTypeWhisper + MsgTypeRequestingFriend = dbr.MsgTypeRequestingFriend + MsgTypeSystem = dbr.MsgTypeSystem + + MsgStatusUnread = dbr.MsgStatusUnread + MsgStatusReaded = dbr.MsgStatusReaded +) + +type ( + Message = dbr.Message + MessageFormated = dbr.MessageFormated ) // MessageService 消息服务 type MessageService interface { - CreateMessage(msg *model.Message) (*model.Message, error) + CreateMessage(msg *Message) (*Message, error) GetUnreadCount(userID int64) (int64, error) - GetMessageByID(id int64) (*model.Message, error) - ReadMessage(message *model.Message) error - GetMessages(conditions *model.ConditionsT, offset, limit int) ([]*model.MessageFormated, error) - GetMessageCount(conditions *model.ConditionsT) (int64, error) + GetMessageByID(id int64) (*Message, error) + ReadMessage(message *Message) error + GetMessages(conditions *ConditionsT, offset, limit int) ([]*MessageFormated, error) + GetMessageCount(conditions *ConditionsT) (int64, error) } diff --git a/internal/core/search.go b/internal/core/search.go index ce738d2f..74d6e029 100644 --- a/internal/core/search.go +++ b/internal/core/search.go @@ -1,7 +1,11 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package core import ( - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" ) const ( @@ -9,25 +13,39 @@ const ( SearchTypeTag SearchType = "tag" ) -type SearchType string +const ( + PostVisitPublic = dbr.PostVisitPublic + PostVisitPrivate = dbr.PostVisitPrivate + PostVisitFriend = dbr.PostVisitFriend + PostVisitInvalid = dbr.PostVisitInvalid +) -type QueryReq struct { - Query string - Visibility []model.PostVisibleT - Type SearchType -} +type ( + PostVisibleT = dbr.PostVisibleT -type QueryResp struct { - Items []*model.PostFormated - Total int64 -} + SearchType string + + QueryReq struct { + Query string + Visibility []PostVisibleT + Type SearchType + } -type DocItems []map[string]interface{} + QueryResp struct { + Items []*PostFormated + Total int64 + } + + TsDocItem struct { + Post *Post + Content string + } +) // TweetSearchService tweet search service interface type TweetSearchService interface { IndexName() string - AddDocuments(documents DocItems, primaryKey ...string) (bool, error) + AddDocuments(data []TsDocItem, primaryKey ...string) (bool, error) DeleteDocuments(identifiers []string) error - Search(user *model.User, q *QueryReq, offset, limit int) (*QueryResp, error) + Search(user *User, q *QueryReq, offset, limit int) (*QueryResp, error) } diff --git a/internal/core/security.go b/internal/core/security.go index 63a7ac21..ce313635 100644 --- a/internal/core/security.go +++ b/internal/core/security.go @@ -1,17 +1,32 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package core import ( - "github.com/rocboss/paopao-ce/internal/model" + "time" + + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" +) + +type ( + Captcha = dbr.Captcha ) // SecurityService 安全相关服务 type SecurityService interface { - GetLatestPhoneCaptcha(phone string) (*model.Captcha, error) - UsePhoneCaptcha(captcha *model.Captcha) error + GetLatestPhoneCaptcha(phone string) (*Captcha, error) + UsePhoneCaptcha(captcha *Captcha) error SendPhoneCaptcha(phone string) error } -// 附件检测服务 +// AttachmentCheckService 附件检测服务 type AttachmentCheckService interface { CheckAttachment(uri string) error } + +// PhoneVerifyService 手机验证服务 +type PhoneVerifyService interface { + SendPhoneCaptcha(phone string, captcha string, expire time.Duration) error +} diff --git a/internal/core/storage.go b/internal/core/storage.go index 2a241bca..310edf29 100644 --- a/internal/core/storage.go +++ b/internal/core/storage.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package core import ( diff --git a/internal/core/topics.go b/internal/core/topics.go index a894f9b2..138cc151 100644 --- a/internal/core/topics.go +++ b/internal/core/topics.go @@ -1,13 +1,22 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package core import ( - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" +) + +type ( + Tag = dbr.Tag + TagFormated = dbr.TagFormated ) // TopicService 话题服务 type TopicService interface { - CreateTag(tag *model.Tag) (*model.Tag, error) - DeleteTag(tag *model.Tag) error - GetTags(conditions *model.ConditionsT, offset, limit int) ([]*model.Tag, error) - GetTagsByKeyword(keyword string) ([]*model.Tag, error) + CreateTag(tag *Tag) (*Tag, error) + DeleteTag(tag *Tag) error + GetTags(conditions *ConditionsT, offset, limit int) ([]*Tag, error) + GetTagsByKeyword(keyword string) ([]*Tag, error) } diff --git a/internal/core/tweets.go b/internal/core/tweets.go index 1b454c6d..682cbd65 100644 --- a/internal/core/tweets.go +++ b/internal/core/tweets.go @@ -1,49 +1,83 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package core import ( - "github.com/rocboss/paopao-ce/internal/model" - "github.com/rocboss/paopao-ce/internal/model/rest" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" +) + +const ( + AttachmentTypeImage = dbr.AttachmentTypeImage + AttachmentTypeVideo = dbr.AttachmentTypeVideo + AttachmentTypeOther = dbr.AttachmentTypeOther + + // 类型,1标题,2文字段落,3图片地址,4视频地址,5语音地址,6链接地址,7附件资源 + ContentTypeTitle = dbr.ContentTypeTitle + ContentTypeText = dbr.ContentTypeText + ContentTypeImage = dbr.ContentTypeImage + ContentTypeVideo = dbr.ContentTypeVideo + ContentTypeAudio = dbr.ContentTypeAudio + ContentTypeLink = dbr.ContentTypeLink + ContentTypeAttachment = dbr.ContentTypeAttachment + ContentTypeChargeAttachment = dbr.ContentTypeChargeAttachment +) + +type ( + PostStar = dbr.PostStar + PostCollection = dbr.PostCollection + PostAttachmentBill = dbr.PostAttachmentBill + PostContent = dbr.PostContent + Attachment = dbr.Attachment + AttachmentType = dbr.AttachmentType + PostContentT = dbr.PostContentT + + IndexTweetList struct { + Tweets []*PostFormated + Total int64 + } ) // TweetService 推文检索服务 type TweetService interface { - GetPostByID(id int64) (*model.Post, error) - GetPosts(conditions *model.ConditionsT, offset, limit int) ([]*model.Post, error) - GetPostCount(conditions *model.ConditionsT) (int64, error) - GetUserPostStar(postID, userID int64) (*model.PostStar, error) - GetUserPostStars(userID int64, offset, limit int) ([]*model.PostStar, error) + GetPostByID(id int64) (*Post, error) + GetPosts(conditions *ConditionsT, offset, limit int) ([]*Post, error) + GetPostCount(conditions *ConditionsT) (int64, error) + GetUserPostStar(postID, userID int64) (*PostStar, error) + GetUserPostStars(userID int64, offset, limit int) ([]*PostStar, error) GetUserPostStarCount(userID int64) (int64, error) - GetUserPostCollection(postID, userID int64) (*model.PostCollection, error) - GetUserPostCollections(userID int64, offset, limit int) ([]*model.PostCollection, error) + GetUserPostCollection(postID, userID int64) (*PostCollection, error) + GetUserPostCollections(userID int64, offset, limit int) ([]*PostCollection, error) GetUserPostCollectionCount(userID int64) (int64, error) - GetPostAttatchmentBill(postID, userID int64) (*model.PostAttachmentBill, error) - GetPostContentsByIDs(ids []int64) ([]*model.PostContent, error) - GetPostContentByID(id int64) (*model.PostContent, error) + GetPostAttatchmentBill(postID, userID int64) (*PostAttachmentBill, error) + GetPostContentsByIDs(ids []int64) ([]*PostContent, error) + GetPostContentByID(id int64) (*PostContent, error) } // TweetManageService 推文管理服务,包括创建/删除/更新推文 type TweetManageService interface { - CreateAttachment(attachment *model.Attachment) (*model.Attachment, error) - CreatePost(post *model.Post) (*model.Post, error) - DeletePost(post *model.Post) ([]string, error) - LockPost(post *model.Post) error - StickPost(post *model.Post) error - VisiblePost(post *model.Post, visibility model.PostVisibleT) error - UpdatePost(post *model.Post) error - CreatePostStar(postID, userID int64) (*model.PostStar, error) - DeletePostStar(p *model.PostStar) error - CreatePostCollection(postID, userID int64) (*model.PostCollection, error) - DeletePostCollection(p *model.PostCollection) error - CreatePostContent(content *model.PostContent) (*model.PostContent, error) + CreateAttachment(attachment *Attachment) (*Attachment, error) + CreatePost(post *Post) (*Post, error) + DeletePost(post *Post) ([]string, error) + LockPost(post *Post) error + StickPost(post *Post) error + VisiblePost(post *Post, visibility PostVisibleT) error + UpdatePost(post *Post) error + CreatePostStar(postID, userID int64) (*PostStar, error) + DeletePostStar(p *PostStar) error + CreatePostCollection(postID, userID int64) (*PostCollection, error) + DeletePostCollection(p *PostCollection) error + CreatePostContent(content *PostContent) (*PostContent, error) } // TweetHelpService 推文辅助服务 type TweetHelpService interface { - RevampPosts(posts []*model.PostFormated) ([]*model.PostFormated, error) - MergePosts(posts []*model.Post) ([]*model.PostFormated, error) + RevampPosts(posts []*PostFormated) ([]*PostFormated, error) + MergePosts(posts []*Post) ([]*PostFormated, error) } // IndexPostsService 广场首页推文列表服务 type IndexPostsService interface { - IndexPosts(user *model.User, offset int, limit int) (*rest.IndexTweetsResp, error) + IndexPosts(user *User, offset int, limit int) (*IndexTweetList, error) } diff --git a/internal/core/types.go b/internal/core/types.go new file mode 100644 index 00000000..6ca95893 --- /dev/null +++ b/internal/core/types.go @@ -0,0 +1,24 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package core + +import ( + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" +) + +const ( + UserStatusNormal = dbr.UserStatusNormal + UserStatusClosed = dbr.UserStatusClosed +) + +type ( + User = dbr.User + Post = dbr.Post + ConditionsT = dbr.ConditionsT + PostFormated = dbr.PostFormated + UserFormated = dbr.UserFormated + PostContentFormated = dbr.PostContentFormated + Model = dbr.Model +) diff --git a/internal/core/user.go b/internal/core/user.go index 36ceabfc..ed132dd3 100644 --- a/internal/core/user.go +++ b/internal/core/user.go @@ -1,17 +1,41 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package core -import ( - "github.com/rocboss/paopao-ce/internal/model" +type ( + ContactItem struct { + UserId int64 `json:"user_id"` + UserName string `json:"username"` + Nickname string `json:"nickname"` + Avatar string `json:"avatar"` + Phone string `json:"phone"` + } + + ContactList struct { + Contacts []ContactItem `json:"contacts"` + Total int64 `json:"total"` + } ) // UserManageService 用户管理服务 type UserManageService interface { - GetUserByID(id int64) (*model.User, error) - GetUserByUsername(username string) (*model.User, error) - GetUserByPhone(phone string) (*model.User, error) - GetUsersByIDs(ids []int64) ([]*model.User, error) - GetUsersByKeyword(keyword string) ([]*model.User, error) - CreateUser(user *model.User) (*model.User, error) - UpdateUser(user *model.User) error + GetUserByID(id int64) (*User, error) + GetUserByUsername(username string) (*User, error) + GetUserByPhone(phone string) (*User, error) + GetUsersByIDs(ids []int64) ([]*User, error) + GetUsersByKeyword(keyword string) ([]*User, error) + CreateUser(user *User) (*User, error) + UpdateUser(user *User) error +} + +// ContactManageService 联系人管理服务 +type ContactManageService interface { + RequestingFriend(userId int64, friendId int64, greetings string) error + AddFriend(userId int64, friendId int64) error + RejectFriend(userId int64, friendId int64) error + DeleteFriend(userId int64, friendId int64) error + GetContacts(userId int64, offset int, limit int) (*ContactList, error) IsFriend(userID int64, friendID int64) bool } diff --git a/internal/core/version.go b/internal/core/version.go index e603c0a5..07376c39 100644 --- a/internal/core/version.go +++ b/internal/core/version.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package core import ( diff --git a/internal/core/wallet.go b/internal/core/wallet.go index 5b3a3391..c4792d3b 100644 --- a/internal/core/wallet.go +++ b/internal/core/wallet.go @@ -1,15 +1,24 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package core import ( - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" +) + +type ( + WalletStatement = dbr.WalletStatement + WalletRecharge = dbr.WalletRecharge ) // WalletService wallet service interface type WalletService interface { - GetUserWalletBills(userID int64, offset, limit int) ([]*model.WalletStatement, error) + GetUserWalletBills(userID int64, offset, limit int) ([]*WalletStatement, error) GetUserWalletBillCount(userID int64) (int64, error) - GetRechargeByID(id int64) (*model.WalletRecharge, error) - CreateRecharge(userId, amount int64) (*model.WalletRecharge, error) - HandleRechargeSuccess(recharge *model.WalletRecharge, tradeNo string) error - HandlePostAttachmentBought(post *model.Post, user *model.User) error + GetRechargeByID(id int64) (*WalletRecharge, error) + CreateRecharge(userId, amount int64) (*WalletRecharge, error) + HandleRechargeSuccess(recharge *WalletRecharge, tradeNo string) error + HandlePostAttachmentBought(post *Post, user *User) error } diff --git a/internal/dao/cache/bigcache.go b/internal/dao/cache/bigcache.go index 09e5c03c..8ec83c38 100644 --- a/internal/dao/cache/bigcache.go +++ b/internal/dao/cache/bigcache.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package cache import ( @@ -11,8 +15,7 @@ import ( "github.com/Masterminds/semver/v3" "github.com/allegro/bigcache/v3" "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" - "github.com/rocboss/paopao-ce/internal/model/rest" + "github.com/rocboss/paopao-ce/pkg/types" "github.com/sirupsen/logrus" ) @@ -23,11 +26,12 @@ var ( type postsEntry struct { key string - tweets *rest.IndexTweetsResp + tweets *core.IndexTweetList } type bigCacheIndexServant struct { ips core.IndexPostsService + ams core.AuthorizationManageService indexActionCh chan *core.IndexAction cachePostsCh chan *postsEntry @@ -36,7 +40,7 @@ type bigCacheIndexServant struct { preventDuration time.Duration } -func (s *bigCacheIndexServant) IndexPosts(user *model.User, offset int, limit int) (*rest.IndexTweetsResp, error) { +func (s *bigCacheIndexServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { key := s.keyFrom(user, offset, limit) posts, err := s.getPosts(key) if err == nil { @@ -52,7 +56,7 @@ func (s *bigCacheIndexServant) IndexPosts(user *model.User, offset int, limit in return posts, nil } -func (s *bigCacheIndexServant) getPosts(key string) (*rest.IndexTweetsResp, error) { +func (s *bigCacheIndexServant) getPosts(key string) (*core.IndexTweetList, error) { data, err := s.cache.Get(key) if err != nil { logrus.Debugf("bigCacheIndexServant.getPosts get posts by key: %s from cache err: %v", key, err) @@ -60,7 +64,7 @@ func (s *bigCacheIndexServant) getPosts(key string) (*rest.IndexTweetsResp, erro } buf := bytes.NewBuffer(data) dec := gob.NewDecoder(buf) - var resp rest.IndexTweetsResp + var resp core.IndexTweetList if err := dec.Decode(&resp); err != nil { logrus.Debugf("bigCacheIndexServant.getPosts get posts from cache in decode err: %v", err) return nil, err @@ -68,7 +72,7 @@ func (s *bigCacheIndexServant) getPosts(key string) (*rest.IndexTweetsResp, erro return &resp, nil } -func (s *bigCacheIndexServant) cachePosts(key string, tweets *rest.IndexTweetsResp) { +func (s *bigCacheIndexServant) cachePosts(key string, tweets *core.IndexTweetList) { entry := &postsEntry{key: key, tweets: tweets} select { case s.cachePostsCh <- entry: @@ -94,7 +98,7 @@ func (s *bigCacheIndexServant) setPosts(entry *postsEntry) { logrus.Debugf("bigCacheIndexServant.setPosts setPosts set cache by key: %s", entry.key) } -func (s *bigCacheIndexServant) keyFrom(user *model.User, offset int, limit int) string { +func (s *bigCacheIndexServant) keyFrom(user *core.User, offset int, limit int) string { var userId int64 = -1 if user != nil { userId = user.ID @@ -102,7 +106,7 @@ func (s *bigCacheIndexServant) keyFrom(user *model.User, offset int, limit int) return fmt.Sprintf("index:%d:%d:%d", userId, offset, limit) } -func (s *bigCacheIndexServant) SendAction(act core.IdxAct, post *model.Post) { +func (s *bigCacheIndexServant) SendAction(act core.IdxAct, post *core.Post) { action := core.NewIndexAction(act, post) select { case s.indexActionCh <- action: @@ -132,8 +136,8 @@ func (s *bigCacheIndexServant) handleIndexAction(action *core.IndexAction) { // 创建/删除 私密推文特殊处理 switch act { case core.IdxActCreatePost, core.IdxActDeletePost: - if post.Visibility == model.PostVisitPrivate { - s.deleteCacheByUserId(post.UserID) + if post.Visibility == core.PostVisitPrivate { + s.deleteCacheByUserId(post.UserID, true) return } } @@ -141,29 +145,34 @@ func (s *bigCacheIndexServant) handleIndexAction(action *core.IndexAction) { // 如果在s.preventDuration时间内就清除所有缓存,否则只清除自个儿的缓存 // TODO: 需要优化只清除受影响的缓存,后续完善 if time.Since(s.lastCacheResetTime) > s.preventDuration { - s.cache.Reset() - s.lastCacheResetTime = time.Now() - logrus.Debugf("bigCacheIndexServant.handleIndexAction reset cache by %s", action.Act) + s.deleteCacheByUserId(post.UserID, false) } else { - s.deleteCacheByUserId(post.UserID) + s.deleteCacheByUserId(post.UserID, true) } } -func (s *bigCacheIndexServant) deleteCacheByUserId(id int64) { +func (s *bigCacheIndexServant) deleteCacheByUserId(id int64, oneself bool) { var keys []string userId := strconv.FormatInt(id, 10) + friendSet := core.FriendSet{} + if !oneself { + friendSet = s.ams.MyFriendSet(id) + } + friendSet[userId] = types.Empty{} // 获取需要删除缓存的key,目前是仅删除自个儿的缓存 for it := s.cache.Iterator(); it.SetNext(); { entry, err := it.Value() if err != nil { - logrus.Debugf("bigCacheIndexServant.deleteCacheByUserId usrId: %s err:%s", userId, err) + logrus.Debugf("bigCacheIndexServant.deleteCacheByUserId userId: %s err:%s", userId, err) return } key := entry.Key() keyParts := strings.Split(key, ":") - if len(keyParts) > 2 && keyParts[0] == "index" && keyParts[1] == userId { - keys = append(keys, key) + if len(keyParts) > 2 && keyParts[0] == "index" { + if _, ok := friendSet[keyParts[1]]; ok { + keys = append(keys, key) + } } } @@ -172,7 +181,7 @@ func (s *bigCacheIndexServant) deleteCacheByUserId(id int64) { s.cache.Delete(k) } s.lastCacheResetTime = time.Now() - logrus.Debugf("bigCacheIndexServant.deleteCacheByUserId userId:%d", id) + logrus.Debugf("bigCacheIndexServant.deleteCacheByUserId userId:%s oneself:%t keys:%d", userId, oneself, len(keys)) } func (s *bigCacheIndexServant) Name() string { diff --git a/internal/dao/cache/cache.go b/internal/dao/cache/cache.go index fef86f8a..e2be7a32 100644 --- a/internal/dao/cache/cache.go +++ b/internal/dao/cache/cache.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package cache import ( @@ -9,21 +13,22 @@ import ( "github.com/sirupsen/logrus" ) -func NewBigCacheIndexService(indexPosts core.IndexPostsService) (core.CacheIndexService, core.VersionInfo) { +func NewBigCacheIndexService(ips core.IndexPostsService, ams core.AuthorizationManageService) (core.CacheIndexService, core.VersionInfo) { s := conf.BigCacheIndexSetting - - config := bigcache.DefaultConfig(s.ExpireInSecond) - config.Shards = s.MaxIndexPage - config.Verbose = s.Verbose - config.MaxEntrySize = 10000 - config.Logger = logrus.StandardLogger() - cache, err := bigcache.NewBigCache(config) + c := bigcache.DefaultConfig(s.ExpireInSecond) + c.Shards = s.MaxIndexPage + c.HardMaxCacheSize = s.HardMaxCacheSize + c.Verbose = s.Verbose + c.MaxEntrySize = 10000 + c.Logger = logrus.StandardLogger() + cache, err := bigcache.NewBigCache(c) if err != nil { logrus.Fatalf("initial bigCahceIndex failure by err: %v", err) } cacheIndex := &bigCacheIndexServant{ - ips: indexPosts, + ips: ips, + ams: ams, cache: cache, preventDuration: 10 * time.Second, } diff --git a/internal/dao/cache/none.go b/internal/dao/cache/none.go index 79705280..ce6e1caf 100644 --- a/internal/dao/cache/none.go +++ b/internal/dao/cache/none.go @@ -1,10 +1,12 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package cache import ( "github.com/Masterminds/semver/v3" "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" - "github.com/rocboss/paopao-ce/internal/model/rest" ) var ( @@ -16,11 +18,11 @@ type noneCacheIndexServant struct { ips core.IndexPostsService } -func (s *noneCacheIndexServant) IndexPosts(user *model.User, offset int, limit int) (*rest.IndexTweetsResp, error) { +func (s *noneCacheIndexServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { return s.ips.IndexPosts(user, offset, limit) } -func (s *noneCacheIndexServant) SendAction(_act core.IdxAct, _post *model.Post) { +func (s *noneCacheIndexServant) SendAction(_act core.IdxAct, _post *core.Post) { // empty } diff --git a/internal/dao/cache/simple.go b/internal/dao/cache/simple.go index afdea1be..ba674d1b 100644 --- a/internal/dao/cache/simple.go +++ b/internal/dao/cache/simple.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package cache import ( @@ -6,8 +10,6 @@ import ( "github.com/Masterminds/semver/v3" "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" - "github.com/rocboss/paopao-ce/internal/model/rest" "github.com/sirupsen/logrus" ) @@ -20,21 +22,21 @@ type simpleCacheIndexServant struct { ips core.IndexPostsService indexActionCh chan core.IdxAct - indexPosts *rest.IndexTweetsResp + indexPosts *core.IndexTweetList atomicIndex atomic.Value maxIndexSize int checkTick *time.Ticker expireIndexTick *time.Ticker } -func (s *simpleCacheIndexServant) IndexPosts(user *model.User, offset int, limit int) (*rest.IndexTweetsResp, error) { - cacheResp := s.atomicIndex.Load().(*rest.IndexTweetsResp) +func (s *simpleCacheIndexServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { + cacheResp := s.atomicIndex.Load().(*core.IndexTweetList) end := offset + limit if cacheResp != nil { size := len(cacheResp.Tweets) logrus.Debugf("simpleCacheIndexServant.IndexPosts get index posts from cache posts: %d offset:%d limit:%d start:%d, end:%d", size, offset, limit, offset, end) if size >= end { - return &rest.IndexTweetsResp{ + return &core.IndexTweetList{ Tweets: cacheResp.Tweets[offset:end], Total: cacheResp.Total, }, nil @@ -45,7 +47,7 @@ func (s *simpleCacheIndexServant) IndexPosts(user *model.User, offset int, limit return s.ips.IndexPosts(user, offset, limit) } -func (s *simpleCacheIndexServant) SendAction(act core.IdxAct, _post *model.Post) { +func (s *simpleCacheIndexServant) SendAction(act core.IdxAct, _post *core.Post) { select { case s.indexActionCh <- act: logrus.Debugf("simpleCacheIndexServant.SendAction send indexAction by chan: %s", act) diff --git a/internal/dao/dao.go b/internal/dao/dao.go index 9a1ad705..d0b05c9c 100644 --- a/internal/dao/dao.go +++ b/internal/dao/dao.go @@ -1,9 +1,13 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package dao import ( "sync" - "github.com/rocboss/paopao-ce/internal/conf" + "github.com/alimy/cfg" "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/dao/jinzhu" "github.com/rocboss/paopao-ce/internal/dao/sakila" @@ -24,11 +28,11 @@ var ( func DataService() core.DataService { onceDs.Do(func() { var v core.VersionInfo - if conf.CfgIf("Gorm") { + if cfg.If("Gorm") { ds, v = jinzhu.NewDataService() - } else if conf.CfgIf("Sqlx") && conf.CfgIf("MySQL") { + } else if cfg.If("Sqlx") && cfg.If("MySQL") { ds, v = sakila.NewDataService() - } else if conf.CfgIf("Sqlx") && (conf.CfgIf("Postgres") || conf.CfgIf("PostgreSQL")) { + } else if cfg.If("Sqlx") && (cfg.If("Postgres") || cfg.If("PostgreSQL")) { ds, v = slonik.NewDataService() } else { // default use gorm as orm for sql database @@ -42,19 +46,19 @@ func DataService() core.DataService { func ObjectStorageService() core.ObjectStorageService { onceOss.Do(func() { var v core.VersionInfo - if conf.CfgIf("AliOSS") { + if cfg.If("AliOSS") { oss, v = storage.MustAliossService() - } else if conf.CfgIf("COS") { + } else if cfg.If("COS") { oss, v = storage.NewCosService() - } else if conf.CfgIf("HuaweiOBS") { + } else if cfg.If("HuaweiOBS") { oss, v = storage.MustHuaweiobsService() - } else if conf.CfgIf("MinIO") { + } else if cfg.If("MinIO") { oss, v = storage.MustMinioService() - } else if conf.CfgIf("S3") { + } else if cfg.If("S3") { oss, v = storage.MustS3Service() logrus.Infof("use S3 as object storage by version %s", v.Version()) return - } else if conf.CfgIf("LocalOSS") { + } else if cfg.If("LocalOSS") { oss, v = storage.MustLocalossService() } else { // default use AliOSS as object storage service @@ -71,9 +75,9 @@ func TweetSearchService() core.TweetSearchService { onceTs.Do(func() { var v core.VersionInfo ams := newAuthorizationManageService() - if conf.CfgIf("Zinc") { + if cfg.If("Zinc") { ts, v = search.NewZincTweetSearchService(ams) - } else if conf.CfgIf("Meili") { + } else if cfg.If("Meili") { ts, v = search.NewMeiliTweetSearchService(ams) } else { // default use Zinc as tweet search service @@ -87,11 +91,11 @@ func TweetSearchService() core.TweetSearchService { } func newAuthorizationManageService() (s core.AuthorizationManageService) { - if conf.CfgIf("Gorm") { + if cfg.If("Gorm") { s = jinzhu.NewAuthorizationManageService() - } else if conf.CfgIf("Sqlx") && conf.CfgIf("MySQL") { + } else if cfg.If("Sqlx") && cfg.If("MySQL") { s = sakila.NewAuthorizationManageService() - } else if conf.CfgIf("Sqlx") && (conf.CfgIf("Postgres") || conf.CfgIf("PostgreSQL")) { + } else if cfg.If("Sqlx") && (cfg.If("Postgres") || cfg.If("PostgreSQL")) { s = slonik.NewAuthorizationManageService() } else { s = jinzhu.NewAuthorizationManageService() diff --git a/internal/dao/jinzhu/authority.go b/internal/dao/jinzhu/authority.go index 63b85c68..5932fa24 100644 --- a/internal/dao/jinzhu/authority.go +++ b/internal/dao/jinzhu/authority.go @@ -1,8 +1,13 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package jinzhu import ( "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" + "github.com/rocboss/paopao-ce/pkg/types" "gorm.io/gorm" ) @@ -14,7 +19,13 @@ type authorizationManageServant struct { db *gorm.DB } -func (s *authorizationManageServant) IsAllow(user *model.User, action *core.Action) bool { +func newAuthorizationManageService(db *gorm.DB) core.AuthorizationManageService { + return &authorizationManageServant{ + db: db, + } +} + +func (s *authorizationManageServant) IsAllow(user *core.User, action *core.Action) bool { // user is activation if had bind phone isActivation := (len(user.Phone) != 0) isFriend := s.isFriend(user.ID, action.UserId) @@ -22,17 +33,40 @@ func (s *authorizationManageServant) IsAllow(user *model.User, action *core.Acti return action.Act.IsAllow(user, action.UserId, isFriend, isActivation) } +func (s *authorizationManageServant) MyFriendSet(userId int64) core.FriendSet { + ids, err := (&dbr.Contact{UserId: userId}).MyFriendIds(s.db) + if err != nil { + return core.FriendSet{} + } + + resp := make(core.FriendSet, len(ids)) + for _, id := range ids { + resp[id] = types.Empty{} + } + return resp +} + func (s *authorizationManageServant) BeFriendFilter(userId int64) core.FriendFilter { - // just empty now - return core.FriendFilter{} + ids, err := (&dbr.Contact{FriendId: userId}).BeFriendIds(s.db) + if err != nil { + return core.FriendFilter{} + } + + resp := make(core.FriendFilter, len(ids)) + for _, id := range ids { + resp[id] = types.Empty{} + } + return resp } func (s *authorizationManageServant) BeFriendIds(userId int64) ([]int64, error) { - // just empty now - return []int64{}, nil + return (&dbr.Contact{FriendId: userId}).BeFriendIds(s.db) } func (s *authorizationManageServant) isFriend(userId int64, friendId int64) bool { - // just true now - return true + contact, err := (&dbr.Contact{UserId: friendId, FriendId: userId}).GetByUserFriend(s.db) + if err == nil || contact.Status == dbr.ContactStatusAgree { + return true + } + return false } diff --git a/internal/dao/jinzhu/comments.go b/internal/dao/jinzhu/comments.go index c15e74f3..1af9e5ce 100644 --- a/internal/dao/jinzhu/comments.go +++ b/internal/dao/jinzhu/comments.go @@ -1,8 +1,12 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package jinzhu import ( "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" "gorm.io/gorm" ) @@ -31,42 +35,42 @@ func newCommentManageService(db *gorm.DB) core.CommentManageService { } } -func (s *commentServant) GetComments(conditions *model.ConditionsT, offset, limit int) ([]*model.Comment, error) { - return (&model.Comment{}).List(s.db, conditions, offset, limit) +func (s *commentServant) GetComments(conditions *core.ConditionsT, offset, limit int) ([]*core.Comment, error) { + return (&dbr.Comment{}).List(s.db, conditions, offset, limit) } -func (s *commentServant) GetCommentByID(id int64) (*model.Comment, error) { - comment := &model.Comment{ - Model: &model.Model{ +func (s *commentServant) GetCommentByID(id int64) (*core.Comment, error) { + comment := &dbr.Comment{ + Model: &dbr.Model{ ID: id, }, } return comment.Get(s.db) } -func (s *commentServant) GetCommentReplyByID(id int64) (*model.CommentReply, error) { - reply := &model.CommentReply{ - Model: &model.Model{ +func (s *commentServant) GetCommentReplyByID(id int64) (*core.CommentReply, error) { + reply := &dbr.CommentReply{ + Model: &dbr.Model{ ID: id, }, } return reply.Get(s.db) } -func (s *commentServant) GetCommentCount(conditions *model.ConditionsT) (int64, error) { - return (&model.Comment{}).Count(s.db, conditions) +func (s *commentServant) GetCommentCount(conditions *core.ConditionsT) (int64, error) { + return (&dbr.Comment{}).Count(s.db, conditions) } -func (s *commentServant) GetCommentContentsByIDs(ids []int64) ([]*model.CommentContent, error) { - commentContent := &model.CommentContent{} - return commentContent.List(s.db, &model.ConditionsT{ +func (s *commentServant) GetCommentContentsByIDs(ids []int64) ([]*core.CommentContent, error) { + commentContent := &dbr.CommentContent{} + return commentContent.List(s.db, &dbr.ConditionsT{ "comment_id IN ?": ids, }, 0, 0) } -func (s *commentServant) GetCommentRepliesByID(ids []int64) ([]*model.CommentReplyFormated, error) { - CommentReply := &model.CommentReply{} - replies, err := CommentReply.List(s.db, &model.ConditionsT{ +func (s *commentServant) GetCommentRepliesByID(ids []int64) ([]*core.CommentReplyFormated, error) { + CommentReply := &dbr.CommentReply{} + replies, err := CommentReply.List(s.db, &dbr.ConditionsT{ "comment_id IN ?": ids, }, 0, 0) @@ -83,7 +87,7 @@ func (s *commentServant) GetCommentRepliesByID(ids []int64) ([]*model.CommentRep if err != nil { return nil, err } - repliesFormated := []*model.CommentReplyFormated{} + repliesFormated := []*core.CommentReplyFormated{} for _, reply := range replies { replyFormated := reply.Format() for _, user := range users { @@ -101,22 +105,22 @@ func (s *commentServant) GetCommentRepliesByID(ids []int64) ([]*model.CommentRep return repliesFormated, nil } -func (s *commentManageServant) DeleteComment(comment *model.Comment) error { +func (s *commentManageServant) DeleteComment(comment *core.Comment) error { return comment.Delete(s.db) } -func (s *commentManageServant) CreateComment(comment *model.Comment) (*model.Comment, error) { +func (s *commentManageServant) CreateComment(comment *core.Comment) (*core.Comment, error) { return comment.Create(s.db) } -func (s *commentManageServant) CreateCommentReply(reply *model.CommentReply) (*model.CommentReply, error) { +func (s *commentManageServant) CreateCommentReply(reply *core.CommentReply) (*core.CommentReply, error) { return reply.Create(s.db) } -func (s *commentManageServant) DeleteCommentReply(reply *model.CommentReply) error { +func (s *commentManageServant) DeleteCommentReply(reply *core.CommentReply) error { return reply.Delete(s.db) } -func (s *commentManageServant) CreateCommentContent(content *model.CommentContent) (*model.CommentContent, error) { +func (s *commentManageServant) CreateCommentContent(content *core.CommentContent) (*core.CommentContent, error) { return content.Create(s.db) } diff --git a/internal/dao/jinzhu/contacts.go b/internal/dao/jinzhu/contacts.go new file mode 100644 index 00000000..c26ae4de --- /dev/null +++ b/internal/dao/jinzhu/contacts.go @@ -0,0 +1,271 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package jinzhu + +import ( + "time" + + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" + "github.com/sirupsen/logrus" + "gorm.io/gorm" +) + +var ( + _ core.ContactManageService = (*contactManageServant)(nil) +) + +type contactManageServant struct { + db *gorm.DB +} + +func newContactManageService(db *gorm.DB) core.ContactManageService { + return &contactManageServant{ + db: db, + } +} + +func (s *contactManageServant) fetchOrNewContact(db *gorm.DB, userId int64, friendId int64, status int8) (*dbr.Contact, error) { + contact := &dbr.Contact{ + UserId: userId, + FriendId: friendId, + } + contact, err := contact.FetchUser(db) + if err != nil { + contact = &dbr.Contact{ + UserId: userId, + FriendId: friendId, + Status: status, + } + if contact, err = contact.Create(db); err != nil { + logrus.Errorf("contactManageServant.fetchOrNewContact create new contact err:%s", err) + return nil, err + } + } + return contact, nil +} + +func (s *contactManageServant) RequestingFriend(userId int64, friendId int64, greetings string) (err error) { + db := s.db.Begin() + defer func() { + if err == nil { + db.Commit() + } else { + db.Rollback() + } + }() + + contact, e := s.fetchOrNewContact(db, userId, friendId, dbr.ContactStatusRequesting) + if e != nil { + err = e + return + } + + // 如果已经好友,啥也不干 + if contact.Status == dbr.ContactStatusAgree { + return nil + } else if contact.Status == dbr.ContactStatusReject || contact.Status == dbr.ContactStatusDeleted { + contact.Status = dbr.ContactStatusRequesting + contact.IsDel = 0 // remove deleted flag if needed + if err = contact.UpdateInUnscoped(db); err != nil { + logrus.Errorf("contactManageServant.RequestingFriend update exsit contact err:%s", err) + return + } + } + + msg := &dbr.Message{ + SenderUserID: userId, + ReceiverUserID: friendId, + Type: dbr.MsgTypeRequestingFriend, + Brief: "请求添加好友,并附言:", + Content: greetings, + ReplyID: int64(dbr.ContactStatusRequesting), + } + if _, err = msg.Create(db); err != nil { + logrus.Errorf("contactManageServant.RequestingFriend create message err:%s", err) + return + } + return nil +} + +func (s *contactManageServant) AddFriend(userId int64, friendId int64) (err error) { + db := s.db.Begin() + defer func() { + if err == nil { + db.Commit() + } else { + db.Rollback() + } + }() + + contact := &dbr.Contact{ + UserId: friendId, + FriendId: userId, + } + if contact, err = contact.GetByUserFriend(db); err != nil { + return + } + // 如果还不是请求好友,啥也不干 + if contact.Status != dbr.ContactStatusRequesting { + logrus.Debugf("contactManageServant.AddFriend not reuesting status now so skip") + return nil + } + contact.Status = dbr.ContactStatusAgree + if err = contact.Update(db); err != nil { + return err + } + + contact, err = s.fetchOrNewContact(db, userId, friendId, dbr.ContactStatusAgree) + if err != nil { + return + } + + // 如果已经好友,啥也不干 + if contact.Status != dbr.ContactStatusAgree { + contact.Status = dbr.ContactStatusAgree + contact.IsDel = 0 // remove deleted flag + if err = contact.UpdateInUnscoped(db); err != nil { + logrus.Errorf("contactManageServant.AddFriend update contact err:%s", err) + return + } + } + + args := []any{userId, friendId, friendId, userId, dbr.MsgTypeRequestingFriend, dbr.ContactStatusRequesting} + msgs, e := (&dbr.Message{}).FetchBy(db, dbr.Predicates{ + "((sender_user_id = ? AND receiver_user_id = ?) OR (sender_user_id = ? AND receiver_user_id = ?)) AND type = ? AND reply_id = ?": args, + }) + if e != nil { + err = e + return + } + for _, msg := range msgs { + msg.ReplyID = int64(dbr.ContactStatusAgree) + if err = msg.Update(db); err != nil { + return + } + } + return nil +} + +func (s *contactManageServant) RejectFriend(userId int64, friendId int64) (err error) { + db := s.db.Begin() + defer func() { + if err == nil { + db.Commit() + } else { + db.Rollback() + } + }() + + contact := &dbr.Contact{ + UserId: friendId, + FriendId: userId, + } + if contact, err = contact.GetByUserFriend(db); err != nil { + return + } + // 如果还不是请求好友,啥也不干 + if contact.Status != dbr.ContactStatusRequesting { + return nil + } + contact.Status = dbr.ContactStatusReject + if err = contact.Update(db); err != nil { + return err + } + + args := []any{friendId, userId, dbr.MsgTypeRequestingFriend, dbr.ContactStatusRequesting} + msgs, e := (&dbr.Message{}).FetchBy(db, dbr.Predicates{ + "sender_user_id = ? AND receiver_user_id = ? AND type = ? AND reply_id = ?": args, + }) + if e != nil { + err = e + return + } + for _, msg := range msgs { + msg.ReplyID = int64(dbr.ContactStatusReject) + if err = msg.Update(db); err != nil { + return + } + } + return nil +} + +func (s *contactManageServant) DeleteFriend(userId int64, friendId int64) (err error) { + db := s.db.Begin() + defer func() { + if err == nil { + db.Commit() + } else { + db.Rollback() + } + }() + + contact := &dbr.Contact{ + UserId: userId, + FriendId: friendId, + } + contacts, e := contact.FetchByUserFriendAll(db) + if e != nil { + return e + } + + for _, contact := range contacts { + // 如果还不是好友,啥也不干 + if contact.Status != dbr.ContactStatusAgree { + continue + } + contact.Status = dbr.ContactStatusDeleted + contact.DeletedOn = time.Now().Unix() + contact.IsDel = 1 + if err = contact.Update(db); err != nil { + return + } + } + return nil +} + +func (s *contactManageServant) GetContacts(userId int64, offset int, limit int) (*core.ContactList, error) { + contact := &dbr.Contact{} + condition := dbr.ConditionsT{ + "user_id": userId, + "status": dbr.ContactStatusAgree, + } + contacts, err := contact.List(s.db, condition, offset, limit) + if err != nil { + return nil, err + } + total, err := contact.Count(s.db, condition) + if err != nil { + return nil, err + } + resp := &core.ContactList{ + Contacts: make([]core.ContactItem, 0, len(contacts)), + Total: total, + } + for _, c := range contacts { + if c.User != nil { + resp.Contacts = append(resp.Contacts, core.ContactItem{ + UserId: c.FriendId, + UserName: c.User.Username, + Nickname: c.User.Nickname, + Avatar: c.User.Avatar, + Phone: c.User.Phone, + }) + } + } + return resp, nil +} + +func (s *contactManageServant) IsFriend(userId int64, friendId int64) bool { + contact := &dbr.Contact{ + UserId: friendId, + FriendId: userId, + } + contact, err := contact.GetByUserFriend(s.db) + if err == nil && contact.Status == dbr.ContactStatusAgree { + return true + } + return false +} diff --git a/internal/model/attachment.go b/internal/dao/jinzhu/dbr/attachment.go similarity index 65% rename from internal/model/attachment.go rename to internal/dao/jinzhu/dbr/attachment.go index 0c748b00..b62a5d8b 100644 --- a/internal/model/attachment.go +++ b/internal/dao/jinzhu/dbr/attachment.go @@ -1,13 +1,17 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import "gorm.io/gorm" type AttachmentType int const ( - ATTACHMENT_TYPE_IMAGE AttachmentType = iota + 1 - ATTACHMENT_TYPE_VIDEO - ATTACHMENT_TYPE_OTHER + AttachmentTypeImage AttachmentType = iota + 1 + AttachmentTypeVideo + AttachmentTypeOther ) type Attachment struct { diff --git a/internal/model/captcha.go b/internal/dao/jinzhu/dbr/captcha.go similarity index 82% rename from internal/model/captcha.go rename to internal/dao/jinzhu/dbr/captcha.go index 210cc691..4567d4b3 100644 --- a/internal/model/captcha.go +++ b/internal/dao/jinzhu/dbr/captcha.go @@ -1,4 +1,8 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import "gorm.io/gorm" diff --git a/internal/model/comment.go b/internal/dao/jinzhu/dbr/comment.go similarity index 94% rename from internal/model/comment.go rename to internal/dao/jinzhu/dbr/comment.go index 8b54798a..80192df7 100644 --- a/internal/model/comment.go +++ b/internal/dao/jinzhu/dbr/comment.go @@ -1,4 +1,8 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import ( "time" @@ -108,7 +112,7 @@ func (c *Comment) Create(db *gorm.DB) (*Comment, error) { } func (c *Comment) Delete(db *gorm.DB) error { - return db.Model(c).Where("id = ?", c.Model.ID).Updates(map[string]interface{}{ + return db.Model(c).Where("id = ?", c.Model.ID).Updates(map[string]any{ "deleted_on": time.Now().Unix(), "is_del": 1, }).Error @@ -120,7 +124,7 @@ func (c *Comment) CommentIdsByPostId(db *gorm.DB, postId int64) (ids []int64, er } func (c *Comment) DeleteByPostId(db *gorm.DB, postId int64) error { - return db.Model(c).Where("post_id = ?", postId).Updates(map[string]interface{}{ + return db.Model(c).Where("post_id = ?", postId).Updates(map[string]any{ "deleted_on": time.Now().Unix(), "is_del": 1, }).Error diff --git a/internal/model/comment_content.go b/internal/dao/jinzhu/dbr/comment_content.go similarity index 84% rename from internal/model/comment_content.go rename to internal/dao/jinzhu/dbr/comment_content.go index 543cacab..778f113a 100644 --- a/internal/model/comment_content.go +++ b/internal/dao/jinzhu/dbr/comment_content.go @@ -1,4 +1,8 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import ( "time" @@ -47,12 +51,12 @@ func (c *CommentContent) Create(db *gorm.DB) (*CommentContent, error) { } func (c *CommentContent) MediaContentsByCommentId(db *gorm.DB, commentIds []int64) (contents []string, err error) { - err = db.Model(c).Where("comment_id IN ? AND type = ?", commentIds, CONTENT_TYPE_IMAGE).Select("content").Find(&contents).Error + err = db.Model(c).Where("comment_id IN ? AND type = ?", commentIds, ContentTypeImage).Select("content").Find(&contents).Error return } func (c *CommentContent) DeleteByCommentIds(db *gorm.DB, commentIds []int64) error { - return db.Model(c).Where("comment_id IN ?", commentIds).Updates(map[string]interface{}{ + return db.Model(c).Where("comment_id IN ?", commentIds).Updates(map[string]any{ "deleted_on": time.Now().Unix(), "is_del": 1, }).Error diff --git a/internal/model/comment_reply.go b/internal/dao/jinzhu/dbr/comment_reply.go similarity index 92% rename from internal/model/comment_reply.go rename to internal/dao/jinzhu/dbr/comment_reply.go index d144e6c9..fe527be5 100644 --- a/internal/model/comment_reply.go +++ b/internal/dao/jinzhu/dbr/comment_reply.go @@ -1,4 +1,8 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import ( "time" @@ -96,14 +100,14 @@ func (c *CommentReply) Get(db *gorm.DB) (*CommentReply, error) { } func (c *CommentReply) Delete(db *gorm.DB) error { - return db.Model(&CommentReply{}).Where("id = ? AND is_del = ?", c.Model.ID, 0).Updates(map[string]interface{}{ + return db.Model(&CommentReply{}).Where("id = ? AND is_del = ?", c.Model.ID, 0).Updates(map[string]any{ "deleted_on": time.Now().Unix(), "is_del": 1, }).Error } func (c *CommentReply) DeleteByCommentIds(db *gorm.DB, commentIds []int64) error { - return db.Model(c).Where("comment_id IN ?", commentIds).Updates(map[string]interface{}{ + return db.Model(c).Where("comment_id IN ?", commentIds).Updates(map[string]any{ "deleted_on": time.Now().Unix(), "is_del": 1, }).Error diff --git a/internal/dao/jinzhu/dbr/contact.go b/internal/dao/jinzhu/dbr/contact.go new file mode 100644 index 00000000..e8c12bd0 --- /dev/null +++ b/internal/dao/jinzhu/dbr/contact.go @@ -0,0 +1,123 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr + +import ( + "github.com/sirupsen/logrus" + "gorm.io/gorm" +) + +const ( + ContactStatusRequesting int8 = iota + 1 + ContactStatusAgree + ContactStatusReject + ContactStatusDeleted +) + +type Contact struct { + *Model + User *User `json:"-" gorm:"foreignKey:ID;references:FriendId"` + UserId int64 `json:"user_id"` + FriendId int64 `json:"friend_id"` + GroupId int64 `json:"group_id"` + Remark string `json:"remark"` + Status int8 `json:"status"` // 1请求好友, 2已同意好友, 3已拒绝好友, 4已删除好友 + IsTop int8 `json:"is_top"` + IsBlack int8 `json:"is_black"` + NoticeEnable int8 `json:"notice_enable"` +} + +func (c *Contact) FetchUser(db *gorm.DB) (*Contact, error) { + var contact Contact + err := db.Omit("User").Unscoped().Where("user_id = ? AND friend_id = ?", c.UserId, c.FriendId).First(&contact).Error + if err != nil { + logrus.Debugf("Contact.FetchUser fetch user error:%s", err) + return nil, err + } + return &contact, nil +} + +func (c *Contact) GetByUserFriend(db *gorm.DB) (*Contact, error) { + var contact Contact + err := db.Omit("User").Where("user_id = ? AND friend_id = ?", c.UserId, c.FriendId).First(&contact).Error + if err != nil { + return nil, err + } + return &contact, nil +} + +func (c *Contact) FetchByUserFriendAll(db *gorm.DB) ([]*Contact, error) { + var contacts []*Contact + if err := db.Omit("User"). + Where("(user_id = ? AND friend_id = ?) OR (user_id = ? AND friend_id = ?)", + c.UserId, c.FriendId, c.FriendId, c.UserId). + Find(&contacts).Error; err != nil { + return nil, err + } + return contacts, nil +} + +func (c *Contact) List(db *gorm.DB, conditions ConditionsT, offset, limit int) ([]*Contact, error) { + var contacts []*Contact + var err error + tn := db.NamingStrategy.TableName("Contact") + "." + + if offset >= 0 && limit > 0 { + db = db.Offset(offset).Limit(limit) + } + for k, v := range conditions { + if k != "ORDER" { + db = db.Where(tn+k, v) + } + } + + db.Joins("User").Order("`User`.`nickname` ASC") + if err = db.Find(&contacts).Error; err != nil { + return nil, err + } + return contacts, nil +} + +func (c *Contact) BeFriendIds(db *gorm.DB) (ids []int64, err error) { + if err = db.Model(c).Omit("User").Select("user_id").Where("friend_id = ? AND status = ?", c.FriendId, ContactStatusAgree).Find(&ids).Error; err != nil { + return nil, err + } + return +} + +func (c *Contact) MyFriendIds(db *gorm.DB) (ids []string, err error) { + if err = db.Model(c).Omit("User").Select("friend_id").Where("user_id = ? AND status = ?", c.UserId, ContactStatusAgree).Find(&ids).Error; err != nil { + return nil, err + } + return +} + +func (m *Contact) Count(db *gorm.DB, conditions ConditionsT) (int64, error) { + var count int64 + + for k, v := range conditions { + if k != "ORDER" { + db = db.Where(k, v) + } + } + if err := db.Model(m).Omit("User").Count(&count).Error; err != nil { + return 0, err + } + + return count, nil +} + +func (c *Contact) Create(db *gorm.DB) (*Contact, error) { + err := db.Omit("User").Create(&c).Error + return c, err +} + +func (c *Contact) Update(db *gorm.DB) error { + return db.Model(&Contact{}).Omit("User").Where("id = ?", c.Model.ID).Save(c).Error +} + +func (c *Contact) UpdateInUnscoped(db *gorm.DB) error { + return db.Unscoped().Omit("User").Save(c).Error +} diff --git a/internal/model/message.go b/internal/dao/jinzhu/dbr/message.go similarity index 86% rename from internal/model/message.go rename to internal/dao/jinzhu/dbr/message.go index 1c7f42db..6c952bae 100644 --- a/internal/model/message.go +++ b/internal/dao/jinzhu/dbr/message.go @@ -1,4 +1,8 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import "gorm.io/gorm" @@ -92,15 +96,24 @@ func (m *Message) Get(db *gorm.DB) (*Message, error) { if m.ReceiverUserID > 0 { db = db.Where("receiver_user_id = ?", m.ReceiverUserID) } - - err := db.First(&message).Error - if err != nil { - return &message, err + if err := db.First(&message).Error; err != nil { + return nil, err } - return &message, nil } +func (m *Message) FetchBy(db *gorm.DB, predicates Predicates) ([]*Message, error) { + var messages []*Message + for k, v := range predicates { + db = db.Where(k, v...) + } + db = db.Where("is_del = 0") + if err := db.Find(&messages).Error; err != nil { + return nil, err + } + return messages, nil +} + func (c *Message) List(db *gorm.DB, conditions *ConditionsT, offset, limit int) ([]*Message, error) { var messages []*Message var err error diff --git a/internal/dao/jinzhu/dbr/model.go b/internal/dao/jinzhu/dbr/model.go new file mode 100644 index 00000000..75e66561 --- /dev/null +++ b/internal/dao/jinzhu/dbr/model.go @@ -0,0 +1,40 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr + +import ( + "time" + + "gorm.io/gorm" + "gorm.io/plugin/soft_delete" +) + +// Model 公共Model +type Model struct { + ID int64 `gorm:"primary_key" json:"id"` + CreatedOn int64 `json:"created_on"` + ModifiedOn int64 `json:"modified_on"` + DeletedOn int64 `json:"deleted_on"` + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag" json:"is_del"` +} + +type ConditionsT map[string]any +type Predicates map[string][]any + +func (m *Model) BeforeCreate(tx *gorm.DB) (err error) { + nowTime := time.Now().Unix() + + tx.Statement.SetColumn("created_on", nowTime) + tx.Statement.SetColumn("modified_on", nowTime) + return +} + +func (m *Model) BeforeUpdate(tx *gorm.DB) (err error) { + if !tx.Statement.Changed("modified_on") { + tx.Statement.SetColumn("modified_on", time.Now().Unix()) + } + + return +} diff --git a/internal/model/post.go b/internal/dao/jinzhu/dbr/post.go similarity index 96% rename from internal/model/post.go rename to internal/dao/jinzhu/dbr/post.go index 1aaedaf7..a47dedfc 100644 --- a/internal/model/post.go +++ b/internal/dao/jinzhu/dbr/post.go @@ -1,4 +1,8 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import ( "strings" @@ -91,7 +95,7 @@ func (p *Post) Create(db *gorm.DB) (*Post, error) { } func (s *Post) Delete(db *gorm.DB) error { - return db.Model(s).Where("id = ?", s.Model.ID).Updates(map[string]interface{}{ + return db.Model(s).Where("id = ?", s.Model.ID).Updates(map[string]any{ "deleted_on": time.Now().Unix(), "is_del": 1, }).Error diff --git a/internal/model/post_attachment_bill.go b/internal/dao/jinzhu/dbr/post_attachment_bill.go similarity index 81% rename from internal/model/post_attachment_bill.go rename to internal/dao/jinzhu/dbr/post_attachment_bill.go index 8ee7aae6..7bdd812f 100644 --- a/internal/model/post_attachment_bill.go +++ b/internal/dao/jinzhu/dbr/post_attachment_bill.go @@ -1,4 +1,8 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import "gorm.io/gorm" diff --git a/internal/model/post_collection.go b/internal/dao/jinzhu/dbr/post_collection.go similarity index 91% rename from internal/model/post_collection.go rename to internal/dao/jinzhu/dbr/post_collection.go index aec5d270..04ca2647 100644 --- a/internal/model/post_collection.go +++ b/internal/dao/jinzhu/dbr/post_collection.go @@ -1,4 +1,8 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import ( "time" @@ -43,7 +47,7 @@ func (p *PostCollection) Create(db *gorm.DB) (*PostCollection, error) { } func (p *PostCollection) Delete(db *gorm.DB) error { - return db.Model(&PostCollection{}).Omit("Post").Where("id = ? AND is_del = ?", p.Model.ID, 0).Updates(map[string]interface{}{ + return db.Model(&PostCollection{}).Omit("Post").Where("id = ? AND is_del = ?", p.Model.ID, 0).Updates(map[string]any{ "deleted_on": time.Now().Unix(), "is_del": 1, }).Error diff --git a/internal/model/post_content.go b/internal/dao/jinzhu/dbr/post_content.go similarity index 83% rename from internal/model/post_content.go rename to internal/dao/jinzhu/dbr/post_content.go index 04b47522..672cc57e 100644 --- a/internal/model/post_content.go +++ b/internal/dao/jinzhu/dbr/post_content.go @@ -1,4 +1,8 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import ( "time" @@ -7,27 +11,26 @@ import ( ) // 类型,1标题,2文字段落,3图片地址,4视频地址,5语音地址,6链接地址,7附件资源 - type PostContentT int const ( - CONTENT_TYPE_TITLE PostContentT = iota + 1 - CONTENT_TYPE_TEXT - CONTENT_TYPE_IMAGE - CONTENT_TYPE_VIDEO - CONTENT_TYPE_AUDIO - CONTENT_TYPE_LINK - CONTENT_TYPE_ATTACHMENT - CONTENT_TYPE_CHARGE_ATTACHMENT + ContentTypeTitle PostContentT = iota + 1 + ContentTypeText + ContentTypeImage + ContentTypeVideo + ContentTypeAudio + ContentTypeLink + ContentTypeAttachment + ContentTypeChargeAttachment ) var ( mediaContentType = []PostContentT{ - CONTENT_TYPE_IMAGE, - CONTENT_TYPE_VIDEO, - CONTENT_TYPE_AUDIO, - CONTENT_TYPE_ATTACHMENT, - CONTENT_TYPE_CHARGE_ATTACHMENT, + ContentTypeImage, + ContentTypeVideo, + ContentTypeAudio, + ContentTypeAttachment, + ContentTypeChargeAttachment, } ) @@ -49,7 +52,7 @@ type PostContentFormated struct { } func (p *PostContent) DeleteByPostId(db *gorm.DB, postId int64) error { - return db.Model(p).Where("post_id = ?", postId).Updates(map[string]interface{}{ + return db.Model(p).Where("post_id = ?", postId).Updates(map[string]any{ "deleted_on": time.Now().Unix(), "is_del": 1, }).Error diff --git a/internal/model/post_star.go b/internal/dao/jinzhu/dbr/post_star.go similarity index 91% rename from internal/model/post_star.go rename to internal/dao/jinzhu/dbr/post_star.go index d6c712ce..45c48f45 100644 --- a/internal/model/post_star.go +++ b/internal/dao/jinzhu/dbr/post_star.go @@ -1,4 +1,8 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import ( "time" @@ -41,7 +45,7 @@ func (p *PostStar) Create(db *gorm.DB) (*PostStar, error) { } func (p *PostStar) Delete(db *gorm.DB) error { - return db.Model(&PostStar{}).Omit("Post").Where("id = ? AND is_del = ?", p.Model.ID, 0).Updates(map[string]interface{}{ + return db.Model(&PostStar{}).Omit("Post").Where("id = ? AND is_del = ?", p.Model.ID, 0).Updates(map[string]any{ "deleted_on": time.Now().Unix(), "is_del": 1, }).Error diff --git a/internal/model/tag.go b/internal/dao/jinzhu/dbr/tag.go similarity index 87% rename from internal/model/tag.go rename to internal/dao/jinzhu/dbr/tag.go index 4389c075..8570f574 100644 --- a/internal/model/tag.go +++ b/internal/dao/jinzhu/dbr/tag.go @@ -1,4 +1,8 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import ( "time" @@ -44,7 +48,7 @@ func (t *Tag) Get(db *gorm.DB) (*Tag, error) { err := db.First(&tag).Error if err != nil { - return &tag, err + return nil, err } return &tag, nil @@ -61,7 +65,7 @@ func (t *Tag) Update(db *gorm.DB) error { } func (t *Tag) Delete(db *gorm.DB) error { - return db.Model(t).Where("id = ?", t.Model.ID).Updates(map[string]interface{}{ + return db.Model(t).Where("id = ?", t.Model.ID).Updates(map[string]any{ "deleted_on": time.Now().Unix(), "is_del": 1, }).Error @@ -84,7 +88,7 @@ func (t *Tag) List(db *gorm.DB, conditions *ConditionsT, offset, limit int) ([]* } } - if err = db.Where("is_del = ?", 0).Find(&tags).Error; err != nil { + if err = db.Where("is_del = 0 and quote_num > 0").Find(&tags).Error; err != nil { return nil, err } diff --git a/internal/model/user.go b/internal/dao/jinzhu/dbr/user.go similarity index 92% rename from internal/model/user.go rename to internal/dao/jinzhu/dbr/user.go index 39c52d79..a10d5432 100644 --- a/internal/model/user.go +++ b/internal/dao/jinzhu/dbr/user.go @@ -1,4 +1,8 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import "gorm.io/gorm" diff --git a/internal/model/wallet_recharge.go b/internal/dao/jinzhu/dbr/wallet_recharge.go similarity index 80% rename from internal/model/wallet_recharge.go rename to internal/dao/jinzhu/dbr/wallet_recharge.go index bfb3bc6f..14601cb0 100644 --- a/internal/model/wallet_recharge.go +++ b/internal/dao/jinzhu/dbr/wallet_recharge.go @@ -1,4 +1,8 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import "gorm.io/gorm" diff --git a/internal/model/wallet_statement.go b/internal/dao/jinzhu/dbr/wallet_statement.go similarity index 91% rename from internal/model/wallet_statement.go rename to internal/dao/jinzhu/dbr/wallet_statement.go index 163e2430..890e34ec 100644 --- a/internal/model/wallet_statement.go +++ b/internal/dao/jinzhu/dbr/wallet_statement.go @@ -1,4 +1,8 @@ -package model +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr import "gorm.io/gorm" diff --git a/internal/dao/jinzhu/index.go b/internal/dao/jinzhu/index.go index 00a0e8e0..fc7e2007 100644 --- a/internal/dao/jinzhu/index.go +++ b/internal/dao/jinzhu/index.go @@ -1,60 +1,99 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package jinzhu import ( "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" - "github.com/rocboss/paopao-ce/internal/model/rest" - "github.com/rocboss/paopao-ce/pkg/types" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" + "github.com/rocboss/paopao-ce/pkg/debug" "github.com/sirupsen/logrus" "gorm.io/gorm" ) var ( - _ core.IndexPostsService = (*indexPostsServant)(nil) + _ core.IndexPostsService = (*friendIndexServant)(nil) + _ core.IndexPostsService = (*followIndexServant)(nil) + _ core.IndexPostsService = (*lightIndexServant)(nil) _ core.IndexPostsService = (*simpleIndexPostsServant)(nil) ) -type indexPostsServant struct { +type friendIndexServant struct { ams core.AuthorizationManageService ths core.TweetHelpService db *gorm.DB } -type simpleIndexPostsServant struct { +type followIndexServant struct { ths core.TweetHelpService db *gorm.DB } -func newIndexPostsService(db *gorm.DB) core.IndexPostsService { - return &indexPostsServant{ - ams: NewAuthorizationManageService(), - ths: newTweetHelpService(db), - db: db, - } +type lightIndexServant struct { + ths core.TweetHelpService + db *gorm.DB } -func newSimpleIndexPostsService(db *gorm.DB) core.IndexPostsService { - return &simpleIndexPostsServant{ - ths: newTweetHelpService(db), - db: db, - } +type simpleIndexPostsServant struct { + ths core.TweetHelpService + db *gorm.DB } // IndexPosts 根据userId查询广场推文列表,简单做到不同用户的主页都是不同的; -func (s *indexPostsServant) IndexPosts(user *model.User, offset int, limit int) (*rest.IndexTweetsResp, error) { - predicates := model.Predicates{ - "ORDER": types.AnySlice{"is_top DESC, latest_replied_on DESC"}, +func (s *friendIndexServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { + predicates := dbr.Predicates{ + "ORDER": []any{"is_top DESC, latest_replied_on DESC"}, } if user == nil { - predicates["visibility = ?"] = []types.Any{model.PostVisitPublic} + predicates["visibility = ?"] = []any{dbr.PostVisitPublic} } else if !user.IsAdmin { friendIds, _ := s.ams.BeFriendIds(user.ID) friendIds = append(friendIds, user.ID) - args := types.AnySlice{model.PostVisitPublic, model.PostVisitPrivate, user.ID, model.PostVisitFriend, friendIds} + args := []any{dbr.PostVisitPublic, dbr.PostVisitPrivate, user.ID, dbr.PostVisitFriend, friendIds} predicates["visibility = ? OR (visibility = ? AND user_id = ?) OR (visibility = ? AND user_id IN ?)"] = args } - posts, err := (&model.Post{}).Fetch(s.db, predicates, offset, limit) + posts, err := (&dbr.Post{}).Fetch(s.db, predicates, offset, limit) + if err != nil { + logrus.Debugf("gormIndexPostsServant.IndexPosts err: %v", err) + return nil, err + } + formatPosts, err := s.ths.MergePosts(posts) + if err != nil { + return nil, err + } + + total, err := (&dbr.Post{}).CountBy(s.db, predicates) + if err != nil { + return nil, err + } + + return &core.IndexTweetList{ + Tweets: formatPosts, + Total: total, + }, nil +} + +// IndexPosts 根据userId查询广场推文列表 +func (s *followIndexServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { + // TODO + return nil, debug.ErrNotImplemented +} + +// IndexPosts 根据userId查询广场推文列表,获取公开可见Tweet或者所属用户的私有Tweet +func (s *lightIndexServant) IndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { + predicates := dbr.Predicates{ + "ORDER": []any{"is_top DESC, latest_replied_on DESC"}, + } + if user == nil { + predicates["visibility = ?"] = []any{dbr.PostVisitPublic} + } else if !user.IsAdmin { + args := []any{dbr.PostVisitPublic, dbr.PostVisitPrivate, user.ID} + predicates["visibility = ? OR (visibility = ? AND user_id = ?)"] = args + } + + posts, err := (&dbr.Post{}).Fetch(s.db, predicates, offset, limit) if err != nil { logrus.Debugf("gormIndexPostsServant.IndexPosts err: %v", err) return nil, err @@ -64,25 +103,25 @@ func (s *indexPostsServant) IndexPosts(user *model.User, offset int, limit int) return nil, err } - total, err := (&model.Post{}).CountBy(s.db, predicates) + total, err := (&dbr.Post{}).CountBy(s.db, predicates) if err != nil { return nil, err } - return &rest.IndexTweetsResp{ + return &core.IndexTweetList{ Tweets: formatPosts, Total: total, }, nil } // simpleCacheIndexGetPosts simpleCacheIndex 专属获取广场推文列表函数 -func (s *simpleIndexPostsServant) IndexPosts(_user *model.User, offset int, limit int) (*rest.IndexTweetsResp, error) { - predicates := model.Predicates{ - "visibility = ?": []types.Any{model.PostVisitPublic}, - "ORDER": []types.Any{"is_top DESC, latest_replied_on DESC"}, +func (s *simpleIndexPostsServant) IndexPosts(_user *core.User, offset int, limit int) (*core.IndexTweetList, error) { + predicates := dbr.Predicates{ + "visibility = ?": []any{dbr.PostVisitPublic}, + "ORDER": []any{"is_top DESC, latest_replied_on DESC"}, } - posts, err := (&model.Post{}).Fetch(s.db, predicates, offset, limit) + posts, err := (&dbr.Post{}).Fetch(s.db, predicates, offset, limit) if err != nil { logrus.Debugf("gormSimpleIndexPostsServant.IndexPosts err: %v", err) return nil, err @@ -93,13 +132,42 @@ func (s *simpleIndexPostsServant) IndexPosts(_user *model.User, offset int, limi return nil, err } - total, err := (&model.Post{}).CountBy(s.db, predicates) + total, err := (&dbr.Post{}).CountBy(s.db, predicates) if err != nil { return nil, err } - return &rest.IndexTweetsResp{ + return &core.IndexTweetList{ Tweets: formatPosts, Total: total, }, nil } + +func newFriendIndexService(db *gorm.DB, ams core.AuthorizationManageService, ths core.TweetHelpService) core.IndexPostsService { + return &friendIndexServant{ + ams: ams, + ths: ths, + db: db, + } +} + +func newFollowIndexService(db *gorm.DB, ths core.TweetHelpService) core.IndexPostsService { + return &followIndexServant{ + ths: ths, + db: db, + } +} + +func newLightIndexService(db *gorm.DB, ths core.TweetHelpService) core.IndexPostsService { + return &lightIndexServant{ + ths: ths, + db: db, + } +} + +func newSimpleIndexPostsService(db *gorm.DB, ths core.TweetHelpService) core.IndexPostsService { + return &simpleIndexPostsServant{ + ths: ths, + db: db, + } +} diff --git a/internal/dao/jinzhu/jinzhu.go b/internal/dao/jinzhu/jinzhu.go index 736b4f43..6d15f1b5 100644 --- a/internal/dao/jinzhu/jinzhu.go +++ b/internal/dao/jinzhu/jinzhu.go @@ -1,11 +1,16 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + // Core service implement base gorm+mysql/postgresql/sqlite3. // Jinzhu is the primary developer of gorm so use his name as -// pakcage name as a saluter. +// package name as a saluter. package jinzhu import ( "github.com/Masterminds/semver/v3" + "github.com/alimy/cfg" "github.com/rocboss/paopao-ce/internal/conf" "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/dao/cache" @@ -29,50 +34,67 @@ type dataServant struct { core.CommentService core.CommentManageService core.UserManageService + core.ContactManageService core.SecurityService core.AttachmentCheckService } func NewDataService() (core.DataService, core.VersionInfo) { - // initialize CacheIndex if needed var ( - c core.CacheIndexService - v core.VersionInfo + v core.VersionInfo + cis core.CacheIndexService + ips core.IndexPostsService ) db := conf.MustGormDB() + pvs := security.NewPhoneVerifyService() + ams := NewAuthorizationManageService() + ths := newTweetHelpService(db) - i := newIndexPostsService(db) - if conf.CfgIf("SimpleCacheIndex") { - i = newSimpleIndexPostsService(db) - c, v = cache.NewSimpleCacheIndexService(i) - } else if conf.CfgIf("BigCacheIndex") { - c, v = cache.NewBigCacheIndexService(i) + // initialize core.IndexPostsService + if cfg.If("Friendship") { + ips = newFriendIndexService(db, ams, ths) + } else if cfg.If("Followship") { + ips = newFollowIndexService(db, ths) + } else if cfg.If("Lightship") { + ips = newLightIndexService(db, ths) } else { - c, v = cache.NewNoneCacheIndexService(i) + // default use lightship post index service + ips = newLightIndexService(db, ths) + } + + // initialize core.CacheIndexService + if cfg.If("SimpleCacheIndex") { + // simpleCache use special post index service + ips = newSimpleIndexPostsService(db, ths) + cis, v = cache.NewSimpleCacheIndexService(ips) + } else if cfg.If("BigCacheIndex") { + // TODO: make cache index post in different scence like friendship/followship/lightship + cis, v = cache.NewBigCacheIndexService(ips, ams) + } else { + cis, v = cache.NewNoneCacheIndexService(ips) } logrus.Infof("use %s as cache index service by version: %s", v.Name(), v.Version()) ds := &dataServant{ - IndexPostsService: c, + IndexPostsService: cis, WalletService: newWalletService(db), MessageService: newMessageService(db), TopicService: newTopicService(db), TweetService: newTweetService(db), - TweetManageService: newTweetManageService(db, c), + TweetManageService: newTweetManageService(db, cis), TweetHelpService: newTweetHelpService(db), CommentService: newCommentService(db), CommentManageService: newCommentManageService(db), UserManageService: newUserManageService(db), - SecurityService: newSecurityService(db), + ContactManageService: newContactManageService(db), + SecurityService: newSecurityService(db, pvs), AttachmentCheckService: security.NewAttachmentCheckService(), } return ds, ds } func NewAuthorizationManageService() core.AuthorizationManageService { - return &authorizationManageServant{ - db: conf.MustGormDB(), - } + return newAuthorizationManageService(conf.MustGormDB()) } func (s *dataServant) Name() string { @@ -80,5 +102,5 @@ func (s *dataServant) Name() string { } func (s *dataServant) Version() *semver.Version { - return semver.MustParse("v0.1.0") + return semver.MustParse("v0.2.0") } diff --git a/internal/dao/jinzhu/messages.go b/internal/dao/jinzhu/messages.go index 3e282776..32edaac2 100644 --- a/internal/dao/jinzhu/messages.go +++ b/internal/dao/jinzhu/messages.go @@ -1,8 +1,12 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package jinzhu import ( "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" "gorm.io/gorm" ) @@ -20,37 +24,37 @@ func newMessageService(db *gorm.DB) core.MessageService { } } -func (d *messageServant) CreateMessage(msg *model.Message) (*model.Message, error) { +func (d *messageServant) CreateMessage(msg *core.Message) (*core.Message, error) { return msg.Create(d.db) } func (d *messageServant) GetUnreadCount(userID int64) (int64, error) { - return (&model.Message{}).Count(d.db, &model.ConditionsT{ + return (&dbr.Message{}).Count(d.db, &dbr.ConditionsT{ "receiver_user_id": userID, - "is_read": model.MsgStatusUnread, + "is_read": dbr.MsgStatusUnread, }) } -func (d *messageServant) GetMessageByID(id int64) (*model.Message, error) { - return (&model.Message{ - Model: &model.Model{ +func (d *messageServant) GetMessageByID(id int64) (*core.Message, error) { + return (&dbr.Message{ + Model: &dbr.Model{ ID: id, }, }).Get(d.db) } -func (d *messageServant) ReadMessage(message *model.Message) error { +func (d *messageServant) ReadMessage(message *core.Message) error { message.IsRead = 1 return message.Update(d.db) } -func (d *messageServant) GetMessages(conditions *model.ConditionsT, offset, limit int) ([]*model.MessageFormated, error) { - messages, err := (&model.Message{}).List(d.db, conditions, offset, limit) +func (d *messageServant) GetMessages(conditions *core.ConditionsT, offset, limit int) ([]*core.MessageFormated, error) { + messages, err := (&dbr.Message{}).List(d.db, conditions, offset, limit) if err != nil { return nil, err } - mfs := []*model.MessageFormated{} + mfs := []*dbr.MessageFormated{} for _, message := range messages { mf := message.Format() mfs = append(mfs, mf) @@ -59,6 +63,6 @@ func (d *messageServant) GetMessages(conditions *model.ConditionsT, offset, limi return mfs, nil } -func (d *messageServant) GetMessageCount(conditions *model.ConditionsT) (int64, error) { - return (&model.Message{}).Count(d.db, conditions) +func (d *messageServant) GetMessageCount(conditions *core.ConditionsT) (int64, error) { + return (&dbr.Message{}).Count(d.db, conditions) } diff --git a/internal/dao/jinzhu/security.go b/internal/dao/jinzhu/security.go index dfbe2c74..69fc57d4 100644 --- a/internal/dao/jinzhu/security.go +++ b/internal/dao/jinzhu/security.go @@ -1,18 +1,16 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package jinzhu import ( - "errors" - "fmt" "math/rand" - "net/http" "strconv" "time" - "github.com/rocboss/paopao-ce/internal/conf" "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" - "github.com/rocboss/paopao-ce/pkg/json" - "gopkg.in/resty.v1" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" "gorm.io/gorm" ) @@ -21,71 +19,46 @@ var ( ) type securityServant struct { - db *gorm.DB + db *gorm.DB + phoneVerify core.PhoneVerifyService } -func newSecurityService(db *gorm.DB) core.SecurityService { +func newSecurityService(db *gorm.DB, phoneVerify core.PhoneVerifyService) core.SecurityService { return &securityServant{ - db: db, + db: db, + phoneVerify: phoneVerify, } } -type juhePhoneCaptchaRsp struct { - ErrorCode int `json:"error_code"` - Reason string `json:"reason"` -} - -// 获取最新短信验证码 -func (s *securityServant) GetLatestPhoneCaptcha(phone string) (*model.Captcha, error) { - return (&model.Captcha{ +// GetLatestPhoneCaptcha 获取最新短信验证码 +func (s *securityServant) GetLatestPhoneCaptcha(phone string) (*core.Captcha, error) { + return (&dbr.Captcha{ Phone: phone, }).Get(s.db) } -// 更新短信验证码 -func (s *securityServant) UsePhoneCaptcha(captcha *model.Captcha) error { +// UsePhoneCaptcha 更新短信验证码 +func (s *securityServant) UsePhoneCaptcha(captcha *core.Captcha) error { captcha.UseTimes++ return captcha.Update(s.db) } -// 发送短信验证码 +// SendPhoneCaptcha 发送短信验证码 func (s *securityServant) SendPhoneCaptcha(phone string) error { - rand.Seed(time.Now().UnixNano()) - captcha := rand.Intn(900000) + 100000 - m := 5 - - client := resty.New() - client.DisableWarn = true - resp, err := client.R(). - SetFormData(map[string]string{ - "mobile": phone, - "tpl_id": conf.SmsJuheSetting.TplID, - "tpl_value": fmt.Sprintf(conf.SmsJuheSetting.TplVal, captcha, m), - "key": conf.SmsJuheSetting.Key, - }).Post(conf.SmsJuheSetting.Gateway) - if err != nil { - return err - } - - if resp.StatusCode() != http.StatusOK { - return errors.New(resp.Status()) - } + expire := time.Duration(5) - result := &juhePhoneCaptchaRsp{} - err = json.Unmarshal(resp.Body(), result) - if err != nil { + // 发送验证码 + rand.Seed(time.Now().UnixNano()) + captcha := strconv.Itoa(rand.Intn(900000) + 100000) + if err := s.phoneVerify.SendPhoneCaptcha(phone, captcha, expire); err != nil { return err } - if result.ErrorCode != 0 { - return errors.New(result.Reason) - } - // 写入表 - captchaModel := &model.Captcha{ + captchaModel := &dbr.Captcha{ Phone: phone, - Captcha: strconv.Itoa(captcha), - ExpiredOn: time.Now().Add(time.Minute * time.Duration(m)).Unix(), + Captcha: captcha, + ExpiredOn: time.Now().Add(expire * time.Minute).Unix(), } captchaModel.Create(s.db) return nil diff --git a/internal/dao/jinzhu/topics.go b/internal/dao/jinzhu/topics.go index 0524b71b..d5ce70a9 100644 --- a/internal/dao/jinzhu/topics.go +++ b/internal/dao/jinzhu/topics.go @@ -1,10 +1,14 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package jinzhu import ( "strings" "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" "gorm.io/gorm" ) @@ -22,28 +26,28 @@ func newTopicService(db *gorm.DB) core.TopicService { } } -func (s *topicServant) CreateTag(tag *model.Tag) (*model.Tag, error) { +func (s *topicServant) CreateTag(tag *core.Tag) (*core.Tag, error) { return createTag(s.db, tag) } -func (s *topicServant) DeleteTag(tag *model.Tag) error { +func (s *topicServant) DeleteTag(tag *core.Tag) error { return deleteTag(s.db, tag) } -func (s *topicServant) GetTags(conditions *model.ConditionsT, offset, limit int) ([]*model.Tag, error) { - return (&model.Tag{}).List(s.db, conditions, offset, limit) +func (s *topicServant) GetTags(conditions *core.ConditionsT, offset, limit int) ([]*core.Tag, error) { + return (&dbr.Tag{}).List(s.db, conditions, offset, limit) } -func (s *topicServant) GetTagsByKeyword(keyword string) ([]*model.Tag, error) { - tag := &model.Tag{} +func (s *topicServant) GetTagsByKeyword(keyword string) ([]*core.Tag, error) { + tag := &dbr.Tag{} keyword = "%" + strings.Trim(keyword, " ") + "%" if keyword == "%%" { - return tag.List(s.db, &model.ConditionsT{ + return tag.List(s.db, &dbr.ConditionsT{ "ORDER": "quote_num DESC", }, 0, 6) } else { - return tag.List(s.db, &model.ConditionsT{ + return tag.List(s.db, &dbr.ConditionsT{ "tag LIKE ?": keyword, "ORDER": "quote_num DESC", }, 0, 6) diff --git a/internal/dao/jinzhu/tweets.go b/internal/dao/jinzhu/tweets.go index 12e6f21c..186b7280 100644 --- a/internal/dao/jinzhu/tweets.go +++ b/internal/dao/jinzhu/tweets.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package jinzhu import ( @@ -5,7 +9,7 @@ import ( "time" "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" "gorm.io/gorm" ) @@ -48,7 +52,7 @@ func newTweetHelpService(db *gorm.DB) core.TweetHelpService { } // MergePosts post数据整合 -func (s *tweetHelpServant) MergePosts(posts []*model.Post) ([]*model.PostFormated, error) { +func (s *tweetHelpServant) MergePosts(posts []*core.Post) ([]*core.PostFormated, error) { postIds := make([]int64, 0, len(posts)) userIds := make([]int64, 0, len(posts)) for _, post := range posts { @@ -66,18 +70,18 @@ func (s *tweetHelpServant) MergePosts(posts []*model.Post) ([]*model.PostFormate return nil, err } - userMap := make(map[int64]*model.UserFormated, len(users)) + userMap := make(map[int64]*dbr.UserFormated, len(users)) for _, user := range users { userMap[user.ID] = user.Format() } - contentMap := make(map[int64][]*model.PostContentFormated, len(postContents)) + contentMap := make(map[int64][]*dbr.PostContentFormated, len(postContents)) for _, content := range postContents { contentMap[content.PostID] = append(contentMap[content.PostID], content.Format()) } // 数据整合 - postsFormated := make([]*model.PostFormated, 0, len(posts)) + postsFormated := make([]*dbr.PostFormated, 0, len(posts)) for _, post := range posts { postFormated := post.Format() postFormated.User = userMap[post.UserID] @@ -88,7 +92,7 @@ func (s *tweetHelpServant) MergePosts(posts []*model.Post) ([]*model.PostFormate } // RevampPosts post数据整形修复 -func (s *tweetHelpServant) RevampPosts(posts []*model.PostFormated) ([]*model.PostFormated, error) { +func (s *tweetHelpServant) RevampPosts(posts []*core.PostFormated) ([]*core.PostFormated, error) { postIds := make([]int64, 0, len(posts)) userIds := make([]int64, 0, len(posts)) for _, post := range posts { @@ -106,12 +110,12 @@ func (s *tweetHelpServant) RevampPosts(posts []*model.PostFormated) ([]*model.Po return nil, err } - userMap := make(map[int64]*model.UserFormated, len(users)) + userMap := make(map[int64]*dbr.UserFormated, len(users)) for _, user := range users { userMap[user.ID] = user.Format() } - contentMap := make(map[int64][]*model.PostContentFormated, len(postContents)) + contentMap := make(map[int64][]*dbr.PostContentFormated, len(postContents)) for _, content := range postContents { contentMap[content.PostID] = append(contentMap[content.PostID], content.Format()) } @@ -124,23 +128,23 @@ func (s *tweetHelpServant) RevampPosts(posts []*model.PostFormated) ([]*model.Po return posts, nil } -func (s *tweetHelpServant) getPostContentsByIDs(ids []int64) ([]*model.PostContent, error) { - return (&model.PostContent{}).List(s.db, &model.ConditionsT{ +func (s *tweetHelpServant) getPostContentsByIDs(ids []int64) ([]*dbr.PostContent, error) { + return (&dbr.PostContent{}).List(s.db, &dbr.ConditionsT{ "post_id IN ?": ids, "ORDER": "sort ASC", }, 0, 0) } -func (s *tweetHelpServant) getUsersByIDs(ids []int64) ([]*model.User, error) { - user := &model.User{} +func (s *tweetHelpServant) getUsersByIDs(ids []int64) ([]*dbr.User, error) { + user := &dbr.User{} - return user.List(s.db, &model.ConditionsT{ + return user.List(s.db, &dbr.ConditionsT{ "id IN ?": ids, }, 0, 0) } -func (s *tweetManageServant) CreatePostCollection(postID, userID int64) (*model.PostCollection, error) { - collection := &model.PostCollection{ +func (s *tweetManageServant) CreatePostCollection(postID, userID int64) (*core.PostCollection, error) { + collection := &dbr.PostCollection{ PostID: postID, UserID: userID, } @@ -148,19 +152,19 @@ func (s *tweetManageServant) CreatePostCollection(postID, userID int64) (*model. return collection.Create(s.db) } -func (s *tweetManageServant) DeletePostCollection(p *model.PostCollection) error { +func (s *tweetManageServant) DeletePostCollection(p *core.PostCollection) error { return p.Delete(s.db) } -func (s *tweetManageServant) CreatePostContent(content *model.PostContent) (*model.PostContent, error) { +func (s *tweetManageServant) CreatePostContent(content *core.PostContent) (*core.PostContent, error) { return content.Create(s.db) } -func (s *tweetManageServant) CreateAttachment(attachment *model.Attachment) (*model.Attachment, error) { +func (s *tweetManageServant) CreateAttachment(attachment *core.Attachment) (*core.Attachment, error) { return attachment.Create(s.db) } -func (s *tweetManageServant) CreatePost(post *model.Post) (*model.Post, error) { +func (s *tweetManageServant) CreatePost(post *core.Post) (*core.Post, error) { post.LatestRepliedOn = time.Now().Unix() p, err := post.Create(s.db) if err != nil { @@ -170,11 +174,11 @@ func (s *tweetManageServant) CreatePost(post *model.Post) (*model.Post, error) { return p, nil } -func (s *tweetManageServant) DeletePost(post *model.Post) ([]string, error) { +func (s *tweetManageServant) DeletePost(post *core.Post) ([]string, error) { var mediaContents []string postId := post.ID - postContent := &model.PostContent{} + postContent := &dbr.PostContent{} err := s.db.Transaction( func(tx *gorm.DB) error { if contents, err := postContent.MediaContentsByPostId(tx, postId); err == nil { @@ -218,8 +222,8 @@ func (s *tweetManageServant) DeletePost(post *model.Post) ([]string, error) { } func (s *tweetManageServant) deleteCommentByPostId(db *gorm.DB, postId int64) ([]string, error) { - comment := &model.Comment{} - commentContent := &model.CommentContent{} + comment := &dbr.Comment{} + commentContent := &dbr.CommentContent{} // 获取推文的所有评论id commentIds, err := comment.CommentIdsByPostId(db, postId) @@ -244,19 +248,19 @@ func (s *tweetManageServant) deleteCommentByPostId(db *gorm.DB, postId int64) ([ } // 删评论的评论 - if err = (&model.CommentReply{}).DeleteByCommentIds(db, commentIds); err != nil { + if err = (&dbr.CommentReply{}).DeleteByCommentIds(db, commentIds); err != nil { return nil, err } return mediaContents, nil } -func (s *tweetManageServant) LockPost(post *model.Post) error { +func (s *tweetManageServant) LockPost(post *core.Post) error { post.IsLock = 1 - post.IsLock return post.Update(s.db) } -func (s *tweetManageServant) StickPost(post *model.Post) error { +func (s *tweetManageServant) StickPost(post *core.Post) error { post.IsTop = 1 - post.IsTop if err := post.Update(s.db); err != nil { return err @@ -265,7 +269,7 @@ func (s *tweetManageServant) StickPost(post *model.Post) error { return nil } -func (s *tweetManageServant) VisiblePost(post *model.Post, visibility model.PostVisibleT) error { +func (s *tweetManageServant) VisiblePost(post *core.Post, visibility core.PostVisibleT) error { oldVisibility := post.Visibility post.Visibility = visibility // TODO: 这个判断是否可以不要呢 @@ -273,7 +277,7 @@ func (s *tweetManageServant) VisiblePost(post *model.Post, visibility model.Post return nil } // 私密推文 特殊处理 - if visibility == model.PostVisitPrivate { + if visibility == dbr.PostVisitPrivate { // 强制取消置顶 // TODO: 置顶推文用户是否有权设置成私密? 后续完善 post.IsTop = 0 @@ -288,14 +292,14 @@ func (s *tweetManageServant) VisiblePost(post *model.Post, visibility model.Post // tag处理 tags := strings.Split(post.Tags, ",") for _, t := range tags { - tag := &model.Tag{ + tag := &dbr.Tag{ Tag: t, } // TODO: 暂时宽松不处理错误,这里或许可以有优化,后续完善 - if oldVisibility == model.PostVisitPrivate { + if oldVisibility == dbr.PostVisitPrivate { // 从私密转为非私密才需要重新创建tag createTag(db, tag) - } else if visibility == model.PostVisitPrivate { + } else if visibility == dbr.PostVisitPrivate { // 从非私密转为私密才需要删除tag deleteTag(db, tag) } @@ -305,7 +309,7 @@ func (s *tweetManageServant) VisiblePost(post *model.Post, visibility model.Post return nil } -func (s *tweetManageServant) UpdatePost(post *model.Post) error { +func (s *tweetManageServant) UpdatePost(post *core.Post) error { if err := post.Update(s.db); err != nil { return err } @@ -313,104 +317,104 @@ func (s *tweetManageServant) UpdatePost(post *model.Post) error { return nil } -func (s *tweetManageServant) CreatePostStar(postID, userID int64) (*model.PostStar, error) { - star := &model.PostStar{ +func (s *tweetManageServant) CreatePostStar(postID, userID int64) (*core.PostStar, error) { + star := &dbr.PostStar{ PostID: postID, UserID: userID, } return star.Create(s.db) } -func (s *tweetManageServant) DeletePostStar(p *model.PostStar) error { +func (s *tweetManageServant) DeletePostStar(p *core.PostStar) error { return p.Delete(s.db) } -func (s *tweetServant) GetPostByID(id int64) (*model.Post, error) { - post := &model.Post{ - Model: &model.Model{ +func (s *tweetServant) GetPostByID(id int64) (*core.Post, error) { + post := &dbr.Post{ + Model: &dbr.Model{ ID: id, }, } return post.Get(s.db) } -func (s *tweetServant) GetPosts(conditions *model.ConditionsT, offset, limit int) ([]*model.Post, error) { - return (&model.Post{}).List(s.db, conditions, offset, limit) +func (s *tweetServant) GetPosts(conditions *core.ConditionsT, offset, limit int) ([]*core.Post, error) { + return (&dbr.Post{}).List(s.db, conditions, offset, limit) } -func (s *tweetServant) GetPostCount(conditions *model.ConditionsT) (int64, error) { - return (&model.Post{}).Count(s.db, conditions) +func (s *tweetServant) GetPostCount(conditions *core.ConditionsT) (int64, error) { + return (&dbr.Post{}).Count(s.db, conditions) } -func (s *tweetServant) GetUserPostStar(postID, userID int64) (*model.PostStar, error) { - star := &model.PostStar{ +func (s *tweetServant) GetUserPostStar(postID, userID int64) (*core.PostStar, error) { + star := &dbr.PostStar{ PostID: postID, UserID: userID, } return star.Get(s.db) } -func (s *tweetServant) GetUserPostStars(userID int64, offset, limit int) ([]*model.PostStar, error) { - star := &model.PostStar{ +func (s *tweetServant) GetUserPostStars(userID int64, offset, limit int) ([]*core.PostStar, error) { + star := &dbr.PostStar{ UserID: userID, } - return star.List(s.db, &model.ConditionsT{ + return star.List(s.db, &dbr.ConditionsT{ "ORDER": s.db.NamingStrategy.TableName("PostStar") + ".id DESC", }, offset, limit) } func (s *tweetServant) GetUserPostStarCount(userID int64) (int64, error) { - star := &model.PostStar{ + star := &dbr.PostStar{ UserID: userID, } - return star.Count(s.db, &model.ConditionsT{}) + return star.Count(s.db, &dbr.ConditionsT{}) } -func (s *tweetServant) GetUserPostCollection(postID, userID int64) (*model.PostCollection, error) { - star := &model.PostCollection{ +func (s *tweetServant) GetUserPostCollection(postID, userID int64) (*core.PostCollection, error) { + star := &dbr.PostCollection{ PostID: postID, UserID: userID, } return star.Get(s.db) } -func (s *tweetServant) GetUserPostCollections(userID int64, offset, limit int) ([]*model.PostCollection, error) { - collection := &model.PostCollection{ +func (s *tweetServant) GetUserPostCollections(userID int64, offset, limit int) ([]*core.PostCollection, error) { + collection := &dbr.PostCollection{ UserID: userID, } - return collection.List(s.db, &model.ConditionsT{ + return collection.List(s.db, &dbr.ConditionsT{ "ORDER": s.db.NamingStrategy.TableName("PostCollection") + ".id DESC", }, offset, limit) } func (s *tweetServant) GetUserPostCollectionCount(userID int64) (int64, error) { - collection := &model.PostCollection{ + collection := &dbr.PostCollection{ UserID: userID, } - return collection.Count(s.db, &model.ConditionsT{}) + return collection.Count(s.db, &dbr.ConditionsT{}) } -func (s *tweetServant) GetUserWalletBills(userID int64, offset, limit int) ([]*model.WalletStatement, error) { - statement := &model.WalletStatement{ +func (s *tweetServant) GetUserWalletBills(userID int64, offset, limit int) ([]*core.WalletStatement, error) { + statement := &dbr.WalletStatement{ UserID: userID, } - return statement.List(s.db, &model.ConditionsT{ + return statement.List(s.db, &dbr.ConditionsT{ "ORDER": "id DESC", }, offset, limit) } func (s *tweetServant) GetUserWalletBillCount(userID int64) (int64, error) { - statement := &model.WalletStatement{ + statement := &dbr.WalletStatement{ UserID: userID, } - return statement.Count(s.db, &model.ConditionsT{}) + return statement.Count(s.db, &dbr.ConditionsT{}) } -func (s *tweetServant) GetPostAttatchmentBill(postID, userID int64) (*model.PostAttachmentBill, error) { - bill := &model.PostAttachmentBill{ +func (s *tweetServant) GetPostAttatchmentBill(postID, userID int64) (*core.PostAttachmentBill, error) { + bill := &dbr.PostAttachmentBill{ PostID: postID, UserID: userID, } @@ -418,16 +422,16 @@ func (s *tweetServant) GetPostAttatchmentBill(postID, userID int64) (*model.Post return bill.Get(s.db) } -func (s *tweetServant) GetPostContentsByIDs(ids []int64) ([]*model.PostContent, error) { - return (&model.PostContent{}).List(s.db, &model.ConditionsT{ +func (s *tweetServant) GetPostContentsByIDs(ids []int64) ([]*core.PostContent, error) { + return (&dbr.PostContent{}).List(s.db, &dbr.ConditionsT{ "post_id IN ?": ids, "ORDER": "sort ASC", }, 0, 0) } -func (s *tweetServant) GetPostContentByID(id int64) (*model.PostContent, error) { - return (&model.PostContent{ - Model: &model.Model{ +func (s *tweetServant) GetPostContentByID(id int64) (*core.PostContent, error) { + return (&dbr.PostContent{ + Model: &dbr.Model{ ID: id, }, }).Get(s.db) diff --git a/internal/dao/jinzhu/user.go b/internal/dao/jinzhu/user.go index 53e11db4..96d09fc1 100644 --- a/internal/dao/jinzhu/user.go +++ b/internal/dao/jinzhu/user.go @@ -1,10 +1,14 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package jinzhu import ( "strings" "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" "gorm.io/gorm" ) @@ -22,74 +26,69 @@ func newUserManageService(db *gorm.DB) core.UserManageService { } } -func (s *userManageServant) GetUserByID(id int64) (*model.User, error) { - user := &model.User{ - Model: &model.Model{ +func (s *userManageServant) GetUserByID(id int64) (*core.User, error) { + user := &dbr.User{ + Model: &dbr.Model{ ID: id, }, } return user.Get(s.db) } -func (s *userManageServant) GetUserByUsername(username string) (*model.User, error) { - user := &model.User{ +func (s *userManageServant) GetUserByUsername(username string) (*core.User, error) { + user := &dbr.User{ Username: username, } return user.Get(s.db) } -func (s *userManageServant) GetUserByPhone(phone string) (*model.User, error) { - user := &model.User{ +func (s *userManageServant) GetUserByPhone(phone string) (*core.User, error) { + user := &dbr.User{ Phone: phone, } return user.Get(s.db) } -func (s *userManageServant) GetUsersByIDs(ids []int64) ([]*model.User, error) { - user := &model.User{} - return user.List(s.db, &model.ConditionsT{ +func (s *userManageServant) GetUsersByIDs(ids []int64) ([]*core.User, error) { + user := &dbr.User{} + return user.List(s.db, &dbr.ConditionsT{ "id IN ?": ids, }, 0, 0) } -func (s *userManageServant) GetUsersByKeyword(keyword string) ([]*model.User, error) { - user := &model.User{} +func (s *userManageServant) GetUsersByKeyword(keyword string) ([]*core.User, error) { + user := &dbr.User{} keyword = strings.Trim(keyword, " ") + "%" if keyword == "%" { - return user.List(s.db, &model.ConditionsT{ + return user.List(s.db, &dbr.ConditionsT{ "ORDER": "id ASC", }, 0, 6) } else { - return user.List(s.db, &model.ConditionsT{ + return user.List(s.db, &dbr.ConditionsT{ "username LIKE ?": keyword, }, 0, 6) } } -func (s *userManageServant) GetTagsByKeyword(keyword string) ([]*model.Tag, error) { - tag := &model.Tag{} +func (s *userManageServant) GetTagsByKeyword(keyword string) ([]*core.Tag, error) { + tag := &dbr.Tag{} keyword = "%" + strings.Trim(keyword, " ") + "%" if keyword == "%%" { - return tag.List(s.db, &model.ConditionsT{ + return tag.List(s.db, &dbr.ConditionsT{ "ORDER": "quote_num DESC", }, 0, 6) } else { - return tag.List(s.db, &model.ConditionsT{ + return tag.List(s.db, &dbr.ConditionsT{ "tag LIKE ?": keyword, "ORDER": "quote_num DESC", }, 0, 6) } } -func (s *userManageServant) CreateUser(user *model.User) (*model.User, error) { +func (s *userManageServant) CreateUser(user *dbr.User) (*core.User, error) { return user.Create(s.db) } -func (s *userManageServant) UpdateUser(user *model.User) error { +func (s *userManageServant) UpdateUser(user *core.User) error { return user.Update(s.db) } - -func (s *userManageServant) IsFriend(userId int64, friendId int64) bool { - // just true now - return true -} diff --git a/internal/dao/jinzhu/utils.go b/internal/dao/jinzhu/utils.go index 8c866027..27766397 100644 --- a/internal/dao/jinzhu/utils.go +++ b/internal/dao/jinzhu/utils.go @@ -1,11 +1,15 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package jinzhu import ( - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" "gorm.io/gorm" ) -func createTag(db *gorm.DB, tag *model.Tag) (*model.Tag, error) { +func createTag(db *gorm.DB, tag *dbr.Tag) (*dbr.Tag, error) { t, err := tag.Get(db) if err != nil { tag.QuoteNum = 1 @@ -23,7 +27,7 @@ func createTag(db *gorm.DB, tag *model.Tag) (*model.Tag, error) { return t, nil } -func deleteTag(db *gorm.DB, tag *model.Tag) error { +func deleteTag(db *gorm.DB, tag *dbr.Tag) error { tag, err := tag.Get(db) if err != nil { return err @@ -33,7 +37,7 @@ func deleteTag(db *gorm.DB, tag *model.Tag) error { } func deleteTags(db *gorm.DB, tags []string) error { - allTags, err := (&model.Tag{}).TagsFrom(db, tags) + allTags, err := (&dbr.Tag{}).TagsFrom(db, tags) if err != nil { return err } @@ -51,9 +55,9 @@ func deleteTags(db *gorm.DB, tags []string) error { } // 根据IDs获取用户列表 -func getUsersByIDs(db *gorm.DB, ids []int64) ([]*model.User, error) { - user := &model.User{} - return user.List(db, &model.ConditionsT{ +func getUsersByIDs(db *gorm.DB, ids []int64) ([]*dbr.User, error) { + user := &dbr.User{} + return user.List(db, &dbr.ConditionsT{ "id IN ?": ids, }, 0, 0) } diff --git a/internal/dao/jinzhu/wallet.go b/internal/dao/jinzhu/wallet.go index 0d4e12f3..7b2023d7 100644 --- a/internal/dao/jinzhu/wallet.go +++ b/internal/dao/jinzhu/wallet.go @@ -1,10 +1,13 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package jinzhu import ( "github.com/rocboss/paopao-ce/internal/conf" "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" - "github.com/rocboss/paopao-ce/pkg/types" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" "gorm.io/gorm" ) @@ -22,17 +25,17 @@ func newWalletService(db *gorm.DB) core.WalletService { } } -func (d *walletServant) GetRechargeByID(id int64) (*model.WalletRecharge, error) { - recharge := &model.WalletRecharge{ - Model: &model.Model{ +func (d *walletServant) GetRechargeByID(id int64) (*core.WalletRecharge, error) { + recharge := &dbr.WalletRecharge{ + Model: &dbr.Model{ ID: id, }, } return recharge.Get(d.db) } -func (d *walletServant) CreateRecharge(userId, amount int64) (*model.WalletRecharge, error) { - recharge := &model.WalletRecharge{ +func (d *walletServant) CreateRecharge(userId, amount int64) (*core.WalletRecharge, error) { + recharge := &dbr.WalletRecharge{ UserID: userId, Amount: amount, } @@ -40,26 +43,26 @@ func (d *walletServant) CreateRecharge(userId, amount int64) (*model.WalletRecha return recharge.Create(d.db) } -func (d *walletServant) GetUserWalletBills(userID int64, offset, limit int) ([]*model.WalletStatement, error) { - statement := &model.WalletStatement{ +func (d *walletServant) GetUserWalletBills(userID int64, offset, limit int) ([]*core.WalletStatement, error) { + statement := &dbr.WalletStatement{ UserID: userID, } - return statement.List(d.db, &model.ConditionsT{ + return statement.List(d.db, &dbr.ConditionsT{ "ORDER": "id DESC", }, offset, limit) } func (d *walletServant) GetUserWalletBillCount(userID int64) (int64, error) { - statement := &model.WalletStatement{ + statement := &dbr.WalletStatement{ UserID: userID, } - return statement.Count(d.db, &model.ConditionsT{}) + return statement.Count(d.db, &dbr.ConditionsT{}) } -func (d *walletServant) HandleRechargeSuccess(recharge *model.WalletRecharge, tradeNo string) error { - user, _ := (&model.User{ - Model: &model.Model{ +func (d *walletServant) HandleRechargeSuccess(recharge *core.WalletRecharge, tradeNo string) error { + user, _ := (&dbr.User{ + Model: &dbr.Model{ ID: recharge.UserID, }, }).Get(d.db) @@ -72,7 +75,7 @@ func (d *walletServant) HandleRechargeSuccess(recharge *model.WalletRecharge, tr } // 新增账单 - if err := tx.Create(&model.WalletStatement{ + if err := tx.Create(&dbr.WalletStatement{ UserID: user.ID, ChangeAmount: recharge.Amount, BalanceSnapshot: user.Balance + recharge.Amount, @@ -82,7 +85,7 @@ func (d *walletServant) HandleRechargeSuccess(recharge *model.WalletRecharge, tr } // 标记为已付款 - if err := tx.Model(recharge).Updates(map[string]types.Any{ + if err := tx.Model(recharge).Updates(map[string]any{ "trade_no": tradeNo, "trade_status": "TRADE_SUCCESS", }).Error; err != nil { @@ -94,7 +97,7 @@ func (d *walletServant) HandleRechargeSuccess(recharge *model.WalletRecharge, tr }) } -func (d *walletServant) HandlePostAttachmentBought(post *model.Post, user *model.User) error { +func (d *walletServant) HandlePostAttachmentBought(post *core.Post, user *core.User) error { return d.db.Transaction(func(tx *gorm.DB) error { // 扣除金额 if err := tx.Model(user).Update("balance", gorm.Expr("balance - ?", post.AttachmentPrice)).Error; err != nil { @@ -103,7 +106,7 @@ func (d *walletServant) HandlePostAttachmentBought(post *model.Post, user *model } // 新增账单 - if err := tx.Create(&model.WalletStatement{ + if err := tx.Create(&dbr.WalletStatement{ PostID: post.ID, UserID: user.ID, ChangeAmount: -post.AttachmentPrice, @@ -114,7 +117,7 @@ func (d *walletServant) HandlePostAttachmentBought(post *model.Post, user *model } // 新增附件购买记录 - if err := tx.Create(&model.PostAttachmentBill{ + if err := tx.Create(&dbr.PostAttachmentBill{ PostID: post.ID, UserID: user.ID, PaidAmount: post.AttachmentPrice, @@ -125,8 +128,8 @@ func (d *walletServant) HandlePostAttachmentBought(post *model.Post, user *model // 对附件主新增账单 income := int64(float64(post.AttachmentPrice) * conf.AppSetting.AttachmentIncomeRate) if income > 0 { - master := &model.User{ - Model: &model.Model{ + master := &dbr.User{ + Model: &dbr.Model{ ID: post.UserID, }, } @@ -138,7 +141,7 @@ func (d *walletServant) HandlePostAttachmentBought(post *model.Post, user *model } // 新增账单 - if err := tx.Create(&model.WalletStatement{ + if err := tx.Create(&dbr.WalletStatement{ PostID: post.ID, UserID: master.ID, ChangeAmount: income, diff --git a/internal/dao/sakila/sakila.go b/internal/dao/sakila/sakila.go index 6efdffa6..d82a0d23 100644 --- a/internal/dao/sakila/sakila.go +++ b/internal/dao/sakila/sakila.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + // Core service implement base sqlx+mysql. All sub-service // will declare here and provide initial function. diff --git a/internal/dao/search/bridge.go b/internal/dao/search/bridge.go index 84623f7c..f23aaa25 100644 --- a/internal/dao/search/bridge.go +++ b/internal/dao/search/bridge.go @@ -1,8 +1,13 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package search import ( + "time" + "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" "github.com/sirupsen/logrus" ) @@ -12,20 +17,21 @@ var ( type documents struct { primaryKey []string - docItems core.DocItems + docItems []core.TsDocItem identifiers []string } type bridgeTweetSearchServant struct { - ts core.TweetSearchService - updateDocsCh chan *documents + ts core.TweetSearchService + updateDocsCh chan *documents + updateDocsTempCh chan *documents } func (s *bridgeTweetSearchServant) IndexName() string { return s.ts.IndexName() } -func (s *bridgeTweetSearchServant) AddDocuments(data core.DocItems, primaryKey ...string) (bool, error) { +func (s *bridgeTweetSearchServant) AddDocuments(data []core.TsDocItem, primaryKey ...string) (bool, error) { s.updateDocs(&documents{ primaryKey: primaryKey, docItems: data, @@ -40,39 +46,54 @@ func (s *bridgeTweetSearchServant) DeleteDocuments(identifiers []string) error { return nil } -func (s *bridgeTweetSearchServant) Search(user *model.User, q *core.QueryReq, offset, limit int) (*core.QueryResp, error) { +func (s *bridgeTweetSearchServant) Search(user *core.User, q *core.QueryReq, offset, limit int) (*core.QueryResp, error) { return s.ts.Search(user, q, offset, limit) } func (s *bridgeTweetSearchServant) updateDocs(doc *documents) { select { case s.updateDocsCh <- doc: - logrus.Debugln("addDocuments send documents by chan") + logrus.Debugln("addDocuments send documents by updateDocsCh chan") default: - go func(item *documents) { - if len(item.docItems) > 0 { - if _, err := s.ts.AddDocuments(item.docItems, item.primaryKey...); err != nil { - logrus.Errorf("addDocuments in gorotine occurs error: %v", err) - } - } else if len(item.identifiers) > 0 { - if err := s.ts.DeleteDocuments(item.identifiers); err != nil { - logrus.Errorf("deleteDocuments in gorotine occurs error: %s", err) + select { + case s.updateDocsTempCh <- doc: + logrus.Debugln("addDocuments send documents by updateDocsTempCh chan") + default: + go func() { + s.handleUpdate(doc) + + // watch updateDocsTempch to continue handle update if needed. + // cancel loop if no item had watched in 1 minute. + for count := 0; count > 60; count++ { + select { + case item := <-s.updateDocsTempCh: + // reset count to continue handle docs update + count = 0 + s.handleUpdate(item) + default: + // sleeping to wait docs item pass over to handle + time.Sleep(1 * time.Second) + } } - } - }(doc) + }() + } } } func (s *bridgeTweetSearchServant) startUpdateDocs() { for doc := range s.updateDocsCh { - if len(doc.docItems) > 0 { - if _, err := s.ts.AddDocuments(doc.docItems, doc.primaryKey...); err != nil { - logrus.Errorf("addDocuments occurs error: %v", err) - } - } else if len(doc.identifiers) > 0 { - if err := s.ts.DeleteDocuments(doc.identifiers); err != nil { - logrus.Errorf("deleteDocuments occurs error: %s", err) - } + s.handleUpdate(doc) + } +} + +func (s *bridgeTweetSearchServant) handleUpdate(item *documents) { + if len(item.docItems) > 0 { + if _, err := s.ts.AddDocuments(item.docItems, item.primaryKey...); err != nil { + logrus.Errorf("addDocuments occurs error: %v", err) + } + } else if len(item.identifiers) > 0 { + if err := s.ts.DeleteDocuments(item.identifiers); err != nil { + logrus.Errorf("deleteDocuments occurs error: %s", err) } } } diff --git a/internal/dao/search/filter.go b/internal/dao/search/filter.go index 229f2482..5840e189 100644 --- a/internal/dao/search/filter.go +++ b/internal/dao/search/filter.go @@ -1,8 +1,11 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package search import ( "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" "github.com/rocboss/paopao-ce/pkg/types" ) @@ -10,19 +13,19 @@ type tweetSearchFilter struct { ams core.AuthorizationManageService } -func (s *tweetSearchFilter) filterResp(user *model.User, resp *core.QueryResp) { +func (s *tweetSearchFilter) filterResp(user *core.User, resp *core.QueryResp) { // 管理员不过滤 if user != nil && user.IsAdmin { return } - var item *model.PostFormated + var item *core.PostFormated items := resp.Items latestIndex := len(items) - 1 if user == nil { for i := 0; i <= latestIndex; i++ { item = items[i] - if item.Visibility != model.PostVisitPublic { + if item.Visibility != core.PostVisitPublic { items[i] = items[latestIndex] items = items[:latestIndex] resp.Total-- @@ -36,8 +39,8 @@ func (s *tweetSearchFilter) filterResp(user *model.User, resp *core.QueryResp) { friendFilter[user.ID] = types.Empty{} for i := 0; i <= latestIndex; i++ { item = items[i] - cutFriend = (item.Visibility == model.PostVisitFriend && !friendFilter.IsFriend(item.UserID)) - cutPrivate = (item.Visibility == model.PostVisitPrivate && user.ID != item.UserID) + cutFriend = (item.Visibility == core.PostVisitFriend && !friendFilter.IsFriend(item.UserID)) + cutPrivate = (item.Visibility == core.PostVisitPrivate && user.ID != item.UserID) if cutFriend || cutPrivate { items[i] = items[latestIndex] items = items[:latestIndex] diff --git a/internal/dao/search/meili.go b/internal/dao/search/meili.go index d86ec4c3..b2ee4d16 100644 --- a/internal/dao/search/meili.go +++ b/internal/dao/search/meili.go @@ -1,12 +1,16 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package search import ( "fmt" + "strings" "github.com/Masterminds/semver/v3" "github.com/meilisearch/meilisearch-go" "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" "github.com/rocboss/paopao-ce/pkg/json" "github.com/sirupsen/logrus" ) @@ -26,20 +30,41 @@ type meiliTweetSearchServant struct { friendFilter string } +type postInfo struct { + ID int64 `json:"id"` + UserID int64 `json:"user_id"` + CommentCount int64 `json:"comment_count"` + CollectionCount int64 `json:"collection_count"` + UpvoteCount int64 `json:"upvote_count"` + Visibility core.PostVisibleT `json:"visibility"` + IsTop int `json:"is_top"` + IsEssence int `json:"is_essence"` + IsLock int `json:"is_lock"` + LatestRepliedOn int64 `json:"latest_replied_on"` + CreatedOn int64 `json:"created_on"` + ModifiedOn int64 `json:"modified_on"` + AttachmentPrice int64 `json:"attachment_price"` + IPLoc string `json:"ip_loc"` +} + func (s *meiliTweetSearchServant) Name() string { return "Meili" } func (s *meiliTweetSearchServant) Version() *semver.Version { - return semver.MustParse("v0.2.0") + return semver.MustParse("v0.2.1") } func (s *meiliTweetSearchServant) IndexName() string { return s.index.UID } -func (s *meiliTweetSearchServant) AddDocuments(data core.DocItems, primaryKey ...string) (bool, error) { - if _, err := s.index.AddDocuments(data, primaryKey...); err != nil { +func (s *meiliTweetSearchServant) AddDocuments(data []core.TsDocItem, primaryKey ...string) (bool, error) { + docs := s.toDocs(data) + if len(docs) == 0 { + return true, nil + } + if _, err := s.index.AddDocuments(docs, primaryKey...); err != nil { logrus.Errorf("meiliTweetSearchServant.AddDocuments error: %v", err) return false, err } @@ -56,7 +81,7 @@ func (s *meiliTweetSearchServant) DeleteDocuments(identifiers []string) error { return nil } -func (s *meiliTweetSearchServant) Search(user *model.User, q *core.QueryReq, offset, limit int) (resp *core.QueryResp, err error) { +func (s *meiliTweetSearchServant) Search(user *core.User, q *core.QueryReq, offset, limit int) (resp *core.QueryResp, err error) { if q.Type == core.SearchTypeDefault && q.Query != "" { resp, err = s.queryByContent(user, q, offset, limit) } else if q.Type == core.SearchTypeTag && q.Query != "" { @@ -74,7 +99,7 @@ func (s *meiliTweetSearchServant) Search(user *model.User, q *core.QueryReq, off return } -func (s *meiliTweetSearchServant) queryByContent(user *model.User, q *core.QueryReq, offset, limit int) (*core.QueryResp, error) { +func (s *meiliTweetSearchServant) queryByContent(user *core.User, q *core.QueryReq, offset, limit int) (*core.QueryResp, error) { request := &meilisearch.SearchRequest{ Offset: int64(offset), Limit: int64(limit), @@ -95,7 +120,7 @@ func (s *meiliTweetSearchServant) queryByContent(user *model.User, q *core.Query return s.postsFrom(resp) } -func (s *meiliTweetSearchServant) queryByTag(user *model.User, q *core.QueryReq, offset, limit int) (*core.QueryResp, error) { +func (s *meiliTweetSearchServant) queryByTag(user *core.User, q *core.QueryReq, offset, limit int) (*core.QueryResp, error) { request := &meilisearch.SearchRequest{ Offset: int64(offset), Limit: int64(limit), @@ -103,7 +128,7 @@ func (s *meiliTweetSearchServant) queryByTag(user *model.User, q *core.QueryReq, } filter := s.filterList(user) - tagFilter := []string{"tags." + q.Query + "=1"} + tagFilter := []string{"tags=" + q.Query} if len(filter) > 0 { request.Filter = [][]string{tagFilter, {filter}} } else { @@ -119,7 +144,7 @@ func (s *meiliTweetSearchServant) queryByTag(user *model.User, q *core.QueryReq, return s.postsFrom(resp) } -func (s *meiliTweetSearchServant) queryAny(user *model.User, offset, limit int) (*core.QueryResp, error) { +func (s *meiliTweetSearchServant) queryAny(user *core.User, offset, limit int) (*core.QueryResp, error) { request := &meilisearch.SearchRequest{ Offset: int64(offset), Limit: int64(limit), @@ -139,7 +164,7 @@ func (s *meiliTweetSearchServant) queryAny(user *model.User, offset, limit int) return s.postsFrom(resp) } -func (s *meiliTweetSearchServant) filterList(user *model.User) string { +func (s *meiliTweetSearchServant) filterList(user *core.User) string { if user == nil { return s.publicFilter } @@ -152,21 +177,59 @@ func (s *meiliTweetSearchServant) filterList(user *model.User) string { } func (s *meiliTweetSearchServant) postsFrom(resp *meilisearch.SearchResponse) (*core.QueryResp, error) { - posts := make([]*model.PostFormated, 0, len(resp.Hits)) + posts := make([]*core.PostFormated, 0, len(resp.Hits)) for _, hit := range resp.Hits { - item := &model.PostFormated{} raw, err := json.Marshal(hit) if err != nil { return nil, err } - if err = json.Unmarshal(raw, item); err != nil { + p := &postInfo{} + if err = json.Unmarshal(raw, p); err != nil { return nil, err } - posts = append(posts, item) + posts = append(posts, &core.PostFormated{ + ID: p.ID, + UserID: p.UserID, + CommentCount: p.CommentCount, + CollectionCount: p.CollectionCount, + UpvoteCount: p.UpvoteCount, + Visibility: p.Visibility, + IsTop: p.IsTop, + IsEssence: p.IsEssence, + IsLock: p.IsLock, + LatestRepliedOn: p.LatestRepliedOn, + CreatedOn: p.CreatedOn, + ModifiedOn: p.ModifiedOn, + AttachmentPrice: p.AttachmentPrice, + IPLoc: p.IPLoc, + }) } - return &core.QueryResp{ Items: posts, - Total: resp.NbHits, + Total: resp.EstimatedTotalHits, }, nil } + +func (s *meiliTweetSearchServant) toDocs(data []core.TsDocItem) []map[string]any { + docs := make([]map[string]any, 0, len(data)) + for _, d := range data { + docs = append(docs, map[string]any{ + "id": d.Post.ID, + "user_id": d.Post.UserID, + "comment_count": d.Post.CommentCount, + "collection_count": d.Post.CollectionCount, + "upvote_count": d.Post.UpvoteCount, + "visibility": d.Post.Visibility, + "is_top": d.Post.IsTop, + "is_essence": d.Post.IsEssence, + "content": d.Content, + "tags": strings.Split(d.Post.Tags, ","), + "ip_loc": d.Post.IPLoc, + "latest_replied_on": d.Post.LatestRepliedOn, + "attachment_price": d.Post.AttachmentPrice, + "created_on": d.Post.CreatedOn, + "modified_on": d.Post.ModifiedOn, + }) + } + return docs +} diff --git a/internal/dao/search/search.go b/internal/dao/search/search.go index 517591ea..baf0923b 100644 --- a/internal/dao/search/search.go +++ b/internal/dao/search/search.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package search import ( @@ -6,7 +10,6 @@ import ( "github.com/meilisearch/meilisearch-go" "github.com/rocboss/paopao-ce/internal/conf" "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" "github.com/rocboss/paopao-ce/pkg/zinc" "github.com/sirupsen/logrus" ) @@ -40,9 +43,9 @@ func NewMeiliTweetSearchService(ams core.AuthorizationManageService) (core.Tweet }, client: client, index: client.Index(s.Index), - publicFilter: fmt.Sprintf("visibility=%d", model.PostVisitPublic), - privateFilter: fmt.Sprintf("visibility=%d AND user_id=", model.PostVisitPrivate), - friendFilter: fmt.Sprintf("visibility=%d", model.PostVisitFriend), + publicFilter: fmt.Sprintf("visibility=%d", core.PostVisitPublic), + privateFilter: fmt.Sprintf("visibility=%d AND user_id=", core.PostVisitPrivate), + friendFilter: fmt.Sprintf("visibility=%d", core.PostVisitFriend), } return mts, mts } @@ -55,9 +58,9 @@ func NewZincTweetSearchService(ams core.AuthorizationManageService) (core.TweetS }, indexName: s.Index, client: zinc.NewClient(s), - publicFilter: fmt.Sprintf("visibility:%d", model.PostVisitPublic), - privateFilter: fmt.Sprintf("visibility:%d AND user_id:%%d", model.PostVisitPrivate), - friendFilter: fmt.Sprintf("visibility:%d", model.PostVisitFriend), + publicFilter: fmt.Sprintf("visibility:%d", core.PostVisitPublic), + privateFilter: fmt.Sprintf("visibility:%d AND user_id:%%d", core.PostVisitPrivate), + friendFilter: fmt.Sprintf("visibility:%d", core.PostVisitFriend), } zts.createIndex() @@ -72,8 +75,9 @@ func NewBridgeTweetSearchService(ts core.TweetSearchService) core.TweetSearchSer capacity = 10000 } bts := &bridgeTweetSearchServant{ - ts: ts, - updateDocsCh: make(chan *documents, capacity), + ts: ts, + updateDocsCh: make(chan *documents, capacity), + updateDocsTempCh: make(chan *documents, 100), } numWorker := conf.TweetSearchSetting.MinWorker diff --git a/internal/dao/search/zinc.go b/internal/dao/search/zinc.go index 37b96080..ea9a7fa5 100644 --- a/internal/dao/search/zinc.go +++ b/internal/dao/search/zinc.go @@ -1,11 +1,15 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package search import ( + "strings" + "github.com/Masterminds/semver/v3" "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" "github.com/rocboss/paopao-ce/pkg/json" - "github.com/rocboss/paopao-ce/pkg/types" "github.com/rocboss/paopao-ce/pkg/zinc" "github.com/sirupsen/logrus" ) @@ -37,23 +41,29 @@ func (s *zincTweetSearchServant) IndexName() string { return s.indexName } -func (s *zincTweetSearchServant) AddDocuments(data core.DocItems, primaryKey ...string) (bool, error) { - buf := make(core.DocItems, 0, len(data)+1) +func (s *zincTweetSearchServant) AddDocuments(data []core.TsDocItem, primaryKey ...string) (bool, error) { + if len(data) == 0 { + return true, nil + } + + buf := make([]map[string]any, 0, len(data)+1) if len(primaryKey) > 0 { - buf = append(buf, map[string]types.Any{ - "index": map[string]types.Any{ + buf = append(buf, map[string]any{ + "index": map[string]any{ "_index": s.indexName, "_id": primaryKey[0], }, }) } else { - buf = append(buf, map[string]types.Any{ - "index": map[string]types.Any{ + buf = append(buf, map[string]any{ + "index": map[string]any{ "_index": s.indexName, }, }) } - buf = append(buf, data...) + docs := s.toDocs(data) + buf = append(buf, docs...) + return s.client.BulkPushDoc(buf) } @@ -66,7 +76,7 @@ func (s *zincTweetSearchServant) DeleteDocuments(identifiers []string) error { return nil } -func (s *zincTweetSearchServant) Search(user *model.User, q *core.QueryReq, offset, limit int) (resp *core.QueryResp, err error) { +func (s *zincTweetSearchServant) Search(user *core.User, q *core.QueryReq, offset, limit int) (resp *core.QueryResp, err error) { if q.Type == core.SearchTypeDefault && q.Query != "" { resp, err = s.queryByContent(user, q, offset, limit) } else if q.Type == core.SearchTypeTag && q.Query != "" { @@ -84,10 +94,10 @@ func (s *zincTweetSearchServant) Search(user *model.User, q *core.QueryReq, offs return } -func (s *zincTweetSearchServant) queryByContent(user *model.User, q *core.QueryReq, offset, limit int) (*core.QueryResp, error) { - resp, err := s.client.EsQuery(s.indexName, map[string]types.Any{ - "query": map[string]types.Any{ - "match_phrase": map[string]types.Any{ +func (s *zincTweetSearchServant) queryByContent(user *core.User, q *core.QueryReq, offset, limit int) (*core.QueryResp, error) { + resp, err := s.client.EsQuery(s.indexName, map[string]any{ + "query": map[string]any{ + "match_phrase": map[string]any{ "content": q.Query, }, }, @@ -101,10 +111,10 @@ func (s *zincTweetSearchServant) queryByContent(user *model.User, q *core.QueryR return s.postsFrom(resp) } -func (s *zincTweetSearchServant) queryByTag(user *model.User, q *core.QueryReq, offset, limit int) (*core.QueryResp, error) { - resp, err := s.client.ApiQuery(s.indexName, map[string]types.Any{ +func (s *zincTweetSearchServant) queryByTag(user *core.User, q *core.QueryReq, offset, limit int) (*core.QueryResp, error) { + resp, err := s.client.ApiQuery(s.indexName, map[string]any{ "search_type": "querystring", - "query": map[string]types.Any{ + "query": map[string]any{ "term": "tags." + q.Query + ":1", }, "sort_fields": []string{"-is_top", "-latest_replied_on"}, @@ -117,9 +127,9 @@ func (s *zincTweetSearchServant) queryByTag(user *model.User, q *core.QueryReq, return s.postsFrom(resp) } -func (s *zincTweetSearchServant) queryAny(user *model.User, offset, limit int) (*core.QueryResp, error) { - queryMap := map[string]types.Any{ - "query": map[string]types.Any{ +func (s *zincTweetSearchServant) queryAny(user *core.User, offset, limit int) (*core.QueryResp, error) { + queryMap := map[string]any{ + "query": map[string]any{ "match_all": map[string]string{}, }, "sort": []string{"-is_top", "-latest_replied_on"}, @@ -134,9 +144,9 @@ func (s *zincTweetSearchServant) queryAny(user *model.User, offset, limit int) ( } func (s *zincTweetSearchServant) postsFrom(resp *zinc.QueryResultT) (*core.QueryResp, error) { - posts := make([]*model.PostFormated, 0, len(resp.Hits.Hits)) + posts := make([]*core.PostFormated, 0, len(resp.Hits.Hits)) for _, hit := range resp.Hits.Hits { - item := &model.PostFormated{} + item := &core.PostFormated{} raw, err := json.Marshal(hit.Source) if err != nil { return nil, err @@ -247,3 +257,31 @@ func (s *zincTweetSearchServant) createIndex() { }, }) } + +func (s *zincTweetSearchServant) toDocs(data []core.TsDocItem) []map[string]any { + docs := make([]map[string]any, 0, len(data)) + for _, d := range data { + tagMaps := map[string]int8{} + for _, tag := range strings.Split(d.Post.Tags, ",") { + tagMaps[tag] = 1 + } + docs = append(docs, map[string]any{ + "id": d.Post.ID, + "user_id": d.Post.UserID, + "comment_count": d.Post.CommentCount, + "collection_count": d.Post.CollectionCount, + "upvote_count": d.Post.UpvoteCount, + "visibility": d.Post.Visibility, + "is_top": d.Post.IsTop, + "is_essence": d.Post.IsEssence, + "content": d.Content, + "tags": tagMaps, + "ip_loc": d.Post.IPLoc, + "latest_replied_on": d.Post.LatestRepliedOn, + "attachment_price": d.Post.AttachmentPrice, + "created_on": d.Post.CreatedOn, + "modified_on": d.Post.ModifiedOn, + }) + } + return docs +} diff --git a/internal/dao/security/attachment.go b/internal/dao/security/attachment_check.go similarity index 69% rename from internal/dao/security/attachment.go rename to internal/dao/security/attachment_check.go index 3bd79461..aa077aca 100644 --- a/internal/dao/security/attachment.go +++ b/internal/dao/security/attachment_check.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package security import ( @@ -8,6 +12,10 @@ import ( "github.com/rocboss/paopao-ce/internal/core" ) +var ( + _ core.AttachmentCheckService = (*attachmentCheckServant)(nil) +) + type attachmentCheckServant struct { domain string } diff --git a/internal/dao/security/phone_verify_juhe.go b/internal/dao/security/phone_verify_juhe.go new file mode 100644 index 00000000..5981c6c3 --- /dev/null +++ b/internal/dao/security/phone_verify_juhe.go @@ -0,0 +1,66 @@ +package security + +import ( + "errors" + "fmt" + "net/http" + "time" + + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/pkg/json" + "gopkg.in/resty.v1" +) + +var ( + _ core.PhoneVerifyService = (*juheSmsServant)(nil) +) + +type juhePhoneCaptchaRsp struct { + ErrorCode int `json:"error_code"` + Reason string `json:"reason"` +} + +type juheSmsServant struct { + gateway string + key string + tplID string + tplVal string +} + +// SendPhoneCaptcha 发送短信验证码 +func (s *juheSmsServant) SendPhoneCaptcha(phone string, captcha string, expire time.Duration) error { + client := resty.New() + client.DisableWarn = true + resp, err := client.R(). + SetFormData(map[string]string{ + "mobile": phone, + "tpl_id": s.tplID, + "tpl_value": fmt.Sprintf(s.tplVal, captcha, expire), + "key": s.key, + }).Post(s.gateway) + if err != nil { + return err + } + if resp.StatusCode() != http.StatusOK { + return errors.New(resp.Status()) + } + + result := &juhePhoneCaptchaRsp{} + if err = json.Unmarshal(resp.Body(), result); err != nil { + return err + } + if result.ErrorCode != 0 { + return errors.New(result.Reason) + } + return nil +} + +func newJuheSmsServant() *juheSmsServant { + return &juheSmsServant{ + gateway: conf.SmsJuheSetting.Gateway, + key: conf.SmsJuheSetting.Key, + tplID: conf.SmsJuheSetting.TplID, + tplVal: conf.SmsJuheSetting.TplVal, + } +} diff --git a/internal/dao/security/security.go b/internal/dao/security/security.go new file mode 100644 index 00000000..75cd003b --- /dev/null +++ b/internal/dao/security/security.go @@ -0,0 +1,18 @@ +package security + +import ( + "strings" + + "github.com/alimy/cfg" + "github.com/rocboss/paopao-ce/internal/core" +) + +func NewPhoneVerifyService() core.PhoneVerifyService { + smsVendor, _ := cfg.Val("sms") + switch strings.ToLower(smsVendor) { + case "smsjuhe": + return newJuheSmsServant() + default: + return newJuheSmsServant() + } +} diff --git a/internal/dao/slonik/slonik.go b/internal/dao/slonik/slonik.go index 8cfb49c3..bb8f82ad 100644 --- a/internal/dao/slonik/slonik.go +++ b/internal/dao/slonik/slonik.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + // Core service implement base sqlx+postgresql. All sub-service // will declare here and provide initial function. diff --git a/internal/dao/storage/alioss.go b/internal/dao/storage/alioss.go index 3519cba5..e72fa44c 100644 --- a/internal/dao/storage/alioss.go +++ b/internal/dao/storage/alioss.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package storage import ( diff --git a/internal/dao/storage/cos.go b/internal/dao/storage/cos.go index f7a7ebad..3c2ea65f 100644 --- a/internal/dao/storage/cos.go +++ b/internal/dao/storage/cos.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package storage import ( diff --git a/internal/dao/storage/huaweiobs.go b/internal/dao/storage/huaweiobs.go index 31656e6c..7db9818b 100644 --- a/internal/dao/storage/huaweiobs.go +++ b/internal/dao/storage/huaweiobs.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package storage import ( diff --git a/internal/dao/storage/localoss.go b/internal/dao/storage/localoss.go index f2ba55ab..584fea91 100644 --- a/internal/dao/storage/localoss.go +++ b/internal/dao/storage/localoss.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package storage import ( diff --git a/internal/dao/storage/minio.go b/internal/dao/storage/minio.go index b4da9fed..3859a5b7 100644 --- a/internal/dao/storage/minio.go +++ b/internal/dao/storage/minio.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package storage import ( diff --git a/internal/dao/storage/storage.go b/internal/dao/storage/storage.go index 83ad6b0d..0f03fa20 100644 --- a/internal/dao/storage/storage.go +++ b/internal/dao/storage/storage.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package storage import ( @@ -8,6 +12,7 @@ import ( "strconv" "time" + "github.com/alimy/cfg" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs" "github.com/minio/minio-go/v7" @@ -31,14 +36,14 @@ func MustAliossService() (core.ObjectStorageService, core.VersionInfo) { domain := conf.GetOssDomain() var cs core.OssCreateService - if conf.CfgIf("OSS:TempDir") { + if cfg.If("OSS:TempDir") { cs = &aliossCreateTempDirServant{ bucket: bucket, domain: domain, tempDir: conf.ObjectStorage.TempDirSlash(), } logrus.Debugln("use OSS:TempDir feature") - } else if conf.CfgIf("OSS:Retention") { + } else if cfg.If("OSS:Retention") { cs = &aliossCreateRetentionServant{ bucket: bucket, domain: domain, @@ -75,7 +80,7 @@ func NewCosService() (core.ObjectStorageService, core.VersionInfo) { domain := conf.GetOssDomain() var cs core.OssCreateService - if conf.CfgIf("OSS:TempDir") { + if cfg.If("OSS:TempDir") { cs = &cosCreateTempDirServant{ client: client, domain: domain, @@ -108,7 +113,7 @@ func MustHuaweiobsService() (core.ObjectStorageService, core.VersionInfo) { domain := conf.GetOssDomain() var cs core.OssCreateService - if conf.CfgIf("OSS:TempDir") { + if cfg.If("OSS:TempDir") { cs = &hwobsCreateTempDirServant{ client: client, bucket: s.Bucket, @@ -116,7 +121,7 @@ func MustHuaweiobsService() (core.ObjectStorageService, core.VersionInfo) { tempDir: conf.ObjectStorage.TempDirSlash(), } logrus.Debugln("use OSS:TempDir feature") - } else if conf.CfgIf("OSS:Retention") { + } else if cfg.If("OSS:Retention") { retainUntilDays := time.Until(time.Date(2049, time.December, 1, 12, 0, 0, 0, time.UTC)) / (24 * time.Hour) cs = &hwobsCreateRetentionServant{ client: client, @@ -153,7 +158,7 @@ func MustLocalossService() (core.ObjectStorageService, core.VersionInfo) { domain := conf.GetOssDomain() savePath = savePath + "/" + conf.LocalOSSSetting.Bucket + "/" var cs core.OssCreateService - if conf.CfgIf("OSS:TempDir") { + if cfg.If("OSS:TempDir") { cs = &localossCreateTempDirServant{ savePath: savePath, domain: domain, @@ -188,7 +193,7 @@ func MustMinioService() (core.ObjectStorageService, core.VersionInfo) { domain := conf.GetOssDomain() var cs core.OssCreateService - if conf.CfgIf("OSS:TempDir") { + if cfg.If("OSS:TempDir") { cs = &minioCreateTempDirServant{ client: client, bucket: conf.MinIOSetting.Bucket, @@ -196,7 +201,7 @@ func MustMinioService() (core.ObjectStorageService, core.VersionInfo) { tempDir: conf.ObjectStorage.TempDirSlash(), } logrus.Debugln("use OSS:TempDir feature") - } else if conf.CfgIf("OSS:Retention") { + } else if cfg.If("OSS:Retention") { cs = &minioCreateRetentionServant{ client: client, bucket: conf.MinIOSetting.Bucket, @@ -235,7 +240,7 @@ func MustS3Service() (core.ObjectStorageService, core.VersionInfo) { domain := conf.GetOssDomain() var cs core.OssCreateService - if conf.CfgIf("OSS:TempDir") { + if cfg.If("OSS:TempDir") { cs = &minioCreateTempDirServant{ client: client, bucket: conf.S3Setting.Bucket, @@ -243,7 +248,7 @@ func MustS3Service() (core.ObjectStorageService, core.VersionInfo) { tempDir: conf.ObjectStorage.TempDirSlash(), } logrus.Debugln("use OSS:TempDir feature") - } else if conf.CfgIf("OSS:Retention") { + } else if cfg.If("OSS:Retention") { cs = &minioCreateRetentionServant{ client: client, bucket: conf.S3Setting.Bucket, diff --git a/internal/ims/README.md b/internal/ims/README.md new file mode 100644 index 00000000..d095421b --- /dev/null +++ b/internal/ims/README.md @@ -0,0 +1,2 @@ +### IMS(Instant Message Push System) +消息推送模块,用于优化@、私信、系统通知等消息服务,目前还没实现,先占个位置~ diff --git a/internal/ims/ims.go b/internal/ims/ims.go new file mode 100644 index 00000000..1042e45d --- /dev/null +++ b/internal/ims/ims.go @@ -0,0 +1,5 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package ims diff --git a/internal/internal.go b/internal/internal.go index 8d51c97a..a8c0934f 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -1,9 +1,13 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package internal import ( "github.com/rocboss/paopao-ce/internal/migration" - "github.com/rocboss/paopao-ce/internal/routers/api" - "github.com/rocboss/paopao-ce/internal/service" + "github.com/rocboss/paopao-ce/internal/servants/web/broker" + "github.com/rocboss/paopao-ce/internal/servants/web/routers/api" ) func Initialize() { @@ -11,6 +15,6 @@ func Initialize() { migration.Run() // initialize service - service.Initialize() + broker.Initialize() api.Initialize() } diff --git a/internal/migration/migration.go b/internal/migration/migration.go index dec12c19..1cac6012 100644 --- a/internal/migration/migration.go +++ b/internal/migration/migration.go @@ -1,15 +1,19 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + //go:build !migration // +build !migration package migration import ( - "github.com/rocboss/paopao-ce/internal/conf" + "github.com/alimy/cfg" "github.com/sirupsen/logrus" ) func Run() { - if conf.CfgIf("Migration") { + if cfg.If("Migration") { logrus.Infoln("want migrate feature but not support in this compile version") } } diff --git a/internal/migration/migration_embed.go b/internal/migration/migration_embed.go index c9368987..02ede293 100644 --- a/internal/migration/migration_embed.go +++ b/internal/migration/migration_embed.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + //go:build migration // +build migration @@ -6,6 +10,7 @@ package migration import ( "database/sql" + "github.com/alimy/cfg" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" "github.com/golang-migrate/migrate/v4/database/mysql" @@ -19,7 +24,7 @@ import ( ) func Run() { - if !conf.CfgIf("Migration") { + if !cfg.If("Migration") { logrus.Infoln("skip migrate because not add Migration feature in config.yaml") return } @@ -32,13 +37,13 @@ func Run() { err, err2 error ) - if conf.CfgIf("MySQL") { + if cfg.If("MySQL") { dbName = conf.MysqlSetting.DBName db, err = sql.Open("mysql", conf.MysqlSetting.Dsn()+"&multiStatements=true") - } else if conf.CfgIf("PostgreSQL") || conf.CfgIf("Postgres") { + } else if cfg.If("PostgreSQL") || cfg.If("Postgres") { dbName = (*conf.PostgresSetting)["DBName"] db, err = sql.Open("postgres", conf.PostgresSetting.Dsn()) - } else if conf.CfgIf("Sqlite3") { + } else if cfg.If("Sqlite3") { db, err = conf.OpenSqlite3() } else { dbName = conf.MysqlSetting.DBName @@ -50,13 +55,13 @@ func Run() { } migrationsTable := conf.DatabaseSetting.TablePrefix + "schema_migrations" - if conf.CfgIf("MySQL") { + if cfg.If("MySQL") { srcDriver, err = iofs.New(migration.Files, "mysql") dbDriver, err2 = mysql.WithInstance(db, &mysql.Config{MigrationsTable: migrationsTable}) - } else if conf.CfgIf("PostgreSQL") || conf.CfgIf("Postgres") { + } else if cfg.If("PostgreSQL") || cfg.If("Postgres") { srcDriver, err = iofs.New(migration.Files, "postgres") dbDriver, err2 = postgres.WithInstance(db, &postgres.Config{MigrationsTable: migrationsTable}) - } else if conf.CfgIf("Sqlite3") { + } else if cfg.If("Sqlite3") { srcDriver, err = iofs.New(migration.Files, "sqlite3") dbDriver, err2 = sqlite3.WithInstance(db, &sqlite3.Config{MigrationsTable: migrationsTable}) } else { diff --git a/internal/model/model.go b/internal/model/model.go index bdf8ade6..12cc4fbb 100644 --- a/internal/model/model.go +++ b/internal/model/model.go @@ -1,37 +1,5 @@ -package model - -import ( - "time" - - "github.com/rocboss/paopao-ce/pkg/types" - "gorm.io/gorm" - "gorm.io/plugin/soft_delete" -) - -// Model 公共Model -type Model struct { - ID int64 `gorm:"primary_key" json:"id"` - CreatedOn int64 `json:"created_on"` - ModifiedOn int64 `json:"modified_on"` - DeletedOn int64 `json:"deleted_on"` - IsDel soft_delete.DeletedAt `gorm:"softDelete:flag" json:"is_del"` -} - -type ConditionsT map[string]interface{} -type Predicates map[string]types.AnySlice +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. -func (m *Model) BeforeCreate(tx *gorm.DB) (err error) { - nowTime := time.Now().Unix() - - tx.Statement.SetColumn("created_on", nowTime) - tx.Statement.SetColumn("modified_on", nowTime) - return -} - -func (m *Model) BeforeUpdate(tx *gorm.DB) (err error) { - if !tx.Statement.Changed("modified_on") { - tx.Statement.SetColumn("modified_on", time.Now().Unix()) - } - - return -} +package model diff --git a/internal/model/rest/tweets.go b/internal/model/rest/tweets.go deleted file mode 100644 index de85e179..00000000 --- a/internal/model/rest/tweets.go +++ /dev/null @@ -1,8 +0,0 @@ -package rest - -import "github.com/rocboss/paopao-ce/internal/model" - -type IndexTweetsResp struct { - Tweets []*model.PostFormated - Total int64 -} diff --git a/internal/model/web/admin.go b/internal/model/web/admin.go new file mode 100644 index 00000000..6b1980ca --- /dev/null +++ b/internal/model/web/admin.go @@ -0,0 +1,11 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +type ChangeUserStatusReq struct { + BaseInfo `json:"-" binding:"-"` + ID int64 `json:"id" form:"id" binding:"required"` + Status int `json:"status" form:"status" binding:"required,oneof=1 2"` +} diff --git a/internal/model/web/alipay.go b/internal/model/web/alipay.go new file mode 100644 index 00000000..84746309 --- /dev/null +++ b/internal/model/web/alipay.go @@ -0,0 +1,48 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "context" + + "github.com/rocboss/paopao-ce/internal/servants/base" + "github.com/smartwalle/alipay/v3" +) + +type UserWalletBillsReq struct { + UserId int64 + Page int + PageSize int +} + +type UserWalletBillsResp base.PageResp + +type UserRechargeLinkReq struct { + BaseInfo `json:"-" form:"-" binding:"-"` + Host string `json:"-" form:"-" binding:"-"` + Amount int64 `json:"amount" form:"amount" binding:"required"` +} + +type UserRechargeLinkResp struct { + Id int64 `json:"id"` + Pay string `json:"pay"` +} + +type UserRechargeResultReq struct { + UserId int64 + Id int64 +} + +type UserRechargeResultResp struct { + Id int64 `json:"id"` + Status string `json:"status"` +} + +type AlipayNotifyReq struct { + Ctx context.Context + ID int64 + TradeNo string + TradeStatus alipay.TradeStatus +} diff --git a/internal/model/web/core.go b/internal/model/web/core.go new file mode 100644 index 00000000..b5fa497b --- /dev/null +++ b/internal/model/web/core.go @@ -0,0 +1,113 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "github.com/rocboss/paopao-ce/internal/servants/base" +) + +type ChangeAvatarReq struct { + BaseInfo `json:"-" binding:"-"` + Avatar string `json:"avatar" form:"avatar" binding:"required"` +} + +type SyncSearchIndexReq struct { + BaseInfo `json:"-" binding:"-"` +} + +type UserInfoReq struct { + BaseInfo `json:"-" binding:"-"` + Username string `json:"username" form:"username" binding:"required"` +} + +type UserInfoResp struct { + Id int64 `json:"id"` + Nickname string `json:"nickname"` + Username string `json:"username"` + Status int `json:"status"` + Avatar string `json:"avatar"` + Balance int64 `json:"balance"` + Phone string `json:"phone"` + IsAdmin bool `json:"is_admin"` +} + +type GetUnreadMsgCountReq struct { + SimpleInfo `json:"-" binding:"-"` +} + +type GetUnreadMsgCountResp struct { + Count int64 `json:"count"` +} + +type GetMessagesReq BasePageReq + +type GetMessagesResp base.PageResp + +type ReadMessageReq struct { + SimpleInfo `json:"-" binding:"-"` + ID int64 `json:"id" binding:"required"` +} +type SendWhisperReq struct { + SimpleInfo `json:"-" binding:"-"` + UserID int64 `json:"user_id" binding:"required"` + Content string `json:"content" binding:"required"` +} + +type GetCollectionsReq BasePageReq +type GetCollectionsResp base.PageResp + +type GetStarsReq BasePageReq +type GetStarsResp base.PageResp + +type UserPhoneBindReq struct { + BaseInfo `json:"-" binding:"-"` + Phone string `json:"phone" form:"phone" binding:"required"` + Captcha string `json:"captcha" form:"captcha" binding:"required"` +} + +type ChangePasswordReq struct { + BaseInfo `json:"-" binding:"-"` + Password string `json:"password" form:"password" binding:"required"` + OldPassword string `json:"old_password" form:"old_password" binding:"required"` +} + +type ChangeNicknameReq struct { + BaseInfo `json:"-" binding:"-"` + Nickname string `json:"nickname" form:"nickname" binding:"required"` +} + +type SuggestUsersReq struct { + Keyword string +} + +type SuggestUsersResp struct { + Suggests []string `json:"suggest"` +} + +type SuggestTagsReq struct { + Keyword string +} + +type SuggestTagsResp struct { + Suggests []string `json:"suggest"` +} + +type TweetStarStatusReq struct { + SimpleInfo `json:"-" binding:"-"` + TweetId int64 `form:"id"` +} + +type TweetStarStatusResp struct { + Status bool `json:"status"` +} + +type TweetCollectionStatusReq struct { + SimpleInfo `json:"-" binding:"-"` + TweetId int64 `form:"id"` +} + +type TweetCollectionStatusResp struct { + Status bool `json:"status"` +} diff --git a/internal/model/web/followship.go b/internal/model/web/followship.go new file mode 100644 index 00000000..aba69f72 --- /dev/null +++ b/internal/model/web/followship.go @@ -0,0 +1,27 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import "github.com/rocboss/paopao-ce/internal/servants/base" + +type AddFollowingReq struct { + BaseInfo `json:"-" binding:"-"` +} + +type DeleteFollowingReq struct { + BaseInfo `json:"-" binding:"-"` +} + +type ListFollowingsReq struct { + BaseInfo `json:"-" binding:"-"` +} + +type ListFollowingsResp base.PageResp + +type ListFollowersReq struct { + BaseInfo `form:"-" binding:"-"` +} + +type ListFollowersResp base.PageResp diff --git a/internal/model/web/friendship.go b/internal/model/web/friendship.go new file mode 100644 index 00000000..08f5fd27 --- /dev/null +++ b/internal/model/web/friendship.go @@ -0,0 +1,40 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import "github.com/rocboss/paopao-ce/internal/servants/base" + +type RequestingFriendReq struct { + BaseInfo `json:"-" binding:"-"` + UserId int64 `json:"user_id" binding:"required"` + Greetings string `json:"greetings" binding:"required"` +} + +type AddFriendReq struct { + BaseInfo `json:"-" binding:"-"` + UserId int64 `json:"user_id" binding:"required"` +} + +type RejectFriendReq struct { + BaseInfo `json:"-" binding:"-"` + UserId int64 `json:"user_id" binding:"required"` +} + +type DeleteFriendReq struct { + BaseInfo `json:"-" binding:"-"` + UserId int64 `json:"user_id"` +} + +type GetContactsReq struct { + BaseInfo `form:"-" binding:"-"` + Page int `form:"-" binding:"-"` + PageSize int `form:"-" binding:"-"` +} + +type GetContactsResp base.PageResp + +func (r *GetContactsReq) SetPageInfo(page int, pageSize int) { + r.Page, r.PageSize = page, pageSize +} diff --git a/internal/model/web/loose.go b/internal/model/web/loose.go new file mode 100644 index 00000000..e505e35b --- /dev/null +++ b/internal/model/web/loose.go @@ -0,0 +1,49 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/servants/base" +) + +type TimelineReq struct { + BaseInfo `form:"-" binding:"-"` + Query string `form:"query"` + Visibility []core.PostVisibleT `form:"query"` + Type string `form:"type"` + Page int `form:"-" binding:"-"` + PageSize int `form:"-" binding:"-"` +} + +type TimelineResp base.PageResp + +type GetUserTweetsReq struct { + BaseInfo `form:"-" binding:"-"` + Username string `form:"username" binding:"required"` + Page int `form:"-" binding:"-"` + PageSize int `form:"-" binding:"-"` +} + +type GetUserTweetsResp base.PageResp + +type GetUserProfileReq struct { + BaseInfo `form:"-" binding:"-"` + Username string `form:"username" binding:"required"` +} + +type GetUserProfileResp struct { + ID int64 `json:"id"` + Nickname string `json:"nickname"` + Username string `json:"username"` + Status int `json:"status"` + Avatar string `json:"avatar"` + IsAdmin bool `json:"is_admin"` + IsFriend bool `json:"is_friend"` +} + +func (r *GetUserTweetsReq) SetPageInfo(page int, pageSize int) { + r.Page, r.PageSize = page, pageSize +} diff --git a/internal/model/web/priv.go b/internal/model/web/priv.go new file mode 100644 index 00000000..8a568bd8 --- /dev/null +++ b/internal/model/web/priv.go @@ -0,0 +1,164 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "fmt" + "mime/multipart" + "strings" + + "github.com/rocboss/paopao-ce/internal/core" +) + +type PostContentItem struct { + Content string `json:"content" binding:"required"` + Type core.PostContentT `json:"type" binding:"required"` + Sort int64 `json:"sort" binding:"required"` +} + +type CreateTweetReq struct { + BaseInfo `json:"-" binding:"-"` + Contents []*PostContentItem `json:"contents" binding:"required"` + Tags []string `json:"tags" binding:"required"` + Users []string `json:"users" binding:"required"` + AttachmentPrice int64 `json:"attachment_price"` + Visibility core.PostVisibleT `json:"visibility"` + ClientIP string `json:"-" binding:"-"` +} + +type CreateTweetResp core.PostFormated + +type DeleteTweetReq struct { + BaseInfo `json:"-" binding:"-"` + ID int64 `json:"id" binding:"required"` +} + +type StarTweetReq struct { + SimpleInfo `json:"-" binding:"-"` + ID int64 `json:"id" binding:"required"` +} + +type StarTweetResp struct { + Status bool `json:"status"` +} + +type CollectionTweetReq struct { + SimpleInfo `json:"-" binding:"-"` + ID int64 `json:"id" binding:"required"` +} + +type CollectionTweetResp struct { + Status bool `json:"status"` +} + +type LockTweetReq struct { + BaseInfo `json:"-" binding:"-"` + ID int64 `json:"id" binding:"required"` +} + +type LockTweetResp struct { + LockStatus int `json:"lock_status"` +} + +type StickTweetReq struct { + BaseInfo `json:"-" binding:"-"` + ID int64 `json:"id" binding:"required"` +} + +type StickTweetResp struct { + StickStatus int `json:"top_status"` +} + +type VisibleTweetReq struct { + BaseInfo `json:"-" binding:"-"` + ID int64 `json:"id"` + Visibility core.PostVisibleT `json:"visibility"` +} + +type VisibleTweetResp struct { + Visibility core.PostVisibleT `json:"visibility"` +} + +type CreateCommentReq struct { + SimpleInfo `json:"-" binding:"-"` + PostID int64 `json:"post_id" binding:"required"` + Contents []*PostContentItem `json:"contents" binding:"required"` + Users []string `json:"users" binding:"required"` + ClientIP string `json:"-" binding:"-"` +} + +type CreateCommentResp core.Comment + +type CreateCommentReplyReq struct { + SimpleInfo `json:"-" binding:"-"` + CommentID int64 `json:"comment_id" binding:"required"` + Content string `json:"content" binding:"required"` + AtUserID int64 `json:"at_user_id"` + ClientIP string `json:"-" binding:"-"` +} + +type CreateCommentReplyResp core.CommentReply + +type DeleteCommentReq struct { + BaseInfo `json:"-" binding:"-"` + ID int64 `json:"id" binding:"required"` +} +type DeleteCommentReplyReq struct { + BaseInfo `json:"-" binding:"-"` + ID int64 `json:"id" binding:"required"` +} + +type UploadAttachmentReq struct { + SimpleInfo `json:"-" binding:"-"` + UploadType string + ContentType string + File multipart.File + FileSize int64 + FileExt string +} + +type UploadAttachmentResp struct { + UserID int64 `json:"user_id"` + FileSize int64 `json:"file_size"` + ImgWidth int `json:"img_width"` + ImgHeight int `json:"img_height"` + Type core.AttachmentType `json:"type"` + Content string `json:"content"` +} + +type DownloadAttachmentPrecheckReq struct { + BaseInfo `form:"-" binding:"-"` + ContentID int64 `form:"id"` +} + +type DownloadAttachmentPrecheckResp struct { + Paid bool `json:"paid"` +} + +type DownloadAttachmentReq struct { + BaseInfo `form:"-" binding:"-"` + ContentID int64 `form:"id"` +} + +type DownloadAttachmentResp struct { + SignedURL string `json:"signed_url"` +} + +// Check 检查PostContentItem属性 +func (p *PostContentItem) Check(acs core.AttachmentCheckService) error { + // 检查附件是否是本站资源 + if p.Type == core.ContentTypeImage || p.Type == core.ContentTypeVideo || p.Type == core.ContentTypeAttachment { + if err := acs.CheckAttachment(p.Content); err != nil { + return err + } + } + // 检查链接是否合法 + if p.Type == core.ContentTypeLink { + if strings.Index(p.Content, "http://") != 0 && strings.Index(p.Content, "https://") != 0 { + return fmt.Errorf("链接不合法") + } + } + return nil +} diff --git a/internal/model/web/pub.go b/internal/model/web/pub.go new file mode 100644 index 00000000..a951b33a --- /dev/null +++ b/internal/model/web/pub.go @@ -0,0 +1,77 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/servants/base" + "github.com/rocboss/paopao-ce/pkg/debug" +) + +const ( + TagTypeHot TagType = "hot" + TagTypeNew TagType = "new" +) + +type TagType string + +type TweetDetailReq struct { + TweetId int64 `form:"id"` +} + +type TweetDetailResp core.PostFormated + +type TweetCommentsReq struct { + TweetId int64 `form:"id"` + Page int `form:"-"` + PageSize int `form:"-"` +} + +type TweetCommentsResp base.PageResp + +type TopicListReq struct { + Type TagType `json:"type" form:"type" binding:"required"` + Num int `json:"num" form:"num" binding:"required"` +} + +// TopicListResp 主题返回值 +// TODO: 优化内容定义 +type TopicListResp struct { + Topics []*core.TagFormated `json:"topics"` +} + +type GetCaptchaResp struct { + Id string `json:"id"` + Content string `json:"b64s"` +} + +type SendCaptchaReq struct { + Phone string `json:"phone" form:"phone" binding:"required"` + ImgCaptcha string `json:"img_captcha" form:"img_captcha" binding:"required"` + ImgCaptchaID string `json:"img_captcha_id" form:"img_captcha_id" binding:"required"` +} + +type VersionResp struct { + BuildInfo *debug.BuildInfo `json:"build_info"` +} + +type LoginReq struct { + Username string `json:"username" form:"username" binding:"required"` + Password string `json:"password" form:"password" binding:"required"` +} + +type LoginResp struct { + Token string `json:"token"` +} + +type RegisterReq struct { + Username string `json:"username" form:"username" binding:"required"` + Password string `json:"password" form:"password" binding:"required"` +} + +type RegisterResp struct { + UserId int64 `json:"id"` + Username string `json:"username"` +} diff --git a/internal/model/web/web.go b/internal/model/web/web.go new file mode 100644 index 00000000..bec917fa --- /dev/null +++ b/internal/model/web/web.go @@ -0,0 +1,49 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/servants/base" + "github.com/rocboss/paopao-ce/pkg/app" + "github.com/rocboss/paopao-ce/pkg/xerror" +) + +type BaseInfo struct { + User *core.User +} + +type SimpleInfo struct { + Uid int64 +} + +type BasePageReq struct { + UserId int64 + Page int + PageSize int +} + +func (b *BaseInfo) SetUser(user *core.User) { + b.User = user +} + +func (s *SimpleInfo) SetUserId(id int64) { + s.Uid = id +} + +func BasePageReqFrom(c *gin.Context) (*BasePageReq, mir.Error) { + uid, ok := base.UserIdFrom(c) + if !ok { + return nil, xerror.UnauthorizedTokenError + } + page, pageSize := app.GetPageInfo(c) + return &BasePageReq{ + UserId: uid, + Page: page, + PageSize: pageSize, + }, nil +} diff --git a/internal/obs/README.md b/internal/obs/README.md new file mode 100644 index 00000000..f56a1ef9 --- /dev/null +++ b/internal/obs/README.md @@ -0,0 +1,2 @@ +### OBS(Object Blob Storage System) +简单对象存储模块,目前还没实现,先占个位置~ diff --git a/internal/obs/obs.go b/internal/obs/obs.go new file mode 100644 index 00000000..13923b07 --- /dev/null +++ b/internal/obs/obs.go @@ -0,0 +1,5 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package obs diff --git a/internal/routers/api/api.go b/internal/routers/api/api.go deleted file mode 100644 index 3ee6c52d..00000000 --- a/internal/routers/api/api.go +++ /dev/null @@ -1,14 +0,0 @@ -package api - -import ( - "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/dao" -) - -var ( - objectStorage core.ObjectStorageService -) - -func Initialize() { - objectStorage = dao.ObjectStorageService() -} diff --git a/internal/routers/docs_embed.go b/internal/routers/docs_embed.go deleted file mode 100644 index 50fe27c4..00000000 --- a/internal/routers/docs_embed.go +++ /dev/null @@ -1,14 +0,0 @@ -//go:build docs -// +build docs - -package routers - -import ( - "github.com/gin-gonic/gin" - "github.com/rocboss/paopao-ce/docs" -) - -// registerDocs register docs asset route -func registerDocs(e *gin.Engine) { - e.StaticFS("/docs", docs.NewFileSystem()) -} diff --git a/internal/routers/router.go b/internal/routers/router.go deleted file mode 100644 index 3dbeee71..00000000 --- a/internal/routers/router.go +++ /dev/null @@ -1,232 +0,0 @@ -package routers - -import ( - "net/http" - "path/filepath" - - "github.com/gin-contrib/cors" - "github.com/gin-gonic/gin" - "github.com/rocboss/paopao-ce/internal/conf" - "github.com/rocboss/paopao-ce/internal/middleware" - "github.com/rocboss/paopao-ce/internal/routers/api" - "github.com/sirupsen/logrus" -) - -func NewRouter() *gin.Engine { - e := gin.New() - e.HandleMethodNotAllowed = true - e.Use(gin.Logger()) - e.Use(gin.Recovery()) - - // 跨域配置 - corsConfig := cors.DefaultConfig() - corsConfig.AllowAllOrigins = true - corsConfig.AddAllowHeaders("Authorization") - e.Use(cors.New(corsConfig)) - - // 按需注册 docs、静态资源、LocalOSS 路由 - { - registerDocs(e) - registerStatick(e) - routeLocalOSS(e) - } - - // v1 group api - r := e.Group("/v1") - - // 获取version - r.GET("/", api.Version) - - // 用户登录 - r.POST("/auth/login", api.Login) - - // 用户注册 - r.POST("/auth/register", api.Register) - - // 获取验证码 - r.GET("/captcha", api.GetCaptcha) - - // 发送验证码 - r.POST("/captcha", api.PostCaptcha) - - // 无鉴权路由组 - noAuthApi := r.Group("/") - { - // 获取动态详情 - noAuthApi.GET("/post", api.GetPost) - - // 获取动态评论 - noAuthApi.GET("/post/comments", api.GetPostComments) - - // 获取话题列表 - noAuthApi.GET("/tags", api.GetPostTags) - - // 获取用户基本信息 - noAuthApi.GET("/user/profile", api.GetUserProfile) - } - - // 宽松鉴权路由组 - looseApi := r.Group("/").Use(middleware.JwtLoose()) - { - // 获取广场流 - looseApi.GET("/posts", api.GetPostList) - - // 获取用户动态列表 - looseApi.GET("/user/posts", api.GetUserPosts) - } - - // 鉴权路由组 - authApi := r.Group("/").Use(middleware.JWT()) - privApi := r.Group("/").Use(middleware.JWT()).Use(middleware.Priv()) - adminApi := r.Group("/").Use(middleware.JWT()).Use(middleware.Admin()) - { - // 同步索引 - authApi.GET("/sync/index", api.SyncSearchIndex) - - // 获取当前用户信息 - authApi.GET("/user/info", api.GetUserInfo) - - // 获取当前用户未读消息数量 - authApi.GET("/user/msgcount/unread", api.GetUnreadMsgCount) - - // 获取消息列表 - authApi.GET("/user/messages", api.GetMessages) - - // 标记消息已读 - authApi.POST("/user/message/read", api.ReadMessage) - - // 发送用户私信 - authApi.POST("/user/whisper", api.SendUserWhisper) - - // 获取用户收藏列表 - authApi.GET("/user/collections", api.GetUserCollections) - - // 获取用户点赞列表 - authApi.GET("/user/stars", api.GetUserStars) - - // 绑定用户手机号 - if conf.CfgIf("PhoneBind") { - authApi.POST("/user/phone", api.BindUserPhone) - } - - // 修改密码 - authApi.POST("/user/password", api.ChangeUserPassword) - - // 修改昵称 - authApi.POST("/user/nickname", api.ChangeNickname) - - // 修改头像 - authApi.POST("/user/avatar", api.ChangeAvatar) - - // 检索用户 - authApi.GET("/suggest/users", api.GetSuggestUsers) - - // 检索标签 - authApi.GET("/suggest/tags", api.GetSuggestTags) - - // 上传资源 - privApi.POST("/attachment", api.UploadAttachment) - - // 下载资源预检 - privApi.GET("/attachment/precheck", api.DownloadAttachmentPrecheck) - - // 下载资源 - privApi.GET("/attachment", api.DownloadAttachment) - - // 发布动态 - privApi.POST("/post", api.CreatePost) - - // 删除动态 - privApi.DELETE("/post", api.DeletePost) - - // 获取动态点赞状态 - authApi.GET("/post/star", api.GetPostStar) - - // 动态点赞操作 - privApi.POST("/post/star", api.PostStar) - - // 获取动态收藏状态 - authApi.GET("/post/collection", api.GetPostCollection) - - // 动态收藏操作 - privApi.POST("/post/collection", api.PostCollection) - - // 锁定动态 - privApi.POST("/post/lock", api.LockPost) - - // 置顶动态 - privApi.POST("/post/stick", api.StickPost) - - // 修改动态可见度 - privApi.POST("/post/visibility", api.VisiblePost) - - // 发布动态评论 - privApi.POST("/post/comment", api.CreatePostComment) - - // 删除动态评论 - privApi.DELETE("/post/comment", api.DeletePostComment) - - // 发布评论回复 - privApi.POST("/post/comment/reply", api.CreatePostCommentReply) - - // 删除评论回复 - privApi.DELETE("/post/comment/reply", api.DeletePostCommentReply) - - // 管理·禁言/解封用户 - adminApi.POST("/admin/user/status", api.ChangeUserStatus) - } - - // 支付宝路由注册 - alipayRoute(r, authApi) - - // 默认404 - e.NoRoute(func(c *gin.Context) { - c.JSON(http.StatusNotFound, gin.H{ - "code": 404, - "msg": "Not Found", - }) - }) - - // 默认405 - e.NoMethod(func(c *gin.Context) { - c.JSON(http.StatusMethodNotAllowed, gin.H{ - "code": 405, - "msg": "Method Not Allowed", - }) - }) - - return e -} - -// routeLocalOSS register LocalOSS route if neeed -func routeLocalOSS(e *gin.Engine) { - if !conf.CfgIf("LocalOSS") { - return - } - - savePath, err := filepath.Abs(conf.LocalOSSSetting.SavePath) - if err != nil { - logrus.Fatalf("get localOSS save path err: %v", err) - } - e.Static("/oss", savePath) - - logrus.Infof("register LocalOSS route in /oss on save path: %s", savePath) -} - -func alipayRoute(public gin.IRoutes, authApi gin.IRoutes) { - if !conf.CfgIf("Alipay") { - return - } - - // 支付宝回调 - public.POST("/alipay/notify", api.AlipayNotify) - - // 用户充值 - authApi.POST("/user/recharge", api.GetUserRechargeLink) - - // 获取钱包余额 - authApi.GET("/user/recharge", api.GetUserRechargeResult) - - // 获取用户账单 - authApi.GET("/user/wallet/bills", api.GetUserWalletBills) -} diff --git a/internal/servants/admin/admin.go b/internal/servants/admin/admin.go new file mode 100644 index 00000000..409bdd78 --- /dev/null +++ b/internal/servants/admin/admin.go @@ -0,0 +1,15 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package admin + +import ( + "github.com/gin-gonic/gin" + api "github.com/rocboss/paopao-ce/auto/api/m/v1" +) + +// RouteWeb register Manager route +func RouteManager(e *gin.Engine) { + api.RegisterUserServant(e, newUserSrv(), newUserBinding(), newUserRender()) +} diff --git a/internal/servants/admin/user.go b/internal/servants/admin/user.go new file mode 100644 index 00000000..fef348cf --- /dev/null +++ b/internal/servants/admin/user.go @@ -0,0 +1,51 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package admin + +import ( + api "github.com/rocboss/paopao-ce/auto/api/m/v1" + "github.com/rocboss/paopao-ce/internal/servants/base" +) + +var ( + _ api.User = (*userSrv)(nil) + _ api.UserBinding = (*userBinding)(nil) + _ api.UserRender = (*userRender)(nil) +) + +type userSrv struct { + base.BaseServant + api.UnimplementedUserServant +} + +type userBinding struct { + base.BaseBinding + *api.UnimplementedUserBinding +} + +type userRender struct { + base.BaseRender + *api.UnimplementedUserRender +} + +func newUserSrv() api.User { + return &userSrv{} +} + +func newUserBinding() api.UserBinding { + return &userBinding{ + UnimplementedUserBinding: &api.UnimplementedUserBinding{ + BindAny: base.BindAny, + }, + } +} + +func newUserRender() api.UserRender { + return &userRender{ + UnimplementedUserRender: &api.UnimplementedUserRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/servants/base/base.go b/internal/servants/base/base.go new file mode 100644 index 00000000..16599ac8 --- /dev/null +++ b/internal/servants/base/base.go @@ -0,0 +1,209 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package base + +import ( + "context" + "fmt" + "math" + "net/http" + "time" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + "github.com/go-redis/redis/v8" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/pkg/app" + "github.com/rocboss/paopao-ce/pkg/types" + "github.com/rocboss/paopao-ce/pkg/xerror" +) + +type BaseServant types.Empty + +type DaoServant struct { + Redis *redis.Client + Ds core.DataService + Ts core.TweetSearchService +} + +type BaseBinding types.Empty + +type BaseRender types.Empty + +type JsonResp struct { + Code int `json:"code"` + Msg string `json:"msg,omitempty"` + Data any `json:"data,omitempty"` +} + +type UserSetter interface { + SetUser(*core.User) +} + +type UserIdSetter interface { + SetUserId(int64) +} + +type PageInfoSetter interface { + SetPageInfo(page, pageSize int) +} + +func UserFrom(c *gin.Context) (*core.User, bool) { + if u, exists := c.Get("USER"); exists { + user, ok := u.(*core.User) + return user, ok + } + return nil, false +} + +func UserIdFrom(c *gin.Context) (int64, bool) { + if uid, exists := c.Get("UID"); exists { + v, ok := uid.(int64) + return v, ok + } + return -1, false +} + +func UserNameFrom(c *gin.Context) (string, bool) { + if username, exists := c.Get("USERNAME"); exists { + v, ok := username.(string) + return v, ok + } + return "", false +} + +func BindAny(c *gin.Context, obj any) mir.Error { + var errs xerror.ValidErrors + err := c.ShouldBind(obj) + if err != nil { + return mir.NewError(xerror.InvalidParams.StatusCode(), xerror.InvalidParams.WithDetails(errs.Error())) + } + // setup *core.User if needed + if setter, ok := obj.(UserSetter); ok { + user, _ := UserFrom(c) + setter.SetUser(user) + } + // setup UserId if needed + if setter, ok := obj.(UserIdSetter); ok { + uid, _ := UserIdFrom(c) + setter.SetUserId(uid) + } + // setup PageInfo if needed + if setter, ok := obj.(PageInfoSetter); ok { + page, pageSize := app.GetPageInfo(c) + setter.SetPageInfo(page, pageSize) + } + return nil +} + +func RenderAny(c *gin.Context, data any, err mir.Error) { + if err == nil { + c.JSON(http.StatusOK, &JsonResp{ + Code: 0, + Msg: "success", + Data: data, + }) + } else { + c.JSON(xerror.HttpStatusCode(err), &JsonResp{ + Code: err.StatusCode(), + Msg: err.Error(), + }) + } +} + +func (s *DaoServant) GetTweetBy(id int64) (*core.PostFormated, error) { + post, err := s.Ds.GetPostByID(id) + if err != nil { + return nil, err + } + postContents, err := s.Ds.GetPostContentsByIDs([]int64{post.ID}) + if err != nil { + return nil, err + } + users, err := s.Ds.GetUsersByIDs([]int64{post.UserID}) + if err != nil { + return nil, err + } + // 数据整合 + postFormated := post.Format() + for _, user := range users { + postFormated.User = user.Format() + } + for _, content := range postContents { + if content.PostID == post.ID { + postFormated.Contents = append(postFormated.Contents, content.Format()) + } + } + return postFormated, nil +} + +func (s *DaoServant) PushPostsToSearch(c context.Context) { + if ok, _ := s.Redis.SetNX(c, "JOB_PUSH_TO_SEARCH", 1, time.Hour).Result(); ok { + defer s.Redis.Del(c, "JOB_PUSH_TO_SEARCH") + + splitNum := 1000 + totalRows, _ := s.Ds.GetPostCount(&core.ConditionsT{ + "visibility IN ?": []core.PostVisibleT{core.PostVisitPublic, core.PostVisitFriend}, + }) + pages := math.Ceil(float64(totalRows) / float64(splitNum)) + nums := int(pages) + for i := 0; i < nums; i++ { + posts, postsFormated, err := s.GetTweetList(&core.ConditionsT{}, i*splitNum, splitNum) + if err != nil || len(posts) != len(postsFormated) { + continue + } + for i, pf := range postsFormated { + contentFormated := "" + for _, content := range pf.Contents { + if content.Type == core.ContentTypeText || content.Type == core.ContentTypeTitle { + contentFormated = contentFormated + content.Content + "\n" + } + } + docs := []core.TsDocItem{{ + Post: posts[i], + Content: contentFormated, + }} + s.Ts.AddDocuments(docs, fmt.Sprintf("%d", posts[i].ID)) + } + } + } +} + +func (s *DaoServant) PushPostToSearch(post *core.Post) { + postFormated := post.Format() + postFormated.User = &core.UserFormated{ + ID: post.UserID, + } + contents, _ := s.Ds.GetPostContentsByIDs([]int64{post.ID}) + for _, content := range contents { + postFormated.Contents = append(postFormated.Contents, content.Format()) + } + + contentFormated := "" + for _, content := range postFormated.Contents { + if content.Type == core.ContentTypeText || content.Type == core.ContentTypeTitle { + contentFormated = contentFormated + content.Content + "\n" + } + } + + docs := []core.TsDocItem{{ + Post: post, + Content: contentFormated, + }} + s.Ts.AddDocuments(docs, fmt.Sprintf("%d", post.ID)) +} + +func (s *DaoServant) DeleteSearchPost(post *core.Post) error { + return s.Ts.DeleteDocuments([]string{fmt.Sprintf("%d", post.ID)}) +} + +func (s *DaoServant) GetTweetList(conditions *core.ConditionsT, offset, limit int) ([]*core.Post, []*core.PostFormated, error) { + posts, err := s.Ds.GetPosts(conditions, offset, limit) + if err != nil { + return nil, nil, err + } + postFormated, err := s.Ds.MergePosts(posts) + return posts, postFormated, err +} diff --git a/internal/servants/base/page.go b/internal/servants/base/page.go new file mode 100644 index 00000000..6e3b4d05 --- /dev/null +++ b/internal/servants/base/page.go @@ -0,0 +1,27 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package base + +type Pager struct { + Page int `json:"page"` + PageSize int `json:"page_size"` + TotalRows int64 `json:"total_rows"` +} + +type PageResp struct { + List any `json:"list"` + Pager Pager `json:"pager"` +} + +func PageRespFrom(list any, page int, pageSize int, totalRows int64) *PageResp { + return &PageResp{ + List: list, + Pager: Pager{ + Page: page, + PageSize: pageSize, + TotalRows: totalRows, + }, + } +} diff --git a/internal/servants/bot/bot.go b/internal/servants/bot/bot.go new file mode 100644 index 00000000..a2e0e699 --- /dev/null +++ b/internal/servants/bot/bot.go @@ -0,0 +1,15 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package bot + +import ( + "github.com/gin-gonic/gin" + api "github.com/rocboss/paopao-ce/auto/api/r/v1" +) + +// RouteBot register Bot route +func RouteBot(e *gin.Engine) { + api.RegisterUserServant(e, newUserSrv(), newUserBinding(), newUserRender()) +} diff --git a/internal/servants/bot/user.go b/internal/servants/bot/user.go new file mode 100644 index 00000000..aae9048c --- /dev/null +++ b/internal/servants/bot/user.go @@ -0,0 +1,51 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package bot + +import ( + api "github.com/rocboss/paopao-ce/auto/api/r/v1" + "github.com/rocboss/paopao-ce/internal/servants/base" +) + +var ( + _ api.User = (*userSrv)(nil) + _ api.UserBinding = (*userBinding)(nil) + _ api.UserRender = (*userRender)(nil) +) + +type userSrv struct { + base.BaseServant + api.UnimplementedUserServant +} + +type userBinding struct { + base.BaseBinding + *api.UnimplementedUserBinding +} + +type userRender struct { + base.BaseRender + *api.UnimplementedUserRender +} + +func newUserSrv() api.User { + return &userSrv{} +} + +func newUserBinding() api.UserBinding { + return &userBinding{ + UnimplementedUserBinding: &api.UnimplementedUserBinding{ + BindAny: base.BindAny, + }, + } +} + +func newUserRender() api.UserRender { + return &userRender{ + UnimplementedUserRender: &api.UnimplementedUserRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/middleware/admin.go b/internal/servants/chain/admin.go similarity index 53% rename from internal/middleware/admin.go rename to internal/servants/chain/admin.go index f81b00ee..35a0fbc3 100644 --- a/internal/middleware/admin.go +++ b/internal/servants/chain/admin.go @@ -1,8 +1,12 @@ -package middleware +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package chain import ( "github.com/gin-gonic/gin" - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/pkg/app" "github.com/rocboss/paopao-ce/pkg/errcode" ) @@ -10,8 +14,8 @@ import ( func Admin() gin.HandlerFunc { return func(c *gin.Context) { if user, exist := c.Get("USER"); exist { - if userModel, ok := user.(*model.User); ok { - if userModel.Status == model.UserStatusNormal && userModel.IsAdmin { + if userModel, ok := user.(*core.User); ok { + if userModel.Status == core.UserStatusNormal && userModel.IsAdmin { c.Next() return } diff --git a/internal/servants/chain/chain.go b/internal/servants/chain/chain.go new file mode 100644 index 00000000..84faeca5 --- /dev/null +++ b/internal/servants/chain/chain.go @@ -0,0 +1,24 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package chain + +import ( + "sync" + + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/dao" +) + +var ( + _ums core.UserManageService + _onceUms sync.Once +) + +func userManageService() core.UserManageService { + _onceUms.Do(func() { + _ums = dao.DataService() + }) + return _ums +} diff --git a/internal/middleware/jwt.go b/internal/servants/chain/jwt.go similarity index 78% rename from internal/middleware/jwt.go rename to internal/servants/chain/jwt.go index fb683cc9..62a50e93 100644 --- a/internal/middleware/jwt.go +++ b/internal/servants/chain/jwt.go @@ -1,19 +1,21 @@ -package middleware +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package chain import ( "strings" - "github.com/dgrijalva/jwt-go" "github.com/gin-gonic/gin" + "github.com/golang-jwt/jwt/v4" "github.com/rocboss/paopao-ce/internal/conf" - "github.com/rocboss/paopao-ce/internal/model" "github.com/rocboss/paopao-ce/pkg/app" "github.com/rocboss/paopao-ce/pkg/errcode" ) func JWT() gin.HandlerFunc { - // TODO: optimize get user from a simple service that provide fetch a user info interface. - db := conf.MustGormDB() + ums := userManageService() return func(c *gin.Context) { var ( token string @@ -51,13 +53,12 @@ func JWT() gin.HandlerFunc { c.Set("USERNAME", claims.Username) // 加载用户信息 - user := &model.User{ - Model: &model.Model{ - ID: claims.UID, - }, + user, err := ums.GetUserByID(claims.UID) + if err == nil { + c.Set("USER", user) + } else { + ecode = errcode.UnauthorizedAuthNotExist } - user, _ = user.Get(db) - c.Set("USER", user) // 强制下线机制 if (conf.JWTSetting.Issuer + ":" + user.Salt) != claims.Issuer { @@ -78,8 +79,7 @@ func JWT() gin.HandlerFunc { } func JwtLoose() gin.HandlerFunc { - // TODO: optimize get user from a simple service that provide fetch a user info interface. - db := conf.MustGormDB() + ums := userManageService() return func(c *gin.Context) { token, exist := c.GetQuery("token") if !exist { @@ -97,12 +97,7 @@ func JwtLoose() gin.HandlerFunc { c.Set("UID", claims.UID) c.Set("USERNAME", claims.Username) // 加载用户信息 - user := &model.User{ - Model: &model.Model{ - ID: claims.UID, - }, - } - user, err := user.Get(db) + user, err := ums.GetUserByID(claims.UID) if err == nil && (conf.JWTSetting.Issuer+":"+user.Salt) == claims.Issuer { c.Set("USER", user) } diff --git a/internal/middleware/priv.go b/internal/servants/chain/priv.go similarity index 64% rename from internal/middleware/priv.go rename to internal/servants/chain/priv.go index 32ccbf41..6c09d0a8 100644 --- a/internal/middleware/priv.go +++ b/internal/servants/chain/priv.go @@ -1,19 +1,23 @@ -package middleware +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package chain import ( + "github.com/alimy/cfg" "github.com/gin-gonic/gin" - "github.com/rocboss/paopao-ce/internal/conf" - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/pkg/app" "github.com/rocboss/paopao-ce/pkg/errcode" ) func Priv() gin.HandlerFunc { - if conf.CfgIf("PhoneBind") { + if cfg.If("PhoneBind") { return func(c *gin.Context) { if u, exist := c.Get("USER"); exist { - if user, ok := u.(*model.User); ok { - if user.Status == model.UserStatusNormal { + if user, ok := u.(*core.User); ok { + if user.Status == core.UserStatusNormal { if user.Phone == "" { response := app.NewResponse(c) response.ToErrorResponse(errcode.AccountNoPhoneBind) @@ -32,7 +36,7 @@ func Priv() gin.HandlerFunc { } else { return func(c *gin.Context) { if u, exist := c.Get("USER"); exist { - if user, ok := u.(*model.User); ok && user.Status == model.UserStatusNormal { + if user, ok := u.(*core.User); ok && user.Status == core.UserStatusNormal { c.Next() return } diff --git a/internal/servants/docs/docs.go b/internal/servants/docs/docs.go new file mode 100644 index 00000000..7b6c9d36 --- /dev/null +++ b/internal/servants/docs/docs.go @@ -0,0 +1,17 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +//go:build !docs +// +build !docs + +package docs + +import ( + "github.com/gin-gonic/gin" +) + +// RegisterDocs stub function for register docs asset route +func RegisterDocs(e *gin.Engine) { + // empty +} diff --git a/internal/servants/docs/docs_embed.go b/internal/servants/docs/docs_embed.go new file mode 100644 index 00000000..8879896c --- /dev/null +++ b/internal/servants/docs/docs_embed.go @@ -0,0 +1,21 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +//go:build docs +// +build docs + +package docs + +import ( + "github.com/alimy/cfg" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/docs/openapi" +) + +// RegisterDocs register docs asset route +func RegisterDocs(e *gin.Engine) { + cfg.Be("Docs:OpenAPI", func() { + e.StaticFS("/docs/openapi", openapi.NewFileSystem()) + }) +} diff --git a/internal/servants/localoss/localoss.go b/internal/servants/localoss/localoss.go new file mode 100644 index 00000000..97fdafbe --- /dev/null +++ b/internal/servants/localoss/localoss.go @@ -0,0 +1,30 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package localoss + +import ( + "path/filepath" + + "github.com/gin-gonic/gin" + api "github.com/rocboss/paopao-ce/auto/api/s/v1" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/sirupsen/logrus" +) + +// RouteLocalOSS register LocalOSS route if needed +func RouteLocalOSS(e *gin.Engine) { + savePath, err := filepath.Abs(conf.LocalOSSSetting.SavePath) + if err != nil { + logrus.Fatalf("get localOSS save path err: %v", err) + } + e.Static("/oss", savePath) + + logrus.Infof("register LocalOSS route in /oss on save path: %s", savePath) +} + +// RouteLocaloss register LocalOSS route if needed +func RouteLocaloss(e *gin.Engine) { + api.RegisterUserServant(e, newUserSrv(), newUserBinding(), newUserRender()) +} diff --git a/internal/servants/localoss/user.go b/internal/servants/localoss/user.go new file mode 100644 index 00000000..37fc715e --- /dev/null +++ b/internal/servants/localoss/user.go @@ -0,0 +1,51 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package localoss + +import ( + api "github.com/rocboss/paopao-ce/auto/api/s/v1" + "github.com/rocboss/paopao-ce/internal/servants/base" +) + +var ( + _ api.User = (*userSrv)(nil) + _ api.UserBinding = (*userBinding)(nil) + _ api.UserRender = (*userRender)(nil) +) + +type userSrv struct { + base.BaseServant + api.UnimplementedUserServant +} + +type userBinding struct { + base.BaseBinding + *api.UnimplementedUserBinding +} + +type userRender struct { + base.BaseRender + *api.UnimplementedUserRender +} + +func newUserSrv() api.User { + return &userSrv{} +} + +func newUserBinding() api.UserBinding { + return &userBinding{ + UnimplementedUserBinding: &api.UnimplementedUserBinding{ + BindAny: base.BindAny, + }, + } +} + +func newUserRender() api.UserRender { + return &userRender{ + UnimplementedUserRender: &api.UnimplementedUserRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/servants/mobile/auth.go b/internal/servants/mobile/auth.go new file mode 100644 index 00000000..7b66794c --- /dev/null +++ b/internal/servants/mobile/auth.go @@ -0,0 +1,21 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package mobile + +import ( + api "github.com/rocboss/paopao-ce/auto/rpc/v1" +) + +var ( + _ api.AuthenticateServer = (*authenticateServant)(nil) +) + +type authenticateServant struct { + api.UnimplementedAuthenticateServer +} + +func newAuthenticateServer() *authenticateServant { + return &authenticateServant{} +} diff --git a/internal/servants/mobile/mobile.go b/internal/servants/mobile/mobile.go new file mode 100644 index 00000000..5f9ed52c --- /dev/null +++ b/internal/servants/mobile/mobile.go @@ -0,0 +1,14 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package mobile + +import ( + api "github.com/rocboss/paopao-ce/auto/rpc/v1" + "google.golang.org/grpc" +) + +func RegisterServants(s *grpc.Server) { + api.RegisterAuthenticateServer(s, newAuthenticateServer()) +} diff --git a/internal/servants/servants.go b/internal/servants/servants.go new file mode 100644 index 00000000..e206ad08 --- /dev/null +++ b/internal/servants/servants.go @@ -0,0 +1,65 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package servants + +import ( + "github.com/alimy/cfg" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/servants/admin" + "github.com/rocboss/paopao-ce/internal/servants/bot" + "github.com/rocboss/paopao-ce/internal/servants/docs" + "github.com/rocboss/paopao-ce/internal/servants/localoss" + "github.com/rocboss/paopao-ce/internal/servants/mobile" + "github.com/rocboss/paopao-ce/internal/servants/space" + "github.com/rocboss/paopao-ce/internal/servants/statick" + "github.com/rocboss/paopao-ce/internal/servants/web" + "google.golang.org/grpc" +) + +// RegisterWebServants register all the servants to gin.Engine +func RegisterWebServants(e *gin.Engine) { + cfg.Be("Frontend:EmbedWeb", func() { + statick.RegisterWebStatick(e) + }) + cfg.Be("LocalOSS", func() { + localoss.RouteLocalOSS(e) + }) + web.RouteWeb(e) +} + +// RegisterAdminServants register all the servants to gin.Engine +func RegisterAdminServants(e *gin.Engine) { + admin.RouteManager(e) +} + +// RegisterSpaceXServants register all the servants to gin.Engine +func RegisterSpaceXServants(e *gin.Engine) { + space.RouteSpaceX(e) +} + +// RegisterBotServants register all the servants to gin.Engine +func RegisterBotServants(e *gin.Engine) { + bot.RouteBot(e) +} + +// RegisterLocalossServants register all the servants to gin.Engine +func RegisterLocalossServants(e *gin.Engine) { + localoss.RouteLocaloss(e) +} + +// RegisterDocsServants register all the servants to gin.Engine +func RegisterDocsServants(e *gin.Engine) { + docs.RegisterDocs(e) +} + +// RegisterFrontendWebServants register all the servants to gin.Engine +func RegisterFrontendWebServants(e *gin.Engine) { + statick.RegisterWebStatick(e) +} + +// RegisterMobileServants register all the servants to grpc.Server +func RegisterMobileServants(s *grpc.Server) { + mobile.RegisterServants(s) +} diff --git a/internal/servants/space/space.go b/internal/servants/space/space.go new file mode 100644 index 00000000..c9952035 --- /dev/null +++ b/internal/servants/space/space.go @@ -0,0 +1,15 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package space + +import ( + "github.com/gin-gonic/gin" + api "github.com/rocboss/paopao-ce/auto/api/x/v1" +) + +// RouteWeb register SpaceX route +func RouteSpaceX(e *gin.Engine) { + api.RegisterUserServant(e, newUserSrv(), newUserBinding(), newUserRender()) +} diff --git a/internal/servants/space/user.go b/internal/servants/space/user.go new file mode 100644 index 00000000..d0e5c632 --- /dev/null +++ b/internal/servants/space/user.go @@ -0,0 +1,51 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package space + +import ( + api "github.com/rocboss/paopao-ce/auto/api/x/v1" + "github.com/rocboss/paopao-ce/internal/servants/base" +) + +var ( + _ api.User = (*userSrv)(nil) + _ api.UserBinding = (*userBinding)(nil) + _ api.UserRender = (*userRender)(nil) +) + +type userSrv struct { + base.BaseServant + api.UnimplementedUserServant +} + +type userBinding struct { + base.BaseBinding + *api.UnimplementedUserBinding +} + +type userRender struct { + base.BaseRender + *api.UnimplementedUserRender +} + +func newUserSrv() api.User { + return &userSrv{} +} + +func newUserBinding() api.UserBinding { + return &userBinding{ + UnimplementedUserBinding: &api.UnimplementedUserBinding{ + BindAny: base.BindAny, + }, + } +} + +func newUserRender() api.UserRender { + return &userRender{ + UnimplementedUserRender: &api.UnimplementedUserRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/servants/statick/statick.go b/internal/servants/statick/statick.go new file mode 100644 index 00000000..ef323b0b --- /dev/null +++ b/internal/servants/statick/statick.go @@ -0,0 +1,17 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +//go:build !embed +// +build !embed + +package statick + +import ( + "github.com/gin-gonic/gin" +) + +// RegisterWebStatick stub function for register static asset route +func RegisterWebStatick(e *gin.Engine) { + // empty +} diff --git a/internal/servants/statick/statick_embed.go b/internal/servants/statick/statick_embed.go new file mode 100644 index 00000000..33392531 --- /dev/null +++ b/internal/servants/statick/statick_embed.go @@ -0,0 +1,31 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +//go:build embed +// +build embed + +package statick + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/web" +) + +// RegisterWebStatick register web static assets route +func RegisterWebStatick(e *gin.Engine) { + routeWebStatic(e, "/", "/index.html", "/favicon.ico", "/assets/*filepath") +} + +func routeWebStatic(e *gin.Engine, paths ...string) { + staticHandler := http.FileServer(web.NewFileSystem()) + handler := func(c *gin.Context) { + staticHandler.ServeHTTP(c.Writer, c.Request) + } + for _, path := range paths { + e.GET(path, handler) + e.HEAD(path, handler) + } +} diff --git a/internal/servants/web/admin.go b/internal/servants/web/admin.go new file mode 100644 index 00000000..6a6dc2ec --- /dev/null +++ b/internal/servants/web/admin.go @@ -0,0 +1,73 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + api "github.com/rocboss/paopao-ce/auto/api/v1" + "github.com/rocboss/paopao-ce/internal/model/web" + "github.com/rocboss/paopao-ce/internal/servants/base" + "github.com/rocboss/paopao-ce/internal/servants/chain" + "github.com/rocboss/paopao-ce/pkg/xerror" +) + +var ( + _ api.Admin = (*adminSrv)(nil) + _ api.AdminBinding = (*adminBinding)(nil) + _ api.AdminRender = (*adminRender)(nil) +) + +type adminSrv struct { + api.UnimplementedAdminServant + *base.DaoServant +} + +type adminBinding struct { + *api.UnimplementedAdminBinding +} + +type adminRender struct { + *api.UnimplementedAdminRender +} + +func (s *adminSrv) Chain() gin.HandlersChain { + return gin.HandlersChain{chain.JWT(), chain.Admin()} +} + +func (s *adminSrv) ChangeUserStatus(req *web.ChangeUserStatusReq) mir.Error { + user, err := s.Ds.GetUserByID(req.ID) + if err != nil || user.Model == nil || user.ID <= 0 { + return _errNoExistUsername + } + // 执行更新 + user.Status = req.Status + if err := s.Ds.UpdateUser(user); err != nil { + return xerror.ServerError + } + return nil +} + +func newAdminSrv(s *base.DaoServant) api.Admin { + return &adminSrv{ + DaoServant: s, + } +} + +func newAdminBinding() api.AdminBinding { + return &adminBinding{ + UnimplementedAdminBinding: &api.UnimplementedAdminBinding{ + BindAny: base.BindAny, + }, + } +} + +func newAdminRender() api.AdminRender { + return &adminRender{ + UnimplementedAdminRender: &api.UnimplementedAdminRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/servants/web/alipay.go b/internal/servants/web/alipay.go new file mode 100644 index 00000000..c5ce3264 --- /dev/null +++ b/internal/servants/web/alipay.go @@ -0,0 +1,239 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "fmt" + "time" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + api "github.com/rocboss/paopao-ce/auto/api/v1" + "github.com/rocboss/paopao-ce/internal/model/web" + "github.com/rocboss/paopao-ce/internal/servants/base" + "github.com/rocboss/paopao-ce/internal/servants/chain" + "github.com/rocboss/paopao-ce/pkg/app" + "github.com/rocboss/paopao-ce/pkg/convert" + "github.com/rocboss/paopao-ce/pkg/xerror" + "github.com/sirupsen/logrus" + "github.com/smartwalle/alipay/v3" +) + +var ( + _ api.AlipayPub = (*alipayPubSrv)(nil) + _ api.AlipayPubBinding = (*alipayPubBinding)(nil) + _ api.AlipayPubRender = (*alipayPubRender)(nil) + _ api.AlipayPriv = (*alipayPrivSrv)(nil) + _ api.AlipayPrivBinding = (*alipayPrivBinding)(nil) + _ api.AlipayPrivRender = (*alipayPrivRender)(nil) +) + +type alipayPubSrv struct { + api.UnimplementedAlipayPubServant + *base.DaoServant +} + +type alipayPubBinding struct { + *api.UnimplementedAlipayPubBinding + + alipayClient *alipay.Client +} + +type alipayPubRender struct { + *api.UnimplementedAlipayPubRender +} + +type alipayPrivSrv struct { + api.UnimplementedAlipayPrivServant + *base.DaoServant + + alipayClient *alipay.Client +} + +type alipayPrivBinding struct { + *api.UnimplementedAlipayPrivBinding +} + +type alipayPrivRender struct { + *api.UnimplementedAlipayPrivRender +} + +func (b *alipayPubBinding) BindAlipayNotify(c *gin.Context) (*web.AlipayNotifyReq, mir.Error) { + if err := c.Request.ParseForm(); err != nil { + logrus.Errorf("parse form err: %s", err) + return nil, _errRechargeNotifyError + } + noti, err := b.alipayClient.GetTradeNotification(c.Request) + if err != nil { + logrus.Errorf("alipayClient.GetTradeNotification err: %s form: %v", err, c.Request.Form) + return nil, _errRechargeNotifyError + } + return &web.AlipayNotifyReq{ + Ctx: c.Request.Context(), + ID: convert.StrTo(noti.OutTradeNo).MustInt64(), + TradeNo: noti.TradeNo, + TradeStatus: noti.TradeStatus, + }, nil +} + +func (s *alipayPubSrv) AlipayNotify(req *web.AlipayNotifyReq) mir.Error { + if req.TradeStatus == alipay.TradeStatusSuccess { + if ok, _ := s.Redis.SetNX(req.Ctx, "PaoPaoRecharge:"+req.TradeNo, 1, time.Second*5).Result(); ok { + recharge, err := s.Ds.GetRechargeByID(req.ID) + if err != nil { + logrus.Errorf("GetRechargeByID id:%d err: %s", req.ID, err) + return _errRechargeNotifyError + } + if recharge.TradeStatus != "TRADE_SUCCESS" { + // 标记为已付款 + err := s.Ds.HandleRechargeSuccess(recharge, req.TradeNo) + defer s.Redis.Del(req.Ctx, "PaoPaoRecharge:"+req.TradeNo) + if err != nil { + logrus.Errorf("HandleRechargeSuccess id:%d err: %s", req.ID, err) + return _errRechargeNotifyError + } + } + } + } + return nil +} + +func (b *alipayPrivBinding) BindUserWalletBills(c *gin.Context) (*web.UserWalletBillsReq, mir.Error) { + uid, ok := base.UserIdFrom(c) + if !ok { + return nil, xerror.UnauthorizedTokenError + } + page, pageSize := app.GetPageInfo(c) + return &web.UserWalletBillsReq{ + UserId: uid, + Page: page, + PageSize: pageSize, + }, nil +} + +func (b *alipayPrivBinding) BindUserRechargeLink(c *gin.Context) (*web.UserRechargeLinkReq, mir.Error) { + v := &web.UserRechargeLinkReq{ + Host: c.Request.Host, + } + err := b.BindAny(c, v) + return v, err +} + +func (b *alipayPrivBinding) BindUserRechargeResult(c *gin.Context) (*web.UserRechargeResultReq, mir.Error) { + uid, exist := base.UserIdFrom(c) + if !exist { + return nil, xerror.UnauthorizedTokenError + } + return &web.UserRechargeResultReq{ + UserId: uid, + Id: convert.StrTo(c.Query("id")).MustInt64(), + }, nil +} + +func (s *alipayPrivSrv) Chain() gin.HandlersChain { + return gin.HandlersChain{chain.JWT()} +} + +func (s *alipayPrivSrv) UserWalletBills(req *web.UserWalletBillsReq) (*web.UserWalletBillsResp, mir.Error) { + bills, err := s.Ds.GetUserWalletBills(req.UserId, (req.Page-1)*req.PageSize, req.PageSize) + if err != nil { + logrus.Errorf("GetUserWalletBills err: %s", err) + return nil, _errUserWalletBillsFailed + } + totalRows, err := s.Ds.GetUserWalletBillCount(req.UserId) + if err != nil { + logrus.Errorf("GetUserWalletBillCount err: %s", err) + return nil, _errUserWalletBillsFailed + } + resp := base.PageRespFrom(bills, req.Page, req.PageSize, totalRows) + return (*web.UserWalletBillsResp)(resp), nil +} + +func (s *alipayPrivSrv) UserRechargeLink(req *web.UserRechargeLinkReq) (*web.UserRechargeLinkResp, mir.Error) { + recharge, err := s.Ds.CreateRecharge(req.User.ID, req.Amount) + if err != nil { + logrus.Errorf("Ds.CreateRecharge err: %v", err) + return nil, _errRechargeReqFail + } + p := alipay.TradePreCreate{} + p.OutTradeNo = fmt.Sprintf("%d", recharge.ID) + p.Subject = "PaoPao用户钱包充值" + p.TotalAmount = fmt.Sprintf("%.2f", float64(recharge.Amount)/100.0) + p.NotifyURL = "https://" + req.Host + "/v1/alipay/notify" + rsp, err := s.alipayClient.TradePreCreate(p) + if err != nil { + logrus.Errorf("client.TradePreCreate err: %v\n", err) + return nil, _errRechargeReqFail + } + if rsp.Content.Code != alipay.CodeSuccess { + return nil, _errRechargeReqFail + } + return &web.UserRechargeLinkResp{ + Id: recharge.ID, + Pay: rsp.Content.QRCode, + }, nil +} + +func (s *alipayPrivSrv) UserRechargeResult(req *web.UserRechargeResultReq) (*web.UserRechargeResultResp, mir.Error) { + recharge, err := s.Ds.GetRechargeByID(req.Id) + if err != nil { + logrus.Errorf("Ds.GetRechargeByID err: %v", err) + return nil, _errGetRechargeFailed + } + if recharge.UserID != req.UserId { + logrus.Errorf("Ds.GetRechargeByID userId not equel recharge.UserID: %d req.UserId %d", recharge.UserID, req.UserId) + return nil, _errGetRechargeFailed + } + return &web.UserRechargeResultResp{ + Id: recharge.ID, + Status: recharge.TradeStatus, + }, nil +} + +func newAlipayPubSrv(s *base.DaoServant) api.AlipayPub { + return &alipayPubSrv{ + DaoServant: s, + } +} + +func newAlipayPubBinding(alipayClient *alipay.Client) api.AlipayPubBinding { + return &alipayPubBinding{ + UnimplementedAlipayPubBinding: &api.UnimplementedAlipayPubBinding{ + BindAny: base.BindAny, + }, + alipayClient: alipayClient, + } +} + +func newAlipayPubRender() api.AlipayPubRender { + return &alipayPubRender{ + UnimplementedAlipayPubRender: &api.UnimplementedAlipayPubRender{ + RenderAny: base.RenderAny, + }, + } +} + +func newAlipayPrivSrv(s *base.DaoServant, client *alipay.Client) api.AlipayPriv { + return &alipayPrivSrv{ + DaoServant: s, + alipayClient: client, + } +} + +func newAlipayPrivBinding() api.AlipayPrivBinding { + return &alipayPrivBinding{ + UnimplementedAlipayPrivBinding: &api.UnimplementedAlipayPrivBinding{ + BindAny: base.BindAny, + }, + } +} + +func newAlipayPrivRender() api.AlipayPrivRender { + return &alipayPrivRender{ + UnimplementedAlipayPrivRender: &api.UnimplementedAlipayPrivRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/servants/web/assets/assets.go b/internal/servants/web/assets/assets.go new file mode 100644 index 00000000..e69dbd67 --- /dev/null +++ b/internal/servants/web/assets/assets.go @@ -0,0 +1,12 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package assets + +import ( + _ "embed" +) + +//go:embed comic.ttf +var ComicBytes []byte diff --git a/internal/routers/api/assets/comic.ttf b/internal/servants/web/assets/comic.ttf similarity index 100% rename from internal/routers/api/assets/comic.ttf rename to internal/servants/web/assets/comic.ttf diff --git a/internal/servants/web/broker/attachment.go b/internal/servants/web/broker/attachment.go new file mode 100644 index 00000000..e8c69447 --- /dev/null +++ b/internal/servants/web/broker/attachment.go @@ -0,0 +1,13 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package broker + +import ( + "github.com/rocboss/paopao-ce/internal/core" +) + +func CreateAttachment(attachment *core.Attachment) (*core.Attachment, error) { + return ds.CreateAttachment(attachment) +} diff --git a/internal/service/avatar.go b/internal/servants/web/broker/avatar.go similarity index 95% rename from internal/service/avatar.go rename to internal/servants/web/broker/avatar.go index 3ac302e0..04e183f4 100644 --- a/internal/service/avatar.go +++ b/internal/servants/web/broker/avatar.go @@ -1,4 +1,8 @@ -package service +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package broker import ( "math/rand" diff --git a/internal/servants/web/broker/broker.go b/internal/servants/web/broker/broker.go new file mode 100644 index 00000000..fcc5846d --- /dev/null +++ b/internal/servants/web/broker/broker.go @@ -0,0 +1,48 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package broker + +import ( + "github.com/alimy/cfg" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/dao" + "github.com/sirupsen/logrus" +) + +var ( + ds core.DataService + ts core.TweetSearchService + oss core.ObjectStorageService + DisablePhoneVerify bool +) + +func Initialize() { + ds = dao.DataService() + ts = dao.TweetSearchService() + oss = dao.ObjectStorageService() + DisablePhoneVerify = !cfg.If("Sms") +} + +// persistMediaContents 获取媒体内容并持久化 +func persistMediaContents(contents []*PostContentItem) (items []string, err error) { + items = make([]string, 0, len(contents)) + for _, item := range contents { + switch item.Type { + case core.ContentTypeImage, + core.ContentTypeVideo, + core.ContentTypeAudio, + core.ContentTypeAttachment, + core.ContentTypeChargeAttachment: + items = append(items, item.Content) + if err != nil { + continue + } + if err = oss.PersistObject(oss.ObjectKey(item.Content)); err != nil { + logrus.Errorf("service.persistMediaContents failed: %s", err) + } + } + } + return +} diff --git a/internal/service/comment.go b/internal/servants/web/broker/comment.go similarity index 83% rename from internal/service/comment.go rename to internal/servants/web/broker/comment.go index f5165d71..7f9389dc 100644 --- a/internal/service/comment.go +++ b/internal/servants/web/broker/comment.go @@ -1,11 +1,15 @@ -package service +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package broker import ( + "github.com/rocboss/paopao-ce/internal/core" "time" "github.com/gin-gonic/gin" "github.com/rocboss/paopao-ce/internal/conf" - "github.com/rocboss/paopao-ce/internal/model" "github.com/rocboss/paopao-ce/pkg/errcode" "github.com/rocboss/paopao-ce/pkg/util" ) @@ -28,8 +32,8 @@ type ReplyDelReq struct { ID int64 `json:"id" binding:"required"` } -func GetPostComments(postID int64, sort string, offset, limit int) ([]*model.CommentFormated, int64, error) { - conditions := &model.ConditionsT{ +func GetPostComments(postID int64, sort string, offset, limit int) ([]*core.CommentFormated, int64, error) { + conditions := &core.ConditionsT{ "post_id": postID, "ORDER": sort, } @@ -61,7 +65,7 @@ func GetPostComments(postID int64, sort string, offset, limit int) ([]*model.Com return nil, 0, err } - commentsFormated := []*model.CommentFormated{} + commentsFormated := []*core.CommentFormated{} for _, comment := range comments { commentFormated := comment.Format() for _, content := range contents { @@ -89,7 +93,7 @@ func GetPostComments(postID int64, sort string, offset, limit int) ([]*model.Com return commentsFormated, totalRows, nil } -func CreatePostComment(ctx *gin.Context, userID int64, param CommentCreationReq) (comment *model.Comment, err error) { +func CreatePostComment(ctx *gin.Context, userID int64, param CommentCreationReq) (comment *core.Comment, err error) { var mediaContents []string defer func() { @@ -113,7 +117,7 @@ func CreatePostComment(ctx *gin.Context, userID int64, param CommentCreationReq) return nil, errcode.MaxCommentCount } ip := ctx.ClientIP() - comment = &model.Comment{ + comment = &core.Comment{ PostID: post.ID, UserID: userID, IP: ip, @@ -126,13 +130,13 @@ func CreatePostComment(ctx *gin.Context, userID int64, param CommentCreationReq) for _, item := range param.Contents { // 检查附件是否是本站资源 - if item.Type == model.CONTENT_TYPE_IMAGE || item.Type == model.CONTENT_TYPE_VIDEO || item.Type == model.CONTENT_TYPE_ATTACHMENT { + if item.Type == core.ContentTypeImage || item.Type == core.ContentTypeVideo || item.Type == core.ContentTypeAttachment { if err := ds.CheckAttachment(item.Content); err != nil { continue } } - postContent := &model.CommentContent{ + postContent := &core.CommentContent{ CommentID: comment.ID, UserID: userID, Content: item.Content, @@ -153,10 +157,10 @@ func CreatePostComment(ctx *gin.Context, userID int64, param CommentCreationReq) // 创建用户消息提醒 postMaster, err := ds.GetUserByID(post.UserID) if err == nil && postMaster.ID != userID { - go ds.CreateMessage(&model.Message{ + go ds.CreateMessage(&core.Message{ SenderUserID: userID, ReceiverUserID: postMaster.ID, - Type: model.MsgtypeComment, + Type: core.MsgtypeComment, Brief: "在泡泡中评论了你", PostID: post.ID, CommentID: comment.ID, @@ -169,10 +173,10 @@ func CreatePostComment(ctx *gin.Context, userID int64, param CommentCreationReq) } // 创建消息提醒 - go ds.CreateMessage(&model.Message{ + go ds.CreateMessage(&core.Message{ SenderUserID: userID, ReceiverUserID: user.ID, - Type: model.MsgtypeComment, + Type: core.MsgtypeComment, Brief: "在泡泡评论中@了你", PostID: post.ID, CommentID: comment.ID, @@ -182,11 +186,11 @@ func CreatePostComment(ctx *gin.Context, userID int64, param CommentCreationReq) return comment, nil } -func GetPostComment(id int64) (*model.Comment, error) { +func GetPostComment(id int64) (*core.Comment, error) { return ds.GetCommentByID(id) } -func DeletePostComment(comment *model.Comment) error { +func DeletePostComment(comment *core.Comment) error { // 加载post post, err := ds.GetPostByID(comment.PostID) if err == nil { @@ -198,7 +202,7 @@ func DeletePostComment(comment *model.Comment) error { return ds.DeleteComment(comment) } -func createPostPreHandler(commentID int64, userID, atUserID int64) (*model.Post, *model.Comment, int64, +func createPostPreHandler(commentID int64, userID, atUserID int64) (*core.Post, *core.Comment, int64, error) { // 加载Comment comment, err := ds.GetCommentByID(commentID) @@ -231,10 +235,10 @@ func createPostPreHandler(commentID int64, userID, atUserID int64) (*model.Post, return post, comment, atUserID, nil } -func CreatePostCommentReply(ctx *gin.Context, commentID int64, content string, userID, atUserID int64) (*model.CommentReply, error) { +func CreatePostCommentReply(ctx *gin.Context, commentID int64, content string, userID, atUserID int64) (*core.CommentReply, error) { var ( - post *model.Post - comment *model.Comment + post *core.Post + comment *core.Comment err error ) if post, comment, atUserID, err = createPostPreHandler(commentID, userID, atUserID); err != nil { @@ -243,7 +247,7 @@ func CreatePostCommentReply(ctx *gin.Context, commentID int64, content string, u // 创建评论 ip := ctx.ClientIP() - reply := &model.CommentReply{ + reply := &core.CommentReply{ CommentID: commentID, UserID: userID, Content: content, @@ -268,10 +272,10 @@ func CreatePostCommentReply(ctx *gin.Context, commentID int64, content string, u // 创建用户消息提醒 commentMaster, err := ds.GetUserByID(comment.UserID) if err == nil && commentMaster.ID != userID { - go ds.CreateMessage(&model.Message{ + go ds.CreateMessage(&core.Message{ SenderUserID: userID, ReceiverUserID: commentMaster.ID, - Type: model.MsgTypeReply, + Type: core.MsgTypeReply, Brief: "在泡泡评论下回复了你", PostID: post.ID, CommentID: comment.ID, @@ -280,10 +284,10 @@ func CreatePostCommentReply(ctx *gin.Context, commentID int64, content string, u } postMaster, err := ds.GetUserByID(post.UserID) if err == nil && postMaster.ID != userID && commentMaster.ID != postMaster.ID { - go ds.CreateMessage(&model.Message{ + go ds.CreateMessage(&core.Message{ SenderUserID: userID, ReceiverUserID: postMaster.ID, - Type: model.MsgTypeReply, + Type: core.MsgTypeReply, Brief: "在泡泡评论下发布了新回复", PostID: post.ID, CommentID: comment.ID, @@ -294,10 +298,10 @@ func CreatePostCommentReply(ctx *gin.Context, commentID int64, content string, u user, err := ds.GetUserByID(atUserID) if err == nil && user.ID != userID && commentMaster.ID != user.ID && postMaster.ID != user.ID { // 创建消息提醒 - go ds.CreateMessage(&model.Message{ + go ds.CreateMessage(&core.Message{ SenderUserID: userID, ReceiverUserID: user.ID, - Type: model.MsgTypeReply, + Type: core.MsgTypeReply, Brief: "在泡泡评论的回复中@了你", PostID: post.ID, CommentID: comment.ID, @@ -309,11 +313,11 @@ func CreatePostCommentReply(ctx *gin.Context, commentID int64, content string, u return reply, nil } -func GetPostCommentReply(id int64) (*model.CommentReply, error) { +func GetPostCommentReply(id int64) (*core.CommentReply, error) { return ds.GetCommentReplyByID(id) } -func DeletePostCommentReply(reply *model.CommentReply) error { +func DeletePostCommentReply(reply *core.CommentReply) error { err := ds.DeleteCommentReply(reply) if err != nil { return err diff --git a/internal/service/message.go b/internal/servants/web/broker/message.go similarity index 81% rename from internal/service/message.go rename to internal/servants/web/broker/message.go index e063e492..6e5dd1a1 100644 --- a/internal/service/message.go +++ b/internal/servants/web/broker/message.go @@ -1,4 +1,8 @@ -package service +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package broker import ( "fmt" @@ -6,7 +10,7 @@ import ( "github.com/gin-gonic/gin" "github.com/rocboss/paopao-ce/internal/conf" - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/pkg/convert" "github.com/rocboss/paopao-ce/pkg/errcode" ) @@ -23,7 +27,7 @@ type WhisperReq struct { } // CreateWhisper 创建私信 -func CreateWhisper(c *gin.Context, msg *model.Message) (*model.Message, error) { +func CreateWhisper(c *gin.Context, msg *core.Message) (*core.Message, error) { whisperKey := fmt.Sprintf("WhisperTimes:%d", msg.SenderUserID) // 今日频次限制 @@ -65,8 +69,8 @@ func ReadMessage(id, userID int64) error { return ds.ReadMessage(message) } -func GetMessages(userID int64, offset, limit int) ([]*model.MessageFormated, int64, error) { - conditions := &model.ConditionsT{ +func GetMessages(userID int64, offset, limit int) ([]*core.MessageFormated, int64, error) { + conditions := &core.ConditionsT{ "receiver_user_id": userID, "ORDER": "id DESC", } @@ -82,6 +86,11 @@ func GetMessages(userID int64, offset, limit int) ([]*model.MessageFormated, int } + // 好友申请消息不需要获取其他信息 + if mf.Type == core.MsgTypeRequestingFriend { + continue + } + if mf.PostID > 0 { post, err := GetPost(mf.PostID) if err == nil { diff --git a/internal/service/post.go b/internal/servants/web/broker/post.go similarity index 67% rename from internal/service/post.go rename to internal/servants/web/broker/post.go index 875b7fe2..9a73528b 100644 --- a/internal/service/post.go +++ b/internal/servants/web/broker/post.go @@ -1,4 +1,8 @@ -package service +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package broker import ( "errors" @@ -10,8 +14,6 @@ import ( "github.com/gin-gonic/gin" "github.com/rocboss/paopao-ce/internal/conf" "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" - "github.com/rocboss/paopao-ce/internal/model/rest" "github.com/rocboss/paopao-ce/pkg/errcode" "github.com/rocboss/paopao-ce/pkg/util" "github.com/sirupsen/logrus" @@ -23,7 +25,7 @@ const TagTypeHot TagType = "hot" const TagTypeNew TagType = "new" type PostListReq struct { - Conditions *model.ConditionsT + Conditions *core.ConditionsT Offset int Limit int } @@ -37,7 +39,7 @@ type PostCreationReq struct { Tags []string `json:"tags" binding:"required"` Users []string `json:"users" binding:"required"` AttachmentPrice int64 `json:"attachment_price"` - Visibility model.PostVisibleT `json:"visibility"` + Visibility core.PostVisibleT `json:"visibility"` } type PostDelReq struct { @@ -53,8 +55,8 @@ type PostStickReq struct { } type PostVisibilityReq struct { - ID int64 `json:"id" binding:"required"` - Visibility model.PostVisibleT `json:"visibility"` + ID int64 `json:"id" binding:"required"` + Visibility core.PostVisibleT `json:"visibility"` } type PostStarReq struct { @@ -66,27 +68,25 @@ type PostCollectionReq struct { } type PostContentItem struct { - Content string `json:"content" binding:"required"` - Type model.PostContentT `json:"type" binding:"required"` - Sort int64 `json:"sort" binding:"required"` + Content string `json:"content" binding:"required"` + Type core.PostContentT `json:"type" binding:"required"` + Sort int64 `json:"sort" binding:"required"` } // Check 检查PostContentItem属性 func (p *PostContentItem) Check() error { // 检查附件是否是本站资源 - if p.Type == model.CONTENT_TYPE_IMAGE || p.Type == model.CONTENT_TYPE_VIDEO || p.Type == model. - CONTENT_TYPE_ATTACHMENT { + if p.Type == core.ContentTypeImage || p.Type == core.ContentTypeVideo || p.Type == core.ContentTypeAttachment { if err := ds.CheckAttachment(p.Content); err != nil { return err } } // 检查链接是否合法 - if p.Type == model.CONTENT_TYPE_LINK { + if p.Type == core.ContentTypeLink { if strings.Index(p.Content, "http://") != 0 && strings.Index(p.Content, "https://") != 0 { return fmt.Errorf("链接不合法") } } - return nil } @@ -103,7 +103,7 @@ func tagsFrom(originTags []string) []string { // CreatePost 创建文章 // TODO: 推文+推文内容需要在一个事务中添加,后续优化 -func CreatePost(c *gin.Context, userID int64, param PostCreationReq) (_ *model.PostFormated, err error) { +func CreatePost(c *gin.Context, userID int64, param PostCreationReq) (_ *core.PostFormated, err error) { var mediaContents []string defer func() { @@ -118,7 +118,7 @@ func CreatePost(c *gin.Context, userID int64, param PostCreationReq) (_ *model.P ip := c.ClientIP() tags := tagsFrom(param.Tags) - post := &model.Post{ + post := &core.Post{ UserID: userID, Tags: strings.Join(tags, ","), IP: ip, @@ -138,11 +138,11 @@ func CreatePost(c *gin.Context, userID int64, param PostCreationReq) (_ *model.P continue } - if item.Type == model.CONTENT_TYPE_ATTACHMENT && param.AttachmentPrice > 0 { - item.Type = model.CONTENT_TYPE_CHARGE_ATTACHMENT + if item.Type == core.ContentTypeAttachment && param.AttachmentPrice > 0 { + item.Type = core.ContentTypeChargeAttachment } - postContent := &model.PostContent{ + postContent := &core.PostContent{ PostID: post.ID, UserID: userID, Content: item.Content, @@ -155,10 +155,10 @@ func CreatePost(c *gin.Context, userID int64, param PostCreationReq) (_ *model.P } // 私密推文不创建标签与用户提醒 - if post.Visibility != model.PostVisitPrivate { + if post.Visibility != core.PostVisitPrivate { // 创建标签 for _, t := range tags { - tag := &model.Tag{ + tag := &core.Tag{ UserID: userID, Tag: t, } @@ -174,10 +174,10 @@ func CreatePost(c *gin.Context, userID int64, param PostCreationReq) (_ *model.P // 创建消息提醒 // TODO: 优化消息提醒处理机制 - go ds.CreateMessage(&model.Message{ + go ds.CreateMessage(&core.Message{ SenderUserID: userID, ReceiverUserID: user.ID, - Type: model.MsgTypePost, + Type: core.MsgTypePost, Brief: "在新发布的泡泡动态中@了你", PostID: post.ID, }) @@ -187,14 +187,14 @@ func CreatePost(c *gin.Context, userID int64, param PostCreationReq) (_ *model.P // 推送Search PushPostToSearch(post) - formatedPosts, err := ds.RevampPosts([]*model.PostFormated{post.Format()}) + formatedPosts, err := ds.RevampPosts([]*core.PostFormated{post.Format()}) if err != nil { return nil, err } return formatedPosts[0], nil } -func DeletePost(user *model.User, id int64) *errcode.Error { +func DeletePost(user *core.User, id int64) *errcode.Error { if user == nil { return errcode.NoPermission } @@ -261,8 +261,8 @@ func StickPost(id int64) error { return nil } -func VisiblePost(user *model.User, postId int64, visibility model.PostVisibleT) *errcode.Error { - if visibility >= model.PostVisitInvalid { +func VisiblePost(user *core.User, postId int64, visibility core.PostVisibleT) *errcode.Error { + if visibility >= core.PostVisitInvalid { return errcode.InvalidParams } @@ -287,11 +287,11 @@ func VisiblePost(user *model.User, postId int64, visibility model.PostVisibleT) return nil } -func GetPostStar(postID, userID int64) (*model.PostStar, error) { +func GetPostStar(postID, userID int64) (*core.PostStar, error) { return ds.GetUserPostStar(postID, userID) } -func CreatePostStar(postID, userID int64) (*model.PostStar, error) { +func CreatePostStar(postID, userID int64) (*core.PostStar, error) { // 加载Post post, err := ds.GetPostByID(postID) if err != nil { @@ -299,7 +299,7 @@ func CreatePostStar(postID, userID int64) (*model.PostStar, error) { } // 私密post不可操作 - if post.Visibility == model.PostVisitPrivate { + if post.Visibility == core.PostVisitPrivate { return nil, errors.New("no permision") } @@ -318,7 +318,7 @@ func CreatePostStar(postID, userID int64) (*model.PostStar, error) { return star, nil } -func DeletePostStar(star *model.PostStar) error { +func DeletePostStar(star *core.PostStar) error { err := ds.DeletePostStar(star) if err != nil { return err @@ -330,7 +330,7 @@ func DeletePostStar(star *model.PostStar) error { } // 私密post不可操作 - if post.Visibility == model.PostVisitPrivate { + if post.Visibility == core.PostVisitPrivate { return errors.New("no permision") } @@ -344,11 +344,11 @@ func DeletePostStar(star *model.PostStar) error { return nil } -func GetPostCollection(postID, userID int64) (*model.PostCollection, error) { +func GetPostCollection(postID, userID int64) (*core.PostCollection, error) { return ds.GetUserPostCollection(postID, userID) } -func CreatePostCollection(postID, userID int64) (*model.PostCollection, error) { +func CreatePostCollection(postID, userID int64) (*core.PostCollection, error) { // 加载Post post, err := ds.GetPostByID(postID) if err != nil { @@ -356,7 +356,7 @@ func CreatePostCollection(postID, userID int64) (*model.PostCollection, error) { } // 私密post不可操作 - if post.Visibility == model.PostVisitPrivate { + if post.Visibility == core.PostVisitPrivate { return nil, errors.New("no permision") } @@ -375,7 +375,7 @@ func CreatePostCollection(postID, userID int64) (*model.PostCollection, error) { return collection, nil } -func DeletePostCollection(collection *model.PostCollection) error { +func DeletePostCollection(collection *core.PostCollection) error { err := ds.DeletePostCollection(collection) if err != nil { return err @@ -387,7 +387,7 @@ func DeletePostCollection(collection *model.PostCollection) error { } // 私密post不可操作 - if post.Visibility == model.PostVisitPrivate { + if post.Visibility == core.PostVisitPrivate { return errors.New("no permision") } @@ -401,7 +401,7 @@ func DeletePostCollection(collection *model.PostCollection) error { return nil } -func GetPost(id int64) (*model.PostFormated, error) { +func GetPost(id int64) (*core.PostFormated, error) { post, err := ds.GetPostByID(id) if err != nil { @@ -431,29 +431,28 @@ func GetPost(id int64) (*model.PostFormated, error) { return postFormated, nil } -func GetPostContentByID(id int64) (*model.PostContent, error) { +func GetPostContentByID(id int64) (*core.PostContent, error) { return ds.GetPostContentByID(id) } -func GetIndexPosts(user *model.User, offset int, limit int) (*rest.IndexTweetsResp, error) { +func GetIndexPosts(user *core.User, offset int, limit int) (*core.IndexTweetList, error) { return ds.IndexPosts(user, offset, limit) } -func GetPostList(req *PostListReq) ([]*model.PostFormated, error) { +func GetPostList(req *PostListReq) ([]*core.Post, []*core.PostFormated, error) { posts, err := ds.GetPosts(req.Conditions, req.Offset, req.Limit) - if err != nil { - return nil, err + return nil, nil, err } - - return ds.MergePosts(posts) + postFormated, err := ds.MergePosts(posts) + return posts, postFormated, err } -func GetPostCount(conditions *model.ConditionsT) (int64, error) { +func GetPostCount(conditions *core.ConditionsT) (int64, error) { return ds.GetPostCount(conditions) } -func GetPostListFromSearch(user *model.User, q *core.QueryReq, offset, limit int) ([]*model.PostFormated, int64, error) { +func GetPostListFromSearch(user *core.User, q *core.QueryReq, offset, limit int) ([]*core.PostFormated, int64, error) { resp, err := ts.Search(user, q, offset, limit) if err != nil { return nil, 0, err @@ -465,7 +464,7 @@ func GetPostListFromSearch(user *model.User, q *core.QueryReq, offset, limit int return posts, resp.Total, nil } -func GetPostListFromSearchByQuery(user *model.User, query string, offset, limit int) ([]*model.PostFormated, int64, error) { +func GetPostListFromSearchByQuery(user *core.User, query string, offset, limit int) ([]*core.PostFormated, int64, error) { q := &core.QueryReq{ Query: query, Type: "search", @@ -473,9 +472,9 @@ func GetPostListFromSearchByQuery(user *model.User, query string, offset, limit return GetPostListFromSearch(user, q, offset, limit) } -func PushPostToSearch(post *model.Post) { +func PushPostToSearch(post *core.Post) { postFormated := post.Format() - postFormated.User = &model.UserFormated{ + postFormated.User = &core.UserFormated{ ID: post.UserID, } contents, _ := ds.GetPostContentsByIDs([]int64{post.ID}) @@ -484,110 +483,77 @@ func PushPostToSearch(post *model.Post) { } contentFormated := "" - for _, content := range postFormated.Contents { - if content.Type == model.CONTENT_TYPE_TEXT || content.Type == model.CONTENT_TYPE_TITLE { + if content.Type == core.ContentTypeText || content.Type == core.ContentTypeTitle { contentFormated = contentFormated + content.Content + "\n" } } - tagMaps := map[string]int8{} - for _, tag := range strings.Split(post.Tags, ",") { - tagMaps[tag] = 1 - } - - data := core.DocItems{{ - "id": post.ID, - "user_id": post.UserID, - "comment_count": post.CommentCount, - "collection_count": post.CollectionCount, - "upvote_count": post.UpvoteCount, - "visibility": post.Visibility, - "is_top": post.IsTop, - "is_essence": post.IsEssence, - "content": contentFormated, - "tags": tagMaps, - "ip_loc": post.IPLoc, - "latest_replied_on": post.LatestRepliedOn, - "attachment_price": post.AttachmentPrice, - "created_on": post.CreatedOn, - "modified_on": post.ModifiedOn, + docs := []core.TsDocItem{{ + Post: post, + Content: contentFormated, }} - - ts.AddDocuments(data, fmt.Sprintf("%d", post.ID)) + ts.AddDocuments(docs, fmt.Sprintf("%d", post.ID)) } -func DeleteSearchPost(post *model.Post) error { +func DeleteSearchPost(post *core.Post) error { return ts.DeleteDocuments([]string{fmt.Sprintf("%d", post.ID)}) } func PushPostsToSearch(c *gin.Context) { if ok, _ := conf.Redis.SetNX(c, "JOB_PUSH_TO_SEARCH", 1, time.Hour).Result(); ok { + defer conf.Redis.Del(c, "JOB_PUSH_TO_SEARCH") + splitNum := 1000 - totalRows, _ := GetPostCount(&model.ConditionsT{ - "visibility IN ?": []model.PostVisibleT{model.PostVisitPublic, model.PostVisitFriend}, + totalRows, _ := GetPostCount(&core.ConditionsT{ + "visibility IN ?": []core.PostVisibleT{core.PostVisitPublic, core.PostVisitFriend}, }) pages := math.Ceil(float64(totalRows) / float64(splitNum)) nums := int(pages) for i := 0; i < nums; i++ { - posts, _ := GetPostList(&PostListReq{ - Conditions: &model.ConditionsT{}, + posts, postsFormated, err := GetPostList(&PostListReq{ + Conditions: &core.ConditionsT{}, Offset: i * splitNum, Limit: splitNum, }) - - for _, post := range posts { + if err != nil || len(posts) != len(postsFormated) { + continue + } + for i, pf := range postsFormated { contentFormated := "" - - for _, content := range post.Contents { - if content.Type == model.CONTENT_TYPE_TEXT || content.Type == model.CONTENT_TYPE_TITLE { + for _, content := range pf.Contents { + if content.Type == core.ContentTypeText || content.Type == core.ContentTypeTitle { contentFormated = contentFormated + content.Content + "\n" } } - - docs := core.DocItems{{ - "id": post.ID, - "user_id": post.User.ID, - "comment_count": post.CommentCount, - "collection_count": post.CollectionCount, - "upvote_count": post.UpvoteCount, - "visibility": post.Visibility, - "is_top": post.IsTop, - "is_essence": post.IsEssence, - "content": contentFormated, - "tags": post.Tags, - "ip_loc": post.IPLoc, - "latest_replied_on": post.LatestRepliedOn, - "attachment_price": post.AttachmentPrice, - "created_on": post.CreatedOn, - "modified_on": post.ModifiedOn, + docs := []core.TsDocItem{{ + Post: posts[i], + Content: contentFormated, }} - ts.AddDocuments(docs, fmt.Sprintf("%d", post.ID)) + ts.AddDocuments(docs, fmt.Sprintf("%d", posts[i].ID)) } } - - conf.Redis.Del(c, "JOB_PUSH_TO_SEARCH") } } -func GetPostTags(param *PostTagsReq) ([]*model.TagFormated, error) { +func GetPostTags(param *PostTagsReq) ([]*core.TagFormated, error) { num := param.Num if num > conf.AppSetting.MaxPageSize { num = conf.AppSetting.MaxPageSize } - conditions := &model.ConditionsT{} + conditions := &core.ConditionsT{} if param.Type == TagTypeHot { // 热门标签 - conditions = &model.ConditionsT{ + conditions = &core.ConditionsT{ "ORDER": "quote_num DESC", } } if param.Type == TagTypeNew { // 热门标签 - conditions = &model.ConditionsT{ + conditions = &core.ConditionsT{ "ORDER": "id DESC", } } @@ -605,7 +571,7 @@ func GetPostTags(param *PostTagsReq) ([]*model.TagFormated, error) { users, _ := ds.GetUsersByIDs(userIds) - tagsFormated := []*model.TagFormated{} + tagsFormated := []*core.TagFormated{} for _, tag := range tags { tagFormated := tag.Format() for _, user := range users { diff --git a/internal/service/sign.go b/internal/servants/web/broker/sign.go similarity index 71% rename from internal/service/sign.go rename to internal/servants/web/broker/sign.go index 188eaea6..c8883638 100644 --- a/internal/service/sign.go +++ b/internal/servants/web/broker/sign.go @@ -1,4 +1,8 @@ -package service +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package broker import ( "fmt" @@ -9,7 +13,7 @@ import ( "github.com/sirupsen/logrus" ) -func GetParamSign(param map[string]interface{}, secretKey string) string { +func GetParamSign(param map[string]any, secretKey string) string { signRaw := "" rawStrs := []string{} diff --git a/internal/service/user.go b/internal/servants/web/broker/user.go similarity index 66% rename from internal/service/user.go rename to internal/servants/web/broker/user.go index e3faf1d3..66919a99 100644 --- a/internal/service/user.go +++ b/internal/servants/web/broker/user.go @@ -1,4 +1,8 @@ -package service +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package broker import ( "fmt" @@ -10,14 +14,14 @@ import ( "github.com/gin-gonic/gin" "github.com/gofrs/uuid" "github.com/rocboss/paopao-ce/internal/conf" - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/pkg/convert" "github.com/rocboss/paopao-ce/pkg/errcode" "github.com/rocboss/paopao-ce/pkg/util" "github.com/sirupsen/logrus" ) -const MAX_CAPTCHA_TIMES = 2 +const _MaxCaptchaTimes = 2 type PhoneCaptchaReq struct { Phone string `json:"phone" form:"phone" binding:"required"` @@ -58,19 +62,48 @@ type ChangeUserStatusReq struct { Status int `json:"status" form:"status" binding:"required"` } -const LOGIN_ERR_KEY = "PaoPaoUserLoginErr" -const MAX_LOGIN_ERR_TIMES = 10 +type RequestingFriendReq struct { + UserId int64 `json:"user_id" binding:"required"` + Greetings string `json:"greetings" binding:"required"` +} + +type AddFriendReq struct { + UserId int64 `json:"user_id" binding:"required"` +} + +type RejectFriendReq struct { + UserId int64 `json:"user_id" binding:"required"` +} + +type DeleteFriendReq struct { + UserId int64 `json:"user_id"` +} + +type UserProfileResp struct { + ID int64 `json:"id"` + Nickname string `json:"nickname"` + Username string `json:"username"` + Status int `json:"status"` + Avatar string `json:"avatar"` + IsAdmin bool `json:"is_admin"` + IsFriend bool `json:"is_friend"` +} + +const ( + _LoginErrKey = "PaoPaoUserLoginErr" + _MaxLoginErrTimes = 10 +) // DoLogin 用户认证 -func DoLogin(ctx *gin.Context, param *AuthRequest) (*model.User, error) { +func DoLogin(ctx *gin.Context, param *AuthRequest) (*core.User, error) { user, err := ds.GetUserByUsername(param.Username) if err != nil { return nil, errcode.UnauthorizedAuthNotExist } if user.Model != nil && user.ID > 0 { - if errTimes, err := conf.Redis.Get(ctx, fmt.Sprintf("%s:%d", LOGIN_ERR_KEY, user.ID)).Result(); err == nil { - if convert.StrTo(errTimes).MustInt() >= MAX_LOGIN_ERR_TIMES { + if errTimes, err := conf.Redis.Get(ctx, fmt.Sprintf("%s:%d", _LoginErrKey, user.ID)).Result(); err == nil { + if convert.StrTo(errTimes).MustInt() >= _MaxLoginErrTimes { return nil, errcode.TooManyLoginError } } @@ -78,19 +111,19 @@ func DoLogin(ctx *gin.Context, param *AuthRequest) (*model.User, error) { // 对比密码是否正确 if ValidPassword(user.Password, param.Password, user.Salt) { - if user.Status == model.UserStatusClosed { + if user.Status == core.UserStatusClosed { return nil, errcode.UserHasBeenBanned } // 清空登录计数 - conf.Redis.Del(ctx, fmt.Sprintf("%s:%d", LOGIN_ERR_KEY, user.ID)) + conf.Redis.Del(ctx, fmt.Sprintf("%s:%d", _LoginErrKey, user.ID)) return user, nil } // 登录错误计数 - _, err = conf.Redis.Incr(ctx, fmt.Sprintf("%s:%d", LOGIN_ERR_KEY, user.ID)).Result() + _, err = conf.Redis.Incr(ctx, fmt.Sprintf("%s:%d", _LoginErrKey, user.ID)).Result() if err == nil { - conf.Redis.Expire(ctx, fmt.Sprintf("%s:%d", LOGIN_ERR_KEY, user.ID), time.Hour).Result() + conf.Redis.Expire(ctx, fmt.Sprintf("%s:%d", _LoginErrKey, user.ID), time.Hour).Result() } return nil, errcode.UnauthorizedAuthFailed @@ -105,8 +138,8 @@ func ValidPassword(dbPassword, password, salt string) bool { } // CheckStatus 检测用户权限 -func CheckStatus(user *model.User) bool { - return user.Status == model.UserStatusNormal +func CheckStatus(user *core.User) bool { + return user.Status == core.UserStatusNormal } // ValidUsername 验证用户 @@ -160,7 +193,7 @@ func CheckPhoneCaptcha(phone, captcha string) *errcode.Error { return errcode.ErrorPhoneCaptcha } - if c.UseTimes >= MAX_CAPTCHA_TIMES { + if c.UseTimes >= _MaxCaptchaTimes { return errcode.MaxPhoneCaptchaUseTimes } @@ -197,16 +230,16 @@ func EncryptPasswordAndSalt(password string) (string, string) { } // Register 用户注册 -func Register(username, password string) (*model.User, error) { +func Register(username, password string) (*core.User, error) { password, salt := EncryptPasswordAndSalt(password) - user := &model.User{ + user := &core.User{ Nickname: username, Username: username, Password: password, Avatar: GetRandomAvatar(), Salt: salt, - Status: model.UserStatusNormal, + Status: core.UserStatusNormal, } user, err := ds.CreateUser(user) @@ -217,8 +250,40 @@ func Register(username, password string) (*model.User, error) { return user, nil } +func RequestingFriend(user *core.User, param *RequestingFriendReq) error { + if _, err := ds.GetUserByID(param.UserId); err != nil { + return errcode.NotExistFriendId + } + return ds.RequestingFriend(user.ID, param.UserId, param.Greetings) +} + +func AddFriend(user *core.User, param *AddFriendReq) error { + if _, err := ds.GetUserByID(param.UserId); err != nil { + return errcode.NotExistFriendId + } + return ds.AddFriend(user.ID, param.UserId) +} + +func RejectFriend(user *core.User, param *RejectFriendReq) error { + if _, err := ds.GetUserByID(param.UserId); err != nil { + return errcode.NotExistFriendId + } + return ds.RejectFriend(user.ID, param.UserId) +} + +func DeleteFriend(user *core.User, param *DeleteFriendReq) error { + if _, err := ds.GetUserByID(param.UserId); err != nil { + return errcode.NotExistFriendId + } + return ds.DeleteFriend(user.ID, param.UserId) +} + +func GetContacts(user *core.User, offset int, limit int) (*core.ContactList, error) { + return ds.GetContacts(user.ID, offset, limit) +} + // GetUserInfo 获取用户信息 -func GetUserInfo(param *AuthRequest) (*model.User, error) { +func GetUserInfo(param *AuthRequest) (*core.User, error) { user, err := ds.GetUserByUsername(param.Username) if err != nil { @@ -232,7 +297,7 @@ func GetUserInfo(param *AuthRequest) (*model.User, error) { return nil, errcode.UnauthorizedAuthNotExist } -func GetUserByID(id int64) (*model.User, error) { +func GetUserByID(id int64) (*core.User, error) { user, err := ds.GetUserByID(id) if err != nil { @@ -246,29 +311,42 @@ func GetUserByID(id int64) (*model.User, error) { return nil, errcode.NoExistUsername } -func GetUserByUsername(username string) (*model.User, error) { - user, err := ds.GetUserByUsername(username) - +func GetUserByUsername(user *core.User, username string) (*UserProfileResp, error) { + other, err := ds.GetUserByUsername(username) if err != nil { return nil, err } - if user.Model != nil && user.ID > 0 { - return user, nil + var resp *UserProfileResp + if other.Model != nil && other.ID > 0 { + resp = &UserProfileResp{ + ID: other.ID, + Nickname: other.Nickname, + Username: other.Username, + Status: other.Status, + Avatar: other.Avatar, + IsAdmin: other.IsAdmin, + IsFriend: !(user == nil || user.ID == other.ID), + } + } else { + return nil, errcode.NoExistUsername } - return nil, errcode.NoExistUsername + if user != nil && user.ID != other.ID { + resp.IsFriend = ds.IsFriend(user.ID, other.ID) + } + return resp, nil } // UpdateUserInfo 更新用户信息 -func UpdateUserInfo(user *model.User) *errcode.Error { +func UpdateUserInfo(user *core.User) *errcode.Error { if err := ds.UpdateUser(user); err != nil { return errcode.ServerError } return nil } -func ChangeUserAvatar(user *model.User, avatar string) (err *errcode.Error) { +func ChangeUserAvatar(user *core.User, avatar string) (err *errcode.Error) { defer func() { if err != nil { deleteOssObjects([]string{avatar}) @@ -285,11 +363,12 @@ func ChangeUserAvatar(user *model.User, avatar string) (err *errcode.Error) { } user.Avatar = avatar - return UpdateUserInfo(user) + err = UpdateUserInfo(user) + return } // GetUserCollections 获取用户收藏列表 -func GetUserCollections(userID int64, offset, limit int) ([]*model.PostFormated, int64, error) { +func GetUserCollections(userID int64, offset, limit int) ([]*core.PostFormated, int64, error) { collections, err := ds.GetUserPostCollections(userID, offset, limit) if err != nil { return nil, 0, err @@ -298,7 +377,7 @@ func GetUserCollections(userID int64, offset, limit int) ([]*model.PostFormated, if err != nil { return nil, 0, err } - var posts []*model.Post + var posts []*core.Post for _, collection := range collections { posts = append(posts, collection.Post) } @@ -311,7 +390,7 @@ func GetUserCollections(userID int64, offset, limit int) ([]*model.PostFormated, } // GetUserStars 获取用户点赞列表 -func GetUserStars(userID int64, offset, limit int) ([]*model.PostFormated, int64, error) { +func GetUserStars(userID int64, offset, limit int) ([]*core.PostFormated, int64, error) { stars, err := ds.GetUserPostStars(userID, offset, limit) if err != nil { return nil, 0, err @@ -321,7 +400,7 @@ func GetUserStars(userID int64, offset, limit int) ([]*model.PostFormated, int64 return nil, 0, err } - var posts []*model.Post + var posts []*core.Post for _, star := range stars { posts = append(posts, star.Post) } @@ -334,7 +413,7 @@ func GetUserStars(userID int64, offset, limit int) ([]*model.PostFormated, int64 } // GetUserWalletBills 获取用户账单列表 -func GetUserWalletBills(userID int64, offset, limit int) ([]*model.WalletStatement, int64, error) { +func GetUserWalletBills(userID int64, offset, limit int) ([]*core.WalletStatement, int64, error) { bills, err := ds.GetUserWalletBills(userID, offset, limit) if err != nil { return nil, 0, err @@ -401,7 +480,7 @@ func IsFriend(userId, friendId int64) bool { } // checkPermision 检查是否拥有者或管理员 -func checkPermision(user *model.User, targetUserId int64) *errcode.Error { +func checkPermision(user *core.User, targetUserId int64) *errcode.Error { if user == nil || (user.ID != targetUserId && !user.IsAdmin) { return errcode.NoPermission } diff --git a/internal/service/wallet.go b/internal/servants/web/broker/wallet.go similarity index 69% rename from internal/service/wallet.go rename to internal/servants/web/broker/wallet.go index 0f22b23f..6f89edf8 100644 --- a/internal/service/wallet.go +++ b/internal/servants/web/broker/wallet.go @@ -1,11 +1,15 @@ -package service +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package broker import ( + "github.com/rocboss/paopao-ce/internal/core" "time" "github.com/gin-gonic/gin" "github.com/rocboss/paopao-ce/internal/conf" - "github.com/rocboss/paopao-ce/internal/model" "github.com/rocboss/paopao-ce/pkg/errcode" ) @@ -13,11 +17,11 @@ type RechargeReq struct { Amount int64 `json:"amount" form:"amount" binding:"required"` } -func GetRechargeByID(id int64) (*model.WalletRecharge, error) { +func GetRechargeByID(id int64) (*core.WalletRecharge, error) { return ds.GetRechargeByID(id) } -func CreateRecharge(userID, amount int64) (*model.WalletRecharge, error) { +func CreateRecharge(userID, amount int64) (*core.WalletRecharge, error) { return ds.CreateRecharge(userID, amount) } @@ -44,7 +48,7 @@ func FinishRecharge(ctx *gin.Context, id int64, tradeNo string) error { return nil } -func BuyPostAttachment(post *model.Post, user *model.User) error { +func BuyPostAttachment(post *core.Post, user *core.User) error { if user.Balance < post.AttachmentPrice { return errcode.InsuffientDownloadMoney } diff --git a/internal/servants/web/core.go b/internal/servants/web/core.go new file mode 100644 index 00000000..11f0cb18 --- /dev/null +++ b/internal/servants/web/core.go @@ -0,0 +1,469 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "context" + "fmt" + + "time" + "unicode/utf8" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + api "github.com/rocboss/paopao-ce/auto/api/v1" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/model/web" + "github.com/rocboss/paopao-ce/internal/servants/base" + "github.com/rocboss/paopao-ce/internal/servants/chain" + "github.com/rocboss/paopao-ce/pkg/convert" + "github.com/rocboss/paopao-ce/pkg/xerror" + "github.com/sirupsen/logrus" +) + +const ( + // _MaxWhisperNumDaily 当日单用户私信总数限制(TODO 配置化、积分兑换等) + _MaxWhisperNumDaily = 20 + _MaxCaptchaTimes = 2 +) + +var ( + _ api.Core = (*coreSrv)(nil) + _ api.CoreBinding = (*coreBinding)(nil) + _ api.CoreRender = (*coreRender)(nil) +) + +type coreSrv struct { + api.UnimplementedCoreServant + *base.DaoServant + + oss core.ObjectStorageService +} + +type coreBinding struct { + *api.UnimplementedCoreBinding +} + +type coreRender struct { + *api.UnimplementedCoreRender +} + +func (b *coreBinding) BindGetUserInfo(c *gin.Context) (*web.UserInfoReq, mir.Error) { + username, exist := base.UserNameFrom(c) + if !exist { + return nil, xerror.UnauthorizedAuthNotExist + } + return &web.UserInfoReq{ + Username: username, + }, nil +} + +func (b *coreBinding) BindGetMessages(c *gin.Context) (*web.GetMessagesReq, mir.Error) { + v, err := web.BasePageReqFrom(c) + return (*web.GetMessagesReq)(v), err +} + +func (b *coreBinding) BindGetCollections(c *gin.Context) (*web.GetCollectionsReq, mir.Error) { + v, err := web.BasePageReqFrom(c) + return (*web.GetCollectionsReq)(v), err +} + +func (b *coreBinding) BindGetStars(c *gin.Context) (*web.GetStarsReq, mir.Error) { + v, err := web.BasePageReqFrom(c) + return (*web.GetStarsReq)(v), err +} + +func (b *coreBinding) BindSuggestTags(c *gin.Context) (*web.SuggestTagsReq, mir.Error) { + return &web.SuggestTagsReq{ + Keyword: c.Query("k"), + }, nil +} + +func (b *coreBinding) BindSuggestUsers(c *gin.Context) (*web.SuggestUsersReq, mir.Error) { + return &web.SuggestUsersReq{ + Keyword: c.Query("k"), + }, nil +} + +func (b *coreBinding) BindTweetCollectionStatus(c *gin.Context) (*web.TweetCollectionStatusReq, mir.Error) { + UserId, exist := base.UserIdFrom(c) + if !exist { + return nil, xerror.UnauthorizedAuthNotExist + } + return &web.TweetCollectionStatusReq{ + SimpleInfo: web.SimpleInfo{ + Uid: UserId, + }, + TweetId: convert.StrTo(c.Query("id")).MustInt64(), + }, nil +} + +func (b *coreBinding) BindTweetStarStatus(c *gin.Context) (*web.TweetStarStatusReq, mir.Error) { + UserId, exist := base.UserIdFrom(c) + if !exist { + return nil, xerror.UnauthorizedAuthNotExist + } + return &web.TweetStarStatusReq{ + SimpleInfo: web.SimpleInfo{ + Uid: UserId, + }, + TweetId: convert.StrTo(c.Query("id")).MustInt64(), + }, nil +} + +func (s *coreSrv) Chain() gin.HandlersChain { + return gin.HandlersChain{chain.JWT()} +} + +func (s *coreSrv) SyncSearchIndex(req *web.SyncSearchIndexReq) mir.Error { + if req.User != nil && req.User.IsAdmin { + go s.PushPostsToSearch(context.Background()) + } + return nil +} + +func (s *coreSrv) GetUserInfo(req *web.UserInfoReq) (*web.UserInfoResp, mir.Error) { + user, err := s.Ds.GetUserByUsername(req.Username) + if err != nil { + return nil, xerror.UnauthorizedAuthNotExist + } + if user.Model == nil || user.ID < 0 { + return nil, xerror.UnauthorizedAuthNotExist + } + resp := &web.UserInfoResp{ + Id: user.ID, + Nickname: user.Nickname, + Username: user.Username, + Status: user.Status, + Avatar: user.Avatar, + Balance: user.Balance, + IsAdmin: user.IsAdmin, + } + if user.Phone != "" && len(user.Phone) == 11 { + resp.Phone = user.Phone[0:3] + "****" + user.Phone[7:] + } + return resp, nil +} + +func (s *coreSrv) GetUnreadMsgCount(req *web.GetUnreadMsgCountReq) (*web.GetUnreadMsgCountResp, mir.Error) { + count, err := s.Ds.GetUnreadCount(req.Uid) + if err != nil { + return nil, xerror.ServerError + } + return &web.GetUnreadMsgCountResp{ + Count: count, + }, nil +} + +func (s *coreSrv) GetMessages(req *web.GetMessagesReq) (*web.GetMessagesResp, mir.Error) { + conditions := &core.ConditionsT{ + "receiver_user_id": req.UserId, + "ORDER": "id DESC", + } + messages, err := s.Ds.GetMessages(conditions, (req.Page-1)*req.PageSize, req.PageSize) + for _, mf := range messages { + if mf.SenderUserID > 0 { + user, err := s.Ds.GetUserByID(mf.SenderUserID) + if err == nil { + mf.SenderUser = user.Format() + } + } + // 好友申请消息不需要获取其他信息 + if mf.Type == core.MsgTypeRequestingFriend { + continue + } + if mf.PostID > 0 { + post, err := s.GetTweetBy(mf.PostID) + if err == nil { + mf.Post = post + if mf.CommentID > 0 { + comment, err := s.Ds.GetCommentByID(mf.CommentID) + if err == nil { + mf.Comment = comment + if mf.ReplyID > 0 { + reply, err := s.Ds.GetCommentReplyByID(mf.ReplyID) + if err == nil { + mf.Reply = reply + } + } + } + } + } + } + } + if err != nil { + logrus.Errorf("Ds.GetMessages err: %v\n", err) + return nil, _errGetMessagesFailed + } + totalRows, _ := s.Ds.GetMessageCount(conditions) + resp := base.PageRespFrom(messages, req.Page, req.PageSize, totalRows) + return (*web.GetMessagesResp)(resp), nil +} + +func (s *coreSrv) ReadMessage(req *web.ReadMessageReq) mir.Error { + message, err := s.Ds.GetMessageByID(req.ID) + if err != nil { + return _errReadMessageFailed + } + if message.ReceiverUserID != req.Uid { + return _errNoPermission + } + if err = s.Ds.ReadMessage(message); err != nil { + logrus.Errorf("Ds.ReadMessage err: %s", err) + return _errReadMessageFailed + } + return nil +} + +func (s *coreSrv) SendUserWhisper(req *web.SendWhisperReq) mir.Error { + // 不允许发送私信给自己 + if req.Uid == req.UserID { + return _errNoWhisperToSelf + } + + // 今日频次限制 + ctx := context.Background() + whisperKey := fmt.Sprintf("WhisperTimes:%d", req.Uid) + if res, _ := s.Redis.Get(ctx, whisperKey).Result(); convert.StrTo(res).MustInt() >= _MaxWhisperNumDaily { + return _errTooManyWhisperNum + } + + // 创建私信 + _, err := s.Ds.CreateMessage(&core.Message{ + SenderUserID: req.Uid, + ReceiverUserID: req.UserID, + Type: core.MsgTypeWhisper, + Brief: "给你发送新私信了", + Content: req.Content, + }) + if err != nil { + logrus.Errorf("Ds.CreateWhisper err: %s", err) + return _errSendWhisperFailed + } + + // 写入当日(自然日)计数缓存 + s.Redis.Incr(ctx, whisperKey).Result() + currentTime := time.Now() + endTime := time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(), 23, 59, 59, 0, currentTime.Location()) + s.Redis.Expire(ctx, whisperKey, endTime.Sub(currentTime)) + + return nil +} + +func (s *coreSrv) GetCollections(req *web.GetCollectionsReq) (*web.GetCollectionsResp, mir.Error) { + collections, err := s.Ds.GetUserPostCollections(req.UserId, (req.Page-1)*req.PageSize, req.PageSize) + if err != nil { + logrus.Errorf("Ds.GetUserPostCollections err: %s", err) + return nil, _errGetCollectionsFailed + } + totalRows, err := s.Ds.GetUserPostCollectionCount(req.UserId) + if err != nil { + logrus.Errorf("Ds.GetUserPostCollectionCount err: %s", err) + return nil, _errGetCollectionsFailed + } + + var posts []*core.Post + for _, collection := range collections { + posts = append(posts, collection.Post) + } + postsFormated, err := s.Ds.MergePosts(posts) + if err != nil { + logrus.Errorf("Ds.MergePosts err: %s", err) + return nil, _errGetCollectionsFailed + } + resp := base.PageRespFrom(postsFormated, req.Page, req.PageSize, totalRows) + + return (*web.GetCollectionsResp)(resp), nil +} + +func (s *coreSrv) UserPhoneBind(req *web.UserPhoneBindReq) mir.Error { + // 手机重复性检查 + u, err := s.Ds.GetUserByPhone(req.Phone) + if err == nil && u.Model != nil && u.ID != 0 && u.ID != req.User.ID { + return _errExistedUserPhone + } + + // 如果禁止phone verify 则允许通过任意验证码 + if _EnablePhoneVerify { + c, err := s.Ds.GetLatestPhoneCaptcha(req.Phone) + if err != nil { + return _errErrorPhoneCaptcha + } + if c.Captcha != req.Captcha { + return _errErrorPhoneCaptcha + } + if c.ExpiredOn < time.Now().Unix() { + return _errErrorPhoneCaptcha + } + if c.UseTimes >= _MaxCaptchaTimes { + return _errMaxPhoneCaptchaUseTimes + } + // 更新检测次数 + s.Ds.UsePhoneCaptcha(c) + } + + // 执行绑定 + user := req.User + user.Phone = req.Phone + if err := s.Ds.UpdateUser(user); err != nil { + // TODO: 优化错误处理逻辑,失败后上面的逻辑也应该回退 + logrus.Errorf("Ds.UpdateUser err: %s", err) + return xerror.ServerError + } + return nil +} + +func (s *coreSrv) GetStars(req *web.GetStarsReq) (*web.GetStarsResp, mir.Error) { + stars, err := s.Ds.GetUserPostStars(req.UserId, (req.Page-1)*req.PageSize, req.PageSize) + if err != nil { + logrus.Errorf("Ds.GetUserPostStars err: %s", err) + return nil, _errGetStarsFailed + } + totalRows, err := s.Ds.GetUserPostStarCount(req.UserId) + if err != nil { + logrus.Errorf("Ds.GetUserPostStars err: %s", err) + return nil, _errGetStarsFailed + } + + var posts []*core.Post + for _, star := range stars { + posts = append(posts, star.Post) + } + postsFormated, err := s.Ds.MergePosts(posts) + if err != nil { + logrus.Errorf("Ds.MergePosts err: %s", err) + return nil, _errGetStarsFailed + } + resp := base.PageRespFrom(postsFormated, req.Page, req.PageSize, totalRows) + + return (*web.GetStarsResp)(resp), nil +} + +func (s *coreSrv) ChangePassword(req *web.ChangePasswordReq) mir.Error { + // 密码检查 + if err := checkPassword(req.Password); err != nil { + return err + } + // 旧密码校验 + user := req.User + if !validPassword(user.Password, req.OldPassword, req.User.Salt) { + return _errErrorOldPassword + } + // 更新入库 + user.Password, user.Salt = encryptPasswordAndSalt(req.Password) + if err := s.Ds.UpdateUser(user); err != nil { + logrus.Errorf("Ds.UpdateUser err: %s", err) + return xerror.ServerError + } + return nil +} + +func (s *coreSrv) SuggestTags(req *web.SuggestTagsReq) (*web.SuggestTagsResp, mir.Error) { + tags, err := s.Ds.GetTagsByKeyword(req.Keyword) + if err != nil { + logrus.Errorf("Ds.GetTagsByKeyword err: %s", err) + return nil, xerror.ServerError + } + resp := &web.SuggestTagsResp{} + for _, t := range tags { + resp.Suggests = append(resp.Suggests, t.Tag) + } + return resp, nil +} + +func (s *coreSrv) SuggestUsers(req *web.SuggestUsersReq) (*web.SuggestUsersResp, mir.Error) { + users, err := s.Ds.GetUsersByKeyword(req.Keyword) + if err != nil { + logrus.Errorf("Ds.GetUsersByKeyword err: %s", err) + return nil, xerror.ServerError + } + resp := &web.SuggestUsersResp{} + for _, user := range users { + resp.Suggests = append(resp.Suggests, user.Username) + } + return resp, nil +} + +func (s *coreSrv) ChangeNickname(req *web.ChangeNicknameReq) mir.Error { + if utf8.RuneCountInString(req.Nickname) < 2 || utf8.RuneCountInString(req.Nickname) > 12 { + return _errNicknameLengthLimit + } + user := req.User + user.Nickname = req.Nickname + if err := s.Ds.UpdateUser(user); err != nil { + logrus.Errorf("Ds.UpdateUser err: %s", err) + return xerror.ServerError + } + return nil +} + +func (s *coreSrv) ChangeAvatar(req *web.ChangeAvatarReq) (xerr mir.Error) { + defer func() { + if xerr != nil { + deleteOssObjects(s.oss, []string{req.Avatar}) + } + }() + + if err := s.Ds.CheckAttachment(req.Avatar); err != nil { + logrus.Errorf("Ds.CheckAttachment failed: %s", err) + return xerror.InvalidParams + } + if err := s.oss.PersistObject(s.oss.ObjectKey(req.Avatar)); err != nil { + logrus.Errorf("Ds.ChangeUserAvatar persist object failed: %s", err) + return xerror.ServerError + } + user := req.User + user.Avatar = req.Avatar + if err := s.Ds.UpdateUser(user); err != nil { + logrus.Errorf("Ds.UpdateUser failed: %s", err) + return xerror.ServerError + } + return nil +} + +func (s *coreSrv) TweetCollectionStatus(req *web.TweetCollectionStatusReq) (*web.TweetCollectionStatusResp, mir.Error) { + resp := &web.TweetCollectionStatusResp{ + Status: true, + } + if _, err := s.Ds.GetUserPostCollection(req.TweetId, req.Uid); err != nil { + resp.Status = false + return resp, nil + } + return resp, nil +} + +func (s *coreSrv) TweetStarStatus(req *web.TweetStarStatusReq) (*web.TweetStarStatusResp, mir.Error) { + resp := &web.TweetStarStatusResp{ + Status: true, + } + if _, err := s.Ds.GetUserPostStar(req.TweetId, req.Uid); err != nil { + resp.Status = false + return resp, nil + } + return resp, nil +} + +func newCoreSrv(s *base.DaoServant, oss core.ObjectStorageService) api.Core { + return &coreSrv{ + DaoServant: s, + oss: oss, + } +} + +func newCoreBinding() api.CoreBinding { + return &coreBinding{ + UnimplementedCoreBinding: &api.UnimplementedCoreBinding{ + BindAny: base.BindAny, + }, + } +} + +func newCoreRender() api.CoreRender { + return &coreRender{ + UnimplementedCoreRender: &api.UnimplementedCoreRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/servants/web/followship.go b/internal/servants/web/followship.go new file mode 100644 index 00000000..95d19ec3 --- /dev/null +++ b/internal/servants/web/followship.go @@ -0,0 +1,55 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "github.com/gin-gonic/gin" + api "github.com/rocboss/paopao-ce/auto/api/v1" + "github.com/rocboss/paopao-ce/internal/servants/base" + "github.com/rocboss/paopao-ce/internal/servants/chain" +) + +var ( + _ api.Followship = (*followshipSrv)(nil) + _ api.FollowshipBinding = (*followshipBinding)(nil) + _ api.FollowshipRender = (*followshipRender)(nil) +) + +type followshipSrv struct { + api.UnimplementedFollowshipServant + *base.DaoServant +} + +type followshipBinding struct { + *api.UnimplementedFollowshipBinding +} + +type followshipRender struct { + *api.UnimplementedFollowshipRender +} + +func (s *followshipSrv) Chain() gin.HandlersChain { + return gin.HandlersChain{chain.JWT()} +} + +func newFollowshipSrv(s *base.DaoServant) api.Followship { + return &followshipSrv{} +} + +func newFollowshipBinding() api.FollowshipBinding { + return &followshipBinding{ + UnimplementedFollowshipBinding: &api.UnimplementedFollowshipBinding{ + BindAny: base.BindAny, + }, + } +} + +func newFollowshipRender() api.FollowshipRender { + return &followshipRender{ + UnimplementedFollowshipRender: &api.UnimplementedFollowshipRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/servants/web/friendship.go b/internal/servants/web/friendship.go new file mode 100644 index 00000000..54c239ba --- /dev/null +++ b/internal/servants/web/friendship.go @@ -0,0 +1,142 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + api "github.com/rocboss/paopao-ce/auto/api/v1" + "github.com/rocboss/paopao-ce/internal/model/web" + "github.com/rocboss/paopao-ce/internal/servants/base" + "github.com/rocboss/paopao-ce/internal/servants/chain" + "github.com/rocboss/paopao-ce/pkg/xerror" + "github.com/sirupsen/logrus" +) + +var ( + _ api.Friendship = (*friendshipSrv)(nil) + _ api.FriendshipBinding = (*friendshipBinding)(nil) + _ api.FriendshipRender = (*friendshipRender)(nil) +) + +type friendshipSrv struct { + api.UnimplementedFriendshipServant + *base.DaoServant +} + +type friendshipBinding struct { + *api.UnimplementedFriendshipBinding +} + +type friendshipRender struct { + *api.UnimplementedFriendshipRender +} + +func (s *friendshipSrv) Chain() gin.HandlersChain { + return gin.HandlersChain{chain.JWT()} +} + +func (s *friendshipSrv) GetContacts(req *web.GetContactsReq) (*web.GetContactsResp, mir.Error) { + if req.User == nil { + return nil, xerror.ServerError + } + res, err := s.Ds.GetContacts(req.User.ID, (req.Page-1)*req.PageSize, req.PageSize) + if err != nil { + logrus.Errorf("service.GetContacts err: %s", err) + return nil, _errGetContactsFailed + } + resp := base.PageRespFrom(res.Contacts, req.Page, req.PageSize, res.Total) + return (*web.GetContactsResp)(resp), nil +} + +func (s *friendshipSrv) DeleteFriend(req *web.DeleteFriendReq) mir.Error { + if req.User == nil { + return xerror.ServerError + } + if req.User != nil && req.User.ID == req.UserId { + return _errNoActionToSelf + } + if _, err := s.Ds.GetUserByID(req.UserId); err != nil { + return _errNotExistFriendId + } + if err := s.Ds.DeleteFriend(req.User.ID, req.UserId); err != nil { + logrus.Errorf("Ds.DeleteFriend err: %s", err) + return _errDeleteFriendFailed + } + return nil +} + +func (s *friendshipSrv) RejectFriend(req *web.RejectFriendReq) mir.Error { + if req.User == nil { + return xerror.ServerError + } + if req.User.ID == req.UserId { + return _errNoActionToSelf + } + if _, err := s.Ds.GetUserByID(req.UserId); err != nil { + return _errNotExistFriendId + } + if err := s.Ds.RejectFriend(req.User.ID, req.UserId); err != nil { + logrus.Errorf("Ds.RejectFriend err: %s", err) + return _errRejectFriendFailed + } + return nil +} + +func (s *friendshipSrv) AddFriend(req *web.AddFriendReq) mir.Error { + if req.User == nil { + return xerror.ServerError + } + if req.User.ID == req.UserId { + return _errNoActionToSelf + } + if _, err := s.Ds.GetUserByID(req.UserId); err != nil { + return _errNotExistFriendId + } + if err := s.Ds.AddFriend(req.User.ID, req.UserId); err != nil { + logrus.Errorf("Ds.AddFriend err: %s", err) + return _errAddFriendFailed + } + return nil +} + +func (s *friendshipSrv) RequestingFriend(req *web.RequestingFriendReq) mir.Error { + if req.User == nil { + return xerror.ServerError + } + if req.User.ID == req.UserId { + return _errNoRequestingFriendToSelf + } + if _, err := s.Ds.GetUserByID(req.UserId); err != nil { + return _errNotExistFriendId + } + if err := s.Ds.RequestingFriend(req.User.ID, req.UserId, req.Greetings); err != nil { + logrus.Errorf("Ds.RequestingFriend err: %s", err) + return _errSendRequestingFriendFailed + } + return nil +} + +func newFriendshipSrv(s *base.DaoServant) api.Friendship { + return &friendshipSrv{ + DaoServant: s, + } +} + +func newFriendshipBinding() api.FriendshipBinding { + return &friendshipBinding{ + UnimplementedFriendshipBinding: &api.UnimplementedFriendshipBinding{ + BindAny: base.BindAny, + }, + } +} + +func newFriendshipRender() api.FriendshipRender { + return &friendshipRender{ + UnimplementedFriendshipRender: &api.UnimplementedFriendshipRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/servants/web/loose.go b/internal/servants/web/loose.go new file mode 100644 index 00000000..9e9b1bff --- /dev/null +++ b/internal/servants/web/loose.go @@ -0,0 +1,172 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + api "github.com/rocboss/paopao-ce/auto/api/v1" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/model/web" + "github.com/rocboss/paopao-ce/internal/servants/base" + "github.com/rocboss/paopao-ce/internal/servants/chain" + "github.com/rocboss/paopao-ce/pkg/app" + "github.com/sirupsen/logrus" +) + +var ( + _ api.Loose = (*looseSrv)(nil) + _ api.LooseBinding = (*looseBinding)(nil) + _ api.LooseRender = (*looseRender)(nil) +) + +type looseSrv struct { + api.UnimplementedLooseServant + *base.DaoServant +} + +type looseBinding struct { + *api.UnimplementedLooseBinding +} + +type looseRender struct { + *api.UnimplementedLooseRender +} + +func (s *looseBinding) BindTimeline(c *gin.Context) (*web.TimelineReq, mir.Error) { + user, _ := base.UserFrom(c) + page, pageSize := app.GetPageInfo(c) + v := &web.TimelineReq{ + BaseInfo: web.BaseInfo{ + User: user, + }, + Query: c.Query("query"), + Type: "search", + Page: page, + PageSize: pageSize, + } + if c.Query("type") == "tag" { + v.Type = "tag" + } + return v, nil +} + +func (s *looseSrv) Chain() gin.HandlersChain { + return gin.HandlersChain{chain.JwtLoose()} +} + +func (s *looseSrv) Timeline(req *web.TimelineReq) (*web.TimelineResp, mir.Error) { + var resp *base.PageResp + offset, limit := (req.Page-1)*req.PageSize, req.PageSize + if req.Query == "" && req.Type == "search" { + res, err := s.Ds.IndexPosts(req.User, offset, limit) + if err != nil { + logrus.Errorf("Ds.IndexPosts err: %s", err) + return nil, _errGetPostsFailed + } + resp = base.PageRespFrom(res.Tweets, req.Page, req.PageSize, res.Total) + } else { + q := &core.QueryReq{ + Query: req.Query, + Type: core.SearchType(req.Type), + } + res, err := s.Ts.Search(req.User, q, offset, limit) + if err != nil { + logrus.Errorf("Ts.Search err: %s", err) + return nil, _errGetPostsFailed + } + posts, err := s.Ds.RevampPosts(res.Items) + if err != nil { + logrus.Errorf("Ds.RevampPosts err: %s", err) + return nil, _errGetPostsFailed + } + resp = base.PageRespFrom(posts, req.Page, req.PageSize, res.Total) + } + return (*web.TimelineResp)(resp), nil +} + +func (s *looseSrv) GetUserTweets(req *web.GetUserTweetsReq) (*web.GetUserTweetsResp, mir.Error) { + other, xerr := s.GetUserProfile(&web.GetUserProfileReq{ + BaseInfo: req.BaseInfo, + Username: req.Username, + }) + if xerr != nil { + return nil, xerr + } + + visibilities := []core.PostVisibleT{core.PostVisitPublic} + if req.User != nil { + if req.User.ID == other.ID || req.User.IsAdmin { + visibilities = append(visibilities, core.PostVisitPrivate, core.PostVisitFriend) + } else if other.IsFriend { + visibilities = append(visibilities, core.PostVisitFriend) + } + } + conditions := &core.ConditionsT{ + "user_id": other.ID, + "visibility IN ?": visibilities, + "ORDER": "latest_replied_on DESC", + } + _, posts, err := s.GetTweetList(conditions, (req.Page-1)*req.PageSize, req.PageSize) + if err != nil { + logrus.Errorf("s.GetTweetList err: %s", err) + return nil, _errGetPostsFailed + } + totalRows, err := s.Ds.GetPostCount(conditions) + if err != nil { + logrus.Errorf("s.GetPostCount err: %s", err) + return nil, _errGetPostsFailed + } + + resp := base.PageRespFrom(posts, req.Page, req.PageSize, totalRows) + return (*web.GetUserTweetsResp)(resp), nil +} + +func (s *looseSrv) GetUserProfile(req *web.GetUserProfileReq) (*web.GetUserProfileResp, mir.Error) { + he, err := s.Ds.GetUserByUsername(req.Username) + if err != nil { + logrus.Errorf("Ds.GetUserByUsername err: %s", err) + return nil, _errNoExistUsername + } + if he.Model == nil && he.ID <= 0 { + return nil, _errNoExistUsername + } + // 设定自己不是自己的朋友 + isFriend := !(req.User == nil || req.User.ID == he.ID) + if req.User != nil && req.User.ID != he.ID { + isFriend = s.Ds.IsFriend(req.User.ID, he.ID) + } + return &web.GetUserProfileResp{ + ID: he.ID, + Nickname: he.Nickname, + Username: he.Username, + Status: he.Status, + Avatar: he.Avatar, + IsAdmin: he.IsAdmin, + IsFriend: isFriend, + }, nil +} + +func newLooseSrv(s *base.DaoServant) api.Loose { + return &looseSrv{ + DaoServant: s, + } +} + +func newLooseBinding() api.LooseBinding { + return &looseBinding{ + UnimplementedLooseBinding: &api.UnimplementedLooseBinding{ + BindAny: base.BindAny, + }, + } +} + +func newLooseRender() api.LooseRender { + return &looseRender{ + UnimplementedLooseRender: &api.UnimplementedLooseRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/servants/web/priv.go b/internal/servants/web/priv.go new file mode 100644 index 00000000..6efdf93c --- /dev/null +++ b/internal/servants/web/priv.go @@ -0,0 +1,891 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "image" + "strings" + "time" + + "github.com/alimy/mir/v3" + "github.com/disintegration/imaging" + "github.com/gin-gonic/gin" + "github.com/gofrs/uuid" + api "github.com/rocboss/paopao-ce/auto/api/v1" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/model/web" + "github.com/rocboss/paopao-ce/internal/servants/base" + "github.com/rocboss/paopao-ce/internal/servants/chain" + "github.com/rocboss/paopao-ce/pkg/convert" + "github.com/rocboss/paopao-ce/pkg/util" + "github.com/rocboss/paopao-ce/pkg/xerror" + "github.com/sirupsen/logrus" +) + +var ( + _ api.Priv = (*privSrv)(nil) + _ api.PrivBinding = (*privBinding)(nil) + _ api.PrivRender = (*privRender)(nil) + + _uploadAttachmentTypeMap = map[string]core.AttachmentType{ + "public/image": core.AttachmentTypeImage, + "public/avatar": core.AttachmentTypeImage, + "public/video": core.AttachmentTypeVideo, + "attachment": core.AttachmentTypeOther, + } +) + +type privSrv struct { + api.UnimplementedPrivServant + *base.DaoServant + + oss core.ObjectStorageService +} + +type privBinding struct { + *api.UnimplementedPrivBinding +} + +type privRender struct { + *api.UnimplementedPrivRender +} + +func (b *privBinding) BindUploadAttachment(c *gin.Context) (_ *web.UploadAttachmentReq, xerr mir.Error) { + UserId, exist := base.UserIdFrom(c) + if !exist { + return nil, xerror.UnauthorizedAuthNotExist + } + + uploadType := c.Request.FormValue("type") + file, fileHeader, err := c.Request.FormFile("file") + if err != nil { + return nil, _errFileUploadFailed + } + defer func() { + if xerr != nil { + file.Close() + } + }() + + if err := fileCheck(uploadType, fileHeader.Size); err != nil { + return nil, err + } + + contentType := fileHeader.Header.Get("Content-Type") + fileExt, xerr := getFileExt(contentType) + if xerr != nil { + return nil, xerr + } + + return &web.UploadAttachmentReq{ + SimpleInfo: web.SimpleInfo{ + Uid: UserId, + }, + UploadType: uploadType, + ContentType: contentType, + File: file, + FileSize: fileHeader.Size, + FileExt: fileExt, + }, nil +} + +func (b *privBinding) BindDownloadAttachmentPrecheck(c *gin.Context) (*web.DownloadAttachmentPrecheckReq, mir.Error) { + user, exist := base.UserFrom(c) + if !exist { + return nil, xerror.UnauthorizedAuthNotExist + } + return &web.DownloadAttachmentPrecheckReq{ + BaseInfo: web.BaseInfo{ + User: user, + }, + ContentID: convert.StrTo(c.Query("id")).MustInt64(), + }, nil +} + +func (b *privBinding) BindDownloadAttachment(c *gin.Context) (*web.DownloadAttachmentReq, mir.Error) { + user, exist := base.UserFrom(c) + if !exist { + return nil, xerror.UnauthorizedAuthNotExist + } + return &web.DownloadAttachmentReq{ + BaseInfo: web.BaseInfo{ + User: user, + }, + ContentID: convert.StrTo(c.Query("id")).MustInt64(), + }, nil +} + +func (s *privBinding) BindCreateTweet(c *gin.Context) (*web.CreateTweetReq, mir.Error) { + v := &web.CreateTweetReq{} + err := s.BindAny(c, v) + v.ClientIP = c.ClientIP() + return v, err +} + +func (s *privBinding) BindCreateCommentReply(c *gin.Context) (*web.CreateCommentReplyReq, mir.Error) { + v := &web.CreateCommentReplyReq{} + err := s.BindAny(c, v) + v.ClientIP = c.ClientIP() + return v, err +} + +func (s *privBinding) BindCreateComment(c *gin.Context) (*web.CreateCommentReq, mir.Error) { + v := &web.CreateCommentReq{} + err := s.BindAny(c, v) + v.ClientIP = c.ClientIP() + return v, err +} + +func (s *privSrv) Chain() gin.HandlersChain { + return gin.HandlersChain{chain.JWT(), chain.Priv()} +} + +func (s *privSrv) UploadAttachment(req *web.UploadAttachmentReq) (*web.UploadAttachmentResp, mir.Error) { + defer req.File.Close() + + // 生成随机路径 + randomPath := uuid.Must(uuid.NewV4()).String() + ossSavePath := req.UploadType + "/" + generatePath(randomPath[:8]) + "/" + randomPath[9:] + req.FileExt + objectUrl, err := s.oss.PutObject(ossSavePath, req.File, req.FileSize, req.ContentType, false) + if err != nil { + logrus.Errorf("oss.putObject err: %s", err) + return nil, _errFileUploadFailed + } + + // 构造附件Model + attachment := &core.Attachment{ + UserID: req.Uid, + FileSize: req.FileSize, + Content: objectUrl, + Type: _uploadAttachmentTypeMap[req.UploadType], + } + if attachment.Type == core.AttachmentTypeImage { + var src image.Image + src, err = imaging.Decode(req.File) + if err == nil { + attachment.ImgWidth, attachment.ImgHeight = getImageSize(src.Bounds()) + } + } + attachment, err = s.Ds.CreateAttachment(attachment) + if err != nil { + logrus.Errorf("Ds.CreateAttachment err: %s", err) + return nil, _errFileUploadFailed + } + + return &web.UploadAttachmentResp{ + UserID: req.Uid, + FileSize: req.FileSize, + ImgWidth: attachment.ImgWidth, + ImgHeight: attachment.ImgHeight, + Type: attachment.Type, + Content: attachment.Content, + }, nil +} + +func (s *privSrv) DownloadAttachmentPrecheck(req *web.DownloadAttachmentPrecheckReq) (*web.DownloadAttachmentPrecheckResp, mir.Error) { + content, err := s.Ds.GetPostContentByID(req.ContentID) + if err != nil { + logrus.Errorf("Ds.GetPostContentByID err: %s", err) + return nil, _errInvalidDownloadReq + } + resp := &web.DownloadAttachmentPrecheckResp{Paid: true} + if content.Type == core.ContentTypeChargeAttachment { + tweet, err := s.GetTweetBy(content.PostID) + if err != nil { + logrus.Errorf("get tweet err: %v", err) + return nil, _errInvalidDownloadReq + } + // 发布者或管理员免费下载 + if tweet.UserID == req.User.ID || req.User.IsAdmin { + return resp, nil + } + // 检测是否有购买记录 + resp.Paid = s.checkPostAttachmentIsPaid(req.ContentID, req.User.ID) + } + return resp, nil +} + +func (s *privSrv) DownloadAttachment(req *web.DownloadAttachmentReq) (*web.DownloadAttachmentResp, mir.Error) { + content, err := s.Ds.GetPostContentByID(req.ContentID) + if err != nil { + logrus.Errorf("s.GetPostContentByID err: %v", err) + return nil, _errInvalidDownloadReq + } + // 收费附件 + if content.Type == core.ContentTypeChargeAttachment { + post, err := s.GetTweetBy(content.PostID) + if err != nil { + logrus.Errorf("s.GetTweetBy err: %v", err) + return nil, xerror.ServerError + } + paidFlag := false + // 发布者或管理员免费下载 或者 检测是否有购买记录 + if post.UserID == req.User.ID || req.User.IsAdmin || s.checkPostAttachmentIsPaid(post.ID, req.User.ID) { + paidFlag = true + } + // 未购买,则尝试购买 + if !paidFlag { + err := s.buyPostAttachment(&core.Post{ + Model: &core.Model{ + ID: post.ID, + }, + UserID: post.UserID, + AttachmentPrice: post.AttachmentPrice, + }, req.User) + if err != nil { + return nil, err + } + } + } + // 签发附件下载链接 + objectKey := s.oss.ObjectKey(content.Content) + signedURL, err := s.oss.SignURL(objectKey, 60) + if err != nil { + logrus.Errorf("client.SignURL err: %v", err) + return nil, _errDownloadReqError + } + return &web.DownloadAttachmentResp{ + SignedURL: signedURL, + }, nil +} + +func (s *privSrv) CreateTweet(req *web.CreateTweetReq) (_ *web.CreateTweetResp, xerr mir.Error) { + var mediaContents []string + defer func() { + if xerr != nil { + deleteOssObjects(s.oss, mediaContents) + } + }() + + contents, err := persistMediaContents(s.oss, req.Contents) + if err != nil { + return nil, _errCreatePostFailed + } + mediaContents = contents + tags := tagsFrom(req.Tags) + post := &core.Post{ + UserID: req.User.ID, + Tags: strings.Join(tags, ","), + IP: req.ClientIP, + IPLoc: util.GetIPLoc(req.ClientIP), + AttachmentPrice: req.AttachmentPrice, + Visibility: req.Visibility, + } + post, err = s.Ds.CreatePost(post) + if err != nil { + logrus.Errorf("Ds.CreatePost err: %s", err) + return nil, _errCreatePostFailed + } + + // 创建推文内容 + for _, item := range req.Contents { + if err := item.Check(s.Ds); err != nil { + // 属性非法 + logrus.Infof("contents check err: %s", err) + continue + } + if item.Type == core.ContentTypeAttachment && req.AttachmentPrice > 0 { + item.Type = core.ContentTypeChargeAttachment + } + postContent := &core.PostContent{ + PostID: post.ID, + UserID: req.User.ID, + Content: item.Content, + Type: item.Type, + Sort: item.Sort, + } + if _, err = s.Ds.CreatePostContent(postContent); err != nil { + logrus.Infof("Ds.CreatePostContent err: %s", err) + return nil, _errCreateCommentFailed + } + } + + // 私密推文不创建标签与用户提醒 + if post.Visibility != core.PostVisitPrivate { + // 创建标签 + for _, t := range tags { + tag := &core.Tag{ + UserID: req.User.ID, + Tag: t, + } + s.Ds.CreateTag(tag) + } + + // 创建用户消息提醒 + for _, u := range req.Users { + user, err := s.Ds.GetUserByUsername(u) + if err != nil || user.ID == req.User.ID { + continue + } + + // 创建消息提醒 + // TODO: 优化消息提醒处理机制 + go s.Ds.CreateMessage(&core.Message{ + SenderUserID: req.User.ID, + ReceiverUserID: user.ID, + Type: core.MsgTypePost, + Brief: "在新发布的泡泡动态中@了你", + PostID: post.ID, + }) + } + } + // 推送Search + s.PushPostToSearch(post) + formatedPosts, err := s.Ds.RevampPosts([]*core.PostFormated{post.Format()}) + if err != nil { + logrus.Infof("Ds.RevampPosts err: %s", err) + return nil, _errCreatePostFailed + } + return (*web.CreateTweetResp)(formatedPosts[0]), nil +} + +func (s *privSrv) DeleteTweet(req *web.DeleteTweetReq) mir.Error { + if req.User == nil { + return _errNoPermission + } + post, err := s.Ds.GetPostByID(req.ID) + if err != nil { + logrus.Errorf("Ds.GetPostByID err: %s", err) + return _errGetPostFailed + } + if post.UserID != req.User.ID && !req.User.IsAdmin { + return _errNoPermission + } + mediaContents, err := s.Ds.DeletePost(post) + if err != nil { + logrus.Errorf("Ds.DeletePost delete post failed: %s", err) + return _errDeletePostFailed + } + // 删除推文的媒体内容 + deleteOssObjects(s.oss, mediaContents) + // 删除索引 + s.DeleteSearchPost(post) + if err != nil { + logrus.Errorf("s.DeleteSearchPost failed: %s", err) + return _errDeletePostFailed + } + return nil +} + +func (s *privSrv) DeleteCommentReply(req *web.DeleteCommentReplyReq) mir.Error { + reply, err := s.Ds.GetCommentReplyByID(req.ID) + if err != nil { + logrus.Errorf("Ds.GetCommentReplyByID err: %s", err) + return _errGetReplyFailed + } + if req.User.ID != reply.UserID && !req.User.IsAdmin { + return _errNoPermission + } + // 执行删除 + err = s.deletePostCommentReply(reply) + if err != nil { + logrus.Errorf("s.deletePostCommentReply err: %s", err) + return _errDeleteCommentFailed + } + return nil +} + +func (s *privSrv) CreateCommentReply(req *web.CreateCommentReplyReq) (*web.CreateCommentReplyResp, mir.Error) { + var ( + post *core.Post + comment *core.Comment + atUserID int64 + err error + ) + + if post, comment, atUserID, err = s.createPostPreHandler(req.CommentID, req.Uid, req.AtUserID); err != nil { + return nil, _errCreateReplyFailed + } + + // 创建评论 + reply := &core.CommentReply{ + CommentID: req.CommentID, + UserID: req.Uid, + Content: req.Content, + AtUserID: atUserID, + IP: req.ClientIP, + IPLoc: util.GetIPLoc(req.ClientIP), + } + + reply, err = s.Ds.CreateCommentReply(reply) + if err != nil { + return nil, _errCreateReplyFailed + } + + // 更新Post回复数 + post.CommentCount++ + post.LatestRepliedOn = time.Now().Unix() + s.Ds.UpdatePost(post) + + // 更新索引 + s.PushPostToSearch(post) + + // 创建用户消息提醒 + commentMaster, err := s.Ds.GetUserByID(comment.UserID) + if err == nil && commentMaster.ID != req.Uid { + go s.Ds.CreateMessage(&core.Message{ + SenderUserID: req.Uid, + ReceiverUserID: commentMaster.ID, + Type: core.MsgTypeReply, + Brief: "在泡泡评论下回复了你", + PostID: post.ID, + CommentID: comment.ID, + ReplyID: reply.ID, + }) + } + postMaster, err := s.Ds.GetUserByID(post.UserID) + if err == nil && postMaster.ID != req.Uid && commentMaster.ID != postMaster.ID { + go s.Ds.CreateMessage(&core.Message{ + SenderUserID: req.Uid, + ReceiverUserID: postMaster.ID, + Type: core.MsgTypeReply, + Brief: "在泡泡评论下发布了新回复", + PostID: post.ID, + CommentID: comment.ID, + ReplyID: reply.ID, + }) + } + if atUserID > 0 { + user, err := s.Ds.GetUserByID(atUserID) + if err == nil && user.ID != req.Uid && commentMaster.ID != user.ID && postMaster.ID != user.ID { + // 创建消息提醒 + go s.Ds.CreateMessage(&core.Message{ + SenderUserID: req.Uid, + ReceiverUserID: user.ID, + Type: core.MsgTypeReply, + Brief: "在泡泡评论的回复中@了你", + PostID: post.ID, + CommentID: comment.ID, + ReplyID: reply.ID, + }) + } + } + return (*web.CreateCommentReplyResp)(reply), nil +} + +func (s *privSrv) DeleteComment(req *web.DeleteCommentReq) mir.Error { + comment, err := s.Ds.GetCommentByID(req.ID) + if err != nil { + logrus.Errorf("Ds.GetCommentByID err: %v\n", err) + return _errGetCommentFailed + } + if req.User.ID != comment.UserID && !req.User.IsAdmin { + return _errNoPermission + } + // 加载post + post, err := s.Ds.GetPostByID(comment.PostID) + if err != nil { + return _errDeleteCommentFailed + } + // 更新post回复数 + post.CommentCount-- + if err := s.Ds.UpdatePost(post); err != nil { + logrus.Errorf("Ds.UpdatePost err: %s", err) + return _errDeleteCommentFailed + } + // TODO: 优化删除逻辑,事务化删除comment + if err := s.Ds.DeleteComment(comment); err != nil { + logrus.Errorf("Ds.DeleteComment err: %s", err) + return _errDeleteCommentFailed + } + return nil +} + +func (s *privSrv) CreateComment(req *web.CreateCommentReq) (_ *web.CreateCommentResp, xerr mir.Error) { + var ( + mediaContents []string + err error + ) + defer func() { + if xerr != nil { + deleteOssObjects(s.oss, mediaContents) + } + }() + + if mediaContents, err = persistMediaContents(s.oss, req.Contents); err != nil { + return nil, xerror.ServerError + } + + // 加载Post + post, err := s.Ds.GetPostByID(req.PostID) + if err != nil { + logrus.Errorf("Ds.GetPostByID err:%s", err) + return nil, xerror.ServerError + } + if post.CommentCount >= conf.AppSetting.MaxCommentCount { + return nil, _errMaxCommentCount + } + comment := &core.Comment{ + PostID: post.ID, + UserID: req.Uid, + IP: req.ClientIP, + IPLoc: util.GetIPLoc(req.ClientIP), + } + comment, err = s.Ds.CreateComment(comment) + if err != nil { + logrus.Errorf("Ds.CreateComment err:%s", err) + return nil, _errCreateCommentFailed + } + + for _, item := range req.Contents { + // 检查附件是否是本站资源 + if item.Type == core.ContentTypeImage || item.Type == core.ContentTypeVideo || item.Type == core.ContentTypeAttachment { + if err := s.Ds.CheckAttachment(item.Content); err != nil { + continue + } + } + postContent := &core.CommentContent{ + CommentID: comment.ID, + UserID: req.Uid, + Content: item.Content, + Type: item.Type, + Sort: item.Sort, + } + s.Ds.CreateCommentContent(postContent) + } + + // 更新Post回复数 + post.CommentCount++ + post.LatestRepliedOn = time.Now().Unix() + s.Ds.UpdatePost(post) + + // 更新索引 + s.PushPostToSearch(post) + + // 创建用户消息提醒 + postMaster, err := s.Ds.GetUserByID(post.UserID) + if err == nil && postMaster.ID != req.Uid { + go s.Ds.CreateMessage(&core.Message{ + SenderUserID: req.Uid, + ReceiverUserID: postMaster.ID, + Type: core.MsgtypeComment, + Brief: "在泡泡中评论了你", + PostID: post.ID, + CommentID: comment.ID, + }) + } + for _, u := range req.Users { + user, err := s.Ds.GetUserByUsername(u) + if err != nil || user.ID == req.Uid || user.ID == postMaster.ID { + continue + } + + // 创建消息提醒 + go s.Ds.CreateMessage(&core.Message{ + SenderUserID: req.Uid, + ReceiverUserID: user.ID, + Type: core.MsgtypeComment, + Brief: "在泡泡评论中@了你", + PostID: post.ID, + CommentID: comment.ID, + }) + } + + return (*web.CreateCommentResp)(comment), nil +} + +func (s *privSrv) CollectionTweet(req *web.CollectionTweetReq) (*web.CollectionTweetResp, mir.Error) { + status := false + collection, err := s.Ds.GetUserPostCollection(req.ID, req.Uid) + if err != nil { + // 创建Star + if _, xerr := s.createPostCollection(req.ID, req.Uid); xerr != nil { + return nil, xerr + } + status = true + } else { + // 取消Star + if xerr := s.deletePostCollection(collection); xerr != nil { + return nil, xerr + } + } + return &web.CollectionTweetResp{ + Status: status, + }, nil +} + +func (s *privSrv) StarTweet(req *web.StarTweetReq) (*web.StarTweetResp, mir.Error) { + status := false + star, err := s.Ds.GetUserPostStar(req.ID, req.Uid) + if err != nil { + // 创建Star + if _, xerr := s.createPostStar(req.ID, req.Uid); xerr != nil { + return nil, xerr + } + status = true + } else { + // 取消Star + if xerr := s.deletePostStar(star); xerr != nil { + return nil, xerr + } + } + return &web.StarTweetResp{ + Status: status, + }, nil +} + +func (s *privSrv) VisibleTweet(req *web.VisibleTweetReq) (*web.VisibleTweetResp, mir.Error) { + if req.Visibility >= core.PostVisitInvalid { + return nil, xerror.InvalidParams + } + post, err := s.Ds.GetPostByID(req.ID) + if err != nil { + return nil, _errVisblePostFailed + } + if xerr := checkPermision(req.User, post.UserID); xerr != nil { + return nil, xerr + } + if err = s.Ds.VisiblePost(post, req.Visibility); err != nil { + logrus.Warnf("s.Ds.VisiblePost: %s", err) + return nil, _errVisblePostFailed + } + + // 推送Search + post.Visibility = req.Visibility + s.PushPostToSearch(post) + + return &web.VisibleTweetResp{ + Visibility: req.Visibility, + }, nil +} + +func (s *privSrv) StickTweet(req *web.StickTweetReq) (*web.StickTweetResp, mir.Error) { + post, err := s.Ds.GetPostByID(req.ID) + if err != nil { + logrus.Errorf("Ds.GetPostByID err: %v\n", err) + return nil, _errStickPostFailed + } + if !req.User.IsAdmin { + return nil, _errNoPermission + } + newStatus := 1 - post.IsTop + if err = s.Ds.StickPost(post); err != nil { + return nil, _errStickPostFailed + } + return &web.StickTweetResp{ + StickStatus: newStatus, + }, nil +} + +func (s *privSrv) LockTweet(req *web.LockTweetReq) (*web.LockTweetResp, mir.Error) { + post, err := s.Ds.GetPostByID(req.ID) + if err != nil { + return nil, _errLockPostFailed + } + if post.UserID != req.User.ID && !req.User.IsAdmin { + return nil, _errNoPermission + } + newStatus := 1 - post.IsLock + if err := s.Ds.LockPost(post); err != nil { + return nil, _errLockPostFailed + } + return &web.LockTweetResp{ + LockStatus: newStatus, + }, nil +} + +func (s *privSrv) deletePostCommentReply(reply *core.CommentReply) error { + err := s.Ds.DeleteCommentReply(reply) + if err != nil { + return err + } + // 加载Comment + comment, err := s.Ds.GetCommentByID(reply.CommentID) + if err != nil { + return err + } + // 加载comment的post + post, err := s.Ds.GetPostByID(comment.PostID) + if err != nil { + return err + } + // 更新Post回复数 + post.CommentCount-- + post.LatestRepliedOn = time.Now().Unix() + s.Ds.UpdatePost(post) + // 更新索引 + s.PushPostToSearch(post) + return nil +} + +func (s *privSrv) createPostPreHandler(commentID int64, userID, atUserID int64) (*core.Post, *core.Comment, int64, + error) { + // 加载Comment + comment, err := s.Ds.GetCommentByID(commentID) + if err != nil { + return nil, nil, atUserID, err + } + + // 加载comment的post + post, err := s.Ds.GetPostByID(comment.PostID) + if err != nil { + return nil, nil, atUserID, err + } + + if post.CommentCount >= conf.AppSetting.MaxCommentCount { + return nil, nil, atUserID, _errMaxCommentCount + } + + if userID == atUserID { + atUserID = 0 + } + + if atUserID > 0 { + // 检测目前用户是否存在 + users, _ := s.Ds.GetUsersByIDs([]int64{atUserID}) + if len(users) == 0 { + atUserID = 0 + } + } + + return post, comment, atUserID, nil +} + +func (s *privSrv) createPostStar(postID, userID int64) (*core.PostStar, mir.Error) { + // 加载Post + post, err := s.Ds.GetPostByID(postID) + if err != nil { + return nil, xerror.ServerError + } + + // 私密post不可操作 + if post.Visibility == core.PostVisitPrivate { + return nil, _errNoPermission + } + + star, err := s.Ds.CreatePostStar(postID, userID) + if err != nil { + return nil, xerror.ServerError + } + + // 更新Post点赞数 + post.UpvoteCount++ + s.Ds.UpdatePost(post) + + // 更新索引 + s.PushPostToSearch(post) + + return star, nil +} + +func (s *privSrv) deletePostStar(star *core.PostStar) mir.Error { + err := s.Ds.DeletePostStar(star) + if err != nil { + return xerror.ServerError + } + // 加载Post + post, err := s.Ds.GetPostByID(star.PostID) + if err != nil { + return xerror.ServerError + } + + // 私密post不可操作 + if post.Visibility == core.PostVisitPrivate { + return _errNoPermission + } + + // 更新Post点赞数 + post.UpvoteCount-- + s.Ds.UpdatePost(post) + + // 更新索引 + s.PushPostToSearch(post) + + return nil +} + +func (s *privSrv) createPostCollection(postID, userID int64) (*core.PostCollection, mir.Error) { + // 加载Post + post, err := s.Ds.GetPostByID(postID) + if err != nil { + return nil, xerror.ServerError + } + + // 私密post不可操作 + if post.Visibility == core.PostVisitPrivate { + return nil, _errNoPermission + } + + collection, err := s.Ds.CreatePostCollection(postID, userID) + if err != nil { + return nil, xerror.ServerError + } + + // 更新Post点赞数 + post.CollectionCount++ + s.Ds.UpdatePost(post) + + // 更新索引 + s.PushPostToSearch(post) + + return collection, nil +} + +func (s *privSrv) deletePostCollection(collection *core.PostCollection) mir.Error { + err := s.Ds.DeletePostCollection(collection) + if err != nil { + return xerror.ServerError + } + // 加载Post + post, err := s.Ds.GetPostByID(collection.PostID) + if err != nil { + return xerror.ServerError + } + + // 私密post不可操作 + if post.Visibility == core.PostVisitPrivate { + return _errNoPermission + } + + // 更新Post点赞数 + post.CollectionCount-- + s.Ds.UpdatePost(post) + + // 更新索引 + s.PushPostToSearch(post) + + return nil +} + +func (s *privSrv) checkPostAttachmentIsPaid(postID, userID int64) bool { + bill, err := s.Ds.GetPostAttatchmentBill(postID, userID) + return err == nil && bill.Model != nil && bill.ID > 0 +} + +func (s *privSrv) buyPostAttachment(post *core.Post, user *core.User) mir.Error { + if user.Balance < post.AttachmentPrice { + return _errInsuffientDownloadMoney + } + // 执行购买 + if err := s.Ds.HandlePostAttachmentBought(post, user); err != nil { + logrus.Errorf("Ds.HandlePostAttachmentBought err: %s", err) + return xerror.ServerError + } + return nil +} + +func newPrivSrv(s *base.DaoServant, oss core.ObjectStorageService) api.Priv { + return &privSrv{ + DaoServant: s, + oss: oss, + } +} + +func newPrivBinding() api.PrivBinding { + return &privBinding{ + UnimplementedPrivBinding: &api.UnimplementedPrivBinding{ + BindAny: base.BindAny, + }, + } +} + +func newPrivRender() api.PrivRender { + return &privRender{ + UnimplementedPrivRender: &api.UnimplementedPrivRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/servants/web/pub.go b/internal/servants/web/pub.go new file mode 100644 index 00000000..58d49ee9 --- /dev/null +++ b/internal/servants/web/pub.go @@ -0,0 +1,372 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "bytes" + "context" + "encoding/base64" + "fmt" + "image/color" + "image/png" + "regexp" + "time" + "unicode/utf8" + + "github.com/afocus/captcha" + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" + "github.com/gofrs/uuid" + api "github.com/rocboss/paopao-ce/auto/api/v1" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/model/web" + "github.com/rocboss/paopao-ce/internal/servants/base" + "github.com/rocboss/paopao-ce/internal/servants/web/assets" + "github.com/rocboss/paopao-ce/pkg/app" + "github.com/rocboss/paopao-ce/pkg/convert" + "github.com/rocboss/paopao-ce/pkg/debug" + "github.com/rocboss/paopao-ce/pkg/util" + "github.com/rocboss/paopao-ce/pkg/xerror" + "github.com/sirupsen/logrus" +) + +var ( + _ api.Pub = (*pubSrv)(nil) + _ api.PubBinding = (*pubBinding)(nil) + _ api.PubRender = (*pubRender)(nil) +) + +const ( + _LoginErrKey = "PaoPaoUserLoginErr" + _MaxLoginErrTimes = 10 + _MaxPhoneCaptcha = 10 +) + +type pubSrv struct { + api.UnimplementedPubServant + *base.DaoServant +} + +type pubBinding struct { + *api.UnimplementedPubBinding +} + +type pubRender struct { + *api.UnimplementedPubRender +} + +func (b *pubBinding) BindTweetComments(c *gin.Context) (*web.TweetCommentsReq, mir.Error) { + tweetId := convert.StrTo(c.Query("id")).MustInt64() + page, pageSize := app.GetPageInfo(c) + return &web.TweetCommentsReq{ + TweetId: tweetId, + Page: page, + PageSize: pageSize, + }, nil + +} + +func (s *pubSrv) TopicList(req *web.TopicListReq) (*web.TopicListResp, mir.Error) { + // tags, err := broker.GetPostTags(¶m) + num := req.Num + if num > conf.AppSetting.MaxPageSize { + num = conf.AppSetting.MaxPageSize + } + + conditions := &core.ConditionsT{} + if req.Type == web.TagTypeHot { + // 热门标签 + conditions = &core.ConditionsT{ + "ORDER": "quote_num DESC", + } + } else if req.Type == web.TagTypeNew { + // 热门标签 + conditions = &core.ConditionsT{ + "ORDER": "id DESC", + } + } + tags, err := s.Ds.GetTags(conditions, 0, num) + if err != nil { + return nil, _errGetPostTagsFailed + } + // 获取创建者User IDs + userIds := []int64{} + for _, tag := range tags { + userIds = append(userIds, tag.UserID) + } + users, _ := s.Ds.GetUsersByIDs(userIds) + tagsFormated := []*core.TagFormated{} + for _, tag := range tags { + tagFormated := tag.Format() + for _, user := range users { + if user.ID == tagFormated.UserID { + tagFormated.User = user.Format() + } + } + tagsFormated = append(tagsFormated, tagFormated) + } + return &web.TopicListResp{ + Topics: tagsFormated, + }, nil +} + +func (s *pubSrv) TweetComments(req *web.TweetCommentsReq) (*web.TweetCommentsResp, mir.Error) { + conditions := &core.ConditionsT{ + "post_id": req.TweetId, + "ORDER": "id ASC", + } + + comments, err := s.Ds.GetComments(conditions, (req.Page-1)*req.PageSize, req.PageSize) + if err != nil { + return nil, _errGetCommentsFailed + } + + userIDs := []int64{} + commentIDs := []int64{} + for _, comment := range comments { + userIDs = append(userIDs, comment.UserID) + commentIDs = append(commentIDs, comment.ID) + } + + users, err := s.Ds.GetUsersByIDs(userIDs) + if err != nil { + return nil, _errGetCommentsFailed + } + + contents, err := s.Ds.GetCommentContentsByIDs(commentIDs) + if err != nil { + return nil, _errGetCommentsFailed + } + + replies, err := s.Ds.GetCommentRepliesByID(commentIDs) + if err != nil { + return nil, _errGetCommentsFailed + } + + commentsFormated := []*core.CommentFormated{} + for _, comment := range comments { + commentFormated := comment.Format() + for _, content := range contents { + if content.CommentID == comment.ID { + commentFormated.Contents = append(commentFormated.Contents, content) + } + } + for _, reply := range replies { + if reply.CommentID == commentFormated.ID { + commentFormated.Replies = append(commentFormated.Replies, reply) + } + } + for _, user := range users { + if user.ID == comment.UserID { + commentFormated.User = user.Format() + } + } + commentsFormated = append(commentsFormated, commentFormated) + } + + // 获取总量 + totalRows, _ := s.Ds.GetCommentCount(conditions) + resp := base.PageRespFrom(commentsFormated, req.Page, req.PageSize, totalRows) + return (*web.TweetCommentsResp)(resp), nil +} + +func (s *pubSrv) TweetDetail(req *web.TweetDetailReq) (*web.TweetDetailResp, mir.Error) { + post, err := s.Ds.GetPostByID(req.TweetId) + if err != nil { + return nil, _errGetPostFailed + } + postContents, err := s.Ds.GetPostContentsByIDs([]int64{post.ID}) + if err != nil { + return nil, _errGetPostFailed + } + users, err := s.Ds.GetUsersByIDs([]int64{post.UserID}) + if err != nil { + return nil, _errGetPostFailed + } + // 数据整合 + postFormated := post.Format() + for _, user := range users { + postFormated.User = user.Format() + } + for _, content := range postContents { + if content.PostID == post.ID { + postFormated.Contents = append(postFormated.Contents, content.Format()) + } + } + return (*web.TweetDetailResp)(postFormated), nil +} + +func (s *pubSrv) SendCaptcha(req *web.SendCaptchaReq) mir.Error { + ctx := context.Background() + + // 验证图片验证码 + if res, err := s.Redis.Get(ctx, "PaoPaoCaptcha:"+req.ImgCaptchaID).Result(); err != nil || res != req.ImgCaptcha { + logrus.Debugf("get captcha err:%s expect:%s got:%s", err, res, req.ImgCaptcha) + return _errErrorCaptchaPassword + } + s.Redis.Del(ctx, "PaoPaoCaptcha:"+req.ImgCaptchaID).Result() + + // 今日频次限制 + if res, _ := s.Redis.Get(ctx, "PaoPaoSmsCaptcha:"+req.Phone).Result(); convert.StrTo(res).MustInt() >= _MaxPhoneCaptcha { + return _errTooManyPhoneCaptchaSend + } + + if err := s.Ds.SendPhoneCaptcha(req.Phone); err != nil { + return xerror.ServerError + } + // 写入计数缓存 + s.Redis.Incr(ctx, "PaoPaoSmsCaptcha:"+req.Phone).Result() + currentTime := time.Now() + endTime := time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(), 23, 59, 59, 0, currentTime.Location()) + s.Redis.Expire(ctx, "PaoPaoSmsCaptcha:"+req.Phone, endTime.Sub(currentTime)) + + return nil +} + +func (s *pubSrv) GetCaptcha() (*web.GetCaptchaResp, mir.Error) { + cap := captcha.New() + if err := cap.AddFontFromBytes(assets.ComicBytes); err != nil { + logrus.Errorf("cap.AddFontFromBytes err:%s", err) + return nil, xerror.ServerError + } + cap.SetSize(160, 64) + cap.SetDisturbance(captcha.MEDIUM) + cap.SetFrontColor(color.RGBA{0, 0, 0, 255}) + cap.SetBkgColor(color.RGBA{218, 240, 228, 255}) + img, password := cap.Create(6, captcha.NUM) + emptyBuff := bytes.NewBuffer(nil) + if err := png.Encode(emptyBuff, img); err != nil { + logrus.Errorf("png.Encode err:%s", err) + return nil, xerror.ServerError + } + key := util.EncodeMD5(uuid.Must(uuid.NewV4()).String()) + // 五分钟有效期 + s.Redis.SetEX(context.Background(), "PaoPaoCaptcha:"+key, password, time.Minute*5) + return &web.GetCaptchaResp{ + Id: key, + Content: "data:image/png;base64," + base64.StdEncoding.EncodeToString(emptyBuff.Bytes()), + }, nil +} + +func (s *pubSrv) Register(req *web.RegisterReq) (*web.RegisterResp, mir.Error) { + // 用户名检查 + if err := s.validUsername(req.Username); err != nil { + return nil, err + } + // 密码检查 + if err := checkPassword(req.Password); err != nil { + logrus.Errorf("scheckPassword err: %v", err) + return nil, _errUserRegisterFailed + } + password, salt := encryptPasswordAndSalt(req.Password) + user := &core.User{ + Nickname: req.Username, + Username: req.Username, + Password: password, + Avatar: getRandomAvatar(), + Salt: salt, + Status: core.UserStatusNormal, + } + user, err := s.Ds.CreateUser(user) + if err != nil { + logrus.Errorf("Ds.CreateUser err: %s", err) + return nil, _errUserRegisterFailed + } + return &web.RegisterResp{ + UserId: user.ID, + Username: user.Username, + }, nil +} + +func (s *pubSrv) Login(req *web.LoginReq) (*web.LoginResp, mir.Error) { + ctx := context.Background() + user, err := s.Ds.GetUserByUsername(req.Username) + if err != nil { + logrus.Errorf("Ds.GetUserByUsername err:%s", err) + return nil, xerror.UnauthorizedAuthNotExist + } + + if user.Model != nil && user.ID > 0 { + if errTimes, err := s.Redis.Get(ctx, fmt.Sprintf("%s:%d", _LoginErrKey, user.ID)).Result(); err == nil { + if convert.StrTo(errTimes).MustInt() >= _MaxLoginErrTimes { + return nil, _errTooManyLoginError + } + } + // 对比密码是否正确 + if validPassword(user.Password, req.Password, user.Salt) { + if user.Status == core.UserStatusClosed { + return nil, _errUserHasBeenBanned + } + // 清空登录计数 + s.Redis.Del(ctx, fmt.Sprintf("%s:%d", _LoginErrKey, user.ID)) + } else { + // 登录错误计数 + _, err = s.Redis.Incr(ctx, fmt.Sprintf("%s:%d", _LoginErrKey, user.ID)).Result() + if err == nil { + s.Redis.Expire(ctx, fmt.Sprintf("%s:%d", _LoginErrKey, user.ID), time.Hour).Result() + } + return nil, xerror.UnauthorizedAuthFailed + } + } else { + return nil, xerror.UnauthorizedAuthNotExist + } + + token, err := app.GenerateToken(user) + if err != nil { + logrus.Errorf("app.GenerateToken err: %v", err) + return nil, xerror.UnauthorizedTokenGenerate + } + return &web.LoginResp{ + Token: token, + }, nil +} + +func (s *pubSrv) Version() (*web.VersionResp, mir.Error) { + return &web.VersionResp{ + BuildInfo: debug.ReadBuildInfo(), + }, nil +} + +// validUsername 验证用户 +func (s *pubSrv) validUsername(username string) mir.Error { + // 检测用户是否合规 + if utf8.RuneCountInString(username) < 3 || utf8.RuneCountInString(username) > 12 { + return _errUsernameLengthLimit + } + + if !regexp.MustCompile(`^[a-zA-Z0-9]+$`).MatchString(username) { + return _errUsernameCharLimit + } + + // 重复检查 + user, _ := s.Ds.GetUserByUsername(username) + if user.Model != nil && user.ID > 0 { + return _errUsernameHasExisted + } + return nil +} + +func newPubSrv(s *base.DaoServant) api.Pub { + return &pubSrv{ + DaoServant: s, + } +} + +func newPubBinding() api.PubBinding { + return &pubBinding{ + UnimplementedPubBinding: &api.UnimplementedPubBinding{ + BindAny: base.BindAny, + }, + } +} + +func newPubRender() api.PubRender { + return &pubRender{ + UnimplementedPubRender: &api.UnimplementedPubRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/servants/web/routers/api/api.go b/internal/servants/web/routers/api/api.go new file mode 100644 index 00000000..656ad0bf --- /dev/null +++ b/internal/servants/web/routers/api/api.go @@ -0,0 +1,49 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package api + +import ( + "github.com/alimy/cfg" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/dao" + "github.com/sirupsen/logrus" + "github.com/smartwalle/alipay/v3" +) + +var ( + alipayClient *alipay.Client + objectStorage core.ObjectStorageService +) + +func Initialize() { + objectStorage = dao.ObjectStorageService() + + if cfg.If("Alipay") { + alipayClient = mustAlipayClient() + } +} + +func mustAlipayClient() *alipay.Client { + s := conf.AlipaySetting + // 将 key 的验证调整到初始化阶段 + client, err := alipay.New(s.AppID, s.PrivateKey, s.InProduction) + if err != nil { + logrus.Fatalf("alipay.New err: %s", err) + } + // 加载应用公钥证书 + if err = client.LoadAppPublicCertFromFile(s.AppPublicCertFile); err != nil { + logrus.Fatalf("client.LoadAppPublicCertFromFile err: %s\n", err) + } + // 加载支付宝根证书 + if err = client.LoadAliPayRootCertFromFile(s.RootCertFile); err != nil { + logrus.Fatalf("client.LoadAliPayRootCertFromFile err: %s\n", err) + } + // 加载支付宝公钥证书 + if err = client.LoadAliPayPublicCertFromFile(s.PublicCertFile); err != nil { + logrus.Fatalf("client.LoadAliPayPublicCertFromFile err: %s\n", err) + } + return client +} diff --git a/internal/routers/api/attachment.go b/internal/servants/web/routers/api/attachment.go similarity index 78% rename from internal/routers/api/attachment.go rename to internal/servants/web/routers/api/attachment.go index 905b2c03..fb6a173c 100644 --- a/internal/routers/api/attachment.go +++ b/internal/servants/web/routers/api/attachment.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package api import ( @@ -6,19 +10,19 @@ import ( "github.com/disintegration/imaging" "github.com/gin-gonic/gin" "github.com/gofrs/uuid" - "github.com/rocboss/paopao-ce/internal/model" - "github.com/rocboss/paopao-ce/internal/service" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/servants/web/broker" "github.com/rocboss/paopao-ce/pkg/app" "github.com/rocboss/paopao-ce/pkg/convert" "github.com/rocboss/paopao-ce/pkg/errcode" "github.com/sirupsen/logrus" ) -var uploadAttachmentTypeMap = map[string]model.AttachmentType{ - "public/image": model.ATTACHMENT_TYPE_IMAGE, - "public/avatar": model.ATTACHMENT_TYPE_IMAGE, - "public/video": model.ATTACHMENT_TYPE_VIDEO, - "attachment": model.ATTACHMENT_TYPE_OTHER, +var uploadAttachmentTypeMap = map[string]core.AttachmentType{ + "public/image": core.AttachmentTypeImage, + "public/avatar": core.AttachmentTypeImage, + "public/video": core.AttachmentTypeVideo, + "attachment": core.AttachmentTypeOther, } func GeneratePath(s string) string { @@ -110,7 +114,7 @@ func UploadAttachment(c *gin.Context) { } // 构造附件Model - attachment := &model.Attachment{ + attachment := &core.Attachment{ FileSize: fileHeader.Size, Content: objectUrl, } @@ -120,7 +124,7 @@ func UploadAttachment(c *gin.Context) { } attachment.Type = uploadAttachmentTypeMap[uploadType] - if attachment.Type == model.ATTACHMENT_TYPE_IMAGE { + if attachment.Type == core.AttachmentTypeImage { var src image.Image src, err = imaging.Decode(file) if err == nil { @@ -128,7 +132,7 @@ func UploadAttachment(c *gin.Context) { } } - attachment, err = service.CreateAttachment(attachment) + attachment, err = broker.CreateAttachment(attachment) if err != nil { logrus.Errorf("service.CreateAttachment err: %v", err) response.ToErrorResponse(errcode.FileUploadFailed) @@ -142,15 +146,15 @@ func DownloadAttachmentPrecheck(c *gin.Context) { contentID := convert.StrTo(c.Query("id")).MustInt64() // 加载content - content, err := service.GetPostContentByID(contentID) + content, err := broker.GetPostContentByID(contentID) if err != nil { logrus.Errorf("service.GetPostContentByID err: %v", err) response.ToErrorResponse(errcode.InvalidDownloadReq) } user, _ := c.Get("USER") - if content.Type == model.CONTENT_TYPE_CHARGE_ATTACHMENT { + if content.Type == core.ContentTypeChargeAttachment { // 加载post - post, err := service.GetPost(content.PostID) + post, err := broker.GetPost(content.PostID) if err != nil { logrus.Errorf("service.GetPost err: %v", err) response.ToResponse(gin.H{ @@ -160,7 +164,7 @@ func DownloadAttachmentPrecheck(c *gin.Context) { } // 发布者或管理员免费下载 - if post.UserID == user.(*model.User).ID || user.(*model.User).IsAdmin { + if post.UserID == user.(*core.User).ID || user.(*core.User).IsAdmin { response.ToResponse(gin.H{ "paid": true, }) @@ -169,7 +173,7 @@ func DownloadAttachmentPrecheck(c *gin.Context) { // 检测是否有购买记录 response.ToResponse(gin.H{ - "paid": service.CheckPostAttachmentIsPaid(post.ID, user.(*model.User).ID), + "paid": broker.CheckPostAttachmentIsPaid(post.ID, user.(*core.User).ID), }) return } @@ -184,18 +188,18 @@ func DownloadAttachment(c *gin.Context) { contentID := convert.StrTo(c.Query("id")).MustInt64() // 加载content - content, err := service.GetPostContentByID(contentID) + content, err := broker.GetPostContentByID(contentID) if err != nil { logrus.Errorf("service.GetPostContentByID err: %v", err) response.ToErrorResponse(errcode.InvalidDownloadReq) } // 收费附件 - if content.Type == model.CONTENT_TYPE_CHARGE_ATTACHMENT { + if content.Type == core.ContentTypeChargeAttachment { user, _ := c.Get("USER") // 加载post - post, err := service.GetPost(content.PostID) + post, err := broker.GetPost(content.PostID) if err != nil { logrus.Errorf("service.GetPost err: %v", err) response.ToResponse(gin.H{ @@ -207,24 +211,24 @@ func DownloadAttachment(c *gin.Context) { paidFlag := false // 发布者或管理员免费下载 - if post.UserID == user.(*model.User).ID || user.(*model.User).IsAdmin { + if post.UserID == user.(*core.User).ID || user.(*core.User).IsAdmin { paidFlag = true } // 检测是否有购买记录 - if service.CheckPostAttachmentIsPaid(post.ID, user.(*model.User).ID) { + if broker.CheckPostAttachmentIsPaid(post.ID, user.(*core.User).ID) { paidFlag = true } if !paidFlag { // 未购买,则尝试购买 - err := service.BuyPostAttachment(&model.Post{ - Model: &model.Model{ + err := broker.BuyPostAttachment(&core.Post{ + Model: &core.Model{ ID: post.ID, }, UserID: post.UserID, AttachmentPrice: post.AttachmentPrice, - }, user.(*model.User)) + }, user.(*core.User)) if err != nil { logrus.Errorf("service.BuyPostAttachment err: %v", err) if err == errcode.InsuffientDownloadMoney { @@ -246,5 +250,7 @@ func DownloadAttachment(c *gin.Context) { response.ToErrorResponse(errcode.DownloadReqError) return } - response.ToResponse(signedURL) + response.ToResponse(gin.H{ + "signed_url": signedURL, + }) } diff --git a/internal/routers/api/comment.go b/internal/servants/web/routers/api/comment.go similarity index 75% rename from internal/routers/api/comment.go rename to internal/servants/web/routers/api/comment.go index 4b1fca36..0779eabb 100644 --- a/internal/routers/api/comment.go +++ b/internal/servants/web/routers/api/comment.go @@ -1,9 +1,13 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package api import ( "github.com/gin-gonic/gin" - "github.com/rocboss/paopao-ce/internal/model" - "github.com/rocboss/paopao-ce/internal/service" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/servants/web/broker" "github.com/rocboss/paopao-ce/pkg/app" "github.com/rocboss/paopao-ce/pkg/convert" "github.com/rocboss/paopao-ce/pkg/errcode" @@ -14,7 +18,7 @@ func GetPostComments(c *gin.Context) { postID := convert.StrTo(c.Query("id")).MustInt64() response := app.NewResponse(c) - contents, totalRows, err := service.GetPostComments(postID, "id ASC", 0, 0) + contents, totalRows, err := broker.GetPostComments(postID, "id ASC", 0, 0) if err != nil { logrus.Errorf("service.GetPostComments err: %v\n", err) @@ -26,7 +30,7 @@ func GetPostComments(c *gin.Context) { } func CreatePostComment(c *gin.Context) { - param := service.CommentCreationReq{} + param := broker.CommentCreationReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -36,7 +40,7 @@ func CreatePostComment(c *gin.Context) { } userID, _ := c.Get("UID") - comment, err := service.CreatePostComment(c, userID.(int64), param) + comment, err := broker.CreatePostComment(c, userID.(int64), param) if err != nil { if err == errcode.MaxCommentCount { @@ -52,7 +56,7 @@ func CreatePostComment(c *gin.Context) { } func DeletePostComment(c *gin.Context) { - param := service.CommentDelReq{} + param := broker.CommentDelReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -62,20 +66,20 @@ func DeletePostComment(c *gin.Context) { } user, _ := c.Get("USER") - comment, err := service.GetPostComment(param.ID) + comment, err := broker.GetPostComment(param.ID) if err != nil { logrus.Errorf("service.GetPostComment err: %v\n", err) response.ToErrorResponse(errcode.GetCommentFailed) return } - if user.(*model.User).ID != comment.UserID && !user.(*model.User).IsAdmin { + if user.(*core.User).ID != comment.UserID && !user.(*core.User).IsAdmin { response.ToErrorResponse(errcode.NoPermission) return } // 执行删除 - err = service.DeletePostComment(comment) + err = broker.DeletePostComment(comment) if err != nil { logrus.Errorf("service.DeletePostComment err: %v\n", err) response.ToErrorResponse(errcode.DeleteCommentFailed) @@ -86,7 +90,7 @@ func DeletePostComment(c *gin.Context) { } func CreatePostCommentReply(c *gin.Context) { - param := service.CommentReplyCreationReq{} + param := broker.CommentReplyCreationReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -96,7 +100,7 @@ func CreatePostCommentReply(c *gin.Context) { } user, _ := c.Get("USER") - comment, err := service.CreatePostCommentReply(c, param.CommentID, param.Content, user.(*model.User).ID, param.AtUserID) + comment, err := broker.CreatePostCommentReply(c, param.CommentID, param.Content, user.(*core.User).ID, param.AtUserID) if err != nil { logrus.Errorf("service.CreatePostCommentReply err: %v\n", err) response.ToErrorResponse(errcode.CreateReplyFailed) @@ -107,7 +111,7 @@ func CreatePostCommentReply(c *gin.Context) { } func DeletePostCommentReply(c *gin.Context) { - param := service.ReplyDelReq{} + param := broker.ReplyDelReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -118,20 +122,20 @@ func DeletePostCommentReply(c *gin.Context) { user, _ := c.Get("USER") - reply, err := service.GetPostCommentReply(param.ID) + reply, err := broker.GetPostCommentReply(param.ID) if err != nil { logrus.Errorf("service.GetPostCommentReply err: %v\n", err) response.ToErrorResponse(errcode.GetReplyFailed) return } - if user.(*model.User).ID != reply.UserID && !user.(*model.User).IsAdmin { + if user.(*core.User).ID != reply.UserID && !user.(*core.User).IsAdmin { response.ToErrorResponse(errcode.NoPermission) return } // 执行删除 - err = service.DeletePostCommentReply(reply) + err = broker.DeletePostCommentReply(reply) if err != nil { logrus.Errorf("service.DeletePostCommentReply err: %v\n", err) response.ToErrorResponse(errcode.DeleteCommentFailed) diff --git a/internal/routers/api/home.go b/internal/servants/web/routers/api/home.go similarity index 82% rename from internal/routers/api/home.go rename to internal/servants/web/routers/api/home.go index 80489978..30f115a9 100644 --- a/internal/routers/api/home.go +++ b/internal/servants/web/routers/api/home.go @@ -1,8 +1,11 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package api import ( "bytes" - _ "embed" "encoding/base64" "image/color" "image/png" @@ -12,8 +15,9 @@ import ( "github.com/gin-gonic/gin" "github.com/gofrs/uuid" "github.com/rocboss/paopao-ce/internal/conf" - "github.com/rocboss/paopao-ce/internal/model" - "github.com/rocboss/paopao-ce/internal/service" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/servants/web/assets" + "github.com/rocboss/paopao-ce/internal/servants/web/broker" "github.com/rocboss/paopao-ce/pkg/app" "github.com/rocboss/paopao-ce/pkg/convert" "github.com/rocboss/paopao-ce/pkg/debug" @@ -22,9 +26,6 @@ import ( "github.com/sirupsen/logrus" ) -//go:embed assets/comic.ttf -var comic []byte - const MAX_PHONE_CAPTCHA = 10 func Version(c *gin.Context) { @@ -39,8 +40,8 @@ func SyncSearchIndex(c *gin.Context) { user, _ := c.Get("USER") - if user.(*model.User).IsAdmin { - go service.PushPostsToSearch(c) + if user.(*core.User).IsAdmin { + go broker.PushPostsToSearch(c) } response.ToResponse(nil) @@ -49,7 +50,7 @@ func SyncSearchIndex(c *gin.Context) { func GetCaptcha(c *gin.Context) { cap := captcha.New() - if err := cap.AddFontFromBytes(comic); err != nil { + if err := cap.AddFontFromBytes(assets.ComicBytes); err != nil { panic(err.Error()) } @@ -74,7 +75,7 @@ func GetCaptcha(c *gin.Context) { } func PostCaptcha(c *gin.Context) { - param := service.PhoneCaptchaReq{} + param := broker.PhoneCaptchaReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -96,7 +97,7 @@ func PostCaptcha(c *gin.Context) { return } - err := service.SendPhoneCaptcha(c, param.Phone) + err := broker.SendPhoneCaptcha(c, param.Phone) if err != nil { logrus.Errorf("app.SendPhoneCaptcha errs: %v", errs) response.ToErrorResponse(errcode.GetPhoneCaptchaError) diff --git a/internal/routers/api/message.go b/internal/servants/web/routers/api/message.go similarity index 74% rename from internal/routers/api/message.go rename to internal/servants/web/routers/api/message.go index 8c24cbd2..9cc72ffd 100644 --- a/internal/routers/api/message.go +++ b/internal/servants/web/routers/api/message.go @@ -1,9 +1,13 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package api import ( "github.com/gin-gonic/gin" - "github.com/rocboss/paopao-ce/internal/model" - "github.com/rocboss/paopao-ce/internal/service" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/servants/web/broker" "github.com/rocboss/paopao-ce/pkg/app" "github.com/rocboss/paopao-ce/pkg/errcode" "github.com/sirupsen/logrus" @@ -12,12 +16,12 @@ import ( func GetUnreadMsgCount(c *gin.Context) { response := app.NewResponse(c) - user := &model.User{} + user := &core.User{} if u, exists := c.Get("USER"); exists { - user = u.(*model.User) + user = u.(*core.User) } - count, _ := service.GetUnreadCount(user.ID) + count, _ := broker.GetUnreadCount(user.ID) response.ToResponse(gin.H{ "count": count, @@ -28,7 +32,7 @@ func GetMessages(c *gin.Context) { response := app.NewResponse(c) userID, _ := c.Get("UID") - messages, totalRows, err := service.GetMessages(userID.(int64), (app.GetPage(c)-1)*app.GetPageSize(c), app.GetPageSize(c)) + messages, totalRows, err := broker.GetMessages(userID.(int64), (app.GetPage(c)-1)*app.GetPageSize(c), app.GetPageSize(c)) if err != nil { logrus.Errorf("service.GetMessages err: %v\n", err) @@ -40,7 +44,7 @@ func GetMessages(c *gin.Context) { } func ReadMessage(c *gin.Context) { - param := service.ReadMessageReq{} + param := broker.ReadMessageReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -50,7 +54,7 @@ func ReadMessage(c *gin.Context) { } userID, _ := c.Get("UID") - err := service.ReadMessage(param.ID, userID.(int64)) + err := broker.ReadMessage(param.ID, userID.(int64)) if err != nil { logrus.Errorf("service.ReadMessage err: %v\n", err) response.ToErrorResponse(errcode.ReadMessageFailed) @@ -61,7 +65,7 @@ func ReadMessage(c *gin.Context) { } func SendUserWhisper(c *gin.Context) { - param := service.WhisperReq{} + param := broker.WhisperReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -78,10 +82,10 @@ func SendUserWhisper(c *gin.Context) { return } - _, err := service.CreateWhisper(c, &model.Message{ + _, err := broker.CreateWhisper(c, &core.Message{ SenderUserID: userID.(int64), ReceiverUserID: param.UserID, - Type: model.MsgTypeWhisper, + Type: core.MsgTypeWhisper, Brief: "给你发送新私信了", Content: param.Content, }) diff --git a/internal/routers/api/post.go b/internal/servants/web/routers/api/post.go similarity index 78% rename from internal/routers/api/post.go rename to internal/servants/web/routers/api/post.go index f580428f..0dc923b0 100644 --- a/internal/routers/api/post.go +++ b/internal/servants/web/routers/api/post.go @@ -1,10 +1,13 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package api import ( "github.com/gin-gonic/gin" "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/model" - "github.com/rocboss/paopao-ce/internal/service" + "github.com/rocboss/paopao-ce/internal/servants/web/broker" "github.com/rocboss/paopao-ce/pkg/app" "github.com/rocboss/paopao-ce/pkg/convert" "github.com/rocboss/paopao-ce/pkg/errcode" @@ -25,7 +28,7 @@ func GetPostList(c *gin.Context) { user, _ := userFrom(c) offset, limit := app.GetPageOffset(c) if q.Query == "" && q.Type == "search" { - resp, err := service.GetIndexPosts(user, offset, limit) + resp, err := broker.GetIndexPosts(user, offset, limit) if err != nil { logrus.Errorf("service.GetPostList err: %v\n", err) response.ToErrorResponse(errcode.GetPostsFailed) @@ -34,7 +37,7 @@ func GetPostList(c *gin.Context) { response.ToResponseList(resp.Tweets, resp.Total) } else { - posts, totalRows, err := service.GetPostListFromSearch(user, q, offset, limit) + posts, totalRows, err := broker.GetPostListFromSearch(user, q, offset, limit) if err != nil { logrus.Errorf("service.GetPostListFromSearch err: %v\n", err) @@ -49,7 +52,7 @@ func GetPost(c *gin.Context) { postID := convert.StrTo(c.Query("id")).MustInt64() response := app.NewResponse(c) - postFormated, err := service.GetPost(postID) + postFormated, err := broker.GetPost(postID) if err != nil { logrus.Errorf("service.GetPost err: %v\n", err) @@ -61,7 +64,7 @@ func GetPost(c *gin.Context) { } func CreatePost(c *gin.Context) { - param := service.PostCreationReq{} + param := broker.PostCreationReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -71,7 +74,7 @@ func CreatePost(c *gin.Context) { } userID, _ := c.Get("UID") - post, err := service.CreatePost(c, userID.(int64), param) + post, err := broker.CreatePost(c, userID.(int64), param) if err != nil { logrus.Errorf("service.CreatePost err: %v\n", err) @@ -83,7 +86,7 @@ func CreatePost(c *gin.Context) { } func DeletePost(c *gin.Context) { - param := service.PostDelReq{} + param := broker.PostDelReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -98,7 +101,7 @@ func DeletePost(c *gin.Context) { return } - err := service.DeletePost(user, param.ID) + err := broker.DeletePost(user, param.ID) if err != nil { logrus.Errorf("service.DeletePost err: %v\n", err) response.ToErrorResponse(err) @@ -114,7 +117,7 @@ func GetPostStar(c *gin.Context) { userID, _ := c.Get("UID") - _, err := service.GetPostStar(postID, userID.(int64)) + _, err := broker.GetPostStar(postID, userID.(int64)) if err != nil { response.ToResponse(gin.H{ "status": false, @@ -129,7 +132,7 @@ func GetPostStar(c *gin.Context) { } func PostStar(c *gin.Context) { - param := service.PostStarReq{} + param := broker.PostStarReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -141,14 +144,14 @@ func PostStar(c *gin.Context) { userID, _ := c.Get("UID") status := false - star, err := service.GetPostStar(param.ID, userID.(int64)) + star, err := broker.GetPostStar(param.ID, userID.(int64)) if err != nil { // 创建Star - _, err = service.CreatePostStar(param.ID, userID.(int64)) + _, err = broker.CreatePostStar(param.ID, userID.(int64)) status = true } else { // 取消Star - err = service.DeletePostStar(star) + err = broker.DeletePostStar(star) } if err != nil { @@ -167,7 +170,7 @@ func GetPostCollection(c *gin.Context) { userID, _ := c.Get("UID") - _, err := service.GetPostCollection(postID, userID.(int64)) + _, err := broker.GetPostCollection(postID, userID.(int64)) if err != nil { response.ToResponse(gin.H{ "status": false, @@ -182,7 +185,7 @@ func GetPostCollection(c *gin.Context) { } func PostCollection(c *gin.Context) { - param := service.PostCollectionReq{} + param := broker.PostCollectionReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -194,14 +197,14 @@ func PostCollection(c *gin.Context) { userID, _ := c.Get("UID") status := false - collection, err := service.GetPostCollection(param.ID, userID.(int64)) + collection, err := broker.GetPostCollection(param.ID, userID.(int64)) if err != nil { // 创建collection - _, err = service.CreatePostCollection(param.ID, userID.(int64)) + _, err = broker.CreatePostCollection(param.ID, userID.(int64)) status = true } else { // 取消Star - err = service.DeletePostCollection(collection) + err = broker.DeletePostCollection(collection) } if err != nil { @@ -215,7 +218,7 @@ func PostCollection(c *gin.Context) { } func LockPost(c *gin.Context) { - param := service.PostLockReq{} + param := broker.PostLockReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -227,18 +230,18 @@ func LockPost(c *gin.Context) { user, _ := c.Get("USER") // 获取Post - postFormated, err := service.GetPost(param.ID) + postFormated, err := broker.GetPost(param.ID) if err != nil { logrus.Errorf("service.GetPost err: %v\n", err) response.ToErrorResponse(errcode.GetPostFailed) return } - if postFormated.UserID != user.(*model.User).ID && !user.(*model.User).IsAdmin { + if postFormated.UserID != user.(*core.User).ID && !user.(*core.User).IsAdmin { response.ToErrorResponse(errcode.NoPermission) return } - err = service.LockPost(param.ID) + err = broker.LockPost(param.ID) if err != nil { logrus.Errorf("service.LockPost err: %v\n", err) response.ToErrorResponse(errcode.LockPostFailed) @@ -251,7 +254,7 @@ func LockPost(c *gin.Context) { } func StickPost(c *gin.Context) { - param := service.PostStickReq{} + param := broker.PostStickReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -263,18 +266,18 @@ func StickPost(c *gin.Context) { user, _ := c.Get("USER") // 获取Post - postFormated, err := service.GetPost(param.ID) + postFormated, err := broker.GetPost(param.ID) if err != nil { logrus.Errorf("service.GetPost err: %v\n", err) response.ToErrorResponse(errcode.GetPostFailed) return } - if !user.(*model.User).IsAdmin { + if !user.(*core.User).IsAdmin { response.ToErrorResponse(errcode.NoPermission) return } - err = service.StickPost(param.ID) + err = broker.StickPost(param.ID) if err != nil { logrus.Errorf("service.StickPost err: %v\n", err) response.ToErrorResponse(errcode.LockPostFailed) @@ -287,7 +290,7 @@ func StickPost(c *gin.Context) { } func VisiblePost(c *gin.Context) { - param := service.PostVisibilityReq{} + param := broker.PostVisibilityReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -297,7 +300,7 @@ func VisiblePost(c *gin.Context) { } user, _ := userFrom(c) - if err := service.VisiblePost(user, param.ID, param.Visibility); err != nil { + if err := broker.VisiblePost(user, param.ID, param.Visibility); err != nil { logrus.Errorf("service.VisiblePost err: %v\n", err) response.ToErrorResponse(err) return @@ -309,7 +312,7 @@ func VisiblePost(c *gin.Context) { } func GetPostTags(c *gin.Context) { - param := service.PostTagsReq{} + param := broker.PostTagsReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -318,7 +321,7 @@ func GetPostTags(c *gin.Context) { return } - tags, err := service.GetPostTags(¶m) + tags, err := broker.GetPostTags(¶m) if err != nil { logrus.Errorf("service.GetPostTags err: %v\n", err) response.ToErrorResponse(errcode.GetPostTagsFailed) @@ -326,5 +329,7 @@ func GetPostTags(c *gin.Context) { } - response.ToResponse(tags) + response.ToResponse(gin.H{ + "topics": tags, + }) } diff --git a/internal/routers/api/user.go b/internal/servants/web/routers/api/user.go similarity index 60% rename from internal/routers/api/user.go rename to internal/servants/web/routers/api/user.go index ec91c815..89aa6615 100644 --- a/internal/routers/api/user.go +++ b/internal/servants/web/routers/api/user.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package api import ( @@ -6,9 +10,8 @@ import ( "unicode/utf8" "github.com/gin-gonic/gin" - "github.com/rocboss/paopao-ce/internal/conf" - "github.com/rocboss/paopao-ce/internal/model" - "github.com/rocboss/paopao-ce/internal/service" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/servants/web/broker" "github.com/rocboss/paopao-ce/pkg/app" "github.com/rocboss/paopao-ce/pkg/convert" "github.com/rocboss/paopao-ce/pkg/errcode" @@ -18,7 +21,7 @@ import ( // Login 用户登录 func Login(c *gin.Context) { - param := service.AuthRequest{} + param := broker.AuthRequest{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -27,7 +30,7 @@ func Login(c *gin.Context) { return } - user, err := service.DoLogin(c, ¶m) + user, err := broker.DoLogin(c, ¶m) if err != nil { logrus.Errorf("service.DoLogin err: %v", err) response.ToErrorResponse(err.(*errcode.Error)) @@ -49,7 +52,7 @@ func Login(c *gin.Context) { // Register 用户注册 func Register(c *gin.Context) { - param := service.RegisterRequest{} + param := broker.RegisterRequest{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -59,7 +62,7 @@ func Register(c *gin.Context) { } // 用户名检查 - err := service.ValidUsername(param.Username) + err := broker.ValidUsername(param.Username) if err != nil { logrus.Errorf("service.Register err: %v", err) response.ToErrorResponse(err.(*errcode.Error)) @@ -67,14 +70,14 @@ func Register(c *gin.Context) { } // 密码检查 - err = service.CheckPassword(param.Password) + err = broker.CheckPassword(param.Password) if err != nil { logrus.Errorf("service.Register err: %v", err) response.ToErrorResponse(err.(*errcode.Error)) return } - user, err := service.Register( + user, err := broker.Register( param.Username, param.Password, ) @@ -91,16 +94,142 @@ func Register(c *gin.Context) { }) } +func RequestingFriend(c *gin.Context) { + param := broker.RequestingFriendReq{} + response := app.NewResponse(c) + valid, errs := app.BindAndValid(c, ¶m) + if !valid { + logrus.Errorf("app.BindAndValid errs: %v", errs) + response.ToErrorResponse(errcode.InvalidParams.WithDetails(errs.Errors()...)) + return + } + + user, ok := userFrom(c) + if !ok { + response.ToErrorResponse(errcode.UnauthorizedAuthNotExist) + } + if user.ID == param.UserId { + response.ToErrorResponse(errcode.NoRequestingFriendToSelf) + return + } + + if err := broker.RequestingFriend(user, ¶m); err != nil { + logrus.Errorf("service.RequestingFriend err: %v", err) + response.ToErrorResponse(errcode.SendRequestingFriendFailed) + return + } + + response.ToResponse(nil) +} + +func AddFriend(c *gin.Context) { + param := broker.AddFriendReq{} + response := app.NewResponse(c) + valid, errs := app.BindAndValid(c, ¶m) + if !valid { + logrus.Errorf("app.BindAndValid errs: %v", errs) + response.ToErrorResponse(errcode.InvalidParams.WithDetails(errs.Errors()...)) + return + } + user, ok := userFrom(c) + if !ok { + response.ToErrorResponse(errcode.UnauthorizedAuthNotExist) + } + if user.ID == param.UserId { + response.ToErrorResponse(errcode.NoActionToSelf) + return + } + + if err := broker.AddFriend(user, ¶m); err != nil { + logrus.Errorf("service.AddFriend err: %v", err) + response.ToErrorResponse(errcode.AddFriendFailed) + return + } + + response.ToResponse(nil) +} + +func RejectFriend(c *gin.Context) { + param := broker.RejectFriendReq{} + response := app.NewResponse(c) + valid, errs := app.BindAndValid(c, ¶m) + if !valid { + logrus.Errorf("app.BindAndValid errs: %v", errs) + response.ToErrorResponse(errcode.InvalidParams.WithDetails(errs.Errors()...)) + return + } + user, ok := userFrom(c) + if !ok { + response.ToErrorResponse(errcode.UnauthorizedAuthNotExist) + } + if user.ID == param.UserId { + response.ToErrorResponse(errcode.NoActionToSelf) + return + } + + if err := broker.RejectFriend(user, ¶m); err != nil { + logrus.Errorf("service.RejectFriend err: %v", err) + response.ToErrorResponse(errcode.RejectFriendFailed) + return + } + + response.ToResponse(nil) +} + +func DeleteFriend(c *gin.Context) { + param := broker.DeleteFriendReq{} + response := app.NewResponse(c) + valid, errs := app.BindAndValid(c, ¶m) + if !valid { + logrus.Errorf("app.BindAndValid errs: %v", errs) + response.ToErrorResponse(errcode.InvalidParams.WithDetails(errs.Errors()...)) + return + } + user, ok := userFrom(c) + if !ok { + response.ToErrorResponse(errcode.UnauthorizedAuthNotExist) + } + if user.ID == param.UserId { + response.ToErrorResponse(errcode.NoActionToSelf) + return + } + + if err := broker.DeleteFriend(user, ¶m); err != nil { + logrus.Errorf("service.DeleteFriend err: %v", err) + response.ToErrorResponse(errcode.DeleteFriendFailed) + return + } + + response.ToResponse(nil) +} + +func GetContacts(c *gin.Context) { + response := app.NewResponse(c) + user, ok := userFrom(c) + if !ok { + response.ToErrorResponse(errcode.UnauthorizedAuthNotExist) + } + + offset, limit := app.GetPageOffset(c) + resp, err := broker.GetContacts(user, offset, limit) + if err != nil { + logrus.Errorf("service.DeleteFriend err: %v", err) + response.ToErrorResponse(errcode.GetContactsFailed) + return + } + response.ToResponseList(resp.Contacts, resp.Total) +} + // 获取用户基本信息 func GetUserInfo(c *gin.Context) { - param := service.AuthRequest{} + param := broker.AuthRequest{} response := app.NewResponse(c) if username, exists := c.Get("USERNAME"); exists { param.Username = username.(string) } - user, err := service.GetUserInfo(¶m) + user, err := broker.GetUserInfo(¶m) if err != nil { response.ToErrorResponse(errcode.UnauthorizedAuthNotExist) @@ -125,7 +254,7 @@ func GetUserInfo(c *gin.Context) { // 修改密码 func ChangeUserPassword(c *gin.Context) { - param := service.ChangePasswordReq{} + param := broker.ChangePasswordReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -134,13 +263,13 @@ func ChangeUserPassword(c *gin.Context) { return } - user := &model.User{} + user := &core.User{} if u, exists := c.Get("USER"); exists { - user = u.(*model.User) + user = u.(*core.User) } // 密码检查 - err := service.CheckPassword(param.Password) + err := broker.CheckPassword(param.Password) if err != nil { logrus.Errorf("service.Register err: %v", err) response.ToErrorResponse(err.(*errcode.Error)) @@ -148,21 +277,21 @@ func ChangeUserPassword(c *gin.Context) { } // 旧密码校验 - if !service.ValidPassword(user.Password, param.OldPassword, user.Salt) { + if !broker.ValidPassword(user.Password, param.OldPassword, user.Salt) { response.ToErrorResponse(errcode.ErrorOldPassword) return } // 更新入库 - user.Password, user.Salt = service.EncryptPasswordAndSalt(param.Password) - service.UpdateUserInfo(user) + user.Password, user.Salt = broker.EncryptPasswordAndSalt(param.Password) + broker.UpdateUserInfo(user) response.ToResponse(nil) } // 修改昵称 func ChangeNickname(c *gin.Context) { - param := service.ChangeNicknameReq{} + param := broker.ChangeNicknameReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -171,9 +300,9 @@ func ChangeNickname(c *gin.Context) { return } - user := &model.User{} + user := &core.User{} if u, exists := c.Get("USER"); exists { - user = u.(*model.User) + user = u.(*core.User) } if utf8.RuneCountInString(param.Nickname) < 2 || utf8.RuneCountInString(param.Nickname) > 12 { @@ -183,14 +312,14 @@ func ChangeNickname(c *gin.Context) { // 执行绑定 user.Nickname = param.Nickname - service.UpdateUserInfo(user) + broker.UpdateUserInfo(user) response.ToResponse(nil) } // 修改头像 func ChangeAvatar(c *gin.Context) { - param := service.ChangeAvatarReq{} + param := broker.ChangeAvatarReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -205,7 +334,7 @@ func ChangeAvatar(c *gin.Context) { return } - if err := service.ChangeUserAvatar(user, param.Avatar); err != nil { + if err := broker.ChangeUserAvatar(user, param.Avatar); err != nil { response.ToErrorResponse(err) return } @@ -214,7 +343,7 @@ func ChangeAvatar(c *gin.Context) { // 用户绑定手机号 func BindUserPhone(c *gin.Context) { - param := service.UserPhoneBindReq{} + param := broker.UserPhoneBindReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -223,18 +352,18 @@ func BindUserPhone(c *gin.Context) { return } - user := &model.User{} + user := &core.User{} if u, exists := c.Get("USER"); exists { - user = u.(*model.User) + user = u.(*core.User) } // 手机重复性检查 - if service.CheckPhoneExist(user.ID, param.Phone) { + if broker.CheckPhoneExist(user.ID, param.Phone) { response.ToErrorResponse(errcode.ExistedUserPhone) return } - if err := service.CheckPhoneCaptcha(param.Phone, param.Captcha); err != nil { + if err := broker.CheckPhoneCaptcha(param.Phone, param.Captcha); err != nil { logrus.Errorf("service.CheckPhoneCaptcha err: %v\n", err) response.ToErrorResponse(err) return @@ -242,14 +371,17 @@ func BindUserPhone(c *gin.Context) { // 执行绑定 user.Phone = param.Phone - service.UpdateUserInfo(user) + if err := broker.UpdateUserInfo(user); err != nil { + response.ToErrorResponse(err) + return + } response.ToResponse(nil) } // 修改用户状态 func ChangeUserStatus(c *gin.Context) { - param := service.ChangeUserStatusReq{} + param := broker.ChangeUserStatusReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -258,12 +390,12 @@ func ChangeUserStatus(c *gin.Context) { return } - if param.Status != model.UserStatusNormal && param.Status != model.UserStatusClosed { + if param.Status != core.UserStatusNormal && param.Status != core.UserStatusClosed { response.ToErrorResponse(errcode.InvalidParams) return } - user, err := service.GetUserByID(param.ID) + user, err := broker.GetUserByID(param.ID) if err != nil { logrus.Errorf("service.GetUserByID err: %v\n", err) response.ToErrorResponse(errcode.NoExistUsername) @@ -272,7 +404,7 @@ func ChangeUserStatus(c *gin.Context) { // 执行更新 user.Status = param.Status - service.UpdateUserInfo(user) + broker.UpdateUserInfo(user) response.ToResponse(nil) } @@ -280,51 +412,45 @@ func ChangeUserStatus(c *gin.Context) { func GetUserProfile(c *gin.Context) { response := app.NewResponse(c) username := c.Query("username") + user, _ := userFrom(c) - user, err := service.GetUserByUsername(username) + resp, err := broker.GetUserByUsername(user, username) if err != nil { logrus.Errorf("service.GetUserByUsername err: %v\n", err) response.ToErrorResponse(errcode.NoExistUsername) return } - response.ToResponse(gin.H{ - "id": user.ID, - "nickname": user.Nickname, - "username": user.Username, - "status": user.Status, - "avatar": user.Avatar, - "is_admin": user.IsAdmin, - }) + response.ToResponse(resp) } func GetUserPosts(c *gin.Context) { response := app.NewResponse(c) username := c.Query("username") + user, exists := userFrom(c) - user, err := service.GetUserByUsername(username) + other, err := broker.GetUserByUsername(user, username) if err != nil { logrus.Errorf("service.GetUserByUsername err: %v\n", err) response.ToErrorResponse(errcode.NoExistUsername) return } - visibilities := []model.PostVisibleT{model.PostVisitPublic} - if u, exists := c.Get("USER"); exists { - self := u.(*model.User) - if self.ID == user.ID || self.IsAdmin { - visibilities = append(visibilities, model.PostVisitPrivate, model.PostVisitFriend) - } else if service.IsFriend(user.ID, self.ID) { - visibilities = append(visibilities, model.PostVisitFriend) + visibilities := []core.PostVisibleT{core.PostVisitPublic} + if exists { + if user.ID == other.ID || user.IsAdmin { + visibilities = append(visibilities, core.PostVisitPrivate, core.PostVisitFriend) + } else if other.IsFriend { + visibilities = append(visibilities, core.PostVisitFriend) } } - conditions := model.ConditionsT{ - "user_id": user.ID, + conditions := core.ConditionsT{ + "user_id": other.ID, "visibility IN ?": visibilities, "ORDER": "latest_replied_on DESC", } - posts, err := service.GetPostList(&service.PostListReq{ + _, posts, err := broker.GetPostList(&broker.PostListReq{ Conditions: &conditions, Offset: (app.GetPage(c) - 1) * app.GetPageSize(c), Limit: app.GetPageSize(c), @@ -334,7 +460,7 @@ func GetUserPosts(c *gin.Context) { response.ToErrorResponse(errcode.GetPostsFailed) return } - totalRows, _ := service.GetPostCount(&conditions) + totalRows, _ := broker.GetPostCount(&conditions) response.ToResponseList(posts, totalRows) } @@ -343,7 +469,7 @@ func GetUserCollections(c *gin.Context) { response := app.NewResponse(c) userID, _ := c.Get("UID") - posts, totalRows, err := service.GetUserCollections(userID.(int64), (app.GetPage(c)-1)*app.GetPageSize(c), app.GetPageSize(c)) + posts, totalRows, err := broker.GetUserCollections(userID.(int64), (app.GetPage(c)-1)*app.GetPageSize(c), app.GetPageSize(c)) if err != nil { logrus.Errorf("service.GetUserCollections err: %v\n", err) @@ -358,7 +484,7 @@ func GetUserStars(c *gin.Context) { response := app.NewResponse(c) userID, _ := c.Get("UID") - posts, totalRows, err := service.GetUserStars(userID.(int64), (app.GetPage(c)-1)*app.GetPageSize(c), app.GetPageSize(c)) + posts, totalRows, err := broker.GetUserStars(userID.(int64), (app.GetPage(c)-1)*app.GetPageSize(c), app.GetPageSize(c)) if err != nil { logrus.Errorf("service.GetUserStars err: %v\n", err) response.ToErrorResponse(errcode.GetCollectionsFailed) @@ -372,32 +498,36 @@ func GetSuggestUsers(c *gin.Context) { keyword := c.Query("k") response := app.NewResponse(c) - usernames, err := service.GetSuggestUsers(keyword) + usernames, err := broker.GetSuggestUsers(keyword) if err != nil { logrus.Errorf("service.GetSuggestUsers err: %v\n", err) response.ToErrorResponse(errcode.GetCollectionsFailed) return } - response.ToResponse(usernames) + response.ToResponse(gin.H{ + "suggest": usernames, + }) } func GetSuggestTags(c *gin.Context) { keyword := c.Query("k") response := app.NewResponse(c) - tags, err := service.GetSuggestTags(keyword) + tags, err := broker.GetSuggestTags(keyword) if err != nil { logrus.Errorf("service.GetSuggestTags err: %v\n", err) response.ToErrorResponse(errcode.GetCollectionsFailed) return } - response.ToResponse(tags) + response.ToResponse(gin.H{ + "suggest": tags, + }) } func GetUserRechargeLink(c *gin.Context) { - param := service.RechargeReq{} + param := broker.RechargeReq{} response := app.NewResponse(c) valid, errs := app.BindAndValid(c, ¶m) if !valid { @@ -408,41 +538,11 @@ func GetUserRechargeLink(c *gin.Context) { // 下单 userID, _ := c.Get("UID") - recharge, err := service.CreateRecharge(userID.(int64), param.Amount) + recharge, err := broker.CreateRecharge(userID.(int64), param.Amount) if err != nil { logrus.Errorf("service.CreateRecharge err: %v\n", err) response.ToErrorResponse(errcode.RechargeReqFail) return - - } - - client, err := alipay.New(conf.AlipaySetting.AppID, conf.AlipaySetting.PrivateKey, true) - // 将 key 的验证调整到初始化阶段 - if err != nil { - logrus.Errorf("alipay.New err: %v\n", err) - response.ToErrorResponse(errcode.RechargeReqFail) - return - } - - err = client.LoadAppPublicCertFromFile("configs/alipayAppCertPublicKey.crt") // 加载应用公钥证书 - if err != nil { - logrus.Errorf("client.LoadAppPublicCertFromFile err: %v\n", err) - response.ToErrorResponse(errcode.RechargeReqFail) - return - } - - err = client.LoadAliPayRootCertFromFile("configs/alipayRootCert.crt") // 加载支付宝根证书 - if err != nil { - logrus.Errorf("client.LoadAliPayRootCertFromFile err: %v\n", err) - response.ToErrorResponse(errcode.RechargeReqFail) - return - } - - err = client.LoadAliPayPublicCertFromFile("configs/alipayCertPublicKey_RSA2.crt") // 加载支付宝公钥证书 - if err != nil { - logrus.Errorf("client.LoadAliPayPublicCertFromFile err: %v\n", err) - response.ToErrorResponse(errcode.RechargeReqFail) - return } p := alipay.TradePreCreate{} @@ -451,7 +551,7 @@ func GetUserRechargeLink(c *gin.Context) { p.TotalAmount = fmt.Sprintf("%.2f", float64(recharge.Amount)/100.0) p.NotifyURL = "https://" + c.Request.Host + "/v1/alipay/notify" - rsp, err := client.TradePreCreate(p) + rsp, err := alipayClient.TradePreCreate(p) if err != nil { logrus.Errorf("client.TradePreCreate err: %v\n", err) response.ToErrorResponse(errcode.RechargeReqFail) @@ -474,7 +574,7 @@ func GetUserRechargeResult(c *gin.Context) { id := c.Query("id") userID, _ := c.Get("UID") - recharge, err := service.GetRechargeByID(convert.StrTo(id).MustInt64()) + recharge, err := broker.GetRechargeByID(convert.StrTo(id).MustInt64()) if err != nil { response.ToErrorResponse(errcode.GetRechargeFailed) return @@ -495,37 +595,9 @@ func AlipayNotify(c *gin.Context) { response := app.NewResponse(c) c.Request.ParseForm() - aliClient, err := alipay.New(conf.AlipaySetting.AppID, conf.AlipaySetting.PrivateKey, true) - // 将 key 的验证调整到初始化阶段 - if err != nil { - logrus.Errorf("alipay.New err: %v\n", err) - response.ToErrorResponse(errcode.RechargeReqFail) - return - } - err = aliClient.LoadAppPublicCertFromFile("configs/alipayAppCertPublicKey.crt") // 加载应用公钥证书 - if err != nil { - logrus.Errorf("client.LoadAppPublicCertFromFile err: %v\n", err) - response.ToErrorResponse(errcode.RechargeReqFail) - return - } - - err = aliClient.LoadAliPayRootCertFromFile("configs/alipayRootCert.crt") // 加载支付宝根证书 - if err != nil { - logrus.Errorf("client.LoadAliPayRootCertFromFile err: %v\n", err) - response.ToErrorResponse(errcode.RechargeReqFail) - return - } - - err = aliClient.LoadAliPayPublicCertFromFile("configs/alipayCertPublicKey_RSA2.crt") // 加载支付宝公钥证书 - if err != nil { - logrus.Errorf("client.LoadAliPayPublicCertFromFile err: %v\n", err) - response.ToErrorResponse(errcode.RechargeReqFail) - return - } - - _, err = aliClient.GetTradeNotification(c.Request) + _, err := alipayClient.GetTradeNotification(c.Request) if err != nil { - logrus.Errorf("aliClient.GetTradeNotification err: %v\n", err) + logrus.Errorf("alipayClient.GetTradeNotification err: %v\n", err) logrus.Infoln(c.Request.Form) response.ToErrorResponse(errcode.RechargeNotifyError) return @@ -536,7 +608,7 @@ func AlipayNotify(c *gin.Context) { tradeStatus := c.Request.Form.Get("trade_status") if tradeStatus == "TRADE_SUCCESS" { // 交易支付成功 - err = service.FinishRecharge(c, convert.StrTo(id).MustInt64(), tradeNo) + err = broker.FinishRecharge(c, convert.StrTo(id).MustInt64(), tradeNo) if err != nil { logrus.Errorf("service.FinishRecharge err: %v\n", err) response.ToErrorResponse(errcode.RechargeNotifyError) @@ -550,7 +622,7 @@ func GetUserWalletBills(c *gin.Context) { response := app.NewResponse(c) userID, _ := c.Get("UID") - bills, totalRows, err := service.GetUserWalletBills(userID.(int64), (app.GetPage(c)-1)*app.GetPageSize(c), app.GetPageSize(c)) + bills, totalRows, err := broker.GetUserWalletBills(userID.(int64), (app.GetPage(c)-1)*app.GetPageSize(c), app.GetPageSize(c)) if err != nil { logrus.Errorf("service.GetUserWalletBills err: %v\n", err) @@ -561,9 +633,9 @@ func GetUserWalletBills(c *gin.Context) { response.ToResponseList(bills, totalRows) } -func userFrom(c *gin.Context) (*model.User, bool) { +func userFrom(c *gin.Context) (*core.User, bool) { if u, exists := c.Get("USER"); exists { - user, ok := u.(*model.User) + user, ok := u.(*core.User) return user, ok } return nil, false diff --git a/internal/routers/docs.go b/internal/servants/web/routers/docs.go similarity index 57% rename from internal/routers/docs.go rename to internal/servants/web/routers/docs.go index fc054b08..bf5e0488 100644 --- a/internal/routers/docs.go +++ b/internal/servants/web/routers/docs.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + //go:build !docs // +build !docs diff --git a/internal/servants/web/routers/docs_embed.go b/internal/servants/web/routers/docs_embed.go new file mode 100644 index 00000000..20754e1a --- /dev/null +++ b/internal/servants/web/routers/docs_embed.go @@ -0,0 +1,21 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +//go:build docs +// +build docs + +package routers + +import ( + "github.com/alimy/cfg" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/docs/openapi" +) + +// registerDocs register docs asset route +func registerDocs(e *gin.Engine) { + cfg.Be("Docs:OpenAPI", func() { + e.StaticFS("/docs/openapi", openapi.NewFileSystem()) + }) +} diff --git a/internal/servants/web/routers/router.go b/internal/servants/web/routers/router.go new file mode 100644 index 00000000..70247c6a --- /dev/null +++ b/internal/servants/web/routers/router.go @@ -0,0 +1,351 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package routers + +import ( + "net/http" + "path/filepath" + + "github.com/alimy/cfg" + "github.com/gin-contrib/cors" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/servants/chain" + "github.com/rocboss/paopao-ce/internal/servants/web/routers/api" + "github.com/sirupsen/logrus" +) + +func NewRouter() *gin.Engine { + e := gin.New() + e.HandleMethodNotAllowed = true + e.Use(gin.Logger()) + e.Use(gin.Recovery()) + + // 跨域配置 + corsConfig := cors.DefaultConfig() + corsConfig.AllowAllOrigins = true + corsConfig.AddAllowHeaders("Authorization") + e.Use(cors.New(corsConfig)) + + // 按需注册 docs、静态资源、LocalOSS 路由 + { + registerDocs(e) + registerStatick(e) + + cfg.Be("LocalOSS", func() { + routeLocalOSS(e) + }) + } + + // v1 group api + r := e.Group("/v1") + + // 获取version + r.GET("/", api.Version) + + // 用户登录 + r.POST("/auth/login", api.Login) + + // 用户注册 + r.POST("/auth/register", api.Register) + + // 获取验证码 + r.GET("/captcha", api.GetCaptcha) + + // 发送验证码 + r.POST("/captcha", api.PostCaptcha) + + // 无鉴权路由组 + noAuthApi := r.Group("/") + { + // 获取动态详情 + noAuthApi.GET("/post", api.GetPost) + + // 获取动态评论 + noAuthApi.GET("/post/comments", api.GetPostComments) + + // 获取话题列表 + noAuthApi.GET("/tags", api.GetPostTags) + } + + // 宽松鉴权路由组 + looseApi := r.Group("/").Use(chain.JwtLoose()) + { + // 获取广场流 + looseApi.GET("/posts", api.GetPostList) + + // 获取用户动态列表 + looseApi.GET("/user/posts", api.GetUserPosts) + + // 获取用户基本信息 + looseApi.GET("/user/profile", api.GetUserProfile) + } + + // 鉴权路由组 + authApi := r.Group("/").Use(chain.JWT()) + privApi := r.Group("/").Use(chain.JWT()).Use(chain.Priv()) + adminApi := r.Group("/").Use(chain.JWT()).Use(chain.Admin()) + + // 核心路由注册 + routeCore(authApi, privApi, adminApi) + + // 支付宝路由注册 + cfg.Be("Alipay", func() { + routeAlipay(r, authApi) + }) + + // Relationship相关路由注册 + routeRelationship(authApi) + + // 默认404 + e.NoRoute(func(c *gin.Context) { + c.JSON(http.StatusNotFound, gin.H{ + "code": 404, + "msg": "Not Found", + }) + }) + + // 默认405 + e.NoMethod(func(c *gin.Context) { + c.JSON(http.StatusMethodNotAllowed, gin.H{ + "code": 405, + "msg": "Method Not Allowed", + }) + }) + + return e +} + +func RegisterRoute(e *gin.Engine) { + // 按需注册 Web前端静态资源 + cfg.Be("Frontend:EmbedWeb", func() { + registerStatick(e) + }) + + // 按需注册 LocalOSS 路由 + cfg.Be("LocalOSS", func() { + routeLocalOSS(e) + }) + + // v1 group api + r := e.Group("/v1") + + // 获取version + r.GET("/", api.Version) + + // 用户登录 + r.POST("/auth/login", api.Login) + + // 用户注册 + r.POST("/auth/register", api.Register) + + // 获取验证码 + r.GET("/captcha", api.GetCaptcha) + + // 发送验证码 + r.POST("/captcha", api.PostCaptcha) + + // 无鉴权路由组 + noAuthApi := r.Group("/") + { + // 获取动态详情 + noAuthApi.GET("/post", api.GetPost) + + // 获取动态评论 + noAuthApi.GET("/post/comments", api.GetPostComments) + + // 获取话题列表 + noAuthApi.GET("/tags", api.GetPostTags) + } + + // 宽松鉴权路由组 + looseApi := r.Group("/").Use(chain.JwtLoose()) + { + // 获取广场流 + looseApi.GET("/posts", api.GetPostList) + + // 获取用户动态列表 + looseApi.GET("/user/posts", api.GetUserPosts) + + // 获取用户基本信息 + looseApi.GET("/user/profile", api.GetUserProfile) + } + + // 鉴权路由组 + authApi := r.Group("/").Use(chain.JWT()) + privApi := r.Group("/").Use(chain.JWT()).Use(chain.Priv()) + adminApi := r.Group("/").Use(chain.JWT()).Use(chain.Admin()) + + // 核心路由注册 + routeCore(authApi, privApi, adminApi) + + // 支付宝路由注册 + cfg.Be("Alipay", func() { + routeAlipay(r, authApi) + }) + + // Relationship相关路由注册 + routeRelationship(authApi) +} + +func routeCore(authApi gin.IRoutes, privApi gin.IRoutes, adminApi gin.IRoutes) { + // 同步索引 + authApi.GET("/sync/index", api.SyncSearchIndex) + + // 获取当前用户信息 + authApi.GET("/user/info", api.GetUserInfo) + + // 获取当前用户未读消息数量 + authApi.GET("/user/msgcount/unread", api.GetUnreadMsgCount) + + // 获取消息列表 + authApi.GET("/user/messages", api.GetMessages) + + // 标记消息已读 + authApi.POST("/user/message/read", api.ReadMessage) + + // 发送用户私信 + authApi.POST("/user/whisper", api.SendUserWhisper) + + // 获取用户收藏列表 + authApi.GET("/user/collections", api.GetUserCollections) + + // 获取用户点赞列表 + authApi.GET("/user/stars", api.GetUserStars) + + // 绑定用户手机号 + authApi.POST("/user/phone", api.BindUserPhone) + + // 修改密码 + authApi.POST("/user/password", api.ChangeUserPassword) + + // 修改昵称 + authApi.POST("/user/nickname", api.ChangeNickname) + + // 修改头像 + authApi.POST("/user/avatar", api.ChangeAvatar) + + // 检索用户 + authApi.GET("/suggest/users", api.GetSuggestUsers) + + // 检索标签 + authApi.GET("/suggest/tags", api.GetSuggestTags) + + // 上传资源 + privApi.POST("/attachment", api.UploadAttachment) + + // 下载资源预检 + privApi.GET("/attachment/precheck", api.DownloadAttachmentPrecheck) + + // 下载资源 + privApi.GET("/attachment", api.DownloadAttachment) + + // 发布动态 + privApi.POST("/post", api.CreatePost) + + // 删除动态 + privApi.DELETE("/post", api.DeletePost) + + // 获取动态点赞状态 + authApi.GET("/post/star", api.GetPostStar) + + // 动态点赞操作 + privApi.POST("/post/star", api.PostStar) + + // 获取动态收藏状态 + authApi.GET("/post/collection", api.GetPostCollection) + + // 动态收藏操作 + privApi.POST("/post/collection", api.PostCollection) + + // 锁定动态 + privApi.POST("/post/lock", api.LockPost) + + // 置顶动态 + privApi.POST("/post/stick", api.StickPost) + + // 修改动态可见度 + privApi.POST("/post/visibility", api.VisiblePost) + + // 发布动态评论 + privApi.POST("/post/comment", api.CreatePostComment) + + // 删除动态评论 + privApi.DELETE("/post/comment", api.DeletePostComment) + + // 发布评论回复 + privApi.POST("/post/comment/reply", api.CreatePostCommentReply) + + // 删除评论回复 + privApi.DELETE("/post/comment/reply", api.DeletePostCommentReply) + + // 管理·禁言/解封用户 + adminApi.POST("/admin/user/status", api.ChangeUserStatus) +} + +// routeLocalOSS register LocalOSS route if needed +func routeLocalOSS(e *gin.Engine) { + savePath, err := filepath.Abs(conf.LocalOSSSetting.SavePath) + if err != nil { + logrus.Fatalf("get localOSS save path err: %v", err) + } + e.Static("/oss", savePath) + + logrus.Infof("register LocalOSS route in /oss on save path: %s", savePath) +} + +// routeAlipay register Alipay feature releated route if needed +func routeAlipay(public gin.IRoutes, authApi gin.IRoutes) { + // 支付宝回调 + public.POST("/alipay/notify", api.AlipayNotify) + + // 用户充值 + authApi.POST("/user/recharge", api.GetUserRechargeLink) + + // 获取钱包余额 + authApi.GET("/user/recharge", api.GetUserRechargeResult) + + // 获取用户账单 + authApi.GET("/user/wallet/bills", api.GetUserWalletBills) +} + +// routeRelationship register Relationship releated routes +func routeRelationship(authApi gin.IRoutes) { + cfg.In(cfg.Actions{ + "Friendship": func() { + routeFriendship(authApi) + }, + "Followship": func() { + routeFollowship(authApi) + }, + }, func() { + // 暂时默认使用好友模式 + // TODO: 后期提供一种无关系模式(既不是好友模式也不是关注者模式)作为默认的关系模式 + routeFriendship(authApi) + }) +} + +// routeFriendship register Friendship feature releated routes +func routeFriendship(authApi gin.IRoutes) { + // 请求添加朋友 + authApi.POST("/friend/requesting", api.RequestingFriend) + + // 同意添加好友 + authApi.POST("/friend/add", api.AddFriend) + + // 拒绝添加好友 + authApi.POST("/friend/reject", api.RejectFriend) + + // 删除好友 + authApi.POST("/friend/delete", api.DeleteFriend) + + // 获取好友列表 + authApi.GET("/user/contacts", api.GetContacts) +} + +// routeFollowship register Followship feature releated routes +func routeFollowship(authApi gin.IRoutes) { + // TODO: register followship routes +} diff --git a/internal/routers/statick.go b/internal/servants/web/routers/statick.go similarity index 58% rename from internal/routers/statick.go rename to internal/servants/web/routers/statick.go index c20d5059..c1f2d1cb 100644 --- a/internal/routers/statick.go +++ b/internal/servants/web/routers/statick.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + //go:build !embed // +build !embed diff --git a/internal/routers/statick_embed.go b/internal/servants/web/routers/statick_embed.go similarity index 79% rename from internal/routers/statick_embed.go rename to internal/servants/web/routers/statick_embed.go index 2ea56171..dfc729f5 100644 --- a/internal/routers/statick_embed.go +++ b/internal/servants/web/routers/statick_embed.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + //go:build embed // +build embed diff --git a/internal/servants/web/utils.go b/internal/servants/web/utils.go new file mode 100644 index 00000000..e42e03b5 --- /dev/null +++ b/internal/servants/web/utils.go @@ -0,0 +1,205 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "image" + "math/rand" + "strings" + "time" + "unicode/utf8" + + "github.com/alimy/mir/v3" + "github.com/gofrs/uuid" + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/model/web" + "github.com/rocboss/paopao-ce/pkg/util" + "github.com/rocboss/paopao-ce/pkg/xerror" + "github.com/sirupsen/logrus" +) + +var defaultAvatars = []string{ + "https://assets.paopao.info/public/avatar/default/zoe.png", + "https://assets.paopao.info/public/avatar/default/william.png", + "https://assets.paopao.info/public/avatar/default/walter.png", + "https://assets.paopao.info/public/avatar/default/thomas.png", + "https://assets.paopao.info/public/avatar/default/taylor.png", + "https://assets.paopao.info/public/avatar/default/sophia.png", + "https://assets.paopao.info/public/avatar/default/sam.png", + "https://assets.paopao.info/public/avatar/default/ryan.png", + "https://assets.paopao.info/public/avatar/default/ruby.png", + "https://assets.paopao.info/public/avatar/default/quinn.png", + "https://assets.paopao.info/public/avatar/default/paul.png", + "https://assets.paopao.info/public/avatar/default/owen.png", + "https://assets.paopao.info/public/avatar/default/olivia.png", + "https://assets.paopao.info/public/avatar/default/norman.png", + "https://assets.paopao.info/public/avatar/default/nora.png", + "https://assets.paopao.info/public/avatar/default/natalie.png", + "https://assets.paopao.info/public/avatar/default/naomi.png", + "https://assets.paopao.info/public/avatar/default/miley.png", + "https://assets.paopao.info/public/avatar/default/mike.png", + "https://assets.paopao.info/public/avatar/default/lucas.png", + "https://assets.paopao.info/public/avatar/default/kylie.png", + "https://assets.paopao.info/public/avatar/default/julia.png", + "https://assets.paopao.info/public/avatar/default/joshua.png", + "https://assets.paopao.info/public/avatar/default/john.png", + "https://assets.paopao.info/public/avatar/default/jane.png", + "https://assets.paopao.info/public/avatar/default/jackson.png", + "https://assets.paopao.info/public/avatar/default/ivy.png", + "https://assets.paopao.info/public/avatar/default/isaac.png", + "https://assets.paopao.info/public/avatar/default/henry.png", + "https://assets.paopao.info/public/avatar/default/harry.png", + "https://assets.paopao.info/public/avatar/default/harold.png", + "https://assets.paopao.info/public/avatar/default/hanna.png", + "https://assets.paopao.info/public/avatar/default/grace.png", + "https://assets.paopao.info/public/avatar/default/george.png", + "https://assets.paopao.info/public/avatar/default/freddy.png", + "https://assets.paopao.info/public/avatar/default/frank.png", + "https://assets.paopao.info/public/avatar/default/finn.png", + "https://assets.paopao.info/public/avatar/default/emma.png", + "https://assets.paopao.info/public/avatar/default/emily.png", + "https://assets.paopao.info/public/avatar/default/edward.png", + "https://assets.paopao.info/public/avatar/default/clara.png", + "https://assets.paopao.info/public/avatar/default/claire.png", + "https://assets.paopao.info/public/avatar/default/chloe.png", + "https://assets.paopao.info/public/avatar/default/audrey.png", + "https://assets.paopao.info/public/avatar/default/arthur.png", + "https://assets.paopao.info/public/avatar/default/anna.png", + "https://assets.paopao.info/public/avatar/default/andy.png", + "https://assets.paopao.info/public/avatar/default/alfred.png", + "https://assets.paopao.info/public/avatar/default/alexa.png", + "https://assets.paopao.info/public/avatar/default/abigail.png", +} + +func getRandomAvatar() string { + rand.Seed(time.Now().UnixMicro()) + return defaultAvatars[rand.Intn(len(defaultAvatars))] +} + +// checkPassword 密码检查 +func checkPassword(password string) mir.Error { + // 检测用户是否合规 + if utf8.RuneCountInString(password) < 6 || utf8.RuneCountInString(password) > 16 { + return _errPasswordLengthLimit + } + return nil +} + +// ValidPassword 检查密码是否一致 +func validPassword(dbPassword, password, salt string) bool { + return strings.Compare(dbPassword, util.EncodeMD5(util.EncodeMD5(password)+salt)) == 0 +} + +// encryptPasswordAndSalt 密码加密&生成salt +func encryptPasswordAndSalt(password string) (string, string) { + salt := uuid.Must(uuid.NewV4()).String()[:8] + password = util.EncodeMD5(util.EncodeMD5(password) + salt) + return password, salt +} + +// deleteOssObjects 删除推文的媒体内容, 宽松处理错误(就是不处理), 后续完善 +func deleteOssObjects(oss core.ObjectStorageService, mediaContents []string) { + mediaContentsSize := len(mediaContents) + if mediaContentsSize > 1 { + objectKeys := make([]string, 0, mediaContentsSize) + for _, cUrl := range mediaContents { + objectKeys = append(objectKeys, oss.ObjectKey(cUrl)) + } + // TODO: 优化处理尽量使用channel传递objectKeys使用可控数量的Goroutine集中处理object删除动作,后续完善 + go oss.DeleteObjects(objectKeys) + } else if mediaContentsSize == 1 { + oss.DeleteObject(oss.ObjectKey(mediaContents[0])) + } +} + +// persistMediaContents 获取媒体内容并持久化 +func persistMediaContents(oss core.ObjectStorageService, contents []*web.PostContentItem) (items []string, err error) { + items = make([]string, 0, len(contents)) + for _, item := range contents { + switch item.Type { + case core.ContentTypeImage, + core.ContentTypeVideo, + core.ContentTypeAudio, + core.ContentTypeAttachment, + core.ContentTypeChargeAttachment: + items = append(items, item.Content) + if err != nil { + continue + } + if err = oss.PersistObject(oss.ObjectKey(item.Content)); err != nil { + logrus.Errorf("service.persistMediaContents failed: %s", err) + } + } + } + return +} + +func fileCheck(uploadType string, size int64) mir.Error { + if uploadType != "public/video" && + uploadType != "public/image" && + uploadType != "public/avatar" && + uploadType != "attachment" { + return xerror.InvalidParams + } + if size > 1024*1024*100 { + return _errFileInvalidSize.WithDetails("最大允许100MB") + } + return nil +} + +func getFileExt(s string) (string, mir.Error) { + switch s { + case "image/png": + return ".png", nil + case "image/jpg": + return ".jpg", nil + case "image/jpeg": + return ".jpeg", nil + case "image/gif": + return ".gif", nil + case "video/mp4": + return ".mp4", nil + case "video/quicktime": + return ".mov", nil + case "application/zip": + return ".zip", nil + default: + return "", _errFileInvalidExt.WithDetails("仅允许 png/jpg/gif/mp4/mov/zip 类型") + } +} + +func generatePath(s string) string { + n := len(s) + if n <= 2 { + return s + } + return generatePath(s[:n-2]) + "/" + s[n-2:] +} + +func getImageSize(img image.Rectangle) (int, int) { + b := img.Bounds() + width := b.Max.X + height := b.Max.Y + return width, height +} + +func tagsFrom(originTags []string) []string { + tags := make([]string, 0, len(originTags)) + for _, tag := range originTags { + // TODO: 优化tag有效性检测 + if tag = strings.TrimSpace(tag); len(tag) > 0 { + tags = append(tags, tag) + } + } + return tags +} + +// checkPermision 检查是否拥有者或管理员 +func checkPermision(user *core.User, targetUserId int64) mir.Error { + if user == nil || (user.ID != targetUserId && !user.IsAdmin) { + return _errNoPermission + } + return nil +} diff --git a/internal/servants/web/web.go b/internal/servants/web/web.go new file mode 100644 index 00000000..f8a495ed --- /dev/null +++ b/internal/servants/web/web.go @@ -0,0 +1,83 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "sync" + + "github.com/alimy/cfg" + "github.com/gin-gonic/gin" + api "github.com/rocboss/paopao-ce/auto/api/v1" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/dao" + "github.com/rocboss/paopao-ce/internal/servants/base" + "github.com/sirupsen/logrus" + "github.com/smartwalle/alipay/v3" +) + +var ( + _EnablePhoneVerify bool + _onceInitial sync.Once +) + +// RouteWeb register web route +func RouteWeb(e *gin.Engine) { + lazyInitial() + oss := dao.ObjectStorageService() + ds := &base.DaoServant{ + Redis: conf.Redis, + Ds: dao.DataService(), + Ts: dao.TweetSearchService(), + } + // aways register servants + api.RegisterAdminServant(e, newAdminSrv(ds), newAdminBinding(), newAdminRender()) + api.RegisterCoreServant(e, newCoreSrv(ds, oss), newCoreBinding(), newCoreRender()) + api.RegisterLooseServant(e, newLooseSrv(ds), newLooseBinding(), newLooseRender()) + api.RegisterPrivServant(e, newPrivSrv(ds, oss), newPrivBinding(), newPrivRender()) + api.RegisterPubServant(e, newPubSrv(ds), newPubBinding(), newPubRender()) + // regster servants if needed by configure + cfg.In(cfg.Actions{ + "Alipay": func() { + client := mustAlipayClient() + api.RegisterAlipayPubServant(e, newAlipayPubSrv(ds), newAlipayPubBinding(client), newAlipayPubRender()) + api.RegisterAlipayPrivServant(e, newAlipayPrivSrv(ds, client), newAlipayPrivBinding(), newAlipayPrivRender()) + }, + "Followship": func() { + api.RegisterFollowshipServant(e, newFollowshipSrv(ds), newFollowshipBinding(), newFollowshipRender()) + }, + "Friendship": func() { + api.RegisterFriendshipServant(e, newFriendshipSrv(ds), newFriendshipBinding(), newFriendshipRender()) + }, + }) +} + +func mustAlipayClient() *alipay.Client { + s := conf.AlipaySetting + // 将 key 的验证调整到初始化阶段 + client, err := alipay.New(s.AppID, s.PrivateKey, s.InProduction) + if err != nil { + logrus.Fatalf("alipay.New err: %s", err) + } + // 加载应用公钥证书 + if err = client.LoadAppPublicCertFromFile(s.AppPublicCertFile); err != nil { + logrus.Fatalf("client.LoadAppPublicCertFromFile err: %s\n", err) + } + // 加载支付宝根证书 + if err = client.LoadAliPayRootCertFromFile(s.RootCertFile); err != nil { + logrus.Fatalf("client.LoadAliPayRootCertFromFile err: %s\n", err) + } + // 加载支付宝公钥证书 + if err = client.LoadAliPayPublicCertFromFile(s.PublicCertFile); err != nil { + logrus.Fatalf("client.LoadAliPayPublicCertFromFile err: %s\n", err) + } + return client +} + +// lazyInitial do some package lazy initialize for performance +func lazyInitial() { + _onceInitial.Do(func() { + _EnablePhoneVerify = cfg.If("Sms") + }) +} diff --git a/internal/servants/web/xerror.go b/internal/servants/web/xerror.go new file mode 100644 index 00000000..4de0f4b7 --- /dev/null +++ b/internal/servants/web/xerror.go @@ -0,0 +1,83 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package web + +import ( + "github.com/rocboss/paopao-ce/pkg/xerror" +) + +// nolint +var ( + _errUsernameHasExisted = xerror.NewError(20001, "用户名已存在") + _errUsernameLengthLimit = xerror.NewError(20002, "用户名长度3~12") + _errUsernameCharLimit = xerror.NewError(20003, "用户名只能包含字母、数字") + _errPasswordLengthLimit = xerror.NewError(20004, "密码长度6~16") + _errUserRegisterFailed = xerror.NewError(20005, "用户注册失败") + _errUserHasBeenBanned = xerror.NewError(20006, "该账户已被封停") + _errNoPermission = xerror.NewError(20007, "无权限执行该请求") + _errUserHasBindOTP = xerror.NewError(20008, "当前用户已绑定二次验证") + _errUserOTPInvalid = xerror.NewError(20009, "二次验证码验证失败") + _errUserNoBindOTP = xerror.NewError(20010, "当前用户未绑定二次验证") + _errErrorOldPassword = xerror.NewError(20011, "当前用户密码验证失败") + _errErrorCaptchaPassword = xerror.NewError(20012, "图形验证码验证失败") + _errAccountNoPhoneBind = xerror.NewError(20013, "拒绝操作: 账户未绑定手机号") + _errTooManyLoginError = xerror.NewError(20014, "登录失败次数过多,请稍后再试") + _errGetPhoneCaptchaError = xerror.NewError(20015, "短信验证码获取失败") + _errTooManyPhoneCaptchaSend = xerror.NewError(20016, "短信验证码获取次数已达今日上限") + _errExistedUserPhone = xerror.NewError(20017, "该手机号已被绑定") + _errErrorPhoneCaptcha = xerror.NewError(20018, "手机验证码不正确") + _errMaxPhoneCaptchaUseTimes = xerror.NewError(20019, "手机验证码已达最大使用次数") + _errNicknameLengthLimit = xerror.NewError(20020, "昵称长度2~12") + _errNoExistUsername = xerror.NewError(20021, "用户不存在") + _errNoAdminPermission = xerror.NewError(20022, "无管理权限") + + _errGetPostsFailed = xerror.NewError(30001, "获取动态列表失败") + _errCreatePostFailed = xerror.NewError(30002, "动态发布失败") + _errGetPostFailed = xerror.NewError(30003, "获取动态详情失败") + _errDeletePostFailed = xerror.NewError(30004, "动态删除失败") + _errLockPostFailed = xerror.NewError(30005, "动态锁定失败") + _errGetPostTagsFailed = xerror.NewError(30006, "获取话题列表失败") + _errInvalidDownloadReq = xerror.NewError(30007, "附件下载请求不合法") + _errDownloadReqError = xerror.NewError(30008, "附件下载请求失败") + _errInsuffientDownloadMoney = xerror.NewError(30009, "附件下载失败:账户资金不足") + _errDownloadExecFail = xerror.NewError(30010, "附件下载失败:扣费失败") + _errStickPostFailed = xerror.NewError(30011, "动态置顶失败") + _errVisblePostFailed = xerror.NewError(30012, "更新可见性失败") + + _errGetCommentsFailed = xerror.NewError(40001, "获取评论列表失败") + _errCreateCommentFailed = xerror.NewError(40002, "评论发布失败") + _errGetCommentFailed = xerror.NewError(40003, "获取评论详情失败") + _errDeleteCommentFailed = xerror.NewError(40004, "评论删除失败") + _errCreateReplyFailed = xerror.NewError(40005, "评论回复失败") + _errGetReplyFailed = xerror.NewError(40006, "获取评论详情失败") + _errMaxCommentCount = xerror.NewError(40007, "评论数已达最大限制") + + _errGetMessagesFailed = xerror.NewError(50001, "获取消息列表失败") + _errReadMessageFailed = xerror.NewError(50002, "标记消息已读失败") + _errSendWhisperFailed = xerror.NewError(50003, "私信发送失败") + _errNoWhisperToSelf = xerror.NewError(50004, "不允许给自己发送私信") + _errTooManyWhisperNum = xerror.NewError(50005, "今日私信次数已达上限") + + _errGetCollectionsFailed = xerror.NewError(60001, "获取收藏列表失败") + _errGetStarsFailed = xerror.NewError(60002, "获取点赞列表失败") + + _errRechargeReqFail = xerror.NewError(70001, "充值请求失败") + _errRechargeNotifyError = xerror.NewError(70002, "充值回调失败") + _errGetRechargeFailed = xerror.NewError(70003, "充值详情获取失败") + _errUserWalletBillsFailed = xerror.NewError(70004, "用户钱包账单获取失败") + + _errNoRequestingFriendToSelf = xerror.NewError(80001, "不允许添加自己为好友") + _errNotExistFriendId = xerror.NewError(80002, "好友id不存在") + _errSendRequestingFriendFailed = xerror.NewError(80003, "申请添加朋友请求发送失败") + _errAddFriendFailed = xerror.NewError(80004, "添加好友失败") + _errRejectFriendFailed = xerror.NewError(80005, "拒绝好友失败") + _errDeleteFriendFailed = xerror.NewError(80006, "删除好友失败") + _errGetContactsFailed = xerror.NewError(80007, "获取联系人列表失败") + _errNoActionToSelf = xerror.NewError(80008, "不允许对自己操作") + + _errFileUploadFailed = xerror.NewError(10200, "文件上传失败") + _errFileInvalidExt = xerror.NewError(10201, "文件类型不合法") + _errFileInvalidSize = xerror.NewError(10202, "文件大小超限") +) diff --git a/internal/service/admin.go b/internal/service/admin.go new file mode 100644 index 00000000..451a551f --- /dev/null +++ b/internal/service/admin.go @@ -0,0 +1,96 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "fmt" + "net/http" + + "github.com/Masterminds/semver/v3" + "github.com/fatih/color" + "github.com/gin-contrib/cors" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/servants" +) + +var ( + _ Service = (*adminService)(nil) +) + +type adminService struct { + *baseHttpService +} + +func (s *adminService) Name() string { + return "AdminService" +} + +func (s *adminService) Version() *semver.Version { + return semver.MustParse("v0.1.0") +} + +func (s *adminService) OnInit() error { + s.registerRoute(s, servants.RegisterAdminServants) + return nil +} + +func (s *adminService) String() string { + return fmt.Sprintf("listen on %s\n", color.GreenString("http://%s:%s", conf.AdminServerSetting.HttpIp, conf.AdminServerSetting.HttpPort)) +} + +func newAdminEngine() *gin.Engine { + e := gin.New() + e.HandleMethodNotAllowed = true + e.Use(gin.Logger()) + e.Use(gin.Recovery()) + + // 跨域配置 + corsConfig := cors.DefaultConfig() + corsConfig.AllowAllOrigins = true + corsConfig.AddAllowHeaders("Authorization") + e.Use(cors.New(corsConfig)) + + // 默认404 + e.NoRoute(func(c *gin.Context) { + c.JSON(http.StatusNotFound, gin.H{ + "code": 404, + "msg": "Not Found", + }) + }) + + // 默认405 + e.NoMethod(func(c *gin.Context) { + c.JSON(http.StatusMethodNotAllowed, gin.H{ + "code": 405, + "msg": "Method Not Allowed", + }) + }) + + return e +} + +func newAdminService() Service { + addr := conf.AdminServerSetting.HttpIp + ":" + conf.AdminServerSetting.HttpPort + server := httpServers.from(addr, func() *httpServer { + engine := newAdminEngine() + return &httpServer{ + baseServer: newBaseServe(), + e: engine, + server: &http.Server{ + Addr: addr, + Handler: engine, + ReadTimeout: conf.AdminServerSetting.GetReadTimeout(), + WriteTimeout: conf.AdminServerSetting.GetWriteTimeout(), + MaxHeaderBytes: 1 << 20, + }, + } + }) + return &adminService{ + baseHttpService: &baseHttpService{ + server: server, + }, + } +} diff --git a/internal/service/attachment.go b/internal/service/attachment.go deleted file mode 100644 index 432a1a2f..00000000 --- a/internal/service/attachment.go +++ /dev/null @@ -1,7 +0,0 @@ -package service - -import "github.com/rocboss/paopao-ce/internal/model" - -func CreateAttachment(attachment *model.Attachment) (*model.Attachment, error) { - return ds.CreateAttachment(attachment) -} diff --git a/internal/service/bot.go b/internal/service/bot.go new file mode 100644 index 00000000..ff2bd615 --- /dev/null +++ b/internal/service/bot.go @@ -0,0 +1,96 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "fmt" + "net/http" + + "github.com/Masterminds/semver/v3" + "github.com/fatih/color" + "github.com/gin-contrib/cors" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/servants" +) + +var ( + _ Service = (*botService)(nil) +) + +type botService struct { + *baseHttpService +} + +func (s *botService) Name() string { + return "BotService" +} + +func (s *botService) Version() *semver.Version { + return semver.MustParse("v0.1.0") +} + +func (s *botService) OnInit() error { + s.registerRoute(s, servants.RegisterBotServants) + return nil +} + +func (s *botService) String() string { + return fmt.Sprintf("listen on %s\n", color.GreenString("http://%s:%s", conf.BotServerSetting.HttpIp, conf.BotServerSetting.HttpPort)) +} + +func newBotEngine() *gin.Engine { + e := gin.New() + e.HandleMethodNotAllowed = true + e.Use(gin.Logger()) + e.Use(gin.Recovery()) + + // 跨域配置 + corsConfig := cors.DefaultConfig() + corsConfig.AllowAllOrigins = true + corsConfig.AddAllowHeaders("Authorization") + e.Use(cors.New(corsConfig)) + + // 默认404 + e.NoRoute(func(c *gin.Context) { + c.JSON(http.StatusNotFound, gin.H{ + "code": 404, + "msg": "Not Found", + }) + }) + + // 默认405 + e.NoMethod(func(c *gin.Context) { + c.JSON(http.StatusMethodNotAllowed, gin.H{ + "code": 405, + "msg": "Method Not Allowed", + }) + }) + + return e +} + +func newBotService() Service { + addr := conf.BotServerSetting.HttpIp + ":" + conf.BotServerSetting.HttpPort + server := httpServers.from(addr, func() *httpServer { + engine := newBotEngine() + return &httpServer{ + baseServer: newBaseServe(), + e: engine, + server: &http.Server{ + Addr: addr, + Handler: engine, + ReadTimeout: conf.BotServerSetting.GetReadTimeout(), + WriteTimeout: conf.BotServerSetting.GetWriteTimeout(), + MaxHeaderBytes: 1 << 20, + }, + } + }) + return &botService{ + baseHttpService: &baseHttpService{ + server: server, + }, + } +} diff --git a/internal/service/docs.go b/internal/service/docs.go new file mode 100644 index 00000000..86983dbd --- /dev/null +++ b/internal/service/docs.go @@ -0,0 +1,63 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "fmt" + "net/http" + + "github.com/Masterminds/semver/v3" + "github.com/fatih/color" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/servants" +) + +var ( + _ Service = (*docsService)(nil) +) + +type docsService struct { + *baseHttpService +} + +func (s *docsService) Name() string { + return "DocsService" +} + +func (s *docsService) Version() *semver.Version { + return semver.MustParse("v0.1.0") +} + +func (s *docsService) OnInit() error { + s.registerRoute(s, servants.RegisterDocsServants) + return nil +} + +func (s *docsService) String() string { + return fmt.Sprintf("listen on %s\n", color.GreenString("http://%s:%s", conf.DocsServerSetting.HttpIp, conf.DocsServerSetting.HttpPort)) +} + +func newDocsService() Service { + addr := conf.DocsServerSetting.HttpIp + ":" + conf.DocsServerSetting.HttpPort + server := httpServers.from(addr, func() *httpServer { + engine := newWebEngine() + return &httpServer{ + baseServer: newBaseServe(), + e: engine, + server: &http.Server{ + Addr: addr, + Handler: engine, + ReadTimeout: conf.DocsServerSetting.GetReadTimeout(), + WriteTimeout: conf.DocsServerSetting.GetWriteTimeout(), + MaxHeaderBytes: 1 << 20, + }, + } + }) + return &docsService{ + baseHttpService: &baseHttpService{ + server: server, + }, + } +} diff --git a/internal/service/frontend_web.go b/internal/service/frontend_web.go new file mode 100644 index 00000000..2ed1e116 --- /dev/null +++ b/internal/service/frontend_web.go @@ -0,0 +1,63 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "fmt" + "net/http" + + "github.com/Masterminds/semver/v3" + "github.com/fatih/color" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/servants" +) + +var ( + _ Service = (*frontendWebService)(nil) +) + +type frontendWebService struct { + *baseHttpService +} + +func (s *frontendWebService) Name() string { + return "FrontendWebService" +} + +func (s *frontendWebService) Version() *semver.Version { + return semver.MustParse("v0.1.0") +} + +func (s *frontendWebService) OnInit() error { + s.registerRoute(s, servants.RegisterFrontendWebServants) + return nil +} + +func (s *frontendWebService) String() string { + return fmt.Sprintf("listen on %s\n", color.GreenString("http://%s:%s", conf.FrontendWebSetting.HttpIp, conf.FrontendWebSetting.HttpPort)) +} + +func newFrontendWebServiceService() Service { + addr := conf.FrontendWebSetting.HttpIp + ":" + conf.FrontendWebSetting.HttpPort + server := httpServers.from(addr, func() *httpServer { + engine := newWebEngine() + return &httpServer{ + baseServer: newBaseServe(), + e: engine, + server: &http.Server{ + Addr: addr, + Handler: engine, + ReadTimeout: conf.FrontendWebSetting.GetReadTimeout(), + WriteTimeout: conf.FrontendWebSetting.GetWriteTimeout(), + MaxHeaderBytes: 1 << 20, + }, + } + }) + return &frontendWebService{ + baseHttpService: &baseHttpService{ + server: server, + }, + } +} diff --git a/internal/service/grpc_server.go b/internal/service/grpc_server.go new file mode 100644 index 00000000..6b8589db --- /dev/null +++ b/internal/service/grpc_server.go @@ -0,0 +1,32 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "net" + + "google.golang.org/grpc" +) + +var ( + _ server = (*grpcServer)(nil) +) + +// grpcServer wraper for grpc.Server +type grpcServer struct { + *baseServer + + listener net.Listener + server *grpc.Server +} + +func (s *grpcServer) start() error { + return s.server.Serve(s.listener) +} + +func (s *grpcServer) stop() error { + s.server.Stop() + return nil +} diff --git a/internal/service/grpc_service.go b/internal/service/grpc_service.go new file mode 100644 index 00000000..fd32286a --- /dev/null +++ b/internal/service/grpc_service.go @@ -0,0 +1,30 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "google.golang.org/grpc" +) + +type baseGRPCService struct { + baseService + + server *grpcServer +} + +func (s *baseGRPCService) registerServer(srv Service, h func(s *grpc.Server)) { + h(s.server.server) + s.server.addService(srv) +} + +func (s *baseGRPCService) OnStart() error { + // do nothing default + return nil +} + +func (s *baseGRPCService) OnStop() error { + // do nothing default + return nil +} diff --git a/internal/service/http_server.go b/internal/service/http_server.go new file mode 100644 index 00000000..1a412ce9 --- /dev/null +++ b/internal/service/http_server.go @@ -0,0 +1,32 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" +) + +var ( + _ server = (*httpServer)(nil) +) + +// httpServer wraper for gin.engine and http.Server +type httpServer struct { + *baseServer + + e *gin.Engine + server *http.Server +} + +func (s *httpServer) start() error { + return s.server.ListenAndServe() +} + +func (s *httpServer) stop() error { + return s.server.Shutdown(context.Background()) +} diff --git a/internal/service/http_service.go b/internal/service/http_service.go new file mode 100644 index 00000000..df93786c --- /dev/null +++ b/internal/service/http_service.go @@ -0,0 +1,30 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "github.com/gin-gonic/gin" +) + +type baseHttpService struct { + baseService + + server *httpServer +} + +func (s *baseHttpService) registerRoute(srv Service, h func(e *gin.Engine)) { + h(s.server.e) + s.server.addService(srv) +} + +func (s *baseHttpService) OnStart() error { + // do nothing default + return nil +} + +func (s *baseHttpService) OnStop() error { + // do nothing default + return nil +} diff --git a/internal/service/localoss.go b/internal/service/localoss.go new file mode 100644 index 00000000..0a561ed4 --- /dev/null +++ b/internal/service/localoss.go @@ -0,0 +1,71 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "fmt" + "net/http" + + "github.com/Masterminds/semver/v3" + "github.com/fatih/color" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/servants" +) + +var ( + _ Service = (*localossService)(nil) +) + +type localossService struct { + *baseHttpService +} + +func (s *localossService) Name() string { + return "LocalossService" +} + +func (s *localossService) Version() *semver.Version { + return semver.MustParse("v0.1.0") +} + +func (s *localossService) OnInit() error { + s.registerRoute(s, servants.RegisterLocalossServants) + return nil +} + +func (s *localossService) String() string { + return fmt.Sprintf("listen on %s\n", color.GreenString("http://%s:%s", conf.LocalossServerSetting.HttpIp, conf.LocalossServerSetting.HttpPort)) +} + +func newLocalossEngine() *gin.Engine { + e := gin.New() + e.Use(gin.Logger()) + e.Use(gin.Recovery()) + return e +} + +func newLocalossService() Service { + addr := conf.LocalossServerSetting.HttpIp + ":" + conf.LocalossServerSetting.HttpPort + server := httpServers.from(addr, func() *httpServer { + engine := newLocalossEngine() + return &httpServer{ + baseServer: newBaseServe(), + e: engine, + server: &http.Server{ + Addr: addr, + Handler: engine, + ReadTimeout: conf.LocalossServerSetting.GetReadTimeout(), + WriteTimeout: conf.LocalossServerSetting.GetWriteTimeout(), + MaxHeaderBytes: 1 << 20, + }, + } + }) + return &localossService{ + baseHttpService: &baseHttpService{ + server: server, + }, + } +} diff --git a/internal/service/mobile.go b/internal/service/mobile.go new file mode 100644 index 00000000..8d88056e --- /dev/null +++ b/internal/service/mobile.go @@ -0,0 +1,67 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "fmt" + "log" + "net" + + "github.com/Masterminds/semver/v3" + "github.com/fatih/color" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/servants" + "google.golang.org/grpc" +) + +var ( + _ Service = (*mobileService)(nil) +) + +type mobileService struct { + *baseGRPCService +} + +func (s *mobileService) Name() string { + return "MobileService" +} + +func (s *mobileService) Version() *semver.Version { + return semver.MustParse("v0.1.0") +} + +func (s *mobileService) OnInit() error { + s.registerServer(s, servants.RegisterMobileServants) + return nil +} + +func (s *mobileService) String() string { + return fmt.Sprintf("listen on %s\n", color.GreenString("http://%s:%s", conf.MobileServerSetting.Host, conf.MobileServerSetting.Port)) +} + +func newMobileService() Service { + addr := conf.MobileServerSetting.Host + ":" + conf.MobileServerSetting.Port + server := grpcServers.from(addr, func() *grpcServer { + l, err := net.Listen("tcp", addr) + if err != nil { + // TODO: optimize error process + log.Fatal(fmt.Errorf("failed to listen: %w", err)) + } + + // TODO: init grpc.Server + s := grpc.NewServer() + + return &grpcServer{ + baseServer: newBaseServe(), + listener: l, + server: s, + } + }) + return &mobileService{ + baseGRPCService: &baseGRPCService{ + server: server, + }, + } +} diff --git a/internal/service/server.go b/internal/service/server.go new file mode 100644 index 00000000..5ebbca04 --- /dev/null +++ b/internal/service/server.go @@ -0,0 +1,190 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "fmt" + "sync" + + "github.com/fatih/color" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/pkg/util" +) + +var ( + httpServers = newServerPool[*httpServer]() + grpcServers = newServerPool[*grpcServer]() +) + +const ( + actOnStart byte = iota + actOnStop + actStart + actStop +) + +type server interface { + start() error + stop() error + services() []Service +} + +type serverPool[T server] struct { + servers map[string]T +} + +type baseServer struct { + ss map[string]Service +} + +func (p *serverPool[T]) from(addr string, newServer func() T) T { + s, exist := p.servers[addr] + if exist { + return s + } + s = newServer() + p.servers[addr] = s + return s +} + +func (p *serverPool[T]) startServer(wg *sync.WaitGroup, maxSidSize int) { + for _, srv := range p.servers { + wg.Add(1) + go func(t T) { + ss := t.services() + if len(ss) < 1 { + return + } + for _, s := range ss { + colorPrint(actOnStart, s.OnStart(), maxSidSize, s) + } + colorPrint(actStart, t.start(), maxSidSize, ss...) + // remember to done sync.WaitGroup + wg.Done() + }(srv) + } +} + +func (p *serverPool[T]) stopServer(maxSidSize int) { + for _, srv := range p.servers { + ss := srv.services() + if len(ss) < 1 { + return + } + for _, s := range ss { + colorPrint(actOnStop, s.OnStop(), maxSidSize, s) + } + colorPrint(actStop, srv.stop(), maxSidSize, ss...) + } +} + +func (p *serverPool[T]) allServices() (ss []Service) { + for _, srv := range p.servers { + ss = append(ss, srv.services()...) + } + return +} + +func (s *baseServer) addService(srv Service) { + if srv != nil { + sid := srv.Name() + "@" + srv.Version().String() + s.ss[sid] = srv + } +} + +func (s *baseServer) services() (ss []Service) { + for _, s := range s.ss { + ss = append(ss, s) + } + return +} + +func newServerPool[T server]() *serverPool[T] { + return &serverPool[T]{ + servers: make(map[string]T), + } +} + +func newBaseServe() *baseServer { + return &baseServer{ + ss: make(map[string]Service), + } +} + +func checkServices() (int, int) { + var ss []Service + ss = append(ss, httpServers.allServices()...) + ss = append(ss, grpcServers.allServices()...) + return len(ss), maxSidSize(ss) +} + +// maxSidSize max service id string length +func maxSidSize(ss []Service) int { + length := 0 + for _, s := range ss { + size := len(s.Name() + "@" + s.Version().String()) + if size > length { + length = size + } + } + return length +} + +func colorPrint(act byte, err error, l int, ss ...Service) { + s := ss[0] + switch act { + case actOnStart: + if err == nil { + fmt.Fprintf(color.Output, "%s [start] - %s", util.SidStr(s.Name(), s.Version(), l), s) + } else { + fmt.Fprintf(color.Output, "%s [start] - run OnStart error: %s\n", util.SidStr(s.Name(), s.Version(), l), err) + } + case actOnStop: + if err == nil { + fmt.Fprintf(color.Output, "%s [stop] - finish...\n", util.SidStr(s.Name(), s.Version(), l)) + } else { + fmt.Fprintf(color.Output, "%s [stop] - run OnStop error: %s\n", util.SidStr(s.Name(), s.Version(), l), err) + } + case actStart: + if err != nil { + for _, s = range ss { + fmt.Fprintf(color.Output, "%s [start] - starting server occurs error: %s\n", util.SidStr(s.Name(), s.Version(), l), err) + } + } + case actStop: + if err != nil { + for _, s = range ss { + fmt.Fprintf(color.Output, "%s [stop] - stopping server occurs error: %s\n", util.SidStr(s.Name(), s.Version(), l), err) + } + } + } +} + +// Start start all servers +func Start(wg *sync.WaitGroup) { + srvSize, maxSidSize := checkServices() + if srvSize < 1 { + return + } + + // some initialize for server engine + gin.SetMode(conf.RunMode()) + + // start servers + httpServers.startServer(wg, maxSidSize) + grpcServers.startServer(wg, maxSidSize) +} + +// Stop stop all servers +func Stop() { + srvSize, maxSidSize := checkServices() + if srvSize < 1 { + return + } + // stop servers + httpServers.stopServer(maxSidSize) + grpcServers.stopServer(maxSidSize) +} diff --git a/internal/service/service.go b/internal/service/service.go index d7afba23..7af409f3 100644 --- a/internal/service/service.go +++ b/internal/service/service.go @@ -1,45 +1,80 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package service import ( - "github.com/rocboss/paopao-ce/internal/conf" - "github.com/rocboss/paopao-ce/internal/core" - "github.com/rocboss/paopao-ce/internal/dao" - "github.com/rocboss/paopao-ce/internal/model" - "github.com/sirupsen/logrus" -) + "log" -var ( - ds core.DataService - ts core.TweetSearchService - oss core.ObjectStorageService - DisablePhoneVerify bool + "github.com/Masterminds/semver/v3" + "github.com/alimy/cfg" + "github.com/rocboss/paopao-ce/pkg/types" ) -func Initialize() { - ds = dao.DataService() - ts = dao.TweetSearchService() - oss = dao.ObjectStorageService() - DisablePhoneVerify = !conf.CfgIf("Sms") +type Service interface { + Name() string + Version() *semver.Version + OnInit() error + OnStart() error + OnStop() error +} + +type baseService types.Empty + +func (baseService) Name() string { + return "" } -// persistMediaContents 获取媒体内容并持久化 -func persistMediaContents(contents []*PostContentItem) (items []string, err error) { - items = make([]string, 0, len(contents)) - for _, item := range contents { - switch item.Type { - case model.CONTENT_TYPE_IMAGE, - model.CONTENT_TYPE_VIDEO, - model.CONTENT_TYPE_AUDIO, - model.CONTENT_TYPE_ATTACHMENT, - model.CONTENT_TYPE_CHARGE_ATTACHMENT: - items = append(items, item.Content) - if err != nil { - continue - } - if err = oss.PersistObject(oss.ObjectKey(item.Content)); err != nil { - logrus.Errorf("service.persistMediaContents failed: %s", err) - } +func (baseService) Version() *semver.Version { + return semver.MustParse("v0.0.1") +} + +func (baseService) String() string { + return "" +} + +// MustInitService Initial service +func MustInitService() []Service { + ss := newService() + for _, s := range ss { + if err := s.OnInit(); err != nil { + log.Fatalf("initial %s service error: %s", s.Name(), err) } } + return ss +} + +func newService() (ss []Service) { + // add all service if declared in features on config.yaml + cfg.In(cfg.Actions{ + "Web": func() { + ss = append(ss, newWebService()) + }, + "Admin": func() { + ss = append(ss, newAdminService()) + }, + "SpaceX": func() { + ss = append(ss, newSpaceXService()) + }, + "Bot": func() { + ss = append(ss, newBotService()) + }, + "NativeOBS": func() { + ss = append(ss, newLocalossService()) + }, + "Mobile": func() { + ss = append(ss, newMobileService()) + }, + "Frontend:Web": func() { + ss = append(ss, newFrontendWebServiceService()) + }, + "Docs": func() { + ss = append(ss, newDocsService()) + }, + "Deprecated:OldWeb": func() { + ss = append(ss, newOldWebService()) + }, + }) return } diff --git a/internal/service/space.go b/internal/service/space.go new file mode 100644 index 00000000..989defe1 --- /dev/null +++ b/internal/service/space.go @@ -0,0 +1,96 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "fmt" + "net/http" + + "github.com/Masterminds/semver/v3" + "github.com/fatih/color" + "github.com/gin-contrib/cors" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/servants" +) + +var ( + _ Service = (*spaceXService)(nil) +) + +type spaceXService struct { + *baseHttpService +} + +func (s *spaceXService) Name() string { + return "SpaceXService" +} + +func (s *spaceXService) Version() *semver.Version { + return semver.MustParse("v0.1.0") +} + +func (s *spaceXService) OnInit() error { + s.registerRoute(s, servants.RegisterSpaceXServants) + return nil +} + +func (s *spaceXService) String() string { + return fmt.Sprintf("listen on %s\n", color.GreenString("http://%s:%s", conf.SpaceXServerSetting.HttpIp, conf.SpaceXServerSetting.HttpPort)) +} + +func newSpaceXEngine() *gin.Engine { + e := gin.New() + e.HandleMethodNotAllowed = true + e.Use(gin.Logger()) + e.Use(gin.Recovery()) + + // 跨域配置 + corsConfig := cors.DefaultConfig() + corsConfig.AllowAllOrigins = true + corsConfig.AddAllowHeaders("Authorization") + e.Use(cors.New(corsConfig)) + + // 默认404 + e.NoRoute(func(c *gin.Context) { + c.JSON(http.StatusNotFound, gin.H{ + "code": 404, + "msg": "Not Found", + }) + }) + + // 默认405 + e.NoMethod(func(c *gin.Context) { + c.JSON(http.StatusMethodNotAllowed, gin.H{ + "code": 405, + "msg": "Method Not Allowed", + }) + }) + + return e +} + +func newSpaceXService() Service { + addr := conf.SpaceXServerSetting.HttpIp + ":" + conf.SpaceXServerSetting.HttpPort + server := httpServers.from(addr, func() *httpServer { + engine := newSpaceXEngine() + return &httpServer{ + baseServer: newBaseServe(), + e: engine, + server: &http.Server{ + Addr: addr, + Handler: engine, + ReadTimeout: conf.SpaceXServerSetting.GetReadTimeout(), + WriteTimeout: conf.SpaceXServerSetting.GetWriteTimeout(), + MaxHeaderBytes: 1 << 20, + }, + } + }) + return &spaceXService{ + baseHttpService: &baseHttpService{ + server: server, + }, + } +} diff --git a/internal/service/web.go b/internal/service/web.go new file mode 100644 index 00000000..925c03c2 --- /dev/null +++ b/internal/service/web.go @@ -0,0 +1,96 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "fmt" + "net/http" + + "github.com/Masterminds/semver/v3" + "github.com/fatih/color" + "github.com/gin-contrib/cors" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/servants" +) + +var ( + _ Service = (*webService)(nil) +) + +type webService struct { + *baseHttpService +} + +func (s *webService) Name() string { + return "WebService" +} + +func (s *webService) Version() *semver.Version { + return semver.MustParse("v0.1.0") +} + +func (s *webService) OnInit() error { + s.registerRoute(s, servants.RegisterWebServants) + return nil +} + +func (s *webService) String() string { + return fmt.Sprintf("listen on %s\n", color.GreenString("http://%s:%s", conf.WebServerSetting.HttpIp, conf.WebServerSetting.HttpPort)) +} + +func newWebEngine() *gin.Engine { + e := gin.New() + e.HandleMethodNotAllowed = true + e.Use(gin.Logger()) + e.Use(gin.Recovery()) + + // 跨域配置 + corsConfig := cors.DefaultConfig() + corsConfig.AllowAllOrigins = true + corsConfig.AddAllowHeaders("Authorization") + e.Use(cors.New(corsConfig)) + + // 默认404 + e.NoRoute(func(c *gin.Context) { + c.JSON(http.StatusNotFound, gin.H{ + "code": 404, + "msg": "Not Found", + }) + }) + + // 默认405 + e.NoMethod(func(c *gin.Context) { + c.JSON(http.StatusMethodNotAllowed, gin.H{ + "code": 405, + "msg": "Method Not Allowed", + }) + }) + + return e +} + +func newWebService() Service { + addr := conf.WebServerSetting.HttpIp + ":" + conf.WebServerSetting.HttpPort + server := httpServers.from(addr, func() *httpServer { + engine := newWebEngine() + return &httpServer{ + baseServer: newBaseServe(), + e: engine, + server: &http.Server{ + Addr: addr, + Handler: engine, + ReadTimeout: conf.WebServerSetting.GetReadTimeout(), + WriteTimeout: conf.WebServerSetting.GetWriteTimeout(), + MaxHeaderBytes: 1 << 20, + }, + } + }) + return &webService{ + baseHttpService: &baseHttpService{ + server: server, + }, + } +} diff --git a/internal/service/web_old.go b/internal/service/web_old.go new file mode 100644 index 00000000..9b3fbe9a --- /dev/null +++ b/internal/service/web_old.go @@ -0,0 +1,63 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "fmt" + "net/http" + + "github.com/Masterminds/semver/v3" + "github.com/fatih/color" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/servants/web/routers" +) + +var ( + _ Service = (*oldWebService)(nil) +) + +type oldWebService struct { + *baseHttpService +} + +func (s *oldWebService) Name() string { + return "OldWebService" +} + +func (s *oldWebService) Version() *semver.Version { + return semver.MustParse("v0.1.0") +} + +func (s *oldWebService) OnInit() error { + s.registerRoute(s, routers.RegisterRoute) + return nil +} + +func (s *oldWebService) String() string { + return fmt.Sprintf("listen on %s\n", color.GreenString("http://%s:%s", conf.ServerSetting.HttpIp, conf.ServerSetting.HttpPort)) +} + +func newOldWebService() Service { + addr := conf.ServerSetting.HttpIp + ":" + conf.ServerSetting.HttpPort + server := httpServers.from(addr, func() *httpServer { + engine := newWebEngine() + return &httpServer{ + baseServer: newBaseServe(), + e: engine, + server: &http.Server{ + Addr: addr, + Handler: engine, + ReadTimeout: conf.ServerSetting.GetReadTimeout(), + WriteTimeout: conf.ServerSetting.GetWriteTimeout(), + MaxHeaderBytes: 1 << 20, + }, + } + }) + return &oldWebService{ + baseHttpService: &baseHttpService{ + server: server, + }, + } +} diff --git a/internal/timeline/README.md b/internal/timeline/README.md new file mode 100644 index 00000000..fd1f55fe --- /dev/null +++ b/internal/timeline/README.md @@ -0,0 +1,2 @@ +### Timeline(Timeline Message Flow System +广场时间线消息流系统模块, 目前还没实现,先占个位置~ diff --git a/internal/timeline/timeline.go b/internal/timeline/timeline.go new file mode 100644 index 00000000..13663547 --- /dev/null +++ b/internal/timeline/timeline.go @@ -0,0 +1,5 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package timeline diff --git a/internal/xds/README.md b/internal/xds/README.md new file mode 100644 index 00000000..8ea9592e --- /dev/null +++ b/internal/xds/README.md @@ -0,0 +1,2 @@ +### xDS(Recommended Discovery System) +推荐发现系统模块,目前还没实现,先占个位置~ diff --git a/internal/xds/xds.go b/internal/xds/xds.go new file mode 100644 index 00000000..3f0f20b5 --- /dev/null +++ b/internal/xds/xds.go @@ -0,0 +1,5 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package xds diff --git a/main.go b/main.go index 1046e97d..9245cc24 100644 --- a/main.go +++ b/main.go @@ -1,17 +1,22 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package main import ( "flag" "fmt" - "log" - "net/http" + "os" + "os/signal" "strings" + "sync" + "syscall" "github.com/fatih/color" - "github.com/gin-gonic/gin" "github.com/rocboss/paopao-ce/internal" "github.com/rocboss/paopao-ce/internal/conf" - "github.com/rocboss/paopao-ce/internal/routers" + "github.com/rocboss/paopao-ce/internal/service" "github.com/rocboss/paopao-ce/pkg/debug" "github.com/rocboss/paopao-ce/pkg/util" ) @@ -42,29 +47,39 @@ func init() { } func flagParse() { - flag.BoolVar(&noDefaultFeatures, "no-default-features", false, "whether use default features") + flag.BoolVar(&noDefaultFeatures, "no-default-features", false, "whether not use default features") flag.Var(&features, "features", "use special features") flag.Parse() } func main() { - gin.SetMode(conf.ServerSetting.RunMode) - - router := routers.NewRouter() - s := &http.Server{ - Addr: conf.ServerSetting.HttpIp + ":" + conf.ServerSetting.HttpPort, - Handler: router, - ReadTimeout: conf.ServerSetting.ReadTimeout, - WriteTimeout: conf.ServerSetting.WriteTimeout, - MaxHeaderBytes: 1 << 20, + util.PrintHelloBanner(debug.VersionInfo()) + ss := service.MustInitService() + if len(ss) < 1 { + fmt.Fprintln(color.Output, "no service need start so just exit") + return } - util.PrintHelloBanner(debug.VersionInfo()) - fmt.Fprintf(color.Output, "PaoPao service listen on %s\n", - color.GreenString(fmt.Sprintf("http://%s:%s", conf.ServerSetting.HttpIp, conf.ServerSetting.HttpPort)), - ) + // start pyroscope if need + debug.StartPyroscope() - if err := s.ListenAndServe(); err != nil { - log.Fatalf("run app failed: %s", err) - } + // start services + wg := &sync.WaitGroup{} + fmt.Fprintf(color.Output, "\nstarting run service...\n\n") + service.Start(wg) + + // graceful stop services + wg.Add(1) + go func() { + quit := make(chan os.Signal, 1) + // kill (no param) default send syscall.SIGTERM + // kill -2 is syscall.SIGINT + // kill -9 is syscall.SIGKILL but can't be catch, so don't need add it + signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) + <-quit + fmt.Fprintf(color.Output, "\nshutting down server...\n\n") + service.Stop() + wg.Done() + }() + wg.Wait() } diff --git a/mirc/README.md b/mirc/README.md new file mode 100644 index 00000000..7e7aa864 --- /dev/null +++ b/mirc/README.md @@ -0,0 +1,10 @@ +### RESTful API for paopao-ce +本目录包含所有RESTful API相关定义文件 + +|服务|目录|系列API| url前缀|备注| +| ----- | ----- | ----- | ----- | ----- | +|Web|web|/|/|Web系列RESTful API相关定义文件| +|Admin|admin|m|/m/|Admin后台运维系列相关RESTful API相关定义文件| +|SpaceX|space|x|/x/|SpaceX系列相关RESTful API相关定义文件| +|NativeOBS|localoss|s|/s/| NativeOBS系列RESTful API相关定义文件| +|Bot|bot|r| /r/|Bot系列相关RESTful API相关定义文件| diff --git a/mirc/admin/README.md b/mirc/admin/README.md new file mode 100644 index 00000000..c9fa71b9 --- /dev/null +++ b/mirc/admin/README.md @@ -0,0 +1,4 @@ +### Admin系列RESTful API相关定义文件 +本目录包含 Admin后台运维相关API定义文件。 + +* v1 - v1版本API diff --git a/mirc/admin/v1/user.go b/mirc/admin/v1/user.go new file mode 100644 index 00000000..6f0dcb79 --- /dev/null +++ b/mirc/admin/v1/user.go @@ -0,0 +1,42 @@ +package v1 + +import ( + . "github.com/alimy/mir/v3" + . "github.com/alimy/mir/v3/engine" +) + +func init() { + AddEntry(new(User)) +} + +type AgentInfo struct { + Platform string `json:"platform"` + UserAgent string `json:"user_agent"` +} + +type ServerInfo struct { + ApiVer string `json:"api_ver"` +} + +type UserInfo struct { + Name string `json:"name"` +} + +type LoginReq struct { + AgentInfo AgentInfo `json:"agent_info"` + Name string `json:"name"` + Passwd string `json:"passwd"` +} + +type LoginResp struct { + UserInfo + ServerInfo ServerInfo `json:"server_info"` + JwtToken string `json:"jwt_token"` +} + +type User struct { + Chain Chain `mir:"-"` + Group Group `mir:"m/v1"` + Login func(Post, LoginReq) LoginResp `mir:"/user/login/"` + Logout func(Post) `mir:"/user/logout/"` +} diff --git a/mirc/bot/README.md b/mirc/bot/README.md new file mode 100644 index 00000000..a1aa83ac --- /dev/null +++ b/mirc/bot/README.md @@ -0,0 +1,4 @@ +### Bot系列RESTful API相关定义文件 +本目录包含 Bot相关API定义文件。 + +* v1 - v1版本API diff --git a/mirc/bot/v1/user.go b/mirc/bot/v1/user.go new file mode 100644 index 00000000..a4839673 --- /dev/null +++ b/mirc/bot/v1/user.go @@ -0,0 +1,42 @@ +package v1 + +import ( + . "github.com/alimy/mir/v3" + . "github.com/alimy/mir/v3/engine" +) + +func init() { + AddEntry(new(User)) +} + +type AgentInfo struct { + Platform string `json:"platform"` + UserAgent string `json:"user_agent"` +} + +type ServerInfo struct { + ApiVer string `json:"api_ver"` +} + +type UserInfo struct { + Name string `json:"name"` +} + +type LoginReq struct { + AgentInfo AgentInfo `json:"agent_info"` + Name string `json:"name"` + Passwd string `json:"passwd"` +} + +type LoginResp struct { + UserInfo + ServerInfo ServerInfo `json:"server_info"` + JwtToken string `json:"jwt_token"` +} + +type User struct { + Chain Chain `mir:"-"` + Group Group `mir:"r/v1"` + Login func(Post, LoginReq) LoginResp `mir:"/user/login/"` + Logout func(Post) `mir:"/user/logout/"` +} diff --git a/mirc/gen.go b/mirc/gen.go new file mode 100644 index 00000000..15574b06 --- /dev/null +++ b/mirc/gen.go @@ -0,0 +1,36 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +//go:build generate +// +build generate + +package main + +import ( + "log" + + . "github.com/alimy/mir/v3/core" + . "github.com/alimy/mir/v3/engine" + + _ "github.com/rocboss/paopao-ce/mirc/admin/v1" + _ "github.com/rocboss/paopao-ce/mirc/bot/v1" + _ "github.com/rocboss/paopao-ce/mirc/localoss/v1" + _ "github.com/rocboss/paopao-ce/mirc/space/v1" + _ "github.com/rocboss/paopao-ce/mirc/web/v1" +) + +//go:generate go run $GOFILE +func main() { + log.Println("generate code start") + opts := Options{ + RunMode(InSerialMode), + GeneratorName(GeneratorGin), + WatchCtxDone(true), + SinkPath("../auto"), + } + if err := Generate(opts); err != nil { + log.Fatal(err) + } + log.Println("generate code finish") +} diff --git a/mirc/localoss/README.md b/mirc/localoss/README.md new file mode 100644 index 00000000..e1769bf5 --- /dev/null +++ b/mirc/localoss/README.md @@ -0,0 +1,4 @@ +### LocalOSS OBS系列RESTful API相关定义文件 +本目录包含 LocalOSS OBS 系列相关API定义文件。 + +* v1 - v1版本API diff --git a/mirc/localoss/v1/user.go b/mirc/localoss/v1/user.go new file mode 100644 index 00000000..555ff6d7 --- /dev/null +++ b/mirc/localoss/v1/user.go @@ -0,0 +1,42 @@ +package v1 + +import ( + . "github.com/alimy/mir/v3" + . "github.com/alimy/mir/v3/engine" +) + +func init() { + AddEntry(new(User)) +} + +type AgentInfo struct { + Platform string `json:"platform"` + UserAgent string `json:"user_agent"` +} + +type ServerInfo struct { + ApiVer string `json:"api_ver"` +} + +type UserInfo struct { + Name string `json:"name"` +} + +type LoginReq struct { + AgentInfo AgentInfo `json:"agent_info"` + Name string `json:"name"` + Passwd string `json:"passwd"` +} + +type LoginResp struct { + UserInfo + ServerInfo ServerInfo `json:"server_info"` + JwtToken string `json:"jwt_token"` +} + +type User struct { + Group Group `mir:"s/v1"` + Index func(Get) `mir:"/index/"` + Login func(Post, LoginReq) LoginResp `mir:"/user/login/"` + Logout func(Post) `mir:"/user/logout/"` +} diff --git a/mirc/space/README.md b/mirc/space/README.md new file mode 100644 index 00000000..a4ec3303 --- /dev/null +++ b/mirc/space/README.md @@ -0,0 +1,4 @@ +### SpaceX系列RESTful API +本目录包含SpaceX系列RESTful API相关定义文件 + +* v1 - v1版本API diff --git a/mirc/space/v1/user.go b/mirc/space/v1/user.go new file mode 100644 index 00000000..8dd49fa5 --- /dev/null +++ b/mirc/space/v1/user.go @@ -0,0 +1,42 @@ +package v1 + +import ( + . "github.com/alimy/mir/v3" + . "github.com/alimy/mir/v3/engine" +) + +func init() { + AddEntry(new(User)) +} + +type AgentInfo struct { + Platform string `json:"platform"` + UserAgent string `json:"user_agent"` +} + +type ServerInfo struct { + ApiVer string `json:"api_ver"` +} + +type UserInfo struct { + Name string `json:"name"` +} + +type LoginReq struct { + AgentInfo AgentInfo `json:"agent_info"` + Name string `json:"name"` + Passwd string `json:"passwd"` +} + +type LoginResp struct { + UserInfo + ServerInfo ServerInfo `json:"server_info"` + JwtToken string `json:"jwt_token"` +} + +type User struct { + Chain Chain `mir:"-"` + Group Group `mir:"x/v1"` + Login func(Post, LoginReq) LoginResp `mir:"/user/login/"` + Logout func(Post) `mir:"/user/logout/"` +} diff --git a/mirc/web/README.md b/mirc/web/README.md new file mode 100644 index 00000000..f8690712 --- /dev/null +++ b/mirc/web/README.md @@ -0,0 +1,4 @@ +### Web系列RESTful API +本目录包含Web系列RESTful API相关定义文件 + +* v1 - v1版本API diff --git a/mirc/web/v1/admin.go b/mirc/web/v1/admin.go new file mode 100644 index 00000000..4a1d8655 --- /dev/null +++ b/mirc/web/v1/admin.go @@ -0,0 +1,20 @@ +package v1 + +import ( + . "github.com/alimy/mir/v3" + . "github.com/alimy/mir/v3/engine" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +func init() { + AddEntry(new(Admin)) +} + +// Admin 运维相关服务 +type Admin struct { + Chain Chain `mir:"-"` + Group Group `mir:"v1"` + + // ChangeUserStatus 管理·禁言/解封用户 + ChangeUserStatus func(Post, web.ChangeUserStatusReq) `mir:"/admin/user/status"` +} diff --git a/mirc/web/v1/alipay.go b/mirc/web/v1/alipay.go new file mode 100644 index 00000000..63b763a3 --- /dev/null +++ b/mirc/web/v1/alipay.go @@ -0,0 +1,34 @@ +package v1 + +import ( + . "github.com/alimy/mir/v3" + . "github.com/alimy/mir/v3/engine" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +func init() { + AddEntry(new(AlipayPub), new(AlipayPriv)) +} + +// AlipayPub 支付宝相关不用授权的服务 +type AlipayPub struct { + Group Group `mir:"v1"` + + // AlipayNotify 支付宝回调 + AlipayNotify func(Post, web.AlipayNotifyReq) `mir:"/alipay/notify"` +} + +// AlipayPub 支付宝相关授权的服务 +type AlipayPriv struct { + Chain Chain `mir:"-"` + Group Group `mir:"v1"` + + // UserRechargeLink 用户充值 + UserRechargeLink func(Post, web.UserRechargeLinkReq) web.UserRechargeLinkResp `mir:"/user/recharge"` + + // UserRechargeResult 获取充值结果 + UserRechargeResult func(Get, web.UserRechargeResultReq) web.UserRechargeResultResp `mir:"/user/recharge"` + + // UserWalletBills 获取用户账单 + UserWalletBills func(Get, web.UserWalletBillsReq) web.UserWalletBillsResp `mir:"/user/wallet/bills"` +} diff --git a/mirc/web/v1/core.go b/mirc/web/v1/core.go new file mode 100644 index 00000000..af835074 --- /dev/null +++ b/mirc/web/v1/core.go @@ -0,0 +1,65 @@ +package v1 + +import ( + . "github.com/alimy/mir/v3" + . "github.com/alimy/mir/v3/engine" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +func init() { + AddEntry(new(Core)) +} + +// Core 核心服务,需要授权访问 +type Core struct { + Chain Chain `mir:"-"` + Group Group `mir:"v1"` + + // SyncSearchIndex 同步索引 + SyncSearchIndex func(Get, web.SyncSearchIndexReq) `mir:"/sync/index"` + + // GetUserInfo 获取当前用户信息 + GetUserInfo func(Get, web.UserInfoReq) web.UserInfoResp `mir:"/user/info"` + + // GetUnreadMsgCount 获取当前用户未读消息数量 + GetUnreadMsgCount func(Get, web.GetUnreadMsgCountReq) web.GetUnreadMsgCountResp `mir:"/user/msgcount/unread"` + + // GetMessages 获取消息列表 + GetMessages func(Get, web.GetMessagesReq) web.GetMessagesResp `mir:"/user/messages"` + + // ReadMessage 标记消息已读 + ReadMessage func(Post, web.ReadMessageReq) `mir:"/user/message/read"` + + // SendUserWhisper 发送用户私信 + SendUserWhisper func(Post, web.SendWhisperReq) `mir:"/user/whisper"` + + // GetCollections 获取用户收藏列表 + GetCollections func(Get, web.GetCollectionsReq) web.GetCollectionsResp `mir:"/user/collections"` + + // GetStars 获取用户点赞列表 + GetStars func(Get, web.GetStarsReq) web.GetStarsResp `mir:"/user/stars"` + + // UserPhoneBind 绑定用户手机号 + UserPhoneBind func(Post, web.UserPhoneBindReq) `mir:"/user/phone"` + + // ChangePassword 修改密码 + ChangePassword func(Post, web.ChangePasswordReq) `mir:"/user/password"` + + // ChangeNickname 修改昵称 + ChangeNickname func(Post, web.ChangeNicknameReq) `mir:"/user/nickname"` + + // ChangeAvatar 修改头像 + ChangeAvatar func(Post, web.ChangeAvatarReq) `mir:"/user/avatar"` + + // SuggestUsers 检索用户 + SuggestUsers func(Get, web.SuggestUsersReq) web.SuggestUsersResp `mir:"/suggest/users"` + + // SuggestTags 检索标签 + SuggestTags func(Get, web.SuggestTagsReq) web.SuggestTagsResp `mir:"/suggest/tags"` + + // TweetStarStatus 获取动态点赞状态 + TweetStarStatus func(Get, web.TweetStarStatusReq) web.TweetStarStatusResp `mir:"/post/star"` + + // TweetCollectionStatus 获取动态收藏状态 + TweetCollectionStatus func(Get, web.TweetCollectionStatusReq) web.TweetCollectionStatusResp `mir:"/post/collection"` +} diff --git a/mirc/web/v1/followship.go b/mirc/web/v1/followship.go new file mode 100644 index 00000000..99c0dba6 --- /dev/null +++ b/mirc/web/v1/followship.go @@ -0,0 +1,29 @@ +package v1 + +import ( + . "github.com/alimy/mir/v3" + . "github.com/alimy/mir/v3/engine" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +func init() { + AddEntry(new(Followship)) +} + +// Followship 关注者模式 服务 +type Followship struct { + Chain Chain `mir:"-"` + Group Group `mir:"v1"` + + // AddFollowing 添加关注 + AddFollowing func(Post, web.AddFollowingReq) `mir:"/following/add"` + + // DeleteFollowing 取消关注 + DeleteFollowing func(Post, web.DeleteFollowingReq) `mir:"/following/delete"` + + // ListFollowings 获取用户的关注列表 + ListFollowings func(Get, web.ListFollowingsReq) web.ListFollowingsResp `mir:"/following/list"` + + // ListFollowers 获取用户的追随者列表 + ListFollowers func(Get, web.ListFollowersReq) web.ListFollowersResp `mir:"/follower/list"` +} diff --git a/mirc/web/v1/friendship.go b/mirc/web/v1/friendship.go new file mode 100644 index 00000000..1013a894 --- /dev/null +++ b/mirc/web/v1/friendship.go @@ -0,0 +1,32 @@ +package v1 + +import ( + . "github.com/alimy/mir/v3" + . "github.com/alimy/mir/v3/engine" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +func init() { + AddEntry(new(Friendship)) +} + +// Friendship 好友模式 服务 +type Friendship struct { + Chain Chain `mir:"-"` + Group Group `mir:"v1"` + + // RequestingFriend 请求添加朋友 + RequestingFriend func(Post, web.RequestingFriendReq) `mir:"/friend/requesting"` + + // AddFriend 同意添加好友 + AddFriend func(Post, web.AddFriendReq) `mir:"/friend/add"` + + // RejectFriend 拒绝添加好友 + RejectFriend func(Post, web.RejectFriendReq) `mir:"/friend/reject"` + + // DeleteFriend 删除好友 + DeleteFriend func(Post, web.DeleteFriendReq) `mir:"/friend/delete"` + + // GetContacts 获取好友列表 + GetContacts func(Get, web.GetContactsReq) web.GetContactsResp `mir:"/user/contacts"` +} diff --git a/mirc/web/v1/loose.go b/mirc/web/v1/loose.go new file mode 100644 index 00000000..887e3c9b --- /dev/null +++ b/mirc/web/v1/loose.go @@ -0,0 +1,26 @@ +package v1 + +import ( + . "github.com/alimy/mir/v3" + . "github.com/alimy/mir/v3/engine" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +func init() { + AddEntry(new(Loose)) +} + +// Loose 宽松授权的服务 +type Loose struct { + Chain Chain `mir:"-"` + Group Group `mir:"v1"` + + // Timeline 获取广场流 + Timeline func(Get, web.TimelineReq) web.TimelineResp `mir:"/posts"` + + // GetUserTweets 获取用户动态列表 + GetUserTweets func(Get, web.GetUserTweetsReq) web.GetUserTweetsResp `mir:"/user/posts"` + + // GetUserProfile 获取用户基本信息 + GetUserProfile func(Get, web.GetUserProfileReq) web.GetUserProfileResp `mir:"/user/profile"` +} diff --git a/mirc/web/v1/priv.go b/mirc/web/v1/priv.go new file mode 100644 index 00000000..9c8d2af3 --- /dev/null +++ b/mirc/web/v1/priv.go @@ -0,0 +1,59 @@ +package v1 + +import ( + . "github.com/alimy/mir/v3" + . "github.com/alimy/mir/v3/engine" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +func init() { + AddEntry(new(Priv)) +} + +// Priv 私有授权的服务 +type Priv struct { + Chain Chain `mir:"-"` + Group Group `mir:"v1"` + + // UploadAttachment 上传资源 + UploadAttachment func(Post, web.UploadAttachmentReq) web.UploadAttachmentResp `mir:"/attachment"` + + // DownloadAttachmentPrecheck 下载资源预检 + DownloadAttachmentPrecheck func(Get, web.DownloadAttachmentPrecheckReq) web.DownloadAttachmentPrecheckResp `mir:"/attachment/precheck"` + + // DownloadAttachment 下载资源 + DownloadAttachment func(Get, web.DownloadAttachmentReq) web.DownloadAttachmentResp `mir:"/attachment"` + + // CreateTweet 发布动态 + CreateTweet func(Post, web.CreateTweetReq) web.CreateTweetResp `mir:"/post"` + + // DeleteTweet 删除动态 + DeleteTweet func(Delete, web.DeleteTweetReq) `mir:"/post"` + + // StarTweet 动态点赞操作 + StarTweet func(Post, web.StarTweetReq) web.StarTweetResp `mir:"/post/start"` + + // CollectionTweet 动态收藏操作 + CollectionTweet func(Post, web.CollectionTweetReq) web.CollectionTweetResp `mir:"/post/collection"` + + // LockTweet 锁定动态 + LockTweet func(Post, web.LockTweetReq) web.LockTweetResp `mir:"/post/lock"` + + // StickTweet 置顶动态 + StickTweet func(Post, web.StickTweetReq) web.StickTweetResp `mir:"/post/stick"` + + // VisibleTweet 修改动态可见度 + VisibleTweet func(Post, web.VisibleTweetReq) web.VisibleTweetResp `mir:"/post/visibility"` + + // CreateTweetComment 发布动态评论 + CreateComment func(Post, web.CreateCommentReq) web.CreateCommentResp `mir:"/post/comment"` + + // DeletePostComment 删除动态评论 + DeleteComment func(Delete, web.DeleteCommentReq) `mir:"/post/comment"` + + // CreateCommentReply 发布评论回复 + CreateCommentReply func(Post, web.CreateCommentReplyReq) web.CreateCommentReplyResp `mir:"/post/comment/reply"` + + // DeleteCommentReply 删除评论回复 + DeleteCommentReply func(Delete, web.DeleteCommentReplyReq) `mir:"/post/comment/reply"` +} diff --git a/mirc/web/v1/pub.go b/mirc/web/v1/pub.go new file mode 100644 index 00000000..2364f223 --- /dev/null +++ b/mirc/web/v1/pub.go @@ -0,0 +1,40 @@ +package v1 + +import ( + . "github.com/alimy/mir/v3" + . "github.com/alimy/mir/v3/engine" + "github.com/rocboss/paopao-ce/internal/model/web" +) + +func init() { + AddEntry(new(Pub)) +} + +// Pub 不用授权的公开服务 +type Pub struct { + Group Group `mir:"v1"` + + // Version 获取后台版本信息 + Version func(Get) web.VersionResp `mir:"/"` + + // Login 用户登录 + Login func(Post, web.LoginReq) web.LoginResp `mir:"/auth/login"` + + // Register 用户注册 + Register func(Post, web.RegisterReq) web.RegisterResp `mir:"/auth/register"` + + // GetCaptcha 获取验证码 + GetCaptcha func(Get) web.GetCaptchaResp `mir:"/captcha"` + + // SendCaptcha 发送验证码 + SendCaptcha func(Post, web.SendCaptchaReq) `mir:"/captcha"` + + // TweetDetail 获取动态详情 + TweetDetail func(Get, web.TweetDetailReq) web.TweetDetailResp `mir:"/post"` + + // TweetComments 获取动态评论 + TweetComments func(Get, web.TweetCommentsReq) web.TweetCommentsResp `mir:"/post/comments"` + + // TopicList 获取话题列表 + TopicList func(Get, web.TopicListReq) web.TopicListResp `mir:"/tags"` +} diff --git a/pkg/app/app.go b/pkg/app/app.go index fcc7ecc9..a98a49a2 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package app import ( @@ -22,7 +26,7 @@ func NewResponse(ctx *gin.Context) *Response { return &Response{Ctx: ctx} } -func (r *Response) ToResponse(data interface{}) { +func (r *Response) ToResponse(data any) { hostname, _ := os.Hostname() if data == nil { data = gin.H{ @@ -41,7 +45,7 @@ func (r *Response) ToResponse(data interface{}) { r.Ctx.JSON(http.StatusOK, data) } -func (r *Response) ToResponseList(list interface{}, totalRows int64) { +func (r *Response) ToResponseList(list any, totalRows int64) { r.ToResponse(gin.H{ "list": list, "pager": Pager{ diff --git a/pkg/app/form.go b/pkg/app/form.go index eba8eed9..91b116a2 100644 --- a/pkg/app/form.go +++ b/pkg/app/form.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package app import ( @@ -29,7 +33,7 @@ func (v ValidErrors) Errors() []string { return errs } -func BindAndValid(c *gin.Context, v interface{}) (bool, ValidErrors) { +func BindAndValid(c *gin.Context, v any) (bool, ValidErrors) { var errs ValidErrors err := c.ShouldBind(v) if err != nil { diff --git a/pkg/app/jwt.go b/pkg/app/jwt.go index 2bedacab..b9759e07 100644 --- a/pkg/app/jwt.go +++ b/pkg/app/jwt.go @@ -1,31 +1,34 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package app import ( "time" - "github.com/dgrijalva/jwt-go" + "github.com/golang-jwt/jwt/v4" "github.com/rocboss/paopao-ce/internal/conf" - "github.com/rocboss/paopao-ce/internal/model" + "github.com/rocboss/paopao-ce/internal/core" ) type Claims struct { UID int64 `json:"uid"` Username string `json:"username"` - jwt.StandardClaims + jwt.RegisteredClaims } func GetJWTSecret() []byte { return []byte(conf.JWTSetting.Secret) } -func GenerateToken(User *model.User) (string, error) { - nowTime := time.Now() - expireTime := nowTime.Add(conf.JWTSetting.Expire) +func GenerateToken(User *core.User) (string, error) { + expireTime := time.Now().Add(conf.JWTSetting.Expire) claims := Claims{ UID: User.ID, Username: User.Username, - StandardClaims: jwt.StandardClaims{ - ExpiresAt: expireTime.Unix(), + RegisteredClaims: jwt.RegisteredClaims{ + ExpiresAt: jwt.NewNumericDate(expireTime), Issuer: conf.JWTSetting.Issuer + ":" + User.Salt, }, } @@ -36,7 +39,7 @@ func GenerateToken(User *model.User) (string, error) { } func ParseToken(token string) (*Claims, error) { - tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) { + tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (any, error) { return GetJWTSecret(), nil }) if err != nil { diff --git a/pkg/app/pagination.go b/pkg/app/pagination.go index 1888efb9..09d7532b 100644 --- a/pkg/app/pagination.go +++ b/pkg/app/pagination.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package app import ( @@ -42,3 +46,17 @@ func GetPageOffset(c *gin.Context) (offset, limit int) { offset = (page - 1) * limit return } + +func GetPageInfo(c *gin.Context) (page, pageSize int) { + page = convert.StrTo(c.Query("page")).MustInt() + if page <= 0 { + page = 1 + } + pageSize = convert.StrTo(c.Query("page_size")).MustInt() + if pageSize <= 0 { + pageSize = conf.AppSetting.DefaultPageSize + } else if pageSize > conf.AppSetting.MaxPageSize { + pageSize = conf.AppSetting.MaxPageSize + } + return +} diff --git a/pkg/convert/convert.go b/pkg/convert/convert.go index 60dacf9b..ff3be5e5 100644 --- a/pkg/convert/convert.go +++ b/pkg/convert/convert.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package convert import "strconv" diff --git a/pkg/convert/convert_test.go b/pkg/convert/convert_test.go index a746e3e7..a31d13e6 100644 --- a/pkg/convert/convert_test.go +++ b/pkg/convert/convert_test.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package convert import ( diff --git a/pkg/crypto/signature.go b/pkg/crypto/signature.go index 7f18959a..20a6deaa 100644 --- a/pkg/crypto/signature.go +++ b/pkg/crypto/signature.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package crypto import ( diff --git a/pkg/debug/errors.go b/pkg/debug/errors.go new file mode 100644 index 00000000..04a404ca --- /dev/null +++ b/pkg/debug/errors.go @@ -0,0 +1,13 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package debug + +import ( + "errors" +) + +var ( + ErrNotImplemented = errors.New("not implemented") +) diff --git a/pkg/debug/pyroscope.go b/pkg/debug/pyroscope.go new file mode 100644 index 00000000..60a8ed74 --- /dev/null +++ b/pkg/debug/pyroscope.go @@ -0,0 +1,19 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +//go:build !pyroscope +// +build !pyroscope + +package debug + +import ( + "github.com/alimy/cfg" + "github.com/sirupsen/logrus" +) + +func StartPyroscope() { + if cfg.If("Pyroscope") { + logrus.Infoln("want Pyroscope feature but not support in this compile version") + } +} diff --git a/pkg/debug/pyroscope_embed.go b/pkg/debug/pyroscope_embed.go new file mode 100644 index 00000000..71f7ad1d --- /dev/null +++ b/pkg/debug/pyroscope_embed.go @@ -0,0 +1,48 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +//go:build pyroscope +// +build pyroscope + +package debug + +import ( + "os" + + "github.com/alimy/cfg" + "github.com/pyroscope-io/client/pyroscope" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/sirupsen/logrus" +) + +func StartPyroscope() { + if !cfg.If("Pyroscope") { + logrus.Infoln("skip Pyroscope because not add Pyroscope feature in config.yaml") + return + } + s := conf.PyroscopeSetting + c := pyroscope.Config{ + ApplicationName: s.AppName, + ServerAddress: s.Endpoint, + AuthToken: os.Getenv("PYROSCOPE_AUTH_TOKEN"), + Logger: s.GetLogger(), + ProfileTypes: []pyroscope.ProfileType{ + pyroscope.ProfileCPU, + pyroscope.ProfileGoroutines, + pyroscope.ProfileAllocObjects, + pyroscope.ProfileAllocSpace, + pyroscope.ProfileInuseObjects, + pyroscope.ProfileInuseSpace, + pyroscope.ProfileBlockCount, + pyroscope.ProfileBlockDuration, + pyroscope.ProfileMutexCount, + pyroscope.ProfileMutexDuration, + }, + } + if len(c.AuthToken) == 0 { + c.AuthToken = s.AuthToken + } + pyroscope.Start(c) + +} diff --git a/pkg/debug/version.go b/pkg/debug/version.go index 485e8046..12623f96 100644 --- a/pkg/debug/version.go +++ b/pkg/debug/version.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package debug import ( @@ -7,9 +11,9 @@ import ( var version, commitID, buildDate string type BuildInfo struct { - Version string - Sum string - BuildDate string + Version string `json:"version"` + Sum string `json:"sum"` + BuildDate string `json:"build_date"` } func VersionInfo() string { diff --git a/pkg/errcode/common_code.go b/pkg/errcode/common_code.go index 75b220ee..1f15f8c5 100644 --- a/pkg/errcode/common_code.go +++ b/pkg/errcode/common_code.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package errcode var ( diff --git a/pkg/errcode/errcode.go b/pkg/errcode/errcode.go index b8fbbe22..5143aabb 100644 --- a/pkg/errcode/errcode.go +++ b/pkg/errcode/errcode.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package errcode import ( @@ -33,7 +37,7 @@ func (e *Error) Msg() string { return e.msg } -func (e *Error) Msgf(args []interface{}) string { +func (e *Error) Msgf(args []any) string { return fmt.Sprintf(e.msg, args...) } diff --git a/pkg/errcode/module_code.go b/pkg/errcode/module_code.go index ea3b5e25..9543624b 100644 --- a/pkg/errcode/module_code.go +++ b/pkg/errcode/module_code.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package errcode var ( @@ -57,4 +61,13 @@ var ( RechargeReqFail = NewError(70001, "充值请求失败") RechargeNotifyError = NewError(70002, "充值回调失败") GetRechargeFailed = NewError(70003, "充值详情获取失败") + + NoRequestingFriendToSelf = NewError(80001, "不允许添加自己为好友") + NotExistFriendId = NewError(80002, "好友id不存在") + SendRequestingFriendFailed = NewError(80003, "申请添加朋友请求发送失败") + AddFriendFailed = NewError(80004, "添加好友失败") + RejectFriendFailed = NewError(80005, "拒绝好友失败") + DeleteFriendFailed = NewError(80006, "删除好友失败") + GetContactsFailed = NewError(80007, "获取联系人列表失败") + NoActionToSelf = NewError(80008, "不允许对自己操作") ) diff --git a/pkg/json/json.go b/pkg/json/json.go index a26d7db2..c5f3efc8 100644 --- a/pkg/json/json.go +++ b/pkg/json/json.go @@ -2,8 +2,10 @@ // Use of this source code is governed by a MIT style // license that can be found in the LICENSE file. -//go:build !jsoniter && !go_json -// +build !jsoniter,!go_json +//go:build !jsoniter && !go_json && !(sonic && avx && (linux || windows || darwin) && amd64) +// +build !jsoniter +// +build !go_json +// +build !sonic !avx !linux,!windows,!darwin !amd64 package json diff --git a/pkg/json/sonic.go b/pkg/json/sonic.go new file mode 100644 index 00000000..5a9ca4b2 --- /dev/null +++ b/pkg/json/sonic.go @@ -0,0 +1,27 @@ +// Copyright 2022 Gin Core Team. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +//go:build sonic && avx && (linux || windows || darwin) && amd64 +// +build sonic +// +build avx +// +build linux windows darwin +// +build amd64 + +package json + +import "github.com/bytedance/sonic" + +var ( + json = sonic.ConfigStd + // Marshal is exported by gin/json package. + Marshal = json.Marshal + // Unmarshal is exported by gin/json package. + Unmarshal = json.Unmarshal + // MarshalIndent is exported by gin/json package. + MarshalIndent = json.MarshalIndent + // NewDecoder is exported by gin/json package. + NewDecoder = json.NewDecoder + // NewEncoder is exported by gin/json package. + NewEncoder = json.NewEncoder +) diff --git a/pkg/sign/sign.go b/pkg/sign/sign.go index 717b8e54..fc7c10e9 100644 --- a/pkg/sign/sign.go +++ b/pkg/sign/sign.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package sign import ( diff --git a/pkg/types/types.go b/pkg/types/types.go index 018502b6..830c56c6 100644 --- a/pkg/types/types.go +++ b/pkg/types/types.go @@ -1,7 +1,11 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package types +// Empty empty alias type type Empty = struct{} -type Any = interface{} - -type AnySlice = []interface{} +// Fn empty argument func alias type +type Fn = func() diff --git a/pkg/util/banner.go b/pkg/util/banner.go index d41b5ae1..b8f16971 100644 --- a/pkg/util/banner.go +++ b/pkg/util/banner.go @@ -1,6 +1,14 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package util -import "fmt" +import ( + "fmt" + + "github.com/Masterminds/semver/v3" +) func PrintHelloBanner(text string) { @@ -10,3 +18,7 @@ func PrintHelloBanner(text string) { fmt.Println("(__) \\_/\\_/ \\__/(__) \\_/\\_/ \\__/ ") fmt.Println(text) } + +func SidStr(name string, version *semver.Version, size int) string { + return fmt.Sprintf(fmt.Sprintf("%%s@%%-%ds", size-len(name+version.String())+4), name, version) +} diff --git a/pkg/util/ip.go b/pkg/util/ip.go index 3aaa13c1..4561d8a6 100644 --- a/pkg/util/ip.go +++ b/pkg/util/ip.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package util import "github.com/rocboss/paopao-ce/pkg/util/iploc" diff --git a/pkg/util/ip_test.go b/pkg/util/ip_test.go index 82976be8..0740ffd5 100644 --- a/pkg/util/ip_test.go +++ b/pkg/util/ip_test.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package util import "testing" diff --git a/pkg/util/iploc/iploc.go b/pkg/util/iploc/iploc.go index a05f8d7e..449e52a9 100644 --- a/pkg/util/iploc/iploc.go +++ b/pkg/util/iploc/iploc.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package iploc import ( diff --git a/pkg/util/iploc/iploc_test.go b/pkg/util/iploc/iploc_test.go index 4754e86d..a38bb106 100644 --- a/pkg/util/iploc/iploc_test.go +++ b/pkg/util/iploc/iploc_test.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package iploc import ( diff --git a/pkg/util/md5.go b/pkg/util/md5.go index 8a00f545..477cd5ff 100644 --- a/pkg/util/md5.go +++ b/pkg/util/md5.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package util import ( diff --git a/pkg/util/md5_test.go b/pkg/util/md5_test.go index 0bab593f..12c14c86 100644 --- a/pkg/util/md5_test.go +++ b/pkg/util/md5_test.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package util import "testing" diff --git a/pkg/util/str.go b/pkg/util/str.go index 35e034ab..8b62217d 100644 --- a/pkg/util/str.go +++ b/pkg/util/str.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package util import ( diff --git a/pkg/xerror/common.go b/pkg/xerror/common.go new file mode 100644 index 00000000..2852f6c2 --- /dev/null +++ b/pkg/xerror/common.go @@ -0,0 +1,26 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package xerror + +var ( + Success = NewError(0, "成功") + ServerError = NewError(10000, "服务内部错误") + InvalidParams = NewError(10001, "入参错误") + NotFound = NewError(10002, "找不到") + UnauthorizedAuthNotExist = NewError(10003, "账户不存在") + UnauthorizedAuthFailed = NewError(10004, "账户密码错误") + UnauthorizedTokenError = NewError(10005, "鉴权失败,Token 错误或丢失") + UnauthorizedTokenTimeout = NewError(10006, "鉴权失败,Token 超时") + UnauthorizedTokenGenerate = NewError(10007, "鉴权失败,Token 生成失败") + TooManyRequests = NewError(10008, "请求过多") + + GatewayMethodsLimit = NewError(10109, "网关仅接受GET或POST请求") + GatewayLostSign = NewError(10110, "网关请求缺少签名") + GatewayLostAppKey = NewError(10111, "网关请求缺少APP KEY") + GatewayAppKeyInvalid = NewError(10112, "网关请求无效APP KEY") + GatewayAppKeyClosed = NewError(10113, "网关请求APP KEY已停用") + GatewayParamSignError = NewError(10114, "网关请求参数签名错误") + GatewayTooManyRequests = NewError(10115, "网关请求频次超限") +) diff --git a/pkg/xerror/xerror.go b/pkg/xerror/xerror.go new file mode 100644 index 00000000..0fc7878c --- /dev/null +++ b/pkg/xerror/xerror.go @@ -0,0 +1,107 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package xerror + +import ( + "fmt" + "net/http" + "strings" + + "github.com/alimy/mir/v3" +) + +var ( + _ mir.Error = (*Error)(nil) + + codes = map[int]string{} +) + +type Error struct { + code int + msg string + details []string +} + +type ValidError struct { + Message string +} + +type ValidErrors []*ValidError + +func (v *ValidError) Error() string { + return v.Message +} + +func (v ValidErrors) Error() string { + return strings.Join(v.Errors(), ",") +} + +func (v ValidErrors) Errors() []string { + var errs []string + for _, err := range v { + errs = append(errs, err.Error()) + } + return errs +} + +func NewError(code int, msg string) *Error { + if _, ok := codes[code]; ok { + panic(fmt.Sprintf("错误码 %d 已经存在,请更换一个", code)) + } + codes[code] = msg + return &Error{code: code, msg: msg} +} + +func (e *Error) Error() string { + return fmt.Sprintf("错误码: %d, 错误信息: %s", e.StatusCode(), e.Msg()) +} + +func (e *Error) StatusCode() int { + return e.code +} + +func (e *Error) Msg() string { + return e.msg +} + +func (e *Error) Msgf(args []any) string { + return fmt.Sprintf(e.msg, args...) +} + +func (e *Error) Details() []string { + return e.details +} + +func (e *Error) WithDetails(details ...string) *Error { + newError := *e + newError.details = []string{} + newError.details = append(newError.details, details...) + + return &newError +} + +func HttpStatusCode(e mir.Error) int { + switch e.StatusCode() { + case Success.StatusCode(): + return http.StatusOK + case ServerError.StatusCode(): + return http.StatusInternalServerError + case InvalidParams.StatusCode(): + return http.StatusBadRequest + case UnauthorizedAuthNotExist.StatusCode(): + fallthrough + case UnauthorizedAuthFailed.StatusCode(): + fallthrough + case UnauthorizedTokenError.StatusCode(): + fallthrough + case UnauthorizedTokenGenerate.StatusCode(): + fallthrough + case UnauthorizedTokenTimeout.StatusCode(): + return http.StatusUnauthorized + case TooManyRequests.StatusCode(): + return http.StatusTooManyRequests + } + return http.StatusInternalServerError +} diff --git a/pkg/zinc/zinc.go b/pkg/zinc/zinc.go index 8d280124..cc200a55 100644 --- a/pkg/zinc/zinc.go +++ b/pkg/zinc/zinc.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + package zinc import ( @@ -62,12 +66,12 @@ type HitsResultTotalT struct { } type HitItem struct { - Index string `json:"_index"` - Type string `json:"_type"` - ID string `json:"_id"` - Score float64 `json:"_score"` - Timestamp time.Time `json:"@timestamp"` - Source interface{} `json:"_source"` + Index string `json:"_index"` + Type string `json:"_type"` + ID string `json:"_id"` + Score float64 `json:"_score"` + Timestamp time.Time `json:"@timestamp"` + Source any `json:"_source"` } // NewClient 获取ZincClient新实例 @@ -107,7 +111,7 @@ func (c *ZincClient) ExistIndex(name string) bool { return false } - retData := &map[string]interface{}{} + retData := &map[string]any{} err = json.Unmarshal([]byte(resp.String()), retData) if err != nil { return false @@ -121,7 +125,7 @@ func (c *ZincClient) ExistIndex(name string) bool { } // 新增/更新文档 -func (c *ZincClient) PutDoc(name string, id int64, doc interface{}) (bool, error) { +func (c *ZincClient) PutDoc(name string, id int64, doc any) (bool, error) { resp, err := c.request().SetBody(doc).Put(fmt.Sprintf("/api/%s/_doc/%d", name, id)) if err != nil { @@ -136,7 +140,7 @@ func (c *ZincClient) PutDoc(name string, id int64, doc interface{}) (bool, error } // 批量新增文档 -func (c *ZincClient) BulkPushDoc(docs []map[string]interface{}) (bool, error) { +func (c *ZincClient) BulkPushDoc(docs []map[string]any) (bool, error) { dataStr := "" for _, doc := range docs { str, err := json.Marshal(doc) @@ -157,7 +161,7 @@ func (c *ZincClient) BulkPushDoc(docs []map[string]interface{}) (bool, error) { return true, nil } -func (c *ZincClient) EsQuery(indexName string, q interface{}) (*QueryResultT, error) { +func (c *ZincClient) EsQuery(indexName string, q any) (*QueryResultT, error) { resp, err := c.request().SetBody(q).Post(fmt.Sprintf("/es/%s/_search", indexName)) if err != nil { return nil, err @@ -176,7 +180,7 @@ func (c *ZincClient) EsQuery(indexName string, q interface{}) (*QueryResultT, er return result, nil } -func (c *ZincClient) ApiQuery(indexName string, q interface{}) (*QueryResultT, error) { +func (c *ZincClient) ApiQuery(indexName string, q any) (*QueryResultT, error) { resp, err := c.request().SetBody(q).Post(fmt.Sprintf("/api/%s/_search", indexName)) if err != nil { return nil, err diff --git a/proto/RADME.md b/proto/RADME.md new file mode 100644 index 00000000..05d78ece --- /dev/null +++ b/proto/RADME.md @@ -0,0 +1,2 @@ +### gRPC API +This directory contain some gRPC API define files. diff --git a/proto/buf.lock b/proto/buf.lock new file mode 100644 index 00000000..19abf63f --- /dev/null +++ b/proto/buf.lock @@ -0,0 +1,7 @@ +# Generated by buf. DO NOT EDIT. +version: v1 +deps: + - remote: buf.build + owner: googleapis + repository: googleapis + commit: 75b4300737fb4efca0831636be94e517 diff --git a/proto/buf.yaml b/proto/buf.yaml new file mode 100644 index 00000000..eda8f330 --- /dev/null +++ b/proto/buf.yaml @@ -0,0 +1,10 @@ +version: v1 +lint: + use: + - DEFAULT +breaking: + use: + - FILE + +deps: + - buf.build/googleapis/googleapis diff --git a/proto/v1/auth.proto b/proto/v1/auth.proto new file mode 100644 index 00000000..16c340ce --- /dev/null +++ b/proto/v1/auth.proto @@ -0,0 +1,29 @@ +syntax = "proto3"; + +package auth; + +option go_package = "github.com/rocboss/paopao-ce/auto/rpc/v1"; + +message User { + string phoneNum = 1; +} + +message UserVerify { + string phoneNum = 1; + string VerificationCode = 2; +} + +message LoginReply { + int32 statuCode = 1; + string token = 2; +} + +message ActionReply { + int32 statusCode = 1; +} + +service Authenticate { + rpc preLogin(User) returns (ActionReply); + rpc login(User) returns (LoginReply); + rpc logout(User) returns (ActionReply); +} diff --git a/scripts/migration/embed.go b/scripts/migration/embed.go index 88e633c8..3f1eacda 100644 --- a/scripts/migration/embed.go +++ b/scripts/migration/embed.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + //go:build migration // +build migration diff --git a/scripts/migration/mysql/1_initialize_schema.down.sql b/scripts/migration/mysql/001_initialize_schema.down.sql similarity index 100% rename from scripts/migration/mysql/1_initialize_schema.down.sql rename to scripts/migration/mysql/001_initialize_schema.down.sql diff --git a/scripts/migration/mysql/1_initialize_schema.up.sql b/scripts/migration/mysql/001_initialize_schema.up.sql similarity index 100% rename from scripts/migration/mysql/1_initialize_schema.up.sql rename to scripts/migration/mysql/001_initialize_schema.up.sql diff --git a/scripts/migration/mysql/2_post_visibility.down.sql b/scripts/migration/mysql/002_post_visibility.down.sql similarity index 100% rename from scripts/migration/mysql/2_post_visibility.down.sql rename to scripts/migration/mysql/002_post_visibility.down.sql diff --git a/scripts/migration/mysql/2_post_visibility.up.sql b/scripts/migration/mysql/002_post_visibility.up.sql similarity index 100% rename from scripts/migration/mysql/2_post_visibility.up.sql rename to scripts/migration/mysql/002_post_visibility.up.sql diff --git a/scripts/migration/mysql/003_feature_contact.down.sql b/scripts/migration/mysql/003_feature_contact.down.sql new file mode 100644 index 00000000..02e44706 --- /dev/null +++ b/scripts/migration/mysql/003_feature_contact.down.sql @@ -0,0 +1,2 @@ +DROP TABLE IF EXISTS `p_contact`; +DROP TABLE IF EXISTS `p_contact_group`; diff --git a/scripts/migration/mysql/003_feature_contact.up.sql b/scripts/migration/mysql/003_feature_contact.up.sql new file mode 100644 index 00000000..45fa98ee --- /dev/null +++ b/scripts/migration/mysql/003_feature_contact.up.sql @@ -0,0 +1,34 @@ +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +CREATE TABLE `p_contact` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '联系人ID', + `user_id` bigint unsigned NOT NULL COMMENT '用户ID', + `friend_id` bigint unsigned NOT NULL COMMENT '好友ID', + `group_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT '好友分组ID:默认为0无分组', + `remark` varchar(32) NOT NULL DEFAULT '' COMMENT '好友备注', + `status` tinyint NOT NULL DEFAULT '0' COMMENT '好友状态: 1请求好友, 2已好友, 3拒绝好友, 4已删好友', + `notice_enable` tinyint NOT NULL DEFAULT '0' COMMENT '是否有消息提醒, 0否, 1是', + `is_top` tinyint NOT NULL DEFAULT '0' COMMENT '是否置顶, 0否, 1是', + `is_black` tinyint NOT NULL DEFAULT '0' COMMENT '是否为黑名单, 0否, 1是', + `is_del` tinyint NOT NULL DEFAULT '0' COMMENT '是否删除好友, 0否, 1是', + `created_on` bigint unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `modified_on` bigint unsigned NOT NULL DEFAULT '0' COMMENT '修改时间', + `deleted_on` bigint unsigned NOT NULL DEFAULT '0' COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `idx_user_friend_id` (`user_id`,`friend_id`) USING BTREE, + KEY `idx_user_friend_status` (`user_id`, `friend_id`, `status`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='联系人'; + +CREATE TABLE `p_contact_group` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '联系人ID', + `user_id` int NOT NULL DEFAULT '0' COMMENT '用户id', + `name` varchar(32) NOT NULL DEFAULT '' COMMENT '分组名称', + `is_del` tinyint NOT NULL DEFAULT '1' COMMENT '是否删除, 0否, 1是', + `created_on` bigint unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `modified_on` bigint unsigned NOT NULL DEFAULT '0' COMMENT '修改时间', + `deleted_on` bigint unsigned NOT NULL DEFAULT '0' COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='联系人分组'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/scripts/migration/postgres/1_initialize_schema.down.sql b/scripts/migration/postgres/001_initialize_schema.down.sql similarity index 100% rename from scripts/migration/postgres/1_initialize_schema.down.sql rename to scripts/migration/postgres/001_initialize_schema.down.sql diff --git a/scripts/migration/postgres/1_initialize_schema.up.sql b/scripts/migration/postgres/001_initialize_schema.up.sql similarity index 100% rename from scripts/migration/postgres/1_initialize_schema.up.sql rename to scripts/migration/postgres/001_initialize_schema.up.sql diff --git a/scripts/migration/postgres/2_post_visibility.down.sql b/scripts/migration/postgres/002_post_visibility.down.sql similarity index 100% rename from scripts/migration/postgres/2_post_visibility.down.sql rename to scripts/migration/postgres/002_post_visibility.down.sql diff --git a/scripts/migration/postgres/2_post_visibility.up.sql b/scripts/migration/postgres/002_post_visibility.up.sql similarity index 100% rename from scripts/migration/postgres/2_post_visibility.up.sql rename to scripts/migration/postgres/002_post_visibility.up.sql diff --git a/scripts/migration/postgres/003_feature_contact.down.sql b/scripts/migration/postgres/003_feature_contact.down.sql new file mode 100644 index 00000000..3ce95155 --- /dev/null +++ b/scripts/migration/postgres/003_feature_contact.down.sql @@ -0,0 +1 @@ +-- TODO: WIP diff --git a/scripts/migration/postgres/003_feature_contact.up.sql b/scripts/migration/postgres/003_feature_contact.up.sql new file mode 100644 index 00000000..3ce95155 --- /dev/null +++ b/scripts/migration/postgres/003_feature_contact.up.sql @@ -0,0 +1 @@ +-- TODO: WIP diff --git a/scripts/migration/sqlite3/1_initialize_schema.down.sql b/scripts/migration/sqlite3/001_initialize_schema.down.sql similarity index 100% rename from scripts/migration/sqlite3/1_initialize_schema.down.sql rename to scripts/migration/sqlite3/001_initialize_schema.down.sql diff --git a/scripts/migration/sqlite3/1_initialize_schema.up.sql b/scripts/migration/sqlite3/001_initialize_schema.up.sql similarity index 100% rename from scripts/migration/sqlite3/1_initialize_schema.up.sql rename to scripts/migration/sqlite3/001_initialize_schema.up.sql diff --git a/scripts/migration/sqlite3/2_post_visibility.down.sql b/scripts/migration/sqlite3/002_post_visibility.down.sql similarity index 100% rename from scripts/migration/sqlite3/2_post_visibility.down.sql rename to scripts/migration/sqlite3/002_post_visibility.down.sql diff --git a/scripts/migration/sqlite3/2_post_visibility.up.sql b/scripts/migration/sqlite3/002_post_visibility.up.sql similarity index 100% rename from scripts/migration/sqlite3/2_post_visibility.up.sql rename to scripts/migration/sqlite3/002_post_visibility.up.sql diff --git a/scripts/migration/sqlite3/003_feature_contact.down.sql b/scripts/migration/sqlite3/003_feature_contact.down.sql new file mode 100644 index 00000000..b9a3543f --- /dev/null +++ b/scripts/migration/sqlite3/003_feature_contact.down.sql @@ -0,0 +1,6 @@ +PRAGMA foreign_keys = false; + +DROP TABLE IF EXISTS "p_contact"; +DROP TABLE IF EXISTS "p_contact_group"; + +PRAGMA foreign_keys = true; diff --git a/scripts/migration/sqlite3/003_feature_contact.up.sql b/scripts/migration/sqlite3/003_feature_contact.up.sql new file mode 100644 index 00000000..cb9d3a6a --- /dev/null +++ b/scripts/migration/sqlite3/003_feature_contact.up.sql @@ -0,0 +1,44 @@ +PRAGMA foreign_keys = false; + +CREATE TABLE "p_contact" ( + "id" integer NOT NULL, + "user_id" integer NOT NULL, + "friend_id" integer NOT NULL, + "group_id" integer NOT NULL, + "remark" text(32) NOT NULL, + "status" integer NOT NULL, + "notice_enable" integer NOT NULL, + "is_top" integer NOT NULL, + "is_black" integer NOT NULL, + "is_del" integer NOT NULL, + "created_on" integer NOT NULL, + "modified_on" integer NOT NULL, + "deleted_on" integer NOT NULL, + PRIMARY KEY ("id") +); + +CREATE TABLE "p_contact_group" ( + "id" integer NOT NULL, + "user_id" integer NOT NULL, + "name" text(32) NOT NULL, + "is_del" integer NOT NULL, + "created_on" integer NOT NULL, + "modified_on" integer NOT NULL, + "deleted_on" integer NOT NULL, + PRIMARY KEY ("id") +); + +CREATE UNIQUE INDEX "main"."idx_user_friend_id" +ON "p_contact" ( + "user_id" ASC, + "friend_id" ASC +); + +CREATE INDEX "main"."idx_user_friend_status" +ON "p_contact" ( + "user_id" ASC, + "friend_id" ASC, + "status" ASC +); + +PRAGMA foreign_keys = true; diff --git a/scripts/paopao-mysql.sql b/scripts/paopao-mysql.sql index 2fb8c258..18525ab3 100644 --- a/scripts/paopao-mysql.sql +++ b/scripts/paopao-mysql.sql @@ -270,6 +270,44 @@ CREATE TABLE `p_user` ( KEY `idx_phone` (`phone`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=100058 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户'; +-- ---------------------------- +-- Table structure for p_contact +-- ---------------------------- +DROP TABLE IF EXISTS `p_contact`; +CREATE TABLE `p_contact` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '联系人ID', + `user_id` bigint unsigned NOT NULL COMMENT '用户ID', + `friend_id` bigint unsigned NOT NULL COMMENT '好友ID', + `group_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT '好友分组ID:默认为0无分组', + `remark` varchar(32) NOT NULL DEFAULT '' COMMENT '好友备注', + `status` tinyint NOT NULL DEFAULT '0' COMMENT '好友状态: 1请求好友, 2已好友, 3拒绝好友, 4已删好友', + `is_top` tinyint NOT NULL DEFAULT '0' COMMENT '是否置顶, 0否, 1是', + `is_black` tinyint NOT NULL DEFAULT '0' COMMENT '是否为黑名单, 0否, 1是', + `is_delete` tinyint NOT NULL DEFAULT '0' COMMENT '是否删除好友, 0否, 1是', + `notice_enable` tinyint NOT NULL DEFAULT '0' COMMENT '是否有消息提醒, 0否, 1是', + `created_on` bigint unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `modified_on` bigint unsigned NOT NULL DEFAULT '0' COMMENT '修改时间', + `deleted_on` bigint unsigned NOT NULL DEFAULT '0' COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `idx_user_friend_id` (`user_id`,`friend_id`) USING BTREE, + KEY `idx_user_friend_status` (`user_id`, `friend_id`, `status`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='联系人'; + +-- ---------------------------- +-- Table structure for p_contact_group +-- ---------------------------- +DROP TABLE IF EXISTS `p_contact_group`; +CREATE TABLE `p_contact_group` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '联系人ID', + `user_id` int NOT NULL DEFAULT '0' COMMENT '用户id', + `name` varchar(32) NOT NULL DEFAULT '' COMMENT '分组名称', + `is_delete` tinyint NOT NULL DEFAULT '1' COMMENT '是否删除, 0否, 1是', + `created_on` bigint unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `modified_on` bigint unsigned NOT NULL DEFAULT '0' COMMENT '修改时间', + `deleted_on` bigint unsigned NOT NULL DEFAULT '0' COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='联系人分组'; + -- ---------------------------- -- Table structure for p_wallet_recharge -- ---------------------------- diff --git a/scripts/paopao-sqlite3.sql b/scripts/paopao-sqlite3.sql index 685539e7..a82c4a34 100644 --- a/scripts/paopao-sqlite3.sql +++ b/scripts/paopao-sqlite3.sql @@ -90,6 +90,42 @@ CREATE TABLE "p_comment_reply" ( PRIMARY KEY ("id") ); +-- ---------------------------- +-- Table structure for p_contact +-- ---------------------------- +DROP TABLE IF EXISTS "p_contact"; +CREATE TABLE "p_contact" ( + "id" integer NOT NULL, + "user_id" integer NOT NULL, + "friend_id" integer NOT NULL, + "group_id" integer NOT NULL, + "remark" text(32) NOT NULL, + "status" integer NOT NULL, + "is_top" integer NOT NULL, + "is_black" integer NOT NULL, + "is_delete" integer NOT NULL, + "notice_enable" integer NOT NULL, + "created_on" integer NOT NULL, + "modified_on" integer NOT NULL, + "deleted_on" integer NOT NULL, + PRIMARY KEY ("id") +); + +-- ---------------------------- +-- Table structure for p_contact_group +-- ---------------------------- +DROP TABLE IF EXISTS "p_contact_group"; +CREATE TABLE "p_contact_group" ( + "id" integer NOT NULL, + "user_id" integer NOT NULL, + "name" text(32) NOT NULL, + "is_delete" integer NOT NULL, + "created_on" integer NOT NULL, + "modified_on" integer NOT NULL, + "deleted_on" integer NOT NULL, + PRIMARY KEY ("id") +); + -- ---------------------------- -- Table structure for p_message -- ---------------------------- @@ -122,7 +158,6 @@ CREATE TABLE "p_post" ( "comment_count" integer NOT NULL, "collection_count" integer NOT NULL, "upvote_count" integer NOT NULL, - "visibility" integer NOT NULL, "is_top" integer NOT NULL, "is_essence" integer NOT NULL, "is_lock" integer NOT NULL, @@ -134,7 +169,7 @@ CREATE TABLE "p_post" ( "created_on" integer NOT NULL, "modified_on" integer NOT NULL, "deleted_on" integer NOT NULL, - "is_del" integer NOT NULL, + "is_del" integer NOT NULL, `visibility` integer NOT NULL DEFAULT '0', PRIMARY KEY ("id") ); @@ -169,14 +204,6 @@ CREATE TABLE "p_post_collection" ( PRIMARY KEY ("id") ); --- ---------------------------- --- Indexes structure for table p_post --- ---------------------------- -CREATE INDEX "main"."idx_visibility" -ON "p_post" ( - "visibility" ASC -); - -- ---------------------------- -- Table structure for p_post_content -- ---------------------------- @@ -315,4 +342,27 @@ ON "p_comment" ( "post_id" ASC ); +-- ---------------------------- +-- Indexes structure for table p_contact +-- ---------------------------- +CREATE UNIQUE INDEX "main"."idx_user_friend_id" +ON "p_contact" ( + "user_id" ASC, + "friend_id" ASC +); +CREATE INDEX "main"."idx_user_friend_status" +ON "p_contact" ( + "user_id" ASC, + "friend_id" ASC, + "status" ASC +); + +-- ---------------------------- +-- Indexes structure for table p_post +-- ---------------------------- +CREATE INDEX "main"."idx_visibility" +ON "p_post" ( + "visibility" ASC +); + PRAGMA foreign_keys = true; diff --git a/web/.dockerignore b/web/.dockerignore index 220dc227..1809410d 100644 --- a/web/.dockerignore +++ b/web/.dockerignore @@ -1,3 +1,4 @@ components.d.ts *Dockerfile* node_modules +src-tauri/target diff --git a/web/.env b/web/.env index 1db683f6..6d3d734c 100644 --- a/web/.env +++ b/web/.env @@ -1,19 +1,26 @@ -VITE_HOST="https://api.paopao.info" +VITE_HOST="" # 模块开启 -VITE_ENABLE_WALLET=true +VITE_ENABLE_ANOUNCEMENT=false +VITE_ENABLE_WALLET=false # 功能开启 VITE_ALLOW_TWEET_ATTACHMENT=true -VITE_ALLOW_TWEET_ATTACHMENT_PRICE=true +VITE_ALLOW_TWEET_ATTACHMENT_PRICE=false VITE_ALLOW_TWEET_VIDEO=true VITE_ALLOW_TWEET_VISIBILITY=true +VITE_ALLOW_ACTIVATION=false VITE_ALLOW_PHONE_BIND=true # 局部参数 -VITE_DEFAULT_TWEET_VISIBILITY=public +VITE_DEFAULT_TWEET_VISIBILITY=friend +VITE_COPYRIGHT_TOP="2022 paopao.info" +VITE_COPYRIGHT_LEFT="Roc's Me" +VITE_COPYRIGHT_LEFT_LINK="" +VITE_COPYRIGHT_RIGHT="泡泡(PaoPao)开源社区" +VITE_COPYRIGHT_RIGHT_LINK="https://paopao.info" -# 图片推文404参数 +# 图片推文参数 VITE_DEFAULT_TWEET_IMAGE_404="https://paopao-assets.oss-cn-shanghai.aliyuncs.com/public/404.png" # AliOSS 图片thumbnail参数 VITE_TWEET_IMAGE_THUMBNAIL="?x-oss-process=image/resize,m_fill,w_300,h_300,limit_0/auto-orient,1/format,png" diff --git a/web/.gitignore b/web/.gitignore index 5e36b5b9..97679738 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -11,7 +11,6 @@ node_modules dist dist-ssr *.local -.env # Editor directories and files .vscode/* @@ -24,5 +23,6 @@ dist-ssr *.sln *.sw? +yarn.lock package-lock.json -components.d.ts \ No newline at end of file +components.d.ts diff --git a/web/Dockerfile b/web/Dockerfile index 29bfb306..cf6b0779 100644 --- a/web/Dockerfile +++ b/web/Dockerfile @@ -4,7 +4,7 @@ ARG API_HOST ARG USE_DIST=no WORKDIR /web COPY . . -RUN [ empty$API_HOST = empty ] || echo "VITE_HOST=$API_HOST" >.env +RUN [ empty$API_HOST = empty ] || echo "VITE_HOST=$API_HOST" >.env.local RUN [ $USE_DIST != no ] || (yarn && yarn build) FROM library/nginx diff --git a/web/README.md b/web/README.md new file mode 100644 index 00000000..7fd6bd2a --- /dev/null +++ b/web/README.md @@ -0,0 +1 @@ +paopao-ce's web frontend. diff --git a/web/build/info.json b/web/build/info.json deleted file mode 100644 index 290a7eb3..00000000 --- a/web/build/info.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "version": "8", - "buildTime": "2022-06-13 17:16:22" -} \ No newline at end of file diff --git a/web/build/plugins.ts b/web/build/plugins.ts deleted file mode 100644 index fa4355d0..00000000 --- a/web/build/plugins.ts +++ /dev/null @@ -1,46 +0,0 @@ -import type { Plugin } from "vite" -import { resolve } from "path" -import { readFileSync, writeFileSync } from "fs" - -function getFormatTime() { - let date = new Date(); - let year: string | number = date.getFullYear(); - let month: string | number = date.getMonth() + 1; - let day: string | number = date.getDate(); - let h: string | number = date.getHours(); - let m: string | number = date.getMinutes(); - let s: string | number = date.getSeconds(); - if (month < 10) month = "0"+month; - if (day < 10) day = "0"+day; - if (h < 10) h = "0"+h; - if (m < 10) m = "0"+m; - if (s < 10) s = "0"+s; - return [year, month, day].join("-") + " " + [h, m, s].join(":"); -} - -/** - * 自动修改版本号 - * @returns - */ -export function changePackageVersion(): Plugin { - if (process.env.NODE_ENV === "production") { - let packagePath = resolve(__dirname, "./info.json"); - let packageStr = readFileSync(packagePath, { - encoding: "utf-8" - }); - let packageJson = JSON.parse(packageStr); - let version = packageJson.version; - let versionArr: (string | number)[] = version.split("."); - let lastVersionNum = +versionArr[versionArr.length - 1]; - lastVersionNum++; - versionArr.splice(versionArr.length - 1, 1, lastVersionNum); - packageJson.version = versionArr.join("."); - packageJson.buildTime = getFormatTime(); - writeFileSync(packagePath, JSON.stringify(packageJson, null, "\t"), { - encoding: "utf-8" - }) - } - return { - name: "changePackageVersion" - } -} \ No newline at end of file diff --git a/web/dist/assets/404.9c166a4c.css b/web/dist/assets/404.9c166a4c.css new file mode 100644 index 00000000..bf6eac15 --- /dev/null +++ b/web/dist/assets/404.9c166a4c.css @@ -0,0 +1 @@ +.wrap404[data-v-4c5da4ba]{min-height:500px;display:flex;align-items:center;justify-content:center} diff --git a/web/dist/assets/404.dfeb5539.js b/web/dist/assets/404.dfeb5539.js new file mode 100644 index 00000000..d94075b8 --- /dev/null +++ b/web/dist/assets/404.dfeb5539.js @@ -0,0 +1,32 @@ +import{_ as F}from"./main-nav.3167f221.js";import{h as e,c as u,f as p,d as m,u as E,x as h,cP as S,y as _,z as d,A as V,N as D,bI as M,bF as I,bH as R,bG as $,ai as L,Y as P,a4 as f,a5 as v,W as T,a9 as H,al as N,K as j}from"./index.d4f5aad2.js";import{_ as k}from"./List.a66e9ae7.js";var O=e("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 36 36"},e("circle",{fill:"#FFCB4C",cx:"18",cy:"17.018",r:"17"}),e("path",{fill:"#65471B",d:"M14.524 21.036c-.145-.116-.258-.274-.312-.464-.134-.46.13-.918.59-1.021 4.528-1.021 7.577 1.363 7.706 1.465.384.306.459.845.173 1.205-.286.358-.828.401-1.211.097-.11-.084-2.523-1.923-6.182-1.098-.274.061-.554-.016-.764-.184z"}),e("ellipse",{fill:"#65471B",cx:"13.119",cy:"11.174",rx:"2.125",ry:"2.656"}),e("ellipse",{fill:"#65471B",cx:"24.375",cy:"12.236",rx:"2.125",ry:"2.656"}),e("path",{fill:"#F19020",d:"M17.276 35.149s1.265-.411 1.429-1.352c.173-.972-.624-1.167-.624-1.167s1.041-.208 1.172-1.376c.123-1.101-.861-1.363-.861-1.363s.97-.4 1.016-1.539c.038-.959-.995-1.428-.995-1.428s5.038-1.221 5.556-1.341c.516-.12 1.32-.615 1.069-1.694-.249-1.08-1.204-1.118-1.697-1.003-.494.115-6.744 1.566-8.9 2.068l-1.439.334c-.54.127-.785-.11-.404-.512.508-.536.833-1.129.946-2.113.119-1.035-.232-2.313-.433-2.809-.374-.921-1.005-1.649-1.734-1.899-1.137-.39-1.945.321-1.542 1.561.604 1.854.208 3.375-.833 4.293-2.449 2.157-3.588 3.695-2.83 6.973.828 3.575 4.377 5.876 7.952 5.048l3.152-.681z"}),e("path",{fill:"#65471B",d:"M9.296 6.351c-.164-.088-.303-.224-.391-.399-.216-.428-.04-.927.393-1.112 4.266-1.831 7.699-.043 7.843.034.433.231.608.747.391 1.154-.216.405-.74.546-1.173.318-.123-.063-2.832-1.432-6.278.047-.257.109-.547.085-.785-.042zm12.135 3.75c-.156-.098-.286-.243-.362-.424-.187-.442.023-.927.468-1.084 4.381-1.536 7.685.48 7.823.567.415.26.555.787.312 1.178-.242.39-.776.495-1.191.238-.12-.072-2.727-1.621-6.267-.379-.266.091-.553.046-.783-.096z"})),W=e("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 36 36"},e("path",{fill:"#FFCC4D",d:"M36 18c0 9.941-8.059 18-18 18-9.94 0-18-8.059-18-18C0 8.06 8.06 0 18 0c9.941 0 18 8.06 18 18"}),e("ellipse",{fill:"#664500",cx:"18",cy:"27",rx:"5",ry:"6"}),e("path",{fill:"#664500",d:"M5.999 11c-.208 0-.419-.065-.599-.2-.442-.331-.531-.958-.2-1.4C8.462 5.05 12.816 5 13 5c.552 0 1 .448 1 1 0 .551-.445.998-.996 1-.155.002-3.568.086-6.204 3.6-.196.262-.497.4-.801.4zm24.002 0c-.305 0-.604-.138-.801-.4-2.64-3.521-6.061-3.598-6.206-3.6-.55-.006-.994-.456-.991-1.005C22.006 5.444 22.45 5 23 5c.184 0 4.537.05 7.8 4.4.332.442.242 1.069-.2 1.4-.18.135-.39.2-.599.2zm-16.087 4.5l1.793-1.793c.391-.391.391-1.023 0-1.414s-1.023-.391-1.414 0L12.5 14.086l-1.793-1.793c-.391-.391-1.023-.391-1.414 0s-.391 1.023 0 1.414l1.793 1.793-1.793 1.793c-.391.391-.391 1.023 0 1.414.195.195.451.293.707.293s.512-.098.707-.293l1.793-1.793 1.793 1.793c.195.195.451.293.707.293s.512-.098.707-.293c.391-.391.391-1.023 0-1.414L13.914 15.5zm11 0l1.793-1.793c.391-.391.391-1.023 0-1.414s-1.023-.391-1.414 0L23.5 14.086l-1.793-1.793c-.391-.391-1.023-.391-1.414 0s-.391 1.023 0 1.414l1.793 1.793-1.793 1.793c-.391.391-.391 1.023 0 1.414.195.195.451.293.707.293s.512-.098.707-.293l1.793-1.793 1.793 1.793c.195.195.451.293.707.293s.512-.098.707-.293c.391-.391.391-1.023 0-1.414L24.914 15.5z"})),A=e("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 36 36"},e("ellipse",{fill:"#292F33",cx:"18",cy:"26",rx:"18",ry:"10"}),e("ellipse",{fill:"#66757F",cx:"18",cy:"24",rx:"18",ry:"10"}),e("path",{fill:"#E1E8ED",d:"M18 31C3.042 31 1 16 1 12h34c0 2-1.958 19-17 19z"}),e("path",{fill:"#77B255",d:"M35 12.056c0 5.216-7.611 9.444-17 9.444S1 17.271 1 12.056C1 6.84 8.611 3.611 18 3.611s17 3.229 17 8.445z"}),e("ellipse",{fill:"#A6D388",cx:"18",cy:"13",rx:"15",ry:"7"}),e("path",{d:"M21 17c-.256 0-.512-.098-.707-.293-2.337-2.337-2.376-4.885-.125-8.262.739-1.109.9-2.246.478-3.377-.461-1.236-1.438-1.996-1.731-2.077-.553 0-.958-.443-.958-.996 0-.552.491-.995 1.043-.995.997 0 2.395 1.153 3.183 2.625 1.034 1.933.91 4.039-.351 5.929-1.961 2.942-1.531 4.332-.125 5.738.391.391.391 1.023 0 1.414-.195.196-.451.294-.707.294zm-6-2c-.256 0-.512-.098-.707-.293-2.337-2.337-2.376-4.885-.125-8.262.727-1.091.893-2.083.494-2.947-.444-.961-1.431-1.469-1.684-1.499-.552 0-.989-.447-.989-1 0-.552.458-1 1.011-1 .997 0 2.585.974 3.36 2.423.481.899 1.052 2.761-.528 5.131-1.961 2.942-1.531 4.332-.125 5.738.391.391.391 1.023 0 1.414-.195.197-.451.295-.707.295z",fill:"#5C913B"})),K=e("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 36 36"},e("path",{fill:"#EF9645",d:"M15.5 2.965c1.381 0 2.5 1.119 2.5 2.5v.005L20.5.465c1.381 0 2.5 1.119 2.5 2.5V4.25l2.5-1.535c1.381 0 2.5 1.119 2.5 2.5V8.75L29 18H15.458L15.5 2.965z"}),e("path",{fill:"#FFDC5D",d:"M4.625 16.219c1.381-.611 3.354.208 4.75 2.188.917 1.3 1.187 3.151 2.391 3.344.46.073 1.234-.313 1.234-1.397V4.5s0-2 2-2 2 2 2 2v11.633c0-.029 1-.064 1-.082V2s0-2 2-2 2 2 2 2v14.053c0 .017 1 .041 1 .069V4.25s0-2 2-2 2 2 2 2v12.638c0 .118 1 .251 1 .398V8.75s0-2 2-2 2 2 2 2V24c0 6.627-5.373 12-12 12-4.775 0-8.06-2.598-9.896-5.292C8.547 28.423 8.096 26.051 8 25.334c0 0-.123-1.479-1.156-2.865-1.469-1.969-2.5-3.156-3.125-3.866-.317-.359-.625-1.707.906-2.384z"})),G=u("result",` + color: var(--n-text-color); + line-height: var(--n-line-height); + font-size: var(--n-font-size); + transition: + color .3s var(--n-bezier); +`,[u("result-icon",` + display: flex; + justify-content: center; + transition: color .3s var(--n-bezier); + `,[p("status-image",` + font-size: var(--n-icon-size); + width: 1em; + height: 1em; + `),u("base-icon",` + color: var(--n-icon-color); + font-size: var(--n-icon-size); + `)]),u("result-content",{marginTop:"24px"}),u("result-footer",` + margin-top: 24px; + text-align: center; + `),u("result-header",[p("title",` + margin-top: 16px; + font-weight: var(--n-title-font-weight); + transition: color .3s var(--n-bezier); + text-align: center; + color: var(--n-title-text-color); + font-size: var(--n-title-font-size); + `),p("description",` + margin-top: 4px; + text-align: center; + font-size: var(--n-font-size); + `)])]);const Y={403:K,404:O,418:A,500:W,info:e(M,null),success:e(I,null),warning:e(R,null),error:e($,null)},q=Object.assign(Object.assign({},h.props),{size:{type:String,default:"medium"},status:{type:String,default:"info"},title:String,description:String});var J=m({name:"Result",props:q,setup(n){const{mergedClsPrefixRef:r,inlineThemeDisabled:t}=E(n),s=h("Result","-result",G,S,n,r),o=_(()=>{const{size:l,status:a}=n,{common:{cubicBezierEaseInOut:c},self:{textColor:g,lineHeight:x,titleTextColor:z,titleFontWeight:w,[d("iconColor",a)]:C,[d("fontSize",l)]:y,[d("titleFontSize",l)]:B,[d("iconSize",l)]:b}}=s.value;return{"--n-bezier":c,"--n-font-size":y,"--n-icon-size":b,"--n-line-height":x,"--n-text-color":g,"--n-title-font-size":B,"--n-title-font-weight":w,"--n-title-text-color":z,"--n-icon-color":C||""}}),i=t?V("result",_(()=>{const{size:l,status:a}=n;let c="";return l&&(c+=l[0]),a&&(c+=a[0]),c}),o,n):void 0;return{mergedClsPrefix:r,cssVars:t?void 0:o,themeClass:i==null?void 0:i.themeClass,onRender:i==null?void 0:i.onRender}},render(){var n;const{status:r,$slots:t,mergedClsPrefix:s,onRender:o}=this;return o==null||o(),e("div",{class:[`${s}-result`,this.themeClass],style:this.cssVars},e("div",{class:`${s}-result-icon`},((n=t.icon)===null||n===void 0?void 0:n.call(t))||e(D,{clsPrefix:s},{default:()=>Y[r]})),e("div",{class:`${s}-result-header`},this.title?e("div",{class:`${s}-result-header__title`},this.title):null,this.description?e("div",{class:`${s}-result-header__description`},this.description):null),t.default&&e("div",{class:`${s}-result-content`},t),t.footer&&e("div",{class:`${s}-result-footer`},t.footer()))}});const Q=m({__name:"404",setup(n){const r=N(),t=()=>{r.push({path:"/"})};return(s,o)=>{const i=F,l=j,a=J,c=k;return T(),P("div",null,[f(i,{title:"404"}),f(c,{class:"main-content-wrap wrap404",bordered:""},{default:v(()=>[f(a,{status:"404",title:"404 \u8D44\u6E90\u4E0D\u5B58\u5728",description:"\u518D\u770B\u770B\u5176\u4ED6\u7684\u5427"},{footer:v(()=>[f(l,{onClick:t},{default:v(()=>[H("\u56DE\u4E3B\u9875")]),_:1})]),_:1})]),_:1})])}}});var e1=L(Q,[["__scopeId","data-v-4c5da4ba"]]);export{e1 as default}; diff --git a/web/dist/assets/Alert.6cb9deb6.js b/web/dist/assets/Alert.6cb9deb6.js new file mode 100644 index 00000000..b195e7c2 --- /dev/null +++ b/web/dist/assets/Alert.6cb9deb6.js @@ -0,0 +1,48 @@ +import{k as M,cm as O,cn as u,m as v,c as P,f as i,e as H,bM as N,b as V,d as K,u as D,x as E,j as G,y as $,bm as q,z as c,A as J,r as Q,h as s,bd as U,co as X,L as Y,B as Z,bK as oo,N as eo,bG as ro,bH as no,bI as lo,bF as so}from"./index.d4f5aad2.js";const to=r=>{const{lineHeight:e,borderRadius:d,fontWeightStrong:C,baseColor:t,dividerColor:b,actionColor:S,textColor1:g,textColor2:l,closeColorHover:h,closeColorPressed:f,closeIconColor:m,closeIconColorHover:p,closeIconColorPressed:n,infoColor:o,successColor:I,warningColor:x,errorColor:z,fontSize:T}=r;return Object.assign(Object.assign({},O),{fontSize:T,lineHeight:e,titleFontWeight:C,borderRadius:d,border:`1px solid ${b}`,color:S,titleTextColor:g,iconColor:l,contentTextColor:l,closeBorderRadius:d,closeColorHover:h,closeColorPressed:f,closeIconColor:m,closeIconColorHover:p,closeIconColorPressed:n,borderInfo:`1px solid ${u(t,v(o,{alpha:.25}))}`,colorInfo:u(t,v(o,{alpha:.08})),titleTextColorInfo:g,iconColorInfo:o,contentTextColorInfo:l,closeColorHoverInfo:h,closeColorPressedInfo:f,closeIconColorInfo:m,closeIconColorHoverInfo:p,closeIconColorPressedInfo:n,borderSuccess:`1px solid ${u(t,v(I,{alpha:.25}))}`,colorSuccess:u(t,v(I,{alpha:.08})),titleTextColorSuccess:g,iconColorSuccess:I,contentTextColorSuccess:l,closeColorHoverSuccess:h,closeColorPressedSuccess:f,closeIconColorSuccess:m,closeIconColorHoverSuccess:p,closeIconColorPressedSuccess:n,borderWarning:`1px solid ${u(t,v(x,{alpha:.33}))}`,colorWarning:u(t,v(x,{alpha:.08})),titleTextColorWarning:g,iconColorWarning:x,contentTextColorWarning:l,closeColorHoverWarning:h,closeColorPressedWarning:f,closeIconColorWarning:m,closeIconColorHoverWarning:p,closeIconColorPressedWarning:n,borderError:`1px solid ${u(t,v(z,{alpha:.25}))}`,colorError:u(t,v(z,{alpha:.08})),titleTextColorError:g,iconColorError:z,contentTextColorError:l,closeColorHoverError:h,closeColorPressedError:f,closeIconColorError:m,closeIconColorHoverError:p,closeIconColorPressedError:n})},io={name:"Alert",common:M,self:to};var ao=io,co=P("alert",` + line-height: var(--n-line-height); + border-radius: var(--n-border-radius); + position: relative; + transition: background-color .3s var(--n-bezier); + background-color: var(--n-color); + text-align: start; + word-break: break-word; +`,[i("border",` + border-radius: inherit; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + transition: border-color .3s var(--n-bezier); + border: var(--n-border); + pointer-events: none; + `),H("closable",[P("alert-body",[i("title",` + padding-right: 24px; + `)])]),i("icon",{color:"var(--n-icon-color)"}),P("alert-body",{padding:"var(--n-padding)"},[i("title",{color:"var(--n-title-text-color)"}),i("content",{color:"var(--n-content-text-color)"})]),N({originalTransition:"transform .3s var(--n-bezier)",enterToProps:{transform:"scale(1)"},leaveToProps:{transform:"scale(0.9)"}}),i("icon",` + position: absolute; + left: 0; + top: 0; + align-items: center; + justify-content: center; + display: flex; + width: var(--n-icon-size); + height: var(--n-icon-size); + font-size: var(--n-icon-size); + margin: var(--n-icon-margin); + `),i("close",` + transition: + color .3s var(--n-bezier), + background-color .3s var(--n-bezier); + position: absolute; + right: 0; + top: 0; + margin: var(--n-close-margin); + `),H("show-icon",[P("alert-body",{paddingLeft:"calc(var(--n-icon-margin-left) + var(--n-icon-size) + var(--n-icon-margin-right))"})]),P("alert-body",` + border-radius: var(--n-border-radius); + transition: border-color .3s var(--n-bezier); + `,[i("title",` + transition: color .3s var(--n-bezier); + font-size: 16px; + line-height: 19px; + font-weight: var(--n-title-font-weight); + `,[V("& +",[i("content",{marginTop:"9px"})])]),i("content",{transition:"color .3s var(--n-bezier)",fontSize:"var(--n-font-size)"})]),i("icon",{transition:"color .3s var(--n-bezier)"})]);const go=Object.assign(Object.assign({},E.props),{title:String,showIcon:{type:Boolean,default:!0},type:{type:String,default:"default"},bordered:{type:Boolean,default:!0},closable:Boolean,onClose:Function,onAfterLeave:Function,onAfterHide:Function});var uo=K({name:"Alert",inheritAttrs:!1,props:go,setup(r){const{mergedClsPrefixRef:e,mergedBorderedRef:d,inlineThemeDisabled:C,mergedRtlRef:t}=D(r),b=E("Alert","-alert",co,ao,r,e),S=G("Alert",t,e),g=$(()=>{const{common:{cubicBezierEaseInOut:n},self:o}=b.value,{fontSize:I,borderRadius:x,titleFontWeight:z,lineHeight:T,iconSize:R,iconMargin:y,iconMarginRtl:_,closeIconSize:A,closeBorderRadius:W,closeSize:w,closeMargin:B,closeMarginRtl:L,padding:k}=o,{type:a}=r,{left:j,right:F}=q(y);return{"--n-bezier":n,"--n-color":o[c("color",a)],"--n-close-icon-size":A,"--n-close-border-radius":W,"--n-close-color-hover":o[c("closeColorHover",a)],"--n-close-color-pressed":o[c("closeColorPressed",a)],"--n-close-icon-color":o[c("closeIconColor",a)],"--n-close-icon-color-hover":o[c("closeIconColorHover",a)],"--n-close-icon-color-pressed":o[c("closeIconColorPressed",a)],"--n-icon-color":o[c("iconColor",a)],"--n-border":o[c("border",a)],"--n-title-text-color":o[c("titleTextColor",a)],"--n-content-text-color":o[c("contentTextColor",a)],"--n-line-height":T,"--n-border-radius":x,"--n-font-size":I,"--n-title-font-weight":z,"--n-icon-size":R,"--n-icon-margin":y,"--n-icon-margin-rtl":_,"--n-close-size":w,"--n-close-margin":B,"--n-close-margin-rtl":L,"--n-padding":k,"--n-icon-margin-left":j,"--n-icon-margin-right":F}}),l=C?J("alert",$(()=>r.type[0]),g,r):void 0,h=Q(!0),f=()=>{const{onAfterLeave:n,onAfterHide:o}=r;n&&n(),o&&o()};return{rtlEnabled:S,mergedClsPrefix:e,mergedBordered:d,visible:h,handleCloseClick:()=>{var n;Promise.resolve((n=r.onClose)===null||n===void 0?void 0:n.call(r)).then(o=>{o!==!1&&(h.value=!1)})},handleAfterLeave:()=>{f()},mergedTheme:b,cssVars:C?void 0:g,themeClass:l==null?void 0:l.themeClass,onRender:l==null?void 0:l.onRender}},render(){var r;return(r=this.onRender)===null||r===void 0||r.call(this),s(oo,{onAfterLeave:this.handleAfterLeave},{default:()=>{const{mergedClsPrefix:e,$slots:d}=this,C={class:[`${e}-alert`,this.themeClass,this.closable&&`${e}-alert--closable`,this.showIcon&&`${e}-alert--show-icon`,this.rtlEnabled&&`${e}-alert--rtl`],style:this.cssVars,role:"alert"};return this.visible?s("div",Object.assign({},U(this.$attrs,C)),this.closable&&s(X,{clsPrefix:e,class:`${e}-alert__close`,onClick:this.handleCloseClick}),this.bordered&&s("div",{class:`${e}-alert__border`}),this.showIcon&&s("div",{class:`${e}-alert__icon`,"aria-hidden":"true"},Y(d.icon,()=>[s(eo,{clsPrefix:e},{default:()=>{switch(this.type){case"success":return s(so,null);case"info":return s(lo,null);case"warning":return s(no,null);case"error":return s(ro,null);default:return null}}})])),s("div",{class:[`${e}-alert-body`,this.mergedBordered&&`${e}-alert-body--bordered`]},Z(d.header,t=>{const b=t||this.title;return b?s("div",{class:`${e}-alert-body__title`},b):null}),d.default&&s("div",{class:`${e}-alert-body__content`},d))):null}})}});export{uo as _}; diff --git a/web/dist/assets/Anouncement.4c2503ee.js b/web/dist/assets/Anouncement.4c2503ee.js new file mode 100644 index 00000000..c5ed7ab1 --- /dev/null +++ b/web/dist/assets/Anouncement.4c2503ee.js @@ -0,0 +1 @@ +import{_ as B}from"./post-skeleton.38f0f247.js";import{_ as N}from"./main-nav.3167f221.js";import{ai as z,d as E,r as a,a2 as R,Y as t,a4 as o,a5 as c,aj as S,W as n,a3 as m,a7 as l,ab as V,ac as F,$ as P,a6 as $,Z as s,aa as _,cb as j}from"./index.d4f5aad2.js";import{f as q}from"./formatTime.e07969bb.js";import{_ as D}from"./List.a66e9ae7.js";import{_ as I}from"./Pagination.c13c2d34.js";import{a as L,_ as M}from"./Skeleton.e1c16fcb.js";const O={key:0,class:"pagination-wrap"},T={key:0,class:"skeleton-wrap"},U={key:1},W={key:0,class:"empty-wrap"},Y={class:"bill-line"},Z=E({__name:"Anouncement",setup(G){const d=P(),g=S(),v=a(!1),u=a([]),r=a(+g.query.p||1),f=a(20),p=a(0),h=i=>{r.value=i};return R(()=>{}),(i,H)=>{const y=N,k=I,x=B,w=L,C=M,A=D;return n(),t("div",null,[o(y,{title:"\u516C\u544A"}),o(A,{class:"main-content-wrap",bordered:""},{footer:c(()=>[p.value>1?(n(),t("div",O,[o(k,{page:r.value,"onUpdate:page":h,"page-slot":m(d).state.collapsedRight?5:8,"page-count":p.value},null,8,["page","page-slot","page-count"])])):l("",!0)]),default:c(()=>[v.value?(n(),t("div",T,[o(x,{num:f.value},null,8,["num"])])):(n(),t("div",U,[u.value.length===0?(n(),t("div",W,[o(w,{size:"large",description:"\u6682\u65E0\u6570\u636E"})])):l("",!0),(n(!0),t(V,null,F(u.value,e=>(n(),$(C,{key:e.id},{default:c(()=>[s("div",Y,[s("div",null,"NO."+_(e.id),1),s("div",null,_(e.reason),1),s("div",{class:j({income:e.change_amount>=0,out:e.change_amount<0})},_((e.change_amount>0?"+":"")+(e.change_amount/100).toFixed(2)),3),s("div",null,_(m(q)(e.created_on)),1)])]),_:2},1024))),128))]))]),_:1})])}}});var te=z(Z,[["__scopeId","data-v-543914f4"]]);export{te as default}; diff --git a/web/dist/assets/Anouncement.5f84f68f.css b/web/dist/assets/Anouncement.5f84f68f.css new file mode 100644 index 00000000..a90a7257 --- /dev/null +++ b/web/dist/assets/Anouncement.5f84f68f.css @@ -0,0 +1 @@ +.balance-wrap[data-v-543914f4]{padding:16px}.balance-wrap .balance-line[data-v-543914f4]{display:flex;justify-content:space-between}.balance-wrap .balance-line .balance-opts[data-v-543914f4]{display:flex;flex-direction:column}.bill-line[data-v-543914f4]{padding:16px;display:flex;justify-content:space-between}.bill-line .income[data-v-543914f4],.bill-line .out[data-v-543914f4]{font-weight:700}.bill-line .income[data-v-543914f4]{color:#18a058}.pagination-wrap[data-v-543914f4]{padding:10px;display:flex;justify-content:center;overflow:hidden}.qrcode-wrap[data-v-543914f4]{display:flex;flex-direction:column;align-items:center;justify-content:center}.qrcode-wrap .pay-tips[data-v-543914f4]{margin-top:16px}.qrcode-wrap .pay-sub-tips[data-v-543914f4]{margin-top:4px;font-size:12px;opacity:.75;display:flex;align-items:center}.dark .income[data-v-543914f4]{color:#63e2b7} diff --git a/web/dist/assets/Collection.d63a34f0.css b/web/dist/assets/Collection.d63a34f0.css new file mode 100644 index 00000000..e940aec7 --- /dev/null +++ b/web/dist/assets/Collection.d63a34f0.css @@ -0,0 +1 @@ +.pagination-wrap[data-v-2f4c0166]{padding:10px;display:flex;justify-content:center;overflow:hidden} diff --git a/web/dist/assets/Collection.e823f1cf.js b/web/dist/assets/Collection.e823f1cf.js new file mode 100644 index 00000000..b05ebee5 --- /dev/null +++ b/web/dist/assets/Collection.e823f1cf.js @@ -0,0 +1 @@ +import{_ as z}from"./post-item.11c28084.js";import{_ as B}from"./post-skeleton.38f0f247.js";import{_ as E}from"./main-nav.3167f221.js";import{ai as P,d as R,r as n,a2 as $,Y as o,a4 as a,a5 as p,aj as b,cu as F,W as e,a3 as M,a7 as m,ab as N,ac as S,$ as V,al as j,a6 as q}from"./index.d4f5aad2.js";import{_ as I}from"./List.a66e9ae7.js";import{_ as L}from"./Pagination.c13c2d34.js";import{a as T,_ as U}from"./Skeleton.e1c16fcb.js";import"./content.ed80294a.js";import"./formatTime.e07969bb.js";import"./Thing.d394adea.js";const W={key:0,class:"pagination-wrap"},Y={key:0,class:"skeleton-wrap"},A={key:1},D={key:0,class:"empty-wrap"},G=R({__name:"Collection",setup(H){const d=V(),g=b();j();const s=n(!1),_=n([]),l=n(+g.query.p||1),c=n(20),u=n(0),r=()=>{s.value=!0,F({page:l.value,page_size:c.value}).then(t=>{s.value=!1,_.value=t.list,u.value=Math.ceil(t.pager.total_rows/c.value),window.scrollTo(0,0)}).catch(t=>{s.value=!1})},v=t=>{l.value=t,r()};return $(()=>{r()}),(t,J)=>{const f=E,h=L,k=B,y=T,w=z,C=U,x=I;return e(),o("div",null,[a(f,{title:"\u6536\u85CF"}),a(x,{class:"main-content-wrap",bordered:""},{footer:p(()=>[u.value>1?(e(),o("div",W,[a(h,{page:l.value,"onUpdate:page":v,"page-slot":M(d).state.collapsedRight?5:8,"page-count":u.value},null,8,["page","page-slot","page-count"])])):m("",!0)]),default:p(()=>[s.value?(e(),o("div",Y,[a(k,{num:c.value},null,8,["num"])])):(e(),o("div",A,[_.value.length===0?(e(),o("div",D,[a(y,{size:"large",description:"\u6682\u65E0\u6570\u636E"})])):m("",!0),(e(!0),o(N,null,S(_.value,i=>(e(),q(C,{key:i.id},{default:p(()=>[a(w,{post:i},null,8,["post"])]),_:2},1024))),128))]))]),_:1})])}}});var se=P(G,[["__scopeId","data-v-2f4c0166"]]);export{se as default}; diff --git a/web/dist/assets/Contacts.9d93fb1f.js b/web/dist/assets/Contacts.9d93fb1f.js new file mode 100644 index 00000000..a2267b26 --- /dev/null +++ b/web/dist/assets/Contacts.9d93fb1f.js @@ -0,0 +1 @@ +import{ai as k,d as C,al as E,W as e,Y as n,Z as c,a4 as o,aa as v,ae as N,r as l,a2 as P,cv as R,a5 as g,aj as S,a3 as U,a7 as y,ab as V,ac as q,$ as M,a6 as T}from"./index.d4f5aad2.js";import{_ as j}from"./post-skeleton.38f0f247.js";import{_ as F}from"./main-nav.3167f221.js";import{_ as L}from"./List.a66e9ae7.js";import{_ as W}from"./Pagination.c13c2d34.js";import{a as Y,_ as Z}from"./Skeleton.e1c16fcb.js";const A={class:"avatar"},G={class:"base-info"},H={class:"username"},J={class:"uid"},K=C({__name:"contact-item",props:{contact:null},setup(s){const p=E(),m=t=>{p.push({name:"user",query:{username:t}})};return(t,a)=>{const _=N;return e(),n("div",{class:"contact-item",onClick:a[0]||(a[0]=u=>m(s.contact.username))},[c("div",A,[o(_,{size:"large",src:s.contact.avatar},null,8,["src"])]),c("div",G,[c("div",H,[c("strong",null,v(s.contact.nickname),1),c("span",null," @"+v(s.contact.username),1)]),c("div",J,"UID. "+v(s.contact.user_id),1)])])}}});var O=k(K,[["__scopeId","data-v-23bc18c8"]]);const Q={key:0,class:"pagination-wrap"},X={key:0,class:"skeleton-wrap"},ee={key:1},te={key:0,class:"empty-wrap"},ae=C({__name:"Contacts",setup(s){const p=M(),m=S(),t=l(!1),a=l([]),_=l(+m.query.p||1),u=l(20),d=l(0),w=r=>{_.value=r,f()};P(()=>{f()});const f=(r=!1)=>{a.value.length===0&&(t.value=!0),R({page:_.value,page_size:u.value}).then(i=>{t.value=!1,a.value=i.list,d.value=Math.ceil(i.pager.total_rows/u.value),r&&setTimeout(()=>{window.scrollTo(0,99999)},50)}).catch(i=>{t.value=!1})};return(r,i)=>{const $=F,x=W,B=j,b=Y,z=O,I=Z,D=L;return e(),n("div",null,[o($,{title:"\u597D\u53CB"}),o(D,{class:"main-content-wrap",bordered:""},{footer:g(()=>[d.value>1?(e(),n("div",Q,[o(x,{page:_.value,"onUpdate:page":w,"page-slot":U(p).state.collapsedRight?5:8,"page-count":d.value},null,8,["page","page-slot","page-count"])])):y("",!0)]),default:g(()=>[t.value?(e(),n("div",X,[o(B,{num:u.value},null,8,["num"])])):(e(),n("div",ee,[a.value.length===0?(e(),n("div",te,[o(b,{size:"large",description:"\u6682\u65E0\u6570\u636E"})])):y("",!0),(e(!0),n(V,null,q(a.value,h=>(e(),T(I,{key:h.user_id},{default:g(()=>[o(z,{contact:h},null,8,["contact"])]),_:2},1024))),128))]))]),_:1})])}}});var ue=k(ae,[["__scopeId","data-v-e9de9e50"]]);export{ue as default}; diff --git a/web/dist/assets/Contacts.e16015c7.css b/web/dist/assets/Contacts.e16015c7.css new file mode 100644 index 00000000..9f1d49d7 --- /dev/null +++ b/web/dist/assets/Contacts.e16015c7.css @@ -0,0 +1 @@ +.contact-item[data-v-23bc18c8]{display:flex;width:100%;padding:12px 16px}.contact-item[data-v-23bc18c8]:hover{background:#f7f9f9;cursor:pointer}.contact-item .avatar[data-v-23bc18c8]{width:55px}.contact-item .base-info[data-v-23bc18c8]{position:relative;width:calc(100% - 55px)}.contact-item .base-info .username[data-v-23bc18c8]{line-height:16px;font-size:16px}.contact-item .base-info .uid[data-v-23bc18c8]{font-size:14px;line-height:14px;margin-top:10px;opacity:.75}.dark .contact-item[data-v-23bc18c8]:hover{background:#18181c}.pagination-wrap[data-v-e9de9e50]{padding:10px;display:flex;justify-content:center;overflow:hidden} diff --git a/web/dist/assets/FiraCode-Regular.f13d1ece.woff2 b/web/dist/assets/FiraCode-Regular.f13d1ece.woff2 new file mode 100644 index 00000000..d58667c5 Binary files /dev/null and b/web/dist/assets/FiraCode-Regular.f13d1ece.woff2 differ diff --git a/web/dist/assets/Home.07e73aab.css b/web/dist/assets/Home.07e73aab.css new file mode 100644 index 00000000..25a8e7e0 --- /dev/null +++ b/web/dist/assets/Home.07e73aab.css @@ -0,0 +1 @@ +.compose-wrap{width:100%;padding:16px;box-sizing:border-box}.compose-wrap .compose-line{display:flex;flex-direction:row}.compose-wrap .compose-line .compose-user{width:42px;height:42px;display:flex;align-items:center}.compose-wrap .compose-line.compose-options{margin-top:6px;padding-left:42px;display:flex;justify-content:space-between}.compose-wrap .compose-line.compose-options .submit-wrap{display:flex;align-items:center}.compose-wrap .compose-line.compose-options .submit-wrap .text-statistic{margin-right:8px;width:20px;height:20px;transform:rotate(180deg)}.compose-wrap .link-wrap{margin-left:42px;margin-right:42px}.compose-wrap .eye-wrap{margin-left:64px}.compose-wrap .login-wrap{display:flex;justify-content:center;width:100%}.compose-wrap .login-wrap .login-banner{margin-bottom:12px;opacity:.8}.compose-wrap .login-wrap button{margin:0 4px}.attachment-list-wrap{margin-top:12px;margin-left:42px}.attachment-list-wrap .n-upload-file-info__thumbnail{overflow:hidden}.pagination-wrap[data-v-7e0dfc66]{padding:10px;display:flex;justify-content:center;overflow:hidden} diff --git a/web/dist/assets/Home.d77fc36a.js b/web/dist/assets/Home.d77fc36a.js new file mode 100644 index 00000000..8c867839 --- /dev/null +++ b/web/dist/assets/Home.d77fc36a.js @@ -0,0 +1,217 @@ +import{_ as It}from"./post-item.11c28084.js";import{_ as Vt}from"./post-skeleton.38f0f247.js";import{d as Q,h as i,c as q,a as $e,b as G,e as W,f as K,u as we,g as $t,p as Ze,i as St,j as Se,k as et,l as Bt,m as rt,n as ft,o as tt,r as $,q as Ae,t as ce,s as Ee,v as re,w as Z,x as fe,y as ne,z as Pe,A as nt,B as Qe,C as Ft,D as Pt,E as pt,F as mt,G as ht,H as Dt,_ as De,I as zt,J as vt,K as ye,L as ze,N as ve,M as Ye,O as At,P as Ge,Q as We,R as Et,S as gt,T as Tt,U as at,X as lt,V as Ut,W as M,Y as J,Z as X,$ as bt,a0 as Ot,a1 as Nt,a2 as _t,a3 as ae,a4 as I,a5 as D,a6 as Ve,a7 as le,a8 as it,a9 as Re,aa as Mt,ab as yt,ac as wt,ad as Lt,ae as jt,af as qt,ag as Ht,ah as Kt,ai as Gt,aj as Wt,ak as Jt,al as Xt}from"./index.d4f5aad2.js";import{V as de,l as st,I as Qt,P as Ie,_ as Yt}from"./IEnum.032938cf.js";import{p as Zt}from"./content.ed80294a.js";import{_ as en,a as tn,b as nn,c as on}from"./Upload.6bcec76c.js";import{_ as rn}from"./main-nav.3167f221.js";import{_ as an}from"./List.a66e9ae7.js";import{_ as ln}from"./Pagination.c13c2d34.js";import{_ as sn,a as un}from"./Skeleton.e1c16fcb.js";import"./formatTime.e07969bb.js";import"./Thing.d394adea.js";var dn=Q({name:"ArrowDown",render(){return i("svg",{viewBox:"0 0 28 28",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},i("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},i("g",{"fill-rule":"nonzero"},i("path",{d:"M23.7916,15.2664 C24.0788,14.9679 24.0696,14.4931 23.7711,14.206 C23.4726,13.9188 22.9978,13.928 22.7106,14.2265 L14.7511,22.5007 L14.7511,3.74792 C14.7511,3.33371 14.4153,2.99792 14.0011,2.99792 C13.5869,2.99792 13.2511,3.33371 13.2511,3.74793 L13.2511,22.4998 L5.29259,14.2265 C5.00543,13.928 4.53064,13.9188 4.23213,14.206 C3.93361,14.4931 3.9244,14.9679 4.21157,15.2664 L13.2809,24.6944 C13.6743,25.1034 14.3289,25.1034 14.7223,24.6944 L23.7916,15.2664 Z"}))))}}),cn=Q({name:"ArrowUp",render(){return i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20"},i("g",{fill:"none"},i("path",{d:"M3.13 9.163a.5.5 0 1 0 .74.674L9.5 3.67V17.5a.5.5 0 0 0 1 0V3.672l5.63 6.165a.5.5 0 0 0 .738-.674l-6.315-6.916a.746.746 0 0 0-.632-.24a.746.746 0 0 0-.476.24L3.131 9.163z",fill:"currentColor"})))}}),xt=Q({name:"Remove",render(){return i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"},i("line",{x1:"400",y1:"256",x2:"112",y2:"256",style:` + fill: none; + stroke: currentColor; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 32px; + `}))}});const N="0!important",Ct="-1px!important";function be(e){return W(e+"-type",[G("& +",[q("button",{},[W(e+"-type",[K("border",{borderLeftWidth:N}),K("state-border",{left:Ct})])])])])}function _e(e){return W(e+"-type",[G("& +",[q("button",[W(e+"-type",[K("border",{borderTopWidth:N}),K("state-border",{top:Ct})])])])])}var fn=q("button-group",` + flex-wrap: nowrap; + display: inline-flex; + position: relative; +`,[$e("vertical",{flexDirection:"row"},[$e("rtl",[q("button",[G("&:first-child:not(:last-child)",` + margin-right: ${N}; + border-top-right-radius: ${N}; + border-bottom-right-radius: ${N}; + `),G("&:last-child:not(:first-child)",` + margin-left: ${N}; + border-top-left-radius: ${N}; + border-bottom-left-radius: ${N}; + `),G("&:not(:first-child):not(:last-child)",` + margin-left: ${N}; + margin-right: ${N}; + border-radius: ${N}; + `),be("default"),W("ghost",[be("primary"),be("info"),be("success"),be("warning"),be("error")])])])]),W("vertical",{flexDirection:"column"},[q("button",[G("&:first-child:not(:last-child)",` + margin-bottom: ${N}; + margin-left: ${N}; + margin-right: ${N}; + border-bottom-left-radius: ${N}; + border-bottom-right-radius: ${N}; + `),G("&:last-child:not(:first-child)",` + margin-top: ${N}; + margin-left: ${N}; + margin-right: ${N}; + border-top-left-radius: ${N}; + border-top-right-radius: ${N}; + `),G("&:not(:first-child):not(:last-child)",` + margin: ${N}; + border-radius: ${N}; + `),_e("default"),W("ghost",[_e("primary"),_e("info"),_e("success"),_e("warning"),_e("error")])])])]);const pn={size:{type:String,default:void 0},vertical:Boolean};var mn=Q({name:"ButtonGroup",props:pn,setup(e){const{mergedClsPrefixRef:o,mergedRtlRef:t}=we(e);return $t("-button-group",fn,o),Ze(St,e),{rtlEnabled:Se("ButtonGroup",t,o),mergedClsPrefix:o}},render(){const{mergedClsPrefix:e}=this;return i("div",{class:[`${e}-button-group`,this.rtlEnabled&&`${e}-button-group--rtl`,this.vertical&&`${e}-button-group--vertical`],role:"group"},this.$slots)}});const hn=e=>{const{borderColor:o,primaryColor:t,baseColor:s,textColorDisabled:a,inputColorDisabled:c,textColor2:l,opacityDisabled:k,borderRadius:g,fontSizeSmall:S,fontSizeMedium:p,fontSizeLarge:E,heightSmall:b,heightMedium:m,heightLarge:_,lineHeight:y}=e;return Object.assign(Object.assign({},Bt),{labelLineHeight:y,buttonHeightSmall:b,buttonHeightMedium:m,buttonHeightLarge:_,fontSizeSmall:S,fontSizeMedium:p,fontSizeLarge:E,boxShadow:`inset 0 0 0 1px ${o}`,boxShadowActive:`inset 0 0 0 1px ${t}`,boxShadowFocus:`inset 0 0 0 1px ${t}, 0 0 0 2px ${rt(t,{alpha:.2})}`,boxShadowHover:`inset 0 0 0 1px ${t}`,boxShadowDisabled:`inset 0 0 0 1px ${o}`,color:s,colorDisabled:c,colorActive:"#0000",textColor:l,textColorDisabled:a,dotColorActive:t,dotColorDisabled:o,buttonBorderColor:o,buttonBorderColorActive:t,buttonBorderColorHover:o,buttonColor:s,buttonColorActive:s,buttonTextColor:l,buttonTextColorActive:t,buttonTextColorHover:t,opacityDisabled:k,buttonBoxShadowFocus:`inset 0 0 0 1px ${t}, 0 0 0 2px ${rt(t,{alpha:.3})}`,buttonBoxShadowHover:"inset 0 0 0 1px #0000",buttonBoxShadow:"inset 0 0 0 1px #0000",buttonBorderRadius:g})},vn={name:"Radio",common:et,self:hn};var kt=vn;const gn={name:String,value:{type:[String,Number,Boolean],default:"on"},checked:{type:Boolean,default:void 0},defaultChecked:Boolean,disabled:{type:Boolean,default:void 0},label:String,size:String,onUpdateChecked:[Function,Array],"onUpdate:checked":[Function,Array],checkedValue:{type:Boolean,default:void 0}},Rt=ft("n-radio-group");function bn(e){const o=tt(e,{mergedSize(u){const{size:z}=e;if(z!==void 0)return z;if(l){const{mergedSizeRef:{value:A}}=l;if(A!==void 0)return A}return u?u.mergedSize.value:"medium"},mergedDisabled(u){return!!(e.disabled||l!=null&&l.disabledRef.value||u!=null&&u.disabled.value)}}),{mergedSizeRef:t,mergedDisabledRef:s}=o,a=$(null),c=$(null),l=Ae(Rt,null),k=$(e.defaultChecked),g=ce(e,"checked"),S=Ee(g,k),p=re(()=>l?l.valueRef.value===e.value:S.value),E=re(()=>{const{name:u}=e;if(u!==void 0)return u;if(l)return l.nameRef.value}),b=$(!1);function m(){if(l){const{doUpdateValue:u}=l,{value:z}=e;Z(u,z)}else{const{onUpdateChecked:u,"onUpdate:checked":z}=e,{nTriggerFormInput:A,nTriggerFormChange:U}=o;u&&Z(u,!0),z&&Z(z,!0),A(),U(),k.value=!0}}function _(){s.value||p.value||m()}function y(){_()}function w(){b.value=!1}function P(){b.value=!0}return{mergedClsPrefix:l?l.mergedClsPrefixRef:we(e).mergedClsPrefixRef,inputRef:a,labelRef:c,mergedName:E,mergedDisabled:s,uncontrolledChecked:k,renderSafeChecked:p,focus:b,mergedSize:t,handleRadioInputChange:y,handleRadioInputBlur:w,handleRadioInputFocus:P}}var _n=q("radio",` + line-height: var(--n-label-line-height); + outline: none; + position: relative; + user-select: none; + -webkit-user-select: none; + display: inline-flex; + align-items: flex-start; + flex-wrap: nowrap; + font-size: var(--n-font-size); + word-break: break-word; +`,[W("checked",[K("dot",` + background-color: var(--n-color-active); + `)]),K("dot-wrapper",` + position: relative; + flex-shrink: 0; + flex-grow: 0; + width: var(--n-radio-size); + `),q("radio-input",` + position: absolute; + border: 0; + border-radius: inherit; + left: 0; + right: 0; + top: 0; + bottom: 0; + opacity: 0; + z-index: 1; + cursor: pointer; + `),K("dot",` + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + height: var(--n-radio-size); + width: var(--n-radio-size); + background: var(--n-color); + box-shadow: var(--n-box-shadow); + border-radius: 50%; + transition: + background-color .3s var(--n-bezier), + box-shadow .3s var(--n-bezier); + `,[G("&::before",` + content: ""; + opacity: 0; + position: absolute; + left: 4px; + top: 4px; + height: calc(100% - 8px); + width: calc(100% - 8px); + border-radius: 50%; + transform: scale(.8); + background: var(--n-dot-color-active); + transition: + opacity .3s var(--n-bezier), + background-color .3s var(--n-bezier), + transform .3s var(--n-bezier); + `),W("checked",{boxShadow:"var(--n-box-shadow-active)"},[G("&::before",` + opacity: 1; + transform: scale(1); + `)])]),K("label",` + color: var(--n-text-color); + padding: var(--n-label-padding); + font-weight: var(--n-label-font-weight); + display: inline-block; + transition: color .3s var(--n-bezier); + `),$e("disabled",` + cursor: pointer; + `,[G("&:hover",[K("dot",{boxShadow:"var(--n-box-shadow-hover)"})]),W("focus",[G("&:not(:active)",[K("dot",{boxShadow:"var(--n-box-shadow-focus)"})])])]),W("disabled",` + cursor: not-allowed; + `,[K("dot",{boxShadow:"var(--n-box-shadow-disabled)",backgroundColor:"var(--n-color-disabled)"},[G("&::before",{backgroundColor:"var(--n-dot-color-disabled)"}),W("checked",` + opacity: 1; + `)]),K("label",{color:"var(--n-text-color-disabled)"}),q("radio-input",` + cursor: not-allowed; + `)])]),yn=Q({name:"Radio",props:Object.assign(Object.assign({},fe.props),gn),setup(e){const o=bn(e),t=fe("Radio","-radio",_n,kt,e,o.mergedClsPrefix),s=ne(()=>{const{mergedSize:{value:S}}=o,{common:{cubicBezierEaseInOut:p},self:{boxShadow:E,boxShadowActive:b,boxShadowDisabled:m,boxShadowFocus:_,boxShadowHover:y,color:w,colorDisabled:P,colorActive:u,textColor:z,textColorDisabled:A,dotColorActive:U,dotColorDisabled:L,labelPadding:H,labelLineHeight:O,labelFontWeight:r,[Pe("fontSize",S)]:d,[Pe("radioSize",S)]:B}}=t.value;return{"--n-bezier":p,"--n-label-line-height":O,"--n-label-font-weight":r,"--n-box-shadow":E,"--n-box-shadow-active":b,"--n-box-shadow-disabled":m,"--n-box-shadow-focus":_,"--n-box-shadow-hover":y,"--n-color":w,"--n-color-active":u,"--n-color-disabled":P,"--n-dot-color-active":U,"--n-dot-color-disabled":L,"--n-font-size":d,"--n-radio-size":B,"--n-text-color":z,"--n-text-color-disabled":A,"--n-label-padding":H}}),{inlineThemeDisabled:a,mergedClsPrefixRef:c,mergedRtlRef:l}=we(e),k=Se("Radio",l,c),g=a?nt("radio",ne(()=>o.mergedSize.value[0]),s,e):void 0;return Object.assign(o,{rtlEnabled:k,cssVars:a?void 0:s,themeClass:g==null?void 0:g.themeClass,onRender:g==null?void 0:g.onRender})},render(){const{$slots:e,mergedClsPrefix:o,onRender:t,label:s}=this;return t==null||t(),i("label",{class:[`${o}-radio`,this.themeClass,{[`${o}-radio--rtl`]:this.rtlEnabled,[`${o}-radio--disabled`]:this.mergedDisabled,[`${o}-radio--checked`]:this.renderSafeChecked,[`${o}-radio--focus`]:this.focus}],style:this.cssVars},i("input",{ref:"inputRef",type:"radio",class:`${o}-radio-input`,value:this.value,name:this.mergedName,checked:this.renderSafeChecked,disabled:this.mergedDisabled,onChange:this.handleRadioInputChange,onFocus:this.handleRadioInputFocus,onBlur:this.handleRadioInputBlur}),i("div",{class:`${o}-radio__dot-wrapper`},"\xA0",i("div",{class:[`${o}-radio__dot`,this.renderSafeChecked&&`${o}-radio__dot--checked`]})),Qe(e.default,a=>!a&&!s?null:i("div",{ref:"labelRef",class:`${o}-radio__label`},a||s)))}}),wn=q("radio-group",` + display: inline-block; + font-size: var(--n-font-size); +`,[K("splitor",` + display: inline-block; + vertical-align: bottom; + width: 1px; + transition: + background-color .3s var(--n-bezier), + opacity .3s var(--n-bezier); + background: var(--n-button-border-color); + `,[W("checked",{backgroundColor:"var(--n-button-border-color-active)"}),W("disabled",{opacity:"var(--n-opacity-disabled)"})]),W("button-group",` + white-space: nowrap; + height: var(--n-height); + line-height: var(--n-height); + `,[q("radio-button",{height:"var(--n-height)",lineHeight:"var(--n-height)"}),K("splitor",{height:"var(--n-height)"})]),q("radio-button",` + vertical-align: bottom; + outline: none; + position: relative; + user-select: none; + -webkit-user-select: none; + display: inline-block; + box-sizing: border-box; + padding-left: 14px; + padding-right: 14px; + white-space: nowrap; + transition: + background-color .3s var(--n-bezier), + opacity .3s var(--n-bezier), + border-color .3s var(--n-bezier), + color .3s var(--n-bezier); + color: var(--n-button-text-color); + border-top: 1px solid var(--n-button-border-color); + border-bottom: 1px solid var(--n-button-border-color); + `,[q("radio-input",` + pointer-events: none; + position: absolute; + border: 0; + border-radius: inherit; + left: 0; + right: 0; + top: 0; + bottom: 0; + opacity: 0; + z-index: 1; + `),K("state-border",` + z-index: 1; + pointer-events: none; + position: absolute; + box-shadow: var(--n-button-box-shadow); + transition: box-shadow .3s var(--n-bezier); + left: -1px; + bottom: -1px; + right: -1px; + top: -1px; + `),G("&:first-child",` + border-top-left-radius: var(--n-button-border-radius); + border-bottom-left-radius: var(--n-button-border-radius); + border-left: 1px solid var(--n-button-border-color); + `,[K("state-border",` + border-top-left-radius: var(--n-button-border-radius); + border-bottom-left-radius: var(--n-button-border-radius); + `)]),G("&:last-child",` + border-top-right-radius: var(--n-button-border-radius); + border-bottom-right-radius: var(--n-button-border-radius); + border-right: 1px solid var(--n-button-border-color); + `,[K("state-border",` + border-top-right-radius: var(--n-button-border-radius); + border-bottom-right-radius: var(--n-button-border-radius); + `)]),$e("disabled",` + cursor: pointer; + `,[G("&:hover",[K("state-border",` + transition: box-shadow .3s var(--n-bezier); + box-shadow: var(--n-button-box-shadow-hover); + `),$e("checked",{color:"var(--n-button-text-color-hover)"})]),W("focus",[G("&:not(:active)",[K("state-border",{boxShadow:"var(--n-button-box-shadow-focus)"})])])]),W("checked",` + background: var(--n-button-color-active); + color: var(--n-button-text-color-active); + border-color: var(--n-button-border-color-active); + `),W("disabled",` + cursor: not-allowed; + opacity: var(--n-opacity-disabled); + `)])]);function xn(e,o,t){var s;const a=[];let c=!1;for(let l=0;l{const{value:U}=t,{common:{cubicBezierEaseInOut:L},self:{buttonBorderColor:H,buttonBorderColorActive:O,buttonBorderRadius:r,buttonBoxShadow:d,buttonBoxShadowFocus:B,buttonBoxShadowHover:R,buttonColorActive:Y,buttonTextColor:pe,buttonTextColorActive:me,buttonTextColorHover:ee,opacityDisabled:he,[Pe("buttonHeight",U)]:xe,[Pe("fontSize",U)]:Ce}}=E.value;return{"--n-font-size":Ce,"--n-bezier":L,"--n-button-border-color":H,"--n-button-border-color-active":O,"--n-button-border-radius":r,"--n-button-box-shadow":d,"--n-button-box-shadow-focus":B,"--n-button-box-shadow-hover":R,"--n-button-color-active":Y,"--n-button-text-color":pe,"--n-button-text-color-hover":ee,"--n-button-text-color-active":me,"--n-height":xe,"--n-opacity-disabled":he}}),A=S?nt("radio-group",ne(()=>t.value[0]),z,e):void 0;return{selfElRef:o,rtlEnabled:u,mergedClsPrefix:g,mergedValue:_,handleFocusout:P,handleFocusin:w,cssVars:S?void 0:z,themeClass:A==null?void 0:A.themeClass,onRender:A==null?void 0:A.onRender}},render(){var e;const{mergedValue:o,mergedClsPrefix:t,handleFocusin:s,handleFocusout:a}=this,{children:c,isButtonGroup:l}=xn(Ft(Pt(this)),o,t);return(e=this.onRender)===null||e===void 0||e.call(this),i("div",{onFocusin:s,onFocusout:a,ref:"selfElRef",class:[`${t}-radio-group`,this.rtlEnabled&&`${t}-radio-group--rtl`,this.themeClass,l&&`${t}-radio-group--button-group`],style:this.cssVars},c)}});const Rn=()=>Dt,In=pt({name:"DynamicInput",common:et,peers:{Input:mt,Button:ht},self:Rn});var Vn=In;const ot=ft("n-dynamic-input");var $n=Q({name:"DynamicInputInputPreset",props:{clsPrefix:{type:String,required:!0},value:{type:String,default:""},parentPath:String,path:String,onUpdateValue:{type:Function,required:!0}},setup(){const{mergedThemeRef:e,placeholderRef:o}=Ae(ot);return{mergedTheme:e,placeholder:o}},render(){const{mergedTheme:e,placeholder:o,value:t,clsPrefix:s,onUpdateValue:a}=this;return i("div",{class:`${s}-dynamic-input-preset-input`},i(De,{theme:e.peers.Input,"theme-overrides":e.peerOverrides.Input,value:t,placeholder:o,onUpdateValue:a}))}}),Sn=Q({name:"DynamicInputPairPreset",props:{clsPrefix:{type:String,required:!0},value:{type:Object,default:()=>({key:"",value:""})},parentPath:String,path:String,onUpdateValue:{type:Function,required:!0}},setup(e){const{mergedThemeRef:o,keyPlaceholderRef:t,valuePlaceholderRef:s}=Ae(ot);return{mergedTheme:o,keyPlaceholder:t,valuePlaceholder:s,handleKeyInput(a){e.onUpdateValue({key:a,value:e.value.value})},handleValueInput(a){e.onUpdateValue({key:e.value.key,value:a})}}},render(){const{mergedTheme:e,keyPlaceholder:o,valuePlaceholder:t,value:s,clsPrefix:a}=this;return i("div",{class:`${a}-dynamic-input-preset-pair`},i(De,{theme:e.peers.Input,"theme-overrides":e.peerOverrides.Input,value:s.key,class:`${a}-dynamic-input-pair-input`,placeholder:o,onUpdateValue:this.handleKeyInput}),i(De,{theme:e.peers.Input,"theme-overrides":e.peerOverrides.Input,value:s.value,class:`${a}-dynamic-input-pair-input`,placeholder:t,onUpdateValue:this.handleValueInput}))}}),Bn=q("dynamic-input",{width:"100%"},[q("dynamic-input-item",` + margin-bottom: 10px; + display: flex; + flex-wrap: nowrap; + `,[q("dynamic-input-preset-input",{flex:1,alignItems:"center"}),q("dynamic-input-preset-pair",` + flex: 1; + display: flex; + align-items: center; + `,[q("dynamic-input-pair-input",[G("&:first-child",{"margin-right":"12px"})])]),K("action",` + align-self: flex-start; + display: flex; + justify-content: flex-end; + flex-shrink: 0; + flex-grow: 0; + margin: var(--action-margin); + `,[W("icon",{cursor:"pointer"})]),G("&:last-child",{marginBottom:0})]),q("form-item",` + padding-top: 0 !important; + margin-right: 0 !important; + `,[q("form-item-blank",{paddingTop:"0 !important"})])]);const Fe=new WeakMap,Fn=Object.assign(Object.assign({},fe.props),{max:Number,min:{type:Number,default:0},value:Array,defaultValue:{type:Array,default:()=>[]},preset:{type:String,default:"input"},keyField:String,itemStyle:[String,Object],keyPlaceholder:{type:String,default:""},valuePlaceholder:{type:String,default:""},placeholder:{type:String,default:""},showSortButton:Boolean,createButtonProps:Object,onCreate:Function,onRemove:Function,"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],onClear:Function,onInput:[Function,Array]});var Pn=Q({name:"DynamicInput",props:Fn,setup(e,{slots:o}){const{mergedComponentPropsRef:t,mergedClsPrefixRef:s,mergedRtlRef:a,inlineThemeDisabled:c}=we(),l=Ae(zt,null),k=$(e.defaultValue),g=ce(e,"value"),S=Ee(g,k),p=fe("DynamicInput","-dynamic-input",Bn,Vn,e,s),E=ne(()=>{const{value:r}=S;if(Array.isArray(r)){const{max:d}=e;return d!==void 0&&r.length>=d}return!1}),b=ne(()=>{const{value:r}=S;return Array.isArray(r)?r.length<=e.min:!0}),m=ne(()=>{var r,d;return(d=(r=t==null?void 0:t.value)===null||r===void 0?void 0:r.DynamicInput)===null||d===void 0?void 0:d.buttonSize});function _(r){const{onInput:d,"onUpdate:value":B,onUpdateValue:R}=e;d&&Z(d,r),B&&Z(B,r),R&&Z(R,r),k.value=r}function y(r,d){if(r==null||typeof r!="object")return d;const B=Ge(r)?We(r):r;let R=Fe.get(B);return R===void 0&&Fe.set(B,R=Et()),R}function w(r,d){const{value:B}=S,R=Array.from(B!=null?B:[]),Y=R[r];if(R[r]=d,Y&&d&&typeof Y=="object"&&typeof d=="object"){const pe=Ge(Y)?We(Y):Y,me=Ge(d)?We(d):d,ee=Fe.get(pe);ee!==void 0&&Fe.set(me,ee)}_(R)}function P(){u(0)}function u(r){const{value:d}=S,{onCreate:B}=e,R=Array.from(d!=null?d:[]);if(B)R.splice(r+1,0,B(r+1)),_(R);else if(o.default)R.splice(r+1,0,null),_(R);else switch(e.preset){case"input":R.splice(r+1,0,""),_(R);break;case"pair":R.splice(r+1,0,{key:"",value:""}),_(R);break}}function z(r){const{value:d}=S;if(!Array.isArray(d))return;const{min:B}=e;if(d.length<=B)return;const R=Array.from(d);R.splice(r,1),_(R);const{onRemove:Y}=e;Y&&Y(r)}function A(r,d,B){if(d<0||B<0||d>=r.length||B>=r.length||d===B)return;const R=r[d];r[d]=r[B],r[B]=R}function U(r,d){const{value:B}=S;if(!Array.isArray(B))return;const R=Array.from(B);r==="up"&&A(R,d,d-1),r==="down"&&A(R,d,d+1),_(R)}Ze(ot,{mergedThemeRef:p,keyPlaceholderRef:ce(e,"keyPlaceholder"),valuePlaceholderRef:ce(e,"valuePlaceholder"),placeholderRef:ce(e,"placeholder")});const L=Se("DynamicInput",a,s),H=ne(()=>{const{self:{actionMargin:r,actionMarginRtl:d}}=p.value;return{"--action-margin":r,"--action-margin-rtl":d}}),O=c?nt("dynamic-input",void 0,H,e):void 0;return{locale:vt("DynamicInput").localeRef,rtlEnabled:L,buttonSize:m,mergedClsPrefix:s,NFormItem:l,uncontrolledValue:k,mergedValue:S,insertionDisabled:E,removeDisabled:b,handleCreateClick:P,ensureKey:y,handleValueChange:w,remove:z,move:U,createItem:u,mergedTheme:p,cssVars:c?void 0:H,themeClass:O==null?void 0:O.themeClass,onRender:O==null?void 0:O.onRender}},render(){const{$slots:e,buttonSize:o,mergedClsPrefix:t,mergedValue:s,locale:a,mergedTheme:c,keyField:l,itemStyle:k,preset:g,showSortButton:S,NFormItem:p,ensureKey:E,handleValueChange:b,remove:m,createItem:_,move:y,onRender:w}=this;return w==null||w(),i("div",{class:[`${t}-dynamic-input`,this.rtlEnabled&&`${t}-dynamic-input--rtl`,this.themeClass],style:this.cssVars},!Array.isArray(s)||s.length===0?i(ye,Object.assign({block:!0,ghost:!0,dashed:!0,size:o},this.createButtonProps,{disabled:this.insertionDisabled,theme:c.peers.Button,themeOverrides:c.peerOverrides.Button,onClick:this.handleCreateClick}),{default:()=>ze(e["create-button-default"],()=>[a.create]),icon:()=>ze(e["create-button-icon"],()=>[i(ve,{clsPrefix:t},{default:()=>i(Ye,null)})])}):s.map((P,u)=>i("div",{key:l?P[l]:E(P,u),"data-key":l?P[l]:E(P,u),class:`${t}-dynamic-input-item`,style:k},At(e.default,{value:s[u],index:u},()=>[g==="input"?i($n,{clsPrefix:t,value:s[u],parentPath:p?p.path.value:void 0,path:p!=null&&p.path.value?`${p.path.value}[${u}]`:void 0,onUpdateValue:z=>b(u,z)}):g==="pair"?i(Sn,{clsPrefix:t,value:s[u],parentPath:p?p.path.value:void 0,path:p!=null&&p.path.value?`${p.path.value}[${u}]`:void 0,onUpdateValue:z=>b(u,z)}):null]),i("div",{class:`${t}-dynamic-input-item__action`},i(mn,{size:o},{default:()=>[i(ye,{disabled:this.removeDisabled,theme:c.peers.Button,themeOverrides:c.peerOverrides.Button,circle:!0,onClick:()=>m(u)},{icon:()=>i(ve,{clsPrefix:t},{default:()=>i(xt,null)})}),i(ye,{disabled:this.insertionDisabled,circle:!0,theme:c.peers.Button,themeOverrides:c.peerOverrides.Button,onClick:()=>_(u)},{icon:()=>i(ve,{clsPrefix:t},{default:()=>i(Ye,null)})}),S?i(ye,{disabled:u===0,circle:!0,theme:c.peers.Button,themeOverrides:c.peerOverrides.Button,onClick:()=>y("up",u)},{icon:()=>i(ve,{clsPrefix:t},{default:()=>i(cn,null)})}):null,S?i(ye,{disabled:u===s.length-1,circle:!0,theme:c.peers.Button,themeOverrides:c.peerOverrides.Button,onClick:()=>y("down",u)},{icon:()=>i(ve,{clsPrefix:t},{default:()=>i(dn,null)})}):null]})))))}});const Dn=e=>{const{textColorDisabled:o}=e;return{iconColorDisabled:o}},zn=pt({name:"InputNumber",common:et,peers:{Button:ht,Input:mt},self:Dn});var An=zn;function En(e){return e==null||typeof e=="string"&&e.trim()===""?null:Number(e)}function Tn(e){return e.includes(".")&&(/^(-)?\d+.*(\.|0)$/.test(e)||/^\.\d+$/.test(e))}function Je(e){return e==null?!0:!Number.isNaN(e)}function ut(e,o){return e==null?"":o===void 0?String(e):e.toFixed(o)}function Xe(e){if(e===null)return null;if(typeof e=="number")return e;{const o=Number(e);return Number.isNaN(o)?null:o}}var Un=G([q("input-number-suffix",` + display: inline-block; + margin-right: 10px; + `),q("input-number-prefix",` + display: inline-block; + margin-left: 10px; + `)]);const dt=800,ct=100,On=Object.assign(Object.assign({},fe.props),{autofocus:Boolean,loading:{type:Boolean,default:void 0},placeholder:String,defaultValue:{type:Number,default:null},value:Number,step:{type:[Number,String],default:1},min:[Number,String],max:[Number,String],size:String,disabled:{type:Boolean,default:void 0},validator:Function,bordered:{type:Boolean,default:void 0},showButton:{type:Boolean,default:!0},buttonPlacement:{type:String,default:"right"},readonly:Boolean,clearable:Boolean,keyboard:{type:Object,default:{}},updateValueOnInput:{type:Boolean,default:!0},parse:Function,format:Function,precision:Number,status:String,"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],onFocus:[Function,Array],onBlur:[Function,Array],onClear:[Function,Array],onChange:[Function,Array]});var Nn=Q({name:"InputNumber",props:On,setup(e){const{mergedBorderedRef:o,mergedClsPrefixRef:t,mergedRtlRef:s}=we(e),a=fe("InputNumber","-input-number",Un,An,e,t),{localeRef:c}=vt("InputNumber"),l=tt(e),{mergedSizeRef:k,mergedDisabledRef:g,mergedStatusRef:S}=l,p=$(null),E=$(null),b=$(null),m=$(e.defaultValue),_=ce(e,"value"),y=Ee(_,m),w=$(""),P=n=>{const f=String(n).split(".")[1];return f?f.length:0},u=n=>{const f=[e.min,e.max,e.step,n].map(V=>V===void 0?0:P(V));return Math.max(...f)},z=re(()=>{const{placeholder:n}=e;return n!==void 0?n:c.value.placeholder}),A=re(()=>{const n=Xe(e.step);return n!==null?n===0?1:Math.abs(n):1}),U=re(()=>{const n=Xe(e.min);return n!==null?n:null}),L=re(()=>{const n=Xe(e.max);return n!==null?n:null}),H=n=>{const{value:f}=y;if(n===f){r();return}const{"onUpdate:value":V,onUpdateValue:C,onChange:te}=e,{nTriggerFormInput:oe,nTriggerFormChange:ge}=l;te&&Z(te,n),C&&Z(C,n),V&&Z(V,n),m.value=n,oe(),ge()},O=({offset:n,doUpdateIfValid:f,fixPrecision:V,isInputing:C})=>{const{value:te}=w;if(C&&Tn(te))return!1;const oe=(e.parse||En)(te);if(oe===null)return f&&H(null),null;if(Je(oe)){const ge=P(oe),{precision:ke}=e;if(ke!==void 0&&keHe){if(!f||C)return!1;ue=He}if(Ke!==null&&ue{const{value:n}=y;if(Je(n)){const{format:f,precision:V}=e;f?w.value=f(n):n===null||V===void 0||P(n)>V?w.value=ut(n,void 0):w.value=ut(n,V)}else w.value=String(n)};r();const d=re(()=>O({offset:0,doUpdateIfValid:!1,isInputing:!1,fixPrecision:!1})===!1),B=re(()=>{const{value:n}=y;if(e.validator&&n===null)return!1;const{value:f}=A;return O({offset:-f,doUpdateIfValid:!1,isInputing:!1,fixPrecision:!1})!==!1}),R=re(()=>{const{value:n}=y;if(e.validator&&n===null)return!1;const{value:f}=A;return O({offset:+f,doUpdateIfValid:!1,isInputing:!1,fixPrecision:!1})!==!1});function Y(n){const{onFocus:f}=e,{nTriggerFormFocus:V}=l;f&&Z(f,n),V()}function pe(n){var f,V;if(n.target===((f=p.value)===null||f===void 0?void 0:f.wrapperElRef))return;const C=O({offset:0,doUpdateIfValid:!0,isInputing:!1,fixPrecision:!0});if(C!==!1){const ge=(V=p.value)===null||V===void 0?void 0:V.inputElRef;ge&&(ge.value=String(C||"")),y.value===C&&r()}else r();const{onBlur:te}=e,{nTriggerFormBlur:oe}=l;te&&Z(te,n),oe(),Ut(()=>{r()})}function me(n){const{onClear:f}=e;f&&Z(f,n)}function ee(){const{value:n}=R;if(!n){x();return}const{value:f}=y;if(f===null)e.validator||H(Be());else{const{value:V}=A;O({offset:V,doUpdateIfValid:!0,isInputing:!1,fixPrecision:!0})}}function he(){const{value:n}=B;if(!n){F();return}const{value:f}=y;if(f===null)e.validator||H(Be());else{const{value:V}=A;O({offset:-V,doUpdateIfValid:!0,isInputing:!1,fixPrecision:!0})}}const xe=Y,Ce=pe;function Be(){if(e.validator)return null;const{value:n}=U,{value:f}=L;return n!==null?Math.max(0,n):f!==null?Math.min(0,f):0}function Te(n){me(n),H(null)}function Ue(n){var f,V,C;!((f=b.value)===null||f===void 0)&&f.$el.contains(n.target)&&n.preventDefault(),!((V=E.value)===null||V===void 0)&&V.$el.contains(n.target)&&n.preventDefault(),(C=p.value)===null||C===void 0||C.activate()}let ie=null,v=null,h=null;function F(){h&&(window.clearTimeout(h),h=null),ie&&(window.clearInterval(ie),ie=null)}function x(){j&&(window.clearTimeout(j),j=null),v&&(window.clearInterval(v),v=null)}function T(){F(),h=window.setTimeout(()=>{ie=window.setInterval(()=>{he()},ct)},dt),at("mouseup",document,F,{once:!0})}let j=null;function se(){x(),j=window.setTimeout(()=>{v=window.setInterval(()=>{ee()},ct)},dt),at("mouseup",document,x,{once:!0})}const Oe=()=>{v||ee()},Ne=()=>{ie||he()};function Me(n){var f,V;if(n.key==="Enter"){if(n.target===((f=p.value)===null||f===void 0?void 0:f.wrapperElRef))return;O({offset:0,doUpdateIfValid:!0,isInputing:!1,fixPrecision:!0})!==!1&&((V=p.value)===null||V===void 0||V.deactivate())}else if(n.key==="ArrowUp"){if(!R.value||e.keyboard.ArrowUp===!1)return;n.preventDefault(),O({offset:0,doUpdateIfValid:!0,isInputing:!1,fixPrecision:!0})!==!1&&ee()}else if(n.key==="ArrowDown"){if(!B.value||e.keyboard.ArrowDown===!1)return;n.preventDefault(),O({offset:0,doUpdateIfValid:!0,isInputing:!1,fixPrecision:!0})!==!1&&he()}}function Le(n){w.value=n,e.updateValueOnInput&&!e.format&&!e.parse&&e.precision===void 0&&O({offset:0,doUpdateIfValid:!0,isInputing:!0,fixPrecision:!1})}gt(y,()=>{r()});const je={focus:()=>{var n;return(n=p.value)===null||n===void 0?void 0:n.focus()},blur:()=>{var n;return(n=p.value)===null||n===void 0?void 0:n.blur()}},qe=Se("InputNumber",s,t);return Object.assign(Object.assign({},je),{rtlEnabled:qe,inputInstRef:p,minusButtonInstRef:E,addButtonInstRef:b,mergedClsPrefix:t,mergedBordered:o,uncontrolledValue:m,mergedValue:y,mergedPlaceholder:z,displayedValueInvalid:d,mergedSize:k,mergedDisabled:g,displayedValue:w,addable:R,minusable:B,mergedStatus:S,handleFocus:xe,handleBlur:Ce,handleClear:Te,handleMouseDown:Ue,handleAddClick:Oe,handleMinusClick:Ne,handleAddMousedown:se,handleMinusMousedown:T,handleKeyDown:Me,handleUpdateDisplayedValue:Le,mergedTheme:a,inputThemeOverrides:{paddingSmall:"0 8px 0 10px",paddingMedium:"0 8px 0 12px",paddingLarge:"0 8px 0 14px"},buttonThemeOverrides:ne(()=>{const{self:{iconColorDisabled:n}}=a.value,[f,V,C,te]=Tt(n);return{textColorTextDisabled:`rgb(${f}, ${V}, ${C})`,opacityDisabled:`${te}`}})})},render(){const{mergedClsPrefix:e,$slots:o}=this,t=()=>i(lt,{text:!0,disabled:!this.minusable||this.mergedDisabled||this.readonly,focusable:!1,theme:this.mergedTheme.peers.Button,themeOverrides:this.mergedTheme.peerOverrides.Button,builtinThemeOverrides:this.buttonThemeOverrides,onClick:this.handleMinusClick,onMousedown:this.handleMinusMousedown,ref:"minusButtonInstRef"},{icon:()=>ze(o["minus-icon"],()=>[i(ve,{clsPrefix:e},{default:()=>i(xt,null)})])}),s=()=>i(lt,{text:!0,disabled:!this.addable||this.mergedDisabled||this.readonly,focusable:!1,theme:this.mergedTheme.peers.Button,themeOverrides:this.mergedTheme.peerOverrides.Button,builtinThemeOverrides:this.buttonThemeOverrides,onClick:this.handleAddClick,onMousedown:this.handleAddMousedown,ref:"addButtonInstRef"},{icon:()=>ze(o["add-icon"],()=>[i(ve,{clsPrefix:e},{default:()=>i(Ye,null)})])});return i("div",{class:[`${e}-input-number`,this.rtlEnabled&&`${e}-input-number--rtl`]},i(De,{ref:"inputInstRef",autofocus:this.autofocus,status:this.mergedStatus,bordered:this.mergedBordered,loading:this.loading,value:this.displayedValue,onUpdateValue:this.handleUpdateDisplayedValue,theme:this.mergedTheme.peers.Input,themeOverrides:this.mergedTheme.peerOverrides.Input,builtinThemeOverrides:this.inputThemeOverrides,size:this.mergedSize,placeholder:this.mergedPlaceholder,disabled:this.mergedDisabled,readonly:this.readonly,textDecoration:this.displayedValueInvalid?"line-through":void 0,onFocus:this.handleFocus,onBlur:this.handleBlur,onKeydown:this.handleKeyDown,onMousedown:this.handleMouseDown,onClear:this.handleClear,clearable:this.clearable,internalLoadingBeforeSuffix:!0},{prefix:()=>{var a;return this.showButton&&this.buttonPlacement==="both"?[t(),Qe(o.prefix,c=>c?i("span",{class:`${e}-input-number-prefix`},c):null)]:(a=o.prefix)===null||a===void 0?void 0:a.call(o)},suffix:()=>{var a;return this.showButton?[Qe(o.suffix,c=>c?i("span",{class:`${e}-input-number-suffix`},c):null),this.buttonPlacement==="right"?t():null,s()]:(a=o.suffix)===null||a===void 0?void 0:a.call(o)}}))}});const Mn={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},Ln=X("path",{d:"M216.08 192v143.85a40.08 40.08 0 0 0 80.15 0l.13-188.55a67.94 67.94 0 1 0-135.87 0v189.82a95.51 95.51 0 1 0 191 0V159.74",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-miterlimit":"10","stroke-width":"32"},null,-1),jn=[Ln];var qn=Q({name:"AttachOutline",render:function(o,t){return M(),J("svg",Mn,jn)}});const Hn={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},Kn=X("path",{d:"M448 256c0-106-86-192-192-192S64 150 64 256s86 192 192 192s192-86 192-192z",fill:"none",stroke:"currentColor","stroke-miterlimit":"10","stroke-width":"32"},null,-1),Gn=X("path",{d:"M350.67 150.93l-117.2 46.88a64 64 0 0 0-35.66 35.66l-46.88 117.2a8 8 0 0 0 10.4 10.4l117.2-46.88a64 64 0 0 0 35.66-35.66l46.88-117.2a8 8 0 0 0-10.4-10.4zM256 280a24 24 0 1 1 24-24a24 24 0 0 1-24 24z",fill:"currentColor"},null,-1),Wn=[Kn,Gn];var Jn=Q({name:"CompassOutline",render:function(o,t){return M(),J("svg",Hn,Wn)}});const Xn={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},Qn=X("path",{d:"M255.66 112c-77.94 0-157.89 45.11-220.83 135.33a16 16 0 0 0-.27 17.77C82.92 340.8 161.8 400 255.66 400c92.84 0 173.34-59.38 221.79-135.25a16.14 16.14 0 0 0 0-17.47C428.89 172.28 347.8 112 255.66 112z",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),Yn=X("circle",{cx:"256",cy:"256",r:"80",fill:"none",stroke:"currentColor","stroke-miterlimit":"10","stroke-width":"32"},null,-1),Zn=[Qn,Yn];var eo=Q({name:"EyeOutline",render:function(o,t){return M(),J("svg",Xn,Zn)}});const to={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},no=X("path",{d:"M374.79 308.78L457.5 367a16 16 0 0 0 22.5-14.62V159.62A16 16 0 0 0 457.5 145l-82.71 58.22A16 16 0 0 0 368 216.3v79.4a16 16 0 0 0 6.79 13.08z",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),oo=X("path",{d:"M268 384H84a52.15 52.15 0 0 1-52-52V180a52.15 52.15 0 0 1 52-52h184.48A51.68 51.68 0 0 1 320 179.52V332a52.15 52.15 0 0 1-52 52z",fill:"none",stroke:"currentColor","stroke-miterlimit":"10","stroke-width":"32"},null,-1),ro=[no,oo];var ao=Q({name:"VideocamOutline",render:function(o,t){return M(),J("svg",to,ro)}});const lo={key:0,class:"compose-wrap"},io={class:"compose-line"},so={class:"compose-user"},uo={class:"compose-line compose-options"},co={class:"attachment"},fo={class:"submit-wrap"},po={class:"attachment-list-wrap"},mo={key:0,class:"attachment-price-wrap"},ho=X("span",null," \u9644\u4EF6\u4EF7\u683C\uFFE5",-1),vo={key:0,class:"eye-wrap"},go={key:1,class:"link-wrap"},bo={key:1,class:"compose-wrap"},_o=X("div",{class:"login-wrap"},[X("span",{class:"login-banner"}," \u767B\u5F55\u540E\uFF0C\u7CBE\u5F69\u66F4\u591A")],-1),yo={class:"login-wrap"},wo=Q({__name:"compose",emits:["post-success"],setup(e,{emit:o}){const t=bt(),s=$([]),a=$(!1),c=$(!1),l=$(!1),k=$(!1),g=$(""),S=$([]),p=$(),E=$(0),b=$("public/image"),m=$([]),_=$([]),y=$([]),w=$([]),P=$(de.FRIEND),u=$(de.FRIEND),z=[{value:de.PUBLIC,label:"\u516C\u5F00"},{value:de.PRIVATE,label:"\u79C1\u5BC6"},{value:de.FRIEND,label:"\u597D\u53CB\u53EF\u89C1"}],A="true".toLocaleLowerCase()==="true",U="true".toLocaleLowerCase()==="true",L="false".toLocaleLowerCase()==="true",H="true".toLocaleLowerCase()==="true",O="/v1/attachment",r=$(),d=()=>{l.value=!l.value,l.value&&k.value&&(k.value=!1)},B=()=>{k.value=!k.value,k.value&&l.value&&(l.value=!1)},R=st.exports.debounce(v=>{Ot({k:v}).then(h=>{let F=[];h.suggest.map(x=>{F.push({label:x,value:x})}),s.value=F,a.value=!1}).catch(h=>{a.value=!1})},200),Y=st.exports.debounce(v=>{Nt({k:v}).then(h=>{let F=[];h.suggest.map(x=>{F.push({label:x,value:x})}),s.value=F,a.value=!1}).catch(h=>{a.value=!1})},200),pe=(v,h)=>{a.value||(a.value=!0,h==="@"?R(v):Y(v))},me=v=>{v.length>200||(g.value=v)},ee=v=>{b.value=v},he=v=>{m.value=v},xe=async v=>{var h,F,x,T,j,se;return b.value==="public/image"&&!["image/png","image/jpg","image/jpeg","image/gif"].includes((h=v.file.file)==null?void 0:h.type)?(window.$message.warning("\u56FE\u7247\u4EC5\u5141\u8BB8 png/jpg/gif \u683C\u5F0F"),!1):b.value==="image"&&((F=v.file.file)==null?void 0:F.size)>10485760?(window.$message.warning("\u56FE\u7247\u5927\u5C0F\u4E0D\u80FD\u8D85\u8FC710MB"),!1):b.value==="public/video"&&!["video/mp4","video/quicktime"].includes((x=v.file.file)==null?void 0:x.type)?(window.$message.warning("\u89C6\u9891\u4EC5\u5141\u8BB8 mp4/mov \u683C\u5F0F"),!1):b.value==="public/video"&&((T=v.file.file)==null?void 0:T.size)>104857600?(window.$message.warning("\u89C6\u9891\u5927\u5C0F\u4E0D\u80FD\u8D85\u8FC7100MB"),!1):b.value==="attachment"&&!["application/zip"].includes((j=v.file.file)==null?void 0:j.type)?(window.$message.warning("\u9644\u4EF6\u4EC5\u5141\u8BB8 zip \u683C\u5F0F"),!1):b.value==="attachment"&&((se=v.file.file)==null?void 0:se.size)>104857600?(window.$message.warning("\u9644\u4EF6\u5927\u5C0F\u4E0D\u80FD\u8D85\u8FC7100MB"),!1):!0},Ce=({file:v,event:h})=>{var F;try{let x=JSON.parse((F=h.target)==null?void 0:F.response);x.code===0&&(b.value==="public/image"&&_.value.push({id:v.id,content:x.data.content}),b.value==="public/video"&&y.value.push({id:v.id,content:x.data.content}),b.value==="attachment"&&w.value.push({id:v.id,content:x.data.content}))}catch{window.$message.error("\u4E0A\u4F20\u5931\u8D25")}},Be=({file:v,event:h})=>{var F;try{let x=JSON.parse((F=h.target)==null?void 0:F.response);if(x.code!==0){let T=x.msg||"\u4E0A\u4F20\u5931\u8D25";x.details&&x.details.length>0&&x.details.map(j=>{T+=":"+j}),window.$message.error(T)}}catch{window.$message.error("\u4E0A\u4F20\u5931\u8D25")}},Te=({file:v})=>{let h=_.value.findIndex(F=>F.id===v.id);h>-1&&_.value.splice(h,1),h=y.value.findIndex(F=>F.id===v.id),h>-1&&y.value.splice(h,1),h=w.value.findIndex(F=>F.id===v.id),h>-1&&w.value.splice(h,1)},Ue=()=>{if(g.value.trim().length===0){window.$message.warning("\u8BF7\u8F93\u5165\u5185\u5BB9\u54E6");return}let{tags:v,users:h}=Zt(g.value);const F=[];let x=100;F.push({content:g.value,type:Ie.TEXT,sort:x}),_.value.map(T=>{x++,F.push({content:T.content,type:Ie.IMAGEURL,sort:x})}),y.value.map(T=>{x++,F.push({content:T.content,type:Ie.VIDEOURL,sort:x})}),w.value.map(T=>{x++,F.push({content:T.content,type:Ie.ATTACHMENT,sort:x})}),S.value.length>0&&S.value.map(T=>{x++,F.push({content:T,type:Ie.LINKURL,sort:x})}),c.value=!0,Lt({contents:F,tags:Array.from(new Set(v)),users:Array.from(new Set(h)),attachment_price:+E.value*100,visibility:P.value}).then(T=>{var j;window.$message.success("\u53D1\u5E03\u6210\u529F"),c.value=!1,o("post-success",T),l.value=!1,k.value=!1,(j=p.value)==null||j.clear(),m.value=[],g.value="",S.value=[],_.value=[],y.value=[],w.value=[],P.value=u.value}).catch(T=>{c.value=!1})},ie=v=>{t.commit("triggerAuth",!0),t.commit("triggerAuthKey",v)};return _t(()=>{"friend".toLowerCase()==="friend"?u.value=de.FRIEND:"friend".toLowerCase()==="public"?u.value=de.PUBLIC:u.value=de.PRIVATE,P.value=u.value,r.value="Bearer "+localStorage.getItem("PAOPAO_TOKEN")}),(v,h)=>{const F=jt,x=Yt,T=qt,j=ye,se=en,Oe=tn,Ne=Ht,Me=nn,Le=Nn,je=on,qe=yn,n=Kt,f=kn,V=Pn;return M(),J("div",null,[ae(t).state.userInfo.id>0?(M(),J("div",lo,[X("div",io,[X("div",so,[I(F,{round:"",size:30,src:ae(t).state.userInfo.avatar},null,8,["src"])]),I(x,{type:"textarea",size:"large",autosize:"",bordered:!1,loading:a.value,value:g.value,prefix:["@","#"],options:s.value,onSearch:pe,"onUpdate:value":me,placeholder:"\u8BF4\u8BF4\u60A8\u7684\u65B0\u9C9C\u4E8B..."},null,8,["loading","value","options"])]),I(je,{ref_key:"uploadRef",ref:p,abstract:"","list-type":"image",multiple:!0,max:9,action:O,headers:{Authorization:r.value},data:{type:b.value},onBeforeUpload:xe,onFinish:Ce,onError:Be,onRemove:Te,"onUpdate:fileList":he},{default:D(()=>[X("div",uo,[X("div",co,[I(se,{abstract:""},{default:D(({handleClick:C})=>[I(j,{disabled:m.value.length>0&&b.value==="public/video"||m.value.length===9,onClick:()=>{ee("public/image"),C()},quaternary:"",circle:"",type:"primary"},{icon:D(()=>[I(T,{size:"20",color:"var(--primary-color)"},{default:D(()=>[I(ae(Qt))]),_:1})]),_:2},1032,["disabled","onClick"])]),_:1}),A?(M(),Ve(se,{key:0,abstract:""},{default:D(({handleClick:C})=>[I(j,{disabled:m.value.length>0&&b.value!=="public/video"||m.value.length===9,onClick:()=>{ee("public/video"),C()},quaternary:"",circle:"",type:"primary"},{icon:D(()=>[I(T,{size:"20",color:"var(--primary-color)"},{default:D(()=>[I(ae(ao))]),_:1})]),_:2},1032,["disabled","onClick"])]),_:1})):le("",!0),U?(M(),Ve(se,{key:1,abstract:""},{default:D(({handleClick:C})=>[I(j,{disabled:m.value.length>0&&b.value==="public/video"||m.value.length===9,onClick:()=>{ee("attachment"),C()},quaternary:"",circle:"",type:"primary"},{icon:D(()=>[I(T,{size:"20",color:"var(--primary-color)"},{default:D(()=>[I(ae(qn))]),_:1})]),_:2},1032,["disabled","onClick"])]),_:1})):le("",!0),I(j,{quaternary:"",circle:"",type:"primary",onClick:it(d,["stop"])},{icon:D(()=>[I(T,{size:"20",color:"var(--primary-color)"},{default:D(()=>[I(ae(Jn))]),_:1})]),_:1},8,["onClick"]),H?(M(),Ve(j,{key:2,quaternary:"",circle:"",type:"primary",onClick:it(B,["stop"])},{icon:D(()=>[I(T,{size:"20",color:"var(--primary-color)"},{default:D(()=>[I(ae(eo))]),_:1})]),_:1},8,["onClick"])):le("",!0)]),X("div",fo,[I(Ne,{trigger:"hover",placement:"bottom"},{trigger:D(()=>[I(Oe,{class:"text-statistic",type:"circle","show-indicator":!1,status:"success","stroke-width":10,percentage:g.value.length/200*100},null,8,["percentage"])]),default:D(()=>[Re(" "+Mt(g.value.length)+" / 200 ",1)]),_:1}),I(j,{loading:c.value,onClick:Ue,type:"primary",secondary:"",round:""},{default:D(()=>[Re(" \u53D1\u5E03 ")]),_:1},8,["loading"])])]),X("div",po,[I(Me),w.value.length>0?(M(),J("div",mo,[L?(M(),Ve(Le,{key:0,value:E.value,"onUpdate:value":h[0]||(h[0]=C=>E.value=C),min:0,max:1e5,placeholder:"\u8BF7\u8F93\u5165\u9644\u4EF6\u4EF7\u683C\uFF0C0\u4E3A\u514D\u8D39\u9644\u4EF6"},{prefix:D(()=>[ho]),_:1},8,["value"])):le("",!0)])):le("",!0)])]),_:1},8,["headers","data"]),k.value?(M(),J("div",vo,[I(f,{value:P.value,"onUpdate:value":h[1]||(h[1]=C=>P.value=C),name:"radiogroup"},{default:D(()=>[I(n,null,{default:D(()=>[(M(),J(yt,null,wt(z,C=>I(qe,{key:C.value,value:C.value,label:C.label},null,8,["value","label"])),64))]),_:1})]),_:1},8,["value"])])):le("",!0),l.value?(M(),J("div",go,[I(V,{value:S.value,"onUpdate:value":h[2]||(h[2]=C=>S.value=C),placeholder:"\u8BF7\u8F93\u5165\u4EE5http(s)://\u5F00\u5934\u7684\u94FE\u63A5",min:0,max:3},{"create-button-default":D(()=>[Re(" \u521B\u5EFA\u94FE\u63A5 ")]),_:1},8,["value"])])):le("",!0)])):(M(),J("div",bo,[_o,X("div",yo,[I(j,{strong:"",secondary:"",round:"",type:"primary",onClick:h[3]||(h[3]=C=>ie("signin"))},{default:D(()=>[Re(" \u767B\u5F55 ")]),_:1}),I(j,{strong:"",secondary:"",round:"",type:"info",onClick:h[4]||(h[4]=C=>ie("signup"))},{default:D(()=>[Re(" \u6CE8\u518C ")]),_:1})])]))])}}});const xo={key:0,class:"pagination-wrap"},Co={key:0,class:"skeleton-wrap"},ko={key:1},Ro={key:0,class:"empty-wrap"},Io=Q({__name:"Home",setup(e){const o=bt(),t=Wt(),s=Xt(),a=$(!1),c=$([]),l=$(+t.query.p||1),k=$(20),g=$(0),S=ne(()=>{let m="\u6CE1\u6CE1\u5E7F\u573A";return t.query&&t.query.q&&(t.query.t&&t.query.t==="tag"?m="#"+decodeURIComponent(t.query.q):m="\u641C\u7D22: "+decodeURIComponent(t.query.q)),m}),p=()=>{a.value=!0,Jt({query:t.query.q?decodeURIComponent(t.query.q):null,type:t.query.t,page:l.value,page_size:k.value}).then(m=>{a.value=!1,c.value=m.list,g.value=Math.ceil(m.pager.total_rows/k.value),window.scrollTo(0,0)}).catch(m=>{a.value=!1})},E=m=>{if(l.value!=1){s.push({name:"post",query:{id:m.id}});return}let _=[],y=c.value.length;y==k.value&&y--;for(var w=0;w{s.push({name:"home",query:{...t.query,p:m}})};return _t(()=>{p()}),gt(()=>({path:t.path,query:t.query,refresh:o.state.refresh}),(m,_)=>{if(m.refresh!==_.refresh){l.value=+t.query.p||1,setTimeout(()=>{p()},0);return}_.path!=="/post"&&m.path==="/"&&(l.value=+t.query.p||1,setTimeout(()=>{p()},0))}),(m,_)=>{const y=rn,w=ln,P=wo,u=sn,z=Vt,A=un,U=It,L=an;return M(),J("div",null,[I(y,{title:ae(S)},null,8,["title"]),I(L,{class:"main-content-wrap",bordered:""},{footer:D(()=>[g.value>1?(M(),J("div",xo,[I(w,{page:l.value,"onUpdate:page":b,"page-slot":ae(o).state.collapsedRight?5:8,"page-count":g.value},null,8,["page","page-slot","page-count"])])):le("",!0)]),default:D(()=>[I(u,null,{default:D(()=>[I(P,{onPostSuccess:E})]),_:1}),a.value?(M(),J("div",Co,[I(z,{num:k.value},null,8,["num"])])):(M(),J("div",ko,[c.value.length===0?(M(),J("div",Ro,[I(A,{size:"large",description:"\u6682\u65E0\u6570\u636E"})])):le("",!0),(M(!0),J(yt,null,wt(c.value,H=>(M(),Ve(u,{key:H.id},{default:D(()=>[I(U,{post:H},null,8,["post"])]),_:2},1024))),128))]))]),_:1})])}}});var Oo=Gt(Io,[["__scopeId","data-v-7e0dfc66"]]);export{Oo as default}; diff --git a/web/dist/assets/IEnum.032938cf.js b/web/dist/assets/IEnum.032938cf.js new file mode 100644 index 00000000..22d6ee94 --- /dev/null +++ b/web/dist/assets/IEnum.032938cf.js @@ -0,0 +1,30 @@ +import{E as gp,k as dp,bk as pp,F as _p,ba as vp,b as wp,c as yo,aX as xp,d as Lo,u as Ap,x as Eo,o as Sp,r as Ne,y as Ki,aQ as mp,t as Rp,s as Ip,A as yp,a$ as qi,a_ as Tp,h as Ce,b0 as Cp,b1 as Lp,b2 as Ep,b3 as bp,_ as Op,bC as Mp,V as To,w as pr,W as Bp,Y as Wp,Z as _r}from"./index.d4f5aad2.js";import{N as Up}from"./Skeleton.e1c16fcb.js";var Rt=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{};const Fp=v=>{const{boxShadow2:Q}=v;return{menuBoxShadow:Q}},Pp=gp({name:"Mention",common:dp,peers:{InternalSelectMenu:pp,Input:_p},self:Fp});var Dp=Pp;function Np(v,Q={debug:!1,useSelectionEnd:!1,checkWidthOverflow:!0}){const l=v.selectionStart!==null?v.selectionStart:0,te=v.selectionEnd!==null?v.selectionEnd:0,mn=Q.useSelectionEnd?te:l,He=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],Z=navigator.userAgent.toLowerCase().includes("firefox");if(!vp)throw new Error("textarea-caret-position#getCaretPosition should only be called in a browser");const Rn=Q==null?void 0:Q.debug;if(Rn){const j=document.querySelector("#input-textarea-caret-position-mirror-div");j!=null&&j.parentNode&&j.parentNode.removeChild(j)}const on=document.createElement("div");on.id="input-textarea-caret-position-mirror-div",document.body.appendChild(on);const ln=on.style,z=window.getComputedStyle?window.getComputedStyle(v):v.currentStyle,k=v.nodeName==="INPUT";ln.whiteSpace=k?"nowrap":"pre-wrap",k||(ln.wordWrap="break-word"),ln.position="absolute",Rn||(ln.visibility="hidden"),He.forEach(j=>{if(k&&j==="lineHeight")if(z.boxSizing==="border-box"){const Jn=parseInt(z.height),nn=parseInt(z.paddingTop)+parseInt(z.paddingBottom)+parseInt(z.borderTopWidth)+parseInt(z.borderBottomWidth),hn=nn+parseInt(z.lineHeight);Jn>hn?ln.lineHeight=`${Jn-nn}px`:Jn===hn?ln.lineHeight=z.lineHeight:ln.lineHeight="0"}else ln.lineHeight=z.height;else ln[j]=z[j]}),Z?v.scrollHeight>parseInt(z.height)&&(ln.overflowY="scroll"):ln.overflow="hidden",on.textContent=v.value.substring(0,mn),k&&on.textContent&&(on.textContent=on.textContent.replace(/\s/g,"\xA0"));const tn=document.createElement("span");tn.textContent=v.value.substring(mn)||".",tn.style.position="relative",tn.style.left=`${-v.scrollLeft}px`,tn.style.top=`${-v.scrollTop}px`,on.appendChild(tn);const cn={top:tn.offsetTop+parseInt(z.borderTopWidth),left:tn.offsetLeft+parseInt(z.borderLeftWidth),absolute:!1,height:parseInt(z.fontSize)*1.5};return Rn?tn.style.backgroundColor="#aaa":document.body.removeChild(on),cn.left>=v.clientWidth&&Q.checkWidthOverflow&&(cn.left=v.clientWidth),cn}var Hp=wp([yo("mention","width: 100%; z-index: auto; position: relative;"),yo("mention-menu",` + box-shadow: var(--n-menu-box-shadow); + `,[xp({originalTransition:"background-color .3s var(--n-bezier), box-shadow .3s var(--n-bezier)"})])]);const Gp=Object.assign(Object.assign({},Eo.props),{to:qi.propTo,autosize:[Boolean,Object],options:{type:Array,default:[]},type:{type:String,default:"text"},separator:{type:String,validator:v=>v.length!==1?(Mp("mention","`separator`'s length must be 1."),!1):!0,default:" "},bordered:{type:Boolean,default:void 0},disabled:Boolean,value:String,defaultValue:{type:String,default:""},loading:Boolean,prefix:{type:[String,Array],default:"@"},placeholder:{type:String,default:""},placement:{type:String,default:"bottom-start"},size:String,renderLabel:Function,status:String,"onUpdate:show":[Array,Function],onUpdateShow:[Array,Function],"onUpdate:value":[Array,Function],onUpdateValue:[Array,Function],onSearch:Function,onSelect:Function,onFocus:Function,onBlur:Function,internalDebug:Boolean});var kp=Lo({name:"Mention",props:Gp,setup(v){const{namespaceRef:Q,mergedClsPrefixRef:l,mergedBorderedRef:te,inlineThemeDisabled:mn}=Ap(v),He=Eo("Mention","-mention",Hp,Dp,v,l),Z=Sp(v),Rn=Ne(null),on=Ne(null),ln=Ne(null),z=Ne("");let k=null,tn=null,cn=null;const j=Ki(()=>{const{value:S}=z;return v.options.filter(M=>S?typeof M.label=="string"?M.label.startsWith(S):typeof M.value=="string"?M.value.startsWith(S):!1:!0)}),Jn=Ki(()=>mp(j.value,{getKey:S=>S.value})),nn=Ne(null),hn=Ne(!1),tt=Ne(v.defaultValue),Mn=Rp(v,"value"),de=Ip(Mn,tt),In=Ki(()=>{const{self:{menuBoxShadow:S}}=He.value;return{"--n-menu-box-shadow":S}}),yn=mn?yp("mention",void 0,In,v):void 0;function rn(S){if(v.disabled)return;const{onUpdateShow:M,"onUpdate:show":P}=v;M&&pr(M,S),P&&pr(P,S),S||(k=null,tn=null,cn=null),hn.value=S}function pe(S){const{onUpdateValue:M,"onUpdate:value":P}=v,{nTriggerFormChange:X,nTriggerFormInput:_n}=Z;P&&pr(P,S),M&&pr(M,S),_n(),X(),tt.value=S}function Le(){return v.type==="text"?Rn.value.inputElRef:Rn.value.textareaElRef}function It(){var S;const M=Le();if(document.activeElement!==M){rn(!1);return}const{selectionEnd:P}=M;if(P===null){rn(!1);return}const X=M.value,{separator:_n}=v,{prefix:ve}=v,Qn=typeof ve=="string"?[ve]:ve;for(let vn=P-1;vn>=0;--vn){const $n=X[vn];if($n===_n||$n===` +`||$n==="\r"){rn(!1);return}if(Qn.includes($n)){const kn=X.slice(vn+1,P);rn(!0),(S=v.onSearch)===null||S===void 0||S.call(v,kn,$n),z.value=kn,k=$n,tn=vn+1,cn=P;return}}rn(!1)}function vr(){const{value:S}=on;if(!S)return;const M=Le(),P=Np(M);P.left+=M.parentElement.offsetLeft,S.style.left=`${P.left}px`,S.style.top=`${P.top+P.height}px`}function wr(){var S;!hn.value||(S=ln.value)===null||S===void 0||S.syncPosition()}function xr(S){pe(S),_e()}function _e(){setTimeout(()=>{vr(),It(),To().then(wr)},0)}function Ar(S){var M,P;if(S.key==="ArrowLeft"||S.key==="ArrowRight"){if(!((M=Rn.value)===null||M===void 0)&&M.isCompositing)return;_e()}else if(S.key==="ArrowUp"||S.key==="ArrowDown"||S.key==="Enter"){if(!((P=Rn.value)===null||P===void 0)&&P.isCompositing)return;const{value:X}=nn;if(hn.value){if(X)if(S.preventDefault(),S.key==="ArrowUp")X.prev();else if(S.key==="ArrowDown")X.next();else{const _n=X.getPendingTmNode();_n?Ee(_n):rn(!1)}}else _e()}}function Sr(S){const{onFocus:M}=v;M==null||M(S);const{nTriggerFormFocus:P}=Z;P(),_e()}function re(){var S;(S=Rn.value)===null||S===void 0||S.focus()}function Vn(){var S;(S=Rn.value)===null||S===void 0||S.blur()}function mr(S){const{onBlur:M}=v;M==null||M(S);const{nTriggerFormBlur:P}=Z;P(),rn(!1)}function Ee(S){var M;if(k===null||tn===null||cn===null)return;const{rawNode:{value:P=""}}=S,X=Le(),_n=X.value,{separator:ve}=v,Qn=_n.slice(cn),vn=Qn.startsWith(ve),$n=`${P}${vn?"":ve}`;pe(_n.slice(0,tn)+$n+Qn),(M=v.onSelect)===null||M===void 0||M.call(v,S.rawNode,k);const kn=tn+$n.length+(vn?1:0);To().then(()=>{X.selectionStart=kn,X.selectionEnd=kn,It()})}function Bn(){v.disabled||_e()}return{namespace:Q,mergedClsPrefix:l,mergedBordered:te,mergedSize:Z.mergedSizeRef,mergedStatus:Z.mergedStatusRef,mergedTheme:He,treeMate:Jn,selectMenuInstRef:nn,inputInstRef:Rn,cursorRef:on,followerRef:ln,showMenu:hn,adjustedTo:qi(v),isMounted:Tp(),mergedValue:de,handleInputFocus:Sr,handleInputBlur:mr,handleInputUpdateValue:xr,handleInputKeyDown:Ar,handleSelect:Ee,handleInputMouseDown:Bn,focus:re,blur:Vn,cssVars:mn?void 0:In,themeClass:yn==null?void 0:yn.themeClass,onRender:yn==null?void 0:yn.onRender}},render(){const{mergedTheme:v,mergedClsPrefix:Q,$slots:l}=this;return Ce("div",{class:`${Q}-mention`},Ce(Op,{status:this.mergedStatus,themeOverrides:v.peerOverrides.Input,theme:v.peers.Input,size:this.mergedSize,autosize:this.autosize,type:this.type,ref:"inputInstRef",placeholder:this.placeholder,onMousedown:this.handleInputMouseDown,onUpdateValue:this.handleInputUpdateValue,onKeydown:this.handleInputKeyDown,onFocus:this.handleInputFocus,onBlur:this.handleInputBlur,bordered:this.mergedBordered,disabled:this.disabled,value:this.mergedValue}),Ce(Cp,null,{default:()=>[Ce(Lp,null,{default:()=>Ce("div",{style:{position:"absolute",width:0,height:0},ref:"cursorRef"})}),Ce(Ep,{ref:"followerRef",placement:this.placement,show:this.showMenu,containerClass:this.namespace,to:this.adjustedTo,teleportDisabled:this.adjustedTo===qi.tdkey},{default:()=>Ce(bp,{name:"fade-in-scale-up-transition",appear:this.isMounted},{default:()=>{const{mergedTheme:te,onRender:mn}=this;return mn==null||mn(),this.showMenu?Ce(Up,{clsPrefix:Q,theme:te.peers.InternalSelectMenu,themeOverrides:te.peerOverrides.InternalSelectMenu,autoPending:!0,ref:"selectMenuInstRef",class:[`${Q}-mention-menu`,this.themeClass],loading:this.loading,treeMate:this.treeMate,virtualScroll:!1,style:this.cssVars,onToggle:this.handleSelect,renderLabel:this.renderLabel},l):null}})})]}))}});const $p={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},zp=_r("rect",{x:"48",y:"80",width:"416",height:"352",rx:"48",ry:"48",fill:"none",stroke:"currentColor","stroke-linejoin":"round","stroke-width":"32"},null,-1),Kp=_r("circle",{cx:"336",cy:"176",r:"32",fill:"none",stroke:"currentColor","stroke-miterlimit":"10","stroke-width":"32"},null,-1),qp=_r("path",{d:"M304 335.79l-90.66-90.49a32 32 0 0 0-43.87-1.3L48 352",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),Yp=_r("path",{d:"M224 432l123.34-123.34a32 32 0 0 1 43.11-2L464 368",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),Zp=[zp,Kp,qp,Yp];var jp=Lo({name:"ImageOutline",render:function(Q,l){return Bp(),Wp("svg",$p,Zp)}}),Co={exports:{}};/** + * @license + * Lodash + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */(function(v,Q){(function(){var l,te="4.17.21",mn=200,He="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",Z="Expected a function",Rn="Invalid `variable` option passed into `_.template`",on="__lodash_hash_undefined__",ln=500,z="__lodash_placeholder__",k=1,tn=2,cn=4,j=1,Jn=2,nn=1,hn=2,tt=4,Mn=8,de=16,In=32,yn=64,rn=128,pe=256,Le=512,It=30,vr="...",wr=800,xr=16,_e=1,Ar=2,Sr=3,re=1/0,Vn=9007199254740991,mr=17976931348623157e292,Ee=0/0,Bn=4294967295,S=Bn-1,M=Bn>>>1,P=[["ary",rn],["bind",nn],["bindKey",hn],["curry",Mn],["curryRight",de],["flip",Le],["partial",In],["partialRight",yn],["rearg",pe]],X="[object Arguments]",_n="[object Array]",ve="[object AsyncFunction]",Qn="[object Boolean]",vn="[object Date]",$n="[object DOMException]",kn="[object Error]",yt="[object Function]",Yi="[object GeneratorFunction]",zn="[object Map]",rt="[object Number]",bo="[object Null]",ie="[object Object]",Zi="[object Promise]",Oo="[object Proxy]",it="[object RegExp]",Kn="[object Set]",ut="[object String]",Tt="[object Symbol]",Mo="[object Undefined]",ft="[object WeakMap]",Bo="[object WeakSet]",ot="[object ArrayBuffer]",Ge="[object DataView]",Rr="[object Float32Array]",Ir="[object Float64Array]",yr="[object Int8Array]",Tr="[object Int16Array]",Cr="[object Int32Array]",Lr="[object Uint8Array]",Er="[object Uint8ClampedArray]",br="[object Uint16Array]",Or="[object Uint32Array]",Wo=/\b__p \+= '';/g,Uo=/\b(__p \+=) '' \+/g,Fo=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Xi=/&(?:amp|lt|gt|quot|#39);/g,Ji=/[&<>"']/g,Po=RegExp(Xi.source),Do=RegExp(Ji.source),No=/<%-([\s\S]+?)%>/g,Ho=/<%([\s\S]+?)%>/g,Vi=/<%=([\s\S]+?)%>/g,Go=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,$o=/^\w*$/,zo=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Mr=/[\\^$.*+?()[\]{}|]/g,Ko=RegExp(Mr.source),Br=/^\s+/,qo=/\s/,Yo=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Zo=/\{\n\/\* \[wrapped with (.+)\] \*/,Xo=/,? & /,Jo=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Vo=/[()=,{}\[\]\/\s]/,Qo=/\\(\\)?/g,ko=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Qi=/\w*$/,jo=/^[-+]0x[0-9a-f]+$/i,nl=/^0b[01]+$/i,el=/^\[object .+?Constructor\]$/,tl=/^0o[0-7]+$/i,rl=/^(?:0|[1-9]\d*)$/,il=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Ct=/($^)/,ul=/['\n\r\u2028\u2029\\]/g,Lt="\\ud800-\\udfff",fl="\\u0300-\\u036f",ol="\\ufe20-\\ufe2f",ll="\\u20d0-\\u20ff",ki=fl+ol+ll,ji="\\u2700-\\u27bf",nu="a-z\\xdf-\\xf6\\xf8-\\xff",sl="\\xac\\xb1\\xd7\\xf7",al="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",cl="\\u2000-\\u206f",hl=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",eu="A-Z\\xc0-\\xd6\\xd8-\\xde",tu="\\ufe0e\\ufe0f",ru=sl+al+cl+hl,Wr="['\u2019]",gl="["+Lt+"]",iu="["+ru+"]",Et="["+ki+"]",uu="\\d+",dl="["+ji+"]",fu="["+nu+"]",ou="[^"+Lt+ru+uu+ji+nu+eu+"]",Ur="\\ud83c[\\udffb-\\udfff]",pl="(?:"+Et+"|"+Ur+")",lu="[^"+Lt+"]",Fr="(?:\\ud83c[\\udde6-\\uddff]){2}",Pr="[\\ud800-\\udbff][\\udc00-\\udfff]",$e="["+eu+"]",su="\\u200d",au="(?:"+fu+"|"+ou+")",_l="(?:"+$e+"|"+ou+")",cu="(?:"+Wr+"(?:d|ll|m|re|s|t|ve))?",hu="(?:"+Wr+"(?:D|LL|M|RE|S|T|VE))?",gu=pl+"?",du="["+tu+"]?",vl="(?:"+su+"(?:"+[lu,Fr,Pr].join("|")+")"+du+gu+")*",wl="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",xl="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",pu=du+gu+vl,Al="(?:"+[dl,Fr,Pr].join("|")+")"+pu,Sl="(?:"+[lu+Et+"?",Et,Fr,Pr,gl].join("|")+")",ml=RegExp(Wr,"g"),Rl=RegExp(Et,"g"),Dr=RegExp(Ur+"(?="+Ur+")|"+Sl+pu,"g"),Il=RegExp([$e+"?"+fu+"+"+cu+"(?="+[iu,$e,"$"].join("|")+")",_l+"+"+hu+"(?="+[iu,$e+au,"$"].join("|")+")",$e+"?"+au+"+"+cu,$e+"+"+hu,xl,wl,uu,Al].join("|"),"g"),yl=RegExp("["+su+Lt+ki+tu+"]"),Tl=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Cl=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Ll=-1,H={};H[Rr]=H[Ir]=H[yr]=H[Tr]=H[Cr]=H[Lr]=H[Er]=H[br]=H[Or]=!0,H[X]=H[_n]=H[ot]=H[Qn]=H[Ge]=H[vn]=H[kn]=H[yt]=H[zn]=H[rt]=H[ie]=H[it]=H[Kn]=H[ut]=H[ft]=!1;var N={};N[X]=N[_n]=N[ot]=N[Ge]=N[Qn]=N[vn]=N[Rr]=N[Ir]=N[yr]=N[Tr]=N[Cr]=N[zn]=N[rt]=N[ie]=N[it]=N[Kn]=N[ut]=N[Tt]=N[Lr]=N[Er]=N[br]=N[Or]=!0,N[kn]=N[yt]=N[ft]=!1;var El={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},bl={"&":"&","<":"<",">":">",'"':""","'":"'"},Ol={"&":"&","<":"<",">":">",""":'"',"'":"'"},Ml={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Bl=parseFloat,Wl=parseInt,_u=typeof Rt=="object"&&Rt&&Rt.Object===Object&&Rt,Ul=typeof self=="object"&&self&&self.Object===Object&&self,un=_u||Ul||Function("return this")(),Nr=Q&&!Q.nodeType&&Q,be=Nr&&!0&&v&&!v.nodeType&&v,vu=be&&be.exports===Nr,Hr=vu&&_u.process,Wn=function(){try{var a=be&&be.require&&be.require("util").types;return a||Hr&&Hr.binding&&Hr.binding("util")}catch{}}(),wu=Wn&&Wn.isArrayBuffer,xu=Wn&&Wn.isDate,Au=Wn&&Wn.isMap,Su=Wn&&Wn.isRegExp,mu=Wn&&Wn.isSet,Ru=Wn&&Wn.isTypedArray;function Tn(a,g,h){switch(h.length){case 0:return a.call(g);case 1:return a.call(g,h[0]);case 2:return a.call(g,h[0],h[1]);case 3:return a.call(g,h[0],h[1],h[2])}return a.apply(g,h)}function Fl(a,g,h,x){for(var y=-1,W=a==null?0:a.length;++y-1}function Gr(a,g,h){for(var x=-1,y=a==null?0:a.length;++x-1;);return h}function Ou(a,g){for(var h=a.length;h--&&ze(g,a[h],0)>-1;);return h}function ql(a,g){for(var h=a.length,x=0;h--;)a[h]===g&&++x;return x}var Yl=qr(El),Zl=qr(bl);function Xl(a){return"\\"+Ml[a]}function Jl(a,g){return a==null?l:a[g]}function Ke(a){return yl.test(a)}function Vl(a){return Tl.test(a)}function Ql(a){for(var g,h=[];!(g=a.next()).done;)h.push(g.value);return h}function Jr(a){var g=-1,h=Array(a.size);return a.forEach(function(x,y){h[++g]=[y,x]}),h}function Mu(a,g){return function(h){return a(g(h))}}function Ae(a,g){for(var h=-1,x=a.length,y=0,W=[];++h-1}function Ds(n,e){var t=this.__data__,r=Zt(t,n);return r<0?(++this.size,t.push([n,e])):t[r][1]=e,this}ue.prototype.clear=Ws,ue.prototype.delete=Us,ue.prototype.get=Fs,ue.prototype.has=Ps,ue.prototype.set=Ds;function fe(n){var e=-1,t=n==null?0:n.length;for(this.clear();++e=e?n:e)),n}function Dn(n,e,t,r,i,f){var o,s=e&k,c=e&tn,d=e&cn;if(t&&(o=i?t(n,r,i,f):t(n)),o!==l)return o;if(!$(n))return n;var p=T(n);if(p){if(o=$a(n),!s)return wn(n,o)}else{var _=an(n),w=_==yt||_==Yi;if(Te(n))return pf(n,s);if(_==ie||_==X||w&&!i){if(o=c||w?{}:Wf(n),!s)return c?Oa(n,na(o,n)):ba(n,Ku(o,n))}else{if(!N[_])return i?n:{};o=za(n,_,s)}}f||(f=new Yn);var A=f.get(n);if(A)return A;f.set(n,o),so(n)?n.forEach(function(I){o.add(Dn(I,e,t,I,n,f))}):oo(n)&&n.forEach(function(I,b){o.set(b,Dn(I,e,t,b,n,f))});var R=d?c?Si:Ai:c?An:en,L=p?l:R(n);return Un(L||n,function(I,b){L&&(b=I,I=n[b]),dt(o,b,Dn(I,e,t,b,n,f))}),o}function ea(n){var e=en(n);return function(t){return qu(t,n,e)}}function qu(n,e,t){var r=t.length;if(n==null)return!r;for(n=D(n);r--;){var i=t[r],f=e[i],o=n[i];if(o===l&&!(i in n)||!f(o))return!1}return!0}function Yu(n,e,t){if(typeof n!="function")throw new Fn(Z);return St(function(){n.apply(l,t)},e)}function pt(n,e,t,r){var i=-1,f=bt,o=!0,s=n.length,c=[],d=e.length;if(!s)return c;t&&(e=G(e,Cn(t))),r?(f=Gr,o=!1):e.length>=mn&&(f=lt,o=!1,e=new Be(e));n:for(;++ii?0:i+t),r=r===l||r>i?i:C(r),r<0&&(r+=i),r=t>r?0:co(r);t0&&t(s)?e>1?fn(s,e-1,t,r,i):xe(i,s):r||(i[i.length]=s)}return i}var ti=Sf(),Ju=Sf(!0);function jn(n,e){return n&&ti(n,e,en)}function ri(n,e){return n&&Ju(n,e,en)}function Jt(n,e){return we(e,function(t){return ce(n[t])})}function Ue(n,e){e=Ie(e,n);for(var t=0,r=e.length;n!=null&&te}function ia(n,e){return n!=null&&F.call(n,e)}function ua(n,e){return n!=null&&e in D(n)}function fa(n,e,t){return n>=sn(e,t)&&n=120&&p.length>=120)?new Be(o&&p):l}p=n[0];var _=-1,w=s[0];n:for(;++_-1;)s!==n&&Ht.call(s,c,1),Ht.call(n,c,1);return n}function of(n,e){for(var t=n?e.length:0,r=t-1;t--;){var i=e[t];if(t==r||i!==f){var f=i;ae(i)?Ht.call(n,i,1):gi(n,i)}}return n}function ai(n,e){return n+zt(Hu()*(e-n+1))}function xa(n,e,t,r){for(var i=-1,f=V($t((e-n)/(t||1)),0),o=h(f);f--;)o[r?f:++i]=n,n+=t;return o}function ci(n,e){var t="";if(!n||e<1||e>Vn)return t;do e%2&&(t+=n),e=zt(e/2),e&&(n+=n);while(e);return t}function E(n,e){return Li(Pf(n,e,Sn),n+"")}function Aa(n){return zu(et(n))}function Sa(n,e){var t=et(n);return fr(t,We(e,0,t.length))}function wt(n,e,t,r){if(!$(n))return n;e=Ie(e,n);for(var i=-1,f=e.length,o=f-1,s=n;s!=null&&++ii?0:i+e),t=t>i?i:t,t<0&&(t+=i),i=e>t?0:t-e>>>0,e>>>=0;for(var f=h(i);++r>>1,o=n[f];o!==null&&!En(o)&&(t?o<=e:o=mn){var d=e?null:Ua(n);if(d)return Mt(d);o=!1,i=lt,c=new Be}else c=e?[]:s;n:for(;++r=r?n:Nn(n,e,t)}var df=hs||function(n){return un.clearTimeout(n)};function pf(n,e){if(e)return n.slice();var t=n.length,r=Uu?Uu(t):new n.constructor(t);return n.copy(r),r}function vi(n){var e=new n.constructor(n.byteLength);return new Dt(e).set(new Dt(n)),e}function Ta(n,e){var t=e?vi(n.buffer):n.buffer;return new n.constructor(t,n.byteOffset,n.byteLength)}function Ca(n){var e=new n.constructor(n.source,Qi.exec(n));return e.lastIndex=n.lastIndex,e}function La(n){return gt?D(gt.call(n)):{}}function _f(n,e){var t=e?vi(n.buffer):n.buffer;return new n.constructor(t,n.byteOffset,n.length)}function vf(n,e){if(n!==e){var t=n!==l,r=n===null,i=n===n,f=En(n),o=e!==l,s=e===null,c=e===e,d=En(e);if(!s&&!d&&!f&&n>e||f&&o&&c&&!s&&!d||r&&o&&c||!t&&c||!i)return 1;if(!r&&!f&&!d&&n=s)return c;var d=t[r];return c*(d=="desc"?-1:1)}}return n.index-e.index}function wf(n,e,t,r){for(var i=-1,f=n.length,o=t.length,s=-1,c=e.length,d=V(f-o,0),p=h(c+d),_=!r;++s1?t[i-1]:l,o=i>2?t[2]:l;for(f=n.length>3&&typeof f=="function"?(i--,f):l,o&&dn(t[0],t[1],o)&&(f=i<3?l:f,i=1),e=D(e);++r-1?i[f?e[o]:o]:l}}function If(n){return se(function(e){var t=e.length,r=t,i=Pn.prototype.thru;for(n&&e.reverse();r--;){var f=e[r];if(typeof f!="function")throw new Fn(Z);if(i&&!o&&ir(f)=="wrapper")var o=new Pn([],!0)}for(r=o?r:t;++r1&&B.reverse(),p&&cs))return!1;var d=f.get(n),p=f.get(e);if(d&&p)return d==e&&p==n;var _=-1,w=!0,A=t&Jn?new Be:l;for(f.set(n,e),f.set(e,n);++_1?"& ":"")+e[r],e=e.join(t>2?", ":" "),n.replace(Yo,`{ +/* [wrapped with `+e+`] */ +`)}function qa(n){return T(n)||De(n)||!!(Du&&n&&n[Du])}function ae(n,e){var t=typeof n;return e=e==null?Vn:e,!!e&&(t=="number"||t!="symbol"&&rl.test(n))&&n>-1&&n%1==0&&n0){if(++e>=wr)return arguments[0]}else e=0;return n.apply(l,arguments)}}function fr(n,e){var t=-1,r=n.length,i=r-1;for(e=e===l?r:e;++t1?n[e-1]:l;return t=typeof t=="function"?(n.pop(),t):l,Jf(n,t)});function Vf(n){var e=u(n);return e.__chain__=!0,e}function th(n,e){return e(n),n}function or(n,e){return e(n)}var rh=se(function(n){var e=n.length,t=e?n[0]:0,r=this.__wrapped__,i=function(f){return ei(f,n)};return e>1||this.__actions__.length||!(r instanceof O)||!ae(t)?this.thru(i):(r=r.slice(t,+t+(e?1:0)),r.__actions__.push({func:or,args:[i],thisArg:l}),new Pn(r,this.__chain__).thru(function(f){return e&&!f.length&&f.push(l),f}))});function ih(){return Vf(this)}function uh(){return new Pn(this.value(),this.__chain__)}function fh(){this.__values__===l&&(this.__values__=ao(this.value()));var n=this.__index__>=this.__values__.length,e=n?l:this.__values__[this.__index__++];return{done:n,value:e}}function oh(){return this}function lh(n){for(var e,t=this;t instanceof Yt;){var r=zf(t);r.__index__=0,r.__values__=l,e?i.__wrapped__=r:e=r;var i=r;t=t.__wrapped__}return i.__wrapped__=n,e}function sh(){var n=this.__wrapped__;if(n instanceof O){var e=n;return this.__actions__.length&&(e=new O(this)),e=e.reverse(),e.__actions__.push({func:or,args:[Ei],thisArg:l}),new Pn(e,this.__chain__)}return this.thru(Ei)}function ah(){return hf(this.__wrapped__,this.__actions__)}var ch=jt(function(n,e,t){F.call(n,t)?++n[t]:oe(n,t,1)});function hh(n,e,t){var r=T(n)?Iu:ta;return t&&dn(n,e,t)&&(e=l),r(n,m(e,3))}function gh(n,e){var t=T(n)?we:Xu;return t(n,m(e,3))}var dh=Rf(Kf),ph=Rf(qf);function _h(n,e){return fn(lr(n,e),1)}function vh(n,e){return fn(lr(n,e),re)}function wh(n,e,t){return t=t===l?1:C(t),fn(lr(n,e),t)}function Qf(n,e){var t=T(n)?Un:me;return t(n,m(e,3))}function kf(n,e){var t=T(n)?Pl:Zu;return t(n,m(e,3))}var xh=jt(function(n,e,t){F.call(n,t)?n[t].push(e):oe(n,t,[e])});function Ah(n,e,t,r){n=xn(n)?n:et(n),t=t&&!r?C(t):0;var i=n.length;return t<0&&(t=V(i+t,0)),gr(n)?t<=i&&n.indexOf(e,t)>-1:!!i&&ze(n,e,t)>-1}var Sh=E(function(n,e,t){var r=-1,i=typeof e=="function",f=xn(n)?h(n.length):[];return me(n,function(o){f[++r]=i?Tn(e,o,t):_t(o,e,t)}),f}),mh=jt(function(n,e,t){oe(n,t,e)});function lr(n,e){var t=T(n)?G:nf;return t(n,m(e,3))}function Rh(n,e,t,r){return n==null?[]:(T(e)||(e=e==null?[]:[e]),t=r?l:t,T(t)||(t=t==null?[]:[t]),uf(n,e,t))}var Ih=jt(function(n,e,t){n[t?0:1].push(e)},function(){return[[],[]]});function yh(n,e,t){var r=T(n)?$r:Lu,i=arguments.length<3;return r(n,m(e,4),t,i,me)}function Th(n,e,t){var r=T(n)?Dl:Lu,i=arguments.length<3;return r(n,m(e,4),t,i,Zu)}function Ch(n,e){var t=T(n)?we:Xu;return t(n,cr(m(e,3)))}function Lh(n){var e=T(n)?zu:Aa;return e(n)}function Eh(n,e,t){(t?dn(n,e,t):e===l)?e=1:e=C(e);var r=T(n)?Qs:Sa;return r(n,e)}function bh(n){var e=T(n)?ks:Ra;return e(n)}function Oh(n){if(n==null)return 0;if(xn(n))return gr(n)?qe(n):n.length;var e=an(n);return e==zn||e==Kn?n.size:oi(n).length}function Mh(n,e,t){var r=T(n)?zr:Ia;return t&&dn(n,e,t)&&(e=l),r(n,m(e,3))}var Bh=E(function(n,e){if(n==null)return[];var t=e.length;return t>1&&dn(n,e[0],e[1])?e=[]:t>2&&dn(e[0],e[1],e[2])&&(e=[e[0]]),uf(n,fn(e,1),[])}),sr=gs||function(){return un.Date.now()};function Wh(n,e){if(typeof e!="function")throw new Fn(Z);return n=C(n),function(){if(--n<1)return e.apply(this,arguments)}}function jf(n,e,t){return e=t?l:e,e=n&&e==null?n.length:e,le(n,rn,l,l,l,l,e)}function no(n,e){var t;if(typeof e!="function")throw new Fn(Z);return n=C(n),function(){return--n>0&&(t=e.apply(this,arguments)),n<=1&&(e=l),t}}var Oi=E(function(n,e,t){var r=nn;if(t.length){var i=Ae(t,je(Oi));r|=In}return le(n,r,e,t,i)}),eo=E(function(n,e,t){var r=nn|hn;if(t.length){var i=Ae(t,je(eo));r|=In}return le(e,r,n,t,i)});function to(n,e,t){e=t?l:e;var r=le(n,Mn,l,l,l,l,l,e);return r.placeholder=to.placeholder,r}function ro(n,e,t){e=t?l:e;var r=le(n,de,l,l,l,l,l,e);return r.placeholder=ro.placeholder,r}function io(n,e,t){var r,i,f,o,s,c,d=0,p=!1,_=!1,w=!0;if(typeof n!="function")throw new Fn(Z);e=Gn(e)||0,$(t)&&(p=!!t.leading,_="maxWait"in t,f=_?V(Gn(t.maxWait)||0,e):f,w="trailing"in t?!!t.trailing:w);function A(Y){var Xn=r,ge=i;return r=i=l,d=Y,o=n.apply(ge,Xn),o}function R(Y){return d=Y,s=St(b,e),p?A(Y):o}function L(Y){var Xn=Y-c,ge=Y-d,Io=e-Xn;return _?sn(Io,f-ge):Io}function I(Y){var Xn=Y-c,ge=Y-d;return c===l||Xn>=e||Xn<0||_&&ge>=f}function b(){var Y=sr();if(I(Y))return B(Y);s=St(b,L(Y))}function B(Y){return s=l,w&&r?A(Y):(r=i=l,o)}function bn(){s!==l&&df(s),d=0,r=c=i=s=l}function pn(){return s===l?o:B(sr())}function On(){var Y=sr(),Xn=I(Y);if(r=arguments,i=this,c=Y,Xn){if(s===l)return R(c);if(_)return df(s),s=St(b,e),A(c)}return s===l&&(s=St(b,e)),o}return On.cancel=bn,On.flush=pn,On}var Uh=E(function(n,e){return Yu(n,1,e)}),Fh=E(function(n,e,t){return Yu(n,Gn(e)||0,t)});function Ph(n){return le(n,Le)}function ar(n,e){if(typeof n!="function"||e!=null&&typeof e!="function")throw new Fn(Z);var t=function(){var r=arguments,i=e?e.apply(this,r):r[0],f=t.cache;if(f.has(i))return f.get(i);var o=n.apply(this,r);return t.cache=f.set(i,o)||f,o};return t.cache=new(ar.Cache||fe),t}ar.Cache=fe;function cr(n){if(typeof n!="function")throw new Fn(Z);return function(){var e=arguments;switch(e.length){case 0:return!n.call(this);case 1:return!n.call(this,e[0]);case 2:return!n.call(this,e[0],e[1]);case 3:return!n.call(this,e[0],e[1],e[2])}return!n.apply(this,e)}}function Dh(n){return no(2,n)}var Nh=ya(function(n,e){e=e.length==1&&T(e[0])?G(e[0],Cn(m())):G(fn(e,1),Cn(m()));var t=e.length;return E(function(r){for(var i=-1,f=sn(r.length,t);++i=e}),De=Qu(function(){return arguments}())?Qu:function(n){return K(n)&&F.call(n,"callee")&&!Pu.call(n,"callee")},T=h.isArray,ng=wu?Cn(wu):la;function xn(n){return n!=null&&hr(n.length)&&!ce(n)}function q(n){return K(n)&&xn(n)}function eg(n){return n===!0||n===!1||K(n)&&gn(n)==Qn}var Te=ps||zi,tg=xu?Cn(xu):sa;function rg(n){return K(n)&&n.nodeType===1&&!mt(n)}function ig(n){if(n==null)return!0;if(xn(n)&&(T(n)||typeof n=="string"||typeof n.splice=="function"||Te(n)||nt(n)||De(n)))return!n.length;var e=an(n);if(e==zn||e==Kn)return!n.size;if(At(n))return!oi(n).length;for(var t in n)if(F.call(n,t))return!1;return!0}function ug(n,e){return vt(n,e)}function fg(n,e,t){t=typeof t=="function"?t:l;var r=t?t(n,e):l;return r===l?vt(n,e,l,t):!!r}function Bi(n){if(!K(n))return!1;var e=gn(n);return e==kn||e==$n||typeof n.message=="string"&&typeof n.name=="string"&&!mt(n)}function og(n){return typeof n=="number"&&Nu(n)}function ce(n){if(!$(n))return!1;var e=gn(n);return e==yt||e==Yi||e==ve||e==Oo}function fo(n){return typeof n=="number"&&n==C(n)}function hr(n){return typeof n=="number"&&n>-1&&n%1==0&&n<=Vn}function $(n){var e=typeof n;return n!=null&&(e=="object"||e=="function")}function K(n){return n!=null&&typeof n=="object"}var oo=Au?Cn(Au):ca;function lg(n,e){return n===e||fi(n,e,Ri(e))}function sg(n,e,t){return t=typeof t=="function"?t:l,fi(n,e,Ri(e),t)}function ag(n){return lo(n)&&n!=+n}function cg(n){if(Xa(n))throw new y(He);return ku(n)}function hg(n){return n===null}function gg(n){return n==null}function lo(n){return typeof n=="number"||K(n)&&gn(n)==rt}function mt(n){if(!K(n)||gn(n)!=ie)return!1;var e=Nt(n);if(e===null)return!0;var t=F.call(e,"constructor")&&e.constructor;return typeof t=="function"&&t instanceof t&&Ut.call(t)==ss}var Wi=Su?Cn(Su):ha;function dg(n){return fo(n)&&n>=-Vn&&n<=Vn}var so=mu?Cn(mu):ga;function gr(n){return typeof n=="string"||!T(n)&&K(n)&&gn(n)==ut}function En(n){return typeof n=="symbol"||K(n)&&gn(n)==Tt}var nt=Ru?Cn(Ru):da;function pg(n){return n===l}function _g(n){return K(n)&&an(n)==ft}function vg(n){return K(n)&&gn(n)==Bo}var wg=rr(li),xg=rr(function(n,e){return n<=e});function ao(n){if(!n)return[];if(xn(n))return gr(n)?qn(n):wn(n);if(st&&n[st])return Ql(n[st]());var e=an(n),t=e==zn?Jr:e==Kn?Mt:et;return t(n)}function he(n){if(!n)return n===0?n:0;if(n=Gn(n),n===re||n===-re){var e=n<0?-1:1;return e*mr}return n===n?n:0}function C(n){var e=he(n),t=e%1;return e===e?t?e-t:e:0}function co(n){return n?We(C(n),0,Bn):0}function Gn(n){if(typeof n=="number")return n;if(En(n))return Ee;if($(n)){var e=typeof n.valueOf=="function"?n.valueOf():n;n=$(e)?e+"":e}if(typeof n!="string")return n===0?n:+n;n=Eu(n);var t=nl.test(n);return t||tl.test(n)?Wl(n.slice(2),t?2:8):jo.test(n)?Ee:+n}function ho(n){return ne(n,An(n))}function Ag(n){return n?We(C(n),-Vn,Vn):n===0?n:0}function U(n){return n==null?"":Ln(n)}var Sg=Qe(function(n,e){if(At(e)||xn(e)){ne(e,en(e),n);return}for(var t in e)F.call(e,t)&&dt(n,t,e[t])}),go=Qe(function(n,e){ne(e,An(e),n)}),dr=Qe(function(n,e,t,r){ne(e,An(e),n,r)}),mg=Qe(function(n,e,t,r){ne(e,en(e),n,r)}),Rg=se(ei);function Ig(n,e){var t=Ve(n);return e==null?t:Ku(t,e)}var yg=E(function(n,e){n=D(n);var t=-1,r=e.length,i=r>2?e[2]:l;for(i&&dn(e[0],e[1],i)&&(r=1);++t1),f}),ne(n,Si(n),t),r&&(t=Dn(t,k|tn|cn,Fa));for(var i=e.length;i--;)gi(t,e[i]);return t});function zg(n,e){return _o(n,cr(m(e)))}var Kg=se(function(n,e){return n==null?{}:va(n,e)});function _o(n,e){if(n==null)return{};var t=G(Si(n),function(r){return[r]});return e=m(e),ff(n,t,function(r,i){return e(r,i[0])})}function qg(n,e,t){e=Ie(e,n);var r=-1,i=e.length;for(i||(i=1,n=l);++re){var r=n;n=e,e=r}if(t||n%1||e%1){var i=Hu();return sn(n+i*(e-n+Bl("1e-"+((i+"").length-1))),e)}return ai(n,e)}var td=ke(function(n,e,t){return e=e.toLowerCase(),n+(t?xo(e):e)});function xo(n){return Pi(U(n).toLowerCase())}function Ao(n){return n=U(n),n&&n.replace(il,Yl).replace(Rl,"")}function rd(n,e,t){n=U(n),e=Ln(e);var r=n.length;t=t===l?r:We(C(t),0,r);var i=t;return t-=e.length,t>=0&&n.slice(t,i)==e}function id(n){return n=U(n),n&&Do.test(n)?n.replace(Ji,Zl):n}function ud(n){return n=U(n),n&&Ko.test(n)?n.replace(Mr,"\\$&"):n}var fd=ke(function(n,e,t){return n+(t?"-":"")+e.toLowerCase()}),od=ke(function(n,e,t){return n+(t?" ":"")+e.toLowerCase()}),ld=mf("toLowerCase");function sd(n,e,t){n=U(n),e=C(e);var r=e?qe(n):0;if(!e||r>=e)return n;var i=(e-r)/2;return tr(zt(i),t)+n+tr($t(i),t)}function ad(n,e,t){n=U(n),e=C(e);var r=e?qe(n):0;return e&&r>>0,t?(n=U(n),n&&(typeof e=="string"||e!=null&&!Wi(e))&&(e=Ln(e),!e&&Ke(n))?ye(qn(n),0,t):n.split(e,t)):[]}var vd=ke(function(n,e,t){return n+(t?" ":"")+Pi(e)});function wd(n,e,t){return n=U(n),t=t==null?0:We(C(t),0,n.length),e=Ln(e),n.slice(t,t+e.length)==e}function xd(n,e,t){var r=u.templateSettings;t&&dn(n,e,t)&&(e=l),n=U(n),e=dr({},e,r,Ef);var i=dr({},e.imports,r.imports,Ef),f=en(i),o=Xr(i,f),s,c,d=0,p=e.interpolate||Ct,_="__p += '",w=Vr((e.escape||Ct).source+"|"+p.source+"|"+(p===Vi?ko:Ct).source+"|"+(e.evaluate||Ct).source+"|$","g"),A="//# sourceURL="+(F.call(e,"sourceURL")?(e.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++Ll+"]")+` +`;n.replace(w,function(I,b,B,bn,pn,On){return B||(B=bn),_+=n.slice(d,On).replace(ul,Xl),b&&(s=!0,_+=`' + +__e(`+b+`) + +'`),pn&&(c=!0,_+=`'; +`+pn+`; +__p += '`),B&&(_+=`' + +((__t = (`+B+`)) == null ? '' : __t) + +'`),d=On+I.length,I}),_+=`'; +`;var R=F.call(e,"variable")&&e.variable;if(!R)_=`with (obj) { +`+_+` +} +`;else if(Vo.test(R))throw new y(Rn);_=(c?_.replace(Wo,""):_).replace(Uo,"$1").replace(Fo,"$1;"),_="function("+(R||"obj")+`) { +`+(R?"":`obj || (obj = {}); +`)+"var __t, __p = ''"+(s?", __e = _.escape":"")+(c?`, __j = Array.prototype.join; +function print() { __p += __j.call(arguments, '') } +`:`; +`)+_+`return __p +}`;var L=mo(function(){return W(f,A+"return "+_).apply(l,o)});if(L.source=_,Bi(L))throw L;return L}function Ad(n){return U(n).toLowerCase()}function Sd(n){return U(n).toUpperCase()}function md(n,e,t){if(n=U(n),n&&(t||e===l))return Eu(n);if(!n||!(e=Ln(e)))return n;var r=qn(n),i=qn(e),f=bu(r,i),o=Ou(r,i)+1;return ye(r,f,o).join("")}function Rd(n,e,t){if(n=U(n),n&&(t||e===l))return n.slice(0,Bu(n)+1);if(!n||!(e=Ln(e)))return n;var r=qn(n),i=Ou(r,qn(e))+1;return ye(r,0,i).join("")}function Id(n,e,t){if(n=U(n),n&&(t||e===l))return n.replace(Br,"");if(!n||!(e=Ln(e)))return n;var r=qn(n),i=bu(r,qn(e));return ye(r,i).join("")}function yd(n,e){var t=It,r=vr;if($(e)){var i="separator"in e?e.separator:i;t="length"in e?C(e.length):t,r="omission"in e?Ln(e.omission):r}n=U(n);var f=n.length;if(Ke(n)){var o=qn(n);f=o.length}if(t>=f)return n;var s=t-qe(r);if(s<1)return r;var c=o?ye(o,0,s).join(""):n.slice(0,s);if(i===l)return c+r;if(o&&(s+=c.length-s),Wi(i)){if(n.slice(s).search(i)){var d,p=c;for(i.global||(i=Vr(i.source,U(Qi.exec(i))+"g")),i.lastIndex=0;d=i.exec(p);)var _=d.index;c=c.slice(0,_===l?s:_)}}else if(n.indexOf(Ln(i),s)!=s){var w=c.lastIndexOf(i);w>-1&&(c=c.slice(0,w))}return c+r}function Td(n){return n=U(n),n&&Po.test(n)?n.replace(Xi,es):n}var Cd=ke(function(n,e,t){return n+(t?" ":"")+e.toUpperCase()}),Pi=mf("toUpperCase");function So(n,e,t){return n=U(n),e=t?l:e,e===l?Vl(n)?is(n):Gl(n):n.match(e)||[]}var mo=E(function(n,e){try{return Tn(n,l,e)}catch(t){return Bi(t)?t:new y(t)}}),Ld=se(function(n,e){return Un(e,function(t){t=ee(t),oe(n,t,Oi(n[t],n))}),n});function Ed(n){var e=n==null?0:n.length,t=m();return n=e?G(n,function(r){if(typeof r[1]!="function")throw new Fn(Z);return[t(r[0]),r[1]]}):[],E(function(r){for(var i=-1;++iVn)return[];var t=Bn,r=sn(n,Bn);e=m(e),n-=Bn;for(var i=Zr(r,e);++t0||e<0)?new O(t):(n<0?t=t.takeRight(-n):n&&(t=t.drop(n)),e!==l&&(e=C(e),t=e<0?t.dropRight(-e):t.take(e-n)),t)},O.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},O.prototype.toArray=function(){return this.take(Bn)},jn(O.prototype,function(n,e){var t=/^(?:filter|find|map|reject)|While$/.test(e),r=/^(?:head|last)$/.test(e),i=u[r?"take"+(e=="last"?"Right":""):e],f=r||/^find/.test(e);!i||(u.prototype[e]=function(){var o=this.__wrapped__,s=r?[1]:arguments,c=o instanceof O,d=s[0],p=c||T(o),_=function(b){var B=i.apply(u,xe([b],s));return r&&w?B[0]:B};p&&t&&typeof d=="function"&&d.length!=1&&(c=p=!1);var w=this.__chain__,A=!!this.__actions__.length,R=f&&!w,L=c&&!A;if(!f&&p){o=L?o:new O(this);var I=n.apply(o,s);return I.__actions__.push({func:or,args:[_],thisArg:l}),new Pn(I,w)}return R&&L?n.apply(this,s):(I=this.thru(_),R?r?I.value()[0]:I.value():I)})}),Un(["pop","push","shift","sort","splice","unshift"],function(n){var e=Bt[n],t=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",r=/^(?:pop|shift)$/.test(n);u.prototype[n]=function(){var i=arguments;if(r&&!this.__chain__){var f=this.value();return e.apply(T(f)?f:[],i)}return this[t](function(o){return e.apply(T(o)?o:[],i)})}}),jn(O.prototype,function(n,e){var t=u[e];if(t){var r=t.name+"";F.call(Je,r)||(Je[r]=[]),Je[r].push({name:e,func:t})}}),Je[nr(l,hn).name]=[{name:"wrapper",func:l}],O.prototype.clone=Ts,O.prototype.reverse=Cs,O.prototype.value=Ls,u.prototype.at=rh,u.prototype.chain=ih,u.prototype.commit=uh,u.prototype.next=fh,u.prototype.plant=lh,u.prototype.reverse=sh,u.prototype.toJSON=u.prototype.valueOf=u.prototype.value=ah,u.prototype.first=u.prototype.head,st&&(u.prototype[st]=oh),u},Ye=us();be?((be.exports=Ye)._=Ye,Nr._=Ye):un._=Ye}).call(Rt)})(Co,Co.exports);var Xp=(v=>(v[v.TITLE=1]="TITLE",v[v.TEXT=2]="TEXT",v[v.IMAGEURL=3]="IMAGEURL",v[v.VIDEOURL=4]="VIDEOURL",v[v.AUDIOURL=5]="AUDIOURL",v[v.LINKURL=6]="LINKURL",v[v.ATTACHMENT=7]="ATTACHMENT",v[v.CHARGEATTACHMENT=8]="CHARGEATTACHMENT",v))(Xp||{}),Jp=(v=>(v[v.PUBLIC=0]="PUBLIC",v[v.PRIVATE=1]="PRIVATE",v[v.FRIEND=2]="FRIEND",v))(Jp||{});export{jp as I,Xp as P,Jp as V,kp as _,Co as l}; diff --git a/web/dist/assets/InputGroup.73d38f63.js b/web/dist/assets/InputGroup.73d38f63.js new file mode 100644 index 00000000..ecffc6f2 --- /dev/null +++ b/web/dist/assets/InputGroup.73d38f63.js @@ -0,0 +1,56 @@ +import{c as t,b as r,f as o,d as a,u as d,g as s,h as p}from"./index.d4f5aad2.js";var n=t("input-group",` + display: inline-flex; + width: 100%; + flex-wrap: nowrap; + vertical-align: bottom; +`,[r(">",[t("input",[r("&:not(:last-child)",` + border-top-right-radius: 0!important; + border-bottom-right-radius: 0!important; + `),r("&:not(:first-child)",` + border-top-left-radius: 0!important; + border-bottom-left-radius: 0!important; + margin-left: -1px!important; + `)]),t("button",[r("&:not(:last-child)",` + border-top-right-radius: 0!important; + border-bottom-right-radius: 0!important; + `,[o("state-border, border",` + border-top-right-radius: 0!important; + border-bottom-right-radius: 0!important; + `)]),r("&:not(:first-child)",` + border-top-left-radius: 0!important; + border-bottom-left-radius: 0!important; + `,[o("state-border, border",` + border-top-left-radius: 0!important; + border-bottom-left-radius: 0!important; + `)])]),r("*",[r("&:not(:last-child)",` + border-top-right-radius: 0!important; + border-bottom-right-radius: 0!important; + `,[r(">",[t("input",` + border-top-right-radius: 0!important; + border-bottom-right-radius: 0!important; + `),t("base-selection",[t("base-selection-label",` + border-top-right-radius: 0!important; + border-bottom-right-radius: 0!important; + `),t("base-selection-tags",` + border-top-right-radius: 0!important; + border-bottom-right-radius: 0!important; + `),o("box-shadow, border, state-border",` + border-top-right-radius: 0!important; + border-bottom-right-radius: 0!important; + `)])])]),r("&:not(:first-child)",` + margin-left: -1px!important; + border-top-left-radius: 0!important; + border-bottom-left-radius: 0!important; + `,[r(">",[t("input",` + border-top-left-radius: 0!important; + border-bottom-left-radius: 0!important; + `),t("base-selection",[t("base-selection-label",` + border-top-left-radius: 0!important; + border-bottom-left-radius: 0!important; + `),t("base-selection-tags",` + border-top-left-radius: 0!important; + border-bottom-left-radius: 0!important; + `),o("box-shadow, border, state-border",` + border-top-left-radius: 0!important; + border-bottom-left-radius: 0!important; + `)])])])])])]);const b={};var u=a({name:"InputGroup",props:b,setup(i){const{mergedClsPrefixRef:e}=d(i);return s("-input-group",n,e),{mergedClsPrefix:e}},render(){const{mergedClsPrefix:i}=this;return p("div",{class:`${i}-input-group`},this.$slots)}});export{u as _}; diff --git a/web/dist/assets/LatoLatin-Regular.ddd4ef7f.woff2 b/web/dist/assets/LatoLatin-Regular.ddd4ef7f.woff2 new file mode 100644 index 00000000..a4d084bf Binary files /dev/null and b/web/dist/assets/LatoLatin-Regular.ddd4ef7f.woff2 differ diff --git a/web/dist/assets/LatoLatin-Semibold.267eef30.woff2 b/web/dist/assets/LatoLatin-Semibold.267eef30.woff2 new file mode 100644 index 00000000..1861c242 Binary files /dev/null and b/web/dist/assets/LatoLatin-Semibold.267eef30.woff2 differ diff --git a/web/dist/assets/List.a66e9ae7.js b/web/dist/assets/List.a66e9ae7.js new file mode 100644 index 00000000..b982bf97 --- /dev/null +++ b/web/dist/assets/List.a66e9ae7.js @@ -0,0 +1,73 @@ +import{b as a,c as l,e as d,f as n,aB as w,aC as P,d as B,u as D,j,x as v,p as E,t as M,y as H,A as L,h as t,n as I,aD as O}from"./index.d4f5aad2.js";var T=a([l("list",` + --n-merged-border-color: var(--n-border-color); + --n-merged-color: var(--n-color); + --n-merged-color-hover: var(--n-color-hover); + margin: 0; + font-size: var(--n-font-size); + transition: + background-color .3s var(--n-bezier), + color .3s var(--n-bezier), + border-color .3s var(--n-bezier); + padding: 0; + list-style-type: none; + color: var(--n-text-color); + background-color: var(--n-merged-color); + `,[d("show-divider",[l("list-item",[a("&:not(:last-child)",[n("divider",` + background-color: var(--n-merged-border-color); + `)])])]),d("clickable",[l("list-item",` + cursor: pointer; + `)]),d("bordered",` + border: 1px solid var(--n-merged-border-color); + border-radius: var(--n-border-radius); + `),d("hoverable",[l("list-item",` + border-radius: var(--n-border-radius); + `,[a("&:hover",` + background-color: var(--n-merged-color-hover); + `,[n("divider",` + background-color: transparent; + `)])])]),d("bordered, hoverable",[l("list-item",` + padding: 12px 20px; + `),n("header, footer",` + padding: 12px 20px; + `)]),n("header, footer",` + padding: 12px 0; + box-sizing: border-box; + transition: border-color .3s var(--n-bezier); + `,[a("&:not(:last-child)",` + border-bottom: 1px solid var(--n-merged-border-color); + `)]),l("list-item",` + position: relative; + padding: 12px 0; + box-sizing: border-box; + display: flex; + flex-wrap: nowrap; + align-items: center; + transition: + background-color .3s var(--n-bezier), + border-color .3s var(--n-bezier); + `,[n("prefix",` + margin-right: 20px; + flex: 0; + `),n("suffix",` + margin-left: 20px; + flex: 0; + `),n("main",` + flex: 1; + `),n("divider",` + height: 1px; + position: absolute; + bottom: 0; + left: 0; + right: 0; + background-color: transparent; + transition: background-color .3s var(--n-bezier); + pointer-events: none; + `)])]),w(l("list",` + --n-merged-color-hover: var(--n-color-hover-modal); + --n-merged-color: var(--n-color-modal); + --n-merged-border-color: var(--n-border-color-modal); + `)),P(l("list",` + --n-merged-color-hover: var(--n-color-hover-popover); + --n-merged-color: var(--n-color-popover); + --n-merged-border-color: var(--n-border-color-popover); + `))]);const V=Object.assign(Object.assign({},v.props),{size:{type:String,default:"medium"},bordered:Boolean,clickable:Boolean,hoverable:Boolean,showDivider:{type:Boolean,default:!0}}),K=I("n-list");var A=B({name:"List",props:V,setup(e){const{mergedClsPrefixRef:o,inlineThemeDisabled:r,mergedRtlRef:s}=D(e),b=j("List",s,o),m=v("List","-list",T,O,e,o);E(K,{showDividerRef:M(e,"showDivider"),mergedClsPrefixRef:o});const c=H(()=>{const{common:{cubicBezierEaseInOut:p},self:{fontSize:h,textColor:u,color:g,colorModal:f,colorPopover:x,borderColor:z,borderColorModal:C,borderColorPopover:R,borderRadius:k,colorHover:y,colorHoverModal:_,colorHoverPopover:$}}=m.value;return{"--n-font-size":h,"--n-bezier":p,"--n-text-color":u,"--n-color":g,"--n-border-radius":k,"--n-border-color":z,"--n-border-color-modal":C,"--n-border-color-popover":R,"--n-color-modal":f,"--n-color-popover":x,"--n-color-hover":y,"--n-color-hover-modal":_,"--n-color-hover-popover":$}}),i=r?L("list",void 0,c,e):void 0;return{mergedClsPrefix:o,rtlEnabled:b,cssVars:r?void 0:c,themeClass:i==null?void 0:i.themeClass,onRender:i==null?void 0:i.onRender}},render(){var e;const{$slots:o,mergedClsPrefix:r,onRender:s}=this;return s==null||s(),t("ul",{class:[`${r}-list`,this.rtlEnabled&&`${r}-list--rtl`,this.bordered&&`${r}-list--bordered`,this.showDivider&&`${r}-list--show-divider`,this.hoverable&&`${r}-list--hoverable`,this.clickable&&`${r}-list--clickable`,this.themeClass],style:this.cssVars},o.header?t("div",{class:`${r}-list__header`},o.header()):null,(e=o.default)===null||e===void 0?void 0:e.call(o),o.footer?t("div",{class:`${r}-list__footer`},o.footer()):null)}});export{A as _,K as l}; diff --git a/web/dist/assets/Messages.23db49c3.js b/web/dist/assets/Messages.23db49c3.js new file mode 100644 index 00000000..18b3b9ce --- /dev/null +++ b/web/dist/assets/Messages.23db49c3.js @@ -0,0 +1 @@ +import{d as v,W as n,Y as t,Z as l,ai as F,al as q,am as z,a4 as a,a5 as r,a8 as $,a9 as p,aa as w,a6 as E,a7 as i,a3 as h,cb as I,cp as N,cq as R,cr as P,ae as T,cs as H,af as U,ac as O,ab as A,r as x,a2 as W,aj as Y,ct as Z,$ as G}from"./index.d4f5aad2.js";import{f as J}from"./formatTime.e07969bb.js";import{_ as K}from"./Alert.6cb9deb6.js";import{_ as Q}from"./Thing.d394adea.js";import{b as X,a as ee,_ as ne}from"./Skeleton.e1c16fcb.js";import{_ as se}from"./main-nav.3167f221.js";import{_ as te}from"./List.a66e9ae7.js";import{_ as oe}from"./Pagination.c13c2d34.js";const ae={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},re=l("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M464 128L240 384l-96-96"},null,-1),le=l("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M144 384l-96-96"},null,-1),ie=l("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M368 128L232 284"},null,-1),ue=[re,le,ie];var ce=v({name:"CheckmarkDoneOutline",render:function(c,_){return n(),t("svg",ae,ue)}});const _e={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},de=l("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M416 128L192 384l-96-96"},null,-1),me=[de];var pe=v({name:"CheckmarkOutline",render:function(c,_){return n(),t("svg",_e,me)}});const ge={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},ke=l("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M368 368L144 144"},null,-1),he=l("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M368 144L144 368"},null,-1),ve=[ke,he];var b=v({name:"CloseOutline",render:function(c,_){return n(),t("svg",ge,ve)}});const we={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},fe=l("path",{d:"M336 192h40a40 40 0 0 1 40 40v192a40 40 0 0 1-40 40H136a40 40 0 0 1-40-40V232a40 40 0 0 1 40-40h40",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),ye=l("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M336 128l-80-80l-80 80"},null,-1),xe=l("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M256 321V48"},null,-1),$e=[fe,ye,xe];var Ce=v({name:"ShareOutline",render:function(c,_){return n(),t("svg",we,$e)}});const De={class:"sender-wrap"},Me={key:0,class:"nickname"},Fe={class:"username"},Be={key:1,class:"nickname"},je={class:"timestamp"},be={class:"timestamp-txt"},Ee={key:0,class:"brief-content"},Oe={key:1,class:"whisper-content-wrap"},Ae={key:2,class:"requesting-friend-wrap"},Le={key:2,class:"status-info"},Se={key:3,class:"status-info"},Ve=v({__name:"message-item",props:{message:null},setup(e){const c="https://assets.paopao.info/public/avatar/default/admin.png",_=q(),u=s=>{d(s),(s.type===1||s.type===2||s.type===3)&&(s.post&&s.post.id>0?_.push({name:"post",query:{id:s.post_id}}):window.$message.error("\u8BE5\u52A8\u6001\u5DF2\u88AB\u5220\u9664"))},g=s=>{d(s),N({user_id:s.sender_user_id}).then(o=>{s.reply_id=2,window.$message.success("\u5DF2\u540C\u610F\u6DFB\u52A0\u597D\u53CB")}).catch(o=>{console.log(o)})},f=s=>{d(s),R({user_id:s.sender_user_id}).then(o=>{s.reply_id=3,window.$message.success("\u5DF2\u62D2\u7EDD\u6DFB\u52A0\u597D\u53CB")}).catch(o=>{console.log(o)})},d=s=>{s.is_read===0&&P({id:s.id}).then(o=>{s.is_read=1}).catch(o=>{console.log(o)})};return(s,o)=>{const C=T,m=z("router-link"),B=H,k=U,D=K,M=Q;return n(),t("div",{class:I(["message-item",{unread:e.message.is_read===0}]),onClick:o[4]||(o[4]=y=>d(e.message))},[a(M,{"content-indented":""},{avatar:r(()=>[a(C,{round:"",size:30,src:e.message.sender_user.id>0?e.message.sender_user.avatar:c},null,8,["src"])]),header:r(()=>[l("div",De,[e.message.sender_user.id>0?(n(),t("span",Me,[a(m,{onClick:o[0]||(o[0]=$(()=>{},["stop"])),class:"username-link",to:{name:"user",query:{username:e.message.sender_user.username}}},{default:r(()=>[p(w(e.message.sender_user.nickname),1)]),_:1},8,["to"]),l("span",Fe," @"+w(e.message.sender_user.username),1)])):(n(),t("span",Be," \u7CFB\u7EDF "))])]),"header-extra":r(()=>[l("span",je,[e.message.is_read===0?(n(),E(B,{key:0,dot:"",processing:""})):i("",!0),l("span",be,w(h(J)(e.message.created_on)),1)])]),description:r(()=>[a(D,{"show-icon":!1,class:"brief-wrap",type:e.message.is_read>0?"default":"success"},{default:r(()=>[e.message.type!=4?(n(),t("div",Ee,[p(w(e.message.brief)+" ",1),e.message.type===1||e.message.type===2||e.message.type===3?(n(),t("span",{key:0,onClick:o[1]||(o[1]=$(y=>u(e.message),["stop"])),class:"hash-link view-link"},[a(k,null,{default:r(()=>[a(h(Ce))]),_:1}),p(" \u67E5\u770B\u8BE6\u60C5 ")])):i("",!0)])):i("",!0),e.message.type===4?(n(),t("div",Oe,w(e.message.content),1)):i("",!0),e.message.type===5?(n(),t("div",Ae,[p(w(e.message.content)+" ",1),e.message.reply_id===1?(n(),t("span",{key:0,onClick:o[2]||(o[2]=$(y=>g(e.message),["stop"])),class:"hash-link view-link"},[a(k,null,{default:r(()=>[a(h(pe))]),_:1}),p(" \u540C\u610F ")])):i("",!0),e.message.reply_id===1?(n(),t("span",{key:1,onClick:o[3]||(o[3]=$(y=>f(e.message),["stop"])),class:"hash-link view-link"},[a(k,null,{default:r(()=>[a(h(b))]),_:1}),p(" \u62D2\u7EDD ")])):i("",!0),e.message.reply_id===2?(n(),t("span",Le,[a(k,null,{default:r(()=>[a(h(ce))]),_:1}),p(" \u5DF2\u540C\u610F ")])):i("",!0),e.message.reply_id===3?(n(),t("span",Se,[a(k,null,{default:r(()=>[a(h(b))]),_:1}),p(" \u5DF2\u62D2\u7EDD ")])):i("",!0)])):i("",!0)]),_:1},8,["type"])]),_:1})],2)}}});var qe=F(Ve,[["__scopeId","data-v-44920a13"]]);const ze={class:"content"},Ie=v({__name:"message-skeleton",props:{num:{default:1}},setup(e){return(c,_)=>{const u=X;return n(!0),t(A,null,O(new Array(e.num),g=>(n(),t("div",{class:"skeleton-item",key:g},[l("div",ze,[a(u,{text:"",repeat:2}),a(u,{text:"",style:{width:"60%"}})])]))),128)}}});var Ne=F(Ie,[["__scopeId","data-v-d0b0628c"]]);const Re={key:0,class:"skeleton-wrap"},Pe={key:1},Te={key:0,class:"empty-wrap"},He={key:0,class:"pagination-wrap"},Ue=v({__name:"Messages",setup(e){const c=Y(),_=G(),u=x(!1),g=x(+c.query.p||1),f=x(10),d=x(0),s=x([]),o=()=>{u.value=!0,Z({page:g.value,page_size:f.value}).then(m=>{u.value=!1,s.value=m.list,d.value=Math.ceil(m.pager.total_rows/f.value)}).catch(m=>{u.value=!1})},C=m=>{g.value=m,o()};return W(()=>{o()}),(m,B)=>{const k=se,D=Ne,M=ee,y=qe,L=ne,S=oe,V=te;return n(),t("div",null,[a(k,{title:"\u6D88\u606F"}),a(V,{class:"main-content-wrap messages-wrap",bordered:""},{footer:r(()=>[d.value>1?(n(),t("div",He,[a(S,{page:g.value,"onUpdate:page":C,"page-slot":h(_).state.collapsedRight?5:8,"page-count":d.value},null,8,["page","page-slot","page-count"])])):i("",!0)]),default:r(()=>[u.value?(n(),t("div",Re,[a(D,{num:f.value},null,8,["num"])])):(n(),t("div",Pe,[s.value.length===0?(n(),t("div",Te,[a(M,{size:"large",description:"\u6682\u65E0\u6570\u636E"})])):i("",!0),(n(!0),t(A,null,O(s.value,j=>(n(),E(L,{key:j.id},{default:r(()=>[a(y,{message:j},null,8,["message"])]),_:2},1024))),128))]))]),_:1})])}}});var en=F(Ue,[["__scopeId","data-v-532e9e3c"]]);export{en as default}; diff --git a/web/dist/assets/Messages.db382f03.css b/web/dist/assets/Messages.db382f03.css new file mode 100644 index 00000000..f40012b0 --- /dev/null +++ b/web/dist/assets/Messages.db382f03.css @@ -0,0 +1 @@ +.message-item[data-v-44920a13]{padding:16px}.message-item.unread[data-v-44920a13]{background:#fcfffc}.message-item .sender-wrap[data-v-44920a13]{display:flex;align-items:center}.message-item .sender-wrap .username[data-v-44920a13]{opacity:.75;font-size:14px}.message-item .timestamp[data-v-44920a13]{opacity:.75;font-size:12px;display:flex;align-items:center}.message-item .timestamp .timestamp-txt[data-v-44920a13]{margin-left:6px}.message-item .brief-wrap[data-v-44920a13]{margin-top:10px}.message-item .brief-wrap .brief-content[data-v-44920a13],.message-item .brief-wrap .whisper-content-wrap[data-v-44920a13],.message-item .brief-wrap .requesting-friend-wrap[data-v-44920a13]{display:flex;width:100%}.message-item .view-link[data-v-44920a13]{margin-left:8px;display:flex;align-items:center}.message-item .status-info[data-v-44920a13]{margin-left:8px;align-items:center}.dark .message-item.unread[data-v-44920a13]{background:#0f180b}.skeleton-item[data-v-d0b0628c]{padding:12px;display:flex}.skeleton-item .content[data-v-d0b0628c]{width:100%}.pagination-wrap[data-v-532e9e3c]{padding:10px;display:flex;justify-content:center;overflow:hidden} diff --git a/web/dist/assets/MoreHorizFilled.b0eea69d.js b/web/dist/assets/MoreHorizFilled.b0eea69d.js new file mode 100644 index 00000000..fc945843 --- /dev/null +++ b/web/dist/assets/MoreHorizFilled.b0eea69d.js @@ -0,0 +1 @@ +import{d as e,W as o,Y as s,Z as r}from"./index.d4f5aad2.js";const t={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 24 24"},n=r("path",{d:"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2z",fill:"currentColor"},null,-1),l=[n];var m=e({name:"MoreHorizFilled",render:function(i,a){return o(),s("svg",t,l)}});export{m as M}; diff --git a/web/dist/assets/Pagination.c13c2d34.js b/web/dist/assets/Pagination.c13c2d34.js new file mode 100644 index 00000000..901e5501 --- /dev/null +++ b/web/dist/assets/Pagination.c13c2d34.js @@ -0,0 +1,303 @@ +import{d as le,r as P,aE as Zt,aF as Qt,a2 as kt,V as Ue,h as n,aG as Yt,aH as Gt,b as ce,c as k,f as U,a as it,e as X,x as Ce,t as we,aI as Xt,y as I,aJ as We,S as Ne,aK as He,z as Q,A as Ze,aL as en,aM as tn,ao as at,aN as Pt,ab as lt,aO as nn,n as on,q as an,u as dt,aP as Ot,aQ as Bt,aR as rn,aS as st,w as E,p as ln,aT as sn,aU as dn,aV as zt,aW as ct,aX as un,aY as cn,s as Ke,J as Rt,aZ as fn,o as hn,a_ as vn,a$ as qe,b0 as gn,b1 as bn,b2 as pn,b3 as mn,b4 as wn,b5 as Cn,b6 as ft,b7 as xn,b8 as yn,b9 as Fn,j as Mn,L as Sn,_ as ht,N as Re}from"./index.d4f5aad2.js";import{u as kn,N as Tt,m as vt}from"./Skeleton.e1c16fcb.js";function gt(e){switch(e){case"tiny":return"mini";case"small":return"tiny";case"medium":return"small";case"large":return"medium";case"huge":return"large"}throw Error(`${e} has no smaller size.`)}const ye="v-hidden",Pn=Gt("[v-hidden]",{display:"none!important"});var bt=le({name:"Overflow",props:{getCounter:Function,getTail:Function,updateCounter:Function,onUpdateOverflow:Function},setup(e,{slots:o}){const s=P(null),d=P(null);function f(){const{value:C}=s,{getCounter:i,getTail:g}=e;let h;if(i!==void 0?h=i():h=d.value,!C||!h)return;h.hasAttribute(ye)&&h.removeAttribute(ye);const{children:F}=C,y=C.offsetWidth,v=[],b=o.tail?g==null?void 0:g():null;let c=b?b.offsetWidth:0,p=!1;const z=C.children.length-(o.tail?1:0);for(let R=0;Ry){const{updateCounter:H}=e;for(let _=R;_>=0;--_){const L=z-1-_;H!==void 0?H(L):h.textContent=`${L}`;const N=h.offsetWidth;if(c-=v[_],c+N<=y||_===0){p=!0,R=_-1,b&&(R===-1?(b.style.maxWidth=`${y-N}px`,b.style.boxSizing="border-box"):b.style.maxWidth="");break}}}}const{onUpdateOverflow:T}=e;p?T!==void 0&&T(!0):(T!==void 0&&T(!1),h.setAttribute(ye,""))}const x=Zt();return Pn.mount({id:"vueuc/overflow",head:!0,anchorMetaName:Qt,ssr:x}),kt(f),{selfRef:s,counterRef:d,sync:f}},render(){const{$slots:e}=this;return Ue(this.sync),n("div",{class:"v-overflow",ref:"selfRef"},[Yt(e,"default"),e.counter?e.counter():n("span",{style:{display:"inline-block"},ref:"counterRef"}),e.tail?e.tail():null])}}),pt=le({name:"Backward",render(){return n("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},n("path",{d:"M12.2674 15.793C11.9675 16.0787 11.4927 16.0672 11.2071 15.7673L6.20572 10.5168C5.9298 10.2271 5.9298 9.7719 6.20572 9.48223L11.2071 4.23177C11.4927 3.93184 11.9675 3.92031 12.2674 4.206C12.5673 4.49169 12.5789 4.96642 12.2932 5.26634L7.78458 9.99952L12.2932 14.7327C12.5789 15.0326 12.5673 15.5074 12.2674 15.793Z",fill:"currentColor"}))}}),mt=le({name:"FastBackward",render(){return n("svg",{viewBox:"0 0 20 20",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},n("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},n("g",{fill:"currentColor","fill-rule":"nonzero"},n("path",{d:"M8.73171,16.7949 C9.03264,17.0795 9.50733,17.0663 9.79196,16.7654 C10.0766,16.4644 10.0634,15.9897 9.76243,15.7051 L4.52339,10.75 L17.2471,10.75 C17.6613,10.75 17.9971,10.4142 17.9971,10 C17.9971,9.58579 17.6613,9.25 17.2471,9.25 L4.52112,9.25 L9.76243,4.29275 C10.0634,4.00812 10.0766,3.53343 9.79196,3.2325 C9.50733,2.93156 9.03264,2.91834 8.73171,3.20297 L2.31449,9.27241 C2.14819,9.4297 2.04819,9.62981 2.01448,9.8386 C2.00308,9.89058 1.99707,9.94459 1.99707,10 C1.99707,10.0576 2.00356,10.1137 2.01585,10.1675 C2.05084,10.3733 2.15039,10.5702 2.31449,10.7254 L8.73171,16.7949 Z"}))))}}),wt=le({name:"FastForward",render(){return n("svg",{viewBox:"0 0 20 20",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},n("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},n("g",{fill:"currentColor","fill-rule":"nonzero"},n("path",{d:"M11.2654,3.20511 C10.9644,2.92049 10.4897,2.93371 10.2051,3.23464 C9.92049,3.53558 9.93371,4.01027 10.2346,4.29489 L15.4737,9.25 L2.75,9.25 C2.33579,9.25 2,9.58579 2,10.0000012 C2,10.4142 2.33579,10.75 2.75,10.75 L15.476,10.75 L10.2346,15.7073 C9.93371,15.9919 9.92049,16.4666 10.2051,16.7675 C10.4897,17.0684 10.9644,17.0817 11.2654,16.797 L17.6826,10.7276 C17.8489,10.5703 17.9489,10.3702 17.9826,10.1614 C17.994,10.1094 18,10.0554 18,10.0000012 C18,9.94241 17.9935,9.88633 17.9812,9.83246 C17.9462,9.62667 17.8467,9.42976 17.6826,9.27455 L11.2654,3.20511 Z"}))))}}),Ct=le({name:"Forward",render(){return n("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},n("path",{d:"M7.73271 4.20694C8.03263 3.92125 8.50737 3.93279 8.79306 4.23271L13.7944 9.48318C14.0703 9.77285 14.0703 10.2281 13.7944 10.5178L8.79306 15.7682C8.50737 16.0681 8.03263 16.0797 7.73271 15.794C7.43279 15.5083 7.42125 15.0336 7.70694 14.7336L12.2155 10.0005L7.70694 5.26729C7.42125 4.96737 7.43279 4.49264 7.73271 4.20694Z",fill:"currentColor"}))}}),xt=le({name:"More",render(){return n("svg",{viewBox:"0 0 16 16",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},n("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},n("g",{fill:"currentColor","fill-rule":"nonzero"},n("path",{d:"M4,7 C4.55228,7 5,7.44772 5,8 C5,8.55229 4.55228,9 4,9 C3.44772,9 3,8.55229 3,8 C3,7.44772 3.44772,7 4,7 Z M8,7 C8.55229,7 9,7.44772 9,8 C9,8.55229 8.55229,9 8,9 C7.44772,9 7,8.55229 7,8 C7,7.44772 7.44772,7 8,7 Z M12,7 C12.5523,7 13,7.44772 13,8 C13,8.55229 12.5523,9 12,9 C11.4477,9 11,8.55229 11,8 C11,7.44772 11.4477,7 12,7 Z"}))))}}),On=ce([k("base-selection",` + position: relative; + z-index: auto; + box-shadow: none; + width: 100%; + max-width: 100%; + display: inline-block; + vertical-align: bottom; + border-radius: var(--n-border-radius); + min-height: var(--n-height); + line-height: 1.5; + font-size: var(--n-font-size); + `,[k("base-loading",` + color: var(--n-loading-color); + `),k("base-selection-tags","min-height: var(--n-height);"),U("border, state-border",` + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + pointer-events: none; + border: var(--n-border); + border-radius: inherit; + transition: + box-shadow .3s var(--n-bezier), + border-color .3s var(--n-bezier); + `),U("state-border",` + z-index: 1; + border-color: #0000; + `),k("base-suffix",` + cursor: pointer; + position: absolute; + top: 50%; + transform: translateY(-50%); + right: 10px; + `,[U("arrow",` + font-size: var(--n-arrow-size); + color: var(--n-arrow-color); + transition: color .3s var(--n-bezier); + `)]),k("base-selection-overlay",` + display: flex; + align-items: center; + white-space: nowrap; + pointer-events: none; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--n-padding-single); + transition: color .3s var(--n-bezier); + `,[U("wrapper",` + flex-basis: 0; + flex-grow: 1; + overflow: hidden; + text-overflow: ellipsis; + `)]),k("base-selection-placeholder",` + color: var(--n-placeholder-color); + `,[U("inner",` + max-width: 100%; + overflow: hidden; + `)]),k("base-selection-tags",` + cursor: pointer; + outline: none; + box-sizing: border-box; + position: relative; + z-index: auto; + display: flex; + padding: var(--n-padding-multiple); + flex-wrap: wrap; + align-items: center; + width: 100%; + vertical-align: bottom; + background-color: var(--n-color); + border-radius: inherit; + transition: + color .3s var(--n-bezier), + box-shadow .3s var(--n-bezier), + background-color .3s var(--n-bezier); + `),k("base-selection-label",` + height: var(--n-height); + display: inline-flex; + width: 100%; + vertical-align: bottom; + cursor: pointer; + outline: none; + z-index: auto; + box-sizing: border-box; + position: relative; + transition: + color .3s var(--n-bezier), + box-shadow .3s var(--n-bezier), + background-color .3s var(--n-bezier); + border-radius: inherit; + background-color: var(--n-color); + align-items: center; + `,[k("base-selection-input",` + font-size: inherit; + line-height: inherit; + outline: none; + cursor: pointer; + box-sizing: border-box; + border:none; + width: 100%; + padding: var(--n-padding-single); + background-color: #0000; + color: var(--n-text-color); + transition: color .3s var(--n-bezier); + caret-color: var(--n-caret-color); + `,[U("content",` + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + `)]),U("render-label",` + color: var(--n-text-color); + `)]),it("disabled",[ce("&:hover",[U("state-border",` + box-shadow: var(--n-box-shadow-hover); + border: var(--n-border-hover); + `)]),X("focus",[U("state-border",` + box-shadow: var(--n-box-shadow-focus); + border: var(--n-border-focus); + `)]),X("active",[U("state-border",` + box-shadow: var(--n-box-shadow-active); + border: var(--n-border-active); + `),k("base-selection-label","background-color: var(--n-color-active);"),k("base-selection-tags","background-color: var(--n-color-active);")])]),X("disabled","cursor: not-allowed;",[U("arrow",` + color: var(--n-arrow-color-disabled); + `),k("base-selection-label",` + cursor: not-allowed; + background-color: var(--n-color-disabled); + `,[k("base-selection-input",` + cursor: not-allowed; + color: var(--n-text-color-disabled); + `),U("render-label",` + color: var(--n-text-color-disabled); + `)]),k("base-selection-tags",` + cursor: not-allowed; + background-color: var(--n-color-disabled); + `),k("base-selection-placeholder",` + cursor: not-allowed; + color: var(--n-placeholder-color-disabled); + `)]),k("base-selection-input-tag",` + height: calc(var(--n-height) - 6px); + line-height: calc(var(--n-height) - 6px); + outline: none; + display: none; + position: relative; + margin-bottom: 3px; + max-width: 100%; + vertical-align: bottom; + `,[U("input",` + font-size: inherit; + font-family: inherit; + min-width: 1px; + padding: 0; + background-color: #0000; + outline: none; + border: none; + max-width: 100%; + overflow: hidden; + width: 1em; + line-height: inherit; + cursor: pointer; + color: var(--n-text-color); + caret-color: var(--n-caret-color); + `),U("mirror",` + position: absolute; + left: 0; + top: 0; + white-space: pre; + visibility: hidden; + user-select: none; + -webkit-user-select: none; + opacity: 0; + `)]),["warning","error"].map(e=>X(`${e}-status`,[U("state-border",`border: var(--n-border-${e});`),it("disabled",[ce("&:hover",[U("state-border",` + box-shadow: var(--n-box-shadow-hover-${e}); + border: var(--n-border-hover-${e}); + `)]),X("active",[U("state-border",` + box-shadow: var(--n-box-shadow-active-${e}); + border: var(--n-border-active-${e}); + `),k("base-selection-label",`background-color: var(--n-color-active-${e});`),k("base-selection-tags",`background-color: var(--n-color-active-${e});`)]),X("focus",[U("state-border",` + box-shadow: var(--n-box-shadow-focus-${e}); + border: var(--n-border-focus-${e}); + `)])])]))]),k("base-selection-popover",` + margin-bottom: -3px; + display: flex; + flex-wrap: wrap; + margin-right: -8px; + `),k("base-selection-tag-wrapper",` + max-width: 100%; + display: inline-flex; + padding: 0 7px 3px 0; + `,[ce("&:last-child","padding-right: 0;"),k("tag",` + font-size: 14px; + max-width: 100%; + `,[U("content",` + line-height: 1.25; + text-overflow: ellipsis; + overflow: hidden; + `)])])]),Bn=le({name:"InternalSelection",props:Object.assign(Object.assign({},Ce.props),{clsPrefix:{type:String,required:!0},bordered:{type:Boolean,default:void 0},active:Boolean,pattern:{type:String,default:""},placeholder:String,selectedOption:{type:Object,default:null},selectedOptions:{type:Array,default:null},labelField:{type:String,default:"label"},valueField:{type:String,default:"value"},multiple:Boolean,filterable:Boolean,clearable:Boolean,disabled:Boolean,size:{type:String,default:"medium"},loading:Boolean,autofocus:Boolean,showArrow:{type:Boolean,default:!0},inputProps:Object,focused:Boolean,renderTag:Function,onKeydown:Function,onClick:Function,onBlur:Function,onFocus:Function,onDeleteOption:Function,maxTagCount:[String,Number],onClear:Function,onPatternInput:Function,onPatternFocus:Function,onPatternBlur:Function,renderLabel:Function,status:String,inlineThemeDisabled:Boolean,ignoreComposition:{type:Boolean,default:!0},onResize:Function}),setup(e){const o=P(null),s=P(null),d=P(null),f=P(null),x=P(null),C=P(null),i=P(null),g=P(null),h=P(null),F=P(null),y=P(!1),v=P(!1),b=P(!1),c=Ce("InternalSelection","-internal-selection",On,Xt,e,we(e,"clsPrefix")),p=I(()=>e.clearable&&!e.disabled&&(b.value||e.active)),z=I(()=>e.selectedOption?e.renderTag?e.renderTag({option:e.selectedOption,handleClose:()=>{}}):e.renderLabel?e.renderLabel(e.selectedOption,!0):We(e.selectedOption[e.labelField],e.selectedOption,!0):e.placeholder),T=I(()=>{const r=e.selectedOption;if(!!r)return r[e.labelField]}),R=I(()=>e.multiple?!!(Array.isArray(e.selectedOptions)&&e.selectedOptions.length):e.selectedOption!==null);function W(){var r;const{value:u}=o;if(u){const{value:$}=s;$&&($.style.width=`${u.offsetWidth}px`,e.maxTagCount!=="responsive"&&((r=h.value)===null||r===void 0||r.sync()))}}function Y(){const{value:r}=F;r&&(r.style.display="none")}function H(){const{value:r}=F;r&&(r.style.display="inline-block")}Ne(we(e,"active"),r=>{r||Y()}),Ne(we(e,"pattern"),()=>{e.multiple&&Ue(W)});function _(r){const{onFocus:u}=e;u&&u(r)}function L(r){const{onBlur:u}=e;u&&u(r)}function N(r){const{onDeleteOption:u}=e;u&&u(r)}function fe(r){const{onClear:u}=e;u&&u(r)}function ne(r){const{onPatternInput:u}=e;u&&u(r)}function se(r){var u;(!r.relatedTarget||!(!((u=d.value)===null||u===void 0)&&u.contains(r.relatedTarget)))&&_(r)}function V(r){var u;!((u=d.value)===null||u===void 0)&&u.contains(r.relatedTarget)||L(r)}function oe(r){fe(r)}function he(){b.value=!0}function ve(){b.value=!1}function J(r){!e.active||!e.filterable||r.target!==s.value&&r.preventDefault()}function K(r){N(r)}function G(r){if(r.key==="Backspace"&&!ae.value&&!e.pattern.length){const{selectedOptions:u}=e;u!=null&&u.length&&K(u[u.length-1])}}const ae=P(!1);let A=null;function xe(r){const{value:u}=o;if(u){const $=r.target.value;u.textContent=$,W()}e.ignoreComposition&&ae.value?A=r:ne(r)}function ee(){ae.value=!0}function ge(){ae.value=!1,e.ignoreComposition&&ne(A),A=null}function be(r){var u;v.value=!0,(u=e.onPatternFocus)===null||u===void 0||u.call(e,r)}function Z(r){var u;v.value=!1,(u=e.onPatternBlur)===null||u===void 0||u.call(e,r)}function pe(){var r,u;if(e.filterable)v.value=!1,(r=C.value)===null||r===void 0||r.blur(),(u=s.value)===null||u===void 0||u.blur();else if(e.multiple){const{value:$}=f;$==null||$.blur()}else{const{value:$}=x;$==null||$.blur()}}function re(){var r,u,$;e.filterable?(v.value=!1,(r=C.value)===null||r===void 0||r.focus()):e.multiple?(u=f.value)===null||u===void 0||u.focus():($=x.value)===null||$===void 0||$.focus()}function q(){const{value:r}=s;r&&(H(),r.focus())}function j(){const{value:r}=s;r&&r.blur()}function a(r){const{value:u}=i;u&&u.setTextContent(`+${r}`)}function m(){const{value:r}=g;return r}function ie(){return s.value}let te=null;function me(){te!==null&&window.clearTimeout(te)}function Te(){e.disabled||e.active||(me(),te=window.setTimeout(()=>{R.value&&(y.value=!0)},100))}function Ie(){me()}function _e(r){r||(me(),y.value=!1)}Ne(R,r=>{r||(y.value=!1)}),kt(()=>{He(()=>{const r=C.value;!r||(r.tabIndex=e.disabled||v.value?-1:0)})}),kn(d,e.onResize);const{inlineThemeDisabled:Fe}=e,Me=I(()=>{const{size:r}=e,{common:{cubicBezierEaseInOut:u},self:{borderRadius:$,color:Se,placeholderColor:$e,textColor:Ae,paddingSingle:je,paddingMultiple:Ee,caretColor:ke,colorDisabled:Pe,textColorDisabled:Oe,placeholderColorDisabled:Le,colorActive:Ve,boxShadowFocus:Be,boxShadowActive:ue,boxShadowHover:t,border:l,borderFocus:w,borderHover:B,borderActive:M,arrowColor:O,arrowColorDisabled:S,loadingColor:D,colorActiveWarning:ze,boxShadowFocusWarning:De,boxShadowActiveWarning:Qe,boxShadowHoverWarning:Ye,borderWarning:Ge,borderFocusWarning:Xe,borderHoverWarning:et,borderActiveWarning:tt,colorActiveError:nt,boxShadowFocusError:ot,boxShadowActiveError:At,boxShadowHoverError:jt,borderError:Et,borderFocusError:Lt,borderHoverError:Vt,borderActiveError:Dt,clearColor:Nt,clearColorHover:Ut,clearColorPressed:Wt,clearSize:Ht,arrowSize:Kt,[Q("height",r)]:qt,[Q("fontSize",r)]:Jt}}=c.value;return{"--n-bezier":u,"--n-border":l,"--n-border-active":M,"--n-border-focus":w,"--n-border-hover":B,"--n-border-radius":$,"--n-box-shadow-active":ue,"--n-box-shadow-focus":Be,"--n-box-shadow-hover":t,"--n-caret-color":ke,"--n-color":Se,"--n-color-active":Ve,"--n-color-disabled":Pe,"--n-font-size":Jt,"--n-height":qt,"--n-padding-single":je,"--n-padding-multiple":Ee,"--n-placeholder-color":$e,"--n-placeholder-color-disabled":Le,"--n-text-color":Ae,"--n-text-color-disabled":Oe,"--n-arrow-color":O,"--n-arrow-color-disabled":S,"--n-loading-color":D,"--n-color-active-warning":ze,"--n-box-shadow-focus-warning":De,"--n-box-shadow-active-warning":Qe,"--n-box-shadow-hover-warning":Ye,"--n-border-warning":Ge,"--n-border-focus-warning":Xe,"--n-border-hover-warning":et,"--n-border-active-warning":tt,"--n-color-active-error":nt,"--n-box-shadow-focus-error":ot,"--n-box-shadow-active-error":At,"--n-box-shadow-hover-error":jt,"--n-border-error":Et,"--n-border-focus-error":Lt,"--n-border-hover-error":Vt,"--n-border-active-error":Dt,"--n-clear-size":Ht,"--n-clear-color":Nt,"--n-clear-color-hover":Ut,"--n-clear-color-pressed":Wt,"--n-arrow-size":Kt}}),de=Fe?Ze("internal-selection",I(()=>e.size[0]),Me,e):void 0;return{mergedTheme:c,mergedClearable:p,patternInputFocused:v,filterablePlaceholder:z,label:T,selected:R,showTagsPanel:y,isComposing:ae,counterRef:i,counterWrapperRef:g,patternInputMirrorRef:o,patternInputRef:s,selfRef:d,multipleElRef:f,singleElRef:x,patternInputWrapperRef:C,overflowRef:h,inputTagElRef:F,handleMouseDown:J,handleFocusin:se,handleClear:oe,handleMouseEnter:he,handleMouseLeave:ve,handleDeleteOption:K,handlePatternKeyDown:G,handlePatternInputInput:xe,handlePatternInputBlur:Z,handlePatternInputFocus:be,handleMouseEnterCounter:Te,handleMouseLeaveCounter:Ie,handleFocusout:V,handleCompositionEnd:ge,handleCompositionStart:ee,onPopoverUpdateShow:_e,focus:re,focusInput:q,blur:pe,blurInput:j,updateCounter:a,getCounter:m,getTail:ie,renderLabel:e.renderLabel,cssVars:Fe?void 0:Me,themeClass:de==null?void 0:de.themeClass,onRender:de==null?void 0:de.onRender}},render(){const{status:e,multiple:o,size:s,disabled:d,filterable:f,maxTagCount:x,bordered:C,clsPrefix:i,onRender:g,renderTag:h,renderLabel:F}=this;g==null||g();const y=x==="responsive",v=typeof x=="number",b=y||v,c=n(tn,null,{default:()=>n(en,{clsPrefix:i,loading:this.loading,showArrow:this.showArrow,showClear:this.mergedClearable&&this.selected,onClear:this.handleClear},{default:()=>{var z,T;return(T=(z=this.$slots).arrow)===null||T===void 0?void 0:T.call(z)}})});let p;if(o){const{labelField:z}=this,T=V=>n("div",{class:`${i}-base-selection-tag-wrapper`,key:V.value},h?h({option:V,handleClose:()=>this.handleDeleteOption(V)}):n(at,{size:s,closable:!V.disabled,disabled:d,onClose:()=>this.handleDeleteOption(V),internalCloseIsButtonTag:!1,internalCloseFocusable:!1},{default:()=>F?F(V,!0):We(V[z],V,!0)})),R=()=>(v?this.selectedOptions.slice(0,x):this.selectedOptions).map(T),W=f?n("div",{class:`${i}-base-selection-input-tag`,ref:"inputTagElRef",key:"__input-tag__"},n("input",Object.assign({},this.inputProps,{ref:"patternInputRef",tabindex:-1,disabled:d,value:this.pattern,autofocus:this.autofocus,class:`${i}-base-selection-input-tag__input`,onBlur:this.handlePatternInputBlur,onFocus:this.handlePatternInputFocus,onKeydown:this.handlePatternKeyDown,onInput:this.handlePatternInputInput,onCompositionstart:this.handleCompositionStart,onCompositionend:this.handleCompositionEnd})),n("span",{ref:"patternInputMirrorRef",class:`${i}-base-selection-input-tag__mirror`},this.pattern)):null,Y=y?()=>n("div",{class:`${i}-base-selection-tag-wrapper`,ref:"counterWrapperRef"},n(at,{size:s,ref:"counterRef",onMouseenter:this.handleMouseEnterCounter,onMouseleave:this.handleMouseLeaveCounter,disabled:d})):void 0;let H;if(v){const V=this.selectedOptions.length-x;V>0&&(H=n("div",{class:`${i}-base-selection-tag-wrapper`,key:"__counter__"},n(at,{size:s,ref:"counterRef",onMouseenter:this.handleMouseEnterCounter,disabled:d},{default:()=>`+${V}`})))}const _=y?f?n(bt,{ref:"overflowRef",updateCounter:this.updateCounter,getCounter:this.getCounter,getTail:this.getTail,style:{width:"100%",display:"flex",overflow:"hidden"}},{default:R,counter:Y,tail:()=>W}):n(bt,{ref:"overflowRef",updateCounter:this.updateCounter,getCounter:this.getCounter,style:{width:"100%",display:"flex",overflow:"hidden"}},{default:R,counter:Y}):v?R().concat(H):R(),L=b?()=>n("div",{class:`${i}-base-selection-popover`},y?R():this.selectedOptions.map(T)):void 0,N=b?{show:this.showTagsPanel,trigger:"hover",overlap:!0,placement:"top",width:"trigger",onUpdateShow:this.onPopoverUpdateShow,theme:this.mergedTheme.peers.Popover,themeOverrides:this.mergedTheme.peerOverrides.Popover}:null,ne=(this.selected?!1:this.active?!this.pattern&&!this.isComposing:!0)?n("div",{class:`${i}-base-selection-placeholder ${i}-base-selection-overlay`},n("div",{class:`${i}-base-selection-placeholder__inner`},this.placeholder)):null,se=f?n("div",{ref:"patternInputWrapperRef",class:`${i}-base-selection-tags`},_,y?null:W,c):n("div",{ref:"multipleElRef",class:`${i}-base-selection-tags`,tabindex:d?void 0:0},_,c);p=n(lt,null,b?n(Pt,Object.assign({},N,{scrollable:!0,style:"max-height: calc(var(--v-target-height) * 6.6);"}),{trigger:()=>se,default:L}):se,ne)}else if(f){const z=this.pattern||this.isComposing,T=this.active?!z:!this.selected,R=this.active?!1:this.selected;p=n("div",{ref:"patternInputWrapperRef",class:`${i}-base-selection-label`},n("input",Object.assign({},this.inputProps,{ref:"patternInputRef",class:`${i}-base-selection-input`,value:this.active?this.pattern:"",placeholder:"",readonly:d,disabled:d,tabindex:-1,autofocus:this.autofocus,onFocus:this.handlePatternInputFocus,onBlur:this.handlePatternInputBlur,onInput:this.handlePatternInputInput,onCompositionstart:this.handleCompositionStart,onCompositionend:this.handleCompositionEnd})),R?n("div",{class:`${i}-base-selection-label__render-label ${i}-base-selection-overlay`,key:"input"},n("div",{class:`${i}-base-selection-overlay__wrapper`},h?h({option:this.selectedOption,handleClose:()=>{}}):F?F(this.selectedOption,!0):We(this.label,this.selectedOption,!0))):null,T?n("div",{class:`${i}-base-selection-placeholder ${i}-base-selection-overlay`,key:"placeholder"},n("div",{class:`${i}-base-selection-overlay__wrapper`},this.filterablePlaceholder)):null,c)}else p=n("div",{ref:"singleElRef",class:`${i}-base-selection-label`,tabindex:this.disabled?void 0:0},this.label!==void 0?n("div",{class:`${i}-base-selection-input`,title:nn(this.label),key:"input"},n("div",{class:`${i}-base-selection-input__content`},h?h({option:this.selectedOption,handleClose:()=>{}}):F?F(this.selectedOption,!0):We(this.label,this.selectedOption,!0))):n("div",{class:`${i}-base-selection-placeholder ${i}-base-selection-overlay`,key:"placeholder"},n("div",{class:`${i}-base-selection-placeholder__inner`},this.placeholder)),c);return n("div",{ref:"selfRef",class:[`${i}-base-selection`,this.themeClass,e&&`${i}-base-selection--${e}-status`,{[`${i}-base-selection--active`]:this.active,[`${i}-base-selection--selected`]:this.selected||this.active&&this.pattern,[`${i}-base-selection--disabled`]:this.disabled,[`${i}-base-selection--multiple`]:this.multiple,[`${i}-base-selection--focus`]:this.focused}],style:this.cssVars,onClick:this.onClick,onMouseenter:this.handleMouseEnter,onMouseleave:this.handleMouseLeave,onKeydown:this.onKeydown,onFocusin:this.handleFocusin,onFocusout:this.handleFocusout,onMousedown:this.handleMouseDown},p,C?n("div",{class:`${i}-base-selection__border`}):null,C?n("div",{class:`${i}-base-selection__state-border`}):null)}});function Je(e){return e.type==="group"}function It(e){return e.type==="ignored"}function rt(e,o){try{return!!(1+o.toString().toLowerCase().indexOf(e.trim().toLowerCase()))}catch{return!1}}function _t(e,o){return{getIsGroup:Je,getIgnored:It,getKey(d){return Je(d)?d.name||d.key||"key-required":d[e]},getChildren(d){return d[o]}}}function zn(e,o,s,d){if(!o)return e;function f(x){if(!Array.isArray(x))return[];const C=[];for(const i of x)if(Je(i)){const g=f(i[d]);g.length&&C.push(Object.assign({},i,{[d]:g}))}else{if(It(i))continue;o(s,i)&&C.push(i)}return C}return f(e)}function Rn(e,o,s){const d=new Map;return e.forEach(f=>{Je(f)?f[s].forEach(x=>{d.set(x[o],x)}):d.set(f[o],f)}),d}const $t=on("n-popselect");var Tn=k("popselect-menu",` + box-shadow: var(--n-menu-box-shadow); +`);const ut={multiple:Boolean,value:{type:[String,Number,Array],default:null},cancelable:Boolean,options:{type:Array,default:()=>[]},size:{type:String,default:"medium"},scrollable:Boolean,"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],onMouseenter:Function,onMouseleave:Function,renderLabel:Function,showCheckmark:{type:Boolean,default:void 0},nodeProps:Function,virtualScroll:Boolean,onChange:[Function,Array]},yt=rn(ut);var In=le({name:"PopselectPanel",props:ut,setup(e){const o=an($t),{mergedClsPrefixRef:s,inlineThemeDisabled:d}=dt(e),f=Ce("Popselect","-pop-select",Tn,Ot,o.props,s),x=I(()=>Bt(e.options,_t("value","children")));function C(v,b){const{onUpdateValue:c,"onUpdate:value":p,onChange:z}=e;c&&E(c,v,b),p&&E(p,v,b),z&&E(z,v,b)}function i(v){h(v.key)}function g(v){st(v,"action")||v.preventDefault()}function h(v){const{value:{getNode:b}}=x;if(e.multiple)if(Array.isArray(e.value)){const c=[],p=[];let z=!0;e.value.forEach(T=>{if(T===v){z=!1;return}const R=b(T);R&&(c.push(R.key),p.push(R.rawNode))}),z&&(c.push(v),p.push(b(v).rawNode)),C(c,p)}else{const c=b(v);c&&C([v],[c.rawNode])}else if(e.value===v&&e.cancelable)C(null,null);else{const c=b(v);c&&C(v,c.rawNode);const{"onUpdate:show":p,onUpdateShow:z}=o.props;p&&E(p,!1),z&&E(z,!1),o.setShow(!1)}Ue(()=>{o.syncPosition()})}Ne(we(e,"options"),()=>{Ue(()=>{o.syncPosition()})});const F=I(()=>{const{self:{menuBoxShadow:v}}=f.value;return{"--n-menu-box-shadow":v}}),y=d?Ze("select",void 0,F,o.props):void 0;return{mergedTheme:o.mergedThemeRef,mergedClsPrefix:s,treeMate:x,handleToggle:i,handleMenuMousedown:g,cssVars:d?void 0:F,themeClass:y==null?void 0:y.themeClass,onRender:y==null?void 0:y.onRender}},render(){var e;return(e=this.onRender)===null||e===void 0||e.call(this),n(Tt,{clsPrefix:this.mergedClsPrefix,focusable:!0,nodeProps:this.nodeProps,class:[`${this.mergedClsPrefix}-popselect-menu`,this.themeClass],style:this.cssVars,theme:this.mergedTheme.peers.InternalSelectMenu,themeOverrides:this.mergedTheme.peerOverrides.InternalSelectMenu,multiple:this.multiple,treeMate:this.treeMate,size:this.size,value:this.value,virtualScroll:this.virtualScroll,scrollable:this.scrollable,renderLabel:this.renderLabel,onToggle:this.handleToggle,onMouseenter:this.onMouseenter,onMouseleave:this.onMouseenter,onMousedown:this.handleMenuMousedown,showCheckmark:this.showCheckmark},{action:()=>{var o,s;return((s=(o=this.$slots).action)===null||s===void 0?void 0:s.call(o))||[]},empty:()=>{var o,s;return((s=(o=this.$slots).empty)===null||s===void 0?void 0:s.call(o))||[]}})}});const _n=Object.assign(Object.assign(Object.assign(Object.assign({},Ce.props),zt(ct,["showArrow","arrow"])),{placement:Object.assign(Object.assign({},ct.placement),{default:"bottom"}),trigger:{type:String,default:"hover"}}),ut);var $n=le({name:"Popselect",props:_n,inheritAttrs:!1,__popover__:!0,setup(e){const o=Ce("Popselect","-popselect",void 0,Ot,e),s=P(null);function d(){var C;(C=s.value)===null||C===void 0||C.syncPosition()}function f(C){var i;(i=s.value)===null||i===void 0||i.setShow(C)}return ln($t,{props:e,mergedThemeRef:o,syncPosition:d,setShow:f}),Object.assign(Object.assign({},{syncPosition:d,setShow:f}),{popoverInstRef:s,mergedTheme:o})},render(){const{mergedTheme:e}=this,o={theme:e.peers.Popover,themeOverrides:e.peerOverrides.Popover,builtinThemeOverrides:{padding:"0"},ref:"popoverInstRef",internalRenderBody:(s,d,f,x,C)=>{const{$attrs:i}=this;return n(In,Object.assign({},i,{class:[i.class,s],style:[i.style,f]},sn(this.$props,yt),{ref:dn(d),onMouseenter:vt([x,i.onMouseenter]),onMouseleave:vt([C,i.onMouseleave])}),{action:()=>{var g,h;return(h=(g=this.$slots).action)===null||h===void 0?void 0:h.call(g)},empty:()=>{var g,h;return(h=(g=this.$slots).empty)===null||h===void 0?void 0:h.call(g)}})}};return n(Pt,Object.assign({},zt(this.$props,yt),o,{internalDeactivateImmediately:!0}),{trigger:()=>{var s,d;return(d=(s=this.$slots).default)===null||d===void 0?void 0:d.call(s)}})}}),An=ce([k("select",` + z-index: auto; + outline: none; + width: 100%; + position: relative; + `),k("select-menu",` + margin: 4px 0; + box-shadow: var(--n-menu-box-shadow); + `,[un({originalTransition:"background-color .3s var(--n-bezier), box-shadow .3s var(--n-bezier)"})])]);const jn=Object.assign(Object.assign({},Ce.props),{to:qe.propTo,bordered:{type:Boolean,default:void 0},clearable:Boolean,clearFilterAfterSelect:{type:Boolean,default:!0},options:{type:Array,default:()=>[]},defaultValue:{type:[String,Number,Array],default:null},value:[String,Number,Array],placeholder:String,menuProps:Object,multiple:Boolean,size:String,filterable:Boolean,disabled:{type:Boolean,default:void 0},remote:Boolean,loading:Boolean,filter:Function,placement:{type:String,default:"bottom-start"},widthMode:{type:String,default:"trigger"},tag:Boolean,onCreate:Function,fallbackOption:{type:[Function,Boolean],default:void 0},show:{type:Boolean,default:void 0},showArrow:{type:Boolean,default:!0},maxTagCount:[Number,String],consistentMenuWidth:{type:Boolean,default:!0},virtualScroll:{type:Boolean,default:!0},labelField:{type:String,default:"label"},valueField:{type:String,default:"value"},childrenField:{type:String,default:"children"},renderLabel:Function,renderOption:Function,renderTag:Function,"onUpdate:value":[Function,Array],inputProps:Object,nodeProps:Function,ignoreComposition:{type:Boolean,default:!0},showOnFocus:Boolean,onUpdateValue:[Function,Array],onBlur:[Function,Array],onClear:[Function,Array],onFocus:[Function,Array],onScroll:[Function,Array],onSearch:[Function,Array],onUpdateShow:[Function,Array],"onUpdate:show":[Function,Array],displayDirective:{type:String,default:"show"},resetMenuOnOptionsChange:{type:Boolean,default:!0},status:String,showCheckmark:{type:Boolean,default:!0},onChange:[Function,Array],items:Array});var En=le({name:"Select",props:jn,setup(e){const{mergedClsPrefixRef:o,mergedBorderedRef:s,namespaceRef:d,inlineThemeDisabled:f}=dt(e),x=Ce("Select","-select",An,cn,e,o),C=P(e.defaultValue),i=we(e,"value"),g=Ke(i,C),h=P(!1),F=P(""),y=I(()=>{const{valueField:t,childrenField:l}=e,w=_t(t,l);return Bt(V.value,w)}),v=I(()=>Rn(ne.value,e.valueField,e.childrenField)),b=P(!1),c=Ke(we(e,"show"),b),p=P(null),z=P(null),T=P(null),{localeRef:R}=Rt("Select"),W=I(()=>{var t;return(t=e.placeholder)!==null&&t!==void 0?t:R.value.placeholder}),Y=fn(e,["items","options"]),H=[],_=P([]),L=P([]),N=P(new Map),fe=I(()=>{const{fallbackOption:t}=e;if(t===void 0){const{labelField:l,valueField:w}=e;return B=>({[l]:String(B),[w]:B})}return t===!1?!1:l=>Object.assign(t(l),{value:l})}),ne=I(()=>L.value.concat(_.value).concat(Y.value)),se=I(()=>{const{filter:t}=e;if(t)return t;const{labelField:l,valueField:w}=e;return(B,M)=>{if(!M)return!1;const O=M[l];if(typeof O=="string")return rt(B,O);const S=M[w];return typeof S=="string"?rt(B,S):typeof S=="number"?rt(B,String(S)):!1}}),V=I(()=>{if(e.remote)return Y.value;{const{value:t}=ne,{value:l}=F;return!l.length||!e.filterable?t:zn(t,se.value,l,e.childrenField)}});function oe(t){const l=e.remote,{value:w}=N,{value:B}=v,{value:M}=fe,O=[];return t.forEach(S=>{if(B.has(S))O.push(B.get(S));else if(l&&w.has(S))O.push(w.get(S));else if(M){const D=M(S);D&&O.push(D)}}),O}const he=I(()=>{if(e.multiple){const{value:t}=g;return Array.isArray(t)?oe(t):[]}return null}),ve=I(()=>{const{value:t}=g;return!e.multiple&&!Array.isArray(t)?t===null?null:oe([t])[0]||null:null}),J=hn(e),{mergedSizeRef:K,mergedDisabledRef:G,mergedStatusRef:ae}=J;function A(t,l){const{onChange:w,"onUpdate:value":B,onUpdateValue:M}=e,{nTriggerFormChange:O,nTriggerFormInput:S}=J;w&&E(w,t,l),M&&E(M,t,l),B&&E(B,t,l),C.value=t,O(),S()}function xe(t){const{onBlur:l}=e,{nTriggerFormBlur:w}=J;l&&E(l,t),w()}function ee(){const{onClear:t}=e;t&&E(t)}function ge(t){const{onFocus:l,showOnFocus:w}=e,{nTriggerFormFocus:B}=J;l&&E(l,t),B(),w&&q()}function be(t){const{onSearch:l}=e;l&&E(l,t)}function Z(t){const{onScroll:l}=e;l&&E(l,t)}function pe(){var t;const{remote:l,multiple:w}=e;if(l){const{value:B}=N;if(w){const{valueField:M}=e;(t=he.value)===null||t===void 0||t.forEach(O=>{B.set(O[M],O)})}else{const M=ve.value;M&&B.set(M[e.valueField],M)}}}function re(t){const{onUpdateShow:l,"onUpdate:show":w}=e;l&&E(l,t),w&&E(w,t),b.value=t}function q(){G.value||(re(!0),b.value=!0,e.filterable&&Oe())}function j(){re(!1)}function a(){F.value="",L.value=H}const m=P(!1);function ie(){e.filterable&&(m.value=!0)}function te(){e.filterable&&(m.value=!1,c.value||a())}function me(){G.value||(c.value?e.filterable?Oe():j():q())}function Te(t){var l,w;!((w=(l=T.value)===null||l===void 0?void 0:l.selfRef)===null||w===void 0)&&w.contains(t.relatedTarget)||(h.value=!1,xe(t),j())}function Ie(t){ge(t),h.value=!0}function _e(t){h.value=!0}function Fe(t){var l;!((l=p.value)===null||l===void 0)&&l.$el.contains(t.relatedTarget)||(h.value=!1,xe(t),j())}function Me(){var t;(t=p.value)===null||t===void 0||t.focus(),j()}function de(t){var l;c.value&&(!((l=p.value)===null||l===void 0)&&l.$el.contains(xn(t))||j())}function r(t){if(!Array.isArray(t))return[];if(fe.value)return Array.from(t);{const{remote:l}=e,{value:w}=v;if(l){const{value:B}=N;return t.filter(M=>w.has(M)||B.has(M))}else return t.filter(B=>w.has(B))}}function u(t){$(t.rawNode)}function $(t){if(G.value)return;const{tag:l,remote:w,clearFilterAfterSelect:B,valueField:M}=e;if(l&&!w){const{value:O}=L,S=O[0]||null;if(S){const D=_.value;D.length?D.push(S):_.value=[S],L.value=H}}if(w&&N.value.set(t[M],t),e.multiple){const O=r(g.value),S=O.findIndex(D=>D===t[M]);if(~S){if(O.splice(S,1),l&&!w){const D=Se(t[M]);~D&&(_.value.splice(D,1),B&&(F.value=""))}}else O.push(t[M]),B&&(F.value="");A(O,oe(O))}else{if(l&&!w){const O=Se(t[M]);~O?_.value=[_.value[O]]:_.value=H}Pe(),j(),A(t[M],t)}}function Se(t){return _.value.findIndex(w=>w[e.valueField]===t)}function $e(t){c.value||q();const{value:l}=t.target;F.value=l;const{tag:w,remote:B}=e;if(be(l),w&&!B){if(!l){L.value=H;return}const{onCreate:M}=e,O=M?M(l):{[e.labelField]:l,[e.valueField]:l},{valueField:S}=e;Y.value.some(D=>D[S]===O[S])||_.value.some(D=>D[S]===O[S])?L.value=H:L.value=[O]}}function Ae(t){t.stopPropagation();const{multiple:l}=e;!l&&e.filterable&&j(),ee(),l?A([],[]):A(null,null)}function je(t){!st(t,"action")&&!st(t,"empty")&&t.preventDefault()}function Ee(t){Z(t)}function ke(t){var l,w,B,M,O;switch(t.key){case" ":if(e.filterable)break;t.preventDefault();case"Enter":if(!(!((l=p.value)===null||l===void 0)&&l.isComposing)){if(c.value){const S=(w=T.value)===null||w===void 0?void 0:w.getPendingTmNode();S?u(S):e.filterable||(j(),Pe())}else if(q(),e.tag&&m.value){const S=L.value[0];if(S){const D=S[e.valueField],{value:ze}=g;e.multiple&&Array.isArray(ze)&&ze.some(De=>De===D)||$(S)}}}t.preventDefault();break;case"ArrowUp":if(t.preventDefault(),e.loading)return;c.value&&((B=T.value)===null||B===void 0||B.prev());break;case"ArrowDown":if(t.preventDefault(),e.loading)return;c.value?(M=T.value)===null||M===void 0||M.next():q();break;case"Escape":c.value&&(yn(t),j()),(O=p.value)===null||O===void 0||O.focus();break}}function Pe(){var t;(t=p.value)===null||t===void 0||t.focus()}function Oe(){var t;(t=p.value)===null||t===void 0||t.focusInput()}function Le(){var t;!c.value||(t=z.value)===null||t===void 0||t.syncPosition()}pe(),Ne(we(e,"options"),pe);const Ve={focus:()=>{var t;(t=p.value)===null||t===void 0||t.focus()},blur:()=>{var t;(t=p.value)===null||t===void 0||t.blur()}},Be=I(()=>{const{self:{menuBoxShadow:t}}=x.value;return{"--n-menu-box-shadow":t}}),ue=f?Ze("select",void 0,Be,e):void 0;return Object.assign(Object.assign({},Ve),{mergedStatus:ae,mergedClsPrefix:o,mergedBordered:s,namespace:d,treeMate:y,isMounted:vn(),triggerRef:p,menuRef:T,pattern:F,uncontrolledShow:b,mergedShow:c,adjustedTo:qe(e),uncontrolledValue:C,mergedValue:g,followerRef:z,localizedPlaceholder:W,selectedOption:ve,selectedOptions:he,mergedSize:K,mergedDisabled:G,focused:h,activeWithoutMenuOpen:m,inlineThemeDisabled:f,onTriggerInputFocus:ie,onTriggerInputBlur:te,handleTriggerOrMenuResize:Le,handleMenuFocus:_e,handleMenuBlur:Fe,handleMenuTabOut:Me,handleTriggerClick:me,handleToggle:u,handleDeleteOption:$,handlePatternInput:$e,handleClear:Ae,handleTriggerBlur:Te,handleTriggerFocus:Ie,handleKeydown:ke,handleMenuAfterLeave:a,handleMenuClickOutside:de,handleMenuScroll:Ee,handleMenuKeydown:ke,handleMenuMousedown:je,mergedTheme:x,cssVars:f?void 0:Be,themeClass:ue==null?void 0:ue.themeClass,onRender:ue==null?void 0:ue.onRender})},render(){return n("div",{class:`${this.mergedClsPrefix}-select`},n(gn,null,{default:()=>[n(bn,null,{default:()=>n(Bn,{ref:"triggerRef",inlineThemeDisabled:this.inlineThemeDisabled,status:this.mergedStatus,inputProps:this.inputProps,clsPrefix:this.mergedClsPrefix,showArrow:this.showArrow,maxTagCount:this.maxTagCount,bordered:this.mergedBordered,active:this.activeWithoutMenuOpen||this.mergedShow,pattern:this.pattern,placeholder:this.localizedPlaceholder,selectedOption:this.selectedOption,selectedOptions:this.selectedOptions,multiple:this.multiple,renderTag:this.renderTag,renderLabel:this.renderLabel,filterable:this.filterable,clearable:this.clearable,disabled:this.mergedDisabled,size:this.mergedSize,theme:this.mergedTheme.peers.InternalSelection,labelField:this.labelField,valueField:this.valueField,themeOverrides:this.mergedTheme.peerOverrides.InternalSelection,loading:this.loading,focused:this.focused,onClick:this.handleTriggerClick,onDeleteOption:this.handleDeleteOption,onPatternInput:this.handlePatternInput,onClear:this.handleClear,onBlur:this.handleTriggerBlur,onFocus:this.handleTriggerFocus,onKeydown:this.handleKeydown,onPatternBlur:this.onTriggerInputBlur,onPatternFocus:this.onTriggerInputFocus,onResize:this.handleTriggerOrMenuResize,ignoreComposition:this.ignoreComposition},{arrow:()=>{var e,o;return[(o=(e=this.$slots).arrow)===null||o===void 0?void 0:o.call(e)]}})}),n(pn,{ref:"followerRef",show:this.mergedShow,to:this.adjustedTo,teleportDisabled:this.adjustedTo===qe.tdkey,containerClass:this.namespace,width:this.consistentMenuWidth?"target":void 0,minWidth:"target",placement:this.placement},{default:()=>n(mn,{name:"fade-in-scale-up-transition",appear:this.isMounted,onAfterLeave:this.handleMenuAfterLeave},{default:()=>{var e,o,s;return this.mergedShow||this.displayDirective==="show"?((e=this.onRender)===null||e===void 0||e.call(this),wn(n(Tt,Object.assign({},this.menuProps,{ref:"menuRef",onResize:this.handleTriggerOrMenuResize,inlineThemeDisabled:this.inlineThemeDisabled,virtualScroll:this.consistentMenuWidth&&this.virtualScroll,class:[`${this.mergedClsPrefix}-select-menu`,this.themeClass,(o=this.menuProps)===null||o===void 0?void 0:o.class],clsPrefix:this.mergedClsPrefix,focusable:!0,labelField:this.labelField,valueField:this.valueField,autoPending:!0,nodeProps:this.nodeProps,theme:this.mergedTheme.peers.InternalSelectMenu,themeOverrides:this.mergedTheme.peerOverrides.InternalSelectMenu,treeMate:this.treeMate,multiple:this.multiple,size:"medium",renderOption:this.renderOption,renderLabel:this.renderLabel,value:this.mergedValue,style:[(s=this.menuProps)===null||s===void 0?void 0:s.style,this.cssVars],onToggle:this.handleToggle,onScroll:this.handleMenuScroll,onFocus:this.handleMenuFocus,onBlur:this.handleMenuBlur,onKeydown:this.handleMenuKeydown,onTabOut:this.handleMenuTabOut,onMousedown:this.handleMenuMousedown,show:this.mergedShow,showCheckmark:this.showCheckmark,resetMenuOnOptionsChange:this.resetMenuOnOptionsChange}),{empty:()=>{var d,f;return[(f=(d=this.$slots).empty)===null||f===void 0?void 0:f.call(d)]},action:()=>{var d,f;return[(f=(d=this.$slots).action)===null||f===void 0?void 0:f.call(d)]}}),this.displayDirective==="show"?[[Cn,this.mergedShow],[ft,this.handleMenuClickOutside,void 0,{capture:!0}]]:[[ft,this.handleMenuClickOutside,void 0,{capture:!0}]])):null}})})]}))}});function Ln(e,o,s){let d=!1,f=!1,x=1,C=o;if(o===1)return{hasFastBackward:!1,hasFastForward:!1,fastForwardTo:C,fastBackwardTo:x,items:[{type:"page",label:1,active:e===1,mayBeFastBackward:!1,mayBeFastForward:!1}]};if(o===2)return{hasFastBackward:!1,hasFastForward:!1,fastForwardTo:C,fastBackwardTo:x,items:[{type:"page",label:1,active:e===1,mayBeFastBackward:!1,mayBeFastForward:!1},{type:"page",label:2,active:e===2,mayBeFastBackward:!0,mayBeFastForward:!1}]};const i=1,g=o;let h=e,F=e;const y=(s-5)/2;F+=Math.ceil(y),F=Math.min(Math.max(F,i+s-3),g-2),h-=Math.floor(y),h=Math.max(Math.min(h,g-s+3),i+2);let v=!1,b=!1;h>i+2&&(v=!0),F=i+1&&c.push({type:"page",label:i+1,mayBeFastBackward:!0,mayBeFastForward:!1,active:e===i+1});for(let p=h;p<=F;++p)c.push({type:"page",label:p,mayBeFastBackward:!1,mayBeFastForward:!1,active:e===p});return b?(f=!0,C=F+1,c.push({type:"fast-forward",active:!1,label:void 0,options:Ft(F+1,g-1)})):F===g-2&&c[c.length-1].label!==g-1&&c.push({type:"page",mayBeFastForward:!0,mayBeFastBackward:!1,label:g-1,active:e===g-1}),c[c.length-1].label!==g&&c.push({type:"page",mayBeFastForward:!1,mayBeFastBackward:!1,label:g,active:e===g}),{hasFastBackward:d,hasFastForward:f,fastBackwardTo:x,fastForwardTo:C,items:c}}function Ft(e,o){const s=[];for(let d=e;d<=o;++d)s.push({label:`${d}`,value:d});return s}const Mt=` + background: var(--n-item-color-hover); + color: var(--n-item-text-color-hover); + border: var(--n-item-border-hover); +`,St=[X("button",` + background: var(--n-button-color-hover); + border: var(--n-button-border-hover); + color: var(--n-button-icon-color-hover); + `)];var Vn=k("pagination",` + display: flex; + vertical-align: middle; + font-size: var(--n-item-font-size); + flex-wrap: nowrap; +`,[k("pagination-prefix",` + display: flex; + align-items: center; + margin: var(--n-prefix-margin); + `),k("pagination-suffix",` + display: flex; + align-items: center; + margin: var(--n-suffix-margin); + `),ce("> *:not(:first-child)",` + margin: var(--n-item-margin); + `),k("select",` + width: var(--n-select-width); + `),ce("&.transition-disabled",[k("pagination-item","transition: none!important;")]),k("pagination-quick-jumper",` + white-space: nowrap; + display: flex; + color: var(--n-jumper-text-color); + transition: color .3s var(--n-bezier); + align-items: center; + font-size: var(--n-jumper-font-size); + `,[k("input",` + margin: var(--n-input-margin); + width: var(--n-input-width); + `)]),k("pagination-item",` + position: relative; + cursor: pointer; + user-select: none; + -webkit-user-select: none; + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + min-width: var(--n-item-size); + height: var(--n-item-size); + padding: var(--n-item-padding); + background-color: var(--n-item-color); + color: var(--n-item-text-color); + border-radius: var(--n-item-border-radius); + border: var(--n-item-border); + fill: var(--n-button-icon-color); + transition: + color .3s var(--n-bezier), + border-color .3s var(--n-bezier), + background-color .3s var(--n-bezier), + fill .3s var(--n-bezier); + `,[X("button",` + background: var(--n-button-color); + color: var(--n-button-icon-color); + border: var(--n-button-border); + padding: 0; + `,[k("base-icon",` + font-size: var(--n-button-icon-size); + `)]),it("disabled",[X("hover",Mt,St),ce("&:hover",Mt,St),ce("&:active",` + background: var(--n-item-color-pressed); + color: var(--n-item-text-color-pressed); + border: var(--n-item-border-pressed); + `,[X("button",` + background: var(--n-button-color-pressed); + border: var(--n-button-border-pressed); + color: var(--n-button-icon-color-pressed); + `)]),X("active",` + background: var(--n-item-color-active); + color: var(--n-item-text-color-active); + border: var(--n-item-border-active); + `,[ce("&:hover",` + background: var(--n-item-color-active-hover); + `)])]),X("disabled",` + cursor: not-allowed; + color: var(--n-item-text-color-disabled); + `,[X("active, button",` + background-color: var(--n-item-color-disabled); + border: var(--n-item-border-disabled); + `)])]),X("disabled",` + cursor: not-allowed; + `,[k("pagination-quick-jumper",` + color: var(--n-jumper-text-color-disabled); + `)]),X("simple",` + display: flex; + align-items: center; + flex-wrap: nowrap; + `,[k("pagination-quick-jumper",[k("input",` + margin: 0; + `)])])]);const Dn=Object.assign(Object.assign({},Ce.props),{simple:Boolean,page:Number,defaultPage:{type:Number,default:1},itemCount:Number,pageCount:Number,defaultPageCount:{type:Number,default:1},showSizePicker:Boolean,pageSize:Number,defaultPageSize:Number,pageSizes:{type:Array,default(){return[10]}},showQuickJumper:Boolean,size:{type:String,default:"medium"},disabled:Boolean,pageSlot:{type:Number,default:9},selectProps:Object,prev:Function,next:Function,goto:Function,prefix:Function,suffix:Function,label:Function,displayOrder:{type:Array,default:["pages","size-picker","quick-jumper"]},to:qe.propTo,"onUpdate:page":[Function,Array],onUpdatePage:[Function,Array],"onUpdate:pageSize":[Function,Array],onUpdatePageSize:[Function,Array],onPageSizeChange:[Function,Array],onChange:[Function,Array]});var Wn=le({name:"Pagination",props:Dn,setup(e){const{mergedComponentPropsRef:o,mergedClsPrefixRef:s,inlineThemeDisabled:d,mergedRtlRef:f}=dt(e),x=Ce("Pagination","-pagination",Vn,Fn,e,s),{localeRef:C}=Rt("Pagination"),i=P(null),g=P(e.defaultPage),F=P((()=>{const{defaultPageSize:a}=e;if(a!==void 0)return a;const m=e.pageSizes[0];return typeof m=="number"?m:m.value||10})()),y=Ke(we(e,"page"),g),v=Ke(we(e,"pageSize"),F),b=I(()=>{const{itemCount:a}=e;if(a!==void 0)return Math.max(1,Math.ceil(a/v.value));const{pageCount:m}=e;return m!==void 0?Math.max(m,1):1}),c=P("");He(()=>{e.simple,c.value=String(y.value)});const p=P(!1),z=P(!1),T=P(!1),R=P(!1),W=()=>{e.disabled||(p.value=!0,J())},Y=()=>{e.disabled||(p.value=!1,J())},H=()=>{z.value=!0,J()},_=()=>{z.value=!1,J()},L=a=>{K(a)},N=I(()=>Ln(y.value,b.value,e.pageSlot));He(()=>{N.value.hasFastBackward?N.value.hasFastForward||(p.value=!1,T.value=!1):(z.value=!1,R.value=!1)});const fe=I(()=>{const a=C.value.selectionSuffix;return e.pageSizes.map(m=>typeof m=="number"?{label:`${m} / ${a}`,value:m}:m)}),ne=I(()=>{var a,m;return((m=(a=o==null?void 0:o.value)===null||a===void 0?void 0:a.Pagination)===null||m===void 0?void 0:m.inputSize)||gt(e.size)}),se=I(()=>{var a,m;return((m=(a=o==null?void 0:o.value)===null||a===void 0?void 0:a.Pagination)===null||m===void 0?void 0:m.selectSize)||gt(e.size)}),V=I(()=>(y.value-1)*v.value),oe=I(()=>{const a=y.value*v.value-1,{itemCount:m}=e;return m!==void 0&&a>m-1?m-1:a}),he=I(()=>{const{itemCount:a}=e;return a!==void 0?a:(e.pageCount||1)*v.value}),ve=Mn("Pagination",f,s),J=()=>{Ue(()=>{var a;const{value:m}=i;!m||(m.classList.add("transition-disabled"),(a=i.value)===null||a===void 0||a.offsetWidth,m.classList.remove("transition-disabled"))})};function K(a){if(a===y.value)return;const{"onUpdate:page":m,onUpdatePage:ie,onChange:te,simple:me}=e;m&&E(m,a),ie&&E(ie,a),te&&E(te,a),g.value=a,me&&(c.value=String(a))}function G(a){if(a===v.value)return;const{"onUpdate:pageSize":m,onUpdatePageSize:ie,onPageSizeChange:te}=e;m&&E(m,a),ie&&E(ie,a),te&&E(te,a),F.value=a,b.value{y.value,v.value,J()});const q=I(()=>{const{size:a}=e,{self:{buttonBorder:m,buttonBorderHover:ie,buttonBorderPressed:te,buttonIconColor:me,buttonIconColorHover:Te,buttonIconColorPressed:Ie,itemTextColor:_e,itemTextColorHover:Fe,itemTextColorPressed:Me,itemTextColorActive:de,itemTextColorDisabled:r,itemColor:u,itemColorHover:$,itemColorPressed:Se,itemColorActive:$e,itemColorActiveHover:Ae,itemColorDisabled:je,itemBorder:Ee,itemBorderHover:ke,itemBorderPressed:Pe,itemBorderActive:Oe,itemBorderDisabled:Le,itemBorderRadius:Ve,jumperTextColor:Be,jumperTextColorDisabled:ue,buttonColor:t,buttonColorHover:l,buttonColorPressed:w,[Q("itemPadding",a)]:B,[Q("itemMargin",a)]:M,[Q("inputWidth",a)]:O,[Q("selectWidth",a)]:S,[Q("inputMargin",a)]:D,[Q("selectMargin",a)]:ze,[Q("jumperFontSize",a)]:De,[Q("prefixMargin",a)]:Qe,[Q("suffixMargin",a)]:Ye,[Q("itemSize",a)]:Ge,[Q("buttonIconSize",a)]:Xe,[Q("itemFontSize",a)]:et,[`${Q("itemMargin",a)}Rtl`]:tt,[`${Q("inputMargin",a)}Rtl`]:nt},common:{cubicBezierEaseInOut:ot}}=x.value;return{"--n-prefix-margin":Qe,"--n-suffix-margin":Ye,"--n-item-font-size":et,"--n-select-width":S,"--n-select-margin":ze,"--n-input-width":O,"--n-input-margin":D,"--n-input-margin-rtl":nt,"--n-item-size":Ge,"--n-item-text-color":_e,"--n-item-text-color-disabled":r,"--n-item-text-color-hover":Fe,"--n-item-text-color-active":de,"--n-item-text-color-pressed":Me,"--n-item-color":u,"--n-item-color-hover":$,"--n-item-color-disabled":je,"--n-item-color-active":$e,"--n-item-color-active-hover":Ae,"--n-item-color-pressed":Se,"--n-item-border":Ee,"--n-item-border-hover":ke,"--n-item-border-disabled":Le,"--n-item-border-active":Oe,"--n-item-border-pressed":Pe,"--n-item-padding":B,"--n-item-border-radius":Ve,"--n-bezier":ot,"--n-jumper-font-size":De,"--n-jumper-text-color":Be,"--n-jumper-text-color-disabled":ue,"--n-item-margin":M,"--n-item-margin-rtl":tt,"--n-button-icon-size":Xe,"--n-button-icon-color":me,"--n-button-icon-color-hover":Te,"--n-button-icon-color-pressed":Ie,"--n-button-color-hover":l,"--n-button-color":t,"--n-button-color-pressed":w,"--n-button-border":m,"--n-button-border-hover":ie,"--n-button-border-pressed":te}}),j=d?Ze("pagination",I(()=>{let a="";const{size:m}=e;return a+=m[0],a}),q,e):void 0;return{rtlEnabled:ve,mergedClsPrefix:s,locale:C,selfRef:i,mergedPage:y,pageItems:I(()=>N.value.items),mergedItemCount:he,jumperValue:c,pageSizeOptions:fe,mergedPageSize:v,inputSize:ne,selectSize:se,mergedTheme:x,mergedPageCount:b,startIndex:V,endIndex:oe,showFastForwardMenu:T,showFastBackwardMenu:R,fastForwardActive:p,fastBackwardActive:z,handleMenuSelect:L,handleFastForwardMouseenter:W,handleFastForwardMouseleave:Y,handleFastBackwardMouseenter:H,handleFastBackwardMouseleave:_,handleJumperInput:re,handleBackwardClick:A,handleForwardClick:ae,handlePageItemClick:pe,handleSizePickerChange:ge,handleQuickJumperChange:Z,cssVars:d?void 0:q,themeClass:j==null?void 0:j.themeClass,onRender:j==null?void 0:j.onRender}},render(){const{$slots:e,mergedClsPrefix:o,disabled:s,cssVars:d,mergedPage:f,mergedPageCount:x,pageItems:C,showSizePicker:i,showQuickJumper:g,mergedTheme:h,locale:F,inputSize:y,selectSize:v,mergedPageSize:b,pageSizeOptions:c,jumperValue:p,simple:z,prev:T,next:R,prefix:W,suffix:Y,label:H,goto:_,handleJumperInput:L,handleSizePickerChange:N,handleBackwardClick:fe,handlePageItemClick:ne,handleForwardClick:se,handleQuickJumperChange:V,onRender:oe}=this;oe==null||oe();const he=e.prefix||W,ve=e.suffix||Y,J=T||e.prev,K=R||e.next,G=H||e.label;return n("div",{ref:"selfRef",class:[`${o}-pagination`,this.themeClass,this.rtlEnabled&&`${o}-pagination--rtl`,s&&`${o}-pagination--disabled`,z&&`${o}-pagination--simple`],style:d},he?n("div",{class:`${o}-pagination-prefix`},he({page:f,pageSize:b,pageCount:x,startIndex:this.startIndex,endIndex:this.endIndex,itemCount:this.mergedItemCount})):null,this.displayOrder.map(ae=>{switch(ae){case"pages":return n(lt,null,n("div",{class:[`${o}-pagination-item`,!J&&`${o}-pagination-item--button`,(f<=1||f>x||s)&&`${o}-pagination-item--disabled`],onClick:fe},J?J({page:f,pageSize:b,pageCount:x,startIndex:this.startIndex,endIndex:this.endIndex,itemCount:this.mergedItemCount}):n(Re,{clsPrefix:o},{default:()=>this.rtlEnabled?n(Ct,null):n(pt,null)})),z?n(lt,null,n("div",{class:`${o}-pagination-quick-jumper`},n(ht,{value:p,onUpdateValue:L,size:y,placeholder:"",disabled:s,theme:h.peers.Input,themeOverrides:h.peerOverrides.Input,onChange:V})),"\xA0/ ",x):C.map((A,xe)=>{let ee,ge,be;const{type:Z}=A;switch(Z){case"page":const re=A.label;G?ee=G({type:"page",node:re,active:A.active}):ee=re;break;case"fast-forward":const q=this.fastForwardActive?n(Re,{clsPrefix:o},{default:()=>this.rtlEnabled?n(mt,null):n(wt,null)}):n(Re,{clsPrefix:o},{default:()=>n(xt,null)});G?ee=G({type:"fast-forward",node:q,active:this.fastForwardActive||this.showFastForwardMenu}):ee=q,ge=this.handleFastForwardMouseenter,be=this.handleFastForwardMouseleave;break;case"fast-backward":const j=this.fastBackwardActive?n(Re,{clsPrefix:o},{default:()=>this.rtlEnabled?n(wt,null):n(mt,null)}):n(Re,{clsPrefix:o},{default:()=>n(xt,null)});G?ee=G({type:"fast-backward",node:j,active:this.fastBackwardActive||this.showFastBackwardMenu}):ee=j,ge=this.handleFastBackwardMouseenter,be=this.handleFastBackwardMouseleave;break}const pe=n("div",{key:xe,class:[`${o}-pagination-item`,A.active&&`${o}-pagination-item--active`,Z!=="page"&&(Z==="fast-backward"&&this.showFastBackwardMenu||Z==="fast-forward"&&this.showFastForwardMenu)&&`${o}-pagination-item--hover`,s&&`${o}-pagination-item--disabled`,Z==="page"&&`${o}-pagination-item--clickable`],onClick:()=>ne(A),onMouseenter:ge,onMouseleave:be},ee);if(Z==="page"&&!A.mayBeFastBackward&&!A.mayBeFastForward)return pe;{const re=A.type==="page"?A.mayBeFastBackward?"fast-backward":"fast-forward":A.type;return n($n,{to:this.to,key:re,disabled:s,trigger:"hover",virtualScroll:!0,style:{width:"60px"},theme:h.peers.Popselect,themeOverrides:h.peerOverrides.Popselect,builtinThemeOverrides:{peers:{InternalSelectMenu:{height:"calc(var(--n-option-height) * 4.6)"}}},nodeProps:()=>({style:{justifyContent:"center"}}),show:Z==="page"?!1:Z==="fast-backward"?this.showFastBackwardMenu:this.showFastForwardMenu,onUpdateShow:q=>{Z!=="page"&&(q?Z==="fast-backward"?this.showFastBackwardMenu=q:this.showFastForwardMenu=q:(this.showFastBackwardMenu=!1,this.showFastForwardMenu=!1))},options:A.type!=="page"?A.options:[],onUpdateValue:this.handleMenuSelect,scrollable:!0,showCheckmark:!1},{default:()=>pe})}}),n("div",{class:[`${o}-pagination-item`,!K&&`${o}-pagination-item--button`,{[`${o}-pagination-item--disabled`]:f<1||f>=x||s}],onClick:se},K?K({page:f,pageSize:b,pageCount:x,itemCount:this.mergedItemCount,startIndex:this.startIndex,endIndex:this.endIndex}):n(Re,{clsPrefix:o},{default:()=>this.rtlEnabled?n(pt,null):n(Ct,null)})));case"size-picker":return!z&&i?n(En,Object.assign({consistentMenuWidth:!1,placeholder:"",showCheckmark:!1,to:this.to},this.selectProps,{size:v,options:c,value:b,disabled:s,theme:h.peers.Select,themeOverrides:h.peerOverrides.Select,onUpdateValue:N})):null;case"quick-jumper":return!z&&g?n("div",{class:`${o}-pagination-quick-jumper`},_?_():Sn(this.$slots.goto,()=>[F.goto]),n(ht,{value:p,onUpdateValue:L,size:y,placeholder:"",disabled:s,theme:h.peers.Input,themeOverrides:h.peerOverrides.Input,onChange:V})):null;default:return null}}),ve?n("div",{class:`${o}-pagination-suffix`},ve({page:f,pageSize:b,pageCount:x,startIndex:this.startIndex,endIndex:this.endIndex,itemCount:this.mergedItemCount})):null)}});export{Wn as _}; diff --git a/web/dist/assets/Post.3f5c561f.js b/web/dist/assets/Post.3f5c561f.js new file mode 100644 index 00000000..250ea1ce --- /dev/null +++ b/web/dist/assets/Post.3f5c561f.js @@ -0,0 +1,57 @@ +import{c as me,a as _e,f as j,e as q,d as T,u as ve,x as ie,bP as Te,y as L,A as Ee,h as z,ab as ee,n as Se,J as ke,q as Oe,t as Ce,L as we,K as W,B as Ue,N as Ne,bH as je,aR as Me,b as be,bQ as Ve,r as k,p as qe,aT as Le,aV as He,aN as Ke,aW as We,w as xe,W as u,Y as g,Z as C,bR as Je,ai as te,a7 as $,a4 as a,a5 as l,a9 as E,bS as Qe,_ as Ye,$ as le,am as he,aa as D,a6 as R,a3 as e,bT as Ze,af as ue,al as Be,an as Ge,ac as ne,a8 as J,bU as Xe,ae as fe,a0 as et,a2 as ge,bV as tt,ag as st,bW as ot,bX as nt,bY as at,bZ as it,b_ as lt,b$ as ut,c0 as rt,c1 as ct,c2 as pt,c3 as dt,ao as _t,c4 as mt,bA as vt,ah as ht,S as ft,c5 as gt,c6 as yt,aj as kt,c7 as Ct}from"./index.d4f5aad2.js";import{_ as wt}from"./InputGroup.73d38f63.js";import{f as ae}from"./formatTime.e07969bb.js";import{p as ye,a as Fe,H as bt,C as xt,B as $t,_ as Et,b as Bt,c as Ft}from"./content.ed80294a.js";import{_ as Pe}from"./Thing.d394adea.js";import{_ as Pt}from"./post-skeleton.38f0f247.js";import{l as Dt,I as At,_ as Rt,V as X}from"./IEnum.032938cf.js";import{_ as zt,a as It,b as Tt,c as St}from"./Upload.6bcec76c.js";import{M as Ot}from"./MoreHorizFilled.b0eea69d.js";import{_ as Ut}from"./main-nav.3167f221.js";import{_ as Nt}from"./List.a66e9ae7.js";import{a as jt,_ as Mt}from"./Skeleton.e1c16fcb.js";var Vt=me("divider",` + position: relative; + display: flex; + width: 100%; + box-sizing: border-box; + font-size: 16px; + color: var(--n-text-color); + transition: + color .3s var(--n-bezier), + background-color .3s var(--n-bezier); +`,[_e("vertical",` + margin-top: 24px; + margin-bottom: 24px; + `,[_e("no-title",` + display: flex; + align-items: center; + `)]),j("title",` + display: flex; + align-items: center; + margin-left: 12px; + margin-right: 12px; + white-space: nowrap; + font-weight: var(--n-font-weight); + `),q("title-position-left",[j("line",[q("left",{width:"28px"})])]),q("title-position-right",[j("line",[q("right",{width:"28px"})])]),q("dashed",[j("line",` + background-color: #0000; + height: 0px; + width: 100%; + border-style: dashed; + border-width: 1px 0 0; + `)]),q("vertical",` + display: inline-block; + height: 1em; + margin: 0 8px; + vertical-align: middle; + width: 1px; + `),j("line",` + border: none; + transition: background-color .3s var(--n-bezier), border-color .3s var(--n-bezier); + height: 1px; + width: 100%; + margin: 0; + `),_e("dashed",[j("line",{backgroundColor:"var(--n-color)"})]),q("dashed",[j("line",{borderColor:"var(--n-color)"})]),q("vertical",{backgroundColor:"var(--n-color)"})]);const qt=Object.assign(Object.assign({},ie.props),{titlePlacement:{type:String,default:"center"},dashed:Boolean,vertical:Boolean});var Lt=T({name:"Divider",props:qt,setup(c){const{mergedClsPrefixRef:d,inlineThemeDisabled:n}=ve(c),i=ie("Divider","-divider",Vt,Te,c,d),f=L(()=>{const{common:{cubicBezierEaseInOut:r},self:{color:_,textColor:o,fontWeight:w}}=i.value;return{"--n-bezier":r,"--n-color":_,"--n-text-color":o,"--n-font-weight":w}}),p=n?Ee("divider",void 0,f,c):void 0;return{mergedClsPrefix:d,cssVars:n?void 0:f,themeClass:p==null?void 0:p.themeClass,onRender:p==null?void 0:p.onRender}},render(){var c;const{$slots:d,titlePlacement:n,vertical:i,dashed:f,cssVars:p,mergedClsPrefix:r}=this;return(c=this.onRender)===null||c===void 0||c.call(this),z("div",{role:"separator",class:[`${r}-divider`,this.themeClass,{[`${r}-divider--vertical`]:i,[`${r}-divider--no-title`]:!d.default,[`${r}-divider--dashed`]:f,[`${r}-divider--title-position-${n}`]:d.default&&n}],style:p},i?null:z("div",{class:`${r}-divider__line ${r}-divider__line--left`}),!i&&d.default?z(ee,null,z("div",{class:`${r}-divider__title`},this.$slots),z("div",{class:`${r}-divider__line ${r}-divider__line--right`})):null)}});const De=Se("n-popconfirm"),Ae={positiveText:String,negativeText:String,showIcon:{type:Boolean,default:!0},onPositiveClick:{type:Function,required:!0},onNegativeClick:{type:Function,required:!0}},$e=Me(Ae);var Ht=T({name:"NPopconfirmPanel",props:Ae,setup(c){const{localeRef:d}=ke("Popconfirm"),{inlineThemeDisabled:n}=ve(),{mergedClsPrefixRef:i,mergedThemeRef:f,props:p}=Oe(De),r=L(()=>{const{common:{cubicBezierEaseInOut:o},self:{fontSize:w,iconSize:h,iconColor:v}}=f.value;return{"--n-bezier":o,"--n-font-size":w,"--n-icon-size":h,"--n-icon-color":v}}),_=n?Ee("popconfirm-panel",void 0,r,p):void 0;return Object.assign(Object.assign({},ke("Popconfirm")),{mergedClsPrefix:i,cssVars:n?void 0:r,localizedPositiveText:L(()=>c.positiveText||d.value.positiveText),localizedNegativeText:L(()=>c.negativeText||d.value.negativeText),positiveButtonProps:Ce(p,"positiveButtonProps"),negativeButtonProps:Ce(p,"negativeButtonProps"),handlePositiveClick(o){c.onPositiveClick(o)},handleNegativeClick(o){c.onNegativeClick(o)},themeClass:_==null?void 0:_.themeClass,onRender:_==null?void 0:_.onRender})},render(){var c;const{mergedClsPrefix:d,showIcon:n,$slots:i}=this,f=we(i.action,()=>this.negativeText===null&&this.positiveText===null?[]:[this.negativeText!==null&&z(W,Object.assign({size:"small",onClick:this.handleNegativeClick},this.negativeButtonProps),{default:()=>this.localizedNegativeText}),this.positiveText!==null&&z(W,Object.assign({size:"small",type:"primary",onClick:this.handlePositiveClick},this.positiveButtonProps),{default:()=>this.localizedPositiveText})]);return(c=this.onRender)===null||c===void 0||c.call(this),z("div",{class:[`${d}-popconfirm__panel`,this.themeClass],style:this.cssVars},Ue(i.default,p=>n||p?z("div",{class:`${d}-popconfirm__body`},n?z("div",{class:`${d}-popconfirm__icon`},we(i.icon,()=>[z(Ne,{clsPrefix:d},{default:()=>z(je,null)})])):null,p):null),f?z("div",{class:[`${d}-popconfirm__action`]},f):null)}}),Kt=me("popconfirm",[j("body",` + font-size: var(--n-font-size); + display: flex; + align-items: center; + flex-wrap: nowrap; + position: relative; + `,[j("icon",` + display: flex; + font-size: var(--n-icon-size); + color: var(--n-icon-color); + transition: color .3s var(--n-bezier); + margin: 0 8px 0 0; + `)]),j("action",` + display: flex; + justify-content: flex-end; + `,[be("&:not(:first-child)","margin-top: 8px"),me("button",[be("&:not(:last-child)","margin-right: 8px;")])])]);const Wt=Object.assign(Object.assign(Object.assign({},ie.props),We),{positiveText:String,negativeText:String,showIcon:{type:Boolean,default:!0},trigger:{type:String,default:"click"},positiveButtonProps:Object,negativeButtonProps:Object,onPositiveClick:Function,onNegativeClick:Function});var Re=T({name:"Popconfirm",props:Wt,__popover__:!0,setup(c){const{mergedClsPrefixRef:d}=ve(),n=ie("Popconfirm","-popconfirm",Kt,Ve,c,d),i=k(null);function f(_){const{onPositiveClick:o,"onUpdate:show":w}=c;Promise.resolve(o?o(_):!0).then(h=>{var v;h!==!1&&((v=i.value)===null||v===void 0||v.setShow(!1),w&&xe(w,!1))})}function p(_){const{onNegativeClick:o,"onUpdate:show":w}=c;Promise.resolve(o?o(_):!0).then(h=>{var v;h!==!1&&((v=i.value)===null||v===void 0||v.setShow(!1),w&&xe(w,!1))})}return qe(De,{mergedThemeRef:n,mergedClsPrefixRef:d,props:c}),Object.assign(Object.assign({},{setShow(_){var o;(o=i.value)===null||o===void 0||o.setShow(_)},syncPosition(){var _;(_=i.value)===null||_===void 0||_.syncPosition()}}),{mergedTheme:n,popoverInstRef:i,handlePositiveClick:f,handleNegativeClick:p})},render(){const{$slots:c,$props:d,mergedTheme:n}=this;return z(Ke,He(d,$e,{theme:n.peers.Popover,themeOverrides:n.peerOverrides.Popover,internalExtraClass:["popconfirm"],ref:"popoverInstRef"}),{trigger:c.activator||c.trigger,default:()=>{const i=Le(d,$e);return z(Ht,Object.assign(Object.assign({},i),{onPositiveClick:this.handlePositiveClick,onNegativeClick:this.handleNegativeClick}),c)}})}});const Jt={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},Qt=C("path",{d:"M400 480a16 16 0 0 1-10.63-4L256 357.41L122.63 476A16 16 0 0 1 96 464V96a64.07 64.07 0 0 1 64-64h192a64.07 64.07 0 0 1 64 64v368a16 16 0 0 1-16 16z",fill:"currentColor"},null,-1),Yt=[Qt];var Zt=T({name:"Bookmark",render:function(d,n){return u(),g("svg",Jt,Yt)}});const Gt={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},Xt=C("path",{d:"M256 448a32 32 0 0 1-18-5.57c-78.59-53.35-112.62-89.93-131.39-112.8c-40-48.75-59.15-98.8-58.61-153C48.63 114.52 98.46 64 159.08 64c44.08 0 74.61 24.83 92.39 45.51a6 6 0 0 0 9.06 0C278.31 88.81 308.84 64 352.92 64c60.62 0 110.45 50.52 111.08 112.64c.54 54.21-18.63 104.26-58.61 153c-18.77 22.87-52.8 59.45-131.39 112.8a32 32 0 0 1-18 5.56z",fill:"currentColor"},null,-1),es=[Xt];var ts=T({name:"Heart",render:function(d,n){return u(),g("svg",Gt,es)}});const ss={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 24 24"},os=Je('',1),ns=[os];var ze=T({name:"Trash",render:function(d,n){return u(),g("svg",ss,ns)}});const as={class:"reply-compose-wrap"},is={class:"reply-switch"},ls={key:0,class:"reply-input-wrap"},us=T({__name:"compose-reply",props:{commentId:{default:0},atUserid:{default:0},atUsername:{default:""}},emits:["reload","reset"],setup(c,{expose:d,emit:n}){const i=c,f=k(),p=k(!1),r=k(""),_=k(!1),o=h=>{p.value=h,h?setTimeout(()=>{var v;(v=f.value)==null||v.focus()},10):(_.value=!1,r.value="",n("reset"))},w=()=>{_.value=!0,Qe({comment_id:i.commentId,at_user_id:i.atUserid,content:r.value}).then(h=>{o(!1),window.$message.success("\u8BC4\u8BBA\u6210\u529F"),n("reload")}).catch(h=>{_.value=!1})};return d({switchReply:o}),(h,v)=>{const A=Ye,t=W,B=wt;return u(),g("div",as,[C("div",is,[p.value?$("",!0):(u(),g("span",{key:0,class:"show",onClick:v[0]||(v[0]=x=>o(!0))}," \u56DE\u590D ")),p.value?(u(),g("span",{key:1,class:"hide",onClick:v[1]||(v[1]=x=>o(!1))}," \u53D6\u6D88 ")):$("",!0)]),p.value?(u(),g("div",ls,[a(B,null,{default:l(()=>[a(A,{ref_key:"inputInstRef",ref:f,size:"small",placeholder:i.atUsername?"@"+i.atUsername:"\u8BF7\u8F93\u5165\u56DE\u590D\u5185\u5BB9..",maxlength:"100",value:r.value,"onUpdate:value":v[2]||(v[2]=x=>r.value=x),"show-count":"",clearable:""},null,8,["placeholder","value"]),a(t,{type:"primary",size:"small",ghost:"",loading:_.value,onClick:w},{default:l(()=>[E(" \u56DE\u590D ")]),_:1},8,["loading"])]),_:1})])):$("",!0)])}}});var rs=te(us,[["__scopeId","data-v-3616e66c"]]);const cs={class:"reply-item"},ps={class:"header-wrap"},ds={class:"username"},_s={class:"reply-name"},ms={class:"timestamp"},vs={class:"base-wrap"},hs={class:"content"},fs={key:0,class:"reply-switch"},gs=T({__name:"reply-item",props:{reply:null},emits:["focusReply","reload"],setup(c,{emit:d}){const n=c,i=le(),f=()=>{d("focusReply",n.reply)},p=()=>{Ze({id:n.reply.id}).then(r=>{window.$message.success("\u5220\u9664\u6210\u529F"),setTimeout(()=>{d("reload")},50)}).catch(r=>{console.log(r)})};return(r,_)=>{const o=he("router-link"),w=ue,h=W,v=Re;return u(),g("div",cs,[C("div",ps,[C("div",ds,[a(o,{class:"user-link",to:{name:"user",query:{username:n.reply.user.username}}},{default:l(()=>[E(D(n.reply.user.username),1)]),_:1},8,["to"]),C("span",_s,D(n.reply.at_user_id>0?"\u56DE\u590D":":"),1),n.reply.at_user_id>0?(u(),R(o,{key:0,class:"user-link",to:{name:"user",query:{username:n.reply.at_user.username}}},{default:l(()=>[E(D(n.reply.at_user.username),1)]),_:1},8,["to"])):$("",!0)]),C("div",ms,[E(D(n.reply.ip_loc?n.reply.ip_loc+" \xB7 ":n.reply.ip_loc)+" "+D(e(ae)(n.reply.created_on))+" ",1),e(i).state.userInfo.is_admin||e(i).state.userInfo.id===n.reply.user.id?(u(),R(v,{key:0,"negative-text":"\u53D6\u6D88","positive-text":"\u786E\u8BA4",onPositiveClick:p},{trigger:l(()=>[a(h,{quaternary:"",circle:"",size:"tiny",class:"del-btn"},{icon:l(()=>[a(w,null,{default:l(()=>[a(e(ze))]),_:1})]),_:1})]),default:l(()=>[E(" \u662F\u5426\u786E\u8BA4\u5220\u9664\uFF1F ")]),_:1})):$("",!0)])]),C("div",vs,[C("div",hs,D(n.reply.content),1),e(i).state.userInfo.id>0?(u(),g("div",fs,[C("span",{class:"show",onClick:f}," \u56DE\u590D ")])):$("",!0)])])}}});var ys=te(gs,[["__scopeId","data-v-1e3df20d"]]);const ks={class:"comment-item"},Cs={class:"nickname-wrap"},ws={class:"username-wrap"},bs={class:"opt-wrap"},xs={class:"timestamp"},$s=["innerHTML"],Es={class:"reply-wrap"},Bs=T({__name:"comment-item",props:{comment:null},emits:["reload"],setup(c,{emit:d}){const n=c,i=le(),f=Be(),p=k(0),r=k(""),_=k(),o=L(()=>{let B=Object.assign({texts:[],imgs:[]},n.comment);return B.contents.map(x=>{(+x.type==1||+x.type==2)&&B.texts.push(x),+x.type==3&&B.imgs.push(x)}),B}),w=(B,x)=>{let I=B.target;if(I.dataset.detail){const S=I.dataset.detail.split(":");S.length===2&&(i.commit("refresh"),S[0]==="tag"?window.$message.warning("\u8BC4\u8BBA\u5185\u7684\u65E0\u6548\u8BDD\u9898"):f.push({name:"user",query:{username:S[1]}}))}},h=B=>{var x,I;p.value=B.user_id,r.value=((x=B.user)==null?void 0:x.username)||"",(I=_.value)==null||I.switchReply(!0)},v=()=>{d("reload")},A=()=>{p.value=0,r.value=""},t=()=>{Xe({id:o.value.id}).then(B=>{window.$message.success("\u5220\u9664\u6210\u529F"),setTimeout(()=>{v()},50)}).catch(B=>{})};return(B,x)=>{const I=fe,S=he("router-link"),H=ue,K=W,M=Re,Q=Fe,Y=ys,Z=rs,s=Pe;return u(),g("div",ks,[a(s,{"content-indented":""},Ge({avatar:l(()=>[a(I,{round:"",size:30,src:e(o).user.avatar},null,8,["src"])]),header:l(()=>[C("span",Cs,[a(S,{onClick:x[0]||(x[0]=J(()=>{},["stop"])),class:"username-link",to:{name:"user",query:{username:e(o).user.username}}},{default:l(()=>[E(D(e(o).user.nickname),1)]),_:1},8,["to"])]),C("span",ws," @"+D(e(o).user.username),1)]),"header-extra":l(()=>[C("div",bs,[C("span",xs,D(e(o).ip_loc?e(o).ip_loc+" \xB7 ":e(o).ip_loc)+" "+D(e(ae)(e(o).created_on)),1),e(i).state.userInfo.is_admin||e(i).state.userInfo.id===e(o).user.id?(u(),R(M,{key:0,"negative-text":"\u53D6\u6D88","positive-text":"\u786E\u8BA4",onPositiveClick:t},{trigger:l(()=>[a(K,{quaternary:"",circle:"",size:"tiny",class:"del-btn"},{icon:l(()=>[a(H,null,{default:l(()=>[a(e(ze))]),_:1})]),_:1})]),default:l(()=>[E(" \u662F\u5426\u786E\u8BA4\u5220\u9664\uFF1F ")]),_:1})):$("",!0)])]),footer:l(()=>[e(o).imgs.length>0?(u(),R(Q,{key:0,imgs:e(o).imgs},null,8,["imgs"])):$("",!0),C("div",Es,[(u(!0),g(ee,null,ne(e(o).replies,m=>(u(),R(Y,{key:m.id,reply:m,onFocusReply:h,onReload:v},null,8,["reply"]))),128))]),e(i).state.userInfo.id>0?(u(),R(Z,{key:1,ref_key:"replyComposeRef",ref:_,"comment-id":e(o).id,"at-userid":p.value,"at-username":r.value,onReload:v,onReset:A},null,8,["comment-id","at-userid","at-username"])):$("",!0)]),_:2},[e(o).texts.length>0?{name:"description",fn:l(()=>[(u(!0),g(ee,null,ne(e(o).texts,m=>(u(),g("span",{key:m.id,class:"comment-text",onClick:x[1]||(x[1]=J(U=>w(U,e(o).id),["stop"])),innerHTML:e(ye)(m.content).content},null,8,$s))),128))]),key:"0"}:void 0]),1024)])}}});var Fs=te(Bs,[["__scopeId","data-v-6b2cb186"]]);const Ps=c=>(ot("data-v-b1d2e9fe"),c=c(),nt(),c),Ds={key:0,class:"compose-wrap"},As={class:"compose-line"},Rs={class:"compose-user"},zs={class:"compose-line compose-options"},Is={class:"attachment"},Ts={class:"submit-wrap"},Ss={class:"attachment-list-wrap"},Os={key:1,class:"compose-wrap"},Us=Ps(()=>C("div",{class:"login-wrap"},[C("span",{class:"login-banner"}," \u767B\u5F55\u540E\uFF0C\u7CBE\u5F69\u66F4\u591A")],-1)),Ns={class:"login-wrap"},js=T({__name:"compose-comment",props:{lock:{default:0},postId:{default:0}},emits:["post-success"],setup(c,{emit:d}){const n=c,i=le(),f=k([]),p=k(!1),r=k(!1),_=k(!1),o=k(""),w=k(),h=k("public/image"),v=k([]),A=k([]),t="/v1/attachment",B=k(),x=Dt.exports.debounce(y=>{et({k:y}).then(b=>{let F=[];b.suggest.map(P=>{F.push({label:P,value:P})}),f.value=F,r.value=!1}).catch(b=>{r.value=!1})},200),I=(y,b)=>{r.value||(r.value=!0,b==="@"&&x(y))},S=y=>{y.length>200||(o.value=y)},H=y=>{h.value=y},K=y=>{v.value=y},M=async y=>{var b,F;return h.value==="public/image"&&!["image/png","image/jpg","image/jpeg","image/gif"].includes((b=y.file.file)==null?void 0:b.type)?(window.$message.warning("\u56FE\u7247\u4EC5\u5141\u8BB8 png/jpg/gif \u683C\u5F0F"),!1):h.value==="image"&&((F=y.file.file)==null?void 0:F.size)>10485760?(window.$message.warning("\u56FE\u7247\u5927\u5C0F\u4E0D\u80FD\u8D85\u8FC710MB"),!1):!0},Q=({file:y,event:b})=>{var F;try{let P=JSON.parse((F=b.target)==null?void 0:F.response);P.code===0&&h.value==="public/image"&&A.value.push({id:y.id,content:P.data.content})}catch{window.$message.error("\u4E0A\u4F20\u5931\u8D25")}},Y=({file:y,event:b})=>{var F;try{let P=JSON.parse((F=b.target)==null?void 0:F.response);if(P.code!==0){let V=P.msg||"\u4E0A\u4F20\u5931\u8D25";P.details&&P.details.length>0&&P.details.map(N=>{V+=":"+N}),window.$message.error(V)}}catch{window.$message.error("\u4E0A\u4F20\u5931\u8D25")}},Z=({file:y})=>{let b=A.value.findIndex(F=>F.id===y.id);b>-1&&A.value.splice(b,1)},s=()=>{p.value=!0},m=()=>{var y;p.value=!1,(y=w.value)==null||y.clear(),v.value=[],o.value="",A.value=[]},U=()=>{if(o.value.trim().length===0){window.$message.warning("\u8BF7\u8F93\u5165\u5185\u5BB9\u54E6");return}let{users:y}=ye(o.value);const b=[];let F=100;b.push({content:o.value,type:2,sort:F}),A.value.map(P=>{F++,b.push({content:P.content,type:3,sort:F})}),_.value=!0,tt({contents:b,post_id:n.postId,users:Array.from(new Set(y))}).then(P=>{window.$message.success("\u53D1\u5E03\u6210\u529F"),_.value=!1,d("post-success"),m()}).catch(P=>{_.value=!1})},se=y=>{i.commit("triggerAuth",!0),i.commit("triggerAuthKey",y)};return ge(()=>{B.value="Bearer "+localStorage.getItem("PAOPAO_TOKEN")}),(y,b)=>{const F=fe,P=Rt,V=ue,N=W,re=zt,ce=It,pe=st,oe=Tt,de=St;return u(),g("div",null,[e(i).state.userInfo.id>0?(u(),g("div",Ds,[C("div",As,[C("div",Rs,[a(F,{round:"",size:30,src:e(i).state.userInfo.avatar},null,8,["src"])]),a(P,{type:"textarea",size:"large",autosize:"",bordered:!1,options:f.value,prefix:["@"],loading:r.value,value:o.value,disabled:n.lock===1,"onUpdate:value":S,onSearch:I,onFocus:s,placeholder:n.lock===1?"\u6CE1\u6CE1\u5DF2\u88AB\u9501\u5B9A\uFF0C\u56DE\u590D\u529F\u80FD\u5DF2\u5173\u95ED":"\u5FEB\u6765\u8BC4\u8BBA\u4E24\u53E5\u5427..."},null,8,["options","loading","value","disabled","placeholder"])]),p.value?(u(),R(de,{key:0,ref_key:"uploadRef",ref:w,abstract:"","list-type":"image",multiple:!0,max:9,action:t,headers:{Authorization:B.value},data:{type:h.value},onBeforeUpload:M,onFinish:Q,onError:Y,onRemove:Z,"onUpdate:fileList":K},{default:l(()=>[C("div",zs,[C("div",Is,[a(re,{abstract:""},{default:l(({handleClick:G})=>[a(N,{disabled:v.value.length>0&&h.value==="public/video"||v.value.length===9,onClick:()=>{H("public/image"),G()},quaternary:"",circle:"",type:"primary"},{icon:l(()=>[a(V,{size:"20",color:"var(--primary-color)"},{default:l(()=>[a(e(At))]),_:1})]),_:2},1032,["disabled","onClick"])]),_:1}),a(pe,{trigger:"hover",placement:"bottom"},{trigger:l(()=>[a(ce,{class:"text-statistic",type:"circle","show-indicator":!1,status:"success","stroke-width":10,percentage:o.value.length/200*100},null,8,["percentage"])]),default:l(()=>[E(" "+D(o.value.length)+" / 200 ",1)]),_:1})]),C("div",Ts,[a(N,{quaternary:"",round:"",type:"tertiary",class:"cancel-btn",size:"small",onClick:m},{default:l(()=>[E(" \u53D6\u6D88 ")]),_:1}),a(N,{loading:_.value,onClick:U,type:"primary",secondary:"",size:"small",round:""},{default:l(()=>[E(" \u53D1\u5E03 ")]),_:1},8,["loading"])])]),C("div",Ss,[a(oe)])]),_:1},8,["headers","data"])):$("",!0)])):(u(),g("div",Os,[Us,C("div",Ns,[a(N,{strong:"",secondary:"",round:"",type:"primary",onClick:b[0]||(b[0]=G=>se("signin"))},{default:l(()=>[E(" \u767B\u5F55 ")]),_:1}),a(N,{strong:"",secondary:"",round:"",type:"info",onClick:b[1]||(b[1]=G=>se("signup"))},{default:l(()=>[E(" \u6CE8\u518C ")]),_:1})])]))])}}});var Ms=te(js,[["__scopeId","data-v-b1d2e9fe"]]);const Vs={class:"username-wrap"},qs={key:0,class:"options"},Ls={key:0},Hs=["innerHTML"],Ks={class:"timestamp"},Ws={key:0},Js={key:1},Qs={class:"opts-wrap"},Ys=["onClick"],Zs={class:"opt-item"},Gs=["onClick"],Xs=T({__name:"post-detail",props:{post:null},emits:["reload"],setup(c,{emit:d}){const n=c,i=le(),f=Be(),p=k(!1),r=k(!1),_=k(!1),o=k(!1),w=k(!1),h=k(!1),v=k(!1),A=k(X.PUBLIC),t=L({get:()=>{let s=Object.assign({texts:[],imgs:[],videos:[],links:[],attachments:[],charge_attachments:[]},n.post);return s.contents.map(m=>{(+m.type==1||+m.type==2)&&s.texts.push(m),+m.type==3&&s.imgs.push(m),+m.type==4&&s.videos.push(m),+m.type==6&&s.links.push(m),+m.type==7&&s.attachments.push(m),+m.type==8&&s.charge_attachments.push(m)}),s},set:s=>{n.post.upvote_count=s.upvote_count,n.post.comment_count=s.comment_count,n.post.collection_count=s.collection_count}}),B=L(()=>{let s=[{label:"\u5220\u9664",key:"delete"}];return t.value.is_lock===0?s.push({label:"\u9501\u5B9A",key:"lock"}):s.push({label:"\u89E3\u9501",key:"unlock"}),i.state.userInfo.is_admin&&(t.value.is_top===0?s.push({label:"\u7F6E\u9876",key:"stick"}):s.push({label:"\u53D6\u6D88\u7F6E\u9876",key:"unstick"})),t.value.visibility===X.PUBLIC?s.push({label:"\u516C\u5F00",key:"vpublic",children:[{label:"\u79C1\u5BC6",key:"vprivate"},{label:"\u597D\u53CB\u53EF\u89C1",key:"vfriend"}]}):t.value.visibility===X.PRIVATE?s.push({label:"\u79C1\u5BC6",key:"vprivate",children:[{label:"\u516C\u5F00",key:"vpublic"},{label:"\u597D\u53CB\u53EF\u89C1",key:"vfriend"}]}):s.push({label:"\u597D\u53CB\u53EF\u89C1",key:"vfriend",children:[{label:"\u516C\u5F00",key:"vpublic"},{label:"\u79C1\u5BC6",key:"vprivate"}]}),s}),x=s=>{f.push({name:"post",query:{id:s}})},I=(s,m)=>{if(s.target.dataset.detail){const U=s.target.dataset.detail.split(":");if(U.length===2){i.commit("refresh"),U[0]==="tag"?f.push({name:"home",query:{q:U[1],t:"tag"}}):f.push({name:"user",query:{username:U[1]}});return}}x(m)},S=s=>{switch(s){case"delete":_.value=!0;break;case"lock":case"unlock":o.value=!0;break;case"stick":case"unstick":w.value=!0;break;case"vpublic":A.value=0,h.value=!0;break;case"vprivate":A.value=1,h.value=!0;break;case"vfriend":A.value=2,h.value=!0;break}},H=()=>{lt({id:t.value.id}).then(s=>{window.$message.success("\u5220\u9664\u6210\u529F"),f.replace("/"),setTimeout(()=>{i.commit("refresh")},50)}).catch(s=>{v.value=!1})},K=()=>{ut({id:t.value.id}).then(s=>{d("reload"),s.lock_status===1?window.$message.success("\u9501\u5B9A\u6210\u529F"):window.$message.success("\u89E3\u9501\u6210\u529F")}).catch(s=>{v.value=!1})},M=()=>{rt({id:t.value.id}).then(s=>{d("reload"),s.top_status===1?window.$message.success("\u7F6E\u9876\u6210\u529F"):window.$message.success("\u53D6\u6D88\u7F6E\u9876\u6210\u529F")}).catch(s=>{v.value=!1})},Q=()=>{ct({id:t.value.id,visibility:A.value}).then(s=>{d("reload"),window.$message.success("\u4FEE\u6539\u53EF\u89C1\u6027\u6210\u529F")}).catch(s=>{v.value=!1})},Y=()=>{pt({id:t.value.id}).then(s=>{p.value=s.status,s.status?t.value={...t.value,upvote_count:t.value.upvote_count+1}:t.value={...t.value,upvote_count:t.value.upvote_count-1}}).catch(s=>{console.log(s)})},Z=()=>{dt({id:t.value.id}).then(s=>{r.value=s.status,s.status?t.value={...t.value,collection_count:t.value.collection_count+1}:t.value={...t.value,collection_count:t.value.collection_count-1}}).catch(s=>{console.log(s)})};return ge(()=>{i.state.userInfo.id>0&&(at({id:t.value.id}).then(s=>{p.value=s.status}).catch(s=>{console.log(s)}),it({id:t.value.id}).then(s=>{r.value=s.status}).catch(s=>{console.log(s)}))}),(s,m)=>{const U=fe,se=he("router-link"),y=_t,b=ue,F=W,P=mt,V=vt,N=Et,re=Fe,ce=Bt,pe=Ft,oe=Lt,de=ht,G=Pe;return u(),g("div",{class:"detail-item",onClick:m[6]||(m[6]=O=>x(e(t).id))},[a(G,null,{avatar:l(()=>[a(U,{round:"",size:30,src:e(t).user.avatar},null,8,["src"])]),header:l(()=>[a(se,{onClick:m[0]||(m[0]=J(()=>{},["stop"])),class:"username-link",to:{name:"user",query:{username:e(t).user.username}}},{default:l(()=>[E(D(e(t).user.nickname),1)]),_:1},8,["to"]),C("span",Vs," @"+D(e(t).user.username),1),e(t).is_top?(u(),R(y,{key:0,class:"top-tag",type:"warning",size:"small",round:""},{default:l(()=>[E(" \u7F6E\u9876 ")]),_:1})):$("",!0),e(t).visibility==e(X).PRIVATE?(u(),R(y,{key:1,class:"top-tag",type:"error",size:"small",round:""},{default:l(()=>[E(" \u79C1\u5BC6 ")]),_:1})):$("",!0),e(t).visibility==e(X).FRIEND?(u(),R(y,{key:2,class:"top-tag",type:"info",size:"small",round:""},{default:l(()=>[E(" \u597D\u53CB\u53EF\u89C1 ")]),_:1})):$("",!0)]),"header-extra":l(()=>[e(i).state.userInfo.is_admin||e(i).state.userInfo.id===e(t).user.id?(u(),g("div",qs,[a(P,{placement:"bottom-end",trigger:"click",size:"small",options:e(B),onSelect:S},{default:l(()=>[a(F,{quaternary:"",circle:""},{icon:l(()=>[a(b,null,{default:l(()=>[a(e(Ot))]),_:1})]),_:1})]),_:1},8,["options"])])):$("",!0),a(V,{show:_.value,"onUpdate:show":m[1]||(m[1]=O=>_.value=O),"mask-closable":!1,preset:"dialog",title:"\u63D0\u793A",content:"\u786E\u5B9A\u5220\u9664\u8BE5\u6CE1\u6CE1\u52A8\u6001\u5417\uFF1F","positive-text":"\u786E\u8BA4","negative-text":"\u53D6\u6D88",onPositiveClick:H},null,8,["show"]),a(V,{show:o.value,"onUpdate:show":m[2]||(m[2]=O=>o.value=O),"mask-closable":!1,preset:"dialog",title:"\u63D0\u793A",content:"\u786E\u5B9A"+(e(t).is_lock?"\u89E3\u9501":"\u9501\u5B9A")+"\u8BE5\u6CE1\u6CE1\u52A8\u6001\u5417\uFF1F","positive-text":"\u786E\u8BA4","negative-text":"\u53D6\u6D88",onPositiveClick:K},null,8,["show","content"]),a(V,{show:w.value,"onUpdate:show":m[3]||(m[3]=O=>w.value=O),"mask-closable":!1,preset:"dialog",title:"\u63D0\u793A",content:"\u786E\u5B9A"+(e(t).is_top?"\u53D6\u6D88\u7F6E\u9876":"\u7F6E\u9876")+"\u8BE5\u6CE1\u6CE1\u52A8\u6001\u5417\uFF1F","positive-text":"\u786E\u8BA4","negative-text":"\u53D6\u6D88",onPositiveClick:M},null,8,["show","content"]),a(V,{show:h.value,"onUpdate:show":m[4]||(m[4]=O=>h.value=O),"mask-closable":!1,preset:"dialog",title:"\u63D0\u793A",content:"\u786E\u5B9A\u5C06\u8BE5\u6CE1\u6CE1\u52A8\u6001\u53EF\u89C1\u5EA6\u4FEE\u6539\u4E3A"+(A.value==0?"\u516C\u5F00":A.value==1?"\u79C1\u5BC6":"\u597D\u53CB\u53EF\u89C1")+"\u5417\uFF1F","positive-text":"\u786E\u8BA4","negative-text":"\u53D6\u6D88",onPositiveClick:Q},null,8,["show","content"])]),footer:l(()=>[a(N,{attachments:e(t).attachments},null,8,["attachments"]),a(N,{attachments:e(t).charge_attachments,price:e(t).attachment_price},null,8,["attachments","price"]),a(re,{imgs:e(t).imgs},null,8,["imgs"]),a(ce,{videos:e(t).videos,full:!0},null,8,["videos"]),a(pe,{links:e(t).links},null,8,["links"]),C("div",Ks,[E(" \u53D1\u5E03\u4E8E "+D(e(ae)(e(t).created_on))+" ",1),e(t).ip_loc?(u(),g("span",Ws,[a(oe,{vertical:""}),E(" "+D(e(t).ip_loc),1)])):$("",!0),e(t).created_on!=e(t).latest_replied_on?(u(),g("span",Js,[a(oe,{vertical:""}),E(" \u6700\u540E\u56DE\u590D "+D(e(ae)(e(t).latest_replied_on)),1)])):$("",!0)])]),action:l(()=>[C("div",Qs,[a(de,{justify:"space-between"},{default:l(()=>[C("div",{class:"opt-item hover",onClick:J(Y,["stop"])},[a(b,{size:"20",class:"opt-item-icon"},{default:l(()=>[p.value?$("",!0):(u(),R(e(bt),{key:0})),p.value?(u(),R(e(ts),{key:1,color:"red"})):$("",!0)]),_:1}),E(" "+D(e(t).upvote_count),1)],8,Ys),C("div",Zs,[a(b,{size:"20",class:"opt-item-icon"},{default:l(()=>[a(e(xt))]),_:1}),E(" "+D(e(t).comment_count),1)]),C("div",{class:"opt-item hover",onClick:J(Z,["stop"])},[a(b,{size:"20",class:"opt-item-icon"},{default:l(()=>[r.value?$("",!0):(u(),R(e($t),{key:0})),r.value?(u(),R(e(Zt),{key:1,color:"#ff7600"})):$("",!0)]),_:1}),E(" "+D(e(t).collection_count),1)],8,Gs)]),_:1})])]),default:l(()=>[e(t).texts.length>0?(u(),g("div",Ls,[(u(!0),g(ee,null,ne(e(t).texts,O=>(u(),g("span",{key:O.id,class:"post-text",onClick:m[5]||(m[5]=J(Ie=>I(Ie,e(t).id),["stop"])),innerHTML:e(ye)(O.content).content},null,8,Hs))),128))])):$("",!0)]),_:1})])}}});const eo={key:0,class:"detail-wrap"},to={key:1,class:"empty-wrap"},so={key:1},oo={key:0,class:"skeleton-wrap"},no={key:1},ao={key:0,class:"empty-wrap"},io=T({__name:"Post",setup(c){const d=kt(),n=k({}),i=k(!1),f=k(!1),p=k([]),r=L(()=>+d.query.id),_=()=>{n.value={id:0},i.value=!0,gt({id:r.value}).then(w=>{i.value=!1,n.value=w,o()}).catch(w=>{i.value=!1})},o=(w=!1)=>{p.value.length===0&&(f.value=!0),yt({id:n.value.id}).then(h=>{p.value=h.list,f.value=!1,w&&setTimeout(()=>{window.scrollTo(0,99999)},50)}).catch(h=>{f.value=!1})};return ge(()=>{_()}),ft(r,()=>{r.value>0&&d.name==="post"&&_()}),(w,h)=>{const v=Ut,A=Xs,t=jt,B=Ct,x=Mt,I=Ms,S=Pt,H=Fs,K=Nt;return u(),g("div",null,[a(v,{title:"\u6CE1\u6CE1\u8BE6\u60C5",back:!0}),a(K,{class:"main-content-wrap",bordered:""},{default:l(()=>[a(x,null,{default:l(()=>[a(B,{show:i.value},{default:l(()=>[n.value.id>1?(u(),g("div",eo,[a(A,{post:n.value,onReload:_},null,8,["post"])])):(u(),g("div",to,[a(t,{size:"large",description:"\u6682\u65E0\u6570\u636E"})]))]),_:1},8,["show"])]),_:1}),n.value.id>0?(u(),R(x,{key:0},{default:l(()=>[a(I,{lock:n.value.is_lock,"post-id":n.value.id,onPostSuccess:h[0]||(h[0]=M=>o(!0))},null,8,["lock","post-id"])]),_:1})):$("",!0),n.value.id>0?(u(),g("div",so,[f.value?(u(),g("div",oo,[a(S,{num:5})])):(u(),g("div",no,[p.value.length===0?(u(),g("div",ao,[a(t,{size:"large",description:"\u6682\u65E0\u8BC4\u8BBA\uFF0C\u5FEB\u6765\u62A2\u6C99\u53D1"})])):$("",!0),(u(!0),g(ee,null,ne(p.value,M=>(u(),R(x,{key:M.id},{default:l(()=>[a(H,{comment:M,onReload:o},null,8,["comment"])]),_:2},1024))),128))]))])):$("",!0)]),_:1})])}}});var ko=te(io,[["__scopeId","data-v-41747510"]]);export{ko as default}; diff --git a/web/dist/assets/Post.4d9d6f83.css b/web/dist/assets/Post.4d9d6f83.css new file mode 100644 index 00000000..7514e1d9 --- /dev/null +++ b/web/dist/assets/Post.4d9d6f83.css @@ -0,0 +1 @@ +.reply-compose-wrap .reply-switch[data-v-3616e66c]{text-align:right;font-size:12px;margin:10px 0}.reply-compose-wrap .reply-switch .show[data-v-3616e66c]{color:#18a058;cursor:pointer}.reply-compose-wrap .reply-switch .hide[data-v-3616e66c]{opacity:.75;cursor:pointer}.reply-item[data-v-1e3df20d]{display:flex;flex-direction:column;font-size:12px;padding:8px;border-bottom:1px solid #f3f3f3}.reply-item .header-wrap[data-v-1e3df20d]{display:flex;align-items:center;justify-content:space-between}.reply-item .header-wrap .username[data-v-1e3df20d]{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reply-item .header-wrap .username .reply-name[data-v-1e3df20d]{margin:0 3px;opacity:.75}.reply-item .header-wrap .timestamp[data-v-1e3df20d]{opacity:.75;text-align:right;display:flex;align-items:center;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.reply-item .base-wrap[data-v-1e3df20d]{display:flex}.reply-item .base-wrap .content[data-v-1e3df20d]{width:calc(100% - 40px);margin-top:4px;font-size:12px;text-align:justify;line-height:2}.reply-item .base-wrap .reply-switch[data-v-1e3df20d]{width:40px;text-align:right;font-size:12px;margin:10px 0 0}.reply-item .base-wrap .reply-switch .show[data-v-1e3df20d]{color:#18a058;cursor:pointer}.reply-item .base-wrap .reply-switch .hide[data-v-1e3df20d]{opacity:.75;cursor:pointer}.dark .reply-item[data-v-1e3df20d]{border-bottom:1px solid #262628}.comment-item[data-v-6b2cb186]{width:100%;padding:16px;box-sizing:border-box}.comment-item .nickname-wrap[data-v-6b2cb186]{font-size:14px}.comment-item .username-wrap[data-v-6b2cb186]{font-size:14px;opacity:.75}.comment-item .opt-wrap[data-v-6b2cb186]{display:flex;align-items:center}.comment-item .opt-wrap .timestamp[data-v-6b2cb186]{opacity:.75;font-size:12px}.comment-item .opt-wrap .del-btn[data-v-6b2cb186]{margin-left:4px}.comment-item .comment-text[data-v-6b2cb186]{display:block;text-align:justify;overflow:hidden;white-space:pre-wrap;word-break:break-all}.comment-item .opt-item[data-v-6b2cb186]{display:flex;align-items:center;opacity:.7}.comment-item .opt-item .opt-item-icon[data-v-6b2cb186]{margin-right:10px}.reply-wrap[data-v-6b2cb186]{margin-top:10px;border-radius:5px;background:#fafafc}.reply-wrap .reply-item[data-v-6b2cb186]:last-child{border-bottom:none}.dark .reply-wrap[data-v-6b2cb186]{background:#18181c}.compose-wrap[data-v-b1d2e9fe]{width:100%;padding:16px;box-sizing:border-box}.compose-wrap .compose-line[data-v-b1d2e9fe]{display:flex;flex-direction:row}.compose-wrap .compose-line .compose-user[data-v-b1d2e9fe]{width:42px;height:42px;display:flex;align-items:center}.compose-wrap .compose-line.compose-options[data-v-b1d2e9fe]{margin-top:6px;padding-left:42px;display:flex;justify-content:space-between}.compose-wrap .compose-line.compose-options .submit-wrap[data-v-b1d2e9fe]{display:flex;align-items:center}.compose-wrap .compose-line.compose-options .submit-wrap .cancel-btn[data-v-b1d2e9fe]{margin-right:8px}.compose-wrap .login-wrap[data-v-b1d2e9fe]{display:flex;justify-content:center;width:100%}.compose-wrap .login-wrap .login-banner[data-v-b1d2e9fe]{margin-bottom:12px;opacity:.8}.compose-wrap .login-wrap button[data-v-b1d2e9fe]{margin:0 4px}.attachment[data-v-b1d2e9fe]{display:flex;align-items:center}.attachment .text-statistic[data-v-b1d2e9fe]{margin-left:8px;width:18px;height:18px;transform:rotate(180deg)}.attachment-list-wrap[data-v-b1d2e9fe]{margin-top:12px;margin-left:42px}.attachment-list-wrap .n-upload-file-info__thumbnail[data-v-b1d2e9fe]{overflow:hidden}.detail-item{width:100%;padding:16px;box-sizing:border-box;background:#f7f9f9}.detail-item .nickname-wrap{font-size:14px}.detail-item .username-wrap{font-size:14px;opacity:.75}.detail-item .top-tag{transform:scale(.75)}.detail-item .options{opacity:.75}.detail-item .post-text{font-size:16px;text-align:justify;overflow:hidden;white-space:pre-wrap;word-break:break-all}.detail-item .opts-wrap{margin-top:20px}.detail-item .opts-wrap .opt-item{display:flex;align-items:center;opacity:.7}.detail-item .opts-wrap .opt-item .opt-item-icon{margin-right:10px}.detail-item .opts-wrap .opt-item.hover{cursor:pointer}.detail-item .n-thing .n-thing-avatar-header-wrapper{align-items:center}.detail-item .timestamp{opacity:.75;font-size:12px;margin-top:10px}.dark .detail-item{background:#18181c}.detail-wrap[data-v-41747510]{min-height:100px} diff --git a/web/dist/assets/Profile.df0a7049.css b/web/dist/assets/Profile.df0a7049.css new file mode 100644 index 00000000..df9fda0c --- /dev/null +++ b/web/dist/assets/Profile.df0a7049.css @@ -0,0 +1 @@ +.profile-baseinfo[data-v-2fe5c266]{display:flex;padding:16px}.profile-baseinfo .avatar[data-v-2fe5c266]{width:55px}.profile-baseinfo .base-info[data-v-2fe5c266]{position:relative;width:calc(100% - 55px)}.profile-baseinfo .base-info .username[data-v-2fe5c266]{line-height:16px;font-size:16px}.profile-baseinfo .base-info .uid[data-v-2fe5c266]{font-size:14px;line-height:14px;margin-top:10px;opacity:.75}.profile-tabs-wrap[data-v-2fe5c266]{padding:0 16px}.pagination-wrap[data-v-2fe5c266]{padding:10px;display:flex;justify-content:center;overflow:hidden} diff --git a/web/dist/assets/Profile.f583a607.js b/web/dist/assets/Profile.f583a607.js new file mode 100644 index 00000000..64c7a49b --- /dev/null +++ b/web/dist/assets/Profile.f583a607.js @@ -0,0 +1 @@ +import{_ as S}from"./post-item.11c28084.js";import{_ as U}from"./post-skeleton.38f0f247.js";import{_ as V}from"./main-nav.3167f221.js";import{ai as $,d as D,r as c,a2 as M,Y as o,a4 as e,a3 as _,a6 as h,a5 as r,a7 as d,aj as R,cc as j,W as t,Z as s,aa as f,ab as q,ac as F,$ as L,ae as T,c9 as W,ca as Y}from"./index.d4f5aad2.js";import{_ as Z}from"./List.a66e9ae7.js";import{_ as A}from"./Pagination.c13c2d34.js";import{a as G,_ as H}from"./Skeleton.e1c16fcb.js";import"./content.ed80294a.js";import"./formatTime.e07969bb.js";import"./Thing.d394adea.js";const J={class:"profile-baseinfo"},K={class:"avatar"},O={class:"base-info"},Q={class:"username"},X={class:"uid"},ee={key:0,class:"pagination-wrap"},te={key:0,class:"skeleton-wrap"},ae={key:1},se={key:0,class:"empty-wrap"},ne=D({__name:"Profile",setup(oe){const a=L(),k=R(),l=c(!1),u=c([]),i=c(+k.query.p||1),p=c(20),m=c(0),v=()=>{l.value=!0,j({username:a.state.userInfo.username,page:i.value,page_size:p.value}).then(n=>{l.value=!1,u.value=n.list,m.value=Math.ceil(n.pager.total_rows/p.value),window.scrollTo(0,0)}).catch(n=>{l.value=!1})},y=n=>{i.value=n,v()};return M(()=>{v()}),(n,_e)=>{const w=V,b=T,I=A,P=W,E=Y,x=U,B=G,C=S,z=H,N=Z;return t(),o("div",null,[e(w,{title:"\u4E3B\u9875"}),_(a).state.userInfo.id>0?(t(),h(N,{key:0,class:"main-content-wrap profile-wrap",bordered:""},{footer:r(()=>[m.value>1?(t(),o("div",ee,[e(I,{page:i.value,"onUpdate:page":y,"page-slot":_(a).state.collapsedRight?5:8,"page-count":m.value},null,8,["page","page-slot","page-count"])])):d("",!0)]),default:r(()=>[s("div",J,[s("div",K,[e(b,{size:"large",src:_(a).state.userInfo.avatar},null,8,["src"])]),s("div",O,[s("div",Q,[s("strong",null,f(_(a).state.userInfo.nickname),1),s("span",null," @"+f(_(a).state.userInfo.username),1)]),s("div",X,"UID. "+f(_(a).state.userInfo.id),1)])]),e(E,{class:"profile-tabs-wrap",animated:""},{default:r(()=>[e(P,{name:"post",tab:"\u6CE1\u6CE1"})]),_:1}),l.value?(t(),o("div",te,[e(x,{num:p.value},null,8,["num"])])):(t(),o("div",ae,[u.value.length===0?(t(),o("div",se,[e(B,{size:"large",description:"\u6682\u65E0\u6570\u636E"})])):d("",!0),(t(!0),o(q,null,F(u.value,g=>(t(),h(z,{key:g.id},{default:r(()=>[e(C,{post:g},null,8,["post"])]),_:2},1024))),128))]))]),_:1})):d("",!0)])}}});var ge=$(ne,[["__scopeId","data-v-2fe5c266"]]);export{ge as default}; diff --git a/web/dist/assets/Setting.67d59ade.js b/web/dist/assets/Setting.67d59ade.js new file mode 100644 index 00000000..4f2495b4 --- /dev/null +++ b/web/dist/assets/Setting.67d59ade.js @@ -0,0 +1 @@ +import{_ as Ce}from"./main-nav.3167f221.js";import{d as ae,W as l,Y as m,Z as d,ai as we,r as c,ci as ee,a2 as Be,af as De,a4 as u,a5 as t,a6 as B,a7 as v,$ as ye,cE as ue,aA as ke,a3 as i,a9 as p,aa as $,b4 as be,b5 as Ee,bu as P,cF as Ae,cG as Ie,cH as $e,cI as Pe,cJ as Ue,cK as Se,ae as Re,K as xe,_ as qe,cL as Ne,cM as Ke,cN as ze,cO as Me,a8 as U,bW as Le,bX as Oe}from"./index.d4f5aad2.js";import{c as Te}from"./Upload.6bcec76c.js";import{_ as Ve}from"./Alert.6cb9deb6.js";import{_ as je}from"./InputGroup.73d38f63.js";const We={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 24 24"},Ge=d("g",{fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[d("path",{d:"M9 7H6a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-3"}),d("path",{d:"M9 15h3l8.5-8.5a1.5 1.5 0 0 0-3-3L9 12v3"}),d("path",{d:"M16 5l3 3"})],-1),He=[Ge];var Je=ae({name:"Edit",render:function(j,W){return l(),m("svg",We,He)}});const z=k=>(Le("data-v-6eb93a4d"),k=k(),Oe(),k),Xe={class:"base-line avatar"},Ye={class:"base-line"},Ze=z(()=>d("span",{class:"base-label"},"\u6635\u79F0",-1)),Qe={key:0},eu={class:"base-line"},uu=z(()=>d("span",{class:"base-label"},"\u7528\u6237\u540D",-1)),au={key:0},tu={key:1},su=z(()=>d("br",null,null,-1)),nu={key:2,class:"phone-bind-wrap"},ou={class:"captcha-img-wrap"},lu={class:"captcha-img"},ru=["src"],iu={class:"form-submit-wrap"},du={key:0},cu={key:1},pu=z(()=>d("br",null,null,-1)),_u={key:2,class:"phone-bind-wrap"},vu={class:"captcha-img-wrap"},mu={class:"captcha-img"},fu=["src"],hu={class:"form-submit-wrap"},gu={key:1,class:"phone-bind-wrap"},Fu={class:"form-submit-wrap"},Cu=ae({__name:"Setting",setup(k){const j="/v1/attachment",W="Bearer "+localStorage.getItem("PAOPAO_TOKEN"),S=c("public/avatar"),b="true".toLowerCase()==="true",te="false".toLowerCase()==="true",n=ye(),E=c(!1),R=c(!1),x=c(!1),G=c(),H=c(),D=c(!1),q=c(!1),A=c(!1),I=c(!1),y=c(60),C=c(!1),w=c(!1),J=c(),X=c(),Y=c(),Z=c(),a=ee({id:"",b64s:"",imgCaptcha:"",phone:"",phone_captcha:"",password:"",old_password:"",reenteredPassword:""}),r=ee({id:"",b64s:"",imgCaptcha:"",activate_code:""}),se=async s=>{var e,f;return S.value==="public/avatar"&&!["image/png","image/jpg","image/jpeg"].includes((e=s.file.file)==null?void 0:e.type)?(window.$message.warning("\u5934\u50CF\u4EC5\u5141\u8BB8 png/jpg \u683C\u5F0F"),!1):S.value==="image"&&((f=s.file.file)==null?void 0:f.size)>1048576?(window.$message.warning("\u5934\u50CF\u5927\u5C0F\u4E0D\u80FD\u8D85\u8FC71MB"),!1):!0},ne=({file:s,event:e})=>{var f;try{let h=JSON.parse((f=e.target)==null?void 0:f.response);h.code===0&&S.value==="public/avatar"&&Ae({avatar:h.data.content}).then(_=>{var N;window.$message.success("\u5934\u50CF\u66F4\u65B0\u6210\u529F"),(N=G.value)==null||N.clear(),n.commit("updateUserinfo",{...n.state.userInfo,avatar:h.data.content})}).catch(_=>{console.log(_)})}catch{window.$message.error("\u4E0A\u4F20\u5931\u8D25")}},oe=(s,e)=>!!a.password&&a.password.startsWith(e)&&a.password.length>=e.length,le=(s,e)=>e===a.password,re=()=>{var s;a.reenteredPassword&&((s=Z.value)==null||s.validate({trigger:"password-input"}))},ie=s=>{var e;s.preventDefault(),(e=Y.value)==null||e.validate(f=>{f||(q.value=!0,Ie({password:a.password,old_password:a.old_password}).then(h=>{q.value=!1,A.value=!1,window.$message.success("\u5BC6\u7801\u91CD\u7F6E\u6210\u529F"),n.commit("userLogout"),n.commit("triggerAuth",!0),n.commit("triggerAuthKey","signin")}).catch(h=>{q.value=!1}))})},de=s=>{var e;s.preventDefault(),(e=J.value)==null||e.validate(f=>{f||(R.value=!0,$e({phone:a.phone,captcha:a.phone_captcha}).then(h=>{R.value=!1,C.value=!1,window.$message.success("\u7ED1\u5B9A\u6210\u529F"),n.commit("updateUserinfo",{...n.state.userInfo,phone:a.phone}),a.id="",a.b64s="",a.imgCaptcha="",a.phone="",a.phone_captcha=""}).catch(h=>{R.value=!1}))})},ce=s=>{var e;s.preventDefault(),(e=X.value)==null||e.validate(f=>{if(r.imgCaptcha===""){window.$message.warning("\u8BF7\u8F93\u5165\u56FE\u7247\u9A8C\u8BC1\u7801");return}E.value=!0,f||(x.value=!0,Pe({activate_code:r.activate_code,captcha_id:r.id,imgCaptcha:r.imgCaptcha}).then(h=>{x.value=!1,w.value=!1,window.$message.success("\u6FC0\u6D3B\u6210\u529F"),n.commit("updateUserinfo",{...n.state.userInfo,activation:r.activate_code}),r.id="",r.b64s="",r.imgCaptcha="",r.activate_code=""}).catch(h=>{x.value=!1,h.code===20012&&L()}))})},M=()=>{ue().then(s=>{a.id=s.id,a.b64s=s.b64s}).catch(s=>{console.log(s)})},L=()=>{ue().then(s=>{r.id=s.id,r.b64s=s.b64s}).catch(s=>{console.log(s)})},pe=()=>{Ue({nickname:n.state.userInfo.nickname||""}).then(s=>{D.value=!1,window.$message.success("\u6635\u79F0\u4FEE\u6539\u6210\u529F")}).catch(s=>{D.value=!0})},_e=()=>{if(!(y.value>0&&I.value)){if(a.imgCaptcha===""){window.$message.warning("\u8BF7\u8F93\u5165\u56FE\u7247\u9A8C\u8BC1\u7801");return}E.value=!0,Se({phone:a.phone,img_captcha:a.imgCaptcha,img_captcha_id:a.id}).then(s=>{I.value=!0,E.value=!1,window.$message.success("\u53D1\u9001\u6210\u529F");let e=setInterval(()=>{y.value--,y.value===0&&(clearInterval(e),y.value=60,I.value=!1)},1e3)}).catch(s=>{E.value=!1,s.code===20012&&M(),console.log(s)})}},ve={phone:[{required:!0,message:"\u8BF7\u8F93\u5165\u624B\u673A\u53F7",trigger:["input"],validator:(s,e)=>/^[1]+[3-9]{1}\d{9}$/.test(e)}],phone_captcha:[{required:!0,message:"\u8BF7\u8F93\u5165\u624B\u673A\u9A8C\u8BC1\u7801"}]},me={activate_code:[{required:!0,message:"\u8BF7\u8F93\u5165\u6FC0\u6D3B\u7801",trigger:["input"],validator:(s,e)=>/\d{6}$/.test(e)}]},fe={password:[{required:!0,message:"\u8BF7\u8F93\u5165\u65B0\u5BC6\u7801"}],old_password:[{required:!0,message:"\u8BF7\u8F93\u5165\u65E7\u5BC6\u7801"}],reenteredPassword:[{required:!0,message:"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801",trigger:["input","blur"]},{validator:oe,message:"\u4E24\u6B21\u5BC6\u7801\u8F93\u5165\u4E0D\u4E00\u81F4",trigger:"input"},{validator:le,message:"\u4E24\u6B21\u5BC6\u7801\u8F93\u5165\u4E0D\u4E00\u81F4",trigger:["blur","password-input"]}]},he=()=>{D.value=!0,setTimeout(()=>{var s;(s=H.value)==null||s.focus()},30)};return Be(()=>{n.state.userInfo.id===0&&(n.commit("triggerAuth",!0),n.commit("triggerAuthKey","signin")),M(),L()}),(s,e)=>{const f=Ce,h=Re,_=xe,N=Te,g=qe,ge=De,K=ke,Q=Ve,F=Ne,Fe=je,O=Ke,T=ze,V=Me;return l(),m("div",null,[u(f,{title:"\u8BBE\u7F6E",theme:""}),u(K,{title:"\u57FA\u672C\u4FE1\u606F",size:"small",class:"setting-card"},{default:t(()=>[d("div",Xe,[u(h,{class:"avatar-img",size:80,src:i(n).state.userInfo.avatar},null,8,["src"]),!b||b&&i(n).state.userInfo.phone&&i(n).state.userInfo.phone.length>0?(l(),B(N,{key:0,ref_key:"avatarRef",ref:G,action:j,headers:{Authorization:W},data:{type:S.value},onBeforeUpload:se,onFinish:ne},{default:t(()=>[u(_,{size:"small"},{default:t(()=>[p("\u66F4\u6539\u5934\u50CF")]),_:1})]),_:1},8,["headers","data"])):v("",!0)]),d("div",Ye,[Ze,D.value?v("",!0):(l(),m("div",Qe,$(i(n).state.userInfo.nickname),1)),be(u(g,{ref_key:"inputInstRef",ref:H,class:"nickname-input",value:i(n).state.userInfo.nickname,"onUpdate:value":e[0]||(e[0]=o=>i(n).state.userInfo.nickname=o),type:"text",size:"small",placeholder:"\u8BF7\u8F93\u5165\u6635\u79F0",onBlur:pe,maxlength:16},null,8,["value"]),[[Ee,D.value]]),!D.value&&(!b||b&&i(n).state.userInfo.phone&&i(n).state.userInfo.phone.length>0&&i(n).state.userInfo.status==1)?(l(),B(_,{key:1,quaternary:"",round:"",type:"success",size:"small",onClick:he},{icon:t(()=>[u(ge,null,{default:t(()=>[u(i(Je))]),_:1})]),_:1})):v("",!0)]),d("div",eu,[uu,p(" @"+$(i(n).state.userInfo.username),1)])]),_:1}),b?(l(),B(K,{key:0,title:"\u624B\u673A\u53F7",size:"small",class:"setting-card"},{default:t(()=>[i(n).state.userInfo.phone&&i(n).state.userInfo.phone.length>0?(l(),m("div",au,[p($(i(n).state.userInfo.phone)+" ",1),!C.value&&i(n).state.userInfo.status==1?(l(),B(_,{key:0,quaternary:"",round:"",type:"success",onClick:e[1]||(e[1]=o=>C.value=!0)},{default:t(()=>[p(" \u6362\u7ED1\u624B\u673A ")]),_:1})):v("",!0)])):(l(),m("div",tu,[u(Q,{title:"\u624B\u673A\u7ED1\u5B9A\u63D0\u793A",type:"warning"},{default:t(()=>[p(" \u6210\u529F\u7ED1\u5B9A\u624B\u673A\u540E\uFF0C\u624D\u80FD\u8FDB\u884C\u6362\u5934\u50CF\u3001\u53D1\u52A8\u6001\u3001\u56DE\u590D\u7B49\u4EA4\u4E92~"),su,C.value?v("",!0):(l(),m("a",{key:0,class:"hash-link",onClick:e[2]||(e[2]=o=>C.value=!0)}," \u7ACB\u5373\u7ED1\u5B9A "))]),_:1})])),C.value?(l(),m("div",nu,[u(V,{ref_key:"phoneFormRef",ref:J,model:a,rules:ve},{default:t(()=>[u(F,{path:"phone",label:"\u624B\u673A\u53F7"},{default:t(()=>[u(g,{value:a.phone,"onUpdate:value":e[3]||(e[3]=o=>a.phone=o.trim()),placeholder:"\u8BF7\u8F93\u5165\u4E2D\u56FD\u5927\u9646\u624B\u673A\u53F7",onKeydown:e[4]||(e[4]=P(U(()=>{},["prevent"]),["enter"]))},null,8,["value"])]),_:1}),u(F,{path:"img_captcha",label:"\u56FE\u5F62\u9A8C\u8BC1\u7801"},{default:t(()=>[d("div",ou,[u(g,{value:a.imgCaptcha,"onUpdate:value":e[5]||(e[5]=o=>a.imgCaptcha=o),placeholder:"\u8BF7\u8F93\u5165\u56FE\u5F62\u9A8C\u8BC1\u7801\u540E\u83B7\u53D6\u9A8C\u8BC1\u7801"},null,8,["value"]),d("div",lu,[a.b64s?(l(),m("img",{key:0,src:a.b64s,onClick:M},null,8,ru)):v("",!0)])])]),_:1}),u(F,{path:"phone_captcha",label:"\u77ED\u4FE1\u9A8C\u8BC1\u7801"},{default:t(()=>[u(Fe,null,{default:t(()=>[u(g,{value:a.phone_captcha,"onUpdate:value":e[6]||(e[6]=o=>a.phone_captcha=o),placeholder:"\u8BF7\u8F93\u5165\u6536\u5230\u7684\u77ED\u4FE1\u9A8C\u8BC1\u7801"},null,8,["value"]),u(_,{type:"primary",ghost:"",disabled:I.value,loading:E.value,onClick:_e},{default:t(()=>[p($(y.value>0&&I.value?y.value+"s\u540E\u91CD\u65B0\u53D1\u9001":"\u53D1\u9001\u9A8C\u8BC1\u7801"),1)]),_:1},8,["disabled","loading"])]),_:1})]),_:1}),u(T,{gutter:[0,24]},{default:t(()=>[u(O,{span:24},{default:t(()=>[d("div",iu,[u(_,{quaternary:"",round:"",onClick:e[7]||(e[7]=o=>C.value=!1)},{default:t(()=>[p(" \u53D6\u6D88 ")]),_:1}),u(_,{secondary:"",round:"",type:"primary",loading:R.value,onClick:de},{default:t(()=>[p(" \u7ED1\u5B9A ")]),_:1},8,["loading"])])]),_:1})]),_:1})]),_:1},8,["model"])])):v("",!0)]),_:1})):v("",!0),te?(l(),B(K,{key:1,title:"\u6FC0\u6D3B\u7801",size:"small",class:"setting-card"},{default:t(()=>[i(n).state.userInfo.activation&&i(n).state.userInfo.activation.length>0?(l(),m("div",du,[p($(i(n).state.userInfo.activation)+" ",1),w.value?v("",!0):(l(),B(_,{key:0,quaternary:"",round:"",type:"success",onClick:e[8]||(e[8]=o=>w.value=!0)},{default:t(()=>[p(" \u91CD\u65B0\u6FC0\u6D3B ")]),_:1}))])):(l(),m("div",cu,[u(Q,{title:"\u6FC0\u6D3B\u7801\u6FC0\u6D3B\u63D0\u793A",type:"warning"},{default:t(()=>[p(" \u6210\u529F\u6FC0\u6D3B\u540E\u540E\uFF0C\u624D\u80FD\u53D1\uFF08\u516C\u5F00/\u597D\u53CB\u53EF\u89C1\uFF09\u52A8\u6001\u3001\u56DE\u590D~"),pu,w.value?v("",!0):(l(),m("a",{key:0,class:"hash-link",onClick:e[9]||(e[9]=o=>w.value=!0)}," \u7ACB\u5373\u6FC0\u6D3B "))]),_:1})])),w.value?(l(),m("div",_u,[u(V,{ref_key:"activateFormRef",ref:X,model:r,rules:me},{default:t(()=>[u(F,{path:"activate_code",label:"\u6FC0\u6D3B\u7801"},{default:t(()=>[u(g,{value:r.activate_code,"onUpdate:value":e[10]||(e[10]=o=>r.activate_code=o.trim()),placeholder:"\u8BF7\u8F93\u5165\u6FC0\u6D3B\u7801",onKeydown:e[11]||(e[11]=P(U(()=>{},["prevent"]),["enter"]))},null,8,["value"])]),_:1}),u(F,{path:"img_captcha",label:"\u56FE\u5F62\u9A8C\u8BC1\u7801"},{default:t(()=>[d("div",vu,[u(g,{value:r.imgCaptcha,"onUpdate:value":e[12]||(e[12]=o=>r.imgCaptcha=o),placeholder:"\u8BF7\u8F93\u5165\u56FE\u5F62\u9A8C\u8BC1\u7801\u540E\u83B7\u53D6\u9A8C\u8BC1\u7801"},null,8,["value"]),d("div",mu,[r.b64s?(l(),m("img",{key:0,src:r.b64s,onClick:L},null,8,fu)):v("",!0)])])]),_:1}),u(T,{gutter:[0,24]},{default:t(()=>[u(O,{span:24},{default:t(()=>[d("div",hu,[u(_,{quaternary:"",round:"",onClick:e[13]||(e[13]=o=>w.value=!1)},{default:t(()=>[p(" \u53D6\u6D88 ")]),_:1}),u(_,{secondary:"",round:"",type:"primary",loading:x.value,onClick:ce},{default:t(()=>[p(" \u6FC0\u6D3B ")]),_:1},8,["loading"])])]),_:1})]),_:1})]),_:1},8,["model"])])):v("",!0)]),_:1})):v("",!0),u(K,{title:"\u8D26\u6237\u5B89\u5168",size:"small",class:"setting-card"},{default:t(()=>[p(" \u60A8\u5DF2\u8BBE\u7F6E\u5BC6\u7801 "),A.value?v("",!0):(l(),B(_,{key:0,quaternary:"",round:"",type:"success",onClick:e[14]||(e[14]=o=>A.value=!0)},{default:t(()=>[p(" \u91CD\u7F6E\u5BC6\u7801 ")]),_:1})),A.value?(l(),m("div",gu,[u(V,{ref_key:"formRef",ref:Y,model:a,rules:fe},{default:t(()=>[u(F,{path:"old_password",label:"\u65E7\u5BC6\u7801"},{default:t(()=>[u(g,{value:a.old_password,"onUpdate:value":e[15]||(e[15]=o=>a.old_password=o),type:"password",placeholder:"\u8BF7\u8F93\u5165\u5F53\u524D\u5BC6\u7801",onKeydown:e[16]||(e[16]=P(U(()=>{},["prevent"]),["enter"]))},null,8,["value"])]),_:1}),u(F,{path:"password",label:"\u65B0\u5BC6\u7801"},{default:t(()=>[u(g,{value:a.password,"onUpdate:value":e[17]||(e[17]=o=>a.password=o),type:"password",placeholder:"\u8BF7\u8F93\u5165\u65B0\u5BC6\u7801",onInput:re,onKeydown:e[18]||(e[18]=P(U(()=>{},["prevent"]),["enter"]))},null,8,["value"])]),_:1}),u(F,{ref_key:"rPasswordFormItemRef",ref:Z,first:"",path:"reenteredPassword",label:"\u91CD\u590D\u5BC6\u7801"},{default:t(()=>[u(g,{value:a.reenteredPassword,"onUpdate:value":e[19]||(e[19]=o=>a.reenteredPassword=o),disabled:!a.password,type:"password",placeholder:"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801",onKeydown:e[20]||(e[20]=P(U(()=>{},["prevent"]),["enter"]))},null,8,["value","disabled"])]),_:1},512),u(T,{gutter:[0,24]},{default:t(()=>[u(O,{span:24},{default:t(()=>[d("div",Fu,[u(_,{quaternary:"",round:"",onClick:e[21]||(e[21]=o=>A.value=!1)},{default:t(()=>[p(" \u53D6\u6D88 ")]),_:1}),u(_,{secondary:"",round:"",type:"primary",loading:q.value,onClick:ie},{default:t(()=>[p(" \u66F4\u65B0 ")]),_:1},8,["loading"])])]),_:1})]),_:1})]),_:1},8,["model"])])):v("",!0)]),_:1})])}}});var bu=we(Cu,[["__scopeId","data-v-6eb93a4d"]]);export{bu as default}; diff --git a/web/dist/assets/Setting.a66de7b5.css b/web/dist/assets/Setting.a66de7b5.css new file mode 100644 index 00000000..f13fdbc0 --- /dev/null +++ b/web/dist/assets/Setting.a66de7b5.css @@ -0,0 +1 @@ +.setting-card[data-v-6eb93a4d]{margin-top:-1px;border-radius:0}.setting-card .form-submit-wrap[data-v-6eb93a4d]{display:flex;justify-content:flex-end}.setting-card .base-line[data-v-6eb93a4d]{line-height:2;display:flex;align-items:center}.setting-card .base-line .base-label[data-v-6eb93a4d]{opacity:.75;margin-right:12px}.setting-card .base-line .nickname-input[data-v-6eb93a4d]{margin-right:10px;width:120px}.setting-card .avatar[data-v-6eb93a4d]{display:flex;flex-direction:column;align-items:flex-start;margin-bottom:20px}.setting-card .avatar .avatar-img[data-v-6eb93a4d]{margin-bottom:10px}.setting-card .hash-link[data-v-6eb93a4d]{margin-left:12px}.setting-card .phone-bind-wrap[data-v-6eb93a4d]{margin-top:20px}.setting-card .phone-bind-wrap .captcha-img-wrap[data-v-6eb93a4d]{width:100%;display:flex;align-items:center}.setting-card .phone-bind-wrap .captcha-img[data-v-6eb93a4d]{width:125px;height:34px;border-radius:3px;margin-left:10px;overflow:hidden;cursor:pointer}.setting-card .phone-bind-wrap .captcha-img img[data-v-6eb93a4d]{width:100%;height:100%} diff --git a/web/dist/assets/Skeleton.e1c16fcb.js b/web/dist/assets/Skeleton.e1c16fcb.js new file mode 100644 index 00000000..3be1dbc2 --- /dev/null +++ b/web/dist/assets/Skeleton.e1c16fcb.js @@ -0,0 +1,147 @@ +import{ba as je,d as O,aE as De,aF as Ae,a2 as se,bb as Ke,bc as We,y as T,r as $,v as Y,aw as re,av as K,h as d,bd as ye,be as de,aH as ne,bf as Ge,bg as ce,as as xe,c as L,f as V,b as j,u as we,x as W,bh as qe,J as Ue,q as Z,bi as Xe,z as D,A as Se,N as ze,bj as ae,aJ as Re,b3 as Ye,e as A,a as Ze,aX as Je,t as H,bk as Qe,bl as et,S as ue,V as tt,bm as oe,p as fe,bn as nt,B as ot,az as it,bo as lt,L as rt,aS as ve,bp as st,k as at,ab as dt}from"./index.d4f5aad2.js";import{l as ct}from"./List.a66e9ae7.js";function ie(e){const t=e.filter(o=>o!==void 0);if(t.length!==0)return t.length===1?t[0]:o=>{e.forEach(s=>{s&&s(o)})}}let he=!1;function ut(){if(!!je&&!!window.CSS&&!he&&(he=!0,"registerProperty"in(window==null?void 0:window.CSS)))try{CSS.registerProperty({name:"--n-color-start",syntax:"",inherits:!1,initialValue:"#0000"}),CSS.registerProperty({name:"--n-color-end",syntax:"",inherits:!1,initialValue:"#0000"})}catch{}}function me(e){return e&-e}class ft{constructor(t,o){this.l=t,this.min=o;const s=new Array(t+1);for(let r=0;rr)throw new Error("[FinweckTree.sum]: `i` is larger than length.");let a=t*s;for(;t>0;)a+=o[t],t-=me(t);return a}getBound(t){let o=0,s=this.l;for(;s>o;){const r=Math.floor((o+s)/2),a=this.sum(r);if(a>t){s=r;continue}else if(a[]},itemSize:{type:Number,required:!0},itemResizable:Boolean,itemsStyle:[String,Object],visibleItemsTag:{type:[String,Object],default:"div"},visibleItemsProps:Object,ignoreItemResize:Boolean,onScroll:Function,onWheel:Function,onResize:Function,defaultScrollKey:[Number,String],defaultScrollIndex:Number,keyField:{type:String,default:"key"},paddingTop:{type:[Number,String],default:0},paddingBottom:{type:[Number,String],default:0}},setup(e){const t=De();ht.mount({id:"vueuc/virtual-list",head:!0,anchorMetaName:Ae,ssr:t}),se(()=>{const{defaultScrollIndex:i,defaultScrollKey:c}=e;i!=null?h({index:i}):c!=null&&h({key:c})});let o=!1,s=!1;Ke(()=>{if(o=!1,!s){s=!0;return}h({top:m.value,left:f})}),We(()=>{o=!0,s||(s=!0)});const r=T(()=>{const i=new Map,{keyField:c}=e;return e.items.forEach((g,k)=>{i.set(g[c],k)}),i}),a=$(null),u=$(void 0),v=new Map,R=T(()=>{const{items:i,itemSize:c,keyField:g}=e,k=new ft(i.length,c);return i.forEach((C,P)=>{const p=C[g],_=v.get(p);_!==void 0&&k.add(P,_)}),k}),b=$(0);let f=0;const m=$(0),z=Y(()=>Math.max(R.value.getBound(m.value-re(e.paddingTop))-1,0)),F=T(()=>{const{value:i}=u;if(i===void 0)return[];const{items:c,itemSize:g}=e,k=z.value,C=Math.min(k+Math.ceil(i/g+1),c.length-1),P=[];for(let p=k;p<=C;++p)P.push(c[p]);return P}),h=(i,c)=>{if(typeof i=="number"){x(i,c,"auto");return}const{left:g,top:k,index:C,key:P,position:p,behavior:_,debounce:n=!0}=i;if(g!==void 0||k!==void 0)x(g,k,_);else if(C!==void 0)S(C,_,n);else if(P!==void 0){const l=r.value.get(P);l!==void 0&&S(l,_,n)}else p==="bottom"?x(0,Number.MAX_SAFE_INTEGER,_):p==="top"&&x(0,0,_)};let y,M=null;function S(i,c,g){const{value:k}=R,C=k.sum(i)+re(e.paddingTop);if(!g)a.value.scrollTo({left:0,top:C,behavior:c});else{y=i,M!==null&&window.clearTimeout(M),M=window.setTimeout(()=>{y=void 0,M=null},16);const{scrollTop:P,offsetHeight:p}=a.value;if(C>P){const _=k.get(i);C+_<=P+p||a.value.scrollTo({left:0,top:C+_-p,behavior:c})}else a.value.scrollTo({left:0,top:C,behavior:c})}}function x(i,c,g){a.value.scrollTo({left:i,top:c,behavior:g})}function I(i,c){var g,k,C;if(o||e.ignoreItemResize||U(c.target))return;const{value:P}=R,p=r.value.get(i),_=P.get(p),n=(C=(k=(g=c.borderBoxSize)===null||g===void 0?void 0:g[0])===null||k===void 0?void 0:k.blockSize)!==null&&C!==void 0?C:c.contentRect.height;if(n===_)return;n-e.itemSize===0?v.delete(i):v.set(i,n-e.itemSize);const w=n-_;if(w===0)return;P.add(p,w);const N=a.value;if(N!=null){if(y===void 0){const q=P.sum(p);N.scrollTop>q&&N.scrollBy(0,w)}else if(pN.scrollTop+N.offsetHeight&&N.scrollBy(0,w)}G()}b.value++}const B=!vt();let E=!1;function J(i){var c;(c=e.onScroll)===null||c===void 0||c.call(e,i),(!B||!E)&&G()}function Q(i){var c;if((c=e.onWheel)===null||c===void 0||c.call(e,i),B){const g=a.value;if(g!=null){if(i.deltaX===0&&(g.scrollTop===0&&i.deltaY<=0||g.scrollTop+g.offsetHeight>=g.scrollHeight&&i.deltaY>=0))return;i.preventDefault(),g.scrollTop+=i.deltaY/ge(),g.scrollLeft+=i.deltaX/ge(),G(),E=!0,Ge(()=>{E=!1})}}}function ee(i){if(o||U(i.target)||i.contentRect.height===u.value)return;u.value=i.contentRect.height;const{onResize:c}=e;c!==void 0&&c(i)}function G(){const{value:i}=a;i!=null&&(m.value=i.scrollTop,f=i.scrollLeft)}function U(i){let c=i;for(;c!==null;){if(c.style.display==="none")return!0;c=c.parentElement}return!1}return{listHeight:u,listStyle:{overflow:"auto"},keyToIndex:r,itemsStyle:T(()=>{const{itemResizable:i}=e,c=K(R.value.sum());return b.value,[e.itemsStyle,{boxSizing:"content-box",height:i?"":c,minHeight:i?c:"",paddingTop:K(e.paddingTop),paddingBottom:K(e.paddingBottom)}]}),visibleItemsStyle:T(()=>(b.value,{transform:`translateY(${K(R.value.sum(z.value))})`})),viewportItems:F,listElRef:a,itemsElRef:$(null),scrollTo:h,handleListResize:ee,handleListScroll:J,handleListWheel:Q,handleItemResize:I}},render(){const{itemResizable:e,keyField:t,keyToIndex:o,visibleItemsTag:s}=this;return d(de,{onResize:this.handleListResize},{default:()=>{var r,a;return d("div",ye(this.$attrs,{class:["v-vl",this.showScrollbar&&"v-vl--show-scrollbar"],onScroll:this.handleListScroll,onWheel:this.handleListWheel,ref:"listElRef"}),[this.items.length!==0?d("div",{ref:"itemsElRef",class:"v-vl-items",style:this.itemsStyle},[d(s,Object.assign({class:"v-vl-visible-items",style:this.visibleItemsStyle},this.visibleItemsProps),{default:()=>this.viewportItems.map(u=>{const v=u[t],R=o.get(v),b=this.$slots.default({item:u,index:R})[0];return e?d(de,{key:v,onResize:f=>this.handleItemResize(v,f)},{default:()=>b}):(b.key=v,b)})})]):(a=(r=this.$slots).empty)===null||a===void 0?void 0:a.call(r)])}})}});function gt(e,t){t&&(se(()=>{const{value:o}=e;o&&ce.registerHandler(o,t)}),xe(()=>{const{value:o}=e;o&&ce.unregisterHandler(o)}))}var pt=O({name:"Checkmark",render(){return d("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 16 16"},d("g",{fill:"none"},d("path",{d:"M14.046 3.486a.75.75 0 0 1-.032 1.06l-7.93 7.474a.85.85 0 0 1-1.188-.022l-2.68-2.72a.75.75 0 1 1 1.068-1.053l2.234 2.267l7.468-7.038a.75.75 0 0 1 1.06.032z",fill:"currentColor"})))}}),bt=O({name:"Empty",render(){return d("svg",{viewBox:"0 0 28 28",fill:"none",xmlns:"http://www.w3.org/2000/svg"},d("path",{d:"M26 7.5C26 11.0899 23.0899 14 19.5 14C15.9101 14 13 11.0899 13 7.5C13 3.91015 15.9101 1 19.5 1C23.0899 1 26 3.91015 26 7.5ZM16.8536 4.14645C16.6583 3.95118 16.3417 3.95118 16.1464 4.14645C15.9512 4.34171 15.9512 4.65829 16.1464 4.85355L18.7929 7.5L16.1464 10.1464C15.9512 10.3417 15.9512 10.6583 16.1464 10.8536C16.3417 11.0488 16.6583 11.0488 16.8536 10.8536L19.5 8.20711L22.1464 10.8536C22.3417 11.0488 22.6583 11.0488 22.8536 10.8536C23.0488 10.6583 23.0488 10.3417 22.8536 10.1464L20.2071 7.5L22.8536 4.85355C23.0488 4.65829 23.0488 4.34171 22.8536 4.14645C22.6583 3.95118 22.3417 3.95118 22.1464 4.14645L19.5 6.79289L16.8536 4.14645Z",fill:"currentColor"}),d("path",{d:"M25 22.75V12.5991C24.5572 13.0765 24.053 13.4961 23.5 13.8454V16H17.5L17.3982 16.0068C17.0322 16.0565 16.75 16.3703 16.75 16.75C16.75 18.2688 15.5188 19.5 14 19.5C12.4812 19.5 11.25 18.2688 11.25 16.75L11.2432 16.6482C11.1935 16.2822 10.8797 16 10.5 16H4.5V7.25C4.5 6.2835 5.2835 5.5 6.25 5.5H12.2696C12.4146 4.97463 12.6153 4.47237 12.865 4H6.25C4.45507 4 3 5.45507 3 7.25V22.75C3 24.5449 4.45507 26 6.25 26H21.75C23.5449 26 25 24.5449 25 22.75ZM4.5 22.75V17.5H9.81597L9.85751 17.7041C10.2905 19.5919 11.9808 21 14 21L14.215 20.9947C16.2095 20.8953 17.842 19.4209 18.184 17.5H23.5V22.75C23.5 23.7165 22.7165 24.5 21.75 24.5H6.25C5.2835 24.5 4.5 23.7165 4.5 22.75Z",fill:"currentColor"}))}}),yt=O({props:{onFocus:Function,onBlur:Function},setup(e){return()=>d("div",{style:"width: 0; height: 0",tabindex:0,onFocus:e.onFocus,onBlur:e.onBlur})}}),xt=L("empty",` + display: flex; + flex-direction: column; + align-items: center; + font-size: var(--n-font-size); +`,[V("icon",` + width: var(--n-icon-size); + height: var(--n-icon-size); + font-size: var(--n-icon-size); + line-height: var(--n-icon-size); + color: var(--n-icon-color); + transition: + color .3s var(--n-bezier); + `,[j("+",[V("description",` + margin-top: 8px; + `)])]),V("description",` + transition: color .3s var(--n-bezier); + color: var(--n-text-color); + `),V("extra",` + text-align: center; + transition: color .3s var(--n-bezier); + margin-top: 12px; + color: var(--n-extra-text-color); + `)]);const wt=Object.assign(Object.assign({},W.props),{description:String,showDescription:{type:Boolean,default:!0},showIcon:{type:Boolean,default:!0},size:{type:String,default:"medium"},renderIcon:Function});var St=O({name:"Empty",props:wt,setup(e){const{mergedClsPrefixRef:t,inlineThemeDisabled:o}=we(e),s=W("Empty","-empty",xt,qe,e,t),{localeRef:r}=Ue("Empty"),a=Z(Xe,null),u=T(()=>{var f,m,z;return(f=e.description)!==null&&f!==void 0?f:(z=(m=a==null?void 0:a.mergedComponentPropsRef.value)===null||m===void 0?void 0:m.Empty)===null||z===void 0?void 0:z.description}),v=T(()=>{var f,m;return((m=(f=a==null?void 0:a.mergedComponentPropsRef.value)===null||f===void 0?void 0:f.Empty)===null||m===void 0?void 0:m.renderIcon)||(()=>d(bt,null))}),R=T(()=>{const{size:f}=e,{common:{cubicBezierEaseInOut:m},self:{[D("iconSize",f)]:z,[D("fontSize",f)]:F,textColor:h,iconColor:y,extraTextColor:M}}=s.value;return{"--n-icon-size":z,"--n-font-size":F,"--n-bezier":m,"--n-text-color":h,"--n-icon-color":y,"--n-extra-text-color":M}}),b=o?Se("empty",T(()=>{let f="";const{size:m}=e;return f+=m[0],f}),R,e):void 0;return{mergedClsPrefix:t,mergedRenderIcon:v,localizedDescription:T(()=>u.value||r.value.description),cssVars:o?void 0:R,themeClass:b==null?void 0:b.themeClass,onRender:b==null?void 0:b.onRender}},render(){const{$slots:e,mergedClsPrefix:t,onRender:o}=this;return o==null||o(),d("div",{class:[`${t}-empty`,this.themeClass],style:this.cssVars},this.showIcon?d("div",{class:`${t}-empty__icon`},e.icon?e.icon():d(ze,{clsPrefix:t},{default:this.mergedRenderIcon})):null,this.showDescription?d("div",{class:`${t}-empty__description`},e.default?e.default():this.localizedDescription):null,e.extra?d("div",{class:`${t}-empty__extra`},e.extra()):null)}});function zt(e,t){return d(Ye,{name:"fade-in-scale-up-transition"},{default:()=>e?d(ze,{clsPrefix:t,class:`${t}-base-select-option__check`},{default:()=>d(pt)}):null})}var pe=O({name:"NBaseSelectOption",props:{clsPrefix:{type:String,required:!0},tmNode:{type:Object,required:!0}},setup(e){const{valueRef:t,pendingTmNodeRef:o,multipleRef:s,valueSetRef:r,renderLabelRef:a,renderOptionRef:u,labelFieldRef:v,valueFieldRef:R,showCheckmarkRef:b,nodePropsRef:f,handleOptionClick:m,handleOptionMouseEnter:z}=Z(ae),F=Y(()=>{const{value:S}=o;return S?e.tmNode.key===S.key:!1});function h(S){const{tmNode:x}=e;x.disabled||m(S,x)}function y(S){const{tmNode:x}=e;x.disabled||z(S,x)}function M(S){const{tmNode:x}=e,{value:I}=F;x.disabled||I||z(S,x)}return{multiple:s,isGrouped:Y(()=>{const{tmNode:S}=e,{parent:x}=S;return x&&x.rawNode.type==="group"}),showCheckmark:b,nodeProps:f,isPending:F,isSelected:Y(()=>{const{value:S}=t,{value:x}=s;if(S===null)return!1;const I=e.tmNode.rawNode[R.value];if(x){const{value:B}=r;return B.has(I)}else return S===I}),labelField:v,renderLabel:a,renderOption:u,handleMouseMove:M,handleMouseEnter:y,handleClick:h}},render(){const{clsPrefix:e,tmNode:{rawNode:t},isSelected:o,isPending:s,isGrouped:r,showCheckmark:a,nodeProps:u,renderOption:v,renderLabel:R,handleClick:b,handleMouseEnter:f,handleMouseMove:m}=this,z=zt(o,e),F=R?[R(t,o),a&&z]:[Re(t[this.labelField],t,o),a&&z],h=u==null?void 0:u(t),y=d("div",Object.assign({},h,{class:[`${e}-base-select-option`,t.class,h==null?void 0:h.class,{[`${e}-base-select-option--disabled`]:t.disabled,[`${e}-base-select-option--selected`]:o,[`${e}-base-select-option--grouped`]:r,[`${e}-base-select-option--pending`]:s,[`${e}-base-select-option--show-checkmark`]:a}],style:[(h==null?void 0:h.style)||"",t.style||""],onClick:ie([b,h==null?void 0:h.onClick]),onMouseenter:ie([f,h==null?void 0:h.onMouseenter]),onMousemove:ie([m,h==null?void 0:h.onMousemove])}),d("div",{class:`${e}-base-select-option__content`},F));return t.render?t.render({node:y,option:t,selected:o}):v?v({node:y,option:t,selected:o}):y}}),be=O({name:"NBaseSelectGroupHeader",props:{clsPrefix:{type:String,required:!0},tmNode:{type:Object,required:!0}},setup(){const{renderLabelRef:e,renderOptionRef:t,labelFieldRef:o,nodePropsRef:s}=Z(ae);return{labelField:o,nodeProps:s,renderLabel:e,renderOption:t}},render(){const{clsPrefix:e,renderLabel:t,renderOption:o,nodeProps:s,tmNode:{rawNode:r}}=this,a=s==null?void 0:s(r),u=t?t(r,!1):Re(r[this.labelField],r,!1),v=d("div",Object.assign({},a,{class:[`${e}-base-select-group-header`,a==null?void 0:a.class]}),u);return r.render?r.render({node:v,option:r}):o?o({node:v,option:r,selected:!1}):v}}),Rt=L("base-select-menu",` + line-height: 1.5; + outline: none; + z-index: 0; + position: relative; + border-radius: var(--n-border-radius); + transition: + background-color .3s var(--n-bezier), + box-shadow .3s var(--n-bezier); + background-color: var(--n-color); +`,[L("scrollbar",` + max-height: var(--n-height); + `),L("virtual-list",` + max-height: var(--n-height); + `),L("base-select-option",` + min-height: var(--n-option-height); + font-size: var(--n-option-font-size); + display: flex; + align-items: center; + `,[V("content",` + z-index: 1; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + `)]),L("base-select-group-header",` + min-height: var(--n-option-height); + font-size: .93em; + display: flex; + align-items: center; + `),L("base-select-menu-option-wrapper",` + position: relative; + width: 100%; + `),V("loading, empty",` + display: flex; + padding: 12px 32px; + flex: 1; + justify-content: center; + `),V("loading",` + color: var(--n-loading-color); + font-size: var(--n-loading-size); + `),V("action",` + padding: 8px var(--n-option-padding-left); + font-size: var(--n-option-font-size); + transition: + color .3s var(--n-bezier), + border-color .3s var(--n-bezier); + border-top: 1px solid var(--n-action-divider-color); + color: var(--n-action-text-color); + `),L("base-select-group-header",` + position: relative; + cursor: default; + padding: var(--n-option-padding); + color: var(--n-group-header-text-color); + `),L("base-select-option",` + cursor: pointer; + position: relative; + padding: var(--n-option-padding); + transition: + color .3s var(--n-bezier), + opacity .3s var(--n-bezier); + box-sizing: border-box; + color: var(--n-option-text-color); + opacity: 1; + `,[A("show-checkmark",` + padding-right: calc(var(--n-option-padding-right) + 20px); + `),j("&::before",` + content: ""; + position: absolute; + left: 4px; + right: 4px; + top: 0; + bottom: 0; + border-radius: var(--n-border-radius); + transition: background-color .3s var(--n-bezier); + `),j("&:active",` + color: var(--n-option-text-color-pressed); + `),A("grouped",` + padding-left: calc(var(--n-option-padding-left) * 1.5); + `),A("pending",[j("&::before",` + background-color: var(--n-option-color-pending); + `)]),A("selected",` + color: var(--n-option-text-color-active); + `,[j("&::before",` + background-color: var(--n-option-color-active); + `),A("pending",[j("&::before",` + background-color: var(--n-option-color-active-pending); + `)])]),A("disabled",` + cursor: not-allowed; + `,[Ze("selected",` + color: var(--n-option-text-color-disabled); + `),A("selected",` + opacity: var(--n-option-opacity-disabled); + `)]),V("check",` + font-size: 16px; + position: absolute; + right: calc(var(--n-option-padding-right) - 4px); + top: calc(50% - 7px); + color: var(--n-option-check-color); + transition: color .3s var(--n-bezier); + `,[Je({enterScale:"0.5"})])])]),Nt=O({name:"InternalSelectMenu",props:Object.assign(Object.assign({},W.props),{clsPrefix:{type:String,required:!0},scrollable:{type:Boolean,default:!0},treeMate:{type:Object,required:!0},multiple:Boolean,size:{type:String,default:"medium"},value:{type:[String,Number,Array],default:null},autoPending:Boolean,virtualScroll:{type:Boolean,default:!0},show:{type:Boolean,default:!0},labelField:{type:String,default:"label"},valueField:{type:String,default:"value"},loading:Boolean,focusable:Boolean,renderLabel:Function,renderOption:Function,nodeProps:Function,showCheckmark:{type:Boolean,default:!0},onMousedown:Function,onScroll:Function,onFocus:Function,onBlur:Function,onKeyup:Function,onKeydown:Function,onTabOut:Function,onMouseenter:Function,onMouseleave:Function,onResize:Function,resetMenuOnOptionsChange:{type:Boolean,default:!0},inlineThemeDisabled:Boolean,onToggle:Function}),setup(e){const t=W("InternalSelectMenu","-internal-select-menu",Rt,Qe,e,H(e,"clsPrefix")),o=$(null),s=$(null),r=$(null),a=T(()=>e.treeMate.getFlattenedNodes()),u=T(()=>et(a.value)),v=$(null);function R(){const{treeMate:n}=e;let l=null;const{value:w}=e;w===null?l=n.getFirstAvailableNode():(e.multiple?l=n.getNode((w||[])[(w||[]).length-1]):l=n.getNode(w),(!l||l.disabled)&&(l=n.getFirstAvailableNode())),i(l||null)}function b(){const{value:n}=v;n&&!e.treeMate.getNode(n.key)&&(v.value=null)}let f;ue(()=>e.show,n=>{n?f=ue(()=>e.treeMate,()=>{e.resetMenuOnOptionsChange?(e.autoPending?R():b(),tt(c)):b()},{immediate:!0}):f==null||f()},{immediate:!0}),xe(()=>{f==null||f()});const m=T(()=>re(t.value.self[D("optionHeight",e.size)])),z=T(()=>oe(t.value.self[D("padding",e.size)])),F=T(()=>e.multiple&&Array.isArray(e.value)?new Set(e.value):new Set),h=T(()=>{const n=a.value;return n&&n.length===0});function y(n){const{onToggle:l}=e;l&&l(n)}function M(n){const{onScroll:l}=e;l&&l(n)}function S(n){var l;(l=r.value)===null||l===void 0||l.sync(),M(n)}function x(){var n;(n=r.value)===null||n===void 0||n.sync()}function I(){const{value:n}=v;return n||null}function B(n,l){l.disabled||i(l,!1)}function E(n,l){l.disabled||y(l)}function J(n){var l;ve(n,"action")||(l=e.onKeyup)===null||l===void 0||l.call(e,n)}function Q(n){var l;ve(n,"action")||(l=e.onKeydown)===null||l===void 0||l.call(e,n)}function ee(n){var l;(l=e.onMousedown)===null||l===void 0||l.call(e,n),!e.focusable&&n.preventDefault()}function G(){const{value:n}=v;n&&i(n.getNext({loop:!0}),!0)}function U(){const{value:n}=v;n&&i(n.getPrev({loop:!0}),!0)}function i(n,l=!1){v.value=n,l&&c()}function c(){var n,l;const w=v.value;if(!w)return;const N=u.value(w.key);N!==null&&(e.virtualScroll?(n=s.value)===null||n===void 0||n.scrollTo({index:N}):(l=r.value)===null||l===void 0||l.scrollTo({index:N,elSize:m.value}))}function g(n){var l,w;!((l=o.value)===null||l===void 0)&&l.contains(n.target)&&((w=e.onFocus)===null||w===void 0||w.call(e,n))}function k(n){var l,w;!((l=o.value)===null||l===void 0)&&l.contains(n.relatedTarget)||(w=e.onBlur)===null||w===void 0||w.call(e,n)}fe(ae,{handleOptionMouseEnter:B,handleOptionClick:E,valueSetRef:F,pendingTmNodeRef:v,nodePropsRef:H(e,"nodeProps"),showCheckmarkRef:H(e,"showCheckmark"),multipleRef:H(e,"multiple"),valueRef:H(e,"value"),renderLabelRef:H(e,"renderLabel"),renderOptionRef:H(e,"renderOption"),labelFieldRef:H(e,"labelField"),valueFieldRef:H(e,"valueField")}),fe(nt,o),se(()=>{const{value:n}=r;n&&n.sync()});const C=T(()=>{const{size:n}=e,{common:{cubicBezierEaseInOut:l},self:{height:w,borderRadius:N,color:q,groupHeaderTextColor:ke,actionDividerColor:Ce,optionTextColorPressed:Te,optionTextColor:Pe,optionTextColorDisabled:_e,optionTextColorActive:Me,optionOpacityDisabled:Ne,optionCheckColor:Fe,actionTextColor:Ie,optionColorPending:Be,optionColorActive:Le,loadingColor:Oe,loadingSize:Ee,optionColorActivePending:He,[D("optionFontSize",n)]:$e,[D("optionHeight",n)]:Ve,[D("optionPadding",n)]:te}}=t.value;return{"--n-height":w,"--n-action-divider-color":Ce,"--n-action-text-color":Ie,"--n-bezier":l,"--n-border-radius":N,"--n-color":q,"--n-option-font-size":$e,"--n-group-header-text-color":ke,"--n-option-check-color":Fe,"--n-option-color-pending":Be,"--n-option-color-active":Le,"--n-option-color-active-pending":He,"--n-option-height":Ve,"--n-option-opacity-disabled":Ne,"--n-option-text-color":Pe,"--n-option-text-color-active":Me,"--n-option-text-color-disabled":_e,"--n-option-text-color-pressed":Te,"--n-option-padding":te,"--n-option-padding-left":oe(te,"left"),"--n-option-padding-right":oe(te,"right"),"--n-loading-color":Oe,"--n-loading-size":Ee}}),{inlineThemeDisabled:P}=e,p=P?Se("internal-select-menu",T(()=>e.size[0]),C,e):void 0,_={selfRef:o,next:G,prev:U,getPendingTmNode:I};return gt(o,e.onResize),Object.assign({mergedTheme:t,virtualListRef:s,scrollbarRef:r,itemSize:m,padding:z,flattenedNodes:a,empty:h,virtualListContainer(){const{value:n}=s;return n==null?void 0:n.listElRef},virtualListContent(){const{value:n}=s;return n==null?void 0:n.itemsElRef},doScroll:M,handleFocusin:g,handleFocusout:k,handleKeyUp:J,handleKeyDown:Q,handleMouseDown:ee,handleVirtualListResize:x,handleVirtualListScroll:S,cssVars:P?void 0:C,themeClass:p==null?void 0:p.themeClass,onRender:p==null?void 0:p.onRender},_)},render(){const{$slots:e,virtualScroll:t,clsPrefix:o,mergedTheme:s,themeClass:r,onRender:a}=this;return a==null||a(),d("div",{ref:"selfRef",tabindex:this.focusable?0:-1,class:[`${o}-base-select-menu`,r,this.multiple&&`${o}-base-select-menu--multiple`],style:this.cssVars,onFocusin:this.handleFocusin,onFocusout:this.handleFocusout,onKeyup:this.handleKeyUp,onKeydown:this.handleKeyDown,onMousedown:this.handleMouseDown,onMouseenter:this.onMouseenter,onMouseleave:this.onMouseleave},this.loading?d("div",{class:`${o}-base-select-menu__loading`},d(it,{clsPrefix:o,strokeWidth:20})):this.empty?d("div",{class:`${o}-base-select-menu__empty`,"data-empty":!0},rt(e.empty,()=>[d(St,{theme:s.peers.Empty,themeOverrides:s.peerOverrides.Empty})])):d(lt,{ref:"scrollbarRef",theme:s.peers.Scrollbar,themeOverrides:s.peerOverrides.Scrollbar,scrollable:this.scrollable,container:t?this.virtualListContainer:void 0,content:t?this.virtualListContent:void 0,onScroll:t?void 0:this.doScroll},{default:()=>t?d(mt,{ref:"virtualListRef",class:`${o}-virtual-list`,items:this.flattenedNodes,itemSize:this.itemSize,showScrollbar:!1,paddingTop:this.padding.top,paddingBottom:this.padding.bottom,onResize:this.handleVirtualListResize,onScroll:this.handleVirtualListScroll,itemResizable:!0},{default:({item:u})=>u.isGroup?d(be,{key:u.key,clsPrefix:o,tmNode:u}):u.ignored?null:d(pe,{clsPrefix:o,key:u.key,tmNode:u})}):d("div",{class:`${o}-base-select-menu-option-wrapper`,style:{paddingTop:this.padding.top,paddingBottom:this.padding.bottom}},this.flattenedNodes.map(u=>u.isGroup?d(be,{key:u.key,clsPrefix:o,tmNode:u}):d(pe,{clsPrefix:o,key:u.key,tmNode:u})))}),ot(e.action,u=>u&&[d("div",{class:`${o}-base-select-menu__action`,"data-action":!0,key:"action"},u),d(yt,{onFocus:this.onTabOut,key:"focus-detector"})]))}}),Ft=O({name:"ListItem",setup(){const e=Z(ct,null);return e||st("list-item","`n-list-item` must be placed in `n-list`."),{showDivider:e.showDividerRef,mergedClsPrefix:e.mergedClsPrefixRef}},render(){const{$slots:e,mergedClsPrefix:t}=this;return d("li",{class:`${t}-list-item`},e.prefix?d("div",{class:`${t}-list-item__prefix`},e.prefix()):null,e.default?d("div",{class:`${t}-list-item__main`},e):null,e.suffix?d("div",{class:`${t}-list-item__suffix`},e.suffix()):null,this.showDivider&&d("div",{class:`${t}-list-item__divider`}))}});const kt=e=>{const{heightSmall:t,heightMedium:o,heightLarge:s,borderRadius:r}=e;return{color:"#eee",colorEnd:"#ddd",borderRadius:r,heightSmall:t,heightMedium:o,heightLarge:s}},Ct={name:"Skeleton",common:at,self:kt};var Tt=j([L("skeleton",` + height: 1em; + width: 100%; + transition: background-color .3s var(--n-bezier); + transition: + --n-color-start .3s var(--n-bezier), + --n-color-end .3s var(--n-bezier), + background-color .3s var(--n-bezier); + animation: 2s skeleton-loading infinite cubic-bezier(0.36, 0, 0.64, 1); + background-color: var(--n-color-start); + `),j("@keyframes skeleton-loading",` + 0% { + background: var(--n-color-start); + } + 40% { + background: var(--n-color-end); + } + 80% { + background: var(--n-color-start); + } + 100% { + background: var(--n-color-start); + } + `)]);const Pt=Object.assign(Object.assign({},W.props),{text:Boolean,round:Boolean,circle:Boolean,height:[String,Number],width:[String,Number],size:String,repeat:{type:Number,default:1},animated:{type:Boolean,default:!0},sharp:{type:Boolean,default:!0}});var It=O({name:"Skeleton",inheritAttrs:!1,props:Pt,setup(e){ut();const{mergedClsPrefixRef:t}=we(e),o=W("Skeleton","-skeleton",Tt,Ct,e,t);return{mergedClsPrefix:t,style:T(()=>{var s,r;const a=o.value,{common:{cubicBezierEaseInOut:u}}=a,v=a.self,{color:R,colorEnd:b,borderRadius:f}=v;let m;const{circle:z,sharp:F,round:h,width:y,height:M,size:S,text:x,animated:I}=e;S!==void 0&&(m=v[D("height",S)]);const B=z?(s=y!=null?y:M)!==null&&s!==void 0?s:m:y,E=(r=z&&y!=null?y:M)!==null&&r!==void 0?r:m;return{display:x?"inline-block":"",verticalAlign:x?"-0.125em":"",borderRadius:z?"50%":h?"4096px":F?"":f,width:typeof B=="number"?K(B):B,height:typeof E=="number"?K(E):E,animation:I?"":"none","--n-bezier":u,"--n-color-start":R,"--n-color-end":b}})}},render(){const{repeat:e,style:t,mergedClsPrefix:o,$attrs:s}=this,r=d("div",ye({class:`${o}-skeleton`,style:t},s));return e>1?d(dt,null,Array.apply(null,{length:e}).map(a=>[r,` +`])):r}});export{Nt as N,Ft as _,St as a,It as b,ut as c,ie as m,gt as u}; diff --git a/web/dist/assets/Thing.d394adea.js b/web/dist/assets/Thing.d394adea.js new file mode 100644 index 00000000..e1daf838 --- /dev/null +++ b/web/dist/assets/Thing.d394adea.js @@ -0,0 +1,34 @@ +import{c as r,f as d,b as c,d as $,u as b,x as u,bB as y,j as E,y as S,A as w,h as i,ab as z}from"./index.d4f5aad2.js";var C=r("thing",` + display: flex; + transition: color .3s var(--n-bezier); + font-size: var(--n-font-size); + color: var(--n-text-color); +`,[r("thing-avatar",` + margin-right: 12px; + margin-top: 2px; + `),r("thing-avatar-header-wrapper",` + display: flex; + flex-wrap: nowrap; + `,[r("thing-header-wrapper",` + flex: 1; + `)]),r("thing-main",` + flex-grow: 1; + `,[r("thing-header",` + display: flex; + margin-bottom: 4px; + justify-content: space-between; + align-items: center; + `,[d("title",` + font-size: 16px; + font-weight: var(--n-title-font-weight); + transition: color .3s var(--n-bezier); + color: var(--n-title-text-color); + `)]),d("description",[c("&:not(:last-child)",` + margin-bottom: 4px; + `)]),d("content",[c("&:not(:first-child)",` + margin-top: 12px; + `)]),d("footer",[c("&:not(:first-child)",` + margin-top: 12px; + `)]),d("action",[c("&:not(:first-child)",` + margin-top: 12px; + `)])])]);const R=Object.assign(Object.assign({},u.props),{title:String,titleExtra:String,description:String,descriptionStyle:[String,Object],content:String,contentStyle:[String,Object],contentIndented:Boolean});var j=$({name:"Thing",props:R,setup(t,{slots:e}){const{mergedClsPrefixRef:h,inlineThemeDisabled:o,mergedRtlRef:f}=b(t),m=u("Thing","-thing",C,y,t,h),v=E("Thing",f,h),x=S(()=>{const{self:{titleTextColor:l,textColor:n,titleFontWeight:g,fontSize:s},common:{cubicBezierEaseInOut:_}}=m.value;return{"--n-bezier":_,"--n-font-size":s,"--n-text-color":n,"--n-title-font-weight":g,"--n-title-text-color":l}}),a=o?w("thing",void 0,x,t):void 0;return()=>{var l;const{value:n}=h,g=v?v.value:!1;return(l=a==null?void 0:a.onRender)===null||l===void 0||l.call(a),i("div",{class:[`${n}-thing`,a==null?void 0:a.themeClass,g&&`${n}-thing--rtl`],style:o?void 0:x.value},e.avatar&&t.contentIndented?i("div",{class:`${n}-thing-avatar`},e.avatar()):null,i("div",{class:`${n}-thing-main`},!t.contentIndented&&(e.header||t.title||e["header-extra"]||t.titleExtra||e.avatar)?i("div",{class:`${n}-thing-avatar-header-wrapper`},e.avatar?i("div",{class:`${n}-thing-avatar`},e.avatar()):null,e.header||t.title||e["header-extra"]||t.titleExtra?i("div",{class:`${n}-thing-header-wrapper`},i("div",{class:`${n}-thing-header`},e.header||t.title?i("div",{class:`${n}-thing-header__title`},e.header?e.header():t.title):null,e["header-extra"]||t.titleExtra?i("div",{class:`${n}-thing-header__extra`},e["header-extra"]?e["header-extra"]():t.titleExtra):null),e.description||t.description?i("div",{class:`${n}-thing-main__description`,style:t.descriptionStyle},e.description?e.description():t.description):null):null):i(z,null,e.header||t.title||e["header-extra"]||t.titleExtra?i("div",{class:`${n}-thing-header`},e.header||t.title?i("div",{class:`${n}-thing-header__title`},e.header?e.header():t.title):null,e["header-extra"]||t.titleExtra?i("div",{class:`${n}-thing-header__extra`},e["header-extra"]?e["header-extra"]():t.titleExtra):null):null,e.description||t.description?i("div",{class:`${n}-thing-main__description`,style:t.descriptionStyle},e.description?e.description():t.description):null),e.default||t.content?i("div",{class:`${n}-thing-main__content`,style:t.contentStyle},e.default?e.default():t.content):null,e.footer?i("div",{class:`${n}-thing-main__footer`},e.footer()):null,e.action?i("div",{class:`${n}-thing-main__action`},e.action()):null))}}});export{j as _}; diff --git a/web/dist/assets/Topic.691bac81.js b/web/dist/assets/Topic.691bac81.js new file mode 100644 index 00000000..b51417d8 --- /dev/null +++ b/web/dist/assets/Topic.691bac81.js @@ -0,0 +1 @@ +import{_ as k}from"./main-nav.3167f221.js";import{ai as w,d as x,r as s,a2 as B,Y as r,a4 as a,a5 as n,c8 as D,W as _,ab as q,ac as C,c9 as E,ca as N,am as V,ah as F,c7 as I,a6 as L,a9 as M,aa as m,Z as S,ae as U,ao as W}from"./index.d4f5aad2.js";import{_ as Y}from"./List.a66e9ae7.js";const Z={class:"tag-hot"},$=x({__name:"Topic",setup(j){const c=s([]),u=s("hot"),o=s(!1),l=()=>{o.value=!0,D({type:u.value,num:50}).then(e=>{c.value=e.topics,o.value=!1}).catch(e=>{o.value=!1})},i=e=>{u.value=e,l()};return B(()=>{l()}),(e,z)=>{const d=k,p=E,g=N,v=V("router-link"),f=U,h=W,y=F,T=I,b=Y;return _(),r("div",null,[a(d,{title:"\u8BDD\u9898"}),a(b,{class:"main-content-wrap tags-wrap",bordered:""},{default:n(()=>[a(g,{type:"line",animated:"","onUpdate:value":i},{default:n(()=>[a(p,{name:"hot",tab:"\u70ED\u95E8"}),a(p,{name:"new",tab:"\u6700\u65B0"})]),_:1}),a(T,{show:o.value},{default:n(()=>[a(y,null,{default:n(()=>[(_(!0),r(q,null,C(c.value,t=>(_(),L(h,{class:"tag-item",type:"success",round:"",key:t.id},{avatar:n(()=>[a(f,{src:t.user.avatar},null,8,["src"])]),default:n(()=>[a(v,{class:"hash-link",to:{name:"home",query:{q:t.tag,t:"tag"}}},{default:n(()=>[M(" #"+m(t.tag),1)]),_:2},1032,["to"]),S("span",Z,"("+m(t.quote_num)+")",1)]),_:2},1024))),128))]),_:1})]),_:1},8,["show"])]),_:1})])}}});var J=w($,[["__scopeId","data-v-513fa4c6"]]);export{J as default}; diff --git a/web/dist/assets/Topic.909bef5a.css b/web/dist/assets/Topic.909bef5a.css new file mode 100644 index 00000000..c332897c --- /dev/null +++ b/web/dist/assets/Topic.909bef5a.css @@ -0,0 +1 @@ +.tags-wrap[data-v-513fa4c6]{padding:20px}.tags-wrap .tag-item .tag-hot[data-v-513fa4c6]{margin-left:12px;font-size:12px;opacity:.75} diff --git a/web/dist/assets/Upload.6bcec76c.js b/web/dist/assets/Upload.6bcec76c.js new file mode 100644 index 00000000..166da3dd --- /dev/null +++ b/web/dist/assets/Upload.6bcec76c.js @@ -0,0 +1,382 @@ +import{bD as V,h as t,b as L,c as h,e as C,d as A,y as R,bE as H,N as j,bF as de,bG as ue,bH as ce,bI as fe,u as ge,x as Q,bJ as Te,z as te,A as he,n as $e,q as G,bp as ee,ba as Se,L as Le,M as De,bK as pe,r as W,v as ze,aK as _e,bw as Fe,K as Z,bL as Ie,ay as Oe,bC as Ue,bx as je,bM as re,f as U,au as Ne,bN as Ee,o as Me,t as F,s as Ae,p as He,bO as qe,ab as We,R as ie,V as Xe,w as ne}from"./index.d4f5aad2.js";var Ve=V("attach",t("svg",{viewBox:"0 0 16 16",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},t("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},t("g",{fill:"currentColor","fill-rule":"nonzero"},t("path",{d:"M3.25735931,8.70710678 L7.85355339,4.1109127 C8.82986412,3.13460197 10.4127766,3.13460197 11.3890873,4.1109127 C12.365398,5.08722343 12.365398,6.67013588 11.3890873,7.64644661 L6.08578644,12.9497475 C5.69526215,13.3402718 5.06209717,13.3402718 4.67157288,12.9497475 C4.28104858,12.5592232 4.28104858,11.9260582 4.67157288,11.5355339 L9.97487373,6.23223305 C10.1701359,6.0369709 10.1701359,5.72038841 9.97487373,5.52512627 C9.77961159,5.32986412 9.4630291,5.32986412 9.26776695,5.52512627 L3.96446609,10.8284271 C3.18341751,11.6094757 3.18341751,12.8758057 3.96446609,13.6568542 C4.74551468,14.4379028 6.01184464,14.4379028 6.79289322,13.6568542 L12.0961941,8.35355339 C13.4630291,6.98671837 13.4630291,4.77064094 12.0961941,3.40380592 C10.7293591,2.0369709 8.51328163,2.0369709 7.14644661,3.40380592 L2.55025253,8 C2.35499039,8.19526215 2.35499039,8.51184464 2.55025253,8.70710678 C2.74551468,8.90236893 3.06209717,8.90236893 3.25735931,8.70710678 Z"}))))),Ge=V("trash",t("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"},t("path",{d:"M432,144,403.33,419.74A32,32,0,0,1,371.55,448H140.46a32,32,0,0,1-31.78-28.26L80,144",style:"fill: none; stroke: currentcolor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"}),t("rect",{x:"32",y:"64",width:"448",height:"80",rx:"16",ry:"16",style:"fill: none; stroke: currentcolor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"}),t("line",{x1:"312",y1:"240",x2:"200",y2:"352",style:"fill: none; stroke: currentcolor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"}),t("line",{x1:"312",y1:"352",x2:"200",y2:"240",style:"fill: none; stroke: currentcolor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"}))),Ke=V("download",t("svg",{viewBox:"0 0 16 16",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},t("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},t("g",{fill:"currentColor","fill-rule":"nonzero"},t("path",{d:"M3.5,13 L12.5,13 C12.7761424,13 13,13.2238576 13,13.5 C13,13.7454599 12.8231248,13.9496084 12.5898756,13.9919443 L12.5,14 L3.5,14 C3.22385763,14 3,13.7761424 3,13.5 C3,13.2545401 3.17687516,13.0503916 3.41012437,13.0080557 L3.5,13 L12.5,13 L3.5,13 Z M7.91012437,1.00805567 L8,1 C8.24545989,1 8.44960837,1.17687516 8.49194433,1.41012437 L8.5,1.5 L8.5,10.292 L11.1819805,7.6109127 C11.3555469,7.43734635 11.6249713,7.4180612 11.8198394,7.55305725 L11.8890873,7.6109127 C12.0626536,7.78447906 12.0819388,8.05390346 11.9469427,8.2487716 L11.8890873,8.31801948 L8.35355339,11.8535534 C8.17998704,12.0271197 7.91056264,12.0464049 7.7156945,11.9114088 L7.64644661,11.8535534 L4.1109127,8.31801948 C3.91565056,8.12275734 3.91565056,7.80617485 4.1109127,7.6109127 C4.28447906,7.43734635 4.55390346,7.4180612 4.7487716,7.55305725 L4.81801948,7.6109127 L7.5,10.292 L7.5,1.5 C7.5,1.25454011 7.67687516,1.05039163 7.91012437,1.00805567 L8,1 L7.91012437,1.00805567 Z"}))))),Ye=V("cancel",t("svg",{viewBox:"0 0 16 16",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},t("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},t("g",{fill:"currentColor","fill-rule":"nonzero"},t("path",{d:"M2.58859116,2.7156945 L2.64644661,2.64644661 C2.82001296,2.47288026 3.08943736,2.45359511 3.2843055,2.58859116 L3.35355339,2.64644661 L8,7.293 L12.6464466,2.64644661 C12.8417088,2.45118446 13.1582912,2.45118446 13.3535534,2.64644661 C13.5488155,2.84170876 13.5488155,3.15829124 13.3535534,3.35355339 L8.707,8 L13.3535534,12.6464466 C13.5271197,12.820013 13.5464049,13.0894374 13.4114088,13.2843055 L13.3535534,13.3535534 C13.179987,13.5271197 12.9105626,13.5464049 12.7156945,13.4114088 L12.6464466,13.3535534 L8,8.707 L3.35355339,13.3535534 C3.15829124,13.5488155 2.84170876,13.5488155 2.64644661,13.3535534 C2.45118446,13.1582912 2.45118446,12.8417088 2.64644661,12.6464466 L7.293,8 L2.64644661,3.35355339 C2.47288026,3.17998704 2.45359511,2.91056264 2.58859116,2.7156945 L2.64644661,2.64644661 L2.58859116,2.7156945 Z"}))))),Ze=V("retry",t("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"},t("path",{d:"M320,146s24.36-12-64-12A160,160,0,1,0,416,294",style:"fill: none; stroke: currentcolor; stroke-linecap: round; stroke-miterlimit: 10; stroke-width: 32px;"}),t("polyline",{points:"256 58 336 138 256 218",style:"fill: none; stroke: currentcolor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"}))),Je=L([h("progress",{display:"inline-block"},[h("progress-icon",` + color: var(--n-icon-color); + transition: color .3s var(--n-bezier); + `),C("line",` + width: 100%; + display: block; + `,[h("progress-content",` + display: flex; + align-items: center; + `,[h("progress-graph",{flex:1})]),h("progress-custom-content",{marginLeft:"14px"}),h("progress-icon",` + width: 30px; + padding-left: 14px; + height: var(--n-icon-size-line); + line-height: var(--n-icon-size-line); + font-size: var(--n-icon-size-line); + `,[C("as-text",` + color: var(--n-text-color-line-outer); + text-align: center; + width: 40px; + font-size: var(--n-font-size); + padding-left: 4px; + transition: color .3s var(--n-bezier); + `)])]),C("circle, dashboard",{width:"120px"},[h("progress-custom-content",` + position: absolute; + left: 50%; + top: 50%; + transform: translateX(-50%) translateY(-50%); + display: flex; + align-items: center; + justify-content: center; + `),h("progress-text",` + position: absolute; + left: 50%; + top: 50%; + transform: translateX(-50%) translateY(-50%); + display: flex; + align-items: center; + color: inherit; + font-size: var(--n-font-size-circle); + color: var(--n-text-color-circle); + font-weight: var(--n-font-weight-circle); + transition: color .3s var(--n-bezier); + white-space: nowrap; + `),h("progress-icon",` + position: absolute; + left: 50%; + top: 50%; + transform: translateX(-50%) translateY(-50%); + display: flex; + align-items: center; + color: var(--n-icon-color); + font-size: var(--n-icon-size-circle); + `)]),C("multiple-circle",` + width: 200px; + color: inherit; + `,[h("progress-text",` + font-weight: var(--n-font-weight-circle); + color: var(--n-text-color-circle); + position: absolute; + left: 50%; + top: 50%; + transform: translateX(-50%) translateY(-50%); + display: flex; + align-items: center; + justify-content: center; + transition: color .3s var(--n-bezier); + `)]),h("progress-content",{position:"relative"}),h("progress-graph",{position:"relative"},[h("progress-graph-circle",[L("svg",{verticalAlign:"bottom"}),h("progress-graph-circle-fill",` + stroke: var(--n-fill-color); + transition: + opacity .3s var(--n-bezier), + stroke .3s var(--n-bezier), + stroke-dasharray .3s var(--n-bezier); + `,[C("empty",{opacity:0})]),h("progress-graph-circle-rail",` + transition: stroke .3s var(--n-bezier); + overflow: hidden; + stroke: var(--n-rail-color); + `)]),h("progress-graph-line",[C("indicator-inside",[h("progress-graph-line-rail",` + height: 16px; + line-height: 16px; + border-radius: 10px; + `,[h("progress-graph-line-fill",` + height: inherit; + border-radius: 10px; + `),h("progress-graph-line-indicator",` + background: #0000; + white-space: nowrap; + text-align: right; + margin-left: 14px; + margin-right: 14px; + height: inherit; + font-size: 12px; + color: var(--n-text-color-line-inner); + transition: color .3s var(--n-bezier); + `)])]),C("indicator-inside-label",` + height: 16px; + display: flex; + align-items: center; + `,[h("progress-graph-line-rail",` + flex: 1; + transition: background-color .3s var(--n-bezier); + `),h("progress-graph-line-indicator",` + background: var(--n-fill-color); + font-size: 12px; + transform: translateZ(0); + display: flex; + vertical-align: middle; + height: 16px; + line-height: 16px; + padding: 0 10px; + border-radius: 10px; + position: absolute; + white-space: nowrap; + color: var(--n-text-color-line-inner); + transition: + right .2s var(--n-bezier), + color .3s var(--n-bezier), + background-color .3s var(--n-bezier); + `)]),h("progress-graph-line-rail",` + position: relative; + overflow: hidden; + height: var(--n-rail-height); + border-radius: 5px; + background-color: var(--n-rail-color); + transition: background-color .3s var(--n-bezier); + `,[h("progress-graph-line-fill",` + background: var(--n-fill-color); + position: relative; + border-radius: 5px; + height: inherit; + width: 100%; + max-width: 0%; + transition: + background-color .3s var(--n-bezier), + max-width .2s var(--n-bezier); + `,[C("processing",[L("&::after",` + content: ""; + background-image: var(--n-line-bg-processing); + animation: progress-processing-animation 2s var(--n-bezier) infinite; + `)])])])])])]),L("@keyframes progress-processing-animation",` + 0% { + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 100%; + opacity: 1; + } + 66% { + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + opacity: 0; + } + 100% { + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + opacity: 0; + } + `)]);const Qe={success:t(de,null),error:t(ue,null),warning:t(ce,null),info:t(fe,null)};var et=A({name:"ProgressLine",props:{clsPrefix:{type:String,required:!0},percentage:{type:Number,default:0},railColor:String,railStyle:[String,Object],fillColor:String,status:{type:String,required:!0},indicatorPlacement:{type:String,required:!0},indicatorTextColor:String,unit:{type:String,default:"%"},processing:{type:Boolean,required:!0},showIndicator:{type:Boolean,required:!0},height:[String,Number],railBorderRadius:[String,Number],fillBorderRadius:[String,Number]},setup(e,{slots:n}){const r=R(()=>H(e.height)),i=R(()=>e.railBorderRadius!==void 0?H(e.railBorderRadius):e.height!==void 0?H(e.height,{c:.5}):""),o=R(()=>e.fillBorderRadius!==void 0?H(e.fillBorderRadius):e.railBorderRadius!==void 0?H(e.railBorderRadius):e.height!==void 0?H(e.height,{c:.5}):"");return()=>{const{indicatorPlacement:s,railColor:u,railStyle:c,percentage:d,unit:l,indicatorTextColor:a,status:f,showIndicator:y,fillColor:p,processing:k,clsPrefix:v}=e;return t("div",{class:`${v}-progress-content`,role:"none"},t("div",{class:`${v}-progress-graph`,"aria-hidden":!0},t("div",{class:[`${v}-progress-graph-line`,{[`${v}-progress-graph-line--indicator-${s}`]:!0}]},t("div",{class:`${v}-progress-graph-line-rail`,style:[{backgroundColor:u,height:r.value,borderRadius:i.value},c]},t("div",{class:[`${v}-progress-graph-line-fill`,k&&`${v}-progress-graph-line-fill--processing`],style:{maxWidth:`${e.percentage}%`,backgroundColor:p,height:r.value,lineHeight:r.value,borderRadius:o.value}},s==="inside"?t("div",{class:`${v}-progress-graph-line-indicator`,style:{color:a}},d,l):null)))),y&&s==="outside"?t("div",null,n.default?t("div",{class:`${v}-progress-custom-content`,style:{color:a},role:"none"},n.default()):f==="default"?t("div",{role:"none",class:`${v}-progress-icon ${v}-progress-icon--as-text`,style:{color:a}},d,l):t("div",{class:`${v}-progress-icon`,"aria-hidden":!0},t(j,{clsPrefix:v},{default:()=>Qe[f]}))):null)}}});const tt={success:t(de,null),error:t(ue,null),warning:t(ce,null),info:t(fe,null)};var rt=A({name:"ProgressCircle",props:{clsPrefix:{type:String,required:!0},status:{type:String,required:!0},strokeWidth:{type:Number,required:!0},fillColor:String,railColor:String,railStyle:[String,Object],percentage:{type:Number,default:0},offsetDegree:{type:Number,default:0},showIndicator:{type:Boolean,required:!0},indicatorTextColor:String,unit:String,viewBoxWidth:{type:Number,required:!0},gapDegree:{type:Number,required:!0},gapOffsetDegree:{type:Number,default:0}},setup(e,{slots:n}){function r(i,o,s){const{gapDegree:u,viewBoxWidth:c,strokeWidth:d}=e,l=50,a=0,f=l,y=0,p=2*l,k=50+d/2,v=`M ${k},${k} m ${a},${f} + a ${l},${l} 0 1 1 ${y},${-p} + a ${l},${l} 0 1 1 ${-y},${p}`,B=Math.PI*2*l,D={stroke:s,strokeDasharray:`${i/100*(B-u)}px ${c*8}px`,strokeDashoffset:`-${u/2}px`,transformOrigin:o?"center":void 0,transform:o?`rotate(${o}deg)`:void 0};return{pathString:v,pathStyle:D}}return()=>{const{fillColor:i,railColor:o,strokeWidth:s,offsetDegree:u,status:c,percentage:d,showIndicator:l,indicatorTextColor:a,unit:f,gapOffsetDegree:y,clsPrefix:p}=e,{pathString:k,pathStyle:v}=r(100,0,o),{pathString:B,pathStyle:D}=r(d,u,i),T=100+s;return t("div",{class:`${p}-progress-content`,role:"none"},t("div",{class:`${p}-progress-graph`,"aria-hidden":!0},t("div",{class:`${p}-progress-graph-circle`,style:{transform:y?`rotate(${y}deg)`:void 0}},t("svg",{viewBox:`0 0 ${T} ${T}`},t("g",null,t("path",{class:`${p}-progress-graph-circle-rail`,d:k,"stroke-width":s,"stroke-linecap":"round",fill:"none",style:v})),t("g",null,t("path",{class:[`${p}-progress-graph-circle-fill`,d===0&&`${p}-progress-graph-circle-fill--empty`],d:B,"stroke-width":s,"stroke-linecap":"round",fill:"none",style:D}))))),l?t("div",null,n.default?t("div",{class:`${p}-progress-custom-content`,role:"none"},n.default()):c!=="default"?t("div",{class:`${p}-progress-icon`,"aria-hidden":!0},t(j,{clsPrefix:p},{default:()=>tt[c]})):t("div",{class:`${p}-progress-text`,style:{color:a},role:"none"},t("span",{class:`${p}-progress-text__percentage`},d),t("span",{class:`${p}-progress-text__unit`},f))):null)}}});function oe(e,n,r=100){return`m ${r/2} ${r/2-e} a ${e} ${e} 0 1 1 0 ${2*e} a ${e} ${e} 0 1 1 0 -${2*e}`}var it=A({name:"ProgressMultipleCircle",props:{clsPrefix:{type:String,required:!0},viewBoxWidth:{type:Number,required:!0},percentage:{type:Array,default:[0]},strokeWidth:{type:Number,required:!0},circleGap:{type:Number,required:!0},showIndicator:{type:Boolean,required:!0},fillColor:{type:Array,default:()=>[]},railColor:{type:Array,default:()=>[]},railStyle:{type:Array,default:()=>[]}},setup(e,{slots:n}){const r=R(()=>e.percentage.map((o,s)=>`${Math.PI*o/100*(e.viewBoxWidth/2-e.strokeWidth/2*(1+2*s)-e.circleGap*s)*2}, ${e.viewBoxWidth*8}`));return()=>{const{viewBoxWidth:i,strokeWidth:o,circleGap:s,showIndicator:u,fillColor:c,railColor:d,railStyle:l,percentage:a,clsPrefix:f}=e;return t("div",{class:`${f}-progress-content`,role:"none"},t("div",{class:`${f}-progress-graph`,"aria-hidden":!0},t("div",{class:`${f}-progress-graph-circle`},t("svg",{viewBox:`0 0 ${i} ${i}`},a.map((y,p)=>t("g",{key:p},t("path",{class:`${f}-progress-graph-circle-rail`,d:oe(i/2-o/2*(1+2*p)-s*p,o,i),"stroke-width":o,"stroke-linecap":"round",fill:"none",style:[{strokeDashoffset:0,stroke:d[p]},l[p]]}),t("path",{class:[`${f}-progress-graph-circle-fill`,y===0&&`${f}-progress-graph-circle-fill--empty`],d:oe(i/2-o/2*(1+2*p)-s*p,o,i),"stroke-width":o,"stroke-linecap":"round",fill:"none",style:{strokeDasharray:r.value[p],strokeDashoffset:0,stroke:c[p]}})))))),u&&n.default?t("div",null,t("div",{class:`${f}-progress-text`},n.default())):null)}}});const nt=Object.assign(Object.assign({},Q.props),{processing:Boolean,type:{type:String,default:"line"},gapDegree:Number,gapOffsetDegree:Number,status:{type:String,default:"default"},railColor:[String,Array],railStyle:[String,Array],color:[String,Array],viewBoxWidth:{type:Number,default:100},strokeWidth:{type:Number,default:7},percentage:[Number,Array],unit:{type:String,default:"%"},showIndicator:{type:Boolean,default:!0},indicatorPosition:{type:String,default:"outside"},indicatorPlacement:{type:String,default:"outside"},indicatorTextColor:String,circleGap:{type:Number,default:1},height:Number,borderRadius:[String,Number],fillBorderRadius:[String,Number],offsetDegree:Number});var ot=A({name:"Progress",props:nt,setup(e){const n=R(()=>e.indicatorPlacement||e.indicatorPosition),r=R(()=>{if(e.gapDegree||e.gapDegree===0)return e.gapDegree;if(e.type==="dashboard")return 75}),{mergedClsPrefixRef:i,inlineThemeDisabled:o}=ge(e),s=Q("Progress","-progress",Je,Te,e,i),u=R(()=>{const{status:d}=e,{common:{cubicBezierEaseInOut:l},self:{fontSize:a,fontSizeCircle:f,railColor:y,railHeight:p,iconSizeCircle:k,iconSizeLine:v,textColorCircle:B,textColorLineInner:D,textColorLineOuter:T,lineBgProcessing:x,fontWeightCircle:$,[te("iconColor",d)]:m,[te("fillColor",d)]:b}}=s.value;return{"--n-bezier":l,"--n-fill-color":b,"--n-font-size":a,"--n-font-size-circle":f,"--n-font-weight-circle":$,"--n-icon-color":m,"--n-icon-size-circle":k,"--n-icon-size-line":v,"--n-line-bg-processing":x,"--n-rail-color":y,"--n-rail-height":p,"--n-text-color-circle":B,"--n-text-color-line-inner":D,"--n-text-color-line-outer":T}}),c=o?he("progress",R(()=>e.status[0]),u,e):void 0;return{mergedClsPrefix:i,mergedIndicatorPlacement:n,gapDeg:r,cssVars:o?void 0:u,themeClass:c==null?void 0:c.themeClass,onRender:c==null?void 0:c.onRender}},render(){const{type:e,cssVars:n,indicatorTextColor:r,showIndicator:i,status:o,railColor:s,railStyle:u,color:c,percentage:d,viewBoxWidth:l,strokeWidth:a,mergedIndicatorPlacement:f,unit:y,borderRadius:p,fillBorderRadius:k,height:v,processing:B,circleGap:D,mergedClsPrefix:T,gapDeg:x,gapOffsetDegree:$,themeClass:m,$slots:b,onRender:w}=this;return w==null||w(),t("div",{class:[m,`${T}-progress`,`${T}-progress--${e}`,`${T}-progress--${o}`],style:n,"aria-valuemax":100,"aria-valuemin":0,"aria-valuenow":d,role:e==="circle"||e==="line"||e==="dashboard"?"progressbar":"none"},e==="circle"||e==="dashboard"?t(rt,{clsPrefix:T,status:o,showIndicator:i,indicatorTextColor:r,railColor:s,fillColor:c,railStyle:u,offsetDegree:this.offsetDegree,percentage:d,viewBoxWidth:l,strokeWidth:a,gapDegree:x===void 0?e==="dashboard"?75:0:x,gapOffsetDegree:$,unit:y},b):e==="line"?t(et,{clsPrefix:T,status:o,showIndicator:i,indicatorTextColor:r,railColor:s,fillColor:c,railStyle:u,percentage:d,processing:B,indicatorPlacement:f,unit:y,fillBorderRadius:k,railBorderRadius:p,height:v},b):e==="multiple-circle"?t(it,{clsPrefix:T,strokeWidth:a,railColor:s,fillColor:c,railStyle:u,viewBoxWidth:l,percentage:d,showIndicator:i,circleGap:D},b):null)}});const q=$e("n-upload"),me="__UPLOAD_DRAGGER__";var at=A({name:"UploadDragger",[me]:!0,setup(e,{slots:n}){const r=G(q,null);return r||ee("upload-dragger","`n-upload-dragger` must be placed inside `n-upload`."),()=>{const{mergedClsPrefixRef:{value:i},mergedDisabledRef:{value:o},maxReachedRef:{value:s}}=r;return t("div",{class:[`${i}-upload-dragger`,(o||s)&&`${i}-upload-dragger--disabled`]},n)}}}),ve=globalThis&&globalThis.__awaiter||function(e,n,r,i){function o(s){return s instanceof r?s:new r(function(u){u(s)})}return new(r||(r=Promise))(function(s,u){function c(a){try{l(i.next(a))}catch(f){u(f)}}function d(a){try{l(i.throw(a))}catch(f){u(f)}}function l(a){a.done?s(a.value):o(a.value).then(c,d)}l((i=i.apply(e,n||[])).next())})};const be=e=>e.includes("image/"),ae=(e="")=>{const n=e.split("/"),i=n[n.length-1].split(/#|\?/)[0];return(/\.[^./\\]*$/.exec(i)||[""])[0]},le=/(webp|svg|png|gif|jpg|jpeg|jfif|bmp|dpg|ico)$/i,ye=e=>{if(e.type)return be(e.type);const n=ae(e.name||"");if(le.test(n))return!0;const r=e.thumbnailUrl||e.url||"",i=ae(r);return!!(/^data:image\//.test(r)||le.test(i))};function lt(e){return ve(this,void 0,void 0,function*(){return yield new Promise(n=>{if(!e.type||!be(e.type)){n("");return}n(window.URL.createObjectURL(e))})})}const st=Se&&window.FileReader&&window.File;function dt(e){return e.isDirectory}function ut(e){return e.isFile}function ct(e,n){return ve(this,void 0,void 0,function*(){const r=[];let i,o=0;function s(){o++}function u(){o--,o||i(r)}function c(d){d.forEach(l=>{if(!!l){if(s(),n&&dt(l)){const a=l.createReader();s(),a.readEntries(f=>{c(f),u()},()=>{u()})}else ut(l)&&(s(),l.file(a=>{r.push({file:a,entry:l,source:"dnd"}),u()},()=>{u()}));u()}})}return yield new Promise(d=>{i=d,c(e)}),r})}function X(e){const{id:n,name:r,percentage:i,status:o,url:s,file:u,thumbnailUrl:c,type:d,fullPath:l,batchId:a}=e;return{id:n,name:r,percentage:i!=null?i:null,status:o,url:s!=null?s:null,file:u!=null?u:null,thumbnailUrl:c!=null?c:null,type:d!=null?d:null,fullPath:l!=null?l:null,batchId:a!=null?a:null}}function ft(e,n,r){return e=e.toLowerCase(),n=n.toLocaleLowerCase(),r=r.toLocaleLowerCase(),r.split(",").map(o=>o.trim()).filter(Boolean).some(o=>{if(o.startsWith(".")){if(e.endsWith(o))return!0}else if(o.includes("/")){const[s,u]=n.split("/"),[c,d]=o.split("/");if((c==="*"||s&&c&&c===s)&&(d==="*"||u&&d&&d===u))return!0}else return!0;return!1})}const gt=(e,n)=>{if(!e)return;const r=document.createElement("a");r.href=e,n!==void 0&&(r.download=n),document.body.appendChild(r),r.click(),document.body.removeChild(r)};var we=A({name:"UploadTrigger",props:{abstract:Boolean},setup(e,{slots:n}){const r=G(q,null);r||ee("upload-trigger","`n-upload-trigger` must be placed inside `n-upload`.");const{mergedClsPrefixRef:i,mergedDisabledRef:o,maxReachedRef:s,listTypeRef:u,dragOverRef:c,openOpenFileDialog:d,draggerInsideRef:l,handleFileAddition:a,mergedDirectoryDndRef:f,triggerStyleRef:y}=r,p=R(()=>u.value==="image-card");function k(){o.value||s.value||d()}function v(x){x.preventDefault(),c.value=!0}function B(x){x.preventDefault(),c.value=!0}function D(x){x.preventDefault(),c.value=!1}function T(x){var $;if(x.preventDefault(),!l.value||o.value||s.value){c.value=!1;return}const m=($=x.dataTransfer)===null||$===void 0?void 0:$.items;m!=null&&m.length?ct(Array.from(m).map(b=>b.webkitGetAsEntry()),f.value).then(b=>{a(b)}).finally(()=>{c.value=!1}):c.value=!1}return()=>{var x;const{value:$}=i;return e.abstract?(x=n.default)===null||x===void 0?void 0:x.call(n,{handleClick:k,handleDrop:T,handleDragOver:v,handleDragEnter:B,handleDragLeave:D}):t("div",{class:[`${$}-upload-trigger`,(o.value||s.value)&&`${$}-upload-trigger--disabled`,p.value&&`${$}-upload-trigger--image-card`],style:y.value,onClick:k,onDrop:T,onDragover:v,onDragenter:B,onDragleave:D},p.value?t(at,null,{default:()=>Le(n.default,()=>[t(j,{clsPrefix:$},{default:()=>t(De,null)})])}):n)}}}),ht=A({name:"UploadProgress",props:{show:Boolean,percentage:{type:Number,required:!0},status:{type:String,required:!0}},setup(){return{mergedTheme:G(q).mergedThemeRef}},render(){return t(pe,null,{default:()=>this.show?t(ot,{type:"line",showIndicator:!1,percentage:this.percentage,status:this.status,height:2,theme:this.mergedTheme.peers.Progress,themeOverrides:this.mergedTheme.peerOverrides.Progress}):null})}});const pt=t("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 28 28"},t("g",{fill:"none"},t("path",{d:"M21.75 3A3.25 3.25 0 0 1 25 6.25v15.5A3.25 3.25 0 0 1 21.75 25H6.25A3.25 3.25 0 0 1 3 21.75V6.25A3.25 3.25 0 0 1 6.25 3h15.5zm.583 20.4l-7.807-7.68a.75.75 0 0 0-.968-.07l-.084.07l-7.808 7.68c.183.065.38.1.584.1h15.5c.204 0 .4-.035.583-.1l-7.807-7.68l7.807 7.68zM21.75 4.5H6.25A1.75 1.75 0 0 0 4.5 6.25v15.5c0 .208.036.408.103.593l7.82-7.692a2.25 2.25 0 0 1 3.026-.117l.129.117l7.82 7.692c.066-.185.102-.385.102-.593V6.25a1.75 1.75 0 0 0-1.75-1.75zm-3.25 3a2.5 2.5 0 1 1 0 5a2.5 2.5 0 0 1 0-5zm0 1.5a1 1 0 1 0 0 2a1 1 0 0 0 0-2z",fill:"currentColor"}))),mt=t("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 28 28"},t("g",{fill:"none"},t("path",{d:"M6.4 2A2.4 2.4 0 0 0 4 4.4v19.2A2.4 2.4 0 0 0 6.4 26h15.2a2.4 2.4 0 0 0 2.4-2.4V11.578c0-.729-.29-1.428-.805-1.944l-6.931-6.931A2.4 2.4 0 0 0 14.567 2H6.4zm-.9 2.4a.9.9 0 0 1 .9-.9H14V10a2 2 0 0 0 2 2h6.5v11.6a.9.9 0 0 1-.9.9H6.4a.9.9 0 0 1-.9-.9V4.4zm16.44 6.1H16a.5.5 0 0 1-.5-.5V4.06l6.44 6.44z",fill:"currentColor"})));var vt=globalThis&&globalThis.__awaiter||function(e,n,r,i){function o(s){return s instanceof r?s:new r(function(u){u(s)})}return new(r||(r=Promise))(function(s,u){function c(a){try{l(i.next(a))}catch(f){u(f)}}function d(a){try{l(i.throw(a))}catch(f){u(f)}}function l(a){a.done?s(a.value):o(a.value).then(c,d)}l((i=i.apply(e,n||[])).next())})};const J={paddingMedium:"0 3px",heightMedium:"24px",iconSizeMedium:"18px"};var bt=A({name:"UploadFile",props:{clsPrefix:{type:String,required:!0},file:{type:Object,required:!0},listType:{type:String,required:!0}},setup(e){const n=G(q),r=W(null),i=W(""),o=R(()=>{const{file:m}=e;return m.status==="finished"?"success":m.status==="error"?"error":"info"}),s=R(()=>{const{file:m}=e;if(m.status==="error")return"error"}),u=R(()=>{const{file:m}=e;return m.status==="uploading"}),c=R(()=>{if(!n.showCancelButtonRef.value)return!1;const{file:m}=e;return["uploading","pending","error"].includes(m.status)}),d=R(()=>{if(!n.showRemoveButtonRef.value)return!1;const{file:m}=e;return["finished"].includes(m.status)}),l=R(()=>{if(!n.showDownloadButtonRef.value)return!1;const{file:m}=e;return["finished"].includes(m.status)}),a=R(()=>{if(!n.showRetryButtonRef.value)return!1;const{file:m}=e;return["error"].includes(m.status)}),f=ze(()=>i.value||e.file.thumbnailUrl||e.file.url),y=R(()=>{if(!n.showPreviewButtonRef.value)return!1;const{file:{status:m},listType:b}=e;return["finished"].includes(m)&&f.value&&b==="image-card"});function p(){n.submit(e.file.id)}function k(m){m.preventDefault();const{file:b}=e;["finished","pending","error"].includes(b.status)?B(b):["uploading"].includes(b.status)?T(b):Ue("upload","The button clicked type is unknown.")}function v(m){m.preventDefault(),D(e.file)}function B(m){const{xhrMap:b,doChange:w,onRemoveRef:{value:K},mergedFileListRef:{value:g}}=n;Promise.resolve(K?K({file:Object.assign({},m),fileList:g}):!0).then(P=>{if(P===!1)return;const S=Object.assign({},m,{status:"removed"});b.delete(m.id),w(S,void 0,{remove:!0})})}function D(m){const{onDownloadRef:{value:b}}=n;Promise.resolve(b?b(Object.assign({},m)):!0).then(w=>{w!==!1&>(m.url,m.name)})}function T(m){const{xhrMap:b}=n,w=b.get(m.id);w==null||w.abort(),B(Object.assign({},m))}function x(){const{onPreviewRef:{value:m}}=n;if(m)m(e.file);else if(e.listType==="image-card"){const{value:b}=r;if(!b)return;b.click()}}const $=()=>vt(this,void 0,void 0,function*(){const{listType:m}=e;m!=="image"&&m!=="image-card"||n.shouldUseThumbnailUrlRef.value(e.file)&&(i.value=yield n.getFileThumbnailUrlResolver(e.file))});return _e(()=>{$()}),{mergedTheme:n.mergedThemeRef,progressStatus:o,buttonType:s,showProgress:u,disabled:n.mergedDisabledRef,showCancelButton:c,showRemoveButton:d,showDownloadButton:l,showRetryButton:a,showPreviewButton:y,mergedThumbnailUrl:f,shouldUseThumbnailUrl:n.shouldUseThumbnailUrlRef,renderIcon:n.renderIconRef,imageRef:r,handleRemoveOrCancelClick:k,handleDownloadClick:v,handleRetryClick:p,handlePreviewClick:x}},render(){const{clsPrefix:e,mergedTheme:n,listType:r,file:i,renderIcon:o}=this;let s;const u=r==="image";u||r==="image-card"?s=!this.shouldUseThumbnailUrl(i)||!this.mergedThumbnailUrl?t("span",{class:`${e}-upload-file-info__thumbnail`},o?o(i):ye(i)?t(j,{clsPrefix:e},{default:()=>pt}):t(j,{clsPrefix:e},{default:()=>mt})):t("a",{rel:"noopener noreferer",target:"_blank",href:i.url||void 0,class:`${e}-upload-file-info__thumbnail`,onClick:this.handlePreviewClick},r==="image-card"?t(Fe,{src:this.mergedThumbnailUrl||void 0,previewSrc:i.url||void 0,alt:i.name,ref:"imageRef"}):t("img",{src:this.mergedThumbnailUrl||void 0,alt:i.name})):s=t("span",{class:`${e}-upload-file-info__thumbnail`},o?o(i):t(j,{clsPrefix:e},{default:()=>t(Ve,null)}));const d=t(ht,{show:this.showProgress,percentage:i.percentage||0,status:this.progressStatus}),l=r==="text"||r==="image";return t("div",{class:[`${e}-upload-file`,`${e}-upload-file--${this.progressStatus}-status`,i.url&&i.status!=="error"&&r!=="image-card"&&`${e}-upload-file--with-url`,`${e}-upload-file--${r}-type`]},t("div",{class:`${e}-upload-file-info`},s,t("div",{class:`${e}-upload-file-info__name`},l&&(i.url&&i.status!=="error"?t("a",{rel:"noopener noreferer",target:"_blank",href:i.url||void 0,onClick:this.handlePreviewClick},i.name):t("span",{onClick:this.handlePreviewClick},i.name)),u&&d),t("div",{class:[`${e}-upload-file-info__action`,`${e}-upload-file-info__action--${r}-type`]},this.showPreviewButton?t(Z,{key:"preview",quaternary:!0,type:this.buttonType,onClick:this.handlePreviewClick,theme:n.peers.Button,themeOverrides:n.peerOverrides.Button,builtinThemeOverrides:J},{icon:()=>t(j,{clsPrefix:e},{default:()=>t(Ie,null)})}):null,(this.showRemoveButton||this.showCancelButton)&&!this.disabled&&t(Z,{key:"cancelOrTrash",theme:n.peers.Button,themeOverrides:n.peerOverrides.Button,quaternary:!0,builtinThemeOverrides:J,type:this.buttonType,onClick:this.handleRemoveOrCancelClick},{icon:()=>t(Oe,null,{default:()=>this.showRemoveButton?t(j,{clsPrefix:e,key:"trash"},{default:()=>t(Ge,null)}):t(j,{clsPrefix:e,key:"cancel"},{default:()=>t(Ye,null)})})}),this.showRetryButton&&!this.disabled&&t(Z,{key:"retry",quaternary:!0,type:this.buttonType,onClick:this.handleRetryClick,theme:n.peers.Button,themeOverrides:n.peerOverrides.Button,builtinThemeOverrides:J},{icon:()=>t(j,{clsPrefix:e},{default:()=>t(Ze,null)})}),this.showDownloadButton?t(Z,{key:"download",quaternary:!0,type:this.buttonType,onClick:this.handleDownloadClick,theme:n.peers.Button,themeOverrides:n.peerOverrides.Button,builtinThemeOverrides:J},{icon:()=>t(j,{clsPrefix:e},{default:()=>t(Ke,null)})}):null)),!u&&d)}}),yt=A({name:"UploadFileList",setup(e,{slots:n}){const r=G(q,null);r||ee("upload-file-list","`n-upload-file-list` must be placed inside `n-upload`.");const{abstractRef:i,mergedClsPrefixRef:o,listTypeRef:s,mergedFileListRef:u,fileListStyleRef:c,cssVarsRef:d,themeClassRef:l,maxReachedRef:a,showTriggerRef:f,imageGroupPropsRef:y}=r,p=R(()=>s.value==="image-card"),k=()=>u.value.map(B=>t(bt,{clsPrefix:o.value,key:B.id,file:B,listType:s.value})),v=()=>p.value?t(je,Object.assign({},y.value),{default:k}):t(pe,{group:!0},{default:k});return()=>{const{value:B}=o,{value:D}=i;return t("div",{class:[`${B}-upload-file-list`,p.value&&`${B}-upload-file-list--grid`,D?l==null?void 0:l.value:void 0],style:[D&&d?d.value:"",c.value]},v(),f.value&&!a.value&&p.value&&t(we,null,n))}}}),wt=L([h("upload","width: 100%;",[C("dragger-inside",[h("upload-trigger",` + display: block; + `)]),C("drag-over",[h("upload-dragger",` + border: var(--n-dragger-border-hover); + `)])]),h("upload-dragger",` + cursor: pointer; + box-sizing: border-box; + width: 100%; + text-align: center; + border-radius: var(--n-border-radius); + padding: 24px; + opacity: 1; + transition: + opacity .3s var(--n-bezier), + border-color .3s var(--n-bezier), + background-color .3s var(--n-bezier); + background-color: var(--n-dragger-color); + border: var(--n-dragger-border); + `,[L("&:hover",` + border: var(--n-dragger-border-hover); + `),C("disabled",` + cursor: not-allowed; + `)]),h("upload-trigger",` + display: inline-block; + box-sizing: border-box; + opacity: 1; + transition: opacity .3s var(--n-bezier); + `,[L("+",[h("upload-file-list","margin-top: 8px;")]),C("disabled",` + opacity: var(--n-item-disabled-opacity); + cursor: not-allowed; + `),C("image-card",` + width: 96px; + height: 96px; + `,[h("base-icon",` + font-size: 24px; + `),h("upload-dragger",` + padding: 0; + height: 100%; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + `)])]),h("upload-file-list",` + line-height: var(--n-line-height); + opacity: 1; + transition: opacity .3s var(--n-bezier); + `,[L("a, img","outline: none;"),C("disabled",` + opacity: var(--n-item-disabled-opacity); + cursor: not-allowed; + `,[h("upload-file","cursor: not-allowed;")]),C("grid",` + display: grid; + grid-template-columns: repeat(auto-fill, 96px); + grid-gap: 8px; + margin-top: 0; + `),h("upload-file",` + display: block; + box-sizing: border-box; + cursor: default; + padding: 0px 12px 0 6px; + transition: background-color .3s var(--n-bezier); + border-radius: var(--n-border-radius); + `,[re(),h("progress",[re({foldPadding:!0})]),L("&:hover",` + background-color: var(--n-item-color-hover); + `,[h("upload-file-info",[U("action",` + opacity: 1; + `)])]),C("image-type",` + border-radius: var(--n-border-radius); + text-decoration: underline; + text-decoration-color: #0000; + `,[h("upload-file-info",` + padding-top: 0px; + padding-bottom: 0px; + width: 100%; + height: 100%; + display: flex; + justify-content: space-between; + align-items: center; + padding: 6px 0; + `,[h("progress",` + padding: 2px 0; + margin-bottom: 0; + `),U("name",` + padding: 0 8px; + `),U("thumbnail",` + width: 32px; + height: 32px; + font-size: 28px; + display: flex; + justify-content: center; + align-items: center; + `,[L("img",` + width: 100%; + `)])])]),C("text-type",[h("progress",` + box-sizing: border-box; + padding-bottom: 6px; + margin-bottom: 6px; + `)]),C("image-card-type",` + position: relative; + width: 96px; + height: 96px; + border: var(--n-item-border-image-card); + border-radius: var(--n-border-radius); + padding: 0; + display: flex; + align-items: center; + justify-content: center; + transition: border-color .3s var(--n-bezier), background-color .3s var(--n-bezier); + border-radius: var(--n-border-radius); + overflow: hidden; + `,[h("progress",` + position: absolute; + left: 8px; + bottom: 8px; + right: 8px; + width: unset; + `),h("upload-file-info",` + padding: 0; + width: 100%; + height: 100%; + `,[U("thumbnail",` + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: 36px; + `,[L("img",` + width: 100%; + `)])]),L("&::before",` + position: absolute; + z-index: 1; + left: 0; + right: 0; + top: 0; + bottom: 0; + border-radius: inherit; + opacity: 0; + transition: opacity .2s var(--n-bezier); + content: ""; + `),L("&:hover",[L("&::before","opacity: 1;"),h("upload-file-info",[U("thumbnail","opacity: .12;")])])]),C("error-status",[L("&:hover",` + background-color: var(--n-item-color-hover-error); + `),h("upload-file-info",[U("name","color: var(--n-item-text-color-error);"),U("thumbnail","color: var(--n-item-text-color-error);")]),C("image-card-type",` + border: var(--n-item-border-image-card-error); + `)]),C("with-url",` + cursor: pointer; + `,[h("upload-file-info",[U("name",` + color: var(--n-item-text-color-success); + text-decoration-color: var(--n-item-text-color-success); + `,[L("a",` + text-decoration: underline; + `)])])]),h("upload-file-info",` + position: relative; + padding-top: 6px; + padding-bottom: 6px; + display: flex; + flex-wrap: nowrap; + `,[U("thumbnail",` + font-size: 18px; + opacity: 1; + transition: opacity .2s var(--n-bezier); + color: var(--n-item-icon-color); + `,[h("base-icon",` + margin-right: 2px; + vertical-align: middle; + transition: color .3s var(--n-bezier); + `)]),U("action",` + padding-top: inherit; + padding-bottom: inherit; + position: absolute; + right: 0; + top: 0; + bottom: 0; + width: 80px; + display: flex; + align-items: center; + transition: opacity .2s var(--n-bezier); + justify-content: flex-end; + opacity: 0; + `,[h("button",[L("&:not(:last-child)",{marginRight:"4px"}),h("base-icon",[L("svg",[Ne()])])]),C("image-type",` + position: relative; + max-width: 80px; + width: auto; + `),C("image-card-type",` + z-index: 2; + position: absolute; + width: 100%; + height: 100%; + left: 0; + right: 0; + bottom: 0; + top: 0; + display: flex; + justify-content: center; + align-items: center; + `)]),U("name",` + color: var(--n-item-text-color); + flex: 1; + display: flex; + justify-content: center; + text-overflow: ellipsis; + overflow: hidden; + flex-direction: column; + text-decoration-color: #0000; + font-size: var(--n-font-size); + transition: + color .3s var(--n-bezier), + text-decoration-color .3s var(--n-bezier); + `,[L("a",` + color: inherit; + text-decoration: underline; + `)])])])]),h("upload-file-input",` + display: block; + width: 0; + height: 0; + opacity: 0; + `)]),se=globalThis&&globalThis.__awaiter||function(e,n,r,i){function o(s){return s instanceof r?s:new r(function(u){u(s)})}return new(r||(r=Promise))(function(s,u){function c(a){try{l(i.next(a))}catch(f){u(f)}}function d(a){try{l(i.throw(a))}catch(f){u(f)}}function l(a){a.done?s(a.value):o(a.value).then(c,d)}l((i=i.apply(e,n||[])).next())})};function xt(e,n,r){const{doChange:i,xhrMap:o}=e;let s=0;function u(d){var l;let a=Object.assign({},n,{status:"error",percentage:s});o.delete(n.id),a=X(((l=e.onError)===null||l===void 0?void 0:l.call(e,{file:a,event:d}))||a),i(a,d)}function c(d){var l;if(e.isErrorState){if(e.isErrorState(r)){u(d);return}}else if(r.status<200||r.status>=300){u(d);return}let a=Object.assign({},n,{status:"finished",percentage:s});o.delete(n.id),a=X(((l=e.onFinish)===null||l===void 0?void 0:l.call(e,{file:a,event:d}))||a),i(a,d)}return{handleXHRLoad:c,handleXHRError:u,handleXHRAbort(d){const l=Object.assign({},n,{status:"removed",file:null,percentage:s});o.delete(n.id),i(l,d)},handleXHRProgress(d){const l=Object.assign({},n,{status:"uploading"});if(d.lengthComputable){const a=Math.ceil(d.loaded/d.total*100);l.percentage=a,s=a}i(l,d)}}}function Ct(e){const{inst:n,file:r,data:i,headers:o,withCredentials:s,action:u,customRequest:c}=e,{doChange:d}=e.inst;let l=0;c({file:r,data:i,headers:o,withCredentials:s,action:u,onProgress(a){const f=Object.assign({},r,{status:"uploading"}),y=a.percent;f.percentage=y,l=y,d(f)},onFinish(){var a;let f=Object.assign({},r,{status:"finished",percentage:l});f=X(((a=n.onFinish)===null||a===void 0?void 0:a.call(n,{file:f}))||f),d(f)},onError(){var a;let f=Object.assign({},r,{status:"error",percentage:l});f=X(((a=n.onError)===null||a===void 0?void 0:a.call(n,{file:f}))||f),d(f)}})}function Rt(e,n,r){const i=xt(e,n,r);r.onabort=i.handleXHRAbort,r.onerror=i.handleXHRError,r.onload=i.handleXHRLoad,r.upload&&(r.upload.onprogress=i.handleXHRProgress)}function xe(e,n){return typeof e=="function"?e({file:n}):e||{}}function kt(e,n,r){const i=xe(n,r);!i||Object.keys(i).forEach(o=>{e.setRequestHeader(o,i[o])})}function Bt(e,n,r){const i=xe(n,r);!i||Object.keys(i).forEach(o=>{e.append(o,i[o])})}function Pt(e,n,r,{method:i,action:o,withCredentials:s,responseType:u,headers:c,data:d}){const l=new XMLHttpRequest;l.responseType=u,e.xhrMap.set(r.id,l),l.withCredentials=s;const a=new FormData;if(Bt(a,d,r),a.append(n,r.file),Rt(e,r,l),o!==void 0){l.open(i.toUpperCase(),o),kt(l,c,r),l.send(a);const f=Object.assign({},r,{status:"uploading"});e.doChange(f)}}const Tt=Object.assign(Object.assign({},Q.props),{name:{type:String,default:"file"},accept:String,action:String,customRequest:Function,directory:Boolean,directoryDnd:{type:Boolean,default:void 0},method:{type:String,default:"POST"},multiple:Boolean,showFileList:{type:Boolean,default:!0},data:[Object,Function],headers:[Object,Function],withCredentials:Boolean,responseType:{type:String,default:""},disabled:{type:Boolean,default:void 0},onChange:Function,onRemove:Function,onFinish:Function,onError:Function,onBeforeUpload:Function,isErrorState:Function,onDownload:Function,defaultUpload:{type:Boolean,default:!0},fileList:Array,"onUpdate:fileList":[Function,Array],onUpdateFileList:[Function,Array],fileListStyle:[String,Object],defaultFileList:{type:Array,default:()=>[]},showCancelButton:{type:Boolean,default:!0},showRemoveButton:{type:Boolean,default:!0},showDownloadButton:Boolean,showRetryButton:{type:Boolean,default:!0},showPreviewButton:{type:Boolean,default:!0},listType:{type:String,default:"text"},onPreview:Function,shouldUseThumbnailUrl:{type:Function,default:e=>st?ye(e):!1},createThumbnailUrl:Function,abstract:Boolean,max:Number,showTrigger:{type:Boolean,default:!0},imageGroupProps:Object,inputProps:Object,triggerStyle:[String,Object],renderIcon:Object});var St=A({name:"Upload",props:Tt,setup(e){e.abstract&&e.listType==="image-card"&&ee("upload","when the list-type is image-card, abstract is not supported.");const{mergedClsPrefixRef:n,inlineThemeDisabled:r}=ge(e),i=Q("Upload","-upload",wt,Ee,e,n),o=Me(e),s=R(()=>{const{max:g}=e;return g!==void 0?p.value.length>=g:!1}),u=W(e.defaultFileList),c=F(e,"fileList"),d=W(null),l={value:!1},a=W(!1),f=new Map,y=Ae(c,u),p=R(()=>y.value.map(X));function k(){var g;(g=d.value)===null||g===void 0||g.click()}function v(g){const P=g.target;T(P.files?Array.from(P.files).map(S=>({file:S,entry:null,source:"input"})):null,g),P.value=""}function B(g){const{"onUpdate:fileList":P,onUpdateFileList:S}=e;P&&ne(P,g),S&&ne(S,g),u.value=g}const D=R(()=>e.multiple||e.directory);function T(g,P){if(!g||g.length===0)return;const{onBeforeUpload:S}=e;g=D.value?g:[g[0]];const{max:N,accept:O}=e;g=g.filter(({file:z,source:_})=>_==="dnd"&&(O==null?void 0:O.trim())?ft(z.name,z.type,O):!0),N&&(g=g.slice(0,N-p.value.length));const I=ie();Promise.all(g.map(({file:z,entry:_})=>se(this,void 0,void 0,function*(){var E;const M={id:ie(),batchId:I,name:z.name,status:"pending",percentage:0,file:z,url:null,type:z.type,thumbnailUrl:null,fullPath:(E=_==null?void 0:_.fullPath)!==null&&E!==void 0?E:`/${z.webkitRelativePath||z.name}`};return!S||(yield S({file:M,fileList:p.value}))!==!1?M:null}))).then(z=>se(this,void 0,void 0,function*(){let _=Promise.resolve();return z.forEach(E=>{_=_.then(Xe).then(()=>{E&&$(E,P,{append:!0})})}),yield _})).then(()=>{e.defaultUpload&&x()})}function x(g){const{method:P,action:S,withCredentials:N,headers:O,data:I,name:z}=e,_=g!==void 0?p.value.filter(M=>M.id===g):p.value,E=g!==void 0;_.forEach(M=>{const{status:Y}=M;(Y==="pending"||Y==="error"&&E)&&(e.customRequest?Ct({inst:{doChange:$,xhrMap:f,onFinish:e.onFinish,onError:e.onError},file:M,action:S,withCredentials:N,headers:O,data:I,customRequest:e.customRequest}):Pt({doChange:$,xhrMap:f,onFinish:e.onFinish,onError:e.onError,isErrorState:e.isErrorState},z,M,{method:P,action:S,withCredentials:N,responseType:e.responseType,headers:O,data:I}))})}const $=(g,P,S={append:!1,remove:!1})=>{const{append:N,remove:O}=S,I=Array.from(p.value),z=I.findIndex(_=>_.id===g.id);if(N||O||~z){N?I.push(g):O?I.splice(z,1):I.splice(z,1,g);const{onChange:_}=e;_&&_({file:g,fileList:I,event:P}),B(I)}};function m(g){var P;if(g.thumbnailUrl)return g.thumbnailUrl;const{createThumbnailUrl:S}=e;return S?(P=S(g.file,g))!==null&&P!==void 0?P:g.url||"":g.url?g.url:g.file?lt(g.file):""}const b=R(()=>{const{common:{cubicBezierEaseInOut:g},self:{draggerColor:P,draggerBorder:S,draggerBorderHover:N,itemColorHover:O,itemColorHoverError:I,itemTextColorError:z,itemTextColorSuccess:_,itemTextColor:E,itemIconColor:M,itemDisabledOpacity:Y,lineHeight:Ce,borderRadius:Re,fontSize:ke,itemBorderImageCardError:Be,itemBorderImageCard:Pe}}=i.value;return{"--n-bezier":g,"--n-border-radius":Re,"--n-dragger-border":S,"--n-dragger-border-hover":N,"--n-dragger-color":P,"--n-font-size":ke,"--n-item-color-hover":O,"--n-item-color-hover-error":I,"--n-item-disabled-opacity":Y,"--n-item-icon-color":M,"--n-item-text-color":E,"--n-item-text-color-error":z,"--n-item-text-color-success":_,"--n-line-height":Ce,"--n-item-border-image-card-error":Be,"--n-item-border-image-card":Pe}}),w=r?he("upload",void 0,b,e):void 0;He(q,{mergedClsPrefixRef:n,mergedThemeRef:i,showCancelButtonRef:F(e,"showCancelButton"),showDownloadButtonRef:F(e,"showDownloadButton"),showRemoveButtonRef:F(e,"showRemoveButton"),showRetryButtonRef:F(e,"showRetryButton"),onRemoveRef:F(e,"onRemove"),onDownloadRef:F(e,"onDownload"),mergedFileListRef:p,triggerStyleRef:F(e,"triggerStyle"),shouldUseThumbnailUrlRef:F(e,"shouldUseThumbnailUrl"),renderIconRef:F(e,"renderIcon"),xhrMap:f,submit:x,doChange:$,showPreviewButtonRef:F(e,"showPreviewButton"),onPreviewRef:F(e,"onPreview"),getFileThumbnailUrlResolver:m,listTypeRef:F(e,"listType"),dragOverRef:a,openOpenFileDialog:k,draggerInsideRef:l,handleFileAddition:T,mergedDisabledRef:o.mergedDisabledRef,maxReachedRef:s,fileListStyleRef:F(e,"fileListStyle"),abstractRef:F(e,"abstract"),acceptRef:F(e,"accept"),cssVarsRef:r?void 0:b,themeClassRef:w==null?void 0:w.themeClass,onRender:w==null?void 0:w.onRender,showTriggerRef:F(e,"showTrigger"),imageGroupPropsRef:F(e,"imageGroupProps"),mergedDirectoryDndRef:R(()=>{var g;return(g=e.directoryDnd)!==null&&g!==void 0?g:e.directory})});const K={clear:()=>{u.value=[]},submit:x,openOpenFileDialog:k};return Object.assign({mergedClsPrefix:n,draggerInsideRef:l,inputElRef:d,mergedTheme:i,dragOver:a,mergedMultiple:D,cssVars:r?void 0:b,themeClass:w==null?void 0:w.themeClass,onRender:w==null?void 0:w.onRender,handleFileInputChange:v},K)},render(){var e,n;const{draggerInsideRef:r,mergedClsPrefix:i,$slots:o,directory:s,onRender:u}=this;if(o.default&&!this.abstract){const d=o.default()[0];!((e=d==null?void 0:d.type)===null||e===void 0)&&e[me]&&(r.value=!0)}const c=t("input",Object.assign({},this.inputProps,{ref:"inputElRef",type:"file",class:`${i}-upload-file-input`,accept:this.accept,multiple:this.mergedMultiple,onChange:this.handleFileInputChange,webkitdirectory:s||void 0,directory:s||void 0}));return this.abstract?t(We,null,(n=o.default)===null||n===void 0?void 0:n.call(o),t(qe,{to:"body"},c)):(u==null||u(),t("div",{class:[`${i}-upload`,r.value&&`${i}-upload--dragger-inside`,this.dragOver&&`${i}-upload--drag-over`,this.themeClass],style:this.cssVars},c,this.showTrigger&&this.listType!=="image-card"&&t(we,null,o),this.showFileList&&t(yt,null,o)))}});export{we as _,ot as a,yt as b,St as c}; diff --git a/web/dist/assets/User.4a6c33cd.js b/web/dist/assets/User.4a6c33cd.js new file mode 100644 index 00000000..13d78716 --- /dev/null +++ b/web/dist/assets/User.4a6c33cd.js @@ -0,0 +1,22 @@ +import{_ as ye}from"./post-item.11c28084.js";import{_ as be}from"./post-skeleton.38f0f247.js";import{E as Ce,k as G,cd as ke,c as K,a as xe,e as M,d as A,u as Y,x as U,r as m,y as E,bc as Be,h as P,ag as Fe,bd as Ee,q as Se,ce as De,bp as $e,m as R,bE as Te,z as N,A as Re,ai as O,W as y,a6 as z,a5 as p,Z as C,a4 as i,a9 as S,aa as $,cf as ze,_ as Z,K as W,bA as J,cg as Ae,ch as Ie,ci as Pe,S as Ue,a2 as Oe,af as We,Y as F,aj as Le,cj as je,a3 as D,a7 as T,ab as qe,ac as Me,$ as Ne,cc as Ve,ck as He,cl as Ge,ae as Ke,ao as Ye,c4 as Ze,c7 as Je,c9 as Qe,ca as Xe}from"./index.d4f5aad2.js";import{c as en,a as nn,_ as tn}from"./Skeleton.e1c16fcb.js";import{_ as Q}from"./Alert.6cb9deb6.js";import{_ as sn}from"./main-nav.3167f221.js";import{M as an}from"./MoreHorizFilled.b0eea69d.js";import{_ as on}from"./List.a66e9ae7.js";import{_ as ln}from"./Pagination.c13c2d34.js";import"./content.ed80294a.js";import"./formatTime.e07969bb.js";import"./Thing.d394adea.js";const un=Ce({name:"Ellipsis",common:G,peers:{Tooltip:ke}});var rn=un,cn=K("ellipsis",{overflow:"hidden"},[xe("line-clamp",` + white-space: nowrap; + display: inline-block; + vertical-align: bottom; + max-width: 100%; + `),M("line-clamp",` + display: -webkit-inline-box; + -webkit-box-orient: vertical; + `),M("cursor-pointer",` + cursor: pointer; + `)]);function V(e){return`${e}-ellipsis--line-clamp`}function H(e,l){return`${e}-ellipsis--cursor-${l}`}const dn=Object.assign(Object.assign({},U.props),{expandTrigger:String,lineClamp:[Number,String],tooltip:{type:[Boolean,Object],default:!0}});var X=A({name:"Ellipsis",inheritAttrs:!1,props:dn,setup(e,{slots:l,attrs:r}){const{mergedClsPrefixRef:t}=Y(e),u=U("Ellipsis","-ellipsis",cn,rn,e,t),n=m(null),c=m(null),f=m(null),d=m(!1),o=E(()=>{const{lineClamp:a}=e,{value:_}=d;return a!==void 0?{textOverflow:"","-webkit-line-clamp":_?"":a}:{textOverflow:_?"":"ellipsis","-webkit-line-clamp":""}});function v(){let a=!1;const{value:_}=d;if(_)return!0;const{value:g}=n;if(g){const{lineClamp:B}=e;if(k(g),B!==void 0)a=g.scrollHeight<=g.offsetHeight;else{const{value:I}=c;I&&(a=I.getBoundingClientRect().width<=g.getBoundingClientRect().width)}x(g,a)}return a}const h=E(()=>e.expandTrigger==="click"?()=>{var a;const{value:_}=d;_&&((a=f.value)===null||a===void 0||a.setShow(!1)),d.value=!_}:void 0);Be(()=>{var a;e.tooltip&&((a=f.value)===null||a===void 0||a.setShow(!1))});const w=()=>P("span",Object.assign({},Ee(r,{class:[`${t.value}-ellipsis`,e.lineClamp!==void 0?V(t.value):void 0,e.expandTrigger==="click"?H(t.value,"pointer"):void 0],style:o.value}),{ref:"triggerRef",onClick:h.value,onMouseenter:e.expandTrigger==="click"?v:void 0}),e.lineClamp?l:P("span",{ref:"triggerInnerRef"},l));function k(a){if(!a)return;const _=o.value,g=V(t.value);e.lineClamp!==void 0?b(a,g,"add"):b(a,g,"remove");for(const B in _)a.style[B]!==_[B]&&(a.style[B]=_[B])}function x(a,_){const g=H(t.value,"pointer");e.expandTrigger==="click"&&!_?b(a,g,"add"):b(a,g,"remove")}function b(a,_,g){g==="add"?a.classList.contains(_)||a.classList.add(_):a.classList.contains(_)&&a.classList.remove(_)}return{mergedTheme:u,triggerRef:n,triggerInnerRef:c,tooltipRef:f,handleClick:h,renderTrigger:w,getTooltipDisabled:v}},render(){var e;const{tooltip:l,renderTrigger:r,$slots:t}=this;if(l){const{mergedTheme:u}=this;return P(Fe,Object.assign({ref:"tooltipRef",placement:"top"},l,{getDisabled:this.getTooltipDisabled,theme:u.peers.Tooltip,themeOverrides:u.peerOverrides.Tooltip}),{trigger:r,default:(e=t.tooltip)!==null&&e!==void 0?e:t.default})}else return r()}});function _n(){const e=Se(De,null);return e===null&&$e("use-dialog","No outer founded."),e}const pn=e=>{const{primaryColor:l,successColor:r,warningColor:t,errorColor:u,infoColor:n,fontWeightStrong:c}=e;return{fontWeight:c,rotate:"252deg",colorStartPrimary:R(l,{alpha:.6}),colorEndPrimary:l,colorStartInfo:R(n,{alpha:.6}),colorEndInfo:n,colorStartWarning:R(t,{alpha:.6}),colorEndWarning:t,colorStartError:R(u,{alpha:.6}),colorEndError:u,colorStartSuccess:R(r,{alpha:.6}),colorEndSuccess:r}},mn={name:"GradientText",common:G,self:pn};var fn=mn,gn=K("gradient-text",` + display: inline-block; + font-weight: var(--n-font-weight); + -webkit-background-clip: text; + background-clip: text; + color: #0000; + white-space: nowrap; + background-image: linear-gradient(var(--n-rotate), var(--n-color-start) 0%, var(--n-color-end) 100%); + transition: + --n-color-start .3s var(--n-bezier), + --n-color-end .3s var(--n-bezier); +`);const vn=Object.assign(Object.assign({},U.props),{size:[String,Number],fontSize:[String,Number],type:{type:String,default:"primary"},color:[Object,String],gradient:[Object,String]});var ee=A({name:"GradientText",props:vn,setup(e){en();const{mergedClsPrefixRef:l,inlineThemeDisabled:r}=Y(e),t=E(()=>{const{type:o}=e;return o==="danger"?"error":o}),u=E(()=>{let o=e.size||e.fontSize;return o&&(o=Te(o)),o||void 0}),n=E(()=>{const o=e.color||e.gradient;if(typeof o=="string")return o;if(o){const v=o.deg||0,h=o.from,w=o.to;return`linear-gradient(${v}deg, ${h} 0%, ${w} 100%)`}}),c=U("GradientText","-gradient-text",gn,fn,e,l),f=E(()=>{const{value:o}=t,{common:{cubicBezierEaseInOut:v},self:{rotate:h,[N("colorStart",o)]:w,[N("colorEnd",o)]:k,fontWeight:x}}=c.value;return{"--n-bezier":v,"--n-rotate":h,"--n-color-start":w,"--n-color-end":k,"--n-font-weight":x}}),d=r?Re("gradient-text",E(()=>t.value[0]),f,e):void 0;return{mergedClsPrefix:l,compatibleType:t,styleFontSize:u,styleBgImage:n,cssVars:r?void 0:f,themeClass:d==null?void 0:d.themeClass,onRender:d==null?void 0:d.onRender}},render(){const{mergedClsPrefix:e,onRender:l}=this;return l==null||l(),P("span",{class:[`${e}-gradient-text`,`${e}-gradient-text--${this.compatibleType}-type`,this.themeClass],style:[{fontSize:this.styleFontSize,backgroundImage:this.styleBgImage},this.cssVars]},this.$slots)}});const hn={class:"whisper-wrap"},wn={class:"whisper-line"},yn={class:"whisper-line send-wrap"},bn=A({__name:"whisper",props:{show:{type:Boolean,default:!1},user:null},emits:["success"],setup(e,{emit:l}){const r=e,t=m(""),u=m(!1),n=()=>{l("success")},c=()=>{u.value=!0,ze({user_id:r.user.id,content:t.value}).then(f=>{window.$message.success("\u53D1\u9001\u6210\u529F"),u.value=!1,t.value="",n()}).catch(f=>{u.value=!1})};return(f,d)=>{const o=ee,v=X,h=Q,w=Z,k=W,x=J;return y(),z(x,{show:e.show,"onUpdate:show":n,class:"whisper-card",preset:"card",size:"small",title:"\u79C1\u4FE1","mask-closable":!1,bordered:!1,style:{width:"360px"}},{default:p(()=>[C("div",hn,[i(h,{"show-icon":!1},{default:p(()=>[S(" \u5373\u5C06\u53D1\u9001\u79C1\u4FE1\u7ED9: "),i(v,{style:{"max-width":"100%"}},{default:p(()=>[i(o,{type:"success"},{default:p(()=>[S($(e.user.nickname)+"@"+$(e.user.username),1)]),_:1})]),_:1})]),_:1}),C("div",wn,[i(w,{type:"textarea",placeholder:"\u8BF7\u8F93\u5165\u79C1\u4FE1\u5185\u5BB9\uFF08\u8BF7\u52FF\u53D1\u9001\u4E0D\u548C\u8C10\u5185\u5BB9\uFF0C\u5426\u5219\u5C06\u4F1A\u88AB\u5C01\u53F7\uFF09",autosize:{minRows:5,maxRows:10},value:t.value,"onUpdate:value":d[0]||(d[0]=b=>t.value=b),maxlength:"200","show-count":""},null,8,["value"])]),C("div",yn,[i(k,{strong:"",secondary:"",type:"primary",loading:u.value,onClick:c},{default:p(()=>[S(" \u53D1\u9001 ")]),_:1},8,["loading"])])])]),_:1},8,["show"])}}});var Cn=O(bn,[["__scopeId","data-v-3e021430"]]);const kn={class:"whisper-wrap"},xn={class:"whisper-line"},Bn={class:"whisper-line send-wrap"},Fn=A({__name:"whisper-add-friend",props:{show:{type:Boolean,default:!1},user:null},emits:["success"],setup(e,{emit:l}){const r=e,t=m(""),u=m(!1),n=()=>{l("success")},c=()=>{u.value=!0,Ae({user_id:r.user.id,greetings:t.value}).then(f=>{window.$message.success("\u53D1\u9001\u6210\u529F"),u.value=!1,t.value="",n()}).catch(f=>{u.value=!1})};return(f,d)=>{const o=ee,v=X,h=Q,w=Z,k=W,x=J;return y(),z(x,{show:e.show,"onUpdate:show":n,class:"whisper-card",preset:"card",size:"small",title:"\u7533\u8BF7\u6DFB\u52A0\u670B\u53CB","mask-closable":!1,bordered:!1,style:{width:"360px"}},{default:p(()=>[C("div",kn,[i(h,{"show-icon":!1},{default:p(()=>[S(" \u53D1\u9001\u6DFB\u52A0\u670B\u53CB\u7533\u8BF7\u7ED9: "),i(v,{style:{"max-width":"100%"}},{default:p(()=>[i(o,{type:"success"},{default:p(()=>[S($(e.user.nickname)+"@"+$(e.user.username),1)]),_:1})]),_:1})]),_:1}),C("div",xn,[i(w,{type:"textarea",placeholder:"\u8BF7\u8F93\u5165\u771F\u631A\u7684\u95EE\u5019\u8BED",autosize:{minRows:5,maxRows:10},value:t.value,"onUpdate:value":d[0]||(d[0]=b=>t.value=b),maxlength:"120","show-count":""},null,8,["value"])]),C("div",Bn,[i(k,{strong:"",secondary:"",type:"primary",loading:u.value,onClick:c},{default:p(()=>[S(" \u53D1\u9001 ")]),_:1},8,["loading"])])])]),_:1},8,["show"])}}});var En=O(Fn,[["__scopeId","data-v-bf9bc04e"]]);const Sn={key:0,class:"profile-baseinfo"},Dn={class:"avatar"},$n={class:"base-info"},Tn={class:"username"},Rn={class:"uid"},zn={key:0,class:"user-opts"},An={key:0,class:"pagination-wrap"},In={key:0,class:"skeleton-wrap"},Pn={key:1},Un={key:0,class:"empty-wrap"},On=A({__name:"User",setup(e){Ie();const l=_n(),r=Ne(),t=Le(),u=m(!1),n=Pe({id:0,avatar:"",username:"",nickname:"",is_admin:!1,is_friend:!0,status:1}),c=m(!1),f=m(!1),d=m(!1),o=m([]),v=m(t.query.username||""),h=m(+t.query.p||1),w=m(20),k=m(0),x=()=>{u.value=!0,Ve({username:v.value,page:h.value,page_size:w.value}).then(s=>{u.value=!1,o.value=s.list,k.value=Math.ceil(s.pager.total_rows/w.value),window.scrollTo(0,0)}).catch(s=>{u.value=!1})},b=()=>{c.value=!0,je({username:v.value}).then(s=>{c.value=!1,n.id=s.id,n.avatar=s.avatar,n.username=s.username,n.nickname=s.nickname,n.is_admin=s.is_admin,n.is_friend=s.is_friend,n.status=s.status,x()}).catch(s=>{c.value=!1,console.log(s)})},a=s=>{h.value=s,x()},_=()=>{f.value=!0},g=()=>{d.value=!0},B=()=>{f.value=!1},I=()=>{d.value=!1},ne=E(()=>{let s=[{label:"\u79C1\u4FE1",key:"whisper"}];return r.state.userInfo.is_admin&&(n.status===1?s.push({label:"\u7981\u8A00",key:"banned"}):s.push({label:"\u89E3\u5C01",key:"deblocking"})),n.is_friend?s.push({label:"\u5220\u9664\u597D\u53CB",key:"delete"}):s.push({label:"\u6DFB\u52A0\u670B\u53CB",key:"requesting"}),s}),te=s=>{switch(s){case"whisper":_();break;case"delete":se();break;case"requesting":g();break;case"banned":case"deblocking":ae();break}},se=()=>{l.warning({title:"\u5220\u9664\u597D\u53CB",content:"\u5C06\u597D\u53CB \u201C"+n.nickname+"\u201D \u5220\u9664\uFF0C\u5C06\u540C\u65F6\u5220\u9664 \u70B9\u8D5E/\u6536\u85CF \u5217\u8868\u4E2D\u5173\u4E8E\u8BE5\u670B\u53CB\u7684 \u201C\u597D\u53CB\u53EF\u89C1\u201D \u63A8\u6587",positiveText:"\u786E\u5B9A",negativeText:"\u53D6\u6D88",onPositiveClick:()=>{c.value=!0,He({user_id:n.id}).then(s=>{c.value=!1,n.is_friend=!1,x()}).catch(s=>{c.value=!1,console.log(s)})}})},ae=()=>{l.warning({title:"\u8B66\u544A",content:"\u786E\u5B9A\u5BF9\u8BE5\u7528\u6237\u8FDB\u884C"+(n.status===1?"\u7981\u8A00":"\u89E3\u5C01")+"\u5904\u7406\u5417\uFF1F",positiveText:"\u786E\u5B9A",negativeText:"\u53D6\u6D88",onPositiveClick:()=>{c.value=!0,Ge({id:n.id,status:n.status===1?2:1}).then(s=>{c.value=!1,b()}).catch(s=>{c.value=!1,console.log(s)})}})};return Ue(()=>({path:t.path,query:t.query}),(s,L)=>{L.path==="/user"&&s.path==="/user"&&(v.value=t.query.username||"",b())}),Oe(()=>{b()}),(s,L)=>{const oe=sn,ie=Ke,j=Ye,le=We,ue=W,re=Ze,ce=Cn,de=Je,_e=ln,pe=Qe,me=Xe,fe=be,ge=nn,ve=ye,he=tn,we=on;return y(),F("div",null,[i(oe,{title:"\u7528\u6237\u8BE6\u60C5"}),i(we,{class:"main-content-wrap profile-wrap",bordered:""},{footer:p(()=>[k.value>0?(y(),F("div",An,[i(_e,{page:h.value,"onUpdate:page":a,"page-slot":D(r).state.collapsedRight?5:8,"page-count":k.value},null,8,["page","page-slot","page-count"])])):T("",!0)]),default:p(()=>[i(de,{show:c.value},{default:p(()=>[n.id>0?(y(),F("div",Sn,[C("div",Dn,[i(ie,{size:"large",src:n.avatar},null,8,["src"])]),C("div",$n,[C("div",Tn,[C("strong",null,$(n.nickname),1),C("span",null," @"+$(n.username),1),D(r).state.userInfo.id>0&&D(r).state.userInfo.username!=n.username&&n.is_friend?(y(),z(j,{key:0,class:"top-tag",type:"info",size:"small",round:""},{default:p(()=>[S(" \u597D\u53CB ")]),_:1})):T("",!0),n.is_admin?(y(),z(j,{key:1,class:"top-tag",type:"error",size:"small",round:""},{default:p(()=>[S(" \u7BA1\u7406\u5458 ")]),_:1})):T("",!0)]),C("div",Rn,"UID. "+$(n.id),1)]),D(r).state.userInfo.id>0&&D(r).state.userInfo.username!=n.username?(y(),F("div",zn,[i(re,{placement:"bottom-end",trigger:"click",size:"small",options:D(ne),onSelect:te},{default:p(()=>[i(ue,{quaternary:"",circle:""},{icon:p(()=>[i(le,null,{default:p(()=>[i(D(an))]),_:1})]),_:1})]),_:1},8,["options"])])):T("",!0)])):T("",!0),i(ce,{show:f.value,user:n,onSuccess:B},null,8,["show","user"]),i(En,{show:d.value,user:n,onSuccess:I},null,8,["show","user"])]),_:1},8,["show"]),i(me,{class:"profile-tabs-wrap",animated:""},{default:p(()=>[i(pe,{name:"post",tab:"\u6CE1\u6CE1"})]),_:1}),u.value?(y(),F("div",In,[i(fe,{num:w.value},null,8,["num"])])):(y(),F("div",Pn,[o.value.length===0?(y(),F("div",Un,[i(ge,{size:"large",description:"\u6682\u65E0\u6570\u636E"})])):T("",!0),(y(!0),F(qe,null,Me(o.value,q=>(y(),z(he,{key:q.id},{default:p(()=>[i(ve,{post:q},null,8,["post"])]),_:2},1024))),128))]))]),_:1})])}}});var Jn=O(On,[["__scopeId","data-v-7a6aaa02"]]);export{Jn as default}; diff --git a/web/dist/assets/User.7b771241.css b/web/dist/assets/User.7b771241.css new file mode 100644 index 00000000..c858a635 --- /dev/null +++ b/web/dist/assets/User.7b771241.css @@ -0,0 +1 @@ +.whisper-wrap .whisper-line[data-v-3e021430]{margin-top:10px}.whisper-wrap .whisper-line.send-wrap .n-button[data-v-3e021430]{width:100%}.whisper-wrap .whisper-line[data-v-bf9bc04e]{margin-top:10px}.whisper-wrap .whisper-line.send-wrap .n-button[data-v-bf9bc04e]{width:100%}.profile-tabs-wrap[data-v-7a6aaa02]{padding:0 16px}.profile-baseinfo[data-v-7a6aaa02]{display:flex;padding:16px}.profile-baseinfo .avatar[data-v-7a6aaa02]{width:55px}.profile-baseinfo .base-info[data-v-7a6aaa02]{position:relative;width:calc(100% - 55px)}.profile-baseinfo .base-info .username[data-v-7a6aaa02]{line-height:16px;font-size:16px}.profile-baseinfo .base-info .uid[data-v-7a6aaa02]{font-size:14px;line-height:14px;margin-top:10px;opacity:.75}.profile-baseinfo .base-info .top-tag[data-v-7a6aaa02]{transform:scale(.75)}.profile-baseinfo .user-opts[data-v-7a6aaa02]{position:absolute;top:16px;right:16px;opacity:.75}.pagination-wrap[data-v-7a6aaa02]{padding:10px;display:flex;justify-content:center;overflow:hidden} diff --git a/web/dist/assets/Wallet.0c985f96.js b/web/dist/assets/Wallet.0c985f96.js new file mode 100644 index 00000000..ac6dbcda --- /dev/null +++ b/web/dist/assets/Wallet.0c985f96.js @@ -0,0 +1,30 @@ +import{_ as se}from"./post-skeleton.38f0f247.js";import{_ as ae}from"./main-nav.3167f221.js";import{cw as Lt,cx as ue,cy as St,d as at,J as le,r as D,y as _t,a2 as Ut,aK as ce,c as Q,f as X,u as fe,x as kt,cz as de,j as ge,A as he,h as x,B as Z,W as R,Y as L,Z as I,ai as me,af as pe,a4 as b,a5 as S,aj as _e,cA as we,bA as ye,a3 as tt,a7 as et,a9 as nt,ab as It,ac as Tt,b4 as Ce,b5 as ve,aa as $,$ as Ee,cB as Be,cC as be,cD as Ae,K as Ne,ah as Se,cs as Ie,aA as Te,a6 as Mt,cb as Me,a8 as Re,bW as Pe,bX as Fe}from"./index.d4f5aad2.js";import{f as De}from"./formatTime.e07969bb.js";import{_ as Le}from"./List.a66e9ae7.js";import{_ as Ue}from"./Pagination.c13c2d34.js";import{a as ke,_ as ze}from"./Skeleton.e1c16fcb.js";var Rt=1/0,Ve=17976931348623157e292;function xe(e){if(!e)return e===0?e:0;if(e=Lt(e),e===Rt||e===-Rt){var t=e<0?-1:1;return t*Ve}return e===e?e:0}function $e(e){var t=xe(e),i=t%1;return t===t?i?t-i:t:0}var He=ue.isFinite,Ke=Math.min;function Oe(e){var t=Math[e];return function(i,r){if(i=Lt(i),r=r==null?0:Ke($e(r),292),r&&He(i)){var o=(St(i)+"e").split("e"),n=t(o[0]+"e"+(+o[1]+r));return o=(St(n)+"e").split("e"),+(o[0]+"e"+(+o[1]-r))}return t(i)}}var Je=Oe("round"),Ye=Je;const je=e=>1-Math.pow(1-e,5);function qe(e){const{from:t,to:i,duration:r,onUpdate:o,onFinish:n}=e,s=()=>{const u=performance.now(),l=Math.min(u-a,r),c=t+(i-t)*je(l/r);if(l===r){n();return}o(c),requestAnimationFrame(s)},a=performance.now();s()}const Ge={to:{type:Number,default:0},precision:{type:Number,default:0},showSeparator:Boolean,locale:String,from:{type:Number,default:0},active:{type:Boolean,default:!0},duration:{type:Number,default:2e3},onFinish:Function};var We=at({name:"NumberAnimation",props:Ge,setup(e){const{localeRef:t}=le("name"),{duration:i}=e,r=D(e.from),o=_t(()=>{const{locale:f}=e;return f!==void 0?f:t.value});let n=!1;const s=f=>{r.value=f},a=()=>{var f;r.value=e.to,n=!1,(f=e.onFinish)===null||f===void 0||f.call(e)},u=(f=e.from,g=e.to)=>{n=!0,r.value=e.from,f!==g&&qe({from:f,to:g,duration:i,onUpdate:s,onFinish:a})},l=_t(()=>{var f;const p=Ye(r.value,e.precision).toFixed(e.precision).split("."),_=new Intl.NumberFormat(o.value),E=(f=_.formatToParts(.5).find(d=>d.type==="decimal"))===null||f===void 0?void 0:f.value,m=e.showSeparator?_.format(Number(p[0])):p[0],w=p[1];return{integer:m,decimal:w,decimalSeparator:E}});function c(){n||u()}return Ut(()=>{ce(()=>{e.active&&u()})}),Object.assign({formattedValue:l},{play:c})},render(){const{formattedValue:{integer:e,decimal:t,decimalSeparator:i}}=this;return[e,t?i:null,t]}}),Qe=Q("statistic",[X("label",` + font-weight: var(--n-label-font-weight); + transition: .3s color var(--n-bezier); + font-size: var(--n-label-font-size); + color: var(--n-label-text-color); + `),Q("statistic-value",` + margin-top: 4px; + font-weight: var(--n-value-font-weight); + `,[X("prefix",` + margin: 0 4px 0 0; + font-size: var(--n-value-font-size); + transition: .3s color var(--n-bezier); + color: var(--n-value-prefix-text-color); + `,[Q("icon",{verticalAlign:"-0.125em"})]),X("content",` + font-size: var(--n-value-font-size); + transition: .3s color var(--n-bezier); + color: var(--n-value-text-color); + `),X("suffix",` + margin: 0 0 0 4px; + font-size: var(--n-value-font-size); + transition: .3s color var(--n-bezier); + color: var(--n-value-suffix-text-color); + `,[Q("icon",{verticalAlign:"-0.125em"})])])]);const Xe=Object.assign(Object.assign({},kt.props),{tabularNums:Boolean,label:String,value:[String,Number]});var Ze=at({name:"Statistic",props:Xe,setup(e){const{mergedClsPrefixRef:t,inlineThemeDisabled:i,mergedRtlRef:r}=fe(e),o=kt("Statistic","-statistic",Qe,de,e,t),n=ge("Statistic",r,t),s=_t(()=>{const{self:{labelFontWeight:u,valueFontSize:l,valueFontWeight:c,valuePrefixTextColor:y,labelTextColor:f,valueSuffixTextColor:g,valueTextColor:p,labelFontSize:_},common:{cubicBezierEaseInOut:E}}=o.value;return{"--n-bezier":E,"--n-label-font-size":_,"--n-label-font-weight":u,"--n-label-text-color":f,"--n-value-font-weight":c,"--n-value-font-size":l,"--n-value-prefix-text-color":y,"--n-value-suffix-text-color":g,"--n-value-text-color":p}}),a=i?he("statistic",void 0,s,e):void 0;return{rtlEnabled:n,mergedClsPrefix:t,cssVars:i?void 0:s,themeClass:a==null?void 0:a.themeClass,onRender:a==null?void 0:a.onRender}},render(){var e;const{mergedClsPrefix:t,$slots:{default:i,label:r,prefix:o,suffix:n}}=this;return(e=this.onRender)===null||e===void 0||e.call(this),x("div",{class:[`${t}-statistic`,this.themeClass,this.rtlEnabled&&`${t}-statistic--rtl`],style:this.cssVars},Z(r,s=>x("div",{class:`${t}-statistic__label`},this.label||s)),x("div",{class:`${t}-statistic-value`,style:{fontVariantNumeric:this.tabularNums?"tabular-nums":""}},Z(o,s=>s&&x("span",{class:`${t}-statistic-value__prefix`},s)),this.value!==void 0?x("span",{class:`${t}-statistic-value__content`},this.value):Z(i,s=>s&&x("span",{class:`${t}-statistic-value__content`},s)),Z(n,s=>s&&x("span",{class:`${t}-statistic-value__suffix`},s))))}});const tn={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},en=I("path",{d:"M102.41 32C62.38 32 32 64.12 32 103.78v304.45C32 447.86 64.38 480 104.41 480h303.2c40 0 72.39-32.14 72.39-71.77v-3.11c-1.35-.56-115.47-48.57-174.5-76.7c-39.82 48.57-91.18 78-144.5 78c-90.18 0-120.8-78.22-78.1-129.72c9.31-11.22 25.15-21.94 49.73-28c38.45-9.36 99.64 5.85 157 24.61a309.41 309.41 0 0 0 25.46-61.67H138.34V194h91.13v-31.83H119.09v-17.75h110.38V99s0-7.65 7.82-7.65h44.55v53H391v17.75H281.84V194h89.08a359.41 359.41 0 0 1-37.72 94.43c27 9.69 49.31 18.88 67.39 24.89c60.32 20 77.23 22.45 79.41 22.7V103.78C480 64.12 447.6 32 407.61 32h-305.2zM152 274.73q-5.81.06-11.67.63c-11.3 1.13-32.5 6.07-44.09 16.23c-34.74 30-13.94 84.93 56.37 84.93c40.87 0 81.71-25.9 113.79-67.37c-41.36-20-77-34.85-114.4-34.42z",fill:"currentColor"},null,-1),nn=[en];var on=at({name:"LogoAlipay",render:function(t,i){return R(),L("svg",tn,nn)}}),G={},rn=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then},zt={},T={};let Et;const sn=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];T.getSymbolSize=function(t){if(!t)throw new Error('"version" cannot be null or undefined');if(t<1||t>40)throw new Error('"version" should be in range from 1 to 40');return t*4+17};T.getSymbolTotalCodewords=function(t){return sn[t]};T.getBCHDigit=function(e){let t=0;for(;e!==0;)t++,e>>>=1;return t};T.setToSJISFunction=function(t){if(typeof t!="function")throw new Error('"toSJISFunc" is not a valid function.');Et=t};T.isKanjiModeEnabled=function(){return typeof Et!="undefined"};T.toSJIS=function(t){return Et(t)};var ut={};(function(e){e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(i){if(typeof i!="string")throw new Error("Param is not a string");switch(i.toLowerCase()){case"l":case"low":return e.L;case"m":case"medium":return e.M;case"q":case"quartile":return e.Q;case"h":case"high":return e.H;default:throw new Error("Unknown EC Level: "+i)}}e.isValid=function(r){return r&&typeof r.bit!="undefined"&&r.bit>=0&&r.bit<4},e.from=function(r,o){if(e.isValid(r))return r;try{return t(r)}catch{return o}}})(ut);function Vt(){this.buffer=[],this.length=0}Vt.prototype={get:function(e){const t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)===1},put:function(e,t){for(let i=0;i>>t-i-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(e){const t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}};var an=Vt;function W(e){if(!e||e<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=e,this.data=new Uint8Array(e*e),this.reservedBit=new Uint8Array(e*e)}W.prototype.set=function(e,t,i,r){const o=e*this.size+t;this.data[o]=i,r&&(this.reservedBit[o]=!0)};W.prototype.get=function(e,t){return this.data[e*this.size+t]};W.prototype.xor=function(e,t,i){this.data[e*this.size+t]^=i};W.prototype.isReserved=function(e,t){return this.reservedBit[e*this.size+t]};var un=W,xt={};(function(e){const t=T.getSymbolSize;e.getRowColCoords=function(r){if(r===1)return[];const o=Math.floor(r/7)+2,n=t(r),s=n===145?26:Math.ceil((n-13)/(2*o-2))*2,a=[n-7];for(let u=1;u=0&&o<=7},e.from=function(o){return e.isValid(o)?parseInt(o,10):void 0},e.getPenaltyN1=function(o){const n=o.size;let s=0,a=0,u=0,l=null,c=null;for(let y=0;y=5&&(s+=t.N1+(a-5)),l=g,a=1),g=o.get(f,y),g===c?u++:(u>=5&&(s+=t.N1+(u-5)),c=g,u=1)}a>=5&&(s+=t.N1+(a-5)),u>=5&&(s+=t.N1+(u-5))}return s},e.getPenaltyN2=function(o){const n=o.size;let s=0;for(let a=0;a=10&&(a===1488||a===93)&&s++,u=u<<1&2047|o.get(c,l),c>=10&&(u===1488||u===93)&&s++}return s*t.N3},e.getPenaltyN4=function(o){let n=0;const s=o.data.length;for(let u=0;u=0;){const s=n[0];for(let u=0;u0){const n=new Uint8Array(this.degree);return n.set(r,o),n}return r};var cn=Bt,Jt={},z={},bt={};bt.isValid=function(t){return!isNaN(t)&&t>=1&&t<=40};var U={};const Yt="[0-9]+",fn="[A-Z $%*+\\-./:]+";let q="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";q=q.replace(/u/g,"\\u");const dn="(?:(?![A-Z0-9 $%*+\\-./:]|"+q+`)(?:.|[\r +]))+`;U.KANJI=new RegExp(q,"g");U.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g");U.BYTE=new RegExp(dn,"g");U.NUMERIC=new RegExp(Yt,"g");U.ALPHANUMERIC=new RegExp(fn,"g");const gn=new RegExp("^"+q+"$"),hn=new RegExp("^"+Yt+"$"),mn=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");U.testKanji=function(t){return gn.test(t)};U.testNumeric=function(t){return hn.test(t)};U.testAlphanumeric=function(t){return mn.test(t)};(function(e){const t=bt,i=U;e.NUMERIC={id:"Numeric",bit:1<<0,ccBits:[10,12,14]},e.ALPHANUMERIC={id:"Alphanumeric",bit:1<<1,ccBits:[9,11,13]},e.BYTE={id:"Byte",bit:1<<2,ccBits:[8,16,16]},e.KANJI={id:"Kanji",bit:1<<3,ccBits:[8,10,12]},e.MIXED={bit:-1},e.getCharCountIndicator=function(n,s){if(!n.ccBits)throw new Error("Invalid mode: "+n);if(!t.isValid(s))throw new Error("Invalid version: "+s);return s>=1&&s<10?n.ccBits[0]:s<27?n.ccBits[1]:n.ccBits[2]},e.getBestModeForData=function(n){return i.testNumeric(n)?e.NUMERIC:i.testAlphanumeric(n)?e.ALPHANUMERIC:i.testKanji(n)?e.KANJI:e.BYTE},e.toString=function(n){if(n&&n.id)return n.id;throw new Error("Invalid mode")},e.isValid=function(n){return n&&n.bit&&n.ccBits};function r(o){if(typeof o!="string")throw new Error("Param is not a string");switch(o.toLowerCase()){case"numeric":return e.NUMERIC;case"alphanumeric":return e.ALPHANUMERIC;case"kanji":return e.KANJI;case"byte":return e.BYTE;default:throw new Error("Unknown mode: "+o)}}e.from=function(n,s){if(e.isValid(n))return n;try{return r(n)}catch{return s}}})(z);(function(e){const t=T,i=lt,r=ut,o=z,n=bt,s=1<<12|1<<11|1<<10|1<<9|1<<8|1<<5|1<<2|1<<0,a=t.getBCHDigit(s);function u(f,g,p){for(let _=1;_<=40;_++)if(g<=e.getCapacity(_,p,f))return _}function l(f,g){return o.getCharCountIndicator(f,g)+4}function c(f,g){let p=0;return f.forEach(function(_){p+=l(_.mode,g)+_.getBitsLength()}),p}function y(f,g){for(let p=1;p<=40;p++)if(c(f,p)<=e.getCapacity(p,g,o.MIXED))return p}e.from=function(g,p){return n.isValid(g)?parseInt(g,10):p},e.getCapacity=function(g,p,_){if(!n.isValid(g))throw new Error("Invalid QR Code version");typeof _=="undefined"&&(_=o.BYTE);const E=t.getSymbolTotalCodewords(g),m=i.getTotalCodewordsCount(g,p),w=(E-m)*8;if(_===o.MIXED)return w;const d=w-l(_,g);switch(_){case o.NUMERIC:return Math.floor(d/10*3);case o.ALPHANUMERIC:return Math.floor(d/11*2);case o.KANJI:return Math.floor(d/13);case o.BYTE:default:return Math.floor(d/8)}},e.getBestVersionForData=function(g,p){let _;const E=r.from(p,r.M);if(Array.isArray(g)){if(g.length>1)return y(g,E);if(g.length===0)return 1;_=g[0]}else _=g;return u(_.mode,_.getLength(),E)},e.getEncodedBits=function(g){if(!n.isValid(g)||g<7)throw new Error("Invalid QR Code version");let p=g<<12;for(;t.getBCHDigit(p)-a>=0;)p^=s<=0;)o^=qt<0&&(r=this.data.substr(i),o=parseInt(r,10),t.put(o,n*3+1))};var wn=H;const yn=z,dt=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function K(e){this.mode=yn.ALPHANUMERIC,this.data=e}K.getBitsLength=function(t){return 11*Math.floor(t/2)+6*(t%2)};K.prototype.getLength=function(){return this.data.length};K.prototype.getBitsLength=function(){return K.getBitsLength(this.data.length)};K.prototype.write=function(t){let i;for(i=0;i+2<=this.data.length;i+=2){let r=dt.indexOf(this.data[i])*45;r+=dt.indexOf(this.data[i+1]),t.put(r,11)}this.data.length%2&&t.put(dt.indexOf(this.data[i]),6)};var Cn=K,vn=function(t){for(var i=[],r=t.length,o=0;o=55296&&n<=56319&&r>o+1){var s=t.charCodeAt(o+1);s>=56320&&s<=57343&&(n=(n-55296)*1024+s-56320+65536,o+=1)}if(n<128){i.push(n);continue}if(n<2048){i.push(n>>6|192),i.push(n&63|128);continue}if(n<55296||n>=57344&&n<65536){i.push(n>>12|224),i.push(n>>6&63|128),i.push(n&63|128);continue}if(n>=65536&&n<=1114111){i.push(n>>18|240),i.push(n>>12&63|128),i.push(n>>6&63|128),i.push(n&63|128);continue}i.push(239,191,189)}return new Uint8Array(i).buffer};const En=vn,Bn=z;function O(e){this.mode=Bn.BYTE,typeof e=="string"&&(e=En(e)),this.data=new Uint8Array(e)}O.getBitsLength=function(t){return t*8};O.prototype.getLength=function(){return this.data.length};O.prototype.getBitsLength=function(){return O.getBitsLength(this.data.length)};O.prototype.write=function(e){for(let t=0,i=this.data.length;t=33088&&i<=40956)i-=33088;else if(i>=57408&&i<=60351)i-=49472;else throw new Error("Invalid SJIS character: "+this.data[t]+` +Make sure your charset is UTF-8`);i=(i>>>8&255)*192+(i&255),e.put(i,13)}};var Sn=J,Wt={exports:{}};(function(e){var t={single_source_shortest_paths:function(i,r,o){var n={},s={};s[r]=0;var a=t.PriorityQueue.make();a.push(r,0);for(var u,l,c,y,f,g,p,_,E;!a.empty();){u=a.pop(),l=u.value,y=u.cost,f=i[l]||{};for(c in f)f.hasOwnProperty(c)&&(g=f[c],p=y+g,_=s[c],E=typeof s[c]=="undefined",(E||_>p)&&(s[c]=p,a.push(c,p),n[c]=l))}if(typeof o!="undefined"&&typeof s[o]=="undefined"){var m=["Could not find a path from ",r," to ",o,"."].join("");throw new Error(m)}return n},extract_shortest_path_from_predecessor_list:function(i,r){for(var o=[],n=r;n;)o.push(n),i[n],n=i[n];return o.reverse(),o},find_path:function(i,r,o){var n=t.single_source_shortest_paths(i,r,o);return t.extract_shortest_path_from_predecessor_list(n,o)},PriorityQueue:{make:function(i){var r=t.PriorityQueue,o={},n;i=i||{};for(n in r)r.hasOwnProperty(n)&&(o[n]=r[n]);return o.queue=[],o.sorter=i.sorter||r.default_sorter,o},default_sorter:function(i,r){return i.cost-r.cost},push:function(i,r){var o={value:i,cost:r};this.queue.push(o),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};e.exports=t})(Wt);(function(e){const t=z,i=wn,r=Cn,o=bn,n=Sn,s=U,a=T,u=Wt.exports;function l(m){return unescape(encodeURIComponent(m)).length}function c(m,w,d){const h=[];let C;for(;(C=m.exec(d))!==null;)h.push({data:C[0],index:C.index,mode:w,length:C[0].length});return h}function y(m){const w=c(s.NUMERIC,t.NUMERIC,m),d=c(s.ALPHANUMERIC,t.ALPHANUMERIC,m);let h,C;return a.isKanjiModeEnabled()?(h=c(s.BYTE,t.BYTE,m),C=c(s.KANJI,t.KANJI,m)):(h=c(s.BYTE_KANJI,t.BYTE,m),C=[]),w.concat(d,h,C).sort(function(B,A){return B.index-A.index}).map(function(B){return{data:B.data,mode:B.mode,length:B.length}})}function f(m,w){switch(w){case t.NUMERIC:return i.getBitsLength(m);case t.ALPHANUMERIC:return r.getBitsLength(m);case t.KANJI:return n.getBitsLength(m);case t.BYTE:return o.getBitsLength(m)}}function g(m){return m.reduce(function(w,d){const h=w.length-1>=0?w[w.length-1]:null;return h&&h.mode===d.mode?(w[w.length-1].data+=d.data,w):(w.push(d),w)},[])}function p(m){const w=[];for(let d=0;d=0&&a<=6&&(u===0||u===6)||u>=0&&u<=6&&(a===0||a===6)||a>=2&&a<=4&&u>=2&&u<=4?e.set(n+a,s+u,!0,!0):e.set(n+a,s+u,!1,!0))}}function Un(e){const t=e.size;for(let i=8;i>a&1)===1,e.set(o,n,s,!0),e.set(n,o,s,!0)}function mt(e,t,i){const r=e.size,o=Fn.getEncodedBits(t,i);let n,s;for(n=0;n<15;n++)s=(o>>n&1)===1,n<6?e.set(n,8,s,!0):n<8?e.set(n+1,8,s,!0):e.set(r-15+n,8,s,!0),n<8?e.set(8,r-n-1,s,!0):n<9?e.set(8,15-n-1+1,s,!0):e.set(8,15-n-1,s,!0);e.set(r-8,8,1,!0)}function Vn(e,t){const i=e.size;let r=-1,o=i-1,n=7,s=0;for(let a=i-1;a>0;a-=2)for(a===6&&a--;;){for(let u=0;u<2;u++)if(!e.isReserved(o,a-u)){let l=!1;s>>n&1)===1),e.set(o,a-u,l),n--,n===-1&&(s++,n=7)}if(o+=r,o<0||i<=o){o-=r,r=-r;break}}}function xn(e,t,i){const r=new In;i.forEach(function(u){r.put(u.mode.bit,4),r.put(u.getLength(),Dn.getCharCountIndicator(u.mode,e)),u.write(r)});const o=ft.getSymbolTotalCodewords(e),n=Ct.getTotalCodewordsCount(e,t),s=(o-n)*8;for(r.getLengthInBits()+4<=s&&r.put(0,4);r.getLengthInBits()%8!==0;)r.putBit(0);const a=(s-r.getLengthInBits())/8;for(let u=0;u=7&&zn(u,t),Vn(u,s),isNaN(r)&&(r=yt.getBestMask(u,mt.bind(null,u,i))),yt.applyMask(r,u),mt(u,i,r),{modules:u,version:t,errorCorrectionLevel:i,maskPattern:r,segments:o}}zt.create=function(t,i){if(typeof t=="undefined"||t==="")throw new Error("No input text");let r=gt.M,o,n;return typeof i!="undefined"&&(r=gt.from(i.errorCorrectionLevel,gt.M),o=st.from(i.version),n=yt.from(i.maskPattern),i.toSJISFunc&&ft.setToSJISFunction(i.toSJISFunc)),Hn(t,o,r,n)};var Qt={},At={};(function(e){function t(i){if(typeof i=="number"&&(i=i.toString()),typeof i!="string")throw new Error("Color should be defined as hex string");let r=i.slice().replace("#","").split("");if(r.length<3||r.length===5||r.length>8)throw new Error("Invalid hex color: "+i);(r.length===3||r.length===4)&&(r=Array.prototype.concat.apply([],r.map(function(n){return[n,n]}))),r.length===6&&r.push("F","F");const o=parseInt(r.join(""),16);return{r:o>>24&255,g:o>>16&255,b:o>>8&255,a:o&255,hex:"#"+r.slice(0,6).join("")}}e.getOptions=function(r){r||(r={}),r.color||(r.color={});const o=typeof r.margin=="undefined"||r.margin===null||r.margin<0?4:r.margin,n=r.width&&r.width>=21?r.width:void 0,s=r.scale||4;return{width:n,scale:n?4:s,margin:o,color:{dark:t(r.color.dark||"#000000ff"),light:t(r.color.light||"#ffffffff")},type:r.type,rendererOpts:r.rendererOpts||{}}},e.getScale=function(r,o){return o.width&&o.width>=r+o.margin*2?o.width/(r+o.margin*2):o.scale},e.getImageWidth=function(r,o){const n=e.getScale(r,o);return Math.floor((r+o.margin*2)*n)},e.qrToImageData=function(r,o,n){const s=o.modules.size,a=o.modules.data,u=e.getScale(s,n),l=Math.floor((s+n.margin*2)*u),c=n.margin*u,y=[n.color.light,n.color.dark];for(let f=0;f=c&&g>=c&&f0&&u>0&&e[a-1]||(r+=n?pt("M",u+i,.5+l+i):pt("m",o,0),o=0,n=!1),u+1':"",l="',c='viewBox="0 0 '+a+" "+a+'"',y=o.width?'width="'+o.width+'" height="'+o.width+'" ':"",f=''+u+l+` +`;return typeof r=="function"&&r(null,f),f};const Jn=rn,vt=zt,Zt=Qt,Yn=Xt;function Nt(e,t,i,r,o){const n=[].slice.call(arguments,1),s=n.length,a=typeof n[s-1]=="function";if(!a&&!Jn())throw new Error("Callback required as last argument");if(a){if(s<2)throw new Error("Too few arguments provided");s===2?(o=i,i=t,t=r=void 0):s===3&&(t.getContext&&typeof o=="undefined"?(o=r,r=void 0):(o=r,r=i,i=t,t=void 0))}else{if(s<1)throw new Error("Too few arguments provided");return s===1?(i=t,t=r=void 0):s===2&&!t.getContext&&(r=i,i=t,t=void 0),new Promise(function(u,l){try{const c=vt.create(i,r);u(e(c,t,r))}catch(c){l(c)}})}try{const u=vt.create(i,r);o(null,e(u,t,r))}catch(u){o(u)}}G.create=vt.create;G.toCanvas=Nt.bind(null,Zt.render);G.toDataURL=Nt.bind(null,Zt.renderToDataURL);G.toString=Nt.bind(null,function(e,t,i){return Yn.render(e,i)});const te=e=>(Pe("data-v-4ef16ff5"),e=e(),Fe(),e),jn={class:"balance-wrap"},qn={class:"balance-line"},Gn={class:"balance-opts"},Wn={key:0,class:"pagination-wrap"},Qn={key:0,class:"skeleton-wrap"},Xn={key:1},Zn={key:0,class:"empty-wrap"},to={class:"bill-line"},eo={key:0,class:"amount-options"},no={key:1,style:{"margin-top":"10px"}},oo={class:"qrcode-wrap"},ro=te(()=>I("canvas",{id:"qrcode-container"},null,-1)),io={class:"pay-tips"},so={class:"pay-sub-tips"},ao=te(()=>I("span",{style:{"margin-left":"6px"}}," \u652F\u4ED8\u7ED3\u679C\u5B9E\u65F6\u540C\u6B65\u4E2D... ",-1)),uo=at({__name:"Wallet",setup(e){const t=Ee(),i=_e(),r=D(!1),o=D(100),n=D(!1),s=D(""),a=D(!1),u=D([]),l=D(+i.query.p||1),c=D(20),y=D(0),f=D([100,200,300,500,1e3,3e3,5e3,1e4,5e4]),g=()=>{a.value=!0,Be({page:l.value,page_size:c.value}).then(d=>{a.value=!1,u.value=d.list,y.value=Math.ceil(d.pager.total_rows/c.value),window.scrollTo(0,0)}).catch(d=>{a.value=!1})},p=d=>{l.value=d,g()},_=()=>{const d=localStorage.getItem("PAOPAO_TOKEN")||"";d?we(d).then(h=>{t.commit("updateUserinfo",h),t.commit("triggerAuth",!1),g()}).catch(h=>{t.commit("triggerAuth",!0),t.commit("userLogout")}):(t.commit("triggerAuth",!0),t.commit("userLogout"))},E=()=>{r.value=!0},m=d=>{n.value=!0,be({amount:o.value}).then(h=>{n.value=!1,s.value=h.pay,G.toCanvas(document.querySelector("#qrcode-container"),h.pay,{width:150,margin:2});const C=setInterval(()=>{Ae({id:h.id}).then(v=>{v.status==="TRADE_SUCCESS"&&(clearInterval(C),window.$message.success("\u5145\u503C\u6210\u529F"),r.value=!1,s.value="",_())}).catch(v=>{console.log(v)})},2e3)}).catch(h=>{n.value=!1})},w=()=>{t.state.userInfo.balance==0?window.$message.warning("\u60A8\u6682\u65E0\u53EF\u63D0\u73B0\u8D44\u91D1"):window.$message.warning("\u8BE5\u529F\u80FD\u5373\u5C06\u5F00\u653E")};return Ut(()=>{_()}),(d,h)=>{const C=ae,v=We,B=Ze,A=Ne,P=Se,M=Ue,V=se,Y=ke,F=ze,ee=Le,ne=pe,oe=Ie,re=Te,ie=ye;return R(),L("div",null,[b(C,{title:"\u94B1\u5305"}),b(ee,{class:"main-content-wrap",bordered:""},{footer:S(()=>[y.value>1?(R(),L("div",Wn,[b(M,{page:l.value,"onUpdate:page":p,"page-slot":tt(t).state.collapsedRight?5:8,"page-count":y.value},null,8,["page","page-slot","page-count"])])):et("",!0)]),default:S(()=>[I("div",jn,[I("div",qn,[b(B,{label:"\u8D26\u6237\u4F59\u989D (\u5143)"},{default:S(()=>[b(v,{from:0,to:(tt(t).state.userInfo.balance||0)/100,duration:500,precision:2},null,8,["from","to"])]),_:1}),I("div",Gn,[b(P,{vertical:""},{default:S(()=>[b(A,{size:"small",secondary:"",type:"primary",onClick:E},{default:S(()=>[nt(" \u5145\u503C ")]),_:1}),b(A,{size:"small",secondary:"",type:"tertiary",onClick:w},{default:S(()=>[nt(" \u63D0\u73B0 ")]),_:1})]),_:1})])])]),a.value?(R(),L("div",Qn,[b(V,{num:c.value},null,8,["num"])])):(R(),L("div",Xn,[u.value.length===0?(R(),L("div",Zn,[b(Y,{size:"large",description:"\u6682\u65E0\u6570\u636E"})])):et("",!0),(R(!0),L(It,null,Tt(u.value,N=>(R(),Mt(F,{key:N.id},{default:S(()=>[I("div",to,[I("div",null,"NO."+$(N.id),1),I("div",null,$(N.reason),1),I("div",{class:Me({income:N.change_amount>=0,out:N.change_amount<0})},$((N.change_amount>0?"+":"")+(N.change_amount/100).toFixed(2)),3),I("div",null,$(tt(De)(N.created_on)),1)])]),_:2},1024))),128))]))]),_:1}),b(ie,{show:r.value,"onUpdate:show":h[0]||(h[0]=N=>r.value=N)},{default:S(()=>[b(re,{bordered:!1,title:"\u8BF7\u9009\u62E9\u5145\u503C\u91D1\u989D",role:"dialog","aria-modal":"true",style:{width:"100%","max-width":"330px"}},{default:S(()=>[s.value.length===0?(R(),L("div",eo,[b(P,{align:"baseline"},{default:S(()=>[(R(!0),L(It,null,Tt(f.value,N=>(R(),Mt(A,{key:N,size:"small",secondary:"",type:o.value===N?"info":"default",onClick:Re(lo=>o.value=N,["stop"])},{default:S(()=>[nt($(N/100)+"\u5143 ",1)]),_:2},1032,["type","onClick"]))),128))]),_:1})])):et("",!0),o.value>0&&s.value.length===0?(R(),L("div",no,[b(A,{loading:n.value,strong:"",secondary:"",type:"info",style:{width:"100%"},onClick:m},{icon:S(()=>[b(ne,null,{default:S(()=>[b(tt(on))]),_:1})]),default:S(()=>[nt(" \u524D\u5F80\u652F\u4ED8 ")]),_:1},8,["loading"])])):et("",!0),Ce(I("div",oo,[ro,I("div",io," \u8BF7\u4F7F\u7528\u652F\u4ED8\u5B9D\u626B\u7801\u652F\u4ED8"+$((o.value/100).toFixed(2))+"\u5143 ",1),I("div",so,[b(oe,{value:100,type:"info",dot:"",processing:""}),ao])],512),[[ve,s.value.length>0]])]),_:1})]),_:1},8,["show"])])}}});var wo=me(uo,[["__scopeId","data-v-4ef16ff5"]]);export{wo as default}; diff --git a/web/dist/assets/Wallet.e5757b5e.css b/web/dist/assets/Wallet.e5757b5e.css new file mode 100644 index 00000000..b0c3d8ec --- /dev/null +++ b/web/dist/assets/Wallet.e5757b5e.css @@ -0,0 +1 @@ +.balance-wrap[data-v-4ef16ff5]{padding:16px}.balance-wrap .balance-line[data-v-4ef16ff5]{display:flex;justify-content:space-between}.balance-wrap .balance-line .balance-opts[data-v-4ef16ff5]{display:flex;flex-direction:column}.bill-line[data-v-4ef16ff5]{padding:16px;display:flex;justify-content:space-between}.bill-line .income[data-v-4ef16ff5],.bill-line .out[data-v-4ef16ff5]{font-weight:700}.bill-line .income[data-v-4ef16ff5]{color:#18a058}.pagination-wrap[data-v-4ef16ff5]{padding:10px;display:flex;justify-content:center;overflow:hidden}.qrcode-wrap[data-v-4ef16ff5]{display:flex;flex-direction:column;align-items:center;justify-content:center}.qrcode-wrap .pay-tips[data-v-4ef16ff5]{margin-top:16px}.qrcode-wrap .pay-sub-tips[data-v-4ef16ff5]{margin-top:4px;font-size:12px;opacity:.75;display:flex;align-items:center}.dark .income[data-v-4ef16ff5]{color:#63e2b7} diff --git a/web/dist/assets/content.93884ea1.css b/web/dist/assets/content.93884ea1.css new file mode 100644 index 00000000..593baf96 --- /dev/null +++ b/web/dist/assets/content.93884ea1.css @@ -0,0 +1 @@ +.link-wrap[data-v-4c9a59cc]{margin-bottom:10px}.link-wrap .link-item[data-v-4c9a59cc]{display:flex;align-items:center}.link-wrap .link-item .hash-link .link-txt[data-v-4c9a59cc]{margin-left:4px;word-break:break-all}.images-wrap{margin-top:10px}.post-img{display:flex;margin:0;border-radius:3px;overflow:hidden;background:rgba(0,0,0,.1);border:1px solid #eee}.post-img img{width:100%;height:100%}.x1{height:140px}.x2{height:90px}.x3{height:80px}.dark .post-img{border:1px solid #333}@media screen and (max-width: 821px){.x1{height:100px}.x2{height:70px}.x3{height:50px}}.attach-item[data-v-ca444ed2]{margin:10px 0} diff --git a/web/dist/assets/content.ed80294a.js b/web/dist/assets/content.ed80294a.js new file mode 100644 index 00000000..e5ba04f6 --- /dev/null +++ b/web/dist/assets/content.ed80294a.js @@ -0,0 +1,810 @@ +import{b5 as V,bq as pe,y as D,r as z,as as ce,n as ve,d as C,q as fe,av as T,h as R,br as me,u as ye,v as L,a2 as he,p as ge,t as Q,ba as we,bd as W,be,bf as ke,C as $e,D as xe,bs as Z,W as a,Y as c,Z as E,ai as J,ab as g,ac as k,a4 as i,a5 as p,a3 as m,aa as q,a8 as $,af as ee,a6 as y,b4 as P,bt as ne,a7 as w,bu as te,bv as Se,bw as Ce,bx as _e,a9 as Ee,by as Be,bz as Re,K as ze,bA as je}from"./index.d4f5aad2.js";function Fe(e){if(typeof e=="number")return{"":e.toString()};const n={};return e.split(/ +/).forEach(l=>{if(l==="")return;const[s,u]=l.split(":");u===void 0?n[""]=s:n[s]=u}),n}function O(e,n){var l;if(e==null)return;const s=Fe(e);if(n===void 0)return s[""];if(typeof n=="string")return(l=s[n])!==null&&l!==void 0?l:s[""];if(Array.isArray(n)){for(let u=n.length-1;u>=0;--u){const o=n[u];if(o in s)return s[o]}return s[""]}else{let u,o=-1;return Object.keys(s).forEach(t=>{const d=Number(t);!Number.isNaN(d)&&n>=d&&d>=o&&(o=d,u=s[t])}),u}}function De(e){var n;const l=(n=e.dirs)===null||n===void 0?void 0:n.find(({dir:s})=>s===V);return!!(l&&l.value===!1)}const Me={xs:0,s:640,m:1024,l:1280,xl:1536,"2xl":1920};function Ie(e){return`(min-width: ${e}px)`}const U={};function Ne(e=Me){if(!pe)return D(()=>[]);if(typeof window.matchMedia!="function")return D(()=>[]);const n=z({}),l=Object.keys(e),s=(u,o)=>{u.matches?n.value[o]=!0:n.value[o]=!1};return l.forEach(u=>{const o=e[u];let t,d;U[o]===void 0?(t=window.matchMedia(Ie(o)),t.addEventListener?t.addEventListener("change",v=>{d.forEach(h=>{h(v,u)})}):t.addListener&&t.addListener(v=>{d.forEach(h=>{h(v,u)})}),d=new Set,U[o]={mql:t,cbs:d}):(t=U[o].mql,d=U[o].cbs),d.add(s),t.matches&&d.forEach(v=>{v(t,u)})}),ce(()=>{l.forEach(u=>{const{cbs:o}=U[e[u]];o.has(s)&&o.delete(s)})}),D(()=>{const{value:u}=n;return l.filter(o=>u[o])})}const K=1,re=ve("n-grid"),oe=1,Ae={span:{type:[Number,String],default:oe},offset:{type:[Number,String],default:0},suffix:Boolean,privateOffset:Number,privateSpan:Number,privateColStart:Number,privateShow:{type:Boolean,default:!0}};var ie=C({__GRID_ITEM__:!0,name:"GridItem",alias:["Gi"],props:Ae,setup(){const{isSsrRef:e,xGapRef:n,itemStyleRef:l,overflowRef:s,layoutShiftDisabledRef:u}=fe(re),o=me();return{overflow:s,itemStyle:l,layoutShiftDisabled:u,mergedXGap:D(()=>T(n.value||0)),deriveStyle:()=>{e.value;const{privateSpan:t=oe,privateShow:d=!0,privateColStart:v=void 0,privateOffset:h=0}=o.vnode.props,{value:r}=n,f=T(r||0);return{display:d?"":"none",gridColumn:`${v!=null?v:`span ${t}`} / span ${t}`,marginLeft:h?`calc((100% - (${t} - 1) * ${f}) / ${t} * ${h} + ${f} * ${h})`:""}}}},render(){var e,n;if(this.layoutShiftDisabled){const{span:l,offset:s,mergedXGap:u}=this;return R("div",{style:{gridColumn:`span ${l} / span ${l}`,marginLeft:s?`calc((100% - (${l} - 1) * ${u}) / ${l} * ${s} + ${u} * ${s})`:""}},this.$slots)}return R("div",{style:[this.itemStyle,this.deriveStyle()]},(n=(e=this.$slots).default)===null||n===void 0?void 0:n.call(e,{overflow:this.overflow}))}});const Te={xs:0,s:640,m:1024,l:1280,xl:1536,xxl:1920},se=24,H="__ssr__",Pe={layoutShiftDisabled:Boolean,responsive:{type:[String,Boolean],default:"self"},cols:{type:[Number,String],default:se},itemResponsive:Boolean,collapsed:Boolean,collapsedRows:{type:Number,default:1},itemStyle:[Object,String],xGap:{type:[Number,String],default:0},yGap:{type:[Number,String],default:0}};var ae=C({name:"Grid",inheritAttrs:!1,props:Pe,setup(e){const{mergedClsPrefixRef:n,mergedBreakpointsRef:l}=ye(e),s=/^\d+$/,u=z(void 0),o=Ne((l==null?void 0:l.value)||Te),t=L(()=>!!(e.itemResponsive||!s.test(e.cols.toString())||!s.test(e.xGap.toString())||!s.test(e.yGap.toString()))),d=D(()=>{if(!!t.value)return e.responsive==="self"?u.value:o.value}),v=L(()=>{var x;return(x=Number(O(e.cols.toString(),d.value)))!==null&&x!==void 0?x:se}),h=L(()=>O(e.xGap.toString(),d.value)),r=L(()=>O(e.yGap.toString(),d.value)),f=x=>{u.value=x.contentRect.width},S=x=>{ke(f,x)},M=z(!1),I=D(()=>{if(e.responsive==="self")return S}),_=z(!1),j=z();return he(()=>{const{value:x}=j;x&&x.hasAttribute(H)&&(x.removeAttribute(H),_.value=!0)}),ge(re,{layoutShiftDisabledRef:Q(e,"layoutShiftDisabled"),isSsrRef:_,itemStyleRef:Q(e,"itemStyle"),xGapRef:h,overflowRef:M}),{isSsr:!we,contentEl:j,mergedClsPrefix:n,style:D(()=>e.layoutShiftDisabled?{width:"100%",display:"grid",gridTemplateColumns:`repeat(${e.cols}, minmax(0, 1fr))`,columnGap:T(e.xGap),rowGap:T(e.yGap)}:{width:"100%",display:"grid",gridTemplateColumns:`repeat(${v.value}, minmax(0, 1fr))`,columnGap:T(h.value),rowGap:T(r.value)}),isResponsive:t,responsiveQuery:d,responsiveCols:v,handleResize:I,overflow:M}},render(){if(this.layoutShiftDisabled)return R("div",W({ref:"contentEl",class:`${this.mergedClsPrefix}-grid`,style:this.style},this.$attrs),this.$slots);const e=()=>{var n,l,s,u,o,t,d;this.overflow=!1;const v=$e(xe(this)),h=[],{collapsed:r,collapsedRows:f,responsiveCols:S,responsiveQuery:M}=this;v.forEach(b=>{var G,F,B,N;if(((G=b==null?void 0:b.type)===null||G===void 0?void 0:G.__GRID_ITEM__)!==!0)return;if(De(b)){const A=Z(b);A.props?A.props.privateShow=!1:A.props={privateShow:!1},h.push({child:A,rawChildSpan:0});return}b.dirs=((F=b.dirs)===null||F===void 0?void 0:F.filter(({dir:A})=>A!==V))||null;const X=Z(b),Y=Number((N=O((B=X.props)===null||B===void 0?void 0:B.span,M))!==null&&N!==void 0?N:K);Y!==0&&h.push({child:X,rawChildSpan:Y})});let I=0;const _=(n=h[h.length-1])===null||n===void 0?void 0:n.child;if(_!=null&&_.props){const b=(l=_.props)===null||l===void 0?void 0:l.suffix;b!==void 0&&b!==!1&&(I=(u=(s=_.props)===null||s===void 0?void 0:s.span)!==null&&u!==void 0?u:K,_.props.privateSpan=I,_.props.privateColStart=S+1-I,_.props.privateShow=(o=_.props.privateShow)!==null&&o!==void 0?o:!0)}let j=0,x=!1;for(const{child:b,rawChildSpan:G}of h){if(x&&(this.overflow=!0),!x){const F=Number((d=O((t=b.props)===null||t===void 0?void 0:t.offset,M))!==null&&d!==void 0?d:0),B=Math.min(G+F,S);if(b.props?(b.props.privateSpan=B,b.props.privateOffset=F):b.props={privateSpan:B,privateOffset:F},r){const N=j%S;B+N>S&&(j+=S-N),B+j+I>f*S?x=!0:j+=B}}x&&(b.props?b.props.privateShow!==!0&&(b.props.privateShow=!1):b.props={privateShow:!1})}return R("div",W({ref:"contentEl",class:`${this.mergedClsPrefix}-grid`,style:this.style,[H]:this.isSsr||void 0},this.$attrs),h.map(({child:b})=>b))};return this.isResponsive&&this.responsive==="self"?R(be,{onResize:this.handleResize},{default:e}):e()}});const Ve={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},qe=E("path",{d:"M352 48H160a48 48 0 0 0-48 48v368l144-128l144 128V96a48 48 0 0 0-48-48z",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),Ge=[qe];var An=C({name:"BookmarkOutline",render:function(n,l){return a(),c("svg",Ve,Ge)}});const Oe={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},Ue=E("path",{d:"M408 64H104a56.16 56.16 0 0 0-56 56v192a56.16 56.16 0 0 0 56 56h40v80l93.72-78.14a8 8 0 0 1 5.13-1.86H408a56.16 56.16 0 0 0 56-56V120a56.16 56.16 0 0 0-56-56z",fill:"none",stroke:"currentColor","stroke-linejoin":"round","stroke-width":"32"},null,-1),Le=[Ue];var Tn=C({name:"ChatboxOutline",render:function(n,l){return a(),c("svg",Oe,Le)}});const He={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},Xe=E("path",{d:"M320 336h76c55 0 100-21.21 100-75.6s-53-73.47-96-75.6C391.11 99.74 329 48 256 48c-69 0-113.44 45.79-128 91.2c-60 5.7-112 35.88-112 98.4S70 336 136 336h56",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),Ye=E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M192 400.1l64 63.9l64-63.9"},null,-1),Qe=E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M256 224v224.03"},null,-1),We=[Xe,Ye,Qe];var Ze=C({name:"CloudDownloadOutline",render:function(n,l){return a(),c("svg",He,We)}});const Ke={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},Je=E("path",{d:"M352.92 80C288 80 256 144 256 144s-32-64-96.92-64c-52.76 0-94.54 44.14-95.08 96.81c-1.1 109.33 86.73 187.08 183 252.42a16 16 0 0 0 18 0c96.26-65.34 184.09-143.09 183-252.42c-.54-52.67-42.32-96.81-95.08-96.81z",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),en=[Je];var Pn=C({name:"HeartOutline",render:function(n,l){return a(),c("svg",Ke,en)}});const nn={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},tn=E("path",{d:"M208 352h-64a96 96 0 0 1 0-192h64",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"36"},null,-1),rn=E("path",{d:"M304 160h64a96 96 0 0 1 0 192h-64",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"36"},null,-1),on=E("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"36",d:"M163.29 256h187.42"},null,-1),sn=[tn,rn,on];var an=C({name:"LinkOutline",render:function(n,l){return a(),c("svg",nn,sn)}});const ln={class:"link-wrap"},un=["href"],dn={class:"link-txt"},pn=C({__name:"post-link",props:{links:{default:()=>[]}},setup(e){const n=e;return(l,s)=>{const u=ee;return a(),c("div",ln,[(a(!0),c(g,null,k(n.links,o=>(a(),c("div",{class:"link-item",key:o.id},[i(u,{class:"hash-link"},{default:p(()=>[i(m(an))]),_:1}),E("a",{href:o.content,class:"hash-link",target:"_blank",onClick:s[0]||(s[0]=$(()=>{},["stop"]))},[E("span",dn,q(o.content),1)],8,un)]))),128))])}}});var Vn=J(pn,[["__scopeId","data-v-4c9a59cc"]]),le=C({name:"BasicTheme",props:{uuid:{type:String,required:!0},src:{type:String,required:!0},autoplay:{type:Boolean,required:!0},loop:{type:Boolean,required:!0},controls:{type:Boolean,required:!0},hoverable:{type:Boolean,required:!0},mask:{type:Boolean,required:!0},colors:{type:[String,Array],required:!0},time:{type:Object,required:!0},playing:{type:Boolean,default:!1},duration:{type:[String,Number],required:!0}},data(){return{hovered:!1,volume:!1,amount:1}},computed:{colorFrom(){var e;return typeof this.colors=="string"?this.colors?this.colors:"#fbbf24":(e=this.colors)!==null&&e!==void 0&&e[0]?this.colors[0]:"#fbbf24"},colorTo(){var e;return typeof this.colors=="string"?this.colors?this.colors:"#fbbf24":(e=this.colors)!==null&&e!==void 0&&e[1]?this.colors[1]:"#ec4899"}},mounted(){this.$emit("setPlayer",this.$refs[this.uuid])},methods:{setVolume(){this.$refs[this.uuid].volume=this.amount},stopVolume(){return this.amount>0?this.amount=0:this.amount=1}}});const cn={class:"relative"},vn={class:"flex items-center justify-start w-full"},fn={class:"font-sans text-white text-xs w-24"},mn={class:"mr-3 ml-2"},yn={class:"relative"},hn={class:"px-3 py-2 rounded-lg flex items-center transform translate-x-2",style:{"background-color":"rgba(0, 0, 0, .8)"}},gn=i("img",{src:"https://en-zo.dev/vue-videoplayer/play.svg",alt:"Icon play video",class:"transform translate-x-0.5 w-12"},null,-1);function wn(e,n,l,s,u,o){return a(),y("div",{class:"shadow-xl rounded-xl overflow-hidden relative",onMouseenter:n[15]||(n[15]=t=>e.hovered=!0),onMouseleave:n[16]||(n[16]=t=>e.hovered=!1),onKeydown:n[17]||(n[17]=te(t=>e.$emit("play"),["left"]))},[i("div",cn,[i("video",{ref:e.uuid,class:"w-full",loop:e.loop,autoplay:e.autoplay,muted:e.autoplay,onTimeupdate:n[1]||(n[1]=t=>e.$emit("timeupdate",t.target)),onPause:n[2]||(n[2]=t=>e.$emit("isPlaying",!1)),onPlay:n[3]||(n[3]=t=>e.$emit("isPlaying",!0)),onClick:n[4]||(n[4]=t=>e.$emit("play"))},[i("source",{src:e.src,type:"video/mp4"},null,8,["src"])],40,["loop","autoplay","muted"]),e.controls?(a(),y("div",{key:0,class:[{"opacity-0 translate-y-full":!e.hoverable&&e.hovered,"opacity-0 translate-y-full":e.hoverable&&!e.hovered},"transition duration-300 transform absolute w-full bottom-0 left-0 flex items-center justify-between overlay px-5 pt-3 pb-5"]},[i("div",vn,[i("p",fn,q(e.time.display)+"/"+q(e.duration),1),i("div",mn,[P(i("img",{src:"https://en-zo.dev/vue-videoplayer/pause.svg",alt:"Icon pause video",class:"w-5 cursor-pointer",onClick:n[5]||(n[5]=t=>e.$emit("play"))},null,512),[[V,e.playing]]),P(i("img",{src:"https://en-zo.dev/vue-videoplayer/play.svg",alt:"Icon play video",class:"w-5 cursor-pointer",onClick:n[6]||(n[6]=t=>e.$emit("play"))},null,512),[[V,!e.playing]])]),i("div",{class:"w-full h-1 bg-white bg-opacity-60 rounded-sm cursor-pointer",onClick:n[7]||(n[7]=t=>e.$emit("position",t))},[i("div",{class:"relative h-full pointer-events-none",style:`width: ${e.time.progress}%; transition: width .2s ease-in-out;`},[i("div",{class:"w-full rounded-sm h-full gradient-variable bg-gradient-to-r pointer-events-none absolute top-0 left-0",style:`--tw-gradient-from: ${e.colorFrom};--tw-gradient-to: ${e.colorTo};transition: width .2s ease-in-out`},null,4),i("div",{class:"w-full rounded-sm filter blur-sm h-full gradient-variable bg-gradient-to-r pointer-events-none absolute top-0 left-0",style:`--tw-gradient-from: ${e.colorFrom};--tw-gradient-to: ${e.colorTo};transition: width .2s ease-in-out`},null,4)],4)])]),i("div",{class:"ml-5 flex items-center justify-end",onMouseleave:n[13]||(n[13]=t=>e.volume=!1)},[i("div",yn,[i("div",{class:`w-128 origin-left translate-x-2 -rotate-90 w-128 transition duration-200 absolute transform top-0 py-2 ${e.volume?"-translate-y-4":"opacity-0 -translate-y-1 pointer-events-none"}`},[i("div",hn,[P(i("input",{"onUpdate:modelValue":n[8]||(n[8]=t=>e.amount=t),type:"range",step:"0.05",min:"0",max:"1",class:"rounded-lg overflow-hidden appearance-none bg-white bg-opacity-30 h-1 w-128 vertical-range",onInput:n[9]||(n[9]=(...t)=>e.setVolume&&e.setVolume(...t))},null,544),[[ne,e.amount]])])],2),i("img",{src:`https://en-zo.dev/vue-videoplayer/volume-${Math.ceil(e.amount*2)}.svg`,alt:"High volume video",class:"w-5 cursor-pointer relative",style:{"z-index":"2"},onClick:n[10]||(n[10]=(...t)=>e.stopVolume&&e.stopVolume(...t)),onMouseenter:n[11]||(n[11]=t=>e.volume=!0)},null,40,["src"])]),i("img",{src:"https://en-zo.dev/vue-videoplayer/maximize.svg",alt:"Fullscreen",class:"w-3 ml-4 cursor-pointer",onClick:n[12]||(n[12]=t=>e.$emit("fullScreen"))})],32)],2)):w("",!0),!e.autoplay&&e.mask&&e.time.current===0?(a(),y("div",{key:1,class:`transition transform duration-300 absolute top-0 left-0 w-full h-full bg-black bg-opacity-50 backdrop-filter z-10 flex items-center justify-center ${e.playing?"opacity-0 pointer-events-none":""}`},[i("div",{class:"w-20 h-20 rounded-full bg-white bg-opacity-20 transition duration-200 hover:bg-opacity-40 flex items-center justify-center cursor-pointer",onClick:n[14]||(n[14]=t=>e.$emit("play"))},[gn])],2)):w("",!0)])],32)}le.render=wn;var ue=C({name:"BasicTheme",props:{uuid:{type:String,required:!0},src:{type:String,required:!0},autoplay:{type:Boolean,required:!0},loop:{type:Boolean,required:!0},controls:{type:Boolean,required:!0},hoverable:{type:Boolean,required:!0},mask:{type:Boolean,required:!0},colors:{type:[String,Array],required:!0},time:{type:Object,required:!0},playing:{type:Boolean,default:!1},duration:{type:[String,Number],required:!0}},data(){return{hovered:!1,volume:!1,amount:1}},computed:{color(){var e;return typeof this.colors=="string"?this.colors?this.colors:"#8B5CF6":(e=this.colors)!==null&&e!==void 0&&e[0]?this.colors[0]:"#8B5CF6"}},mounted(){this.$emit("setPlayer",this.$refs[this.uuid])},methods:{setVolume(){this.$refs[this.uuid].volume=this.amount},stopVolume(){return this.amount>0?this.amount=0:this.amount=1}}});const bn={class:"relative"},kn={class:"mr-5"},$n={class:"relative mr-6"},xn={class:"px-3 py-3 rounded-xl flex items-center transform translate-x-9 bg-black bg-opacity-30"},Sn=i("img",{src:"https://en-zo.dev/vue-videoplayer/play.svg",alt:"Icon play video",class:"transform translate-x-0.5 w-12"},null,-1);function Cn(e,n,l,s,u,o){return a(),y("div",{class:"shadow-xl rounded-3xl overflow-hidden relative",onMouseenter:n[14]||(n[14]=t=>e.hovered=!0),onMouseleave:n[15]||(n[15]=t=>e.hovered=!1),onKeydown:n[16]||(n[16]=te(t=>e.$emit("play"),["left"]))},[i("div",bn,[i("video",{ref:e.uuid,class:"w-full",loop:e.loop,autoplay:e.autoplay,muted:e.autoplay,onTimeupdate:n[1]||(n[1]=t=>e.$emit("timeupdate",t.target)),onPause:n[2]||(n[2]=t=>e.$emit("isPlaying",!1)),onPlay:n[3]||(n[3]=t=>e.$emit("isPlaying",!0)),onClick:n[4]||(n[4]=t=>e.$emit("play"))},[i("source",{src:e.src,type:"video/mp4"},null,8,["src"])],40,["loop","autoplay","muted"]),e.controls?(a(),y("div",{key:0,class:[{"opacity-0 translate-y-full":!e.hoverable&&e.hovered,"opacity-0 translate-y-full":e.hoverable&&!e.hovered},"absolute px-5 pb-5 bottom-0 left-0 w-full transition duration-300 transform"]},[i("div",{class:"w-full bg-black bg-opacity-30 px-5 py-4 rounded-xl flex items-center justify-between",onMouseleave:n[12]||(n[12]=t=>e.volume=!1)},[i("div",{class:"font-sans py-1 px-2 text-white rounded-md text-xs mr-5 whitespace-nowrap font-medium w-32 text-center",style:`font-size: 11px; background-color: ${e.color}`},q(e.time.display)+"\xA0/\xA0"+q(e.duration),5),i("div",kn,[P(i("img",{src:"https://en-zo.dev/vue-videoplayer/basic/pause.svg",alt:"Icon pause video",class:"w-4 cursor-pointer filter-white transition duration-300",onClick:n[5]||(n[5]=t=>e.$emit("play"))},null,512),[[V,e.playing]]),P(i("img",{src:"https://en-zo.dev/vue-videoplayer/basic/play.svg",alt:"Icon play video",class:"w-4 cursor-pointer filter-white transition duration-300",onClick:n[6]||(n[6]=t=>e.$emit("play"))},null,512),[[V,!e.playing]])]),i("div",{class:"w-full h-1 bg-white bg-opacity-40 rounded-sm cursor-pointer mr-6",onClick:n[7]||(n[7]=t=>e.$emit("position",t))},[i("div",{class:"w-full rounded-sm h-full bg-white pointer-events-none",style:`width: ${e.time.progress}%; transition: width .2s ease-in-out;`},null,4)]),i("div",$n,[i("div",{class:`w-128 origin-left translate-x-2 -rotate-90 w-128 transition duration-200 absolute transform top-0 py-2 ${e.volume?"-translate-y-4":"opacity-0 -translate-y-1 pointer-events-none"}`},[i("div",xn,[P(i("input",{"onUpdate:modelValue":n[8]||(n[8]=t=>e.amount=t),type:"range",step:"0.05",min:"0",max:"1",class:"rounded-lg overflow-hidden appearance-none bg-white bg-opacity-30 h-1.5 w-128 vertical-range"},null,512),[[ne,e.amount]])])],2),i("img",{src:`https://en-zo.dev/vue-videoplayer/basic/volume_${Math.ceil(e.amount*2)}.svg`,alt:"High volume video",class:"w-5 cursor-pointer filter-white transition duration-300 relative",style:{"z-index":"2"},onClick:n[9]||(n[9]=(...t)=>e.stopVolume&&e.stopVolume(...t)),onMouseenter:n[10]||(n[10]=t=>e.volume=!0)},null,40,["src"])]),i("img",{src:"https://en-zo.dev/vue-videoplayer/basic/fullscreen.svg",alt:"Fullscreen",class:"w-4 cursor-pointer filter-white transition duration-300",onClick:n[11]||(n[11]=t=>e.$emit("fullScreen"))})],32)],2)):w("",!0),!e.autoplay&&e.mask&&e.time.current===0?(a(),y("div",{key:1,class:`transition transform duration-300 absolute top-0 left-0 w-full h-full bg-black bg-opacity-50 backdrop-filter z-10 flex items-center justify-center ${e.playing?"opacity-0 pointer-events-none":""}`},[i("div",{class:"w-20 h-20 rounded-full bg-white bg-opacity-20 transition duration-200 hover:bg-opacity-40 flex items-center justify-center cursor-pointer",onClick:n[13]||(n[13]=t=>e.$emit("play"))},[Sn])],2)):w("",!0)])],32)}ue.render=Cn;var de=C({name:"Vue3PlayerVideo",components:{basic:ue,gradient:le},props:{src:{type:String,required:!0},autoplay:{type:Boolean,default:!1},loop:{type:Boolean,default:!1},controls:{type:Boolean,default:!0},mask:{type:Boolean,default:!0},colors:{type:[String,Array],default(){return["#8B5CF6","#ec4899"]}},hoverable:{type:Boolean,default:!1},theme:{type:String,default:"basic"}},data(){return{uuid:Math.random().toString(36).substr(2,18),player:null,duration:0,playing:!1,time:{progress:0,display:0,current:0}}},watch:{"time.current"(e){this.time.display=this.format(Number(e)),this.time.progress=e*100/this.player.duration}},methods:{isPlaying(e){this.playing=e},play(){return this.playing?this.player.pause():this.player.play()},setPlayer(e){this.player=e,this.player.addEventListener("loadeddata",()=>{this.player.readyState>=3&&(this.duration=this.format(Number(this.player.duration)),this.time.display=this.format(0))})},stop(){this.player.pause(),this.player.currentTime=0},fullScreen(){this.player.webkitEnterFullscreen()},position(e){this.player.pause();const n=e.target.getBoundingClientRect(),s=(e.clientX-n.left)*100/e.target.offsetWidth;this.player.currentTime=s*this.player.duration/100,this.player.play()},format(e){const n=Math.floor(e/3600),l=Math.floor(e%3600/60),s=Math.round(e%60);return[n,l>9?l:n?"0"+l:l||"00",s>9?s:"0"+s].filter(Boolean).join(":")}}});const _n={class:"vue3-player-video"};function En(e,n,l,s,u,o){return a(),y("div",_n,[(a(),y(Se(e.theme),{uuid:e.uuid,src:e.src,autoplay:e.autoplay,loop:e.loop,controls:e.controls,mask:e.mask,colors:e.colors,time:e.time,playing:e.playing,duration:e.duration,hoverable:e.hoverable,onPlay:e.play,onStop:e.stop,onTimeupdate:n[1]||(n[1]=({currentTime:t})=>e.time.current=t),onPosition:e.position,onFullScreen:e.fullScreen,onSetPlayer:e.setPlayer,onIsPlaying:e.isPlaying},null,8,["uuid","src","autoplay","loop","controls","mask","colors","time","playing","duration","hoverable","onPlay","onStop","onPosition","onFullScreen","onSetPlayer","onIsPlaying"]))])}function Bn(e,n){n===void 0&&(n={});var l=n.insertAt;if(!(!e||typeof document=="undefined")){var s=document.head||document.getElementsByTagName("head")[0],u=document.createElement("style");u.type="text/css",l==="top"&&s.firstChild?s.insertBefore(u,s.firstChild):s.appendChild(u),u.styleSheet?u.styleSheet.cssText=e:u.appendChild(document.createTextNode(e))}}var Rn=`/*! tailwindcss v2.1.2 | MIT License | https://tailwindcss.com */ + +/*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */ + +/* +Document +======== +*/ + +/** +Use a better box model (opinionated). +*/ + +*, +::before, +::after { + box-sizing: border-box; +} + +/** +Use a more readable tab size (opinionated). +*/ + +/** +1. Correct the line height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +*/ + +/* +Sections +======== +*/ + +/** +Remove the margin in all browsers. +*/ + +/** +Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) +*/ + +/* +Grouping content +================ +*/ + +/** +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +*/ + +/* +Text-level semantics +==================== +*/ + +/** +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +/** +Add the correct font weight in Edge and Safari. +*/ + +/** +1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) +2. Correct the odd 'em' font sizing in all browsers. +*/ + +/** +Add the correct font size in all browsers. +*/ + +/** +Prevent 'sub' and 'sup' elements from affecting the line height in all browsers. +*/ + +/* +Tabular data +============ +*/ + +/** +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +*/ + +/* +Forms +===== +*/ + +/** +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +*/ + + +input { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** +Remove the inheritance of text transform in Edge and Firefox. +1. Remove the inheritance of text transform in Firefox. +*/ + +/** +Correct the inability to style clickable types in iOS and Safari. +*/ + + +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; +} + +/** +Remove the inner border and padding in Firefox. +*/ + +::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** +Restore the focus styles unset by the previous rule. +*/ + +:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** +Remove the additional ':invalid' styles in Firefox. +See: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737 +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/** +Remove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers. +*/ + +/** +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/** +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/** +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to 'inherit' in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* +Interactive +=========== +*/ + +/* +Add the correct display in Chrome and Safari. +*/ + +/** + * Manually forked from SUIT CSS Base: https://github.com/suitcss/base + * A thin layer on top of normalize.css that provides a starting point more + * suitable for web applications. + */ + +/** + * Removes the default spacing and border for appropriate elements. + */ + + +p { + margin: 0; +} + +/** + * Work around a Firefox/IE bug where the transparent \`button\` background + * results in a loss of the default \`button\` focus styles. + */ + +/** + * Tailwind custom reset styles + */ + +/** + * 1. Use the user's configured \`sans\` font-family (with Tailwind's default + * sans-serif font stack as a fallback) as a sane default. + * 2. Use Tailwind's default "normal" line-height so the user isn't forced + * to override it to ensure consistency even when using the default theme. + */ + +/** + * Inherit font-family and line-height from \`html\` so users can set them as + * a class directly on the \`html\` element. + */ + +/** + * 1. Prevent padding and border from affecting element width. + * + * We used to set this in the html element and inherit from + * the parent element for everything else. This caused issues + * in shadow-dom-enhanced elements like
where the content + * is wrapped by a div with box-sizing set to \`content-box\`. + * + * https://github.com/mozdevs/cssremedy/issues/4 + * + * + * 2. Allow adding a border to an element by just adding a border-width. + * + * By default, the way the browser specifies that an element should have no + * border is by setting it's border-style to \`none\` in the user-agent + * stylesheet. + * + * In order to easily add borders to elements by just setting the \`border-width\` + * property, we change the default border-style for all elements to \`solid\`, and + * use border-width to hide them instead. This way our \`border\` utilities only + * need to set the \`border-width\` property instead of the entire \`border\` + * shorthand, making our border utilities much more straightforward to compose. + * + * https://github.com/tailwindcss/tailwindcss/pull/116 + */ + +*, +::before, +::after { + box-sizing: border-box; /* 1 */ + border-width: 0; /* 2 */ + border-style: solid; /* 2 */ + border-color: #e5e7eb; /* 2 */ +} + +/* + * Ensure horizontal rules are visible by default + */ + +/** + * Undo the \`border-style: none\` reset that Normalize applies to images so that + * our \`border-{width}\` utilities have the expected effect. + * + * The Normalize reset is unnecessary for us since we default the border-width + * to 0 on all elements. + * + * https://github.com/tailwindcss/tailwindcss/issues/362 + */ + +img { + border-style: solid; +} + +input:-ms-input-placeholder { + opacity: 1; + color: #9ca3af; +} + +input::placeholder { + opacity: 1; + color: #9ca3af; +} + + +[role="button"] { + cursor: pointer; +} + +/** + * Reset links to optimize for opt-in styling instead of + * opt-out. + */ + +/** + * Reset form element properties that are easy to forget to + * style explicitly so you don't inadvertently introduce + * styles that deviate from your design system. These styles + * supplement a partial reset that is already applied by + * normalize.css. + */ + + +input { + padding: 0; + line-height: inherit; + color: inherit; +} + +/** + * Use the configured 'mono' font family for elements that + * are expected to be rendered with a monospace font, falling + * back to the system monospace stack if there is no configured + * 'mono' font family. + */ + +/** + * Make replaced elements \`display: block\` by default as that's + * the behavior you want almost all of the time. Inspired by + * CSS Remedy, with \`svg\` added as well. + * + * https://github.com/mozdevs/cssremedy/issues/14 + */ + +img, +svg, +video { + display: block; + vertical-align: middle; +} + +/** + * Constrain images and videos to the parent width and preserve + * their intrinsic aspect ratio. + * + * https://github.com/mozdevs/cssremedy/issues/14 + */ + +img, +video { + max-width: 100%; + height: auto; +} + +.vue3-player-video .appearance-none{ + -webkit-appearance: none; + appearance: none; +} + +.vue3-player-video .bg-black{ + --tw-bg-opacity: 1; + background-color: rgba(0, 0, 0, var(--tw-bg-opacity)); +} + +.vue3-player-video .bg-white{ + --tw-bg-opacity: 1; + background-color: rgba(255, 255, 255, var(--tw-bg-opacity)); +} + +.vue3-player-video .bg-gradient-to-r{ + background-image: linear-gradient(to right, var(--tw-gradient-stops)); +} + +.vue3-player-video .bg-opacity-20{ + --tw-bg-opacity: 0.2; +} + +.vue3-player-video .bg-opacity-30{ + --tw-bg-opacity: 0.3; +} + +.vue3-player-video .bg-opacity-40{ + --tw-bg-opacity: 0.4; +} + +.vue3-player-video .bg-opacity-50{ + --tw-bg-opacity: 0.5; +} + +.vue3-player-video .bg-opacity-60{ + --tw-bg-opacity: 0.6; +} + +.vue3-player-video .hover\\:bg-opacity-40:hover{ + --tw-bg-opacity: 0.4; +} + +.vue3-player-video .rounded-sm{ + border-radius: 0.125rem; +} + +.vue3-player-video .rounded-md{ + border-radius: 0.375rem; +} + +.vue3-player-video .rounded-lg{ + border-radius: 0.5rem; +} + +.vue3-player-video .rounded-xl{ + border-radius: 0.75rem; +} + +.vue3-player-video .rounded-3xl{ + border-radius: 1.5rem; +} + +.vue3-player-video .rounded-full{ + border-radius: 9999px; +} + +.vue3-player-video .cursor-pointer{ + cursor: pointer; +} + +.vue3-player-video .flex{ + display: flex; +} + +.vue3-player-video .items-center{ + align-items: center; +} + +.vue3-player-video .justify-start{ + justify-content: flex-start; +} + +.vue3-player-video .justify-end{ + justify-content: flex-end; +} + +.vue3-player-video .justify-center{ + justify-content: center; +} + +.vue3-player-video .justify-between{ + justify-content: space-between; +} + +.vue3-player-video .font-sans{ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; +} + +.vue3-player-video .font-medium{ + font-weight: 500; +} + +.vue3-player-video .h-1{ + height: 0.25rem; +} + +.vue3-player-video .h-20{ + height: 5rem; +} + +.vue3-player-video .h-full{ + height: 100%; +} + +.vue3-player-video .text-xs{ + font-size: 0.75rem; + line-height: 1rem; +} + +.vue3-player-video .ml-2{ + margin-left: 0.5rem; +} + +.vue3-player-video .mr-3{ + margin-right: 0.75rem; +} + +.vue3-player-video .ml-4{ + margin-left: 1rem; +} + +.vue3-player-video .mr-5{ + margin-right: 1.25rem; +} + +.vue3-player-video .ml-5{ + margin-left: 1.25rem; +} + +.vue3-player-video .mr-6{ + margin-right: 1.5rem; +} + +.vue3-player-video .opacity-0{ + opacity: 0; +} + +.vue3-player-video .overflow-hidden{ + overflow: hidden; +} + +.vue3-player-video .py-1{ + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.vue3-player-video .py-2{ + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.vue3-player-video .px-2{ + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.vue3-player-video .py-3{ + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.vue3-player-video .px-3{ + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.vue3-player-video .py-4{ + padding-top: 1rem; + padding-bottom: 1rem; +} + +.vue3-player-video .px-5{ + padding-left: 1.25rem; + padding-right: 1.25rem; +} + +.vue3-player-video .pt-3{ + padding-top: 0.75rem; +} + +.vue3-player-video .pb-5{ + padding-bottom: 1.25rem; +} + +.vue3-player-video .pointer-events-none{ + pointer-events: none; +} + +.vue3-player-video .absolute{ + position: absolute; +} + +.vue3-player-video .relative{ + position: relative; +} + +.vue3-player-video .top-0{ + top: 0px; +} + +.vue3-player-video .bottom-0{ + bottom: 0px; +} + +.vue3-player-video .left-0{ + left: 0px; +} + +*{ + --tw-shadow: 0 0 #0000; +} + +.vue3-player-video .shadow-xl{ + --tw-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +*{ + --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgba(59, 130, 246, 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; +} + +.vue3-player-video .text-center{ + text-align: center; +} + +.vue3-player-video .text-white{ + --tw-text-opacity: 1; + color: rgba(255, 255, 255, var(--tw-text-opacity)); +} + +.vue3-player-video .whitespace-nowrap{ + white-space: nowrap; +} + +.vue3-player-video .w-3{ + width: 0.75rem; +} + +.vue3-player-video .w-4{ + width: 1rem; +} + +.vue3-player-video .w-5{ + width: 1.25rem; +} + +.vue3-player-video .w-12{ + width: 3rem; +} + +.vue3-player-video .w-20{ + width: 5rem; +} + +.vue3-player-video .w-24{ + width: 6rem; +} + +.vue3-player-video .w-32{ + width: 8rem; +} + +.vue3-player-video .w-full{ + width: 100%; +} + +.vue3-player-video .z-10{ + z-index: 10; +} + +.vue3-player-video .transform{ + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + transform: translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.vue3-player-video .origin-left{ + transform-origin: left; +} + +.vue3-player-video .-rotate-90{ + --tw-rotate: -90deg; +} + +.vue3-player-video .translate-x-0{ + --tw-translate-x: 0px; +} + +.vue3-player-video .translate-x-2{ + --tw-translate-x: 0.5rem; +} + +.vue3-player-video .translate-x-9{ + --tw-translate-x: 2.25rem; +} + +.vue3-player-video .-translate-y-1{ + --tw-translate-y: -0.25rem; +} + +.vue3-player-video .-translate-y-4{ + --tw-translate-y: -1rem; +} + +.vue3-player-video .translate-y-full{ + --tw-translate-y: 100%; +} + +.vue3-player-video .transition{ + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.vue3-player-video .ease-in-out{ + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + +.vue3-player-video .duration-200{ + transition-duration: 200ms; +} + +.vue3-player-video .duration-300{ + transition-duration: 300ms; +} + +@keyframes spin{ + to{ + transform: rotate(360deg); + } +} + +@keyframes ping{ + 75%, 100%{ + transform: scale(2); + opacity: 0; + } +} + +@keyframes pulse{ + 50%{ + opacity: .5; + } +} + +@keyframes bounce{ + 0%, 100%{ + transform: translateY(-25%); + animation-timing-function: cubic-bezier(0.8,0,1,1); + } + + 50%{ + transform: none; + animation-timing-function: cubic-bezier(0,0,0.2,1); + } +} + +.vue3-player-video .filter{ + --tw-blur: var(--tw-empty,/*!*/ /*!*/); + --tw-brightness: var(--tw-empty,/*!*/ /*!*/); + --tw-contrast: var(--tw-empty,/*!*/ /*!*/); + --tw-grayscale: var(--tw-empty,/*!*/ /*!*/); + --tw-hue-rotate: var(--tw-empty,/*!*/ /*!*/); + --tw-invert: var(--tw-empty,/*!*/ /*!*/); + --tw-saturate: var(--tw-empty,/*!*/ /*!*/); + --tw-sepia: var(--tw-empty,/*!*/ /*!*/); + --tw-drop-shadow: var(--tw-empty,/*!*/ /*!*/); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.vue3-player-video .blur-sm{ + --tw-blur: blur(4px); +} + +.vue3-player-video .blur{ + --tw-blur: blur(8px); +} + +.vue3-player-video .backdrop-filter{ + --tw-backdrop-blur: var(--tw-empty,/*!*/ /*!*/); + --tw-backdrop-brightness: var(--tw-empty,/*!*/ /*!*/); + --tw-backdrop-contrast: var(--tw-empty,/*!*/ /*!*/); + --tw-backdrop-grayscale: var(--tw-empty,/*!*/ /*!*/); + --tw-backdrop-hue-rotate: var(--tw-empty,/*!*/ /*!*/); + --tw-backdrop-invert: var(--tw-empty,/*!*/ /*!*/); + --tw-backdrop-opacity: var(--tw-empty,/*!*/ /*!*/); + --tw-backdrop-saturate: var(--tw-empty,/*!*/ /*!*/); + --tw-backdrop-sepia: var(--tw-empty,/*!*/ /*!*/); + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.overlay { + background: linear-gradient(0deg, rgba(0,0,0,0.41961), transparent) +} + +.vertical-range::-webkit-slider-thumb { + width: 6px; + -webkit-appearance: none; + appearance: none; + height: 6px; + background-color: white; + cursor: ns-resize; + box-shadow: -405px 0 0 400px rgba(255, 255, 255, .6); + border-radius: 50%; +} + +.backdrop-filter { + -webkit-backdrop-filter: blur(15px) !important; + backdrop-filter: blur(15px) !important; +} + +.filter-white:hover { + filter: brightness(2); +} + +.gradient-variable { + --tw-gradient-from: #fbbf24; + --tw-gradient-to: #ec4899; + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, rgba(251, 191, 36, 0)) +} + +`;Bn(Rn);de.render=En;var zn=(()=>{const e=de;return e.install=n=>{n.component("Vue3PlayerVideo",e)},e})(),jn=zn;const Fn={key:0},qn=C({__name:"post-video",props:{videos:{default:()=>[]},full:{type:Boolean,default:!1}},setup(e){const n=e;return(l,s)=>{const u=ie,o=ae;return n.videos.length>0?(a(),c("div",Fn,[i(o,{"x-gap":4,"y-gap":4,cols:e.full?1:5},{default:p(()=>[i(u,{span:e.full?1:3},{default:p(()=>[(a(!0),c(g,null,k(n.videos,t=>(a(),y(m(jn),{onClick:s[0]||(s[0]=$(()=>{},["stop"])),key:t.id,src:t.content,colors:["#18a058","#2aca75"],hoverable:!0,theme:"gradient"},null,8,["src"]))),128))]),_:1},8,["span"])]),_:1},8,["cols"])])):w("",!0)}}});const Dn={class:"images-wrap"},Gn=C({__name:"post-image",props:{imgs:{default:()=>[]}},setup(e){const n=e,l="https://paopao-assets.oss-cn-shanghai.aliyuncs.com/public/404.png",s="?x-oss-process=image/resize,m_fill,w_300,h_300,limit_0/auto-orient,1/format,png";return(u,o)=>{const t=Ce,d=ie,v=ae,h=_e;return a(),c("div",Dn,[[1].includes(n.imgs.length)?(a(),y(h,{key:0},{default:p(()=>[i(v,{"x-gap":4,"y-gap":4,cols:2},{default:p(()=>[(a(!0),c(g,null,k(n.imgs,r=>(a(),y(d,{key:r.id},{default:p(()=>[i(t,{onError:()=>r.content=m(l),onClick:o[0]||(o[0]=$(()=>{},["stop"])),class:"post-img x1","object-fit":"cover",src:r.content+m(s),"preview-src":r.content},null,8,["onError","src","preview-src"])]),_:2},1024))),128))]),_:1})]),_:1})):w("",!0),[2,3].includes(n.imgs.length)?(a(),y(h,{key:1},{default:p(()=>[i(v,{"x-gap":4,"y-gap":4,cols:3},{default:p(()=>[(a(!0),c(g,null,k(n.imgs,r=>(a(),y(d,{key:r.id},{default:p(()=>[i(t,{onError:()=>r.content=m(l),onClick:o[1]||(o[1]=$(()=>{},["stop"])),class:"post-img x2","object-fit":"cover",src:r.content+m(s),"preview-src":r.content},null,8,["onError","src","preview-src"])]),_:2},1024))),128))]),_:1})]),_:1})):w("",!0),[4].includes(n.imgs.length)?(a(),y(h,{key:2},{default:p(()=>[i(v,{"x-gap":4,"y-gap":4,cols:4},{default:p(()=>[(a(!0),c(g,null,k(n.imgs,r=>(a(),y(d,{key:r.id},{default:p(()=>[i(t,{onError:()=>r.content=m(l),onClick:o[2]||(o[2]=$(()=>{},["stop"])),class:"post-img x3","object-fit":"cover",src:r.content+m(s),"preview-src":r.content},null,8,["onError","src","preview-src"])]),_:2},1024))),128))]),_:1})]),_:1})):w("",!0),[5].includes(n.imgs.length)?(a(),y(h,{key:3},{default:p(()=>[i(v,{"x-gap":4,"y-gap":4,cols:3},{default:p(()=>[(a(!0),c(g,null,k(n.imgs,(r,f)=>(a(),c(g,{key:r.id},[f<3?(a(),y(d,{key:0},{default:p(()=>[i(t,{onError:()=>r.content=m(l),onClick:o[3]||(o[3]=$(()=>{},["stop"])),class:"post-img x2","object-fit":"cover",src:r.content+m(s),"preview-src":r.content},null,8,["onError","src","preview-src"])]),_:2},1024)):w("",!0)],64))),128))]),_:1}),i(v,{"x-gap":4,"y-gap":4,cols:2,style:{"margin-top":"4px"}},{default:p(()=>[(a(!0),c(g,null,k(n.imgs,(r,f)=>(a(),c(g,{key:r.id},[f>=3?(a(),y(d,{key:0},{default:p(()=>[i(t,{onError:()=>r.content=m(l),onClick:o[4]||(o[4]=$(()=>{},["stop"])),class:"post-img x1","object-fit":"cover",src:r.content+m(s),"preview-src":r.content},null,8,["onError","src","preview-src"])]),_:2},1024)):w("",!0)],64))),128))]),_:1})]),_:1})):w("",!0),[6].includes(n.imgs.length)?(a(),y(h,{key:4},{default:p(()=>[i(v,{"x-gap":4,"y-gap":4,cols:3},{default:p(()=>[(a(!0),c(g,null,k(n.imgs,(r,f)=>(a(),c(g,{key:r.id},[f<3?(a(),y(d,{key:0},{default:p(()=>[i(t,{onError:()=>r.content=m(l),onClick:o[5]||(o[5]=$(()=>{},["stop"])),class:"post-img x2","object-fit":"cover",src:r.content+m(s),"preview-src":r.content},null,8,["onError","src","preview-src"])]),_:2},1024)):w("",!0)],64))),128))]),_:1}),i(v,{"x-gap":4,"y-gap":4,cols:3,style:{"margin-top":"4px"}},{default:p(()=>[(a(!0),c(g,null,k(n.imgs,(r,f)=>(a(),c(g,{key:r.id},[f>=3?(a(),y(d,{key:0},{default:p(()=>[i(t,{onError:()=>r.content=m(l),onClick:o[6]||(o[6]=$(()=>{},["stop"])),class:"post-img x2","object-fit":"cover",src:r.content+m(s),"preview-src":r.content},null,8,["onError","src","preview-src"])]),_:2},1024)):w("",!0)],64))),128))]),_:1})]),_:1})):w("",!0),n.imgs.length===7?(a(),y(h,{key:5},{default:p(()=>[i(v,{"x-gap":4,"y-gap":4,cols:4},{default:p(()=>[(a(!0),c(g,null,k(n.imgs,(r,f)=>(a(),c(g,null,[f<4?(a(),y(d,{key:r.id},{default:p(()=>[i(t,{onError:()=>r.content=m(l),onClick:o[7]||(o[7]=$(()=>{},["stop"])),class:"post-img x3","object-fit":"cover",src:r.content+m(s),"preview-src":r.content},null,8,["onError","src","preview-src"])]),_:2},1024)):w("",!0)],64))),256))]),_:1}),i(v,{"x-gap":4,"y-gap":4,cols:3,style:{"margin-top":"4px"}},{default:p(()=>[(a(!0),c(g,null,k(n.imgs,(r,f)=>(a(),c(g,null,[f>=4?(a(),y(d,{key:r.id},{default:p(()=>[i(t,{onError:()=>r.content=m(l),onClick:o[8]||(o[8]=$(()=>{},["stop"])),class:"post-img x2","object-fit":"cover",src:r.content+m(s),"preview-src":r.content},null,8,["onError","src","preview-src"])]),_:2},1024)):w("",!0)],64))),256))]),_:1})]),_:1})):w("",!0),n.imgs.length===8?(a(),y(h,{key:6},{default:p(()=>[i(v,{"x-gap":4,"y-gap":4,cols:4},{default:p(()=>[(a(!0),c(g,null,k(n.imgs,(r,f)=>(a(),c(g,null,[f<4?(a(),y(d,{key:r.id},{default:p(()=>[i(t,{onError:()=>r.content=m(l),onClick:o[9]||(o[9]=$(()=>{},["stop"])),class:"post-img x3","object-fit":"cover",src:r.content+m(s),"preview-src":r.content},null,8,["onError","src","preview-src"])]),_:2},1024)):w("",!0)],64))),256))]),_:1}),i(v,{"x-gap":4,"y-gap":4,cols:4,style:{"margin-top":"4px"}},{default:p(()=>[(a(!0),c(g,null,k(n.imgs,(r,f)=>(a(),c(g,null,[f>=4?(a(),y(d,{key:r.id},{default:p(()=>[i(t,{onError:()=>r.content=m(l),onClick:o[10]||(o[10]=$(()=>{},["stop"])),class:"post-img x3","object-fit":"cover",src:r.content+m(s),"preview-src":r.content},null,8,["onError","src","preview-src"])]),_:2},1024)):w("",!0)],64))),256))]),_:1})]),_:1})):w("",!0),n.imgs.length===9?(a(),y(h,{key:7},{default:p(()=>[i(v,{"x-gap":4,"y-gap":4,cols:3},{default:p(()=>[(a(!0),c(g,null,k(n.imgs,(r,f)=>(a(),c(g,null,[f<3?(a(),y(d,{key:r.id},{default:p(()=>[i(t,{onError:()=>r.content=m(l),onClick:o[11]||(o[11]=$(()=>{},["stop"])),class:"post-img x2","object-fit":"cover",src:r.content+m(s),"preview-src":r.content},null,8,["onError","src","preview-src"])]),_:2},1024)):w("",!0)],64))),256))]),_:1}),i(v,{"x-gap":4,"y-gap":4,cols:3,style:{"margin-top":"4px"}},{default:p(()=>[(a(!0),c(g,null,k(n.imgs,(r,f)=>(a(),c(g,null,[f>=3&&f<6?(a(),y(d,{key:r.id},{default:p(()=>[i(t,{onError:()=>r.content=m(l),onClick:o[12]||(o[12]=$(()=>{},["stop"])),class:"post-img x2","object-fit":"cover",src:r.content+m(s),"preview-src":r.content},null,8,["onError","src","preview-src"])]),_:2},1024)):w("",!0)],64))),256))]),_:1}),i(v,{"x-gap":4,"y-gap":4,cols:3,style:{"margin-top":"4px"}},{default:p(()=>[(a(!0),c(g,null,k(n.imgs,(r,f)=>(a(),c(g,null,[f>=6?(a(),y(d,{key:r.id},{default:p(()=>[i(t,{onError:()=>r.content=m(l),onClick:o[13]||(o[13]=$(()=>{},["stop"])),class:"post-img x2","object-fit":"cover",src:r.content+m(s),"preview-src":r.content},null,8,["onError","src","preview-src"])]),_:2},1024)):w("",!0)],64))),256))]),_:1})]),_:1})):w("",!0)])}}});const Mn={class:"attachment-wrap"},In=C({__name:"post-attachment",props:{attachments:{default:()=>[]},price:{default:0}},setup(e){const n=e,l=z(!1),s=z(""),u=z(0),o=d=>{l.value=!0,u.value=d.id,s.value="\u8FD9\u662F\u4E00\u4E2A\u514D\u8D39\u9644\u4EF6\uFF0C\u60A8\u53EF\u4EE5\u76F4\u63A5\u4E0B\u8F7D\uFF1F",d.type===8&&(s.value=()=>R("div",{},[R("p",{},"\u8FD9\u662F\u4E00\u4E2A\u6536\u8D39\u9644\u4EF6\uFF0C\u4E0B\u8F7D\u5C06\u6536\u53D6"+(n.price/100).toFixed(2)+"\u5143")]),Be({id:u.value}).then(v=>{v.paid&&(s.value=()=>R("div",{},[R("p",{},"\u6B64\u6B21\u4E0B\u8F7D\u60A8\u5DF2\u652F\u4ED8\u6216\u65E0\u9700\u4ED8\u8D39\uFF0C\u8BF7\u786E\u8BA4\u4E0B\u8F7D")]))}).catch(v=>{l.value=!1}))},t=()=>{Re({id:u.value}).then(d=>{window.open(d.signed_url.replace("http://","https://"),"_blank")}).catch(d=>{console.log(d)})};return(d,v)=>{const h=ee,r=ze,f=je;return a(),c("div",Mn,[(a(!0),c(g,null,k(e.attachments,S=>(a(),c("div",{class:"attach-item",key:S.id},[i(r,{onClick:$(M=>o(S),["stop"]),type:"primary",size:"tiny",dashed:""},{icon:p(()=>[i(h,null,{default:p(()=>[i(m(Ze))]),_:1})]),default:p(()=>[Ee(" "+q(S.type===8?"\u6536\u8D39":"\u514D\u8D39")+"\u9644\u4EF6 ",1)]),_:2},1032,["onClick"])]))),128)),i(f,{show:l.value,"onUpdate:show":v[0]||(v[0]=S=>l.value=S),"mask-closable":!1,preset:"dialog",title:"\u4E0B\u8F7D\u63D0\u793A",content:s.value,"positive-text":"\u786E\u8BA4\u4E0B\u8F7D","negative-text":"\u53D6\u6D88","icon-placement":"top",onPositiveClick:t},null,8,["show","content"])])}}});var On=J(In,[["__scopeId","data-v-ca444ed2"]]);const Un=e=>{const n=[],l=[];var s=/(#|#)([^#@])+?\s+?/g,u=/@([a-zA-Z0-9])+?\s+?/g;return e=e.replace(/<[^>]*?>/gi,"").replace(/(.*?)<\/[^>]*?>/gi,"").replace(s,o=>(n.push(o.substr(1).trim()),''+o.trim()+" ")).replace(u,o=>(l.push(o.substr(1).trim()),''+o.trim()+" ")),{content:e,tags:n,users:l}};export{An as B,Tn as C,Pn as H,On as _,Gn as a,qn as b,Vn as c,Un as p}; diff --git a/web/dist/assets/formatTime.e07969bb.js b/web/dist/assets/formatTime.e07969bb.js new file mode 100644 index 00000000..5e330c25 --- /dev/null +++ b/web/dist/assets/formatTime.e07969bb.js @@ -0,0 +1,11 @@ +//! moment.js +//! version : 2.29.4 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +var Wt;function l(){return Wt.apply(null,arguments)}function Ds(e){Wt=e}function I(e){return e instanceof Array||Object.prototype.toString.call(e)==="[object Array]"}function ae(e){return e!=null&&Object.prototype.toString.call(e)==="[object Object]"}function y(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function nt(e){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(e).length===0;var t;for(t in e)if(y(e,t))return!1;return!0}function b(e){return e===void 0}function q(e){return typeof e=="number"||Object.prototype.toString.call(e)==="[object Number]"}function De(e){return e instanceof Date||Object.prototype.toString.call(e)==="[object Date]"}function Nt(e,t){var s=[],r,a=e.length;for(r=0;r>>0,r;for(r=0;r0)for(s=0;s=0;return(n?s?"+":"":"-")+Math.pow(10,Math.max(0,a)).toString().substr(1)+r}var ut=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,pe=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,qe={},ue={};function h(e,t,s,r){var a=r;typeof r=="string"&&(a=function(){return this[r]()}),e&&(ue[e]=a),t&&(ue[t[0]]=function(){return E(a.apply(this,arguments),t[1],t[2])}),s&&(ue[s]=function(){return this.localeData().ordinal(a.apply(this,arguments),e)})}function Os(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function Ts(e){var t=e.match(ut),s,r;for(s=0,r=t.length;s=0&&pe.test(e);)e=e.replace(pe,r),pe.lastIndex=0,s-=1;return e}var xs={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function bs(e){var t=this._longDateFormat[e],s=this._longDateFormat[e.toUpperCase()];return t||!s?t:(this._longDateFormat[e]=s.match(ut).map(function(r){return r==="MMMM"||r==="MM"||r==="DD"||r==="dddd"?r.slice(1):r}).join(""),this._longDateFormat[e])}var Ws="Invalid date";function Ns(){return this._invalidDate}var Ps="%d",Rs=/\d{1,2}/;function Fs(e){return this._ordinal.replace("%d",e)}var Ls={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function Is(e,t,s,r){var a=this._relativeTime[s];return V(a)?a(e,t,s,r):a.replace(/%d/i,e)}function Cs(e,t){var s=this._relativeTime[e>0?"future":"past"];return V(s)?s(t):s.replace(/%s/i,t)}var ye={};function O(e,t){var s=e.toLowerCase();ye[s]=ye[s+"s"]=ye[t]=e}function F(e){return typeof e=="string"?ye[e]||ye[e.toLowerCase()]:void 0}function dt(e){var t={},s,r;for(r in e)y(e,r)&&(s=F(r),s&&(t[s]=e[r]));return t}var Lt={};function T(e,t){Lt[e]=t}function Us(e){var t=[],s;for(s in e)y(e,s)&&t.push({unit:s,priority:Lt[s]});return t.sort(function(r,a){return r.priority-a.priority}),t}function Ce(e){return e%4===0&&e%100!==0||e%400===0}function P(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function _(e){var t=+e,s=0;return t!==0&&isFinite(t)&&(s=P(t)),s}function fe(e,t){return function(s){return s!=null?(It(this,e,s),l.updateOffset(this,t),this):We(this,e)}}function We(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function It(e,t,s){e.isValid()&&!isNaN(s)&&(t==="FullYear"&&Ce(e.year())&&e.month()===1&&e.date()===29?(s=_(s),e._d["set"+(e._isUTC?"UTC":"")+t](s,e.month(),Ge(s,e.month()))):e._d["set"+(e._isUTC?"UTC":"")+t](s))}function Hs(e){return e=F(e),V(this[e])?this[e]():this}function Es(e,t){if(typeof e=="object"){e=dt(e);var s=Us(e),r,a=s.length;for(r=0;r68?1900:2e3)};var Zt=fe("FullYear",!0);function nr(){return Ce(this.year())}function ir(e,t,s,r,a,n,i){var d;return e<100&&e>=0?(d=new Date(e+400,t,s,r,a,n,i),isFinite(d.getFullYear())&&d.setFullYear(e)):d=new Date(e,t,s,r,a,n,i),d}function ke(e){var t,s;return e<100&&e>=0?(s=Array.prototype.slice.call(arguments),s[0]=e+400,t=new Date(Date.UTC.apply(null,s)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function Pe(e,t,s){var r=7+t-s,a=(7+ke(e,0,r).getUTCDay()-t)%7;return-a+r-1}function $t(e,t,s,r,a){var n=(7+s-r)%7,i=Pe(e,r,a),d=1+7*(t-1)+n+i,c,k;return d<=0?(c=e-1,k=we(c)+d):d>we(e)?(c=e+1,k=d-we(e)):(c=e,k=d),{year:c,dayOfYear:k}}function Me(e,t,s){var r=Pe(e.year(),t,s),a=Math.floor((e.dayOfYear()-r-1)/7)+1,n,i;return a<1?(i=e.year()-1,n=a+B(i,t,s)):a>B(e.year(),t,s)?(n=a-B(e.year(),t,s),i=e.year()+1):(i=e.year(),n=a),{week:n,year:i}}function B(e,t,s){var r=Pe(e,t,s),a=Pe(e+1,t,s);return(we(e)-r+a)/7}h("w",["ww",2],"wo","week");h("W",["WW",2],"Wo","isoWeek");O("week","w");O("isoWeek","W");T("week",5);T("isoWeek",5);u("w",D);u("ww",D,N);u("W",D);u("WW",D,N);ve(["w","ww","W","WW"],function(e,t,s,r){t[r.substr(0,1)]=_(e)});function or(e){return Me(e,this._week.dow,this._week.doy).week}var lr={dow:0,doy:6};function ur(){return this._week.dow}function dr(){return this._week.doy}function hr(e){var t=this.localeData().week(this);return e==null?t:this.add((e-t)*7,"d")}function fr(e){var t=Me(this,1,4).week;return e==null?t:this.add((e-t)*7,"d")}h("d",0,"do","day");h("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)});h("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)});h("dddd",0,0,function(e){return this.localeData().weekdays(this,e)});h("e",0,0,"weekday");h("E",0,0,"isoWeekday");O("day","d");O("weekday","e");O("isoWeekday","E");T("day",11);T("weekday",11);T("isoWeekday",11);u("d",D);u("e",D);u("E",D);u("dd",function(e,t){return t.weekdaysMinRegex(e)});u("ddd",function(e,t){return t.weekdaysShortRegex(e)});u("dddd",function(e,t){return t.weekdaysRegex(e)});ve(["dd","ddd","dddd"],function(e,t,s,r){var a=s._locale.weekdaysParse(e,r,s._strict);a!=null?t.d=a:f(s).invalidWeekday=e});ve(["d","e","E"],function(e,t,s,r){t[r]=_(e)});function cr(e,t){return typeof e!="string"?e:isNaN(e)?(e=t.weekdaysParse(e),typeof e=="number"?e:null):parseInt(e,10)}function _r(e,t){return typeof e=="string"?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function ct(e,t){return e.slice(t,7).concat(e.slice(0,t))}var mr="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Bt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),yr="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),wr=ge,kr=ge,Mr=ge;function Sr(e,t){var s=I(this._weekdays)?this._weekdays:this._weekdays[e&&e!==!0&&this._weekdays.isFormat.test(t)?"format":"standalone"];return e===!0?ct(s,this._week.dow):e?s[e.day()]:s}function Dr(e){return e===!0?ct(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function Yr(e){return e===!0?ct(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function gr(e,t,s){var r,a,n,i=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)n=A([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(n,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(n,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(n,"").toLocaleLowerCase();return s?t==="dddd"?(a=g.call(this._weekdaysParse,i),a!==-1?a:null):t==="ddd"?(a=g.call(this._shortWeekdaysParse,i),a!==-1?a:null):(a=g.call(this._minWeekdaysParse,i),a!==-1?a:null):t==="dddd"?(a=g.call(this._weekdaysParse,i),a!==-1||(a=g.call(this._shortWeekdaysParse,i),a!==-1)?a:(a=g.call(this._minWeekdaysParse,i),a!==-1?a:null)):t==="ddd"?(a=g.call(this._shortWeekdaysParse,i),a!==-1||(a=g.call(this._weekdaysParse,i),a!==-1)?a:(a=g.call(this._minWeekdaysParse,i),a!==-1?a:null)):(a=g.call(this._minWeekdaysParse,i),a!==-1||(a=g.call(this._weekdaysParse,i),a!==-1)?a:(a=g.call(this._shortWeekdaysParse,i),a!==-1?a:null))}function vr(e,t,s){var r,a,n;if(this._weekdaysParseExact)return gr.call(this,e,t,s);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),r=0;r<7;r++){if(a=A([2e3,1]).day(r),s&&!this._fullWeekdaysParse[r]&&(this._fullWeekdaysParse[r]=new RegExp("^"+this.weekdays(a,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[r]=new RegExp("^"+this.weekdaysShort(a,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[r]=new RegExp("^"+this.weekdaysMin(a,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[r]||(n="^"+this.weekdays(a,"")+"|^"+this.weekdaysShort(a,"")+"|^"+this.weekdaysMin(a,""),this._weekdaysParse[r]=new RegExp(n.replace(".",""),"i")),s&&t==="dddd"&&this._fullWeekdaysParse[r].test(e))return r;if(s&&t==="ddd"&&this._shortWeekdaysParse[r].test(e))return r;if(s&&t==="dd"&&this._minWeekdaysParse[r].test(e))return r;if(!s&&this._weekdaysParse[r].test(e))return r}}function pr(e){if(!this.isValid())return e!=null?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return e!=null?(e=cr(e,this.localeData()),this.add(e-t,"d")):t}function Or(e){if(!this.isValid())return e!=null?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return e==null?t:this.add(e-t,"d")}function Tr(e){if(!this.isValid())return e!=null?this:NaN;if(e!=null){var t=_r(e,this.localeData());return this.day(this.day()%7?t:t-7)}else return this.day()||7}function xr(e){return this._weekdaysParseExact?(y(this,"_weekdaysRegex")||_t.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(y(this,"_weekdaysRegex")||(this._weekdaysRegex=wr),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function br(e){return this._weekdaysParseExact?(y(this,"_weekdaysRegex")||_t.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(y(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=kr),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Wr(e){return this._weekdaysParseExact?(y(this,"_weekdaysRegex")||_t.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(y(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Mr),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function _t(){function e(x,G){return G.length-x.length}var t=[],s=[],r=[],a=[],n,i,d,c,k;for(n=0;n<7;n++)i=A([2e3,1]).day(n),d=W(this.weekdaysMin(i,"")),c=W(this.weekdaysShort(i,"")),k=W(this.weekdays(i,"")),t.push(d),s.push(c),r.push(k),a.push(d),a.push(c),a.push(k);t.sort(e),s.sort(e),r.sort(e),a.sort(e),this._weekdaysRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+t.join("|")+")","i")}function mt(){return this.hours()%12||12}function Nr(){return this.hours()||24}h("H",["HH",2],0,"hour");h("h",["hh",2],0,mt);h("k",["kk",2],0,Nr);h("hmm",0,0,function(){return""+mt.apply(this)+E(this.minutes(),2)});h("hmmss",0,0,function(){return""+mt.apply(this)+E(this.minutes(),2)+E(this.seconds(),2)});h("Hmm",0,0,function(){return""+this.hours()+E(this.minutes(),2)});h("Hmmss",0,0,function(){return""+this.hours()+E(this.minutes(),2)+E(this.seconds(),2)});function qt(e,t){h(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}qt("a",!0);qt("A",!1);O("hour","h");T("hour",13);function Jt(e,t){return t._meridiemParse}u("a",Jt);u("A",Jt);u("H",D);u("h",D);u("k",D);u("HH",D,N);u("hh",D,N);u("kk",D,N);u("hmm",Ht);u("hmmss",Et);u("Hmm",Ht);u("Hmmss",Et);M(["H","HH"],v);M(["k","kk"],function(e,t,s){var r=_(e);t[v]=r===24?0:r});M(["a","A"],function(e,t,s){s._isPm=s._locale.isPM(e),s._meridiem=e});M(["h","hh"],function(e,t,s){t[v]=_(e),f(s).bigHour=!0});M("hmm",function(e,t,s){var r=e.length-2;t[v]=_(e.substr(0,r)),t[L]=_(e.substr(r)),f(s).bigHour=!0});M("hmmss",function(e,t,s){var r=e.length-4,a=e.length-2;t[v]=_(e.substr(0,r)),t[L]=_(e.substr(r,2)),t[$]=_(e.substr(a)),f(s).bigHour=!0});M("Hmm",function(e,t,s){var r=e.length-2;t[v]=_(e.substr(0,r)),t[L]=_(e.substr(r))});M("Hmmss",function(e,t,s){var r=e.length-4,a=e.length-2;t[v]=_(e.substr(0,r)),t[L]=_(e.substr(r,2)),t[$]=_(e.substr(a))});function Pr(e){return(e+"").toLowerCase().charAt(0)==="p"}var Rr=/[ap]\.?m?\.?/i,Fr=fe("Hours",!0);function Lr(e,t,s){return e>11?s?"pm":"PM":s?"am":"AM"}var Qt={calendar:vs,longDateFormat:xs,invalidDate:Ws,ordinal:Ps,dayOfMonthOrdinalParse:Rs,relativeTime:Ls,months:qs,monthsShort:At,week:lr,weekdays:mr,weekdaysMin:yr,weekdaysShort:Bt,meridiemParse:Rr},Y={},_e={},Se;function Ir(e,t){var s,r=Math.min(e.length,t.length);for(s=0;s0;){if(a=je(n.slice(0,s).join("-")),a)return a;if(r&&r.length>=s&&Ir(n,r)>=s-1)break;s--}t++}return Se}function Ur(e){return e.match("^[^/\\\\]*$")!=null}function je(e){var t=null,s;if(Y[e]===void 0&&typeof module!="undefined"&&module&&module.exports&&Ur(e))try{t=Se._abbr,s=require,s("./locale/"+e),te(t)}catch{Y[e]=null}return Y[e]}function te(e,t){var s;return e&&(b(t)?s=J(e):s=yt(e,t),s?Se=s:typeof console!="undefined"&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),Se._abbr}function yt(e,t){if(t!==null){var s,r=Qt;if(t.abbr=e,Y[e]!=null)Rt("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),r=Y[e]._config;else if(t.parentLocale!=null)if(Y[t.parentLocale]!=null)r=Y[t.parentLocale]._config;else if(s=je(t.parentLocale),s!=null)r=s._config;else return _e[t.parentLocale]||(_e[t.parentLocale]=[]),_e[t.parentLocale].push({name:e,config:t}),null;return Y[e]=new lt(Ke(r,t)),_e[e]&&_e[e].forEach(function(a){yt(a.name,a.config)}),te(e),Y[e]}else return delete Y[e],null}function Hr(e,t){if(t!=null){var s,r,a=Qt;Y[e]!=null&&Y[e].parentLocale!=null?Y[e].set(Ke(Y[e]._config,t)):(r=je(e),r!=null&&(a=r._config),t=Ke(a,t),r==null&&(t.abbr=e),s=new lt(t),s.parentLocale=Y[e],Y[e]=s),te(e)}else Y[e]!=null&&(Y[e].parentLocale!=null?(Y[e]=Y[e].parentLocale,e===te()&&te(e)):Y[e]!=null&&delete Y[e]);return Y[e]}function J(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return Se;if(!I(e)){if(t=je(e),t)return t;e=[e]}return Cr(e)}function Er(){return et(Y)}function wt(e){var t,s=e._a;return s&&f(e).overflow===-2&&(t=s[Z]<0||s[Z]>11?Z:s[H]<1||s[H]>Ge(s[p],s[Z])?H:s[v]<0||s[v]>24||s[v]===24&&(s[L]!==0||s[$]!==0||s[re]!==0)?v:s[L]<0||s[L]>59?L:s[$]<0||s[$]>59?$:s[re]<0||s[re]>999?re:-1,f(e)._overflowDayOfYear&&(tH)&&(t=H),f(e)._overflowWeeks&&t===-1&&(t=Zs),f(e)._overflowWeekday&&t===-1&&(t=$s),f(e).overflow=t),e}var Ar=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Vr=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Gr=/Z|[+-]\d\d(?::?\d\d)?/,Oe=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Je=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],jr=/^\/?Date\((-?\d+)/i,zr=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,Zr={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function Xt(e){var t,s,r=e._i,a=Ar.exec(r)||Vr.exec(r),n,i,d,c,k=Oe.length,x=Je.length;if(a){for(f(e).iso=!0,t=0,s=k;twe(i)||e._dayOfYear===0)&&(f(e)._overflowDayOfYear=!0),s=ke(i,0,e._dayOfYear),e._a[Z]=s.getUTCMonth(),e._a[H]=s.getUTCDate()),t=0;t<3&&e._a[t]==null;++t)e._a[t]=r[t]=a[t];for(;t<7;t++)e._a[t]=r[t]=e._a[t]==null?t===2?1:0:e._a[t];e._a[v]===24&&e._a[L]===0&&e._a[$]===0&&e._a[re]===0&&(e._nextDay=!0,e._a[v]=0),e._d=(e._useUTC?ke:ir).apply(null,r),n=e._useUTC?e._d.getUTCDay():e._d.getDay(),e._tzm!=null&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[v]=24),e._w&&typeof e._w.d!="undefined"&&e._w.d!==n&&(f(e).weekdayMismatch=!0)}}function ea(e){var t,s,r,a,n,i,d,c,k;t=e._w,t.GG!=null||t.W!=null||t.E!=null?(n=1,i=4,s=oe(t.GG,e._a[p],Me(S(),1,4).year),r=oe(t.W,1),a=oe(t.E,1),(a<1||a>7)&&(c=!0)):(n=e._locale._week.dow,i=e._locale._week.doy,k=Me(S(),n,i),s=oe(t.gg,e._a[p],k.year),r=oe(t.w,k.week),t.d!=null?(a=t.d,(a<0||a>6)&&(c=!0)):t.e!=null?(a=t.e+n,(t.e<0||t.e>6)&&(c=!0)):a=n),r<1||r>B(s,n,i)?f(e)._overflowWeeks=!0:c!=null?f(e)._overflowWeekday=!0:(d=$t(s,r,a,n,i),e._a[p]=d.year,e._dayOfYear=d.dayOfYear)}l.ISO_8601=function(){};l.RFC_2822=function(){};function Mt(e){if(e._f===l.ISO_8601){Xt(e);return}if(e._f===l.RFC_2822){Kt(e);return}e._a=[],f(e).empty=!0;var t=""+e._i,s,r,a,n,i,d=t.length,c=0,k,x;for(a=Ft(e._f,e._locale).match(ut)||[],x=a.length,s=0;s0&&f(e).unusedInput.push(i),t=t.slice(t.indexOf(r)+r.length),c+=r.length),ue[n]?(r?f(e).empty=!1:f(e).unusedTokens.push(n),zs(n,r,e)):e._strict&&!r&&f(e).unusedTokens.push(n);f(e).charsLeftOver=d-c,t.length>0&&f(e).unusedInput.push(t),e._a[v]<=12&&f(e).bigHour===!0&&e._a[v]>0&&(f(e).bigHour=void 0),f(e).parsedDateParts=e._a.slice(0),f(e).meridiem=e._meridiem,e._a[v]=ta(e._locale,e._a[v],e._meridiem),k=f(e).era,k!==null&&(e._a[p]=e._locale.erasConvertYear(k,e._a[p])),kt(e),wt(e)}function ta(e,t,s){var r;return s==null?t:e.meridiemHour!=null?e.meridiemHour(t,s):(e.isPM!=null&&(r=e.isPM(s),r&&t<12&&(t+=12),!r&&t===12&&(t=0)),t)}function sa(e){var t,s,r,a,n,i,d=!1,c=e._f.length;if(c===0){f(e).invalidFormat=!0,e._d=new Date(NaN);return}for(a=0;athis?this:e:Ie()});function ss(e,t){var s,r;if(t.length===1&&I(t[0])&&(t=t[0]),!t.length)return S();for(s=t[0],r=1;rthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function ga(){if(!b(this._isDSTShifted))return this._isDSTShifted;var e={},t;return ot(e,this),e=es(e),e._a?(t=e._isUTC?A(e._a):S(e._a),this._isDSTShifted=this.isValid()&&_a(e._a,t.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function va(){return this.isValid()?!this._isUTC:!1}function pa(){return this.isValid()?this._isUTC:!1}function as(){return this.isValid()?this._isUTC&&this._offset===0:!1}var Oa=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,Ta=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function U(e,t){var s=e,r=null,a,n,i;return xe(e)?s={ms:e._milliseconds,d:e._days,M:e._months}:q(e)||!isNaN(+e)?(s={},t?s[t]=+e:s.milliseconds=+e):(r=Oa.exec(e))?(a=r[1]==="-"?-1:1,s={y:0,d:_(r[H])*a,h:_(r[v])*a,m:_(r[L])*a,s:_(r[$])*a,ms:_(st(r[re]*1e3))*a}):(r=Ta.exec(e))?(a=r[1]==="-"?-1:1,s={y:se(r[2],a),M:se(r[3],a),w:se(r[4],a),d:se(r[5],a),h:se(r[6],a),m:se(r[7],a),s:se(r[8],a)}):s==null?s={}:typeof s=="object"&&("from"in s||"to"in s)&&(i=xa(S(s.from),S(s.to)),s={},s.ms=i.milliseconds,s.M=i.months),n=new ze(s),xe(e)&&y(e,"_locale")&&(n._locale=e._locale),xe(e)&&y(e,"_isValid")&&(n._isValid=e._isValid),n}U.fn=ze.prototype;U.invalid=ca;function se(e,t){var s=e&&parseFloat(e.replace(",","."));return(isNaN(s)?0:s)*t}function xt(e,t){var s={};return s.months=t.month()-e.month()+(t.year()-e.year())*12,e.clone().add(s.months,"M").isAfter(t)&&--s.months,s.milliseconds=+t-+e.clone().add(s.months,"M"),s}function xa(e,t){var s;return e.isValid()&&t.isValid()?(t=Dt(t,e),e.isBefore(t)?s=xt(e,t):(s=xt(t,e),s.milliseconds=-s.milliseconds,s.months=-s.months),s):{milliseconds:0,months:0}}function ns(e,t){return function(s,r){var a,n;return r!==null&&!isNaN(+r)&&(Rt(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),n=s,s=r,r=n),a=U(s,r),is(this,a,e),this}}function is(e,t,s,r){var a=t._milliseconds,n=st(t._days),i=st(t._months);!e.isValid()||(r=r==null?!0:r,i&&Gt(e,We(e,"Month")+i*s),n&&It(e,"Date",We(e,"Date")+n*s),a&&e._d.setTime(e._d.valueOf()+a*s),r&&l.updateOffset(e,n||i))}var ba=ns(1,"add"),Wa=ns(-1,"subtract");function os(e){return typeof e=="string"||e instanceof String}function Na(e){return C(e)||De(e)||os(e)||q(e)||Ra(e)||Pa(e)||e===null||e===void 0}function Pa(e){var t=ae(e)&&!nt(e),s=!1,r=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],a,n,i=r.length;for(a=0;as.valueOf():s.valueOf()9999?Te(s,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):V(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",Te(s,"Z")):Te(s,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function $a(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="",s,r,a,n;return this.isLocal()||(e=this.utcOffset()===0?"moment.utc":"moment.parseZone",t="Z"),s="["+e+'("]',r=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",a="-MM-DD[T]HH:mm:ss.SSS",n=t+'[")]',this.format(s+r+a+n)}function Ba(e){e||(e=this.isUtc()?l.defaultFormatUtc:l.defaultFormat);var t=Te(this,e);return this.localeData().postformat(t)}function qa(e,t){return this.isValid()&&(C(e)&&e.isValid()||S(e).isValid())?U({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function Ja(e){return this.from(S(),e)}function Qa(e,t){return this.isValid()&&(C(e)&&e.isValid()||S(e).isValid())?U({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function Xa(e){return this.to(S(),e)}function ls(e){var t;return e===void 0?this._locale._abbr:(t=J(e),t!=null&&(this._locale=t),this)}var us=R("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return e===void 0?this.localeData():this.locale(e)});function ds(){return this._locale}var Re=1e3,de=60*Re,Fe=60*de,hs=(365*400+97)*24*Fe;function he(e,t){return(e%t+t)%t}function fs(e,t,s){return e<100&&e>=0?new Date(e+400,t,s)-hs:new Date(e,t,s).valueOf()}function cs(e,t,s){return e<100&&e>=0?Date.UTC(e+400,t,s)-hs:Date.UTC(e,t,s)}function Ka(e){var t,s;if(e=F(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(s=this._isUTC?cs:fs,e){case"year":t=s(this.year(),0,1);break;case"quarter":t=s(this.year(),this.month()-this.month()%3,1);break;case"month":t=s(this.year(),this.month(),1);break;case"week":t=s(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=s(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=s(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=he(t+(this._isUTC?0:this.utcOffset()*de),Fe);break;case"minute":t=this._d.valueOf(),t-=he(t,de);break;case"second":t=this._d.valueOf(),t-=he(t,Re);break}return this._d.setTime(t),l.updateOffset(this,!0),this}function en(e){var t,s;if(e=F(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(s=this._isUTC?cs:fs,e){case"year":t=s(this.year()+1,0,1)-1;break;case"quarter":t=s(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=s(this.year(),this.month()+1,1)-1;break;case"week":t=s(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=s(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=s(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=Fe-he(t+(this._isUTC?0:this.utcOffset()*de),Fe)-1;break;case"minute":t=this._d.valueOf(),t+=de-he(t,de)-1;break;case"second":t=this._d.valueOf(),t+=Re-he(t,Re)-1;break}return this._d.setTime(t),l.updateOffset(this,!0),this}function tn(){return this._d.valueOf()-(this._offset||0)*6e4}function sn(){return Math.floor(this.valueOf()/1e3)}function rn(){return new Date(this.valueOf())}function an(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function nn(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function on(){return this.isValid()?this.toISOString():null}function ln(){return it(this)}function un(){return K({},f(this))}function dn(){return f(this).overflow}function hn(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}h("N",0,0,"eraAbbr");h("NN",0,0,"eraAbbr");h("NNN",0,0,"eraAbbr");h("NNNN",0,0,"eraName");h("NNNNN",0,0,"eraNarrow");h("y",["y",1],"yo","eraYear");h("y",["yy",2],0,"eraYear");h("y",["yyy",3],0,"eraYear");h("y",["yyyy",4],0,"eraYear");u("N",Yt);u("NN",Yt);u("NNN",Yt);u("NNNN",Yn);u("NNNNN",gn);M(["N","NN","NNN","NNNN","NNNNN"],function(e,t,s,r){var a=s._locale.erasParse(e,r,s._strict);a?f(s).era=a:f(s).invalidEra=e});u("y",ce);u("yy",ce);u("yyy",ce);u("yyyy",ce);u("yo",vn);M(["y","yy","yyy","yyyy"],p);M(["yo"],function(e,t,s,r){var a;s._locale._eraYearOrdinalRegex&&(a=e.match(s._locale._eraYearOrdinalRegex)),s._locale.eraYearOrdinalParse?t[p]=s._locale.eraYearOrdinalParse(e,a):t[p]=parseInt(e,10)});function fn(e,t){var s,r,a,n=this._eras||J("en")._eras;for(s=0,r=n.length;s=0)return n[r]}function _n(e,t){var s=e.since<=e.until?1:-1;return t===void 0?l(e.since).year():l(e.since).year()+(t-e.offset)*s}function mn(){var e,t,s,r=this.localeData().eras();for(e=0,t=r.length;en&&(t=n),Nn.call(this,e,t,s,r,a))}function Nn(e,t,s,r,a){var n=$t(e,t,s,r,a),i=ke(n.year,0,n.dayOfYear);return this.year(i.getUTCFullYear()),this.month(i.getUTCMonth()),this.date(i.getUTCDate()),this}h("Q",0,"Qo","quarter");O("quarter","Q");T("quarter",7);u("Q",Ct);M("Q",function(e,t){t[Z]=(_(e)-1)*3});function Pn(e){return e==null?Math.ceil((this.month()+1)/3):this.month((e-1)*3+this.month()%3)}h("D",["DD",2],"Do","date");O("date","D");T("date",9);u("D",D);u("DD",D,N);u("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient});M(["D","DD"],H);M("Do",function(e,t){t[H]=_(e.match(D)[0])});var ms=fe("Date",!0);h("DDD",["DDDD",3],"DDDo","dayOfYear");O("dayOfYear","DDD");T("dayOfYear",4);u("DDD",He);u("DDDD",Ut);M(["DDD","DDDD"],function(e,t,s){s._dayOfYear=_(e)});function Rn(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return e==null?t:this.add(e-t,"d")}h("m",["mm",2],0,"minute");O("minute","m");T("minute",14);u("m",D);u("mm",D,N);M(["m","mm"],L);var Fn=fe("Minutes",!1);h("s",["ss",2],0,"second");O("second","s");T("second",15);u("s",D);u("ss",D,N);M(["s","ss"],$);var Ln=fe("Seconds",!1);h("S",0,0,function(){return~~(this.millisecond()/100)});h(0,["SS",2],0,function(){return~~(this.millisecond()/10)});h(0,["SSS",3],0,"millisecond");h(0,["SSSS",4],0,function(){return this.millisecond()*10});h(0,["SSSSS",5],0,function(){return this.millisecond()*100});h(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3});h(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4});h(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5});h(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6});O("millisecond","ms");T("millisecond",16);u("S",He,Ct);u("SS",He,N);u("SSS",He,Ut);var ee,ys;for(ee="SSSS";ee.length<=9;ee+="S")u(ee,ce);function In(e,t){t[re]=_(("0."+e)*1e3)}for(ee="S";ee.length<=9;ee+="S")M(ee,In);ys=fe("Milliseconds",!1);h("z",0,0,"zoneAbbr");h("zz",0,0,"zoneName");function Cn(){return this._isUTC?"UTC":""}function Un(){return this._isUTC?"Coordinated Universal Time":""}var o=Ye.prototype;o.add=ba;o.calendar=Ia;o.clone=Ca;o.diff=ja;o.endOf=en;o.format=Ba;o.from=qa;o.fromNow=Ja;o.to=Qa;o.toNow=Xa;o.get=Hs;o.invalidAt=dn;o.isAfter=Ua;o.isBefore=Ha;o.isBetween=Ea;o.isSame=Aa;o.isSameOrAfter=Va;o.isSameOrBefore=Ga;o.isValid=ln;o.lang=us;o.locale=ls;o.localeData=ds;o.max=oa;o.min=ia;o.parsingFlags=un;o.set=Es;o.startOf=Ka;o.subtract=Wa;o.toArray=an;o.toObject=nn;o.toDate=rn;o.toISOString=Za;o.inspect=$a;typeof Symbol!="undefined"&&Symbol.for!=null&&(o[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"});o.toJSON=on;o.toString=za;o.unix=sn;o.valueOf=tn;o.creationData=hn;o.eraName=mn;o.eraNarrow=yn;o.eraAbbr=wn;o.eraYear=kn;o.year=Zt;o.isLeapYear=nr;o.weekYear=pn;o.isoWeekYear=On;o.quarter=o.quarters=Pn;o.month=jt;o.daysInMonth=sr;o.week=o.weeks=hr;o.isoWeek=o.isoWeeks=fr;o.weeksInYear=bn;o.weeksInWeekYear=Wn;o.isoWeeksInYear=Tn;o.isoWeeksInISOWeekYear=xn;o.date=ms;o.day=o.days=pr;o.weekday=Or;o.isoWeekday=Tr;o.dayOfYear=Rn;o.hour=o.hours=Fr;o.minute=o.minutes=Fn;o.second=o.seconds=Ln;o.millisecond=o.milliseconds=ys;o.utcOffset=ya;o.utc=ka;o.local=Ma;o.parseZone=Sa;o.hasAlignedHourOffset=Da;o.isDST=Ya;o.isLocal=va;o.isUtcOffset=pa;o.isUtc=as;o.isUTC=as;o.zoneAbbr=Cn;o.zoneName=Un;o.dates=R("dates accessor is deprecated. Use date instead.",ms);o.months=R("months accessor is deprecated. Use month instead",jt);o.years=R("years accessor is deprecated. Use year instead",Zt);o.zone=R("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",wa);o.isDSTShifted=R("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",ga);function Hn(e){return S(e*1e3)}function En(){return S.apply(null,arguments).parseZone()}function ws(e){return e}var w=lt.prototype;w.calendar=ps;w.longDateFormat=bs;w.invalidDate=Ns;w.ordinal=Fs;w.preparse=ws;w.postformat=ws;w.relativeTime=Is;w.pastFuture=Cs;w.set=gs;w.eras=fn;w.erasParse=cn;w.erasConvertYear=_n;w.erasAbbrRegex=Sn;w.erasNameRegex=Mn;w.erasNarrowRegex=Dn;w.months=Xs;w.monthsShort=Ks;w.monthsParse=tr;w.monthsRegex=ar;w.monthsShortRegex=rr;w.week=or;w.firstDayOfYear=dr;w.firstDayOfWeek=ur;w.weekdays=Sr;w.weekdaysMin=Yr;w.weekdaysShort=Dr;w.weekdaysParse=vr;w.weekdaysRegex=xr;w.weekdaysShortRegex=br;w.weekdaysMinRegex=Wr;w.isPM=Pr;w.meridiem=Lr;function Le(e,t,s,r){var a=J(),n=A().set(r,t);return a[s](n,e)}function ks(e,t,s){if(q(e)&&(t=e,e=void 0),e=e||"",t!=null)return Le(e,t,s,"month");var r,a=[];for(r=0;r<12;r++)a[r]=Le(e,r,s,"month");return a}function vt(e,t,s,r){typeof e=="boolean"?(q(t)&&(s=t,t=void 0),t=t||""):(t=e,s=t,e=!1,q(t)&&(s=t,t=void 0),t=t||"");var a=J(),n=e?a._week.dow:0,i,d=[];if(s!=null)return Le(t,(s+n)%7,r,"day");for(i=0;i<7;i++)d[i]=Le(t,(i+n)%7,r,"day");return d}function An(e,t){return ks(e,t,"months")}function Vn(e,t){return ks(e,t,"monthsShort")}function Gn(e,t,s){return vt(e,t,s,"weekdays")}function jn(e,t,s){return vt(e,t,s,"weekdaysShort")}function zn(e,t,s){return vt(e,t,s,"weekdaysMin")}te("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,s=_(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+s}});l.lang=R("moment.lang is deprecated. Use moment.locale instead.",te);l.langData=R("moment.langData is deprecated. Use moment.localeData instead.",J);var j=Math.abs;function Zn(){var e=this._data;return this._milliseconds=j(this._milliseconds),this._days=j(this._days),this._months=j(this._months),e.milliseconds=j(e.milliseconds),e.seconds=j(e.seconds),e.minutes=j(e.minutes),e.hours=j(e.hours),e.months=j(e.months),e.years=j(e.years),this}function Ms(e,t,s,r){var a=U(t,s);return e._milliseconds+=r*a._milliseconds,e._days+=r*a._days,e._months+=r*a._months,e._bubble()}function $n(e,t){return Ms(this,e,t,1)}function Bn(e,t){return Ms(this,e,t,-1)}function bt(e){return e<0?Math.floor(e):Math.ceil(e)}function qn(){var e=this._milliseconds,t=this._days,s=this._months,r=this._data,a,n,i,d,c;return e>=0&&t>=0&&s>=0||e<=0&&t<=0&&s<=0||(e+=bt(at(s)+t)*864e5,t=0,s=0),r.milliseconds=e%1e3,a=P(e/1e3),r.seconds=a%60,n=P(a/60),r.minutes=n%60,i=P(n/60),r.hours=i%24,t+=P(i/24),c=P(Ss(t)),s+=c,t-=bt(at(c)),d=P(s/12),s%=12,r.days=t,r.months=s,r.years=d,this}function Ss(e){return e*4800/146097}function at(e){return e*146097/4800}function Jn(e){if(!this.isValid())return NaN;var t,s,r=this._milliseconds;if(e=F(e),e==="month"||e==="quarter"||e==="year")switch(t=this._days+r/864e5,s=this._months+Ss(t),e){case"month":return s;case"quarter":return s/3;case"year":return s/12}else switch(t=this._days+Math.round(at(this._months)),e){case"week":return t/7+r/6048e5;case"day":return t+r/864e5;case"hour":return t*24+r/36e5;case"minute":return t*1440+r/6e4;case"second":return t*86400+r/1e3;case"millisecond":return Math.floor(t*864e5)+r;default:throw new Error("Unknown unit "+e)}}function Qn(){return this.isValid()?this._milliseconds+this._days*864e5+this._months%12*2592e6+_(this._months/12)*31536e6:NaN}function Q(e){return function(){return this.as(e)}}var Xn=Q("ms"),Kn=Q("s"),ei=Q("m"),ti=Q("h"),si=Q("d"),ri=Q("w"),ai=Q("M"),ni=Q("Q"),ii=Q("y");function oi(){return U(this)}function li(e){return e=F(e),this.isValid()?this[e+"s"]():NaN}function ne(e){return function(){return this.isValid()?this._data[e]:NaN}}var ui=ne("milliseconds"),di=ne("seconds"),hi=ne("minutes"),fi=ne("hours"),ci=ne("days"),_i=ne("months"),mi=ne("years");function yi(){return P(this.days()/7)}var z=Math.round,le={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function wi(e,t,s,r,a){return a.relativeTime(t||1,!!s,e,r)}function ki(e,t,s,r){var a=U(e).abs(),n=z(a.as("s")),i=z(a.as("m")),d=z(a.as("h")),c=z(a.as("d")),k=z(a.as("M")),x=z(a.as("w")),G=z(a.as("y")),X=n<=s.ss&&["s",n]||n0,X[4]=r,wi.apply(null,X)}function Mi(e){return e===void 0?z:typeof e=="function"?(z=e,!0):!1}function Si(e,t){return le[e]===void 0?!1:t===void 0?le[e]:(le[e]=t,e==="s"&&(le.ss=t-1),!0)}function Di(e,t){if(!this.isValid())return this.localeData().invalidDate();var s=!1,r=le,a,n;return typeof e=="object"&&(t=e,e=!1),typeof e=="boolean"&&(s=e),typeof t=="object"&&(r=Object.assign({},le,t),t.s!=null&&t.ss==null&&(r.ss=t.s-1)),a=this.localeData(),n=ki(this,!s,r,a),s&&(n=a.pastFuture(+this,n)),a.postformat(n)}var Qe=Math.abs;function ie(e){return(e>0)-(e<0)||+e}function $e(){if(!this.isValid())return this.localeData().invalidDate();var e=Qe(this._milliseconds)/1e3,t=Qe(this._days),s=Qe(this._months),r,a,n,i,d=this.asSeconds(),c,k,x,G;return d?(r=P(e/60),a=P(r/60),e%=60,r%=60,n=P(s/12),s%=12,i=e?e.toFixed(3).replace(/\.?0+$/,""):"",c=d<0?"-":"",k=ie(this._months)!==ie(d)?"-":"",x=ie(this._days)!==ie(d)?"-":"",G=ie(this._milliseconds)!==ie(d)?"-":"",c+"P"+(n?k+n+"Y":"")+(s?k+s+"M":"")+(t?x+t+"D":"")+(a||r||e?"T":"")+(a?G+a+"H":"")+(r?G+r+"M":"")+(e?G+i+"S":"")):"P0D"}var m=ze.prototype;m.isValid=fa;m.abs=Zn;m.add=$n;m.subtract=Bn;m.as=Jn;m.asMilliseconds=Xn;m.asSeconds=Kn;m.asMinutes=ei;m.asHours=ti;m.asDays=si;m.asWeeks=ri;m.asMonths=ai;m.asQuarters=ni;m.asYears=ii;m.valueOf=Qn;m._bubble=qn;m.clone=oi;m.get=li;m.milliseconds=ui;m.seconds=di;m.minutes=hi;m.hours=fi;m.days=ci;m.weeks=yi;m.months=_i;m.years=mi;m.humanize=Di;m.toISOString=$e;m.toString=$e;m.toJSON=$e;m.locale=ls;m.localeData=ds;m.toIsoString=R("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",$e);m.lang=us;h("X",0,0,"unix");h("x",0,0,"valueOf");u("x",Ae);u("X",Vs);M("X",function(e,t,s){s._d=new Date(parseFloat(e)*1e3)});M("x",function(e,t,s){s._d=new Date(_(e))});//! moment.js +l.version="2.29.4";Ds(S);l.fn=o;l.min=la;l.max=ua;l.now=da;l.utc=A;l.unix=Hn;l.months=An;l.isDate=De;l.locale=te;l.invalid=Ie;l.duration=U;l.isMoment=C;l.weekdays=Gn;l.parseZone=En;l.localeData=J;l.isDuration=xe;l.monthsShort=Vn;l.weekdaysMin=zn;l.defineLocale=yt;l.updateLocale=Hr;l.locales=Er;l.weekdaysShort=jn;l.normalizeUnits=F;l.relativeTimeRounding=Mi;l.relativeTimeThreshold=Si;l.calendarFormat=La;l.prototype=o;l.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"};//! moment.js locale configuration +l.defineLocale("zh-cn",{months:"\u4E00\u6708_\u4E8C\u6708_\u4E09\u6708_\u56DB\u6708_\u4E94\u6708_\u516D\u6708_\u4E03\u6708_\u516B\u6708_\u4E5D\u6708_\u5341\u6708_\u5341\u4E00\u6708_\u5341\u4E8C\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661F\u671F\u65E5_\u661F\u671F\u4E00_\u661F\u671F\u4E8C_\u661F\u671F\u4E09_\u661F\u671F\u56DB_\u661F\u671F\u4E94_\u661F\u671F\u516D".split("_"),weekdaysShort:"\u5468\u65E5_\u5468\u4E00_\u5468\u4E8C_\u5468\u4E09_\u5468\u56DB_\u5468\u4E94_\u5468\u516D".split("_"),weekdaysMin:"\u65E5_\u4E00_\u4E8C_\u4E09_\u56DB_\u4E94_\u516D".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5E74M\u6708D\u65E5",LLL:"YYYY\u5E74M\u6708D\u65E5Ah\u70B9mm\u5206",LLLL:"YYYY\u5E74M\u6708D\u65E5ddddAh\u70B9mm\u5206",l:"YYYY/M/D",ll:"YYYY\u5E74M\u6708D\u65E5",lll:"YYYY\u5E74M\u6708D\u65E5 HH:mm",llll:"YYYY\u5E74M\u6708D\u65E5dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return e===12&&(e=0),t==="\u51CC\u6668"||t==="\u65E9\u4E0A"||t==="\u4E0A\u5348"?e:t==="\u4E0B\u5348"||t==="\u665A\u4E0A"?e+12:e>=11?e:e+12},meridiem:function(e,t,s){var r=e*100+t;return r<600?"\u51CC\u6668":r<900?"\u65E9\u4E0A":r<1130?"\u4E0A\u5348":r<1230?"\u4E2D\u5348":r<1800?"\u4E0B\u5348":"\u665A\u4E0A"},calendar:{sameDay:"[\u4ECA\u5929]LT",nextDay:"[\u660E\u5929]LT",nextWeek:function(e){return e.week()!==this.week()?"[\u4E0B]dddLT":"[\u672C]dddLT"},lastDay:"[\u6628\u5929]LT",lastWeek:function(e){return this.week()!==e.week()?"[\u4E0A]dddLT":"[\u672C]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"\u65E5";case"M":return e+"\u6708";case"w":case"W":return e+"\u5468";default:return e}},relativeTime:{future:"%s\u540E",past:"%s\u524D",s:"\u51E0\u79D2",ss:"%d \u79D2",m:"1 \u5206\u949F",mm:"%d \u5206\u949F",h:"1 \u5C0F\u65F6",hh:"%d \u5C0F\u65F6",d:"1 \u5929",dd:"%d \u5929",w:"1 \u5468",ww:"%d \u5468",M:"1 \u4E2A\u6708",MM:"%d \u4E2A\u6708",y:"1 \u5E74",yy:"%d \u5E74"},week:{dow:1,doy:4}});l.locale("zh-cn");const Yi=e=>l.unix(e).fromNow();export{Yi as f}; diff --git a/web/dist/assets/index.cd3e5166.css b/web/dist/assets/index.cd3e5166.css new file mode 100644 index 00000000..26e61ad4 --- /dev/null +++ b/web/dist/assets/index.cd3e5166.css @@ -0,0 +1 @@ +.auth-wrap[data-v-66895776]{margin-top:-30px}.rightbar-wrap[data-v-715681a1]{width:240px;position:fixed;left:calc(50% + var(--content-main) / 2 + 10px)}.rightbar-wrap .search-wrap[data-v-715681a1]{margin:12px 0}.rightbar-wrap .hot-tag-item[data-v-715681a1]{line-height:2;position:relative}.rightbar-wrap .hot-tag-item .hash-link[data-v-715681a1]{width:calc(100% - 60px);text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block}.rightbar-wrap .hot-tag-item .post-num[data-v-715681a1]{position:absolute;right:0;top:0;width:60px;text-align:right;line-height:2;opacity:.5}.rightbar-wrap .copyright-wrap[data-v-715681a1]{margin-top:10px}.rightbar-wrap .copyright-wrap .copyright[data-v-715681a1]{font-size:12px;opacity:.75}.rightbar-wrap .copyright-wrap .hash-link[data-v-715681a1]{font-size:12px}.sidebar-wrap{z-index:99;width:200px;height:100vh;position:fixed;right:calc(50% + var(--content-main) / 2 + 10px);padding:12px 0;box-sizing:border-box}.sidebar-wrap .n-menu .n-menu-item-content:before{border-radius:21px}.logo-wrap{display:flex;justify-content:flex-start;margin-bottom:12px}.logo-wrap .logo-img{margin-left:24px}.logo-wrap .logo-img:hover{cursor:pointer}.user-wrap{display:flex;align-items:center;position:absolute;bottom:12px;left:12px;right:12px}.user-wrap .user-mini-wrap{display:none}.user-wrap .user-avatar{margin-right:8px}.user-wrap .user-info{display:flex;flex-direction:column}.user-wrap .user-info .nickname{font-size:16px;font-weight:700;line-height:16px;height:16px;margin-bottom:2px;display:flex;align-items:center}.user-wrap .user-info .nickname .nickname-txt{max-width:90px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.user-wrap .user-info .nickname .logout{margin-left:6px}.user-wrap .user-info .username{font-size:14px;line-height:16px;height:16px;width:120px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;opacity:.75}.user-wrap .login-wrap{display:flex;justify-content:center;width:100%}.user-wrap .login-wrap button{margin:0 4px}.auth-card .n-card-header{z-index:999}@media screen and (max-width: 821px){.sidebar-wrap{width:65px;right:calc(100% - 60px)}.logo-wrap .logo-img{margin-left:12px!important}.user-wrap .user-avatar,.user-wrap .user-info,.user-wrap .login-wrap{display:none}.user-wrap .user-mini-wrap{display:block!important}}:root{--content-main: 500px}.app-container{margin:0}.app-container .app-wrap{width:100%;margin:0 auto}.main-wrap{min-height:100vh;display:flex;flex-direction:row;justify-content:center}.main-wrap .content-wrap{width:100%;max-width:var(--content-main);position:relative}.main-wrap .main-content-wrap{margin:0;border-top:none;border-radius:0}.main-wrap .main-content-wrap .n-list-item{padding:0}.empty-wrap{min-height:300px;display:flex;align-items:center;justify-content:center}.hash-link,.user-link{color:#18a058;text-decoration:none;cursor:pointer}.hash-link:hover,.user-link:hover{opacity:.8}.beian-link{color:#333;text-decoration:none}.beian-link:hover{opacity:.75}.username-link{color:#000;color:none;text-decoration:none;cursor:pointer}.username-link:hover{text-decoration:underline}.dark .hash-link,.dark .user-link{color:#63e2b7}.dark .username-link{color:#eee}.dark .beian-link{color:#ddd}@media screen and (max-width: 821px){.content-wrap{top:0;left:60px;position:absolute!important;width:calc(100% - 60px)!important}}@font-face{font-family:v-sans;font-weight:400;src:url(/assets/LatoLatin-Regular.ddd4ef7f.woff2)}@font-face{font-family:v-sans;font-weight:600;src:url(/assets/LatoLatin-Semibold.267eef30.woff2)}@font-face{font-family:v-mono;font-weight:400;src:url(/assets/FiraCode-Regular.f13d1ece.woff2)} diff --git a/web/dist/assets/index.d4f5aad2.js b/web/dist/assets/index.d4f5aad2.js new file mode 100644 index 00000000..e791b518 --- /dev/null +++ b/web/dist/assets/index.d4f5aad2.js @@ -0,0 +1,2005 @@ +const S0=function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))o(n);new MutationObserver(n=>{for(const i of n)if(i.type==="childList")for(const a of i.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&o(a)}).observe(document,{childList:!0,subtree:!0});function r(n){const i={};return n.integrity&&(i.integrity=n.integrity),n.referrerpolicy&&(i.referrerPolicy=n.referrerpolicy),n.crossorigin==="use-credentials"?i.credentials="include":n.crossorigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function o(n){if(n.ep)return;n.ep=!0;const i=r(n);fetch(n.href,i)}};S0();function sc(e,t){const r=Object.create(null),o=e.split(",");for(let n=0;n!!r[n.toLowerCase()]:n=>!!r[n]}function Fa(e){if(ke(e)){const t={};for(let r=0;r{if(r){const o=r.split(_0);o.length>1&&(t[o[0].trim()]=o[1].trim())}}),t}function ja(e){let t="";if(ft(e))t=e;else if(ke(e))for(let r=0;rft(e)?e:e==null?"":ke(e)||it(e)&&(e.toString===Oh||!Oe(e.toString))?JSON.stringify(e,Eh,2):String(e),Eh=(e,t)=>t&&t.__v_isRef?Eh(e,t.value):pn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((r,[o,n])=>(r[`${o} =>`]=n,r),{})}:Rh(t)?{[`Set(${t.size})`]:[...t.values()]}:it(t)&&!ke(t)&&!Ah(t)?String(t):t,nt={},hn=[],pr=()=>{},E0=()=>!1,R0=/^on[^a-z]/,Na=e=>R0.test(e),cc=e=>e.startsWith("onUpdate:"),_t=Object.assign,dc=(e,t)=>{const r=e.indexOf(t);r>-1&&e.splice(r,1)},I0=Object.prototype.hasOwnProperty,Ve=(e,t)=>I0.call(e,t),ke=Array.isArray,pn=e=>Wa(e)==="[object Map]",Rh=e=>Wa(e)==="[object Set]",Oe=e=>typeof e=="function",ft=e=>typeof e=="string",uc=e=>typeof e=="symbol",it=e=>e!==null&&typeof e=="object",Ih=e=>it(e)&&Oe(e.then)&&Oe(e.catch),Oh=Object.prototype.toString,Wa=e=>Oh.call(e),O0=e=>Wa(e).slice(8,-1),Ah=e=>Wa(e)==="[object Object]",fc=e=>ft(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ma=sc(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Va=e=>{const t=Object.create(null);return r=>t[r]||(t[r]=e(r))},A0=/-(\w)/g,Pr=Va(e=>e.replace(A0,(t,r)=>r?r.toUpperCase():"")),M0=/\B([A-Z])/g,Ho=Va(e=>e.replace(M0,"-$1").toLowerCase()),Ua=Va(e=>e.charAt(0).toUpperCase()+e.slice(1)),Tl=Va(e=>e?`on${Ua(e)}`:""),vi=(e,t)=>!Object.is(e,t),vn=(e,t)=>{for(let r=0;r{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:r})},mi=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Ed;const B0=()=>Ed||(Ed=typeof globalThis!="undefined"?globalThis:typeof self!="undefined"?self:typeof window!="undefined"?window:typeof global!="undefined"?global:{});let wr;class Mh{constructor(t=!1){this.detached=t,this.active=!0,this.effects=[],this.cleanups=[],this.parent=wr,!t&&wr&&(this.index=(wr.scopes||(wr.scopes=[])).push(this)-1)}run(t){if(this.active){const r=wr;try{return wr=this,t()}finally{wr=r}}}on(){wr=this}off(){wr=this.parent}stop(t){if(this.active){let r,o;for(r=0,o=this.effects.length;r{const t=new Set(e);return t.w=0,t.n=0,t},Bh=e=>(e.w&no)>0,Lh=e=>(e.n&no)>0,D0=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let r=0;for(let o=0;o{(c==="length"||c>=s)&&l.push(d)})}else switch(r!==void 0&&l.push(a.get(r)),t){case"add":ke(e)?fc(r)&&l.push(a.get("length")):(l.push(a.get(Io)),pn(e)&&l.push(a.get(gs)));break;case"delete":ke(e)||(l.push(a.get(Io)),pn(e)&&l.push(a.get(gs)));break;case"set":pn(e)&&l.push(a.get(Io));break}if(l.length===1)l[0]&&bs(l[0]);else{const s=[];for(const d of l)d&&s.push(...d);bs(hc(s))}}function bs(e,t){const r=ke(e)?e:[...e];for(const o of r)o.computed&&Id(o);for(const o of r)o.computed||Id(o)}function Id(e,t){(e!==fr||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const j0=sc("__proto__,__v_isRef,__isVue"),Fh=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(uc)),N0=vc(),W0=vc(!1,!0),V0=vc(!0),Od=U0();function U0(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...r){const o=Ke(this);for(let i=0,a=this.length;i{e[t]=function(...r){An();const o=Ke(this)[t].apply(this,r);return Mn(),o}}),e}function vc(e=!1,t=!1){return function(o,n,i){if(n==="__v_isReactive")return!e;if(n==="__v_isReadonly")return e;if(n==="__v_isShallow")return t;if(n==="__v_raw"&&i===(e?t?l1:Uh:t?Vh:Wh).get(o))return o;const a=ke(o);if(!e&&a&&Ve(Od,n))return Reflect.get(Od,n,i);const l=Reflect.get(o,n,i);return(uc(n)?Fh.has(n):j0(n))||(e||Qt(o,"get",n),t)?l:Et(l)?a&&fc(n)?l:l.value:it(l)?e?kr(l):vr(l):l}}const K0=jh(),q0=jh(!0);function jh(e=!1){return function(r,o,n,i){let a=r[o];if(wn(a)&&Et(a)&&!Et(n))return!1;if(!e&&(!_a(n)&&!wn(n)&&(a=Ke(a),n=Ke(n)),!ke(r)&&Et(a)&&!Et(n)))return a.value=n,!0;const l=ke(r)&&fc(o)?Number(o)e,Ka=e=>Reflect.getPrototypeOf(e);function qi(e,t,r=!1,o=!1){e=e.__v_raw;const n=Ke(e),i=Ke(t);r||(t!==i&&Qt(n,"get",t),Qt(n,"get",i));const{has:a}=Ka(n),l=o?mc:r?xc:gi;if(a.call(n,t))return l(e.get(t));if(a.call(n,i))return l(e.get(i));e!==n&&e.get(t)}function Gi(e,t=!1){const r=this.__v_raw,o=Ke(r),n=Ke(e);return t||(e!==n&&Qt(o,"has",e),Qt(o,"has",n)),e===n?r.has(e):r.has(e)||r.has(n)}function Yi(e,t=!1){return e=e.__v_raw,!t&&Qt(Ke(e),"iterate",Io),Reflect.get(e,"size",e)}function Ad(e){e=Ke(e);const t=Ke(this);return Ka(t).has.call(t,e)||(t.add(e),Hr(t,"add",e,e)),this}function Md(e,t){t=Ke(t);const r=Ke(this),{has:o,get:n}=Ka(r);let i=o.call(r,e);i||(e=Ke(e),i=o.call(r,e));const a=n.call(r,e);return r.set(e,t),i?vi(t,a)&&Hr(r,"set",e,t):Hr(r,"add",e,t),this}function Bd(e){const t=Ke(this),{has:r,get:o}=Ka(t);let n=r.call(t,e);n||(e=Ke(e),n=r.call(t,e)),o&&o.call(t,e);const i=t.delete(e);return n&&Hr(t,"delete",e,void 0),i}function Ld(){const e=Ke(this),t=e.size!==0,r=e.clear();return t&&Hr(e,"clear",void 0,void 0),r}function Xi(e,t){return function(o,n){const i=this,a=i.__v_raw,l=Ke(a),s=t?mc:e?xc:gi;return!e&&Qt(l,"iterate",Io),a.forEach((d,c)=>o.call(n,s(d),s(c),i))}}function Zi(e,t,r){return function(...o){const n=this.__v_raw,i=Ke(n),a=pn(i),l=e==="entries"||e===Symbol.iterator&&a,s=e==="keys"&&a,d=n[e](...o),c=r?mc:t?xc:gi;return!t&&Qt(i,"iterate",s?gs:Io),{next(){const{value:u,done:f}=d.next();return f?{value:u,done:f}:{value:l?[c(u[0]),c(u[1])]:c(u),done:f}},[Symbol.iterator](){return this}}}}function Gr(e){return function(...t){return e==="delete"?!1:this}}function Q0(){const e={get(i){return qi(this,i)},get size(){return Yi(this)},has:Gi,add:Ad,set:Md,delete:Bd,clear:Ld,forEach:Xi(!1,!1)},t={get(i){return qi(this,i,!1,!0)},get size(){return Yi(this)},has:Gi,add:Ad,set:Md,delete:Bd,clear:Ld,forEach:Xi(!1,!0)},r={get(i){return qi(this,i,!0)},get size(){return Yi(this,!0)},has(i){return Gi.call(this,i,!0)},add:Gr("add"),set:Gr("set"),delete:Gr("delete"),clear:Gr("clear"),forEach:Xi(!0,!1)},o={get(i){return qi(this,i,!0,!0)},get size(){return Yi(this,!0)},has(i){return Gi.call(this,i,!0)},add:Gr("add"),set:Gr("set"),delete:Gr("delete"),clear:Gr("clear"),forEach:Xi(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Zi(i,!1,!1),r[i]=Zi(i,!0,!1),t[i]=Zi(i,!1,!0),o[i]=Zi(i,!0,!0)}),[e,r,t,o]}const[e1,t1,r1,o1]=Q0();function gc(e,t){const r=t?e?o1:r1:e?t1:e1;return(o,n,i)=>n==="__v_isReactive"?!e:n==="__v_isReadonly"?e:n==="__v_raw"?o:Reflect.get(Ve(r,n)&&n in o?r:o,n,i)}const n1={get:gc(!1,!1)},i1={get:gc(!1,!0)},a1={get:gc(!0,!1)},Wh=new WeakMap,Vh=new WeakMap,Uh=new WeakMap,l1=new WeakMap;function s1(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function c1(e){return e.__v_skip||!Object.isExtensible(e)?0:s1(O0(e))}function vr(e){return wn(e)?e:bc(e,!1,Nh,n1,Wh)}function d1(e){return bc(e,!1,J0,i1,Vh)}function kr(e){return bc(e,!0,Z0,a1,Uh)}function bc(e,t,r,o,n){if(!it(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=n.get(e);if(i)return i;const a=c1(e);if(a===0)return e;const l=new Proxy(e,a===2?o:r);return n.set(e,l),l}function mn(e){return wn(e)?mn(e.__v_raw):!!(e&&e.__v_isReactive)}function wn(e){return!!(e&&e.__v_isReadonly)}function _a(e){return!!(e&&e.__v_isShallow)}function Kh(e){return mn(e)||wn(e)}function Ke(e){const t=e&&e.__v_raw;return t?Ke(t):e}function Pa(e){return $a(e,"__v_skip",!0),e}const gi=e=>it(e)?vr(e):e,xc=e=>it(e)?kr(e):e;function qh(e){ro&&fr&&(e=Ke(e),Dh(e.dep||(e.dep=hc())))}function Gh(e,t){e=Ke(e),e.dep&&bs(e.dep)}function Et(e){return!!(e&&e.__v_isRef===!0)}function V(e){return Yh(e,!1)}function u1(e){return Yh(e,!0)}function Yh(e,t){return Et(e)?e:new f1(e,t)}class f1{constructor(t,r){this.__v_isShallow=r,this.dep=void 0,this.__v_isRef=!0,this._rawValue=r?t:Ke(t),this._value=r?t:gi(t)}get value(){return qh(this),this._value}set value(t){const r=this.__v_isShallow||_a(t)||wn(t);t=r?t:Ke(t),vi(t,this._rawValue)&&(this._rawValue=t,this._value=r?t:gi(t),Gh(this))}}function Ze(e){return Et(e)?e.value:e}const h1={get:(e,t,r)=>Ze(Reflect.get(e,t,r)),set:(e,t,r,o)=>{const n=e[t];return Et(n)&&!Et(r)?(n.value=r,!0):Reflect.set(e,t,r,o)}};function Xh(e){return mn(e)?e:new Proxy(e,h1)}class p1{constructor(t,r,o){this._object=t,this._key=r,this._defaultValue=o,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}}function Te(e,t,r){const o=e[t];return Et(o)?o:new p1(e,t,r)}var Zh;class v1{constructor(t,r,o,n){this._setter=r,this.dep=void 0,this.__v_isRef=!0,this[Zh]=!1,this._dirty=!0,this.effect=new pc(t,()=>{this._dirty||(this._dirty=!0,Gh(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!n,this.__v_isReadonly=o}get value(){const t=Ke(this);return qh(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}Zh="__v_isReadonly";function m1(e,t,r=!1){let o,n;const i=Oe(e);return i?(o=e,n=pr):(o=e.get,n=e.set),new v1(o,n,i||!n,r)}function oo(e,t,r,o){let n;try{n=o?e(...o):e()}catch(i){qa(i,t,r)}return n}function ir(e,t,r,o){if(Oe(e)){const i=oo(e,t,r,o);return i&&Ih(i)&&i.catch(a=>{qa(a,t,r)}),i}const n=[];for(let i=0;i>>1;xi(Mt[o])$r&&Mt.splice(t,1)}function C1(e){ke(e)?gn.push(...e):(!Br||!Br.includes(e,e.allowRecurse?So+1:So))&&gn.push(e),Qh()}function Hd(e,t=bi?$r+1:0){for(;txi(r)-xi(o)),So=0;Soe.id==null?1/0:e.id,y1=(e,t)=>{const r=xi(e)-xi(t);if(r===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return r};function tp(e){xs=!1,bi=!0,Mt.sort(y1);const t=pr;try{for($r=0;$rft(p)?p.trim():p)),u&&(n=r.map(mi))}let l,s=o[l=Tl(t)]||o[l=Tl(Pr(t))];!s&&i&&(s=o[l=Tl(Ho(t))]),s&&ir(s,e,6,n);const d=o[l+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,ir(d,e,6,n)}}function rp(e,t,r=!1){const o=t.emitsCache,n=o.get(e);if(n!==void 0)return n;const i=e.emits;let a={},l=!1;if(!Oe(e)){const s=d=>{const c=rp(d,t,!0);c&&(l=!0,_t(a,c))};!r&&t.mixins.length&&t.mixins.forEach(s),e.extends&&s(e.extends),e.mixins&&e.mixins.forEach(s)}return!i&&!l?(it(e)&&o.set(e,null),null):(ke(i)?i.forEach(s=>a[s]=null):_t(a,i),it(e)&&o.set(e,a),a)}function Ga(e,t){return!e||!Na(t)?!1:(t=t.slice(2).replace(/Once$/,""),Ve(e,t[0].toLowerCase()+t.slice(1))||Ve(e,Ho(t))||Ve(e,t))}let Rt=null,Ya=null;function ka(e){const t=Rt;return Rt=e,Ya=e&&e.type.__scopeId||null,t}function RM(e){Ya=e}function IM(){Ya=null}function qe(e,t=Rt,r){if(!t||e._n)return e;const o=(...n)=>{o._d&&Xd(-1);const i=ka(t);let a;try{a=e(...n)}finally{ka(i),o._d&&Xd(1)}return a};return o._n=!0,o._c=!0,o._d=!0,o}function zl(e){const{type:t,vnode:r,proxy:o,withProxy:n,props:i,propsOptions:[a],slots:l,attrs:s,emit:d,render:c,renderCache:u,data:f,setupState:p,ctx:h,inheritAttrs:g}=e;let b,m;const y=ka(e);try{if(r.shapeFlag&4){const x=n||o;b=Sr(c.call(x,x,u,i,p,f,h)),m=s}else{const x=t;b=Sr(x.length>1?x(i,{attrs:s,slots:l,emit:d}):x(i,null)),m=t.props?s:S1(s)}}catch(x){li.length=0,qa(x,e,1),b=be(Dt)}let w=b;if(m&&g!==!1){const x=Object.keys(m),{shapeFlag:k}=w;x.length&&k&7&&(a&&x.some(cc)&&(m=$1(m,a)),w=lr(w,m))}return r.dirs&&(w=lr(w),w.dirs=w.dirs?w.dirs.concat(r.dirs):r.dirs),r.transition&&(w.transition=r.transition),b=w,ka(y),b}const S1=e=>{let t;for(const r in e)(r==="class"||r==="style"||Na(r))&&((t||(t={}))[r]=e[r]);return t},$1=(e,t)=>{const r={};for(const o in e)(!cc(o)||!(o.slice(9)in t))&&(r[o]=e[o]);return r};function _1(e,t,r){const{props:o,children:n,component:i}=e,{props:a,children:l,patchFlag:s}=t,d=i.emitsOptions;if(t.dirs||t.transition)return!0;if(r&&s>=0){if(s&1024)return!0;if(s&16)return o?Dd(o,a,d):!!a;if(s&8){const c=t.dynamicProps;for(let u=0;ue.__isSuspense;function k1(e,t){t&&t.pendingBranch?ke(e)?t.effects.push(...e):t.effects.push(e):C1(e)}function Be(e,t){if($t){let r=$t.provides;const o=$t.parent&&$t.parent.provides;o===r&&(r=$t.provides=Object.create(o)),r[e]=t}}function me(e,t,r=!1){const o=$t||Rt;if(o){const n=o.parent==null?o.vnode.appContext&&o.vnode.appContext.provides:o.parent.provides;if(n&&e in n)return n[e];if(arguments.length>1)return r&&Oe(t)?t.call(o.proxy):t}}function Wt(e,t){return wc(e,null,t)}const Ji={};function De(e,t,r){return wc(e,t,r)}function wc(e,t,{immediate:r,deep:o,flush:n,onTrack:i,onTrigger:a}=nt){const l=$t;let s,d=!1,c=!1;if(Et(e)?(s=()=>e.value,d=_a(e)):mn(e)?(s=()=>e,o=!0):ke(e)?(c=!0,d=e.some(w=>mn(w)||_a(w)),s=()=>e.map(w=>{if(Et(w))return w.value;if(mn(w))return Po(w);if(Oe(w))return oo(w,l,2)})):Oe(e)?t?s=()=>oo(e,l,2):s=()=>{if(!(l&&l.isUnmounted))return u&&u(),ir(e,l,3,[f])}:s=pr,t&&o){const w=s;s=()=>Po(w())}let u,f=w=>{u=m.onStop=()=>{oo(w,l,4)}},p;if(wi)if(f=pr,t?r&&ir(t,l,3,[s(),c?[]:void 0,f]):s(),n==="sync"){const w=gx();p=w.__watcherHandles||(w.__watcherHandles=[])}else return pr;let h=c?new Array(e.length).fill(Ji):Ji;const g=()=>{if(!!m.active)if(t){const w=m.run();(o||d||(c?w.some((x,k)=>vi(x,h[k])):vi(w,h)))&&(u&&u(),ir(t,l,3,[w,h===Ji?void 0:c&&h[0]===Ji?[]:h,f]),h=w)}else m.run()};g.allowRecurse=!!t;let b;n==="sync"?b=g:n==="post"?b=()=>kt(g,l&&l.suspense):(g.pre=!0,l&&(g.id=l.uid),b=()=>yc(g));const m=new pc(s,b);t?r?g():h=m.run():n==="post"?kt(m.run.bind(m),l&&l.suspense):m.run();const y=()=>{m.stop(),l&&l.scope&&dc(l.scope.effects,m)};return p&&p.push(y),y}function T1(e,t,r){const o=this.proxy,n=ft(e)?e.includes(".")?np(o,e):()=>o[e]:e.bind(o,o);let i;Oe(t)?i=t:(i=t.handler,r=t);const a=$t;_n(this);const l=wc(n,i.bind(o),r);return a?_n(a):Oo(),l}function np(e,t){const r=t.split(".");return()=>{let o=e;for(let n=0;n{Po(r,t)});else if(Ah(e))for(const r in e)Po(e[r],t);return e}function ip(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return gt(()=>{e.isMounted=!0}),ht(()=>{e.isUnmounting=!0}),e}const tr=[Function,Array],z1={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:tr,onEnter:tr,onAfterEnter:tr,onEnterCancelled:tr,onBeforeLeave:tr,onLeave:tr,onAfterLeave:tr,onLeaveCancelled:tr,onBeforeAppear:tr,onAppear:tr,onAfterAppear:tr,onAppearCancelled:tr},setup(e,{slots:t}){const r=Wr(),o=ip();let n;return()=>{const i=t.default&&Sc(t.default(),!0);if(!i||!i.length)return;let a=i[0];if(i.length>1){for(const g of i)if(g.type!==Dt){a=g;break}}const l=Ke(e),{mode:s}=l;if(o.isLeaving)return El(a);const d=Fd(a);if(!d)return El(a);const c=Ci(d,l,o,r);Sn(d,c);const u=r.subTree,f=u&&Fd(u);let p=!1;const{getTransitionKey:h}=d.type;if(h){const g=h();n===void 0?n=g:g!==n&&(n=g,p=!0)}if(f&&f.type!==Dt&&(!$o(d,f)||p)){const g=Ci(f,l,o,r);if(Sn(f,g),s==="out-in")return o.isLeaving=!0,g.afterLeave=()=>{o.isLeaving=!1,r.update.active!==!1&&r.update()},El(a);s==="in-out"&&d.type!==Dt&&(g.delayLeave=(b,m,y)=>{const w=lp(o,f);w[String(f.key)]=f,b._leaveCb=()=>{m(),b._leaveCb=void 0,delete c.delayedLeave},c.delayedLeave=y})}return a}}},ap=z1;function lp(e,t){const{leavingVNodes:r}=e;let o=r.get(t.type);return o||(o=Object.create(null),r.set(t.type,o)),o}function Ci(e,t,r,o){const{appear:n,mode:i,persisted:a=!1,onBeforeEnter:l,onEnter:s,onAfterEnter:d,onEnterCancelled:c,onBeforeLeave:u,onLeave:f,onAfterLeave:p,onLeaveCancelled:h,onBeforeAppear:g,onAppear:b,onAfterAppear:m,onAppearCancelled:y}=t,w=String(e.key),x=lp(r,e),k=($,R)=>{$&&ir($,o,9,R)},T=($,R)=>{const _=R[1];k($,R),ke($)?$.every(N=>N.length<=1)&&_():$.length<=1&&_()},S={mode:i,persisted:a,beforeEnter($){let R=l;if(!r.isMounted)if(n)R=g||l;else return;$._leaveCb&&$._leaveCb(!0);const _=x[w];_&&$o(e,_)&&_.el._leaveCb&&_.el._leaveCb(),k(R,[$])},enter($){let R=s,_=d,N=c;if(!r.isMounted)if(n)R=b||s,_=m||d,N=y||c;else return;let E=!1;const F=$._enterCb=j=>{E||(E=!0,j?k(N,[$]):k(_,[$]),S.delayedLeave&&S.delayedLeave(),$._enterCb=void 0)};R?T(R,[$,F]):F()},leave($,R){const _=String(e.key);if($._enterCb&&$._enterCb(!0),r.isUnmounting)return R();k(u,[$]);let N=!1;const E=$._leaveCb=F=>{N||(N=!0,R(),F?k(h,[$]):k(p,[$]),$._leaveCb=void 0,x[_]===e&&delete x[_])};x[_]=e,f?T(f,[$,E]):E()},clone($){return Ci($,t,r,o)}};return S}function El(e){if(Xa(e))return e=lr(e),e.children=null,e}function Fd(e){return Xa(e)?e.children?e.children[0]:void 0:e}function Sn(e,t){e.shapeFlag&6&&e.component?Sn(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Sc(e,t=!1,r){let o=[],n=0;for(let i=0;i1)for(let i=0;i!!e.type.__asyncLoader,Xa=e=>e.type.__isKeepAlive,E1={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const r=Wr(),o=r.ctx;if(!o.renderer)return()=>{const y=t.default&&t.default();return y&&y.length===1?y[0]:y};const n=new Map,i=new Set;let a=null;const l=r.suspense,{renderer:{p:s,m:d,um:c,o:{createElement:u}}}=o,f=u("div");o.activate=(y,w,x,k,T)=>{const S=y.component;d(y,w,x,0,l),s(S.vnode,y,w,x,S,l,k,y.slotScopeIds,T),kt(()=>{S.isDeactivated=!1,S.a&&vn(S.a);const $=y.props&&y.props.onVnodeMounted;$&&nr($,S.parent,y)},l)},o.deactivate=y=>{const w=y.component;d(y,f,null,1,l),kt(()=>{w.da&&vn(w.da);const x=y.props&&y.props.onVnodeUnmounted;x&&nr(x,w.parent,y),w.isDeactivated=!0},l)};function p(y){Rl(y),c(y,r,l,!0)}function h(y){n.forEach((w,x)=>{const k=ks(w.type);k&&(!y||!y(k))&&g(x)})}function g(y){const w=n.get(y);!a||w.type!==a.type?p(w):a&&Rl(a),n.delete(y),i.delete(y)}De(()=>[e.include,e.exclude],([y,w])=>{y&&h(x=>ei(y,x)),w&&h(x=>!ei(w,x))},{flush:"post",deep:!0});let b=null;const m=()=>{b!=null&&n.set(b,Il(r.subTree))};return gt(m),$c(m),ht(()=>{n.forEach(y=>{const{subTree:w,suspense:x}=r,k=Il(w);if(y.type===k.type){Rl(k);const T=k.component.da;T&&kt(T,x);return}p(y)})}),()=>{if(b=null,!t.default)return null;const y=t.default(),w=y[0];if(y.length>1)return a=null,y;if(!$n(w)||!(w.shapeFlag&4)&&!(w.shapeFlag&128))return a=null,w;let x=Il(w);const k=x.type,T=ks(bn(x)?x.type.__asyncResolved||{}:k),{include:S,exclude:$,max:R}=e;if(S&&(!T||!ei(S,T))||$&&T&&ei($,T))return a=x,w;const _=x.key==null?k:x.key,N=n.get(_);return x.el&&(x=lr(x),w.shapeFlag&128&&(w.ssContent=x)),b=_,N?(x.el=N.el,x.component=N.component,x.transition&&Sn(x,x.transition),x.shapeFlag|=512,i.delete(_),i.add(_)):(i.add(_),R&&i.size>parseInt(R,10)&&g(i.values().next().value)),x.shapeFlag|=256,a=x,op(w.type)?w:x}}},R1=E1;function ei(e,t){return ke(e)?e.some(r=>ei(r,t)):ft(e)?e.split(",").includes(t):e.test?e.test(t):!1}function sp(e,t){dp(e,"a",t)}function cp(e,t){dp(e,"da",t)}function dp(e,t,r=$t){const o=e.__wdc||(e.__wdc=()=>{let n=r;for(;n;){if(n.isDeactivated)return;n=n.parent}return e()});if(Za(t,o,r),r){let n=r.parent;for(;n&&n.parent;)Xa(n.parent.vnode)&&I1(o,t,r,n),n=n.parent}}function I1(e,t,r,o){const n=Za(t,e,o,!0);_c(()=>{dc(o[t],n)},r)}function Rl(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function Il(e){return e.shapeFlag&128?e.ssContent:e}function Za(e,t,r=$t,o=!1){if(r){const n=r[e]||(r[e]=[]),i=t.__weh||(t.__weh=(...a)=>{if(r.isUnmounted)return;An(),_n(r);const l=ir(t,r,e,a);return Oo(),Mn(),l});return o?n.unshift(i):n.push(i),i}}const jr=e=>(t,r=$t)=>(!wi||e==="sp")&&Za(e,(...o)=>t(...o),r),Nr=jr("bm"),gt=jr("m"),O1=jr("bu"),$c=jr("u"),ht=jr("bum"),_c=jr("um"),A1=jr("sp"),M1=jr("rtg"),B1=jr("rtc");function L1(e,t=$t){Za("ec",e,t)}function Tr(e,t){const r=Rt;if(r===null)return e;const o=el(r)||r.proxy,n=e.dirs||(e.dirs=[]);for(let i=0;it(a,l,void 0,i&&i[l]));else{const a=Object.keys(e);n=new Array(a.length);for(let l=0,s=a.length;l{const i=o.fn(...n);return i&&(i.key=o.key),i}:o.fn)}return e}function D1(e,t,r={},o,n){if(Rt.isCE||Rt.parent&&bn(Rt.parent)&&Rt.parent.isCE)return t!=="default"&&(r.name=t),be("slot",r,o&&o());let i=e[t];i&&i._c&&(i._d=!1),lt();const a=i&&pp(i(r)),l=ko(Je,{key:r.key||a&&a.key||`_${t}`},a||(o?o():[]),a&&e._===1?64:-2);return!n&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),i&&i._c&&(i._d=!0),l}function pp(e){return e.some(t=>$n(t)?!(t.type===Dt||t.type===Je&&!pp(t.children)):!0)?e:null}const Cs=e=>e?kp(e)?el(e)||e.proxy:Cs(e.parent):null,ii=_t(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Cs(e.parent),$root:e=>Cs(e.root),$emit:e=>e.emit,$options:e=>kc(e),$forceUpdate:e=>e.f||(e.f=()=>yc(e.update)),$nextTick:e=>e.n||(e.n=Zt.bind(e.proxy)),$watch:e=>T1.bind(e)}),Ol=(e,t)=>e!==nt&&!e.__isScriptSetup&&Ve(e,t),F1={get({_:e},t){const{ctx:r,setupState:o,data:n,props:i,accessCache:a,type:l,appContext:s}=e;let d;if(t[0]!=="$"){const p=a[t];if(p!==void 0)switch(p){case 1:return o[t];case 2:return n[t];case 4:return r[t];case 3:return i[t]}else{if(Ol(o,t))return a[t]=1,o[t];if(n!==nt&&Ve(n,t))return a[t]=2,n[t];if((d=e.propsOptions[0])&&Ve(d,t))return a[t]=3,i[t];if(r!==nt&&Ve(r,t))return a[t]=4,r[t];ys&&(a[t]=0)}}const c=ii[t];let u,f;if(c)return t==="$attrs"&&Qt(e,"get",t),c(e);if((u=l.__cssModules)&&(u=u[t]))return u;if(r!==nt&&Ve(r,t))return a[t]=4,r[t];if(f=s.config.globalProperties,Ve(f,t))return f[t]},set({_:e},t,r){const{data:o,setupState:n,ctx:i}=e;return Ol(n,t)?(n[t]=r,!0):o!==nt&&Ve(o,t)?(o[t]=r,!0):Ve(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=r,!0)},has({_:{data:e,setupState:t,accessCache:r,ctx:o,appContext:n,propsOptions:i}},a){let l;return!!r[a]||e!==nt&&Ve(e,a)||Ol(t,a)||(l=i[0])&&Ve(l,a)||Ve(o,a)||Ve(ii,a)||Ve(n.config.globalProperties,a)},defineProperty(e,t,r){return r.get!=null?e._.accessCache[t]=0:Ve(r,"value")&&this.set(e,t,r.value,null),Reflect.defineProperty(e,t,r)}};let ys=!0;function j1(e){const t=kc(e),r=e.proxy,o=e.ctx;ys=!1,t.beforeCreate&&Wd(t.beforeCreate,e,"bc");const{data:n,computed:i,methods:a,watch:l,provide:s,inject:d,created:c,beforeMount:u,mounted:f,beforeUpdate:p,updated:h,activated:g,deactivated:b,beforeDestroy:m,beforeUnmount:y,destroyed:w,unmounted:x,render:k,renderTracked:T,renderTriggered:S,errorCaptured:$,serverPrefetch:R,expose:_,inheritAttrs:N,components:E,directives:F,filters:j}=t;if(d&&N1(d,o,null,e.appContext.config.unwrapInjectedRef),a)for(const X in a){const ne=a[X];Oe(ne)&&(o[X]=ne.bind(r))}if(n){const X=n.call(r,r);it(X)&&(e.data=vr(X))}if(ys=!0,i)for(const X in i){const ne=i[X],pe=Oe(ne)?ne.bind(r,r):Oe(ne.get)?ne.get.bind(r,r):pr,Ce=!Oe(ne)&&Oe(ne.set)?ne.set.bind(r):pr,$e=H({get:pe,set:Ce});Object.defineProperty(o,X,{enumerable:!0,configurable:!0,get:()=>$e.value,set:_e=>$e.value=_e})}if(l)for(const X in l)vp(l[X],o,r,X);if(s){const X=Oe(s)?s.call(r):s;Reflect.ownKeys(X).forEach(ne=>{Be(ne,X[ne])})}c&&Wd(c,e,"c");function A(X,ne){ke(ne)?ne.forEach(pe=>X(pe.bind(r))):ne&&X(ne.bind(r))}if(A(Nr,u),A(gt,f),A(O1,p),A($c,h),A(sp,g),A(cp,b),A(L1,$),A(B1,T),A(M1,S),A(ht,y),A(_c,x),A(A1,R),ke(_))if(_.length){const X=e.exposed||(e.exposed={});_.forEach(ne=>{Object.defineProperty(X,ne,{get:()=>r[ne],set:pe=>r[ne]=pe})})}else e.exposed||(e.exposed={});k&&e.render===pr&&(e.render=k),N!=null&&(e.inheritAttrs=N),E&&(e.components=E),F&&(e.directives=F)}function N1(e,t,r=pr,o=!1){ke(e)&&(e=ws(e));for(const n in e){const i=e[n];let a;it(i)?"default"in i?a=me(i.from||n,i.default,!0):a=me(i.from||n):a=me(i),Et(a)&&o?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>a.value,set:l=>a.value=l}):t[n]=a}}function Wd(e,t,r){ir(ke(e)?e.map(o=>o.bind(t.proxy)):e.bind(t.proxy),t,r)}function vp(e,t,r,o){const n=o.includes(".")?np(r,o):()=>r[o];if(ft(e)){const i=t[e];Oe(i)&&De(n,i)}else if(Oe(e))De(n,e.bind(r));else if(it(e))if(ke(e))e.forEach(i=>vp(i,t,r,o));else{const i=Oe(e.handler)?e.handler.bind(r):t[e.handler];Oe(i)&&De(n,i,e)}}function kc(e){const t=e.type,{mixins:r,extends:o}=t,{mixins:n,optionsCache:i,config:{optionMergeStrategies:a}}=e.appContext,l=i.get(t);let s;return l?s=l:!n.length&&!r&&!o?s=t:(s={},n.length&&n.forEach(d=>Ta(s,d,a,!0)),Ta(s,t,a)),it(t)&&i.set(t,s),s}function Ta(e,t,r,o=!1){const{mixins:n,extends:i}=t;i&&Ta(e,i,r,!0),n&&n.forEach(a=>Ta(e,a,r,!0));for(const a in t)if(!(o&&a==="expose")){const l=W1[a]||r&&r[a];e[a]=l?l(e[a],t[a]):t[a]}return e}const W1={data:Vd,props:Co,emits:Co,methods:Co,computed:Co,beforeCreate:Ht,created:Ht,beforeMount:Ht,mounted:Ht,beforeUpdate:Ht,updated:Ht,beforeDestroy:Ht,beforeUnmount:Ht,destroyed:Ht,unmounted:Ht,activated:Ht,deactivated:Ht,errorCaptured:Ht,serverPrefetch:Ht,components:Co,directives:Co,watch:U1,provide:Vd,inject:V1};function Vd(e,t){return t?e?function(){return _t(Oe(e)?e.call(this,this):e,Oe(t)?t.call(this,this):t)}:t:e}function V1(e,t){return Co(ws(e),ws(t))}function ws(e){if(ke(e)){const t={};for(let r=0;r0)&&!(a&16)){if(a&8){const c=e.vnode.dynamicProps;for(let u=0;u{s=!0;const[f,p]=gp(u,t,!0);_t(a,f),p&&l.push(...p)};!r&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!i&&!s)return it(e)&&o.set(e,hn),hn;if(ke(i))for(let c=0;c-1,p[1]=g<0||h-1||Ve(p,"default"))&&l.push(u)}}}const d=[a,l];return it(e)&&o.set(e,d),d}function Ud(e){return e[0]!=="$"}function Kd(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function qd(e,t){return Kd(e)===Kd(t)}function Gd(e,t){return ke(t)?t.findIndex(r=>qd(r,e)):Oe(t)&&qd(t,e)?0:-1}const bp=e=>e[0]==="_"||e==="$stable",Tc=e=>ke(e)?e.map(Sr):[Sr(e)],G1=(e,t,r)=>{if(t._n)return t;const o=qe((...n)=>Tc(t(...n)),r);return o._c=!1,o},xp=(e,t,r)=>{const o=e._ctx;for(const n in e){if(bp(n))continue;const i=e[n];if(Oe(i))t[n]=G1(n,i,o);else if(i!=null){const a=Tc(i);t[n]=()=>a}}},Cp=(e,t)=>{const r=Tc(t);e.slots.default=()=>r},Y1=(e,t)=>{if(e.vnode.shapeFlag&32){const r=t._;r?(e.slots=Ke(t),$a(t,"_",r)):xp(t,e.slots={})}else e.slots={},t&&Cp(e,t);$a(e.slots,Qa,1)},X1=(e,t,r)=>{const{vnode:o,slots:n}=e;let i=!0,a=nt;if(o.shapeFlag&32){const l=t._;l?r&&l===1?i=!1:(_t(n,t),!r&&l===1&&delete n._):(i=!t.$stable,xp(t,n)),a=t}else t&&(Cp(e,t),a={default:1});if(i)for(const l in n)!bp(l)&&!(l in a)&&delete n[l]};function yp(){return{app:null,config:{isNativeTag:E0,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Z1=0;function J1(e,t){return function(o,n=null){Oe(o)||(o=Object.assign({},o)),n!=null&&!it(n)&&(n=null);const i=yp(),a=new Set;let l=!1;const s=i.app={_uid:Z1++,_component:o,_props:n,_container:null,_context:i,_instance:null,version:bx,get config(){return i.config},set config(d){},use(d,...c){return a.has(d)||(d&&Oe(d.install)?(a.add(d),d.install(s,...c)):Oe(d)&&(a.add(d),d(s,...c))),s},mixin(d){return i.mixins.includes(d)||i.mixins.push(d),s},component(d,c){return c?(i.components[d]=c,s):i.components[d]},directive(d,c){return c?(i.directives[d]=c,s):i.directives[d]},mount(d,c,u){if(!l){const f=be(o,n);return f.appContext=i,c&&t?t(f,d):e(f,d,u),l=!0,s._container=d,d.__vue_app__=s,el(f.component)||f.component.proxy}},unmount(){l&&(e(null,s._container),delete s._container.__vue_app__)},provide(d,c){return i.provides[d]=c,s}};return s}}function $s(e,t,r,o,n=!1){if(ke(e)){e.forEach((f,p)=>$s(f,t&&(ke(t)?t[p]:t),r,o,n));return}if(bn(o)&&!n)return;const i=o.shapeFlag&4?el(o.component)||o.component.proxy:o.el,a=n?null:i,{i:l,r:s}=e,d=t&&t.r,c=l.refs===nt?l.refs={}:l.refs,u=l.setupState;if(d!=null&&d!==s&&(ft(d)?(c[d]=null,Ve(u,d)&&(u[d]=null)):Et(d)&&(d.value=null)),Oe(s))oo(s,l,12,[a,c]);else{const f=ft(s),p=Et(s);if(f||p){const h=()=>{if(e.f){const g=f?Ve(u,s)?u[s]:c[s]:s.value;n?ke(g)&&dc(g,i):ke(g)?g.includes(i)||g.push(i):f?(c[s]=[i],Ve(u,s)&&(u[s]=c[s])):(s.value=[i],e.k&&(c[e.k]=s.value))}else f?(c[s]=a,Ve(u,s)&&(u[s]=a)):p&&(s.value=a,e.k&&(c[e.k]=a))};a?(h.id=-1,kt(h,r)):h()}}}const kt=k1;function Q1(e){return ex(e)}function ex(e,t){const r=B0();r.__VUE__=!0;const{insert:o,remove:n,patchProp:i,createElement:a,createText:l,createComment:s,setText:d,setElementText:c,parentNode:u,nextSibling:f,setScopeId:p=pr,insertStaticContent:h}=e,g=(C,P,I,W=null,z=null,L=null,Y=!1,q=null,J=!!P.dynamicChildren)=>{if(C===P)return;C&&!$o(C,P)&&(W=G(C),_e(C,z,L,!0),C=null),P.patchFlag===-2&&(J=!1,P.dynamicChildren=null);const{type:Z,ref:fe,shapeFlag:de}=P;switch(Z){case Ja:b(C,P,I,W);break;case Dt:m(C,P,I,W);break;case ga:C==null&&y(P,I,W,Y);break;case Je:E(C,P,I,W,z,L,Y,q,J);break;default:de&1?k(C,P,I,W,z,L,Y,q,J):de&6?F(C,P,I,W,z,L,Y,q,J):(de&64||de&128)&&Z.process(C,P,I,W,z,L,Y,q,J,ce)}fe!=null&&z&&$s(fe,C&&C.ref,L,P||C,!P)},b=(C,P,I,W)=>{if(C==null)o(P.el=l(P.children),I,W);else{const z=P.el=C.el;P.children!==C.children&&d(z,P.children)}},m=(C,P,I,W)=>{C==null?o(P.el=s(P.children||""),I,W):P.el=C.el},y=(C,P,I,W)=>{[C.el,C.anchor]=h(C.children,P,I,W,C.el,C.anchor)},w=({el:C,anchor:P},I,W)=>{let z;for(;C&&C!==P;)z=f(C),o(C,I,W),C=z;o(P,I,W)},x=({el:C,anchor:P})=>{let I;for(;C&&C!==P;)I=f(C),n(C),C=I;n(P)},k=(C,P,I,W,z,L,Y,q,J)=>{Y=Y||P.type==="svg",C==null?T(P,I,W,z,L,Y,q,J):R(C,P,z,L,Y,q,J)},T=(C,P,I,W,z,L,Y,q)=>{let J,Z;const{type:fe,props:de,shapeFlag:he,transition:we,dirs:Ie}=C;if(J=C.el=a(C.type,L,de&&de.is,de),he&8?c(J,C.children):he&16&&$(C.children,J,null,W,z,L&&fe!=="foreignObject",Y,q),Ie&&vo(C,null,W,"created"),de){for(const Fe in de)Fe!=="value"&&!ma(Fe)&&i(J,Fe,null,de[Fe],L,C.children,W,z,ee);"value"in de&&i(J,"value",null,de.value),(Z=de.onVnodeBeforeMount)&&nr(Z,W,C)}S(J,C,C.scopeId,Y,W),Ie&&vo(C,null,W,"beforeMount");const Ne=(!z||z&&!z.pendingBranch)&&we&&!we.persisted;Ne&&we.beforeEnter(J),o(J,P,I),((Z=de&&de.onVnodeMounted)||Ne||Ie)&&kt(()=>{Z&&nr(Z,W,C),Ne&&we.enter(J),Ie&&vo(C,null,W,"mounted")},z)},S=(C,P,I,W,z)=>{if(I&&p(C,I),W)for(let L=0;L{for(let Z=J;Z{const q=P.el=C.el;let{patchFlag:J,dynamicChildren:Z,dirs:fe}=P;J|=C.patchFlag&16;const de=C.props||nt,he=P.props||nt;let we;I&&mo(I,!1),(we=he.onVnodeBeforeUpdate)&&nr(we,I,P,C),fe&&vo(P,C,I,"beforeUpdate"),I&&mo(I,!0);const Ie=z&&P.type!=="foreignObject";if(Z?_(C.dynamicChildren,Z,q,I,W,Ie,L):Y||ne(C,P,q,null,I,W,Ie,L,!1),J>0){if(J&16)N(q,P,de,he,I,W,z);else if(J&2&&de.class!==he.class&&i(q,"class",null,he.class,z),J&4&&i(q,"style",de.style,he.style,z),J&8){const Ne=P.dynamicProps;for(let Fe=0;Fe{we&&nr(we,I,P,C),fe&&vo(P,C,I,"updated")},W)},_=(C,P,I,W,z,L,Y)=>{for(let q=0;q{if(I!==W){if(I!==nt)for(const q in I)!ma(q)&&!(q in W)&&i(C,q,I[q],null,Y,P.children,z,L,ee);for(const q in W){if(ma(q))continue;const J=W[q],Z=I[q];J!==Z&&q!=="value"&&i(C,q,Z,J,Y,P.children,z,L,ee)}"value"in W&&i(C,"value",I.value,W.value)}},E=(C,P,I,W,z,L,Y,q,J)=>{const Z=P.el=C?C.el:l(""),fe=P.anchor=C?C.anchor:l("");let{patchFlag:de,dynamicChildren:he,slotScopeIds:we}=P;we&&(q=q?q.concat(we):we),C==null?(o(Z,I,W),o(fe,I,W),$(P.children,I,fe,z,L,Y,q,J)):de>0&&de&64&&he&&C.dynamicChildren?(_(C.dynamicChildren,he,I,z,L,Y,q),(P.key!=null||z&&P===z.subTree)&&zc(C,P,!0)):ne(C,P,I,fe,z,L,Y,q,J)},F=(C,P,I,W,z,L,Y,q,J)=>{P.slotScopeIds=q,C==null?P.shapeFlag&512?z.ctx.activate(P,I,W,Y,J):j(P,I,W,z,L,Y,J):Q(C,P,J)},j=(C,P,I,W,z,L,Y)=>{const q=C.component=dx(C,W,z);if(Xa(C)&&(q.ctx.renderer=ce),ux(q),q.asyncDep){if(z&&z.registerDep(q,A),!C.el){const J=q.subTree=be(Dt);m(null,J,P,I)}return}A(q,C,P,I,z,L,Y)},Q=(C,P,I)=>{const W=P.component=C.component;if(_1(C,P,I))if(W.asyncDep&&!W.asyncResolved){X(W,P,I);return}else W.next=P,x1(W.update),W.update();else P.el=C.el,W.vnode=P},A=(C,P,I,W,z,L,Y)=>{const q=()=>{if(C.isMounted){let{next:fe,bu:de,u:he,parent:we,vnode:Ie}=C,Ne=fe,Fe;mo(C,!1),fe?(fe.el=Ie.el,X(C,fe,Y)):fe=Ie,de&&vn(de),(Fe=fe.props&&fe.props.onVnodeBeforeUpdate)&&nr(Fe,we,fe,Ie),mo(C,!0);const et=zl(C),xt=C.subTree;C.subTree=et,g(xt,et,u(xt.el),G(xt),C,z,L),fe.el=et.el,Ne===null&&P1(C,et.el),he&&kt(he,z),(Fe=fe.props&&fe.props.onVnodeUpdated)&&kt(()=>nr(Fe,we,fe,Ie),z)}else{let fe;const{el:de,props:he}=P,{bm:we,m:Ie,parent:Ne}=C,Fe=bn(P);if(mo(C,!1),we&&vn(we),!Fe&&(fe=he&&he.onVnodeBeforeMount)&&nr(fe,Ne,P),mo(C,!0),de&&ge){const et=()=>{C.subTree=zl(C),ge(de,C.subTree,C,z,null)};Fe?P.type.__asyncLoader().then(()=>!C.isUnmounted&&et()):et()}else{const et=C.subTree=zl(C);g(null,et,I,W,C,z,L),P.el=et.el}if(Ie&&kt(Ie,z),!Fe&&(fe=he&&he.onVnodeMounted)){const et=P;kt(()=>nr(fe,Ne,et),z)}(P.shapeFlag&256||Ne&&bn(Ne.vnode)&&Ne.vnode.shapeFlag&256)&&C.a&&kt(C.a,z),C.isMounted=!0,P=I=W=null}},J=C.effect=new pc(q,()=>yc(Z),C.scope),Z=C.update=()=>J.run();Z.id=C.uid,mo(C,!0),Z()},X=(C,P,I)=>{P.component=C;const W=C.vnode.props;C.vnode=P,C.next=null,q1(C,P.props,W,I),X1(C,P.children,I),An(),Hd(),Mn()},ne=(C,P,I,W,z,L,Y,q,J=!1)=>{const Z=C&&C.children,fe=C?C.shapeFlag:0,de=P.children,{patchFlag:he,shapeFlag:we}=P;if(he>0){if(he&128){Ce(Z,de,I,W,z,L,Y,q,J);return}else if(he&256){pe(Z,de,I,W,z,L,Y,q,J);return}}we&8?(fe&16&&ee(Z,z,L),de!==Z&&c(I,de)):fe&16?we&16?Ce(Z,de,I,W,z,L,Y,q,J):ee(Z,z,L,!0):(fe&8&&c(I,""),we&16&&$(de,I,W,z,L,Y,q,J))},pe=(C,P,I,W,z,L,Y,q,J)=>{C=C||hn,P=P||hn;const Z=C.length,fe=P.length,de=Math.min(Z,fe);let he;for(he=0;hefe?ee(C,z,L,!0,!1,de):$(P,I,W,z,L,Y,q,J,de)},Ce=(C,P,I,W,z,L,Y,q,J)=>{let Z=0;const fe=P.length;let de=C.length-1,he=fe-1;for(;Z<=de&&Z<=he;){const we=C[Z],Ie=P[Z]=J?eo(P[Z]):Sr(P[Z]);if($o(we,Ie))g(we,Ie,I,null,z,L,Y,q,J);else break;Z++}for(;Z<=de&&Z<=he;){const we=C[de],Ie=P[he]=J?eo(P[he]):Sr(P[he]);if($o(we,Ie))g(we,Ie,I,null,z,L,Y,q,J);else break;de--,he--}if(Z>de){if(Z<=he){const we=he+1,Ie=wehe)for(;Z<=de;)_e(C[Z],z,L,!0),Z++;else{const we=Z,Ie=Z,Ne=new Map;for(Z=Ie;Z<=he;Z++){const bt=P[Z]=J?eo(P[Z]):Sr(P[Z]);bt.key!=null&&Ne.set(bt.key,Z)}let Fe,et=0;const xt=he-Ie+1;let Ft=!1,qr=0;const er=new Array(xt);for(Z=0;Z=xt){_e(bt,z,L,!0);continue}let re;if(bt.key!=null)re=Ne.get(bt.key);else for(Fe=Ie;Fe<=he;Fe++)if(er[Fe-Ie]===0&&$o(bt,P[Fe])){re=Fe;break}re===void 0?_e(bt,z,L,!0):(er[re-Ie]=Z+1,re>=qr?qr=re:Ft=!0,g(bt,P[re],I,null,z,L,Y,q,J),et++)}const Gt=Ft?tx(er):hn;for(Fe=Gt.length-1,Z=xt-1;Z>=0;Z--){const bt=Ie+Z,re=P[bt],ve=bt+1{const{el:L,type:Y,transition:q,children:J,shapeFlag:Z}=C;if(Z&6){$e(C.component.subTree,P,I,W);return}if(Z&128){C.suspense.move(P,I,W);return}if(Z&64){Y.move(C,P,I,ce);return}if(Y===Je){o(L,P,I);for(let de=0;deq.enter(L),z);else{const{leave:de,delayLeave:he,afterLeave:we}=q,Ie=()=>o(L,P,I),Ne=()=>{de(L,()=>{Ie(),we&&we()})};he?he(L,Ie,Ne):Ne()}else o(L,P,I)},_e=(C,P,I,W=!1,z=!1)=>{const{type:L,props:Y,ref:q,children:J,dynamicChildren:Z,shapeFlag:fe,patchFlag:de,dirs:he}=C;if(q!=null&&$s(q,null,I,C,!0),fe&256){P.ctx.deactivate(C);return}const we=fe&1&&he,Ie=!bn(C);let Ne;if(Ie&&(Ne=Y&&Y.onVnodeBeforeUnmount)&&nr(Ne,P,C),fe&6)U(C.component,I,W);else{if(fe&128){C.suspense.unmount(I,W);return}we&&vo(C,null,P,"beforeUnmount"),fe&64?C.type.remove(C,P,I,z,ce,W):Z&&(L!==Je||de>0&&de&64)?ee(Z,P,I,!1,!0):(L===Je&&de&384||!z&&fe&16)&&ee(J,P,I),W&&Ge(C)}(Ie&&(Ne=Y&&Y.onVnodeUnmounted)||we)&&kt(()=>{Ne&&nr(Ne,P,C),we&&vo(C,null,P,"unmounted")},I)},Ge=C=>{const{type:P,el:I,anchor:W,transition:z}=C;if(P===Je){Le(I,W);return}if(P===ga){x(C);return}const L=()=>{n(I),z&&!z.persisted&&z.afterLeave&&z.afterLeave()};if(C.shapeFlag&1&&z&&!z.persisted){const{leave:Y,delayLeave:q}=z,J=()=>Y(I,L);q?q(C.el,L,J):J()}else L()},Le=(C,P)=>{let I;for(;C!==P;)I=f(C),n(C),C=I;n(P)},U=(C,P,I)=>{const{bum:W,scope:z,update:L,subTree:Y,um:q}=C;W&&vn(W),z.stop(),L&&(L.active=!1,_e(Y,C,P,I)),q&&kt(q,P),kt(()=>{C.isUnmounted=!0},P),P&&P.pendingBranch&&!P.isUnmounted&&C.asyncDep&&!C.asyncResolved&&C.suspenseId===P.pendingId&&(P.deps--,P.deps===0&&P.resolve())},ee=(C,P,I,W=!1,z=!1,L=0)=>{for(let Y=L;YC.shapeFlag&6?G(C.component.subTree):C.shapeFlag&128?C.suspense.next():f(C.anchor||C.el),se=(C,P,I)=>{C==null?P._vnode&&_e(P._vnode,null,null,!0):g(P._vnode||null,C,P,null,null,null,I),Hd(),ep(),P._vnode=C},ce={p:g,um:_e,m:$e,r:Ge,mt:j,mc:$,pc:ne,pbc:_,n:G,o:e};let Re,ge;return t&&([Re,ge]=t(ce)),{render:se,hydrate:Re,createApp:J1(se,Re)}}function mo({effect:e,update:t},r){e.allowRecurse=t.allowRecurse=r}function zc(e,t,r=!1){const o=e.children,n=t.children;if(ke(o)&&ke(n))for(let i=0;i>1,e[r[l]]0&&(t[o]=r[i-1]),r[i]=o)}}for(i=r.length,a=r[i-1];i-- >0;)r[i]=a,a=t[a];return r}const rx=e=>e.__isTeleport,ai=e=>e&&(e.disabled||e.disabled===""),Yd=e=>typeof SVGElement!="undefined"&&e instanceof SVGElement,_s=(e,t)=>{const r=e&&e.to;return ft(r)?t?t(r):null:r},ox={__isTeleport:!0,process(e,t,r,o,n,i,a,l,s,d){const{mc:c,pc:u,pbc:f,o:{insert:p,querySelector:h,createText:g,createComment:b}}=d,m=ai(t.props);let{shapeFlag:y,children:w,dynamicChildren:x}=t;if(e==null){const k=t.el=g(""),T=t.anchor=g("");p(k,r,o),p(T,r,o);const S=t.target=_s(t.props,h),$=t.targetAnchor=g("");S&&(p($,S),a=a||Yd(S));const R=(_,N)=>{y&16&&c(w,_,N,n,i,a,l,s)};m?R(r,T):S&&R(S,$)}else{t.el=e.el;const k=t.anchor=e.anchor,T=t.target=e.target,S=t.targetAnchor=e.targetAnchor,$=ai(e.props),R=$?r:T,_=$?k:S;if(a=a||Yd(T),x?(f(e.dynamicChildren,x,R,n,i,a,l),zc(e,t,!0)):s||u(e,t,R,_,n,i,a,l,!1),m)$||Qi(t,r,k,d,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const N=t.target=_s(t.props,h);N&&Qi(t,N,null,d,0)}else $&&Qi(t,T,S,d,1)}Sp(t)},remove(e,t,r,o,{um:n,o:{remove:i}},a){const{shapeFlag:l,children:s,anchor:d,targetAnchor:c,target:u,props:f}=e;if(u&&i(c),(a||!ai(f))&&(i(d),l&16))for(let p=0;p0?hr||hn:null,ix(),yi>0&&hr&&hr.push(e),e}function It(e,t,r,o,n,i){return $p(Me(e,t,r,o,n,i,!0))}function ko(e,t,r,o,n){return $p(be(e,t,r,o,n,!0))}function $n(e){return e?e.__v_isVNode===!0:!1}function $o(e,t){return e.type===t.type&&e.key===t.key}const Qa="__vInternal",_p=({key:e})=>e!=null?e:null,ba=({ref:e,ref_key:t,ref_for:r})=>e!=null?ft(e)||Et(e)||Oe(e)?{i:Rt,r:e,k:t,f:!!r}:e:null;function Me(e,t=null,r=null,o=0,n=null,i=e===Je?0:1,a=!1,l=!1){const s={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&_p(t),ref:t&&ba(t),scopeId:Ya,slotScopeIds:null,children:r,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:o,dynamicProps:n,dynamicChildren:null,appContext:null,ctx:Rt};return l?(Ec(s,r),i&128&&e.normalize(s)):r&&(s.shapeFlag|=ft(r)?8:16),yi>0&&!a&&hr&&(s.patchFlag>0||i&6)&&s.patchFlag!==32&&hr.push(s),s}const be=ax;function ax(e,t=null,r=null,o=0,n=null,i=!1){if((!e||e===fp)&&(e=Dt),$n(e)){const l=lr(e,t,!0);return r&&Ec(l,r),yi>0&&!i&&hr&&(l.shapeFlag&6?hr[hr.indexOf(e)]=l:hr.push(l)),l.patchFlag|=-2,l}if(vx(e)&&(e=e.__vccOpts),t){t=lx(t);let{class:l,style:s}=t;l&&!ft(l)&&(t.class=ja(l)),it(s)&&(Kh(s)&&!ke(s)&&(s=_t({},s)),t.style=Fa(s))}const a=ft(e)?1:op(e)?128:rx(e)?64:it(e)?4:Oe(e)?2:0;return Me(e,t,r,o,n,a,i,!0)}function lx(e){return e?Kh(e)||Qa in e?_t({},e):e:null}function lr(e,t,r=!1){const{props:o,ref:n,patchFlag:i,children:a}=e,l=t?so(o||{},t):o;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&_p(l),ref:t&&t.ref?r&&n?ke(n)?n.concat(ba(t)):[n,ba(t)]:ba(t):n,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Je?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&lr(e.ssContent),ssFallback:e.ssFallback&&lr(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx}}function mr(e=" ",t=0){return be(Ja,null,e,t)}function Pp(e,t){const r=be(ga,null,e);return r.staticCount=t,r}function Ps(e="",t=!1){return t?(lt(),ko(Dt,null,e)):be(Dt,null,e)}function Sr(e){return e==null||typeof e=="boolean"?be(Dt):ke(e)?be(Je,null,e.slice()):typeof e=="object"?eo(e):be(Ja,null,String(e))}function eo(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:lr(e)}function Ec(e,t){let r=0;const{shapeFlag:o}=e;if(t==null)t=null;else if(ke(t))r=16;else if(typeof t=="object")if(o&65){const n=t.default;n&&(n._c&&(n._d=!1),Ec(e,n()),n._c&&(n._d=!0));return}else{r=32;const n=t._;!n&&!(Qa in t)?t._ctx=Rt:n===3&&Rt&&(Rt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Oe(t)?(t={default:t,_ctx:Rt},r=32):(t=String(t),o&64?(r=16,t=[mr(t)]):r=8);e.children=t,e.shapeFlag|=r}function so(...e){const t={};for(let r=0;r$t||Rt,_n=e=>{$t=e,e.scope.on()},Oo=()=>{$t&&$t.scope.off(),$t=null};function kp(e){return e.vnode.shapeFlag&4}let wi=!1;function ux(e,t=!1){wi=t;const{props:r,children:o}=e.vnode,n=kp(e);K1(e,r,n,t),Y1(e,o);const i=n?fx(e,t):void 0;return wi=!1,i}function fx(e,t){const r=e.type;e.accessCache=Object.create(null),e.proxy=Pa(new Proxy(e.ctx,F1));const{setup:o}=r;if(o){const n=e.setupContext=o.length>1?px(e):null;_n(e),An();const i=oo(o,e,0,[e.props,n]);if(Mn(),Oo(),Ih(i)){if(i.then(Oo,Oo),t)return i.then(a=>{Zd(e,a,t)}).catch(a=>{qa(a,e,0)});e.asyncDep=i}else Zd(e,i,t)}else Tp(e,t)}function Zd(e,t,r){Oe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:it(t)&&(e.setupState=Xh(t)),Tp(e,r)}let Jd;function Tp(e,t,r){const o=e.type;if(!e.render){if(!t&&Jd&&!o.render){const n=o.template||kc(e).template;if(n){const{isCustomElement:i,compilerOptions:a}=e.appContext.config,{delimiters:l,compilerOptions:s}=o,d=_t(_t({isCustomElement:i,delimiters:l},a),s);o.render=Jd(n,d)}}e.render=o.render||pr}_n(e),An(),j1(e),Mn(),Oo()}function hx(e){return new Proxy(e.attrs,{get(t,r){return Qt(e,"get","$attrs"),t[r]}})}function px(e){const t=o=>{e.exposed=o||{}};let r;return{get attrs(){return r||(r=hx(e))},slots:e.slots,emit:e.emit,expose:t}}function el(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Xh(Pa(e.exposed)),{get(t,r){if(r in t)return t[r];if(r in ii)return ii[r](e)},has(t,r){return r in t||r in ii}}))}function ks(e,t=!0){return Oe(e)?e.displayName||e.name:e.name||t&&e.__name}function vx(e){return Oe(e)&&"__vccOpts"in e}const H=(e,t)=>m1(e,t,wi);function v(e,t,r){const o=arguments.length;return o===2?it(t)&&!ke(t)?$n(t)?be(e,null,[t]):be(e,t):be(e,null,t):(o>3?r=Array.prototype.slice.call(arguments,2):o===3&&$n(r)&&(r=[r]),be(e,t,r))}const mx=Symbol(""),gx=()=>me(mx),bx="3.2.45",xx="http://www.w3.org/2000/svg",_o=typeof document!="undefined"?document:null,Qd=_o&&_o.createElement("template"),Cx={insert:(e,t,r)=>{t.insertBefore(e,r||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,r,o)=>{const n=t?_o.createElementNS(xx,e):_o.createElement(e,r?{is:r}:void 0);return e==="select"&&o&&o.multiple!=null&&n.setAttribute("multiple",o.multiple),n},createText:e=>_o.createTextNode(e),createComment:e=>_o.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>_o.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,r,o,n,i){const a=r?r.previousSibling:t.lastChild;if(n&&(n===i||n.nextSibling))for(;t.insertBefore(n.cloneNode(!0),r),!(n===i||!(n=n.nextSibling)););else{Qd.innerHTML=o?`${e}`:e;const l=Qd.content;if(o){const s=l.firstChild;for(;s.firstChild;)l.appendChild(s.firstChild);l.removeChild(s)}t.insertBefore(l,r)}return[a?a.nextSibling:t.firstChild,r?r.previousSibling:t.lastChild]}};function yx(e,t,r){const o=e._vtc;o&&(t=(t?[t,...o]:[...o]).join(" ")),t==null?e.removeAttribute("class"):r?e.setAttribute("class",t):e.className=t}function wx(e,t,r){const o=e.style,n=ft(r);if(r&&!n){for(const i in r)Ts(o,i,r[i]);if(t&&!ft(t))for(const i in t)r[i]==null&&Ts(o,i,"")}else{const i=o.display;n?t!==r&&(o.cssText=r):t&&e.removeAttribute("style"),"_vod"in e&&(o.display=i)}}const eu=/\s*!important$/;function Ts(e,t,r){if(ke(r))r.forEach(o=>Ts(e,t,o));else if(r==null&&(r=""),t.startsWith("--"))e.setProperty(t,r);else{const o=Sx(e,t);eu.test(r)?e.setProperty(Ho(o),r.replace(eu,""),"important"):e[o]=r}}const tu=["Webkit","Moz","ms"],Al={};function Sx(e,t){const r=Al[t];if(r)return r;let o=Pr(t);if(o!=="filter"&&o in e)return Al[t]=o;o=Ua(o);for(let n=0;nMl||(zx.then(()=>Ml=0),Ml=Date.now());function Rx(e,t){const r=o=>{if(!o._vts)o._vts=Date.now();else if(o._vts<=r.attached)return;ir(Ix(o,r.value),t,5,[o])};return r.value=e,r.attached=Ex(),r}function Ix(e,t){if(ke(t)){const r=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{r.call(e),e._stopped=!0},t.map(o=>n=>!n._stopped&&o&&o(n))}else return t}const nu=/^on[a-z]/,Ox=(e,t,r,o,n=!1,i,a,l,s)=>{t==="class"?yx(e,o,n):t==="style"?wx(e,r,o):Na(t)?cc(t)||kx(e,t,r,o,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Ax(e,t,o,n))?_x(e,t,o,i,a,l,s):(t==="true-value"?e._trueValue=o:t==="false-value"&&(e._falseValue=o),$x(e,t,o,n))};function Ax(e,t,r,o){return o?!!(t==="innerHTML"||t==="textContent"||t in e&&nu.test(t)&&Oe(r)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||nu.test(t)&&ft(r)?!1:t in e}const Yr="transition",Un="animation",Bt=(e,{slots:t})=>v(ap,Ep(e),t);Bt.displayName="Transition";const zp={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Mx=Bt.props=_t({},ap.props,zp),go=(e,t=[])=>{ke(e)?e.forEach(r=>r(...t)):e&&e(...t)},iu=e=>e?ke(e)?e.some(t=>t.length>1):e.length>1:!1;function Ep(e){const t={};for(const E in e)E in zp||(t[E]=e[E]);if(e.css===!1)return t;const{name:r="v",type:o,duration:n,enterFromClass:i=`${r}-enter-from`,enterActiveClass:a=`${r}-enter-active`,enterToClass:l=`${r}-enter-to`,appearFromClass:s=i,appearActiveClass:d=a,appearToClass:c=l,leaveFromClass:u=`${r}-leave-from`,leaveActiveClass:f=`${r}-leave-active`,leaveToClass:p=`${r}-leave-to`}=e,h=Bx(n),g=h&&h[0],b=h&&h[1],{onBeforeEnter:m,onEnter:y,onEnterCancelled:w,onLeave:x,onLeaveCancelled:k,onBeforeAppear:T=m,onAppear:S=y,onAppearCancelled:$=w}=t,R=(E,F,j)=>{Qr(E,F?c:l),Qr(E,F?d:a),j&&j()},_=(E,F)=>{E._isLeaving=!1,Qr(E,u),Qr(E,p),Qr(E,f),F&&F()},N=E=>(F,j)=>{const Q=E?S:y,A=()=>R(F,E,j);go(Q,[F,A]),au(()=>{Qr(F,E?s:i),Mr(F,E?c:l),iu(Q)||lu(F,o,g,A)})};return _t(t,{onBeforeEnter(E){go(m,[E]),Mr(E,i),Mr(E,a)},onBeforeAppear(E){go(T,[E]),Mr(E,s),Mr(E,d)},onEnter:N(!1),onAppear:N(!0),onLeave(E,F){E._isLeaving=!0;const j=()=>_(E,F);Mr(E,u),Ip(),Mr(E,f),au(()=>{!E._isLeaving||(Qr(E,u),Mr(E,p),iu(x)||lu(E,o,b,j))}),go(x,[E,j])},onEnterCancelled(E){R(E,!1),go(w,[E])},onAppearCancelled(E){R(E,!0),go($,[E])},onLeaveCancelled(E){_(E),go(k,[E])}})}function Bx(e){if(e==null)return null;if(it(e))return[Bl(e.enter),Bl(e.leave)];{const t=Bl(e);return[t,t]}}function Bl(e){return mi(e)}function Mr(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.add(r)),(e._vtc||(e._vtc=new Set)).add(t)}function Qr(e,t){t.split(/\s+/).forEach(o=>o&&e.classList.remove(o));const{_vtc:r}=e;r&&(r.delete(t),r.size||(e._vtc=void 0))}function au(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Lx=0;function lu(e,t,r,o){const n=e._endId=++Lx,i=()=>{n===e._endId&&o()};if(r)return setTimeout(i,r);const{type:a,timeout:l,propCount:s}=Rp(e,t);if(!a)return o();const d=a+"end";let c=0;const u=()=>{e.removeEventListener(d,f),i()},f=p=>{p.target===e&&++c>=s&&u()};setTimeout(()=>{c(r[h]||"").split(", "),n=o(`${Yr}Delay`),i=o(`${Yr}Duration`),a=su(n,i),l=o(`${Un}Delay`),s=o(`${Un}Duration`),d=su(l,s);let c=null,u=0,f=0;t===Yr?a>0&&(c=Yr,u=a,f=i.length):t===Un?d>0&&(c=Un,u=d,f=s.length):(u=Math.max(a,d),c=u>0?a>d?Yr:Un:null,f=c?c===Yr?i.length:s.length:0);const p=c===Yr&&/\b(transform|all)(,|$)/.test(o(`${Yr}Property`).toString());return{type:c,timeout:u,propCount:f,hasTransform:p}}function su(e,t){for(;e.lengthcu(r)+cu(e[o])))}function cu(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function Ip(){return document.body.offsetHeight}const Op=new WeakMap,Ap=new WeakMap,Hx={name:"TransitionGroup",props:_t({},Mx,{tag:String,moveClass:String}),setup(e,{slots:t}){const r=Wr(),o=ip();let n,i;return $c(()=>{if(!n.length)return;const a=e.moveClass||`${e.name||"v"}-move`;if(!Nx(n[0].el,r.vnode.el,a))return;n.forEach(Dx),n.forEach(Fx);const l=n.filter(jx);Ip(),l.forEach(s=>{const d=s.el,c=d.style;Mr(d,a),c.transform=c.webkitTransform=c.transitionDuration="";const u=d._moveCb=f=>{f&&f.target!==d||(!f||/transform$/.test(f.propertyName))&&(d.removeEventListener("transitionend",u),d._moveCb=null,Qr(d,a))};d.addEventListener("transitionend",u)})}),()=>{const a=Ke(e),l=Ep(a);let s=a.tag||Je;n=i,i=t.default?Sc(t.default()):[];for(let d=0;d{a.split(/\s+/).forEach(l=>l&&o.classList.remove(l))}),r.split(/\s+/).forEach(a=>a&&o.classList.add(a)),o.style.display="none";const n=t.nodeType===1?t:t.parentNode;n.appendChild(o);const{hasTransform:i}=Rp(o);return n.removeChild(o),i}const du=e=>{const t=e.props["onUpdate:modelValue"]||!1;return ke(t)?r=>vn(t,r):t};function Wx(e){e.target.composing=!0}function uu(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const AM={created(e,{modifiers:{lazy:t,trim:r,number:o}},n){e._assign=du(n);const i=o||n.props&&n.props.type==="number";ln(e,t?"change":"input",a=>{if(a.target.composing)return;let l=e.value;r&&(l=l.trim()),i&&(l=mi(l)),e._assign(l)}),r&&ln(e,"change",()=>{e.value=e.value.trim()}),t||(ln(e,"compositionstart",Wx),ln(e,"compositionend",uu),ln(e,"change",uu))},mounted(e,{value:t}){e.value=t==null?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:r,trim:o,number:n}},i){if(e._assign=du(i),e.composing||document.activeElement===e&&e.type!=="range"&&(r||o&&e.value.trim()===t||(n||e.type==="number")&&mi(e.value)===t))return;const a=t==null?"":t;e.value!==a&&(e.value=a)}},Vx=["ctrl","shift","alt","meta"],Ux={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Vx.some(r=>e[`${r}Key`]&&!t.includes(r))},ti=(e,t)=>(r,...o)=>{for(let n=0;nr=>{if(!("key"in r))return;const o=Ho(r.key);if(t.some(n=>n===o||Kx[n]===o))return e(r)},Si={beforeMount(e,{value:t},{transition:r}){e._vod=e.style.display==="none"?"":e.style.display,r&&t?r.beforeEnter(e):Kn(e,t)},mounted(e,{value:t},{transition:r}){r&&t&&r.enter(e)},updated(e,{value:t,oldValue:r},{transition:o}){!t!=!r&&(o?t?(o.beforeEnter(e),Kn(e,!0),o.enter(e)):o.leave(e,()=>{Kn(e,!1)}):Kn(e,t))},beforeUnmount(e,{value:t}){Kn(e,t)}};function Kn(e,t){e.style.display=t?e._vod:"none"}const qx=_t({patchProp:Ox},Cx);let fu;function Gx(){return fu||(fu=Q1(qx))}const Yx=(...e)=>{const t=Gx().createApp(...e),{mount:r}=t;return t.mount=o=>{const n=Xx(o);if(!n)return;const i=t._component;!Oe(i)&&!i.render&&!i.template&&(i.template=n.innerHTML),n.innerHTML="";const a=r(n,!1,n instanceof SVGElement);return n instanceof Element&&(n.removeAttribute("v-cloak"),n.setAttribute("data-v-app","")),a},t};function Xx(e){return ft(e)?document.querySelector(e):e}const Zx="modulepreload",hu={},Jx="/",rr=function(t,r){return!r||r.length===0?t():Promise.all(r.map(o=>{if(o=`${Jx}${o}`,o in hu)return;hu[o]=!0;const n=o.endsWith(".css"),i=n?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${o}"]${i}`))return;const a=document.createElement("link");if(a.rel=n?"stylesheet":Zx,n||(a.as="script",a.crossOrigin=""),a.href=o,document.head.appendChild(a),n)return new Promise((l,s)=>{a.addEventListener("load",l),a.addEventListener("error",()=>s(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t())};function Qx(){return Mp().__VUE_DEVTOOLS_GLOBAL_HOOK__}function Mp(){return typeof navigator!="undefined"&&typeof window!="undefined"?window:typeof global!="undefined"?global:{}}const eC=typeof Proxy=="function",tC="devtools-plugin:setup",rC="plugin:settings:set";let Yo,zs;function oC(){var e;return Yo!==void 0||(typeof window!="undefined"&&window.performance?(Yo=!0,zs=window.performance):typeof global!="undefined"&&((e=global.perf_hooks)===null||e===void 0?void 0:e.performance)?(Yo=!0,zs=global.perf_hooks.performance):Yo=!1),Yo}function nC(){return oC()?zs.now():Date.now()}class iC{constructor(t,r){this.target=null,this.targetQueue=[],this.onQueue=[],this.plugin=t,this.hook=r;const o={};if(t.settings)for(const a in t.settings){const l=t.settings[a];o[a]=l.defaultValue}const n=`__vue-devtools-plugin-settings__${t.id}`;let i=Object.assign({},o);try{const a=localStorage.getItem(n),l=JSON.parse(a);Object.assign(i,l)}catch{}this.fallbacks={getSettings(){return i},setSettings(a){try{localStorage.setItem(n,JSON.stringify(a))}catch{}i=a},now(){return nC()}},r&&r.on(rC,(a,l)=>{a===this.plugin.id&&this.fallbacks.setSettings(l)}),this.proxiedOn=new Proxy({},{get:(a,l)=>this.target?this.target.on[l]:(...s)=>{this.onQueue.push({method:l,args:s})}}),this.proxiedTarget=new Proxy({},{get:(a,l)=>this.target?this.target[l]:l==="on"?this.proxiedOn:Object.keys(this.fallbacks).includes(l)?(...s)=>(this.targetQueue.push({method:l,args:s,resolve:()=>{}}),this.fallbacks[l](...s)):(...s)=>new Promise(d=>{this.targetQueue.push({method:l,args:s,resolve:d})})})}async setRealTarget(t){this.target=t;for(const r of this.onQueue)this.target.on[r.method](...r.args);for(const r of this.targetQueue)r.resolve(await this.target[r.method](...r.args))}}function aC(e,t){const r=e,o=Mp(),n=Qx(),i=eC&&r.enableEarlyProxy;if(n&&(o.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__||!i))n.emit(tC,e,t);else{const a=i?new iC(r,n):null;(o.__VUE_DEVTOOLS_PLUGINS__=o.__VUE_DEVTOOLS_PLUGINS__||[]).push({pluginDescriptor:r,setupFn:t,proxy:a}),a&&t(a.proxiedTarget)}}/*! + * vue-router v4.1.6 + * (c) 2022 Eduardo San Martin Morote + * @license MIT + */const sn=typeof window!="undefined";function lC(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const Xe=Object.assign;function Ll(e,t){const r={};for(const o in t){const n=t[o];r[o]=gr(n)?n.map(e):e(n)}return r}const si=()=>{},gr=Array.isArray,sC=/\/$/,cC=e=>e.replace(sC,"");function Hl(e,t,r="/"){let o,n={},i="",a="";const l=t.indexOf("#");let s=t.indexOf("?");return l=0&&(s=-1),s>-1&&(o=t.slice(0,s),i=t.slice(s+1,l>-1?l:t.length),n=e(i)),l>-1&&(o=o||t.slice(0,l),a=t.slice(l,t.length)),o=hC(o!=null?o:t,r),{fullPath:o+(i&&"?")+i+a,path:o,query:n,hash:a}}function dC(e,t){const r=t.query?e(t.query):"";return t.path+(r&&"?")+r+(t.hash||"")}function pu(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function uC(e,t,r){const o=t.matched.length-1,n=r.matched.length-1;return o>-1&&o===n&&Pn(t.matched[o],r.matched[n])&&Bp(t.params,r.params)&&e(t.query)===e(r.query)&&t.hash===r.hash}function Pn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Bp(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const r in e)if(!fC(e[r],t[r]))return!1;return!0}function fC(e,t){return gr(e)?vu(e,t):gr(t)?vu(t,e):e===t}function vu(e,t){return gr(t)?e.length===t.length&&e.every((r,o)=>r===t[o]):e.length===1&&e[0]===t}function hC(e,t){if(e.startsWith("/"))return e;if(!e)return t;const r=t.split("/"),o=e.split("/");let n=r.length-1,i,a;for(i=0;i1&&n--;else break;return r.slice(0,n).join("/")+"/"+o.slice(i-(i===o.length?1:0)).join("/")}var $i;(function(e){e.pop="pop",e.push="push"})($i||($i={}));var ci;(function(e){e.back="back",e.forward="forward",e.unknown=""})(ci||(ci={}));function pC(e){if(!e)if(sn){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),cC(e)}const vC=/^[^#]+#/;function mC(e,t){return e.replace(vC,"#")+t}function gC(e,t){const r=document.documentElement.getBoundingClientRect(),o=e.getBoundingClientRect();return{behavior:t.behavior,left:o.left-r.left-(t.left||0),top:o.top-r.top-(t.top||0)}}const tl=()=>({left:window.pageXOffset,top:window.pageYOffset});function bC(e){let t;if("el"in e){const r=e.el,o=typeof r=="string"&&r.startsWith("#"),n=typeof r=="string"?o?document.getElementById(r.slice(1)):document.querySelector(r):r;if(!n)return;t=gC(n,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function mu(e,t){return(history.state?history.state.position-t:-1)+e}const Es=new Map;function xC(e,t){Es.set(e,t)}function CC(e){const t=Es.get(e);return Es.delete(e),t}let yC=()=>location.protocol+"//"+location.host;function Lp(e,t){const{pathname:r,search:o,hash:n}=t,i=e.indexOf("#");if(i>-1){let l=n.includes(e.slice(i))?e.slice(i).length:1,s=n.slice(l);return s[0]!=="/"&&(s="/"+s),pu(s,"")}return pu(r,e)+o+n}function wC(e,t,r,o){let n=[],i=[],a=null;const l=({state:f})=>{const p=Lp(e,location),h=r.value,g=t.value;let b=0;if(f){if(r.value=p,t.value=f,a&&a===h){a=null;return}b=g?f.position-g.position:0}else o(p);n.forEach(m=>{m(r.value,h,{delta:b,type:$i.pop,direction:b?b>0?ci.forward:ci.back:ci.unknown})})};function s(){a=r.value}function d(f){n.push(f);const p=()=>{const h=n.indexOf(f);h>-1&&n.splice(h,1)};return i.push(p),p}function c(){const{history:f}=window;!f.state||f.replaceState(Xe({},f.state,{scroll:tl()}),"")}function u(){for(const f of i)f();i=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",c)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",c),{pauseListeners:s,listen:d,destroy:u}}function gu(e,t,r,o=!1,n=!1){return{back:e,current:t,forward:r,replaced:o,position:window.history.length,scroll:n?tl():null}}function SC(e){const{history:t,location:r}=window,o={value:Lp(e,r)},n={value:t.state};n.value||i(o.value,{back:null,current:o.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function i(s,d,c){const u=e.indexOf("#"),f=u>-1?(r.host&&document.querySelector("base")?e:e.slice(u))+s:yC()+e+s;try{t[c?"replaceState":"pushState"](d,"",f),n.value=d}catch(p){console.error(p),r[c?"replace":"assign"](f)}}function a(s,d){const c=Xe({},t.state,gu(n.value.back,s,n.value.forward,!0),d,{position:n.value.position});i(s,c,!0),o.value=s}function l(s,d){const c=Xe({},n.value,t.state,{forward:s,scroll:tl()});i(c.current,c,!0);const u=Xe({},gu(o.value,s,null),{position:c.position+1},d);i(s,u,!1),o.value=s}return{location:o,state:n,push:l,replace:a}}function $C(e){e=pC(e);const t=SC(e),r=wC(e,t.state,t.location,t.replace);function o(i,a=!0){a||r.pauseListeners(),history.go(i)}const n=Xe({location:"",base:e,go:o,createHref:mC.bind(null,e)},t,r);return Object.defineProperty(n,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(n,"state",{enumerable:!0,get:()=>t.state.value}),n}function _C(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),$C(e)}function PC(e){return typeof e=="string"||e&&typeof e=="object"}function Hp(e){return typeof e=="string"||typeof e=="symbol"}const Xr={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Dp=Symbol("");var bu;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(bu||(bu={}));function kn(e,t){return Xe(new Error,{type:e,[Dp]:!0},t)}function Or(e,t){return e instanceof Error&&Dp in e&&(t==null||!!(e.type&t))}const xu="[^/]+?",kC={sensitive:!1,strict:!1,start:!0,end:!0},TC=/[.+*?^${}()[\]/\\]/g;function zC(e,t){const r=Xe({},kC,t),o=[];let n=r.start?"^":"";const i=[];for(const d of e){const c=d.length?[]:[90];r.strict&&!d.length&&(n+="/");for(let u=0;ut.length?t.length===1&&t[0]===40+40?1:-1:0}function RC(e,t){let r=0;const o=e.score,n=t.score;for(;r0&&t[t.length-1]<0}const IC={type:0,value:""},OC=/[a-zA-Z0-9_]/;function AC(e){if(!e)return[[]];if(e==="/")return[[IC]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(p){throw new Error(`ERR (${r})/"${d}": ${p}`)}let r=0,o=r;const n=[];let i;function a(){i&&n.push(i),i=[]}let l=0,s,d="",c="";function u(){!d||(r===0?i.push({type:0,value:d}):r===1||r===2||r===3?(i.length>1&&(s==="*"||s==="+")&&t(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),i.push({type:1,value:d,regexp:c,repeatable:s==="*"||s==="+",optional:s==="*"||s==="?"})):t("Invalid state to consume buffer"),d="")}function f(){d+=s}for(;l{a(y)}:si}function a(c){if(Hp(c)){const u=o.get(c);u&&(o.delete(c),r.splice(r.indexOf(u),1),u.children.forEach(a),u.alias.forEach(a))}else{const u=r.indexOf(c);u>-1&&(r.splice(u,1),c.record.name&&o.delete(c.record.name),c.children.forEach(a),c.alias.forEach(a))}}function l(){return r}function s(c){let u=0;for(;u=0&&(c.record.path!==r[u].record.path||!Fp(c,r[u]));)u++;r.splice(u,0,c),c.record.name&&!wu(c)&&o.set(c.record.name,c)}function d(c,u){let f,p={},h,g;if("name"in c&&c.name){if(f=o.get(c.name),!f)throw kn(1,{location:c});g=f.record.name,p=Xe(yu(u.params,f.keys.filter(y=>!y.optional).map(y=>y.name)),c.params&&yu(c.params,f.keys.map(y=>y.name))),h=f.stringify(p)}else if("path"in c)h=c.path,f=r.find(y=>y.re.test(h)),f&&(p=f.parse(h),g=f.record.name);else{if(f=u.name?o.get(u.name):r.find(y=>y.re.test(u.path)),!f)throw kn(1,{location:c,currentLocation:u});g=f.record.name,p=Xe({},u.params,c.params),h=f.stringify(p)}const b=[];let m=f;for(;m;)b.unshift(m.record),m=m.parent;return{name:g,path:h,params:p,matched:b,meta:DC(b)}}return e.forEach(c=>i(c)),{addRoute:i,resolve:d,removeRoute:a,getRoutes:l,getRecordMatcher:n}}function yu(e,t){const r={};for(const o of t)o in e&&(r[o]=e[o]);return r}function LC(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:HC(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function HC(e){const t={},r=e.props||!1;if("component"in e)t.default=r;else for(const o in e.components)t[o]=typeof r=="boolean"?r:r[o];return t}function wu(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function DC(e){return e.reduce((t,r)=>Xe(t,r.meta),{})}function Su(e,t){const r={};for(const o in e)r[o]=o in t?t[o]:e[o];return r}function Fp(e,t){return t.children.some(r=>r===e||Fp(e,r))}const jp=/#/g,FC=/&/g,jC=/\//g,NC=/=/g,WC=/\?/g,Np=/\+/g,VC=/%5B/g,UC=/%5D/g,Wp=/%5E/g,KC=/%60/g,Vp=/%7B/g,qC=/%7C/g,Up=/%7D/g,GC=/%20/g;function Ic(e){return encodeURI(""+e).replace(qC,"|").replace(VC,"[").replace(UC,"]")}function YC(e){return Ic(e).replace(Vp,"{").replace(Up,"}").replace(Wp,"^")}function Rs(e){return Ic(e).replace(Np,"%2B").replace(GC,"+").replace(jp,"%23").replace(FC,"%26").replace(KC,"`").replace(Vp,"{").replace(Up,"}").replace(Wp,"^")}function XC(e){return Rs(e).replace(NC,"%3D")}function ZC(e){return Ic(e).replace(jp,"%23").replace(WC,"%3F")}function JC(e){return e==null?"":ZC(e).replace(jC,"%2F")}function za(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function QC(e){const t={};if(e===""||e==="?")return t;const o=(e[0]==="?"?e.slice(1):e).split("&");for(let n=0;ni&&Rs(i)):[o&&Rs(o)]).forEach(i=>{i!==void 0&&(t+=(t.length?"&":"")+r,i!=null&&(t+="="+i))})}return t}function ey(e){const t={};for(const r in e){const o=e[r];o!==void 0&&(t[r]=gr(o)?o.map(n=>n==null?null:""+n):o==null?o:""+o)}return t}const ty=Symbol(""),_u=Symbol(""),rl=Symbol(""),Oc=Symbol(""),Is=Symbol("");function qn(){let e=[];function t(o){return e.push(o),()=>{const n=e.indexOf(o);n>-1&&e.splice(n,1)}}function r(){e=[]}return{add:t,list:()=>e,reset:r}}function to(e,t,r,o,n){const i=o&&(o.enterCallbacks[n]=o.enterCallbacks[n]||[]);return()=>new Promise((a,l)=>{const s=u=>{u===!1?l(kn(4,{from:r,to:t})):u instanceof Error?l(u):PC(u)?l(kn(2,{from:t,to:u})):(i&&o.enterCallbacks[n]===i&&typeof u=="function"&&i.push(u),a())},d=e.call(o&&o.instances[n],t,r,s);let c=Promise.resolve(d);e.length<3&&(c=c.then(s)),c.catch(u=>l(u))})}function Dl(e,t,r,o){const n=[];for(const i of e)for(const a in i.components){let l=i.components[a];if(!(t!=="beforeRouteEnter"&&!i.instances[a]))if(ry(l)){const d=(l.__vccOpts||l)[t];d&&n.push(to(d,r,o,i,a))}else{let s=l();n.push(()=>s.then(d=>{if(!d)return Promise.reject(new Error(`Couldn't resolve component "${a}" at "${i.path}"`));const c=lC(d)?d.default:d;i.components[a]=c;const f=(c.__vccOpts||c)[t];return f&&to(f,r,o,i,a)()}))}}return n}function ry(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Pu(e){const t=me(rl),r=me(Oc),o=H(()=>t.resolve(Ze(e.to))),n=H(()=>{const{matched:s}=o.value,{length:d}=s,c=s[d-1],u=r.matched;if(!c||!u.length)return-1;const f=u.findIndex(Pn.bind(null,c));if(f>-1)return f;const p=ku(s[d-2]);return d>1&&ku(c)===p&&u[u.length-1].path!==p?u.findIndex(Pn.bind(null,s[d-2])):f}),i=H(()=>n.value>-1&&ay(r.params,o.value.params)),a=H(()=>n.value>-1&&n.value===r.matched.length-1&&Bp(r.params,o.value.params));function l(s={}){return iy(s)?t[Ze(e.replace)?"replace":"push"](Ze(e.to)).catch(si):Promise.resolve()}return{route:o,href:H(()=>o.value.href),isActive:i,isExactActive:a,navigate:l}}const oy=ae({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Pu,setup(e,{slots:t}){const r=vr(Pu(e)),{options:o}=me(rl),n=H(()=>({[Tu(e.activeClass,o.linkActiveClass,"router-link-active")]:r.isActive,[Tu(e.exactActiveClass,o.linkExactActiveClass,"router-link-exact-active")]:r.isExactActive}));return()=>{const i=t.default&&t.default(r);return e.custom?i:v("a",{"aria-current":r.isExactActive?e.ariaCurrentValue:null,href:r.href,onClick:r.navigate,class:n.value},i)}}}),ny=oy;function iy(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function ay(e,t){for(const r in t){const o=t[r],n=e[r];if(typeof o=="string"){if(o!==n)return!1}else if(!gr(n)||n.length!==o.length||o.some((i,a)=>i!==n[a]))return!1}return!0}function ku(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Tu=(e,t,r)=>e!=null?e:t!=null?t:r,ly=ae({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:r}){const o=me(Is),n=H(()=>e.route||o.value),i=me(_u,0),a=H(()=>{let d=Ze(i);const{matched:c}=n.value;let u;for(;(u=c[d])&&!u.components;)d++;return d}),l=H(()=>n.value.matched[a.value]);Be(_u,H(()=>a.value+1)),Be(ty,l),Be(Is,n);const s=V();return De(()=>[s.value,l.value,e.name],([d,c,u],[f,p,h])=>{c&&(c.instances[u]=d,p&&p!==c&&d&&d===f&&(c.leaveGuards.size||(c.leaveGuards=p.leaveGuards),c.updateGuards.size||(c.updateGuards=p.updateGuards))),d&&c&&(!p||!Pn(c,p)||!f)&&(c.enterCallbacks[u]||[]).forEach(g=>g(d))},{flush:"post"}),()=>{const d=n.value,c=e.name,u=l.value,f=u&&u.components[c];if(!f)return zu(r.default,{Component:f,route:d});const p=u.props[c],h=p?p===!0?d.params:typeof p=="function"?p(d):p:null,b=v(f,Xe({},h,t,{onVnodeUnmounted:m=>{m.component.isUnmounted&&(u.instances[c]=null)},ref:s}));return zu(r.default,{Component:b,route:d})||b}}});function zu(e,t){if(!e)return null;const r=e(t);return r.length===1?r[0]:r}const sy=ly;function cy(e){const t=BC(e.routes,e),r=e.parseQuery||QC,o=e.stringifyQuery||$u,n=e.history,i=qn(),a=qn(),l=qn(),s=u1(Xr);let d=Xr;sn&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=Ll.bind(null,U=>""+U),u=Ll.bind(null,JC),f=Ll.bind(null,za);function p(U,ee){let G,se;return Hp(U)?(G=t.getRecordMatcher(U),se=ee):se=U,t.addRoute(se,G)}function h(U){const ee=t.getRecordMatcher(U);ee&&t.removeRoute(ee)}function g(){return t.getRoutes().map(U=>U.record)}function b(U){return!!t.getRecordMatcher(U)}function m(U,ee){if(ee=Xe({},ee||s.value),typeof U=="string"){const C=Hl(r,U,ee.path),P=t.resolve({path:C.path},ee),I=n.createHref(C.fullPath);return Xe(C,P,{params:f(P.params),hash:za(C.hash),redirectedFrom:void 0,href:I})}let G;if("path"in U)G=Xe({},U,{path:Hl(r,U.path,ee.path).path});else{const C=Xe({},U.params);for(const P in C)C[P]==null&&delete C[P];G=Xe({},U,{params:u(U.params)}),ee.params=u(ee.params)}const se=t.resolve(G,ee),ce=U.hash||"";se.params=c(f(se.params));const Re=dC(o,Xe({},U,{hash:YC(ce),path:se.path})),ge=n.createHref(Re);return Xe({fullPath:Re,hash:ce,query:o===$u?ey(U.query):U.query||{}},se,{redirectedFrom:void 0,href:ge})}function y(U){return typeof U=="string"?Hl(r,U,s.value.path):Xe({},U)}function w(U,ee){if(d!==U)return kn(8,{from:ee,to:U})}function x(U){return S(U)}function k(U){return x(Xe(y(U),{replace:!0}))}function T(U){const ee=U.matched[U.matched.length-1];if(ee&&ee.redirect){const{redirect:G}=ee;let se=typeof G=="function"?G(U):G;return typeof se=="string"&&(se=se.includes("?")||se.includes("#")?se=y(se):{path:se},se.params={}),Xe({query:U.query,hash:U.hash,params:"path"in se?{}:U.params},se)}}function S(U,ee){const G=d=m(U),se=s.value,ce=U.state,Re=U.force,ge=U.replace===!0,C=T(G);if(C)return S(Xe(y(C),{state:typeof C=="object"?Xe({},ce,C.state):ce,force:Re,replace:ge}),ee||G);const P=G;P.redirectedFrom=ee;let I;return!Re&&uC(o,se,G)&&(I=kn(16,{to:P,from:se}),Ce(se,se,!0,!1)),(I?Promise.resolve(I):R(P,se)).catch(W=>Or(W)?Or(W,2)?W:pe(W):X(W,P,se)).then(W=>{if(W){if(Or(W,2))return S(Xe({replace:ge},y(W.to),{state:typeof W.to=="object"?Xe({},ce,W.to.state):ce,force:Re}),ee||P)}else W=N(P,se,!0,ge,ce);return _(P,se,W),W})}function $(U,ee){const G=w(U,ee);return G?Promise.reject(G):Promise.resolve()}function R(U,ee){let G;const[se,ce,Re]=dy(U,ee);G=Dl(se.reverse(),"beforeRouteLeave",U,ee);for(const C of se)C.leaveGuards.forEach(P=>{G.push(to(P,U,ee))});const ge=$.bind(null,U,ee);return G.push(ge),Xo(G).then(()=>{G=[];for(const C of i.list())G.push(to(C,U,ee));return G.push(ge),Xo(G)}).then(()=>{G=Dl(ce,"beforeRouteUpdate",U,ee);for(const C of ce)C.updateGuards.forEach(P=>{G.push(to(P,U,ee))});return G.push(ge),Xo(G)}).then(()=>{G=[];for(const C of U.matched)if(C.beforeEnter&&!ee.matched.includes(C))if(gr(C.beforeEnter))for(const P of C.beforeEnter)G.push(to(P,U,ee));else G.push(to(C.beforeEnter,U,ee));return G.push(ge),Xo(G)}).then(()=>(U.matched.forEach(C=>C.enterCallbacks={}),G=Dl(Re,"beforeRouteEnter",U,ee),G.push(ge),Xo(G))).then(()=>{G=[];for(const C of a.list())G.push(to(C,U,ee));return G.push(ge),Xo(G)}).catch(C=>Or(C,8)?C:Promise.reject(C))}function _(U,ee,G){for(const se of l.list())se(U,ee,G)}function N(U,ee,G,se,ce){const Re=w(U,ee);if(Re)return Re;const ge=ee===Xr,C=sn?history.state:{};G&&(se||ge?n.replace(U.fullPath,Xe({scroll:ge&&C&&C.scroll},ce)):n.push(U.fullPath,ce)),s.value=U,Ce(U,ee,G,ge),pe()}let E;function F(){E||(E=n.listen((U,ee,G)=>{if(!Le.listening)return;const se=m(U),ce=T(se);if(ce){S(Xe(ce,{replace:!0}),se).catch(si);return}d=se;const Re=s.value;sn&&xC(mu(Re.fullPath,G.delta),tl()),R(se,Re).catch(ge=>Or(ge,12)?ge:Or(ge,2)?(S(ge.to,se).then(C=>{Or(C,20)&&!G.delta&&G.type===$i.pop&&n.go(-1,!1)}).catch(si),Promise.reject()):(G.delta&&n.go(-G.delta,!1),X(ge,se,Re))).then(ge=>{ge=ge||N(se,Re,!1),ge&&(G.delta&&!Or(ge,8)?n.go(-G.delta,!1):G.type===$i.pop&&Or(ge,20)&&n.go(-1,!1)),_(se,Re,ge)}).catch(si)}))}let j=qn(),Q=qn(),A;function X(U,ee,G){pe(U);const se=Q.list();return se.length?se.forEach(ce=>ce(U,ee,G)):console.error(U),Promise.reject(U)}function ne(){return A&&s.value!==Xr?Promise.resolve():new Promise((U,ee)=>{j.add([U,ee])})}function pe(U){return A||(A=!U,F(),j.list().forEach(([ee,G])=>U?G(U):ee()),j.reset()),U}function Ce(U,ee,G,se){const{scrollBehavior:ce}=e;if(!sn||!ce)return Promise.resolve();const Re=!G&&CC(mu(U.fullPath,0))||(se||!G)&&history.state&&history.state.scroll||null;return Zt().then(()=>ce(U,ee,Re)).then(ge=>ge&&bC(ge)).catch(ge=>X(ge,U,ee))}const $e=U=>n.go(U);let _e;const Ge=new Set,Le={currentRoute:s,listening:!0,addRoute:p,removeRoute:h,hasRoute:b,getRoutes:g,resolve:m,options:e,push:x,replace:k,go:$e,back:()=>$e(-1),forward:()=>$e(1),beforeEach:i.add,beforeResolve:a.add,afterEach:l.add,onError:Q.add,isReady:ne,install(U){const ee=this;U.component("RouterLink",ny),U.component("RouterView",sy),U.config.globalProperties.$router=ee,Object.defineProperty(U.config.globalProperties,"$route",{enumerable:!0,get:()=>Ze(s)}),sn&&!_e&&s.value===Xr&&(_e=!0,x(n.location).catch(ce=>{}));const G={};for(const ce in Xr)G[ce]=H(()=>s.value[ce]);U.provide(rl,ee),U.provide(Oc,vr(G)),U.provide(Is,s);const se=U.unmount;Ge.add(U),U.unmount=function(){Ge.delete(U),Ge.size<1&&(d=Xr,E&&E(),E=null,s.value=Xr,_e=!1,A=!1),se()}}};return Le}function Xo(e){return e.reduce((t,r)=>t.then(()=>r()),Promise.resolve())}function dy(e,t){const r=[],o=[],n=[],i=Math.max(t.matched.length,e.matched.length);for(let a=0;aPn(d,l))?o.push(l):r.push(l));const s=e.matched[a];s&&(t.matched.find(d=>Pn(d,s))||n.push(s))}return[r,o,n]}function Kp(){return me(rl)}function uy(){return me(Oc)}const fy=[{path:"/",name:"home",meta:{title:"\u5E7F\u573A",keepAlive:!0},component:()=>rr(()=>import("./Home.d77fc36a.js"),["assets/Home.d77fc36a.js","assets/Home.07e73aab.css","assets/post-item.11c28084.js","assets/post-item.766f3250.css","assets/content.ed80294a.js","assets/content.93884ea1.css","assets/formatTime.e07969bb.js","assets/Thing.d394adea.js","assets/post-skeleton.38f0f247.js","assets/post-skeleton.328dfb67.css","assets/Skeleton.e1c16fcb.js","assets/List.a66e9ae7.js","assets/IEnum.032938cf.js","assets/Upload.6bcec76c.js","assets/main-nav.3167f221.js","assets/main-nav.b4a45e8a.css","assets/Pagination.c13c2d34.js"])},{path:"/post",name:"post",meta:{title:"\u8BDD\u9898\u8BE6\u60C5"},component:()=>rr(()=>import("./Post.3f5c561f.js"),["assets/Post.3f5c561f.js","assets/Post.4d9d6f83.css","assets/InputGroup.73d38f63.js","assets/formatTime.e07969bb.js","assets/content.ed80294a.js","assets/content.93884ea1.css","assets/Thing.d394adea.js","assets/post-skeleton.38f0f247.js","assets/post-skeleton.328dfb67.css","assets/Skeleton.e1c16fcb.js","assets/List.a66e9ae7.js","assets/IEnum.032938cf.js","assets/Upload.6bcec76c.js","assets/MoreHorizFilled.b0eea69d.js","assets/main-nav.3167f221.js","assets/main-nav.b4a45e8a.css"])},{path:"/topic",name:"topic",meta:{title:"\u8BDD\u9898"},component:()=>rr(()=>import("./Topic.691bac81.js"),["assets/Topic.691bac81.js","assets/Topic.909bef5a.css","assets/main-nav.3167f221.js","assets/main-nav.b4a45e8a.css","assets/List.a66e9ae7.js"])},{path:"/anouncement",name:"anouncement",meta:{title:"\u516C\u544A"},component:()=>rr(()=>import("./Anouncement.4c2503ee.js"),["assets/Anouncement.4c2503ee.js","assets/Anouncement.5f84f68f.css","assets/post-skeleton.38f0f247.js","assets/post-skeleton.328dfb67.css","assets/Skeleton.e1c16fcb.js","assets/List.a66e9ae7.js","assets/main-nav.3167f221.js","assets/main-nav.b4a45e8a.css","assets/formatTime.e07969bb.js","assets/Pagination.c13c2d34.js"])},{path:"/profile",name:"profile",meta:{title:"\u4E3B\u9875"},component:()=>rr(()=>import("./Profile.f583a607.js"),["assets/Profile.f583a607.js","assets/Profile.df0a7049.css","assets/post-item.11c28084.js","assets/post-item.766f3250.css","assets/content.ed80294a.js","assets/content.93884ea1.css","assets/formatTime.e07969bb.js","assets/Thing.d394adea.js","assets/post-skeleton.38f0f247.js","assets/post-skeleton.328dfb67.css","assets/Skeleton.e1c16fcb.js","assets/List.a66e9ae7.js","assets/main-nav.3167f221.js","assets/main-nav.b4a45e8a.css","assets/Pagination.c13c2d34.js"])},{path:"/user",name:"user",meta:{title:"\u7528\u6237\u8BE6\u60C5"},component:()=>rr(()=>import("./User.4a6c33cd.js"),["assets/User.4a6c33cd.js","assets/User.7b771241.css","assets/post-item.11c28084.js","assets/post-item.766f3250.css","assets/content.ed80294a.js","assets/content.93884ea1.css","assets/formatTime.e07969bb.js","assets/Thing.d394adea.js","assets/post-skeleton.38f0f247.js","assets/post-skeleton.328dfb67.css","assets/Skeleton.e1c16fcb.js","assets/List.a66e9ae7.js","assets/Alert.6cb9deb6.js","assets/main-nav.3167f221.js","assets/main-nav.b4a45e8a.css","assets/MoreHorizFilled.b0eea69d.js","assets/Pagination.c13c2d34.js"])},{path:"/messages",name:"messages",meta:{title:"\u6D88\u606F"},component:()=>rr(()=>import("./Messages.23db49c3.js"),["assets/Messages.23db49c3.js","assets/Messages.db382f03.css","assets/formatTime.e07969bb.js","assets/Alert.6cb9deb6.js","assets/Thing.d394adea.js","assets/Skeleton.e1c16fcb.js","assets/List.a66e9ae7.js","assets/main-nav.3167f221.js","assets/main-nav.b4a45e8a.css","assets/Pagination.c13c2d34.js"])},{path:"/collection",name:"collection",meta:{title:"\u6536\u85CF"},component:()=>rr(()=>import("./Collection.e823f1cf.js"),["assets/Collection.e823f1cf.js","assets/Collection.d63a34f0.css","assets/post-item.11c28084.js","assets/post-item.766f3250.css","assets/content.ed80294a.js","assets/content.93884ea1.css","assets/formatTime.e07969bb.js","assets/Thing.d394adea.js","assets/post-skeleton.38f0f247.js","assets/post-skeleton.328dfb67.css","assets/Skeleton.e1c16fcb.js","assets/List.a66e9ae7.js","assets/main-nav.3167f221.js","assets/main-nav.b4a45e8a.css","assets/Pagination.c13c2d34.js"])},{path:"/contacts",name:"contacts",meta:{title:"\u597D\u53CB"},component:()=>rr(()=>import("./Contacts.9d93fb1f.js"),["assets/Contacts.9d93fb1f.js","assets/Contacts.e16015c7.css","assets/post-skeleton.38f0f247.js","assets/post-skeleton.328dfb67.css","assets/Skeleton.e1c16fcb.js","assets/List.a66e9ae7.js","assets/main-nav.3167f221.js","assets/main-nav.b4a45e8a.css","assets/Pagination.c13c2d34.js"])},{path:"/wallet",name:"wallet",meta:{title:"\u94B1\u5305"},component:()=>rr(()=>import("./Wallet.0c985f96.js"),["assets/Wallet.0c985f96.js","assets/Wallet.e5757b5e.css","assets/post-skeleton.38f0f247.js","assets/post-skeleton.328dfb67.css","assets/Skeleton.e1c16fcb.js","assets/List.a66e9ae7.js","assets/main-nav.3167f221.js","assets/main-nav.b4a45e8a.css","assets/formatTime.e07969bb.js","assets/Pagination.c13c2d34.js"])},{path:"/setting",name:"setting",meta:{title:"\u8BBE\u7F6E"},component:()=>rr(()=>import("./Setting.67d59ade.js"),["assets/Setting.67d59ade.js","assets/Setting.a66de7b5.css","assets/main-nav.3167f221.js","assets/main-nav.b4a45e8a.css","assets/Upload.6bcec76c.js","assets/Alert.6cb9deb6.js","assets/InputGroup.73d38f63.js"])},{path:"/404",name:"404",meta:{title:"404"},component:()=>rr(()=>import("./404.dfeb5539.js"),["assets/404.dfeb5539.js","assets/404.9c166a4c.css","assets/main-nav.3167f221.js","assets/main-nav.b4a45e8a.css","assets/List.a66e9ae7.js"])},{path:"/:pathMatch(.*)",redirect:"/404"}],qp=cy({history:_C(),routes:fy});qp.beforeEach((e,t,r)=>{document.title=`${e.meta.title} | \u6CE1\u6CE1 - \u4E00\u4E2A\u6E05\u65B0\u6587\u827A\u7684\u5FAE\u793E\u533A`,r()});/*! + * vuex v4.1.0 + * (c) 2022 Evan You + * @license MIT + */var Gp="store";function ol(e){return e===void 0&&(e=null),me(e!==null?e:Gp)}function Bn(e,t){Object.keys(e).forEach(function(r){return t(e[r],r)})}function hy(e){return e!==null&&typeof e=="object"}function py(e){return e&&typeof e.then=="function"}function vy(e,t){return function(){return e(t)}}function Yp(e,t,r){return t.indexOf(e)<0&&(r&&r.prepend?t.unshift(e):t.push(e)),function(){var o=t.indexOf(e);o>-1&&t.splice(o,1)}}function Xp(e,t){e._actions=Object.create(null),e._mutations=Object.create(null),e._wrappedGetters=Object.create(null),e._modulesNamespaceMap=Object.create(null);var r=e.state;nl(e,r,[],e._modules.root,!0),Ac(e,r,t)}function Ac(e,t,r){var o=e._state,n=e._scope;e.getters={},e._makeLocalGettersCache=Object.create(null);var i=e._wrappedGetters,a={},l={},s=L0(!0);s.run(function(){Bn(i,function(d,c){a[c]=vy(d,e),l[c]=H(function(){return a[c]()}),Object.defineProperty(e.getters,c,{get:function(){return l[c].value},enumerable:!0})})}),e._state=vr({data:t}),e._scope=s,e.strict&&Cy(e),o&&r&&e._withCommit(function(){o.data=null}),n&&n.stop()}function nl(e,t,r,o,n){var i=!r.length,a=e._modules.getNamespace(r);if(o.namespaced&&(e._modulesNamespaceMap[a],e._modulesNamespaceMap[a]=o),!i&&!n){var l=Mc(t,r.slice(0,-1)),s=r[r.length-1];e._withCommit(function(){l[s]=o.state})}var d=o.context=my(e,a,r);o.forEachMutation(function(c,u){var f=a+u;gy(e,f,c,d)}),o.forEachAction(function(c,u){var f=c.root?u:a+u,p=c.handler||c;by(e,f,p,d)}),o.forEachGetter(function(c,u){var f=a+u;xy(e,f,c,d)}),o.forEachChild(function(c,u){nl(e,t,r.concat(u),c,n)})}function my(e,t,r){var o=t==="",n={dispatch:o?e.dispatch:function(i,a,l){var s=Ea(i,a,l),d=s.payload,c=s.options,u=s.type;return(!c||!c.root)&&(u=t+u),e.dispatch(u,d)},commit:o?e.commit:function(i,a,l){var s=Ea(i,a,l),d=s.payload,c=s.options,u=s.type;(!c||!c.root)&&(u=t+u),e.commit(u,d,c)}};return Object.defineProperties(n,{getters:{get:o?function(){return e.getters}:function(){return Zp(e,t)}},state:{get:function(){return Mc(e.state,r)}}}),n}function Zp(e,t){if(!e._makeLocalGettersCache[t]){var r={},o=t.length;Object.keys(e.getters).forEach(function(n){if(n.slice(0,o)===t){var i=n.slice(o);Object.defineProperty(r,i,{get:function(){return e.getters[n]},enumerable:!0})}}),e._makeLocalGettersCache[t]=r}return e._makeLocalGettersCache[t]}function gy(e,t,r,o){var n=e._mutations[t]||(e._mutations[t]=[]);n.push(function(a){r.call(e,o.state,a)})}function by(e,t,r,o){var n=e._actions[t]||(e._actions[t]=[]);n.push(function(a){var l=r.call(e,{dispatch:o.dispatch,commit:o.commit,getters:o.getters,state:o.state,rootGetters:e.getters,rootState:e.state},a);return py(l)||(l=Promise.resolve(l)),e._devtoolHook?l.catch(function(s){throw e._devtoolHook.emit("vuex:error",s),s}):l})}function xy(e,t,r,o){e._wrappedGetters[t]||(e._wrappedGetters[t]=function(i){return r(o.state,o.getters,i.state,i.getters)})}function Cy(e){De(function(){return e._state.data},function(){},{deep:!0,flush:"sync"})}function Mc(e,t){return t.reduce(function(r,o){return r[o]},e)}function Ea(e,t,r){return hy(e)&&e.type&&(r=t,t=e,e=e.type),{type:e,payload:t,options:r}}var yy="vuex bindings",Eu="vuex:mutations",Fl="vuex:actions",Zo="vuex",wy=0;function Sy(e,t){aC({id:"org.vuejs.vuex",app:e,label:"Vuex",homepage:"https://next.vuex.vuejs.org/",logo:"https://vuejs.org/images/icons/favicon-96x96.png",packageName:"vuex",componentStateTypes:[yy]},function(r){r.addTimelineLayer({id:Eu,label:"Vuex Mutations",color:Ru}),r.addTimelineLayer({id:Fl,label:"Vuex Actions",color:Ru}),r.addInspector({id:Zo,label:"Vuex",icon:"storage",treeFilterPlaceholder:"Filter stores..."}),r.on.getInspectorTree(function(o){if(o.app===e&&o.inspectorId===Zo)if(o.filter){var n=[];tv(n,t._modules.root,o.filter,""),o.rootNodes=n}else o.rootNodes=[ev(t._modules.root,"")]}),r.on.getInspectorState(function(o){if(o.app===e&&o.inspectorId===Zo){var n=o.nodeId;Zp(t,n),o.state=Py(Ty(t._modules,n),n==="root"?t.getters:t._makeLocalGettersCache,n)}}),r.on.editInspectorState(function(o){if(o.app===e&&o.inspectorId===Zo){var n=o.nodeId,i=o.path;n!=="root"&&(i=n.split("/").filter(Boolean).concat(i)),t._withCommit(function(){o.set(t._state.data,i,o.state.value)})}}),t.subscribe(function(o,n){var i={};o.payload&&(i.payload=o.payload),i.state=n,r.notifyComponentUpdate(),r.sendInspectorTree(Zo),r.sendInspectorState(Zo),r.addTimelineEvent({layerId:Eu,event:{time:Date.now(),title:o.type,data:i}})}),t.subscribeAction({before:function(o,n){var i={};o.payload&&(i.payload=o.payload),o._id=wy++,o._time=Date.now(),i.state=n,r.addTimelineEvent({layerId:Fl,event:{time:o._time,title:o.type,groupId:o._id,subtitle:"start",data:i}})},after:function(o,n){var i={},a=Date.now()-o._time;i.duration={_custom:{type:"duration",display:a+"ms",tooltip:"Action duration",value:a}},o.payload&&(i.payload=o.payload),i.state=n,r.addTimelineEvent({layerId:Fl,event:{time:Date.now(),title:o.type,groupId:o._id,subtitle:"end",data:i}})}})})}var Ru=8702998,$y=6710886,_y=16777215,Jp={label:"namespaced",textColor:_y,backgroundColor:$y};function Qp(e){return e&&e!=="root"?e.split("/").slice(-2,-1)[0]:"Root"}function ev(e,t){return{id:t||"root",label:Qp(t),tags:e.namespaced?[Jp]:[],children:Object.keys(e._children).map(function(r){return ev(e._children[r],t+r+"/")})}}function tv(e,t,r,o){o.includes(r)&&e.push({id:o||"root",label:o.endsWith("/")?o.slice(0,o.length-1):o||"Root",tags:t.namespaced?[Jp]:[]}),Object.keys(t._children).forEach(function(n){tv(e,t._children[n],r,o+n+"/")})}function Py(e,t,r){t=r==="root"?t:t[r];var o=Object.keys(t),n={state:Object.keys(e.state).map(function(a){return{key:a,editable:!0,value:e.state[a]}})};if(o.length){var i=ky(t);n.getters=Object.keys(i).map(function(a){return{key:a.endsWith("/")?Qp(a):a,editable:!1,value:Os(function(){return i[a]})}})}return n}function ky(e){var t={};return Object.keys(e).forEach(function(r){var o=r.split("/");if(o.length>1){var n=t,i=o.pop();o.forEach(function(a){n[a]||(n[a]={_custom:{value:{},display:a,tooltip:"Module",abstract:!0}}),n=n[a]._custom.value}),n[i]=Os(function(){return e[r]})}else t[r]=Os(function(){return e[r]})}),t}function Ty(e,t){var r=t.split("/").filter(function(o){return o});return r.reduce(function(o,n,i){var a=o[n];if(!a)throw new Error('Missing module "'+n+'" for path "'+t+'".');return i===r.length-1?a:a._children},t==="root"?e:e.root._children)}function Os(e){try{return e()}catch(t){return t}}var br=function(t,r){this.runtime=r,this._children=Object.create(null),this._rawModule=t;var o=t.state;this.state=(typeof o=="function"?o():o)||{}},rv={namespaced:{configurable:!0}};rv.namespaced.get=function(){return!!this._rawModule.namespaced};br.prototype.addChild=function(t,r){this._children[t]=r};br.prototype.removeChild=function(t){delete this._children[t]};br.prototype.getChild=function(t){return this._children[t]};br.prototype.hasChild=function(t){return t in this._children};br.prototype.update=function(t){this._rawModule.namespaced=t.namespaced,t.actions&&(this._rawModule.actions=t.actions),t.mutations&&(this._rawModule.mutations=t.mutations),t.getters&&(this._rawModule.getters=t.getters)};br.prototype.forEachChild=function(t){Bn(this._children,t)};br.prototype.forEachGetter=function(t){this._rawModule.getters&&Bn(this._rawModule.getters,t)};br.prototype.forEachAction=function(t){this._rawModule.actions&&Bn(this._rawModule.actions,t)};br.prototype.forEachMutation=function(t){this._rawModule.mutations&&Bn(this._rawModule.mutations,t)};Object.defineProperties(br.prototype,rv);var Do=function(t){this.register([],t,!1)};Do.prototype.get=function(t){return t.reduce(function(r,o){return r.getChild(o)},this.root)};Do.prototype.getNamespace=function(t){var r=this.root;return t.reduce(function(o,n){return r=r.getChild(n),o+(r.namespaced?n+"/":"")},"")};Do.prototype.update=function(t){ov([],this.root,t)};Do.prototype.register=function(t,r,o){var n=this;o===void 0&&(o=!0);var i=new br(r,o);if(t.length===0)this.root=i;else{var a=this.get(t.slice(0,-1));a.addChild(t[t.length-1],i)}r.modules&&Bn(r.modules,function(l,s){n.register(t.concat(s),l,o)})};Do.prototype.unregister=function(t){var r=this.get(t.slice(0,-1)),o=t[t.length-1],n=r.getChild(o);!n||!n.runtime||r.removeChild(o)};Do.prototype.isRegistered=function(t){var r=this.get(t.slice(0,-1)),o=t[t.length-1];return r?r.hasChild(o):!1};function ov(e,t,r){if(t.update(r),r.modules)for(var o in r.modules){if(!t.getChild(o))return;ov(e.concat(o),t.getChild(o),r.modules[o])}}function zy(e){return new Vt(e)}var Vt=function(t){var r=this;t===void 0&&(t={});var o=t.plugins;o===void 0&&(o=[]);var n=t.strict;n===void 0&&(n=!1);var i=t.devtools;this._committing=!1,this._actions=Object.create(null),this._actionSubscribers=[],this._mutations=Object.create(null),this._wrappedGetters=Object.create(null),this._modules=new Do(t),this._modulesNamespaceMap=Object.create(null),this._subscribers=[],this._makeLocalGettersCache=Object.create(null),this._scope=null,this._devtools=i;var a=this,l=this,s=l.dispatch,d=l.commit;this.dispatch=function(f,p){return s.call(a,f,p)},this.commit=function(f,p,h){return d.call(a,f,p,h)},this.strict=n;var c=this._modules.root.state;nl(this,c,[],this._modules.root),Ac(this,c),o.forEach(function(u){return u(r)})},Bc={state:{configurable:!0}};Vt.prototype.install=function(t,r){t.provide(r||Gp,this),t.config.globalProperties.$store=this;var o=this._devtools!==void 0?this._devtools:!1;o&&Sy(t,this)};Bc.state.get=function(){return this._state.data};Bc.state.set=function(e){};Vt.prototype.commit=function(t,r,o){var n=this,i=Ea(t,r,o),a=i.type,l=i.payload,s={type:a,payload:l},d=this._mutations[a];!d||(this._withCommit(function(){d.forEach(function(u){u(l)})}),this._subscribers.slice().forEach(function(c){return c(s,n.state)}))};Vt.prototype.dispatch=function(t,r){var o=this,n=Ea(t,r),i=n.type,a=n.payload,l={type:i,payload:a},s=this._actions[i];if(!!s){try{this._actionSubscribers.slice().filter(function(c){return c.before}).forEach(function(c){return c.before(l,o.state)})}catch{}var d=s.length>1?Promise.all(s.map(function(c){return c(a)})):s[0](a);return new Promise(function(c,u){d.then(function(f){try{o._actionSubscribers.filter(function(p){return p.after}).forEach(function(p){return p.after(l,o.state)})}catch{}c(f)},function(f){try{o._actionSubscribers.filter(function(p){return p.error}).forEach(function(p){return p.error(l,o.state,f)})}catch{}u(f)})})}};Vt.prototype.subscribe=function(t,r){return Yp(t,this._subscribers,r)};Vt.prototype.subscribeAction=function(t,r){var o=typeof t=="function"?{before:t}:t;return Yp(o,this._actionSubscribers,r)};Vt.prototype.watch=function(t,r,o){var n=this;return De(function(){return t(n.state,n.getters)},r,Object.assign({},o))};Vt.prototype.replaceState=function(t){var r=this;this._withCommit(function(){r._state.data=t})};Vt.prototype.registerModule=function(t,r,o){o===void 0&&(o={}),typeof t=="string"&&(t=[t]),this._modules.register(t,r),nl(this,this.state,t,this._modules.get(t),o.preserveState),Ac(this,this.state)};Vt.prototype.unregisterModule=function(t){var r=this;typeof t=="string"&&(t=[t]),this._modules.unregister(t),this._withCommit(function(){var o=Mc(r.state,t.slice(0,-1));delete o[t[t.length-1]]}),Xp(this)};Vt.prototype.hasModule=function(t){return typeof t=="string"&&(t=[t]),this._modules.isRegistered(t)};Vt.prototype.hotUpdate=function(t){this._modules.update(t),Xp(this,!0)};Vt.prototype._withCommit=function(t){var r=this._committing;this._committing=!0,t(),this._committing=r};Object.defineProperties(Vt.prototype,Bc);var Ey=zy({state:{refresh:Date.now(),theme:localStorage.getItem("PAOPAO_THEME"),collapsedLeft:document.body.clientWidth<=821,collapsedRight:document.body.clientWidth<=821,authModalShow:!1,authModelTab:"signin",userInfo:{id:0,username:"",nickname:""}},mutations:{refresh(e,t){e.refresh=t||Date.now()},triggerTheme(e,t){e.theme=t},triggerAuth(e,t){e.authModalShow=t},triggerAuthKey(e,t){e.authModelTab=t},triggerCollapsedLeft(e,t){e.collapsedLeft=t},triggerCollapsedRight(e,t){e.collapsedRight=t},updateUserinfo(e,t){e.userInfo=t},userLogout(e){localStorage.removeItem("PAOPAO_TOKEN"),e.userInfo={id:0,nickname:"",username:""}}},actions:{},modules:{}});let Ra=[];const nv=new WeakMap;function Ry(){Ra.forEach(e=>e(...nv.get(e))),Ra=[]}function iv(e,...t){nv.set(e,t),!Ra.includes(e)&&Ra.push(e)===1&&requestAnimationFrame(Ry)}function Iu(e,t){let{target:r}=e;for(;r;){if(r.dataset&&r.dataset[t]!==void 0)return!0;r=r.parentElement}return!1}function _i(e){return e.composedPath()[0]||null}function Ou(e){return typeof e=="string"?e.endsWith("px")?Number(e.slice(0,e.length-2)):Number(e):e}function Iy(e){if(e!=null)return typeof e=="number"?`${e}px`:e.endsWith("px")?e:`${e}px`}function av(e,t){const r=e.trim().split(/\s+/g),o={top:r[0]};switch(r.length){case 1:o.right=r[0],o.bottom=r[0],o.left=r[0];break;case 2:o.right=r[1],o.left=r[1],o.bottom=r[0];break;case 3:o.right=r[1],o.bottom=r[2],o.left=r[1];break;case 4:o.right=r[1],o.bottom=r[2],o.left=r[3];break;default:throw new Error("[seemly/getMargin]:"+e+" is not a valid value.")}return t===void 0?o:o[t]}function Oy(e,t){const[r,o]=e.split(" ");return t?t==="row"?r:o:{row:r,col:o||r}}var Au={black:"#000",silver:"#C0C0C0",gray:"#808080",white:"#FFF",maroon:"#800000",red:"#F00",purple:"#800080",fuchsia:"#F0F",green:"#008000",lime:"#0F0",olive:"#808000",yellow:"#FF0",navy:"#000080",blue:"#00F",teal:"#008080",aqua:"#0FF",transparent:"#0000"};const Ln="^\\s*",Hn="\\s*$",To="\\s*((\\.\\d+)|(\\d+(\\.\\d*)?))\\s*",zo="([0-9A-Fa-f])",Eo="([0-9A-Fa-f]{2})",Ay=new RegExp(`${Ln}rgb\\s*\\(${To},${To},${To}\\)${Hn}`),My=new RegExp(`${Ln}rgba\\s*\\(${To},${To},${To},${To}\\)${Hn}`),By=new RegExp(`${Ln}#${zo}${zo}${zo}${Hn}`),Ly=new RegExp(`${Ln}#${Eo}${Eo}${Eo}${Hn}`),Hy=new RegExp(`${Ln}#${zo}${zo}${zo}${zo}${Hn}`),Dy=new RegExp(`${Ln}#${Eo}${Eo}${Eo}${Eo}${Hn}`);function Nt(e){return parseInt(e,16)}function Dr(e){try{let t;if(t=Ly.exec(e))return[Nt(t[1]),Nt(t[2]),Nt(t[3]),1];if(t=Ay.exec(e))return[At(t[1]),At(t[5]),At(t[9]),1];if(t=My.exec(e))return[At(t[1]),At(t[5]),At(t[9]),di(t[13])];if(t=By.exec(e))return[Nt(t[1]+t[1]),Nt(t[2]+t[2]),Nt(t[3]+t[3]),1];if(t=Dy.exec(e))return[Nt(t[1]),Nt(t[2]),Nt(t[3]),di(Nt(t[4])/255)];if(t=Hy.exec(e))return[Nt(t[1]+t[1]),Nt(t[2]+t[2]),Nt(t[3]+t[3]),di(Nt(t[4]+t[4])/255)];if(e in Au)return Dr(Au[e]);throw new Error(`[seemly/rgba]: Invalid color value ${e}.`)}catch(t){throw t}}function Fy(e){return e>1?1:e<0?0:e}function As(e,t,r,o){return`rgba(${At(e)}, ${At(t)}, ${At(r)}, ${Fy(o)})`}function jl(e,t,r,o,n){return At((e*t*(1-o)+r*o)/n)}function xe(e,t){Array.isArray(e)||(e=Dr(e)),Array.isArray(t)||(t=Dr(t));const r=e[3],o=t[3],n=di(r+o-r*o);return As(jl(e[0],r,t[0],o,n),jl(e[1],r,t[1],o,n),jl(e[2],r,t[2],o,n),n)}function oe(e,t){const[r,o,n,i=1]=Array.isArray(e)?e:Dr(e);return t.alpha?As(r,o,n,t.alpha):As(r,o,n,i)}function vt(e,t){const[r,o,n,i=1]=Array.isArray(e)?e:Dr(e),{lightness:a=1,alpha:l=1}=t;return jy([r*a,o*a,n*a,i*l])}function di(e){const t=Math.round(Number(e)*100)/100;return t>1?1:t<0?0:t}function At(e){const t=Math.round(Number(e));return t>255?255:t<0?0:t}function jy(e){const[t,r,o]=e;return 3 in e?`rgba(${At(t)}, ${At(r)}, ${At(o)}, ${di(e[3])})`:`rgba(${At(t)}, ${At(r)}, ${At(o)}, 1)`}function Tn(e=8){return Math.random().toString(16).slice(2,2+e)}function Ny(e,t="default",r=[]){const n=e.$slots[t];return n===void 0?r:n()}function Jt(e,t=[],r){const o={};return t.forEach(n=>{o[n]=e[n]}),Object.assign(o,r)}function Lc(e,t=[],r){const o={};return Object.getOwnPropertyNames(e).forEach(i=>{t.includes(i)||(o[i]=e[i])}),Object.assign(o,r)}function Ao(e,t=!0,r=[]){return e.forEach(o=>{if(o!==null){if(typeof o!="object"){(typeof o=="string"||typeof o=="number")&&r.push(mr(String(o)));return}if(Array.isArray(o)){Ao(o,t,r);return}if(o.type===Je){if(o.children===null)return;Array.isArray(o.children)&&Ao(o.children,t,r)}else o.type!==Dt&&r.push(o)}}),r}function Ae(e,...t){if(Array.isArray(e))e.forEach(r=>Ae(r,...t));else return e(...t)}function sr(e){return Object.keys(e)}const St=(e,...t)=>typeof e=="function"?e(...t):typeof e=="string"?mr(e):typeof e=="number"?mr(String(e)):null;function io(e,t){console.error(`[naive/${e}]: ${t}`)}function il(e,t){throw new Error(`[naive/${e}]: ${t}`)}function Wy(e){switch(typeof e){case"string":return e||void 0;case"number":return String(e);default:return}}function Ms(e,t="default",r=void 0){const o=e[t];if(!o)return io("getFirstSlotVNode",`slot[${t}] is empty`),null;const n=Ao(o(r));return n.length===1?n[0]:(io("getFirstSlotVNode",`slot[${t}] should have exactly one child`),null)}function Vy(e){return t=>{t?e.value=t.$el:e.value=null}}function MM(e){return e}function Li(e){return e.some(t=>$n(t)?!(t.type===Dt||t.type===Je&&!Li(t.children)):!0)?e:null}function Lr(e,t){return e&&Li(e())||t()}function Uy(e,t,r){return e&&Li(e(t))||r(t)}function dt(e,t){const r=e&&Li(e());return t(r||null)}function Ia(e){return!(e&&Li(e()))}const Mu=ae({render(){var e,t;return(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e)}}),Ky=/^(\d|\.)+$/,Bu=/(\d|\.)+/;function ar(e,{c:t=1,offset:r=0,attachPx:o=!0}={}){if(typeof e=="number"){const n=(e+r)*t;return n===0?"0":`${n}px`}else if(typeof e=="string")if(Ky.test(e)){const n=(Number(e)+r)*t;return o?n===0?"0":`${n}px`:`${n}`}else{const n=Bu.exec(e);return n?e.replace(Bu,String((Number(n[0])+r)*t)):e}return e}function zn(e){return e.replace(/#|\(|\)|,|\s/g,"_")}function qy(e){let t=0;for(let r=0;r{let n=qy(o);if(n){if(n===1){e.forEach(a=>{r.push(o.replace("&",a))});return}}else{e.forEach(a=>{r.push((a&&a+" ")+o)});return}let i=[o];for(;n--;){const a=[];i.forEach(l=>{e.forEach(s=>{a.push(l.replace("&",s))})}),i=a}i.forEach(a=>r.push(a))}),r}function Xy(e,t){const r=[];return t.split(lv).forEach(o=>{e.forEach(n=>{r.push((n&&n+" ")+o)})}),r}function Zy(e){let t=[""];return e.forEach(r=>{r=r&&r.trim(),r&&(r.includes("&")?t=Yy(t,r):t=Xy(t,r))}),t.join(", ").replace(Gy," ")}function Lu(e){if(!e)return;const t=e.parentElement;t&&t.removeChild(e)}function al(e){return document.querySelector(`style[cssr-id="${e}"]`)}function Jy(e){const t=document.createElement("style");return t.setAttribute("cssr-id",e),t}function ea(e){return e?/^\s*@(s|m)/.test(e):!1}const Qy=/[A-Z]/g;function sv(e){return e.replace(Qy,t=>"-"+t.toLowerCase())}function ew(e,t=" "){return typeof e=="object"&&e!==null?` { +`+Object.entries(e).map(r=>t+` ${sv(r[0])}: ${r[1]};`).join(` +`)+` +`+t+"}":`: ${e};`}function tw(e,t,r){return typeof e=="function"?e({context:t.context,props:r}):e}function Hu(e,t,r,o){if(!t)return"";const n=tw(t,r,o);if(!n)return"";if(typeof n=="string")return`${e} { +${n} +}`;const i=Object.keys(n);if(i.length===0)return r.config.keepEmptyBlock?e+` { +}`:"";const a=e?[e+" {"]:[];return i.forEach(l=>{const s=n[l];if(l==="raw"){a.push(` +`+s+` +`);return}l=sv(l),s!=null&&a.push(` ${l}${ew(s)}`)}),e&&a.push("}"),a.join(` +`)}function Bs(e,t,r){!e||e.forEach(o=>{if(Array.isArray(o))Bs(o,t,r);else if(typeof o=="function"){const n=o(t);Array.isArray(n)?Bs(n,t,r):n&&r(n)}else o&&r(o)})}function cv(e,t,r,o,n,i){const a=e.$;let l="";if(!a||typeof a=="string")ea(a)?l=a:t.push(a);else if(typeof a=="function"){const c=a({context:o.context,props:n});ea(c)?l=c:t.push(c)}else if(a.before&&a.before(o.context),!a.$||typeof a.$=="string")ea(a.$)?l=a.$:t.push(a.$);else if(a.$){const c=a.$({context:o.context,props:n});ea(c)?l=c:t.push(c)}const s=Zy(t),d=Hu(s,e.props,o,n);l?(r.push(`${l} {`),i&&d&&i.insertRule(`${l} { +${d} +} +`)):(i&&d&&i.insertRule(d),!i&&d.length&&r.push(d)),e.children&&Bs(e.children,{context:o.context,props:n},c=>{if(typeof c=="string"){const u=Hu(s,{raw:c},o,n);i?i.insertRule(u):r.push(u)}else cv(c,t,r,o,n,i)}),t.pop(),l&&r.push("}"),a&&a.after&&a.after(o.context)}function dv(e,t,r,o=!1){const n=[];return cv(e,[],n,t,r,o?e.instance.__styleSheet:void 0),o?"":n.join(` + +`)}function Pi(e){for(var t=0,r,o=0,n=e.length;n>=4;++o,n-=4)r=e.charCodeAt(o)&255|(e.charCodeAt(++o)&255)<<8|(e.charCodeAt(++o)&255)<<16|(e.charCodeAt(++o)&255)<<24,r=(r&65535)*1540483477+((r>>>16)*59797<<16),r^=r>>>24,t=(r&65535)*1540483477+((r>>>16)*59797<<16)^(t&65535)*1540483477+((t>>>16)*59797<<16);switch(n){case 3:t^=(e.charCodeAt(o+2)&255)<<16;case 2:t^=(e.charCodeAt(o+1)&255)<<8;case 1:t^=e.charCodeAt(o)&255,t=(t&65535)*1540483477+((t>>>16)*59797<<16)}return t^=t>>>13,t=(t&65535)*1540483477+((t>>>16)*59797<<16),((t^t>>>15)>>>0).toString(36)}typeof window!="undefined"&&(window.__cssrContext={});function rw(e,t,r){const{els:o}=t;if(r===void 0)o.forEach(Lu),t.els=[];else{const n=al(r);n&&o.includes(n)&&(Lu(n),t.els=o.filter(i=>i!==n))}}function Du(e,t){e.push(t)}function ow(e,t,r,o,n,i,a,l,s){if(i&&!s){if(r===void 0){console.error("[css-render/mount]: `id` is required in `silent` mode.");return}const f=window.__cssrContext;f[r]||(f[r]=!0,dv(t,e,o,i));return}let d;if(r===void 0&&(d=t.render(o),r=Pi(d)),s){s.adapter(r,d!=null?d:t.render(o));return}const c=al(r);if(c!==null&&!a)return c;const u=c!=null?c:Jy(r);if(d===void 0&&(d=t.render(o)),u.textContent=d,c!==null)return c;if(l){const f=document.head.querySelector(`meta[name="${l}"]`);if(f)return document.head.insertBefore(u,f),Du(t.els,u),u}return n?document.head.insertBefore(u,document.head.querySelector("style, link")):document.head.appendChild(u),Du(t.els,u),u}function nw(e){return dv(this,this.instance,e)}function iw(e={}){const{id:t,ssr:r,props:o,head:n=!1,silent:i=!1,force:a=!1,anchorMetaName:l}=e;return ow(this.instance,this,t,o,n,i,a,l,r)}function aw(e={}){const{id:t}=e;rw(this.instance,this,t)}const ta=function(e,t,r,o){return{instance:e,$:t,props:r,children:o,els:[],render:nw,mount:iw,unmount:aw}},lw=function(e,t,r,o){return Array.isArray(t)?ta(e,{$:null},null,t):Array.isArray(r)?ta(e,t,null,r):Array.isArray(o)?ta(e,t,r,o):ta(e,t,r,null)};function uv(e={}){let t=null;const r={c:(...o)=>lw(r,...o),use:(o,...n)=>o.install(r,...n),find:al,context:{},config:e,get __styleSheet(){if(!t){const o=document.createElement("style");return document.head.appendChild(o),t=document.styleSheets[document.styleSheets.length-1],t}return t}};return r}function sw(e,t){if(e===void 0)return!1;if(t){const{context:{ids:r}}=t;return r.has(e)}return al(e)!==null}function cw(e){let t=".",r="__",o="--",n;if(e){let h=e.blockPrefix;h&&(t=h),h=e.elementPrefix,h&&(r=h),h=e.modifierPrefix,h&&(o=h)}const i={install(h){n=h.c;const g=h.context;g.bem={},g.bem.b=null,g.bem.els=null}};function a(h){let g,b;return{before(m){g=m.bem.b,b=m.bem.els,m.bem.els=null},after(m){m.bem.b=g,m.bem.els=b},$({context:m,props:y}){return h=typeof h=="string"?h:h({context:m,props:y}),m.bem.b=h,`${(y==null?void 0:y.bPrefix)||t}${m.bem.b}`}}}function l(h){let g;return{before(b){g=b.bem.els},after(b){b.bem.els=g},$({context:b,props:m}){return h=typeof h=="string"?h:h({context:b,props:m}),b.bem.els=h.split(",").map(y=>y.trim()),b.bem.els.map(y=>`${(m==null?void 0:m.bPrefix)||t}${b.bem.b}${r}${y}`).join(", ")}}}function s(h){return{$({context:g,props:b}){h=typeof h=="string"?h:h({context:g,props:b});const m=h.split(",").map(x=>x.trim());function y(x){return m.map(k=>`&${(b==null?void 0:b.bPrefix)||t}${g.bem.b}${x!==void 0?`${r}${x}`:""}${o}${k}`).join(", ")}const w=g.bem.els;return w!==null?y(w[0]):y()}}}function d(h){return{$({context:g,props:b}){h=typeof h=="string"?h:h({context:g,props:b});const m=g.bem.els;return`&:not(${(b==null?void 0:b.bPrefix)||t}${g.bem.b}${m!==null&&m.length>0?`${r}${m[0]}`:""}${o}${h})`}}}return Object.assign(i,{cB:(...h)=>n(a(h[0]),h[1],h[2]),cE:(...h)=>n(l(h[0]),h[1],h[2]),cM:(...h)=>n(s(h[0]),h[1],h[2]),cNotM:(...h)=>n(d(h[0]),h[1],h[2])}),i}function ie(e,t){return e+(t==="default"?"":t.replace(/^[a-z]/,r=>r.toUpperCase()))}ie("abc","def");const dw="n",ki=`.${dw}-`,uw="__",fw="--",fv=uv(),hv=cw({blockPrefix:ki,elementPrefix:uw,modifierPrefix:fw});fv.use(hv);const{c:O,find:BM}=fv,{cB:M,cE:D,cM:K,cNotM:ut}=hv;function Hc(e){return O(({props:{bPrefix:t}})=>`${t||ki}modal, ${t||ki}drawer`,[e])}function pv(e){return O(({props:{bPrefix:t}})=>`${t||ki}popover`,[e])}function vv(e){return O(({props:{bPrefix:t}})=>`&${t||ki}modal`,e)}const hw=(...e)=>O(">",[M(...e)]);let Nl;function pw(){return Nl===void 0&&(Nl=navigator.userAgent.includes("Node.js")||navigator.userAgent.includes("jsdom")),Nl}const Fo=typeof document!="undefined"&&typeof window!="undefined",mv=new WeakSet;function LM(e){mv.add(e)}function vw(e){return!mv.has(e)}function mw(e,t,r){var o;const n=me(e,null);if(n===null)return;const i=(o=Wr())===null||o===void 0?void 0:o.proxy;De(r,a),a(r.value),ht(()=>{a(void 0,r.value)});function a(d,c){const u=n[t];c!==void 0&&l(u,c),d!==void 0&&s(u,d)}function l(d,c){d[c]||(d[c]=[]),d[c].splice(d[c].findIndex(u=>u===i),1)}function s(d,c){d[c]||(d[c]=[]),~d[c].findIndex(u=>u===i)||d[c].push(i)}}function gw(e,t,r){if(!t)return e;const o=V(e.value);let n=null;return De(e,i=>{n!==null&&window.clearTimeout(n),i===!0?r&&!r.value?o.value=!0:n=window.setTimeout(()=>{o.value=!0},t):o.value=!1}),o}function bw(e){const t=V(!!e.value);if(t.value)return kr(t);const r=De(e,o=>{o&&(t.value=!0,r())});return kr(t)}function mt(e){const t=H(e),r=V(t.value);return De(t,o=>{r.value=o}),typeof e=="function"?r:{__v_isRef:!0,get value(){return r.value},set value(o){e.set(o)}}}function Dc(){return Wr()!==null}const Fc=typeof window!="undefined";let xn,ui;const xw=()=>{var e,t;xn=Fc?(t=(e=document)===null||e===void 0?void 0:e.fonts)===null||t===void 0?void 0:t.ready:void 0,ui=!1,xn!==void 0?xn.then(()=>{ui=!0}):ui=!0};xw();function gv(e){if(ui)return;let t=!1;gt(()=>{ui||xn==null||xn.then(()=>{t||e()})}),ht(()=>{t=!0})}function xa(e){return e.composedPath()[0]}const Cw={mousemoveoutside:new WeakMap,clickoutside:new WeakMap};function yw(e,t,r){if(e==="mousemoveoutside"){const o=n=>{t.contains(xa(n))||r(n)};return{mousemove:o,touchstart:o}}else if(e==="clickoutside"){let o=!1;const n=a=>{o=!t.contains(xa(a))},i=a=>{!o||t.contains(xa(a))||r(a)};return{mousedown:n,mouseup:i,touchstart:n,touchend:i}}return console.error(`[evtd/create-trap-handler]: name \`${e}\` is invalid. This could be a bug of evtd.`),{}}function bv(e,t,r){const o=Cw[e];let n=o.get(t);n===void 0&&o.set(t,n=new WeakMap);let i=n.get(r);return i===void 0&&n.set(r,i=yw(e,t,r)),i}function ww(e,t,r,o){if(e==="mousemoveoutside"||e==="clickoutside"){const n=bv(e,t,r);return Object.keys(n).forEach(i=>{Qe(i,document,n[i],o)}),!0}return!1}function Sw(e,t,r,o){if(e==="mousemoveoutside"||e==="clickoutside"){const n=bv(e,t,r);return Object.keys(n).forEach(i=>{Ue(i,document,n[i],o)}),!0}return!1}function $w(){if(typeof window=="undefined")return{on:()=>{},off:()=>{}};const e=new WeakMap,t=new WeakMap;function r(){e.set(this,!0)}function o(){e.set(this,!0),t.set(this,!0)}function n(S,$,R){const _=S[$];return S[$]=function(){return R.apply(S,arguments),_.apply(S,arguments)},S}function i(S,$){S[$]=Event.prototype[$]}const a=new WeakMap,l=Object.getOwnPropertyDescriptor(Event.prototype,"currentTarget");function s(){var S;return(S=a.get(this))!==null&&S!==void 0?S:null}function d(S,$){l!==void 0&&Object.defineProperty(S,"currentTarget",{configurable:!0,enumerable:!0,get:$!=null?$:l.get})}const c={bubble:{},capture:{}},u={};function f(){const S=function($){const{type:R,eventPhase:_,bubbles:N}=$,E=xa($);if(_===2)return;const F=_===1?"capture":"bubble";let j=E;const Q=[];for(;j===null&&(j=window),Q.push(j),j!==window;)j=j.parentNode||null;const A=c.capture[R],X=c.bubble[R];if(n($,"stopPropagation",r),n($,"stopImmediatePropagation",o),d($,s),F==="capture"){if(A===void 0)return;for(let ne=Q.length-1;ne>=0&&!e.has($);--ne){const pe=Q[ne],Ce=A.get(pe);if(Ce!==void 0){a.set($,pe);for(const $e of Ce){if(t.has($))break;$e($)}}if(ne===0&&!N&&X!==void 0){const $e=X.get(pe);if($e!==void 0)for(const _e of $e){if(t.has($))break;_e($)}}}}else if(F==="bubble"){if(X===void 0)return;for(let ne=0;neE($))};return S.displayName="evtdUnifiedWindowEventHandler",S}const h=f(),g=p();function b(S,$){const R=c[S];return R[$]===void 0&&(R[$]=new Map,window.addEventListener($,h,S==="capture")),R[$]}function m(S){return u[S]===void 0&&(u[S]=new Set,window.addEventListener(S,g)),u[S]}function y(S,$){let R=S.get($);return R===void 0&&S.set($,R=new Set),R}function w(S,$,R,_){const N=c[$][R];if(N!==void 0){const E=N.get(S);if(E!==void 0&&E.has(_))return!0}return!1}function x(S,$){const R=u[S];return!!(R!==void 0&&R.has($))}function k(S,$,R,_){let N;if(typeof _=="object"&&_.once===!0?N=A=>{T(S,$,N,_),R(A)}:N=R,ww(S,$,N,_))return;const F=_===!0||typeof _=="object"&&_.capture===!0?"capture":"bubble",j=b(F,S),Q=y(j,$);if(Q.has(N)||Q.add(N),$===window){const A=m(S);A.has(N)||A.add(N)}}function T(S,$,R,_){if(Sw(S,$,R,_))return;const E=_===!0||typeof _=="object"&&_.capture===!0,F=E?"capture":"bubble",j=b(F,S),Q=y(j,$);if($===window&&!w($,E?"bubble":"capture",S,R)&&x(S,R)){const X=u[S];X.delete(R),X.size===0&&(window.removeEventListener(S,g),u[S]=void 0)}Q.has(R)&&Q.delete(R),Q.size===0&&j.delete($),j.size===0&&(window.removeEventListener(S,h,F==="capture"),c[F][S]=void 0)}return{on:k,off:T}}const{on:Qe,off:Ue}=$w(),oi=V(null);function Fu(e){if(e.clientX>0||e.clientY>0)oi.value={x:e.clientX,y:e.clientY};else{const{target:t}=e;if(t instanceof Element){const{left:r,top:o,width:n,height:i}=t.getBoundingClientRect();r>0||o>0?oi.value={x:r+n/2,y:o+i/2}:oi.value={x:0,y:0}}else oi.value=null}}let ra=0,ju=!0;function xv(){if(!Fc)return kr(V(null));ra===0&&Qe("click",document,Fu,!0);const e=()=>{ra+=1};return ju&&(ju=Dc())?(Nr(e),ht(()=>{ra-=1,ra===0&&Ue("click",document,Fu,!0)})):e(),kr(oi)}const _w=V(void 0);let oa=0;function Nu(){_w.value=Date.now()}let Wu=!0;function Cv(e){if(!Fc)return kr(V(!1));const t=V(!1);let r=null;function o(){r!==null&&window.clearTimeout(r)}function n(){o(),t.value=!0,r=window.setTimeout(()=>{t.value=!1},e)}oa===0&&Qe("click",window,Nu,!0);const i=()=>{oa+=1,Qe("click",window,n,!0)};return Wu&&(Wu=Dc())?(Nr(i),ht(()=>{oa-=1,oa===0&&Ue("click",window,Nu,!0),Ue("click",window,n,!0),o()})):i(),kr(t)}function En(e,t){return De(e,r=>{r!==void 0&&(t.value=r)}),H(()=>e.value===void 0?t.value:e.value)}function Hi(){const e=V(!1);return gt(()=>{e.value=!0}),kr(e)}function Ti(e,t){return H(()=>{for(const r of t)if(e[r]!==void 0)return e[r];return e[t[t.length-1]]})}const Pw=(typeof window=="undefined"?!1:/iPad|iPhone|iPod/.test(navigator.platform)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1)&&!window.MSStream;function kw(){return Pw}function Tw(e={},t){const r=vr({ctrl:!1,command:!1,win:!1,shift:!1,tab:!1}),{keydown:o,keyup:n}=e,i=s=>{switch(s.key){case"Control":r.ctrl=!0;break;case"Meta":r.command=!0,r.win=!0;break;case"Shift":r.shift=!0;break;case"Tab":r.tab=!0;break}o!==void 0&&Object.keys(o).forEach(d=>{if(d!==s.key)return;const c=o[d];if(typeof c=="function")c(s);else{const{stop:u=!1,prevent:f=!1}=c;u&&s.stopPropagation(),f&&s.preventDefault(),c.handler(s)}})},a=s=>{switch(s.key){case"Control":r.ctrl=!1;break;case"Meta":r.command=!1,r.win=!1;break;case"Shift":r.shift=!1;break;case"Tab":r.tab=!1;break}n!==void 0&&Object.keys(n).forEach(d=>{if(d!==s.key)return;const c=n[d];if(typeof c=="function")c(s);else{const{stop:u=!1,prevent:f=!1}=c;u&&s.stopPropagation(),f&&s.preventDefault(),c.handler(s)}})},l=()=>{(t===void 0||t.value)&&(Qe("keydown",document,i),Qe("keyup",document,a)),t!==void 0&&De(t,s=>{s?(Qe("keydown",document,i),Qe("keyup",document,a)):(Ue("keydown",document,i),Ue("keyup",document,a))})};return Dc()?(Nr(l),ht(()=>{(t===void 0||t.value)&&(Ue("keydown",document,i),Ue("keyup",document,a))})):l(),kr(r)}const HM="n-internal-select-menu",zw="n-internal-select-menu-body",ll="n-modal-body",yv="n-modal",sl="n-drawer-body",Di="n-popover-body",wv="__disabled__";function Rn(e){const t=me(ll,null),r=me(sl,null),o=me(Di,null),n=me(zw,null),i=V();if(typeof document!="undefined"){i.value=document.fullscreenElement;const a=()=>{i.value=document.fullscreenElement};gt(()=>{Qe("fullscreenchange",document,a)}),ht(()=>{Ue("fullscreenchange",document,a)})}return mt(()=>{var a;const{to:l}=e;return l!==void 0?l===!1?wv:l===!0?i.value||"body":l:t!=null&&t.value?(a=t.value.$el)!==null&&a!==void 0?a:t.value:r!=null&&r.value?r.value:o!=null&&o.value?o.value:n!=null&&n.value?n.value:l!=null?l:i.value||"body"})}Rn.tdkey=wv;Rn.propTo={type:[String,Object,Boolean],default:void 0};function Ls(e,t,r="default"){const o=t[r];if(o===void 0)throw new Error(`[vueuc/${e}]: slot[${r}] is empty.`);return o()}function Hs(e,t=!0,r=[]){return e.forEach(o=>{if(o!==null){if(typeof o!="object"){(typeof o=="string"||typeof o=="number")&&r.push(mr(String(o)));return}if(Array.isArray(o)){Hs(o,t,r);return}if(o.type===Je){if(o.children===null)return;Array.isArray(o.children)&&Hs(o.children,t,r)}else o.type!==Dt&&r.push(o)}}),r}function Vu(e,t,r="default"){const o=t[r];if(o===void 0)throw new Error(`[vueuc/${e}]: slot[${r}] is empty.`);const n=Hs(o());if(n.length===1)return n[0];throw new Error(`[vueuc/${e}]: slot[${r}] should have exactly one child.`)}let Zr=null;function Sv(){if(Zr===null&&(Zr=document.getElementById("v-binder-view-measurer"),Zr===null)){Zr=document.createElement("div"),Zr.id="v-binder-view-measurer";const{style:e}=Zr;e.position="fixed",e.left="0",e.right="0",e.top="0",e.bottom="0",e.pointerEvents="none",e.visibility="hidden",document.body.appendChild(Zr)}return Zr.getBoundingClientRect()}function Ew(e,t){const r=Sv();return{top:t,left:e,height:0,width:0,right:r.width-e,bottom:r.height-t}}function Wl(e){const t=e.getBoundingClientRect(),r=Sv();return{left:t.left-r.left,top:t.top-r.top,bottom:r.height+r.top-t.bottom,right:r.width+r.left-t.right,width:t.width,height:t.height}}function Rw(e){return e.nodeType===9?null:e.parentNode}function $v(e){if(e===null)return null;const t=Rw(e);if(t===null)return null;if(t.nodeType===9)return document;if(t.nodeType===1){const{overflow:r,overflowX:o,overflowY:n}=getComputedStyle(t);if(/(auto|scroll|overlay)/.test(r+n+o))return t}return $v(t)}const Iw=ae({name:"Binder",props:{syncTargetWithParent:Boolean,syncTarget:{type:Boolean,default:!0}},setup(e){var t;Be("VBinder",(t=Wr())===null||t===void 0?void 0:t.proxy);const r=me("VBinder",null),o=V(null),n=m=>{o.value=m,r&&e.syncTargetWithParent&&r.setTargetRef(m)};let i=[];const a=()=>{let m=o.value;for(;m=$v(m),m!==null;)i.push(m);for(const y of i)Qe("scroll",y,u,!0)},l=()=>{for(const m of i)Ue("scroll",m,u,!0);i=[]},s=new Set,d=m=>{s.size===0&&a(),s.has(m)||s.add(m)},c=m=>{s.has(m)&&s.delete(m),s.size===0&&l()},u=()=>{iv(f)},f=()=>{s.forEach(m=>m())},p=new Set,h=m=>{p.size===0&&Qe("resize",window,b),p.has(m)||p.add(m)},g=m=>{p.has(m)&&p.delete(m),p.size===0&&Ue("resize",window,b)},b=()=>{p.forEach(m=>m())};return ht(()=>{Ue("resize",window,b),l()}),{targetRef:o,setTargetRef:n,addScrollListener:d,removeScrollListener:c,addResizeListener:h,removeResizeListener:g}},render(){return Ls("binder",this.$slots)}});var _v=Iw,Pv=ae({name:"Target",setup(){const{setTargetRef:e,syncTarget:t}=me("VBinder");return{syncTarget:t,setTargetDirective:{mounted:e,updated:e}}},render(){const{syncTarget:e,setTargetDirective:t}=this;return e?Tr(Vu("follower",this.$slots),[[t]]):Vu("follower",this.$slots)}});const Jo="@@mmoContext",Ow={mounted(e,{value:t}){e[Jo]={handler:void 0},typeof t=="function"&&(e[Jo].handler=t,Qe("mousemoveoutside",e,t))},updated(e,{value:t}){const r=e[Jo];typeof t=="function"?r.handler?r.handler!==t&&(Ue("mousemoveoutside",e,r.handler),r.handler=t,Qe("mousemoveoutside",e,t)):(e[Jo].handler=t,Qe("mousemoveoutside",e,t)):r.handler&&(Ue("mousemoveoutside",e,r.handler),r.handler=void 0)},unmounted(e){const{handler:t}=e[Jo];t&&Ue("mousemoveoutside",e,t),e[Jo].handler=void 0}};var Aw=Ow;const Qo="@@coContext",Mw={mounted(e,{value:t,modifiers:r}){e[Qo]={handler:void 0},typeof t=="function"&&(e[Qo].handler=t,Qe("clickoutside",e,t,{capture:r.capture}))},updated(e,{value:t,modifiers:r}){const o=e[Qo];typeof t=="function"?o.handler?o.handler!==t&&(Ue("clickoutside",e,o.handler,{capture:r.capture}),o.handler=t,Qe("clickoutside",e,t,{capture:r.capture})):(e[Qo].handler=t,Qe("clickoutside",e,t,{capture:r.capture})):o.handler&&(Ue("clickoutside",e,o.handler,{capture:r.capture}),o.handler=void 0)},unmounted(e,{modifiers:t}){const{handler:r}=e[Qo];r&&Ue("clickoutside",e,r,{capture:t.capture}),e[Qo].handler=void 0}};var Ds=Mw;function Bw(e,t){console.error(`[vdirs/${e}]: ${t}`)}class Lw{constructor(){this.elementZIndex=new Map,this.nextZIndex=2e3}get elementCount(){return this.elementZIndex.size}ensureZIndex(t,r){const{elementZIndex:o}=this;if(r!==void 0){t.style.zIndex=`${r}`,o.delete(t);return}const{nextZIndex:n}=this;o.has(t)&&o.get(t)+1===this.nextZIndex||(t.style.zIndex=`${n}`,o.set(t,n),this.nextZIndex=n+1,this.squashState())}unregister(t,r){const{elementZIndex:o}=this;o.has(t)?o.delete(t):r===void 0&&Bw("z-index-manager/unregister-element","Element not found when unregistering."),this.squashState()}squashState(){const{elementCount:t}=this;t||(this.nextZIndex=2e3),this.nextZIndex-t>2500&&this.rearrange()}rearrange(){const t=Array.from(this.elementZIndex.entries());t.sort((r,o)=>r[1]-o[1]),this.nextZIndex=2e3,t.forEach(r=>{const o=r[0],n=this.nextZIndex++;`${n}`!==o.style.zIndex&&(o.style.zIndex=`${n}`)})}}var Vl=new Lw;const en="@@ziContext",Hw={mounted(e,t){const{value:r={}}=t,{zIndex:o,enabled:n}=r;e[en]={enabled:!!n,initialized:!1},n&&(Vl.ensureZIndex(e,o),e[en].initialized=!0)},updated(e,t){const{value:r={}}=t,{zIndex:o,enabled:n}=r,i=e[en].enabled;n&&!i&&(Vl.ensureZIndex(e,o),e[en].initialized=!0),e[en].enabled=!!n},unmounted(e,t){if(!e[en].initialized)return;const{value:r={}}=t,{zIndex:o}=r;Vl.unregister(e,o)}};var cl=Hw;const kv=Symbol("@css-render/vue3-ssr");function Dw(e,t){return``}function Fw(e,t){const r=me(kv,null);if(r===null){console.error("[css-render/vue3-ssr]: no ssr context found.");return}const{styles:o,ids:n}=r;n.has(e)||o!==null&&(n.add(e),o.push(Dw(e,t)))}const jw=typeof document!="undefined";function Dn(){if(jw)return;const e=me(kv,null);if(e!==null)return{adapter:Fw,context:e}}function Uu(e,t){console.error(`[vueuc/${e}]: ${t}`)}const{c:dn}=uv(),Tv="vueuc-style";function Ku(e){return typeof e=="string"?document.querySelector(e):e()}var jc=ae({name:"LazyTeleport",props:{to:{type:[String,Object],default:void 0},disabled:Boolean,show:{type:Boolean,required:!0}},setup(e){return{showTeleport:bw(Te(e,"show")),mergedTo:H(()=>{const{to:t}=e;return t!=null?t:"body"})}},render(){return this.showTeleport?this.disabled?Ls("lazy-teleport",this.$slots):v(wp,{disabled:this.disabled,to:this.mergedTo},Ls("lazy-teleport",this.$slots)):null}});const na={top:"bottom",bottom:"top",left:"right",right:"left"},qu={start:"end",center:"center",end:"start"},Ul={top:"height",bottom:"height",left:"width",right:"width"},Nw={"bottom-start":"top left",bottom:"top center","bottom-end":"top right","top-start":"bottom left",top:"bottom center","top-end":"bottom right","right-start":"top left",right:"center left","right-end":"bottom left","left-start":"top right",left:"center right","left-end":"bottom right"},Ww={"bottom-start":"bottom left",bottom:"bottom center","bottom-end":"bottom right","top-start":"top left",top:"top center","top-end":"top right","right-start":"top right",right:"center right","right-end":"bottom right","left-start":"top left",left:"center left","left-end":"bottom left"},Vw={"bottom-start":"right","bottom-end":"left","top-start":"right","top-end":"left","right-start":"bottom","right-end":"top","left-start":"bottom","left-end":"top"},Gu={top:!0,bottom:!1,left:!0,right:!1},Yu={top:"end",bottom:"start",left:"end",right:"start"};function Uw(e,t,r,o,n,i){if(!n||i)return{placement:e,top:0,left:0};const[a,l]=e.split("-");let s=l!=null?l:"center",d={top:0,left:0};const c=(p,h,g)=>{let b=0,m=0;const y=r[p]-t[h]-t[p];return y>0&&o&&(g?m=Gu[h]?y:-y:b=Gu[h]?y:-y),{left:b,top:m}},u=a==="left"||a==="right";if(s!=="center"){const p=Vw[e],h=na[p],g=Ul[p];if(r[g]>t[g]){if(t[p]+t[g]t[h]&&(s=qu[l])}else{const p=a==="bottom"||a==="top"?"left":"top",h=na[p],g=Ul[p],b=(r[g]-t[g])/2;(t[p]t[h]?(s=Yu[p],d=c(g,p,u)):(s=Yu[h],d=c(g,h,u)))}let f=a;return t[a] *",{pointerEvents:"all"})])]);var zv=ae({name:"Follower",inheritAttrs:!1,props:{show:Boolean,enabled:{type:Boolean,default:void 0},placement:{type:String,default:"bottom"},syncTrigger:{type:Array,default:["resize","scroll"]},to:[String,Object],flip:{type:Boolean,default:!0},internalShift:Boolean,x:Number,y:Number,width:String,minWidth:String,containerClass:String,teleportDisabled:Boolean,zindexable:{type:Boolean,default:!0},zIndex:Number,overlap:Boolean},setup(e){const t=me("VBinder"),r=mt(()=>e.enabled!==void 0?e.enabled:e.show),o=V(null),n=V(null),i=()=>{const{syncTrigger:f}=e;f.includes("scroll")&&t.addScrollListener(s),f.includes("resize")&&t.addResizeListener(s)},a=()=>{t.removeScrollListener(s),t.removeResizeListener(s)};gt(()=>{r.value&&(s(),i())});const l=Dn();Gw.mount({id:"vueuc/binder",head:!0,anchorMetaName:Tv,ssr:l}),ht(()=>{a()}),gv(()=>{r.value&&s()});const s=()=>{if(!r.value)return;const f=o.value;if(f===null)return;const p=t.targetRef,{x:h,y:g,overlap:b}=e,m=h!==void 0&&g!==void 0?Ew(h,g):Wl(p);f.style.setProperty("--v-target-width",`${Math.round(m.width)}px`),f.style.setProperty("--v-target-height",`${Math.round(m.height)}px`);const{width:y,minWidth:w,placement:x,internalShift:k,flip:T}=e;f.setAttribute("v-placement",x),b?f.setAttribute("v-overlap",""):f.removeAttribute("v-overlap");const{style:S}=f;y==="target"?S.width=`${m.width}px`:y!==void 0?S.width=y:S.width="",w==="target"?S.minWidth=`${m.width}px`:w!==void 0?S.minWidth=w:S.minWidth="";const $=Wl(f),R=Wl(n.value),{left:_,top:N,placement:E}=Uw(x,m,$,k,T,b),F=Kw(E,b),{left:j,top:Q,transform:A}=qw(E,R,m,N,_,b);f.setAttribute("v-placement",E),f.style.setProperty("--v-offset-left",`${Math.round(_)}px`),f.style.setProperty("--v-offset-top",`${Math.round(N)}px`),f.style.transform=`translateX(${j}) translateY(${Q}) ${A}`,f.style.setProperty("--v-transform-origin",F),f.style.transformOrigin=F};De(r,f=>{f?(i(),d()):a()});const d=()=>{Zt().then(s).catch(f=>console.error(f))};["placement","x","y","internalShift","flip","width","overlap","minWidth"].forEach(f=>{De(Te(e,f),s)}),["teleportDisabled"].forEach(f=>{De(Te(e,f),d)}),De(Te(e,"syncTrigger"),f=>{f.includes("resize")?t.addResizeListener(s):t.removeResizeListener(s),f.includes("scroll")?t.addScrollListener(s):t.removeScrollListener(s)});const c=Hi(),u=mt(()=>{const{to:f}=e;if(f!==void 0)return f;c.value});return{VBinder:t,mergedEnabled:r,offsetContainerRef:n,followerRef:o,mergedTo:u,syncPosition:s}},render(){return v(jc,{show:this.show,to:this.mergedTo,disabled:this.teleportDisabled},{default:()=>{var e,t;const r=v("div",{class:["v-binder-follower-container",this.containerClass],ref:"offsetContainerRef"},[v("div",{class:"v-binder-follower-content",ref:"followerRef"},(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e))]);return this.zindexable?Tr(r,[[cl,{enabled:this.mergedEnabled,zIndex:this.zIndex}]]):r}})}}),Mo=[],Yw=function(){return Mo.some(function(e){return e.activeTargets.length>0})},Xw=function(){return Mo.some(function(e){return e.skippedTargets.length>0})},Xu="ResizeObserver loop completed with undelivered notifications.",Zw=function(){var e;typeof ErrorEvent=="function"?e=new ErrorEvent("error",{message:Xu}):(e=document.createEvent("Event"),e.initEvent("error",!1,!1),e.message=Xu),window.dispatchEvent(e)},zi;(function(e){e.BORDER_BOX="border-box",e.CONTENT_BOX="content-box",e.DEVICE_PIXEL_CONTENT_BOX="device-pixel-content-box"})(zi||(zi={}));var Bo=function(e){return Object.freeze(e)},Jw=function(){function e(t,r){this.inlineSize=t,this.blockSize=r,Bo(this)}return e}(),Ev=function(){function e(t,r,o,n){return this.x=t,this.y=r,this.width=o,this.height=n,this.top=this.y,this.left=this.x,this.bottom=this.top+this.height,this.right=this.left+this.width,Bo(this)}return e.prototype.toJSON=function(){var t=this,r=t.x,o=t.y,n=t.top,i=t.right,a=t.bottom,l=t.left,s=t.width,d=t.height;return{x:r,y:o,top:n,right:i,bottom:a,left:l,width:s,height:d}},e.fromRect=function(t){return new e(t.x,t.y,t.width,t.height)},e}(),Nc=function(e){return e instanceof SVGElement&&"getBBox"in e},Rv=function(e){if(Nc(e)){var t=e.getBBox(),r=t.width,o=t.height;return!r&&!o}var n=e,i=n.offsetWidth,a=n.offsetHeight;return!(i||a||e.getClientRects().length)},Zu=function(e){var t;if(e instanceof Element)return!0;var r=(t=e==null?void 0:e.ownerDocument)===null||t===void 0?void 0:t.defaultView;return!!(r&&e instanceof r.Element)},Qw=function(e){switch(e.tagName){case"INPUT":if(e.type!=="image")break;case"VIDEO":case"AUDIO":case"EMBED":case"OBJECT":case"CANVAS":case"IFRAME":case"IMG":return!0}return!1},fi=typeof window!="undefined"?window:{},ia=new WeakMap,Ju=/auto|scroll/,eS=/^tb|vertical/,tS=/msie|trident/i.test(fi.navigator&&fi.navigator.userAgent),Cr=function(e){return parseFloat(e||"0")},Cn=function(e,t,r){return e===void 0&&(e=0),t===void 0&&(t=0),r===void 0&&(r=!1),new Jw((r?t:e)||0,(r?e:t)||0)},Qu=Bo({devicePixelContentBoxSize:Cn(),borderBoxSize:Cn(),contentBoxSize:Cn(),contentRect:new Ev(0,0,0,0)}),Iv=function(e,t){if(t===void 0&&(t=!1),ia.has(e)&&!t)return ia.get(e);if(Rv(e))return ia.set(e,Qu),Qu;var r=getComputedStyle(e),o=Nc(e)&&e.ownerSVGElement&&e.getBBox(),n=!tS&&r.boxSizing==="border-box",i=eS.test(r.writingMode||""),a=!o&&Ju.test(r.overflowY||""),l=!o&&Ju.test(r.overflowX||""),s=o?0:Cr(r.paddingTop),d=o?0:Cr(r.paddingRight),c=o?0:Cr(r.paddingBottom),u=o?0:Cr(r.paddingLeft),f=o?0:Cr(r.borderTopWidth),p=o?0:Cr(r.borderRightWidth),h=o?0:Cr(r.borderBottomWidth),g=o?0:Cr(r.borderLeftWidth),b=u+d,m=s+c,y=g+p,w=f+h,x=l?e.offsetHeight-w-e.clientHeight:0,k=a?e.offsetWidth-y-e.clientWidth:0,T=n?b+y:0,S=n?m+w:0,$=o?o.width:Cr(r.width)-T-k,R=o?o.height:Cr(r.height)-S-x,_=$+b+k+y,N=R+m+x+w,E=Bo({devicePixelContentBoxSize:Cn(Math.round($*devicePixelRatio),Math.round(R*devicePixelRatio),i),borderBoxSize:Cn(_,N,i),contentBoxSize:Cn($,R,i),contentRect:new Ev(u,s,$,R)});return ia.set(e,E),E},Ov=function(e,t,r){var o=Iv(e,r),n=o.borderBoxSize,i=o.contentBoxSize,a=o.devicePixelContentBoxSize;switch(t){case zi.DEVICE_PIXEL_CONTENT_BOX:return a;case zi.BORDER_BOX:return n;default:return i}},rS=function(){function e(t){var r=Iv(t);this.target=t,this.contentRect=r.contentRect,this.borderBoxSize=Bo([r.borderBoxSize]),this.contentBoxSize=Bo([r.contentBoxSize]),this.devicePixelContentBoxSize=Bo([r.devicePixelContentBoxSize])}return e}(),Av=function(e){if(Rv(e))return 1/0;for(var t=0,r=e.parentNode;r;)t+=1,r=r.parentNode;return t},oS=function(){var e=1/0,t=[];Mo.forEach(function(a){if(a.activeTargets.length!==0){var l=[];a.activeTargets.forEach(function(d){var c=new rS(d.target),u=Av(d.target);l.push(c),d.lastReportedSize=Ov(d.target,d.observedBox),ue?r.activeTargets.push(n):r.skippedTargets.push(n))})})},nS=function(){var e=0;for(ef(e);Yw();)e=oS(),ef(e);return Xw()&&Zw(),e>0},Kl,Mv=[],iS=function(){return Mv.splice(0).forEach(function(e){return e()})},aS=function(e){if(!Kl){var t=0,r=document.createTextNode(""),o={characterData:!0};new MutationObserver(function(){return iS()}).observe(r,o),Kl=function(){r.textContent="".concat(t?t--:t++)}}Mv.push(e),Kl()},lS=function(e){aS(function(){requestAnimationFrame(e)})},Ca=0,sS=function(){return!!Ca},cS=250,dS={attributes:!0,characterData:!0,childList:!0,subtree:!0},tf=["resize","load","transitionend","animationend","animationstart","animationiteration","keyup","keydown","mouseup","mousedown","mouseover","mouseout","blur","focus"],rf=function(e){return e===void 0&&(e=0),Date.now()+e},ql=!1,uS=function(){function e(){var t=this;this.stopped=!0,this.listener=function(){return t.schedule()}}return e.prototype.run=function(t){var r=this;if(t===void 0&&(t=cS),!ql){ql=!0;var o=rf(t);lS(function(){var n=!1;try{n=nS()}finally{if(ql=!1,t=o-rf(),!sS())return;n?r.run(1e3):t>0?r.run(t):r.start()}})}},e.prototype.schedule=function(){this.stop(),this.run()},e.prototype.observe=function(){var t=this,r=function(){return t.observer&&t.observer.observe(document.body,dS)};document.body?r():fi.addEventListener("DOMContentLoaded",r)},e.prototype.start=function(){var t=this;this.stopped&&(this.stopped=!1,this.observer=new MutationObserver(this.listener),this.observe(),tf.forEach(function(r){return fi.addEventListener(r,t.listener,!0)}))},e.prototype.stop=function(){var t=this;this.stopped||(this.observer&&this.observer.disconnect(),tf.forEach(function(r){return fi.removeEventListener(r,t.listener,!0)}),this.stopped=!0)},e}(),Fs=new uS,of=function(e){!Ca&&e>0&&Fs.start(),Ca+=e,!Ca&&Fs.stop()},fS=function(e){return!Nc(e)&&!Qw(e)&&getComputedStyle(e).display==="inline"},hS=function(){function e(t,r){this.target=t,this.observedBox=r||zi.CONTENT_BOX,this.lastReportedSize={inlineSize:0,blockSize:0}}return e.prototype.isActive=function(){var t=Ov(this.target,this.observedBox,!0);return fS(this.target)&&(this.lastReportedSize=t),this.lastReportedSize.inlineSize!==t.inlineSize||this.lastReportedSize.blockSize!==t.blockSize},e}(),pS=function(){function e(t,r){this.activeTargets=[],this.skippedTargets=[],this.observationTargets=[],this.observer=t,this.callback=r}return e}(),aa=new WeakMap,nf=function(e,t){for(var r=0;r=0&&(i&&Mo.splice(Mo.indexOf(o),1),o.observationTargets.splice(n,1),of(-1))},e.disconnect=function(t){var r=this,o=aa.get(t);o.observationTargets.slice().forEach(function(n){return r.unobserve(t,n.target)}),o.activeTargets.splice(0,o.activeTargets.length)},e}(),vS=function(){function e(t){if(arguments.length===0)throw new TypeError("Failed to construct 'ResizeObserver': 1 argument required, but only 0 present.");if(typeof t!="function")throw new TypeError("Failed to construct 'ResizeObserver': The callback provided as parameter 1 is not a function.");la.connect(this,t)}return e.prototype.observe=function(t,r){if(arguments.length===0)throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!Zu(t))throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': parameter 1 is not of type 'Element");la.observe(this,t,r)},e.prototype.unobserve=function(t){if(arguments.length===0)throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!Zu(t))throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': parameter 1 is not of type 'Element");la.unobserve(this,t)},e.prototype.disconnect=function(){la.disconnect(this)},e.toString=function(){return"function ResizeObserver () { [polyfill code] }"},e}();class mS{constructor(){this.handleResize=this.handleResize.bind(this),this.observer=new(typeof window!="undefined"&&window.ResizeObserver||vS)(this.handleResize),this.elHandlersMap=new Map}handleResize(t){for(const r of t){const o=this.elHandlersMap.get(r.target);o!==void 0&&o(r)}}registerHandler(t,r){this.elHandlersMap.set(t,r),this.observer.observe(t)}unregisterHandler(t){!this.elHandlersMap.has(t)||(this.elHandlersMap.delete(t),this.observer.unobserve(t))}}var af=new mS,In=ae({name:"ResizeObserver",props:{onResize:Function},setup(e){let t=!1;const r=Wr().proxy;function o(n){const{onResize:i}=e;i!==void 0&&i(n)}gt(()=>{const n=r.$el;if(n===void 0){Uu("resize-observer","$el does not exist.");return}if(n.nextElementSibling!==n.nextSibling&&n.nodeType===3&&n.nodeValue!==""){Uu("resize-observer","$el can not be observed (it may be a text node).");return}n.nextElementSibling!==null&&(af.registerHandler(n.nextElementSibling,o),t=!0)}),ht(()=>{t&&af.unregisterHandler(r.$el.nextElementSibling)})},render(){return D1(this.$slots,"default")}});const gS=dn(".v-x-scroll",{overflow:"auto",scrollbarWidth:"none"},[dn("&::-webkit-scrollbar",{width:0,height:0})]);var bS=ae({name:"XScroll",props:{disabled:Boolean,onScroll:Function},setup(){const e=V(null);function t(n){!(n.currentTarget.offsetWidth=0;t--){const r=e.childNodes[t];if(Bv(r)&&(Dv(r)||Hv(r)))return!0}return!1}function Dv(e){if(!xS(e))return!1;try{e.focus({preventScroll:!0})}catch{}return document.activeElement===e}function xS(e){if(e.tabIndex>0||e.tabIndex===0&&e.getAttribute("tabIndex")!==null)return!0;if(e.getAttribute("disabled"))return!1;switch(e.nodeName){case"A":return!!e.href&&e.rel!=="ignore";case"INPUT":return e.type!=="hidden"&&e.type!=="file";case"BUTTON":case"SELECT":case"TEXTAREA":return!0;default:return!1}}let Gn=[];const Fv=ae({name:"FocusTrap",props:{disabled:Boolean,active:Boolean,autoFocus:{type:Boolean,default:!0},onEsc:Function,initialFocusTo:String,finalFocusTo:String,returnFocusOnDeactivated:{type:Boolean,default:!0}},setup(e){const t=Tn(),r=V(null),o=V(null);let n=!1,i=!1;const a=typeof document=="undefined"?null:document.activeElement;function l(){return Gn[Gn.length-1]===t}function s(b){var m;b.code==="Escape"&&l()&&((m=e.onEsc)===null||m===void 0||m.call(e,b))}gt(()=>{De(()=>e.active,b=>{b?(u(),Qe("keydown",document,s)):(Ue("keydown",document,s),n&&f())},{immediate:!0})}),ht(()=>{Ue("keydown",document,s),n&&f()});function d(b){if(!i&&l()){const m=c();if(m===null||m.contains(_i(b)))return;p("first")}}function c(){const b=r.value;if(b===null)return null;let m=b;for(;m=m.nextSibling,!(m===null||m instanceof Element&&m.tagName==="DIV"););return m}function u(){var b;if(!e.disabled){if(Gn.push(t),e.autoFocus){const{initialFocusTo:m}=e;m===void 0?p("first"):(b=Ku(m))===null||b===void 0||b.focus({preventScroll:!0})}n=!0,document.addEventListener("focus",d,!0)}}function f(){var b;if(e.disabled||(document.removeEventListener("focus",d,!0),Gn=Gn.filter(y=>y!==t),l()))return;const{finalFocusTo:m}=e;m!==void 0?(b=Ku(m))===null||b===void 0||b.focus({preventScroll:!0}):e.returnFocusOnDeactivated&&a instanceof HTMLElement&&(i=!0,a.focus({preventScroll:!0}),i=!1)}function p(b){if(!!l()&&e.active){const m=r.value,y=o.value;if(m!==null&&y!==null){const w=c();if(w==null||w===y){i=!0,m.focus({preventScroll:!0}),i=!1;return}i=!0;const x=b==="first"?Lv(w):Hv(w);i=!1,x||(i=!0,m.focus({preventScroll:!0}),i=!1)}}}function h(b){if(i)return;const m=c();m!==null&&(b.relatedTarget!==null&&m.contains(b.relatedTarget)?p("last"):p("first"))}function g(b){i||(b.relatedTarget!==null&&b.relatedTarget===r.value?p("last"):p("first"))}return{focusableStartRef:r,focusableEndRef:o,focusableStyle:"position: absolute; height: 0; width: 0;",handleStartFocus:h,handleEndFocus:g}},render(){const{default:e}=this.$slots;if(e===void 0)return null;if(this.disabled)return e();const{active:t,focusableStyle:r}=this;return v(Je,null,[v("div",{"aria-hidden":"true",tabindex:t?"0":"-1",ref:"focusableStartRef",style:r,onFocus:this.handleStartFocus}),e(),v("div",{"aria-hidden":"true",style:r,ref:"focusableEndRef",tabindex:t?"0":"-1",onFocus:this.handleEndFocus})])}});let tn=0,lf="",sf="",cf="",df="";const uf=V("0px");function CS(e){if(typeof document=="undefined")return;const t=document.documentElement;let r,o=!1;const n=()=>{t.style.marginRight=lf,t.style.overflow=sf,t.style.overflowX=cf,t.style.overflowY=df,uf.value="0px"};gt(()=>{r=De(e,i=>{if(i){if(!tn){const a=window.innerWidth-t.offsetWidth;a>0&&(lf=t.style.marginRight,t.style.marginRight=`${a}px`,uf.value=`${a}px`),sf=t.style.overflow,cf=t.style.overflowX,df=t.style.overflowY,t.style.overflow="hidden",t.style.overflowX="hidden",t.style.overflowY="hidden"}o=!0,tn++}else tn--,tn||n(),o=!1},{immediate:!0})}),ht(()=>{r==null||r(),o&&(tn--,tn||n(),o=!1)})}const Wc=V(!1),ff=()=>{Wc.value=!0},hf=()=>{Wc.value=!1};let Yn=0;const yS=()=>(Fo&&(Nr(()=>{Yn||(window.addEventListener("compositionstart",ff),window.addEventListener("compositionend",hf)),Yn++}),ht(()=>{Yn<=1?(window.removeEventListener("compositionstart",ff),window.removeEventListener("compositionend",hf),Yn=0):Yn--})),Wc);function wS(e){const t={isDeactivated:!1};let r=!1;return sp(()=>{if(t.isDeactivated=!1,!r){r=!0;return}e()}),cp(()=>{t.isDeactivated=!0,r||(r=!0)}),t}const js="n-form-item";function jv(e,{defaultSize:t="medium",mergedSize:r,mergedDisabled:o}={}){const n=me(js,null);Be(js,null);const i=H(r?()=>r(n):()=>{const{size:s}=e;if(s)return s;if(n){const{mergedSize:d}=n;if(d.value!==void 0)return d.value}return t}),a=H(o?()=>o(n):()=>{const{disabled:s}=e;return s!==void 0?s:n?n.disabled.value:!1}),l=H(()=>{const{status:s}=e;return s||(n==null?void 0:n.mergedValidationStatus.value)});return ht(()=>{n&&n.restoreValidation()}),{mergedSizeRef:i,mergedDisabledRef:a,mergedStatusRef:l,nTriggerFormBlur(){n&&n.handleContentBlur()},nTriggerFormChange(){n&&n.handleContentChange()},nTriggerFormFocus(){n&&n.handleContentFocus()},nTriggerFormInput(){n&&n.handleContentInput()}}}var SS=typeof global=="object"&&global&&global.Object===Object&&global,Nv=SS,$S=typeof self=="object"&&self&&self.Object===Object&&self,_S=Nv||$S||Function("return this")(),xr=_S,PS=xr.Symbol,ao=PS,Wv=Object.prototype,kS=Wv.hasOwnProperty,TS=Wv.toString,Xn=ao?ao.toStringTag:void 0;function zS(e){var t=kS.call(e,Xn),r=e[Xn];try{e[Xn]=void 0;var o=!0}catch{}var n=TS.call(e);return o&&(t?e[Xn]=r:delete e[Xn]),n}var ES=Object.prototype,RS=ES.toString;function IS(e){return RS.call(e)}var OS="[object Null]",AS="[object Undefined]",pf=ao?ao.toStringTag:void 0;function jo(e){return e==null?e===void 0?AS:OS:pf&&pf in Object(e)?zS(e):IS(e)}function lo(e){return e!=null&&typeof e=="object"}var MS="[object Symbol]";function dl(e){return typeof e=="symbol"||lo(e)&&jo(e)==MS}function Vv(e,t){for(var r=-1,o=e==null?0:e.length,n=Array(o);++r0){if(++t>=p2)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function b2(e){return function(){return e}}var x2=function(){try{var e=Wo(Object,"defineProperty");return e({},"",{}),e}catch{}}(),Oa=x2,C2=Oa?function(e,t){return Oa(e,"toString",{configurable:!0,enumerable:!1,value:b2(t),writable:!0})}:Vc,y2=C2,w2=g2(y2),S2=w2,$2=9007199254740991,_2=/^(?:0|[1-9]\d*)$/;function Kc(e,t){var r=typeof e;return t=t==null?$2:t,!!t&&(r=="number"||r!="symbol"&&_2.test(e))&&e>-1&&e%1==0&&e-1&&e%1==0&&e<=I2}function Fn(e){return e!=null&&Gc(e.length)&&!Uc(e)}function O2(e,t,r){if(!dr(r))return!1;var o=typeof t;return(o=="number"?Fn(r)&&Kc(t,r.length):o=="string"&&t in r)?Fi(r[t],e):!1}function A2(e){return R2(function(t,r){var o=-1,n=r.length,i=n>1?r[n-1]:void 0,a=n>2?r[2]:void 0;for(i=e.length>3&&typeof i=="function"?(n--,i):void 0,a&&O2(r[0],r[1],a)&&(i=n<3?void 0:i,n=1),t=Object(t);++o-1}function Z5(e,t){var r=this.__data__,o=ul(r,e);return o<0?(++this.size,r.push([e,t])):r[o][1]=t,this}function Vr(e){var t=-1,r=e==null?0:e.length;for(this.clear();++tn?0:n+t),r=r>n?n:r,r<0&&(r+=n),n=t>r?0:r-t>>>0,t>>>=0;for(var i=Array(n);++o=o?e:y$(e,t,r)}var S$="\\ud800-\\udfff",$$="\\u0300-\\u036f",_$="\\ufe20-\\ufe2f",P$="\\u20d0-\\u20ff",k$=$$+_$+P$,T$="\\ufe0e\\ufe0f",z$="\\u200d",E$=RegExp("["+z$+S$+k$+T$+"]");function rm(e){return E$.test(e)}function R$(e){return e.split("")}var om="\\ud800-\\udfff",I$="\\u0300-\\u036f",O$="\\ufe20-\\ufe2f",A$="\\u20d0-\\u20ff",M$=I$+O$+A$,B$="\\ufe0e\\ufe0f",L$="["+om+"]",Ws="["+M$+"]",Vs="\\ud83c[\\udffb-\\udfff]",H$="(?:"+Ws+"|"+Vs+")",nm="[^"+om+"]",im="(?:\\ud83c[\\udde6-\\uddff]){2}",am="[\\ud800-\\udbff][\\udc00-\\udfff]",D$="\\u200d",lm=H$+"?",sm="["+B$+"]?",F$="(?:"+D$+"(?:"+[nm,im,am].join("|")+")"+sm+lm+")*",j$=sm+lm+F$,N$="(?:"+[nm+Ws+"?",Ws,im,am,L$].join("|")+")",W$=RegExp(Vs+"(?="+Vs+")|"+N$+j$,"g");function V$(e){return e.match(W$)||[]}function U$(e){return rm(e)?V$(e):R$(e)}function K$(e){return function(t){t=hl(t);var r=rm(t)?U$(t):void 0,o=r?r[0]:t.charAt(0),n=r?w$(r,1).join(""):t.slice(1);return o[e]()+n}}var q$=K$("toUpperCase"),G$=q$;function Y$(e,t,r,o){var n=-1,i=e==null?0:e.length;for(o&&i&&(r=e[++n]);++nl))return!1;var d=i.get(e),c=i.get(t);if(d&&c)return d==t&&c==e;var u=-1,f=!0,p=r&xP?new La:void 0;for(i.set(e,t),i.set(t,e);++u=t||S<0||u&&$>=i}function m(){var T=Zl();if(b(T))return y(T);l=setTimeout(m,g(T))}function y(T){return l=void 0,f&&o?p(T):(o=n=void 0,a)}function w(){l!==void 0&&clearTimeout(l),d=0,o=s=n=l=void 0}function x(){return l===void 0?a:y(Zl())}function k(){var T=Zl(),S=b(T);if(o=arguments,n=this,s=T,S){if(l===void 0)return h(s);if(u)return clearTimeout(l),l=setTimeout(m,t),p(s)}return l===void 0&&(l=setTimeout(m,t)),a}return k.cancel=w,k.flush=x,k}function Gs(e,t,r){(r!==void 0&&!Fi(e[t],r)||r===void 0&&!(t in e))&&qc(e,t,r)}function v3(e){return lo(e)&&Fn(e)}function Ys(e,t){if(!(t==="constructor"&&typeof e[t]=="function")&&t!="__proto__")return e[t]}function m3(e){return z2(e,Zv(e))}function g3(e,t,r,o,n,i,a){var l=Ys(e,r),s=Ys(t,r),d=a.get(s);if(d){Gs(e,r,d);return}var c=i?i(l,s,r+"",e,t,a):void 0,u=c===void 0;if(u){var f=cr(s),p=!f&&Ma(s),h=!f&&!p&&Xc(s);c=s,f||p||h?cr(l)?c=l:v3(l)?c=h2(l):p?(u=!1,c=K_(s,!0)):h?(u=!1,c=uP(s,!0)):c=[]:C$(s)||Aa(s)?(c=l,Aa(l)?c=m3(l):(!dr(l)||Uc(l))&&(c=fP(s))):u=!1}u&&(a.set(s,c),n(c,s,o,i,a),a.delete(s)),Gs(e,r,c)}function km(e,t,r,o,n){e!==t&&Pm(t,function(i,a){if(n||(n=new _r),dr(i))g3(e,t,a,r,km,o,n);else{var l=o?o(Ys(e,a),i,a+"",e,t,n):void 0;l===void 0&&(l=i),Gs(e,a,l)}},Zv)}function b3(e,t){var r=-1,o=Fn(e)?Array(e.length):[];return c3(e,function(n,i,a){o[++r]=t(n,i,a)}),o}function x3(e,t){var r=cr(e)?Vv:b3;return r(e,o3(t))}var C3=H_(function(e,t,r){return e+(r?"-":"")+t.toLowerCase()}),y3=C3,w3=A2(function(e,t,r){km(e,t,r)}),un=w3,S3="Expected a function";function Jl(e,t,r){var o=!0,n=!0;if(typeof e!="function")throw new TypeError(S3);return dr(r)&&(o="leading"in r?!!r.leading:o,n="trailing"in r?!!r.trailing:n),p3(e,t,{leading:o,maxWait:t,trailing:n})}var zr={fontFamily:'v-sans, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',fontFamilyMono:"v-mono, SFMono-Regular, Menlo, Consolas, Courier, monospace",fontWeight:"400",fontWeightStrong:"500",cubicBezierEaseInOut:"cubic-bezier(.4, 0, .2, 1)",cubicBezierEaseOut:"cubic-bezier(0, 0, .2, 1)",cubicBezierEaseIn:"cubic-bezier(.4, 0, 1, 1)",borderRadius:"3px",borderRadiusSmall:"2px",fontSize:"14px",fontSizeMini:"12px",fontSizeTiny:"12px",fontSizeSmall:"14px",fontSizeMedium:"14px",fontSizeLarge:"15px",fontSizeHuge:"16px",lineHeight:"1.6",heightMini:"16px",heightTiny:"22px",heightSmall:"28px",heightMedium:"34px",heightLarge:"40px",heightHuge:"46px"};const{fontSize:$3,fontFamily:_3,lineHeight:P3}=zr;var Tm=O("body",` + margin: 0; + font-size: ${$3}; + font-family: ${_3}; + line-height: ${P3}; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: transparent; +`,[O("input",` + font-family: inherit; + font-size: inherit; + `)]);const Fr="n-config-provider",Ii="naive-ui-style";function DM(e){return e}function Ee(e,t,r,o,n,i){const a=Dn(),l=me(Fr,null);if(r){const d=()=>{const c=i==null?void 0:i.value;r.mount({id:c===void 0?t:c+t,head:!0,props:{bPrefix:c?`.${c}-`:void 0},anchorMetaName:Ii,ssr:a}),l!=null&&l.preflightStyleDisabled||Tm.mount({id:"n-global",head:!0,anchorMetaName:Ii,ssr:a})};a?d():Nr(d)}return H(()=>{var d;const{theme:{common:c,self:u,peers:f={}}={},themeOverrides:p={},builtinThemeOverrides:h={}}=n,{common:g,peers:b}=p,{common:m=void 0,[e]:{common:y=void 0,self:w=void 0,peers:x={}}={}}=(l==null?void 0:l.mergedThemeRef.value)||{},{common:k=void 0,[e]:T={}}=(l==null?void 0:l.mergedThemeOverridesRef.value)||{},{common:S,peers:$={}}=T,R=un({},c||y||m||o.common,k,S,g),_=un((d=u||w||o.self)===null||d===void 0?void 0:d(R),h,T,p);return{common:R,self:_,peers:un({},o.peers,x,f),peerOverrides:un({},h.peers,$,b)}})}Ee.props={theme:Object,themeOverrides:Object,builtinThemeOverrides:Object};const zm="n";function st(e={},t={defaultBordered:!0}){const r=me(Fr,null);return{inlineThemeDisabled:r==null?void 0:r.inlineThemeDisabled,mergedRtlRef:r==null?void 0:r.mergedRtlRef,mergedComponentPropsRef:r==null?void 0:r.mergedComponentPropsRef,mergedBreakpointsRef:r==null?void 0:r.mergedBreakpointsRef,mergedBorderedRef:H(()=>{var o,n;const{bordered:i}=e;return i!==void 0?i:(n=(o=r==null?void 0:r.mergedBorderedRef.value)!==null&&o!==void 0?o:t.defaultBordered)!==null&&n!==void 0?n:!0}),mergedClsPrefixRef:H(()=>(r==null?void 0:r.mergedClsPrefixRef.value)||zm),namespaceRef:H(()=>r==null?void 0:r.mergedNamespaceRef.value)}}const k3={name:"en-US",global:{undo:"Undo",redo:"Redo",confirm:"Confirm",clear:"Clear"},Popconfirm:{positiveText:"Confirm",negativeText:"Cancel"},Cascader:{placeholder:"Please Select",loading:"Loading",loadingRequiredMessage:e=>`Please load all ${e}'s descendants before checking it.`},Time:{dateFormat:"yyyy-MM-dd",dateTimeFormat:"yyyy-MM-dd HH:mm:ss"},DatePicker:{yearFormat:"yyyy",monthFormat:"MMM",dayFormat:"eeeeee",yearTypeFormat:"yyyy",monthTypeFormat:"yyyy-MM",dateFormat:"yyyy-MM-dd",dateTimeFormat:"yyyy-MM-dd HH:mm:ss",quarterFormat:"yyyy-qqq",clear:"Clear",now:"Now",confirm:"Confirm",selectTime:"Select Time",selectDate:"Select Date",datePlaceholder:"Select Date",datetimePlaceholder:"Select Date and Time",monthPlaceholder:"Select Month",yearPlaceholder:"Select Year",quarterPlaceholder:"Select Quarter",startDatePlaceholder:"Start Date",endDatePlaceholder:"End Date",startDatetimePlaceholder:"Start Date and Time",endDatetimePlaceholder:"End Date and Time",startMonthPlaceholder:"Start Month",endMonthPlaceholder:"End Month",monthBeforeYear:!0,firstDayOfWeek:6,today:"Today"},DataTable:{checkTableAll:"Select all in the table",uncheckTableAll:"Unselect all in the table",confirm:"Confirm",clear:"Clear"},LegacyTransfer:{sourceTitle:"Source",targetTitle:"Target"},Transfer:{selectAll:"Select all",unselectAll:"Unselect all",clearAll:"Clear",total:e=>`Total ${e} items`,selected:e=>`${e} items selected`},Empty:{description:"No Data"},Select:{placeholder:"Please Select"},TimePicker:{placeholder:"Select Time",positiveText:"OK",negativeText:"Cancel",now:"Now"},Pagination:{goto:"Goto",selectionSuffix:"page"},DynamicTags:{add:"Add"},Log:{loading:"Loading"},Input:{placeholder:"Please Input"},InputNumber:{placeholder:"Please Input"},DynamicInput:{create:"Create"},ThemeEditor:{title:"Theme Editor",clearAllVars:"Clear All Variables",clearSearch:"Clear Search",filterCompName:"Filter Component Name",filterVarName:"Filter Variable Name",import:"Import",export:"Export",restore:"Reset to Default"},Image:{tipPrevious:"Previous picture (\u2190)",tipNext:"Next picture (\u2192)",tipCounterclockwise:"Counterclockwise",tipClockwise:"Clockwise",tipZoomOut:"Zoom out",tipZoomIn:"Zoom in",tipClose:"Close (Esc)",tipOriginalSize:"Zoom to original size"}};var T3=k3;function Ql(e){return function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},r=t.width?String(t.width):e.defaultWidth,o=e.formats[r]||e.formats[e.defaultWidth];return o}}function Zn(e){return function(t,r){var o=r!=null&&r.context?String(r.context):"standalone",n;if(o==="formatting"&&e.formattingValues){var i=e.defaultFormattingWidth||e.defaultWidth,a=r!=null&&r.width?String(r.width):i;n=e.formattingValues[a]||e.formattingValues[i]}else{var l=e.defaultWidth,s=r!=null&&r.width?String(r.width):e.defaultWidth;n=e.values[s]||e.values[l]}var d=e.argumentCallback?e.argumentCallback(t):t;return n[d]}}function Jn(e){return function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=r.width,n=o&&e.matchPatterns[o]||e.matchPatterns[e.defaultMatchWidth],i=t.match(n);if(!i)return null;var a=i[0],l=o&&e.parsePatterns[o]||e.parsePatterns[e.defaultParseWidth],s=Array.isArray(l)?E3(l,function(u){return u.test(a)}):z3(l,function(u){return u.test(a)}),d;d=e.valueCallback?e.valueCallback(s):s,d=r.valueCallback?r.valueCallback(d):d;var c=t.slice(a.length);return{value:d,rest:c}}}function z3(e,t){for(var r in e)if(e.hasOwnProperty(r)&&t(e[r]))return r}function E3(e,t){for(var r=0;r1&&arguments[1]!==void 0?arguments[1]:{},o=t.match(e.matchPattern);if(!o)return null;var n=o[0],i=t.match(e.parsePattern);if(!i)return null;var a=e.valueCallback?e.valueCallback(i[0]):i[0];a=r.valueCallback?r.valueCallback(a):a;var l=t.slice(n.length);return{value:a,rest:l}}}var I3={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},O3=function(t,r,o){var n,i=I3[t];return typeof i=="string"?n=i:r===1?n=i.one:n=i.other.replace("{{count}}",r.toString()),o!=null&&o.addSuffix?o.comparison&&o.comparison>0?"in "+n:n+" ago":n},A3=O3,M3={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},B3={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},L3={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},H3={date:Ql({formats:M3,defaultWidth:"full"}),time:Ql({formats:B3,defaultWidth:"full"}),dateTime:Ql({formats:L3,defaultWidth:"full"})},D3=H3,F3={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},j3=function(t,r,o,n){return F3[t]},N3=j3,W3={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},V3={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},U3={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},K3={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},q3={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},G3={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},Y3=function(t,r){var o=Number(t),n=o%100;if(n>20||n<10)switch(n%10){case 1:return o+"st";case 2:return o+"nd";case 3:return o+"rd"}return o+"th"},X3={ordinalNumber:Y3,era:Zn({values:W3,defaultWidth:"wide"}),quarter:Zn({values:V3,defaultWidth:"wide",argumentCallback:function(t){return t-1}}),month:Zn({values:U3,defaultWidth:"wide"}),day:Zn({values:K3,defaultWidth:"wide"}),dayPeriod:Zn({values:q3,defaultWidth:"wide",formattingValues:G3,defaultFormattingWidth:"wide"})},Z3=X3,J3=/^(\d+)(th|st|nd|rd)?/i,Q3=/\d+/i,e6={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},t6={any:[/^b/i,/^(a|c)/i]},r6={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},o6={any:[/1/i,/2/i,/3/i,/4/i]},n6={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},i6={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},a6={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},l6={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},s6={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},c6={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},d6={ordinalNumber:R3({matchPattern:J3,parsePattern:Q3,valueCallback:function(t){return parseInt(t,10)}}),era:Jn({matchPatterns:e6,defaultMatchWidth:"wide",parsePatterns:t6,defaultParseWidth:"any"}),quarter:Jn({matchPatterns:r6,defaultMatchWidth:"wide",parsePatterns:o6,defaultParseWidth:"any",valueCallback:function(t){return t+1}}),month:Jn({matchPatterns:n6,defaultMatchWidth:"wide",parsePatterns:i6,defaultParseWidth:"any"}),day:Jn({matchPatterns:a6,defaultMatchWidth:"wide",parsePatterns:l6,defaultParseWidth:"any"}),dayPeriod:Jn({matchPatterns:s6,defaultMatchWidth:"any",parsePatterns:c6,defaultParseWidth:"any"})},u6=d6,f6={code:"en-US",formatDistance:A3,formatLong:D3,formatRelative:N3,localize:Z3,match:u6,options:{weekStartsOn:0,firstWeekContainsDate:1}},h6=f6;const p6={name:"en-US",locale:h6};var v6=p6;function Em(e){const{mergedLocaleRef:t,mergedDateLocaleRef:r}=me(Fr,null)||{},o=H(()=>{var i,a;return(a=(i=t==null?void 0:t.value)===null||i===void 0?void 0:i[e])!==null&&a!==void 0?a:T3[e]});return{dateLocaleRef:H(()=>{var i;return(i=r==null?void 0:r.value)!==null&&i!==void 0?i:v6}),localeRef:o}}function co(e,t,r){if(!t)return;const o=Dn(),n=me(Fr,null),i=()=>{const a=r==null?void 0:r.value;t.mount({id:a===void 0?e:a+e,head:!0,anchorMetaName:Ii,props:{bPrefix:a?`.${a}-`:void 0},ssr:o}),n!=null&&n.preflightStyleDisabled||Tm.mount({id:"n-global",head:!0,anchorMetaName:Ii,ssr:o})};o?i():Nr(i)}function Pt(e,t,r,o){var n;r||il("useThemeClass","cssVarsRef is not passed");const i=(n=me(Fr,null))===null||n===void 0?void 0:n.mergedThemeHashRef,a=V(""),l=Dn();let s;const d=`__${e}`,c=()=>{let u=d;const f=t?t.value:void 0,p=i==null?void 0:i.value;p&&(u+="-"+p),f&&(u+="-"+f);const{themeOverrides:h,builtinThemeOverrides:g}=o;h&&(u+="-"+Pi(JSON.stringify(h))),g&&(u+="-"+Pi(JSON.stringify(g))),a.value=u,s=()=>{const b=r.value;let m="";for(const y in b)m+=`${y}: ${b[y]};`;O(`.${u}`,m).mount({id:u,ssr:l}),s=void 0}};return Wt(()=>{c()}),{themeClass:a,onRender:()=>{s==null||s()}}}function Kr(e,t,r){if(!t)return;const o=Dn(),n=H(()=>{const{value:a}=t;if(!a)return;const l=a[e];if(!!l)return l}),i=()=>{Wt(()=>{const{value:a}=r,l=`${a}${e}Rtl`;if(sw(l,o))return;const{value:s}=n;!s||s.style.mount({id:l,head:!0,anchorMetaName:Ii,props:{bPrefix:a?`.${a}-`:void 0},ssr:o})})};return o?i():Nr(i),n}var m6=ae({name:"Add",render(){return v("svg",{width:"512",height:"512",viewBox:"0 0 512 512",fill:"none",xmlns:"http://www.w3.org/2000/svg"},v("path",{d:"M256 112V400M400 256H112",stroke:"currentColor","stroke-width":"32","stroke-linecap":"round","stroke-linejoin":"round"}))}});function Er(e,t){return ae({name:G$(e),setup(){var r;const o=(r=me(Fr,null))===null||r===void 0?void 0:r.mergedIconsRef;return()=>{var n;const i=(n=o==null?void 0:o.value)===null||n===void 0?void 0:n[e];return i?i():t}}})}var g6=ae({name:"ChevronRight",render(){return v("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg"},v("path",{d:"M5.64645 3.14645C5.45118 3.34171 5.45118 3.65829 5.64645 3.85355L9.79289 8L5.64645 12.1464C5.45118 12.3417 5.45118 12.6583 5.64645 12.8536C5.84171 13.0488 6.15829 13.0488 6.35355 12.8536L10.8536 8.35355C11.0488 8.15829 11.0488 7.84171 10.8536 7.64645L6.35355 3.14645C6.15829 2.95118 5.84171 2.95118 5.64645 3.14645Z",fill:"currentColor"}))}}),b6=Er("close",v("svg",{viewBox:"0 0 12 12",version:"1.1",xmlns:"http://www.w3.org/2000/svg","aria-hidden":!0},v("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},v("g",{fill:"currentColor","fill-rule":"nonzero"},v("path",{d:"M2.08859116,2.2156945 L2.14644661,2.14644661 C2.32001296,1.97288026 2.58943736,1.95359511 2.7843055,2.08859116 L2.85355339,2.14644661 L6,5.293 L9.14644661,2.14644661 C9.34170876,1.95118446 9.65829124,1.95118446 9.85355339,2.14644661 C10.0488155,2.34170876 10.0488155,2.65829124 9.85355339,2.85355339 L6.707,6 L9.85355339,9.14644661 C10.0271197,9.32001296 10.0464049,9.58943736 9.91140884,9.7843055 L9.85355339,9.85355339 C9.67998704,10.0271197 9.41056264,10.0464049 9.2156945,9.91140884 L9.14644661,9.85355339 L6,6.707 L2.85355339,9.85355339 C2.65829124,10.0488155 2.34170876,10.0488155 2.14644661,9.85355339 C1.95118446,9.65829124 1.95118446,9.34170876 2.14644661,9.14644661 L5.293,6 L2.14644661,2.85355339 C1.97288026,2.67998704 1.95359511,2.41056264 2.08859116,2.2156945 L2.14644661,2.14644661 L2.08859116,2.2156945 Z"}))))),x6=ae({name:"Eye",render(){return v("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"},v("path",{d:"M255.66 112c-77.94 0-157.89 45.11-220.83 135.33a16 16 0 0 0-.27 17.77C82.92 340.8 161.8 400 255.66 400c92.84 0 173.34-59.38 221.79-135.25a16.14 16.14 0 0 0 0-17.47C428.89 172.28 347.8 112 255.66 112z",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"}),v("circle",{cx:"256",cy:"256",r:"80",fill:"none",stroke:"currentColor","stroke-miterlimit":"10","stroke-width":"32"}))}}),C6=ae({name:"EyeOff",render(){return v("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"},v("path",{d:"M432 448a15.92 15.92 0 0 1-11.31-4.69l-352-352a16 16 0 0 1 22.62-22.62l352 352A16 16 0 0 1 432 448z",fill:"currentColor"}),v("path",{d:"M255.66 384c-41.49 0-81.5-12.28-118.92-36.5c-34.07-22-64.74-53.51-88.7-91v-.08c19.94-28.57 41.78-52.73 65.24-72.21a2 2 0 0 0 .14-2.94L93.5 161.38a2 2 0 0 0-2.71-.12c-24.92 21-48.05 46.76-69.08 76.92a31.92 31.92 0 0 0-.64 35.54c26.41 41.33 60.4 76.14 98.28 100.65C162 402 207.9 416 255.66 416a239.13 239.13 0 0 0 75.8-12.58a2 2 0 0 0 .77-3.31l-21.58-21.58a4 4 0 0 0-3.83-1a204.8 204.8 0 0 1-51.16 6.47z",fill:"currentColor"}),v("path",{d:"M490.84 238.6c-26.46-40.92-60.79-75.68-99.27-100.53C349 110.55 302 96 255.66 96a227.34 227.34 0 0 0-74.89 12.83a2 2 0 0 0-.75 3.31l21.55 21.55a4 4 0 0 0 3.88 1a192.82 192.82 0 0 1 50.21-6.69c40.69 0 80.58 12.43 118.55 37c34.71 22.4 65.74 53.88 89.76 91a.13.13 0 0 1 0 .16a310.72 310.72 0 0 1-64.12 72.73a2 2 0 0 0-.15 2.95l19.9 19.89a2 2 0 0 0 2.7.13a343.49 343.49 0 0 0 68.64-78.48a32.2 32.2 0 0 0-.1-34.78z",fill:"currentColor"}),v("path",{d:"M256 160a95.88 95.88 0 0 0-21.37 2.4a2 2 0 0 0-1 3.38l112.59 112.56a2 2 0 0 0 3.38-1A96 96 0 0 0 256 160z",fill:"currentColor"}),v("path",{d:"M165.78 233.66a2 2 0 0 0-3.38 1a96 96 0 0 0 115 115a2 2 0 0 0 1-3.38z",fill:"currentColor"}))}}),Rm=Er("error",v("svg",{viewBox:"0 0 48 48",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},v("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},v("g",{"fill-rule":"nonzero"},v("path",{d:"M24,4 C35.045695,4 44,12.954305 44,24 C44,35.045695 35.045695,44 24,44 C12.954305,44 4,35.045695 4,24 C4,12.954305 12.954305,4 24,4 Z M17.8838835,16.1161165 L17.7823881,16.0249942 C17.3266086,15.6583353 16.6733914,15.6583353 16.2176119,16.0249942 L16.1161165,16.1161165 L16.0249942,16.2176119 C15.6583353,16.6733914 15.6583353,17.3266086 16.0249942,17.7823881 L16.1161165,17.8838835 L22.233,24 L16.1161165,30.1161165 L16.0249942,30.2176119 C15.6583353,30.6733914 15.6583353,31.3266086 16.0249942,31.7823881 L16.1161165,31.8838835 L16.2176119,31.9750058 C16.6733914,32.3416647 17.3266086,32.3416647 17.7823881,31.9750058 L17.8838835,31.8838835 L24,25.767 L30.1161165,31.8838835 L30.2176119,31.9750058 C30.6733914,32.3416647 31.3266086,32.3416647 31.7823881,31.9750058 L31.8838835,31.8838835 L31.9750058,31.7823881 C32.3416647,31.3266086 32.3416647,30.6733914 31.9750058,30.2176119 L31.8838835,30.1161165 L25.767,24 L31.8838835,17.8838835 L31.9750058,17.7823881 C32.3416647,17.3266086 32.3416647,16.6733914 31.9750058,16.2176119 L31.8838835,16.1161165 L31.7823881,16.0249942 C31.3266086,15.6583353 30.6733914,15.6583353 30.2176119,16.0249942 L30.1161165,16.1161165 L24,22.233 L17.8838835,16.1161165 L17.7823881,16.0249942 L17.8838835,16.1161165 Z"}))))),Xs=Er("info",v("svg",{viewBox:"0 0 28 28",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},v("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},v("g",{"fill-rule":"nonzero"},v("path",{d:"M14,2 C20.6274,2 26,7.37258 26,14 C26,20.6274 20.6274,26 14,26 C7.37258,26 2,20.6274 2,14 C2,7.37258 7.37258,2 14,2 Z M14,11 C13.4477,11 13,11.4477 13,12 L13,12 L13,20 C13,20.5523 13.4477,21 14,21 C14.5523,21 15,20.5523 15,20 L15,20 L15,12 C15,11.4477 14.5523,11 14,11 Z M14,6.75 C13.3096,6.75 12.75,7.30964 12.75,8 C12.75,8.69036 13.3096,9.25 14,9.25 C14.6904,9.25 15.25,8.69036 15.25,8 C15.25,7.30964 14.6904,6.75 14,6.75 Z"}))))),Im=Er("success",v("svg",{viewBox:"0 0 48 48",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},v("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},v("g",{"fill-rule":"nonzero"},v("path",{d:"M24,4 C35.045695,4 44,12.954305 44,24 C44,35.045695 35.045695,44 24,44 C12.954305,44 4,35.045695 4,24 C4,12.954305 12.954305,4 24,4 Z M32.6338835,17.6161165 C32.1782718,17.1605048 31.4584514,17.1301307 30.9676119,17.5249942 L30.8661165,17.6161165 L20.75,27.732233 L17.1338835,24.1161165 C16.6457281,23.6279612 15.8542719,23.6279612 15.3661165,24.1161165 C14.9105048,24.5717282 14.8801307,25.2915486 15.2749942,25.7823881 L15.3661165,25.8838835 L19.8661165,30.3838835 C20.3217282,30.8394952 21.0415486,30.8698693 21.5323881,30.4750058 L21.6338835,30.3838835 L32.6338835,19.3838835 C33.1220388,18.8957281 33.1220388,18.1042719 32.6338835,17.6161165 Z"}))))),Om=Er("warning",v("svg",{viewBox:"0 0 24 24",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},v("g",{stroke:"none","stroke-width":"1","fill-rule":"evenodd"},v("g",{"fill-rule":"nonzero"},v("path",{d:"M12,2 C17.523,2 22,6.478 22,12 C22,17.522 17.523,22 12,22 C6.477,22 2,17.522 2,12 C2,6.478 6.477,2 12,2 Z M12.0018002,15.0037242 C11.450254,15.0037242 11.0031376,15.4508407 11.0031376,16.0023869 C11.0031376,16.553933 11.450254,17.0010495 12.0018002,17.0010495 C12.5533463,17.0010495 13.0004628,16.553933 13.0004628,16.0023869 C13.0004628,15.4508407 12.5533463,15.0037242 12.0018002,15.0037242 Z M11.99964,7 C11.4868042,7.00018474 11.0642719,7.38637706 11.0066858,7.8837365 L11,8.00036004 L11.0018003,13.0012393 L11.00857,13.117858 C11.0665141,13.6151758 11.4893244,14.0010638 12.0021602,14.0008793 C12.514996,14.0006946 12.9375283,13.6145023 12.9951144,13.1171428 L13.0018002,13.0005193 L13,7.99964009 L12.9932303,7.8830214 C12.9352861,7.38570354 12.5124758,6.99981552 11.99964,7 Z"}))))),y6=ae({name:"ChevronDown",render(){return v("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg"},v("path",{d:"M3.14645 5.64645C3.34171 5.45118 3.65829 5.45118 3.85355 5.64645L8 9.79289L12.1464 5.64645C12.3417 5.45118 12.6583 5.45118 12.8536 5.64645C13.0488 5.84171 13.0488 6.15829 12.8536 6.35355L8.35355 10.8536C8.15829 11.0488 7.84171 11.0488 7.64645 10.8536L3.14645 6.35355C2.95118 6.15829 2.95118 5.84171 3.14645 5.64645Z",fill:"currentColor"}))}}),w6=Er("clear",v("svg",{viewBox:"0 0 16 16",version:"1.1",xmlns:"http://www.w3.org/2000/svg"},v("g",{stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},v("g",{fill:"currentColor","fill-rule":"nonzero"},v("path",{d:"M8,2 C11.3137085,2 14,4.6862915 14,8 C14,11.3137085 11.3137085,14 8,14 C4.6862915,14 2,11.3137085 2,8 C2,4.6862915 4.6862915,2 8,2 Z M6.5343055,5.83859116 C6.33943736,5.70359511 6.07001296,5.72288026 5.89644661,5.89644661 L5.89644661,5.89644661 L5.83859116,5.9656945 C5.70359511,6.16056264 5.72288026,6.42998704 5.89644661,6.60355339 L5.89644661,6.60355339 L7.293,8 L5.89644661,9.39644661 L5.83859116,9.4656945 C5.70359511,9.66056264 5.72288026,9.92998704 5.89644661,10.1035534 L5.89644661,10.1035534 L5.9656945,10.1614088 C6.16056264,10.2964049 6.42998704,10.2771197 6.60355339,10.1035534 L6.60355339,10.1035534 L8,8.707 L9.39644661,10.1035534 L9.4656945,10.1614088 C9.66056264,10.2964049 9.92998704,10.2771197 10.1035534,10.1035534 L10.1035534,10.1035534 L10.1614088,10.0343055 C10.2964049,9.83943736 10.2771197,9.57001296 10.1035534,9.39644661 L10.1035534,9.39644661 L8.707,8 L10.1035534,6.60355339 L10.1614088,6.5343055 C10.2964049,6.33943736 10.2771197,6.07001296 10.1035534,5.89644661 L10.1035534,5.89644661 L10.0343055,5.83859116 C9.83943736,5.70359511 9.57001296,5.72288026 9.39644661,5.89644661 L9.39644661,5.89644661 L8,7.293 L6.60355339,5.89644661 Z"}))))),S6=ae({name:"ChevronDownFilled",render(){return v("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg"},v("path",{d:"M3.20041 5.73966C3.48226 5.43613 3.95681 5.41856 4.26034 5.70041L8 9.22652L11.7397 5.70041C12.0432 5.41856 12.5177 5.43613 12.7996 5.73966C13.0815 6.0432 13.0639 6.51775 12.7603 6.7996L8.51034 10.7996C8.22258 11.0668 7.77743 11.0668 7.48967 10.7996L3.23966 6.7996C2.93613 6.51775 2.91856 6.0432 3.20041 5.73966Z",fill:"currentColor"}))}}),$6=Er("rotateClockwise",v("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},v("path",{d:"M3 10C3 6.13401 6.13401 3 10 3C13.866 3 17 6.13401 17 10C17 12.7916 15.3658 15.2026 13 16.3265V14.5C13 14.2239 12.7761 14 12.5 14C12.2239 14 12 14.2239 12 14.5V17.5C12 17.7761 12.2239 18 12.5 18H15.5C15.7761 18 16 17.7761 16 17.5C16 17.2239 15.7761 17 15.5 17H13.8758C16.3346 15.6357 18 13.0128 18 10C18 5.58172 14.4183 2 10 2C5.58172 2 2 5.58172 2 10C2 10.2761 2.22386 10.5 2.5 10.5C2.77614 10.5 3 10.2761 3 10Z",fill:"currentColor"}),v("path",{d:"M10 12C11.1046 12 12 11.1046 12 10C12 8.89543 11.1046 8 10 8C8.89543 8 8 8.89543 8 10C8 11.1046 8.89543 12 10 12ZM10 11C9.44772 11 9 10.5523 9 10C9 9.44772 9.44772 9 10 9C10.5523 9 11 9.44772 11 10C11 10.5523 10.5523 11 10 11Z",fill:"currentColor"}))),_6=Er("rotateClockwise",v("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},v("path",{d:"M17 10C17 6.13401 13.866 3 10 3C6.13401 3 3 6.13401 3 10C3 12.7916 4.63419 15.2026 7 16.3265V14.5C7 14.2239 7.22386 14 7.5 14C7.77614 14 8 14.2239 8 14.5V17.5C8 17.7761 7.77614 18 7.5 18H4.5C4.22386 18 4 17.7761 4 17.5C4 17.2239 4.22386 17 4.5 17H6.12422C3.66539 15.6357 2 13.0128 2 10C2 5.58172 5.58172 2 10 2C14.4183 2 18 5.58172 18 10C18 10.2761 17.7761 10.5 17.5 10.5C17.2239 10.5 17 10.2761 17 10Z",fill:"currentColor"}),v("path",{d:"M10 12C8.89543 12 8 11.1046 8 10C8 8.89543 8.89543 8 10 8C11.1046 8 12 8.89543 12 10C12 11.1046 11.1046 12 10 12ZM10 11C10.5523 11 11 10.5523 11 10C11 9.44772 10.5523 9 10 9C9.44772 9 9 9.44772 9 10C9 10.5523 9.44772 11 10 11Z",fill:"currentColor"}))),P6=Er("zoomIn",v("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},v("path",{d:"M11.5 8.5C11.5 8.22386 11.2761 8 11 8H9V6C9 5.72386 8.77614 5.5 8.5 5.5C8.22386 5.5 8 5.72386 8 6V8H6C5.72386 8 5.5 8.22386 5.5 8.5C5.5 8.77614 5.72386 9 6 9H8V11C8 11.2761 8.22386 11.5 8.5 11.5C8.77614 11.5 9 11.2761 9 11V9H11C11.2761 9 11.5 8.77614 11.5 8.5Z",fill:"currentColor"}),v("path",{d:"M8.5 3C11.5376 3 14 5.46243 14 8.5C14 9.83879 13.5217 11.0659 12.7266 12.0196L16.8536 16.1464C17.0488 16.3417 17.0488 16.6583 16.8536 16.8536C16.68 17.0271 16.4106 17.0464 16.2157 16.9114L16.1464 16.8536L12.0196 12.7266C11.0659 13.5217 9.83879 14 8.5 14C5.46243 14 3 11.5376 3 8.5C3 5.46243 5.46243 3 8.5 3ZM8.5 4C6.01472 4 4 6.01472 4 8.5C4 10.9853 6.01472 13 8.5 13C10.9853 13 13 10.9853 13 8.5C13 6.01472 10.9853 4 8.5 4Z",fill:"currentColor"}))),k6=Er("zoomOut",v("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},v("path",{d:"M11 8C11.2761 8 11.5 8.22386 11.5 8.5C11.5 8.77614 11.2761 9 11 9H6C5.72386 9 5.5 8.77614 5.5 8.5C5.5 8.22386 5.72386 8 6 8H11Z",fill:"currentColor"}),v("path",{d:"M14 8.5C14 5.46243 11.5376 3 8.5 3C5.46243 3 3 5.46243 3 8.5C3 11.5376 5.46243 14 8.5 14C9.83879 14 11.0659 13.5217 12.0196 12.7266L16.1464 16.8536L16.2157 16.9114C16.4106 17.0464 16.68 17.0271 16.8536 16.8536C17.0488 16.6583 17.0488 16.3417 16.8536 16.1464L12.7266 12.0196C13.5217 11.0659 14 9.83879 14 8.5ZM4 8.5C4 6.01472 6.01472 4 8.5 4C10.9853 4 13 6.01472 13 8.5C13 10.9853 10.9853 13 8.5 13C6.01472 13 4 10.9853 4 8.5Z",fill:"currentColor"}))),T6=ae({name:"ResizeSmall",render(){return v("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20"},v("g",{fill:"none"},v("path",{d:"M5.5 4A1.5 1.5 0 0 0 4 5.5v1a.5.5 0 0 1-1 0v-1A2.5 2.5 0 0 1 5.5 3h1a.5.5 0 0 1 0 1h-1zM16 5.5A1.5 1.5 0 0 0 14.5 4h-1a.5.5 0 0 1 0-1h1A2.5 2.5 0 0 1 17 5.5v1a.5.5 0 0 1-1 0v-1zm0 9a1.5 1.5 0 0 1-1.5 1.5h-1a.5.5 0 0 0 0 1h1a2.5 2.5 0 0 0 2.5-2.5v-1a.5.5 0 0 0-1 0v1zm-12 0A1.5 1.5 0 0 0 5.5 16h1.25a.5.5 0 0 1 0 1H5.5A2.5 2.5 0 0 1 3 14.5v-1.25a.5.5 0 0 1 1 0v1.25zM8.5 7A1.5 1.5 0 0 0 7 8.5v3A1.5 1.5 0 0 0 8.5 13h3a1.5 1.5 0 0 0 1.5-1.5v-3A1.5 1.5 0 0 0 11.5 7h-3zM8 8.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v3a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-3z",fill:"currentColor"})))}}),vl=ae({name:"BaseIconSwitchTransition",setup(e,{slots:t}){const r=Hi();return()=>v(Bt,{name:"icon-switch-transition",appear:r.value},t)}}),ml=ae({name:"FadeInExpandTransition",props:{appear:Boolean,group:Boolean,mode:String,onLeave:Function,onAfterLeave:Function,onAfterEnter:Function,width:Boolean,reverse:Boolean},setup(e,{slots:t}){function r(l){e.width?l.style.maxWidth=`${l.offsetWidth}px`:l.style.maxHeight=`${l.offsetHeight}px`,l.offsetWidth}function o(l){e.width?l.style.maxWidth="0":l.style.maxHeight="0",l.offsetWidth;const{onLeave:s}=e;s&&s()}function n(l){e.width?l.style.maxWidth="":l.style.maxHeight="";const{onAfterLeave:s}=e;s&&s()}function i(l){if(l.style.transition="none",e.width){const s=l.offsetWidth;l.style.maxWidth="0",l.offsetWidth,l.style.transition="",l.style.maxWidth=`${s}px`}else if(e.reverse)l.style.maxHeight=`${l.offsetHeight}px`,l.offsetHeight,l.style.transition="",l.style.maxHeight="0";else{const s=l.offsetHeight;l.style.maxHeight="0",l.offsetWidth,l.style.transition="",l.style.maxHeight=`${s}px`}l.offsetWidth}function a(l){var s;e.width?l.style.maxWidth="":e.reverse||(l.style.maxHeight=""),(s=e.onAfterEnter)===null||s===void 0||s.call(e)}return()=>{const l=e.group?Rc:Bt;return v(l,{name:e.width?"fade-in-width-expand-transition":"fade-in-height-expand-transition",mode:e.mode,appear:e.appear,onEnter:i,onAfterEnter:a,onBeforeLeave:r,onLeave:o,onAfterLeave:n},t)}}}),z6=M("base-icon",` + height: 1em; + width: 1em; + line-height: 1em; + text-align: center; + display: inline-block; + position: relative; + fill: currentColor; + transform: translateZ(0); +`,[O("svg",` + height: 1em; + width: 1em; + `)]),zt=ae({name:"BaseIcon",props:{role:String,ariaLabel:String,ariaDisabled:{type:Boolean,default:void 0},ariaHidden:{type:Boolean,default:void 0},clsPrefix:{type:String,required:!0},onClick:Function,onMousedown:Function,onMouseup:Function},setup(e){co("-base-icon",z6,Te(e,"clsPrefix"))},render(){return v("i",{class:`${this.clsPrefix}-base-icon`,onClick:this.onClick,onMousedown:this.onMousedown,onMouseup:this.onMouseup,role:this.role,"aria-label":this.ariaLabel,"aria-hidden":this.ariaHidden,"aria-disabled":this.ariaDisabled},this.$slots)}}),E6=M("base-close",` + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + background-color: transparent; + color: var(--n-close-icon-color); + border-radius: var(--n-close-border-radius); + height: var(--n-close-size); + width: var(--n-close-size); + font-size: var(--n-close-icon-size); + outline: none; + border: none; + position: relative; + padding: 0; +`,[K("absolute",` + height: var(--n-close-icon-size); + width: var(--n-close-icon-size); + `),O("&::before",` + content: ""; + position: absolute; + width: var(--n-close-size); + height: var(--n-close-size); + left: 50%; + top: 50%; + transform: translateY(-50%) translateX(-50%); + transition: inherit; + border-radius: inherit; + `),ut("disabled",[O("&:hover",` + color: var(--n-close-icon-color-hover); + `),O("&:hover::before",` + background-color: var(--n-close-color-hover); + `),O("&:focus::before",` + background-color: var(--n-close-color-hover); + `),O("&:active",` + color: var(--n-close-icon-color-pressed); + `),O("&:active::before",` + background-color: var(--n-close-color-pressed); + `)]),K("disabled",` + cursor: not-allowed; + color: var(--n-close-icon-color-disabled); + background-color: transparent; + `),K("round",[O("&::before",` + border-radius: 50%; + `)])]),ji=ae({name:"BaseClose",props:{isButtonTag:{type:Boolean,default:!0},clsPrefix:{type:String,required:!0},disabled:{type:Boolean,default:void 0},focusable:{type:Boolean,default:!0},round:Boolean,onClick:Function,absolute:Boolean},setup(e){return co("-base-close",E6,Te(e,"clsPrefix")),()=>{const{clsPrefix:t,disabled:r,absolute:o,round:n,isButtonTag:i}=e;return v(i?"button":"div",{type:i?"button":void 0,tabindex:r||!e.focusable?-1:0,"aria-disabled":r,"aria-label":"close",role:i?void 0:"button",disabled:r,class:[`${t}-base-close`,o&&`${t}-base-close--absolute`,r&&`${t}-base-close--disabled`,n&&`${t}-base-close--round`],onMousedown:l=>{e.focusable||l.preventDefault()},onClick:e.onClick},v(zt,{clsPrefix:t},{default:()=>v(b6,null)}))}}});const{cubicBezierEaseInOut:R6}=zr;function Oi({originalTransform:e="",left:t=0,top:r=0,transition:o=`all .3s ${R6} !important`}={}){return[O("&.icon-switch-transition-enter-from, &.icon-switch-transition-leave-to",{transform:e+" scale(0.75)",left:t,top:r,opacity:0}),O("&.icon-switch-transition-enter-to, &.icon-switch-transition-leave-from",{transform:`scale(1) ${e}`,left:t,top:r,opacity:1}),O("&.icon-switch-transition-enter-active, &.icon-switch-transition-leave-active",{transformOrigin:"center",position:"absolute",left:t,top:r,transition:o})]}var I6=O([O("@keyframes loading-container-rotate",` + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + `),O("@keyframes loading-layer-rotate",` + 12.5% { + -webkit-transform: rotate(135deg); + transform: rotate(135deg); + } + 25% { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); + } + 37.5% { + -webkit-transform: rotate(405deg); + transform: rotate(405deg); + } + 50% { + -webkit-transform: rotate(540deg); + transform: rotate(540deg); + } + 62.5% { + -webkit-transform: rotate(675deg); + transform: rotate(675deg); + } + 75% { + -webkit-transform: rotate(810deg); + transform: rotate(810deg); + } + 87.5% { + -webkit-transform: rotate(945deg); + transform: rotate(945deg); + } + 100% { + -webkit-transform: rotate(1080deg); + transform: rotate(1080deg); + } + `),O("@keyframes loading-left-spin",` + from { + -webkit-transform: rotate(265deg); + transform: rotate(265deg); + } + 50% { + -webkit-transform: rotate(130deg); + transform: rotate(130deg); + } + to { + -webkit-transform: rotate(265deg); + transform: rotate(265deg); + } + `),O("@keyframes loading-right-spin",` + from { + -webkit-transform: rotate(-265deg); + transform: rotate(-265deg); + } + 50% { + -webkit-transform: rotate(-130deg); + transform: rotate(-130deg); + } + to { + -webkit-transform: rotate(-265deg); + transform: rotate(-265deg); + } + `),M("base-loading",` + position: relative; + line-height: 0; + width: 1em; + height: 1em; + `,[D("transition-wrapper",` + position: absolute; + width: 100%; + height: 100%; + `,[Oi()]),D("container",` + display: inline-flex; + position: relative; + direction: ltr; + line-height: 0; + animation: loading-container-rotate 1568.2352941176ms linear infinite; + font-size: 0; + letter-spacing: 0; + white-space: nowrap; + opacity: 1; + width: 100%; + height: 100%; + `,[D("svg",` + stroke: var(--n-text-color); + fill: transparent; + position: absolute; + height: 100%; + overflow: hidden; + `),D("container-layer",` + position: absolute; + width: 100%; + height: 100%; + animation: loading-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + `,[D("container-layer-left",` + display: inline-flex; + position: relative; + width: 50%; + height: 100%; + overflow: hidden; + `,[D("svg",` + animation: loading-left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + width: 200%; + `)]),D("container-layer-patch",` + position: absolute; + top: 0; + left: 47.5%; + box-sizing: border-box; + width: 5%; + height: 100%; + overflow: hidden; + `,[D("svg",` + left: -900%; + width: 2000%; + transform: rotate(180deg); + `)]),D("container-layer-right",` + display: inline-flex; + position: relative; + width: 50%; + height: 100%; + overflow: hidden; + `,[D("svg",` + animation: loading-right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + left: -100%; + width: 200%; + `)])])]),D("placeholder",` + position: absolute; + left: 50%; + top: 50%; + transform: translateX(-50%) translateY(-50%); + `,[Oi({left:"50%",top:"50%",originalTransform:"translateX(-50%) translateY(-50%)"})])])]);const O6={strokeWidth:{type:Number,default:28},stroke:{type:String,default:void 0}};var gl=ae({name:"BaseLoading",props:Object.assign({clsPrefix:{type:String,required:!0},show:{type:Boolean,default:!0},scale:{type:Number,default:1},radius:{type:Number,default:100}},O6),setup(e){co("-base-loading",I6,Te(e,"clsPrefix"))},render(){const{clsPrefix:e,radius:t,strokeWidth:r,stroke:o,scale:n}=this,i=t/n;return v("div",{class:`${e}-base-loading`,role:"img","aria-label":"loading"},v(vl,null,{default:()=>this.show?v("div",{key:"icon",class:`${e}-base-loading__transition-wrapper`},v("div",{class:`${e}-base-loading__container`},v("div",{class:`${e}-base-loading__container-layer`},v("div",{class:`${e}-base-loading__container-layer-left`},v("svg",{class:`${e}-base-loading__svg`,viewBox:`0 0 ${2*i} ${2*i}`,xmlns:"http://www.w3.org/2000/svg",style:{color:o}},v("circle",{fill:"none",stroke:"currentColor","stroke-width":r,"stroke-linecap":"round",cx:i,cy:i,r:t-r/2,"stroke-dasharray":4.91*t,"stroke-dashoffset":2.46*t}))),v("div",{class:`${e}-base-loading__container-layer-patch`},v("svg",{class:`${e}-base-loading__svg`,viewBox:`0 0 ${2*i} ${2*i}`,xmlns:"http://www.w3.org/2000/svg",style:{color:o}},v("circle",{fill:"none",stroke:"currentColor","stroke-width":r,"stroke-linecap":"round",cx:i,cy:i,r:t-r/2,"stroke-dasharray":4.91*t,"stroke-dashoffset":2.46*t}))),v("div",{class:`${e}-base-loading__container-layer-right`},v("svg",{class:`${e}-base-loading__svg`,viewBox:`0 0 ${2*i} ${2*i}`,xmlns:"http://www.w3.org/2000/svg",style:{color:o}},v("circle",{fill:"none",stroke:"currentColor","stroke-width":r,"stroke-linecap":"round",cx:i,cy:i,r:t-r/2,"stroke-dasharray":4.91*t,"stroke-dashoffset":2.46*t})))))):v("div",{key:"placeholder",class:`${e}-base-loading__placeholder`},this.$slots)}))}});function Kf(e){return Array.isArray(e)?e:[e]}const Zs={STOP:"STOP"};function Am(e,t){const r=t(e);e.children!==void 0&&r!==Zs.STOP&&e.children.forEach(o=>Am(o,t))}function A6(e,t={}){const{preserveGroup:r=!1}=t,o=[],n=r?a=>{a.isLeaf||(o.push(a.key),i(a.children))}:a=>{a.isLeaf||(a.isGroup||o.push(a.key),i(a.children))};function i(a){a.forEach(n)}return i(e),o}function M6(e,t){const{isLeaf:r}=e;return r!==void 0?r:!t(e)}function B6(e){return e.children}function L6(e){return e.key}function H6(){return!1}function D6(e,t){const{isLeaf:r}=e;return!(r===!1&&!Array.isArray(t(e)))}function F6(e){return e.disabled===!0}function j6(e,t){return e.isLeaf===!1&&!Array.isArray(t(e))}function es(e){var t;return e==null?[]:Array.isArray(e)?e:(t=e.checkedKeys)!==null&&t!==void 0?t:[]}function ts(e){var t;return e==null||Array.isArray(e)?[]:(t=e.indeterminateKeys)!==null&&t!==void 0?t:[]}function N6(e,t){const r=new Set(e);return t.forEach(o=>{r.has(o)||r.add(o)}),Array.from(r)}function W6(e,t){const r=new Set(e);return t.forEach(o=>{r.has(o)&&r.delete(o)}),Array.from(r)}function V6(e){return(e==null?void 0:e.type)==="group"}function FM(e){const t=new Map;return e.forEach((r,o)=>{t.set(r.key,o)}),r=>{var o;return(o=t.get(r))!==null&&o!==void 0?o:null}}class U6 extends Error{constructor(){super(),this.message="SubtreeNotLoadedError: checking a subtree whose required nodes are not fully loaded."}}function K6(e,t,r,o){return Ha(t.concat(e),r,o,!1)}function q6(e,t){const r=new Set;return e.forEach(o=>{const n=t.treeNodeMap.get(o);if(n!==void 0){let i=n.parent;for(;i!==null&&!(i.disabled||r.has(i.key));)r.add(i.key),i=i.parent}}),r}function G6(e,t,r,o){const n=Ha(t,r,o,!1),i=Ha(e,r,o,!0),a=q6(e,r),l=[];return n.forEach(s=>{(i.has(s)||a.has(s))&&l.push(s)}),l.forEach(s=>n.delete(s)),n}function rs(e,t){const{checkedKeys:r,keysToCheck:o,keysToUncheck:n,indeterminateKeys:i,cascade:a,leafOnly:l,checkStrategy:s,allowNotLoaded:d}=e;if(!a)return o!==void 0?{checkedKeys:N6(r,o),indeterminateKeys:Array.from(i)}:n!==void 0?{checkedKeys:W6(r,n),indeterminateKeys:Array.from(i)}:{checkedKeys:Array.from(r),indeterminateKeys:Array.from(i)};const{levelTreeNodeMap:c}=t;let u;n!==void 0?u=G6(n,r,t,d):o!==void 0?u=K6(o,r,t,d):u=Ha(r,t,d,!1);const f=s==="parent",p=s==="child"||l,h=u,g=new Set,b=Math.max.apply(null,Array.from(c.keys()));for(let m=b;m>=0;m-=1){const y=m===0,w=c.get(m);for(const x of w){if(x.isLeaf)continue;const{key:k,shallowLoaded:T}=x;if(p&&T&&x.children.forEach(_=>{!_.disabled&&!_.isLeaf&&_.shallowLoaded&&h.has(_.key)&&h.delete(_.key)}),x.disabled||!T)continue;let S=!0,$=!1,R=!0;for(const _ of x.children){const N=_.key;if(!_.disabled){if(R&&(R=!1),h.has(N))$=!0;else if(g.has(N)){$=!0,S=!1;break}else if(S=!1,$)break}}S&&!R?(f&&x.children.forEach(_=>{!_.disabled&&h.has(_.key)&&h.delete(_.key)}),h.add(k)):$&&g.add(k),y&&p&&h.has(k)&&h.delete(k)}}return{checkedKeys:Array.from(h),indeterminateKeys:Array.from(g)}}function Ha(e,t,r,o){const{treeNodeMap:n,getChildren:i}=t,a=new Set,l=new Set(e);return e.forEach(s=>{const d=n.get(s);d!==void 0&&Am(d,c=>{if(c.disabled)return Zs.STOP;const{key:u}=c;if(!a.has(u)&&(a.add(u),l.add(u),j6(c.rawNode,i))){if(o)return Zs.STOP;if(!r)throw new U6}})}),l}function Y6(e,{includeGroup:t=!1,includeSelf:r=!0},o){var n;const i=o.treeNodeMap;let a=e==null?null:(n=i.get(e))!==null&&n!==void 0?n:null;const l={keyPath:[],treeNodePath:[],treeNode:a};if(a!=null&&a.ignored)return l.treeNode=null,l;for(;a;)!a.ignored&&(t||!a.isGroup)&&l.treeNodePath.push(a),a=a.parent;return l.treeNodePath.reverse(),r||l.treeNodePath.pop(),l.keyPath=l.treeNodePath.map(s=>s.key),l}function X6(e){if(e.length===0)return null;const t=e[0];return t.isGroup||t.ignored||t.disabled?t.getNext():t}function Z6(e,t){const r=e.siblings,o=r.length,{index:n}=e;return t?r[(n+1)%o]:n===r.length-1?null:r[n+1]}function qf(e,t,{loop:r=!1,includeDisabled:o=!1}={}){const n=t==="prev"?J6:Z6,i={reverse:t==="prev"};let a=!1,l=null;function s(d){if(d!==null){if(d===e){if(!a)a=!0;else if(!e.disabled&&!e.isGroup){l=e;return}}else if((!d.disabled||o)&&!d.ignored&&!d.isGroup){l=d;return}if(d.isGroup){const c=rd(d,i);c!==null?l=c:s(n(d,r))}else{const c=n(d,!1);if(c!==null)s(c);else{const u=Q6(d);u!=null&&u.isGroup?s(n(u,r)):r&&s(n(d,!0))}}}}return s(e),l}function J6(e,t){const r=e.siblings,o=r.length,{index:n}=e;return t?r[(n-1+o)%o]:n===0?null:r[n-1]}function Q6(e){return e.parent}function rd(e,t={}){const{reverse:r=!1}=t,{children:o}=e;if(o){const{length:n}=o,i=r?n-1:0,a=r?-1:n,l=r?-1:1;for(let s=i;s!==a;s+=l){const d=o[s];if(!d.disabled&&!d.ignored)if(d.isGroup){const c=rd(d,t);if(c!==null)return c}else return d}}return null}const e4={getChild(){return this.ignored?null:rd(this)},getParent(){const{parent:e}=this;return e!=null&&e.isGroup?e.getParent():e},getNext(e={}){return qf(this,"next",e)},getPrev(e={}){return qf(this,"prev",e)}};function t4(e,t){const r=t?new Set(t):void 0,o=[];function n(i){i.forEach(a=>{o.push(a),!(a.isLeaf||!a.children||a.ignored)&&(a.isGroup||r===void 0||r.has(a.key))&&n(a.children)})}return n(e),o}function r4(e,t){const r=e.key;for(;t;){if(t.key===r)return!0;t=t.parent}return!1}function Mm(e,t,r,o,n,i=null,a=0){const l=[];return e.forEach((s,d)=>{var c;const u=Object.create(o);if(u.rawNode=s,u.siblings=l,u.level=a,u.index=d,u.isFirstChild=d===0,u.isLastChild=d+1===e.length,u.parent=i,!u.ignored){const f=n(s);Array.isArray(f)&&(u.children=Mm(f,t,r,o,n,u,a+1))}l.push(u),t.set(u.key,u),r.has(a)||r.set(a,[]),(c=r.get(a))===null||c===void 0||c.push(u)}),l}function Bm(e,t={}){var r;const o=new Map,n=new Map,{getDisabled:i=F6,getIgnored:a=H6,getIsGroup:l=V6,getKey:s=L6}=t,d=(r=t.getChildren)!==null&&r!==void 0?r:B6,c=t.ignoreEmptyChildren?x=>{const k=d(x);return Array.isArray(k)?k.length?k:null:k}:d,u=Object.assign({get key(){return s(this.rawNode)},get disabled(){return i(this.rawNode)},get isGroup(){return l(this.rawNode)},get isLeaf(){return M6(this.rawNode,c)},get shallowLoaded(){return D6(this.rawNode,c)},get ignored(){return a(this.rawNode)},contains(x){return r4(this,x)}},e4),f=Mm(e,o,n,u,c);function p(x){if(x==null)return null;const k=o.get(x);return k&&!k.isGroup&&!k.ignored?k:null}function h(x){if(x==null)return null;const k=o.get(x);return k&&!k.ignored?k:null}function g(x,k){const T=h(x);return T?T.getPrev(k):null}function b(x,k){const T=h(x);return T?T.getNext(k):null}function m(x){const k=h(x);return k?k.getParent():null}function y(x){const k=h(x);return k?k.getChild():null}const w={treeNodes:f,treeNodeMap:o,levelTreeNodeMap:n,maxLevel:Math.max(...n.keys()),getChildren:c,getFlattenedNodes(x){return t4(f,x)},getNode:p,getPrev:g,getNext:b,getParent:m,getChild:y,getFirstAvailableNode(){return X6(f)},getPath(x,k={}){return Y6(x,k,w)},getCheckedKeys(x,k={}){const{cascade:T=!0,leafOnly:S=!1,checkStrategy:$="all",allowNotLoaded:R=!1}=k;return rs({checkedKeys:es(x),indeterminateKeys:ts(x),cascade:T,leafOnly:S,checkStrategy:$,allowNotLoaded:R},w)},check(x,k,T={}){const{cascade:S=!0,leafOnly:$=!1,checkStrategy:R="all",allowNotLoaded:_=!1}=T;return rs({checkedKeys:es(k),indeterminateKeys:ts(k),keysToCheck:x==null?[]:Kf(x),cascade:S,leafOnly:$,checkStrategy:R,allowNotLoaded:_},w)},uncheck(x,k,T={}){const{cascade:S=!0,leafOnly:$=!1,checkStrategy:R="all",allowNotLoaded:_=!1}=T;return rs({checkedKeys:es(k),indeterminateKeys:ts(k),keysToUncheck:x==null?[]:Kf(x),cascade:S,leafOnly:$,checkStrategy:R,allowNotLoaded:_},w)},getNonLeafKeys(x={}){return A6(f,x)}};return w}const ue={neutralBase:"#000",neutralInvertBase:"#fff",neutralTextBase:"#fff",neutralPopover:"rgb(72, 72, 78)",neutralCard:"rgb(24, 24, 28)",neutralModal:"rgb(44, 44, 50)",neutralBody:"rgb(16, 16, 20)",alpha1:"0.9",alpha2:"0.82",alpha3:"0.52",alpha4:"0.38",alpha5:"0.28",alphaClose:"0.52",alphaDisabled:"0.38",alphaDisabledInput:"0.06",alphaPending:"0.09",alphaTablePending:"0.06",alphaTableStriped:"0.05",alphaPressed:"0.05",alphaAvatar:"0.18",alphaRail:"0.2",alphaProgressRail:"0.12",alphaBorder:"0.24",alphaDivider:"0.09",alphaInput:"0.1",alphaAction:"0.06",alphaTab:"0.04",alphaScrollbar:"0.2",alphaScrollbarHover:"0.3",alphaCode:"0.12",alphaTag:"0.2",primaryHover:"#7fe7c4",primaryDefault:"#63e2b7",primaryActive:"#5acea7",primarySuppl:"rgb(42, 148, 125)",infoHover:"#8acbec",infoDefault:"#70c0e8",infoActive:"#66afd3",infoSuppl:"rgb(56, 137, 197)",errorHover:"#e98b8b",errorDefault:"#e88080",errorActive:"#e57272",errorSuppl:"rgb(208, 58, 82)",warningHover:"#f5d599",warningDefault:"#f2c97d",warningActive:"#e6c260",warningSuppl:"rgb(240, 138, 0)",successHover:"#7fe7c4",successDefault:"#63e2b7",successActive:"#5acea7",successSuppl:"rgb(42, 148, 125)"},o4=Dr(ue.neutralBase),Lm=Dr(ue.neutralInvertBase),n4="rgba("+Lm.slice(0,3).join(", ")+", ";function We(e){return n4+String(e)+")"}function i4(e){const t=Array.from(Lm);return t[3]=Number(e),xe(o4,t)}const a4=Object.assign(Object.assign({name:"common"},zr),{baseColor:ue.neutralBase,primaryColor:ue.primaryDefault,primaryColorHover:ue.primaryHover,primaryColorPressed:ue.primaryActive,primaryColorSuppl:ue.primarySuppl,infoColor:ue.infoDefault,infoColorHover:ue.infoHover,infoColorPressed:ue.infoActive,infoColorSuppl:ue.infoSuppl,successColor:ue.successDefault,successColorHover:ue.successHover,successColorPressed:ue.successActive,successColorSuppl:ue.successSuppl,warningColor:ue.warningDefault,warningColorHover:ue.warningHover,warningColorPressed:ue.warningActive,warningColorSuppl:ue.warningSuppl,errorColor:ue.errorDefault,errorColorHover:ue.errorHover,errorColorPressed:ue.errorActive,errorColorSuppl:ue.errorSuppl,textColorBase:ue.neutralTextBase,textColor1:We(ue.alpha1),textColor2:We(ue.alpha2),textColor3:We(ue.alpha3),textColorDisabled:We(ue.alpha4),placeholderColor:We(ue.alpha4),placeholderColorDisabled:We(ue.alpha5),iconColor:We(ue.alpha4),iconColorDisabled:We(ue.alpha5),iconColorHover:We(Number(ue.alpha4)*1.25),iconColorPressed:We(Number(ue.alpha4)*.8),opacity1:ue.alpha1,opacity2:ue.alpha2,opacity3:ue.alpha3,opacity4:ue.alpha4,opacity5:ue.alpha5,dividerColor:We(ue.alphaDivider),borderColor:We(ue.alphaBorder),closeIconColorHover:We(Number(ue.alphaClose)),closeIconColor:We(Number(ue.alphaClose)),closeIconColorPressed:We(Number(ue.alphaClose)),closeColorHover:"rgba(255, 255, 255, .12)",closeColorPressed:"rgba(255, 255, 255, .08)",clearColor:We(ue.alpha4),clearColorHover:vt(We(ue.alpha4),{alpha:1.25}),clearColorPressed:vt(We(ue.alpha4),{alpha:.8}),scrollbarColor:We(ue.alphaScrollbar),scrollbarColorHover:We(ue.alphaScrollbarHover),scrollbarWidth:"5px",scrollbarHeight:"5px",scrollbarBorderRadius:"5px",progressRailColor:We(ue.alphaProgressRail),railColor:We(ue.alphaRail),popoverColor:ue.neutralPopover,tableColor:ue.neutralCard,cardColor:ue.neutralCard,modalColor:ue.neutralModal,bodyColor:ue.neutralBody,tagColor:i4(ue.alphaTag),avatarColor:We(ue.alphaAvatar),invertedColor:ue.neutralBase,inputColor:We(ue.alphaInput),codeColor:We(ue.alphaCode),tabColor:We(ue.alphaTab),actionColor:We(ue.alphaAction),tableHeaderColor:We(ue.alphaAction),hoverColor:We(ue.alphaPending),tableColorHover:We(ue.alphaTablePending),tableColorStriped:We(ue.alphaTableStriped),pressedColor:We(ue.alphaPressed),opacityDisabled:ue.alphaDisabled,inputColorDisabled:We(ue.alphaDisabledInput),buttonColor2:"rgba(255, 255, 255, .08)",buttonColor2Hover:"rgba(255, 255, 255, .12)",buttonColor2Pressed:"rgba(255, 255, 255, .08)",boxShadow1:"0 1px 2px -2px rgba(0, 0, 0, .24), 0 3px 6px 0 rgba(0, 0, 0, .18), 0 5px 12px 4px rgba(0, 0, 0, .12)",boxShadow2:"0 3px 6px -4px rgba(0, 0, 0, .24), 0 6px 12px 0 rgba(0, 0, 0, .16), 0 9px 18px 8px rgba(0, 0, 0, .10)",boxShadow3:"0 6px 16px -9px rgba(0, 0, 0, .08), 0 9px 28px 0 rgba(0, 0, 0, .05), 0 12px 48px 16px rgba(0, 0, 0, .03)"});var le=a4;const ye={neutralBase:"#FFF",neutralInvertBase:"#000",neutralTextBase:"#000",neutralPopover:"#fff",neutralCard:"#fff",neutralModal:"#fff",neutralBody:"#fff",alpha1:"0.82",alpha2:"0.72",alpha3:"0.38",alpha4:"0.24",alpha5:"0.18",alphaClose:"0.6",alphaDisabled:"0.5",alphaDisabledInput:"0.02",alphaPending:"0.05",alphaTablePending:"0.02",alphaPressed:"0.07",alphaAvatar:"0.2",alphaRail:"0.14",alphaProgressRail:".08",alphaBorder:"0.12",alphaDivider:"0.06",alphaInput:"0",alphaAction:"0.02",alphaTab:"0.04",alphaScrollbar:"0.25",alphaScrollbarHover:"0.4",alphaCode:"0.05",alphaTag:"0.02",primaryHover:"#36ad6a",primaryDefault:"#18a058",primaryActive:"#0c7a43",primarySuppl:"#36ad6a",infoHover:"#4098fc",infoDefault:"#2080f0",infoActive:"#1060c9",infoSuppl:"#4098fc",errorHover:"#de576d",errorDefault:"#d03050",errorActive:"#ab1f3f",errorSuppl:"#de576d",warningHover:"#fcb040",warningDefault:"#f0a020",warningActive:"#c97c10",warningSuppl:"#fcb040",successHover:"#36ad6a",successDefault:"#18a058",successActive:"#0c7a43",successSuppl:"#36ad6a"},l4=Dr(ye.neutralBase),Hm=Dr(ye.neutralInvertBase),s4="rgba("+Hm.slice(0,3).join(", ")+", ";function Gf(e){return s4+String(e)+")"}function Ot(e){const t=Array.from(Hm);return t[3]=Number(e),xe(l4,t)}const c4=Object.assign(Object.assign({name:"common"},zr),{baseColor:ye.neutralBase,primaryColor:ye.primaryDefault,primaryColorHover:ye.primaryHover,primaryColorPressed:ye.primaryActive,primaryColorSuppl:ye.primarySuppl,infoColor:ye.infoDefault,infoColorHover:ye.infoHover,infoColorPressed:ye.infoActive,infoColorSuppl:ye.infoSuppl,successColor:ye.successDefault,successColorHover:ye.successHover,successColorPressed:ye.successActive,successColorSuppl:ye.successSuppl,warningColor:ye.warningDefault,warningColorHover:ye.warningHover,warningColorPressed:ye.warningActive,warningColorSuppl:ye.warningSuppl,errorColor:ye.errorDefault,errorColorHover:ye.errorHover,errorColorPressed:ye.errorActive,errorColorSuppl:ye.errorSuppl,textColorBase:ye.neutralTextBase,textColor1:"rgb(31, 34, 37)",textColor2:"rgb(51, 54, 57)",textColor3:"rgb(118, 124, 130)",textColorDisabled:Ot(ye.alpha4),placeholderColor:Ot(ye.alpha4),placeholderColorDisabled:Ot(ye.alpha5),iconColor:Ot(ye.alpha4),iconColorHover:vt(Ot(ye.alpha4),{lightness:.75}),iconColorPressed:vt(Ot(ye.alpha4),{lightness:.9}),iconColorDisabled:Ot(ye.alpha5),opacity1:ye.alpha1,opacity2:ye.alpha2,opacity3:ye.alpha3,opacity4:ye.alpha4,opacity5:ye.alpha5,dividerColor:"rgb(239, 239, 245)",borderColor:"rgb(224, 224, 230)",closeIconColor:Ot(Number(ye.alphaClose)),closeIconColorHover:Ot(Number(ye.alphaClose)),closeIconColorPressed:Ot(Number(ye.alphaClose)),closeColorHover:"rgba(0, 0, 0, .09)",closeColorPressed:"rgba(0, 0, 0, .13)",clearColor:Ot(ye.alpha4),clearColorHover:vt(Ot(ye.alpha4),{lightness:.75}),clearColorPressed:vt(Ot(ye.alpha4),{lightness:.9}),scrollbarColor:Gf(ye.alphaScrollbar),scrollbarColorHover:Gf(ye.alphaScrollbarHover),scrollbarWidth:"5px",scrollbarHeight:"5px",scrollbarBorderRadius:"5px",progressRailColor:Ot(ye.alphaProgressRail),railColor:"rgb(219, 219, 223)",popoverColor:ye.neutralPopover,tableColor:ye.neutralCard,cardColor:ye.neutralCard,modalColor:ye.neutralModal,bodyColor:ye.neutralBody,tagColor:"#eee",avatarColor:Ot(ye.alphaAvatar),invertedColor:"rgb(0, 20, 40)",inputColor:Ot(ye.alphaInput),codeColor:"rgb(244, 244, 248)",tabColor:"rgb(247, 247, 250)",actionColor:"rgb(250, 250, 252)",tableHeaderColor:"rgb(250, 250, 252)",hoverColor:"rgb(243, 243, 245)",tableColorHover:"rgba(0, 0, 100, 0.03)",tableColorStriped:"rgba(0, 0, 100, 0.02)",pressedColor:"rgb(237, 237, 239)",opacityDisabled:ye.alphaDisabled,inputColorDisabled:"rgb(250, 250, 252)",buttonColor2:"rgba(46, 51, 56, .05)",buttonColor2Hover:"rgba(46, 51, 56, .09)",buttonColor2Pressed:"rgba(46, 51, 56, .13)",boxShadow1:"0 1px 2px -2px rgba(0, 0, 0, .08), 0 3px 6px 0 rgba(0, 0, 0, .06), 0 5px 12px 4px rgba(0, 0, 0, .04)",boxShadow2:"0 3px 6px -4px rgba(0, 0, 0, .12), 0 6px 16px 0 rgba(0, 0, 0, .08), 0 9px 28px 8px rgba(0, 0, 0, .05)",boxShadow3:"0 6px 16px -9px rgba(0, 0, 0, .08), 0 9px 28px 0 rgba(0, 0, 0, .05), 0 12px 48px 16px rgba(0, 0, 0, .03)"});var je=c4,d4={iconSizeSmall:"34px",iconSizeMedium:"40px",iconSizeLarge:"46px",iconSizeHuge:"52px"};const Dm=e=>{const{textColorDisabled:t,iconColor:r,textColor2:o,fontSizeSmall:n,fontSizeMedium:i,fontSizeLarge:a,fontSizeHuge:l}=e;return Object.assign(Object.assign({},d4),{fontSizeSmall:n,fontSizeMedium:i,fontSizeLarge:a,fontSizeHuge:l,textColor:t,iconColor:r,extraTextColor:o})},u4={name:"Empty",common:je,self:Dm};var Fm=u4;const f4={name:"Empty",common:le,self:Dm};var Vo=f4;const jm=e=>{const{scrollbarColor:t,scrollbarColorHover:r}=e;return{color:t,colorHover:r}},h4={name:"Scrollbar",common:je,self:jm};var od=h4;const p4={name:"Scrollbar",common:le,self:jm};var Ut=p4;const{cubicBezierEaseInOut:Yf}=zr;function Ai({name:e="fade-in",enterDuration:t="0.2s",leaveDuration:r="0.2s",enterCubicBezier:o=Yf,leaveCubicBezier:n=Yf}={}){return[O(`&.${e}-transition-enter-active`,{transition:`all ${t} ${o}!important`}),O(`&.${e}-transition-leave-active`,{transition:`all ${r} ${n}!important`}),O(`&.${e}-transition-enter-from, &.${e}-transition-leave-to`,{opacity:0}),O(`&.${e}-transition-leave-from, &.${e}-transition-enter-to`,{opacity:1})]}var v4=M("scrollbar",` + overflow: hidden; + position: relative; + z-index: auto; + height: 100%; + width: 100%; +`,[O(">",[M("scrollbar-container",` + width: 100%; + overflow: scroll; + height: 100%; + max-height: inherit; + scrollbar-width: none; + `,[O("&::-webkit-scrollbar, &::-webkit-scrollbar-track-piece, &::-webkit-scrollbar-thumb",` + width: 0; + height: 0; + display: none; + `),O(">",[M("scrollbar-content",` + box-sizing: border-box; + min-width: 100%; + `)])])]),O(">, +",[M("scrollbar-rail",` + position: absolute; + pointer-events: none; + user-select: none; + -webkit-user-select: none; + `,[K("horizontal",` + left: 2px; + right: 2px; + bottom: 4px; + height: var(--n-scrollbar-height); + `,[O(">",[D("scrollbar",` + height: var(--n-scrollbar-height); + border-radius: var(--n-scrollbar-border-radius); + right: 0; + `)])]),K("vertical",` + right: 4px; + top: 2px; + bottom: 2px; + width: var(--n-scrollbar-width); + `,[O(">",[D("scrollbar",` + width: var(--n-scrollbar-width); + border-radius: var(--n-scrollbar-border-radius); + bottom: 0; + `)])]),K("disabled",[O(">",[D("scrollbar",{pointerEvents:"none"})])]),O(">",[D("scrollbar",` + position: absolute; + cursor: pointer; + pointer-events: all; + background-color: var(--n-scrollbar-color); + transition: background-color .2s var(--n-scrollbar-bezier); + `,[Ai(),O("&:hover",{backgroundColor:"var(--n-scrollbar-color-hover)"})])])])])]);const m4=Object.assign(Object.assign({},Ee.props),{size:{type:Number,default:5},duration:{type:Number,default:0},scrollable:{type:Boolean,default:!0},xScrollable:Boolean,trigger:{type:String,default:"hover"},useUnifiedContainer:Boolean,triggerDisplayManually:Boolean,container:Function,content:Function,containerClass:String,containerStyle:[String,Object],contentClass:String,contentStyle:[String,Object],horizontalRailStyle:[String,Object],verticalRailStyle:[String,Object],onScroll:Function,onWheel:Function,onResize:Function,internalOnUpdateScrollLeft:Function,internalHoistYRail:Boolean}),Nm=ae({name:"Scrollbar",props:m4,inheritAttrs:!1,setup(e){const{mergedClsPrefixRef:t,inlineThemeDisabled:r,mergedRtlRef:o}=st(e),n=Kr("Scrollbar",o,t),i=V(null),a=V(null),l=V(null),s=V(null),d=V(null),c=V(null),u=V(null),f=V(null),p=V(null),h=V(null),g=V(null),b=V(0),m=V(0),y=V(!1),w=V(!1);let x=!1,k=!1,T,S,$=0,R=0,_=0,N=0;const E=kw(),F=H(()=>{const{value:re}=f,{value:ve}=c,{value:Pe}=h;return re===null||ve===null||Pe===null?0:Math.min(re,Pe*re/ve+e.size*1.5)}),j=H(()=>`${F.value}px`),Q=H(()=>{const{value:re}=p,{value:ve}=u,{value:Pe}=g;return re===null||ve===null||Pe===null?0:Pe*re/ve+e.size*1.5}),A=H(()=>`${Q.value}px`),X=H(()=>{const{value:re}=f,{value:ve}=b,{value:Pe}=c,{value:Ye}=h;if(re===null||Pe===null||Ye===null)return 0;{const ct=Pe-re;return ct?ve/ct*(Ye-F.value):0}}),ne=H(()=>`${X.value}px`),pe=H(()=>{const{value:re}=p,{value:ve}=m,{value:Pe}=u,{value:Ye}=g;if(re===null||Pe===null||Ye===null)return 0;{const ct=Pe-re;return ct?ve/ct*(Ye-Q.value):0}}),Ce=H(()=>`${pe.value}px`),$e=H(()=>{const{value:re}=f,{value:ve}=c;return re!==null&&ve!==null&&ve>re}),_e=H(()=>{const{value:re}=p,{value:ve}=u;return re!==null&&ve!==null&&ve>re}),Ge=H(()=>{const{trigger:re}=e;return re==="none"||y.value}),Le=H(()=>{const{trigger:re}=e;return re==="none"||w.value}),U=H(()=>{const{container:re}=e;return re?re():a.value}),ee=H(()=>{const{content:re}=e;return re?re():l.value}),G=wS(()=>{e.container||Re({top:b.value,left:m.value})}),se=()=>{G.isDeactivated||he()},ce=re=>{if(G.isDeactivated)return;const{onResize:ve}=e;ve&&ve(re),he()},Re=(re,ve)=>{if(!e.scrollable)return;if(typeof re=="number"){C(ve!=null?ve:0,re,0,!1,"auto");return}const{left:Pe,top:Ye,index:ct,elSize:wt,position:Lt,behavior:tt,el:jt,debounce:Ir=!0}=re;(Pe!==void 0||Ye!==void 0)&&C(Pe!=null?Pe:0,Ye!=null?Ye:0,0,!1,tt),jt!==void 0?C(0,jt.offsetTop,jt.offsetHeight,Ir,tt):ct!==void 0&&wt!==void 0?C(0,ct*wt,wt,Ir,tt):Lt==="bottom"?C(0,Number.MAX_SAFE_INTEGER,0,!1,tt):Lt==="top"&&C(0,0,0,!1,tt)},ge=(re,ve)=>{if(!e.scrollable)return;const{value:Pe}=U;!Pe||(typeof re=="object"?Pe.scrollBy(re):Pe.scrollBy(re,ve||0))};function C(re,ve,Pe,Ye,ct){const{value:wt}=U;if(!!wt){if(Ye){const{scrollTop:Lt,offsetHeight:tt}=wt;if(ve>Lt){ve+Pe<=Lt+tt||wt.scrollTo({left:re,top:ve+Pe-tt,behavior:ct});return}}wt.scrollTo({left:re,top:ve,behavior:ct})}}function P(){Y(),q(),he()}function I(){W()}function W(){z(),L()}function z(){S!==void 0&&window.clearTimeout(S),S=window.setTimeout(()=>{w.value=!1},e.duration)}function L(){T!==void 0&&window.clearTimeout(T),T=window.setTimeout(()=>{y.value=!1},e.duration)}function Y(){T!==void 0&&window.clearTimeout(T),y.value=!0}function q(){S!==void 0&&window.clearTimeout(S),w.value=!0}function J(re){const{onScroll:ve}=e;ve&&ve(re),Z()}function Z(){const{value:re}=U;re&&(b.value=re.scrollTop,m.value=re.scrollLeft*(n!=null&&n.value?-1:1))}function fe(){const{value:re}=ee;re&&(c.value=re.offsetHeight,u.value=re.offsetWidth);const{value:ve}=U;ve&&(f.value=ve.offsetHeight,p.value=ve.offsetWidth);const{value:Pe}=d,{value:Ye}=s;Pe&&(g.value=Pe.offsetWidth),Ye&&(h.value=Ye.offsetHeight)}function de(){const{value:re}=U;re&&(b.value=re.scrollTop,m.value=re.scrollLeft*(n!=null&&n.value?-1:1),f.value=re.offsetHeight,p.value=re.offsetWidth,c.value=re.scrollHeight,u.value=re.scrollWidth);const{value:ve}=d,{value:Pe}=s;ve&&(g.value=ve.offsetWidth),Pe&&(h.value=Pe.offsetHeight)}function he(){!e.scrollable||(e.useUnifiedContainer?de():(fe(),Z()))}function we(re){var ve;return!(!((ve=i.value)===null||ve===void 0)&&ve.contains(_i(re)))}function Ie(re){re.preventDefault(),re.stopPropagation(),k=!0,Qe("mousemove",window,Ne,!0),Qe("mouseup",window,Fe,!0),R=m.value,_=n!=null&&n.value?window.innerWidth-re.clientX:re.clientX}function Ne(re){if(!k)return;T!==void 0&&window.clearTimeout(T),S!==void 0&&window.clearTimeout(S);const{value:ve}=p,{value:Pe}=u,{value:Ye}=Q;if(ve===null||Pe===null)return;const wt=(n!=null&&n.value?window.innerWidth-re.clientX-_:re.clientX-_)*(Pe-ve)/(ve-Ye),Lt=Pe-ve;let tt=R+wt;tt=Math.min(Lt,tt),tt=Math.max(tt,0);const{value:jt}=U;if(jt){jt.scrollLeft=tt*(n!=null&&n.value?-1:1);const{internalOnUpdateScrollLeft:Ir}=e;Ir&&Ir(tt)}}function Fe(re){re.preventDefault(),re.stopPropagation(),Ue("mousemove",window,Ne,!0),Ue("mouseup",window,Fe,!0),k=!1,he(),we(re)&&W()}function et(re){re.preventDefault(),re.stopPropagation(),x=!0,Qe("mousemove",window,xt,!0),Qe("mouseup",window,Ft,!0),$=b.value,N=re.clientY}function xt(re){if(!x)return;T!==void 0&&window.clearTimeout(T),S!==void 0&&window.clearTimeout(S);const{value:ve}=f,{value:Pe}=c,{value:Ye}=F;if(ve===null||Pe===null)return;const wt=(re.clientY-N)*(Pe-ve)/(ve-Ye),Lt=Pe-ve;let tt=$+wt;tt=Math.min(Lt,tt),tt=Math.max(tt,0);const{value:jt}=U;jt&&(jt.scrollTop=tt)}function Ft(re){re.preventDefault(),re.stopPropagation(),Ue("mousemove",window,xt,!0),Ue("mouseup",window,Ft,!0),x=!1,he(),we(re)&&W()}Wt(()=>{const{value:re}=_e,{value:ve}=$e,{value:Pe}=t,{value:Ye}=d,{value:ct}=s;Ye&&(re?Ye.classList.remove(`${Pe}-scrollbar-rail--disabled`):Ye.classList.add(`${Pe}-scrollbar-rail--disabled`)),ct&&(ve?ct.classList.remove(`${Pe}-scrollbar-rail--disabled`):ct.classList.add(`${Pe}-scrollbar-rail--disabled`))}),gt(()=>{e.container||he()}),ht(()=>{T!==void 0&&window.clearTimeout(T),S!==void 0&&window.clearTimeout(S),Ue("mousemove",window,xt,!0),Ue("mouseup",window,Ft,!0)});const qr=Ee("Scrollbar","-scrollbar",v4,od,e,t),er=H(()=>{const{common:{cubicBezierEaseInOut:re,scrollbarBorderRadius:ve,scrollbarHeight:Pe,scrollbarWidth:Ye},self:{color:ct,colorHover:wt}}=qr.value;return{"--n-scrollbar-bezier":re,"--n-scrollbar-color":ct,"--n-scrollbar-color-hover":wt,"--n-scrollbar-border-radius":ve,"--n-scrollbar-width":Ye,"--n-scrollbar-height":Pe}}),Gt=r?Pt("scrollbar",void 0,er,e):void 0;return Object.assign(Object.assign({},{scrollTo:Re,scrollBy:ge,sync:he,syncUnifiedContainer:de,handleMouseEnterWrapper:P,handleMouseLeaveWrapper:I}),{mergedClsPrefix:t,rtlEnabled:n,containerScrollTop:b,wrapperRef:i,containerRef:a,contentRef:l,yRailRef:s,xRailRef:d,needYBar:$e,needXBar:_e,yBarSizePx:j,xBarSizePx:A,yBarTopPx:ne,xBarLeftPx:Ce,isShowXBar:Ge,isShowYBar:Le,isIos:E,handleScroll:J,handleContentResize:se,handleContainerResize:ce,handleYScrollMouseDown:et,handleXScrollMouseDown:Ie,cssVars:r?void 0:er,themeClass:Gt==null?void 0:Gt.themeClass,onRender:Gt==null?void 0:Gt.onRender})},render(){var e;const{$slots:t,mergedClsPrefix:r,triggerDisplayManually:o,rtlEnabled:n,internalHoistYRail:i}=this;if(!this.scrollable)return(e=t.default)===null||e===void 0?void 0:e.call(t);const a=this.trigger==="none",l=()=>v("div",{ref:"yRailRef",class:[`${r}-scrollbar-rail`,`${r}-scrollbar-rail--vertical`],"data-scrollbar-rail":!0,style:this.verticalRailStyle,"aria-hidden":!0},v(a?Mu:Bt,a?null:{name:"fade-in-transition"},{default:()=>this.needYBar&&this.isShowYBar&&!this.isIos?v("div",{class:`${r}-scrollbar-rail__scrollbar`,style:{height:this.yBarSizePx,top:this.yBarTopPx},onMousedown:this.handleYScrollMouseDown}):null})),s=()=>{var c,u;return(c=this.onRender)===null||c===void 0||c.call(this),v("div",so(this.$attrs,{role:"none",ref:"wrapperRef",class:[`${r}-scrollbar`,this.themeClass,n&&`${r}-scrollbar--rtl`],style:this.cssVars,onMouseenter:o?void 0:this.handleMouseEnterWrapper,onMouseleave:o?void 0:this.handleMouseLeaveWrapper}),[this.container?(u=t.default)===null||u===void 0?void 0:u.call(t):v("div",{role:"none",ref:"containerRef",class:[`${r}-scrollbar-container`,this.containerClass],style:this.containerStyle,onScroll:this.handleScroll,onWheel:this.onWheel},v(In,{onResize:this.handleContentResize},{default:()=>v("div",{ref:"contentRef",role:"none",style:[{width:this.xScrollable?"fit-content":null},this.contentStyle],class:[`${r}-scrollbar-content`,this.contentClass]},t)})),i?null:l(),this.xScrollable&&v("div",{ref:"xRailRef",class:[`${r}-scrollbar-rail`,`${r}-scrollbar-rail--horizontal`],style:this.horizontalRailStyle,"data-scrollbar-rail":!0,"aria-hidden":!0},v(a?Mu:Bt,a?null:{name:"fade-in-transition"},{default:()=>this.needXBar&&this.isShowXBar&&!this.isIos?v("div",{class:`${r}-scrollbar-rail__scrollbar`,style:{width:this.xBarSizePx,right:n?this.xBarLeftPx:void 0,left:n?void 0:this.xBarLeftPx},onMousedown:this.handleXScrollMouseDown}):null}))])},d=this.container?s():v(In,{onResize:this.handleContainerResize},{default:s});return i?v(Je,null,d,l()):d}});var Wm=Nm;const Vm=Nm;var g4={height:"calc(var(--n-option-height) * 7.6)",paddingSmall:"4px 0",paddingMedium:"4px 0",paddingLarge:"4px 0",paddingHuge:"4px 0",optionPaddingSmall:"0 12px",optionPaddingMedium:"0 12px",optionPaddingLarge:"0 12px",optionPaddingHuge:"0 12px",loadingSize:"18px"};const Um=e=>{const{borderRadius:t,popoverColor:r,textColor3:o,dividerColor:n,textColor2:i,primaryColorPressed:a,textColorDisabled:l,primaryColor:s,opacityDisabled:d,hoverColor:c,fontSizeSmall:u,fontSizeMedium:f,fontSizeLarge:p,fontSizeHuge:h,heightSmall:g,heightMedium:b,heightLarge:m,heightHuge:y}=e;return Object.assign(Object.assign({},g4),{optionFontSizeSmall:u,optionFontSizeMedium:f,optionFontSizeLarge:p,optionFontSizeHuge:h,optionHeightSmall:g,optionHeightMedium:b,optionHeightLarge:m,optionHeightHuge:y,borderRadius:t,color:r,groupHeaderTextColor:o,actionDividerColor:n,optionTextColor:i,optionTextColorPressed:a,optionTextColorDisabled:l,optionTextColorActive:s,optionOpacityDisabled:d,optionCheckColor:s,optionColorPending:c,optionColorActive:"rgba(0, 0, 0, 0)",optionColorActivePending:c,actionTextColor:i,loadingColor:s})},b4={name:"InternalSelectMenu",common:je,peers:{Scrollbar:od,Empty:Fm},self:Um};var Km=b4;const x4={name:"InternalSelectMenu",common:le,peers:{Scrollbar:Ut,Empty:Vo},self:Um};var Ni=x4;const{cubicBezierEaseIn:Xf,cubicBezierEaseOut:Zf}=zr;function Mi({transformOrigin:e="inherit",duration:t=".2s",enterScale:r=".9",originalTransform:o="",originalTransition:n=""}={}){return[O("&.fade-in-scale-up-transition-leave-active",{transformOrigin:e,transition:`opacity ${t} ${Xf}, transform ${t} ${Xf} ${n&&","+n}`}),O("&.fade-in-scale-up-transition-enter-active",{transformOrigin:e,transition:`opacity ${t} ${Zf}, transform ${t} ${Zf} ${n&&","+n}`}),O("&.fade-in-scale-up-transition-enter-from, &.fade-in-scale-up-transition-leave-to",{opacity:0,transform:`${o} scale(${r})`}),O("&.fade-in-scale-up-transition-leave-from, &.fade-in-scale-up-transition-enter-to",{opacity:1,transform:`${o} scale(1)`})]}var C4=M("base-wave",` + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + border-radius: inherit; +`),qm=ae({name:"BaseWave",props:{clsPrefix:{type:String,required:!0}},setup(e){co("-base-wave",C4,Te(e,"clsPrefix"));const t=V(null),r=V(!1);let o=null;return ht(()=>{o!==null&&window.clearTimeout(o)}),{active:r,selfRef:t,play(){o!==null&&(window.clearTimeout(o),r.value=!1,o=null),Zt(()=>{var n;(n=t.value)===null||n===void 0||n.offsetHeight,r.value=!0,o=window.setTimeout(()=>{r.value=!1,o=null},1e3)})}}},render(){const{clsPrefix:e}=this;return v("div",{ref:"selfRef","aria-hidden":!0,class:[`${e}-base-wave`,this.active&&`${e}-base-wave--active`]})}}),y4={space:"6px",spaceArrow:"10px",arrowOffset:"10px",arrowOffsetVertical:"10px",arrowHeight:"6px",padding:"8px 14px"};const Gm=e=>{const{boxShadow2:t,popoverColor:r,textColor2:o,borderRadius:n,fontSize:i,dividerColor:a}=e;return Object.assign(Object.assign({},y4),{fontSize:i,borderRadius:n,color:r,dividerColor:a,textColor:o,boxShadow:t})},w4={name:"Popover",common:je,self:Gm};var jn=w4;const S4={name:"Popover",common:le,self:Gm};var Uo=S4;const os={top:"bottom",bottom:"top",left:"right",right:"left"},Ct="var(--n-arrow-height) * 1.414";var $4=O([M("popover",` + transition: + box-shadow .3s var(--n-bezier), + background-color .3s var(--n-bezier), + color .3s var(--n-bezier); + position: relative; + font-size: var(--n-font-size); + color: var(--n-text-color); + box-shadow: var(--n-box-shadow); + word-break: break-word; + `,[O(">",[M("scrollbar",` + height: inherit; + max-height: inherit; + `)]),ut("raw",` + background-color: var(--n-color); + border-radius: var(--n-border-radius); + `,[ut("scrollable",[ut("show-header-or-footer","padding: var(--n-padding);")])]),D("header",` + padding: var(--n-padding); + border-bottom: 1px solid var(--n-divider-color); + transition: border-color .3s var(--n-bezier); + `),D("footer",` + padding: var(--n-padding); + border-top: 1px solid var(--n-divider-color); + transition: border-color .3s var(--n-bezier); + `),K("scrollable, show-header-or-footer",[D("content",` + padding: var(--n-padding); + `)])]),M("popover-shared",` + transform-origin: inherit; + `,[M("popover-arrow-wrapper",` + position: absolute; + overflow: hidden; + pointer-events: none; + `,[M("popover-arrow",` + transition: background-color .3s var(--n-bezier); + position: absolute; + display: block; + width: calc(${Ct}); + height: calc(${Ct}); + box-shadow: 0 0 8px 0 rgba(0, 0, 0, .12); + transform: rotate(45deg); + background-color: var(--n-color); + pointer-events: all; + `)]),O("&.popover-transition-enter-from, &.popover-transition-leave-to",` + opacity: 0; + transform: scale(.85); + `),O("&.popover-transition-enter-to, &.popover-transition-leave-from",` + transform: scale(1); + opacity: 1; + `),O("&.popover-transition-enter-active",` + transition: + box-shadow .3s var(--n-bezier), + background-color .3s var(--n-bezier), + color .3s var(--n-bezier), + opacity .15s var(--n-bezier-ease-out), + transform .15s var(--n-bezier-ease-out); + `),O("&.popover-transition-leave-active",` + transition: + box-shadow .3s var(--n-bezier), + background-color .3s var(--n-bezier), + color .3s var(--n-bezier), + opacity .15s var(--n-bezier-ease-in), + transform .15s var(--n-bezier-ease-in); + `)]),or("top-start",` + top: calc(${Ct} / -2); + left: calc(${Ar("top-start")} - var(--v-offset-left)); + `),or("top",` + top: calc(${Ct} / -2); + transform: translateX(calc(${Ct} / -2)) rotate(45deg); + left: 50%; + `),or("top-end",` + top: calc(${Ct} / -2); + right: calc(${Ar("top-end")} + var(--v-offset-left)); + `),or("bottom-start",` + bottom: calc(${Ct} / -2); + left: calc(${Ar("bottom-start")} - var(--v-offset-left)); + `),or("bottom",` + bottom: calc(${Ct} / -2); + transform: translateX(calc(${Ct} / -2)) rotate(45deg); + left: 50%; + `),or("bottom-end",` + bottom: calc(${Ct} / -2); + right: calc(${Ar("bottom-end")} + var(--v-offset-left)); + `),or("left-start",` + left: calc(${Ct} / -2); + top: calc(${Ar("left-start")} - var(--v-offset-top)); + `),or("left",` + left: calc(${Ct} / -2); + transform: translateY(calc(${Ct} / -2)) rotate(45deg); + top: 50%; + `),or("left-end",` + left: calc(${Ct} / -2); + bottom: calc(${Ar("left-end")} + var(--v-offset-top)); + `),or("right-start",` + right: calc(${Ct} / -2); + top: calc(${Ar("right-start")} - var(--v-offset-top)); + `),or("right",` + right: calc(${Ct} / -2); + transform: translateY(calc(${Ct} / -2)) rotate(45deg); + top: 50%; + `),or("right-end",` + right: calc(${Ct} / -2); + bottom: calc(${Ar("right-end")} + var(--v-offset-top)); + `),...x3({top:["right-start","left-start"],right:["top-end","bottom-end"],bottom:["right-end","left-end"],left:["top-start","bottom-start"]},(e,t)=>{const r=["right","left"].includes(t),o=r?"width":"height";return e.map(n=>{const i=n.split("-")[1]==="end",l=`calc((${`var(--v-target-${o}, 0px)`} - ${Ct}) / 2)`,s=Ar(n);return O(`[v-placement="${n}"] >`,[M("popover-shared",[K("center-arrow",[M("popover-arrow",`${t}: calc(max(${l}, ${s}) ${i?"+":"-"} var(--v-offset-${r?"left":"top"}));`)])])])})})]);function Ar(e){return["top","bottom"].includes(e.split("-")[0])?"var(--n-arrow-offset)":"var(--n-arrow-offset-vertical)"}function or(e,t){const r=e.split("-")[0],o=["top","bottom"].includes(r)?"height: var(--n-space-arrow);":"width: var(--n-space-arrow);";return O(`[v-placement="${e}"] >`,[M("popover-shared",` + margin-${os[r]}: var(--n-space); + `,[K("show-arrow",` + margin-${os[r]}: var(--n-space-arrow); + `),K("overlap",` + margin: 0; + `),hw("popover-arrow-wrapper",` + right: 0; + left: 0; + top: 0; + bottom: 0; + ${r}: 100%; + ${os[r]}: auto; + ${o} + `,[M("popover-arrow",t)])])])}const Ym=Object.assign(Object.assign({},Ee.props),{to:Rn.propTo,show:Boolean,trigger:String,showArrow:Boolean,delay:Number,duration:Number,raw:Boolean,arrowPointToCenter:Boolean,arrowStyle:[String,Object],displayDirective:String,x:Number,y:Number,flip:Boolean,overlap:Boolean,placement:String,width:[Number,String],keepAliveOnHover:Boolean,scrollable:Boolean,contentStyle:[Object,String],headerStyle:[Object,String],footerStyle:[Object,String],internalDeactivateImmediately:Boolean,animated:Boolean,onClickoutside:Function,internalTrapFocus:Boolean,internalOnAfterLeave:Function,minWidth:Number,maxWidth:Number}),Xm=({arrowStyle:e,clsPrefix:t})=>v("div",{key:"__popover-arrow__",class:`${t}-popover-arrow-wrapper`},v("div",{class:`${t}-popover-arrow`,style:e}));var _4=ae({name:"PopoverBody",inheritAttrs:!1,props:Ym,setup(e,{slots:t,attrs:r}){const{namespaceRef:o,mergedClsPrefixRef:n,inlineThemeDisabled:i}=st(e),a=Ee("Popover","-popover",$4,jn,e,n),l=V(null),s=me("NPopover"),d=V(null),c=V(e.show),u=V(!1);Wt(()=>{const{show:S}=e;S&&!pw()&&!e.internalDeactivateImmediately&&(u.value=!0)});const f=H(()=>{const{trigger:S,onClickoutside:$}=e,R=[],{positionManuallyRef:{value:_}}=s;return _||(S==="click"&&!$&&R.push([Ds,x,void 0,{capture:!0}]),S==="hover"&&R.push([Aw,w])),$&&R.push([Ds,x,void 0,{capture:!0}]),(e.displayDirective==="show"||e.animated&&u.value)&&R.push([Si,e.show]),R}),p=H(()=>{const S=e.width==="trigger"?void 0:ar(e.width),$=[];S&&$.push({width:S});const{maxWidth:R,minWidth:_}=e;return R&&$.push({maxWidth:ar(R)}),_&&$.push({maxWidth:ar(_)}),i||$.push(h.value),$}),h=H(()=>{const{common:{cubicBezierEaseInOut:S,cubicBezierEaseIn:$,cubicBezierEaseOut:R},self:{space:_,spaceArrow:N,padding:E,fontSize:F,textColor:j,dividerColor:Q,color:A,boxShadow:X,borderRadius:ne,arrowHeight:pe,arrowOffset:Ce,arrowOffsetVertical:$e}}=a.value;return{"--n-box-shadow":X,"--n-bezier":S,"--n-bezier-ease-in":$,"--n-bezier-ease-out":R,"--n-font-size":F,"--n-text-color":j,"--n-color":A,"--n-divider-color":Q,"--n-border-radius":ne,"--n-arrow-height":pe,"--n-arrow-offset":Ce,"--n-arrow-offset-vertical":$e,"--n-padding":E,"--n-space":_,"--n-space-arrow":N}}),g=i?Pt("popover",void 0,h,e):void 0;s.setBodyInstance({syncPosition:b}),ht(()=>{s.setBodyInstance(null)}),De(Te(e,"show"),S=>{e.animated||(S?c.value=!0:c.value=!1)});function b(){var S;(S=l.value)===null||S===void 0||S.syncPosition()}function m(S){e.trigger==="hover"&&e.keepAliveOnHover&&e.show&&s.handleMouseEnter(S)}function y(S){e.trigger==="hover"&&e.keepAliveOnHover&&s.handleMouseLeave(S)}function w(S){e.trigger==="hover"&&!k().contains(_i(S))&&s.handleMouseMoveOutside(S)}function x(S){(e.trigger==="click"&&!k().contains(_i(S))||e.onClickoutside)&&s.handleClickOutside(S)}function k(){return s.getTriggerElement()}Be(Di,d),Be(sl,null),Be(ll,null);function T(){if(g==null||g.onRender(),!(e.displayDirective==="show"||e.show||e.animated&&u.value))return null;let $;const R=s.internalRenderBodyRef.value,{value:_}=n;if(R)$=R([`${_}-popover-shared`,g==null?void 0:g.themeClass.value,e.overlap&&`${_}-popover-shared--overlap`,e.showArrow&&`${_}-popover-shared--show-arrow`,e.arrowPointToCenter&&`${_}-popover-shared--center-arrow`],d,p.value,m,y);else{const{value:N}=s.extraClassRef,{internalTrapFocus:E}=e,F=!Ia(t.header)||!Ia(t.footer),j=()=>{var Q;const A=F?v(Je,null,dt(t.header,pe=>pe?v("div",{class:`${_}-popover__header`,style:e.headerStyle},pe):null),dt(t.default,pe=>pe?v("div",{class:`${_}-popover__content`,style:e.contentStyle},t):null),dt(t.footer,pe=>pe?v("div",{class:`${_}-popover__footer`,style:e.footerStyle},pe):null)):e.scrollable?(Q=t.default)===null||Q===void 0?void 0:Q.call(t):v("div",{class:`${_}-popover__content`,style:e.contentStyle},t),X=e.scrollable?v(Vm,{contentClass:F?void 0:`${_}-popover__content`,contentStyle:F?void 0:e.contentStyle},{default:()=>A}):A,ne=e.showArrow?Xm({arrowStyle:e.arrowStyle,clsPrefix:_}):null;return[X,ne]};$=v("div",so({class:[`${_}-popover`,`${_}-popover-shared`,g==null?void 0:g.themeClass.value,N.map(Q=>`${_}-${Q}`),{[`${_}-popover--scrollable`]:e.scrollable,[`${_}-popover--show-header-or-footer`]:F,[`${_}-popover--raw`]:e.raw,[`${_}-popover-shared--overlap`]:e.overlap,[`${_}-popover-shared--show-arrow`]:e.showArrow,[`${_}-popover-shared--center-arrow`]:e.arrowPointToCenter}],ref:d,style:p.value,onKeydown:s.handleKeydown,onMouseenter:m,onMouseleave:y},r),E?v(Fv,{active:e.show,autoFocus:!0},{default:j}):j())}return Tr($,f.value)}return{displayed:u,namespace:o,isMounted:s.isMountedRef,zIndex:s.zIndexRef,followerRef:l,adjustedTo:Rn(e),followerEnabled:c,renderContentNode:T}},render(){return v(zv,{ref:"followerRef",zIndex:this.zIndex,show:this.show,enabled:this.followerEnabled,to:this.adjustedTo,x:this.x,y:this.y,flip:this.flip,placement:this.placement,containerClass:this.namespace,overlap:this.overlap,width:this.width==="trigger"?"target":void 0,teleportDisabled:this.adjustedTo===Rn.tdkey},{default:()=>this.animated?v(Bt,{name:"popover-transition",appear:this.isMounted,onEnter:()=>{this.followerEnabled=!0},onAfterLeave:()=>{var e;(e=this.internalOnAfterLeave)===null||e===void 0||e.call(this),this.followerEnabled=!1,this.displayed=!1}},{default:this.renderContentNode}):this.renderContentNode()})}});const P4=Object.keys(Ym),k4={focus:["onFocus","onBlur"],click:["onClick"],hover:["onMouseenter","onMouseleave"],manual:[],nested:["onFocus","onBlur","onMouseenter","onMouseleave","onClick"]};function T4(e,t,r){k4[t].forEach(o=>{e.props?e.props=Object.assign({},e.props):e.props={};const n=e.props[o],i=r[o];n?e.props[o]=(...a)=>{n(...a),i(...a)}:e.props[o]=i})}const z4=mr("").type,bl={show:{type:Boolean,default:void 0},defaultShow:Boolean,showArrow:{type:Boolean,default:!0},trigger:{type:String,default:"hover"},delay:{type:Number,default:100},duration:{type:Number,default:100},raw:Boolean,placement:{type:String,default:"top"},x:Number,y:Number,arrowPointToCenter:Boolean,disabled:Boolean,getDisabled:Function,displayDirective:{type:String,default:"if"},arrowStyle:[String,Object],flip:{type:Boolean,default:!0},animated:{type:Boolean,default:!0},width:{type:[Number,String],default:void 0},overlap:Boolean,keepAliveOnHover:{type:Boolean,default:!0},zIndex:Number,to:Rn.propTo,scrollable:Boolean,contentStyle:[Object,String],headerStyle:[Object,String],footerStyle:[Object,String],onClickoutside:Function,"onUpdate:show":[Function,Array],onUpdateShow:[Function,Array],internalDeactivateImmediately:Boolean,internalSyncTargetWithParent:Boolean,internalInheritedEventHandlers:{type:Array,default:()=>[]},internalTrapFocus:Boolean,internalExtraClass:{type:Array,default:()=>[]},onShow:[Function,Array],onHide:[Function,Array],arrow:{type:Boolean,default:void 0},minWidth:Number,maxWidth:Number},E4=Object.assign(Object.assign(Object.assign({},Ee.props),bl),{internalOnAfterLeave:Function,internalRenderBody:Function});var Zm=ae({name:"Popover",inheritAttrs:!1,props:E4,__popover__:!0,setup(e){const t=Hi(),r=V(null),o=H(()=>e.show),n=V(e.defaultShow),i=En(o,n),a=mt(()=>e.disabled?!1:i.value),l=()=>{if(e.disabled)return!0;const{getDisabled:j}=e;return!!(j!=null&&j())},s=()=>l()?!1:i.value,d=Ti(e,["arrow","showArrow"]),c=H(()=>e.overlap?!1:d.value);let u=null;const f=V(null),p=V(null),h=mt(()=>e.x!==void 0&&e.y!==void 0);function g(j){const{"onUpdate:show":Q,onUpdateShow:A,onShow:X,onHide:ne}=e;n.value=j,Q&&Ae(Q,j),A&&Ae(A,j),j&&X&&Ae(X,!0),j&&ne&&Ae(ne,!1)}function b(){u&&u.syncPosition()}function m(){const{value:j}=f;j&&(window.clearTimeout(j),f.value=null)}function y(){const{value:j}=p;j&&(window.clearTimeout(j),p.value=null)}function w(){const j=l();if(e.trigger==="focus"&&!j){if(s())return;g(!0)}}function x(){const j=l();if(e.trigger==="focus"&&!j){if(!s())return;g(!1)}}function k(){const j=l();if(e.trigger==="hover"&&!j){if(y(),f.value!==null||s())return;const Q=()=>{g(!0),f.value=null},{delay:A}=e;A===0?Q():f.value=window.setTimeout(Q,A)}}function T(){const j=l();if(e.trigger==="hover"&&!j){if(m(),p.value!==null||!s())return;const Q=()=>{g(!1),p.value=null},{duration:A}=e;A===0?Q():p.value=window.setTimeout(Q,A)}}function S(){T()}function $(j){var Q;!s()||(e.trigger==="click"&&(m(),y(),g(!1)),(Q=e.onClickoutside)===null||Q===void 0||Q.call(e,j))}function R(){if(e.trigger==="click"&&!l()){m(),y();const j=!s();g(j)}}function _(j){!e.internalTrapFocus||j.key==="Escape"&&(m(),y(),g(!1))}function N(j){n.value=j}function E(){var j;return(j=r.value)===null||j===void 0?void 0:j.targetRef}function F(j){u=j}return Be("NPopover",{getTriggerElement:E,handleKeydown:_,handleMouseEnter:k,handleMouseLeave:T,handleClickOutside:$,handleMouseMoveOutside:S,setBodyInstance:F,positionManuallyRef:h,isMountedRef:t,zIndexRef:Te(e,"zIndex"),extraClassRef:Te(e,"internalExtraClass"),internalRenderBodyRef:Te(e,"internalRenderBody")}),Wt(()=>{i.value&&l()&&g(!1)}),{binderInstRef:r,positionManually:h,mergedShowConsideringDisabledProp:a,uncontrolledShow:n,mergedShowArrow:c,getMergedShow:s,setShow:N,handleClick:R,handleMouseEnter:k,handleMouseLeave:T,handleFocus:w,handleBlur:x,syncPosition:b}},render(){var e;const{positionManually:t,$slots:r}=this;let o,n=!1;if(!t&&(r.activator?o=Ms(r,"activator"):o=Ms(r,"trigger"),o)){o=lr(o),o=o.type===z4?v("span",[o]):o;const i={onClick:this.handleClick,onMouseenter:this.handleMouseEnter,onMouseleave:this.handleMouseLeave,onFocus:this.handleFocus,onBlur:this.handleBlur};if(!((e=o.type)===null||e===void 0)&&e.__popover__)n=!0,o.props||(o.props={internalSyncTargetWithParent:!0,internalInheritedEventHandlers:[]}),o.props.internalSyncTargetWithParent=!0,o.props.internalInheritedEventHandlers?o.props.internalInheritedEventHandlers=[i,...o.props.internalInheritedEventHandlers]:o.props.internalInheritedEventHandlers=[i];else{const{internalInheritedEventHandlers:a}=this,l=[i,...a],s={onBlur:d=>{l.forEach(c=>{c.onBlur(d)})},onFocus:d=>{l.forEach(c=>{c.onFocus(d)})},onClick:d=>{l.forEach(c=>{c.onClick(d)})},onMouseenter:d=>{l.forEach(c=>{c.onMouseenter(d)})},onMouseleave:d=>{l.forEach(c=>{c.onMouseleave(d)})}};T4(o,a?"nested":t?"manual":this.trigger,s)}}return v(_v,{ref:"binderInstRef",syncTarget:!n,syncTargetWithParent:this.internalSyncTargetWithParent},{default:()=>{this.mergedShowConsideringDisabledProp;const i=this.getMergedShow();return[this.internalTrapFocus&&i?Tr(v("div",{style:{position:"fixed",inset:0}}),[[cl,{enabled:i,zIndex:this.zIndex}]]):null,t?null:v(Pv,null,{default:()=>o}),v(_4,Jt(this.$props,P4,Object.assign(Object.assign({},this.$attrs),{showArrow:this.mergedShowArrow,show:i})),{default:()=>{var a,l;return(l=(a=this.$slots).default)===null||l===void 0?void 0:l.call(a)},header:()=>{var a,l;return(l=(a=this.$slots).header)===null||l===void 0?void 0:l.call(a)},footer:()=>{var a,l;return(l=(a=this.$slots).footer)===null||l===void 0?void 0:l.call(a)}})]}})}}),Jm={closeIconSizeTiny:"12px",closeIconSizeSmall:"12px",closeIconSizeMedium:"14px",closeIconSizeLarge:"14px",closeSizeTiny:"16px",closeSizeSmall:"16px",closeSizeMedium:"18px",closeSizeLarge:"18px",padding:"0 7px",closeMargin:"0 0 0 4px",closeMarginRtl:"0 4px 0 0"};const R4={name:"Tag",common:le,self(e){const{textColor2:t,primaryColorHover:r,primaryColorPressed:o,primaryColor:n,infoColor:i,successColor:a,warningColor:l,errorColor:s,baseColor:d,borderColor:c,tagColor:u,opacityDisabled:f,closeIconColor:p,closeIconColorHover:h,closeIconColorPressed:g,closeColorHover:b,closeColorPressed:m,borderRadiusSmall:y,fontSizeMini:w,fontSizeTiny:x,fontSizeSmall:k,fontSizeMedium:T,heightMini:S,heightTiny:$,heightSmall:R,heightMedium:_,buttonColor2Hover:N,buttonColor2Pressed:E,fontWeightStrong:F}=e;return Object.assign(Object.assign({},Jm),{closeBorderRadius:y,heightTiny:S,heightSmall:$,heightMedium:R,heightLarge:_,borderRadius:y,opacityDisabled:f,fontSizeTiny:w,fontSizeSmall:x,fontSizeMedium:k,fontSizeLarge:T,fontWeightStrong:F,textColorCheckable:t,textColorHoverCheckable:t,textColorPressedCheckable:t,textColorChecked:d,colorCheckable:"#0000",colorHoverCheckable:N,colorPressedCheckable:E,colorChecked:n,colorCheckedHover:r,colorCheckedPressed:o,border:`1px solid ${c}`,textColor:t,color:u,colorBordered:"#0000",closeIconColor:p,closeIconColorHover:h,closeIconColorPressed:g,closeColorHover:b,closeColorPressed:m,borderPrimary:`1px solid ${oe(n,{alpha:.3})}`,textColorPrimary:n,colorPrimary:oe(n,{alpha:.16}),colorBorderedPrimary:"#0000",closeIconColorPrimary:vt(n,{lightness:.7}),closeIconColorHoverPrimary:vt(n,{lightness:.7}),closeIconColorPressedPrimary:vt(n,{lightness:.7}),closeColorHoverPrimary:oe(n,{alpha:.16}),closeColorPressedPrimary:oe(n,{alpha:.12}),borderInfo:`1px solid ${oe(i,{alpha:.3})}`,textColorInfo:i,colorInfo:oe(i,{alpha:.16}),colorBorderedInfo:"#0000",closeIconColorInfo:vt(i,{alpha:.7}),closeIconColorHoverInfo:vt(i,{alpha:.7}),closeIconColorPressedInfo:vt(i,{alpha:.7}),closeColorHoverInfo:oe(i,{alpha:.16}),closeColorPressedInfo:oe(i,{alpha:.12}),borderSuccess:`1px solid ${oe(a,{alpha:.3})}`,textColorSuccess:a,colorSuccess:oe(a,{alpha:.16}),colorBorderedSuccess:"#0000",closeIconColorSuccess:vt(a,{alpha:.7}),closeIconColorHoverSuccess:vt(a,{alpha:.7}),closeIconColorPressedSuccess:vt(a,{alpha:.7}),closeColorHoverSuccess:oe(a,{alpha:.16}),closeColorPressedSuccess:oe(a,{alpha:.12}),borderWarning:`1px solid ${oe(l,{alpha:.3})}`,textColorWarning:l,colorWarning:oe(l,{alpha:.16}),colorBorderedWarning:"#0000",closeIconColorWarning:vt(l,{alpha:.7}),closeIconColorHoverWarning:vt(l,{alpha:.7}),closeIconColorPressedWarning:vt(l,{alpha:.7}),closeColorHoverWarning:oe(l,{alpha:.16}),closeColorPressedWarning:oe(l,{alpha:.11}),borderError:`1px solid ${oe(s,{alpha:.3})}`,textColorError:s,colorError:oe(s,{alpha:.16}),colorBorderedError:"#0000",closeIconColorError:vt(s,{alpha:.7}),closeIconColorHoverError:vt(s,{alpha:.7}),closeIconColorPressedError:vt(s,{alpha:.7}),closeColorHoverError:oe(s,{alpha:.16}),closeColorPressedError:oe(s,{alpha:.12})})}};var Qm=R4;const I4=e=>{const{textColor2:t,primaryColorHover:r,primaryColorPressed:o,primaryColor:n,infoColor:i,successColor:a,warningColor:l,errorColor:s,baseColor:d,borderColor:c,opacityDisabled:u,tagColor:f,closeIconColor:p,closeIconColorHover:h,closeIconColorPressed:g,borderRadiusSmall:b,fontSizeMini:m,fontSizeTiny:y,fontSizeSmall:w,fontSizeMedium:x,heightMini:k,heightTiny:T,heightSmall:S,heightMedium:$,closeColorHover:R,closeColorPressed:_,buttonColor2Hover:N,buttonColor2Pressed:E,fontWeightStrong:F}=e;return Object.assign(Object.assign({},Jm),{closeBorderRadius:b,heightTiny:k,heightSmall:T,heightMedium:S,heightLarge:$,borderRadius:b,opacityDisabled:u,fontSizeTiny:m,fontSizeSmall:y,fontSizeMedium:w,fontSizeLarge:x,fontWeightStrong:F,textColorCheckable:t,textColorHoverCheckable:t,textColorPressedCheckable:t,textColorChecked:d,colorCheckable:"#0000",colorHoverCheckable:N,colorPressedCheckable:E,colorChecked:n,colorCheckedHover:r,colorCheckedPressed:o,border:`1px solid ${c}`,textColor:t,color:f,colorBordered:"rgb(250, 250, 252)",closeIconColor:p,closeIconColorHover:h,closeIconColorPressed:g,closeColorHover:R,closeColorPressed:_,borderPrimary:`1px solid ${oe(n,{alpha:.3})}`,textColorPrimary:n,colorPrimary:oe(n,{alpha:.12}),colorBorderedPrimary:oe(n,{alpha:.1}),closeIconColorPrimary:n,closeIconColorHoverPrimary:n,closeIconColorPressedPrimary:n,closeColorHoverPrimary:oe(n,{alpha:.12}),closeColorPressedPrimary:oe(n,{alpha:.18}),borderInfo:`1px solid ${oe(i,{alpha:.3})}`,textColorInfo:i,colorInfo:oe(i,{alpha:.12}),colorBorderedInfo:oe(i,{alpha:.1}),closeIconColorInfo:i,closeIconColorHoverInfo:i,closeIconColorPressedInfo:i,closeColorHoverInfo:oe(i,{alpha:.12}),closeColorPressedInfo:oe(i,{alpha:.18}),borderSuccess:`1px solid ${oe(a,{alpha:.3})}`,textColorSuccess:a,colorSuccess:oe(a,{alpha:.12}),colorBorderedSuccess:oe(a,{alpha:.1}),closeIconColorSuccess:a,closeIconColorHoverSuccess:a,closeIconColorPressedSuccess:a,closeColorHoverSuccess:oe(a,{alpha:.12}),closeColorPressedSuccess:oe(a,{alpha:.18}),borderWarning:`1px solid ${oe(l,{alpha:.35})}`,textColorWarning:l,colorWarning:oe(l,{alpha:.15}),colorBorderedWarning:oe(l,{alpha:.12}),closeIconColorWarning:l,closeIconColorHoverWarning:l,closeIconColorPressedWarning:l,closeColorHoverWarning:oe(l,{alpha:.12}),closeColorPressedWarning:oe(l,{alpha:.18}),borderError:`1px solid ${oe(s,{alpha:.23})}`,textColorError:s,colorError:oe(s,{alpha:.1}),colorBorderedError:oe(s,{alpha:.08}),closeIconColorError:s,closeIconColorHoverError:s,closeIconColorPressedError:s,closeColorHoverError:oe(s,{alpha:.12}),closeColorPressedError:oe(s,{alpha:.18})})},O4={name:"Tag",common:je,self:I4};var A4=O4,M4={color:Object,type:{type:String,default:"default"},round:Boolean,size:{type:String,default:"medium"},closable:Boolean,disabled:{type:Boolean,default:void 0}},B4=M("tag",` + white-space: nowrap; + position: relative; + box-sizing: border-box; + cursor: default; + display: inline-flex; + align-items: center; + flex-wrap: nowrap; + padding: var(--n-padding); + border-radius: var(--n-border-radius); + color: var(--n-text-color); + background-color: var(--n-color); + transition: + border-color .3s var(--n-bezier), + background-color .3s var(--n-bezier), + color .3s var(--n-bezier), + box-shadow .3s var(--n-bezier), + opacity .3s var(--n-bezier); + line-height: 1; + height: var(--n-height); + font-size: var(--n-font-size); +`,[K("strong",` + font-weight: var(--n-font-weight-strong); + `),D("border",` + pointer-events: none; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + border-radius: inherit; + border: var(--n-border); + transition: border-color .3s var(--n-bezier); + `),D("icon",` + display: flex; + margin: 0 4px 0 0; + color: var(--n-text-color); + transition: color .3s var(--n-bezier); + font-size: var(--n-avatar-size-override); + `),D("avatar",` + display: flex; + margin: 0 6px 0 0; + `),D("close",` + margin: var(--n-close-margin); + transition: + background-color .3s var(--n-bezier), + color .3s var(--n-bezier); + `),K("round",` + padding: 0 calc(var(--n-height) / 3); + border-radius: calc(var(--n-height) / 2); + `,[D("icon",` + margin: 0 4px 0 calc((var(--n-height) - 8px) / -2); + `),D("avatar",` + margin: 0 6px 0 calc((var(--n-height) - 8px) / -2); + `),K("closable",` + padding: 0 calc(var(--n-height) / 4) 0 calc(var(--n-height) / 3); + `)]),K("icon, avatar",[K("round",` + padding: 0 calc(var(--n-height) / 3) 0 calc(var(--n-height) / 2); + `)]),K("disabled",` + cursor: not-allowed !important; + opacity: var(--n-opacity-disabled); + `),K("checkable",` + cursor: pointer; + box-shadow: none; + color: var(--n-text-color-checkable); + background-color: var(--n-color-checkable); + `,[ut("disabled",[O("&:hover","background-color: var(--n-color-hover-checkable);",[ut("checked","color: var(--n-text-color-hover-checkable);")]),O("&:active","background-color: var(--n-color-pressed-checkable);",[ut("checked","color: var(--n-text-color-pressed-checkable);")])]),K("checked",` + color: var(--n-text-color-checked); + background-color: var(--n-color-checked); + `,[ut("disabled",[O("&:hover","background-color: var(--n-color-checked-hover);"),O("&:active","background-color: var(--n-color-checked-pressed);")])])])]);const L4=Object.assign(Object.assign(Object.assign({},Ee.props),M4),{bordered:{type:Boolean,default:void 0},checked:Boolean,checkable:Boolean,strong:Boolean,triggerClickOnClose:Boolean,onClose:[Array,Function],onMouseenter:Function,onMouseleave:Function,"onUpdate:checked":Function,onUpdateChecked:Function,internalCloseFocusable:{type:Boolean,default:!0},internalCloseIsButtonTag:{type:Boolean,default:!0},onCheckedChange:Function}),eg="n-tag";var jM=ae({name:"Tag",props:L4,setup(e){const t=V(null),{mergedBorderedRef:r,mergedClsPrefixRef:o,inlineThemeDisabled:n,mergedRtlRef:i}=st(e),a=Ee("Tag","-tag",B4,A4,e,o);Be(eg,{roundRef:Te(e,"round")});function l(p){if(!e.disabled&&e.checkable){const{checked:h,onCheckedChange:g,onUpdateChecked:b,"onUpdate:checked":m}=e;b&&b(!h),m&&m(!h),g&&g(!h)}}function s(p){if(e.triggerClickOnClose||p.stopPropagation(),!e.disabled){const{onClose:h}=e;h&&Ae(h,p)}}const d={setTextContent(p){const{value:h}=t;h&&(h.textContent=p)}},c=Kr("Tag",i,o),u=H(()=>{const{type:p,size:h,color:{color:g,textColor:b}={}}=e,{common:{cubicBezierEaseInOut:m},self:{padding:y,closeMargin:w,closeMarginRtl:x,borderRadius:k,opacityDisabled:T,textColorCheckable:S,textColorHoverCheckable:$,textColorPressedCheckable:R,textColorChecked:_,colorCheckable:N,colorHoverCheckable:E,colorPressedCheckable:F,colorChecked:j,colorCheckedHover:Q,colorCheckedPressed:A,closeBorderRadius:X,fontWeightStrong:ne,[ie("colorBordered",p)]:pe,[ie("closeSize",h)]:Ce,[ie("closeIconSize",h)]:$e,[ie("fontSize",h)]:_e,[ie("height",h)]:Ge,[ie("color",p)]:Le,[ie("textColor",p)]:U,[ie("border",p)]:ee,[ie("closeIconColor",p)]:G,[ie("closeIconColorHover",p)]:se,[ie("closeIconColorPressed",p)]:ce,[ie("closeColorHover",p)]:Re,[ie("closeColorPressed",p)]:ge}}=a.value;return{"--n-font-weight-strong":ne,"--n-avatar-size-override":`calc(${Ge} - 8px)`,"--n-bezier":m,"--n-border-radius":k,"--n-border":ee,"--n-close-icon-size":$e,"--n-close-color-pressed":ge,"--n-close-color-hover":Re,"--n-close-border-radius":X,"--n-close-icon-color":G,"--n-close-icon-color-hover":se,"--n-close-icon-color-pressed":ce,"--n-close-icon-color-disabled":G,"--n-close-margin":w,"--n-close-margin-rtl":x,"--n-close-size":Ce,"--n-color":g||(r.value?pe:Le),"--n-color-checkable":N,"--n-color-checked":j,"--n-color-checked-hover":Q,"--n-color-checked-pressed":A,"--n-color-hover-checkable":E,"--n-color-pressed-checkable":F,"--n-font-size":_e,"--n-height":Ge,"--n-opacity-disabled":T,"--n-padding":y,"--n-text-color":b||U,"--n-text-color-checkable":S,"--n-text-color-checked":_,"--n-text-color-hover-checkable":$,"--n-text-color-pressed-checkable":R}}),f=n?Pt("tag",H(()=>{let p="";const{type:h,size:g,color:{color:b,textColor:m}={}}=e;return p+=h[0],p+=g[0],b&&(p+=`a${zn(b)}`),m&&(p+=`b${zn(m)}`),r.value&&(p+="c"),p}),u,e):void 0;return Object.assign(Object.assign({},d),{rtlEnabled:c,mergedClsPrefix:o,contentRef:t,mergedBordered:r,handleClick:l,handleCloseClick:s,cssVars:n?void 0:u,themeClass:f==null?void 0:f.themeClass,onRender:f==null?void 0:f.onRender})},render(){var e,t;const{mergedClsPrefix:r,rtlEnabled:o,closable:n,color:{borderColor:i}={},round:a,onRender:l,$slots:s}=this;l==null||l();const d=dt(s.avatar,u=>u&&v("div",{class:`${r}-tag__avatar`},u)),c=dt(s.icon,u=>u&&v("div",{class:`${r}-tag__icon`},u));return v("div",{class:[`${r}-tag`,this.themeClass,{[`${r}-tag--rtl`]:o,[`${r}-tag--strong`]:this.strong,[`${r}-tag--disabled`]:this.disabled,[`${r}-tag--checkable`]:this.checkable,[`${r}-tag--checked`]:this.checkable&&this.checked,[`${r}-tag--round`]:a,[`${r}-tag--avatar`]:d,[`${r}-tag--icon`]:c,[`${r}-tag--closable`]:n}],style:this.cssVars,onClick:this.handleClick,onMouseenter:this.onMouseenter,onMouseleave:this.onMouseleave},c||d,v("span",{class:`${r}-tag__content`,ref:"contentRef"},(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e)),!this.checkable&&n?v(ji,{clsPrefix:r,class:`${r}-tag__close`,disabled:this.disabled,onClick:this.handleCloseClick,focusable:this.internalCloseFocusable,round:a,isButtonTag:this.internalCloseIsButtonTag,absolute:!0}):null,!this.checkable&&this.mergedBordered?v("div",{class:`${r}-tag__border`,style:{borderColor:i}}):null)}}),H4=M("base-clear",` + flex-shrink: 0; + height: 1em; + width: 1em; + position: relative; +`,[O(">",[D("clear",` + font-size: var(--n-clear-size); + height: 1em; + width: 1em; + cursor: pointer; + color: var(--n-clear-color); + transition: color .3s var(--n-bezier); + display: flex; + `,[O("&:hover",` + color: var(--n-clear-color-hover)!important; + `),O("&:active",` + color: var(--n-clear-color-pressed)!important; + `)]),D("placeholder",` + display: flex; + `),D("clear, placeholder",` + position: absolute; + left: 50%; + top: 50%; + transform: translateX(-50%) translateY(-50%); + `,[Oi({originalTransform:"translateX(-50%) translateY(-50%)",left:"50%",top:"50%"})])])]),Js=ae({name:"BaseClear",props:{clsPrefix:{type:String,required:!0},show:Boolean,onClear:Function},setup(e){return co("-base-clear",H4,Te(e,"clsPrefix")),{handleMouseDown(t){t.preventDefault()}}},render(){const{clsPrefix:e}=this;return v("div",{class:`${e}-base-clear`},v(vl,null,{default:()=>{var t,r;return this.show?v("div",{key:"dismiss",class:`${e}-base-clear__clear`,onClick:this.onClear,onMousedown:this.handleMouseDown,"data-clear":!0},Lr(this.$slots.icon,()=>[v(zt,{clsPrefix:e},{default:()=>v(w6,null)})])):v("div",{key:"icon",class:`${e}-base-clear__placeholder`},(r=(t=this.$slots).placeholder)===null||r===void 0?void 0:r.call(t))}}))}}),D4=ae({name:"InternalSelectionSuffix",props:{clsPrefix:{type:String,required:!0},showArrow:{type:Boolean,default:void 0},showClear:{type:Boolean,default:void 0},loading:{type:Boolean,default:!1},onClear:Function},setup(e,{slots:t}){return()=>{const{clsPrefix:r}=e;return v(gl,{clsPrefix:r,class:`${r}-base-suffix`,strokeWidth:24,scale:.85,show:e.loading},{default:()=>e.showArrow?v(Js,{clsPrefix:r,show:e.showClear,onClear:e.onClear},{placeholder:()=>v(zt,{clsPrefix:r,class:`${r}-base-suffix__arrow`},{default:()=>Lr(t.default,()=>[v(y6,null)])})}):null})}}}),tg={paddingSingle:"0 26px 0 12px",paddingMultiple:"3px 26px 0 12px",clearSize:"16px",arrowSize:"16px"};const F4=e=>{const{borderRadius:t,textColor2:r,textColorDisabled:o,inputColor:n,inputColorDisabled:i,primaryColor:a,primaryColorHover:l,warningColor:s,warningColorHover:d,errorColor:c,errorColorHover:u,borderColor:f,iconColor:p,iconColorDisabled:h,clearColor:g,clearColorHover:b,clearColorPressed:m,placeholderColor:y,placeholderColorDisabled:w,fontSizeTiny:x,fontSizeSmall:k,fontSizeMedium:T,fontSizeLarge:S,heightTiny:$,heightSmall:R,heightMedium:_,heightLarge:N}=e;return Object.assign(Object.assign({},tg),{fontSizeTiny:x,fontSizeSmall:k,fontSizeMedium:T,fontSizeLarge:S,heightTiny:$,heightSmall:R,heightMedium:_,heightLarge:N,borderRadius:t,textColor:r,textColorDisabled:o,placeholderColor:y,placeholderColorDisabled:w,color:n,colorDisabled:i,colorActive:n,border:`1px solid ${f}`,borderHover:`1px solid ${l}`,borderActive:`1px solid ${a}`,borderFocus:`1px solid ${l}`,boxShadowHover:"none",boxShadowActive:`0 0 0 2px ${oe(a,{alpha:.2})}`,boxShadowFocus:`0 0 0 2px ${oe(a,{alpha:.2})}`,caretColor:a,arrowColor:p,arrowColorDisabled:h,loadingColor:a,borderWarning:`1px solid ${s}`,borderHoverWarning:`1px solid ${d}`,borderActiveWarning:`1px solid ${s}`,borderFocusWarning:`1px solid ${d}`,boxShadowHoverWarning:"none",boxShadowActiveWarning:`0 0 0 2px ${oe(s,{alpha:.2})}`,boxShadowFocusWarning:`0 0 0 2px ${oe(s,{alpha:.2})}`,colorActiveWarning:n,caretColorWarning:s,borderError:`1px solid ${c}`,borderHoverError:`1px solid ${u}`,borderActiveError:`1px solid ${c}`,borderFocusError:`1px solid ${u}`,boxShadowHoverError:"none",boxShadowActiveError:`0 0 0 2px ${oe(c,{alpha:.2})}`,boxShadowFocusError:`0 0 0 2px ${oe(c,{alpha:.2})}`,colorActiveError:n,caretColorError:c,clearColor:g,clearColorHover:b,clearColorPressed:m})},j4={name:"InternalSelection",common:je,peers:{Popover:jn},self:F4};var N4=j4;const W4={name:"InternalSelection",common:le,peers:{Popover:Uo},self(e){const{borderRadius:t,textColor2:r,textColorDisabled:o,inputColor:n,inputColorDisabled:i,primaryColor:a,primaryColorHover:l,warningColor:s,warningColorHover:d,errorColor:c,errorColorHover:u,iconColor:f,iconColorDisabled:p,clearColor:h,clearColorHover:g,clearColorPressed:b,placeholderColor:m,placeholderColorDisabled:y,fontSizeTiny:w,fontSizeSmall:x,fontSizeMedium:k,fontSizeLarge:T,heightTiny:S,heightSmall:$,heightMedium:R,heightLarge:_}=e;return Object.assign(Object.assign({},tg),{fontSizeTiny:w,fontSizeSmall:x,fontSizeMedium:k,fontSizeLarge:T,heightTiny:S,heightSmall:$,heightMedium:R,heightLarge:_,borderRadius:t,textColor:r,textColorDisabled:o,placeholderColor:m,placeholderColorDisabled:y,color:n,colorDisabled:i,colorActive:oe(a,{alpha:.1}),border:"1px solid #0000",borderHover:`1px solid ${l}`,borderActive:`1px solid ${a}`,borderFocus:`1px solid ${l}`,boxShadowHover:"none",boxShadowActive:`0 0 8px 0 ${oe(a,{alpha:.4})}`,boxShadowFocus:`0 0 8px 0 ${oe(a,{alpha:.4})}`,caretColor:a,arrowColor:f,arrowColorDisabled:p,loadingColor:a,borderWarning:`1px solid ${s}`,borderHoverWarning:`1px solid ${d}`,borderActiveWarning:`1px solid ${s}`,borderFocusWarning:`1px solid ${d}`,boxShadowHoverWarning:"none",boxShadowActiveWarning:`0 0 8px 0 ${oe(s,{alpha:.4})}`,boxShadowFocusWarning:`0 0 8px 0 ${oe(s,{alpha:.4})}`,colorActiveWarning:oe(s,{alpha:.1}),caretColorWarning:s,borderError:`1px solid ${c}`,borderHoverError:`1px solid ${u}`,borderActiveError:`1px solid ${c}`,borderFocusError:`1px solid ${u}`,boxShadowHoverError:"none",boxShadowActiveError:`0 0 8px 0 ${oe(c,{alpha:.4})}`,boxShadowFocusError:`0 0 8px 0 ${oe(c,{alpha:.4})}`,colorActiveError:oe(c,{alpha:.1}),caretColorError:c,clearColor:h,clearColorHover:g,clearColorPressed:b})}};var nd=W4,Jf=ae({name:"SlotMachineNumber",props:{clsPrefix:{type:String,required:!0},value:{type:[Number,String],required:!0},oldOriginalNumber:{type:Number,default:void 0},newOriginalNumber:{type:Number,default:void 0}},setup(e){const t=V(null),r=V(e.value),o=V(e.value),n=V("up"),i=V(!1),a=H(()=>i.value?`${e.clsPrefix}-base-slot-machine-current-number--${n.value}-scroll`:null),l=H(()=>i.value?`${e.clsPrefix}-base-slot-machine-old-number--${n.value}-scroll`:null);De(Te(e,"value"),(c,u)=>{r.value=u,o.value=c,Zt(s)});function s(){const c=e.newOriginalNumber,u=e.oldOriginalNumber;u===void 0||c===void 0||(c>u?d("up"):u>c&&d("down"))}function d(c){n.value=c,i.value=!1,Zt(()=>{var u;(u=t.value)===null||u===void 0||u.offsetWidth,i.value=!0})}return()=>{const{clsPrefix:c}=e;return v("span",{ref:t,class:`${c}-base-slot-machine-number`},r.value!==null?v("span",{class:[`${c}-base-slot-machine-old-number ${c}-base-slot-machine-old-number--top`,l.value]},r.value):null,v("span",{class:[`${c}-base-slot-machine-current-number`,a.value]},v("span",{ref:"numberWrapper",class:[`${c}-base-slot-machine-current-number__inner`,typeof e.value!="number"&&`${c}-base-slot-machine-current-number__inner--not-number`]},o.value)),r.value!==null?v("span",{class:[`${c}-base-slot-machine-old-number ${c}-base-slot-machine-old-number--bottom`,l.value]},r.value):null)}}});const{cubicBezierEaseInOut:Jr}=zr;function rg({duration:e=".2s",delay:t=".1s"}={}){return[O("&.fade-in-width-expand-transition-leave-from, &.fade-in-width-expand-transition-enter-to",{opacity:1}),O("&.fade-in-width-expand-transition-leave-to, &.fade-in-width-expand-transition-enter-from",` + opacity: 0!important; + margin-left: 0!important; + margin-right: 0!important; + `),O("&.fade-in-width-expand-transition-leave-active",` + overflow: hidden; + transition: + opacity ${e} ${Jr}, + max-width ${e} ${Jr} ${t}, + margin-left ${e} ${Jr} ${t}, + margin-right ${e} ${Jr} ${t}; + `),O("&.fade-in-width-expand-transition-enter-active",` + overflow: hidden; + transition: + opacity ${e} ${Jr} ${t}, + max-width ${e} ${Jr}, + margin-left ${e} ${Jr}, + margin-right ${e} ${Jr}; + `)]}const{cubicBezierEaseOut:rn}=zr;function V4({duration:e=".2s"}={}){return[O("&.fade-up-width-expand-transition-leave-active",{transition:` + opacity ${e} ${rn}, + max-width ${e} ${rn}, + transform ${e} ${rn} + `}),O("&.fade-up-width-expand-transition-enter-active",{transition:` + opacity ${e} ${rn}, + max-width ${e} ${rn}, + transform ${e} ${rn} + `}),O("&.fade-up-width-expand-transition-enter-to",{opacity:1,transform:"translateX(0) translateY(0)"}),O("&.fade-up-width-expand-transition-enter-from",{maxWidth:"0 !important",opacity:0,transform:"translateY(60%)"}),O("&.fade-up-width-expand-transition-leave-from",{opacity:1,transform:"translateY(0)"}),O("&.fade-up-width-expand-transition-leave-to",{maxWidth:"0 !important",opacity:0,transform:"translateY(60%)"})]}var U4=O([O("@keyframes n-base-slot-machine-fade-up-in",` + from { + transform: translateY(60%); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } + `),O("@keyframes n-base-slot-machine-fade-down-in",` + from { + transform: translateY(-60%); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } + `),O("@keyframes n-base-slot-machine-fade-up-out",` + from { + transform: translateY(0%); + opacity: 1; + } + to { + transform: translateY(-60%); + opacity: 0; + } + `),O("@keyframes n-base-slot-machine-fade-down-out",` + from { + transform: translateY(0%); + opacity: 1; + } + to { + transform: translateY(60%); + opacity: 0; + } + `),M("base-slot-machine",` + overflow: hidden; + white-space: nowrap; + display: inline-block; + height: 18px; + line-height: 18px; + `,[M("base-slot-machine-number",` + display: inline-block; + position: relative; + height: 18px; + width: .6em; + max-width: .6em; + `,[V4({duration:".2s"}),rg({duration:".2s",delay:"0s"}),M("base-slot-machine-old-number",` + display: inline-block; + opacity: 0; + position: absolute; + left: 0; + right: 0; + `,[K("top",{transform:"translateY(-100%)"}),K("bottom",{transform:"translateY(100%)"}),K("down-scroll",{animation:"n-base-slot-machine-fade-down-out .2s cubic-bezier(0, 0, .2, 1)",animationIterationCount:1}),K("up-scroll",{animation:"n-base-slot-machine-fade-up-out .2s cubic-bezier(0, 0, .2, 1)",animationIterationCount:1})]),M("base-slot-machine-current-number",` + display: inline-block; + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + opacity: 1; + transform: translateY(0); + width: .6em; + `,[K("down-scroll",{animation:"n-base-slot-machine-fade-down-in .2s cubic-bezier(0, 0, .2, 1)",animationIterationCount:1}),K("up-scroll",{animation:"n-base-slot-machine-fade-up-in .2s cubic-bezier(0, 0, .2, 1)",animationIterationCount:1}),D("inner",` + display: inline-block; + position: absolute; + right: 0; + top: 0; + width: .6em; + `,[K("not-number",` + right: unset; + left: 0; + `)])])])])]),K4=ae({name:"BaseSlotMachine",props:{clsPrefix:{type:String,required:!0},value:{type:[Number,String],default:0},max:{type:Number,default:void 0},appeared:{type:Boolean,required:!0}},setup(e){co("-base-slot-machine",U4,Te(e,"clsPrefix"));const t=V(),r=V(),o=H(()=>{if(typeof e.value=="string")return[];if(e.value<1)return[0];const n=[];let i=e.value;for(e.max!==void 0&&(i=Math.min(e.max,i));i>=1;)n.push(i%10),i/=10,i=Math.floor(i);return n.reverse(),n});return De(Te(e,"value"),(n,i)=>{typeof n=="string"?(r.value=void 0,t.value=void 0):typeof i=="string"?(r.value=n,t.value=void 0):(r.value=n,t.value=i)}),()=>{const{value:n,clsPrefix:i}=e;return typeof n=="number"?v("span",{class:`${i}-base-slot-machine`},v(Rc,{name:"fade-up-width-expand-transition",tag:"span"},{default:()=>o.value.map((a,l)=>v(Jf,{clsPrefix:i,key:o.value.length-l-1,oldOriginalNumber:t.value,newOriginalNumber:r.value,value:a}))}),v(ml,{key:"+",width:!0},{default:()=>e.max!==void 0&&e.max{const{borderRadius:t,railColor:r,primaryColor:o,primaryColorHover:n,primaryColorPressed:i,textColor2:a}=e;return Object.assign(Object.assign({},J4),{borderRadius:t,railColor:r,railColorActive:o,linkColor:oe(o,{alpha:.15}),linkTextColor:a,linkTextColorHover:n,linkTextColorPressed:i,linkTextColorActive:o})},ek={name:"Anchor",common:le,self:Q4};var tk=ek;const rk=Fo&&"chrome"in window;Fo&&navigator.userAgent.includes("Firefox");const ng=Fo&&navigator.userAgent.includes("Safari")&&!rk;var ig={paddingTiny:"0 8px",paddingSmall:"0 10px",paddingMedium:"0 12px",paddingLarge:"0 14px",clearSize:"16px"};const ok={name:"Input",common:le,self(e){const{textColor2:t,textColor3:r,textColorDisabled:o,primaryColor:n,primaryColorHover:i,inputColor:a,inputColorDisabled:l,warningColor:s,warningColorHover:d,errorColor:c,errorColorHover:u,borderRadius:f,lineHeight:p,fontSizeTiny:h,fontSizeSmall:g,fontSizeMedium:b,fontSizeLarge:m,heightTiny:y,heightSmall:w,heightMedium:x,heightLarge:k,clearColor:T,clearColorHover:S,clearColorPressed:$,placeholderColor:R,placeholderColorDisabled:_,iconColor:N,iconColorDisabled:E,iconColorHover:F,iconColorPressed:j}=e;return Object.assign(Object.assign({},ig),{countTextColorDisabled:o,countTextColor:r,heightTiny:y,heightSmall:w,heightMedium:x,heightLarge:k,fontSizeTiny:h,fontSizeSmall:g,fontSizeMedium:b,fontSizeLarge:m,lineHeight:p,lineHeightTextarea:p,borderRadius:f,iconSize:"16px",groupLabelColor:a,textColor:t,textColorDisabled:o,textDecorationColor:t,groupLabelTextColor:t,caretColor:n,placeholderColor:R,placeholderColorDisabled:_,color:a,colorDisabled:l,colorFocus:oe(n,{alpha:.1}),groupLabelBorder:"1px solid #0000",border:"1px solid #0000",borderHover:`1px solid ${i}`,borderDisabled:"1px solid #0000",borderFocus:`1px solid ${i}`,boxShadowFocus:`0 0 8px 0 ${oe(n,{alpha:.3})}`,loadingColor:n,loadingColorWarning:s,borderWarning:`1px solid ${s}`,borderHoverWarning:`1px solid ${d}`,colorFocusWarning:oe(s,{alpha:.1}),borderFocusWarning:`1px solid ${d}`,boxShadowFocusWarning:`0 0 8px 0 ${oe(s,{alpha:.3})}`,caretColorWarning:s,loadingColorError:c,borderError:`1px solid ${c}`,borderHoverError:`1px solid ${u}`,colorFocusError:oe(c,{alpha:.1}),borderFocusError:`1px solid ${u}`,boxShadowFocusError:`0 0 8px 0 ${oe(c,{alpha:.3})}`,caretColorError:c,clearColor:T,clearColorHover:S,clearColorPressed:$,iconColor:N,iconColorDisabled:E,iconColorHover:F,iconColorPressed:j,suffixTextColor:t})}};var ur=ok;const nk=e=>{const{textColor2:t,textColor3:r,textColorDisabled:o,primaryColor:n,primaryColorHover:i,inputColor:a,inputColorDisabled:l,borderColor:s,warningColor:d,warningColorHover:c,errorColor:u,errorColorHover:f,borderRadius:p,lineHeight:h,fontSizeTiny:g,fontSizeSmall:b,fontSizeMedium:m,fontSizeLarge:y,heightTiny:w,heightSmall:x,heightMedium:k,heightLarge:T,actionColor:S,clearColor:$,clearColorHover:R,clearColorPressed:_,placeholderColor:N,placeholderColorDisabled:E,iconColor:F,iconColorDisabled:j,iconColorHover:Q,iconColorPressed:A}=e;return Object.assign(Object.assign({},ig),{countTextColorDisabled:o,countTextColor:r,heightTiny:w,heightSmall:x,heightMedium:k,heightLarge:T,fontSizeTiny:g,fontSizeSmall:b,fontSizeMedium:m,fontSizeLarge:y,lineHeight:h,lineHeightTextarea:h,borderRadius:p,iconSize:"16px",groupLabelColor:S,groupLabelTextColor:t,textColor:t,textColorDisabled:o,textDecorationColor:t,caretColor:n,placeholderColor:N,placeholderColorDisabled:E,color:a,colorDisabled:l,colorFocus:a,groupLabelBorder:`1px solid ${s}`,border:`1px solid ${s}`,borderHover:`1px solid ${i}`,borderDisabled:`1px solid ${s}`,borderFocus:`1px solid ${i}`,boxShadowFocus:`0 0 0 2px ${oe(n,{alpha:.2})}`,loadingColor:n,loadingColorWarning:d,borderWarning:`1px solid ${d}`,borderHoverWarning:`1px solid ${c}`,colorFocusWarning:a,borderFocusWarning:`1px solid ${c}`,boxShadowFocusWarning:`0 0 0 2px ${oe(d,{alpha:.2})}`,caretColorWarning:d,loadingColorError:u,borderError:`1px solid ${u}`,borderHoverError:`1px solid ${f}`,colorFocusError:a,borderFocusError:`1px solid ${f}`,boxShadowFocusError:`0 0 0 2px ${oe(u,{alpha:.2})}`,caretColorError:u,clearColor:$,clearColorHover:R,clearColorPressed:_,iconColor:F,iconColorDisabled:j,iconColorHover:Q,iconColorPressed:A,suffixTextColor:t})},ik={name:"Input",common:je,self:nk};var ag=ik;const lg="n-input";function ak(e){let t=0;for(const r of e)t++;return t}function ca(e){return e===""||e==null}function lk(e){const t=V(null);function r(){const{value:i}=e;if(!(i!=null&&i.focus)){n();return}const{selectionStart:a,selectionEnd:l,value:s}=i;if(a==null||l==null){n();return}t.value={start:a,end:l,beforeText:s.slice(0,a),afterText:s.slice(l)}}function o(){var i;const{value:a}=t,{value:l}=e;if(!a||!l)return;const{value:s}=l,{start:d,beforeText:c,afterText:u}=a;let f=s.length;if(s.endsWith(u))f=s.length-u.length;else if(s.startsWith(c))f=c.length;else{const p=c[d-1],h=s.indexOf(p,d-1);h!==-1&&(f=h+1)}(i=l.setSelectionRange)===null||i===void 0||i.call(l,f,f)}function n(){t.value=null}return De(e,n),{recordCursor:r,restoreCursor:o}}var Qf=ae({name:"InputWordCount",setup(e,{slots:t}){const{mergedValueRef:r,maxlengthRef:o,mergedClsPrefixRef:n,countGraphemesRef:i}=me(lg),a=H(()=>{const{value:l}=r;return l===null||Array.isArray(l)?0:(i.value||ak)(l)});return()=>{const{value:l}=o,{value:s}=r;return v("span",{class:`${n.value}-input-word-count`},Uy(t.default,{value:s===null||Array.isArray(s)?"":s},()=>[l===void 0?a.value:`${a.value} / ${l}`]))}}}),sk=M("input",` + max-width: 100%; + cursor: text; + line-height: 1.5; + z-index: auto; + outline: none; + box-sizing: border-box; + position: relative; + display: inline-flex; + border-radius: var(--n-border-radius); + background-color: var(--n-color); + transition: background-color .3s var(--n-bezier); + font-size: var(--n-font-size); + --n-padding-vertical: calc((var(--n-height) - 1.5 * var(--n-font-size)) / 2); +`,[D("input, textarea",` + overflow: hidden; + flex-grow: 1; + position: relative; + `),D("input-el, textarea-el, input-mirror, textarea-mirror, separator, placeholder",` + box-sizing: border-box; + font-size: inherit; + line-height: 1.5; + font-family: inherit; + border: none; + outline: none; + background-color: #0000; + text-align: inherit; + transition: + -webkit-text-fill-color .3s var(--n-bezier), + caret-color .3s var(--n-bezier), + color .3s var(--n-bezier), + text-decoration-color .3s var(--n-bezier); + `),D("input-el, textarea-el",` + -webkit-appearance: none; + scrollbar-width: none; + width: 100%; + min-width: 0; + text-decoration-color: var(--n-text-decoration-color); + color: var(--n-text-color); + caret-color: var(--n-caret-color); + background-color: transparent; + `,[O("&::-webkit-scrollbar, &::-webkit-scrollbar-track-piece, &::-webkit-scrollbar-thumb",` + width: 0; + height: 0; + display: none; + `),O("&::placeholder",` + color: #0000; + -webkit-text-fill-color: transparent !important; + `),O("&:-webkit-autofill ~",[D("placeholder","display: none;")])]),K("round",[ut("textarea","border-radius: calc(var(--n-height) / 2);")]),D("placeholder",` + pointer-events: none; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + overflow: hidden; + color: var(--n-placeholder-color); + `,[O("span",` + width: 100%; + display: inline-block; + `)]),K("textarea",[D("placeholder","overflow: visible;")]),ut("autosize","width: 100%;"),K("autosize",[D("textarea-el, input-el",` + position: absolute; + top: 0; + left: 0; + height: 100%; + `)]),M("input-wrapper",` + overflow: hidden; + display: inline-flex; + flex-grow: 1; + position: relative; + padding-left: var(--n-padding-left); + padding-right: var(--n-padding-right); + `),D("input-mirror",` + padding: 0; + height: var(--n-height); + line-height: var(--n-height); + overflow: hidden; + visibility: hidden; + position: static; + white-space: pre; + pointer-events: none; + `),D("input-el",` + padding: 0; + height: var(--n-height); + line-height: var(--n-height); + `,[O("+",[D("placeholder",` + display: flex; + align-items: center; + `)])]),ut("textarea",[D("placeholder","white-space: nowrap;")]),D("eye",` + transition: color .3s var(--n-bezier); + `),K("textarea","width: 100%;",[M("input-word-count",` + position: absolute; + right: var(--n-padding-right); + bottom: var(--n-padding-vertical); + `),K("resizable",[M("input-wrapper",` + resize: vertical; + min-height: var(--n-height); + `)]),D("textarea-el, textarea-mirror, placeholder",` + height: 100%; + padding-left: 0; + padding-right: 0; + padding-top: var(--n-padding-vertical); + padding-bottom: var(--n-padding-vertical); + word-break: break-word; + display: inline-block; + vertical-align: bottom; + box-sizing: border-box; + line-height: var(--n-line-height-textarea); + margin: 0; + resize: none; + white-space: pre-wrap; + `),D("textarea-mirror",` + width: 100%; + pointer-events: none; + overflow: hidden; + visibility: hidden; + position: static; + white-space: pre-wrap; + overflow-wrap: break-word; + `)]),K("pair",[D("input-el, placeholder","text-align: center;"),D("separator",` + display: flex; + align-items: center; + transition: color .3s var(--n-bezier); + color: var(--n-text-color); + white-space: nowrap; + `,[M("icon",` + color: var(--n-icon-color); + `),M("base-icon",` + color: var(--n-icon-color); + `)])]),K("disabled",` + cursor: not-allowed; + background-color: var(--n-color-disabled); + `,[D("border","border: var(--n-border-disabled);"),D("input-el, textarea-el",` + cursor: not-allowed; + color: var(--n-text-color-disabled); + text-decoration-color: var(--n-text-color-disabled); + `),D("placeholder","color: var(--n-placeholder-color-disabled);"),D("separator","color: var(--n-text-color-disabled);",[M("icon",` + color: var(--n-icon-color-disabled); + `),M("base-icon",` + color: var(--n-icon-color-disabled); + `)]),M("input-word-count",` + color: var(--n-count-text-color-disabled); + `),D("suffix, prefix","color: var(--n-text-color-disabled);",[M("icon",` + color: var(--n-icon-color-disabled); + `),M("internal-icon",` + color: var(--n-icon-color-disabled); + `)])]),ut("disabled",[D("eye",` + display: flex; + align-items: center; + justify-content: center; + color: var(--n-icon-color); + cursor: pointer; + `,[O("&:hover",` + color: var(--n-icon-color-hover); + `),O("&:active",` + color: var(--n-icon-color-pressed); + `)]),O("&:hover",[D("state-border","border: var(--n-border-hover);")]),K("focus","background-color: var(--n-color-focus);",[D("state-border",` + border: var(--n-border-focus); + box-shadow: var(--n-box-shadow-focus); + `)])]),D("border, state-border",` + box-sizing: border-box; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + pointer-events: none; + border-radius: inherit; + border: var(--n-border); + transition: + box-shadow .3s var(--n-bezier), + border-color .3s var(--n-bezier); + `),D("state-border",` + border-color: #0000; + z-index: 1; + `),D("prefix","margin-right: 4px;"),D("suffix",` + margin-left: 4px; + `),D("suffix, prefix",` + transition: color .3s var(--n-bezier); + flex-wrap: nowrap; + flex-shrink: 0; + line-height: var(--n-height); + white-space: nowrap; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--n-suffix-text-color); + `,[M("base-loading",` + font-size: var(--n-icon-size); + margin: 0 2px; + color: var(--n-loading-color); + `),M("base-clear",` + font-size: var(--n-icon-size); + `,[D("placeholder",[M("base-icon",` + transition: color .3s var(--n-bezier); + color: var(--n-icon-color); + font-size: var(--n-icon-size); + `)])]),O(">",[M("icon",` + transition: color .3s var(--n-bezier); + color: var(--n-icon-color); + font-size: var(--n-icon-size); + `)]),M("base-icon",` + font-size: var(--n-icon-size); + `)]),M("input-word-count",` + pointer-events: none; + line-height: 1.5; + font-size: .85em; + color: var(--n-count-text-color); + transition: color .3s var(--n-bezier); + margin-left: 4px; + font-variant: tabular-nums; + `),["warning","error"].map(e=>K(`${e}-status`,[ut("disabled",[M("base-loading",` + color: var(--n-loading-color-${e}) + `),D("input-el, textarea-el",` + caret-color: var(--n-caret-color-${e}); + `),D("state-border",` + border: var(--n-border-${e}); + `),O("&:hover",[D("state-border",` + border: var(--n-border-hover-${e}); + `)]),O("&:focus",` + background-color: var(--n-color-focus-${e}); + `,[D("state-border",` + box-shadow: var(--n-box-shadow-focus-${e}); + border: var(--n-border-focus-${e}); + `)]),K("focus",` + background-color: var(--n-color-focus-${e}); + `,[D("state-border",` + box-shadow: var(--n-box-shadow-focus-${e}); + border: var(--n-border-focus-${e}); + `)])])]))]);const ck=M("input",[K("disabled",[D("input-el, textarea-el",` + -webkit-text-fill-color: var(--n-text-color-disabled); + `)])]),dk=Object.assign(Object.assign({},Ee.props),{bordered:{type:Boolean,default:void 0},type:{type:String,default:"text"},placeholder:[Array,String],defaultValue:{type:[String,Array],default:null},value:[String,Array],disabled:{type:Boolean,default:void 0},size:String,rows:{type:[Number,String],default:3},round:Boolean,minlength:[String,Number],maxlength:[String,Number],clearable:Boolean,autosize:{type:[Boolean,Object],default:!1},pair:Boolean,separator:String,readonly:{type:[String,Boolean],default:!1},passivelyActivated:Boolean,showPasswordOn:String,stateful:{type:Boolean,default:!0},autofocus:Boolean,inputProps:Object,resizable:{type:Boolean,default:!0},showCount:Boolean,loading:{type:Boolean,default:void 0},allowInput:Function,renderCount:Function,onMousedown:Function,onKeydown:Function,onKeyup:Function,onInput:[Function,Array],onFocus:[Function,Array],onBlur:[Function,Array],onClick:[Function,Array],onChange:[Function,Array],onClear:[Function,Array],countGraphemes:Function,status:String,"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],textDecoration:[String,Array],attrSize:{type:Number,default:20},onInputBlur:[Function,Array],onInputFocus:[Function,Array],onDeactivate:[Function,Array],onActivate:[Function,Array],onWrapperFocus:[Function,Array],onWrapperBlur:[Function,Array],internalDeactivateOnEnter:Boolean,internalForceFocus:Boolean,internalLoadingBeforeSuffix:Boolean,showPasswordToggle:Boolean});var sg=ae({name:"Input",props:dk,setup(e){const{mergedClsPrefixRef:t,mergedBorderedRef:r,inlineThemeDisabled:o,mergedRtlRef:n}=st(e),i=Ee("Input","-input",sk,ag,e,t);ng&&co("-input-safari",ck,t);const a=V(null),l=V(null),s=V(null),d=V(null),c=V(null),u=V(null),f=V(null),p=lk(f),h=V(null),{localeRef:g}=Em("Input"),b=V(e.defaultValue),m=Te(e,"value"),y=En(m,b),w=jv(e),{mergedSizeRef:x,mergedDisabledRef:k,mergedStatusRef:T}=w,S=V(!1),$=V(!1),R=V(!1),_=V(!1);let N=null;const E=H(()=>{const{placeholder:B,pair:te}=e;return te?Array.isArray(B)?B:B===void 0?["",""]:[B,B]:B===void 0?[g.value.placeholder]:[B]}),F=H(()=>{const{value:B}=R,{value:te}=y,{value:Se}=E;return!B&&(ca(te)||Array.isArray(te)&&ca(te[0]))&&Se[0]}),j=H(()=>{const{value:B}=R,{value:te}=y,{value:Se}=E;return!B&&Se[1]&&(ca(te)||Array.isArray(te)&&ca(te[1]))}),Q=mt(()=>e.internalForceFocus||S.value),A=mt(()=>{if(k.value||e.readonly||!e.clearable||!Q.value&&!$.value)return!1;const{value:B}=y,{value:te}=Q;return e.pair?!!(Array.isArray(B)&&(B[0]||B[1]))&&($.value||te):!!B&&($.value||te)}),X=H(()=>{const{showPasswordOn:B}=e;if(B)return B;if(e.showPasswordToggle)return"click"}),ne=V(!1),pe=H(()=>{const{textDecoration:B}=e;return B?Array.isArray(B)?B.map(te=>({textDecoration:te})):[{textDecoration:B}]:["",""]}),Ce=V(void 0),$e=()=>{var B,te;if(e.type==="textarea"){const{autosize:Se}=e;if(Se&&(Ce.value=(te=(B=h.value)===null||B===void 0?void 0:B.$el)===null||te===void 0?void 0:te.offsetWidth),!l.value||typeof Se=="boolean")return;const{paddingTop:at,paddingBottom:pt,lineHeight:rt}=window.getComputedStyle(l.value),fo=Number(at.slice(0,-2)),ho=Number(pt.slice(0,-2)),po=Number(rt.slice(0,-2)),{value:Wn}=s;if(!Wn)return;if(Se.minRows){const Vn=Math.max(Se.minRows,1),kl=`${fo+ho+po*Vn}px`;Wn.style.minHeight=kl}if(Se.maxRows){const Vn=`${fo+ho+po*Se.maxRows}px`;Wn.style.maxHeight=Vn}}},_e=H(()=>{const{maxlength:B}=e;return B===void 0?void 0:Number(B)});gt(()=>{const{value:B}=y;Array.isArray(B)||Lt(B)});const Ge=Wr().proxy;function Le(B){const{onUpdateValue:te,"onUpdate:value":Se,onInput:at}=e,{nTriggerFormInput:pt}=w;te&&Ae(te,B),Se&&Ae(Se,B),at&&Ae(at,B),b.value=B,pt()}function U(B){const{onChange:te}=e,{nTriggerFormChange:Se}=w;te&&Ae(te,B),b.value=B,Se()}function ee(B){const{onBlur:te}=e,{nTriggerFormBlur:Se}=w;te&&Ae(te,B),Se()}function G(B){const{onFocus:te}=e,{nTriggerFormFocus:Se}=w;te&&Ae(te,B),Se()}function se(B){const{onClear:te}=e;te&&Ae(te,B)}function ce(B){const{onInputBlur:te}=e;te&&Ae(te,B)}function Re(B){const{onInputFocus:te}=e;te&&Ae(te,B)}function ge(){const{onDeactivate:B}=e;B&&Ae(B)}function C(){const{onActivate:B}=e;B&&Ae(B)}function P(B){const{onClick:te}=e;te&&Ae(te,B)}function I(B){const{onWrapperFocus:te}=e;te&&Ae(te,B)}function W(B){const{onWrapperBlur:te}=e;te&&Ae(te,B)}function z(){R.value=!0}function L(B){R.value=!1,B.target===u.value?Y(B,1):Y(B,0)}function Y(B,te=0,Se="input"){const at=B.target.value;if(Lt(at),B instanceof InputEvent&&!B.isComposing&&(R.value=!1),e.type==="textarea"){const{value:rt}=h;rt&&rt.syncUnifiedContainer()}if(N=at,R.value)return;p.recordCursor();const pt=q(at);if(pt)if(!e.pair)Se==="input"?Le(at):U(at);else{let{value:rt}=y;Array.isArray(rt)?rt=[rt[0],rt[1]]:rt=["",""],rt[te]=at,Se==="input"?Le(rt):U(rt)}Ge.$forceUpdate(),pt||Zt(p.restoreCursor)}function q(B){const{countGraphemes:te,maxlength:Se,minlength:at}=e;if(te){let rt;if(Se!==void 0&&(rt===void 0&&(rt=te(B)),rt>Number(Se))||at!==void 0&&(rt===void 0&&(rt=te(B)),rt{at.preventDefault(),Ue("mouseup",document,te)};if(Qe("mouseup",document,te),X.value!=="mousedown")return;ne.value=!0;const Se=()=>{ne.value=!1,Ue("mouseup",document,Se)};Qe("mouseup",document,Se)}function er(B){var te;switch((te=e.onKeydown)===null||te===void 0||te.call(e,B),B.key){case"Escape":bt();break;case"Enter":Gt(B);break}}function Gt(B){var te,Se;if(e.passivelyActivated){const{value:at}=_;if(at){e.internalDeactivateOnEnter&&bt();return}B.preventDefault(),e.type==="textarea"?(te=l.value)===null||te===void 0||te.focus():(Se=c.value)===null||Se===void 0||Se.focus()}}function bt(){e.passivelyActivated&&(_.value=!1,Zt(()=>{var B;(B=a.value)===null||B===void 0||B.focus()}))}function re(){var B,te,Se;k.value||(e.passivelyActivated?(B=a.value)===null||B===void 0||B.focus():((te=l.value)===null||te===void 0||te.focus(),(Se=c.value)===null||Se===void 0||Se.focus()))}function ve(){var B;!((B=a.value)===null||B===void 0)&&B.contains(document.activeElement)&&document.activeElement.blur()}function Pe(){var B,te;(B=l.value)===null||B===void 0||B.select(),(te=c.value)===null||te===void 0||te.select()}function Ye(){k.value||(l.value?l.value.focus():c.value&&c.value.focus())}function ct(){const{value:B}=a;(B==null?void 0:B.contains(document.activeElement))&&B!==document.activeElement&&bt()}function wt(B){if(e.type==="textarea"){const{value:te}=l;te==null||te.scrollTo(B)}else{const{value:te}=c;te==null||te.scrollTo(B)}}function Lt(B){const{type:te,pair:Se,autosize:at}=e;if(!Se&&at)if(te==="textarea"){const{value:pt}=s;pt&&(pt.textContent=(B!=null?B:"")+`\r +`)}else{const{value:pt}=d;pt&&(B?pt.textContent=B:pt.innerHTML=" ")}}function tt(){$e()}const jt=V({top:"0"});function Ir(B){var te;const{scrollTop:Se}=B.target;jt.value.top=`${-Se}px`,(te=h.value)===null||te===void 0||te.syncUnifiedContainer()}let Ko=null;Wt(()=>{const{autosize:B,type:te}=e;B&&te==="textarea"?Ko=De(y,Se=>{!Array.isArray(Se)&&Se!==N&&Lt(Se)}):Ko==null||Ko()});let qo=null;Wt(()=>{e.type==="textarea"?qo=De(y,B=>{var te;!Array.isArray(B)&&B!==N&&((te=h.value)===null||te===void 0||te.syncUnifiedContainer())}):qo==null||qo()}),Be(lg,{mergedValueRef:y,maxlengthRef:_e,mergedClsPrefixRef:t,countGraphemesRef:Te(e,"countGraphemes")});const Lb={wrapperElRef:a,inputElRef:c,textareaElRef:l,isCompositing:R,focus:re,blur:ve,select:Pe,deactivate:ct,activate:Ye,scrollTo:wt},Hb=Kr("Input",n,t),zd=H(()=>{const{value:B}=x,{common:{cubicBezierEaseInOut:te},self:{color:Se,borderRadius:at,textColor:pt,caretColor:rt,caretColorError:fo,caretColorWarning:ho,textDecorationColor:po,border:Wn,borderDisabled:Vn,borderHover:kl,borderFocus:Db,placeholderColor:Fb,placeholderColorDisabled:jb,lineHeightTextarea:Nb,colorDisabled:Wb,colorFocus:Vb,textColorDisabled:Ub,boxShadowFocus:Kb,iconSize:qb,colorFocusWarning:Gb,boxShadowFocusWarning:Yb,borderWarning:Xb,borderFocusWarning:Zb,borderHoverWarning:Jb,colorFocusError:Qb,boxShadowFocusError:e0,borderError:t0,borderFocusError:r0,borderHoverError:o0,clearSize:n0,clearColor:i0,clearColorHover:a0,clearColorPressed:l0,iconColor:s0,iconColorDisabled:c0,suffixTextColor:d0,countTextColor:u0,countTextColorDisabled:f0,iconColorHover:h0,iconColorPressed:p0,loadingColor:v0,loadingColorError:m0,loadingColorWarning:g0,[ie("padding",B)]:b0,[ie("fontSize",B)]:x0,[ie("height",B)]:C0}}=i.value,{left:y0,right:w0}=av(b0);return{"--n-bezier":te,"--n-count-text-color":u0,"--n-count-text-color-disabled":f0,"--n-color":Se,"--n-font-size":x0,"--n-border-radius":at,"--n-height":C0,"--n-padding-left":y0,"--n-padding-right":w0,"--n-text-color":pt,"--n-caret-color":rt,"--n-text-decoration-color":po,"--n-border":Wn,"--n-border-disabled":Vn,"--n-border-hover":kl,"--n-border-focus":Db,"--n-placeholder-color":Fb,"--n-placeholder-color-disabled":jb,"--n-icon-size":qb,"--n-line-height-textarea":Nb,"--n-color-disabled":Wb,"--n-color-focus":Vb,"--n-text-color-disabled":Ub,"--n-box-shadow-focus":Kb,"--n-loading-color":v0,"--n-caret-color-warning":ho,"--n-color-focus-warning":Gb,"--n-box-shadow-focus-warning":Yb,"--n-border-warning":Xb,"--n-border-focus-warning":Zb,"--n-border-hover-warning":Jb,"--n-loading-color-warning":g0,"--n-caret-color-error":fo,"--n-color-focus-error":Qb,"--n-box-shadow-focus-error":e0,"--n-border-error":t0,"--n-border-focus-error":r0,"--n-border-hover-error":o0,"--n-loading-color-error":m0,"--n-clear-color":i0,"--n-clear-size":n0,"--n-clear-color-hover":a0,"--n-clear-color-pressed":l0,"--n-icon-color":s0,"--n-icon-color-hover":h0,"--n-icon-color-pressed":p0,"--n-icon-color-disabled":c0,"--n-suffix-text-color":d0}}),Go=o?Pt("input",H(()=>{const{value:B}=x;return B[0]}),zd,e):void 0;return Object.assign(Object.assign({},Lb),{wrapperElRef:a,inputElRef:c,inputMirrorElRef:d,inputEl2Ref:u,textareaElRef:l,textareaMirrorElRef:s,textareaScrollbarInstRef:h,rtlEnabled:Hb,uncontrolledValue:b,mergedValue:y,passwordVisible:ne,mergedPlaceholder:E,showPlaceholder1:F,showPlaceholder2:j,mergedFocus:Q,isComposing:R,activated:_,showClearButton:A,mergedSize:x,mergedDisabled:k,textDecorationStyle:pe,mergedClsPrefix:t,mergedBordered:r,mergedShowPasswordOn:X,placeholderStyle:jt,mergedStatus:T,textAreaScrollContainerWidth:Ce,handleTextAreaScroll:Ir,handleCompositionStart:z,handleCompositionEnd:L,handleInput:Y,handleInputBlur:J,handleInputFocus:Z,handleWrapperBlur:fe,handleWrapperFocus:de,handleMouseEnter:et,handleMouseLeave:xt,handleMouseDown:Fe,handleChange:we,handleClick:Ie,handleClear:Ne,handlePasswordToggleClick:Ft,handlePasswordToggleMousedown:qr,handleWrapperKeydown:er,handleTextAreaMirrorResize:tt,getTextareaScrollContainer:()=>l.value,mergedTheme:i,cssVars:o?void 0:zd,themeClass:Go==null?void 0:Go.themeClass,onRender:Go==null?void 0:Go.onRender})},render(){var e,t;const{mergedClsPrefix:r,mergedStatus:o,themeClass:n,type:i,countGraphemes:a,onRender:l}=this,s=this.$slots;return l==null||l(),v("div",{ref:"wrapperElRef",class:[`${r}-input`,n,o&&`${r}-input--${o}-status`,{[`${r}-input--rtl`]:this.rtlEnabled,[`${r}-input--disabled`]:this.mergedDisabled,[`${r}-input--textarea`]:i==="textarea",[`${r}-input--resizable`]:this.resizable&&!this.autosize,[`${r}-input--autosize`]:this.autosize,[`${r}-input--round`]:this.round&&i!=="textarea",[`${r}-input--pair`]:this.pair,[`${r}-input--focus`]:this.mergedFocus,[`${r}-input--stateful`]:this.stateful}],style:this.cssVars,tabindex:!this.mergedDisabled&&this.passivelyActivated&&!this.activated?0:void 0,onFocus:this.handleWrapperFocus,onBlur:this.handleWrapperBlur,onClick:this.handleClick,onMousedown:this.handleMouseDown,onMouseenter:this.handleMouseEnter,onMouseleave:this.handleMouseLeave,onCompositionstart:this.handleCompositionStart,onCompositionend:this.handleCompositionEnd,onKeyup:this.onKeyup,onKeydown:this.handleWrapperKeydown},v("div",{class:`${r}-input-wrapper`},dt(s.prefix,d=>d&&v("div",{class:`${r}-input__prefix`},d)),i==="textarea"?v(Wm,{ref:"textareaScrollbarInstRef",class:`${r}-input__textarea`,container:this.getTextareaScrollContainer,triggerDisplayManually:!0,useUnifiedContainer:!0,internalHoistYRail:!0},{default:()=>{var d,c;const{textAreaScrollContainerWidth:u}=this,f={width:this.autosize&&u&&`${u}px`};return v(Je,null,v("textarea",Object.assign({},this.inputProps,{ref:"textareaElRef",class:[`${r}-input__textarea-el`,(d=this.inputProps)===null||d===void 0?void 0:d.class],autofocus:this.autofocus,rows:Number(this.rows),placeholder:this.placeholder,value:this.mergedValue,disabled:this.mergedDisabled,maxlength:a?void 0:this.maxlength,minlength:a?void 0:this.minlength,readonly:this.readonly,tabindex:this.passivelyActivated&&!this.activated?-1:void 0,style:[this.textDecorationStyle[0],(c=this.inputProps)===null||c===void 0?void 0:c.style,f],onBlur:this.handleInputBlur,onFocus:p=>this.handleInputFocus(p,2),onInput:this.handleInput,onChange:this.handleChange,onScroll:this.handleTextAreaScroll})),this.showPlaceholder1?v("div",{class:`${r}-input__placeholder`,style:[this.placeholderStyle,f],key:"placeholder"},this.mergedPlaceholder[0]):null,this.autosize?v(In,{onResize:this.handleTextAreaMirrorResize},{default:()=>v("div",{ref:"textareaMirrorElRef",class:`${r}-input__textarea-mirror`,key:"mirror"})}):null)}}):v("div",{class:`${r}-input__input`},v("input",Object.assign({type:i==="password"&&this.mergedShowPasswordOn&&this.passwordVisible?"text":i},this.inputProps,{ref:"inputElRef",class:[`${r}-input__input-el`,(e=this.inputProps)===null||e===void 0?void 0:e.class],style:[this.textDecorationStyle[0],(t=this.inputProps)===null||t===void 0?void 0:t.style],tabindex:this.passivelyActivated&&!this.activated?-1:void 0,placeholder:this.mergedPlaceholder[0],disabled:this.mergedDisabled,maxlength:a?void 0:this.maxlength,minlength:a?void 0:this.minlength,value:Array.isArray(this.mergedValue)?this.mergedValue[0]:this.mergedValue,readonly:this.readonly,autofocus:this.autofocus,size:this.attrSize,onBlur:this.handleInputBlur,onFocus:d=>this.handleInputFocus(d,0),onInput:d=>this.handleInput(d,0),onChange:d=>this.handleChange(d,0)})),this.showPlaceholder1?v("div",{class:`${r}-input__placeholder`},v("span",null,this.mergedPlaceholder[0])):null,this.autosize?v("div",{class:`${r}-input__input-mirror`,key:"mirror",ref:"inputMirrorElRef"},"\xA0"):null),!this.pair&&dt(s.suffix,d=>d||this.clearable||this.showCount||this.mergedShowPasswordOn||this.loading!==void 0?v("div",{class:`${r}-input__suffix`},[dt(s["clear-icon-placeholder"],c=>(this.clearable||c)&&v(Js,{clsPrefix:r,show:this.showClearButton,onClear:this.handleClear},{placeholder:()=>c,icon:()=>{var u,f;return(f=(u=this.$slots)["clear-icon"])===null||f===void 0?void 0:f.call(u)}})),this.internalLoadingBeforeSuffix?null:d,this.loading!==void 0?v(D4,{clsPrefix:r,loading:this.loading,showArrow:!1,showClear:!1,style:this.cssVars}):null,this.internalLoadingBeforeSuffix?d:null,this.showCount&&this.type!=="textarea"?v(Qf,null,{default:c=>{var u;return(u=s.count)===null||u===void 0?void 0:u.call(s,c)}}):null,this.mergedShowPasswordOn&&this.type==="password"?v("div",{class:`${r}-input__eye`,onMousedown:this.handlePasswordToggleMousedown,onClick:this.handlePasswordToggleClick},this.passwordVisible?Lr(s["password-visible-icon"],()=>[v(zt,{clsPrefix:r},{default:()=>v(x6,null)})]):Lr(s["password-invisible-icon"],()=>[v(zt,{clsPrefix:r},{default:()=>v(C6,null)})])):null]):null)),this.pair?v("span",{class:`${r}-input__separator`},Lr(s.separator,()=>[this.separator])):null,this.pair?v("div",{class:`${r}-input-wrapper`},v("div",{class:`${r}-input__input`},v("input",{ref:"inputEl2Ref",type:this.type,class:`${r}-input__input-el`,tabindex:this.passivelyActivated&&!this.activated?-1:void 0,placeholder:this.mergedPlaceholder[1],disabled:this.mergedDisabled,maxlength:a?void 0:this.maxlength,minlength:a?void 0:this.minlength,value:Array.isArray(this.mergedValue)?this.mergedValue[1]:void 0,readonly:this.readonly,style:this.textDecorationStyle[1],onBlur:this.handleInputBlur,onFocus:d=>this.handleInputFocus(d,1),onInput:d=>this.handleInput(d,1),onChange:d=>this.handleChange(d,1)}),this.showPlaceholder2?v("div",{class:`${r}-input__placeholder`},v("span",null,this.mergedPlaceholder[1])):null),dt(s.suffix,d=>(this.clearable||d)&&v("div",{class:`${r}-input__suffix`},[this.clearable&&v(Js,{clsPrefix:r,show:this.showClearButton,onClear:this.handleClear},{icon:()=>{var c;return(c=s["clear-icon"])===null||c===void 0?void 0:c.call(s)},placeholder:()=>{var c;return(c=s["clear-icon-placeholder"])===null||c===void 0?void 0:c.call(s)}}),d]))):null,this.mergedBordered?v("div",{class:`${r}-input__border`}):null,this.mergedBordered?v("div",{class:`${r}-input__state-border`}):null,this.showCount&&i==="textarea"?v(Qf,null,{default:d=>{var c;const{renderCount:u}=this;return u?u(d):(c=s.count)===null||c===void 0?void 0:c.call(s,d)}}):null)}});function uk(e){const{boxShadow2:t}=e;return{menuBoxShadow:t}}const fk={name:"AutoComplete",common:le,peers:{InternalSelectMenu:Ni,Input:ur},self:uk};var hk=fk;const yn=Fo&&"loading"in document.createElement("img"),pk=(e={})=>{var t;const{root:r=null}=e;return{hash:`${e.rootMargin||"0px 0px 0px 0px"}-${Array.isArray(e.threshold)?e.threshold.join(","):(t=e.threshold)!==null&&t!==void 0?t:"0"}`,options:Object.assign(Object.assign({},e),{root:(typeof r=="string"?document.querySelector(r):r)||document.documentElement})}},ns=new WeakMap,is=new WeakMap,as=new WeakMap,cg=(e,t,r)=>{if(!e)return()=>{};const o=pk(t),{root:n}=o.options;let i;const a=ns.get(n);a?i=a:(i=new Map,ns.set(n,i));let l,s;i.has(o.hash)?(s=i.get(o.hash),s[1].has(e)||(l=s[0],s[1].add(e),l.observe(e))):(l=new IntersectionObserver(u=>{u.forEach(f=>{if(f.isIntersecting){const p=is.get(f.target),h=as.get(f.target);p&&p(),h&&(h.value=!0)}})},o.options),l.observe(e),s=[l,new Set([e])],i.set(o.hash,s));let d=!1;const c=()=>{d||(is.delete(e),as.delete(e),d=!0,s[1].has(e)&&(s[0].unobserve(e),s[1].delete(e)),s[1].size<=0&&i.delete(o.hash),i.size||ns.delete(n))};return is.set(e,c),as.set(e,r),c},dg=e=>{const{borderRadius:t,avatarColor:r,cardColor:o,fontSize:n,heightTiny:i,heightSmall:a,heightMedium:l,heightLarge:s,heightHuge:d,modalColor:c,popoverColor:u}=e;return{borderRadius:t,fontSize:n,border:`2px solid ${o}`,heightTiny:i,heightSmall:a,heightMedium:l,heightLarge:s,heightHuge:d,color:xe(o,r),colorModal:xe(c,r),colorPopover:xe(u,r)}},vk={name:"Avatar",common:je,self:dg};var mk=vk;const gk={name:"Avatar",common:le,self:dg};var ug=gk;const bk="n-avatar-group";var xk=M("avatar",` + width: var(--n-merged-size); + height: var(--n-merged-size); + color: #FFF; + font-size: var(--n-font-size); + display: inline-flex; + position: relative; + overflow: hidden; + text-align: center; + border: var(--n-border); + border-radius: var(--n-border-radius); + --n-merged-color: var(--n-color); + background-color: var(--n-merged-color); + transition: + border-color .3s var(--n-bezier), + background-color .3s var(--n-bezier), + color .3s var(--n-bezier); +`,[Hc(O("&","--n-merged-color: var(--n-color-modal);")),pv(O("&","--n-merged-color: var(--n-color-popover);")),O("img",` + width: 100%; + height: 100%; + `),D("text",` + white-space: nowrap; + display: inline-block; + position: absolute; + left: 50%; + top: 50%; + `),M("icon",` + vertical-align: bottom; + font-size: calc(var(--n-merged-size) - 6px); + `),D("text","line-height: 1.25")]);const Ck=Object.assign(Object.assign({},Ee.props),{size:[String,Number],src:String,circle:{type:Boolean,default:void 0},objectFit:String,round:{type:Boolean,default:void 0},bordered:{type:Boolean,default:void 0},onError:Function,fallbackSrc:String,intersectionObserverOptions:Object,lazy:Boolean,onLoad:Function,renderPlaceholder:Function,renderFallback:Function,imgProps:Object,color:String});var yk=ae({name:"Avatar",props:Ck,setup(e){const{mergedClsPrefixRef:t,inlineThemeDisabled:r}=st(e),o=V(!1);let n=null;const i=V(null),a=V(null),l=()=>{const{value:w}=i;if(w&&(n===null||n!==w.innerHTML)){n=w.innerHTML;const{value:x}=a;if(x){const{offsetWidth:k,offsetHeight:T}=x,{offsetWidth:S,offsetHeight:$}=w,R=.9,_=Math.min(k/S*R,T/$*R,1);w.style.transform=`translateX(-50%) translateY(-50%) scale(${_})`}}},s=me(bk,null),d=H(()=>{const{size:w}=e;if(w)return w;const{size:x}=s||{};return x||"medium"}),c=Ee("Avatar","-avatar",xk,mk,e,t),u=me(eg,null),f=H(()=>{if(s)return!0;const{round:w,circle:x}=e;return w!==void 0||x!==void 0?w||x:u?u.roundRef.value:!1}),p=H(()=>s?!0:e.bordered||!1),h=w=>{var x;if(!m.value)return;o.value=!0;const{onError:k,imgProps:T}=e;(x=T==null?void 0:T.onError)===null||x===void 0||x.call(T,w),k&&k(w)};De(()=>e.src,()=>o.value=!1);const g=H(()=>{const w=d.value,x=f.value,k=p.value,{color:T}=e,{self:{borderRadius:S,fontSize:$,color:R,border:_,colorModal:N,colorPopover:E},common:{cubicBezierEaseInOut:F}}=c.value;let j;return typeof w=="number"?j=`${w}px`:j=c.value.self[ie("height",w)],{"--n-font-size":$,"--n-border":k?_:"none","--n-border-radius":x?"50%":S,"--n-color":T||R,"--n-color-modal":T||N,"--n-color-popover":T||E,"--n-bezier":F,"--n-merged-size":`var(--n-avatar-size-override, ${j})`}}),b=r?Pt("avatar",H(()=>{const w=d.value,x=f.value,k=p.value,{color:T}=e;let S="";return w&&(typeof w=="number"?S+=`a${w}`:S+=w[0]),x&&(S+="b"),k&&(S+="c"),T&&(S+=zn(T)),S}),g,e):void 0,m=V(!e.lazy);gt(()=>{if(yn)return;let w;const x=Wt(()=>{w==null||w(),w=void 0,e.lazy&&(w=cg(a.value,e.intersectionObserverOptions,m))});ht(()=>{x(),w==null||w()})});const y=V(!e.lazy);return{textRef:i,selfRef:a,mergedRoundRef:f,mergedClsPrefix:t,fitTextTransform:l,cssVars:r?void 0:g,themeClass:b==null?void 0:b.themeClass,onRender:b==null?void 0:b.onRender,hasLoadError:o,handleError:h,shouldStartLoading:m,loaded:y,mergedOnLoad:w=>{var x;const{onLoad:k,imgProps:T}=e;k==null||k(w),(x=T==null?void 0:T.onLoad)===null||x===void 0||x.call(T,w),y.value=!0}}},render(){var e,t;const{$slots:r,src:o,mergedClsPrefix:n,lazy:i,onRender:a,mergedOnLoad:l,shouldStartLoading:s,loaded:d,hasLoadError:c}=this;a==null||a();let u;const f=!d&&!c&&(this.renderPlaceholder?this.renderPlaceholder():(t=(e=this.$slots).placeholder)===null||t===void 0?void 0:t.call(e));return this.hasLoadError?u=this.renderFallback?this.renderFallback():Lr(r.fallback,()=>[v("img",{src:this.fallbackSrc,style:{objectFit:this.objectFit}})]):u=dt(r.default,p=>{if(p)return v(In,{onResize:this.fitTextTransform},{default:()=>v("span",{ref:"textRef",class:`${n}-avatar__text`},p)});if(o){const{imgProps:h}=this;return v("img",Object.assign(Object.assign({},h),{loading:yn&&!this.intersectionObserverOptions&&i?"lazy":"eager",src:yn||s||d?o:void 0,onLoad:l,"data-image-src":o,onError:this.handleError,style:[h==null?void 0:h.style,{objectFit:this.objectFit},f?{height:"0",width:"0",visibility:"hidden",position:"absolute"}:""]}))}}),v("span",{ref:"selfRef",class:[`${n}-avatar`,this.themeClass],style:this.cssVars},u,i&&f)}});const wk=()=>({gap:"-12px"}),Sk={name:"AvatarGroup",common:le,peers:{Avatar:ug},self:wk};var $k=Sk,_k={width:"44px",height:"44px",borderRadius:"22px",iconSize:"26px"};const Pk={name:"BackTop",common:le,self(e){const{popoverColor:t,textColor2:r,primaryColorHover:o,primaryColorPressed:n}=e;return Object.assign(Object.assign({},_k),{color:t,textColor:r,iconColor:r,iconColorHover:o,iconColorPressed:n,boxShadow:"0 2px 8px 0px rgba(0, 0, 0, .12)",boxShadowHover:"0 2px 12px 0px rgba(0, 0, 0, .18)",boxShadowPressed:"0 2px 12px 0px rgba(0, 0, 0, .18)"})}};var kk=Pk;const Tk={name:"Badge",common:le,self(e){const{errorColorSuppl:t,infoColorSuppl:r,successColorSuppl:o,warningColorSuppl:n,fontFamily:i}=e;return{color:t,colorInfo:r,colorSuccess:o,colorError:t,colorWarning:n,fontSize:"12px",fontFamily:i}}};var zk=Tk;const Ek=e=>{const{errorColor:t,infoColor:r,successColor:o,warningColor:n,fontFamily:i}=e;return{color:t,colorInfo:r,colorSuccess:o,colorError:t,colorWarning:n,fontSize:"12px",fontFamily:i}},Rk={name:"Badge",common:je,self:Ek};var Ik=Rk,Ok=O([O("@keyframes badge-wave-spread",{from:{boxShadow:"0 0 0.5px 0px var(--n-ripple-color)",opacity:.6},to:{boxShadow:"0 0 0.5px 4.5px var(--n-ripple-color)",opacity:0}}),M("badge",` + display: inline-flex; + position: relative; + vertical-align: middle; + color: var(--n-color); + font-family: var(--n-font-family); + `,[K("as-is",[M("badge-sup",{position:"static",transform:"translateX(0)"},[Mi({transformOrigin:"left bottom",originalTransform:"translateX(0)"})])]),K("dot",[M("badge-sup",` + height: 8px; + width: 8px; + padding: 0; + min-width: 8px; + left: 100%; + bottom: calc(100% - 4px); + `,[O("::before","border-radius: 4px;")])]),M("badge-sup",` + background: var(--n-color); + transition: + background-color .3s var(--n-bezier), + color .3s var(--n-bezier); + color: #FFF; + position: absolute; + height: 18px; + line-height: 18px; + border-radius: 9px; + padding: 0 6px; + text-align: center; + font-size: var(--n-font-size); + transform: translateX(-50%); + left: 100%; + bottom: calc(100% - 9px); + font-variant-numeric: tabular-nums; + z-index: 1; + display: flex; + align-items: center; + `,[Mi({transformOrigin:"left bottom",originalTransform:"translateX(-50%)"}),M("base-wave",{zIndex:1,animationDuration:"2s",animationIterationCount:"infinite",animationDelay:"1s",animationTimingFunction:"var(--n-ripple-bezier)",animationName:"badge-wave-spread"}),O("&::before",` + opacity: 0; + transform: scale(1); + border-radius: 9px; + content: ""; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + `)])])]);const Ak=Object.assign(Object.assign({},Ee.props),{value:[String,Number],max:Number,dot:Boolean,type:{type:String,default:"default"},show:{type:Boolean,default:!0},showZero:Boolean,processing:Boolean,color:String,offset:Array});var Mk=ae({name:"Badge",props:Ak,setup(e,{slots:t}){const{mergedClsPrefixRef:r,inlineThemeDisabled:o,mergedRtlRef:n}=st(e),i=Ee("Badge","-badge",Ok,Ik,e,r),a=V(!1),l=()=>{a.value=!0},s=()=>{a.value=!1},d=H(()=>e.show&&(e.dot||e.value!==void 0&&!(!e.showZero&&e.value<=0)||!Ia(t.value)));gt(()=>{d.value&&(a.value=!0)});const c=Kr("Badge",n,r),u=H(()=>{const{type:h,color:g}=e,{common:{cubicBezierEaseInOut:b,cubicBezierEaseOut:m},self:{[ie("color",h)]:y,fontFamily:w,fontSize:x}}=i.value;return{"--n-font-size":x,"--n-font-family":w,"--n-color":g||y,"--n-ripple-color":g||y,"--n-bezier":b,"--n-ripple-bezier":m}}),f=o?Pt("badge",H(()=>{let h="";const{type:g,color:b}=e;return g&&(h+=g[0]),b&&(h+=zn(b)),h}),u,e):void 0,p=H(()=>{const{offset:h}=e;if(!h)return;const[g,b]=h,m=typeof g=="number"?`${g}px`:g,y=typeof b=="number"?`${b}px`:b;return{transform:`translate(calc(${c!=null&&c.value?"50%":"-50%"} + ${m}), ${y})`}});return{rtlEnabled:c,mergedClsPrefix:r,appeared:a,showBadge:d,handleAfterEnter:l,handleAfterLeave:s,cssVars:o?void 0:u,themeClass:f==null?void 0:f.themeClass,onRender:f==null?void 0:f.onRender,offsetStyle:p}},render(){var e;const{mergedClsPrefix:t,onRender:r,themeClass:o,$slots:n}=this;r==null||r();const i=(e=n.default)===null||e===void 0?void 0:e.call(n);return v("div",{class:[`${t}-badge`,this.rtlEnabled&&`${t}-badge--rtl`,o,{[`${t}-badge--dot`]:this.dot,[`${t}-badge--as-is`]:!i}],style:this.cssVars},i,v(Bt,{name:"fade-in-scale-up-transition",onAfterEnter:this.handleAfterEnter,onAfterLeave:this.handleAfterLeave},{default:()=>this.showBadge?v("sup",{class:`${t}-badge-sup`,title:Wy(this.value),style:this.offsetStyle},Lr(n.value,()=>[this.dot?null:v(K4,{clsPrefix:t,appeared:this.appeared,max:this.max,value:this.value})]),this.processing?v(qm,{clsPrefix:t}):null):null}))}}),Bk={fontWeightActive:"400"};const Lk=e=>{const{fontSize:t,textColor3:r,textColor2:o,borderRadius:n,buttonColor2Hover:i,buttonColor2Pressed:a}=e;return Object.assign(Object.assign({},Bk),{fontSize:t,itemLineHeight:"1.25",itemTextColor:r,itemTextColorHover:o,itemTextColorPressed:o,itemTextColorActive:o,itemBorderRadius:n,itemColorHover:i,itemColorPressed:a,separatorColor:r})},Hk={name:"Breadcrumb",common:le,self:Lk};var Dk=Hk;function bo(e){return xe(e,[255,255,255,.16])}function da(e){return xe(e,[0,0,0,.12])}const Fk="n-button-group";var jk={paddingTiny:"0 6px",paddingSmall:"0 10px",paddingMedium:"0 14px",paddingLarge:"0 18px",paddingRoundTiny:"0 10px",paddingRoundSmall:"0 14px",paddingRoundMedium:"0 18px",paddingRoundLarge:"0 22px",iconMarginTiny:"6px",iconMarginSmall:"6px",iconMarginMedium:"6px",iconMarginLarge:"6px",iconSizeTiny:"14px",iconSizeSmall:"18px",iconSizeMedium:"18px",iconSizeLarge:"20px",rippleDuration:".6s"};const fg=e=>{const{heightTiny:t,heightSmall:r,heightMedium:o,heightLarge:n,borderRadius:i,fontSizeTiny:a,fontSizeSmall:l,fontSizeMedium:s,fontSizeLarge:d,opacityDisabled:c,textColor2:u,textColor3:f,primaryColorHover:p,primaryColorPressed:h,borderColor:g,primaryColor:b,baseColor:m,infoColor:y,infoColorHover:w,infoColorPressed:x,successColor:k,successColorHover:T,successColorPressed:S,warningColor:$,warningColorHover:R,warningColorPressed:_,errorColor:N,errorColorHover:E,errorColorPressed:F,fontWeight:j,buttonColor2:Q,buttonColor2Hover:A,buttonColor2Pressed:X,fontWeightStrong:ne}=e;return Object.assign(Object.assign({},jk),{heightTiny:t,heightSmall:r,heightMedium:o,heightLarge:n,borderRadiusTiny:i,borderRadiusSmall:i,borderRadiusMedium:i,borderRadiusLarge:i,fontSizeTiny:a,fontSizeSmall:l,fontSizeMedium:s,fontSizeLarge:d,opacityDisabled:c,colorOpacitySecondary:"0.16",colorOpacitySecondaryHover:"0.22",colorOpacitySecondaryPressed:"0.28",colorSecondary:Q,colorSecondaryHover:A,colorSecondaryPressed:X,colorTertiary:Q,colorTertiaryHover:A,colorTertiaryPressed:X,colorQuaternary:"#0000",colorQuaternaryHover:A,colorQuaternaryPressed:X,color:"#0000",colorHover:"#0000",colorPressed:"#0000",colorFocus:"#0000",colorDisabled:"#0000",textColor:u,textColorTertiary:f,textColorHover:p,textColorPressed:h,textColorFocus:p,textColorDisabled:u,textColorText:u,textColorTextHover:p,textColorTextPressed:h,textColorTextFocus:p,textColorTextDisabled:u,textColorGhost:u,textColorGhostHover:p,textColorGhostPressed:h,textColorGhostFocus:p,textColorGhostDisabled:u,border:`1px solid ${g}`,borderHover:`1px solid ${p}`,borderPressed:`1px solid ${h}`,borderFocus:`1px solid ${p}`,borderDisabled:`1px solid ${g}`,rippleColor:b,colorPrimary:b,colorHoverPrimary:p,colorPressedPrimary:h,colorFocusPrimary:p,colorDisabledPrimary:b,textColorPrimary:m,textColorHoverPrimary:m,textColorPressedPrimary:m,textColorFocusPrimary:m,textColorDisabledPrimary:m,textColorTextPrimary:b,textColorTextHoverPrimary:p,textColorTextPressedPrimary:h,textColorTextFocusPrimary:p,textColorTextDisabledPrimary:u,textColorGhostPrimary:b,textColorGhostHoverPrimary:p,textColorGhostPressedPrimary:h,textColorGhostFocusPrimary:p,textColorGhostDisabledPrimary:b,borderPrimary:`1px solid ${b}`,borderHoverPrimary:`1px solid ${p}`,borderPressedPrimary:`1px solid ${h}`,borderFocusPrimary:`1px solid ${p}`,borderDisabledPrimary:`1px solid ${b}`,rippleColorPrimary:b,colorInfo:y,colorHoverInfo:w,colorPressedInfo:x,colorFocusInfo:w,colorDisabledInfo:y,textColorInfo:m,textColorHoverInfo:m,textColorPressedInfo:m,textColorFocusInfo:m,textColorDisabledInfo:m,textColorTextInfo:y,textColorTextHoverInfo:w,textColorTextPressedInfo:x,textColorTextFocusInfo:w,textColorTextDisabledInfo:u,textColorGhostInfo:y,textColorGhostHoverInfo:w,textColorGhostPressedInfo:x,textColorGhostFocusInfo:w,textColorGhostDisabledInfo:y,borderInfo:`1px solid ${y}`,borderHoverInfo:`1px solid ${w}`,borderPressedInfo:`1px solid ${x}`,borderFocusInfo:`1px solid ${w}`,borderDisabledInfo:`1px solid ${y}`,rippleColorInfo:y,colorSuccess:k,colorHoverSuccess:T,colorPressedSuccess:S,colorFocusSuccess:T,colorDisabledSuccess:k,textColorSuccess:m,textColorHoverSuccess:m,textColorPressedSuccess:m,textColorFocusSuccess:m,textColorDisabledSuccess:m,textColorTextSuccess:k,textColorTextHoverSuccess:T,textColorTextPressedSuccess:S,textColorTextFocusSuccess:T,textColorTextDisabledSuccess:u,textColorGhostSuccess:k,textColorGhostHoverSuccess:T,textColorGhostPressedSuccess:S,textColorGhostFocusSuccess:T,textColorGhostDisabledSuccess:k,borderSuccess:`1px solid ${k}`,borderHoverSuccess:`1px solid ${T}`,borderPressedSuccess:`1px solid ${S}`,borderFocusSuccess:`1px solid ${T}`,borderDisabledSuccess:`1px solid ${k}`,rippleColorSuccess:k,colorWarning:$,colorHoverWarning:R,colorPressedWarning:_,colorFocusWarning:R,colorDisabledWarning:$,textColorWarning:m,textColorHoverWarning:m,textColorPressedWarning:m,textColorFocusWarning:m,textColorDisabledWarning:m,textColorTextWarning:$,textColorTextHoverWarning:R,textColorTextPressedWarning:_,textColorTextFocusWarning:R,textColorTextDisabledWarning:u,textColorGhostWarning:$,textColorGhostHoverWarning:R,textColorGhostPressedWarning:_,textColorGhostFocusWarning:R,textColorGhostDisabledWarning:$,borderWarning:`1px solid ${$}`,borderHoverWarning:`1px solid ${R}`,borderPressedWarning:`1px solid ${_}`,borderFocusWarning:`1px solid ${R}`,borderDisabledWarning:`1px solid ${$}`,rippleColorWarning:$,colorError:N,colorHoverError:E,colorPressedError:F,colorFocusError:E,colorDisabledError:N,textColorError:m,textColorHoverError:m,textColorPressedError:m,textColorFocusError:m,textColorDisabledError:m,textColorTextError:N,textColorTextHoverError:E,textColorTextPressedError:F,textColorTextFocusError:E,textColorTextDisabledError:u,textColorGhostError:N,textColorGhostHoverError:E,textColorGhostPressedError:F,textColorGhostFocusError:E,textColorGhostDisabledError:N,borderError:`1px solid ${N}`,borderHoverError:`1px solid ${E}`,borderPressedError:`1px solid ${F}`,borderFocusError:`1px solid ${E}`,borderDisabledError:`1px solid ${N}`,rippleColorError:N,waveOpacity:"0.6",fontWeight:j,fontWeightStrong:ne})},Nk={name:"Button",common:je,self:fg};var xl=Nk;const Wk={name:"Button",common:le,self(e){const t=fg(e);return t.waveOpacity="0.8",t.colorOpacitySecondary="0.16",t.colorOpacitySecondaryHover="0.2",t.colorOpacitySecondaryPressed="0.12",t}};var Kt=Wk,Vk=O([M("button",` + margin: 0; + font-weight: var(--n-font-weight); + line-height: 1; + font-family: inherit; + padding: var(--n-padding); + height: var(--n-height); + font-size: var(--n-font-size); + border-radius: var(--n-border-radius); + color: var(--n-text-color); + background-color: var(--n-color); + width: var(--n-width); + white-space: nowrap; + outline: none; + position: relative; + z-index: auto; + border: none; + display: inline-flex; + flex-wrap: nowrap; + flex-shrink: 0; + align-items: center; + justify-content: center; + user-select: none; + -webkit-user-select: none; + text-align: center; + cursor: pointer; + text-decoration: none; + transition: + color .3s var(--n-bezier), + background-color .3s var(--n-bezier), + opacity .3s var(--n-bezier), + border-color .3s var(--n-bezier); + `,[K("color",[D("border",{borderColor:"var(--n-border-color)"}),K("disabled",[D("border",{borderColor:"var(--n-border-color-disabled)"})]),ut("disabled",[O("&:focus",[D("state-border",{borderColor:"var(--n-border-color-focus)"})]),O("&:hover",[D("state-border",{borderColor:"var(--n-border-color-hover)"})]),O("&:active",[D("state-border",{borderColor:"var(--n-border-color-pressed)"})]),K("pressed",[D("state-border",{borderColor:"var(--n-border-color-pressed)"})])])]),K("disabled",{backgroundColor:"var(--n-color-disabled)",color:"var(--n-text-color-disabled)"},[D("border",{border:"var(--n-border-disabled)"})]),ut("disabled",[O("&:focus",{backgroundColor:"var(--n-color-focus)",color:"var(--n-text-color-focus)"},[D("state-border",{border:"var(--n-border-focus)"})]),O("&:hover",{backgroundColor:"var(--n-color-hover)",color:"var(--n-text-color-hover)"},[D("state-border",{border:"var(--n-border-hover)"})]),O("&:active",{backgroundColor:"var(--n-color-pressed)",color:"var(--n-text-color-pressed)"},[D("state-border",{border:"var(--n-border-pressed)"})]),K("pressed",{backgroundColor:"var(--n-color-pressed)",color:"var(--n-text-color-pressed)"},[D("state-border",{border:"var(--n-border-pressed)"})])]),K("loading","cursor: wait;"),M("base-wave",` + pointer-events: none; + top: 0; + right: 0; + bottom: 0; + left: 0; + animation-iteration-count: 1; + animation-duration: var(--n-ripple-duration); + animation-timing-function: var(--n-bezier-ease-out), var(--n-bezier-ease-out); + `,[K("active",{zIndex:1,animationName:"button-wave-spread, button-wave-opacity"})]),Fo&&"MozBoxSizing"in document.createElement("div").style?O("&::moz-focus-inner",{border:0}):null,D("border, state-border",` + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + border-radius: inherit; + transition: border-color .3s var(--n-bezier); + pointer-events: none; + `),D("border",{border:"var(--n-border)"}),D("state-border",{border:"var(--n-border)",borderColor:"#0000",zIndex:1}),D("icon",` + margin: var(--n-icon-margin); + margin-left: 0; + height: var(--n-icon-size); + width: var(--n-icon-size); + max-width: var(--n-icon-size); + font-size: var(--n-icon-size); + position: relative; + flex-shrink: 0; + `,[M("icon-slot",` + height: var(--n-icon-size); + width: var(--n-icon-size); + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + display: flex; + align-items: center; + justify-content: center; + `,[Oi({top:"50%",originalTransform:"translateY(-50%)"})]),rg()]),D("content",` + display: flex; + align-items: center; + flex-wrap: nowrap; + min-width: 0; + `,[O("~",[D("icon",{margin:"var(--n-icon-margin)",marginRight:0})])]),K("block",` + display: flex; + width: 100%; + `),K("dashed",[D("border, state-border",{borderStyle:"dashed !important"})]),K("disabled",{cursor:"not-allowed",opacity:"var(--n-opacity-disabled)"})]),O("@keyframes button-wave-spread",{from:{boxShadow:"0 0 0.5px 0 var(--n-ripple-color)"},to:{boxShadow:"0 0 0.5px 4.5px var(--n-ripple-color)"}}),O("@keyframes button-wave-opacity",{from:{opacity:"var(--n-wave-opacity)"},to:{opacity:0}})]);const Uk=Object.assign(Object.assign({},Ee.props),{color:String,textColor:String,text:Boolean,block:Boolean,loading:Boolean,disabled:Boolean,circle:Boolean,size:String,ghost:Boolean,round:Boolean,secondary:Boolean,tertiary:Boolean,quaternary:Boolean,strong:Boolean,focusable:{type:Boolean,default:!0},keyboard:{type:Boolean,default:!0},tag:{type:String,default:"button"},type:{type:String,default:"default"},dashed:Boolean,renderIcon:Function,iconPlacement:{type:String,default:"left"},attrType:{type:String,default:"button"},bordered:{type:Boolean,default:!0},onClick:[Function,Array],nativeFocusBehavior:{type:Boolean,default:!ng}}),hg=ae({name:"Button",props:Uk,setup(e){const t=V(null),r=V(null),o=V(!1),n=mt(()=>!e.quaternary&&!e.tertiary&&!e.secondary&&!e.text&&(!e.color||e.ghost||e.dashed)&&e.bordered),i=me(Fk,{}),{mergedSizeRef:a}=jv({},{defaultSize:"medium",mergedSize:x=>{const{size:k}=e;if(k)return k;const{size:T}=i;if(T)return T;const{mergedSize:S}=x||{};return S?S.value:"medium"}}),l=H(()=>e.focusable&&!e.disabled),s=x=>{var k;l.value||x.preventDefault(),!e.nativeFocusBehavior&&(x.preventDefault(),!e.disabled&&l.value&&((k=t.value)===null||k===void 0||k.focus({preventScroll:!0})))},d=x=>{var k;if(!e.disabled&&!e.loading){const{onClick:T}=e;T&&Ae(T,x),e.text||(k=r.value)===null||k===void 0||k.play()}},c=x=>{switch(x.key){case"Enter":if(!e.keyboard)return;o.value=!1}},u=x=>{switch(x.key){case"Enter":if(!e.keyboard||e.loading){x.preventDefault();return}o.value=!0}},f=()=>{o.value=!1},{inlineThemeDisabled:p,mergedClsPrefixRef:h,mergedRtlRef:g}=st(e),b=Ee("Button","-button",Vk,xl,e,h),m=Kr("Button",g,h),y=H(()=>{const x=b.value,{common:{cubicBezierEaseInOut:k,cubicBezierEaseOut:T},self:S}=x,{rippleDuration:$,opacityDisabled:R,fontWeight:_,fontWeightStrong:N}=S,E=a.value,{dashed:F,type:j,ghost:Q,text:A,color:X,round:ne,circle:pe,textColor:Ce,secondary:$e,tertiary:_e,quaternary:Ge,strong:Le}=e,U={"font-weight":Le?N:_};let ee={"--n-color":"initial","--n-color-hover":"initial","--n-color-pressed":"initial","--n-color-focus":"initial","--n-color-disabled":"initial","--n-ripple-color":"initial","--n-text-color":"initial","--n-text-color-hover":"initial","--n-text-color-pressed":"initial","--n-text-color-focus":"initial","--n-text-color-disabled":"initial"};const G=j==="tertiary",se=j==="default",ce=G?"default":j;if(A){const J=Ce||X,Z=J||S[ie("textColorText",ce)];ee={"--n-color":"#0000","--n-color-hover":"#0000","--n-color-pressed":"#0000","--n-color-focus":"#0000","--n-color-disabled":"#0000","--n-ripple-color":"#0000","--n-text-color":Z,"--n-text-color-hover":J?bo(J):S[ie("textColorTextHover",ce)],"--n-text-color-pressed":J?da(J):S[ie("textColorTextPressed",ce)],"--n-text-color-focus":J?bo(J):S[ie("textColorTextHover",ce)],"--n-text-color-disabled":J||S[ie("textColorTextDisabled",ce)]}}else if(Q||F){const J=Ce||X;ee={"--n-color":"#0000","--n-color-hover":"#0000","--n-color-pressed":"#0000","--n-color-focus":"#0000","--n-color-disabled":"#0000","--n-ripple-color":X||S[ie("rippleColor",ce)],"--n-text-color":J||S[ie("textColorGhost",ce)],"--n-text-color-hover":J?bo(J):S[ie("textColorGhostHover",ce)],"--n-text-color-pressed":J?da(J):S[ie("textColorGhostPressed",ce)],"--n-text-color-focus":J?bo(J):S[ie("textColorGhostHover",ce)],"--n-text-color-disabled":J||S[ie("textColorGhostDisabled",ce)]}}else if($e){const J=se?S.textColor:G?S.textColorTertiary:S[ie("color",ce)],Z=X||J,fe=j!=="default"&&j!=="tertiary";ee={"--n-color":fe?oe(Z,{alpha:Number(S.colorOpacitySecondary)}):S.colorSecondary,"--n-color-hover":fe?oe(Z,{alpha:Number(S.colorOpacitySecondaryHover)}):S.colorSecondaryHover,"--n-color-pressed":fe?oe(Z,{alpha:Number(S.colorOpacitySecondaryPressed)}):S.colorSecondaryPressed,"--n-color-focus":fe?oe(Z,{alpha:Number(S.colorOpacitySecondaryHover)}):S.colorSecondaryHover,"--n-color-disabled":S.colorSecondary,"--n-ripple-color":"#0000","--n-text-color":Z,"--n-text-color-hover":Z,"--n-text-color-pressed":Z,"--n-text-color-focus":Z,"--n-text-color-disabled":Z}}else if(_e||Ge){const J=se?S.textColor:G?S.textColorTertiary:S[ie("color",ce)],Z=X||J;_e?(ee["--n-color"]=S.colorTertiary,ee["--n-color-hover"]=S.colorTertiaryHover,ee["--n-color-pressed"]=S.colorTertiaryPressed,ee["--n-color-focus"]=S.colorSecondaryHover,ee["--n-color-disabled"]=S.colorTertiary):(ee["--n-color"]=S.colorQuaternary,ee["--n-color-hover"]=S.colorQuaternaryHover,ee["--n-color-pressed"]=S.colorQuaternaryPressed,ee["--n-color-focus"]=S.colorQuaternaryHover,ee["--n-color-disabled"]=S.colorQuaternary),ee["--n-ripple-color"]="#0000",ee["--n-text-color"]=Z,ee["--n-text-color-hover"]=Z,ee["--n-text-color-pressed"]=Z,ee["--n-text-color-focus"]=Z,ee["--n-text-color-disabled"]=Z}else ee={"--n-color":X||S[ie("color",ce)],"--n-color-hover":X?bo(X):S[ie("colorHover",ce)],"--n-color-pressed":X?da(X):S[ie("colorPressed",ce)],"--n-color-focus":X?bo(X):S[ie("colorFocus",ce)],"--n-color-disabled":X||S[ie("colorDisabled",ce)],"--n-ripple-color":X||S[ie("rippleColor",ce)],"--n-text-color":Ce||(X?S.textColorPrimary:G?S.textColorTertiary:S[ie("textColor",ce)]),"--n-text-color-hover":Ce||(X?S.textColorHoverPrimary:S[ie("textColorHover",ce)]),"--n-text-color-pressed":Ce||(X?S.textColorPressedPrimary:S[ie("textColorPressed",ce)]),"--n-text-color-focus":Ce||(X?S.textColorFocusPrimary:S[ie("textColorFocus",ce)]),"--n-text-color-disabled":Ce||(X?S.textColorDisabledPrimary:S[ie("textColorDisabled",ce)])};let Re={"--n-border":"initial","--n-border-hover":"initial","--n-border-pressed":"initial","--n-border-focus":"initial","--n-border-disabled":"initial"};A?Re={"--n-border":"none","--n-border-hover":"none","--n-border-pressed":"none","--n-border-focus":"none","--n-border-disabled":"none"}:Re={"--n-border":S[ie("border",ce)],"--n-border-hover":S[ie("borderHover",ce)],"--n-border-pressed":S[ie("borderPressed",ce)],"--n-border-focus":S[ie("borderFocus",ce)],"--n-border-disabled":S[ie("borderDisabled",ce)]};const{[ie("height",E)]:ge,[ie("fontSize",E)]:C,[ie("padding",E)]:P,[ie("paddingRound",E)]:I,[ie("iconSize",E)]:W,[ie("borderRadius",E)]:z,[ie("iconMargin",E)]:L,waveOpacity:Y}=S,q={"--n-width":pe&&!A?ge:"initial","--n-height":A?"initial":ge,"--n-font-size":C,"--n-padding":pe||A?"initial":ne?I:P,"--n-icon-size":W,"--n-icon-margin":L,"--n-border-radius":A?"initial":pe||ne?ge:z};return Object.assign(Object.assign(Object.assign(Object.assign({"--n-bezier":k,"--n-bezier-ease-out":T,"--n-ripple-duration":$,"--n-opacity-disabled":R,"--n-wave-opacity":Y},U),ee),Re),q)}),w=p?Pt("button",H(()=>{let x="";const{dashed:k,type:T,ghost:S,text:$,color:R,round:_,circle:N,textColor:E,secondary:F,tertiary:j,quaternary:Q,strong:A}=e;k&&(x+="a"),S&&(x+="b"),$&&(x+="c"),_&&(x+="d"),N&&(x+="e"),F&&(x+="f"),j&&(x+="g"),Q&&(x+="h"),A&&(x+="i"),R&&(x+="j"+zn(R)),E&&(x+="k"+zn(E));const{value:X}=a;return x+="l"+X[0],x+="m"+T[0],x}),y,e):void 0;return{selfElRef:t,waveElRef:r,mergedClsPrefix:h,mergedFocusable:l,mergedSize:a,showBorder:n,enterPressed:o,rtlEnabled:m,handleMousedown:s,handleKeydown:u,handleBlur:f,handleKeyup:c,handleClick:d,customColorCssVars:H(()=>{const{color:x}=e;if(!x)return null;const k=bo(x);return{"--n-border-color":x,"--n-border-color-hover":k,"--n-border-color-pressed":da(x),"--n-border-color-focus":k,"--n-border-color-disabled":x}}),cssVars:p?void 0:y,themeClass:w==null?void 0:w.themeClass,onRender:w==null?void 0:w.onRender}},render(){const{mergedClsPrefix:e,tag:t,onRender:r}=this;r==null||r();const o=dt(this.$slots.default,n=>n&&v("span",{class:`${e}-button__content`},n));return v(t,{ref:"selfElRef",class:[this.themeClass,`${e}-button`,`${e}-button--${this.type}-type`,`${e}-button--${this.mergedSize}-type`,this.rtlEnabled&&`${e}-button--rtl`,this.disabled&&`${e}-button--disabled`,this.block&&`${e}-button--block`,this.enterPressed&&`${e}-button--pressed`,!this.text&&this.dashed&&`${e}-button--dashed`,this.color&&`${e}-button--color`,this.secondary&&`${e}-button--secondary`,this.loading&&`${e}-button--loading`,this.ghost&&`${e}-button--ghost`],tabindex:this.mergedFocusable?0:-1,type:this.attrType,style:this.cssVars,disabled:this.disabled,onClick:this.handleClick,onBlur:this.handleBlur,onMousedown:this.handleMousedown,onKeyup:this.handleKeyup,onKeydown:this.handleKeydown},this.iconPlacement==="right"&&o,v(ml,{width:!0},{default:()=>dt(this.$slots.icon,n=>(this.loading||this.renderIcon||n)&&v("span",{class:`${e}-button__icon`,style:{margin:Ia(this.$slots.default)?"0":""}},v(vl,null,{default:()=>this.loading?v(gl,{clsPrefix:e,key:"loading",class:`${e}-icon-slot`,strokeWidth:20}):v("div",{key:"icon",class:`${e}-icon-slot`,role:"none"},this.renderIcon?this.renderIcon():n)})))}),this.iconPlacement==="left"&&o,this.text?null:v(qm,{ref:"waveElRef",clsPrefix:e}),this.showBorder?v("div",{"aria-hidden":!0,class:`${e}-button__border`,style:this.customColorCssVars}):null,this.showBorder?v("div",{"aria-hidden":!0,class:`${e}-button__state-border`,style:this.customColorCssVars}):null)}});var Da=hg;const NM=hg;var Kk={titleFontSize:"22px"};const qk=e=>{const{borderRadius:t,fontSize:r,lineHeight:o,textColor2:n,textColor1:i,textColorDisabled:a,dividerColor:l,fontWeightStrong:s,primaryColor:d,baseColor:c,hoverColor:u,cardColor:f,modalColor:p,popoverColor:h}=e;return Object.assign(Object.assign({},Kk),{borderRadius:t,borderColor:xe(f,l),borderColorModal:xe(p,l),borderColorPopover:xe(h,l),textColor:n,titleFontWeight:s,titleTextColor:i,dayTextColor:a,fontSize:r,lineHeight:o,dateColorCurrent:d,dateTextColorCurrent:c,cellColorHover:xe(f,u),cellColorHoverModal:xe(p,u),cellColorHoverPopover:xe(h,u),cellColor:f,cellColorModal:p,cellColorPopover:h,barColor:d})},Gk={name:"Calendar",common:le,peers:{Button:Kt},self:qk};var Yk=Gk;const Xk=e=>{const{fontSize:t,boxShadow2:r,popoverColor:o,textColor2:n,borderRadius:i,borderColor:a,heightSmall:l,heightMedium:s,heightLarge:d,fontSizeSmall:c,fontSizeMedium:u,fontSizeLarge:f,dividerColor:p}=e;return{panelFontSize:t,boxShadow:r,color:o,textColor:n,borderRadius:i,border:`1px solid ${a}`,heightSmall:l,heightMedium:s,heightLarge:d,fontSizeSmall:c,fontSizeMedium:u,fontSizeLarge:f,dividerColor:p}},Zk={name:"ColorPicker",common:le,peers:{Input:ur,Button:Kt},self:Xk};var Jk=Zk,Qk={paddingSmall:"12px 16px 12px",paddingMedium:"19px 24px 20px",paddingLarge:"23px 32px 24px",paddingHuge:"27px 40px 28px",titleFontSizeSmall:"16px",titleFontSizeMedium:"18px",titleFontSizeLarge:"18px",titleFontSizeHuge:"18px",closeIconSize:"18px",closeSize:"22px"};const pg=e=>{const{primaryColor:t,borderRadius:r,lineHeight:o,fontSize:n,cardColor:i,textColor2:a,textColor1:l,dividerColor:s,fontWeightStrong:d,closeIconColor:c,closeIconColorHover:u,closeIconColorPressed:f,closeColorHover:p,closeColorPressed:h,modalColor:g,boxShadow1:b,popoverColor:m,actionColor:y}=e;return Object.assign(Object.assign({},Qk),{lineHeight:o,color:i,colorModal:g,colorPopover:m,colorTarget:t,colorEmbedded:y,colorEmbeddedModal:y,colorEmbeddedPopover:y,textColor:a,titleTextColor:l,borderColor:s,actionColor:y,titleFontWeight:d,closeColorHover:p,closeColorPressed:h,closeBorderRadius:r,closeIconColor:c,closeIconColorHover:u,closeIconColorPressed:f,fontSizeSmall:n,fontSizeMedium:n,fontSizeLarge:n,fontSizeHuge:n,boxShadow:b,borderRadius:r})},e8={name:"Card",common:je,self:pg};var vg=e8;const t8={name:"Card",common:le,self(e){const t=pg(e),{cardColor:r,modalColor:o,popoverColor:n}=e;return t.colorEmbedded=r,t.colorEmbeddedModal=o,t.colorEmbeddedPopover=n,t}};var mg=t8,r8=O([M("card",` + font-size: var(--n-font-size); + line-height: var(--n-line-height); + display: flex; + flex-direction: column; + width: 100%; + box-sizing: border-box; + position: relative; + border-radius: var(--n-border-radius); + background-color: var(--n-color); + color: var(--n-text-color); + word-break: break-word; + transition: + color .3s var(--n-bezier), + background-color .3s var(--n-bezier), + box-shadow .3s var(--n-bezier), + border-color .3s var(--n-bezier); + `,[vv({background:"var(--n-color-modal)"}),K("hoverable",[O("&:hover","box-shadow: var(--n-box-shadow);")]),K("content-segmented",[O(">",[D("content",{paddingTop:"var(--n-padding-bottom)"})])]),K("content-soft-segmented",[O(">",[D("content",` + margin: 0 var(--n-padding-left); + padding: var(--n-padding-bottom) 0; + `)])]),K("footer-segmented",[O(">",[D("footer",{paddingTop:"var(--n-padding-bottom)"})])]),K("footer-soft-segmented",[O(">",[D("footer",` + padding: var(--n-padding-bottom) 0; + margin: 0 var(--n-padding-left); + `)])]),O(">",[M("card-header",` + box-sizing: border-box; + display: flex; + align-items: center; + font-size: var(--n-title-font-size); + padding: + var(--n-padding-top) + var(--n-padding-left) + var(--n-padding-bottom) + var(--n-padding-left); + `,[D("main",` + font-weight: var(--n-title-font-weight); + transition: color .3s var(--n-bezier); + flex: 1; + min-width: 0; + color: var(--n-title-text-color); + `),D("extra",` + display: flex; + align-items: center; + font-size: var(--n-font-size); + font-weight: 400; + transition: color .3s var(--n-bezier); + color: var(--n-text-color); + `),D("close",` + margin: 0 0 0 8px; + transition: + background-color .3s var(--n-bezier), + color .3s var(--n-bezier); + `)]),D("action",` + box-sizing: border-box; + transition: + background-color .3s var(--n-bezier), + border-color .3s var(--n-bezier); + background-clip: padding-box; + background-color: var(--n-action-color); + `),D("content","flex: 1; min-width: 0;"),D("content, footer",` + box-sizing: border-box; + padding: 0 var(--n-padding-left) var(--n-padding-bottom) var(--n-padding-left); + font-size: var(--n-font-size); + `,[O("&:first-child",{paddingTop:"var(--n-padding-bottom)"})]),D("action",` + background-color: var(--n-action-color); + padding: var(--n-padding-bottom) var(--n-padding-left); + border-bottom-left-radius: var(--n-border-radius); + border-bottom-right-radius: var(--n-border-radius); + `)]),M("card-cover",` + overflow: hidden; + width: 100%; + border-radius: var(--n-border-radius) var(--n-border-radius) 0 0; + `,[O("img",` + display: block; + width: 100%; + `)]),K("bordered",` + border: 1px solid var(--n-border-color); + `,[O("&:target","border-color: var(--n-color-target);")]),K("action-segmented",[O(">",[D("action",[O("&:not(:first-child)",{borderTop:"1px solid var(--n-border-color)"})])])]),K("content-segmented, content-soft-segmented",[O(">",[D("content",{transition:"border-color 0.3s var(--n-bezier)"},[O("&:not(:first-child)",{borderTop:"1px solid var(--n-border-color)"})])])]),K("footer-segmented, footer-soft-segmented",[O(">",[D("footer",{transition:"border-color 0.3s var(--n-bezier)"},[O("&:not(:first-child)",{borderTop:"1px solid var(--n-border-color)"})])])]),K("embedded",` + background-color: var(--n-color-embedded); + `)]),Hc(M("card",` + background: var(--n-color-modal); + `,[K("embedded",` + background-color: var(--n-color-embedded-modal); + `)])),pv(M("card",` + background: var(--n-color-popover); + `,[K("embedded",` + background-color: var(--n-color-embedded-popover); + `)]))]);const id={title:String,contentStyle:[Object,String],headerStyle:[Object,String],headerExtraStyle:[Object,String],footerStyle:[Object,String],embedded:Boolean,segmented:{type:[Boolean,Object],default:!1},size:{type:String,default:"medium"},bordered:{type:Boolean,default:!0},closable:Boolean,hoverable:Boolean,role:String,onClose:[Function,Array],tag:{type:String,default:"div"}},o8=sr(id),n8=Object.assign(Object.assign({},Ee.props),id);var ad=ae({name:"Card",props:n8,setup(e){const t=()=>{const{onClose:d}=e;d&&Ae(d)},{inlineThemeDisabled:r,mergedClsPrefixRef:o,mergedRtlRef:n}=st(e),i=Ee("Card","-card",r8,vg,e,o),a=Kr("Card",n,o),l=H(()=>{const{size:d}=e,{self:{color:c,colorModal:u,colorTarget:f,textColor:p,titleTextColor:h,titleFontWeight:g,borderColor:b,actionColor:m,borderRadius:y,lineHeight:w,closeIconColor:x,closeIconColorHover:k,closeIconColorPressed:T,closeColorHover:S,closeColorPressed:$,closeBorderRadius:R,closeIconSize:_,closeSize:N,boxShadow:E,colorPopover:F,colorEmbedded:j,colorEmbeddedModal:Q,colorEmbeddedPopover:A,[ie("padding",d)]:X,[ie("fontSize",d)]:ne,[ie("titleFontSize",d)]:pe},common:{cubicBezierEaseInOut:Ce}}=i.value,{top:$e,left:_e,bottom:Ge}=av(X);return{"--n-bezier":Ce,"--n-border-radius":y,"--n-color":c,"--n-color-modal":u,"--n-color-popover":F,"--n-color-embedded":j,"--n-color-embedded-modal":Q,"--n-color-embedded-popover":A,"--n-color-target":f,"--n-text-color":p,"--n-line-height":w,"--n-action-color":m,"--n-title-text-color":h,"--n-title-font-weight":g,"--n-close-icon-color":x,"--n-close-icon-color-hover":k,"--n-close-icon-color-pressed":T,"--n-close-color-hover":S,"--n-close-color-pressed":$,"--n-border-color":b,"--n-box-shadow":E,"--n-padding-top":$e,"--n-padding-bottom":Ge,"--n-padding-left":_e,"--n-font-size":ne,"--n-title-font-size":pe,"--n-close-size":N,"--n-close-icon-size":_,"--n-close-border-radius":R}}),s=r?Pt("card",H(()=>e.size[0]),l,e):void 0;return{rtlEnabled:a,mergedClsPrefix:o,mergedTheme:i,handleCloseClick:t,cssVars:r?void 0:l,themeClass:s==null?void 0:s.themeClass,onRender:s==null?void 0:s.onRender}},render(){const{segmented:e,bordered:t,hoverable:r,mergedClsPrefix:o,rtlEnabled:n,onRender:i,embedded:a,tag:l,$slots:s}=this;return i==null||i(),v(l,{class:[`${o}-card`,this.themeClass,a&&`${o}-card--embedded`,{[`${o}-card--rtl`]:n,[`${o}-card--content${typeof e!="boolean"&&e.content==="soft"?"-soft":""}-segmented`]:e===!0||e!==!1&&e.content,[`${o}-card--footer${typeof e!="boolean"&&e.footer==="soft"?"-soft":""}-segmented`]:e===!0||e!==!1&&e.footer,[`${o}-card--action-segmented`]:e===!0||e!==!1&&e.action,[`${o}-card--bordered`]:t,[`${o}-card--hoverable`]:r}],style:this.cssVars,role:this.role},dt(s.cover,d=>d&&v("div",{class:`${o}-card-cover`,role:"none"},d)),dt(s.header,d=>d||this.title||this.closable?v("div",{class:`${o}-card-header`,style:this.headerStyle},v("div",{class:`${o}-card-header__main`,role:"heading"},d||this.title),dt(s["header-extra"],c=>c&&v("div",{class:`${o}-card-header__extra`,style:this.headerExtraStyle},c)),this.closable?v(ji,{clsPrefix:o,class:`${o}-card-header__close`,onClick:this.handleCloseClick,absolute:!0}):null):null),dt(s.default,d=>d&&v("div",{class:`${o}-card__content`,style:this.contentStyle,role:"none"},d)),dt(s.footer,d=>d&&[v("div",{class:`${o}-card__footer`,style:this.footerStyle,role:"none"},d)]),dt(s.action,d=>d&&v("div",{class:`${o}-card__action`,role:"none"},d)))}});const i8=e=>({dotSize:"8px",dotColor:"rgba(255, 255, 255, .3)",dotColorActive:"rgba(255, 255, 255, 1)",dotColorFocus:"rgba(255, 255, 255, .5)",dotLineWidth:"16px",dotLineWidthActive:"24px",arrowColor:"#eee"}),a8={name:"Carousel",common:le,self:i8};var l8=a8,s8={sizeSmall:"14px",sizeMedium:"16px",sizeLarge:"18px",labelPadding:"0 8px",labelFontWeight:"400"};const c8=e=>{const{baseColor:t,inputColorDisabled:r,cardColor:o,modalColor:n,popoverColor:i,textColorDisabled:a,borderColor:l,primaryColor:s,textColor2:d,fontSizeSmall:c,fontSizeMedium:u,fontSizeLarge:f,borderRadiusSmall:p,lineHeight:h}=e;return Object.assign(Object.assign({},s8),{labelLineHeight:h,fontSizeSmall:c,fontSizeMedium:u,fontSizeLarge:f,borderRadius:p,color:t,colorChecked:s,colorDisabled:r,colorDisabledChecked:r,colorTableHeader:o,colorTableHeaderModal:n,colorTableHeaderPopover:i,checkMarkColor:t,checkMarkColorDisabled:a,checkMarkColorDisabledChecked:a,border:`1px solid ${l}`,borderDisabled:`1px solid ${l}`,borderDisabledChecked:`1px solid ${l}`,borderChecked:`1px solid ${s}`,borderFocus:`1px solid ${s}`,boxShadowFocus:`0 0 0 2px ${oe(s,{alpha:.3})}`,textColor:d,textColorDisabled:a})},d8={name:"Checkbox",common:le,self(e){const{cardColor:t}=e,r=c8(e);return r.color="#0000",r.checkMarkColor=t,r}};var Nn=d8;const u8=e=>{const{borderRadius:t,boxShadow2:r,popoverColor:o,textColor2:n,textColor3:i,primaryColor:a,textColorDisabled:l,dividerColor:s,hoverColor:d,fontSizeMedium:c,heightMedium:u}=e;return{menuBorderRadius:t,menuColor:o,menuBoxShadow:r,menuDividerColor:s,menuHeight:"calc(var(--n-option-height) * 6.6)",optionArrowColor:i,optionHeight:u,optionFontSize:c,optionColorHover:d,optionTextColor:n,optionTextColorActive:a,optionTextColorDisabled:l,optionCheckMarkColor:a,loadingColor:a,columnWidth:"180px"}},f8={name:"Cascader",common:le,peers:{InternalSelectMenu:Ni,InternalSelection:nd,Scrollbar:Ut,Checkbox:Nn,Empty:Fm},self:u8};var h8=f8;const p8={name:"Code",common:le,self(e){const{textColor2:t,fontSize:r,fontWeightStrong:o,textColor3:n}=e;return{textColor:t,fontSize:r,fontWeightStrong:o,"mono-3":"#5c6370","hue-1":"#56b6c2","hue-2":"#61aeee","hue-3":"#c678dd","hue-4":"#98c379","hue-5":"#e06c75","hue-5-2":"#be5046","hue-6":"#d19a66","hue-6-2":"#e6c07b",lineNumberTextColor:n}}};var gg=p8;const v8=e=>{const{fontWeight:t,textColor1:r,textColor2:o,textColorDisabled:n,dividerColor:i,fontSize:a}=e;return{titleFontSize:a,titleFontWeight:t,dividerColor:i,titleTextColor:r,titleTextColorDisabled:n,fontSize:a,textColor:o,arrowColor:o,arrowColorDisabled:n,itemMargin:"16px 0 0 0"}},m8={name:"Collapse",common:le,self:v8};var g8=m8;const b8=e=>{const{cubicBezierEaseInOut:t}=e;return{bezier:t}},x8={name:"CollapseTransition",common:le,self:b8};var C8=x8;const y8={abstract:Boolean,bordered:{type:Boolean,default:void 0},clsPrefix:String,locale:Object,dateLocale:Object,namespace:String,rtl:Array,tag:{type:String,default:"div"},hljs:Object,katex:Object,theme:Object,themeOverrides:Object,componentOptions:Object,icons:Object,breakpoints:Object,preflightStyleDisabled:Boolean,inlineThemeDisabled:{type:Boolean,default:void 0},as:{type:String,validator:()=>(io("config-provider","`as` is deprecated, please use `tag` instead."),!0),default:void 0}};var w8=ae({name:"ConfigProvider",alias:["App"],props:y8,setup(e){const t=me(Fr,null),r=H(()=>{const{theme:h}=e;if(h===null)return;const g=t==null?void 0:t.mergedThemeRef.value;return h===void 0?g:g===void 0?h:Object.assign({},g,h)}),o=H(()=>{const{themeOverrides:h}=e;if(h!==null){if(h===void 0)return t==null?void 0:t.mergedThemeOverridesRef.value;{const g=t==null?void 0:t.mergedThemeOverridesRef.value;return g===void 0?h:un({},g,h)}}}),n=mt(()=>{const{namespace:h}=e;return h===void 0?t==null?void 0:t.mergedNamespaceRef.value:h}),i=mt(()=>{const{bordered:h}=e;return h===void 0?t==null?void 0:t.mergedBorderedRef.value:h}),a=H(()=>{const{icons:h}=e;return h===void 0?t==null?void 0:t.mergedIconsRef.value:h}),l=H(()=>{const{componentOptions:h}=e;return h!==void 0?h:t==null?void 0:t.mergedComponentPropsRef.value}),s=H(()=>{const{clsPrefix:h}=e;return h!==void 0?h:t==null?void 0:t.mergedClsPrefixRef.value}),d=H(()=>{var h;const{rtl:g}=e;if(g===void 0)return t==null?void 0:t.mergedRtlRef.value;const b={};for(const m of g)b[m.name]=Pa(m),(h=m.peers)===null||h===void 0||h.forEach(y=>{y.name in b||(b[y.name]=Pa(y))});return b}),c=H(()=>e.breakpoints||(t==null?void 0:t.mergedBreakpointsRef.value)),u=e.inlineThemeDisabled||(t==null?void 0:t.inlineThemeDisabled),f=e.preflightStyleDisabled||(t==null?void 0:t.preflightStyleDisabled),p=H(()=>{const{value:h}=r,{value:g}=o,b=g&&Object.keys(g).length!==0,m=h==null?void 0:h.name;return m?b?`${m}-${Pi(JSON.stringify(o.value))}`:m:b?Pi(JSON.stringify(o.value)):""});return Be(Fr,{mergedThemeHashRef:p,mergedBreakpointsRef:c,mergedRtlRef:d,mergedIconsRef:a,mergedComponentPropsRef:l,mergedBorderedRef:i,mergedNamespaceRef:n,mergedClsPrefixRef:s,mergedLocaleRef:H(()=>{const{locale:h}=e;if(h!==null)return h===void 0?t==null?void 0:t.mergedLocaleRef.value:h}),mergedDateLocaleRef:H(()=>{const{dateLocale:h}=e;if(h!==null)return h===void 0?t==null?void 0:t.mergedDateLocaleRef.value:h}),mergedHljsRef:H(()=>{const{hljs:h}=e;return h===void 0?t==null?void 0:t.mergedHljsRef.value:h}),mergedKatexRef:H(()=>{const{katex:h}=e;return h===void 0?t==null?void 0:t.mergedKatexRef.value:h}),mergedThemeRef:r,mergedThemeOverridesRef:o,inlineThemeDisabled:u||!1,preflightStyleDisabled:f||!1}),{mergedClsPrefix:s,mergedBordered:i,mergedNamespace:n,mergedTheme:r,mergedThemeOverrides:o}},render(){var e,t,r,o;return this.abstract?(o=(r=this.$slots).default)===null||o===void 0?void 0:o.call(r):v(this.as||this.tag,{class:`${this.mergedClsPrefix||zm}-config-provider`},(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e))}});const S8={name:"Popselect",common:le,peers:{Popover:Uo,InternalSelectMenu:Ni}};var bg=S8;function $8(e){const{boxShadow2:t}=e;return{menuBoxShadow:t}}const _8={name:"Popselect",common:je,peers:{Popover:jn,InternalSelectMenu:Km},self:$8};var P8=_8;function xg(e){const{boxShadow2:t}=e;return{menuBoxShadow:t}}const k8={name:"Select",common:je,peers:{InternalSelection:N4,InternalSelectMenu:Km},self:xg};var T8=k8;const z8={name:"Select",common:le,peers:{InternalSelection:nd,InternalSelectMenu:Ni},self:xg};var Cg=z8,E8={itemPaddingSmall:"0 4px",itemMarginSmall:"0 0 0 8px",itemMarginSmallRtl:"0 8px 0 0",itemPaddingMedium:"0 4px",itemMarginMedium:"0 0 0 8px",itemMarginMediumRtl:"0 8px 0 0",itemPaddingLarge:"0 4px",itemMarginLarge:"0 0 0 8px",itemMarginLargeRtl:"0 8px 0 0",buttonIconSizeSmall:"14px",buttonIconSizeMedium:"16px",buttonIconSizeLarge:"18px",inputWidthSmall:"60px",selectWidthSmall:"unset",inputMarginSmall:"0 0 0 8px",inputMarginSmallRtl:"0 8px 0 0",selectMarginSmall:"0 0 0 8px",prefixMarginSmall:"0 8px 0 0",suffixMarginSmall:"0 0 0 8px",inputWidthMedium:"60px",selectWidthMedium:"unset",inputMarginMedium:"0 0 0 8px",inputMarginMediumRtl:"0 8px 0 0",selectMarginMedium:"0 0 0 8px",prefixMarginMedium:"0 8px 0 0",suffixMarginMedium:"0 0 0 8px",inputWidthLarge:"60px",selectWidthLarge:"unset",inputMarginLarge:"0 0 0 8px",inputMarginLargeRtl:"0 8px 0 0",selectMarginLarge:"0 0 0 8px",prefixMarginLarge:"0 8px 0 0",suffixMarginLarge:"0 0 0 8px"};const yg=e=>{const{textColor2:t,primaryColor:r,primaryColorHover:o,primaryColorPressed:n,inputColorDisabled:i,textColorDisabled:a,borderColor:l,borderRadius:s,fontSizeTiny:d,fontSizeSmall:c,fontSizeMedium:u,heightTiny:f,heightSmall:p,heightMedium:h}=e;return Object.assign(Object.assign({},E8),{buttonColor:"#0000",buttonColorHover:"#0000",buttonColorPressed:"#0000",buttonBorder:`1px solid ${l}`,buttonBorderHover:`1px solid ${l}`,buttonBorderPressed:`1px solid ${l}`,buttonIconColor:t,buttonIconColorHover:t,buttonIconColorPressed:t,itemTextColor:t,itemTextColorHover:o,itemTextColorPressed:n,itemTextColorActive:r,itemTextColorDisabled:a,itemColor:"#0000",itemColorHover:"#0000",itemColorPressed:"#0000",itemColorActive:"#0000",itemColorActiveHover:"#0000",itemColorDisabled:i,itemBorder:"1px solid #0000",itemBorderHover:"1px solid #0000",itemBorderPressed:"1px solid #0000",itemBorderActive:`1px solid ${r}`,itemBorderDisabled:`1px solid ${l}`,itemBorderRadius:s,itemSizeSmall:f,itemSizeMedium:p,itemSizeLarge:h,itemFontSizeSmall:d,itemFontSizeMedium:c,itemFontSizeLarge:u,jumperFontSizeSmall:d,jumperFontSizeMedium:c,jumperFontSizeLarge:u,jumperTextColor:t,jumperTextColorDisabled:a})},R8={name:"Pagination",common:je,peers:{Select:T8,Input:ag,Popselect:P8},self:yg};var WM=R8;const I8={name:"Pagination",common:le,peers:{Select:Cg,Input:ur,Popselect:bg},self(e){const{primaryColor:t,opacity3:r}=e,o=oe(t,{alpha:Number(r)}),n=yg(e);return n.itemBorderActive=`1px solid ${o}`,n.itemBorderDisabled="1px solid #0000",n}};var wg=I8,Sg={padding:"8px 14px"};const O8={name:"Tooltip",common:le,peers:{Popover:Uo},self(e){const{borderRadius:t,boxShadow2:r,popoverColor:o,textColor2:n}=e;return Object.assign(Object.assign({},Sg),{borderRadius:t,boxShadow:r,color:o,textColor:n})}};var Cl=O8;const A8=e=>{const{borderRadius:t,boxShadow2:r,baseColor:o}=e;return Object.assign(Object.assign({},Sg),{borderRadius:t,boxShadow:r,color:xe(o,"rgba(0, 0, 0, .85)"),textColor:o})},M8={name:"Tooltip",common:je,peers:{Popover:jn},self:A8};var ld=M8;const B8={name:"Ellipsis",common:le,peers:{Tooltip:Cl}};var $g=B8,L8={radioSizeSmall:"14px",radioSizeMedium:"16px",radioSizeLarge:"18px",labelPadding:"0 8px",labelFontWeight:"400"};const H8={name:"Radio",common:le,self(e){const{borderColor:t,primaryColor:r,baseColor:o,textColorDisabled:n,inputColorDisabled:i,textColor2:a,opacityDisabled:l,borderRadius:s,fontSizeSmall:d,fontSizeMedium:c,fontSizeLarge:u,heightSmall:f,heightMedium:p,heightLarge:h,lineHeight:g}=e;return Object.assign(Object.assign({},L8),{labelLineHeight:g,buttonHeightSmall:f,buttonHeightMedium:p,buttonHeightLarge:h,fontSizeSmall:d,fontSizeMedium:c,fontSizeLarge:u,boxShadow:`inset 0 0 0 1px ${t}`,boxShadowActive:`inset 0 0 0 1px ${r}`,boxShadowFocus:`inset 0 0 0 1px ${r}, 0 0 0 2px ${oe(r,{alpha:.3})}`,boxShadowHover:`inset 0 0 0 1px ${r}`,boxShadowDisabled:`inset 0 0 0 1px ${t}`,color:"#0000",colorDisabled:i,colorActive:"#0000",textColor:a,textColorDisabled:n,dotColorActive:r,dotColorDisabled:t,buttonBorderColor:t,buttonBorderColorActive:r,buttonBorderColorHover:r,buttonColor:"#0000",buttonColorActive:r,buttonTextColor:a,buttonTextColorActive:o,buttonTextColorHover:r,opacityDisabled:l,buttonBoxShadowFocus:`inset 0 0 0 1px ${r}, 0 0 0 2px ${oe(r,{alpha:.3})}`,buttonBoxShadowHover:`inset 0 0 0 1px ${r}`,buttonBoxShadow:"inset 0 0 0 1px #0000",buttonBorderRadius:s})}};var _g=H8,D8={padding:"4px 0",optionIconSizeSmall:"14px",optionIconSizeMedium:"16px",optionIconSizeLarge:"16px",optionIconSizeHuge:"18px",optionSuffixWidthSmall:"14px",optionSuffixWidthMedium:"14px",optionSuffixWidthLarge:"16px",optionSuffixWidthHuge:"16px",optionIconSuffixWidthSmall:"32px",optionIconSuffixWidthMedium:"32px",optionIconSuffixWidthLarge:"36px",optionIconSuffixWidthHuge:"36px",optionPrefixWidthSmall:"14px",optionPrefixWidthMedium:"14px",optionPrefixWidthLarge:"16px",optionPrefixWidthHuge:"16px",optionIconPrefixWidthSmall:"36px",optionIconPrefixWidthMedium:"36px",optionIconPrefixWidthLarge:"40px",optionIconPrefixWidthHuge:"40px"};const Pg=e=>{const{primaryColor:t,textColor2:r,dividerColor:o,hoverColor:n,popoverColor:i,invertedColor:a,borderRadius:l,fontSizeSmall:s,fontSizeMedium:d,fontSizeLarge:c,fontSizeHuge:u,heightSmall:f,heightMedium:p,heightLarge:h,heightHuge:g,textColor3:b,opacityDisabled:m}=e;return Object.assign(Object.assign({},D8),{optionHeightSmall:f,optionHeightMedium:p,optionHeightLarge:h,optionHeightHuge:g,borderRadius:l,fontSizeSmall:s,fontSizeMedium:d,fontSizeLarge:c,fontSizeHuge:u,optionTextColor:r,optionTextColorHover:r,optionTextColorActive:t,optionTextColorChildActive:t,color:i,dividerColor:o,suffixColor:r,prefixColor:r,optionColorHover:n,optionColorActive:oe(t,{alpha:.1}),groupHeaderTextColor:b,optionTextColorInverted:"#BBB",optionTextColorHoverInverted:"#FFF",optionTextColorActiveInverted:"#FFF",optionTextColorChildActiveInverted:"#FFF",colorInverted:a,dividerColorInverted:"#BBB",suffixColorInverted:"#BBB",prefixColorInverted:"#BBB",optionColorHoverInverted:t,optionColorActiveInverted:t,groupHeaderTextColorInverted:"#AAA",optionOpacityDisabled:m})},F8={name:"Dropdown",common:je,peers:{Popover:jn},self:Pg};var kg=F8;const j8={name:"Dropdown",common:le,peers:{Popover:Uo},self(e){const{primaryColorSuppl:t,primaryColor:r,popoverColor:o}=e,n=Pg(e);return n.colorInverted=o,n.optionColorActive=oe(r,{alpha:.15}),n.optionColorActiveInverted=t,n.optionColorHoverInverted=t,n}};var sd=j8,N8={thPaddingSmall:"8px",thPaddingMedium:"12px",thPaddingLarge:"12px",tdPaddingSmall:"8px",tdPaddingMedium:"12px",tdPaddingLarge:"12px",sorterSize:"15px",resizableContainerSize:"8px",resizableSize:"2px",filterSize:"15px",paginationMargin:"12px 0 0 0",emptyPadding:"48px 0",actionPadding:"8px 12px",actionButtonMargin:"0 8px 0 0"};const W8=e=>{const{cardColor:t,modalColor:r,popoverColor:o,textColor2:n,textColor1:i,tableHeaderColor:a,tableColorHover:l,iconColor:s,primaryColor:d,fontWeightStrong:c,borderRadius:u,lineHeight:f,fontSizeSmall:p,fontSizeMedium:h,fontSizeLarge:g,dividerColor:b,heightSmall:m,opacityDisabled:y,tableColorStriped:w}=e;return Object.assign(Object.assign({},N8),{actionDividerColor:b,lineHeight:f,borderRadius:u,fontSizeSmall:p,fontSizeMedium:h,fontSizeLarge:g,borderColor:xe(t,b),tdColorHover:xe(t,l),tdColorStriped:xe(t,w),thColor:xe(t,a),thColorHover:xe(xe(t,a),l),tdColor:t,tdTextColor:n,thTextColor:i,thFontWeight:c,thButtonColorHover:l,thIconColor:s,thIconColorActive:d,borderColorModal:xe(r,b),tdColorHoverModal:xe(r,l),tdColorStripedModal:xe(r,w),thColorModal:xe(r,a),thColorHoverModal:xe(xe(r,a),l),tdColorModal:r,borderColorPopover:xe(o,b),tdColorHoverPopover:xe(o,l),tdColorStripedPopover:xe(o,w),thColorPopover:xe(o,a),thColorHoverPopover:xe(xe(o,a),l),tdColorPopover:o,boxShadowBefore:"inset -12px 0 8px -12px rgba(0, 0, 0, .18)",boxShadowAfter:"inset 12px 0 8px -12px rgba(0, 0, 0, .18)",loadingColor:d,loadingSize:m,opacityLoading:y})},V8={name:"DataTable",common:le,peers:{Button:Kt,Checkbox:Nn,Radio:_g,Pagination:wg,Scrollbar:Ut,Empty:Vo,Popover:Uo,Ellipsis:$g,Dropdown:sd},self(e){const t=W8(e);return t.boxShadowAfter="inset 12px 0 8px -12px rgba(0, 0, 0, .36)",t.boxShadowBefore="inset -12px 0 8px -12px rgba(0, 0, 0, .36)",t}};var U8=V8;const K8=Object.assign(Object.assign({},bl),Ee.props);var Tg=ae({name:"Tooltip",props:K8,__popover__:!0,setup(e){const t=Ee("Tooltip","-tooltip",void 0,ld,e),r=V(null);return Object.assign(Object.assign({},{syncPosition(){r.value.syncPosition()},setShow(n){r.value.setShow(n)}}),{popoverRef:r,mergedTheme:t,popoverThemeOverrides:H(()=>t.value.self)})},render(){const{mergedTheme:e,internalExtraClass:t}=this;return v(Zm,Object.assign(Object.assign({},this.$props),{theme:e.peers.Popover,themeOverrides:e.peerOverrides.Popover,builtinThemeOverrides:this.popoverThemeOverrides,internalExtraClass:t.concat("tooltip"),ref:"popoverRef"}),this.$slots)}}),zg=ae({name:"DropdownDivider",props:{clsPrefix:{type:String,required:!0}},render(){return v("div",{class:`${this.clsPrefix}-dropdown-divider`})}});const Eg=e=>{const{textColorBase:t,opacity1:r,opacity2:o,opacity3:n,opacity4:i,opacity5:a}=e;return{color:t,opacity1Depth:r,opacity2Depth:o,opacity3Depth:n,opacity4Depth:i,opacity5Depth:a}},q8={name:"Icon",common:je,self:Eg};var G8=q8;const Y8={name:"Icon",common:le,self:Eg};var X8=Y8,Z8=M("icon",` + height: 1em; + width: 1em; + line-height: 1em; + text-align: center; + display: inline-block; + position: relative; + fill: currentColor; + transform: translateZ(0); +`,[K("color-transition",{transition:"color .3s var(--n-bezier)"}),K("depth",{color:"var(--n-color)"},[O("svg",{opacity:"var(--n-opacity)",transition:"opacity .3s var(--n-bezier)"})]),O("svg",{height:"1em",width:"1em"})]);const J8=Object.assign(Object.assign({},Ee.props),{depth:[String,Number],size:[Number,String],color:String,component:Object}),fn=ae({_n_icon__:!0,name:"Icon",inheritAttrs:!1,props:J8,setup(e){const{mergedClsPrefixRef:t,inlineThemeDisabled:r}=st(e),o=Ee("Icon","-icon",Z8,G8,e,t),n=H(()=>{const{depth:a}=e,{common:{cubicBezierEaseInOut:l},self:s}=o.value;if(a!==void 0){const{color:d,[`opacity${a}Depth`]:c}=s;return{"--n-bezier":l,"--n-color":d,"--n-opacity":c}}return{"--n-bezier":l,"--n-color":"","--n-opacity":""}}),i=r?Pt("icon",H(()=>`${e.depth||"d"}`),n,e):void 0;return{mergedClsPrefix:t,mergedStyle:H(()=>{const{size:a,color:l}=e;return{fontSize:ar(a),color:l}}),cssVars:r?void 0:n,themeClass:i==null?void 0:i.themeClass,onRender:i==null?void 0:i.onRender}},render(){var e;const{$parent:t,depth:r,mergedClsPrefix:o,component:n,onRender:i,themeClass:a}=this;return!((e=t==null?void 0:t.$options)===null||e===void 0)&&e._n_icon__&&io("icon","don't wrap `n-icon` inside `n-icon`"),i==null||i(),v("i",so(this.$attrs,{role:"img",class:[`${o}-icon`,a,{[`${o}-icon--depth`]:r,[`${o}-icon--color-transition`]:r!==void 0}],style:[this.cssVars,this.mergedStyle]}),n?v(n):this.$slots)}}),cd="n-dropdown-menu",yl="n-dropdown",eh="n-dropdown-option";function Qs(e,t){return e.type==="submenu"||e.type===void 0&&e[t]!==void 0}function Q8(e){return e.type==="group"}function Rg(e){return e.type==="divider"}function eT(e){return e.type==="render"}var Ig=ae({name:"DropdownOption",props:{clsPrefix:{type:String,required:!0},tmNode:{type:Object,required:!0},parentKey:{type:[String,Number],default:null},placement:{type:String,default:"right-start"},props:Object,scrollable:Boolean},setup(e){const t=me(yl),{hoverKeyRef:r,keyboardKeyRef:o,lastToggledSubmenuKeyRef:n,pendingKeyPathRef:i,activeKeyPathRef:a,animatedRef:l,mergedShowRef:s,renderLabelRef:d,renderIconRef:c,labelFieldRef:u,childrenFieldRef:f,renderOptionRef:p,nodePropsRef:h,menuPropsRef:g}=t,b=me(eh,null),m=me(cd),y=me(Di),w=H(()=>e.tmNode.rawNode),x=H(()=>{const{value:X}=f;return Qs(e.tmNode.rawNode,X)}),k=H(()=>{const{disabled:X}=e.tmNode;return X}),T=H(()=>{if(!x.value)return!1;const{key:X,disabled:ne}=e.tmNode;if(ne)return!1;const{value:pe}=r,{value:Ce}=o,{value:$e}=n,{value:_e}=i;return pe!==null?_e.includes(X):Ce!==null?_e.includes(X)&&_e[_e.length-1]!==X:$e!==null?_e.includes(X):!1}),S=H(()=>o.value===null&&!l.value),$=gw(T,300,S),R=H(()=>!!(b!=null&&b.enteringSubmenuRef.value)),_=V(!1);Be(eh,{enteringSubmenuRef:_});function N(){_.value=!0}function E(){_.value=!1}function F(){const{parentKey:X,tmNode:ne}=e;ne.disabled||!s.value||(n.value=X,o.value=null,r.value=ne.key)}function j(){const{tmNode:X}=e;X.disabled||!s.value||r.value!==X.key&&F()}function Q(X){if(e.tmNode.disabled||!s.value)return;const{relatedTarget:ne}=X;ne&&!Iu({target:ne},"dropdownOption")&&!Iu({target:ne},"scrollbarRail")&&(r.value=null)}function A(){const{value:X}=x,{tmNode:ne}=e;!s.value||!X&&!ne.disabled&&(t.doSelect(ne.key,ne.rawNode),t.doUpdateShow(!1))}return{labelField:u,renderLabel:d,renderIcon:c,siblingHasIcon:m.showIconRef,siblingHasSubmenu:m.hasSubmenuRef,menuProps:g,popoverBody:y,animated:l,mergedShowSubmenu:H(()=>$.value&&!R.value),rawNode:w,hasSubmenu:x,pending:mt(()=>{const{value:X}=i,{key:ne}=e.tmNode;return X.includes(ne)}),childActive:mt(()=>{const{value:X}=a,{key:ne}=e.tmNode,pe=X.findIndex(Ce=>ne===Ce);return pe===-1?!1:pe{const{value:X}=a,{key:ne}=e.tmNode,pe=X.findIndex(Ce=>ne===Ce);return pe===-1?!1:pe===X.length-1}),mergedDisabled:k,renderOption:p,nodeProps:h,handleClick:A,handleMouseMove:j,handleMouseEnter:F,handleMouseLeave:Q,handleSubmenuBeforeEnter:N,handleSubmenuAfterEnter:E}},render(){var e,t;const{animated:r,rawNode:o,mergedShowSubmenu:n,clsPrefix:i,siblingHasIcon:a,siblingHasSubmenu:l,renderLabel:s,renderIcon:d,renderOption:c,nodeProps:u,props:f,scrollable:p}=this;let h=null;if(n){const y=(e=this.menuProps)===null||e===void 0?void 0:e.call(this,o,o.children);h=v(Og,Object.assign({},y,{clsPrefix:i,scrollable:this.scrollable,tmNodes:this.tmNode.children,parentKey:this.tmNode.key}))}const g={class:[`${i}-dropdown-option-body`,this.pending&&`${i}-dropdown-option-body--pending`,this.active&&`${i}-dropdown-option-body--active`,this.childActive&&`${i}-dropdown-option-body--child-active`,this.mergedDisabled&&`${i}-dropdown-option-body--disabled`],onMousemove:this.handleMouseMove,onMouseenter:this.handleMouseEnter,onMouseleave:this.handleMouseLeave,onClick:this.handleClick},b=u==null?void 0:u(o),m=v("div",Object.assign({class:[`${i}-dropdown-option`,b==null?void 0:b.class],"data-dropdown-option":!0},b),v("div",so(g,f),[v("div",{class:[`${i}-dropdown-option-body__prefix`,a&&`${i}-dropdown-option-body__prefix--show-icon`]},[d?d(o):St(o.icon)]),v("div",{"data-dropdown-option":!0,class:`${i}-dropdown-option-body__label`},s?s(o):St((t=o[this.labelField])!==null&&t!==void 0?t:o.title)),v("div",{"data-dropdown-option":!0,class:[`${i}-dropdown-option-body__suffix`,l&&`${i}-dropdown-option-body__suffix--has-submenu`]},this.hasSubmenu?v(fn,null,{default:()=>v(g6,null)}):null)]),this.hasSubmenu?v(_v,null,{default:()=>[v(Pv,null,{default:()=>v("div",{class:`${i}-dropdown-offset-container`},v(zv,{show:this.mergedShowSubmenu,placement:this.placement,to:p&&this.popoverBody||void 0,teleportDisabled:!p},{default:()=>v("div",{class:`${i}-dropdown-menu-wrapper`},r?v(Bt,{onBeforeEnter:this.handleSubmenuBeforeEnter,onAfterEnter:this.handleSubmenuAfterEnter,name:"fade-in-scale-up-transition",appear:!0},{default:()=>h}):h)}))})]}):null);return c?c({node:m,option:o}):m}}),tT=ae({name:"DropdownGroupHeader",props:{clsPrefix:{type:String,required:!0},tmNode:{type:Object,required:!0}},setup(){const{showIconRef:e,hasSubmenuRef:t}=me(cd),{renderLabelRef:r,labelFieldRef:o,nodePropsRef:n,renderOptionRef:i}=me(yl);return{labelField:o,showIcon:e,hasSubmenu:t,renderLabel:r,nodeProps:n,renderOption:i}},render(){var e;const{clsPrefix:t,hasSubmenu:r,showIcon:o,nodeProps:n,renderLabel:i,renderOption:a}=this,{rawNode:l}=this.tmNode,s=v("div",Object.assign({class:`${t}-dropdown-option`},n==null?void 0:n(l)),v("div",{class:`${t}-dropdown-option-body ${t}-dropdown-option-body--group`},v("div",{"data-dropdown-option":!0,class:[`${t}-dropdown-option-body__prefix`,o&&`${t}-dropdown-option-body__prefix--show-icon`]},St(l.icon)),v("div",{class:`${t}-dropdown-option-body__label`,"data-dropdown-option":!0},i?i(l):St((e=l.title)!==null&&e!==void 0?e:l[this.labelField])),v("div",{class:[`${t}-dropdown-option-body__suffix`,r&&`${t}-dropdown-option-body__suffix--has-submenu`],"data-dropdown-option":!0})));return a?a({node:s,option:l}):s}}),rT=ae({name:"NDropdownGroup",props:{clsPrefix:{type:String,required:!0},tmNode:{type:Object,required:!0},parentKey:{type:[String,Number],default:null}},render(){const{tmNode:e,parentKey:t,clsPrefix:r}=this,{children:o}=e;return v(Je,null,v(tT,{clsPrefix:r,tmNode:e,key:e.key}),o==null?void 0:o.map(n=>{const{rawNode:i}=n;return i.show===!1?null:Rg(i)?v(zg,{clsPrefix:r,key:n.key}):n.isGroup?(io("dropdown","`group` node is not allowed to be put in `group` node."),null):v(Ig,{clsPrefix:r,tmNode:n,parentKey:t,key:n.key})}))}}),oT=ae({name:"DropdownRenderOption",props:{tmNode:{type:Object,required:!0}},render(){const{rawNode:{render:e,props:t}}=this.tmNode;return v("div",t,[e==null?void 0:e()])}}),Og=ae({name:"DropdownMenu",props:{scrollable:Boolean,showArrow:Boolean,arrowStyle:[String,Object],clsPrefix:{type:String,required:!0},tmNodes:{type:Array,default:()=>[]},parentKey:{type:[String,Number],default:null}},setup(e){const{renderIconRef:t,childrenFieldRef:r}=me(yl);Be(cd,{showIconRef:H(()=>{const n=t.value;return e.tmNodes.some(i=>{var a;if(i.isGroup)return(a=i.children)===null||a===void 0?void 0:a.some(({rawNode:s})=>n?n(s):s.icon);const{rawNode:l}=i;return n?n(l):l.icon})}),hasSubmenuRef:H(()=>{const{value:n}=r;return e.tmNodes.some(i=>{var a;if(i.isGroup)return(a=i.children)===null||a===void 0?void 0:a.some(({rawNode:s})=>Qs(s,n));const{rawNode:l}=i;return Qs(l,n)})})});const o=V(null);return Be(ll,null),Be(sl,null),Be(Di,o),{bodyRef:o}},render(){const{parentKey:e,clsPrefix:t,scrollable:r}=this,o=this.tmNodes.map(n=>{const{rawNode:i}=n;return i.show===!1?null:eT(i)?v(oT,{tmNode:n,key:n.key}):Rg(i)?v(zg,{clsPrefix:t,key:n.key}):Q8(i)?v(rT,{clsPrefix:t,tmNode:n,parentKey:e,key:n.key}):v(Ig,{clsPrefix:t,tmNode:n,parentKey:e,key:n.key,props:i.props,scrollable:r})});return v("div",{class:[`${t}-dropdown-menu`,r&&`${t}-dropdown-menu--scrollable`],ref:"bodyRef"},r?v(Vm,{contentClass:`${t}-dropdown-menu__content`},{default:()=>o}):o,this.showArrow?Xm({clsPrefix:t,arrowStyle:this.arrowStyle}):null)}}),nT=M("dropdown-menu",` + transform-origin: var(--v-transform-origin); + background-color: var(--n-color); + border-radius: var(--n-border-radius); + box-shadow: var(--n-box-shadow); + position: relative; + transition: + background-color .3s var(--n-bezier), + box-shadow .3s var(--n-bezier); +`,[Mi(),M("dropdown-option",` + position: relative; + `,[O("a",` + text-decoration: none; + color: inherit; + outline: none; + `,[O("&::before",` + content: ""; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + `)]),M("dropdown-option-body",` + display: flex; + cursor: pointer; + position: relative; + height: var(--n-option-height); + line-height: var(--n-option-height); + font-size: var(--n-font-size); + color: var(--n-option-text-color); + transition: color .3s var(--n-bezier); + `,[O("&::before",` + content: ""; + position: absolute; + top: 0; + bottom: 0; + left: 4px; + right: 4px; + transition: background-color .3s var(--n-bezier); + border-radius: var(--n-border-radius); + `),ut("disabled",[K("pending",` + color: var(--n-option-text-color-hover); + `,[D("prefix, suffix",` + color: var(--n-option-text-color-hover); + `),O("&::before","background-color: var(--n-option-color-hover);")]),K("active",` + color: var(--n-option-text-color-active); + `,[D("prefix, suffix",` + color: var(--n-option-text-color-active); + `),O("&::before","background-color: var(--n-option-color-active);")]),K("child-active",` + color: var(--n-option-text-color-child-active); + `,[D("prefix, suffix",` + color: var(--n-option-text-color-child-active); + `)])]),K("disabled",` + cursor: not-allowed; + opacity: var(--n-option-opacity-disabled); + `),K("group",` + font-size: calc(var(--n-font-size) - 1px); + color: var(--n-group-header-text-color); + `,[D("prefix",` + width: calc(var(--n-option-prefix-width) / 2); + `,[K("show-icon",` + width: calc(var(--n-option-icon-prefix-width) / 2); + `)])]),D("prefix",` + width: var(--n-option-prefix-width); + display: flex; + justify-content: center; + align-items: center; + color: var(--n-prefix-color); + transition: color .3s var(--n-bezier); + z-index: 1; + `,[K("show-icon",` + width: var(--n-option-icon-prefix-width); + `),M("icon",` + font-size: var(--n-option-icon-size); + `)]),D("label",` + white-space: nowrap; + flex: 1; + z-index: 1; + `),D("suffix",` + box-sizing: border-box; + flex-grow: 0; + flex-shrink: 0; + display: flex; + justify-content: flex-end; + align-items: center; + min-width: var(--n-option-suffix-width); + padding: 0 8px; + transition: color .3s var(--n-bezier); + color: var(--n-suffix-color); + z-index: 1; + `,[K("has-submenu",` + width: var(--n-option-icon-suffix-width); + `),M("icon",` + font-size: var(--n-option-icon-size); + `)]),M("dropdown-menu","pointer-events: all;")]),M("dropdown-offset-container",` + pointer-events: none; + position: absolute; + left: 0; + right: 0; + top: -4px; + bottom: -4px; + `)]),M("dropdown-divider",` + transition: background-color .3s var(--n-bezier); + background-color: var(--n-divider-color); + height: 1px; + margin: 4px 0; + `),M("dropdown-menu-wrapper",` + transform-origin: var(--v-transform-origin); + width: fit-content; + `),O(">",[M("scrollbar",` + height: inherit; + max-height: inherit; + `)]),ut("scrollable",` + padding: var(--n-padding); + `),K("scrollable",[D("content",` + padding: var(--n-padding); + `)])]);const iT={animated:{type:Boolean,default:!0},keyboard:{type:Boolean,default:!0},size:{type:String,default:"medium"},inverted:Boolean,placement:{type:String,default:"bottom"},onSelect:[Function,Array],options:{type:Array,default:()=>[]},menuProps:Function,showArrow:Boolean,renderLabel:Function,renderIcon:Function,renderOption:Function,nodeProps:Function,labelField:{type:String,default:"label"},keyField:{type:String,default:"key"},childrenField:{type:String,default:"children"},value:[String,Number]},aT=Object.keys(bl),lT=Object.assign(Object.assign(Object.assign({},bl),iT),Ee.props);var sT=ae({name:"Dropdown",inheritAttrs:!1,props:lT,setup(e){const t=V(!1),r=En(Te(e,"show"),t),o=H(()=>{const{keyField:E,childrenField:F}=e;return Bm(e.options,{getKey(j){return j[E]},getDisabled(j){return j.disabled===!0},getIgnored(j){return j.type==="divider"||j.type==="render"},getChildren(j){return j[F]}})}),n=H(()=>o.value.treeNodes),i=V(null),a=V(null),l=V(null),s=H(()=>{var E,F,j;return(j=(F=(E=i.value)!==null&&E!==void 0?E:a.value)!==null&&F!==void 0?F:l.value)!==null&&j!==void 0?j:null}),d=H(()=>o.value.getPath(s.value).keyPath),c=H(()=>o.value.getPath(e.value).keyPath),u=mt(()=>e.keyboard&&r.value);Tw({keydown:{ArrowUp:{prevent:!0,handler:k},ArrowRight:{prevent:!0,handler:x},ArrowDown:{prevent:!0,handler:T},ArrowLeft:{prevent:!0,handler:w},Enter:{prevent:!0,handler:S},Escape:y}},u);const{mergedClsPrefixRef:f,inlineThemeDisabled:p}=st(e),h=Ee("Dropdown","-dropdown",nT,kg,e,f);Be(yl,{labelFieldRef:Te(e,"labelField"),childrenFieldRef:Te(e,"childrenField"),renderLabelRef:Te(e,"renderLabel"),renderIconRef:Te(e,"renderIcon"),hoverKeyRef:i,keyboardKeyRef:a,lastToggledSubmenuKeyRef:l,pendingKeyPathRef:d,activeKeyPathRef:c,animatedRef:Te(e,"animated"),mergedShowRef:r,nodePropsRef:Te(e,"nodeProps"),renderOptionRef:Te(e,"renderOption"),menuPropsRef:Te(e,"menuProps"),doSelect:g,doUpdateShow:b}),De(r,E=>{!e.animated&&!E&&m()});function g(E,F){const{onSelect:j}=e;j&&Ae(j,E,F)}function b(E){const{"onUpdate:show":F,onUpdateShow:j}=e;F&&Ae(F,E),j&&Ae(j,E),t.value=E}function m(){i.value=null,a.value=null,l.value=null}function y(){b(!1)}function w(){R("left")}function x(){R("right")}function k(){R("up")}function T(){R("down")}function S(){const E=$();(E==null?void 0:E.isLeaf)&&r.value&&(g(E.key,E.rawNode),b(!1))}function $(){var E;const{value:F}=o,{value:j}=s;return!F||j===null?null:(E=F.getNode(j))!==null&&E!==void 0?E:null}function R(E){const{value:F}=s,{value:{getFirstAvailableNode:j}}=o;let Q=null;if(F===null){const A=j();A!==null&&(Q=A.key)}else{const A=$();if(A){let X;switch(E){case"down":X=A.getNext();break;case"up":X=A.getPrev();break;case"right":X=A.getChild();break;case"left":X=A.getParent();break}X&&(Q=X.key)}}Q!==null&&(i.value=null,a.value=Q)}const _=H(()=>{const{size:E,inverted:F}=e,{common:{cubicBezierEaseInOut:j},self:Q}=h.value,{padding:A,dividerColor:X,borderRadius:ne,optionOpacityDisabled:pe,[ie("optionIconSuffixWidth",E)]:Ce,[ie("optionSuffixWidth",E)]:$e,[ie("optionIconPrefixWidth",E)]:_e,[ie("optionPrefixWidth",E)]:Ge,[ie("fontSize",E)]:Le,[ie("optionHeight",E)]:U,[ie("optionIconSize",E)]:ee}=Q,G={"--n-bezier":j,"--n-font-size":Le,"--n-padding":A,"--n-border-radius":ne,"--n-option-height":U,"--n-option-prefix-width":Ge,"--n-option-icon-prefix-width":_e,"--n-option-suffix-width":$e,"--n-option-icon-suffix-width":Ce,"--n-option-icon-size":ee,"--n-divider-color":X,"--n-option-opacity-disabled":pe};return F?(G["--n-color"]=Q.colorInverted,G["--n-option-color-hover"]=Q.optionColorHoverInverted,G["--n-option-color-active"]=Q.optionColorActiveInverted,G["--n-option-text-color"]=Q.optionTextColorInverted,G["--n-option-text-color-hover"]=Q.optionTextColorHoverInverted,G["--n-option-text-color-active"]=Q.optionTextColorActiveInverted,G["--n-option-text-color-child-active"]=Q.optionTextColorChildActiveInverted,G["--n-prefix-color"]=Q.prefixColorInverted,G["--n-suffix-color"]=Q.suffixColorInverted,G["--n-group-header-text-color"]=Q.groupHeaderTextColorInverted):(G["--n-color"]=Q.color,G["--n-option-color-hover"]=Q.optionColorHover,G["--n-option-color-active"]=Q.optionColorActive,G["--n-option-text-color"]=Q.optionTextColor,G["--n-option-text-color-hover"]=Q.optionTextColorHover,G["--n-option-text-color-active"]=Q.optionTextColorActive,G["--n-option-text-color-child-active"]=Q.optionTextColorChildActive,G["--n-prefix-color"]=Q.prefixColor,G["--n-suffix-color"]=Q.suffixColor,G["--n-group-header-text-color"]=Q.groupHeaderTextColor),G}),N=p?Pt("dropdown",H(()=>`${e.size[0]}${e.inverted?"i":""}`),_,e):void 0;return{mergedClsPrefix:f,mergedTheme:h,tmNodes:n,mergedShow:r,handleAfterLeave:()=>{!e.animated||m()},doUpdateShow:b,cssVars:p?void 0:_,themeClass:N==null?void 0:N.themeClass,onRender:N==null?void 0:N.onRender}},render(){const e=(o,n,i,a,l)=>{var s;const{mergedClsPrefix:d,menuProps:c}=this;(s=this.onRender)===null||s===void 0||s.call(this);const u=(c==null?void 0:c(void 0,this.tmNodes.map(p=>p.rawNode)))||{},f={ref:Vy(n),class:[o,`${d}-dropdown`,this.themeClass],clsPrefix:d,tmNodes:this.tmNodes,style:[i,this.cssVars],showArrow:this.showArrow,arrowStyle:this.arrowStyle,scrollable:this.scrollable,onMouseenter:a,onMouseleave:l};return v(Og,so(this.$attrs,f,u))},{mergedTheme:t}=this,r={show:this.mergedShow,theme:t.peers.Popover,themeOverrides:t.peerOverrides.Popover,internalOnAfterLeave:this.handleAfterLeave,internalRenderBody:e,onUpdateShow:this.doUpdateShow,"onUpdate:show":void 0};return v(Zm,Object.assign({},Jt(this.$props,aT),r),{trigger:()=>{var o,n;return(n=(o=this.$slots).default)===null||n===void 0?void 0:n.call(o)}})}}),cT={itemFontSize:"12px",itemHeight:"36px",itemWidth:"52px",panelActionPadding:"8px 0"};const dT=e=>{const{popoverColor:t,textColor2:r,primaryColor:o,hoverColor:n,dividerColor:i,opacityDisabled:a,boxShadow2:l,borderRadius:s,iconColor:d,iconColorDisabled:c}=e;return Object.assign(Object.assign({},cT),{panelColor:t,panelBoxShadow:l,panelDividerColor:i,itemTextColor:r,itemTextColorActive:o,itemColorHover:n,itemOpacityDisabled:a,itemBorderRadius:s,borderRadius:s,iconColor:d,iconColorDisabled:c})},uT={name:"TimePicker",common:le,peers:{Scrollbar:Ut,Button:Kt,Input:ur},self:dT};var Ag=uT,fT={itemSize:"24px",itemCellWidth:"38px",itemCellHeight:"32px",scrollItemWidth:"80px",scrollItemHeight:"40px",panelExtraFooterPadding:"8px 12px",panelActionPadding:"8px 12px",calendarTitlePadding:"0",calendarTitleHeight:"28px",arrowSize:"14px",panelHeaderPadding:"8px 12px",calendarDaysHeight:"32px",calendarTitleGridTempateColumns:"28px 28px 1fr 28px 28px",calendarLeftPaddingDate:"6px 12px 4px 12px",calendarLeftPaddingDatetime:"4px 12px",calendarLeftPaddingDaterange:"6px 12px 4px 12px",calendarLeftPaddingDatetimerange:"4px 12px",calendarLeftPaddingMonth:"0",calendarLeftPaddingYear:"0",calendarLeftPaddingQuarter:"0",calendarLeftPaddingMonthrange:"0",calendarLeftPaddingQuarterrange:"0",calendarLeftPaddingYearrange:"0",calendarRightPaddingDate:"6px 12px 4px 12px",calendarRightPaddingDatetime:"4px 12px",calendarRightPaddingDaterange:"6px 12px 4px 12px",calendarRightPaddingDatetimerange:"4px 12px",calendarRightPaddingMonth:"0",calendarRightPaddingYear:"0",calendarRightPaddingQuarter:"0",calendarRightPaddingMonthrange:"0",calendarRightPaddingQuarterrange:"0",calendarRightPaddingYearrange:"0"};const hT=e=>{const{hoverColor:t,fontSize:r,textColor2:o,textColorDisabled:n,popoverColor:i,primaryColor:a,borderRadiusSmall:l,iconColor:s,iconColorDisabled:d,textColor1:c,dividerColor:u,boxShadow2:f,borderRadius:p,fontWeightStrong:h}=e;return Object.assign(Object.assign({},fT),{itemFontSize:r,calendarDaysFontSize:r,calendarTitleFontSize:r,itemTextColor:o,itemTextColorDisabled:n,itemTextColorActive:i,itemTextColorCurrent:a,itemColorIncluded:oe(a,{alpha:.1}),itemColorHover:t,itemColorDisabled:t,itemColorActive:a,itemBorderRadius:l,panelColor:i,panelTextColor:o,arrowColor:s,calendarTitleTextColor:c,calendarTitleColorHover:t,calendarDaysTextColor:o,panelHeaderDividerColor:u,calendarDaysDividerColor:u,calendarDividerColor:u,panelActionDividerColor:u,panelBoxShadow:f,panelBorderRadius:p,calendarTitleFontWeight:h,scrollItemBorderRadius:p,iconColor:s,iconColorDisabled:d})},pT={name:"DatePicker",common:le,peers:{Input:ur,Button:Kt,TimePicker:Ag,Scrollbar:Ut},self(e){const{popoverColor:t,hoverColor:r,primaryColor:o}=e,n=hT(e);return n.itemColorDisabled=xe(t,r),n.itemColorIncluded=oe(o,{alpha:.15}),n.itemColorHover=xe(t,r),n}};var vT=pT,mT={thPaddingBorderedSmall:"8px 12px",thPaddingBorderedMedium:"12px 16px",thPaddingBorderedLarge:"16px 24px",thPaddingSmall:"0",thPaddingMedium:"0",thPaddingLarge:"0",tdPaddingBorderedSmall:"8px 12px",tdPaddingBorderedMedium:"12px 16px",tdPaddingBorderedLarge:"16px 24px",tdPaddingSmall:"0 0 8px 0",tdPaddingMedium:"0 0 12px 0",tdPaddingLarge:"0 0 16px 0"};const gT=e=>{const{tableHeaderColor:t,textColor2:r,textColor1:o,cardColor:n,modalColor:i,popoverColor:a,dividerColor:l,borderRadius:s,fontWeightStrong:d,lineHeight:c,fontSizeSmall:u,fontSizeMedium:f,fontSizeLarge:p}=e;return Object.assign(Object.assign({},mT),{lineHeight:c,fontSizeSmall:u,fontSizeMedium:f,fontSizeLarge:p,titleTextColor:o,thColor:xe(n,t),thColorModal:xe(i,t),thColorPopover:xe(a,t),thTextColor:o,thFontWeight:d,tdTextColor:r,tdColor:n,tdColorModal:i,tdColorPopover:a,borderColor:xe(n,l),borderColorModal:xe(i,l),borderColorPopover:xe(a,l),borderRadius:s})},bT={name:"Descriptions",common:le,self:gT};var xT=bT,CT={titleFontSize:"18px",padding:"16px 28px 20px 28px",iconSize:"28px",actionSpace:"12px",contentMargin:"8px 0 16px 0",iconMargin:"0 4px 0 0",iconMarginIconTop:"4px 0 8px 0",closeSize:"22px",closeIconSize:"18px",closeMargin:"20px 26px 0 0",closeMarginIconTop:"10px 16px 0 0"};const Mg=e=>{const{textColor1:t,textColor2:r,modalColor:o,closeIconColor:n,closeIconColorHover:i,closeIconColorPressed:a,closeColorHover:l,closeColorPressed:s,infoColor:d,successColor:c,warningColor:u,errorColor:f,primaryColor:p,dividerColor:h,borderRadius:g,fontWeightStrong:b,lineHeight:m,fontSize:y}=e;return Object.assign(Object.assign({},CT),{fontSize:y,lineHeight:m,border:`1px solid ${h}`,titleTextColor:t,textColor:r,color:o,closeColorHover:l,closeColorPressed:s,closeIconColor:n,closeIconColorHover:i,closeIconColorPressed:a,closeBorderRadius:g,iconColor:p,iconColorInfo:d,iconColorSuccess:c,iconColorWarning:u,iconColorError:f,borderRadius:g,titleFontWeight:b})},yT={name:"Dialog",common:je,peers:{Button:xl},self:Mg};var Bg=yT;const wT={name:"Dialog",common:le,peers:{Button:Kt},self:Mg};var Lg=wT;const wl={icon:Function,type:{type:String,default:"default"},title:[String,Function],closable:{type:Boolean,default:!0},negativeText:String,positiveText:String,positiveButtonProps:Object,negativeButtonProps:Object,content:[String,Function],action:Function,showIcon:{type:Boolean,default:!0},loading:Boolean,bordered:Boolean,iconPlacement:String,onPositiveClick:Function,onNegativeClick:Function,onClose:Function},Hg=sr(wl);var ST=O([M("dialog",` + word-break: break-word; + line-height: var(--n-line-height); + position: relative; + background: var(--n-color); + color: var(--n-text-color); + box-sizing: border-box; + margin: auto; + border-radius: var(--n-border-radius); + padding: var(--n-padding); + transition: + border-color .3s var(--n-bezier), + background-color .3s var(--n-bezier), + color .3s var(--n-bezier); + `,[D("icon",{color:"var(--n-icon-color)"}),K("bordered",{border:"var(--n-border)"}),K("icon-top",[D("close",{margin:"var(--n-close-margin)"}),D("icon",{margin:"var(--n-icon-margin)"}),D("content",{textAlign:"center"}),D("title",{justifyContent:"center"}),D("action",{justifyContent:"center"})]),K("icon-left",[D("icon",{margin:"var(--n-icon-margin)"}),K("closable",[D("title",` + padding-right: calc(var(--n-close-size) + 6px); + `)])]),D("close",` + position: absolute; + right: 0; + top: 0; + margin: var(--n-close-margin); + transition: + background-color .3s var(--n-bezier), + color .3s var(--n-bezier); + z-index: 1; + `),D("content",` + font-size: var(--n-font-size); + margin: var(--n-content-margin); + position: relative; + word-break: break-word; + `,[K("last","margin-bottom: 0;")]),D("action",` + display: flex; + justify-content: flex-end; + `,[O("> *:not(:last-child)",{marginRight:"var(--n-action-space)"})]),D("icon",{fontSize:"var(--n-icon-size)",transition:"color .3s var(--n-bezier)"}),D("title",` + transition: color .3s var(--n-bezier); + display: flex; + align-items: center; + font-size: var(--n-title-font-size); + font-weight: var(--n-title-font-weight); + color: var(--n-title-text-color); + `),M("dialog-icon-container",{display:"flex",justifyContent:"center"})]),Hc(M("dialog",` + width: 446px; + max-width: calc(100vw - 32px); + `)),M("dialog",[vv(` + width: 446px; + max-width: calc(100vw - 32px); + `)])]);const $T={default:()=>v(Xs,null),info:()=>v(Xs,null),success:()=>v(Im,null),warning:()=>v(Om,null),error:()=>v(Rm,null)},Dg=ae({name:"Dialog",alias:["NimbusConfirmCard","Confirm"],props:Object.assign(Object.assign({},Ee.props),wl),setup(e){const{mergedComponentPropsRef:t,mergedClsPrefixRef:r,inlineThemeDisabled:o}=st(e),n=H(()=>{var u,f;const{iconPlacement:p}=e;return p||((f=(u=t==null?void 0:t.value)===null||u===void 0?void 0:u.Dialog)===null||f===void 0?void 0:f.iconPlacement)||"left"});function i(u){const{onPositiveClick:f}=e;f&&f(u)}function a(u){const{onNegativeClick:f}=e;f&&f(u)}function l(){const{onClose:u}=e;u&&u()}const s=Ee("Dialog","-dialog",ST,Bg,e,r),d=H(()=>{const{type:u}=e,f=n.value,{common:{cubicBezierEaseInOut:p},self:{fontSize:h,lineHeight:g,border:b,titleTextColor:m,textColor:y,color:w,closeBorderRadius:x,closeColorHover:k,closeColorPressed:T,closeIconColor:S,closeIconColorHover:$,closeIconColorPressed:R,closeIconSize:_,borderRadius:N,titleFontWeight:E,titleFontSize:F,padding:j,iconSize:Q,actionSpace:A,contentMargin:X,closeSize:ne,[f==="top"?"iconMarginIconTop":"iconMargin"]:pe,[f==="top"?"closeMarginIconTop":"closeMargin"]:Ce,[ie("iconColor",u)]:$e}}=s.value;return{"--n-font-size":h,"--n-icon-color":$e,"--n-bezier":p,"--n-close-margin":Ce,"--n-icon-margin":pe,"--n-icon-size":Q,"--n-close-size":ne,"--n-close-icon-size":_,"--n-close-border-radius":x,"--n-close-color-hover":k,"--n-close-color-pressed":T,"--n-close-icon-color":S,"--n-close-icon-color-hover":$,"--n-close-icon-color-pressed":R,"--n-color":w,"--n-text-color":y,"--n-border-radius":N,"--n-padding":j,"--n-line-height":g,"--n-border":b,"--n-content-margin":X,"--n-title-font-size":F,"--n-title-font-weight":E,"--n-title-text-color":m,"--n-action-space":A}}),c=o?Pt("dialog",H(()=>`${e.type[0]}${n.value[0]}`),d,e):void 0;return{mergedClsPrefix:r,mergedIconPlacement:n,mergedTheme:s,handlePositiveClick:i,handleNegativeClick:a,handleCloseClick:l,cssVars:o?void 0:d,themeClass:c==null?void 0:c.themeClass,onRender:c==null?void 0:c.onRender}},render(){var e;const{bordered:t,mergedIconPlacement:r,cssVars:o,closable:n,showIcon:i,title:a,content:l,action:s,negativeText:d,positiveText:c,positiveButtonProps:u,negativeButtonProps:f,handlePositiveClick:p,handleNegativeClick:h,mergedTheme:g,loading:b,type:m,mergedClsPrefix:y}=this;(e=this.onRender)===null||e===void 0||e.call(this);const w=i?v(zt,{clsPrefix:y,class:`${y}-dialog__icon`},{default:()=>dt(this.$slots.icon,k=>k||(this.icon?St(this.icon):$T[this.type]()))}):null,x=dt(this.$slots.action,k=>k||c||d||s?v("div",{class:`${y}-dialog__action`},k||(s?[St(s)]:[this.negativeText&&v(Da,Object.assign({theme:g.peers.Button,themeOverrides:g.peerOverrides.Button,ghost:!0,size:"small",onClick:h},f),{default:()=>St(this.negativeText)}),this.positiveText&&v(Da,Object.assign({theme:g.peers.Button,themeOverrides:g.peerOverrides.Button,size:"small",type:m==="default"?"primary":m,disabled:b,loading:b,onClick:p},u),{default:()=>St(this.positiveText)})])):null);return v("div",{class:[`${y}-dialog`,this.themeClass,this.closable&&`${y}-dialog--closable`,`${y}-dialog--icon-${r}`,t&&`${y}-dialog--bordered`],style:o,role:"dialog"},n?v(ji,{clsPrefix:y,class:`${y}-dialog__close`,onClick:this.handleCloseClick}):null,i&&r==="top"?v("div",{class:`${y}-dialog-icon-container`},w):null,v("div",{class:`${y}-dialog__title`},i&&r==="left"?w:null,Lr(this.$slots.header,()=>[St(a)])),v("div",{class:[`${y}-dialog__content`,x?"":`${y}-dialog__content--last`]},Lr(this.$slots.default,()=>[St(l)])),x)}}),Fg="n-dialog-provider",_T="n-dialog-api",PT="n-dialog-reactive-list",jg=e=>{const{modalColor:t,textColor2:r,boxShadow3:o}=e;return{color:t,textColor:r,boxShadow:o}},kT={name:"Modal",common:je,peers:{Scrollbar:od,Dialog:Bg,Card:vg},self:jg};var TT=kT;const zT={name:"Modal",common:le,peers:{Scrollbar:Ut,Dialog:Lg,Card:mg},self:jg};var ET=zT;const dd=Object.assign(Object.assign({},id),wl),RT=sr(dd);var IT=ae({name:"ModalBody",inheritAttrs:!1,props:Object.assign(Object.assign({show:{type:Boolean,required:!0},preset:String,displayDirective:{type:String,required:!0},trapFocus:{type:Boolean,default:!0},autoFocus:{type:Boolean,default:!0},blockScroll:Boolean},dd),{renderMask:Function,onClickoutside:Function,onBeforeLeave:{type:Function,required:!0},onAfterLeave:{type:Function,required:!0},onPositiveClick:{type:Function,required:!0},onNegativeClick:{type:Function,required:!0},onClose:{type:Function,required:!0},onAfterEnter:Function,onEsc:Function}),setup(e){const t=V(null),r=V(null),o=V(e.show),n=V(null),i=V(null);De(Te(e,"show"),b=>{b&&(o.value=!0)}),CS(H(()=>e.blockScroll&&o.value));const a=me(yv);function l(){if(a.transformOriginRef.value==="center")return"";const{value:b}=n,{value:m}=i;if(b===null||m===null)return"";if(r.value){const y=r.value.containerScrollTop;return`${b}px ${m+y}px`}return""}function s(b){if(a.transformOriginRef.value==="center")return;const m=a.getMousePosition();if(!m||!r.value)return;const y=r.value.containerScrollTop,{offsetLeft:w,offsetTop:x}=b;if(m){const k=m.y,T=m.x;n.value=-(w-T),i.value=-(x-k-y)}b.style.transformOrigin=l()}function d(b){Zt(()=>{s(b)})}function c(b){b.style.transformOrigin=l(),e.onBeforeLeave()}function u(){o.value=!1,n.value=null,i.value=null,e.onAfterLeave()}function f(){const{onClose:b}=e;b&&b()}function p(){e.onNegativeClick()}function h(){e.onPositiveClick()}const g=V(null);return De(g,b=>{b&&Zt(()=>{const m=b.el;m&&t.value!==m&&(t.value=m)})}),Be(ll,t),Be(sl,null),Be(Di,null),{mergedTheme:a.mergedThemeRef,appear:a.appearRef,isMounted:a.isMountedRef,mergedClsPrefix:a.mergedClsPrefixRef,bodyRef:t,scrollbarRef:r,displayed:o,childNodeRef:g,handlePositiveClick:h,handleNegativeClick:p,handleCloseClick:f,handleAfterLeave:u,handleBeforeLeave:c,handleEnter:d}},render(){const{$slots:e,$attrs:t,handleEnter:r,handleAfterLeave:o,handleBeforeLeave:n,preset:i,mergedClsPrefix:a}=this;let l=null;if(!i){if(l=Ms(e),!l){io("modal","default slot is empty");return}l=lr(l),l.props=so({class:`${a}-modal`},t,l.props||{})}return this.displayDirective==="show"||this.displayed||this.show?Tr(v("div",{role:"none",class:`${a}-modal-body-wrapper`},v(Wm,{ref:"scrollbarRef",theme:this.mergedTheme.peers.Scrollbar,themeOverrides:this.mergedTheme.peerOverrides.Scrollbar,contentClass:`${a}-modal-scroll-content`},{default:()=>{var s;return[(s=this.renderMask)===null||s===void 0?void 0:s.call(this),v(Fv,{disabled:!this.trapFocus,active:this.show,onEsc:this.onEsc,autoFocus:this.autoFocus},{default:()=>{var d;return v(Bt,{name:"fade-in-scale-up-transition",appear:(d=this.appear)!==null&&d!==void 0?d:this.isMounted,onEnter:r,onAfterEnter:this.onAfterEnter,onAfterLeave:o,onBeforeLeave:n},{default:()=>{const c=[[Si,this.show]],{onClickoutside:u}=this;return u&&c.push([Ds,this.onClickoutside,void 0,{capture:!0}]),Tr(this.preset==="confirm"||this.preset==="dialog"?v(Dg,Object.assign({},this.$attrs,{class:[`${a}-modal`,this.$attrs.class],ref:"bodyRef",theme:this.mergedTheme.peers.Dialog,themeOverrides:this.mergedTheme.peerOverrides.Dialog},Jt(this.$props,Hg),{"aria-modal":"true"}),e):this.preset==="card"?v(ad,Object.assign({},this.$attrs,{ref:"bodyRef",class:[`${a}-modal`,this.$attrs.class],theme:this.mergedTheme.peers.Card,themeOverrides:this.mergedTheme.peerOverrides.Card},Jt(this.$props,o8),{"aria-modal":"true",role:"dialog"}),e):this.childNodeRef=l,c)}})}})]}})),[[Si,this.displayDirective==="if"||this.displayed||this.show]]):null}}),OT=O([M("modal-container",` + position: fixed; + left: 0; + top: 0; + height: 0; + width: 0; + display: flex; + `),M("modal-mask",` + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + background-color: rgba(0, 0, 0, .4); + `,[Ai({enterDuration:".25s",leaveDuration:".25s",enterCubicBezier:"var(--n-bezier-ease-out)",leaveCubicBezier:"var(--n-bezier-ease-out)"})]),M("modal-body-wrapper",` + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + overflow: visible; + `,[M("modal-scroll-content",` + min-height: 100%; + display: flex; + position: relative; + `)]),M("modal",` + position: relative; + align-self: center; + color: var(--n-text-color); + margin: auto; + box-shadow: var(--n-box-shadow); + `,[Mi({duration:".25s",enterScale:".5"})])]);const AT=Object.assign(Object.assign(Object.assign(Object.assign({},Ee.props),{show:Boolean,unstableShowMask:{type:Boolean,default:!0},maskClosable:{type:Boolean,default:!0},preset:String,to:[String,Object],displayDirective:{type:String,default:"if"},transformOrigin:{type:String,default:"mouse"},zIndex:Number,autoFocus:{type:Boolean,default:!0},trapFocus:{type:Boolean,default:!0},closeOnEsc:{type:Boolean,default:!0},blockScroll:{type:Boolean,default:!0}}),dd),{onEsc:Function,"onUpdate:show":[Function,Array],onUpdateShow:[Function,Array],onAfterEnter:Function,onBeforeLeave:Function,onAfterLeave:Function,onClose:Function,onPositiveClick:Function,onNegativeClick:Function,onMaskClick:Function,internalDialog:Boolean,internalAppear:{type:Boolean,default:void 0},overlayStyle:[String,Object],onBeforeHide:Function,onAfterHide:Function,onHide:Function});var Ng=ae({name:"Modal",inheritAttrs:!1,props:AT,setup(e){const t=V(null),{mergedClsPrefixRef:r,namespaceRef:o,inlineThemeDisabled:n}=st(e),i=Ee("Modal","-modal",OT,TT,e,r),a=Cv(64),l=xv(),s=Hi(),d=e.internalDialog?me(Fg,null):null,c=yS();function u(k){const{onUpdateShow:T,"onUpdate:show":S,onHide:$}=e;T&&Ae(T,k),S&&Ae(S,k),$&&!k&&$(k)}function f(){const{onClose:k}=e;k?Promise.resolve(k()).then(T=>{T!==!1&&u(!1)}):u(!1)}function p(){const{onPositiveClick:k}=e;k?Promise.resolve(k()).then(T=>{T!==!1&&u(!1)}):u(!1)}function h(){const{onNegativeClick:k}=e;k?Promise.resolve(k()).then(T=>{T!==!1&&u(!1)}):u(!1)}function g(){const{onBeforeLeave:k,onBeforeHide:T}=e;k&&Ae(k),T&&T()}function b(){const{onAfterLeave:k,onAfterHide:T}=e;k&&Ae(k),T&&T()}function m(k){var T;const{onMaskClick:S}=e;S&&S(k),e.maskClosable&&!((T=t.value)===null||T===void 0)&&T.contains(_i(k))&&u(!1)}function y(k){var T;(T=e.onEsc)===null||T===void 0||T.call(e),e.show&&e.closeOnEsc&&vw(k)&&!c.value&&u(!1)}Be(yv,{getMousePosition:()=>{if(d){const{clickedRef:k,clickPositionRef:T}=d;if(k.value&&T.value)return T.value}return a.value?l.value:null},mergedClsPrefixRef:r,mergedThemeRef:i,isMountedRef:s,appearRef:Te(e,"internalAppear"),transformOriginRef:Te(e,"transformOrigin")});const w=H(()=>{const{common:{cubicBezierEaseOut:k},self:{boxShadow:T,color:S,textColor:$}}=i.value;return{"--n-bezier-ease-out":k,"--n-box-shadow":T,"--n-color":S,"--n-text-color":$}}),x=n?Pt("theme-class",void 0,w,e):void 0;return{mergedClsPrefix:r,namespace:o,isMounted:s,containerRef:t,presetProps:H(()=>Jt(e,RT)),handleEsc:y,handleAfterLeave:b,handleClickoutside:m,handleBeforeLeave:g,doUpdateShow:u,handleNegativeClick:h,handlePositiveClick:p,handleCloseClick:f,cssVars:n?void 0:w,themeClass:x==null?void 0:x.themeClass,onRender:x==null?void 0:x.onRender}},render(){const{mergedClsPrefix:e}=this;return v(jc,{to:this.to,show:this.show},{default:()=>{var t;(t=this.onRender)===null||t===void 0||t.call(this);const{unstableShowMask:r}=this;return Tr(v("div",{role:"none",ref:"containerRef",class:[`${e}-modal-container`,this.themeClass,this.namespace],style:this.cssVars},v(IT,Object.assign({style:this.overlayStyle},this.$attrs,{ref:"bodyWrapper",displayDirective:this.displayDirective,show:this.show,preset:this.preset,autoFocus:this.autoFocus,trapFocus:this.trapFocus,blockScroll:this.blockScroll},this.presetProps,{onEsc:this.handleEsc,onClose:this.handleCloseClick,onNegativeClick:this.handleNegativeClick,onPositiveClick:this.handlePositiveClick,onBeforeLeave:this.handleBeforeLeave,onAfterEnter:this.onAfterEnter,onAfterLeave:this.handleAfterLeave,onClickoutside:r?void 0:this.handleClickoutside,renderMask:r?()=>{var o;return v(Bt,{name:"fade-in-transition",key:"mask",appear:(o=this.internalAppear)!==null&&o!==void 0?o:this.isMounted},{default:()=>this.show?v("div",{"aria-hidden":!0,ref:"containerRef",class:`${e}-modal-mask`,onClick:this.handleClickoutside}):null})}:void 0}),this.$slots)),[[cl,{zIndex:this.zIndex,enabled:this.show}]])}})}});const MT=Object.assign(Object.assign({},wl),{onAfterEnter:Function,onAfterLeave:Function,transformOrigin:String,blockScroll:{type:Boolean,default:!0},closeOnEsc:{type:Boolean,default:!0},onEsc:Function,autoFocus:{type:Boolean,default:!0},internalStyle:[String,Object],maskClosable:{type:Boolean,default:!0},onPositiveClick:Function,onNegativeClick:Function,onClose:Function,onMaskClick:Function}),BT=ae({name:"DialogEnvironment",props:Object.assign(Object.assign({},MT),{internalKey:{type:String,required:!0},to:[String,Object],onInternalAfterLeave:{type:Function,required:!0}}),setup(e){const t=V(!0);function r(){const{onInternalAfterLeave:c,internalKey:u,onAfterLeave:f}=e;c&&c(u),f&&f()}function o(c){const{onPositiveClick:u}=e;u?Promise.resolve(u(c)).then(f=>{f!==!1&&s()}):s()}function n(c){const{onNegativeClick:u}=e;u?Promise.resolve(u(c)).then(f=>{f!==!1&&s()}):s()}function i(){const{onClose:c}=e;c?Promise.resolve(c()).then(u=>{u!==!1&&s()}):s()}function a(c){const{onMaskClick:u,maskClosable:f}=e;u&&(u(c),f&&s())}function l(){const{onEsc:c}=e;c&&c()}function s(){t.value=!1}function d(c){t.value=c}return{show:t,hide:s,handleUpdateShow:d,handleAfterLeave:r,handleCloseClick:i,handleNegativeClick:n,handlePositiveClick:o,handleMaskClick:a,handleEsc:l}},render(){const{handlePositiveClick:e,handleUpdateShow:t,handleNegativeClick:r,handleCloseClick:o,handleAfterLeave:n,handleMaskClick:i,handleEsc:a,to:l,maskClosable:s,show:d}=this;return v(Ng,{show:d,onUpdateShow:t,onMaskClick:i,onEsc:a,to:l,maskClosable:s,onAfterEnter:this.onAfterEnter,onAfterLeave:n,closeOnEsc:this.closeOnEsc,blockScroll:this.blockScroll,autoFocus:this.autoFocus,transformOrigin:this.transformOrigin,internalAppear:!0,internalDialog:!0},{default:()=>v(Dg,Object.assign({},Jt(this.$props,Hg),{style:this.internalStyle,onClose:o,onNegativeClick:r,onPositiveClick:e}))})}}),LT={injectionKey:String,to:[String,Object]},HT=ae({name:"DialogProvider",props:LT,setup(){const e=V([]),t={};function r(l={}){const s=Tn(),d=vr(Object.assign(Object.assign({},l),{key:s,destroy:()=>{t[`n-dialog-${s}`].hide()}}));return e.value.push(d),d}const o=["info","success","warning","error"].map(l=>s=>r(Object.assign(Object.assign({},s),{type:l})));function n(l){const{value:s}=e;s.splice(s.findIndex(d=>d.key===l),1)}function i(){Object.values(t).forEach(l=>l.hide())}const a={create:r,destroyAll:i,info:o[0],success:o[1],warning:o[2],error:o[3]};return Be(_T,a),Be(Fg,{clickedRef:Cv(64),clickPositionRef:xv()}),Be(PT,e),Object.assign(Object.assign({},a),{dialogList:e,dialogInstRefs:t,handleAfterLeave:n})},render(){var e,t;return v(Je,null,[this.dialogList.map(r=>v(BT,Lc(r,["destroy","style"],{internalStyle:r.style,to:this.to,ref:o=>{o===null?delete this.dialogInstRefs[`n-dialog-${r.key}`]:this.dialogInstRefs[`n-dialog-${r.key}`]=o},internalKey:r.key,onInternalAfterLeave:this.handleAfterLeave}))),(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e)])}}),Wg=e=>{const{textColor1:t,dividerColor:r,fontWeightStrong:o}=e;return{textColor:t,color:r,fontWeight:o}},DT={name:"Divider",common:je,self:Wg};var VM=DT;const FT={name:"Divider",common:le,self:Wg};var jT=FT;const NT=e=>{const{modalColor:t,textColor1:r,textColor2:o,boxShadow3:n,lineHeight:i,fontWeightStrong:a,dividerColor:l,closeColorHover:s,closeColorPressed:d,closeIconColor:c,closeIconColorHover:u,closeIconColorPressed:f,borderRadius:p,primaryColorHover:h}=e;return{bodyPadding:"16px 24px",headerPadding:"16px 24px",footerPadding:"16px 24px",color:t,textColor:o,titleTextColor:r,titleFontSize:"18px",titleFontWeight:a,boxShadow:n,lineHeight:i,headerBorderBottom:`1px solid ${l}`,footerBorderTop:`1px solid ${l}`,closeIconColor:c,closeIconColorHover:u,closeIconColorPressed:f,closeSize:"22px",closeIconSize:"18px",closeColorHover:s,closeColorPressed:d,closeBorderRadius:p,resizableTriggerColorHover:h}},WT={name:"Drawer",common:le,peers:{Scrollbar:Ut},self:NT};var VT=WT,UT={actionMargin:"0 0 0 20px",actionMarginRtl:"0 20px 0 0"};const KT={name:"DynamicInput",common:le,peers:{Input:ur,Button:Kt},self(){return UT}};var qT=KT,Vg={gapSmall:"4px 8px",gapMedium:"8px 12px",gapLarge:"12px 16px"};const GT={name:"Space",self(){return Vg}};var Ug=GT;const YT=()=>Vg,XT={name:"Space",self:YT};var ZT=XT;let ls;const JT=()=>{if(!Fo)return!0;if(ls===void 0){const e=document.createElement("div");e.style.display="flex",e.style.flexDirection="column",e.style.rowGap="1px",e.appendChild(document.createElement("div")),e.appendChild(document.createElement("div")),document.body.appendChild(e);const t=e.scrollHeight===1;return document.body.removeChild(e),ls=t}return ls},QT=Object.assign(Object.assign({},Ee.props),{align:String,justify:{type:String,default:"start"},inline:Boolean,vertical:Boolean,size:{type:[String,Number,Array],default:"medium"},wrapItem:{type:Boolean,default:!0},itemStyle:[String,Object],wrap:{type:Boolean,default:!0},internalUseGap:{type:Boolean,default:void 0}});var ez=ae({name:"Space",props:QT,setup(e){const{mergedClsPrefixRef:t,mergedRtlRef:r}=st(e),o=Ee("Space","-space",void 0,ZT,e,t),n=Kr("Space",r,t);return{useGap:JT(),rtlEnabled:n,mergedClsPrefix:t,margin:H(()=>{const{size:i}=e;if(Array.isArray(i))return{horizontal:i[0],vertical:i[1]};if(typeof i=="number")return{horizontal:i,vertical:i};const{self:{[ie("gap",i)]:a}}=o.value,{row:l,col:s}=Oy(a);return{horizontal:Ou(s),vertical:Ou(l)}})}},render(){const{vertical:e,align:t,inline:r,justify:o,itemStyle:n,margin:i,wrap:a,mergedClsPrefix:l,rtlEnabled:s,useGap:d,wrapItem:c,internalUseGap:u}=this,f=Ao(Ny(this));if(!f.length)return null;const p=`${i.horizontal}px`,h=`${i.horizontal/2}px`,g=`${i.vertical}px`,b=`${i.vertical/2}px`,m=f.length-1,y=o.startsWith("space-");return v("div",{role:"none",class:[`${l}-space`,s&&`${l}-space--rtl`],style:{display:r?"inline-flex":"flex",flexDirection:e?"column":"row",justifyContent:["start","end"].includes(o)?"flex-"+o:o,flexWrap:!a||e?"nowrap":"wrap",marginTop:d||e?"":`-${b}`,marginBottom:d||e?"":`-${b}`,alignItems:t,gap:d?`${i.vertical}px ${i.horizontal}px`:""}},!c&&(d||u)?f:f.map((w,x)=>v("div",{role:"none",style:[n,{maxWidth:"100%"},d?"":e?{marginBottom:x!==m?g:""}:s?{marginLeft:y?o==="space-between"&&x===m?"":h:x!==m?p:"",marginRight:y?o==="space-between"&&x===0?"":h:"",paddingTop:b,paddingBottom:b}:{marginRight:y?o==="space-between"&&x===m?"":h:x!==m?p:"",marginLeft:y?o==="space-between"&&x===0?"":h:"",paddingTop:b,paddingBottom:b}]},w)))}});const tz={name:"DynamicTags",common:le,peers:{Input:ur,Button:Kt,Tag:Qm,Space:Ug},self(){return{inputWidth:"64px"}}};var rz=tz;const oz={name:"Element",common:le};var nz=oz,iz={feedbackPadding:"4px 0 0 2px",feedbackHeightSmall:"24px",feedbackHeightMedium:"24px",feedbackHeightLarge:"26px",feedbackFontSizeSmall:"13px",feedbackFontSizeMedium:"14px",feedbackFontSizeLarge:"14px",labelFontSizeLeftSmall:"14px",labelFontSizeLeftMedium:"14px",labelFontSizeLeftLarge:"15px",labelFontSizeTopSmall:"13px",labelFontSizeTopMedium:"14px",labelFontSizeTopLarge:"14px",labelHeightSmall:"24px",labelHeightMedium:"26px",labelHeightLarge:"28px",labelPaddingVertical:"0 0 6px 2px",labelPaddingHorizontal:"0 12px 0 0",labelTextAlignVertical:"left",labelTextAlignHorizontal:"right",labelFontWeight:"400"};const Kg=e=>{const{heightSmall:t,heightMedium:r,heightLarge:o,textColor1:n,errorColor:i,warningColor:a,lineHeight:l,textColor3:s}=e;return Object.assign(Object.assign({},iz),{blankHeightSmall:t,blankHeightMedium:r,blankHeightLarge:o,lineHeight:l,labelTextColor:n,asteriskColor:i,feedbackTextColorError:i,feedbackTextColorWarning:a,feedbackTextColor:s})},az={name:"Form",common:je,self:Kg};var qg=az;const lz={name:"Form",common:le,self:Kg};var sz=lz,cz=M("form",[K("inline",` + width: 100%; + display: inline-flex; + align-items: flex-start; + align-content: space-around; + `,[M("form-item",{width:"auto",marginRight:"18px"},[O("&:last-child",{marginRight:0})])])]);const Wi="n-form",Gg="n-form-item-insts";var dz=globalThis&&globalThis.__awaiter||function(e,t,r,o){function n(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function l(c){try{d(o.next(c))}catch(u){a(u)}}function s(c){try{d(o.throw(c))}catch(u){a(u)}}function d(c){c.done?i(c.value):n(c.value).then(l,s)}d((o=o.apply(e,t||[])).next())})};const uz=Object.assign(Object.assign({},Ee.props),{inline:Boolean,labelWidth:[Number,String],labelAlign:String,labelPlacement:{type:String,default:"top"},model:{type:Object,default:()=>{}},rules:Object,disabled:Boolean,size:String,showRequireMark:{type:Boolean,default:void 0},requireMarkPlacement:String,showFeedback:{type:Boolean,default:!0},onSubmit:{type:Function,default:e=>e.preventDefault()},showLabel:{type:Boolean,default:void 0},validateMessages:Object});var fz=ae({name:"Form",props:uz,setup(e){const{mergedClsPrefixRef:t}=st(e);Ee("Form","-form",cz,qg,e,t);const r={},o=V(void 0),n=s=>{const d=o.value;(d===void 0||s>=d)&&(o.value=s)};function i(s,d=()=>!0){return dz(this,void 0,void 0,function*(){return yield new Promise((c,u)=>{const f=[];for(const p of sr(r)){const h=r[p];for(const g of h)g.path&&f.push(g.internalValidate(null,d))}Promise.all(f).then(p=>{if(p.some(h=>!h.valid)){const h=p.filter(g=>g.errors).map(g=>g.errors);s&&s(h),u(h)}else s&&s(),c()})})})}function a(){for(const s of sr(r)){const d=r[s];for(const c of d)c.restoreValidation()}}return Be(Wi,{props:e,maxChildLabelWidthRef:o,deriveMaxChildLabelWidth:n}),Be(Gg,{formItems:r}),Object.assign({validate:i,restoreValidation:a},{mergedClsPrefix:t})},render(){const{mergedClsPrefix:e}=this;return v("form",{class:[`${e}-form`,this.inline&&`${e}-form--inline`],onSubmit:this.onSubmit},this.$slots)}});function Ro(){return Ro=Object.assign?Object.assign.bind():function(e){for(var t=1;t1?t-1:0),o=1;o=i)return l;switch(l){case"%s":return String(r[n++]);case"%d":return Number(r[n++]);case"%j":try{return JSON.stringify(r[n++])}catch{return"[Circular]"}break;default:return l}});return a}return e}function bz(e){return e==="string"||e==="url"||e==="hex"||e==="email"||e==="date"||e==="pattern"}function yt(e,t){return!!(e==null||t==="array"&&Array.isArray(e)&&!e.length||bz(t)&&typeof e=="string"&&!e)}function xz(e,t,r){var o=[],n=0,i=e.length;function a(l){o.push.apply(o,l||[]),n++,n===i&&r(o)}e.forEach(function(l){t(l,a)})}function th(e,t,r){var o=0,n=e.length;function i(a){if(a&&a.length){r(a);return}var l=o;o=o+1,l()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+\.)+[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}))$/,hex:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/i},ni={integer:function(t){return ni.number(t)&&parseInt(t,10)===t},float:function(t){return ni.number(t)&&!ni.integer(t)},array:function(t){return Array.isArray(t)},regexp:function(t){if(t instanceof RegExp)return!0;try{return!!new RegExp(t)}catch{return!1}},date:function(t){return typeof t.getTime=="function"&&typeof t.getMonth=="function"&&typeof t.getYear=="function"&&!isNaN(t.getTime())},number:function(t){return isNaN(t)?!1:typeof t=="number"},object:function(t){return typeof t=="object"&&!ni.array(t)},method:function(t){return typeof t=="function"},email:function(t){return typeof t=="string"&&t.length<=320&&!!t.match(ih.email)},url:function(t){return typeof t=="string"&&t.length<=2048&&!!t.match(_z())},hex:function(t){return typeof t=="string"&&!!t.match(ih.hex)}},Pz=function(t,r,o,n,i){if(t.required&&r===void 0){Yg(t,r,o,n,i);return}var a=["integer","float","array","regexp","object","method","email","number","date","url","hex"],l=t.type;a.indexOf(l)>-1?ni[l](r)||n.push(Xt(i.messages.types[l],t.fullField,t.type)):l&&typeof r!==t.type&&n.push(Xt(i.messages.types[l],t.fullField,t.type))},kz=function(t,r,o,n,i){var a=typeof t.len=="number",l=typeof t.min=="number",s=typeof t.max=="number",d=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,c=r,u=null,f=typeof r=="number",p=typeof r=="string",h=Array.isArray(r);if(f?u="number":p?u="string":h&&(u="array"),!u)return!1;h&&(c=r.length),p&&(c=r.replace(d,"_").length),a?c!==t.len&&n.push(Xt(i.messages[u].len,t.fullField,t.len)):l&&!s&&ct.max?n.push(Xt(i.messages[u].max,t.fullField,t.max)):l&&s&&(ct.max)&&n.push(Xt(i.messages[u].range,t.fullField,t.min,t.max))},on="enum",Tz=function(t,r,o,n,i){t[on]=Array.isArray(t[on])?t[on]:[],t[on].indexOf(r)===-1&&n.push(Xt(i.messages[on],t.fullField,t[on].join(", ")))},zz=function(t,r,o,n,i){if(t.pattern){if(t.pattern instanceof RegExp)t.pattern.lastIndex=0,t.pattern.test(r)||n.push(Xt(i.messages.pattern.mismatch,t.fullField,r,t.pattern));else if(typeof t.pattern=="string"){var a=new RegExp(t.pattern);a.test(r)||n.push(Xt(i.messages.pattern.mismatch,t.fullField,r,t.pattern))}}},He={required:Yg,whitespace:$z,type:Pz,range:kz,enum:Tz,pattern:zz},Ez=function(t,r,o,n,i){var a=[],l=t.required||!t.required&&n.hasOwnProperty(t.field);if(l){if(yt(r,"string")&&!t.required)return o();He.required(t,r,n,a,i,"string"),yt(r,"string")||(He.type(t,r,n,a,i),He.range(t,r,n,a,i),He.pattern(t,r,n,a,i),t.whitespace===!0&&He.whitespace(t,r,n,a,i))}o(a)},Rz=function(t,r,o,n,i){var a=[],l=t.required||!t.required&&n.hasOwnProperty(t.field);if(l){if(yt(r)&&!t.required)return o();He.required(t,r,n,a,i),r!==void 0&&He.type(t,r,n,a,i)}o(a)},Iz=function(t,r,o,n,i){var a=[],l=t.required||!t.required&&n.hasOwnProperty(t.field);if(l){if(r===""&&(r=void 0),yt(r)&&!t.required)return o();He.required(t,r,n,a,i),r!==void 0&&(He.type(t,r,n,a,i),He.range(t,r,n,a,i))}o(a)},Oz=function(t,r,o,n,i){var a=[],l=t.required||!t.required&&n.hasOwnProperty(t.field);if(l){if(yt(r)&&!t.required)return o();He.required(t,r,n,a,i),r!==void 0&&He.type(t,r,n,a,i)}o(a)},Az=function(t,r,o,n,i){var a=[],l=t.required||!t.required&&n.hasOwnProperty(t.field);if(l){if(yt(r)&&!t.required)return o();He.required(t,r,n,a,i),yt(r)||He.type(t,r,n,a,i)}o(a)},Mz=function(t,r,o,n,i){var a=[],l=t.required||!t.required&&n.hasOwnProperty(t.field);if(l){if(yt(r)&&!t.required)return o();He.required(t,r,n,a,i),r!==void 0&&(He.type(t,r,n,a,i),He.range(t,r,n,a,i))}o(a)},Bz=function(t,r,o,n,i){var a=[],l=t.required||!t.required&&n.hasOwnProperty(t.field);if(l){if(yt(r)&&!t.required)return o();He.required(t,r,n,a,i),r!==void 0&&(He.type(t,r,n,a,i),He.range(t,r,n,a,i))}o(a)},Lz=function(t,r,o,n,i){var a=[],l=t.required||!t.required&&n.hasOwnProperty(t.field);if(l){if(r==null&&!t.required)return o();He.required(t,r,n,a,i,"array"),r!=null&&(He.type(t,r,n,a,i),He.range(t,r,n,a,i))}o(a)},Hz=function(t,r,o,n,i){var a=[],l=t.required||!t.required&&n.hasOwnProperty(t.field);if(l){if(yt(r)&&!t.required)return o();He.required(t,r,n,a,i),r!==void 0&&He.type(t,r,n,a,i)}o(a)},Dz="enum",Fz=function(t,r,o,n,i){var a=[],l=t.required||!t.required&&n.hasOwnProperty(t.field);if(l){if(yt(r)&&!t.required)return o();He.required(t,r,n,a,i),r!==void 0&&He[Dz](t,r,n,a,i)}o(a)},jz=function(t,r,o,n,i){var a=[],l=t.required||!t.required&&n.hasOwnProperty(t.field);if(l){if(yt(r,"string")&&!t.required)return o();He.required(t,r,n,a,i),yt(r,"string")||He.pattern(t,r,n,a,i)}o(a)},Nz=function(t,r,o,n,i){var a=[],l=t.required||!t.required&&n.hasOwnProperty(t.field);if(l){if(yt(r,"date")&&!t.required)return o();if(He.required(t,r,n,a,i),!yt(r,"date")){var s;r instanceof Date?s=r:s=new Date(r),He.type(t,s,n,a,i),s&&He.range(t,s.getTime(),n,a,i)}}o(a)},Wz=function(t,r,o,n,i){var a=[],l=Array.isArray(r)?"array":typeof r;He.required(t,r,n,a,i,l),o(a)},ss=function(t,r,o,n,i){var a=t.type,l=[],s=t.required||!t.required&&n.hasOwnProperty(t.field);if(s){if(yt(r,a)&&!t.required)return o();He.required(t,r,n,l,i,a),yt(r,a)||He.type(t,r,n,l,i)}o(l)},Vz=function(t,r,o,n,i){var a=[],l=t.required||!t.required&&n.hasOwnProperty(t.field);if(l){if(yt(r)&&!t.required)return o();He.required(t,r,n,a,i)}o(a)},pi={string:Ez,method:Rz,number:Iz,boolean:Oz,regexp:Az,integer:Mz,float:Bz,array:Lz,object:Hz,enum:Fz,pattern:jz,date:Nz,url:ss,hex:ss,email:ss,required:Wz,any:Vz};function oc(){return{default:"Validation error on field %s",required:"%s is required",enum:"%s must be one of %s",whitespace:"%s cannot be empty",date:{format:"%s date %s is invalid for format %s",parse:"%s date could not be parsed, %s is invalid ",invalid:"%s date %s is invalid"},types:{string:"%s is not a %s",method:"%s is not a %s (function)",array:"%s is not an %s",object:"%s is not an %s",number:"%s is not a %s",date:"%s is not a %s",boolean:"%s is not a %s",integer:"%s is not an %s",float:"%s is not a %s",regexp:"%s is not a valid %s",email:"%s is not a valid %s",url:"%s is not a valid %s",hex:"%s is not a valid %s"},string:{len:"%s must be exactly %s characters",min:"%s must be at least %s characters",max:"%s cannot be longer than %s characters",range:"%s must be between %s and %s characters"},number:{len:"%s must equal %s",min:"%s cannot be less than %s",max:"%s cannot be greater than %s",range:"%s must be between %s and %s"},array:{len:"%s must be exactly %s in length",min:"%s cannot be less than %s in length",max:"%s cannot be greater than %s in length",range:"%s must be between %s and %s in length"},pattern:{mismatch:"%s value %s does not match pattern %s"},clone:function(){var t=JSON.parse(JSON.stringify(this));return t.clone=this.clone,t}}}var nc=oc(),Vi=function(){function e(r){this.rules=null,this._messages=nc,this.define(r)}var t=e.prototype;return t.define=function(o){var n=this;if(!o)throw new Error("Cannot configure a schema with no rules");if(typeof o!="object"||Array.isArray(o))throw new Error("Rules must be an object");this.rules={},Object.keys(o).forEach(function(i){var a=o[i];n.rules[i]=Array.isArray(a)?a:[a]})},t.messages=function(o){return o&&(this._messages=nh(oc(),o)),this._messages},t.validate=function(o,n,i){var a=this;n===void 0&&(n={}),i===void 0&&(i=function(){});var l=o,s=n,d=i;if(typeof s=="function"&&(d=s,s={}),!this.rules||Object.keys(this.rules).length===0)return d&&d(null,l),Promise.resolve(l);function c(g){var b=[],m={};function y(x){if(Array.isArray(x)){var k;b=(k=b).concat.apply(k,x)}else b.push(x)}for(var w=0;we.size!==void 0?e.size:(t==null?void 0:t.props.size)!==void 0?t.props.size:"medium")}}function Kz(e){const t=me(Wi,null),r=H(()=>{const{labelPlacement:p}=e;return p!==void 0?p:t!=null&&t.props.labelPlacement?t.props.labelPlacement:"top"}),o=H(()=>r.value==="left"&&(e.labelWidth==="auto"||(t==null?void 0:t.props.labelWidth)==="auto")),n=H(()=>{if(r.value==="top")return;const{labelWidth:p}=e;if(p!==void 0&&p!=="auto")return ar(p);if(o.value){const h=t==null?void 0:t.maxChildLabelWidthRef.value;return h!==void 0?ar(h):void 0}if((t==null?void 0:t.props.labelWidth)!==void 0)return ar(t.props.labelWidth)}),i=H(()=>{const{labelAlign:p}=e;if(p)return p;if(t!=null&&t.props.labelAlign)return t.props.labelAlign}),a=H(()=>{var p;return[(p=e.labelProps)===null||p===void 0?void 0:p.style,e.labelStyle,{width:n.value}]}),l=H(()=>{const{showRequireMark:p}=e;return p!==void 0?p:t==null?void 0:t.props.showRequireMark}),s=H(()=>{const{requireMarkPlacement:p}=e;return p!==void 0?p:(t==null?void 0:t.props.requireMarkPlacement)||"right"}),d=V(!1),c=H(()=>{const{validationStatus:p}=e;if(p!==void 0)return p;if(d.value)return"error"}),u=H(()=>{const{showFeedback:p}=e;return p!==void 0?p:(t==null?void 0:t.props.showFeedback)!==void 0?t.props.showFeedback:!0}),f=H(()=>{const{showLabel:p}=e;return p!==void 0?p:(t==null?void 0:t.props.showLabel)!==void 0?t.props.showLabel:!0});return{validationErrored:d,mergedLabelStyle:a,mergedLabelPlacement:r,mergedLabelAlign:i,mergedShowRequireMark:l,mergedRequireMarkPlacement:s,mergedValidationStatus:c,mergedShowFeedback:u,mergedShowLabel:f,isAutoLabelWidth:o}}function qz(e){const t=me(Wi,null),r=H(()=>{const{rulePath:a}=e;if(a!==void 0)return a;const{path:l}=e;if(l!==void 0)return l}),o=H(()=>{const a=[],{rule:l}=e;if(l!==void 0&&(Array.isArray(l)?a.push(...l):a.push(l)),t){const{rules:s}=t.props,{value:d}=r;if(s!==void 0&&d!==void 0){const c=ed(s,d);c!==void 0&&(Array.isArray(c)?a.push(...c):a.push(c))}}return a}),n=H(()=>o.value.some(a=>a.required)),i=H(()=>n.value||e.required);return{mergedRules:o,mergedRequired:i}}const{cubicBezierEaseInOut:ah}=zr;function Gz({name:e="fade-down",fromOffset:t="-4px",enterDuration:r=".3s",leaveDuration:o=".3s",enterCubicBezier:n=ah,leaveCubicBezier:i=ah}={}){return[O(`&.${e}-transition-enter-from, &.${e}-transition-leave-to`,{opacity:0,transform:`translateY(${t})`}),O(`&.${e}-transition-enter-to, &.${e}-transition-leave-from`,{opacity:1,transform:"translateY(0)"}),O(`&.${e}-transition-leave-active`,{transition:`opacity ${o} ${i}, transform ${o} ${i}`}),O(`&.${e}-transition-enter-active`,{transition:`opacity ${r} ${n}, transform ${r} ${n}`})]}var Yz=M("form-item",` + display: grid; + line-height: var(--n-line-height); +`,[M("form-item-label",` + grid-area: label; + align-items: center; + line-height: 1.25; + text-align: var(--n-label-text-align); + font-size: var(--n-label-font-size); + min-height: var(--n-label-height); + padding: var(--n-label-padding); + color: var(--n-label-text-color); + transition: color .3s var(--n-bezier); + box-sizing: border-box; + font-weight: var(--n-label-font-weight); + `,[D("asterisk",` + white-space: nowrap; + user-select: none; + -webkit-user-select: none; + color: var(--n-asterisk-color); + transition: color .3s var(--n-bezier); + `),D("asterisk-placeholder",` + grid-area: mark; + user-select: none; + -webkit-user-select: none; + visibility: hidden; + `)]),M("form-item-blank",` + grid-area: blank; + min-height: var(--n-blank-height); + `),K("auto-label-width",[M("form-item-label","white-space: nowrap;")]),K("left-labelled",` + grid-template-areas: + "label blank" + "label feedback"; + grid-template-columns: auto minmax(0, 1fr); + grid-template-rows: auto 1fr; + align-items: start; + `,[M("form-item-label",` + display: grid; + grid-template-columns: 1fr auto; + min-height: var(--n-blank-height); + height: auto; + box-sizing: border-box; + flex-shrink: 0; + flex-grow: 0; + `,[K("reverse-columns-space",` + grid-template-columns: auto 1fr; + `),K("left-mark",` + grid-template-areas: + "mark text" + ". text"; + `),K("right-mark",` + grid-template-areas: + "text mark" + "text ."; + `),K("right-hanging-mark",` + grid-template-areas: + "text mark" + "text ."; + `),D("text",` + grid-area: text; + `),D("asterisk",` + grid-area: mark; + align-self: end; + `)])]),K("top-labelled",` + grid-template-areas: + "label" + "blank" + "feedback"; + grid-template-rows: minmax(var(--n-label-height), auto) 1fr; + grid-template-columns: minmax(0, 100%); + `,[K("no-label",` + grid-template-areas: + "blank" + "feedback"; + grid-template-rows: 1fr; + `),M("form-item-label",` + display: flex; + align-items: flex-start; + justify-content: var(--n-label-text-align); + `)]),M("form-item-blank",` + box-sizing: border-box; + display: flex; + align-items: center; + position: relative; + `),M("form-item-feedback-wrapper",` + grid-area: feedback; + box-sizing: border-box; + min-height: var(--n-feedback-height); + font-size: var(--n-feedback-font-size); + line-height: 1.25; + transform-origin: top left; + `,[O("&:not(:empty)",` + padding: var(--n-feedback-padding); + `),M("form-item-feedback",{transition:"color .3s var(--n-bezier)",color:"var(--n-feedback-text-color)"},[K("warning",{color:"var(--n-feedback-text-color-warning)"}),K("error",{color:"var(--n-feedback-text-color-error)"}),Gz({fromOffset:"-3px",enterDuration:".3s",leaveDuration:".2s"})])])]),lh=globalThis&&globalThis.__awaiter||function(e,t,r,o){function n(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function l(c){try{d(o.next(c))}catch(u){a(u)}}function s(c){try{d(o.throw(c))}catch(u){a(u)}}function d(c){c.done?i(c.value):n(c.value).then(l,s)}d((o=o.apply(e,t||[])).next())})};const ud=Object.assign(Object.assign({},Ee.props),{label:String,labelWidth:[Number,String],labelStyle:[String,Object],labelAlign:String,labelPlacement:String,path:String,first:Boolean,rulePath:String,required:Boolean,showRequireMark:{type:Boolean,default:void 0},requireMarkPlacement:String,showFeedback:{type:Boolean,default:void 0},rule:[Object,Array],size:String,ignorePathChange:Boolean,validationStatus:String,feedback:String,showLabel:{type:Boolean,default:void 0},labelProps:Object}),Xz=sr(ud);function sh(e,t){return(...r)=>{try{const o=e(...r);return!t&&(typeof o=="boolean"||o instanceof Error||Array.isArray(o))||(o==null?void 0:o.then)?o:(o===void 0||io("form-item/validate",`You return a ${typeof o} typed value in the validator method, which is not recommended. Please use `+(t?"`Promise`":"`boolean`, `Error` or `Promise`")+" typed value instead."),!0)}catch(o){io("form-item/validate","An error is catched in the validation, so the validation won't be done. Your callback in `validate` method of `n-form` or `n-form-item` won't be called in this validation."),console.error(o);return}}}var Zz=ae({name:"FormItem",props:ud,setup(e){mw(Gg,"formItems",Te(e,"path"));const{mergedClsPrefixRef:t,inlineThemeDisabled:r}=st(e),o=me(Wi,null),n=Uz(e),i=Kz(e),{validationErrored:a}=i,{mergedRequired:l,mergedRules:s}=qz(e),{mergedSize:d}=n,{mergedLabelPlacement:c,mergedLabelAlign:u,mergedRequireMarkPlacement:f}=i,p=V([]),h=V(Tn()),g=o?Te(o.props,"disabled"):V(!1),b=Ee("Form","-form-item",Yz,qg,e,t);De(Te(e,"path"),()=>{e.ignorePathChange||m()});function m(){p.value=[],a.value=!1,e.feedback&&(h.value=Tn())}function y(){S("blur")}function w(){S("change")}function x(){S("focus")}function k(){S("input")}function T(F,j){return lh(this,void 0,void 0,function*(){let Q,A,X,ne;return typeof F=="string"?(Q=F,A=j):F!==null&&typeof F=="object"&&(Q=F.trigger,A=F.callback,X=F.shouldRuleBeApplied,ne=F.options),yield new Promise((pe,Ce)=>{S(Q,X,ne).then(({valid:$e,errors:_e})=>{$e?(A&&A(),pe()):(A&&A(_e),Ce(_e))})})})}const S=(F=null,j=()=>!0,Q={suppressWarning:!0})=>lh(this,void 0,void 0,function*(){const{path:A}=e;Q?Q.first||(Q.first=e.first):Q={};const{value:X}=s,ne=o?ed(o.props.model,A||""):void 0,pe={},Ce={},$e=(F?X.filter(U=>Array.isArray(U.trigger)?U.trigger.includes(F):U.trigger===F):X).filter(j).map((U,ee)=>{const G=Object.assign({},U);if(G.validator&&(G.validator=sh(G.validator,!1)),G.asyncValidator&&(G.asyncValidator=sh(G.asyncValidator,!0)),G.renderMessage){const se=`__renderMessage__${ee}`;Ce[se]=G.message,G.message=se,pe[se]=G.renderMessage}return G});if(!$e.length)return{valid:!0};const _e=A!=null?A:"__n_no_path__",Ge=new Vi({[_e]:$e}),{validateMessages:Le}=(o==null?void 0:o.props)||{};return Le&&Ge.messages(Le),yield new Promise(U=>{Ge.validate({[_e]:ne},Q,ee=>{ee!=null&&ee.length?(p.value=ee.map(G=>{const se=(G==null?void 0:G.message)||"";return{key:se,render:()=>se.startsWith("__renderMessage__")?pe[se]():se}}),ee.forEach(G=>{var se;!((se=G.message)===null||se===void 0)&&se.startsWith("__renderMessage__")&&(G.message=Ce[G.message])}),a.value=!0,U({valid:!1,errors:ee})):(m(),U({valid:!0}))})})});Be(js,{path:Te(e,"path"),disabled:g,mergedSize:n.mergedSize,mergedValidationStatus:i.mergedValidationStatus,restoreValidation:m,handleContentBlur:y,handleContentChange:w,handleContentFocus:x,handleContentInput:k});const $={validate:T,restoreValidation:m,internalValidate:S},R=V(null);gt(()=>{if(!i.isAutoLabelWidth.value)return;const F=R.value;if(F!==null){const j=F.style.whiteSpace;F.style.whiteSpace="nowrap",F.style.width="",o==null||o.deriveMaxChildLabelWidth(Number(getComputedStyle(F).width.slice(0,-2))),F.style.whiteSpace=j}});const _=H(()=>{var F;const{value:j}=d,{value:Q}=c,A=Q==="top"?"vertical":"horizontal",{common:{cubicBezierEaseInOut:X},self:{labelTextColor:ne,asteriskColor:pe,lineHeight:Ce,feedbackTextColor:$e,feedbackTextColorWarning:_e,feedbackTextColorError:Ge,feedbackPadding:Le,labelFontWeight:U,[ie("labelHeight",j)]:ee,[ie("blankHeight",j)]:G,[ie("feedbackFontSize",j)]:se,[ie("feedbackHeight",j)]:ce,[ie("labelPadding",A)]:Re,[ie("labelTextAlign",A)]:ge,[ie(ie("labelFontSize",Q),j)]:C}}=b.value;let P=(F=u.value)!==null&&F!==void 0?F:ge;return Q==="top"&&(P=P==="right"?"flex-end":"flex-start"),{"--n-bezier":X,"--n-line-height":Ce,"--n-blank-height":G,"--n-label-font-size":C,"--n-label-text-align":P,"--n-label-height":ee,"--n-label-padding":Re,"--n-label-font-weight":U,"--n-asterisk-color":pe,"--n-label-text-color":ne,"--n-feedback-padding":Le,"--n-feedback-font-size":se,"--n-feedback-height":ce,"--n-feedback-text-color":$e,"--n-feedback-text-color-warning":_e,"--n-feedback-text-color-error":Ge}}),N=r?Pt("form-item",H(()=>{var F;return`${d.value[0]}${c.value[0]}${((F=u.value)===null||F===void 0?void 0:F[0])||""}`}),_,e):void 0,E=H(()=>c.value==="left"&&f.value==="left"&&u.value==="left");return Object.assign(Object.assign(Object.assign(Object.assign({labelElementRef:R,mergedClsPrefix:t,mergedRequired:l,feedbackId:h,renderExplains:p,reverseColSpace:E},i),n),$),{cssVars:r?void 0:_,themeClass:N==null?void 0:N.themeClass,onRender:N==null?void 0:N.onRender})},render(){const{$slots:e,mergedClsPrefix:t,mergedShowLabel:r,mergedShowRequireMark:o,mergedRequireMarkPlacement:n,onRender:i}=this,a=o!==void 0?o:this.mergedRequired;i==null||i();const l=()=>{const s=this.$slots.label?this.$slots.label():this.label;if(!s)return null;const d=v("span",{class:`${t}-form-item-label__text`},s),c=a?v("span",{class:`${t}-form-item-label__asterisk`},n!=="left"?"\xA0*":"*\xA0"):n==="right-hanging"&&v("span",{class:`${t}-form-item-label__asterisk-placeholder`},"\xA0*"),{labelProps:u}=this;return v("label",Object.assign({},u,{class:[u==null?void 0:u.class,`${t}-form-item-label`,`${t}-form-item-label--${n}-mark`,this.reverseColSpace&&`${t}-form-item-label--reverse-columns-space`],style:this.mergedLabelStyle,ref:"labelElementRef"}),n==="left"?[c,d]:[d,c])};return v("div",{class:[`${t}-form-item`,this.themeClass,`${t}-form-item--${this.mergedSize}-size`,`${t}-form-item--${this.mergedLabelPlacement}-labelled`,this.isAutoLabelWidth&&`${t}-form-item--auto-label-width`,!r&&`${t}-form-item--no-label`],style:this.cssVars},r&&l(),v("div",{class:[`${t}-form-item-blank`,this.mergedValidationStatus&&`${t}-form-item-blank--${this.mergedValidationStatus}`]},e),this.mergedShowFeedback?v("div",{key:this.feedbackId,class:`${t}-form-item-feedback-wrapper`},v(Bt,{name:"fade-down-transition",mode:"out-in"},{default:()=>{const{mergedValidationStatus:s}=this;return dt(e.feedback,d=>{var c;const{feedback:u}=this,f=d||u?v("div",{key:"__feedback__",class:`${t}-form-item-feedback__line`},d||u):this.renderExplains.length?(c=this.renderExplains)===null||c===void 0?void 0:c.map(({key:p,render:h})=>v("div",{key:p,class:`${t}-form-item-feedback__line`},h())):null;return f?s==="warning"?v("div",{key:"controlled-warning",class:`${t}-form-item-feedback ${t}-form-item-feedback--warning`},f):s==="error"?v("div",{key:"controlled-error",class:`${t}-form-item-feedback ${t}-form-item-feedback--error`},f):s==="success"?v("div",{key:"controlled-success",class:`${t}-form-item-feedback ${t}-form-item-feedback--success`},f):v("div",{key:"controlled-default",class:`${t}-form-item-feedback`},f):null})}})):null)}});const Jz=Array.apply(null,{length:24}).map((e,t)=>{const r=t+1,o=`calc(100% / 24 * ${r})`;return[K(`${r}-span`,{width:o}),K(`${r}-offset`,{marginLeft:o}),K(`${r}-push`,{left:o}),K(`${r}-pull`,{right:o})]});var Qz=O([M("row",{width:"100%",display:"flex",flexWrap:"wrap"}),M("col",{verticalAlign:"top",boxSizing:"border-box",display:"inline-block",position:"relative",zIndex:"auto"},[D("box",{position:"relative",zIndex:"auto",width:"100%",height:"100%"}),Jz])]);const Xg="n-row",fd={gutter:{type:[Array,Number,String],default:0},alignItems:String,justifyContent:String},eE=sr(fd);var tE=ae({name:"Row",props:fd,setup(e){const{mergedClsPrefixRef:t,mergedRtlRef:r}=st(e);co("-legacy-grid",Qz,t);const o=Kr("Row",r,t),n=mt(()=>{const{gutter:a}=e;return Array.isArray(a)&&a[1]||0}),i=mt(()=>{const{gutter:a}=e;return Array.isArray(a)?a[0]:Number(a)});return Be(Xg,{mergedClsPrefixRef:t,gutterRef:Te(e,"gutter"),verticalGutterRef:n,horizontalGutterRef:i}),{mergedClsPrefix:t,rtlEnabled:o,styleMargin:mt(()=>`-${ar(n.value,{c:.5})} -${ar(i.value,{c:.5})}`),styleWidth:mt(()=>`calc(100% + ${ar(i.value)})`)}},render(){return v("div",{class:[`${this.mergedClsPrefix}-row`,this.rtlEnabled&&`${this.mergedClsPrefix}-row--rtl`],style:{margin:this.styleMargin,width:this.styleWidth,alignItems:this.alignItems,justifyContent:this.justifyContent}},this.$slots)}});const hd={span:{type:[String,Number],default:1},push:{type:[String,Number],default:0},pull:{type:[String,Number],default:0},offset:{type:[String,Number],default:0}},rE=sr(hd);var oE=ae({name:"Col",props:hd,setup(e){const t=me(Xg,null);return t||il("col","`n-col` must be placed inside `n-row`."),{mergedClsPrefix:t.mergedClsPrefixRef,gutter:t.gutterRef,stylePadding:H(()=>`${ar(t.verticalGutterRef.value,{c:.5})} ${ar(t.horizontalGutterRef.value,{c:.5})}`),mergedPush:H(()=>Number(e.push)-Number(e.pull))}},render(){const{$slots:e,span:t,mergedPush:r,offset:o,stylePadding:n,gutter:i,mergedClsPrefix:a}=this;return v("div",{class:[`${a}-col`,{[`${a}-col--${t}-span`]:!0,[`${a}-col--${r}-push`]:r>0,[`${a}-col--${-r}-pull`]:r<0,[`${a}-col--${o}-offset`]:o}],style:{padding:n}},i?v("div",null,e):e)}});const pd=Object.assign(Object.assign({},hd),ud),nE=sr(pd);var iE=ae({name:"FormItemCol",props:pd,setup(){const e=V(null);return{formItemInstRef:e,validate:(...o)=>{const{value:n}=e;if(n)return n.validate(...o)},restoreValidation:()=>{const{value:o}=e;if(o)return o.restoreValidation()}}},render(){return v(oE,Jt(this.$props,rE),{default:()=>{const e=Jt(this.$props,Xz);return v(Zz,Object.assign({ref:"formItemInstRef"},e),this.$slots)}})}});const aE=Object.assign(Object.assign({},fd),pd);var lE=ae({name:"FormItemRow",props:aE,setup(){const e=V(null);return{formItemColInstRef:e,validate:(...o)=>{const{value:n}=e;if(n)return n.validate(...o)},restoreValidation:()=>{const{value:o}=e;if(o)return o.restoreValidation()}}},render(){return v(tE,Jt(this.$props,eE),{default:()=>{const e=Jt(this.$props,nE);return v(iE,Object.assign(Object.assign({ref:"formItemColInstRef"},e),{span:24}),this.$slots)}})}}),sE=ae({name:"GlobalStyle",setup(){if(typeof document=="undefined")return;const e=me(Fr,null),{body:t}=document,{style:r}=t;let o=!1,n=!0;Nr(()=>{Wt(()=>{var i,a;const{textColor2:l,fontSize:s,fontFamily:d,bodyColor:c,cubicBezierEaseInOut:u,lineHeight:f}=e?un({},((i=e.mergedThemeRef.value)===null||i===void 0?void 0:i.common)||je,(a=e.mergedThemeOverridesRef.value)===null||a===void 0?void 0:a.common):je;if(o||!t.hasAttribute("n-styled")){r.setProperty("-webkit-text-size-adjust","100%"),r.setProperty("-webkit-tap-highlight-color","transparent"),r.padding="0",r.margin="0",r.backgroundColor=c,r.color=l,r.fontSize=s,r.fontFamily=d,r.lineHeight=f;const p=`color .3s ${u}, background-color .3s ${u}`;n?setTimeout(()=>{r.transition=p},0):r.transition=p,t.setAttribute("n-styled",""),o=!0,n=!1}})}),_c(()=>{o&&t.removeAttribute("n-styled")})},render(){return null}});const cE={name:"GradientText",common:le,self(e){const{primaryColor:t,successColor:r,warningColor:o,errorColor:n,infoColor:i,primaryColorSuppl:a,successColorSuppl:l,warningColorSuppl:s,errorColorSuppl:d,infoColorSuppl:c,fontWeightStrong:u}=e;return{fontWeight:u,rotate:"252deg",colorStartPrimary:t,colorEndPrimary:a,colorStartInfo:i,colorEndInfo:c,colorStartWarning:o,colorEndWarning:s,colorStartError:n,colorEndError:d,colorStartSuccess:r,colorEndSuccess:l}}};var dE=cE;const uE=e=>{const{primaryColor:t,baseColor:r}=e;return{color:t,iconColor:r}},fE={name:"IconWrapper",common:le,self:uE};var hE=fE;const vd=Object.assign(Object.assign({},Ee.props),{showToolbar:{type:Boolean,default:!0},showToolbarTooltip:Boolean}),Zg="n-image";function pE(){return{toolbarIconColor:"rgba(255, 255, 255, .9)",toolbarColor:"rgba(0, 0, 0, .35)",toolbarBoxShadow:"none",toolbarBorderRadius:"24px"}}const vE={name:"Image",common:je,peers:{Tooltip:ld},self:pE};var mE={closeMargin:"16px 12px",closeSize:"20px",closeIconSize:"16px",width:"365px",padding:"16px",titleFontSize:"16px",metaFontSize:"12px",descriptionFontSize:"12px"};const gE=e=>{const{textColor2:t,successColor:r,infoColor:o,warningColor:n,errorColor:i,popoverColor:a,closeIconColor:l,closeIconColorHover:s,closeIconColorPressed:d,closeColorHover:c,closeColorPressed:u,textColor1:f,textColor3:p,borderRadius:h,fontWeightStrong:g,boxShadow2:b,lineHeight:m,fontSize:y}=e;return Object.assign(Object.assign({},mE),{borderRadius:h,lineHeight:m,fontSize:y,headerFontWeight:g,iconColor:t,iconColorSuccess:r,iconColorInfo:o,iconColorWarning:n,iconColorError:i,color:a,textColor:t,closeIconColor:l,closeIconColorHover:s,closeIconColorPressed:d,closeBorderRadius:h,closeColorHover:c,closeColorPressed:u,headerTextColor:f,descriptionTextColor:p,actionTextColor:t,boxShadow:b})},bE={name:"Notification",common:le,peers:{Scrollbar:Ut},self:gE};var xE=bE,CE={margin:"0 0 8px 0",padding:"10px 20px",maxWidth:"720px",minWidth:"420px",iconMargin:"0 10px 0 0",closeMargin:"0 0 0 10px",closeSize:"20px",closeIconSize:"16px",iconSize:"20px",fontSize:"14px"};const Jg=e=>{const{textColor2:t,closeIconColor:r,closeIconColorHover:o,closeIconColorPressed:n,infoColor:i,successColor:a,errorColor:l,warningColor:s,popoverColor:d,boxShadow2:c,primaryColor:u,lineHeight:f,borderRadius:p,closeColorHover:h,closeColorPressed:g}=e;return Object.assign(Object.assign({},CE),{closeBorderRadius:p,textColor:t,textColorInfo:t,textColorSuccess:t,textColorError:t,textColorWarning:t,textColorLoading:t,color:d,colorInfo:d,colorSuccess:d,colorError:d,colorWarning:d,colorLoading:d,boxShadow:c,boxShadowInfo:c,boxShadowSuccess:c,boxShadowError:c,boxShadowWarning:c,boxShadowLoading:c,iconColor:t,iconColorInfo:i,iconColorSuccess:a,iconColorWarning:s,iconColorError:l,iconColorLoading:u,closeColorHover:h,closeColorPressed:g,closeIconColor:r,closeIconColorHover:o,closeIconColorPressed:n,closeColorHoverInfo:h,closeColorPressedInfo:g,closeIconColorInfo:r,closeIconColorHoverInfo:o,closeIconColorPressedInfo:n,closeColorHoverSuccess:h,closeColorPressedSuccess:g,closeIconColorSuccess:r,closeIconColorHoverSuccess:o,closeIconColorPressedSuccess:n,closeColorHoverError:h,closeColorPressedError:g,closeIconColorError:r,closeIconColorHoverError:o,closeIconColorPressedError:n,closeColorHoverWarning:h,closeColorPressedWarning:g,closeIconColorWarning:r,closeIconColorHoverWarning:o,closeIconColorPressedWarning:n,closeColorHoverLoading:h,closeColorPressedLoading:g,closeIconColorLoading:r,closeIconColorHoverLoading:o,closeIconColorPressedLoading:n,loadingColor:u,lineHeight:f,borderRadius:p})},yE={name:"Message",common:je,self:Jg};var wE=yE;const SE={name:"Message",common:le,self:Jg};var $E=SE;const _E={name:"ButtonGroup",common:le};var PE=_E;const kE={name:"InputNumber",common:le,peers:{Button:Kt,Input:ur},self(e){const{textColorDisabled:t}=e;return{iconColorDisabled:t}}};var TE=kE;const zE={name:"Layout",common:le,peers:{Scrollbar:Ut},self(e){const{textColor2:t,bodyColor:r,popoverColor:o,cardColor:n,dividerColor:i,scrollbarColor:a,scrollbarColorHover:l}=e;return{textColor:t,textColorInverted:t,color:r,colorEmbedded:r,headerColor:n,headerColorInverted:n,footerColor:n,footerColorInverted:n,headerBorderColor:i,headerBorderColorInverted:i,footerBorderColor:i,footerBorderColorInverted:i,siderBorderColor:i,siderBorderColorInverted:i,siderColor:n,siderColorInverted:n,siderToggleButtonBorder:"1px solid transparent",siderToggleButtonColor:o,siderToggleButtonIconColor:t,siderToggleButtonIconColorInverted:t,siderToggleBarColor:xe(r,a),siderToggleBarColorHover:xe(r,l),__invertScrollbar:"false"}}};var EE=zE;const Qg=e=>{const{textColor2:t,cardColor:r,modalColor:o,popoverColor:n,dividerColor:i,borderRadius:a,fontSize:l,hoverColor:s}=e;return{textColor:t,color:r,colorHover:s,colorModal:o,colorHoverModal:xe(o,s),colorPopover:n,colorHoverPopover:xe(n,s),borderColor:i,borderColorModal:xe(o,i),borderColorPopover:xe(n,i),borderRadius:a,fontSize:l}},RE={name:"List",common:je,self:Qg};var UM=RE;const IE={name:"List",common:le,self:Qg};var OE=IE;const AE={name:"LoadingBar",common:le,self(e){const{primaryColor:t}=e;return{colorError:"red",colorLoading:t,height:"2px"}}};var ME=AE;const BE={name:"Log",common:le,peers:{Scrollbar:Ut,Code:gg},self(e){const{textColor2:t,inputColor:r,fontSize:o,primaryColor:n}=e;return{loaderFontSize:o,loaderTextColor:t,loaderColor:r,loaderBorder:"1px solid #0000",loadingColor:n}}};var LE=BE;const HE={name:"Mention",common:le,peers:{InternalSelectMenu:Ni,Input:ur},self(e){const{boxShadow2:t}=e;return{menuBoxShadow:t}}};var DE=HE;function FE(e,t,r,o){return{itemColorHoverInverted:"#0000",itemColorActiveInverted:t,itemColorActiveHoverInverted:t,itemColorActiveCollapsedInverted:t,itemTextColorInverted:e,itemTextColorHoverInverted:r,itemTextColorChildActiveInverted:r,itemTextColorChildActiveHoverInverted:r,itemTextColorActiveInverted:r,itemTextColorActiveHoverInverted:r,itemTextColorHorizontalInverted:e,itemTextColorHoverHorizontalInverted:r,itemTextColorChildActiveHorizontalInverted:r,itemTextColorChildActiveHoverHorizontalInverted:r,itemTextColorActiveHorizontalInverted:r,itemTextColorActiveHoverHorizontalInverted:r,itemIconColorInverted:e,itemIconColorHoverInverted:r,itemIconColorActiveInverted:r,itemIconColorActiveHoverInverted:r,itemIconColorChildActiveInverted:r,itemIconColorChildActiveHoverInverted:r,itemIconColorCollapsedInverted:e,itemIconColorHorizontalInverted:e,itemIconColorHoverHorizontalInverted:r,itemIconColorActiveHorizontalInverted:r,itemIconColorActiveHoverHorizontalInverted:r,itemIconColorChildActiveHorizontalInverted:r,itemIconColorChildActiveHoverHorizontalInverted:r,arrowColorInverted:e,arrowColorHoverInverted:r,arrowColorActiveInverted:r,arrowColorActiveHoverInverted:r,arrowColorChildActiveInverted:r,arrowColorChildActiveHoverInverted:r,groupTextColorInverted:o}}const eb=e=>{const{borderRadius:t,textColor3:r,primaryColor:o,textColor2:n,textColor1:i,fontSize:a,dividerColor:l,hoverColor:s,primaryColorHover:d}=e;return Object.assign({borderRadius:t,color:"#0000",groupTextColor:r,itemColorHover:s,itemColorActive:oe(o,{alpha:.1}),itemColorActiveHover:oe(o,{alpha:.1}),itemColorActiveCollapsed:oe(o,{alpha:.1}),itemTextColor:n,itemTextColorHover:n,itemTextColorActive:o,itemTextColorActiveHover:o,itemTextColorChildActive:o,itemTextColorChildActiveHover:o,itemTextColorHorizontal:n,itemTextColorHoverHorizontal:d,itemTextColorActiveHorizontal:o,itemTextColorActiveHoverHorizontal:o,itemTextColorChildActiveHorizontal:o,itemTextColorChildActiveHoverHorizontal:o,itemIconColor:i,itemIconColorHover:i,itemIconColorActive:o,itemIconColorActiveHover:o,itemIconColorChildActive:o,itemIconColorChildActiveHover:o,itemIconColorCollapsed:i,itemIconColorHorizontal:i,itemIconColorHoverHorizontal:d,itemIconColorActiveHorizontal:o,itemIconColorActiveHoverHorizontal:o,itemIconColorChildActiveHorizontal:o,itemIconColorChildActiveHoverHorizontal:o,itemHeight:"42px",arrowColor:n,arrowColorHover:n,arrowColorActive:o,arrowColorActiveHover:o,arrowColorChildActive:o,arrowColorChildActiveHover:o,colorInverted:"#0000",borderColorHorizontal:"#0000",fontSize:a,dividerColor:l},FE("#BBB",o,"#FFF","#AAA"))},jE={name:"Menu",common:je,peers:{Tooltip:ld,Dropdown:kg},self:eb};var NE=jE;const WE={name:"Menu",common:le,peers:{Tooltip:Cl,Dropdown:sd},self(e){const{primaryColor:t,primaryColorSuppl:r}=e,o=eb(e);return o.itemColorActive=oe(t,{alpha:.15}),o.itemColorActiveHover=oe(t,{alpha:.15}),o.itemColorActiveCollapsed=oe(t,{alpha:.15}),o.itemColorActiveInverted=r,o.itemColorActiveHoverInverted=r,o.itemColorActiveCollapsedInverted=r,o}};var VE=WE,UE={titleFontSize:"18px",backSize:"22px"};function KE(e){const{textColor1:t,textColor2:r,textColor3:o,fontSize:n,fontWeightStrong:i,primaryColorHover:a,primaryColorPressed:l}=e;return Object.assign(Object.assign({},UE),{titleFontWeight:i,fontSize:n,titleTextColor:t,backColor:r,backColorHover:a,backColorPressed:l,subtitleTextColor:o})}const qE={name:"PageHeader",common:le,self:KE};var GE={iconSize:"22px"};const tb=e=>{const{fontSize:t,warningColor:r}=e;return Object.assign(Object.assign({},GE),{fontSize:t,iconColor:r})},KM={name:"Popconfirm",common:je,peers:{Button:xl,Popover:jn},self:tb},YE={name:"Popconfirm",common:le,peers:{Button:Kt,Popover:Uo},self:tb};var XE=YE;const rb=e=>{const{infoColor:t,successColor:r,warningColor:o,errorColor:n,textColor2:i,progressRailColor:a,fontSize:l,fontWeight:s}=e;return{fontSize:l,fontSizeCircle:"28px",fontWeightCircle:s,railColor:a,railHeight:"8px",iconSizeCircle:"36px",iconSizeLine:"18px",iconColor:t,iconColorInfo:t,iconColorSuccess:r,iconColorWarning:o,iconColorError:n,textColorCircle:i,textColorLineInner:"rgb(255, 255, 255)",textColorLineOuter:i,fillColor:t,fillColorInfo:t,fillColorSuccess:r,fillColorWarning:o,fillColorError:n,lineBgProcessing:"linear-gradient(90deg, rgba(255, 255, 255, .3) 0%, rgba(255, 255, 255, .5) 100%)"}},ZE={name:"Progress",common:je,self:rb};var JE=ZE;const QE={name:"Progress",common:le,self(e){const t=rb(e);return t.textColorLineInner="rgb(0, 0, 0)",t.lineBgProcessing="linear-gradient(90deg, rgba(255, 255, 255, .3) 0%, rgba(255, 255, 255, .5) 100%)",t}};var ob=QE;const eR={name:"Rate",common:le,self(e){const{railColor:t}=e;return{itemColor:t,itemColorActive:"#CCAA33",itemSize:"20px",sizeSmall:"16px",sizeMedium:"20px",sizeLarge:"24px"}}};var tR=eR,rR={titleFontSizeSmall:"26px",titleFontSizeMedium:"32px",titleFontSizeLarge:"40px",titleFontSizeHuge:"48px",fontSizeSmall:"14px",fontSizeMedium:"14px",fontSizeLarge:"15px",fontSizeHuge:"16px",iconSizeSmall:"64px",iconSizeMedium:"80px",iconSizeLarge:"100px",iconSizeHuge:"125px",iconColor418:void 0,iconColor404:void 0,iconColor403:void 0,iconColor500:void 0};const nb=e=>{const{textColor2:t,textColor1:r,errorColor:o,successColor:n,infoColor:i,warningColor:a,lineHeight:l,fontWeightStrong:s}=e;return Object.assign(Object.assign({},rR),{lineHeight:l,titleFontWeight:s,titleTextColor:r,textColor:t,iconColorError:o,iconColorSuccess:n,iconColorInfo:i,iconColorWarning:a})},oR={name:"Result",common:je,self:nb};var qM=oR;const nR={name:"Result",common:le,self:nb};var iR=nR,aR={railHeight:"4px",railWidthVertical:"4px",handleSize:"18px",dotHeight:"8px",dotWidth:"8px",dotBorderRadius:"4px"};const lR={name:"Slider",common:le,self(e){const t="0 2px 8px 0 rgba(0, 0, 0, 0.12)",{railColor:r,modalColor:o,primaryColorSuppl:n,popoverColor:i,textColor2:a,cardColor:l,borderRadius:s,fontSize:d,opacityDisabled:c}=e;return Object.assign(Object.assign({},aR),{fontSize:d,markFontSize:d,railColor:r,railColorHover:r,fillColor:n,fillColorHover:n,opacityDisabled:c,handleColor:"#FFF",dotColor:l,dotColorModal:o,dotColorPopover:i,handleBoxShadow:"0px 2px 4px 0 rgba(0, 0, 0, 0.4)",handleBoxShadowHover:"0px 2px 4px 0 rgba(0, 0, 0, 0.4)",handleBoxShadowActive:"0px 2px 4px 0 rgba(0, 0, 0, 0.4)",handleBoxShadowFocus:"0px 2px 4px 0 rgba(0, 0, 0, 0.4)",indicatorColor:i,indicatorBoxShadow:t,indicatorTextColor:a,indicatorBorderRadius:s,dotBorder:`2px solid ${r}`,dotBorderActive:`2px solid ${n}`,dotBoxShadow:""})}};var sR=lR;const ib=e=>{const{opacityDisabled:t,heightTiny:r,heightSmall:o,heightMedium:n,heightLarge:i,heightHuge:a,primaryColor:l,fontSize:s}=e;return{fontSize:s,textColor:l,sizeTiny:r,sizeSmall:o,sizeMedium:n,sizeLarge:i,sizeHuge:a,color:l,opacitySpinning:t}},cR={name:"Spin",common:je,self:ib};var dR=cR;const uR={name:"Spin",common:le,self:ib};var fR=uR;const ab=e=>{const{textColor2:t,textColor3:r,fontSize:o,fontWeight:n}=e;return{labelFontSize:o,labelFontWeight:n,valueFontWeight:n,valueFontSize:"24px",labelTextColor:r,valuePrefixTextColor:t,valueSuffixTextColor:t,valueTextColor:t}},hR={name:"Statistic",common:je,self:ab};var GM=hR;const pR={name:"Statistic",common:le,self:ab};var vR=pR,mR={stepHeaderFontSizeSmall:"14px",stepHeaderFontSizeMedium:"16px",indicatorIndexFontSizeSmall:"14px",indicatorIndexFontSizeMedium:"16px",indicatorSizeSmall:"22px",indicatorSizeMedium:"28px",indicatorIconSizeSmall:"14px",indicatorIconSizeMedium:"18px"};const gR=e=>{const{fontWeightStrong:t,baseColor:r,textColorDisabled:o,primaryColor:n,errorColor:i,textColor1:a,textColor2:l}=e;return Object.assign(Object.assign({},mR),{stepHeaderFontWeight:t,indicatorTextColorProcess:r,indicatorTextColorWait:o,indicatorTextColorFinish:n,indicatorTextColorError:i,indicatorBorderColorProcess:n,indicatorBorderColorWait:o,indicatorBorderColorFinish:n,indicatorBorderColorError:i,indicatorColorProcess:n,indicatorColorWait:"#0000",indicatorColorFinish:"#0000",indicatorColorError:"#0000",splitorColorProcess:o,splitorColorWait:o,splitorColorFinish:n,splitorColorError:o,headerTextColorProcess:a,headerTextColorWait:o,headerTextColorFinish:o,headerTextColorError:i,descriptionTextColorProcess:l,descriptionTextColorWait:o,descriptionTextColorFinish:o,descriptionTextColorError:i})},bR={name:"Steps",common:le,self:gR};var xR=bR,CR={buttonHeightSmall:"14px",buttonHeightMedium:"18px",buttonHeightLarge:"22px",buttonWidthSmall:"14px",buttonWidthMedium:"18px",buttonWidthLarge:"22px",buttonWidthPressedSmall:"20px",buttonWidthPressedMedium:"24px",buttonWidthPressedLarge:"28px",railHeightSmall:"18px",railHeightMedium:"22px",railHeightLarge:"26px",railWidthSmall:"32px",railWidthMedium:"40px",railWidthLarge:"48px"};const yR={name:"Switch",common:le,self(e){const{primaryColorSuppl:t,opacityDisabled:r,borderRadius:o,primaryColor:n,textColor2:i,baseColor:a}=e,l="rgba(255, 255, 255, .20)";return Object.assign(Object.assign({},CR),{iconColor:a,textColor:i,loadingColor:t,opacityDisabled:r,railColor:l,railColorActive:t,buttonBoxShadow:"0px 2px 4px 0 rgba(0, 0, 0, 0.4)",buttonColor:"#FFF",railBorderRadiusSmall:o,railBorderRadiusMedium:o,railBorderRadiusLarge:o,buttonBorderRadiusSmall:o,buttonBorderRadiusMedium:o,buttonBorderRadiusLarge:o,boxShadowFocus:`0 0 8px 0 ${oe(n,{alpha:.3})}`})}};var wR=yR,SR={thPaddingSmall:"6px",thPaddingMedium:"12px",thPaddingLarge:"12px",tdPaddingSmall:"6px",tdPaddingMedium:"12px",tdPaddingLarge:"12px"};const $R=e=>{const{dividerColor:t,cardColor:r,modalColor:o,popoverColor:n,tableHeaderColor:i,tableColorStriped:a,textColor1:l,textColor2:s,borderRadius:d,fontWeightStrong:c,lineHeight:u,fontSizeSmall:f,fontSizeMedium:p,fontSizeLarge:h}=e;return Object.assign(Object.assign({},SR),{fontSizeSmall:f,fontSizeMedium:p,fontSizeLarge:h,lineHeight:u,borderRadius:d,borderColor:xe(r,t),borderColorModal:xe(o,t),borderColorPopover:xe(n,t),tdColor:r,tdColorModal:o,tdColorPopover:n,tdColorStriped:xe(r,a),tdColorStripedModal:xe(o,a),tdColorStripedPopover:xe(n,a),thColor:xe(r,i),thColorModal:xe(o,i),thColorPopover:xe(n,i),thTextColor:l,tdTextColor:s,thFontWeight:c})},_R={name:"Table",common:le,self:$R};var PR=_R,kR={tabFontSizeSmall:"14px",tabFontSizeMedium:"14px",tabFontSizeLarge:"16px",tabGapSmallLine:"36px",tabGapMediumLine:"36px",tabGapLargeLine:"36px",tabPaddingSmallLine:"6px 0",tabPaddingMediumLine:"10px 0",tabPaddingLargeLine:"14px 0",tabPaddingVerticalSmallLine:"0 6px",tabPaddingVerticalMediumLine:"0 10px",tabPaddingVerticalLargeLine:"0 14px",tabGapSmallBar:"36px",tabGapMediumBar:"36px",tabGapLargeBar:"36px",tabPaddingSmallBar:"4px 0",tabPaddingMediumBar:"6px 0",tabPaddingLargeBar:"10px 0",tabPaddingVerticalSmallBar:"0 4px",tabPaddingVerticalMediumBar:"0 6px ",tabPaddingVerticalLargeBar:"0 10px ",tabGapSmallCard:"4px",tabGapMediumCard:"4px",tabGapLargeCard:"4px",tabPaddingSmallCard:"6px 10px",tabPaddingMediumCard:"8px 12px",tabPaddingLargeCard:"8px 16px",tabPaddingSmallSegment:"4px 0",tabPaddingMediumSegment:"6px 0",tabPaddingLargeSegment:"8px 0",tabPaddingVerticalLargeSegment:"0 8px",tabPaddingVerticalSmallCard:"10px 6px",tabPaddingVerticalMediumCard:"12px 8px",tabPaddingVerticalLargeCard:"16px 8px",tabPaddingVerticalSmallSegment:"0 4px",tabPaddingVerticalMediumSegment:"0 6px",tabGapSmallSegment:"0",tabGapMediumSegment:"0",tabGapLargeSegment:"0",panePaddingSmall:"8px 0 0 0",panePaddingMedium:"12px 0 0 0",panePaddingLarge:"16px 0 0 0",closeSize:"18px",closeIconSize:"14px"};const lb=e=>{const{textColor2:t,primaryColor:r,textColorDisabled:o,closeIconColor:n,closeIconColorHover:i,closeIconColorPressed:a,closeColorHover:l,closeColorPressed:s,tabColor:d,baseColor:c,dividerColor:u,fontWeight:f,textColor1:p,borderRadius:h,fontSize:g,fontWeightStrong:b}=e;return Object.assign(Object.assign({},kR),{colorSegment:d,tabFontSizeCard:g,tabTextColorLine:p,tabTextColorActiveLine:r,tabTextColorHoverLine:r,tabTextColorDisabledLine:o,tabTextColorSegment:p,tabTextColorActiveSegment:t,tabTextColorHoverSegment:t,tabTextColorDisabledSegment:o,tabTextColorBar:p,tabTextColorActiveBar:r,tabTextColorHoverBar:r,tabTextColorDisabledBar:o,tabTextColorCard:p,tabTextColorHoverCard:p,tabTextColorActiveCard:r,tabTextColorDisabledCard:o,barColor:r,closeIconColor:n,closeIconColorHover:i,closeIconColorPressed:a,closeColorHover:l,closeColorPressed:s,closeBorderRadius:h,tabColor:d,tabColorSegment:c,tabBorderColor:u,tabFontWeightActive:f,tabFontWeight:f,tabBorderRadius:h,paneTextColor:t,fontWeightStrong:b})},TR={name:"Tabs",common:je,self:lb};var zR=TR;const ER={name:"Tabs",common:le,self(e){const t=lb(e),{inputColor:r}=e;return t.colorSegment=r,t.tabColorSegment=r,t}};var RR=ER;const sb=e=>{const{textColor1:t,textColor2:r,fontWeightStrong:o,fontSize:n}=e;return{fontSize:n,titleTextColor:t,textColor:r,titleFontWeight:o}},IR={name:"Thing",common:je,self:sb};var YM=IR;const OR={name:"Thing",common:le,self:sb};var AR=OR,MR={titleMarginMedium:"0 0 6px 0",titleMarginLarge:"-2px 0 6px 0",titleFontSizeMedium:"14px",titleFontSizeLarge:"16px",iconSizeMedium:"14px",iconSizeLarge:"14px"};const BR={name:"Timeline",common:le,self(e){const{textColor3:t,infoColorSuppl:r,errorColorSuppl:o,successColorSuppl:n,warningColorSuppl:i,textColor1:a,textColor2:l,railColor:s,fontWeightStrong:d,fontSize:c}=e;return Object.assign(Object.assign({},MR),{contentFontSize:c,titleFontWeight:d,circleBorder:`2px solid ${t}`,circleBorderInfo:`2px solid ${r}`,circleBorderError:`2px solid ${o}`,circleBorderSuccess:`2px solid ${n}`,circleBorderWarning:`2px solid ${i}`,iconColor:t,iconColorInfo:r,iconColorError:o,iconColorSuccess:n,iconColorWarning:i,titleTextColor:a,contentTextColor:l,metaTextColor:t,lineColor:s})}};var LR=BR,HR={extraFontSizeSmall:"12px",extraFontSizeMedium:"12px",extraFontSizeLarge:"14px",titleFontSizeSmall:"14px",titleFontSizeMedium:"16px",titleFontSizeLarge:"16px",closeSize:"20px",closeIconSize:"16px",headerHeightSmall:"44px",headerHeightMedium:"44px",headerHeightLarge:"50px"};const DR={name:"Transfer",common:le,peers:{Checkbox:Nn,Scrollbar:Ut,Input:ur,Empty:Vo,Button:Kt},self(e){const{fontWeight:t,fontSizeLarge:r,fontSizeMedium:o,fontSizeSmall:n,heightLarge:i,heightMedium:a,borderRadius:l,inputColor:s,tableHeaderColor:d,textColor1:c,textColorDisabled:u,textColor2:f,textColor3:p,hoverColor:h,closeColorHover:g,closeColorPressed:b,closeIconColor:m,closeIconColorHover:y,closeIconColorPressed:w,dividerColor:x}=e;return Object.assign(Object.assign({},HR),{itemHeightSmall:a,itemHeightMedium:a,itemHeightLarge:i,fontSizeSmall:n,fontSizeMedium:o,fontSizeLarge:r,borderRadius:l,dividerColor:x,borderColor:"#0000",listColor:s,headerColor:d,titleTextColor:c,titleTextColorDisabled:u,extraTextColor:p,extraTextColorDisabled:u,itemTextColor:f,itemTextColorDisabled:u,itemColorPending:h,titleFontWeight:t,closeColorHover:g,closeColorPressed:b,closeIconColor:m,closeIconColorHover:y,closeIconColorPressed:w})}};var FR=DR;const jR=e=>{const{borderRadiusSmall:t,hoverColor:r,pressedColor:o,primaryColor:n,textColor3:i,textColor2:a,textColorDisabled:l,fontSize:s}=e;return{fontSize:s,nodeBorderRadius:t,nodeColorHover:r,nodeColorPressed:o,nodeColorActive:oe(n,{alpha:.1}),arrowColor:i,nodeTextColor:a,nodeTextColorDisabled:l,loadingColor:n,dropMarkColor:n}},NR={name:"Tree",common:le,peers:{Checkbox:Nn,Scrollbar:Ut,Empty:Vo},self(e){const{primaryColor:t}=e,r=jR(e);return r.nodeColorActive=oe(t,{alpha:.15}),r}};var cb=NR;const WR={name:"TreeSelect",common:le,peers:{Tree:cb,Empty:Vo,InternalSelection:nd}};var VR=WR,UR={headerFontSize1:"30px",headerFontSize2:"22px",headerFontSize3:"18px",headerFontSize4:"16px",headerFontSize5:"16px",headerFontSize6:"16px",headerMargin1:"28px 0 20px 0",headerMargin2:"28px 0 20px 0",headerMargin3:"28px 0 20px 0",headerMargin4:"28px 0 18px 0",headerMargin5:"28px 0 18px 0",headerMargin6:"28px 0 18px 0",headerPrefixWidth1:"16px",headerPrefixWidth2:"16px",headerPrefixWidth3:"12px",headerPrefixWidth4:"12px",headerPrefixWidth5:"12px",headerPrefixWidth6:"12px",headerBarWidth1:"4px",headerBarWidth2:"4px",headerBarWidth3:"3px",headerBarWidth4:"3px",headerBarWidth5:"3px",headerBarWidth6:"3px",pMargin:"16px 0 16px 0",liMargin:".25em 0 0 0",olPadding:"0 0 0 2em",ulPadding:"0 0 0 2em"};const KR=e=>{const{primaryColor:t,textColor2:r,borderColor:o,lineHeight:n,fontSize:i,borderRadiusSmall:a,dividerColor:l,fontWeightStrong:s,textColor1:d,textColor3:c,infoColor:u,warningColor:f,errorColor:p,successColor:h,codeColor:g}=e;return Object.assign(Object.assign({},UR),{aTextColor:t,blockquoteTextColor:r,blockquotePrefixColor:o,blockquoteLineHeight:n,blockquoteFontSize:i,codeBorderRadius:a,liTextColor:r,liLineHeight:n,liFontSize:i,hrColor:l,headerFontWeight:s,headerTextColor:d,pTextColor:r,pTextColor1Depth:d,pTextColor2Depth:r,pTextColor3Depth:c,pLineHeight:n,pFontSize:i,headerBarColor:t,headerBarColorPrimary:t,headerBarColorInfo:u,headerBarColorError:p,headerBarColorWarning:f,headerBarColorSuccess:h,textColor:r,textColor1Depth:d,textColor2Depth:r,textColor3Depth:c,textColorPrimary:t,textColorInfo:u,textColorSuccess:h,textColorWarning:f,textColorError:p,codeTextColor:r,codeColor:g,codeBorder:"1px solid #0000"})},qR={name:"Typography",common:le,self:KR};var GR=qR;const db=e=>{const{iconColor:t,primaryColor:r,errorColor:o,textColor2:n,successColor:i,opacityDisabled:a,actionColor:l,borderColor:s,hoverColor:d,lineHeight:c,borderRadius:u,fontSize:f}=e;return{fontSize:f,lineHeight:c,borderRadius:u,draggerColor:l,draggerBorder:`1px dashed ${s}`,draggerBorderHover:`1px dashed ${r}`,itemColorHover:d,itemColorHoverError:oe(o,{alpha:.06}),itemTextColor:n,itemTextColorError:o,itemTextColorSuccess:i,itemIconColor:t,itemDisabledOpacity:a,itemBorderImageCardError:`1px solid ${o}`,itemBorderImageCard:`1px solid ${s}`}},YR={name:"Upload",common:je,peers:{Button:xl,Progress:JE},self:db};var XM=YR;const XR={name:"Upload",common:le,peers:{Button:Kt,Progress:ob},self(e){const{errorColor:t}=e,r=db(e);return r.itemColorHoverError=oe(t,{alpha:.09}),r}};var ZR=XR;const JR={name:"Watermark",common:le,self(e){const{fontFamily:t}=e;return{fontFamily:t}}};var QR=JR;const eI={name:"Row",common:le};var tI=eI;const rI={name:"Image",common:le,peers:{Tooltip:Cl},self:e=>{const{textColor2:t}=e;return{toolbarIconColor:t,toolbarColor:"rgba(0, 0, 0, .35)",toolbarBoxShadow:"none",toolbarBorderRadius:"24px"}}},oI=v("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},v("path",{d:"M6 5C5.75454 5 5.55039 5.17688 5.50806 5.41012L5.5 5.5V14.5C5.5 14.7761 5.72386 15 6 15C6.24546 15 6.44961 14.8231 6.49194 14.5899L6.5 14.5V5.5C6.5 5.22386 6.27614 5 6 5ZM13.8536 5.14645C13.68 4.97288 13.4106 4.9536 13.2157 5.08859L13.1464 5.14645L8.64645 9.64645C8.47288 9.82001 8.4536 10.0894 8.58859 10.2843L8.64645 10.3536L13.1464 14.8536C13.3417 15.0488 13.6583 15.0488 13.8536 14.8536C14.0271 14.68 14.0464 14.4106 13.9114 14.2157L13.8536 14.1464L9.70711 10L13.8536 5.85355C14.0488 5.65829 14.0488 5.34171 13.8536 5.14645Z",fill:"currentColor"})),nI=v("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},v("path",{d:"M13.5 5C13.7455 5 13.9496 5.17688 13.9919 5.41012L14 5.5V14.5C14 14.7761 13.7761 15 13.5 15C13.2545 15 13.0504 14.8231 13.0081 14.5899L13 14.5V5.5C13 5.22386 13.2239 5 13.5 5ZM5.64645 5.14645C5.82001 4.97288 6.08944 4.9536 6.28431 5.08859L6.35355 5.14645L10.8536 9.64645C11.0271 9.82001 11.0464 10.0894 10.9114 10.2843L10.8536 10.3536L6.35355 14.8536C6.15829 15.0488 5.84171 15.0488 5.64645 14.8536C5.47288 14.68 5.4536 14.4106 5.58859 14.2157L5.64645 14.1464L9.79289 10L5.64645 5.85355C5.45118 5.65829 5.45118 5.34171 5.64645 5.14645Z",fill:"currentColor"})),iI=v("svg",{viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},v("path",{d:"M4.089 4.216l.057-.07a.5.5 0 0 1 .638-.057l.07.057L10 9.293l5.146-5.147a.5.5 0 0 1 .638-.057l.07.057a.5.5 0 0 1 .057.638l-.057.07L10.707 10l5.147 5.146a.5.5 0 0 1 .057.638l-.057.07a.5.5 0 0 1-.638.057l-.07-.057L10 10.707l-5.146 5.147a.5.5 0 0 1-.638.057l-.07-.057a.5.5 0 0 1-.057-.638l.057-.07L9.293 10L4.146 4.854a.5.5 0 0 1-.057-.638l.057-.07l-.057.07z",fill:"currentColor"}));var aI=O([O("body >",[M("image-container","position: fixed;")]),M("image-preview-container",` + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + display: flex; + `),M("image-preview-overlay",` + z-index: -1; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + background: rgba(0, 0, 0, .3); + `,[Ai()]),M("image-preview-toolbar",` + z-index: 1; + position: absolute; + left: 50%; + transform: translateX(-50%); + border-radius: var(--n-toolbar-border-radius); + height: 48px; + bottom: 40px; + padding: 0 12px; + background: var(--n-toolbar-color); + box-shadow: var(--n-toolbar-box-shadow); + color: var(--n-toolbar-icon-color); + transition: color .3s var(--n-bezier); + display: flex; + align-items: center; + `,[M("base-icon",` + padding: 0 8px; + font-size: 28px; + cursor: pointer; + `),Ai()]),M("image-preview-wrapper",` + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + display: flex; + pointer-events: none; + `,[Mi()]),M("image-preview",` + user-select: none; + -webkit-user-select: none; + pointer-events: all; + margin: auto; + max-height: calc(100vh - 32px); + max-width: calc(100vw - 32px); + transition: transform .3s var(--n-bezier); + `),M("image",` + display: inline-flex; + max-height: 100%; + max-width: 100%; + `,[ut("preview-disabled",` + cursor: pointer; + `),O("img",` + border-radius: inherit; + `)])]);const fa=32;var ub=ae({name:"ImagePreview",props:Object.assign(Object.assign({},vd),{onNext:Function,onPrev:Function,clsPrefix:{type:String,required:!0}}),setup(e){const t=Ee("Image","-image",aI,vE,e,Te(e,"clsPrefix"));let r=null;const o=V(null),n=V(null),i=V(void 0),a=V(!1),l=V(!1),{localeRef:s}=Em("Image");function d(){const{value:C}=n;if(!r||!C)return;const{style:P}=C,I=r.getBoundingClientRect(),W=I.left+I.width/2,z=I.top+I.height/2;P.transformOrigin=`${W}px ${z}px`}function c(C){var P,I;switch(C.key){case" ":C.preventDefault();break;case"ArrowLeft":(P=e.onPrev)===null||P===void 0||P.call(e);break;case"ArrowRight":(I=e.onNext)===null||I===void 0||I.call(e);break;case"Escape":U();break}}De(a,C=>{C?Qe("keydown",document,c):Ue("keydown",document,c)}),ht(()=>{Ue("keydown",document,c)});let u=0,f=0,p=0,h=0,g=0,b=0,m=0,y=0,w=!1;function x(C){const{clientX:P,clientY:I}=C;p=P-u,h=I-f,iv(Le)}function k(C){const{mouseUpClientX:P,mouseUpClientY:I,mouseDownClientX:W,mouseDownClientY:z}=C,L=W-P,Y=z-I,q=`vertical${Y>0?"Top":"Bottom"}`,J=`horizontal${L>0?"Left":"Right"}`;return{moveVerticalDirection:q,moveHorizontalDirection:J,deltaHorizontal:L,deltaVertical:Y}}function T(C){const{value:P}=o;if(!P)return{offsetX:0,offsetY:0};const I=P.getBoundingClientRect(),{moveVerticalDirection:W,moveHorizontalDirection:z,deltaHorizontal:L,deltaVertical:Y}=C||{};let q=0,J=0;return I.width<=window.innerWidth?q=0:I.left>0?q=(I.width-window.innerWidth)/2:I.right0?J=(I.height-window.innerHeight)/2:I.bottom.5){const C=F;E-=1,F=Math.max(.5,Math.pow(N,E));const P=C-F;Le(!1);const I=T();F+=P,Le(!1),F-=P,p=I.offsetX,h=I.offsetY,Le()}}function Le(C=!0){var P;const{value:I}=o;if(!I)return;const{style:W}=I,z=Fa((P=$==null?void 0:$.previewedImgPropsRef.value)===null||P===void 0?void 0:P.style);let L="";if(typeof z=="string")L=z+";";else for(const q in z)L+=`${y3(q)}: ${z[q]};`;const Y=`transform-origin: center; transform: translateX(${p}px) translateY(${h}px) rotate(${j}deg) scale(${F});`;w?W.cssText=L+"cursor: grabbing; transition: none;"+Y:W.cssText=L+"cursor: grab;"+Y+(C?"":"transition: none;"),C||I.offsetHeight}function U(){a.value=!a.value,l.value=!0}function ee(){F=$e(),E=Math.ceil(Math.log(F)/Math.log(N)),p=0,h=0,Le()}const G={setPreviewSrc:C=>{i.value=C},setThumbnailEl:C=>{r=C},toggleShow:U};function se(C,P){if(e.showToolbarTooltip){const{value:I}=t;return v(Tg,{to:!1,theme:I.peers.Tooltip,themeOverrides:I.peerOverrides.Tooltip,keepAliveOnHover:!1},{default:()=>s.value[P],trigger:()=>C})}else return C}const ce=H(()=>{const{common:{cubicBezierEaseInOut:C},self:{toolbarIconColor:P,toolbarBorderRadius:I,toolbarBoxShadow:W,toolbarColor:z}}=t.value;return{"--n-bezier":C,"--n-toolbar-icon-color":P,"--n-toolbar-color":z,"--n-toolbar-border-radius":I,"--n-toolbar-box-shadow":W}}),{inlineThemeDisabled:Re}=st(),ge=Re?Pt("image-preview",void 0,ce,e):void 0;return Object.assign({previewRef:o,previewWrapperRef:n,previewSrc:i,show:a,appear:Hi(),displayed:l,previewedImgProps:$==null?void 0:$.previewedImgPropsRef,handleWheel(C){C.preventDefault()},handlePreviewMousedown:R,handlePreviewDblclick:_,syncTransformOrigin:d,handleAfterLeave:()=>{Q(),j=0,l.value=!1},handleDragStart:C=>{var P,I;(I=(P=$==null?void 0:$.previewedImgPropsRef.value)===null||P===void 0?void 0:P.onDragstart)===null||I===void 0||I.call(P,C),C.preventDefault()},zoomIn:_e,zoomOut:Ge,rotateCounterclockwise:ne,rotateClockwise:pe,handleSwitchPrev:A,handleSwitchNext:X,withTooltip:se,resizeToOrignalImageSize:ee,cssVars:Re?void 0:ce,themeClass:ge==null?void 0:ge.themeClass,onRender:ge==null?void 0:ge.onRender},G)},render(){var e,t;const{clsPrefix:r}=this;return v(Je,null,(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e),v(jc,{show:this.show},{default:()=>{var o;return this.show||this.displayed?((o=this.onRender)===null||o===void 0||o.call(this),Tr(v("div",{class:[`${r}-image-preview-container`,this.themeClass],style:this.cssVars,onWheel:this.handleWheel},v(Bt,{name:"fade-in-transition",appear:this.appear},{default:()=>this.show?v("div",{class:`${r}-image-preview-overlay`,onClick:this.toggleShow}):null}),this.showToolbar?v(Bt,{name:"fade-in-transition",appear:this.appear},{default:()=>{if(!this.show)return null;const{withTooltip:n}=this;return v("div",{class:`${r}-image-preview-toolbar`},this.onPrev?v(Je,null,n(v(zt,{clsPrefix:r,onClick:this.handleSwitchPrev},{default:()=>oI}),"tipPrevious"),n(v(zt,{clsPrefix:r,onClick:this.handleSwitchNext},{default:()=>nI}),"tipNext")):null,n(v(zt,{clsPrefix:r,onClick:this.rotateCounterclockwise},{default:()=>v(_6,null)}),"tipCounterclockwise"),n(v(zt,{clsPrefix:r,onClick:this.rotateClockwise},{default:()=>v($6,null)}),"tipClockwise"),n(v(zt,{clsPrefix:r,onClick:this.resizeToOrignalImageSize},{default:()=>v(T6,null)}),"tipOriginalSize"),n(v(zt,{clsPrefix:r,onClick:this.zoomOut},{default:()=>v(k6,null)}),"tipZoomOut"),n(v(zt,{clsPrefix:r,onClick:this.zoomIn},{default:()=>v(P6,null)}),"tipZoomIn"),n(v(zt,{clsPrefix:r,onClick:this.toggleShow},{default:()=>iI}),"tipClose"))}}):null,v(Bt,{name:"fade-in-scale-up-transition",onAfterLeave:this.handleAfterLeave,appear:this.appear,onEnter:this.syncTransformOrigin,onBeforeLeave:this.syncTransformOrigin},{default:()=>{const{previewedImgProps:n={}}=this;return Tr(v("div",{class:`${r}-image-preview-wrapper`,ref:"previewWrapperRef"},v("img",Object.assign({},n,{draggable:!1,onMousedown:this.handlePreviewMousedown,onDblclick:this.handlePreviewDblclick,class:[`${r}-image-preview`,n.class],key:this.previewSrc,src:this.previewSrc,ref:"previewRef",onDragstart:this.handleDragStart}))),[[Si,this.show]])}})),[[cl,{enabled:this.show}]])):null}}))}});const fb="n-image-group",lI=vd;var ZM=ae({name:"ImageGroup",props:lI,setup(e){let t;const{mergedClsPrefixRef:r}=st(e),o=`c${Tn()}`,n=Wr(),i=s=>{var d;t=s,(d=l.value)===null||d===void 0||d.setPreviewSrc(s)};function a(s){if(!(n!=null&&n.proxy))return;const c=n.proxy.$el.parentElement.querySelectorAll(`[data-group-id=${o}]:not([data-error=true])`);if(!c.length)return;const u=Array.from(c).findIndex(f=>f.dataset.previewSrc===t);~u?i(c[(u+s+c.length)%c.length].dataset.previewSrc):i(c[0].dataset.previewSrc)}Be(fb,{mergedClsPrefixRef:r,setPreviewSrc:i,setThumbnailEl:s=>{var d;(d=l.value)===null||d===void 0||d.setThumbnailEl(s)},toggleShow:()=>{var s;(s=l.value)===null||s===void 0||s.toggleShow()},groupId:o});const l=V(null);return{mergedClsPrefix:r,previewInstRef:l,next:()=>a(1),prev:()=>a(-1)}},render(){return v(ub,{theme:this.theme,themeOverrides:this.themeOverrides,clsPrefix:this.mergedClsPrefix,ref:"previewInstRef",onPrev:this.prev,onNext:this.next,showToolbar:this.showToolbar,showToolbarTooltip:this.showToolbarTooltip},this.$slots)}});const sI=Object.assign({alt:String,height:[String,Number],imgProps:Object,previewedImgProps:Object,lazy:Boolean,intersectionObserverOptions:Object,objectFit:{type:String,default:"fill"},previewSrc:String,fallbackSrc:String,width:[String,Number],src:String,previewDisabled:Boolean,loadDescription:String,onError:Function,onLoad:Function},vd);var cI=ae({name:"Image",props:sI,inheritAttrs:!1,setup(e){const t=V(null),r=V(!1),o=V(null),n=me(fb,null),{mergedClsPrefixRef:i}=n||st(e),a={click:()=>{if(e.previewDisabled||r.value)return;const d=e.previewSrc||e.src;if(n){n.setPreviewSrc(d),n.setThumbnailEl(t.value),n.toggleShow();return}const{value:c}=o;!c||(c.setPreviewSrc(d),c.setThumbnailEl(t.value),c.toggleShow())}},l=V(!e.lazy);gt(()=>{var d;(d=t.value)===null||d===void 0||d.setAttribute("data-group-id",(n==null?void 0:n.groupId)||"")}),gt(()=>{if(yn)return;let d;const c=Wt(()=>{d==null||d(),d=void 0,e.lazy&&(d=cg(t.value,e.intersectionObserverOptions,l))});ht(()=>{c(),d==null||d()})}),Wt(()=>{var d;e.src,(d=e.imgProps)===null||d===void 0||d.src,r.value=!1});const s=V(!1);return Be(Zg,{previewedImgPropsRef:Te(e,"previewedImgProps")}),Object.assign({mergedClsPrefix:i,groupId:n==null?void 0:n.groupId,previewInstRef:o,imageRef:t,showError:r,shouldStartLoading:l,loaded:s,mergedOnClick:d=>{var c,u;a.click(),(u=(c=e.imgProps)===null||c===void 0?void 0:c.onClick)===null||u===void 0||u.call(c,d)},mergedOnError:d=>{if(!l.value)return;r.value=!0;const{onError:c,imgProps:{onError:u}={}}=e;c==null||c(d),u==null||u(d)},mergedOnLoad:d=>{const{onLoad:c,imgProps:{onLoad:u}={}}=e;c==null||c(d),u==null||u(d),s.value=!0}},a)},render(){var e,t;const{mergedClsPrefix:r,imgProps:o={},loaded:n,$attrs:i,lazy:a}=this,l=(t=(e=this.$slots).placeholder)===null||t===void 0?void 0:t.call(e),s=this.src||o.src||"",d=v("img",Object.assign(Object.assign({},o),{ref:"imageRef",width:this.width||o.width,height:this.height||o.height,src:yn?s:this.showError?this.fallbackSrc:this.shouldStartLoading?s:void 0,alt:this.alt||o.alt,"aria-label":this.alt||o.alt,onClick:this.mergedOnClick,onError:this.mergedOnError,onLoad:this.mergedOnLoad,loading:yn&&a&&!this.intersectionObserverOptions?"lazy":"eager",style:[o.style||"",l&&!n?{height:"0",width:"0",visibility:"hidden"}:"",{objectFit:this.objectFit}],"data-error":this.showError,"data-preview-src":this.previewSrc||this.src}));return v("div",Object.assign({},i,{role:"none",class:[i.class,`${r}-image`,(this.previewDisabled||this.showError)&&`${r}-image--preview-disabled`]}),this.groupId?d:v(ub,{theme:this.theme,themeOverrides:this.themeOverrides,clsPrefix:r,ref:"previewInstRef",showToolbar:this.showToolbar,showToolbarTooltip:this.showToolbarTooltip},{default:()=>d}),!n&&l)}});const dI="n-layout-sider";var uI={extraFontSize:"12px",width:"440px"};const fI={name:"Transfer",common:le,peers:{Checkbox:Nn,Scrollbar:Ut,Input:ur,Empty:Vo,Button:Kt},self(e){const{iconColorDisabled:t,iconColor:r,fontWeight:o,fontSizeLarge:n,fontSizeMedium:i,fontSizeSmall:a,heightLarge:l,heightMedium:s,heightSmall:d,borderRadius:c,inputColor:u,tableHeaderColor:f,textColor1:p,textColorDisabled:h,textColor2:g,hoverColor:b}=e;return Object.assign(Object.assign({},uI),{itemHeightSmall:d,itemHeightMedium:s,itemHeightLarge:l,fontSizeSmall:a,fontSizeMedium:i,fontSizeLarge:n,borderRadius:c,borderColor:"#0000",listColor:u,headerColor:f,titleTextColor:p,titleTextColorDisabled:h,extraTextColor:g,filterDividerColor:"#0000",itemTextColor:g,itemTextColorDisabled:h,itemColorPending:b,titleFontWeight:o,iconColor:r,iconColorDisabled:t})}};var hI=fI;const Ui="n-menu",md="n-submenu",gd="n-menu-item-group",ha=8;function bd(e){const t=me(Ui),{props:r,mergedCollapsedRef:o}=t,n=me(md,null),i=me(gd,null),a=H(()=>r.mode==="horizontal"),l=H(()=>a.value?r.dropdownPlacement:"tmNodes"in e?"right-start":"right"),s=H(()=>{var f;return Math.max((f=r.collapsedIconSize)!==null&&f!==void 0?f:r.iconSize,r.iconSize)}),d=H(()=>{var f;return!a.value&&e.root&&o.value&&(f=r.collapsedIconSize)!==null&&f!==void 0?f:r.iconSize}),c=H(()=>{if(a.value)return;const{collapsedWidth:f,indent:p,rootIndent:h}=r,{root:g,isGroup:b}=e,m=h===void 0?p:h;if(g)return o.value?f/2-s.value/2:m;if(i)return p/2+i.paddingLeftRef.value;if(n)return(b?p/2:p)+n.paddingLeftRef.value}),u=H(()=>{const{collapsedWidth:f,indent:p,rootIndent:h}=r,{value:g}=s,{root:b}=e;return a.value||!b||!o.value?ha:(h===void 0?p:h)+g+ha-(f+g)/2});return{dropdownPlacement:l,activeIconSize:d,maxIconSize:s,paddingLeft:c,iconMarginRight:u,NMenu:t,NSubmenu:n}}const xd={internalKey:{type:[String,Number],required:!0},root:Boolean,isGroup:Boolean,level:{type:Number,required:!0},title:[String,Function],extra:[String,Function]},hb=Object.assign(Object.assign({},xd),{tmNode:{type:Object,required:!0},tmNodes:{type:Array,required:!0}}),pI=ae({name:"MenuOptionGroup",props:hb,setup(e){Be(md,null);const t=bd(e);Be(gd,{paddingLeftRef:t.paddingLeft});const{mergedClsPrefixRef:r,props:o}=me(Ui);return function(){const{value:n}=r,i=t.paddingLeft.value,{nodeProps:a}=o,l=a==null?void 0:a(e.tmNode.rawNode);return v("div",{class:`${n}-menu-item-group`,role:"group"},v("div",Object.assign({},l,{class:[`${n}-menu-item-group-title`,l==null?void 0:l.class],style:[(l==null?void 0:l.style)||"",i!==void 0?`padding-left: ${i}px;`:""]}),St(e.title),e.extra?v(Je,null," ",St(e.extra)):null),v("div",null,e.tmNodes.map(s=>Cd(s,o))))}}});var pb=ae({name:"MenuOptionContent",props:{collapsed:Boolean,disabled:Boolean,title:[String,Function],icon:Function,extra:[String,Function],showArrow:Boolean,childActive:Boolean,hover:Boolean,paddingLeft:Number,selected:Boolean,maxIconSize:{type:Number,required:!0},activeIconSize:{type:Number,required:!0},iconMarginRight:{type:Number,required:!0},clsPrefix:{type:String,required:!0},onClick:Function,tmNode:{type:Object,required:!0}},setup(e){const{props:t}=me(Ui);return{menuProps:t,style:H(()=>{const{paddingLeft:r}=e;return{paddingLeft:r&&`${r}px`}}),iconStyle:H(()=>{const{maxIconSize:r,activeIconSize:o,iconMarginRight:n}=e;return{width:`${r}px`,height:`${r}px`,fontSize:`${o}px`,marginRight:`${n}px`}})}},render(){const{clsPrefix:e,tmNode:t,menuProps:{renderIcon:r,renderLabel:o,renderExtra:n,expandIcon:i}}=this,a=r?r(t.rawNode):St(this.icon);return v("div",{onClick:l=>{var s;(s=this.onClick)===null||s===void 0||s.call(this,l)},role:"none",class:[`${e}-menu-item-content`,{[`${e}-menu-item-content--selected`]:this.selected,[`${e}-menu-item-content--collapsed`]:this.collapsed,[`${e}-menu-item-content--child-active`]:this.childActive,[`${e}-menu-item-content--disabled`]:this.disabled,[`${e}-menu-item-content--hover`]:this.hover}],style:this.style},a&&v("div",{class:`${e}-menu-item-content__icon`,style:this.iconStyle,role:"none"},[a]),v("div",{class:`${e}-menu-item-content-header`,role:"none"},o?o(t.rawNode):St(this.title),this.extra||n?v("span",{class:`${e}-menu-item-content-header__extra`}," ",n?n(t.rawNode):St(this.extra)):null),this.showArrow?v(zt,{ariaHidden:!0,class:`${e}-menu-item-content__arrow`,clsPrefix:e},{default:()=>i?i(t.rawNode):v(S6,null)}):null)}});const vb=Object.assign(Object.assign({},xd),{rawNodes:{type:Array,default:()=>[]},tmNodes:{type:Array,default:()=>[]},tmNode:{type:Object,required:!0},disabled:{type:Boolean,default:!1},icon:Function,onClick:Function}),vI=ae({name:"Submenu",props:vb,setup(e){const t=bd(e),{NMenu:r,NSubmenu:o}=t,{props:n,mergedCollapsedRef:i,mergedThemeRef:a}=r,l=H(()=>{const{disabled:f}=e;return o!=null&&o.mergedDisabledRef.value||n.disabled?!0:f}),s=V(!1);Be(md,{paddingLeftRef:t.paddingLeft,mergedDisabledRef:l}),Be(gd,null);function d(){const{onClick:f}=e;f&&f()}function c(){l.value||(i.value||r.toggleExpand(e.internalKey),d())}function u(f){s.value=f}return{menuProps:n,mergedTheme:a,doSelect:r.doSelect,inverted:r.invertedRef,isHorizontal:r.isHorizontalRef,mergedClsPrefix:r.mergedClsPrefixRef,maxIconSize:t.maxIconSize,activeIconSize:t.activeIconSize,iconMarginRight:t.iconMarginRight,dropdownPlacement:t.dropdownPlacement,dropdownShow:s,paddingLeft:t.paddingLeft,mergedDisabled:l,mergedValue:r.mergedValueRef,childActive:mt(()=>r.activePathRef.value.includes(e.internalKey)),collapsed:H(()=>n.mode==="horizontal"?!1:i.value?!0:!r.mergedExpandedKeysRef.value.includes(e.internalKey)),dropdownEnabled:H(()=>!l.value&&(n.mode==="horizontal"||i.value)),handlePopoverShowChange:u,handleClick:c}},render(){var e;const{mergedClsPrefix:t,menuProps:{renderIcon:r,renderLabel:o}}=this,n=()=>{const{isHorizontal:a,paddingLeft:l,collapsed:s,mergedDisabled:d,maxIconSize:c,activeIconSize:u,title:f,childActive:p,icon:h,handleClick:g,menuProps:{nodeProps:b},dropdownShow:m,iconMarginRight:y,tmNode:w,mergedClsPrefix:x}=this,k=b==null?void 0:b(w.rawNode);return v("div",Object.assign({},k,{class:[`${x}-menu-item`,k==null?void 0:k.class],role:"menuitem"}),v(pb,{tmNode:w,paddingLeft:l,collapsed:s,disabled:d,iconMarginRight:y,maxIconSize:c,activeIconSize:u,title:f,extra:this.extra,showArrow:!a,childActive:p,clsPrefix:x,icon:h,hover:m,onClick:g}))},i=()=>v(ml,null,{default:()=>{const{tmNodes:a,collapsed:l}=this;return l?null:v("div",{class:`${t}-submenu-children`,role:"menu"},a.map(s=>Cd(s,this.menuProps)))}});return this.root?v(sT,Object.assign({size:"large",trigger:"hover"},(e=this.menuProps)===null||e===void 0?void 0:e.dropdownProps,{themeOverrides:this.mergedTheme.peerOverrides.Dropdown,theme:this.mergedTheme.peers.Dropdown,builtinThemeOverrides:{fontSizeLarge:"14px",optionIconSizeLarge:"18px"},value:this.mergedValue,disabled:!this.dropdownEnabled,placement:this.dropdownPlacement,keyField:this.menuProps.keyField,labelField:this.menuProps.labelField,childrenField:this.menuProps.childrenField,onUpdateShow:this.handlePopoverShowChange,options:this.rawNodes,onSelect:this.doSelect,inverted:this.inverted,renderIcon:r,renderLabel:o}),{default:()=>v("div",{class:`${t}-submenu`,role:"menuitem","aria-expanded":!this.collapsed},n(),this.isHorizontal?null:i())}):v("div",{class:`${t}-submenu`,role:"menuitem","aria-expanded":!this.collapsed},n(),i())}}),mb=Object.assign(Object.assign({},xd),{tmNode:{type:Object,required:!0},disabled:Boolean,icon:Function,onClick:Function}),mI=ae({name:"MenuOption",props:mb,setup(e){const t=bd(e),{NSubmenu:r,NMenu:o}=t,{props:n,mergedClsPrefixRef:i,mergedCollapsedRef:a}=o,l=r?r.mergedDisabledRef:{value:!1},s=H(()=>l.value||e.disabled);function d(u){const{onClick:f}=e;f&&f(u)}function c(u){s.value||(o.doSelect(e.internalKey,e.tmNode.rawNode),d(u))}return{mergedClsPrefix:i,dropdownPlacement:t.dropdownPlacement,paddingLeft:t.paddingLeft,iconMarginRight:t.iconMarginRight,maxIconSize:t.maxIconSize,activeIconSize:t.activeIconSize,mergedTheme:o.mergedThemeRef,menuProps:n,dropdownEnabled:mt(()=>e.root&&a.value&&n.mode!=="horizontal"&&!s.value),selected:mt(()=>o.mergedValueRef.value===e.internalKey),mergedDisabled:s,handleClick:c}},render(){const{mergedClsPrefix:e,mergedTheme:t,tmNode:r,menuProps:{renderLabel:o,nodeProps:n}}=this,i=n==null?void 0:n(r.rawNode);return v("div",Object.assign({},i,{role:"menuitem",class:[`${e}-menu-item`,i==null?void 0:i.class]}),v(Tg,{theme:t.peers.Tooltip,themeOverrides:t.peerOverrides.Tooltip,trigger:"hover",placement:this.dropdownPlacement,disabled:!this.dropdownEnabled||this.title===void 0,internalExtraClass:["menu-tooltip"]},{default:()=>o?o(r.rawNode):St(this.title),trigger:()=>v(pb,{tmNode:r,clsPrefix:e,paddingLeft:this.paddingLeft,iconMarginRight:this.iconMarginRight,maxIconSize:this.maxIconSize,activeIconSize:this.activeIconSize,selected:this.selected,title:this.title,extra:this.extra,disabled:this.mergedDisabled,icon:this.icon,onClick:this.handleClick})}))}});var gI=ae({name:"MenuDivider",setup(){const e=me(Ui),{mergedClsPrefixRef:t,isHorizontalRef:r}=e;return()=>r.value?null:v("div",{class:`${t.value}-menu-divider`})}});const bI=sr(hb),xI=sr(mb),CI=sr(vb);function gb(e){return e.type==="divider"||e.type==="render"}function yI(e){return e.type==="divider"}function Cd(e,t){const{rawNode:r}=e,{show:o}=r;if(o===!1)return null;if(gb(r))return yI(r)?v(gI,Object.assign({key:e.key},r.props)):null;const{labelField:n}=t,{key:i,level:a,isGroup:l}=e,s=Object.assign(Object.assign({},r),{title:r.title||r[n],extra:r.titleExtra||r.extra,key:i,internalKey:i,level:a,root:a===0,isGroup:l});return e.children?e.isGroup?v(pI,Jt(s,bI,{tmNode:e,tmNodes:e.children,key:i})):v(vI,Jt(s,CI,{key:i,rawNodes:r[t.childrenField],tmNodes:e.children,tmNode:e})):v(mI,Jt(s,xI,{key:i,tmNode:e}))}const ch=[O("&::before","background-color: var(--n-item-color-hover);"),D("arrow",` + color: var(--n-arrow-color-hover); + `),D("icon",` + color: var(--n-item-icon-color-hover); + `),M("menu-item-content-header",` + color: var(--n-item-text-color-hover); + `,[O("a",` + color: var(--n-item-text-color-hover); + `),D("extra",` + color: var(--n-item-text-color-hover); + `)])],dh=[D("icon",` + color: var(--n-item-icon-color-hover-horizontal); + `),M("menu-item-content-header",` + color: var(--n-item-text-color-hover-horizontal); + `,[O("a",` + color: var(--n-item-text-color-hover-horizontal); + `),D("extra",` + color: var(--n-item-text-color-hover-horizontal); + `)])];var wI=O([M("menu",` + background-color: var(--n-color); + color: var(--n-item-text-color); + overflow: hidden; + transition: background-color .3s var(--n-bezier); + box-sizing: border-box; + font-size: var(--n-font-size); + padding-bottom: 6px; + `,[K("horizontal",` + display: inline-flex; + padding-bottom: 0; + `,[M("submenu","margin: 0;"),M("menu-item","margin: 0;"),M("menu-item-content",` + padding: 0 20px; + border-bottom: 2px solid #0000; + `,[O("&::before","display: none;"),K("selected","border-bottom: 2px solid var(--n-border-color-horizontal)")]),M("menu-item-content",[K("selected",[D("icon","color: var(--n-item-icon-color-active-horizontal);"),M("menu-item-content-header",` + color: var(--n-item-text-color-active-horizontal); + `,[O("a","color: var(--n-item-text-color-active-horizontal);"),D("extra","color: var(--n-item-text-color-active-horizontal);")])]),K("child-active",` + border-bottom: 2px solid var(--n-border-color-horizontal); + `,[M("menu-item-content-header",` + color: var(--n-item-text-color-child-active-horizontal); + `,[O("a",` + color: var(--n-item-text-color-child-active-horizontal); + `),D("extra",` + color: var(--n-item-text-color-child-active-horizontal); + `)]),D("icon",` + color: var(--n-item-icon-color-child-active-horizontal); + `)]),ut("disabled",[ut("selected, child-active",[O("&:focus-within",dh)]),K("selected",[xo(null,[D("icon","color: var(--n-item-icon-color-active-hover-horizontal);"),M("menu-item-content-header",` + color: var(--n-item-text-color-active-hover-horizontal); + `,[O("a","color: var(--n-item-text-color-active-hover-horizontal);"),D("extra","color: var(--n-item-text-color-active-hover-horizontal);")])])]),K("child-active",[xo(null,[D("icon","color: var(--n-item-icon-color-child-active-hover-horizontal);"),M("menu-item-content-header",` + color: var(--n-item-text-color-child-active-hover-horizontal); + `,[O("a","color: var(--n-item-text-color-child-active-hover-horizontal);"),D("extra","color: var(--n-item-text-color-child-active-hover-horizontal);")])])]),xo("border-bottom: 2px solid var(--n-border-color-horizontal);",dh)]),M("menu-item-content-header",[O("a","color: var(--n-item-text-color-horizontal);")])])]),K("collapsed",[M("menu-item-content",[K("selected",[O("&::before",` + background-color: var(--n-item-color-active-collapsed) !important; + `)]),M("menu-item-content-header","opacity: 0;"),D("arrow","opacity: 0;"),D("icon","color: var(--n-item-icon-color-collapsed);")])]),M("menu-item",` + height: var(--n-item-height); + margin-top: 6px; + position: relative; + `),M("menu-item-content",` + box-sizing: border-box; + line-height: 1.75; + height: 100%; + display: grid; + grid-template-areas: "icon content arrow"; + grid-template-columns: auto 1fr auto; + align-items: center; + cursor: pointer; + position: relative; + padding-right: 18px; + transition: + background-color .3s var(--n-bezier), + padding-left .3s var(--n-bezier), + border-color .3s var(--n-bezier); + `,[O("> *","z-index: 1;"),O("&::before",` + z-index: auto; + content: ""; + background-color: #0000; + position: absolute; + left: 8px; + right: 8px; + top: 0; + bottom: 0; + pointer-events: none; + border-radius: var(--n-border-radius); + transition: background-color .3s var(--n-bezier); + `),K("disabled",` + opacity: .45; + cursor: not-allowed; + `),K("collapsed",[D("arrow","transform: rotate(0);")]),K("selected",[O("&::before","background-color: var(--n-item-color-active);"),D("arrow","color: var(--n-arrow-color-active);"),D("icon","color: var(--n-item-icon-color-active);"),M("menu-item-content-header",` + color: var(--n-item-text-color-active); + `,[O("a","color: var(--n-item-text-color-active);"),D("extra","color: var(--n-item-text-color-active);")])]),K("child-active",[M("menu-item-content-header",` + color: var(--n-item-text-color-child-active); + `,[O("a",` + color: var(--n-item-text-color-child-active); + `),D("extra",` + color: var(--n-item-text-color-child-active); + `)]),D("arrow",` + color: var(--n-arrow-color-child-active); + `),D("icon",` + color: var(--n-item-icon-color-child-active); + `)]),ut("disabled",[ut("selected, child-active",[O("&:focus-within",ch)]),K("selected",[xo(null,[D("arrow","color: var(--n-arrow-color-active-hover);"),D("icon","color: var(--n-item-icon-color-active-hover);"),M("menu-item-content-header",` + color: var(--n-item-text-color-active-hover); + `,[O("a","color: var(--n-item-text-color-active-hover);"),D("extra","color: var(--n-item-text-color-active-hover);")])])]),K("child-active",[xo(null,[D("arrow","color: var(--n-arrow-color-child-active-hover);"),D("icon","color: var(--n-item-icon-color-child-active-hover);"),M("menu-item-content-header",` + color: var(--n-item-text-color-child-active-hover); + `,[O("a","color: var(--n-item-text-color-child-active-hover);"),D("extra","color: var(--n-item-text-color-child-active-hover);")])])]),K("selected",[xo(null,[O("&::before","background-color: var(--n-item-color-active-hover);")])]),xo(null,ch)]),D("icon",` + grid-area: icon; + color: var(--n-item-icon-color); + transition: + color .3s var(--n-bezier), + font-size .3s var(--n-bezier), + margin-right .3s var(--n-bezier); + box-sizing: content-box; + display: inline-flex; + align-items: center; + justify-content: center; + `),D("arrow",` + grid-area: arrow; + font-size: 16px; + color: var(--n-arrow-color); + transform: rotate(180deg); + opacity: 1; + transition: + color .3s var(--n-bezier), + transform 0.2s var(--n-bezier), + opacity 0.2s var(--n-bezier); + `),M("menu-item-content-header",` + grid-area: content; + transition: + color .3s var(--n-bezier), + opacity .3s var(--n-bezier); + opacity: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: var(--n-item-text-color); + `,[O("a",` + outline: none; + text-decoration: none; + transition: color .3s var(--n-bezier); + color: var(--n-item-text-color); + `,[O("&::before",` + content: ""; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + `)]),D("extra",` + font-size: .93em; + color: var(--n-group-text-color); + transition: color .3s var(--n-bezier); + `)])]),M("submenu",` + cursor: pointer; + position: relative; + margin-top: 6px; + `,[M("menu-item-content",` + height: var(--n-item-height); + `),M("submenu-children",` + overflow: hidden; + padding: 0; + `,[og({duration:".2s"})])]),M("menu-item-group",[M("menu-item-group-title",` + margin-top: 6px; + color: var(--n-group-text-color); + cursor: default; + font-size: .93em; + height: 36px; + display: flex; + align-items: center; + transition: + padding-left .3s var(--n-bezier), + color .3s var(--n-bezier); + `)])]),M("menu-tooltip",[O("a",` + color: inherit; + text-decoration: none; + `)]),M("menu-divider",` + transition: background-color .3s var(--n-bezier); + background-color: var(--n-divider-color); + height: 1px; + margin: 6px 18px; + `)]);function xo(e,t){return[K("hover",e,t),O("&:hover",e,t)]}const SI=Object.assign(Object.assign({},Ee.props),{options:{type:Array,default:()=>[]},collapsed:{type:Boolean,default:void 0},collapsedWidth:{type:Number,default:48},iconSize:{type:Number,default:20},collapsedIconSize:{type:Number,default:24},rootIndent:Number,indent:{type:Number,default:32},labelField:{type:String,default:"label"},keyField:{type:String,default:"key"},childrenField:{type:String,default:"children"},disabledField:{type:String,default:"disabled"},defaultExpandAll:Boolean,defaultExpandedKeys:Array,expandedKeys:Array,value:[String,Number],defaultValue:{type:[String,Number],default:null},mode:{type:String,default:"vertical"},watchProps:{type:Array,default:void 0},disabled:Boolean,show:{type:Boolean,defalut:!0},inverted:Boolean,"onUpdate:expandedKeys":[Function,Array],onUpdateExpandedKeys:[Function,Array],onUpdateValue:[Function,Array],"onUpdate:value":[Function,Array],expandIcon:Function,renderIcon:Function,renderLabel:Function,renderExtra:Function,dropdownProps:Object,accordion:Boolean,nodeProps:Function,items:Array,onOpenNamesChange:[Function,Array],onSelect:[Function,Array],onExpandedNamesChange:[Function,Array],expandedNames:Array,defaultExpandedNames:Array,dropdownPlacement:{type:String,default:"bottom"}});var $I=ae({name:"Menu",props:SI,setup(e){const{mergedClsPrefixRef:t,inlineThemeDisabled:r}=st(e),o=Ee("Menu","-menu",wI,NE,e,t),n=me(dI,null),i=H(()=>{var $;const{collapsed:R}=e;if(R!==void 0)return R;if(n){const{collapseModeRef:_,collapsedRef:N}=n;if(_.value==="width")return($=N.value)!==null&&$!==void 0?$:!1}return!1}),a=H(()=>{const{keyField:$,childrenField:R,disabledField:_}=e;return Bm(e.items||e.options,{getIgnored(N){return gb(N)},getChildren(N){return N[R]},getDisabled(N){return N[_]},getKey(N){var E;return(E=N[$])!==null&&E!==void 0?E:N.name}})}),l=H(()=>new Set(a.value.treeNodes.map($=>$.key))),{watchProps:s}=e,d=V(null);s!=null&&s.includes("defaultValue")?Wt(()=>{d.value=e.defaultValue}):d.value=e.defaultValue;const c=Te(e,"value"),u=En(c,d),f=V([]),p=()=>{f.value=e.defaultExpandAll?a.value.getNonLeafKeys():e.defaultExpandedNames||e.defaultExpandedKeys||a.value.getPath(u.value,{includeSelf:!1}).keyPath};s!=null&&s.includes("defaultExpandedKeys")?Wt(p):p();const h=Ti(e,["expandedNames","expandedKeys"]),g=En(h,f),b=H(()=>a.value.treeNodes),m=H(()=>a.value.getPath(u.value).keyPath);Be(Ui,{props:e,mergedCollapsedRef:i,mergedThemeRef:o,mergedValueRef:u,mergedExpandedKeysRef:g,activePathRef:m,mergedClsPrefixRef:t,isHorizontalRef:H(()=>e.mode==="horizontal"),invertedRef:Te(e,"inverted"),doSelect:y,toggleExpand:x});function y($,R){const{"onUpdate:value":_,onUpdateValue:N,onSelect:E}=e;N&&Ae(N,$,R),_&&Ae(_,$,R),E&&Ae(E,$,R),d.value=$}function w($){const{"onUpdate:expandedKeys":R,onUpdateExpandedKeys:_,onExpandedNamesChange:N,onOpenNamesChange:E}=e;R&&Ae(R,$),_&&Ae(_,$),N&&Ae(N,$),E&&Ae(E,$),f.value=$}function x($){const R=Array.from(g.value),_=R.findIndex(N=>N===$);if(~_)R.splice(_,1);else{if(e.accordion&&l.value.has($)){const N=R.findIndex(E=>l.value.has(E));N>-1&&R.splice(N,1)}R.push($)}w(R)}const k=$=>{const R=a.value.getPath($!=null?$:u.value,{includeSelf:!1}).keyPath;if(!R.length)return;const _=Array.from(g.value),N=new Set([..._,...R]);e.accordion&&l.value.forEach(E=>{N.has(E)&&!R.includes(E)&&N.delete(E)}),w(Array.from(N))},T=H(()=>{const{inverted:$}=e,{common:{cubicBezierEaseInOut:R},self:_}=o.value,{borderRadius:N,borderColorHorizontal:E,fontSize:F,itemHeight:j,dividerColor:Q}=_,A={"--n-divider-color":Q,"--n-bezier":R,"--n-font-size":F,"--n-border-color-horizontal":E,"--n-border-radius":N,"--n-item-height":j};return $?(A["--n-group-text-color"]=_.groupTextColorInverted,A["--n-color"]=_.colorInverted,A["--n-item-text-color"]=_.itemTextColorInverted,A["--n-item-text-color-hover"]=_.itemTextColorHoverInverted,A["--n-item-text-color-active"]=_.itemTextColorActiveInverted,A["--n-item-text-color-child-active"]=_.itemTextColorChildActiveInverted,A["--n-item-text-color-child-active-hover"]=_.itemTextColorChildActiveInverted,A["--n-item-text-color-active-hover"]=_.itemTextColorActiveHoverInverted,A["--n-item-icon-color"]=_.itemIconColorInverted,A["--n-item-icon-color-hover"]=_.itemIconColorHoverInverted,A["--n-item-icon-color-active"]=_.itemIconColorActiveInverted,A["--n-item-icon-color-active-hover"]=_.itemIconColorActiveHoverInverted,A["--n-item-icon-color-child-active"]=_.itemIconColorChildActiveInverted,A["--n-item-icon-color-child-active-hover"]=_.itemIconColorChildActiveHoverInverted,A["--n-item-icon-color-collapsed"]=_.itemIconColorCollapsedInverted,A["--n-item-text-color-horizontal"]=_.itemTextColorHorizontalInverted,A["--n-item-text-color-hover-horizontal"]=_.itemTextColorHoverHorizontalInverted,A["--n-item-text-color-active-horizontal"]=_.itemTextColorActiveHorizontalInverted,A["--n-item-text-color-child-active-horizontal"]=_.itemTextColorChildActiveHorizontalInverted,A["--n-item-text-color-child-active-hover-horizontal"]=_.itemTextColorChildActiveHoverHorizontalInverted,A["--n-item-text-color-active-hover-horizontal"]=_.itemTextColorActiveHoverHorizontalInverted,A["--n-item-icon-color-horizontal"]=_.itemIconColorHorizontalInverted,A["--n-item-icon-color-hover-horizontal"]=_.itemIconColorHoverHorizontalInverted,A["--n-item-icon-color-active-horizontal"]=_.itemIconColorActiveHorizontalInverted,A["--n-item-icon-color-active-hover-horizontal"]=_.itemIconColorActiveHoverHorizontalInverted,A["--n-item-icon-color-child-active-horizontal"]=_.itemIconColorChildActiveHorizontalInverted,A["--n-item-icon-color-child-active-hover-horizontal"]=_.itemIconColorChildActiveHoverHorizontalInverted,A["--n-arrow-color"]=_.arrowColorInverted,A["--n-arrow-color-hover"]=_.arrowColorHoverInverted,A["--n-arrow-color-active"]=_.arrowColorActiveInverted,A["--n-arrow-color-active-hover"]=_.arrowColorActiveHoverInverted,A["--n-arrow-color-child-active"]=_.arrowColorChildActiveInverted,A["--n-arrow-color-child-active-hover"]=_.arrowColorChildActiveHoverInverted,A["--n-item-color-hover"]=_.itemColorHoverInverted,A["--n-item-color-active"]=_.itemColorActiveInverted,A["--n-item-color-active-hover"]=_.itemColorActiveHoverInverted,A["--n-item-color-active-collapsed"]=_.itemColorActiveCollapsedInverted):(A["--n-group-text-color"]=_.groupTextColor,A["--n-color"]=_.color,A["--n-item-text-color"]=_.itemTextColor,A["--n-item-text-color-hover"]=_.itemTextColorHover,A["--n-item-text-color-active"]=_.itemTextColorActive,A["--n-item-text-color-child-active"]=_.itemTextColorChildActive,A["--n-item-text-color-child-active-hover"]=_.itemTextColorChildActiveHover,A["--n-item-text-color-active-hover"]=_.itemTextColorActiveHover,A["--n-item-icon-color"]=_.itemIconColor,A["--n-item-icon-color-hover"]=_.itemIconColorHover,A["--n-item-icon-color-active"]=_.itemIconColorActive,A["--n-item-icon-color-active-hover"]=_.itemIconColorActiveHover,A["--n-item-icon-color-child-active"]=_.itemIconColorChildActive,A["--n-item-icon-color-child-active-hover"]=_.itemIconColorChildActiveHover,A["--n-item-icon-color-collapsed"]=_.itemIconColorCollapsed,A["--n-item-text-color-horizontal"]=_.itemTextColorHorizontal,A["--n-item-text-color-hover-horizontal"]=_.itemTextColorHoverHorizontal,A["--n-item-text-color-active-horizontal"]=_.itemTextColorActiveHorizontal,A["--n-item-text-color-child-active-horizontal"]=_.itemTextColorChildActiveHorizontal,A["--n-item-text-color-child-active-hover-horizontal"]=_.itemTextColorChildActiveHoverHorizontal,A["--n-item-text-color-active-hover-horizontal"]=_.itemTextColorActiveHoverHorizontal,A["--n-item-icon-color-horizontal"]=_.itemIconColorHorizontal,A["--n-item-icon-color-hover-horizontal"]=_.itemIconColorHoverHorizontal,A["--n-item-icon-color-active-horizontal"]=_.itemIconColorActiveHorizontal,A["--n-item-icon-color-active-hover-horizontal"]=_.itemIconColorActiveHoverHorizontal,A["--n-item-icon-color-child-active-horizontal"]=_.itemIconColorChildActiveHorizontal,A["--n-item-icon-color-child-active-hover-horizontal"]=_.itemIconColorChildActiveHoverHorizontal,A["--n-arrow-color"]=_.arrowColor,A["--n-arrow-color-hover"]=_.arrowColorHover,A["--n-arrow-color-active"]=_.arrowColorActive,A["--n-arrow-color-active-hover"]=_.arrowColorActiveHover,A["--n-arrow-color-child-active"]=_.arrowColorChildActive,A["--n-arrow-color-child-active-hover"]=_.arrowColorChildActiveHover,A["--n-item-color-hover"]=_.itemColorHover,A["--n-item-color-active"]=_.itemColorActive,A["--n-item-color-active-hover"]=_.itemColorActiveHover,A["--n-item-color-active-collapsed"]=_.itemColorActiveCollapsed),A}),S=r?Pt("menu",H(()=>e.inverted?"a":"b"),T,e):void 0;return{mergedClsPrefix:t,controlledExpandedKeys:h,uncontrolledExpanededKeys:f,mergedExpandedKeys:g,uncontrolledValue:d,mergedValue:u,activePath:m,tmNodes:b,mergedTheme:o,mergedCollapsed:i,cssVars:r?void 0:T,themeClass:S==null?void 0:S.themeClass,onRender:S==null?void 0:S.onRender,showOption:k}},render(){const{mergedClsPrefix:e,mode:t,themeClass:r,onRender:o}=this;return o==null||o(),v("div",{role:t==="horizontal"?"menubar":"menu",class:[`${e}-menu`,r,`${e}-menu--${t}`,this.mergedCollapsed&&`${e}-menu--collapsed`],style:this.cssVars},this.tmNodes.map(n=>Cd(n,this.$props)))}});const bb={icon:Function,type:{type:String,default:"info"},content:[String,Number,Function],showIcon:{type:Boolean,default:!0},closable:Boolean,keepAliveOnHover:Boolean,onClose:Function,onMouseenter:Function,onMouseleave:Function},xb="n-message-api",Cb="n-message-provider";var _I=O([M("message-wrapper",` + margin: var(--n-margin); + z-index: 0; + transform-origin: top center; + display: flex; + `,[og({overflow:"visible",originalTransition:"transform .3s var(--n-bezier)",enterToProps:{transform:"scale(1)"},leaveToProps:{transform:"scale(0.85)"}})]),M("message",` + box-sizing: border-box; + display: flex; + align-items: center; + transition: + color .3s var(--n-bezier), + box-shadow .3s var(--n-bezier), + background-color .3s var(--n-bezier), + opacity .3s var(--n-bezier), + transform .3s var(--n-bezier), + margin-bottom .3s var(--n-bezier); + padding: var(--n-padding); + border-radius: var(--n-border-radius); + flex-wrap: nowrap; + overflow: hidden; + max-width: var(--n-max-width); + color: var(--n-text-color); + background-color: var(--n-color); + box-shadow: var(--n-box-shadow); + `,[D("content",` + display: inline-block; + line-height: var(--n-line-height); + font-size: var(--n-font-size); + `),D("icon",` + position: relative; + margin: var(--n-icon-margin); + height: var(--n-icon-size); + width: var(--n-icon-size); + font-size: var(--n-icon-size); + flex-shrink: 0; + `,[["default","info","success","warning","error","loading"].map(e=>K(`${e}-type`,[O("> *",` + color: var(--n-icon-color-${e}); + transition: color .3s var(--n-bezier); + `)])),O("> *",` + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + `,[Oi()])]),D("close",` + margin: var(--n-close-margin); + transition: + background-color .3s var(--n-bezier), + color .3s var(--n-bezier); + flex-shrink: 0; + `,[O("&:hover",` + color: var(--n-close-icon-color-hover); + `),O("&:active",` + color: var(--n-close-icon-color-pressed); + `)])]),M("message-container",` + z-index: 6000; + position: fixed; + height: 0; + overflow: visible; + display: flex; + flex-direction: column; + align-items: center; + `,[K("top",` + top: 12px; + left: 0; + right: 0; + `),K("top-left",` + top: 12px; + left: 12px; + right: 0; + align-items: flex-start; + `),K("top-right",` + top: 12px; + left: 0; + right: 12px; + align-items: flex-end; + `),K("bottom",` + bottom: 4px; + left: 0; + right: 0; + justify-content: flex-end; + `),K("bottom-left",` + bottom: 4px; + left: 12px; + right: 0; + justify-content: flex-end; + align-items: flex-start; + `),K("bottom-right",` + bottom: 4px; + left: 0; + right: 12px; + justify-content: flex-end; + align-items: flex-end; + `)])]);const PI={info:()=>v(Xs,null),success:()=>v(Im,null),warning:()=>v(Om,null),error:()=>v(Rm,null),default:()=>null};var kI=ae({name:"Message",props:Object.assign(Object.assign({},bb),{render:Function}),setup(e){const{inlineThemeDisabled:t,mergedRtlRef:r}=st(e),{props:o,mergedClsPrefixRef:n}=me(Cb),i=Kr("Message",r,n),a=Ee("Message","-message",_I,wE,o,n),l=H(()=>{const{type:d}=e,{common:{cubicBezierEaseInOut:c},self:{padding:u,margin:f,maxWidth:p,iconMargin:h,closeMargin:g,closeSize:b,iconSize:m,fontSize:y,lineHeight:w,borderRadius:x,iconColorInfo:k,iconColorSuccess:T,iconColorWarning:S,iconColorError:$,iconColorLoading:R,closeIconSize:_,closeBorderRadius:N,[ie("textColor",d)]:E,[ie("boxShadow",d)]:F,[ie("color",d)]:j,[ie("closeColorHover",d)]:Q,[ie("closeColorPressed",d)]:A,[ie("closeIconColor",d)]:X,[ie("closeIconColorPressed",d)]:ne,[ie("closeIconColorHover",d)]:pe}}=a.value;return{"--n-bezier":c,"--n-margin":f,"--n-padding":u,"--n-max-width":p,"--n-font-size":y,"--n-icon-margin":h,"--n-icon-size":m,"--n-close-icon-size":_,"--n-close-border-radius":N,"--n-close-size":b,"--n-close-margin":g,"--n-text-color":E,"--n-color":j,"--n-box-shadow":F,"--n-icon-color-info":k,"--n-icon-color-success":T,"--n-icon-color-warning":S,"--n-icon-color-error":$,"--n-icon-color-loading":R,"--n-close-color-hover":Q,"--n-close-color-pressed":A,"--n-close-icon-color":X,"--n-close-icon-color-pressed":ne,"--n-close-icon-color-hover":pe,"--n-line-height":w,"--n-border-radius":x}}),s=t?Pt("message",H(()=>e.type[0]),l,{}):void 0;return{mergedClsPrefix:n,rtlEnabled:i,messageProviderProps:o,handleClose(){var d;(d=e.onClose)===null||d===void 0||d.call(e)},cssVars:t?void 0:l,themeClass:s==null?void 0:s.themeClass,onRender:s==null?void 0:s.onRender,placement:o.placement}},render(){const{render:e,type:t,closable:r,content:o,mergedClsPrefix:n,cssVars:i,themeClass:a,onRender:l,icon:s,handleClose:d,showIcon:c}=this;l==null||l();let u;return v("div",{class:[`${n}-message-wrapper`,a],onMouseenter:this.onMouseenter,onMouseleave:this.onMouseleave,style:[{alignItems:this.placement.startsWith("top")?"flex-start":"flex-end"},i]},e?e(this.$props):v("div",{class:[`${n}-message ${n}-message--${t}-type`,this.rtlEnabled&&`${n}-message--rtl`]},(u=TI(s,t,n))&&c?v("div",{class:`${n}-message__icon ${n}-message__icon--${t}-type`},v(vl,null,{default:()=>u})):null,v("div",{class:`${n}-message__content`},St(o)),r?v(ji,{clsPrefix:n,class:`${n}-message__close`,onClick:d,absolute:!0}):null))}});function TI(e,t,r){if(typeof e=="function")return e();{const o=t==="loading"?v(gl,{clsPrefix:r,strokeWidth:24,scale:.85}):PI[t]();return o?v(zt,{clsPrefix:r,key:t},{default:()=>o}):null}}var zI=ae({name:"MessageEnvironment",props:Object.assign(Object.assign({},bb),{duration:{type:Number,default:3e3},onAfterLeave:Function,onLeave:Function,internalKey:{type:String,required:!0},onInternalAfterLeave:Function,onHide:Function,onAfterHide:Function}),setup(e){let t=null;const r=V(!0);gt(()=>{o()});function o(){const{duration:c}=e;c&&(t=window.setTimeout(a,c))}function n(c){c.currentTarget===c.target&&t!==null&&(window.clearTimeout(t),t=null)}function i(c){c.currentTarget===c.target&&o()}function a(){const{onHide:c}=e;r.value=!1,t&&(window.clearTimeout(t),t=null),c&&c()}function l(){const{onClose:c}=e;c&&c(),a()}function s(){const{onAfterLeave:c,onInternalAfterLeave:u,onAfterHide:f,internalKey:p}=e;c&&c(),u&&u(p),f&&f()}function d(){a()}return{show:r,hide:a,handleClose:l,handleAfterLeave:s,handleMouseleave:i,handleMouseenter:n,deactivate:d}},render(){return v(ml,{appear:!0,onAfterLeave:this.handleAfterLeave,onLeave:this.onLeave},{default:()=>[this.show?v(kI,{content:this.content,type:this.type,icon:this.icon,showIcon:this.showIcon,closable:this.closable,onClose:this.handleClose,onMouseenter:this.keepAliveOnHover?this.handleMouseenter:void 0,onMouseleave:this.keepAliveOnHover?this.handleMouseleave:void 0}):null]})}});const EI=Object.assign(Object.assign({},Ee.props),{to:[String,Object],duration:{type:Number,default:3e3},keepAliveOnHover:Boolean,max:Number,placement:{type:String,default:"top"},closable:Boolean,containerStyle:[String,Object]});var RI=ae({name:"MessageProvider",props:EI,setup(e){const{mergedClsPrefixRef:t}=st(e),r=V([]),o=V({}),n={create(s,d){return i(s,Object.assign({type:"default"},d))},info(s,d){return i(s,Object.assign(Object.assign({},d),{type:"info"}))},success(s,d){return i(s,Object.assign(Object.assign({},d),{type:"success"}))},warning(s,d){return i(s,Object.assign(Object.assign({},d),{type:"warning"}))},error(s,d){return i(s,Object.assign(Object.assign({},d),{type:"error"}))},loading(s,d){return i(s,Object.assign(Object.assign({},d),{type:"loading"}))},destroyAll:l};Be(Cb,{props:e,mergedClsPrefixRef:t}),Be(xb,n);function i(s,d){const c=Tn(),u=vr(Object.assign(Object.assign({},d),{content:s,key:c,destroy:()=>{var p;(p=o.value[c])===null||p===void 0||p.hide()}})),{max:f}=e;return f&&r.value.length>=f&&r.value.shift(),r.value.push(u),u}function a(s){r.value.splice(r.value.findIndex(d=>d.key===s),1),delete o.value[s]}function l(){Object.values(o.value).forEach(s=>{s.hide()})}return Object.assign({mergedClsPrefix:t,messageRefs:o,messageList:r,handleAfterLeave:a},n)},render(){var e,t,r;return v(Je,null,(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e),this.messageList.length?v(wp,{to:(r=this.to)!==null&&r!==void 0?r:"body"},v("div",{class:[`${this.mergedClsPrefix}-message-container`,`${this.mergedClsPrefix}-message-container--${this.placement}`],key:"message-container",style:this.containerStyle},this.messageList.map(o=>v(zI,Object.assign({ref:n=>{n&&(this.messageRefs[o.key]=n)},internalKey:o.key,onInternalAfterLeave:this.handleAfterLeave},Lc(o,["destroy"],void 0),{duration:o.duration===void 0?this.duration:o.duration,keepAliveOnHover:o.keepAliveOnHover===void 0?this.keepAliveOnHover:o.keepAliveOnHover,closable:o.closable===void 0?this.closable:o.closable}))))):null)}});function II(){const e=me(xb,null);return e===null&&il("use-message","No outer founded. See prerequisite in https://www.naiveui.com/en-US/os-theme/components/message for more details. If you want to use `useMessage` outside setup, please check https://www.naiveui.com/zh-CN/os-theme/components/message#Q-&-A."),e}const OI={name:"Skeleton",common:le,self(e){const{heightSmall:t,heightMedium:r,heightLarge:o,borderRadius:n}=e;return{color:"rgba(255, 255, 255, 0.12)",colorEnd:"rgba(255, 255, 255, 0.18)",borderRadius:n,heightSmall:t,heightMedium:r,heightLarge:o}}};var AI=O([O("@keyframes spin-rotate",` + from { + transform: rotate(0); + } + to { + transform: rotate(360deg); + } + `),M("spin-container",{position:"relative"},[M("spin-body",` + position: absolute; + top: 50%; + left: 50%; + transform: translateX(-50%) translateY(-50%); + `,[Ai()])]),M("spin-body",` + display: inline-flex; + align-items: center; + justify-content: center; + flex-direction: column; + `),M("spin",` + display: inline-flex; + height: var(--n-size); + width: var(--n-size); + font-size: var(--n-size); + color: var(--n-color); + `,[K("rotate",` + animation: spin-rotate 2s linear infinite; + `)]),M("spin-description",` + display: inline-block; + font-size: var(--n-font-size); + color: var(--n-text-color); + transition: color .3s var(--n-bezier); + margin-top: 8px; + `),M("spin-content",` + opacity: 1; + transition: opacity .3s var(--n-bezier); + pointer-events: all; + `,[K("spinning",` + user-select: none; + -webkit-user-select: none; + pointer-events: none; + opacity: var(--n-opacity-spinning); + `)])]);const MI={small:20,medium:18,large:16},BI=Object.assign(Object.assign({},Ee.props),{description:String,stroke:String,size:{type:[String,Number],default:"medium"},show:{type:Boolean,default:!0},strokeWidth:Number,rotate:{type:Boolean,default:!0},spinning:{type:Boolean,validator:()=>!0,default:void 0}});var LI=ae({name:"Spin",props:BI,setup(e){const{mergedClsPrefixRef:t,inlineThemeDisabled:r}=st(e),o=Ee("Spin","-spin",AI,dR,e,t),n=H(()=>{const{size:a}=e,{common:{cubicBezierEaseInOut:l},self:s}=o.value,{opacitySpinning:d,color:c,textColor:u}=s,f=typeof a=="number"?Iy(a):s[ie("size",a)];return{"--n-bezier":l,"--n-opacity-spinning":d,"--n-size":f,"--n-color":c,"--n-text-color":u}}),i=r?Pt("spin",H(()=>{const{size:a}=e;return typeof a=="number"?String(a):a[0]}),n,e):void 0;return{mergedClsPrefix:t,compitableShow:Ti(e,["spinning","show"]),mergedStrokeWidth:H(()=>{const{strokeWidth:a}=e;if(a!==void 0)return a;const{size:l}=e;return MI[typeof l=="number"?"medium":l]}),cssVars:r?void 0:n,themeClass:i==null?void 0:i.themeClass,onRender:i==null?void 0:i.onRender}},render(){var e,t;const{$slots:r,mergedClsPrefix:o,description:n}=this,i=r.icon&&this.rotate,a=(n||r.description)&&v("div",{class:`${o}-spin-description`},n||((e=r.description)===null||e===void 0?void 0:e.call(r))),l=r.icon?v("div",{class:[`${o}-spin-body`,this.themeClass]},v("div",{class:[`${o}-spin`,i&&`${o}-spin--rotate`],style:r.default?"":this.cssVars},r.icon()),a):v("div",{class:[`${o}-spin-body`,this.themeClass]},v(gl,{clsPrefix:o,style:r.default?"":this.cssVars,stroke:this.stroke,"stroke-width":this.mergedStrokeWidth,class:`${o}-spin`}),a);return(t=this.onRender)===null||t===void 0||t.call(this),r.default?v("div",{class:[`${o}-spin-container`,this.themeClass],style:this.cssVars},v("div",{class:[`${o}-spin-content`,this.compitableShow&&`${o}-spin-content--spinning`]},r),v(Bt,{name:"fade-in-transition"},{default:()=>this.compitableShow?l:null})):l}});const yd="n-tabs",yb={tab:[String,Number,Object,Function],name:{type:[String,Number],required:!0},disabled:Boolean,displayDirective:{type:String,default:"if"},closable:{type:Boolean,default:void 0},tabProps:Object,label:[String,Number,Object,Function]};var HI=ae({__TAB_PANE__:!0,name:"TabPane",alias:["TabPanel"],props:yb,setup(e){const t=me(yd,null);return t||il("tab-pane","`n-tab-pane` must be placed inside `n-tabs`."),{style:t.paneStyleRef,class:t.paneClassRef,mergedClsPrefix:t.mergedClsPrefixRef}},render(){return v("div",{class:[`${this.mergedClsPrefix}-tab-pane`,this.class],style:this.style},this.$slots)}});const DI=Object.assign({internalLeftPadded:Boolean,internalAddable:Boolean,internalCreatedByPane:Boolean},Lc(yb,["displayDirective"]));var ic=ae({__TAB__:!0,inheritAttrs:!1,name:"Tab",props:DI,setup(e){const{mergedClsPrefixRef:t,valueRef:r,typeRef:o,closableRef:n,tabStyleRef:i,tabChangeIdRef:a,onBeforeLeaveRef:l,triggerRef:s,handleAdd:d,activateTab:c,handleClose:u}=me(yd);return{trigger:s,mergedClosable:H(()=>{if(e.internalAddable)return!1;const{closable:f}=e;return f===void 0?n.value:f}),style:i,clsPrefix:t,value:r,type:o,handleClose(f){f.stopPropagation(),!e.disabled&&u(e.name)},activateTab(){if(e.disabled)return;if(e.internalAddable){d();return}const{name:f}=e,p=++a.id;if(f!==r.value){const{value:h}=l;h?Promise.resolve(h(e.name,r.value)).then(g=>{g&&a.id===p&&c(f)}):c(f)}}}},render(){const{internalAddable:e,clsPrefix:t,name:r,disabled:o,label:n,tab:i,value:a,mergedClosable:l,style:s,trigger:d,$slots:{default:c}}=this,u=n!=null?n:i;return v("div",{class:`${t}-tabs-tab-wrapper`},this.internalLeftPadded?v("div",{class:`${t}-tabs-tab-pad`}):null,v("div",Object.assign({key:r,"data-name":r,"data-disabled":o?!0:void 0},so({class:[`${t}-tabs-tab`,a===r&&`${t}-tabs-tab--active`,o&&`${t}-tabs-tab--disabled`,l&&`${t}-tabs-tab--closable`,e&&`${t}-tabs-tab--addable`],onClick:d==="click"?this.activateTab:void 0,onMouseenter:d==="hover"?this.activateTab:void 0,style:e?void 0:s},this.internalCreatedByPane?this.tabProps||{}:this.$attrs)),v("span",{class:`${t}-tabs-tab__label`},e?v(Je,null,v("div",{class:`${t}-tabs-tab__height-placeholder`},"\xA0"),v(zt,{clsPrefix:t},{default:()=>v(m6,null)})):c?c():typeof u=="object"?u:St(u!=null?u:r)),l&&this.type==="card"?v(ji,{clsPrefix:t,class:`${t}-tabs-tab__close`,onClick:this.handleClose,disabled:o}):null))}}),FI=M("tabs",` + box-sizing: border-box; + width: 100%; + display: flex; + flex-direction: column; + transition: + background-color .3s var(--n-bezier), + border-color .3s var(--n-bezier); +`,[K("segment-type",[M("tabs-rail",[O("&.transition-disabled","color: red;",[M("tabs-tab",` + transition: none; + `)])])]),K("left, right",` + flex-direction: row; + `,[M("tabs-bar",` + width: 2px; + right: 0; + transition: + top .2s var(--n-bezier), + max-height .2s var(--n-bezier), + background-color .3s var(--n-bezier); + `),M("tabs-tab",` + padding: var(--n-tab-padding-vertical); + `)]),K("right",` + flex-direction: row-reverse; + `,[M("tabs-bar",` + left: 0; + `)]),K("bottom",` + flex-direction: column-reverse; + justify-content: flex-end; + `,[M("tabs-bar",` + top: 0; + `)]),M("tabs-rail",` + padding: 3px; + border-radius: var(--n-tab-border-radius); + width: 100%; + background-color: var(--n-color-segment); + transition: background-color .3s var(--n-bezier); + display: flex; + align-items: center; + `,[M("tabs-tab-wrapper",` + flex-basis: 0; + flex-grow: 1; + display: flex; + align-items: center; + justify-content: center; + `,[M("tabs-tab",` + overflow: hidden; + border-radius: var(--n-tab-border-radius); + width: 100%; + display: flex; + align-items: center; + justify-content: center; + `,[K("active",` + font-weight: var(--n-font-weight-strong); + color: var(--n-tab-text-color-active); + background-color: var(--n-tab-color-segment); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .08); + `),O("&:hover",` + color: var(--n-tab-text-color-hover); + `)])])]),K("flex",[M("tabs-nav",{width:"100%"},[M("tabs-wrapper",{width:"100%"},[M("tabs-tab",{marginRight:0})])])]),M("tabs-nav",` + box-sizing: border-box; + line-height: 1.5; + display: flex; + transition: border-color .3s var(--n-bezier); + `,[D("prefix, suffix",` + display: flex; + align-items: center; + `),D("prefix","padding-right: 16px;"),D("suffix","padding-left: 16px;")]),M("tabs-nav-scroll-wrapper",` + flex: 1; + position: relative; + overflow: hidden; + `,[K("shadow-before",[O("&::before",` + box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, .12); + `)]),K("shadow-after",[O("&::after",` + box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, .12); + `)]),M("tabs-nav-y-scroll",` + height: 100%; + width: 100%; + overflow-y: auto; + scrollbar-width: none; + `,[O("&::-webkit-scrollbar",` + width: 0; + height: 0; + `)]),O("&::before, &::after",` + transition: box-shadow .3s var(--n-bezier); + pointer-events: none; + content: ""; + position: absolute; + top: 0; + bottom: 0; + width: 20px; + z-index: 1; + `),O("&::before",` + left: 0; + `),O("&::after",` + right: 0; + `)]),M("tabs-nav-scroll-content",` + display: flex; + position: relative; + min-width: 100%; + width: fit-content; + `),M("tabs-wrapper",` + display: inline-flex; + flex-wrap: nowrap; + position: relative; + `),M("tabs-tab-wrapper",` + display: flex; + flex-wrap: nowrap; + flex-shrink: 0; + flex-grow: 0; + `),M("tabs-tab",` + cursor: pointer; + white-space: nowrap; + flex-wrap: nowrap; + display: inline-flex; + align-items: center; + color: var(--n-tab-text-color); + font-size: var(--n-tab-font-size); + background-clip: padding-box; + padding: var(--n-tab-padding); + transition: + box-shadow .3s var(--n-bezier), + color .3s var(--n-bezier), + background-color .3s var(--n-bezier), + border-color .3s var(--n-bezier); + `,[K("disabled",{cursor:"not-allowed"}),D("close",` + margin-left: 6px; + transition: + background-color .3s var(--n-bezier), + color .3s var(--n-bezier); + `),D("label",` + display: flex; + align-items: center; + `)]),M("tabs-bar",` + position: absolute; + bottom: 0; + height: 2px; + border-radius: 1px; + background-color: var(--n-bar-color); + transition: + left .2s var(--n-bezier), + max-width .2s var(--n-bezier), + background-color .3s var(--n-bezier); + `,[O("&.transition-disabled",` + transition: none; + `),K("disabled",` + background-color: var(--n-tab-text-color-disabled) + `)]),M("tabs-pane-wrapper",` + position: relative; + overflow: hidden; + transition: max-height .2s var(--n-bezier); + `),M("tab-pane",` + color: var(--n-pane-text-color); + width: 100%; + padding: var(--n-pane-padding); + transition: + color .3s var(--n-bezier), + background-color .3s var(--n-bezier), + opacity .2s var(--n-bezier); + left: 0; + right: 0; + top: 0; + `,[O("&.next-transition-leave-active, &.prev-transition-leave-active, &.next-transition-enter-active, &.prev-transition-enter-active",` + transition: + color .3s var(--n-bezier), + background-color .3s var(--n-bezier), + transform .2s var(--n-bezier), + opacity .2s var(--n-bezier); + `),O("&.next-transition-leave-active, &.prev-transition-leave-active",` + position: absolute; + `),O("&.next-transition-enter-from, &.prev-transition-leave-to",` + transform: translateX(32px); + opacity: 0; + `),O("&.next-transition-leave-to, &.prev-transition-enter-from",` + transform: translateX(-32px); + opacity: 0; + `),O("&.next-transition-leave-from, &.next-transition-enter-to, &.prev-transition-leave-from, &.prev-transition-enter-to",` + transform: translateX(0); + opacity: 1; + `)]),M("tabs-tab-pad",` + width: var(--n-tab-gap); + flex-grow: 0; + flex-shrink: 0; + `),K("line-type, bar-type",[M("tabs-tab",` + font-weight: var(--n-tab-font-weight); + box-sizing: border-box; + vertical-align: bottom; + `,[O("&:hover",{color:"var(--n-tab-text-color-hover)"}),K("active",` + color: var(--n-tab-text-color-active); + font-weight: var(--n-tab-font-weight-active); + `),K("disabled",{color:"var(--n-tab-text-color-disabled)"})])]),M("tabs-nav",[K("line-type",[D("prefix, suffix",` + transition: border-color .3s var(--n-bezier); + border-bottom: 1px solid var(--n-tab-border-color); + `),M("tabs-nav-scroll-content",` + transition: border-color .3s var(--n-bezier); + border-bottom: 1px solid var(--n-tab-border-color); + `),M("tabs-bar",` + border-radius: 0; + bottom: -1px; + `)]),K("card-type",[D("prefix, suffix",` + transition: border-color .3s var(--n-bezier); + border-bottom: 1px solid var(--n-tab-border-color); + `),M("tabs-pad",` + flex-grow: 1; + transition: border-color .3s var(--n-bezier); + border-bottom: 1px solid var(--n-tab-border-color); + `),M("tabs-tab-pad",` + transition: border-color .3s var(--n-bezier); + border-bottom: 1px solid var(--n-tab-border-color); + `),M("tabs-tab",` + font-weight: var(--n-tab-font-weight); + border: 1px solid var(--n-tab-border-color); + border-top-left-radius: var(--n-tab-border-radius); + border-top-right-radius: var(--n-tab-border-radius); + background-color: var(--n-tab-color); + box-sizing: border-box; + position: relative; + vertical-align: bottom; + display: flex; + justify-content: space-between; + font-size: var(--n-tab-font-size); + color: var(--n-tab-text-color); + `,[K("addable",` + padding-left: 8px; + padding-right: 8px; + font-size: 16px; + `,[D("height-placeholder",` + width: 0; + font-size: var(--n-tab-font-size); + `),ut("disabled",[O("&:hover",` + color: var(--n-tab-text-color-hover); + `)])]),K("closable","padding-right: 6px;"),K("active",` + border-bottom: 1px solid #0000; + background-color: #0000; + font-weight: var(--n-tab-font-weight-active); + color: var(--n-tab-text-color-active); + `),K("disabled","color: var(--n-tab-text-color-disabled);")]),M("tabs-scroll-padding","border-bottom: 1px solid var(--n-tab-border-color);")]),K("left, right",[M("tabs-wrapper",` + flex-direction: column; + `,[M("tabs-tab-wrapper",` + flex-direction: column; + `,[M("tabs-tab-pad",` + height: var(--n-tab-gap); + width: 100%; + `)])]),M("tabs-nav-scroll-content",` + border-bottom: none; + `)]),K("left",[M("tabs-nav-scroll-content",` + box-sizing: border-box; + border-right: 1px solid var(--n-tab-border-color); + `)]),K("right",[M("tabs-nav-scroll-content",` + border-left: 1px solid var(--n-tab-border-color); + `)]),K("bottom",[M("tabs-nav-scroll-content",` + border-top: 1px solid var(--n-tab-border-color); + border-bottom: none; + `)])])]);const jI=Object.assign(Object.assign({},Ee.props),{value:[String,Number],defaultValue:[String,Number],trigger:{type:String,default:"click"},type:{type:String,default:"bar"},closable:Boolean,justifyContent:String,size:{type:String,default:"medium"},placement:{type:String,default:"top"},tabStyle:[String,Object],barWidth:Number,paneClass:String,paneStyle:[String,Object],addable:[Boolean,Object],tabsPadding:{type:Number,default:0},animated:Boolean,onBeforeLeave:Function,onAdd:Function,"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],onClose:[Function,Array],labelSize:String,activeName:[String,Number],onActiveNameChange:[Function,Array]});var NI=ae({name:"Tabs",props:jI,setup(e,{slots:t}){var r,o,n,i;const{mergedClsPrefixRef:a,inlineThemeDisabled:l}=st(e),s=Ee("Tabs","-tabs",FI,zR,e,a),d=V(null),c=V(null),u=V(null),f=V(null),p=V(null),h=V(!0),g=V(!0),b=Ti(e,["labelSize","size"]),m=Ti(e,["activeName","value"]),y=V((o=(r=m.value)!==null&&r!==void 0?r:e.defaultValue)!==null&&o!==void 0?o:t.default?(i=(n=Ao(t.default())[0])===null||n===void 0?void 0:n.props)===null||i===void 0?void 0:i.name:null),w=En(m,y),x={id:0},k=H(()=>{if(!(!e.justifyContent||e.type==="card"))return{display:"flex",justifyContent:e.justifyContent}});De(w,()=>{x.id=0,R(),_()});function T(){var z;const{value:L}=w;return L===null?null:(z=d.value)===null||z===void 0?void 0:z.querySelector(`[data-name="${L}"]`)}function S(z){if(e.type==="card")return;const{value:L}=c;if(!!L&&z){const Y=`${a.value}-tabs-bar--disabled`,{barWidth:q,placement:J}=e;if(z.dataset.disabled==="true"?L.classList.add(Y):L.classList.remove(Y),["top","bottom"].includes(J)){if($(["top","maxHeight","height"]),typeof q=="number"&&z.offsetWidth>=q){const Z=Math.floor((z.offsetWidth-q)/2)+z.offsetLeft;L.style.left=`${Z}px`,L.style.maxWidth=`${q}px`}else L.style.left=`${z.offsetLeft}px`,L.style.maxWidth=`${z.offsetWidth}px`;L.style.width="8192px",L.offsetWidth}else{if($(["left","maxWidth","width"]),typeof q=="number"&&z.offsetHeight>=q){const Z=Math.floor((z.offsetHeight-q)/2)+z.offsetTop;L.style.top=`${Z}px`,L.style.maxHeight=`${q}px`}else L.style.top=`${z.offsetTop}px`,L.style.maxHeight=`${z.offsetHeight}px`;L.style.height="8192px",L.offsetHeight}}}function $(z){const{value:L}=c;if(!!L)for(const Y of z)L.style[Y]=""}function R(){if(e.type==="card")return;const z=T();z&&S(z)}function _(z){var L;const Y=(L=p.value)===null||L===void 0?void 0:L.$el;if(!Y)return;const q=T();if(!q)return;const{scrollLeft:J,offsetWidth:Z}=Y,{offsetLeft:fe,offsetWidth:de}=q;J>fe?Y.scrollTo({top:0,left:fe,behavior:"smooth"}):fe+de>J+Z&&Y.scrollTo({top:0,left:fe+de-Z,behavior:"smooth"})}const N=V(null);let E=0,F=null;function j(z){const L=N.value;if(L){E=z.getBoundingClientRect().height;const Y=`${E}px`,q=()=>{L.style.height=Y,L.style.maxHeight=Y};F?(q(),F(),F=null):F=q}}function Q(z){const L=N.value;if(L){const Y=z.getBoundingClientRect().height,q=()=>{document.body.offsetHeight,L.style.maxHeight=`${Y}px`,L.style.height=`${Math.max(E,Y)}px`};F?(F(),F=null,q()):F=q}}function A(){const z=N.value;z&&(z.style.maxHeight="",z.style.height="")}const X={value:[]},ne=V("next");function pe(z){const L=w.value;let Y="next";for(const q of X.value){if(q===L)break;if(q===z){Y="prev";break}}ne.value=Y,Ce(z)}function Ce(z){const{onActiveNameChange:L,onUpdateValue:Y,"onUpdate:value":q}=e;L&&Ae(L,z),Y&&Ae(Y,z),q&&Ae(q,z),y.value=z}function $e(z){const{onClose:L}=e;L&&Ae(L,z)}function _e(){const{value:z}=c;if(!z)return;const L="transition-disabled";z.classList.add(L),R(),z.classList.remove(L)}let Ge=0;function Le(z){var L;if(z.contentRect.width===0&&z.contentRect.height===0||Ge===z.contentRect.width)return;Ge=z.contentRect.width;const{type:Y}=e;(Y==="line"||Y==="bar")&&_e(),Y!=="segment"&&Re((L=p.value)===null||L===void 0?void 0:L.$el)}const U=Jl(Le,64);De([()=>e.justifyContent,()=>e.size],()=>{Zt(()=>{const{type:z}=e;(z==="line"||z==="bar")&&_e()})});const ee=V(!1);function G(z){var L;const{target:Y,contentRect:{width:q}}=z,J=Y.parentElement.offsetWidth;if(!ee.value)JZ.$el.offsetWidth&&(ee.value=!1)}Re((L=p.value)===null||L===void 0?void 0:L.$el)}const se=Jl(G,64);function ce(){const{onAdd:z}=e;z&&z(),Zt(()=>{const L=T(),{value:Y}=p;!L||!Y||Y.scrollTo({left:L.offsetLeft,top:0,behavior:"smooth"})})}function Re(z){if(!z)return;const{scrollLeft:L,scrollWidth:Y,offsetWidth:q}=z;h.value=L<=0,g.value=L+q>=Y}const ge=Jl(z=>{Re(z.target)},64);Be(yd,{triggerRef:Te(e,"trigger"),tabStyleRef:Te(e,"tabStyle"),paneClassRef:Te(e,"paneClass"),paneStyleRef:Te(e,"paneStyle"),mergedClsPrefixRef:a,typeRef:Te(e,"type"),closableRef:Te(e,"closable"),valueRef:w,tabChangeIdRef:x,onBeforeLeaveRef:Te(e,"onBeforeLeave"),activateTab:pe,handleClose:$e,handleAdd:ce}),gv(()=>{R(),_()}),Wt(()=>{const{value:z}=u;if(!z||["left","right"].includes(e.placement))return;const{value:L}=a,Y=`${L}-tabs-nav-scroll-wrapper--shadow-before`,q=`${L}-tabs-nav-scroll-wrapper--shadow-after`;h.value?z.classList.remove(Y):z.classList.add(Y),g.value?z.classList.remove(q):z.classList.add(q)});const C=V(null);De(w,()=>{if(e.type==="segment"){const z=C.value;z&&Zt(()=>{z.classList.add("transition-disabled"),z.offsetWidth,z.classList.remove("transition-disabled")})}});const P={syncBarPosition:()=>{R()}},I=H(()=>{const{value:z}=b,{type:L}=e,Y={card:"Card",bar:"Bar",line:"Line",segment:"Segment"}[L],q=`${z}${Y}`,{self:{barColor:J,closeIconColor:Z,closeIconColorHover:fe,closeIconColorPressed:de,tabColor:he,tabBorderColor:we,paneTextColor:Ie,tabFontWeight:Ne,tabBorderRadius:Fe,tabFontWeightActive:et,colorSegment:xt,fontWeightStrong:Ft,tabColorSegment:qr,closeSize:er,closeIconSize:Gt,closeColorHover:bt,closeColorPressed:re,closeBorderRadius:ve,[ie("panePadding",z)]:Pe,[ie("tabPadding",q)]:Ye,[ie("tabPaddingVertical",q)]:ct,[ie("tabGap",q)]:wt,[ie("tabTextColor",L)]:Lt,[ie("tabTextColorActive",L)]:tt,[ie("tabTextColorHover",L)]:jt,[ie("tabTextColorDisabled",L)]:Ir,[ie("tabFontSize",z)]:Ko},common:{cubicBezierEaseInOut:qo}}=s.value;return{"--n-bezier":qo,"--n-color-segment":xt,"--n-bar-color":J,"--n-tab-font-size":Ko,"--n-tab-text-color":Lt,"--n-tab-text-color-active":tt,"--n-tab-text-color-disabled":Ir,"--n-tab-text-color-hover":jt,"--n-pane-text-color":Ie,"--n-tab-border-color":we,"--n-tab-border-radius":Fe,"--n-close-size":er,"--n-close-icon-size":Gt,"--n-close-color-hover":bt,"--n-close-color-pressed":re,"--n-close-border-radius":ve,"--n-close-icon-color":Z,"--n-close-icon-color-hover":fe,"--n-close-icon-color-pressed":de,"--n-tab-color":he,"--n-tab-font-weight":Ne,"--n-tab-font-weight-active":et,"--n-tab-padding":Ye,"--n-tab-padding-vertical":ct,"--n-tab-gap":wt,"--n-pane-padding":Pe,"--n-font-weight-strong":Ft,"--n-tab-color-segment":qr}}),W=l?Pt("tabs",H(()=>`${b.value[0]}${e.type[0]}`),I,e):void 0;return Object.assign({mergedClsPrefix:a,mergedValue:w,renderedNames:new Set,tabsRailElRef:C,tabsPaneWrapperRef:N,tabsElRef:d,barElRef:c,addTabInstRef:f,xScrollInstRef:p,scrollWrapperElRef:u,addTabFixed:ee,tabWrapperStyle:k,handleNavResize:U,mergedSize:b,handleScroll:ge,handleTabsResize:se,cssVars:l?void 0:I,themeClass:W==null?void 0:W.themeClass,animationDirection:ne,renderNameListRef:X,onAnimationBeforeLeave:j,onAnimationEnter:Q,onAnimationAfterEnter:A,onRender:W==null?void 0:W.onRender},P)},render(){const{mergedClsPrefix:e,type:t,placement:r,addTabFixed:o,addable:n,mergedSize:i,renderNameListRef:a,onRender:l,$slots:{default:s,prefix:d,suffix:c}}=this;l==null||l();const u=s?Ao(s()).filter(y=>y.type.__TAB_PANE__===!0):[],f=s?Ao(s()).filter(y=>y.type.__TAB__===!0):[],p=!f.length,h=t==="card",g=t==="segment",b=!h&&!g&&this.justifyContent;a.value=[];const m=()=>{const y=v("div",{style:this.tabWrapperStyle,class:[`${e}-tabs-wrapper`]},b?null:v("div",{class:`${e}-tabs-scroll-padding`,style:{width:`${this.tabsPadding}px`}}),p?u.map((w,x)=>(a.value.push(w.props.name),cs(v(ic,Object.assign({},w.props,{internalCreatedByPane:!0,internalLeftPadded:x!==0&&(!b||b==="center"||b==="start"||b==="end")}),w.children?{default:w.children.tab}:void 0)))):f.map((w,x)=>(a.value.push(w.props.name),cs(x!==0&&!b?hh(w):w))),!o&&n&&h?fh(n,(p?u.length:f.length)!==0):null,b?null:v("div",{class:`${e}-tabs-scroll-padding`,style:{width:`${this.tabsPadding}px`}}));return v("div",{ref:"tabsElRef",class:`${e}-tabs-nav-scroll-content`},h&&n?v(In,{onResize:this.handleTabsResize},{default:()=>y}):y,h?v("div",{class:`${e}-tabs-pad`}):null,h?null:v("div",{ref:"barElRef",class:`${e}-tabs-bar`}))};return v("div",{class:[`${e}-tabs`,this.themeClass,`${e}-tabs--${t}-type`,`${e}-tabs--${i}-size`,b&&`${e}-tabs--flex`,`${e}-tabs--${r}`],style:this.cssVars},v("div",{class:[`${e}-tabs-nav--${t}-type`,`${e}-tabs-nav--${r}`,`${e}-tabs-nav`]},dt(d,y=>y&&v("div",{class:`${e}-tabs-nav__prefix`},y)),g?v("div",{class:`${e}-tabs-rail`,ref:"tabsRailElRef"},p?u.map((y,w)=>(a.value.push(y.props.name),v(ic,Object.assign({},y.props,{internalCreatedByPane:!0,internalLeftPadded:w!==0}),y.children?{default:y.children.tab}:void 0))):f.map((y,w)=>(a.value.push(y.props.name),w===0?y:hh(y)))):v(In,{onResize:this.handleNavResize},{default:()=>v("div",{class:`${e}-tabs-nav-scroll-wrapper`,ref:"scrollWrapperElRef"},["top","bottom"].includes(r)?v(bS,{ref:"xScrollInstRef",onScroll:this.handleScroll},{default:m}):v("div",{class:`${e}-tabs-nav-y-scroll`},m()))}),o&&n&&h?fh(n,!0):null,dt(c,y=>y&&v("div",{class:`${e}-tabs-nav__suffix`},y))),p&&(this.animated?v("div",{ref:"tabsPaneWrapperRef",class:`${e}-tabs-pane-wrapper`},uh(u,this.mergedValue,this.renderedNames,this.onAnimationBeforeLeave,this.onAnimationEnter,this.onAnimationAfterEnter,this.animationDirection)):uh(u,this.mergedValue,this.renderedNames)))}});function uh(e,t,r,o,n,i,a){const l=[];return e.forEach(s=>{const{name:d,displayDirective:c,"display-directive":u}=s.props,f=h=>c===h||u===h,p=t===d;if(s.key!==void 0&&(s.key=d),p||f("show")||f("show:lazy")&&r.has(d)){r.has(d)||r.add(d);const h=!f("if");l.push(h?Tr(s,[[Si,p]]):s)}}),a?v(Rc,{name:`${a}-transition`,onBeforeLeave:o,onEnter:n,onAfterEnter:i},{default:()=>l}):l}function fh(e,t){return v(ic,{ref:"addTabInstRef",key:"__addable",name:"__addable",internalCreatedByPane:!0,internalAddable:!0,internalLeftPadded:t,disabled:typeof e=="object"&&e.disabled})}function hh(e){const t=lr(e);return t.props?t.props.internalLeftPadded=!0:t.props={internalLeftPadded:!0},t}function cs(e){return Array.isArray(e.dynamicProps)?e.dynamicProps.includes("internalLeftPadded")||e.dynamicProps.push("internalLeftPadded"):e.dynamicProps=["internalLeftPadded"],e}const WI=()=>({}),VI={name:"Equation",common:le,self:WI};var UI=VI;const KI={name:"dark",common:le,Alert:Y4,Anchor:tk,AutoComplete:hk,Avatar:ug,AvatarGroup:$k,BackTop:kk,Badge:zk,Breadcrumb:Dk,Button:Kt,ButtonGroup:PE,Calendar:Yk,Card:mg,Carousel:l8,Cascader:h8,Checkbox:Nn,Code:gg,Collapse:g8,CollapseTransition:C8,ColorPicker:Jk,DataTable:U8,DatePicker:vT,Descriptions:xT,Dialog:Lg,Divider:jT,Drawer:VT,Dropdown:sd,DynamicInput:qT,DynamicTags:rz,Element:nz,Empty:Vo,Ellipsis:$g,Equation:UI,Form:sz,GradientText:dE,Icon:X8,IconWrapper:hE,Image:rI,Input:ur,InputNumber:TE,LegacyTransfer:hI,Layout:EE,List:OE,LoadingBar:ME,Log:LE,Menu:VE,Mention:DE,Message:$E,Modal:ET,Notification:xE,PageHeader:qE,Pagination:wg,Popconfirm:XE,Popover:Uo,Popselect:bg,Progress:ob,Radio:_g,Rate:tR,Result:iR,Row:tI,Scrollbar:Ut,Select:Cg,Skeleton:OI,Slider:sR,Space:Ug,Spin:fR,Statistic:vR,Steps:xR,Switch:wR,Table:PR,Tabs:RR,Tag:Qm,Thing:AR,TimePicker:Ag,Timeline:LR,Tooltip:Cl,Transfer:FR,Tree:cb,TreeSelect:VR,Typography:GR,Upload:ZR,Watermark:QR};var wd={exports:{}},wb=function(t,r){return function(){for(var n=new Array(arguments.length),i=0;i=0)return;o==="set-cookie"?r[o]=(r[o]?r[o]:[]).concat([n]):r[o]=r[o]?r[o]+", "+n:n}}),r},vh=qt,SO=vh.isStandardBrowserEnv()?function(){var t=/(msie|trident)/i.test(navigator.userAgent),r=document.createElement("a"),o;function n(i){var a=i;return t&&(r.setAttribute("href",a),a=r.href),r.setAttribute("href",a),{href:r.href,protocol:r.protocol?r.protocol.replace(/:$/,""):"",host:r.host,search:r.search?r.search.replace(/^\?/,""):"",hash:r.hash?r.hash.replace(/^#/,""):"",hostname:r.hostname,port:r.port,pathname:r.pathname.charAt(0)==="/"?r.pathname:"/"+r.pathname}}return o=n(window.location.href),function(a){var l=vh.isString(a)?n(a):a;return l.protocol===o.protocol&&l.host===o.host}}():function(){return function(){return!0}}();function _d(e){this.message=e}_d.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")};_d.prototype.__CANCEL__=!0;var $l=_d,va=qt,$O=pO,_O=vO,PO=Pb,kO=CO,TO=wO,zO=SO,us=zb,EO=Tb,RO=$l,mh=function(t){return new Promise(function(o,n){var i=t.data,a=t.headers,l=t.responseType,s;function d(){t.cancelToken&&t.cancelToken.unsubscribe(s),t.signal&&t.signal.removeEventListener("abort",s)}va.isFormData(i)&&delete a["Content-Type"];var c=new XMLHttpRequest;if(t.auth){var u=t.auth.username||"",f=t.auth.password?unescape(encodeURIComponent(t.auth.password)):"";a.Authorization="Basic "+btoa(u+":"+f)}var p=kO(t.baseURL,t.url);c.open(t.method.toUpperCase(),PO(p,t.params,t.paramsSerializer),!0),c.timeout=t.timeout;function h(){if(!!c){var b="getAllResponseHeaders"in c?TO(c.getAllResponseHeaders()):null,m=!l||l==="text"||l==="json"?c.responseText:c.response,y={data:m,status:c.status,statusText:c.statusText,headers:b,config:t,request:c};$O(function(x){o(x),d()},function(x){n(x),d()},y),c=null}}if("onloadend"in c?c.onloadend=h:c.onreadystatechange=function(){!c||c.readyState!==4||c.status===0&&!(c.responseURL&&c.responseURL.indexOf("file:")===0)||setTimeout(h)},c.onabort=function(){!c||(n(us("Request aborted",t,"ECONNABORTED",c)),c=null)},c.onerror=function(){n(us("Network Error",t,null,c)),c=null},c.ontimeout=function(){var m=t.timeout?"timeout of "+t.timeout+"ms exceeded":"timeout exceeded",y=t.transitional||EO;t.timeoutErrorMessage&&(m=t.timeoutErrorMessage),n(us(m,t,y.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",c)),c=null},va.isStandardBrowserEnv()){var g=(t.withCredentials||zO(p))&&t.xsrfCookieName?_O.read(t.xsrfCookieName):void 0;g&&(a[t.xsrfHeaderName]=g)}"setRequestHeader"in c&&va.forEach(a,function(m,y){typeof i=="undefined"&&y.toLowerCase()==="content-type"?delete a[y]:c.setRequestHeader(y,m)}),va.isUndefined(t.withCredentials)||(c.withCredentials=!!t.withCredentials),l&&l!=="json"&&(c.responseType=t.responseType),typeof t.onDownloadProgress=="function"&&c.addEventListener("progress",t.onDownloadProgress),typeof t.onUploadProgress=="function"&&c.upload&&c.upload.addEventListener("progress",t.onUploadProgress),(t.cancelToken||t.signal)&&(s=function(b){!c||(n(!b||b&&b.type?new RO("canceled"):b),c.abort(),c=null)},t.cancelToken&&t.cancelToken.subscribe(s),t.signal&&(t.signal.aborted?s():t.signal.addEventListener("abort",s))),i||(i=null),c.send(i)})},Tt=qt,gh=uO,IO=kb,OO=Tb,AO={"Content-Type":"application/x-www-form-urlencoded"};function bh(e,t){!Tt.isUndefined(e)&&Tt.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}function MO(){var e;return(typeof XMLHttpRequest!="undefined"||typeof process!="undefined"&&Object.prototype.toString.call(process)==="[object process]")&&(e=mh),e}function BO(e,t,r){if(Tt.isString(e))try{return(t||JSON.parse)(e),Tt.trim(e)}catch(o){if(o.name!=="SyntaxError")throw o}return(r||JSON.stringify)(e)}var _l={transitional:OO,adapter:MO(),transformRequest:[function(t,r){return gh(r,"Accept"),gh(r,"Content-Type"),Tt.isFormData(t)||Tt.isArrayBuffer(t)||Tt.isBuffer(t)||Tt.isStream(t)||Tt.isFile(t)||Tt.isBlob(t)?t:Tt.isArrayBufferView(t)?t.buffer:Tt.isURLSearchParams(t)?(bh(r,"application/x-www-form-urlencoded;charset=utf-8"),t.toString()):Tt.isObject(t)||r&&r["Content-Type"]==="application/json"?(bh(r,"application/json"),BO(t)):t}],transformResponse:[function(t){var r=this.transitional||_l.transitional,o=r&&r.silentJSONParsing,n=r&&r.forcedJSONParsing,i=!o&&this.responseType==="json";if(i||n&&Tt.isString(t)&&t.length)try{return JSON.parse(t)}catch(a){if(i)throw a.name==="SyntaxError"?IO(a,this,"E_JSON_PARSE"):a}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};Tt.forEach(["delete","get","head"],function(t){_l.headers[t]={}});Tt.forEach(["post","put","patch"],function(t){_l.headers[t]=Tt.merge(AO)});var Pd=_l,LO=qt,HO=Pd,DO=function(t,r,o){var n=this||HO;return LO.forEach(o,function(a){t=a.call(n,t,r)}),t},Eb=function(t){return!!(t&&t.__CANCEL__)},xh=qt,fs=DO,FO=Eb,jO=Pd,NO=$l;function hs(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new NO("canceled")}var WO=function(t){hs(t),t.headers=t.headers||{},t.data=fs.call(t,t.data,t.headers,t.transformRequest),t.headers=xh.merge(t.headers.common||{},t.headers[t.method]||{},t.headers),xh.forEach(["delete","get","head","post","put","patch","common"],function(n){delete t.headers[n]});var r=t.adapter||jO.adapter;return r(t).then(function(n){return hs(t),n.data=fs.call(t,n.data,n.headers,t.transformResponse),n},function(n){return FO(n)||(hs(t),n&&n.response&&(n.response.data=fs.call(t,n.response.data,n.response.headers,t.transformResponse))),Promise.reject(n)})},Yt=qt,Rb=function(t,r){r=r||{};var o={};function n(c,u){return Yt.isPlainObject(c)&&Yt.isPlainObject(u)?Yt.merge(c,u):Yt.isPlainObject(u)?Yt.merge({},u):Yt.isArray(u)?u.slice():u}function i(c){if(Yt.isUndefined(r[c])){if(!Yt.isUndefined(t[c]))return n(void 0,t[c])}else return n(t[c],r[c])}function a(c){if(!Yt.isUndefined(r[c]))return n(void 0,r[c])}function l(c){if(Yt.isUndefined(r[c])){if(!Yt.isUndefined(t[c]))return n(void 0,t[c])}else return n(void 0,r[c])}function s(c){if(c in r)return n(t[c],r[c]);if(c in t)return n(void 0,t[c])}var d={url:a,method:a,data:a,baseURL:l,transformRequest:l,transformResponse:l,paramsSerializer:l,timeout:l,timeoutMessage:l,withCredentials:l,adapter:l,responseType:l,xsrfCookieName:l,xsrfHeaderName:l,onUploadProgress:l,onDownloadProgress:l,decompress:l,maxContentLength:l,maxBodyLength:l,transport:l,httpAgent:l,httpsAgent:l,cancelToken:l,socketPath:l,responseEncoding:l,validateStatus:s};return Yt.forEach(Object.keys(t).concat(Object.keys(r)),function(u){var f=d[u]||i,p=f(u);Yt.isUndefined(p)&&f!==s||(o[u]=p)}),o},Ib={version:"0.26.1"},VO=Ib.version,kd={};["object","boolean","number","function","string","symbol"].forEach(function(e,t){kd[e]=function(o){return typeof o===e||"a"+(t<1?"n ":" ")+e}});var Ch={};kd.transitional=function(t,r,o){function n(i,a){return"[Axios v"+VO+"] Transitional option '"+i+"'"+a+(o?". "+o:"")}return function(i,a,l){if(t===!1)throw new Error(n(a," has been removed"+(r?" in "+r:"")));return r&&!Ch[a]&&(Ch[a]=!0,console.warn(n(a," has been deprecated since v"+r+" and will be removed in the near future"))),t?t(i,a,l):!0}};function UO(e,t,r){if(typeof e!="object")throw new TypeError("options must be an object");for(var o=Object.keys(e),n=o.length;n-- >0;){var i=o[n],a=t[i];if(a){var l=e[i],s=l===void 0||a(l,i,e);if(s!==!0)throw new TypeError("option "+i+" must be "+s);continue}if(r!==!0)throw Error("Unknown option "+i)}}var KO={assertOptions:UO,validators:kd},Ob=qt,qO=Pb,yh=cO,wh=WO,Pl=Rb,Ab=KO,an=Ab.validators;function Ki(e){this.defaults=e,this.interceptors={request:new yh,response:new yh}}Ki.prototype.request=function(t,r){typeof t=="string"?(r=r||{},r.url=t):r=t||{},r=Pl(this.defaults,r),r.method?r.method=r.method.toLowerCase():this.defaults.method?r.method=this.defaults.method.toLowerCase():r.method="get";var o=r.transitional;o!==void 0&&Ab.assertOptions(o,{silentJSONParsing:an.transitional(an.boolean),forcedJSONParsing:an.transitional(an.boolean),clarifyTimeoutError:an.transitional(an.boolean)},!1);var n=[],i=!0;this.interceptors.request.forEach(function(p){typeof p.runWhen=="function"&&p.runWhen(r)===!1||(i=i&&p.synchronous,n.unshift(p.fulfilled,p.rejected))});var a=[];this.interceptors.response.forEach(function(p){a.push(p.fulfilled,p.rejected)});var l;if(!i){var s=[wh,void 0];for(Array.prototype.unshift.apply(s,n),s=s.concat(a),l=Promise.resolve(r);s.length;)l=l.then(s.shift(),s.shift());return l}for(var d=r;n.length;){var c=n.shift(),u=n.shift();try{d=c(d)}catch(f){u(f);break}}try{l=wh(d)}catch(f){return Promise.reject(f)}for(;a.length;)l=l.then(a.shift(),a.shift());return l};Ki.prototype.getUri=function(t){return t=Pl(this.defaults,t),qO(t.url,t.params,t.paramsSerializer).replace(/^\?/,"")};Ob.forEach(["delete","get","head","options"],function(t){Ki.prototype[t]=function(r,o){return this.request(Pl(o||{},{method:t,url:r,data:(o||{}).data}))}});Ob.forEach(["post","put","patch"],function(t){Ki.prototype[t]=function(r,o,n){return this.request(Pl(n||{},{method:t,url:r,data:o}))}});var GO=Ki,YO=$l;function On(e){if(typeof e!="function")throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(n){t=n});var r=this;this.promise.then(function(o){if(!!r._listeners){var n,i=r._listeners.length;for(n=0;n(localStorage.getItem("PAOPAO_TOKEN")&&(e.headers.Authorization="Bearer "+localStorage.getItem("PAOPAO_TOKEN")),e),e=>Promise.reject(e));Td.interceptors.response.use(e=>{const{data:t={},code:r=0}=(e==null?void 0:e.data)||{};if(+r==0)return t||{};Promise.reject((e==null?void 0:e.data)||{})},(e={})=>{var r;const{response:t={}}=e||{};return+(t==null?void 0:t.status)==401?(localStorage.removeItem("PAOPAO_TOKEN"),(t==null?void 0:t.data.code)!==10005?window.$message.warning((t==null?void 0:t.data.msg)||"\u9274\u6743\u5931\u8D25"):window.$store.commit("triggerAuth",!0)):window.$message.error(((r=t==null?void 0:t.data)==null?void 0:r.msg)||"\u8BF7\u6C42\u5931\u8D25"),Promise.reject((t==null?void 0:t.data)||{})});function ze(e){return Td(e)}const $h=e=>ze({method:"post",url:"/v1/auth/login",data:e}),nA=e=>ze({method:"post",url:"/v1/auth/register",data:e}),ps=(e="")=>ze({method:"get",url:"/v1/user/info",headers:{Authorization:`Bearer ${e}`}});var Bb=(e,t)=>{const r=e.__vccOpts||e;for(const[o,n]of t)r[o]=n;return r};const iA={class:"auth-wrap"},aA=ae({__name:"auth",setup(e){const t=ol(),r=V(!1),o=V(),n=vr({username:"",password:""}),i=V(),a=vr({username:"",password:"",repassword:""}),l={username:{required:!0,message:"\u8BF7\u8F93\u5165\u8D26\u6237\u540D"},password:{required:!0,message:"\u8BF7\u8F93\u5165\u5BC6\u7801"},repassword:[{required:!0,message:"\u8BF7\u8F93\u5165\u5BC6\u7801"},{validator:(c,u)=>!!a.password&&a.password.startsWith(u)&&a.password.length>=u.length,message:"\u4E24\u6B21\u5BC6\u7801\u8F93\u5165\u4E0D\u4E00\u81F4",trigger:"input"}]},s=c=>{var u;c.preventDefault(),c.stopPropagation(),(u=o.value)==null||u.validate(f=>{f||(r.value=!0,$h({username:n.username,password:n.password}).then(p=>{const h=(p==null?void 0:p.token)||"";return localStorage.setItem("PAOPAO_TOKEN",h),ps(h)}).then(p=>{window.$message.success("\u767B\u5F55\u6210\u529F"),r.value=!1,t.commit("updateUserinfo",p),t.commit("triggerAuth",!1),n.username="",n.password=""}).catch(p=>{r.value=!1}))})},d=c=>{var u;c.preventDefault(),c.stopPropagation(),(u=i.value)==null||u.validate(f=>{f||(r.value=!0,nA({username:a.username,password:a.password}).then(p=>$h({username:a.username,password:a.password})).then(p=>{const h=(p==null?void 0:p.token)||"";return localStorage.setItem("PAOPAO_TOKEN",h),ps(h)}).then(p=>{window.$message.success("\u6CE8\u518C\u6210\u529F"),r.value=!1,t.commit("updateUserinfo",p),t.commit("triggerAuth",!1),a.username="",a.password="",a.repassword=""}).catch(p=>{r.value=!1}))})};return gt(()=>{const c=localStorage.getItem("PAOPAO_TOKEN")||"";c?ps(c).then(u=>{t.commit("updateUserinfo",u),t.commit("triggerAuth",!1)}).catch(u=>{t.commit("userLogout")}):t.commit("userLogout")}),(c,u)=>{const f=sg,p=lE,h=fz,g=Da,b=HI,m=NI,y=ad,w=Ng;return lt(),ko(w,{show:Ze(t).state.authModalShow,"onUpdate:show":u[5]||(u[5]=x=>Ze(t).state.authModalShow=x),class:"auth-card",preset:"card",size:"small","mask-closable":!1,bordered:!1,style:{width:"360px"}},{default:qe(()=>[Me("div",iA,[be(y,{bordered:!1},{default:qe(()=>[be(m,{"default-value":Ze(t).state.authModelTab,size:"large","justify-content":"space-evenly"},{default:qe(()=>[be(b,{name:"signin",tab:"\u767B\u5F55"},{default:qe(()=>[be(h,{ref_key:"loginRef",ref:o,model:n,rules:{username:{required:!0,message:"\u8BF7\u8F93\u5165\u8D26\u6237\u540D"},password:{required:!0,message:"\u8BF7\u8F93\u5165\u5BC6\u7801"}}},{default:qe(()=>[be(p,{label:"\u8D26\u6237",path:"username"},{default:qe(()=>[be(f,{value:n.username,"onUpdate:value":u[0]||(u[0]=x=>n.username=x),placeholder:"\u8BF7\u8F93\u5165\u7528\u6237\u540D",onKeyup:ri(ti(s,["prevent"]),["enter"])},null,8,["value","onKeyup"])]),_:1}),be(p,{label:"\u5BC6\u7801",path:"password"},{default:qe(()=>[be(f,{type:"password","show-password-on":"mousedown",value:n.password,"onUpdate:value":u[1]||(u[1]=x=>n.password=x),placeholder:"\u8BF7\u8F93\u5165\u8D26\u6237\u5BC6\u7801",onKeyup:ri(ti(s,["prevent"]),["enter"])},null,8,["value","onKeyup"])]),_:1})]),_:1},8,["model"]),be(g,{type:"primary",block:"",secondary:"",strong:"",loading:r.value,onClick:s},{default:qe(()=>[mr(" \u767B\u5F55 ")]),_:1},8,["loading"])]),_:1}),be(b,{name:"signup",tab:"\u6CE8\u518C"},{default:qe(()=>[be(h,{ref_key:"registerRef",ref:i,model:a,rules:l},{default:qe(()=>[be(p,{label:"\u7528\u6237\u540D",path:"username"},{default:qe(()=>[be(f,{value:a.username,"onUpdate:value":u[2]||(u[2]=x=>a.username=x),placeholder:"\u7528\u6237\u540D\u6CE8\u518C\u540E\u65E0\u6CD5\u4FEE\u6539"},null,8,["value"])]),_:1}),be(p,{label:"\u5BC6\u7801",path:"password"},{default:qe(()=>[be(f,{type:"password","show-password-on":"mousedown",placeholder:"\u5BC6\u7801\u4E0D\u5C11\u4E8E6\u4F4D",value:a.password,"onUpdate:value":u[3]||(u[3]=x=>a.password=x),onKeyup:ri(ti(d,["prevent"]),["enter"])},null,8,["value","onKeyup"])]),_:1}),be(p,{label:"\u91CD\u590D\u5BC6\u7801",path:"repassword"},{default:qe(()=>[be(f,{type:"password","show-password-on":"mousedown",placeholder:"\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801",value:a.repassword,"onUpdate:value":u[4]||(u[4]=x=>a.repassword=x),onKeyup:ri(ti(d,["prevent"]),["enter"])},null,8,["value","onKeyup"])]),_:1})]),_:1},8,["model"]),be(g,{type:"primary",block:"",secondary:"",strong:"",loading:r.value,onClick:d},{default:qe(()=>[mr(" \u6CE8\u518C ")]),_:1},8,["loading"])]),_:1})]),_:1},8,["default-value"])]),_:1})])]),_:1},8,["show"])}}});var lA=Bb(aA,[["__scopeId","data-v-66895776"]]);const JM=e=>ze({method:"get",url:"/v1/posts",params:e}),sA=e=>ze({method:"get",url:"/v1/tags",params:e}),QM=e=>ze({method:"get",url:"/v1/post",params:e}),eB=e=>ze({method:"get",url:"/v1/post/star",params:e}),tB=e=>ze({method:"post",url:"/v1/post/star",data:e}),rB=e=>ze({method:"get",url:"/v1/post/collection",params:e}),oB=e=>ze({method:"post",url:"/v1/post/collection",data:e}),nB=e=>ze({method:"get",url:"/v1/post/comments",params:e}),iB=e=>ze({method:"get",url:"/v1/user/contacts",params:e}),aB=e=>ze({method:"post",url:"/v1/post",data:e}),lB=e=>ze({method:"delete",url:"/v1/post",data:e}),sB=e=>ze({method:"post",url:"/v1/post/lock",data:e}),cB=e=>ze({method:"post",url:"/v1/post/stick",data:e}),dB=e=>ze({method:"post",url:"/v1/post/visibility",data:e}),uB=e=>ze({method:"post",url:"/v1/post/comment",data:e}),fB=e=>ze({method:"delete",url:"/v1/post/comment",data:e}),hB=e=>ze({method:"post",url:"/v1/post/comment/reply",data:e}),pB=e=>ze({method:"delete",url:"/v1/post/comment/reply",data:e}),cA={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},dA=Me("path",{d:"M128 80V64a48.14 48.14 0 0 1 48-48h224a48.14 48.14 0 0 1 48 48v368l-80-64",fill:"none",stroke:"currentColor","stroke-linejoin":"round","stroke-width":"32"},null,-1),uA=Me("path",{d:"M320 96H112a48.14 48.14 0 0 0-48 48v352l152-128l152 128V144a48.14 48.14 0 0 0-48-48z",fill:"none",stroke:"currentColor","stroke-linejoin":"round","stroke-width":"32"},null,-1),fA=[dA,uA];var hA=ae({name:"BookmarksOutline",render:function(t,r){return lt(),It("svg",cA,fA)}});const pA={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},vA=Me("path",{d:"M431 320.6c-1-3.6 1.2-8.6 3.3-12.2a33.68 33.68 0 0 1 2.1-3.1A162 162 0 0 0 464 215c.3-92.2-77.5-167-173.7-167c-83.9 0-153.9 57.1-170.3 132.9a160.7 160.7 0 0 0-3.7 34.2c0 92.3 74.8 169.1 171 169.1c15.3 0 35.9-4.6 47.2-7.7s22.5-7.2 25.4-8.3a26.44 26.44 0 0 1 9.3-1.7a26 26 0 0 1 10.1 2l56.7 20.1a13.52 13.52 0 0 0 3.9 1a8 8 0 0 0 8-8a12.85 12.85 0 0 0-.5-2.7z",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-miterlimit":"10","stroke-width":"32"},null,-1),mA=Me("path",{d:"M66.46 232a146.23 146.23 0 0 0 6.39 152.67c2.31 3.49 3.61 6.19 3.21 8s-11.93 61.87-11.93 61.87a8 8 0 0 0 2.71 7.68A8.17 8.17 0 0 0 72 464a7.26 7.26 0 0 0 2.91-.6l56.21-22a15.7 15.7 0 0 1 12 .2c18.94 7.38 39.88 12 60.83 12A159.21 159.21 0 0 0 284 432.11",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-miterlimit":"10","stroke-width":"32"},null,-1),gA=[vA,mA];var bA=ae({name:"ChatbubblesOutline",render:function(t,r){return lt(),It("svg",pA,gA)}});const xA={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},CA=Me("path",{d:"M80 212v236a16 16 0 0 0 16 16h96V328a24 24 0 0 1 24-24h80a24 24 0 0 1 24 24v136h96a16 16 0 0 0 16-16V212",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),yA=Me("path",{d:"M480 256L266.89 52c-5-5.28-16.69-5.34-21.78 0L32 256",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),wA=Me("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M400 179V64h-48v69"},null,-1),SA=[CA,yA,wA];var _h=ae({name:"HomeOutline",render:function(t,r){return lt(),It("svg",xA,SA)}});const $A={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},_A=Me("path",{d:"M321.89 171.42C233 114 141 155.22 56 65.22c-19.8-21-8.3 235.5 98.1 332.7c77.79 71 197.9 63.08 238.4-5.92s18.28-163.17-70.61-220.58z",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),PA=Me("path",{d:"M173 253c86 81 175 129 292 147",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),kA=[_A,PA];var TA=ae({name:"LeafOutline",render:function(t,r){return lt(),It("svg",$A,kA)}});const zA={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},EA=Me("path",{d:"M304 336v40a40 40 0 0 1-40 40H104a40 40 0 0 1-40-40V136a40 40 0 0 1 40-40h152c22.09 0 48 17.91 48 40v40",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),RA=Me("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M368 336l80-80l-80-80"},null,-1),IA=Me("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32",d:"M176 256h256"},null,-1),OA=[EA,RA,IA];var Ph=ae({name:"LogOutOutline",render:function(t,r){return lt(),It("svg",zA,OA)}});const AA={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},MA=Pp('',6),BA=[MA];var LA=ae({name:"MegaphoneOutline",render:function(t,r){return lt(),It("svg",AA,BA)}});const HA={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},DA=Me("path",{d:"M402 168c-2.93 40.67-33.1 72-66 72s-63.12-31.32-66-72c-3-42.31 26.37-72 66-72s69 30.46 66 72z",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),FA=Me("path",{d:"M336 304c-65.17 0-127.84 32.37-143.54 95.41c-2.08 8.34 3.15 16.59 11.72 16.59h263.65c8.57 0 13.77-8.25 11.72-16.59C463.85 335.36 401.18 304 336 304z",fill:"none",stroke:"currentColor","stroke-miterlimit":"10","stroke-width":"32"},null,-1),jA=Me("path",{d:"M200 185.94c-2.34 32.48-26.72 58.06-53 58.06s-50.7-25.57-53-58.06C91.61 152.15 115.34 128 147 128s55.39 24.77 53 57.94z",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),NA=Me("path",{d:"M206 306c-18.05-8.27-37.93-11.45-59-11.45c-52 0-102.1 25.85-114.65 76.2c-1.65 6.66 2.53 13.25 9.37 13.25H154",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-miterlimit":"10","stroke-width":"32"},null,-1),WA=[DA,FA,jA,NA];var VA=ae({name:"PeopleOutline",render:function(t,r){return lt(),It("svg",HA,WA)}});const UA={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},KA=Me("path",{d:"M456.69 421.39L362.6 327.3a173.81 173.81 0 0 0 34.84-104.58C397.44 126.38 319.06 48 222.72 48S48 126.38 48 222.72s78.38 174.72 174.72 174.72A173.81 173.81 0 0 0 327.3 362.6l94.09 94.09a25 25 0 0 0 35.3-35.3zM97.92 222.72a124.8 124.8 0 1 1 124.8 124.8a124.95 124.95 0 0 1-124.8-124.8z",fill:"currentColor"},null,-1),qA=[KA];var GA=ae({name:"Search",render:function(t,r){return lt(),It("svg",UA,qA)}});const YA={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},XA=Me("path",{d:"M262.29 192.31a64 64 0 1 0 57.4 57.4a64.13 64.13 0 0 0-57.4-57.4zM416.39 256a154.34 154.34 0 0 1-1.53 20.79l45.21 35.46a10.81 10.81 0 0 1 2.45 13.75l-42.77 74a10.81 10.81 0 0 1-13.14 4.59l-44.9-18.08a16.11 16.11 0 0 0-15.17 1.75A164.48 164.48 0 0 1 325 400.8a15.94 15.94 0 0 0-8.82 12.14l-6.73 47.89a11.08 11.08 0 0 1-10.68 9.17h-85.54a11.11 11.11 0 0 1-10.69-8.87l-6.72-47.82a16.07 16.07 0 0 0-9-12.22a155.3 155.3 0 0 1-21.46-12.57a16 16 0 0 0-15.11-1.71l-44.89 18.07a10.81 10.81 0 0 1-13.14-4.58l-42.77-74a10.8 10.8 0 0 1 2.45-13.75l38.21-30a16.05 16.05 0 0 0 6-14.08c-.36-4.17-.58-8.33-.58-12.5s.21-8.27.58-12.35a16 16 0 0 0-6.07-13.94l-38.19-30A10.81 10.81 0 0 1 49.48 186l42.77-74a10.81 10.81 0 0 1 13.14-4.59l44.9 18.08a16.11 16.11 0 0 0 15.17-1.75A164.48 164.48 0 0 1 187 111.2a15.94 15.94 0 0 0 8.82-12.14l6.73-47.89A11.08 11.08 0 0 1 213.23 42h85.54a11.11 11.11 0 0 1 10.69 8.87l6.72 47.82a16.07 16.07 0 0 0 9 12.22a155.3 155.3 0 0 1 21.46 12.57a16 16 0 0 0 15.11 1.71l44.89-18.07a10.81 10.81 0 0 1 13.14 4.58l42.77 74a10.8 10.8 0 0 1-2.45 13.75l-38.21 30a16.05 16.05 0 0 0-6.05 14.08c.33 4.14.55 8.3.55 12.47z",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"32"},null,-1),ZA=[XA];var JA=ae({name:"SettingsOutline",render:function(t,r){return lt(),It("svg",YA,ZA)}});const QA={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 512 512"},eM=Me("rect",{x:"48",y:"144",width:"416",height:"288",rx:"48",ry:"48",fill:"none",stroke:"currentColor","stroke-linejoin":"round","stroke-width":"32"},null,-1),tM=Me("path",{d:"M411.36 144v-30A50 50 0 0 0 352 64.9L88.64 109.85A50 50 0 0 0 48 159v49",fill:"none",stroke:"currentColor","stroke-linejoin":"round","stroke-width":"32"},null,-1),rM=Me("path",{d:"M368 320a32 32 0 1 1 32-32a32 32 0 0 1-32 32z",fill:"currentColor"},null,-1),oM=[eM,tM,rM];var nM=ae({name:"WalletOutline",render:function(t,r){return lt(),It("svg",QA,oM)}});const iM={key:0,class:"rightbar-wrap"},aM={class:"search-wrap"},lM={class:"post-num"},sM={class:"copyright"},cM=["href"],dM=["href"],uM=ae({__name:"rightbar",setup(e){const t=V([]),r=V(!1),o=V(""),n=ol(),i=Kp(),a="2022 paopao.info",l="Roc's Me",s="",d="\u6CE1\u6CE1(PaoPao)\u5F00\u6E90\u793E\u533A",c="https://paopao.info",u=()=>{r.value=!0,sA({type:"hot",num:12}).then(h=>{t.value=h.topics,r.value=!1}).catch(h=>{r.value=!1})},f=h=>h>=1e3?(h/1e3).toFixed(1)+"k":h,p=()=>{i.push({name:"home",query:{q:o.value}})};return gt(()=>{u()}),(h,g)=>{const b=fn,m=sg,y=up("router-link"),w=LI,x=ad,k=ez;return Ze(n).state.collapsedRight?Ps("",!0):(lt(),It("div",iM,[Me("div",aM,[be(m,{round:"",clearable:"",placeholder:"\u641C\u4E00\u641C...",value:o.value,"onUpdate:value":g[0]||(g[0]=T=>o.value=T),onKeyup:ri(ti(p,["prevent"]),["enter"])},{prefix:qe(()=>[be(b,{component:Ze(GA)},null,8,["component"])]),_:1},8,["value","onKeyup"])]),be(x,{title:"\u70ED\u95E8\u8BDD\u9898",embedded:"",bordered:!1,size:"small"},{default:qe(()=>[be(w,{show:r.value},{default:qe(()=>[(lt(!0),It(Je,null,H1(t.value,T=>(lt(),It("div",{class:"hot-tag-item",key:T.id},[be(y,{class:"hash-link",to:{name:"home",query:{q:T.tag,t:"tag"}}},{default:qe(()=>[mr(" #"+wo(T.tag),1)]),_:2},1032,["to"]),Me("div",lM,wo(f(T.quote_num)),1)]))),128))]),_:1},8,["show"])]),_:1}),be(x,{class:"copyright-wrap",embedded:"",bordered:!1,size:"small"},{default:qe(()=>[Me("div",sM,"\xA9 "+wo(Ze(a)),1),Me("div",null,[be(k,null,{default:qe(()=>[Me("a",{href:Ze(s),target:"_blank",class:"hash-link"},wo(Ze(l)),9,cM),Me("a",{href:Ze(c),target:"_blank",class:"hash-link"},wo(Ze(d)),9,dM)]),_:1})])]),_:1})]))}}});var fM=Bb(uM,[["__scopeId","data-v-715681a1"]]);const hM={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 24 24"},pM=Pp('',1),vM=[pM];var kh=ae({name:"Hash",render:function(t,r){return lt(),It("svg",hM,vM)}});const vB=(e={})=>ze({method:"get",url:"/v1/captcha",params:e}),mB=e=>ze({method:"post",url:"/v1/captcha",data:e}),gB=e=>ze({method:"post",url:"/v1/user/whisper",data:e}),bB=e=>ze({method:"post",url:"/v1/friend/requesting",data:e}),xB=e=>ze({method:"post",url:"/v1/friend/add",data:e}),CB=e=>ze({method:"post",url:"/v1/friend/reject",data:e}),yB=e=>ze({method:"post",url:"/v1/friend/delete",data:e}),wB=e=>ze({method:"post",url:"/v1/user/phone",data:e}),SB=e=>ze({method:"post",url:"/v1/user/activate",data:e}),$B=e=>ze({method:"post",url:"/v1/user/password",data:e}),_B=e=>ze({method:"post",url:"/v1/user/nickname",data:e}),PB=e=>ze({method:"post",url:"/v1/user/avatar",data:e}),Th=(e={})=>ze({method:"get",url:"/v1/user/msgcount/unread",params:e}),kB=e=>ze({method:"get",url:"/v1/user/messages",params:e}),TB=e=>ze({method:"post",url:"/v1/user/message/read",data:e}),zB=e=>ze({method:"get",url:"/v1/user/collections",params:e}),EB=e=>ze({method:"get",url:"/v1/user/profile",params:e}),RB=e=>ze({method:"get",url:"/v1/user/posts",params:e}),IB=e=>ze({method:"get",url:"/v1/user/wallet/bills",params:e}),OB=e=>ze({method:"post",url:"/v1/user/recharge",data:e}),AB=e=>ze({method:"get",url:"/v1/user/recharge",params:e}),MB=e=>ze({method:"get",url:"/v1/suggest/users",params:e}),BB=e=>ze({method:"get",url:"/v1/suggest/tags",params:e}),LB=e=>ze({method:"get",url:"/v1/attachment/precheck",params:e}),HB=e=>ze({method:"get",url:"/v1/attachment",params:e}),DB=e=>ze({method:"post",url:"/v1/admin/user/status",data:e});var mM="/assets/logo.52afee68.png";const gM={class:"sidebar-wrap"},bM={class:"logo-wrap"},xM={key:0,class:"user-wrap"},CM={class:"user-info"},yM={class:"nickname"},wM={class:"nickname-txt"},SM={class:"username"},$M={class:"user-mini-wrap"},_M={key:1,class:"user-wrap"},PM={class:"login-wrap"},kM=ae({__name:"sidebar",setup(e){const t=ol(),r=uy(),o=Kp(),n=V(!1),i=V(r.name||""),a=V();De(r,()=>{i.value=r.name}),De(t.state,()=>{t.state.userInfo.id>0?a.value||(Th().then(h=>{n.value=h.count>0}).catch(h=>{console.log(h)}),a.value=setInterval(()=>{Th().then(h=>{n.value=h.count>0}).catch(h=>{console.log(h)})},5e3)):a.value&&clearInterval(a.value)}),gt(()=>{window.onresize=()=>{t.commit("triggerCollapsedLeft",document.body.clientWidth<=821),t.commit("triggerCollapsedRight",document.body.clientWidth<=821)}});const l=H(()=>{const h=[{label:"\u5E7F\u573A",key:"home",icon:()=>v(_h),href:"/"},{label:"\u8BDD\u9898",key:"topic",icon:()=>v(kh),href:"/topic"}];return"false".toLowerCase()==="true"&&h.push({label:"\u516C\u544A",key:"anouncement",icon:()=>v(LA),href:"/anouncement"}),h.push({label:"\u4E3B\u9875",key:"profile",icon:()=>v(TA),href:"/profile"}),h.push({label:"\u6D88\u606F",key:"messages",icon:()=>v(bA),href:"/messages"}),h.push({label:"\u6536\u85CF",key:"collection",icon:()=>v(hA),href:"/collection"}),h.push({label:"\u597D\u53CB",key:"contacts",icon:()=>v(VA),href:"/contacts"}),"false".toLocaleLowerCase()==="true"&&h.push({label:"\u94B1\u5305",key:"wallet",icon:()=>v(nM),href:"/wallet"}),h.push({label:"\u8BBE\u7F6E",key:"setting",icon:()=>v(JA),href:"/setting"}),t.state.userInfo.id>0?h:[{label:"\u5E7F\u573A",key:"home",icon:()=>v(_h),href:"/"},{label:"\u8BDD\u9898",key:"topic",icon:()=>v(kh),href:"/topic"}]}),s=h=>"href"in h?v("div",{},h.label):h.label,d=h=>h.key==="messages"?v(Mk,{dot:!0,show:n.value,processing:!0},{default:()=>v(fn,{color:h.key===i.value?"var(--n-item-icon-color-active)":"var(--n-item-icon-color)"},{default:h.icon})}):v(fn,null,{default:h.icon}),c=(h,g={})=>{i.value=h,o.push({name:h})},u=()=>{r.path==="/"&&t.commit("refresh"),c("home")},f=h=>{t.commit("triggerAuth",!0),t.commit("triggerAuthKey",h)},p=()=>{t.commit("userLogout")};return window.$store=t,window.$message=II(),(h,g)=>{const b=cI,m=$I,y=yk,w=Da;return lt(),It("div",gM,[Me("div",bM,[be(b,{class:"logo-img",width:"36",src:Ze(mM),"preview-disabled":!0,onClick:u},null,8,["src"])]),be(m,{accordion:!0,collapsed:Ze(t).state.collapsedLeft,"collapsed-width":64,"icon-size":24,options:Ze(l),"render-label":s,"render-icon":d,value:i.value,"onUpdate:value":c},null,8,["collapsed","options","value"]),Ze(t).state.userInfo.id>0?(lt(),It("div",xM,[be(y,{class:"user-avatar",round:"",size:34,src:Ze(t).state.userInfo.avatar},null,8,["src"]),Me("div",CM,[Me("div",yM,[Me("span",wM,wo(Ze(t).state.userInfo.nickname),1),be(w,{class:"logout",quaternary:"",circle:"",size:"tiny",onClick:p},{icon:qe(()=>[be(Ze(fn),null,{default:qe(()=>[be(Ze(Ph))]),_:1})]),_:1})]),Me("div",SM,"@"+wo(Ze(t).state.userInfo.username),1)]),Me("div",$M,[be(w,{class:"logout",quaternary:"",circle:"",onClick:p},{icon:qe(()=>[be(Ze(fn),{size:24},{default:qe(()=>[be(Ze(Ph))]),_:1})]),_:1})])])):(lt(),It("div",_M,[Me("div",PM,[be(w,{strong:"",secondary:"",round:"",type:"primary",onClick:g[0]||(g[0]=x=>f("signin"))},{default:qe(()=>[mr(" \u767B\u5F55 ")]),_:1}),be(w,{strong:"",secondary:"",round:"",type:"info",onClick:g[1]||(g[1]=x=>f("signup"))},{default:qe(()=>[mr(" \u6CE8\u518C ")]),_:1})])]))])}}});const TM={"has-sider":"",class:"main-wrap",position:"static"},zM={class:"content-wrap"},EM=ae({__name:"App",setup(e){const t=ol(),r=H(()=>t.state.theme==="dark"?KI:null);return(o,n)=>{const i=kM,a=up("router-view"),l=fM,s=lA,d=HT,c=RI,u=sE,f=w8;return lt(),ko(f,{theme:Ze(r)},{default:qe(()=>[be(c,null,{default:qe(()=>[be(d,null,{default:qe(()=>{var p;return[Me("div",{class:ja(["app-container",{dark:((p=Ze(r))==null?void 0:p.name)==="dark"}])},[Me("div",TM,[be(i),Me("div",zM,[be(a,{class:"app-wrap"},{default:qe(({Component:h})=>[(lt(),ko(R1,null,[o.$route.meta.keepAlive?(lt(),ko(jd(h),{key:0})):Ps("",!0)],1024)),o.$route.meta.keepAlive?Ps("",!0):(lt(),ko(jd(h),{key:0}))]),_:1})]),be(l)]),be(s)],2)]}),_:1})]),_:1}),be(u)]),_:1},8,["theme"])}}});Yx(EM).use(qp).use(Ey).mount("#app");export{ol as $,Pt as A,dt as B,Ao as C,Ny as D,DM as E,ag as F,xl as G,UT as H,js as I,Em as J,Da as K,Lr as L,m6 as M,zt as N,Uy as O,Kh as P,Ke as Q,Tn as R,De as S,Dr as T,Qe as U,Zt as V,lt as W,NM as X,It as Y,Me as Z,sg as _,ut as a,Rn as a$,MB as a0,BB as a1,gt as a2,Ze as a3,be as a4,qe as a5,ko as a6,Ps as a7,ti as a8,mr as a9,ad as aA,Hc as aB,pv as aC,UM as aD,Dn as aE,Tv as aF,D1 as aG,dn as aH,N4 as aI,St as aJ,Wt as aK,D4 as aL,Mu as aM,Zm as aN,Wy as aO,P8 as aP,Bm as aQ,sr as aR,Iu as aS,Jt as aT,Vy as aU,Lc as aV,bl as aW,Mi as aX,T8 as aY,Ti as aZ,Hi as a_,wo as aa,Je as ab,H1 as ac,aB as ad,yk as ae,fn as af,Tg as ag,ez as ah,Bb as ai,uy as aj,JM as ak,Kp as al,up as am,OM as an,jM as ao,kr as ap,Dc as aq,Nr as ar,ht as as,CR as at,Oi as au,Iy as av,Ou as aw,Ia as ax,vl as ay,gl as az,O as b,sB as b$,_v as b0,Pv as b1,zv as b2,Bt as b3,Tr as b4,Si as b5,Ds as b6,_i as b7,LM as b8,WM as b9,Ng as bA,YM as bB,io as bC,Er as bD,ar as bE,Im as bF,Rm as bG,Om as bH,Xs as bI,JE as bJ,ml as bK,x6 as bL,og as bM,XM as bN,wp as bO,VM as bP,KM as bQ,Pp as bR,hB as bS,pB as bT,fB as bU,uB as bV,RM as bW,IM as bX,eB as bY,rB as bZ,lB as b_,Fo as ba,sp as bb,cp as bc,so as bd,In as be,iv as bf,af as bg,Fm as bh,Fr as bi,HM as bj,Km as bk,FM as bl,av as bm,zw as bn,Wm as bo,il as bp,Fc as bq,Wr as br,lr as bs,AM as bt,ri as bu,jd as bv,cI as bw,ZM as bx,LB as by,HB as bz,M as c,cB as c0,dB as c1,tB as c2,oB as c3,sT as c4,QM as c5,nB as c6,LI as c7,sA as c8,HI as c9,ps as cA,IB as cB,OB as cC,AB as cD,vB as cE,PB as cF,$B as cG,wB as cH,SB as cI,_B as cJ,mB as cK,Zz as cL,oE as cM,tE as cN,fz as cO,qM as cP,NI as ca,ja as cb,RB as cc,ld as cd,_T as ce,gB as cf,bB as cg,II as ch,vr as ci,EB as cj,yB as ck,DB as cl,q4 as cm,xe as cn,ji as co,xB as cp,CB as cq,TB as cr,Mk as cs,kB as ct,zB as cu,iB as cv,bf as cw,xr as cx,hl as cy,GM as cz,ae as d,K as e,D as f,co as g,v as h,Fk as i,Kr as j,je as k,L8 as l,oe as m,MM as n,jv as o,Be as p,me as q,V as r,En as s,Te as t,st as u,mt as v,Ae as w,Ee as x,H as y,ie as z}; diff --git a/web/dist/assets/logo.52afee68.png b/web/dist/assets/logo.52afee68.png new file mode 100644 index 00000000..7054b5bd Binary files /dev/null and b/web/dist/assets/logo.52afee68.png differ diff --git a/web/dist/assets/main-nav.3167f221.js b/web/dist/assets/main-nav.3167f221.js new file mode 100644 index 00000000..66be661f --- /dev/null +++ b/web/dist/assets/main-nav.3167f221.js @@ -0,0 +1,102 @@ +import{ap as ne,aq as Be,ar as Se,as as $e,r as D,k as ze,at as Me,m as Re,c as ae,f as t,au as oe,b as X,e as h,a as ie,d as L,u as Ve,x as le,o as Le,t as Fe,s as Te,y as E,z as k,av as Z,aw as f,A as Oe,ax as G,h as r,B as y,ay as Ee,az as Ae,w as J,W as z,Y as ee,Z as W,$ as Ne,al as Pe,a2 as De,a6 as Q,a5 as R,a4 as A,a3 as N,a7 as re,a9 as He,aa as Ie,af as We,K as Ke,aA as Ue}from"./index.d4f5aad2.js";let P=0;const je=typeof window!="undefined"&&window.matchMedia!==void 0,B=D(null);let c,C;function H(e){e.matches&&(B.value="dark")}function I(e){e.matches&&(B.value="light")}function qe(){c=window.matchMedia("(prefers-color-scheme: dark)"),C=window.matchMedia("(prefers-color-scheme: light)"),c.matches?B.value="dark":C.matches?B.value="light":B.value=null,c.addEventListener?(c.addEventListener("change",H),C.addEventListener("change",I)):c.addListener&&(c.addListener(H),C.addListener(I))}function Ye(){"removeEventListener"in c?(c.removeEventListener("change",H),C.removeEventListener("change",I)):"removeListener"in c&&(c.removeListener(H),C.removeListener(I)),c=void 0,C=void 0}let se=!0;function Xe(){return je?(P===0&&qe(),se&&(se=Be())&&(Se(()=>{P+=1}),$e(()=>{P-=1,P===0&&Ye()})),ne(B)):ne(B)}const Ze=e=>{const{primaryColor:o,opacityDisabled:i,borderRadius:s,textColor3:l}=e,v="rgba(0, 0, 0, .14)";return Object.assign(Object.assign({},Me),{iconColor:l,textColor:"white",loadingColor:o,opacityDisabled:i,railColor:v,railColorActive:o,buttonBoxShadow:"0 1px 4px 0 rgba(0, 0, 0, 0.3), inset 0 0 1px 0 rgba(0, 0, 0, 0.05)",buttonColor:"#FFF",railBorderRadiusSmall:s,railBorderRadiusMedium:s,railBorderRadiusLarge:s,buttonBorderRadiusSmall:s,buttonBorderRadiusMedium:s,buttonBorderRadiusLarge:s,boxShadowFocus:`0 0 0 2px ${Re(o,{alpha:.2})}`})},Ge={name:"Switch",common:ze,self:Ze};var Je=Ge,Qe=ae("switch",` + height: var(--n-height); + min-width: var(--n-width); + vertical-align: middle; + user-select: none; + -webkit-user-select: none; + display: inline-flex; + outline: none; + justify-content: center; + align-items: center; +`,[t("children-placeholder",` + height: var(--n-rail-height); + display: flex; + flex-direction: column; + overflow: hidden; + pointer-events: none; + visibility: hidden; + `),t("rail-placeholder",` + display: flex; + flex-wrap: none; + `),t("button-placeholder",` + width: calc(1.75 * var(--n-rail-height)); + height: var(--n-rail-height); + `),ae("base-loading",` + position: absolute; + top: 50%; + left: 50%; + transform: translateX(-50%) translateY(-50%); + font-size: calc(var(--n-button-width) - 4px); + color: var(--n-loading-color); + transition: color .3s var(--n-bezier); + `,[oe({left:"50%",top:"50%",originalTransform:"translateX(-50%) translateY(-50%)"})]),t("checked, unchecked",` + transition: color .3s var(--n-bezier); + color: var(--n-text-color); + box-sizing: border-box; + position: absolute; + white-space: nowrap; + top: 0; + bottom: 0; + display: flex; + align-items: center; + line-height: 1; + `),t("checked",` + right: 0; + padding-right: calc(1.25 * var(--n-rail-height) - var(--n-offset)); + `),t("unchecked",` + left: 0; + justify-content: flex-end; + padding-left: calc(1.25 * var(--n-rail-height) - var(--n-offset)); + `),X("&:focus",[t("rail",` + box-shadow: var(--n-box-shadow-focus); + `)]),h("round",[t("rail","border-radius: calc(var(--n-rail-height) / 2);",[t("button","border-radius: calc(var(--n-button-height) / 2);")])]),ie("disabled",[ie("icon",[h("rubber-band",[h("pressed",[t("rail",[t("button","max-width: var(--n-button-width-pressed);")])]),t("rail",[X("&:active",[t("button","max-width: var(--n-button-width-pressed);")])]),h("active",[h("pressed",[t("rail",[t("button","left: calc(100% - var(--n-offset) - var(--n-button-width-pressed));")])]),t("rail",[X("&:active",[t("button","left: calc(100% - var(--n-offset) - var(--n-button-width-pressed));")])])])])])]),h("active",[t("rail",[t("button","left: calc(100% - var(--n-button-width) - var(--n-offset))")])]),t("rail",` + overflow: hidden; + height: var(--n-rail-height); + min-width: var(--n-rail-width); + border-radius: var(--n-rail-border-radius); + cursor: pointer; + position: relative; + transition: + opacity .3s var(--n-bezier), + background .3s var(--n-bezier), + box-shadow .3s var(--n-bezier); + background-color: var(--n-rail-color); + `,[t("button-icon",` + color: var(--n-icon-color); + transition: color .3s var(--n-bezier); + font-size: calc(var(--n-button-height) - 4px); + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + display: flex; + justify-content: center; + align-items: center; + line-height: 1; + `,[oe()]),t("button",` + align-items: center; + top: var(--n-offset); + left: var(--n-offset); + height: var(--n-button-height); + width: var(--n-button-width-pressed); + max-width: var(--n-button-width); + border-radius: var(--n-button-border-radius); + background-color: var(--n-button-color); + box-shadow: var(--n-button-box-shadow); + box-sizing: border-box; + cursor: inherit; + content: ""; + position: absolute; + transition: + background-color .3s var(--n-bezier), + left .3s var(--n-bezier), + opacity .3s var(--n-bezier), + max-width .3s var(--n-bezier), + box-shadow .3s var(--n-bezier); + `)]),h("active",[t("rail","background-color: var(--n-rail-color-active);")]),h("loading",[t("rail",` + cursor: wait; + `)]),h("disabled",[t("rail",` + cursor: not-allowed; + opacity: .5; + `)])]);const et=Object.assign(Object.assign({},le.props),{size:{type:String,default:"medium"},value:{type:[String,Number,Boolean],default:void 0},loading:Boolean,defaultValue:{type:[String,Number,Boolean],default:!1},disabled:{type:Boolean,default:void 0},round:{type:Boolean,default:!0},"onUpdate:value":[Function,Array],onUpdateValue:[Function,Array],checkedValue:{type:[String,Number,Boolean],default:!0},uncheckedValue:{type:[String,Number,Boolean],default:!1},railStyle:Function,rubberBand:{type:Boolean,default:!0},onChange:[Function,Array]});let V;var tt=L({name:"Switch",props:et,setup(e){V===void 0&&(typeof CSS!="undefined"?typeof CSS.supports!="undefined"?V=CSS.supports("width","max(1px)"):V=!1:V=!0);const{mergedClsPrefixRef:o,inlineThemeDisabled:i}=Ve(e),s=le("Switch","-switch",Qe,Je,e,o),l=Le(e),{mergedSizeRef:v,mergedDisabledRef:d}=l,S=D(e.defaultValue),g=Fe(e,"value"),u=Te(g,S),x=E(()=>u.value===e.checkedValue),b=D(!1),a=D(!1),m=E(()=>{const{railStyle:n}=e;if(!!n)return n({focused:a.value,checked:x.value})});function w(n){const{"onUpdate:value":F,onChange:T,onUpdateValue:O}=e,{nTriggerFormInput:K,nTriggerFormChange:U}=l;F&&J(F,n),O&&J(O,n),T&&J(T,n),S.value=n,K(),U()}function ce(){const{nTriggerFormFocus:n}=l;n()}function de(){const{nTriggerFormBlur:n}=l;n()}function ue(){e.loading||d.value||(u.value!==e.checkedValue?w(e.checkedValue):w(e.uncheckedValue))}function he(){a.value=!0,ce()}function fe(){a.value=!1,de(),b.value=!1}function ve(n){e.loading||d.value||n.key===" "&&(u.value!==e.checkedValue?w(e.checkedValue):w(e.uncheckedValue),b.value=!1)}function ge(n){e.loading||d.value||n.key===" "&&(n.preventDefault(),b.value=!0)}const te=E(()=>{const{value:n}=v,{self:{opacityDisabled:F,railColor:T,railColorActive:O,buttonBoxShadow:K,buttonColor:U,boxShadowFocus:be,loadingColor:me,textColor:we,iconColor:pe,[k("buttonHeight",n)]:p,[k("buttonWidth",n)]:_e,[k("buttonWidthPressed",n)]:xe,[k("railHeight",n)]:_,[k("railWidth",n)]:M,[k("railBorderRadius",n)]:ke,[k("buttonBorderRadius",n)]:ye},common:{cubicBezierEaseInOut:Ce}}=s.value;let j,q,Y;return V?(j=`calc((${_} - ${p}) / 2)`,q=`max(${_}, ${p})`,Y=`max(${M}, calc(${M} + ${p} - ${_}))`):(j=Z((f(_)-f(p))/2),q=Z(Math.max(f(_),f(p))),Y=f(_)>f(p)?M:Z(f(M)+f(p)-f(_))),{"--n-bezier":Ce,"--n-button-border-radius":ye,"--n-button-box-shadow":K,"--n-button-color":U,"--n-button-width":_e,"--n-button-width-pressed":xe,"--n-button-height":p,"--n-height":q,"--n-offset":j,"--n-opacity-disabled":F,"--n-rail-border-radius":ke,"--n-rail-color":T,"--n-rail-color-active":O,"--n-rail-height":_,"--n-rail-width":M,"--n-width":Y,"--n-box-shadow-focus":be,"--n-loading-color":me,"--n-text-color":we,"--n-icon-color":pe}}),$=i?Oe("switch",E(()=>v.value[0]),te,e):void 0;return{handleClick:ue,handleBlur:fe,handleFocus:he,handleKeyup:ve,handleKeydown:ge,mergedRailStyle:m,pressed:b,mergedClsPrefix:o,mergedValue:u,checked:x,mergedDisabled:d,cssVars:i?void 0:te,themeClass:$==null?void 0:$.themeClass,onRender:$==null?void 0:$.onRender}},render(){const{mergedClsPrefix:e,mergedDisabled:o,checked:i,mergedRailStyle:s,onRender:l,$slots:v}=this;l==null||l();const{checked:d,unchecked:S,icon:g,"checked-icon":u,"unchecked-icon":x}=v,b=!(G(g)&&G(u)&&G(x));return r("div",{role:"switch","aria-checked":i,class:[`${e}-switch`,this.themeClass,b&&`${e}-switch--icon`,i&&`${e}-switch--active`,o&&`${e}-switch--disabled`,this.round&&`${e}-switch--round`,this.loading&&`${e}-switch--loading`,this.pressed&&`${e}-switch--pressed`,this.rubberBand&&`${e}-switch--rubber-band`],tabindex:this.mergedDisabled?void 0:0,style:this.cssVars,onClick:this.handleClick,onFocus:this.handleFocus,onBlur:this.handleBlur,onKeyup:this.handleKeyup,onKeydown:this.handleKeydown},r("div",{class:`${e}-switch__rail`,"aria-hidden":"true",style:s},y(d,a=>y(S,m=>a||m?r("div",{"aria-hidden":!0,class:`${e}-switch__children-placeholder`},r("div",{class:`${e}-switch__rail-placeholder`},r("div",{class:`${e}-switch__button-placeholder`}),a),r("div",{class:`${e}-switch__rail-placeholder`},r("div",{class:`${e}-switch__button-placeholder`}),m)):null)),r("div",{class:`${e}-switch__button`},y(g,a=>y(u,m=>y(x,w=>r(Ee,null,{default:()=>this.loading?r(Ae,{key:"loading",clsPrefix:e,strokeWidth:20}):this.checked&&(m||a)?r("div",{class:`${e}-switch__button-icon`,key:m?"checked-icon":"icon"},m||a):!this.checked&&(w||a)?r("div",{class:`${e}-switch__button-icon`,key:w?"unchecked-icon":"icon"},w||a):null})))),y(d,a=>a&&r("div",{key:"checked",class:`${e}-switch__checked`},a)),y(S,a=>a&&r("div",{key:"unchecked",class:`${e}-switch__unchecked`},a)))))}});const nt={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 24 24"},at=W("path",{d:"M14.71 6.71a.996.996 0 0 0-1.41 0L8.71 11.3a.996.996 0 0 0 0 1.41l4.59 4.59a.996.996 0 1 0 1.41-1.41L10.83 12l3.88-3.88c.39-.39.38-1.03 0-1.41z",fill:"currentColor"},null,-1),ot=[at];var it=L({name:"ChevronLeftRound",render:function(o,i){return z(),ee("svg",nt,ot)}});const rt={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 24 24"},st=W("path",{d:"M9.37 5.51A7.35 7.35 0 0 0 9.1 7.5c0 4.08 3.32 7.4 7.4 7.4c.68 0 1.35-.09 1.99-.27A7.014 7.014 0 0 1 12 19c-3.86 0-7-3.14-7-7c0-2.93 1.81-5.45 4.37-6.49zM12 3a9 9 0 1 0 9 9c0-.46-.04-.92-.1-1.36a5.389 5.389 0 0 1-4.4 2.26a5.403 5.403 0 0 1-3.14-9.8c-.44-.06-.9-.1-1.36-.1z",fill:"currentColor"},null,-1),lt=[st];var ct=L({name:"DarkModeOutlined",render:function(o,i){return z(),ee("svg",rt,lt)}});const dt={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 24 24"},ut=W("path",{d:"M12 9c1.65 0 3 1.35 3 3s-1.35 3-3 3s-3-1.35-3-3s1.35-3 3-3m0-2c-2.76 0-5 2.24-5 5s2.24 5 5 5s5-2.24 5-5s-2.24-5-5-5zM2 13h2c.55 0 1-.45 1-1s-.45-1-1-1H2c-.55 0-1 .45-1 1s.45 1 1 1zm18 0h2c.55 0 1-.45 1-1s-.45-1-1-1h-2c-.55 0-1 .45-1 1s.45 1 1 1zM11 2v2c0 .55.45 1 1 1s1-.45 1-1V2c0-.55-.45-1-1-1s-1 .45-1 1zm0 18v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1s-1 .45-1 1zM5.99 4.58a.996.996 0 0 0-1.41 0a.996.996 0 0 0 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0s.39-1.03 0-1.41L5.99 4.58zm12.37 12.37a.996.996 0 0 0-1.41 0a.996.996 0 0 0 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0a.996.996 0 0 0 0-1.41l-1.06-1.06zm1.06-10.96a.996.996 0 0 0 0-1.41a.996.996 0 0 0-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06zM7.05 18.36a.996.996 0 0 0 0-1.41a.996.996 0 0 0-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06z",fill:"currentColor"},null,-1),ht=[ut];var ft=L({name:"LightModeOutlined",render:function(o,i){return z(),ee("svg",dt,ht)}});const vt={class:"navbar"},bt=L({__name:"main-nav",props:{title:{default:""},back:{type:Boolean,default:!1},theme:{type:Boolean,default:!0}},setup(e){const o=e,i=Ne(),s=Pe(),l=d=>{d?(localStorage.setItem("PAOPAO_THEME","dark"),i.commit("triggerTheme","dark")):(localStorage.setItem("PAOPAO_THEME","light"),i.commit("triggerTheme","light"))},v=()=>{window.history.length<=1?s.push({path:"/"}):s.go(-1)};return De(()=>{localStorage.getItem("PAOPAO_THEME")||l(Xe()==="dark")}),(d,S)=>{const g=We,u=Ke,x=tt,b=Ue;return z(),Q(b,{size:"small",bordered:!0,class:"nav-title-card"},{header:R(()=>[W("div",vt,[e.back?(z(),Q(u,{key:0,class:"back-btn",onClick:v,quaternary:"",circle:"",size:"small"},{icon:R(()=>[A(g,null,{default:R(()=>[A(N(it))]),_:1})]),_:1})):re("",!0),He(" "+Ie(o.title)+" ",1),o.theme?(z(),Q(x,{key:1,value:N(i).state.theme==="dark","onUpdate:value":l,size:"small",class:"theme-switch-wrap"},{"checked-icon":R(()=>[A(g,{component:N(ft)},null,8,["component"])]),"unchecked-icon":R(()=>[A(g,{component:N(ct)},null,8,["component"])]),_:1},8,["value"])):re("",!0)])]),_:1})}}});export{bt as _}; diff --git a/web/dist/assets/main-nav.b4a45e8a.css b/web/dist/assets/main-nav.b4a45e8a.css new file mode 100644 index 00000000..6ce451a2 --- /dev/null +++ b/web/dist/assets/main-nav.b4a45e8a.css @@ -0,0 +1 @@ +.nav-title-card{z-index:99;width:100%;top:0;position:sticky;border-radius:0;border-bottom:0;background-color:#ffffffbf;backdrop-filter:blur(12px)}.nav-title-card .navbar{height:30px;position:relative;display:flex;align-items:center}.nav-title-card .navbar .back-btn{margin-right:8px}.nav-title-card .navbar .theme-switch-wrap{position:absolute;right:0;top:calc(50% - 9px)}.dark .nav-title-card{background-color:#101014bf} diff --git a/web/dist/assets/post-item.11c28084.js b/web/dist/assets/post-item.11c28084.js new file mode 100644 index 00000000..b8737242 --- /dev/null +++ b/web/dist/assets/post-item.11c28084.js @@ -0,0 +1 @@ +import{p as O,H as V,C as j,B as D,_ as E,a as F,b as L,c as M}from"./content.ed80294a.js";import{d as R,aj as S,al as I,$ as P,y as W,am as Y,W as o,Y as f,a4 as i,an as Z,a3 as t,a5 as n,ab as A,ac as G,a8 as v,Z as u,a9 as _,aa as p,a6 as r,a7 as c,ae as J,ao as K,af as Q,ah as U}from"./index.d4f5aad2.js";import{f as X}from"./formatTime.e07969bb.js";import{_ as tt}from"./Thing.d394adea.js";const et={class:"nickname-wrap"},st={class:"username-wrap"},at={class:"timestamp"},nt=["innerHTML"],ot={class:"opt-item"},it={class:"opt-item"},rt={class:"opt-item"},ut=R({__name:"post-item",props:{post:null},setup(x){const C=x;S();const m=I(),B=P(),e=W(()=>{let a=Object.assign({texts:[],imgs:[],videos:[],links:[],attachments:[],charge_attachments:[]},C.post);return a.contents.map(s=>{(+s.type==1||+s.type==2)&&a.texts.push(s),+s.type==3&&a.imgs.push(s),+s.type==4&&a.videos.push(s),+s.type==6&&a.links.push(s),+s.type==7&&a.attachments.push(s),+s.type==8&&a.charge_attachments.push(s)}),a}),k=a=>{m.push({name:"post",query:{id:a}})},b=(a,s)=>{if(a.target.dataset.detail){const l=a.target.dataset.detail.split(":");if(l.length===2){B.commit("refresh"),l[0]==="tag"?m.push({name:"home",query:{q:l[1],t:"tag"}}):m.push({name:"user",query:{username:l[1]}});return}}k(s)};return(a,s)=>{const l=J,z=Y("router-link"),d=K,y=E,w=F,T=L,q=M,h=Q,N=U,$=tt;return o(),f("div",{class:"post-item",onClick:s[2]||(s[2]=g=>k(t(e).id))},[i($,{"content-indented":""},Z({avatar:n(()=>[i(l,{round:"",size:30,src:t(e).user.avatar},null,8,["src"])]),header:n(()=>[u("span",et,[i(z,{onClick:s[0]||(s[0]=v(()=>{},["stop"])),class:"username-link",to:{name:"user",query:{username:t(e).user.username}}},{default:n(()=>[_(p(t(e).user.nickname),1)]),_:1},8,["to"])]),u("span",st," @"+p(t(e).user.username),1),t(e).is_top?(o(),r(d,{key:0,class:"top-tag",type:"warning",size:"small",round:""},{default:n(()=>[_(" \u7F6E\u9876 ")]),_:1})):c("",!0),t(e).visibility==1?(o(),r(d,{key:1,class:"top-tag",type:"error",size:"small",round:""},{default:n(()=>[_(" \u79C1\u5BC6 ")]),_:1})):c("",!0),t(e).visibility==2?(o(),r(d,{key:2,class:"top-tag",type:"info",size:"small",round:""},{default:n(()=>[_(" \u597D\u53CB\u53EF\u89C1 ")]),_:1})):c("",!0)]),"header-extra":n(()=>[u("span",at,p(t(e).ip_loc?t(e).ip_loc+" \xB7 ":t(e).ip_loc)+" "+p(t(X)(t(e).created_on)),1)]),footer:n(()=>[t(e).attachments.length>0?(o(),r(y,{key:0,attachments:t(e).attachments},null,8,["attachments"])):c("",!0),t(e).charge_attachments.length>0?(o(),r(y,{key:1,attachments:t(e).charge_attachments,price:t(e).attachment_price},null,8,["attachments","price"])):c("",!0),t(e).imgs.length>0?(o(),r(w,{key:2,imgs:t(e).imgs},null,8,["imgs"])):c("",!0),t(e).videos.length>0?(o(),r(T,{key:3,videos:t(e).videos},null,8,["videos"])):c("",!0),t(e).links.length>0?(o(),r(q,{key:4,links:t(e).links},null,8,["links"])):c("",!0)]),action:n(()=>[i(N,{justify:"space-between"},{default:n(()=>[u("div",ot,[i(h,{size:"18",class:"opt-item-icon"},{default:n(()=>[i(t(V))]),_:1}),_(" "+p(t(e).upvote_count),1)]),u("div",it,[i(h,{size:"18",class:"opt-item-icon"},{default:n(()=>[i(t(j))]),_:1}),_(" "+p(t(e).comment_count),1)]),u("div",rt,[i(h,{size:"18",class:"opt-item-icon"},{default:n(()=>[i(t(D))]),_:1}),_(" "+p(t(e).collection_count),1)])]),_:1})]),_:2},[t(e).texts.length>0?{name:"description",fn:n(()=>[(o(!0),f(A,null,G(t(e).texts,g=>(o(),f("span",{key:g.id,class:"post-text",onClick:s[1]||(s[1]=v(H=>b(H,t(e).id),["stop"])),innerHTML:t(O)(g.content).content},null,8,nt))),128))]),key:"0"}:void 0]),1024)])}}});export{ut as _}; diff --git a/web/dist/assets/post-item.766f3250.css b/web/dist/assets/post-item.766f3250.css new file mode 100644 index 00000000..227cd0fe --- /dev/null +++ b/web/dist/assets/post-item.766f3250.css @@ -0,0 +1 @@ +.post-item{width:100%;padding:16px;box-sizing:border-box}.post-item .nickname-wrap{font-size:14px}.post-item .username-wrap{font-size:14px;opacity:.75}.post-item .top-tag{transform:scale(.75)}.post-item .timestamp{opacity:.75;font-size:12px}.post-item .post-text{text-align:justify;overflow:hidden;white-space:pre-wrap;word-break:break-all}.post-item .opt-item{display:flex;align-items:center;opacity:.7}.post-item .opt-item .opt-item-icon{margin-right:10px}.post-item:hover{background:#f7f9f9;cursor:pointer}.post-item .n-thing-avatar{margin-top:0}.post-item .n-thing-header{line-height:16px;margin-bottom:8px!important}.dark .post-item:hover{background:#18181c} diff --git a/web/dist/assets/post-skeleton.328dfb67.css b/web/dist/assets/post-skeleton.328dfb67.css new file mode 100644 index 00000000..1311e96a --- /dev/null +++ b/web/dist/assets/post-skeleton.328dfb67.css @@ -0,0 +1 @@ +.skeleton-item[data-v-a6d56894]{padding:12px;display:flex}.skeleton-item .user[data-v-a6d56894]{width:42px}.skeleton-item .content[data-v-a6d56894]{width:calc(100% - 42px)} diff --git a/web/dist/assets/post-skeleton.38f0f247.js b/web/dist/assets/post-skeleton.38f0f247.js new file mode 100644 index 00000000..3bfcacf8 --- /dev/null +++ b/web/dist/assets/post-skeleton.38f0f247.js @@ -0,0 +1 @@ +import{ai as r,d as c,W as s,Y as n,ac as l,Z as a,a4 as t,ab as p}from"./index.d4f5aad2.js";import{b as i}from"./Skeleton.e1c16fcb.js";const d={class:"user"},u={class:"content"},m=c({__name:"post-skeleton",props:{num:{default:1}},setup(o){return(v,k)=>{const e=i;return s(!0),n(p,null,l(new Array(o.num),_=>(s(),n("div",{class:"skeleton-item",key:_},[a("div",d,[t(e,{circle:"",size:"small"})]),a("div",u,[t(e,{text:"",repeat:3}),t(e,{text:"",style:{width:"60%"}})])]))),128)}}});var y=r(m,[["__scopeId","data-v-a6d56894"]]);export{y as _}; diff --git a/web/dist/favicon.ico b/web/dist/favicon.ico new file mode 100644 index 00000000..0f98324f Binary files /dev/null and b/web/dist/favicon.ico differ diff --git a/web/dist/index.html b/web/dist/index.html new file mode 100644 index 00000000..8a86016c --- /dev/null +++ b/web/dist/index.html @@ -0,0 +1,18 @@ + + + + + + + + 泡泡 + + + + + +
+ + + + \ No newline at end of file diff --git a/web/embed.go b/web/embed.go index 4866a53a..a16df24a 100644 --- a/web/embed.go +++ b/web/embed.go @@ -1,3 +1,7 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + //go:build embed // +build embed diff --git a/web/package.json b/web/package.json index 1132537b..99785fb4 100644 --- a/web/package.json +++ b/web/package.json @@ -30,7 +30,7 @@ "vuex": "^4.0.2" }, "devDependencies": { - "@tauri-apps/cli": "^1.0.0", + "@tauri-apps/cli": "^1.2.0", "@types/node": "^17.0.35", "@types/qrcode": "^1.4.2", "@vitejs/plugin-vue": "^2.3.3", diff --git a/web/src-tauri/Cargo.lock b/web/src-tauri/Cargo.lock index 6231d29a..7edc858d 100644 --- a/web/src-tauri/Cargo.lock +++ b/web/src-tauri/Cargo.lock @@ -79,20 +79,18 @@ dependencies = [ [[package]] name = "attohttpc" -version = "0.19.1" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "262c3f7f5d61249d8c00e5546e2685cd15ebeeb1bc0f3cc5449350a1cb07319e" +checksum = "1fcf00bc6d5abb29b5f97e3c61a90b6d3caa12f3faf897d4a3e3607c050a35a7" dependencies = [ "flate2", "http", "log", "native-tls", - "openssl", "serde", "serde_json", "serde_urlencoded", "url", - "wildmatch", ] [[package]] @@ -208,12 +206,11 @@ dependencies = [ [[package]] name = "cargo_toml" -version = "0.11.5" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5809dd3e6444651fd1cdd3dbec71eca438c439a0fcc8081674a14da0afe50185" +checksum = "aa0e3586af56b3bfa51fca452bd56e8dbbbd5d8d81cbf0b7e4e35b695b537eb8" dependencies = [ "serde", - "serde_derive", "toml", ] @@ -579,17 +576,10 @@ dependencies = [ ] [[package]] -name = "embed-resource" -version = "1.7.2" +name = "dunce" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc24ff8d764818e9ab17963b0593c535f077a513f565e75e4352d758bc4d8c0" -dependencies = [ - "cc", - "rustc_version 0.4.0", - "toml", - "vswhom", - "winreg", -] +checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c" [[package]] name = "embed_plist" @@ -597,6 +587,15 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" +[[package]] +name = "encoding_rs" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +dependencies = [ + "cfg-if", +] + [[package]] name = "fastrand" version = "1.7.0" @@ -661,11 +660,10 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ - "matches", "percent-encoding", ] @@ -679,21 +677,6 @@ dependencies = [ "new_debug_unreachable", ] -[[package]] -name = "futures" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" version = "0.3.21" @@ -701,7 +684,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" dependencies = [ "futures-core", - "futures-sink", ] [[package]] @@ -727,21 +709,6 @@ version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" -[[package]] -name = "futures-lite" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - [[package]] name = "futures-macro" version = "0.3.21" @@ -753,12 +720,6 @@ dependencies = [ "syn", ] -[[package]] -name = "futures-sink" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" - [[package]] name = "futures-task" version = "0.3.21" @@ -771,13 +732,9 @@ version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" dependencies = [ - "futures-channel", "futures-core", - "futures-io", "futures-macro", - "futures-sink", "futures-task", - "memchr", "pin-project-lite", "pin-utils", "slab", @@ -1069,6 +1026,12 @@ dependencies = [ "syn", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "heck" version = "0.3.3" @@ -1142,11 +1105,10 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" dependencies = [ - "matches", "unicode-bidi", "unicode-normalization", ] @@ -1183,6 +1145,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "indexmap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "infer" version = "0.7.0" @@ -1247,23 +1219,9 @@ dependencies = [ [[package]] name = "jni" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24967112a1e4301ca5342ea339763613a37592b8a6ce6cf2e4494537c7a42faf" -dependencies = [ - "cesu8", - "combine", - "jni-sys", - "log", - "thiserror", - "walkdir", -] - -[[package]] -name = "jni" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" dependencies = [ "cesu8", "combine", @@ -1332,6 +1290,15 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "line-wrap" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +dependencies = [ + "safemem", +] + [[package]] name = "lock_api" version = "0.4.7" @@ -1638,9 +1605,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.12.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" +checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" [[package]] name = "open" @@ -1699,9 +1666,9 @@ dependencies = [ [[package]] name = "os_info" -version = "3.4.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eca3ecae1481e12c3d9379ec541b238a16f0b75c9a409942daa8ec20dbfdb62" +checksum = "c4750134fb6a5d49afc80777394ad5d95b04bc12068c6abb92fae8f43817270f" dependencies = [ "log", "serde", @@ -1745,29 +1712,12 @@ dependencies = [ [[package]] name = "paopao" -version = "0.1.0" +version = "0.2.0" dependencies = [ "tauri", "tauri-build", ] -[[package]] -name = "parking" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.5", -] - [[package]] name = "parking_lot" version = "0.12.1" @@ -1775,21 +1725,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.3", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall", - "smallvec", - "winapi", + "parking_lot_core", ] [[package]] @@ -1819,9 +1755,9 @@ checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "pest" @@ -1948,6 +1884,20 @@ version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" +[[package]] +name = "plist" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd39bc6cdc9355ad1dc5eeedefee696bb35c34caf21768741e81826c0bbd7225" +dependencies = [ + "base64", + "indexmap", + "line-wrap", + "serde", + "time", + "xml-rs", +] + [[package]] name = "png" version = "0.11.0" @@ -2125,9 +2075,9 @@ dependencies = [ [[package]] name = "raw-window-handle" -version = "0.4.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" +checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a" dependencies = [ "cty", ] @@ -2154,9 +2104,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.5.6" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" +checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" dependencies = [ "aho-corasick", "memchr", @@ -2174,9 +2124,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.26" +version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] name = "remove_dir_all" @@ -2189,13 +2139,12 @@ dependencies = [ [[package]] name = "rfd" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95281ea32d3c1ebdf84027986952e22f2bb89fa1b8b97c012be72bbc3b8e4537" +checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" dependencies = [ "block", "dispatch", - "embed-resource", "glib-sys", "gobject-sys", "gtk-sys", @@ -2242,6 +2191,12 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + [[package]] name = "same-file" version = "1.0.6" @@ -2345,18 +2300,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.137" +version = "1.0.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.137" +version = "1.0.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" dependencies = [ "proc-macro2", "quote", @@ -2550,7 +2505,7 @@ checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" dependencies = [ "new_debug_unreachable", "once_cell", - "parking_lot 0.12.1", + "parking_lot", "phf_shared 0.10.0", "precomputed-hash", "serde", @@ -2634,9 +2589,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.11.2" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bfe4c782f0543f667ee3b732d026b2f1c64af39cd52e726dec1ea1f2d8f6b80" +checksum = "a0382fcc02b87420a0d024ff6ec2dbfccdccafb46de8c03fb07dbf2f36810a42" dependencies = [ "bitflags", "cairo-rs", @@ -2656,7 +2611,7 @@ dependencies = [ "gtk", "image", "instant", - "jni 0.19.0", + "jni", "lazy_static", "libc", "log", @@ -2665,32 +2620,19 @@ dependencies = [ "ndk-sys", "objc", "once_cell", - "parking_lot 0.11.2", + "parking_lot", "paste", "png 0.17.5", "raw-window-handle", "scopeguard", "serde", - "tao-core-video-sys", "unicode-segmentation", - "uuid 0.8.2", - "windows 0.37.0", + "uuid 1.2.2", + "windows 0.39.0", "windows-implement", "x11-dl", ] -[[package]] -name = "tao-core-video-sys" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271450eb289cb4d8d0720c6ce70c72c8c858c93dd61fc625881616752e6b98f6" -dependencies = [ - "cfg-if", - "core-foundation-sys", - "libc", - "objc", -] - [[package]] name = "tar" version = "0.4.38" @@ -2704,18 +2646,18 @@ dependencies = [ [[package]] name = "tauri" -version = "1.0.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1ebb60bb8f246d5351ff9b7728fdfa7a6eba72baa722ab6021d553981caba1" +checksum = "ac135e45c2923bd91edbb95a0d656f8d025389697e34d6d79166952bfa79c61c" dependencies = [ "anyhow", "attohttpc", "cocoa", "dirs-next", "embed_plist", + "encoding_rs", "flate2", - "futures", - "futures-lite", + "futures-util", "glib", "glob", "gtk", @@ -2749,21 +2691,22 @@ dependencies = [ "thiserror", "tokio", "url", - "uuid 1.1.2", + "uuid 1.2.2", "webkit2gtk", "webview2-com", - "windows 0.37.0", + "windows 0.39.0", ] [[package]] name = "tauri-build" -version = "1.0.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7b26eb3523e962b90012fedbfb744ca153d9be85e7981e00737e106d5323941" +checksum = "ef796f49abc98e6de0abe1b655120addc9d82363d8fc2304e71a4177c25e783c" dependencies = [ "anyhow", "cargo_toml", "heck 0.4.0", + "json-patch", "semver 1.0.10", "serde_json", "tauri-utils", @@ -2772,13 +2715,15 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "1.0.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9468c5189188c820ef605dfe4937c768cb2918e9460c8093dc4ee2cbd717b262" +checksum = "afcb77cf7bfe3d8f886e73a7fa6157587d015c599671180b76595c1aef175ba8" dependencies = [ "base64", "brotli", "ico", + "json-patch", + "plist", "png 0.17.5", "proc-macro2", "quote", @@ -2789,15 +2734,16 @@ dependencies = [ "sha2", "tauri-utils", "thiserror", - "uuid 1.1.2", + "time", + "uuid 1.2.2", "walkdir", ] [[package]] name = "tauri-macros" -version = "1.0.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40e3ffddd7a274fc7baaa260888c971a0d95d2ef403aa16600c878b8b1c00ffe" +checksum = "f24f481b0b2acfc288ac78755f00ebea53992c7365a165af64cb5ae00806edea" dependencies = [ "heck 0.4.0", "proc-macro2", @@ -2809,53 +2755,56 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.9.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb7dc4db360bb40584187b6cb7834da736ce4ef2ab0914e2be98014444fa9920" +checksum = "5fc5d54c476defa5436e70e0d0a06e3cb0f49b6f863895995d5e3769411769cf" dependencies = [ "gtk", "http", "http-range", - "infer", + "rand 0.8.5", + "raw-window-handle", "serde", "serde_json", "tauri-utils", "thiserror", - "uuid 1.1.2", + "uuid 1.2.2", "webview2-com", - "windows 0.37.0", + "windows 0.39.0", ] [[package]] name = "tauri-runtime-wry" -version = "0.9.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c876fb3a6e7c6fe2ac466b2a6ecd83658528844b4df0914558a9bc1501b31cf3" +checksum = "d78c55091701426c2519c7e9f1dc2dd33e533af4e75eae89cedc6995409351a2" dependencies = [ "cocoa", "gtk", "percent-encoding", "rand 0.8.5", + "raw-window-handle", "tauri-runtime", "tauri-utils", - "uuid 1.1.2", + "uuid 1.2.2", "webkit2gtk", "webview2-com", - "windows 0.37.0", + "windows 0.39.0", "wry", ] [[package]] name = "tauri-utils" -version = "1.0.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727145cb55b8897fa9f2bcea4fad31dc39394703d037c9669b40f2d1c0c2d7f3" +checksum = "d64c9a09ba1538b8e67ae8c78c10904f36ce38d364bf7f089ec807032a826b02" dependencies = [ "brotli", "ctor", "glob", "heck 0.4.0", "html5ever", + "infer", "json-patch", "kuchiki", "memchr", @@ -2869,6 +2818,7 @@ dependencies = [ "thiserror", "url", "walkdir", + "windows 0.39.0", ] [[package]] @@ -2937,6 +2887,7 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" dependencies = [ + "itoa 1.0.2", "libc", "num_threads", ] @@ -3084,19 +3035,18 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" +checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" [[package]] name = "url" -version = "2.2.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" dependencies = [ "form_urlencoded", "idna", - "matches", "percent-encoding", "serde", ] @@ -3112,15 +3062,12 @@ name = "uuid" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom 0.2.7", -] [[package]] name = "uuid" -version = "1.1.2" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" +checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" dependencies = [ "getrandom 0.2.7", ] @@ -3155,32 +3102,6 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "vswhom" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" -dependencies = [ - "libc", - "vswhom-sys", -] - -[[package]] -name = "vswhom-sys" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22025f6d8eb903ebf920ea6933b70b1e495be37e2cb4099e62c80454aaf57c39" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - [[package]] name = "walkdir" version = "2.3.2" @@ -3282,9 +3203,9 @@ dependencies = [ [[package]] name = "webkit2gtk" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29952969fb5e10fe834a52eb29ad0814ccdfd8387159b0933edf1344a1c9cdcc" +checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" dependencies = [ "bitflags", "cairo-rs", @@ -3329,13 +3250,13 @@ dependencies = [ [[package]] name = "webview2-com" -version = "0.16.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a489a9420acabb3c2ed0434b6f71f6b56b9485ec32665a28dec1ee186d716e0f" +checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows 0.37.0", + "windows 0.39.0", "windows-implement", ] @@ -3352,24 +3273,19 @@ dependencies = [ [[package]] name = "webview2-com-sys" -version = "0.16.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0258c53ee9adc0a4f8ba1c8c317588f7a58c7048a55b621d469ba75ab3709ca1" +checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" dependencies = [ "regex", "serde", "serde_json", "thiserror", - "windows 0.37.0", + "windows 0.39.0", "windows-bindgen", + "windows-metadata", ] -[[package]] -name = "wildmatch" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c48bd20df7e4ced539c12f570f937c6b4884928a87fee70a479d72f031d4e0" - [[package]] name = "winapi" version = "0.3.9" @@ -3419,7 +3335,6 @@ version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" dependencies = [ - "windows-implement", "windows_aarch64_msvc 0.37.0", "windows_i686_gnu 0.37.0", "windows_i686_msvc 0.37.0", @@ -3427,11 +3342,25 @@ dependencies = [ "windows_x86_64_msvc 0.37.0", ] +[[package]] +name = "windows" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +dependencies = [ + "windows-implement", + "windows_aarch64_msvc 0.39.0", + "windows_i686_gnu 0.39.0", + "windows_i686_msvc 0.39.0", + "windows_x86_64_gnu 0.39.0", + "windows_x86_64_msvc 0.39.0", +] + [[package]] name = "windows-bindgen" -version = "0.37.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bed7be31ade0af08fec9b5343e9edcc005d22b1f11859b8a59b24797f5858e8" +checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" dependencies = [ "windows-metadata", "windows-tokens", @@ -3439,9 +3368,9 @@ dependencies = [ [[package]] name = "windows-implement" -version = "0.37.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a1062e555f7d9d66fd1130ed4f7c6ec41a47529ee0850cd0e926d95b26bb14" +checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" dependencies = [ "syn", "windows-tokens", @@ -3449,9 +3378,9 @@ dependencies = [ [[package]] name = "windows-metadata" -version = "0.37.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f33f2b90a6664e369c41ab5ff262d06f048fc9685d9bf8a0e99a47750bb0463" +checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" [[package]] name = "windows-sys" @@ -3468,9 +3397,9 @@ dependencies = [ [[package]] name = "windows-tokens" -version = "0.37.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3263d25f1170419995b78ff10c06b949e8a986c35c208dc24333c64753a87169" +checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" [[package]] name = "windows_aarch64_msvc" @@ -3484,6 +3413,12 @@ version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" +[[package]] +name = "windows_aarch64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" + [[package]] name = "windows_i686_gnu" version = "0.24.0" @@ -3502,6 +3437,12 @@ version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" +[[package]] +name = "windows_i686_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" + [[package]] name = "windows_i686_msvc" version = "0.24.0" @@ -3520,6 +3461,12 @@ version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" +[[package]] +name = "windows_i686_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" + [[package]] name = "windows_x86_64_gnu" version = "0.24.0" @@ -3538,6 +3485,12 @@ version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" +[[package]] +name = "windows_x86_64_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" + [[package]] name = "windows_x86_64_msvc" version = "0.24.0" @@ -3557,13 +3510,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" [[package]] -name = "winreg" -version = "0.10.1" +name = "windows_x86_64_msvc" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" [[package]] name = "winres" @@ -3587,19 +3537,23 @@ dependencies = [ [[package]] name = "wry" -version = "0.18.3" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b1ba327c7dd4292f46bf8e6ba8e6ec2db4443b2973c9d304a359d95e0aa856" +checksum = "e0fd80bb2bd8e8eae26d59c5164e70233f29f7593cb886a958024a4fd8b5cd21" dependencies = [ + "base64", "block", "cocoa", "core-graphics", + "crossbeam-channel", + "dunce", "gdk", "gio", "glib", "gtk", + "html5ever", "http", - "jni 0.18.0", + "kuchiki", "libc", "log", "objc", @@ -3607,13 +3561,15 @@ dependencies = [ "once_cell", "serde", "serde_json", + "sha2", + "soup2", "tao", "thiserror", "url", "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows 0.37.0", + "windows 0.39.0", "windows-implement", ] @@ -3629,9 +3585,9 @@ dependencies = [ [[package]] name = "x11-dl" -version = "2.19.1" +version = "2.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59" +checksum = "0c83627bc137605acc00bb399c7b908ef460b621fc37c953db2b09f88c449ea6" dependencies = [ "lazy_static", "libc", diff --git a/web/src-tauri/Cargo.toml b/web/src-tauri/Cargo.toml index 460c9807..ca987b44 100644 --- a/web/src-tauri/Cargo.toml +++ b/web/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "paopao" -version = "0.1.0" +version = "0.2.0" description = "Paopao App" authors = ["Rocboss"] license = "MIT License" @@ -9,10 +9,10 @@ edition = "2021" rust-version = "1.57" [build-dependencies] -tauri-build = { version = "1.0", features = [] } +tauri-build = { version = "1.2", features = [] } [dependencies] -tauri = { version = "1.0", features = ["api-all", "macos-private-api"] } +tauri = { version = "1.2", features = ["api-all", "macos-private-api"] } [features] # by default Tauri runs in production mode diff --git a/web/src-tauri/tauri.conf.json b/web/src-tauri/tauri.conf.json index cb0df561..e61a48c8 100644 --- a/web/src-tauri/tauri.conf.json +++ b/web/src-tauri/tauri.conf.json @@ -62,12 +62,15 @@ "windows": [ { "title": "泡泡 | 一个清新文艺的微社区", - "width": 1080, + "width": 1024, "height": 800, "resizable": false, "fullscreen": false, "transparent": true, - "decorations": true + "decorations": true, + "titleBarStyle": "Overlay", + "hiddenTitle": true, + "acceptFirstMouse": false } ], "security": { diff --git a/web/src/App.vue b/web/src/App.vue index 118ba886..3e28ac86 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -44,18 +44,9 @@ import { computed } from 'vue'; import { useStore } from 'vuex'; import { darkTheme } from 'naive-ui'; -import { version, buildTime } from '../build/info.json'; const store = useStore(); const theme = computed(() => (store.state.theme === 'dark' ? darkTheme : null)); - -console.log( - `%c Release Build Info -%cVersion v${version} -BuildTime ${buildTime}`, - 'background:#000;color:#FFF;font-weight:bold;', - 'background:#FFF;color:#000;' -); \ No newline at end of file diff --git a/web/src/components/main-nav.vue b/web/src/components/main-nav.vue index 487e29df..6456294e 100644 --- a/web/src/components/main-nav.vue +++ b/web/src/components/main-nav.vue @@ -18,6 +18,7 @@ {{ props.title }} (), { title: '', back: false, + theme: true, } ); const switchTheme = (theme: boolean) => { diff --git a/web/src/components/message-item.vue b/web/src/components/message-item.vue index e01f6a71..6eddf9c6 100644 --- a/web/src/components/message-item.vue +++ b/web/src/components/message-item.vue @@ -1,31 +1,22 @@