diff --git a/.github/dead_link_check_config.json b/.github/dead_link_check_config.json index 55f3806795..1db2505da9 100644 --- a/.github/dead_link_check_config.json +++ b/.github/dead_link_check_config.json @@ -16,51 +16,35 @@ "pattern": "^https://docs.buf.build/" }, { - "pattern":"^https://techhenzy.com/" - }, - { - "pattern":"^https://www.soft.tech/blog/" + "pattern":"^https://techhenzy.com/proxy-webassembly-architecture/" }, { "pattern":"^https://www.sofastack.tech/blog/the-next-five-years-of-cloud-native-runtime/" }, - { - "pattern":"^https://github.com/mosn/layotto/blob/f70cdc6196963ad762cf809daf0579403c341def1/spec/proto/runtime/v1/runtime.proto" - }, { "pattern": "^#" } ], "replacementPatterns": [ { - "pattern": "^/docs", - "replacement": "/github/workspace/docs/docs" - }, - { - "pattern": "^/img", - "replacement": "/github/workspace/docs/static/img" - }, - { - "pattern": "^start/", - "replacement": "/github/workspace/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/" + "pattern": "^/", + "replacement": "http://localhost:3000/#/" }, { - "pattern": "^community/", - "replacement": "/github/workspace/docs/i18n/en-US/docusaurus-plugin-content-docs/current/community/" + "pattern": "^zh/", + "replacement": "http://localhost:3000/#/zh/" }, { - "pattern": "^component_specs/", - "replacement": "/github/workspace/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/" - }, - - + "pattern": "^en/", + "replacement": "http://localhost:3000/#/en/" + } ], "timeout": "10s", "retryOn429": true, "retryCount": 2, "fallbackRetryDelay": "10s", "aliveStatusCodes": [ - 200, + 200, 401 ] } diff --git a/.github/workflows/dead-link-checker.yaml b/.github/workflows/dead-link-checker.yaml index 53e4ea6a43..b94d52b098 100644 --- a/.github/workflows/dead-link-checker.yaml +++ b/.github/workflows/dead-link-checker.yaml @@ -19,25 +19,14 @@ jobs: steps: - name: Check out code uses: actions/checkout@v2 -# - name: Install and start docusaurus server -# run: | -# sudo npm install -# sudo npm run build --config docs && nohup npm run serve --config docs & - - uses: gaurav-nelson/github-action-markdown-link-check@v1 - with: - base-branch: main - use-quiet-mode: 'yes' - use-verbose-mode: 'yes' - check-modified-files-only: 'yes' - config-file: '.github/dead_link_check_config.json' - folder-path: 'docs/blog/,docs/docs/,docs/i18n/en-US/docusaurus-plugin-content-blog/,docs/i18n/en-US/docusaurus-plugin-content-docs/current/' -# - name: Install markdown-link-check -# run: sudo npm install -g markdown-link-check + - name: Install markdown-link-check + run: sudo npm install -g markdown-link-check@3 -# - name: Install and start docusaurus server -# run: | -# sudo npm install -# sudo npm run build --config docs && npm run serve --config docs -# - name: Check dead links in all the .md files -# run: make deadlink + - name: Install and start docsify server + run: | + sudo npm i docsify-cli -g + nohup docsify serve docs -p 3000 & + + - name: Check dead links in all the .md files + run: make deadlink diff --git a/.github/workflows/docusaurus-ci.yml b/.github/workflows/docusaurus-ci.yml deleted file mode 100644 index a7a7d89f99..0000000000 --- a/.github/workflows/docusaurus-ci.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: CI - -on: - push: - branches: [ main ] - -jobs: - build: - runs-on: ubuntu-latest -# container: pandoc/latex jj - steps: - - name: Use Node.js - uses: actions/setup-node@v1 - with: - node-version: 18.20.3 - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive - - uses: darrenjennings/algolia-docsearch-action@master - with: - algolia_application_id: 'B0I4Q5CLN8' - algolia_api_key: '478d2fe7bdad5ff46b87f1e8e4662e81' - file: 'algolia-config.json' - - name: creates output - run: npm install && npm run build --config docs - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 - with: - deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} - external_repository: layotto/layotto.github.io - publish_dir: docs/build - publish_branch: main -# - name: Pushes to another repository -# uses: cpina/github-action-push-to-another-repository@main -# env: -# SSH_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }} -# with: -# source-directory: 'docs/build' -# destination-github-username: 'layotto' -# destination-repository-name: 'layotto.github.io' -# target-branch: main \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c377e9f3f3..a49c89b7c8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,7 +22,7 @@ None of these is essential for a pull request, but they will all help. 9. Make sure checks have been correctly passed, you can simply run `make check` 10. Contribute a Pull Request as the rule of Github Workflow, and you should follow the pull request's rules. -> Layotto provides many useful commands to help you contribute easier, please check it [here](docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/commands.md) +> Layotto provides many useful commands to help you contribute easier, please check it [here](docs/en/development/commands.md) ## Version naming convention diff --git a/README.md b/README.md index 26471a33a4..9b77d06225 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

Layotto (L8): To be the next layer of OSI layer 7

-[![Layotto Env Pipeline 🌊](https://github.com/mosn/layotto/actions/workflows/proto-checker.yml/badge.svg)](https://github.com/mosn/layotto/actions/workflows/quickstart-checker.yml) +[![Layotto Env Pipeline 🌊](https://github.com/mosn/layotto/actions/workflows/quickstart-checker.yml/badge.svg)](https://github.com/mosn/layotto/actions/workflows/quickstart-checker.yml) [![Layotto Dev Pipeline 🌊](https://github.com/mosn/layotto/actions/workflows/layotto-ci.yml/badge.svg)](https://github.com/mosn/layotto/actions/workflows/layotto-ci.yml) [![GoDoc](https://godoc.org/mosn.io/layotto?status.svg)](https://godoc.org/mosn.io/layotto) @@ -137,15 +137,15 @@ Layotto enriches the CNCF CLOUD N As a programming enthusiast , have you ever felt that you want to participate in the development of an open source project, but don't know where to start? In order to help everyone better participate in open source projects, our community will regularly publish community tasks to help everyone learn by doing! -[Document Contribution Guide](docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/contributing-doc.md) +[Document Contribution Guide](docs/en/development/contributing-doc.md) -[Component Development Guide](docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/developing-component.md) +[Component Development Guide](docs/en/development/developing-component.md) -[Layotto Github Workflows](docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/github-workflows.md) +[Layotto Github Workflows](docs/en/development/github-workflows.md) -[Layotto Commands Guide](docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/commands.md) +[Layotto Commands Guide](docs/en/development/commands.md) -[Layotto Contributor Guide](docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/CONTRIBUTING.md) +[Layotto Contributor Guide](docs/en/development/CONTRIBUTING.md) ## Contributors @@ -157,17 +157,17 @@ Thank y'all! ## Design Documents -[Actuator Design Doc](docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/actuator/actuator-design-doc.md) +[Actuator Design Doc](docs/en/design/actuator/actuator-design-doc.md) -[Configuration API with Apollo](docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/configuration/configuration-api-with-apollo.md) +[Configuration API with Apollo](docs/en/design/configuration/configuration-api-with-apollo.md) -[Pubsub API and Compability with Dapr Component](docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/pubsub/pubsub-api-and-compability-with-dapr-component.md) +[Pubsub API and Compability with Dapr Component](docs/en/design/pubsub/pubsub-api-and-compability-with-dapr-component.md) -[RPC Design Doc](docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/rpc/rpc-design-doc.md) +[RPC Design Doc](docs/en/design/rpc/rpc-design-doc.md) -[Distributed Lock API Design](docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/lock/lock-api-design.md) +[Distributed Lock API Design](docs/en/design/lock/lock-api-design.md) -[FaaS Design](docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/faas/faas-poc-design.md) +[FaaS Design](docs/en/design/faas/faas-poc-design.md) ## FAQ diff --git a/algolia-config.json b/algolia-config.json deleted file mode 100644 index 9846c662d0..0000000000 --- a/algolia-config.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "index_name": "layotto", - "start_urls": [ - "https://layotto.github.io/docs", - "https://layotto.github.io/blog", - "https://layotto.github.io/en-US/docs", - "https://layotto.github.io/en-US/blog" - ], - "stop_urls": [ - "/tests" - ], - "selectors": { - "lvl0": { - "selector": "(//ul[contains(@class,'menu__list')]//a[contains(@class, 'menu__link menu__link--sublist menu__link--active')]/text() | //nav[contains(@class, 'navbar')]//a[contains(@class, 'navbar__link--active')]/text())[last()]", - "type": "xpath", - "global": true, - "default_value": "Documentation" - }, - "lvl1": "header h1", - "lvl2": "article h2", - "lvl3": "article h3", - "lvl4": "article h4", - "lvl5": "article h5, article td:first-child", - "lvl6": "article h6", - "text": "article p, article li, article td:last-child" - }, - "strip_chars": " .,;:#", - "custom_settings": { - "separatorsToIndex": "_", - "attributesForFaceting": [ - "language", - "version", - "type", - "docusaurus_tag" - ], - "attributesToRetrieve": [ - "hierarchy", - "content", - "anchor", - "url", - "url_without_anchor", - "type" - ] - }, - "conversation_id": [ - "833762294" - ], - "nb_hits": 46250 -} \ No newline at end of file diff --git a/crowdin.yaml b/crowdin.yaml deleted file mode 100644 index da3afb5333..0000000000 --- a/crowdin.yaml +++ /dev/null @@ -1,12 +0,0 @@ -project_id: 688617 -# token local testing layotto token -api_token: 7305dcca805d8750a5d0983438bdc4bca9adff6bf35eff5a86dfdca9d85a1c273dd55e8b5362fe8d -#api_token_env: CROWDIN_VERDACCIO_API_KEY - -preserve_hierarchy: true - -files: - - source: /blog/**/* - translation: '/i18n/%locale%/docusaurus-plugin-content-blog/current/**/%original_file_name%' - - source: /docs/**/* - translation: '/i18n/%locale%/docusaurus-plugin-content-docs/current/**/%original_file_name%' \ No newline at end of file diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 6ad2bbfda0..0000000000 --- a/docs/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Website - -This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. - -## Installation - -``` -$ yarn -``` - -### Local Development - -``` -$ yarn start -``` - -This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. - -### Build - -``` -$ yarn build -``` - -This command generates static content into the `build` directory and can be served using any static contents hosting service. - -### Deployment - -Using SSH: - -``` -$ USE_SSH=true yarn deploy -``` - -Not using SSH: - -``` -$ GIT_USER= yarn deploy -``` - -If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md new file mode 100644 index 0000000000..911b395486 --- /dev/null +++ b/docs/SUMMARY.md @@ -0,0 +1,146 @@ +- [首页](zh/README.md) +- [快速开始]() + - [使用State API](zh/start/state/start.md) + - [使用Configuration API]() + - [使用Apollo配置中心](zh/start/configuration/start-apollo.md) + - [使用Etcd配置中心](zh/start/configuration/start.md) + - [使用Nacos配置中心](zh/start/configuration/start-nacos.md) + - [发布、订阅消息]() + - [使用Pub/Sub API](zh/start/pubsub/start.md) + - [(建设中) 使用 DelayQueue API](zh/start/delay_queue/start.md) + - [使用分布式锁 API](zh/start/lock/start.md) + - [使用Sequencer API生成分布式自增id](zh/start/sequencer/start.md) + - [使用 Secret API]() + - [查询 secrets](zh/start/secret/start.md) + - [在组件配置中引用 secret](zh/start/secret/secret_ref.md) + - [进行RPC调用]() + - [Hello World](zh/start/rpc/helloworld.md) + - [Dubbo JSON RPC](zh/start/rpc/dubbo_json_rpc.md) + - [使用File API]() + - [基于Minio](zh/start/file/minio.md) + - [使用 OSS API](zh/start/oss/oss.md) + - [使用UDS通信](zh/start/uds/start.md) + + - [(建设中)使用 sms API](zh/start/sms/start.md) + - [(建设中)使用 cryption API](zh/start/cryption/start.md) + - [(建设中)使用 phone API](zh/start/phone/start.md) + - [(建设中)使用 email API](zh/start/email/start.md) + - [使用 lifecycle API](zh/start/lifecycle/start.md) + - [API插件]() + - [注册您自己的API](zh/start/api_plugin/helloworld.md) + - [自动生成 API 插件](zh/start/api_plugin/generate.md) + - [作为 Istio 的数据面]() + - [集成 Istio 1.10.6 演示](zh/start/istio/README.md) + - [集成 Istio 1.5.x 演示](zh/start/istio/start.md) + - [在四层网络进行流量干预]() + - [Dump TCP 流量](zh/start/network_filter/tcpcopy.md) + - [在七层网络进行流量干预]() + - [方法级别限流](zh/start/stream_filter/flow_control.md) + - [健康检查、查询运行时元数据](zh/start/actuator/start.md) + - [可观测性]() + - [Trace, Metrics](zh/start/trace/trace.md) + - [Trace 接入 Skywalking](zh/start/trace/skywalking.md) + - [Trace 接入 Zipkin](zh/start/trace/zipkin.md) + - [Trace 接入 Jaeger](zh/start/trace/jaeger.md) + - [Metrics 接入 Prometheus](zh/start/trace/prometheus.md) + - [将业务逻辑通过 WASM 下沉进sidecar](zh/start/wasm/start.md) + - [基于 WASM 跟 Runtime 实现的 Faas 模型](zh/start/faas/start.md) +- [线上实验室](zh/start/lab.md) +- [用户手册]() + - [功能介绍]() + - [File API](zh/building_blocks/file/file.md) + - [Actuator API](zh/building_blocks/actuator/actuator.md) + - [State API](zh/building_blocks/state/reference.md) + - [Sequencer API](zh/building_blocks/sequencer/reference.md) + - [Distributed Lock API](zh/building_blocks/lock/reference.md) + - [Pub/Sub API](zh/building_blocks/pubsub/reference.md) + - [RPC API](zh/building_blocks/rpc/reference.md) + - [Configuration API](zh/building_blocks/configuration/reference.md) + - [可扩展性]() + - [API插件](zh/design/api_plugin/design.md) + - [pluggable component 组件](zh/design/pluggable/usage.md) + - [gRPC API 接口文档](zh/api_reference/README.md) + - [SDK文档]() + - [java sdk](https://github.com/layotto/java-sdk) + - [.net sdk](https://github.com/layotto/dotnet-sdk) + - [js sdk](https://github.com/layotto/js-sdk) + - [go sdk](zh/sdk_reference/go/start.md) +- [运维手册]() + - [如何配置 Layotto]() + - [Layotto 配置文件介绍](zh/configuration/overview.md) + - [组件配置说明](zh/component_specs/overview.md) + - [State](zh/component_specs/state/common.md) + - [Redis](zh/component_specs/state/redis.md) + - [其他组件](zh/component_specs/state/others.md) + - [Pub/Sub](zh/component_specs/pubsub/common.md) + - [Redis](zh/component_specs/pubsub/redis.md) + - [其他组件](zh/component_specs/pubsub/others.md) + - [Distributed Lock](zh/component_specs/lock/common.md) + - [Redis](zh/component_specs/lock/redis.md) + - [Etcd](zh/component_specs/lock/etcd.md) + - [Zookeeper](zh/component_specs/lock/zookeeper.md) + - [Consul](zh/component_specs/lock/consul.md) + - [MongoDB](zh/component_specs/lock/mongo.md) + - [Configuration]() + - [Etcd](zh/component_specs/configuration/etcd.md) + - [Apollo](zh/component_specs/configuration/apollo.md) + - [Nacos](zh/component_specs/configuration/nacos.md) + - [File](zh/component_specs/file/common.md) + - [OSS](zh/component_specs/file/oss.md) + - [Sequencer](zh/component_specs/sequencer/common.md) + - [Etcd](zh/component_specs/sequencer/etcd.md) + - [Redis](zh/component_specs/sequencer/redis.md) + - [Zookeeper](zh/component_specs/sequencer/zookeeper.md) + - [MongoDB](zh/component_specs/sequencer/mongo.md) + - [Mysql](zh/component_specs/sequencer/mysql.md) + - [Snowflake](zh/component_specs/sequencer/snowflake.md) + - [Secret Store](zh/component_specs/secret/common.md) + - [自定义组件](zh/component_specs/custom/common.md) + - [如何部署、升级 Layotto](zh/operation/README.md) + - [如何本地开发、本地调试](zh/operation/local.md) +- [设计文档]() + - [动态配置下发、组件热重载](zh/design/lifecycle/apply_configuration.md) + - [Actuator设计文档](zh/design/actuator/actuator-design-doc.md) + - [gRPC框架设计文档](zh/design/actuator/grpc-design-doc.md) + - [Configuration API with Apollo](zh/design/configuration/configuration-api-with-apollo.md) + - [Pub/Sub API以及与dapr component的兼容性](zh/design/pubsub/pubsub-api-and-compability-with-dapr-component.md) + - [分布式锁API设计文档](zh/design/lock/lock-api-design.md) + - [Sequencer API设计文档](zh/design/sequencer/design.md) + - [File API设计文档](zh/design/file/file-design.md) + - [FaaS 设计文档](zh/design/faas/faas-poc-design.md) + - [支持Dapr API](zh/design/api_plugin/dapr_api.md) + - [OSS API设计文档](zh/design/oss/design.md) + - [pluggable component 设计文档](zh/design/pluggable/design.md) +- [贡献指南]() + - [Layotto 贡献指南](zh/development/CONTRIBUTING.md) + - [新手攻略:从零开始成为 Layotto 贡献者](zh/development/start-from-zero.md) + - [想要贡献文档?]() + - [文档贡献指南](zh/development/contributing-doc.md) + - [使用工具自动测试 Quickstart 文档](zh/development/test-quickstart.md) + - [想要开发新的组件?](zh/development/developing-component.md) + - [组件引用开发指南](zh/development/component_ref/component_ref.md) + - [想要修改proto文件或API定义?]() + - [如何基于proto文件生成代码、接口文档](zh/api_reference/how_to_generate_api_doc.md) + - [proto文件注释规范](zh/api_reference/comment_spec_of_proto.md) + - [新增API时的开发规范](zh/development/developing-api.md) + - [Layotto 四大 Github Workflows 说明](zh/development/github-workflows.md) + - [Layotto 命令行工具指南](zh/development/commands.md) + - [如何给 issue 打 label]() + - [新手任务 (good first issue) 的 label 规范](zh/development/label-spec.md) + - [发布手册](zh/development/release-guide.md) + - [待解决的问题](zh/development/problems-to-solve.md) +- [社区]() + - [社区会议](zh/community/meeting.md) + - [SOFAStack & MOSN 社区角色说明](zh/community/governance.md) + - [Layotto社区晋升规则](zh/community/promote.md) + - [Layotto社区成员](zh/community/people.md) +- [博客]() + - [蚂蚁云原生应用运行时的探索和实践 - ArchSummit 上海](zh/blog/exploration-and-practice-of-antcloud-native-application-runtime-archsummit-shanghai.md) + - [MOSN子项目Layotto:开启服务网格+应用运行时新篇章](zh/blog/mosn-subproject-layotto-opening-a-new-chapter-in-service-grid-application-runtime/index.md) + - [源码分析]() + - [启动流程](zh/blog/code/start_process/start_process.md) + - [处理 RPC 请求](zh/blog/code/layotto-rpc/index.md) + - [WebAssembly 相关](zh/blog/code/webassembly/index.md) + - [7层流量治理,接口限流](zh/blog/code/flowcontrol/flowcontrol_code_analyze.md) + - [源码解析 4层流量治理,tcp流量dump](zh/blog/tcpcopy_code_analyze.md) +- [视频合集](zh/video/README.md) diff --git a/docs/_navbar.md b/docs/_navbar.md new file mode 100644 index 0000000000..2620e55e89 --- /dev/null +++ b/docs/_navbar.md @@ -0,0 +1 @@ +* [中文](/zh/README.md) \ No newline at end of file diff --git a/docs/_sidebar.md b/docs/_sidebar.md new file mode 100644 index 0000000000..a9ae88e208 --- /dev/null +++ b/docs/_sidebar.md @@ -0,0 +1,114 @@ +- [Home](/en/README.md) +- Quick start + - [Use State API](en/start/state/start.md) + - Use Configuration API + - [Use Apollo as configuration center](en/start/configuration/start-apollo.md) + - [Use Etcd as configuration center](en/start/configuration/start.md) + - [Use Nacos as configuration center](en/start/configuration/start-nacos.md) + - Publish or subscribe messages + - [Use Pub/Sub API](en/start/pubsub/start.md) + - [(Under construction) Use DelayQueue API](en/start/delay_queue/start) + - [Use Distributed Lock API](en/start/lock/start.md) + - [Use Sequencer API](en/start/sequencer/start.md) + - Use Secret API + - [Query secrets](en/start/secret/start.md) + - [Refer to secrets in component configuration](en/start/secret/secret_ref.md) + - Service Invocation + - [Hello World](en/start/rpc/helloworld.md) + - [Dubbo JSON RPC](en/start/rpc/dubbo_json_rpc.md) + - [Use OSS API](en/start/oss/start.md) + - API plugin + - [Register your own API](en/start/api_plugin/helloworld.md) + - [Generate API plugin automatically](en/start/api_plugin/generate.md) + + - [(Under construction) Use sms API](en/start/sms/start) + - [(Under construction) Use cryption API](en/start/cryption/start) + - [(Under construction) Use phone API](en/start/phone/start) + - [(Under construction) Use email API](en/start/email/start) + - [Use lifecycle API](en/start/lifecycle/start) + - As the data plane of istio + - [Integrate with istio 1.10.6](en/start/istio/) + - [Integrate with istio 1.5.x](en/start/istio/start.md) + - Traffic intervention on the 4th layer network + - [Dump TCP Traffic](en/start/network_filter/tcpcopy.md) + - Flow Control on the 7th layer network + - [Method Level Flow Control](en/start/stream_filter/flow_control.md) + - Observability + - [Tracing & Metrics](en/start/trace/trace.md) + - [Skywalking tracing](en/start/trace/skywalking.md) + - [Prometheus metrics](en/start/trace/prometheus.md) + - [Health check and metadata query](en/start/actuator/start.md) + - [Run business logic in Layotto using WASM](en/start/wasm/start.md) + - [FaaS model based on WASM and Runtime](en/start/faas/start.md) +- [Online lab](en/start/lab.md) +- Developer guide + - Building blocks + - [File API](en/building_blocks/file/file.md) + - [Actuator API](en/building_blocks/actuator/actuator.md) + - [State API](en/building_blocks/state/reference.md) + - [Sequencer API](en/building_blocks/sequencer/reference.md) + - [Distributed Lock API](en/building_blocks/lock/reference.md) + - [Pub/Sub API](en/building_blocks/pubsub/reference.md) + - [RPC API](en/building_blocks/rpc/reference.md) + - [Configuration API](en/building_blocks/configuration/reference.md) + - Scalability + - [Pluggable component](en/design/pluggable/usage.md) + - [API reference](en/api_reference/README) + - SDK reference + - [java sdk](https://github.com/layotto/java-sdk) + - [.net sdk](https://github.com/layotto/dotnet-sdk) + - [js sdk](https://github.com/layotto/js-sdk) + - [go sdk](en/sdk_reference/go/start.md) +- Operations + - How to configurate Layotto + - [Introduction to Layotto configuration file](en/configuration/overview.md) + - [How to configurate the components](en/component_specs/overview.md) + - [State](en/component_specs/state/common.md) + - [Redis](en/component_specs/state/redis.md) + - [Other components](en/component_specs/state/others.md) + - Pub/Sub + - [Redis](en/component_specs/pubsub/redis.md) + - [Other components](en/component_specs/pubsub/others.md) + - [Distributed Lock](en/component_specs/lock/common.md) + - [Redis](en/component_specs/lock/redis.md) + - [Etcd](en/component_specs/lock/etcd.md) + - [Zookeeper](en/component_specs/lock/zookeeper.md) + - [Consul](en/component_specs/lock/consul.md) + - [MongoDB](en/component_specs/lock/mongo.md) + - Configuration + - [Etcd](en/component_specs/configuration/etcd.md) + - [Apollo](en/component_specs/configuration/apollo.md) + - [Nacos](en/component_specs/configuration/nacos.md) + - File + - [OSS](en/component_specs/file/oss.md) + - [Sequencer](en/component_specs/sequencer/common.md) + - [Etcd](en/component_specs/sequencer/etcd.md) + - [Redis](en/component_specs/sequencer/redis.md) + - [Zookeeper](en/component_specs/sequencer/zookeeper.md) + - [MongoDB](en/component_specs/sequencer/mongo.md) + - [Mysql](en/component_specs/sequencer/mysql.md) + - [Snowflake](en/component_specs/sequencer/snowflake.md) + - [Secret Store](en/component_specs/secret/common.md) + - [How to deploy and upgrade Layotto](en/operation/) + - [Layotto sidecar injector](en/operation/sidecar_injector.md) +- Design documents + - [Actuator design doc](en/design/actuator/actuator-design-doc.md) + - [Configuration API with Apollo](en/design/configuration/configuration-api-with-apollo.md) + - [Pub/Sub API and compability with dapr component](en/design/pubsub/pubsub-api-and-compability-with-dapr-component.md) + - [RPC design doc](en/design/rpc/rpc-design-doc.md) + - [Distributed lock API design](en/design/lock/lock-api-design.md) + - [FaaS design](en/design/faas/faas-poc-design.md) + - [Pluggable Component design doc](en/design/pluggable/design.md) +- Contributing + - [Document Contribution Guide](en/development/contributing-doc.md) + - [Automate testing of Quickstart documentation with tools](en/development/test-quickstart.md) + - [Component Development Guide](en/development/developing-component.md) + - [Component Ref Guide](en/development/component_ref/component_ref.md) + - Want to modify proto files or API definition? + - [How to generate pb code and API reference](en/api_reference/how_to_generate_api_doc.md) + - [Comment specification of proto file](en/api_reference/comment_spec_of_proto.md) + - [Development specification when adding API](en/development/developing-api.md) + - [Layotto Github Workflows Guide](en/development/github-workflows.md) + - [Layotto Commands Guide](en/development/commands.md) + - [Layotto contributor guide](en/development/CONTRIBUTING.md) + diff --git a/docs/api/v1/cryption.html b/docs/api/v1/cryption.html new file mode 100644 index 0000000000..9f9cd4c487 --- /dev/null +++ b/docs/api/v1/cryption.html @@ -0,0 +1,402 @@ + + + + + Protocol Documentation + + + + + + + + + + +

Protocol Documentation

+ +

Table of Contents

+ +
+ +
+ + + +
+

cryption.proto

Top +
+

+ + +

[gRPC Service] CryptionService

+

CryptionService is used to encrypt or decrypt data.

+ + + + + + + + + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
EncryptEncryptRequestEncryptResponse

Encrypt data

DecryptDecryptRequestDecryptResponse

Decrypt data

+ + + + +

DecryptRequest

+

DecryptRequest is the request of the `Decrypt` method.

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
component_namestring

The cryption service name, e.g. 'aliyun.kms'

cipher_textbytes

Required. The encrypted text

+ + + + + +

DecryptResponse

+

DecryptResponse is the response of the `Decrypt` method.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
plain_textbytes

Raw plaintext.

key_idstring

The id of the key used to decrypt this text.

key_version_idstring

The version of the key

+ + + + + +

EncryptRequest

+

EncryptRequest is the request to encrypt data.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
component_namestring

The cryption service name, e.g. 'aliyun.kms'

plain_textbytes

Required. Raw plaintext.

key_idstring

Required.

+ + + + + +

EncryptResponse

+

EncryptResponse is the response of the `Encrypt` method.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
cipher_textbytes

The encrypted text

key_idstring

The id of the key used to decrypt this text.

key_version_idstring

The version of the key

+ + + + + + + + + + + + + + diff --git a/docs/api/v1/delay_queue.html b/docs/api/v1/delay_queue.html new file mode 100644 index 0000000000..21f6f00415 --- /dev/null +++ b/docs/api/v1/delay_queue.html @@ -0,0 +1,364 @@ + + + + + Protocol Documentation + + + + + + + + + + +

Protocol Documentation

+ +

Table of Contents

+ +
+ +
+ + + +
+

delay_queue.proto

Top +
+

+ + +

[gRPC Service] DelayQueue

+

DelayQueue is a special kind of message queue, which lets you postpone the delivery of new messages to consumers.

For example, you can invoke this API and tell the message queue "please send this message to the consumers after 5 minutes".

+ + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
PublishDelayMessageDelayMessageRequestDelayMessageResponse

Publish a delay message

+ + + + +

DelayMessageRequest

+

DelayMessageRequest is the message to publish

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
component_namestring

Required. The name of the DelayQueue component

topicstring

Required. The pubsub topic

databytes

Required. The data which will be published to topic.

data_content_typestring

The content type for the data (optional).

delay_in_secondsint32

The length of time, in seconds, for which the delivery +of this messages is delayed. Default: 0.

metadataDelayMessageRequest.MetadataEntryrepeated

The metadata passing to pub components + +metadata property: +- key : the key of the message.

+ + + + + +

DelayMessageRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

DelayMessageResponse

+

DelayMessageResponse is the response

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
message_idstring

The message identifier

+ + + + + + + + + + + + + + diff --git a/docs/api/v1/email.html b/docs/api/v1/email.html new file mode 100644 index 0000000000..3559d9bfed --- /dev/null +++ b/docs/api/v1/email.html @@ -0,0 +1,546 @@ + + + + + Protocol Documentation + + + + + + + + + + +

Protocol Documentation

+ +

Table of Contents

+ +
+ +
+ + + +
+

email.proto

Top +
+

+ + +

[gRPC Service] EmailService

+

EmailService is used to send emails.

+ + + + + + + + + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
SendEmailWithTemplateSendEmailWithTemplateRequestSendEmailWithTemplateResponse

Send an email with template

SendEmailSendEmailRequestSendEmailResponse

Send an email with raw content instead of using templates.

+ + + + +

Content

+

Email content

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
textstring

Required.

+ + + + + +

EmailAddress

+

Address information

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
fromstring

Required. The Email sender address.

tostringrepeated

Required. The Email destination addresses.

ccstringrepeated

Optional. To whom the mail is cc

+ + + + + +

EmailTemplate

+

Email template

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
template_idstring

Required

template_paramsEmailTemplate.TemplateParamsEntryrepeated

Required

+ + + + + +

EmailTemplate.TemplateParamsEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

SendEmailRequest

+

SendEmailRequest is the message send to email.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
component_namestring

The saas service name, like 'aliyun.email'/'aws.ses'/'...' + If your system uses multiple IVR services at the same time, + you can specify which service to use with this field.

setting_idstring

Required.

subjectstring

Required. The Email subject.

contentContent

Required.

addressEmailAddress

Required.

+ + + + + +

SendEmailResponse

+

The response of `SendEmail` method

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
request_idstring

The saas requestId.

+ + + + + +

SendEmailWithTemplateRequest

+

SendEmailWithTemplateRequest is the message send to email.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
component_namestring

The saas service name, like 'aliyun.email'/'aws.ses'/'...' + If your system uses multiple IVR services at the same time, + you can specify which service to use with this field.

templateEmailTemplate

Required.

subjectstring

Required. The Email subject.

addressEmailAddress

Required.

+ + + + + +

SendEmailWithTemplateResponse

+

Response of `SendEmailWithTemplate` method

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
request_idstring

The saas requestId.

+ + + + + + + + + + + + + + diff --git a/docs/api/v1/phone.html b/docs/api/v1/phone.html new file mode 100644 index 0000000000..38631404f0 --- /dev/null +++ b/docs/api/v1/phone.html @@ -0,0 +1,382 @@ + + + + + Protocol Documentation + + + + + + + + + + +

Protocol Documentation

+ +

Table of Contents

+ +
+ +
+ + + +
+

phone.proto

Top +
+

+ + +

[gRPC Service] PhoneCallService

+

PhoneCallService API is used to send voice messages.

+ + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
SendVoiceWithTemplateSendVoiceWithTemplateRequestSendVoiceWithTemplateResponse

Send voice using the specific template

+ + + + +

SendVoiceWithTemplateRequest

+

The request of SendVoiceWithTemplate method

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
component_namestring

If your system uses multiple IVR services at the same time, +you can specify which service to use with this field.

templateVoiceTemplate

Required

to_mobilestringrepeated

Required

from_mobilestring

This field is required by some cloud providers.

+ + + + + +

SendVoiceWithTemplateResponse

+

The response of `SendVoiceWithTemplate` method

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
request_idstring

Id of this request.

+ + + + + +

VoiceTemplate

+

VoiceTemplate

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
template_idstring

Required

template_paramsVoiceTemplate.TemplateParamsEntryrepeated

Required

+ + + + + +

VoiceTemplate.TemplateParamsEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + + + + + + + + + + diff --git a/docs/api/v1/runtime.html b/docs/api/v1/runtime.html new file mode 100644 index 0000000000..535286fc0d --- /dev/null +++ b/docs/api/v1/runtime.html @@ -0,0 +1,4391 @@ + + + + + Protocol Documentation + + + + + + + + + + +

Protocol Documentation

+ +

Table of Contents

+ +
+ +
+ + + +
+

appcallback.proto

Top +
+

+ + +

[gRPC Service] AppCallback

+

AppCallback V1 allows user application to interact with runtime.

User application needs to implement AppCallback service if it needs to

receive message from runtime.

+ + + + + + + + + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
ListTopicSubscriptions.google.protobuf.EmptyListTopicSubscriptionsResponse

Lists all topics subscribed by this app.

OnTopicEventTopicEventRequestTopicEventResponse

Subscribes events from Pubsub

+ + + + +

ListTopicSubscriptionsResponse

+

ListTopicSubscriptionsResponse is the message including the list of the subscribing topics.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
subscriptionsTopicSubscriptionrepeated

The list of topics.

+ + + + + +

TopicEventRequest

+

TopicEventRequest message is compatible with CloudEvent spec v1.0

https://github.com/cloudevents/spec/blob/v1.0/spec.md

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
idstring

id identifies the event. Producers MUST ensure that source + id +is unique for each distinct event. If a duplicate event is re-sent +(e.g. due to a network error) it MAY have the same id.

sourcestring

source identifies the context in which an event happened. +Often this will include information such as the type of the +event source, the organization publishing the event or the process +that produced the event. The exact syntax and semantics behind +the data encoded in the URI is defined by the event producer.

typestring

The type of event related to the originating occurrence.

spec_versionstring

The version of the CloudEvents specification.

data_content_typestring

The content type of data value.

databytes

The content of the event.

topicstring

The pubsub topic which publisher sent to.

pubsub_namestring

The name of the pubsub the publisher sent to.

metadataTopicEventRequest.MetadataEntryrepeated

add a map to pass some extra properties.

+ + + + + +

TopicEventRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

TopicEventResponse

+

TopicEventResponse is response from app on published message

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
statusTopicEventResponse.TopicEventResponseStatus

The list of output bindings.

+ + + + + +

TopicSubscription

+

TopicSubscription represents topic and metadata.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
pubsub_namestring

Required. The name of the pubsub containing the topic below to subscribe to.

topicstring

Required. The name of topic which will be subscribed

metadataTopicSubscription.MetadataEntryrepeated

The optional properties used for this topic's subscription e.g. session id

+ + + + + +

TopicSubscription.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + + + +

TopicEventResponse.TopicEventResponseStatus

+

TopicEventResponseStatus allows apps to have finer control over handling of the message.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
SUCCESS0

SUCCESS is the default behavior: message is acknowledged and not retried or logged.

RETRY1

RETRY status signals runtime to retry the message as part of an expected scenario (no warning is logged).

DROP2

DROP status signals runtime to drop the message as part of an unexpected scenario (warning is logged).

+ + + + + + +
+

lifecycle.proto

Top +
+

+ + +

[gRPC Service] Lifecycle

+

Lifecycle API is used to manage the sidecar lifecycle.

For example, by invoking the lifecycle API, you can modify the components' configuration during runtime

+ + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
ApplyConfigurationDynamicConfigurationApplyConfigurationResponse

Apply the dynamic configuration. +The DynamicConfiguration here should be full configuration, not incremental configuration

+ + + + +

ApplyConfigurationResponse

+

The response of the `ApplyConfiguration` method.

+ + + + + +

ComponentConfig

+

The dynamic configuration of a component

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
kindstring

Required. Which kind of API you are using, e.g. `lock`, `state`

namestring

Required. The component name, e.g. `state_demo`

metadataComponentConfig.MetadataEntryrepeated

Required. The dynamic configuration of this component

+ + + + + +

ComponentConfig.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

DynamicConfiguration

+

The dynamic configuration of the sidecar

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
component_configComponentConfig

Required. The dynamic configuration of a component

+ + + + + + + + + + + + +
+

runtime.proto

Top +
+

+ + +

[gRPC Service] Runtime

+

Runtime encapsulates variours Runtime APIs(such as Configuration API, Pub/Sub API, etc)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
SayHelloSayHelloRequestSayHelloResponse

SayHello used for test

InvokeServiceInvokeServiceRequestInvokeResponse

InvokeService do rpc calls

GetConfigurationGetConfigurationRequestGetConfigurationResponse

GetConfiguration gets configuration from configuration store.

SaveConfigurationSaveConfigurationRequest.google.protobuf.Empty

SaveConfiguration saves configuration into configuration store.

DeleteConfigurationDeleteConfigurationRequest.google.protobuf.Empty

DeleteConfiguration deletes configuration from configuration store.

SubscribeConfigurationSubscribeConfigurationRequest streamSubscribeConfigurationResponse stream

SubscribeConfiguration gets configuration from configuration store and subscribe the updates.

TryLockTryLockRequestTryLockResponse

Distributed Lock API +A non-blocking method trying to get a lock with ttl.

UnlockUnlockRequestUnlockResponse

A method trying to unlock.

LockKeepAliveLockKeepAliveRequestLockKeepAliveResponse

A method used to support lease renewal for distributed lock.

GetNextIdGetNextIdRequestGetNextIdResponse

Sequencer API +Get next unique id with some auto-increment guarantee

GetStateGetStateRequestGetStateResponse

Gets the state for a specific key.

GetBulkStateGetBulkStateRequestGetBulkStateResponse

Gets a bulk of state items for a list of keys

SaveStateSaveStateRequest.google.protobuf.Empty

Saves an array of state objects

DeleteStateDeleteStateRequest.google.protobuf.Empty

Deletes the state for a specific key.

DeleteBulkStateDeleteBulkStateRequest.google.protobuf.Empty

Deletes a bulk of state items for a list of keys

ExecuteStateTransactionExecuteStateTransactionRequest.google.protobuf.Empty

Executes transactions for a specified store

PublishEventPublishEventRequest.google.protobuf.Empty

Publishes events to the specific topic

GetFileGetFileRequestGetFileResponse stream

Get file with stream

PutFilePutFileRequest stream.google.protobuf.Empty

Put file with stream

ListFileListFileRequestListFileResp

List all files

DelFileDelFileRequest.google.protobuf.Empty

Delete specific file

GetFileMetaGetFileMetaRequestGetFileMetaResponse

Get file meta data, if file not exist,return code.NotFound error

InvokeBindingInvokeBindingRequestInvokeBindingResponse

Invokes binding data to specific output bindings

GetSecretGetSecretRequestGetSecretResponse

Gets secrets from secret stores.

GetBulkSecretGetBulkSecretRequestGetBulkSecretResponse

Gets a bulk of secrets

+ + + + +

BulkStateItem

+

BulkStateItem is the response item for a bulk get operation.

Return values include the item key, data and etag.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

state item key

databytes

The byte array data

etagstring

The entity tag which represents the specific version of data. +ETag format is defined by the corresponding data store.

errorstring

The error that was returned from the state store in case of a failed get operation.

metadataBulkStateItem.MetadataEntryrepeated

The metadata which will be sent to app.

+ + + + + +

BulkStateItem.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

CommonInvokeRequest

+

Common invoke request message which includes invoke method and data

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
methodstring

The method of requset

datagoogle.protobuf.Any

The request data

content_typestring

The content type of request data

http_extensionHTTPExtension

The extra information of http

+ + + + + +

ConfigurationItem

+

ConfigurationItem represents a configuration item with key, content and other information.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

Required. The key of configuration item

contentstring

The content of configuration item +Empty if the configuration is not set, including the case that the configuration is changed from value-set to value-not-set.

groupstring

The group of configuration item.

labelstring

The label of configuration item.

tagsConfigurationItem.TagsEntryrepeated

The tag list of configuration item.

metadataConfigurationItem.MetadataEntryrepeated

The metadata which will be passed to configuration store component.

+ + + + + +

ConfigurationItem.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

ConfigurationItem.TagsEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

DelFileRequest

+

Delete file request message

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
requestFileRequest

File request

+ + + + + +

DeleteBulkStateRequest

+

DeleteBulkStateRequest is the message to delete a list of key-value states from specific state store.

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of state store.

statesStateItemrepeated

Required. The array of the state key values.

+ + + + + +

DeleteConfigurationRequest

+

DeleteConfigurationRequest is the message to delete a list of key-value configuration from specified configuration store.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

The name of configuration store.

app_idstring

The application id which +Only used for admin, Ignored and reset for normal client

groupstring

The group of keys.

labelstring

The label for keys.

keysstringrepeated

The keys to get.

metadataDeleteConfigurationRequest.MetadataEntryrepeated

The metadata which will be sent to configuration store components.

+ + + + + +

DeleteConfigurationRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

DeleteStateRequest

+

DeleteStateRequest is the message to delete key-value states in the specific state store.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of state store.

keystring

Required. The key of the desired state

etagEtag

(optional) The entity tag which represents the specific version of data. +The exact ETag format is defined by the corresponding data store.

optionsStateOptions

(optional) State operation options which includes concurrency/ +consistency/retry_policy.

metadataDeleteStateRequest.MetadataEntryrepeated

(optional) The metadata which will be sent to state store components.

+ + + + + +

DeleteStateRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

Etag

+

Etag represents a state item version

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
valuestring

value sets the etag value

+ + + + + +

ExecuteStateTransactionRequest

+

ExecuteStateTransactionRequest is the message to execute multiple operations on a specified store.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
storeNamestring

Required. name of state store.

operationsTransactionalStateOperationrepeated

Required. transactional operation list.

metadataExecuteStateTransactionRequest.MetadataEntryrepeated

(optional) The metadata used for transactional operations.

+ + + + + +

ExecuteStateTransactionRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

FileInfo

+

File info message

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
file_namestring

The name of file

sizeint64

The size of file

last_modifiedstring

The modified time of file

metadataFileInfo.MetadataEntryrepeated

The metadata for user extension.

+ + + + + +

FileInfo.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

FileMeta

+

A map that store FileMetaValue

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
metadataFileMeta.MetadataEntryrepeated

A data structure to store metadata

+ + + + + +

FileMeta.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valueFileMetaValue

+ + + + + +

FileMetaValue

+

FileMeta value

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
valuestringrepeated

File meta value

+ + + + + +

FileRequest

+

File request message

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

The name of store

namestring

The name of the directory

metadataFileRequest.MetadataEntryrepeated

The metadata for user extension.

+ + + + + +

FileRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

GetBulkSecretRequest

+

GetBulkSecretRequest is the message to get the secrets from secret store.

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

The name of secret store.

metadataGetBulkSecretRequest.MetadataEntryrepeated

The metadata which will be sent to secret store components.

+ + + + + +

GetBulkSecretRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

GetBulkSecretResponse

+

GetBulkSecretResponse is the response message to convey the requested secrets.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
dataGetBulkSecretResponse.DataEntryrepeated

data hold the secret values. Some secret store, such as kubernetes secret +store, can save multiple secrets for single secret key.

+ + + + + +

GetBulkSecretResponse.DataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valueSecretResponse

+ + + + + +

GetBulkStateRequest

+

GetBulkStateRequest is the message to get a list of key-value states from specific state store.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of state store.

keysstringrepeated

Required. The keys to get.

parallelismint32

(optional) The number of parallel operations executed on the state store for a get operation.

metadataGetBulkStateRequest.MetadataEntryrepeated

(optional) The metadata which will be sent to state store components.

+ + + + + +

GetBulkStateRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

GetBulkStateResponse

+

GetBulkStateResponse is the response conveying the list of state values.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
itemsBulkStateItemrepeated

The list of items containing the keys to get values for.

+ + + + + +

GetConfigurationRequest

+

GetConfigurationRequest is the message to get a list of key-value configuration from specified configuration store.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

The name of configuration store.

app_idstring

The application id which +Only used for admin, Ignored and reset for normal client

groupstring

The group of keys.

labelstring

The label for keys.

keysstringrepeated

The keys to get.

metadataGetConfigurationRequest.MetadataEntryrepeated

The metadata which will be sent to configuration store components.

subscribe_updatebool

Subscribes update event for given keys. +If true, when any configuration item in this request is updated, app will receive event by OnConfigurationEvent() of app callback

+ + + + + +

GetConfigurationRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

GetConfigurationResponse

+

GetConfigurationResponse is the response conveying the list of configuration values.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
itemsConfigurationItemrepeated

The list of items containing configuration values.

+ + + + + +

GetFileMetaRequest

+

Get fileMeta request message

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
requestFileRequest

File meta request

+ + + + + +

GetFileMetaResponse

+

Get fileMeta response message

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
sizeint64

The size of file

last_modifiedstring

The modified time of file

responseFileMeta

File meta response

+ + + + + +

GetFileRequest

+

Get file request message

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

The name of store

namestring

The name of the file or object want to get.

metadataGetFileRequest.MetadataEntryrepeated

The metadata for user extension.

+ + + + + +

GetFileRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

GetFileResponse

+

Get file response message

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
databytes

The data of file

+ + + + + +

GetNextIdRequest

+

Get next id request message

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. Name of sequencer storage

keystring

Required. key is the identifier of a sequencer namespace,e.g. "order_table".

optionsSequencerOptions

(optional) SequencerOptions configures requirements for auto-increment guarantee

metadataGetNextIdRequest.MetadataEntryrepeated

(optional) The metadata which will be sent to the component.

+ + + + + +

GetNextIdRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

GetNextIdResponse

+

Get next id response message

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
next_idint64

The next unique id +Fixed int64 overflow problems on JavaScript https://github.com/improbable-eng/ts-protoc-gen#gotchas

+ + + + + +

GetSecretRequest

+

GetSecretRequest is the message to get secret from secret store.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

The name of secret store.

keystring

The name of secret key.

metadataGetSecretRequest.MetadataEntryrepeated

The metadata which will be sent to secret store components. +Contains version, status, and so on...

+ + + + + +

GetSecretRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

GetSecretResponse

+

GetSecretResponse is the response message to convey the requested secret.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
dataGetSecretResponse.DataEntryrepeated

data is the secret value. Some secret store, such as kubernetes secret +store, can save multiple secrets for single secret key.

+ + + + + +

GetSecretResponse.DataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

GetStateRequest

+

GetStateRequest is the message to get key-value states from specific state store.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of state store.

keystring

Required. The key of the desired state

consistencyStateOptions.StateConsistency

(optional) read consistency mode

metadataGetStateRequest.MetadataEntryrepeated

(optional) The metadata which will be sent to state store components.

+ + + + + +

GetStateRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

GetStateResponse

+

GetStateResponse is the response conveying the state value and etag.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
databytes

The byte array data

etagstring

The entity tag which represents the specific version of data. +ETag format is defined by the corresponding data store.

metadataGetStateResponse.MetadataEntryrepeated

The metadata which will be sent to app.

+ + + + + +

GetStateResponse.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

HTTPExtension

+

Http extension message is about invoke http information

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
verbHTTPExtension.Verb

The method of http reuest

querystringstring

The query information of http

+ + + + + +

InvokeBindingRequest

+

InvokeBindingRequest is the message to send data to output bindings

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
namestring

The name of the output binding to invoke.

databytes

The data which will be sent to output binding.

metadataInvokeBindingRequest.MetadataEntryrepeated

The metadata passing to output binding components +Common metadata property: +- ttlInSeconds : the time to live in seconds for the message. +If set in the binding definition will cause all messages to +have a default time to live. The message ttl overrides any value +in the binding definition.

operationstring

The name of the operation type for the binding to invoke

+ + + + + +

InvokeBindingRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

InvokeBindingResponse

+

InvokeBindingResponse is the message returned from an output binding invocation

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
databytes

The data which will be sent to output binding.

metadataInvokeBindingResponse.MetadataEntryrepeated

The metadata returned from an external system

+ + + + + +

InvokeBindingResponse.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

InvokeResponse

+

Invoke service response message is result of invoke service queset

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
datagoogle.protobuf.Any

The response data

content_typestring

The content type of response data

+ + + + + +

InvokeServiceRequest

+

Invoke service request message

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
idstring

The identify of InvokeServiceRequest

messageCommonInvokeRequest

InvokeServiceRequest message

+ + + + + +

ListFileRequest

+

List file request message

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
requestFileRequest

File request

page_sizeint32

Page size

markerstring

Marker

+ + + + + +

ListFileResp

+

List file response message

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
filesFileInforepeated

File info

markerstring

Marker

is_truncatedbool

Is truncated

+ + + + + +

LockKeepAliveRequest

+

LockKeepAlive request message

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The lock store name,e.g. `redis`.

resource_idstring

Required. resource_id is the lock key.

lock_ownerstring

Required. The owner of the lock.

expireint32

Required. expire is the time before expire.The time unit is second.

+ + + + + +

LockKeepAliveResponse

+

LockKeepAlive response message

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
statusLockKeepAliveResponse.Status

The status of LockKeepAlive

+ + + + + +

PublishEventRequest

+

PublishEventRequest is the message to publish event data to pubsub topic

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
pubsub_namestring

The name of the pubsub component

topicstring

The pubsub topic

databytes

The data which will be published to topic.

data_content_typestring

The content type for the data (optional).

metadataPublishEventRequest.MetadataEntryrepeated

The metadata passing to pub components + +metadata property: +- key : the key of the message.

+ + + + + +

PublishEventRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

PutFileRequest

+

Put file request message

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

The name of store

namestring

The name of the file or object want to put.

databytes

The data will be store.

metadataPutFileRequest.MetadataEntryrepeated

The metadata for user extension.

+ + + + + +

PutFileRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

SaveConfigurationRequest

+

SaveConfigurationRequest is the message to save a list of key-value configuration into specified configuration store.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

The name of configuration store.

app_idstring

The application id which +Only used for admin, ignored and reset for normal client

itemsConfigurationItemrepeated

The list of configuration items to save. +To delete a exist item, set the key (also label) and let content to be empty

metadataSaveConfigurationRequest.MetadataEntryrepeated

The metadata which will be sent to configuration store components.

+ + + + + +

SaveConfigurationRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

SaveStateRequest

+

SaveStateRequest is the message to save multiple states into state store.

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of state store.

statesStateItemrepeated

Required. The array of the state key values.

+ + + + + +

SayHelloRequest

+

Hello request message

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
service_namestring

The name of service

namestring

Reuqest name

datagoogle.protobuf.Any

Optional. This field is used to control the packet size during load tests.

+ + + + + +

SayHelloResponse

+

Hello response message

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
hellostring

Hello

datagoogle.protobuf.Any

Hello message of data

+ + + + + +

SecretResponse

+

SecretResponse is a map of decrypted string/string values

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
secretsSecretResponse.SecretsEntryrepeated

The data struct of secrets

+ + + + + +

SecretResponse.SecretsEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

SequencerOptions

+

SequencerOptions configures requirements for auto-increment guarantee

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
incrementSequencerOptions.AutoIncrement

Default STRONG auto-increment

+ + + + + +

StateItem

+

StateItem represents state key, value, and additional options to save state.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

Required. The state key

valuebytes

Required. The state data for key

etagEtag

(optional) The entity tag which represents the specific version of data. +The exact ETag format is defined by the corresponding data store. Layotto runtime only treats ETags as opaque strings.

metadataStateItem.MetadataEntryrepeated

(optional) additional key-value pairs to be passed to the state store.

optionsStateOptions

(optional) Options for concurrency and consistency to save the state.

+ + + + + +

StateItem.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

StateOptions

+

StateOptions configures concurrency and consistency for state operations

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
concurrencyStateOptions.StateConcurrency

The state operation of concurrency

consistencyStateOptions.StateConsistency

The state operation of consistency

+ + + + + +

SubscribeConfigurationRequest

+

SubscribeConfigurationRequest is the message to get a list of key-value configuration from specified configuration store.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

The name of configuration store.

app_idstring

The application id which +Only used for admin, ignored and reset for normal client

groupstring

The group of keys.

labelstring

The label for keys.

keysstringrepeated

The keys to get.

metadataSubscribeConfigurationRequest.MetadataEntryrepeated

The metadata which will be sent to configuration store components.

+ + + + + +

SubscribeConfigurationRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

SubscribeConfigurationResponse

+

SubscribeConfigurationResponse is the response conveying the list of configuration values.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

The name of configuration store.

app_idstring

The application id. +Only used for admin client.

itemsConfigurationItemrepeated

The list of items containing configuration values.

+ + + + + +

TransactionalStateOperation

+

TransactionalStateOperation is the message to execute a specified operation with a key-value pair.

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
operationTypestring

Required. The type of operation to be executed. +Legal values include: +"upsert" represents an update or create operation +"delete" represents a delete operation

requestStateItem

Required. State values to be operated on

+ + + + + +

TryLockRequest

+

Lock request message is distributed lock API which is not blocking method tring to get a lock with ttl

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The lock store name,e.g. `redis`.

resource_idstring

Required. resource_id is the lock key. e.g. `order_id_111` +It stands for "which resource I want to protect"

lock_ownerstring

Required. lock_owner indicate the identifier of lock owner. +You can generate a uuid as lock_owner.For example,in golang: +req.LockOwner = uuid.New().String() +This field is per request,not per process,so it is different for each request, +which aims to prevent multi-thread in the same process trying the same lock concurrently. +The reason why we don't make it automatically generated is: +1. If it is automatically generated,there must be a 'my_lock_owner_id' field in the response. +This name is so weird that we think it is inappropriate to put it into the api spec +2. If we change the field 'my_lock_owner_id' in the response to 'lock_owner',which means the current lock owner of this lock, +we find that in some lock services users can't get the current lock owner.Actually users don't need it at all. +3. When reentrant lock is needed,the existing lock_owner is required to identify client and check "whether this client can reenter this lock". +So this field in the request shouldn't be removed.

expireint32

Required. expire is the time before expire.The time unit is second.

+ + + + + +

TryLockResponse

+

Lock response message returns is the lock obtained.

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
successbool

Is lock success

+ + + + + +

UnlockRequest

+

UnLock request message

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

The name of store

resource_idstring

resource_id is the lock key.

lock_ownerstring

The owner of the lock

+ + + + + +

UnlockResponse

+

UnLock response message

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
statusUnlockResponse.Status

The status of unlock

+ + + + + + + +

HTTPExtension.Verb

+

The enum of http reuest method

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
NONE0

NONE

GET1

GET method

HEAD2

HEAD method

POST3

POST method

PUT4

PUT method

DELETE5

DELETE method

CONNECT6

CONNECT method

OPTIONS7

CONNECT method

TRACE8

CONNECT method

PATCH9

PATCH method

+ +

LockKeepAliveResponse.Status

+

The enum of LockKeepAlive status

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
SUCCESS0

Lease renewal success

LOCK_UNEXIST1

The lock is not exist

LOCK_BELONG_TO_OTHERS2

The lock is belong to others

INTERNAL_ERROR3

Internal error

+ +

SequencerOptions.AutoIncrement

+

requirements for auto-increment guarantee

+ + + + + + + + + + + + + + + + + + + +
NameNumberDescription
WEAK0

(default) WEAK means a "best effort" incrementing service.But there is no strict guarantee of global monotonically increasing. +The next id is "probably" greater than current id.

STRONG1

STRONG means a strict guarantee of global monotonically increasing. +The next id "must" be greater than current id.

+ +

StateOptions.StateConcurrency

+

Enum describing the supported concurrency for state.

The API server uses Optimized Concurrency Control (OCC) with ETags.

When an ETag is associated with an save or delete request, the store shall allow the update only if the attached ETag matches with the latest ETag in the database.

But when ETag is missing in the write requests, the state store shall handle the requests in the specified strategy(e.g. a last-write-wins fashion).

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
CONCURRENCY_UNSPECIFIED0

Concurrency state is unspecified

CONCURRENCY_FIRST_WRITE1

First write wins

CONCURRENCY_LAST_WRITE2

Last write wins

+ +

StateOptions.StateConsistency

+

Enum describing the supported consistency for state.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
CONSISTENCY_UNSPECIFIED0

Consistency state is unspecified

CONSISTENCY_EVENTUAL1

The API server assumes data stores are eventually consistent by default.A state store should: +- For read requests, the state store can return data from any of the replicas +- For write request, the state store should asynchronously replicate updates to configured quorum after acknowledging the update request.

CONSISTENCY_STRONG2

When a strong consistency hint is attached, a state store should: +- For read requests, the state store should return the most up-to-date data consistently across replicas. +- For write/delete requests, the state store should synchronisely replicate updated data to configured quorum before completing the write request.

+ +

UnlockResponse.Status

+

The enum of unlock status

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameNumberDescription
SUCCESS0

Unlock is success

LOCK_UNEXIST1

The lock is not exist

LOCK_BELONG_TO_OTHERS2

The lock is belong to others

INTERNAL_ERROR3

Internal error

+ + + + + + + + diff --git a/docs/api/v1/s3.html b/docs/api/v1/s3.html new file mode 100644 index 0000000000..51e6e247ec --- /dev/null +++ b/docs/api/v1/s3.html @@ -0,0 +1,5791 @@ + + + + + Protocol Documentation + + + + + + + + + + +

Protocol Documentation

+ +

Table of Contents

+ +
+ +
+ + + +
+

oss.proto

Top +
+

The file defined base on s3 protocol, to get an in-depth walkthrough of this file, see:

https://docs.aws.amazon.com/s3/index.html

https://github.com/aws/aws-sdk-go-v2

+ + +

[gRPC Service] ObjectStorageService

+

ObjectStorageService is an abstraction for blob storage or so called "object storage", such as alibaba cloud OSS, such as AWS S3.

You invoke ObjectStorageService API to do some CRUD operations on your binary file, e.g. query my file, delete my file, etc.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
PutObjectPutObjectInput streamPutObjectOutput

Object CRUD API +Adds an object to a bucket. +Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html

GetObjectGetObjectInputGetObjectOutput stream

Retrieves objects. +Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html

DeleteObjectDeleteObjectInputDeleteObjectOutput

Delete objects. +Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html

CopyObjectCopyObjectInputCopyObjectOutput

Creates a copy of an object that is already stored in oss server. +Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CopyObject.html

DeleteObjectsDeleteObjectsInputDeleteObjectsOutput

Delete multiple objects from a bucket. +Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_DeleteObjects.html

ListObjectsListObjectsInputListObjectsOutput

Returns some or all (up to 1,000) of the objects in a bucket. +Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_ListObjects.html

HeadObjectHeadObjectInputHeadObjectOutput

The HEAD action retrieves metadata from an object without returning the object itself. +Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html

IsObjectExistIsObjectExistInputIsObjectExistOutput

This action used to check if the file exists.

PutObjectTaggingPutObjectTaggingInputPutObjectTaggingOutput

Object Tagging API +Sets the supplied tag-set to an object that already exists in a bucket. +Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html

DeleteObjectTaggingDeleteObjectTaggingInputDeleteObjectTaggingOutput

Removes the entire tag set from the specified object. +Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html

GetObjectTaggingGetObjectTaggingInputGetObjectTaggingOutput

Returns the tag-set of an object. +Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObjectTagging.html

GetObjectCannedAclGetObjectCannedAclInputGetObjectCannedAclOutput

Returns object canned acl. +Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL

PutObjectCannedAclPutObjectCannedAclInputPutObjectCannedAclOutput

Set object canned acl. +Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL

CreateMultipartUploadCreateMultipartUploadInputCreateMultipartUploadOutput

Object Multipart Operation API +Initiates a multipart upload and returns an upload ID. +Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_CreateMultipartUpload.html

UploadPartUploadPartInput streamUploadPartOutput

Uploads a part in a multipart upload. +Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html

UploadPartCopyUploadPartCopyInputUploadPartCopyOutput

Uploads a part by copying data from an existing object as data source. +Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html

CompleteMultipartUploadCompleteMultipartUploadInputCompleteMultipartUploadOutput

Completes a multipart upload by assembling previously uploaded parts. +Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html

AbortMultipartUploadAbortMultipartUploadInputAbortMultipartUploadOutput

This action aborts a multipart upload. +Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html

ListMultipartUploadsListMultipartUploadsInputListMultipartUploadsOutput

This action lists in-progress multipart uploads. +Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html

ListPartsListPartsInputListPartsOutput

Lists the parts that have been uploaded for a specific multipart upload. +Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html

ListObjectVersionsListObjectVersionsInputListObjectVersionsOutput

Returns metadata about all versions of the objects in a bucket. +Refer https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html

SignURLSignURLInputSignURLOutput

A presigned URL gives you access to the object identified in the URL, provided that the creator of the presigned URL has permissions to access that object. +Refer https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html

UpdateDownloadBandwidthRateLimitUpdateBandwidthRateLimitInput.google.protobuf.Empty

This action used to set download bandwidth limit speed. +Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2106

UpdateUploadBandwidthRateLimitUpdateBandwidthRateLimitInput.google.protobuf.Empty

This action used to set upload bandwidth limit speed. +Refer https://github.com/aliyun/aliyun-oss-go-sdk/blob/master/oss/client.go#L2096

AppendObjectAppendObjectInput streamAppendObjectOutput

This action is used to append object. +Refer https://help.aliyun.com/document_detail/31981.html or https://github.com/minio/minio-java/issues/980

RestoreObjectRestoreObjectInputRestoreObjectOutput

Restores an archived copy of an object back. +Refer https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_RestoreObject.html

+ + + + +

AbortMultipartUploadInput

+

AbortMultipartUploadInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

expected_bucket_ownerstring

The account ID of the expected bucket owner

request_payerstring

Confirms that the requester knows that they will be charged for the request.

upload_idstring

Upload ID that identifies the multipart upload. +This member is required.

+ + + + + +

AbortMultipartUploadOutput

+

AbortMultipartUploadOutput

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
request_chargedstring

If present, indicates that the requester was successfully charged for the request.

+ + + + + +

AppendObjectInput

+

AppendObjectInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

bodybytes

Object content

positionint64

Append start position

aclstring

Object ACL

cache_controlstring

Sets the Cache-Control header of the response.

content_dispositionstring

Sets the Content-Disposition header of the response

content_encodingstring

Sets the Content-Encoding header of the response

content_md5string

The base64-encoded 128-bit MD5 digest of the part data.

expiresint64

Sets the Expires header of the response

storage_classstring

Provides storage class information of the object. Amazon S3 returns this header +for all objects except for S3 Standard storage class objects.

server_side_encryptionstring

The server-side encryption algorithm used when storing this object in Amazon S3 +(for example, AES256, aws:kms).

metastring

Object metadata

tagsAppendObjectInput.TagsEntryrepeated

Object tags

+ + + + + +

AppendObjectInput.TagsEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

AppendObjectOutput

+

AppendObjectOutput

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
append_positionint64

Next append position

+ + + + + +

CSVInput

+

CSVInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
allow_quoted_record_delimiterbool

Specifies that CSV field values may contain quoted record delimiters and such +records should be allowed. Default value is FALSE. Setting this value to TRUE +may lower performance.

commentsstring

A single character used to indicate that a row should be ignored when the +character is present at the start of that row. You can specify any character to +indicate a comment line.

field_delimiterstring

A single character used to separate individual fields in a record. You can +specify an arbitrary delimiter.

file_header_infostring

Describes the first line of input. Valid values are: + +* NONE: First line is not +a header. + +* IGNORE: First line is a header, but you can't use the header values +to indicate the column in an expression. You can use column position (such as +_1, _2, …) to indicate the column (SELECT s._1 FROM OBJECT s). + +* Use: First +line is a header, and you can use the header value to identify a column in an +expression (SELECT "name" FROM OBJECT).

quote_characterstring

A single character used for escaping when the field delimiter is part of the +value. For example, if the value is a, b, Amazon S3 wraps this field value in +quotation marks, as follows: " a , b ". Type: String Default: " Ancestors: CSV

quote_escape_characterstring

A single character used for escaping the quotation mark character inside an +already escaped value. For example, the value """ a , b """ is parsed as " a , b +".

record_delimiterstring

A single character used to separate individual records in the input. Instead of +the default value, you can specify an arbitrary delimiter.

+ + + + + +

CSVOutput

+

CSVOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
field_delimiterstring

The value used to separate individual fields in a record. You can specify an +arbitrary delimiter.

quote_characterstring

A single character used for escaping when the field delimiter is part of the +value. For example, if the value is a, b, Amazon S3 wraps this field value in +quotation marks, as follows: " a , b ".

quote_escape_characterstring

The single character used for escaping the quote character inside an already +escaped value.

quote_fieldsstring

Indicates whether to use quotation marks around output fields. + +* ALWAYS: Always +use quotation marks for output fields. + +* ASNEEDED: Use quotation marks for +output fields when needed.

record_delimiterstring

A single character used to separate individual records in the output. Instead of +the default value, you can specify an arbitrary delimiter.

+ + + + + +

CompleteMultipartUploadInput

+

CompleteMultipartUploadInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

upload_idstring

ID for the initiated multipart upload. +This member is required.

request_payerstring

Confirms that the requester knows that they will be charged for the request.

expected_bucket_ownerstring

Expected bucket owner

multipart_uploadCompletedMultipartUpload

The container for the multipart upload request information.

+ + + + + +

CompleteMultipartUploadOutput

+

CompleteMultipartUploadOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

bucket_key_enabledbool

Indicates whether the multipart upload uses an S3 Bucket Key for server-side +encryption with Amazon Web Services KMS (SSE-KMS).

etagstring

Entity tag that identifies the newly created object's data

expirationstring

If the object expiration is configured, this will contain the expiration date +(expiry-date) and rule ID (rule-id). The value of rule-id is URL-encoded.

locationstring

The URI that identifies the newly created object.

request_chargedstring

If present, indicates that the requester was successfully charged for the +request.

sse_kms_keyIdstring

If present, specifies the ID of the Amazon Web Services Key Management Service +(Amazon Web Services KMS) symmetric customer managed key that was used for the +object.

server_side_encryptionstring

The server-side encryption algorithm used when storing this object in Amazon S3 +(for example, AES256, aws:kms).

version_idstring

Version ID of the newly created object, in case the bucket has versioning turned +on.

+ + + + + +

CompletedMultipartUpload

+

CompletedMultipartUpload

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
partsCompletedPartrepeated

Array of CompletedPart data types.

+ + + + + +

CompletedPart

+

CompletedPart

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
etagstring

Entity tag returned when the part was uploaded.

part_numberint32

Part number that identifies the part. This is a positive integer between 1 and +10,000.

+ + + + + +

CopyObjectInput

+

CopyObjectInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The name of the destination bucket. When using this action with an access point +This member is required.

keystring

The key of the destination object. +This member is required.

copy_sourceCopySource

CopySource

taggingCopyObjectInput.TaggingEntryrepeated

The tag-set for the object destination object this value must be used in +conjunction with the TaggingDirective. The tag-set must be encoded as URL Query +parameters.

expiresint64

The date and time at which the object is no longer cacheable.

metadata_directivestring

Specifies whether the metadata is copied from the source object or replaced with metadata provided in the request.

metadataCopyObjectInput.MetadataEntryrepeated

A map of metadata to store with the object in S3.

+ + + + + +

CopyObjectInput.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

CopyObjectInput.TaggingEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

CopyObjectOutput

+

CopyObjectOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
copy_object_resultCopyObjectResult

Container for all response elements.

version_idstring

Version ID of the newly created copy.

expirationstring

If the object expiration is configured, the response includes this header.

+ + + + + +

CopyObjectResult

+

CopyObjectResult

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
etagstring

Returns the ETag of the new object. The ETag reflects only changes to the +contents of an object, not its metadata.

last_modifiedint64

Creation date of the object.

+ + + + + +

CopyPartResult

+

CopyPartResult

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
etagstring

Entity tag of the object.

last_modifiedint64

Last modified time

+ + + + + +

CopySource

+

CopySource

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
copy_source_bucketstring

source object bucket name

copy_source_keystring

source object name

copy_source_version_idstring

source object version

+ + + + + +

CreateMultipartUploadInput

+

CreateMultipartUploadInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

aclstring

The canned ACL to apply to the object. This action is not supported by Amazon S3 +on Outposts.

bucket_key_enabledbool

Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption +with server-side encryption using AWS KMS (SSE-KMS). Setting this header to true +causes Amazon S3 to use an S3 Bucket Key for object encryption with SSE-KMS. +Specifying this header with a PUT action doesn’t affect bucket-level settings +for S3 Bucket Key.

cache_controlstring

Specifies caching behavior along the request/reply chain

content_dispositionstring

Specifies presentational information for the object

content_encodingstring

Specifies what content encodings have been applied to the object and thus what +decoding mechanisms must be applied to obtain the media-type referenced by the +Content-Type header field.

content_languagestring

The language the content is in.

content_typestring

A standard MIME type describing the format of the object data.

expected_bucket_ownerstring

The account ID of the expected bucket owner. If the bucket is owned by a +different account, the request fails with the HTTP status code 403 Forbidden +(access denied).

expiresint64

The date and time at which the object is no longer cacheable.

grant_full_controlstring

Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object. This +action is not supported by Amazon S3 on Outposts.

grant_readstring

Allows grantee to read the object data and its metadata. This action is not +supported by Amazon S3 on Outposts.

grant_read_acpstring

Allows grantee to read the object ACL. This action is not supported by Amazon S3 +on Outposts.

grant_write_acpstring

Allows grantee to write the ACL for the applicable object. This action is not +supported by Amazon S3 on Outposts.

meta_dataCreateMultipartUploadInput.MetaDataEntryrepeated

A map of metadata to store with the object

object_lock_legal_hold_statusstring

Specifies whether you want to apply a legal hold to the uploaded object

object_lock_modestring

Specifies the Object Lock mode that you want to apply to the uploaded object

object_lock_retain_until_dateint64

Specifies the date and time when you want the Object Lock to expire

request_payerstring

Confirms that the requester knows that they will be charged for the request

sse_customer_algorithmstring

Specifies the algorithm to use to when encrypting the object (for example, +AES256).

sse_customer_keystring

Specifies the customer-provided encryption key to use in encrypting data

sse_customer_key_md5string

Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321

sse_kms_encryption_contextstring

Specifies the Amazon Web Services KMS Encryption Context to use for object encryption

sse_kms_key_idstring

Specifies the ID of the symmetric customer managed key to use for object encryption

server_side_encryptionstring

The server-side encryption algorithm used when storing this object

storage_classstring

By default, oss store uses the STANDARD Storage Class to store newly created objects

taggingCreateMultipartUploadInput.TaggingEntryrepeated

The tag-set for the object. The tag-set must be encoded as URL Query parameters.

website_redirect_locationstring

If the bucket is configured as a website, redirects requests for this object to +another object in the same bucket or to an external URL.

+ + + + + +

CreateMultipartUploadInput.MetaDataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

CreateMultipartUploadInput.TaggingEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

CreateMultipartUploadOutput

+

CreateMultipartUploadOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

abort_dateint64

If the bucket has a lifecycle rule configured with an action to abort incomplete +multipart uploads and the prefix in the lifecycle rule matches the object name +in the request, the response includes this header

abort_rule_idstring

It identifies the applicable lifecycle configuration rule that defines the action to abort +incomplete multipart uploads.

bucket_key_enabledbool

Indicates whether the multipart upload uses an S3 Bucket Key for server-side +encryption with Amazon Web Services KMS (SSE-KMS).

request_chargedstring

If present, indicates that the requester was successfully charged for the +request.

sse_customer_algorithmstring

If server-side encryption with a customer-provided encryption key was requested, +the response will include this header confirming the encryption algorithm used.

sse_customer_key_md5string

If server-side encryption with a customer-provided encryption key was requested, +the response will include this header to provide round-trip message integrity +verification of the customer-provided encryption key.

sse_kms_encryption_contextstring

If present, specifies the Amazon Web Services KMS Encryption Context to use for +object encryption. The value of this header is a base64-encoded UTF-8 string +holding JSON with the encryption context key-value pairs.

sse_kms_key_idstring

If present, specifies the ID of the Amazon Web Services Key Management Service +(Amazon Web Services KMS) symmetric customer managed key that was used for the +object.

server_side_encryptionstring

The server-side encryption algorithm used when storing this object in Amazon S3 +(for example, AES256, aws:kms).

upload_idstring

ID for the initiated multipart upload.

+ + + + + +

Delete

+

Delete

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
objectsObjectIdentifierrepeated

ObjectIdentifier

quietbool

Element to enable quiet mode for the request. When you add this element, you +must set its value to true.

+ + + + + +

DeleteMarkerEntry

+

DeleteMarkerEntry

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
is_latestbool

Specifies whether the object is (true) or is not (false) the latest version of +an object.

keystring

Name of the object key. +This member is required.

last_modifiedint64

Date and time the object was last modified.

ownerOwner

Owner

version_idstring

Version ID of an object.

+ + + + + +

DeleteObjectInput

+

DeleteObjectInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name to which the DEL action was initiated +This member is required.

keystring

Object key for which the DEL action was initiated. +This member is required.

request_payerstring

Confirms that the requester knows that they will be charged for the request.

version_idstring

VersionId used to reference a specific version of the object.

+ + + + + +

DeleteObjectOutput

+

DeleteObjectOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
delete_markerbool

Specifies whether the versioned object that was permanently deleted was (true) +or was not (false) a delete marker.

request_chargedstring

If present, indicates that the requester was successfully charged for the +request.

version_idstring

Returns the version ID of the delete marker created as a result of the DELETE +operation.

+ + + + + +

DeleteObjectTaggingInput

+

DeleteObjectTaggingInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the objects from which to remove the tags.

keystring

The key that identifies the object in the bucket from which to remove all tags. +This member is required.

version_idstring

The versionId of the object that the tag-set will be removed from.

expected_bucket_ownerstring

The account ID of the expected bucket owner. If the bucket is owned by a +different account, the request fails with the HTTP status code 403 Forbidden +(access denied).

+ + + + + +

DeleteObjectTaggingOutput

+

DeleteObjectTaggingOutput

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
version_idstring

The versionId of the object the tag-set was removed from.

result_metadataDeleteObjectTaggingOutput.ResultMetadataEntryrepeated

Metadata pertaining to the operation's result.

+ + + + + +

DeleteObjectTaggingOutput.ResultMetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

DeleteObjectsInput

+

DeleteObjectsInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

deleteDelete

Delete objects

request_payerstring

Confirms that the requester knows that they will be charged for the request.

+ + + + + +

DeleteObjectsOutput

+

DeleteObjectsOutput

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
deletedDeletedObjectrepeated

DeletedObject

+ + + + + +

DeletedObject

+

DeletedObject

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
delete_markerbool

Specifies whether the versioned object that was permanently deleted was (true) +or was not (false) a delete marker. In a simple DELETE, this header indicates +whether (true) or not (false) a delete marker was created.

delete_marker_version_idstring

The version ID of the delete marker created as a result of the DELETE operation. +If you delete a specific object version, the value returned by this header is +the version ID of the object version deleted.

keystring

The name of the deleted object.

version_idstring

The version ID of the deleted object.

+ + + + + +

GetObjectCannedAclInput

+

GetObjectCannedAclInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

version_idstring

VersionId used to reference a specific version of the object

+ + + + + +

GetObjectCannedAclOutput

+

GetObjectCannedAclOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
canned_aclstring

Object CannedACL

ownerOwner

Owner

request_chargedstring

If present, indicates that the requester was successfully charged for the +request.

+ + + + + +

GetObjectInput

+

GetObjectInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

keystring

Key of the object to get +This member is required

expected_bucket_ownerstring

The account ID of the expected bucket owner

if_matchstring

Return the object only if its entity tag (ETag) is the same as the one specified

if_modified_sinceint64

Return the object only if it has been modified since the specified time

if_none_matchstring

Return the object only if its entity tag (ETag) is different from the one specified

if_unmodified_sinceint64

Return the object only if it has not been modified since the specified time

part_numberint64

Part number of the object being read. This is a positive integer between 1 and +10,000. Effectively performs a 'ranged' GET request for the part specified. +Useful for downloading just a part of an object.

startint64

Downloads the specified range bytes of an object +start is used to specify the location where the file starts

endint64

end is used to specify the location where the file end

request_payerstring

Confirms that the requester knows that they will be charged for the request.

response_cache_controlstring

Sets the Cache-Control header of the response.

response_content_dispositionstring

Sets the Content-Disposition header of the response

response_content_encodingstring

Sets the Content-Encoding header of the response

response_content_languagestring

Sets the Content-Language header of the response

response_content_typestring

Sets the Content-Type header of the response

response_expiresstring

Sets the Expires header of the response

sse_customer_algorithmstring

Specifies the algorithm to use to when decrypting the object (for example,AES256)

sse_customer_keystring

Specifies the customer-provided encryption key for Amazon S3 used to encrypt the +data. This value is used to decrypt the object when recovering it and must match +the one used when storing the data. The key must be appropriate for use with the +algorithm specified in the x-amz-server-side-encryption-customer-algorithm header

sse_customer_key_md5string

Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321 +Amazon S3 uses this header for a message integrity check to ensure that the +encryption key was transmitted without error.

version_idstring

VersionId used to reference a specific version of the object

accept_encodingstring

Specify Accept-Encoding, aws not supported now

signed_urlstring

Specify the signed url of object, user can get object with signed url without ak、sk

+ + + + + +

GetObjectOutput

+

GetObjectOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
bodybytes

Object data.

cache_controlstring

Specifies caching behavior along the request/reply chain.

content_dispositionstring

Specifies presentational information for the object.

content_encodingstring

Specifies what content encodings have been applied to the object and thus what +decoding mechanisms must be applied to obtain the media-type referenced by the +Content-Type header field.

content_languagestring

The language the content is in.

content_lengthint64

Size of the body in bytes.

content_rangestring

The portion of the object returned in the response.

content_typestring

A standard MIME type describing the format of the object data.

delete_markerbool

Specifies whether the object retrieved was (true) or was not (false) a Delete +Marker. If false, this response header does not appear in the response.

etagstring

An entity tag (ETag) is an opaque identifier assigned by a web server to a +specific version of a resource found at a URL.

expirationstring

If the object expiration is configured (see PUT Bucket lifecycle), the response +includes this header. It includes the expiry-date and rule-id key-value pairs +providing object expiration information. The value of the rule-id is +URL-encoded.

expiresstring

The date and time at which the object is no longer cacheable.

last_modifiedint64

Creation date of the object.

version_idstring

Version of the object.

tag_countint64

The number of tags, if any, on the object.

storage_classstring

Provides storage class information of the object. Amazon S3 returns this header +for all objects except for S3 Standard storage class objects.

parts_countint64

The count of parts this object has. This value is only returned if you specify +partNumber in your request and the object was uploaded as a multipart upload.

metadataGetObjectOutput.MetadataEntryrepeated

A map of metadata to store with the object in S3. +Map keys will be normalized to lower-case.

+ + + + + +

GetObjectOutput.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

GetObjectTaggingInput

+

GetObjectTaggingInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object for which to get the tagging information. +This member is required.

keystring

Object key for which to get the tagging information. +This member is required.

version_idstring

The versionId of the object for which to get the tagging information.

expected_bucket_ownerstring

The account ID of the expected bucket owner. If the bucket is owned by a +different account, the request fails with the HTTP status code 403 Forbidden +(access denied).

request_payerstring

Confirms that the requester knows that they will be charged for the request.

+ + + + + +

GetObjectTaggingOutput

+

GetObjectTaggingOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
tagsGetObjectTaggingOutput.TagsEntryrepeated

Contains the tag set. +This member is required.

version_idstring

The versionId of the object for which you got the tagging information.

result_metadataGetObjectTaggingOutput.ResultMetadataEntryrepeated

Metadata pertaining to the operation's result.

+ + + + + +

GetObjectTaggingOutput.ResultMetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

GetObjectTaggingOutput.TagsEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

GlacierJobParameters

+

GlacierJobParameters

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
tierstring

Retrieval tier at which the restore will be processed. +This member is required.

+ + + + + +

HeadObjectInput

+

HeadObjectInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

checksum_modestring

To retrieve the checksum, this parameter must be enabled

expected_bucket_ownerstring

The account ID of the expected bucket owner

if_matchstring

Return the object only if its entity tag (ETag) is the same as the one +specified; otherwise, return a 412 (precondition failed) error.

if_modified_sinceint64

Return the object only if it has been modified since the specified time; +otherwise, return a 304 (not modified) error.

if_none_matchstring

Return the object only if its entity tag (ETag) is different from the one +specified

if_unmodified_sinceint64

Return the object only if it has not been modified since the specified time;

part_numberint32

Part number of the object being read. This is a positive integer between 1 and +10,000. Effectively performs a 'ranged' HEAD request for the part specified. +Useful querying about the size of the part and the number of parts in this +object.

request_payerstring

Confirms that the requester knows that they will be charged for the request.

sse_customer_algorithmstring

Specifies the algorithm to use to when encrypting the object (for example, +AES256).

sse_customer_keystring

Specifies the customer-provided encryption key for Amazon S3 to use in +encrypting data

sse_customer_key_md5string

Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321.

version_idstring

VersionId used to reference a specific version of the object.

with_detailsbool

Return object details meta

+ + + + + +

HeadObjectOutput

+

HeadObjectOutput

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
result_metadataHeadObjectOutput.ResultMetadataEntryrepeated

Metadata pertaining to the operation's result.

+ + + + + +

HeadObjectOutput.ResultMetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

Initiator

+

Initiator

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
display_namestring

Initiator name

idstring

Initiator id

+ + + + + +

InputSerialization

+

InputSerialization

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
csvCSVInput

Describes the serialization of a CSV-encoded object.

compression_typestring

Specifies object's compression format. Valid values: NONE, GZIP, BZIP2. Default +Value: NONE.

jsonstring

Specifies JSON as object's input serialization format.

+ + + + + +

IsObjectExistInput

+

IsObjectExistInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

version_idstring

Object version id

+ + + + + +

IsObjectExistOutput

+

IsObjectExistOutput

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
file_existbool

Object exist or not

+ + + + + +

ListMultipartUploadsInput

+

ListMultipartUploadsInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

delimiterstring

Character you use to group keys. All keys that contain the same string between +the prefix, if specified, and the first occurrence of the delimiter after the +prefix are grouped under a single result element, CommonPrefixes. If you don't +specify the prefix parameter, then the substring starts at the beginning of the +key. The keys that are grouped under CommonPrefixes result element are not +returned elsewhere in the response.

encoding_typestring

Requests Amazon S3 to encode the object keys in the response and specifies the +encoding method to use. An object key may contain any Unicode character;

expected_bucket_ownerstring

The account ID of the expected bucket owner

key_markerstring

Together with upload-id-marker, this parameter specifies the multipart upload +after which listing should begin. If upload-id-marker is not specified, only the +keys lexicographically greater than the specified key-marker will be included in +the list. If upload-id-marker is specified, any multipart uploads for a key +equal to the key-marker might also be included, provided those multipart uploads +have upload IDs lexicographically greater than the specified upload-id-marker.

max_uploadsint64

Sets the maximum number of multipart uploads, from 1 to 1,000, to return in the +response body. 1,000 is the maximum number of uploads that can be returned in a +response.

prefixstring

Lists in-progress uploads only for those keys that begin with the specified +prefix. You can use prefixes to separate a bucket into different grouping of +keys. (You can think of using prefix to make groups in the same way you'd use a +folder in a file system.)

upload_id_markerstring

Together with key-marker, specifies the multipart upload after which listing +should begin. If key-marker is not specified, the upload-id-marker parameter is +ignored. Otherwise, any multipart uploads for a key equal to the key-marker +might be included in the list only if they have an upload ID lexicographically +greater than the specified upload-id-marker.

+ + + + + +

ListMultipartUploadsOutput

+

ListMultipartUploadsOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
bucketstring

The bucket name containing the object +This member is required

common_prefixesstringrepeated

If you specify a delimiter in the request, then the result returns each distinct +key prefix containing the delimiter in a CommonPrefixes element.

delimiterstring

Contains the delimiter you specified in the request. If you don't specify a +delimiter in your request, this element is absent from the response.

encoding_typestring

Encoding type used by Amazon S3 to encode object keys in the response.

is_truncatedbool

Indicates whether the returned list of multipart uploads is truncated. A value +of true indicates that the list was truncated. The list can be truncated if the +number of multipart uploads exceeds the limit allowed or specified by max +uploads.

key_markerstring

The key at or after which the listing began.

max_uploadsint32

Maximum number of multipart uploads that could have been included in the +response.

next_key_markerstring

When a list is truncated, this element specifies the value that should be used +for the key-marker request parameter in a subsequent request.

next_upload_id_markerstring

When a list is truncated, this element specifies the value that should be used +for the upload-id-marker request parameter in a subsequent request.

prefixstring

When a prefix is provided in the request, this field contains the specified +prefix. The result contains only keys starting with the specified prefix.

upload_id_markerstring

Upload ID after which listing began.

uploadsMultipartUploadrepeated

Container for elements related to a particular multipart upload. A response can +contain zero or more Upload elements.

+ + + + + +

ListObjectVersionsInput

+

ListObjectVersionsInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

delimiterstring

A delimiter is a character that you specify to group keys. All keys that contain +the same string between the prefix and the first occurrence of the delimiter are +grouped under a single result element in CommonPrefixes. These groups are +counted as one result against the max-keys limitation. These keys are not +returned elsewhere in the response.

encoding_typestring

Requests Amazon S3 to encode the object keys in the response and specifies the +encoding method to use. An object key may contain any Unicode character;

expected_bucket_ownerstring

The account ID of the expected bucket owner

key_markerstring

Specifies the key to start with when listing objects in a bucket.

max_keysint64

Sets the maximum number of keys returned in the response. By default the action +returns up to 1,000 key names. The response might contain fewer keys but will +never contain more. If additional keys satisfy the search criteria, but were not +returned because max-keys was exceeded, the response contains true. To return +the additional keys, see key-marker and version-id-marker.

prefixstring

Use this parameter to select only those keys that begin with the specified +prefix. You can use prefixes to separate a bucket into different groupings of +keys. (You can think of using prefix to make groups in the same way you'd use a +folder in a file system.) You can use prefix with delimiter to roll up numerous +objects into a single result under CommonPrefixes.

version_id_markerstring

Specifies the object version you want to start listing from.

+ + + + + +

ListObjectVersionsOutput

+

ListObjectVersionsOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
common_prefixesstringrepeated

All of the keys rolled up into a common prefix count as a single return when +calculating the number of returns.

delete_markersDeleteMarkerEntryrepeated

Container for an object that is a delete marker.

delimiterstring

The delimiter grouping the included keys.

encoding_typestring

Encoding type used by Amazon S3 to encode object key names in the XML response.

is_truncatedbool

A flag that indicates whether Amazon S3 returned all of the results that +satisfied the search criteria

key_markerstring

Marks the last key returned in a truncated response.

max_keysint64

Specifies the maximum number of objects to return

namestring

The bucket name.

next_key_markerstring

When the number of responses exceeds the value of MaxKeys, NextKeyMarker +specifies the first key not returned that satisfies the search criteria

next_version_id_markerstring

When the number of responses exceeds the value of MaxKeys, NextVersionIdMarker +specifies the first object version not returned that satisfies the search +criteria.

prefixstring

Selects objects that start with the value supplied by this parameter.

version_id_markerstring

Marks the last version of the key returned in a truncated response.

versionsObjectVersionrepeated

Container for version information.

+ + + + + +

ListObjectsInput

+

ListObjectsInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

delimiterstring

A delimiter is a character you use to group keys.

encoding_typestring

Requests Amazon S3 to encode the object keys in the response and specifies the +encoding method to use. An object key may contain any Unicode character; +however, XML 1.0 parser cannot parse some characters, such as characters with an +ASCII value from 0 to 10. For characters that are not supported in XML 1.0, you +can add this parameter to request that Amazon S3 encode the keys in the +response.

expected_bucket_ownerstring

The account ID of the expected bucket owner. If the bucket is owned by a +different account, the request fails with the HTTP status code 403 Forbidden +(access denied).

markerstring

Marker is where you want Amazon S3 to start listing from. Amazon S3 starts +listing after this specified key. Marker can be any key in the bucket.

maxKeysint32

Sets the maximum number of keys returned in the response. By default the action +returns up to 1,000 key names. The response might contain fewer keys but will +never contain more.

prefixstring

Limits the response to keys that begin with the specified prefix.

request_payerstring

Confirms that the requester knows that they will be charged for the request.

+ + + + + +

ListObjectsOutput

+

ListObjectsOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
common_prefixesstringrepeated

CommonPrefixes

contentsObjectrepeated

Objects contents

delimiterstring

Causes keys that contain the same string between the prefix and the first +occurrence of the delimiter to be rolled up into a single result element in the +CommonPrefixes collection. These rolled-up keys are not returned elsewhere in +the response. Each rolled-up result counts as only one return against the +MaxKeys value.

encoding_typestring

Encoding type used by Amazon S3 to encode object keys in the response.

is_truncatedbool

A flag that indicates whether Amazon S3 returned all of the results that +satisfied the search criteria.

markerstring

Indicates where in the bucket listing begins. Marker is included in the response +if it was sent with the request.

max_keysint32

The maximum number of keys returned in the response body.

namestring

The bucket name.

next_markerstring

When response is truncated (the IsTruncated element value in the response is +true), you can use the key name in this field as marker in the subsequent +request to get next set of objects.

prefixstring

Keys that begin with the indicated prefix.

+ + + + + +

ListPartsInput

+

ListPartsInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

expected_bucket_ownerstring

The account ID of the expected bucket owner

max_partsint64

Sets the maximum number of parts to return

part_number_markerint64

Specifies the part after which listing should begin. Only parts with higher part +numbers will be listed.

request_payerstring

Confirms that the requester knows that they will be charged for the request.

upload_idstring

Upload ID identifying the multipart upload whose parts are being listed.

+ + + + + +

ListPartsOutput

+

ListPartsOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

upload_idstring

Upload ID identifying the multipart upload whose parts are being listed.

next_part_number_markerstring

When a list is truncated, this element specifies the last part in the list, as +well as the value to use for the part-number-marker request parameter in a +subsequent request.

max_partsint64

Maximum number of parts that were allowed in the response.

is_truncatedbool

Indicates whether the returned list of parts is truncated. A true value +indicates that the list was truncated. A list can be truncated if the number of +parts exceeds the limit returned in the MaxParts element.

partsPartrepeated

Container for elements related to a particular part. A response can contain zero +or more Part elements.

+ + + + + +

MultipartUpload

+

MultipartUpload

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
initiatedint64

Date and time at which the multipart upload was initiated.

initiatorInitiator

Identifies who initiated the multipart upload.

keystring

Name of the object key. +This member is required.

ownerOwner

Specifies the owner of the object that is part of the multipart upload.

storage_classstring

The class of storage used to store the object.

upload_idstring

Upload ID that identifies the multipart upload.

+ + + + + +

Object

+

Object

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
etagstring

The entity tag is a hash of the object

keystring

The name that you assign to an object. You use the object key to retrieve the +object.

last_modifiedint64

Creation date of the object.

ownerOwner

The owner of the object

sizeint64

Size in bytes of the object

storage_classstring

The class of storage used to store the object.

+ + + + + +

ObjectIdentifier

+

ObjectIdentifier

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

Key name of the object. +This member is required.

version_idstring

VersionId for the specific version of the object to delete.

+ + + + + +

ObjectVersion

+

ObjectVersion

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
etagstring

The entity tag is an MD5 hash of that version of the object.

is_latestbool

Specifies whether the object is (true) or is not (false) the latest version of +an object.

keystring

Name of the object key. +This member is required.

last_modifiedint64

Date and time the object was last modified.

ownerOwner

Specifies the owner of the object.

sizeint64

Size in bytes of the object.

storage_classstring

The class of storage used to store the object.

version_idstring

Version ID of an object.

+ + + + + +

OutputLocation

+

OutPutLocation

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
bucket_namestring

The name of the bucket where the restore results will be placed. +This member is required.

prefixstring

The prefix that is prepended to the restore results for this request. +This member is required.

+ + + + + +

OutputSerialization

+

OutputSerialization

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
csvCSVOutput

Describes the serialization of CSV-encoded Select results.

jsonstring

Specifies JSON as request's output serialization format.

+ + + + + +

Owner

+

Owner

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
display_namestring

Owner display name

idstring

Owner id

+ + + + + +

Part

+

Part

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
etagstring

Part Etag

last_modifiedint64

Last modified time

part_numberint64

Part number

sizeint64

Part size

+ + + + + +

PutObjectCannedAclInput

+

PutObjectCannedAclInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

aclstring

The canned ACL to apply to the object

version_idstring

VersionId used to reference a specific version of the object.

+ + + + + +

PutObjectCannedAclOutput

+

PutObjectCannedAclOutput

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
request_chargedstring

Request charged

+ + + + + +

PutObjectInput

+

PutObjectInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bodybytes

Object data.

bucketstring

The bucket name to which the PUT action was initiated +This member is required.

keystring

Object key for which the PUT action was initiated. +This member is required.

aclstring

The canned ACL to apply to the object,different oss provider have different acl type

bucket_key_enabledbool

Indicates whether the multipart upload uses an S3 Bucket Key for server-side +encryption with Amazon Web Services KMS (SSE-KMS).

cache_controlstring

Can be used to specify caching behavior along the request/reply chain.

content_dispositionstring

Specifies presentational information for the object. For more information, see +http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1 +(http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1).

content_encodingstring

Specifies what content encodings have been applied to the object and thus what +decoding mechanisms must be applied to obtain the media-type referenced by the +Content-Type header field. For more information, see +http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11 +(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11).

expiresint64

The date and time at which the object is no longer cacheable. For more +information, see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 +(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21).

server_side_encryptionstring

The server-side encryption algorithm used when storing this object in Amazon S3 +(for example, AES256, aws:kms).

signed_urlstring

Specify the signed url of object, user can put object with signed url without ak、sk

metaPutObjectInput.MetaEntryrepeated

A map of metadata to store with the object in S3.

taggingPutObjectInput.TaggingEntryrepeated

The tag-set for the object. The tag-set must be encoded as URL Query parameters.

storage_classstring

Storage class options.

content_lengthint64

Size of the body in bytes. This parameter is useful when the size of the body +cannot be determined automatically

+ + + + + +

PutObjectInput.MetaEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

PutObjectInput.TaggingEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

PutObjectOutput

+

PutObjectOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
bucket_key_enabledbool

Indicates whether the uploaded object uses an S3 Bucket Key for server-side +encryption with Amazon Web Services KMS (SSE-KMS).

etagstring

Entity tag for the uploaded object.

expirationstring

If the expiration is configured for the object

request_chargedstring

If present, indicates that the requester was successfully charged for the request.

version_idstring

Version of the object.

+ + + + + +

PutObjectTaggingInput

+

PutObjectTaggingInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required.

keystring

Name of the object key. +This member is required.

tagsPutObjectTaggingInput.TagsEntryrepeated

Container for the TagSet and Tag elements

version_idstring

The versionId of the object that the tag-set will be added to.

+ + + + + +

PutObjectTaggingInput.TagsEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

PutObjectTaggingOutput

+

PutObjectTaggingOutput

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
version_idstring

The versionId of the object the tag-set was added to.

result_metadataPutObjectTaggingOutput.ResultMetadataEntryrepeated

Metadata pertaining to the operation's result.

+ + + + + +

PutObjectTaggingOutput.ResultMetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

RestoreObjectInput

+

RestoreObjectInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

restore_requestRestoreRequest

The information of restoring request.

version_idstring

VersionId used to reference a specific version of the object.

+ + + + + +

RestoreObjectOutput

+

RestoreObjectOutput

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
request_chargedstring

If present, indicates that the requester was successfully charged for the +request.

restore_output_pathstring

Indicates the path in the provided S3 output location where Select results will +be restored to.

+ + + + + +

RestoreRequest

+

RestoreRequest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
daysint32

Lifetime of the active copy in days.

descriptionstring

The optional description for the job.

glacier_job_parametersGlacierJobParameters

S3 Glacier related parameters pertaining to this job.

output_locationOutputLocation

Describes the location where the restore job's output is stored.

select_parametersSelectParameters

Describes the parameters for Select job types.

tierstring

Retrieval tier at which the restore will be processed.

typestring

Type of restore request.

+ + + + + +

SelectParameters

+

SelectParameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
expressionstring

The expression that is used to query the object. +This member is required.

expression_typestring

The type of the provided expression (for example, SQL). +This member is required.

input_serializationInputSerialization

Describes the serialization format of the object. +This member is required.

output_serializationOutputSerialization

Describes how the results of the Select job are serialized. +This member is required.

+ + + + + +

SignURLInput

+

SignURLInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

methodstring

the method for sign url, eg. GET、POST

expired_in_secint64

expire time of the sign url

+ + + + + +

SignURLOutput

+

SignURLOutput

+ + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
signed_urlstring

Object signed url

+ + + + + +

UpdateBandwidthRateLimitInput

+

UpdateBandwidthRateLimitInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

average_rate_limit_in_bits_per_secint64

The average upload/download bandwidth rate limit in bits per second.

gateway_resource_namestring

Resource name of gateway

+ + + + + +

UploadPartCopyInput

+

UploadPartCopyInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

copy_sourceCopySource

CopySource

part_numberint32

Part number of part being copied. This is a positive integer between 1 and 10,000. +This member is required.

upload_idstring

Upload ID identifying the multipart upload whose part is being copied. +This member is required.

start_positionint64

The range of bytes to copy from the source object.bytes=start_position-part_size

part_sizeint64

Part size

+ + + + + +

UploadPartCopyOutput

+

UploadPartCopyOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
bucket_key_enabledbool

Indicates whether the multipart upload uses an S3 Bucket Key for server-side +encryption with Amazon Web Services KMS (SSE-KMS).

copy_part_resultCopyPartResult

Container for all response elements.

copy_source_version_idstring

The version of the source object that was copied, if you have enabled versioning +on the source bucket.

request_chargedstring

If present, indicates that the requester was successfully charged for the +request.

sse_customer_algorithmstring

If server-side encryption with a customer-provided encryption key was requested, +the response will include this header confirming the encryption algorithm used.

sse_customer_key_md5string

If server-side encryption with a customer-provided encryption key was requested, +the response will include this header to provide round-trip message integrity +verification of the customer-provided encryption key.

sse_kms_key_idstring

If present, specifies the ID of the Amazon Web Services Key Management Service +(Amazon Web Services KMS) symmetric customer managed key that was used for the +object.

server_side_encryptionstring

The server-side encryption algorithm used when storing this object in Amazon S3 +(for example, AES256, aws:kms).

+ + + + + +

UploadPartInput

+

UploadPartInput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
store_namestring

Required. The name of oss store.

bucketstring

The bucket name containing the object +This member is required

keystring

Name of the object key. +This member is required.

bodybytes

Object data.

content_lengthint64

Size of the body in bytes. This parameter is useful when the size of the body +cannot be determined automatically.

content_md5string

The base64-encoded 128-bit MD5 digest of the part data.

expected_bucket_ownerstring

The account ID of the expected bucket owner

part_numberint32

Part number of part being uploaded. This is a positive integer between 1 and 10,000. +This member is required.

request_payerstring

Confirms that the requester knows that they will be charged for the request.

sse_customer_algorithmstring

Specifies the algorithm to use to when encrypting the object (for example, +AES256).

sse_customer_keystring

Specifies the customer-provided encryption key for Amazon S3 to use in +encrypting data

sse_customer_key_md5string

Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321.

upload_idstring

Upload ID identifying the multipart upload whose part is being uploaded. +This member is required.

+ + + + + +

UploadPartOutput

+

UploadPartOutput

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
bucket_key_enabledbool

Indicates whether the multipart upload uses an S3 Bucket Key for server-side +encryption with Amazon Web Services KMS (SSE-KMS).

etagstring

Entity tag for the uploaded object.

request_chargedstring

If present, indicates that the requester was successfully charged for the +request.

sse_customer_algorithmstring

Specifies the algorithm to use to when encrypting the object (for example, +AES256).

sse_customer_key_md5string

Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321.

sse_kms_key_idstring

Specifies the ID of the symmetric customer managed key to use for object encryption

server_side_encryptionstring

The server-side encryption algorithm used when storing this object in Amazon S3 +(for example, AES256, aws:kms).

+ + + + + + + + + + + + + + diff --git a/docs/api/v1/sms.html b/docs/api/v1/sms.html new file mode 100644 index 0000000000..3febbee758 --- /dev/null +++ b/docs/api/v1/sms.html @@ -0,0 +1,518 @@ + + + + + Protocol Documentation + + + + + + + + + + +

Protocol Documentation

+ +

Table of Contents

+ +
+ +
+ + + +
+

sms.proto

Top +
+

+ + +

[gRPC Service] SmsService

+

SmsService is used to send SMS messages.

+ + + + + + + + + + + + + + +
Method NameRequest TypeResponse TypeDescription
SendSmsWithTemplateSendSmsWithTemplateRequestSendSmsWithTemplateResponse

Send the SMS message.

+ + + + +

SendSmsWithTemplateRequest

+

SendSmsRequest is the request of the `SendSms` method.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
component_namestring

Required. The saas service name + If your system uses multiple SMS services at the same time, + you can specify which service to use with this field.

phone_numbersstringrepeated

Required. The SMS receive phone numbers.

templateTemplate

Required.

sign_namestring

The registered sign name

sender_idstring

The SMS sender tag.

metadataSendSmsWithTemplateRequest.MetadataEntryrepeated

The metadata which will be sent to SMS components.

+ + + + + +

SendSmsWithTemplateRequest.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

SendSmsWithTemplateResponse

+

SendSmsResponse is the response of the `SendSms` method.

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
request_idstring

The unique requestId.

resultsSendStatusrepeated

The status set of SMS

+ + + + + +

SendStatus

+

Status contains more information about the response

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
codestring

"OK" represents success.

messagestring

The error message.

metadataSendStatus.MetadataEntryrepeated

The send status metadata returned from SMS service. +Includes `PhoneNumber`. +`PhoneNumber`, is the phone number SMS send to. Supported by tencentcloud.

+ + + + + +

SendStatus.MetadataEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + +

Template

+

Sms template

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
template_idstring

Required

template_paramsTemplate.TemplateParamsEntryrepeated

Required

+ + + + + +

Template.TemplateParamsEntry

+

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldTypeLabelDescription
keystring

valuestring

+ + + + + + + + + + + + + + diff --git a/docs/babel.config.js b/docs/babel.config.js deleted file mode 100644 index e00595dae7..0000000000 --- a/docs/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: [require.resolve('@docusaurus/core/lib/babel/preset')], -}; diff --git a/docs/blog/authors.yml b/docs/blog/authors.yml deleted file mode 100644 index bcb2991563..0000000000 --- a/docs/blog/authors.yml +++ /dev/null @@ -1,17 +0,0 @@ -endi: - name: Endilie Yacop Sucipto - title: Maintainer of Docusaurus - url: https://github.com/endiliey - image_url: https://github.com/endiliey.png - -yangshun: - name: Yangshun Tay - title: Front End Engineer @ Facebook - url: https://github.com/yangshun - image_url: https://github.com/yangshun.png - -slorber: - name: Sébastien Lorber - title: Docusaurus maintainer - url: https://sebastienlorber.com - image_url: https://github.com/slorber.png diff --git a/docs/blog/options.json b/docs/blog/options.json deleted file mode 100644 index abff828e29..0000000000 --- a/docs/blog/options.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "title": { - "message": "Blog", - "description": "The title for the blog used in SEO" - }, - "description": { - "message": "Blog", - "description": "The description for the blog used in SEO" - }, - "sidebar.title": { - "message": "All posts", - "description": "The label for the left sidebar" - } -} diff --git a/docs/blog/tags.yml b/docs/blog/tags.yml deleted file mode 100644 index f71dd73931..0000000000 --- a/docs/blog/tags.yml +++ /dev/null @@ -1,16 +0,0 @@ -facebook: - label: Facebook - permalink: /facebook - description: Facebook tag description -hello: - label: Hello - permalink: /hello - description: Hello tag description -docusaurus: - label: Docusaurus - permalink: /docusaurus - description: Docusaurus tag description -hola: - label: Hola - permalink: /hola - description: Hola tag description diff --git a/docs/components b/docs/components new file mode 100644 index 0000000000..4be35e39d6 --- /dev/null +++ b/docs/components @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/css/font.css b/docs/css/font.css new file mode 100644 index 0000000000..5f1e5f3725 --- /dev/null +++ b/docs/css/font.css @@ -0,0 +1,56 @@ + +/* roboto-mono-regular */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: regular; + src: url('//lib.baomitu.com/fonts/roboto-mono/roboto-mono-regular.eot'); /* IE9 Compat Modes */ + src: local('Roboto Mono'), local('RobotoMono-Normal'), + url('//lib.baomitu.com/fonts/roboto-mono/roboto-mono-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('//lib.baomitu.com/fonts/roboto-mono/roboto-mono-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('//lib.baomitu.com/fonts/roboto-mono/roboto-mono-regular.woff') format('woff'), /* Modern Browsers */ + url('//lib.baomitu.com/fonts/roboto-mono/roboto-mono-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('//lib.baomitu.com/fonts/roboto-mono/roboto-mono-regular.svg#RobotoMono') format('svg'); /* Legacy iOS */ +} + +/* source-sans-pro-300 */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-300.eot'); /* IE9 Compat Modes */ + src: local('Source Sans Pro'), local('SourceSans Pro-Normal'), + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-300.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-300.woff2') format('woff2'), /* Super Modern Browsers */ + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-300.woff') format('woff'), /* Modern Browsers */ + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-300.ttf') format('truetype'), /* Safari, Android, iOS */ + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-300.svg#SourceSans Pro') format('svg'); /* Legacy iOS */ +} + +/* source-sans-pro-regular */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: regular; + src: url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-regular.eot'); /* IE9 Compat Modes */ + src: local('Source Sans Pro'), local('SourceSans Pro-Normal'), + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-regular.woff') format('woff'), /* Modern Browsers */ + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-regular.svg#SourceSans Pro') format('svg'); /* Legacy iOS */ +} + +/* source-sans-pro-600 */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-600.eot'); /* IE9 Compat Modes */ + src: local('Source Sans Pro'), local('SourceSans Pro-Normal'), + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-600.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-600.woff2') format('woff2'), /* Super Modern Browsers */ + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-600.woff') format('woff'), /* Modern Browsers */ + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-600.ttf') format('truetype'), /* Safari, Android, iOS */ + url('//lib.baomitu.com/fonts/source-sans-pro/source-sans-pro-600.svg#SourceSans Pro') format('svg'); /* Legacy iOS */ +} diff --git a/docs/css/vue.css b/docs/css/vue.css new file mode 100644 index 0000000000..dadc16ada1 --- /dev/null +++ b/docs/css/vue.css @@ -0,0 +1 @@ +@import url("font.css");*{-webkit-font-smoothing:antialiased;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-webkit-touch-callout:none;box-sizing:border-box}body:not(.ready){overflow:hidden}body:not(.ready) .app-nav,body:not(.ready)>nav,body:not(.ready) [data-cloak]{display:none}div#app{font-size:30px;font-weight:lighter;margin:40vh auto;text-align:center}div#app:empty:before{content:"Loading..."}.emoji{height:1.2rem;vertical-align:middle}.progress{background-color:var(--theme-color,#42b983);height:2px;left:0;position:fixed;right:0;top:0;transition:width .2s,opacity .4s;width:0;z-index:999999}.search a:hover{color:var(--theme-color,#42b983)}.search .search-keyword{color:var(--theme-color,#42b983);font-style:normal;font-weight:700}body,html{height:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#34495e;font-family:Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:15px;letter-spacing:0;margin:0;overflow-x:hidden}img{max-width:100%}a[disabled]{cursor:not-allowed;opacity:.6}kbd{border:1px solid #ccc;border-radius:3px;display:inline-block;font-size:12px!important;line-height:12px;margin-bottom:3px;padding:3px 5px;vertical-align:middle}li input[type=checkbox]{margin:0 .2em .25em 0;vertical-align:middle}.app-nav{margin:25px 60px 0 0;position:absolute;right:0;text-align:right;z-index:10}.app-nav.no-badge{margin-right:25px}.app-nav p{margin:0}.app-nav>a{margin:0 1rem;padding:5px 0}.app-nav li,.app-nav ul{display:inline-block;list-style:none;margin:0}.app-nav a{color:inherit;font-size:16px;text-decoration:none;transition:color .3s}.app-nav a:hover{color:var(--theme-color,#42b983)}.app-nav a.active{border-bottom:2px solid var(--theme-color,#42b983);color:var(--theme-color,#42b983)}.app-nav li{display:inline-block;margin:0 1rem;padding:5px 0;position:relative;cursor:pointer}.app-nav li ul{background-color:#fff;border:1px solid;border-color:#ddd #ddd #ccc;border-radius:4px;box-sizing:border-box;display:none;max-height:calc(100vh - 61px);overflow-y:auto;padding:10px 0;position:absolute;right:-15px;text-align:left;top:100%;white-space:nowrap}.app-nav li ul li{display:block;font-size:14px;line-height:1rem;margin:8px 14px;white-space:nowrap}.app-nav li ul a{display:block;font-size:inherit;margin:0;padding:0}.app-nav li ul a.active{border-bottom:0}.app-nav li:hover ul{display:block}.github-corner{border-bottom:0;position:fixed;right:0;text-decoration:none;top:0;z-index:1}.github-corner:hover .octo-arm{-webkit-animation:octocat-wave .56s ease-in-out;animation:octocat-wave .56s ease-in-out}.github-corner svg{color:#fff;fill:var(--theme-color,#42b983);height:80px;width:80px}main{display:block;position:relative;width:100vw;height:100%;z-index:0}main.hidden{display:none}.anchor{display:inline-block;text-decoration:none;transition:all .3s}.anchor span{color:#34495e}.anchor:hover{text-decoration:underline}.sidebar{border-right:1px solid rgba(0,0,0,.07);overflow-y:auto;padding:40px 0 0;position:absolute;top:0;bottom:0;left:0;transition:transform .25s ease-out;width:300px;z-index:20}.sidebar>h1{margin:0 auto 1rem;font-size:1.5rem;font-weight:300;text-align:center}.sidebar>h1 a{color:inherit;text-decoration:none}.sidebar>h1 .app-nav{display:block;position:static}.sidebar .sidebar-nav{line-height:2em;padding-bottom:40px}.sidebar li.collapse .app-sub-sidebar{display:none}.sidebar ul{margin:0 0 0 15px;padding:0}.sidebar li>p{font-weight:700;margin:0}.sidebar ul,.sidebar ul li{list-style:none}.sidebar ul li a{border-bottom:none;display:block}.sidebar ul li ul{padding-left:20px}.sidebar::-webkit-scrollbar{width:4px}.sidebar::-webkit-scrollbar-thumb{background:transparent;border-radius:4px}.sidebar:hover::-webkit-scrollbar-thumb{background:hsla(0,0%,53.3%,.4)}.sidebar:hover::-webkit-scrollbar-track{background:hsla(0,0%,53.3%,.1)}.sidebar-toggle{background-color:transparent;background-color:hsla(0,0%,100%,.8);border:0;outline:none;padding:10px;position:absolute;bottom:0;left:0;text-align:center;transition:opacity .3s;width:284px;z-index:30;cursor:pointer}.sidebar-toggle:hover .sidebar-toggle-button{opacity:.4}.sidebar-toggle span{background-color:var(--theme-color,#42b983);display:block;margin-bottom:4px;width:16px;height:2px}body.sticky .sidebar,body.sticky .sidebar-toggle{position:fixed}.content{padding-top:60px;position:absolute;top:0;right:0;bottom:0;left:300px;transition:left .25s ease}.markdown-section{margin:0 auto;max-width:80%;padding:30px 15px 40px;position:relative}.markdown-section>*{box-sizing:border-box;font-size:inherit}.markdown-section>:first-child{margin-top:0!important}.markdown-section hr{border:none;border-bottom:1px solid #eee;margin:2em 0}.markdown-section iframe{border:1px solid #eee;width:1px;min-width:100%}.markdown-section table{border-collapse:collapse;border-spacing:0;display:block;margin-bottom:1rem;overflow:auto;width:100%}.markdown-section th{font-weight:700}.markdown-section td,.markdown-section th{border:1px solid #ddd;padding:6px 13px}.markdown-section tr{border-top:1px solid #ccc}.markdown-section tr:nth-child(2n){background-color:#f8f8f8}.markdown-section p.tip{background-color:#f8f8f8;border-bottom-right-radius:2px;border-left:4px solid #f66;border-top-right-radius:2px;margin:2em 0;padding:12px 24px 12px 30px;position:relative}.markdown-section p.tip:before{background-color:#f66;border-radius:100%;color:#fff;content:"!";font-family:Dosis,Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:14px;font-weight:700;left:-12px;line-height:20px;position:absolute;height:20px;width:20px;text-align:center;top:14px}.markdown-section p.tip code{background-color:#efefef}.markdown-section p.tip em{color:#34495e}.markdown-section p.warn{background:rgba(66,185,131,.1);border-radius:2px;padding:1rem}.markdown-section ul.task-list>li{list-style-type:none}body.close .sidebar{transform:translateX(-300px)}body.close .sidebar-toggle{width:auto}body.close .content{left:0}@media print{.app-nav,.github-corner,.sidebar,.sidebar-toggle{display:none}}@media screen and (max-width:768px){.github-corner,.sidebar,.sidebar-toggle{position:fixed}.app-nav{margin-top:16px}.app-nav li ul{top:30px}main{height:auto;min-height:100vh;overflow-x:hidden}.sidebar{left:-300px;transition:transform .25s ease-out}.content{left:0;max-width:100vw;position:static;padding-top:20px;transition:transform .25s ease}.app-nav,.github-corner{transition:transform .25s ease-out}.sidebar-toggle{background-color:transparent;width:auto;padding:30px 30px 10px 10px}body.close .sidebar{transform:translateX(300px)}body.close .sidebar-toggle{background-color:hsla(0,0%,100%,.8);transition:background-color 1s;width:284px;padding:10px}body.close .content{transform:translateX(300px)}body.close .app-nav,body.close .github-corner{display:none}.github-corner:hover .octo-arm{-webkit-animation:none;animation:none}.github-corner .octo-arm{-webkit-animation:octocat-wave .56s ease-in-out;animation:octocat-wave .56s ease-in-out}}@-webkit-keyframes octocat-wave{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@keyframes octocat-wave{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}section.cover{align-items:center;background-position:50%;background-repeat:no-repeat;background-size:cover;height:100vh;width:100vw;display:none}section.cover.show{display:flex}section.cover.has-mask .mask{background-color:#fff;opacity:.8;position:absolute;top:0;height:100%;width:100%}section.cover .cover-main{flex:1;margin:-20px 16px 0;text-align:center;position:relative}section.cover a{color:inherit;text-decoration:none}section.cover a:hover{text-decoration:none}section.cover p{line-height:1.5rem;margin:1em 0}section.cover h1{color:inherit;font-size:2.5rem;font-weight:300;margin:.625rem 0 2.5rem;position:relative;text-align:center}section.cover h1 a{display:block}section.cover h1 small{bottom:-.4375rem;font-size:1rem;position:absolute}section.cover blockquote{font-size:1.5rem;text-align:center}section.cover ul{line-height:1.8;list-style-type:none;margin:1em auto;max-width:500px;padding:0}section.cover .cover-main>p:last-child a{border-radius:2rem;border:1px solid var(--theme-color,#42b983);box-sizing:border-box;color:var(--theme-color,#42b983);display:inline-block;font-size:1.05rem;letter-spacing:.1rem;margin:.5rem 1rem;padding:.75em 2rem;text-decoration:none;transition:all .15s ease}section.cover .cover-main>p:last-child a:last-child{background-color:var(--theme-color,#42b983);color:#fff}section.cover .cover-main>p:last-child a:last-child:hover{color:inherit;opacity:.8}section.cover .cover-main>p:last-child a:hover{color:inherit}section.cover blockquote>p>a{border-bottom:2px solid var(--theme-color,#42b983);transition:color .3s}section.cover blockquote>p>a:hover{color:var(--theme-color,#42b983)}.sidebar,body{background-color:#fff}.sidebar{color:#364149}.sidebar li{margin:6px 0}.sidebar ul li a{color:#505d6b;font-size:14px;font-weight:400;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.sidebar ul li a:hover{text-decoration:underline}.sidebar ul li ul{padding:0}.sidebar ul li.active>a{border-right:2px solid;color:var(--theme-color,#42b983);font-weight:600}.app-sub-sidebar li:before{content:"-";padding-right:4px;float:left}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section strong{color:#2c3e50;font-weight:600}.markdown-section a{color:var(--theme-color,#42b983);font-weight:600}.markdown-section h1{font-size:2rem;margin:0 0 1rem}.markdown-section h2{font-size:1.75rem;margin:45px 0 .8rem}.markdown-section h3{font-size:1.5rem;margin:40px 0 .6rem}.markdown-section h4{font-size:1.25rem}.markdown-section h5{font-size:1rem}.markdown-section h6{color:#777;font-size:1rem}.markdown-section figure,.markdown-section p{margin:1.2em 0}.markdown-section ol,.markdown-section p,.markdown-section ul{line-height:1.6rem;word-spacing:.05rem}.markdown-section ol,.markdown-section ul{padding-left:1.5rem}.markdown-section blockquote{border-left:4px solid var(--theme-color,#42b983);color:#858585;margin:2em 0;padding-left:20px}.markdown-section blockquote p{font-weight:600;margin-left:0}.markdown-section iframe{margin:1em 0}.markdown-section em{color:#7f8c8d}.markdown-section code,.markdown-section output:after,.markdown-section pre{font-family:Roboto Mono,Monaco,courier,monospace}.markdown-section code,.markdown-section pre{background-color:#f8f8f8}.markdown-section output,.markdown-section pre{margin:1.2em 0;position:relative}.markdown-section output,.markdown-section pre>code{border-radius:2px;display:block}.markdown-section output:after,.markdown-section pre>code{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial}.markdown-section code{border-radius:2px;color:#e96900;margin:0 2px;padding:3px 5px;white-space:pre-wrap}.markdown-section>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) code{font-size:.8rem}.markdown-section pre{padding:0 1.4rem;line-height:1.5rem;overflow:auto;word-wrap:normal}.markdown-section pre>code{color:#525252;font-size:.8rem;padding:2.2em 5px;line-height:inherit;margin:0 2px;max-width:inherit;overflow:inherit;white-space:inherit}.markdown-section output{padding:1.7rem 1.4rem;border:1px dotted #ccc}.markdown-section output>:first-child{margin-top:0}.markdown-section output>:last-child{margin-bottom:0}.markdown-section code:after,.markdown-section code:before,.markdown-section output:after,.markdown-section output:before{letter-spacing:.05rem}.markdown-section output:after,.markdown-section pre:after{color:#ccc;font-size:.6rem;font-weight:600;height:15px;line-height:15px;padding:5px 10px 0;position:absolute;right:0;text-align:right;top:0}.markdown-section output:after,.markdown-section pre:after{content:attr(data-lang)}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8e908c}.token.namespace{opacity:.7}.token.boolean,.token.number{color:#c76b29}.token.punctuation{color:#525252}.token.property{color:#c08b30}.token.tag{color:#2973b7}.token.string{color:var(--theme-color,#42b983)}.token.selector{color:#6679cc}.token.attr-name{color:#2973b7}.language-css .token.string,.style .token.string,.token.entity,.token.url{color:#22a2c9}.token.attr-value,.token.control,.token.directive,.token.unit{color:var(--theme-color,#42b983)}.token.function,.token.keyword{color:#e96900}.token.atrule,.token.regex,.token.statement{color:#22a2c9}.token.placeholder,.token.variable{color:#3d8fd1}.token.deleted{text-decoration:line-through}.token.inserted{border-bottom:1px dotted #202746;text-decoration:none}.token.italic{font-style:italic}.token.bold,.token.important{font-weight:700}.token.important{color:#c94922}.token.entity{cursor:help}code .token{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;min-height:1.5rem;position:relative;left:auto} \ No newline at end of file diff --git a/docs/demo b/docs/demo new file mode 100644 index 0000000000..4be35e39d6 --- /dev/null +++ b/docs/demo @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/docs/README.md b/docs/docs/README.md deleted file mode 100644 index 27bb6da7f0..0000000000 --- a/docs/docs/README.md +++ /dev/null @@ -1,184 +0,0 @@ -# Layotto (L8): To be the next layer of OSI layer 7 - - -[//]: # ([![Layotto Env Pipeline 🌊](https://github.com/mosn/layotto/actions/workflows/quickstart-checker.yml/badge.svg)](https://github.com/mosn/layotto/actions/workflows/quickstart-checker.yml)) -[![Layotto Env Pipeline 🌊](https://github.com/mosn/layotto/actions/workflows/proto-checker.yml/badge.svg)](https://github.com/mosn/layotto/actions/workflows/proto-checker.yml) -[![Layotto Dev Pipeline 🌊](https://github.com/mosn/layotto/actions/workflows/layotto-ci.yml/badge.svg)](https://github.com/mosn/layotto/actions/workflows/layotto-ci.yml) - -[![GoDoc](https://godoc.org/mosn.io/layotto?status.svg)](https://godoc.org/mosn.io/layotto) -[![Go Report Card](https://goreportcard.com/badge/github.com/mosn/layotto)](https://goreportcard.com/report/mosn.io/layotto) -[![codecov](https://codecov.io/gh/mosn/layotto/branch/main/graph/badge.svg?token=10RxwSV6Sz)](https://codecov.io/gh/mosn/layotto) -[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/mosn/layotto.svg)](http://isitmaintained.com/project/mosn/layotto "Average time to resolve an issue") - - - -Layotto(/leɪˈɒtəʊ/) 是一款使用 Golang 开发的应用运行时, 旨在帮助开发人员快速构建云原生应用,帮助应用和基础设施解耦。它为应用提供了各种分布式能力,比如状态管理,配置管理,事件发布订阅等能力,以简化应用的开发。 - -Layotto 以开源的 [MOSN](https://github.com/mosn/mosn) 为底座,在提供分布式能力以外,提供了 Service Mesh 对于流量的管控能力。 - -## 诞生背景 - -Layotto 希望可以把 [Multi-Runtime](https://www.infoq.com/articles/multi-runtime-microservice-architecture/) 跟 Service -Mesh 两者的能力结合起来,无论你是使用 MOSN 还是 Envoy 或者其他产品作为 Service Mesh 的数据面,都可以在不增加新的 sidecar 的前提下,使用 Layotto 为这些数据面追加 Runtime 的能力。 - -例如,通过为 MOSN 添加 Runtime 能力,一个 Layotto 进程可以[既作为 istio 的数据面](/docs/start/istio/start.md) 又提供各种 Runtime API(例如 Configuration API,Pub/Sub API 等) - -此外,随着探索实践,我们发现 sidecar 能做的事情远不止于此。 通过引入[WebAssembly](https://en.wikipedia.org/wiki/WebAssembly) ,我们正在尝试将 Layotto 做成 FaaS (Function as a service) 的运行时容器 。 - -如果您对诞生背景感兴趣,可以看下[这篇演讲](https://mosn.io/layotto/#/zh/blog/mosn-subproject-layotto-opening-a-new-chapter-in-service-grid-application-runtime/index) -。 - -## 功能 - -- 服务通信 -- 服务治理,例如流量的劫持和观测,服务限流等 -- [作为 istio 的数据面](/docs/start/istio/start.md) -- 配置管理 -- 状态管理 -- 事件发布订阅 -- 健康检查、查询运行时元数据 -- 基于 WASM 的多语言编程 - -## 工程架构 - -如下图架构图所示,Layotto 以开源 MOSN 作为底座,在提供了网络层管理能力的同时提供了分布式能力,业务可以通过轻量级的 SDK 直接与 Layotto 进行交互,而无需关注后端的具体的基础设施。 - -Layotto 提供了多种语言版本的 SDK,SDK 通过 gRPC 与 Layotto 进行交互。 - -如果您想把应用部署到不同的云平台(例如将阿里云上的应用部署到 AWS),您只需要在 Layotto 提供的 [配置文件](https://github.com/mosn/layotto/blob/main/configs/runtime_config.json) -里修改配置、指定自己想用的基础设施类型,不需要修改应用的代码就能让应用拥有"跨云部署"能力,大大提高了程序的可移植性。 - - - -## 快速开始 - -### Get started with Layotto - -您可以尝试以下 Quickstart demo,体验 Layotto 的功能;或者体验[线上实验室](/docs/start/lab.md) - -### API - -| API | status | quick start | desc | -| -------------- | :----: | :-------------------------------------------------------------------: | -------------------------------- | -| State | ✅ | [demo](https://mosn.io/layotto/#/zh/start/state/start) | 提供读写 KV 模型存储的数据的能力 | -| Pub/Sub | ✅ | [demo](https://mosn.io/layotto/#/zh/start/pubsub/start) | 提供消息的发布/订阅能力 | -| Service Invoke | ✅ | [demo](https://mosn.io/layotto/#/zh/start/rpc/helloworld) | 通过 MOSN 进行服务调用 | -| Config | ✅ | [demo](https://mosn.io/layotto/#/zh/start/configuration/start-apollo) | 提供配置增删改查及订阅的能力 | -| Lock | ✅ | [demo](https://mosn.io/layotto/#/zh/start/lock/start) | 提供 lock/unlock 分布式锁的实现 | -| Sequencer | ✅ | [demo](https://mosn.io/layotto/#/zh/start/sequencer/start) | 提供获取分布式自增 ID 的能力 | -| File | ✅ | [demo](https://mosn.io/layotto/#/zh/start/file/start) | 提供访问文件的能力 | -| Binding | ✅ | TODO | 提供透传数据的能力 | - -### Service Mesh - -| feature | status | quick start | desc | -| ------- | :----: | :----------------------------------------------------: | ----------------------------- | -| Istio | ✅ | [demo](https://mosn.io/layotto/#/zh/start/istio/) | 跟 Istio 集成,作为 Istio 的数据面 | - -### 可扩展性 - -| feature | status | quick start | desc | -| -------- | :----: | :--------------------------------------------------------------: | --------------------------- | -| API 插件 | ✅ | [demo](https://mosn.io/layotto/#/zh/start/api_plugin/helloworld) | 为 Layotto 添加您自己的 API | - -### 可观测性 - - -| feature | status | quick start | desc | -| ---------- | :----: | :---------------------------------------------------------: | ----------------------- | -| Skywalking | ✅ | [demo](https://mosn.io/layotto/#/zh/start/trace/skywalking) | Layotto 接入 Skywalking | - - -### Actuator - -| feature | status | quick start | desc | -| -------------- | :----: | :-------------------------------------------------------: | ------------------------------------- | -| Health Check | ✅ | [demo](https://mosn.io/layotto/#/zh/start/actuator/start) | 查询 Layotto 依赖的各种组件的健康状态 | -| Metadata Query | ✅ | [demo](https://mosn.io/layotto/#/zh/start/actuator/start) | 查询 Layotto 或应用对外暴露的元信息 | - -### 流量控制 - -| feature | status | quick start | desc | -| ------------ | :----: | :-------------------------------------------------------------------: | ------------------------------------------ | -| TCP Copy | ✅ | [demo](https://mosn.io/layotto/#/zh/start/network_filter/tcpcopy) | 把 Layotto 收到的 TCP 数据 dump 到本地文件 | -| Flow Control | ✅ | [demo](https://mosn.io/layotto/#/zh/start/stream_filter/flow_control) | 限制访问 Layotto 对外提供的 API | - -### 在 Sidecar 中用 WebAssembly (WASM) 写业务逻辑 - -| feature | status | quick start | desc | -| -------------- | :----: | :---------------------------------------------------: | ---------------------------------------------------------------- | -| Go (TinyGo) | ✅ | [demo](https://mosn.io/layotto/#/zh/start/wasm/start) | 把用 TinyGo 开发的代码编译成 \*.wasm 文件跑在 Layotto 上 | -| Rust | ✅ | [demo](https://mosn.io/layotto/#/zh/start/wasm/start) | 把用 Rust 开发的代码编译成 \*.wasm 文件跑在 Layotto 上 | -| AssemblyScript | ✅ | [demo](https://mosn.io/layotto/#/zh/start/wasm/start) | 把用 AssemblyScript 开发的代码编译成 \*.wasm 文件跑在 Layotto 上 | - -### 作为 Serverless 的运行时,通过 WebAssembly (WASM) 写 FaaS - -| feature | status | quick start | desc | -| -------------- | :----: | :---------------------------------------------------: | ----------------------------------------------------------------------------------------- | -| Go (TinyGo) | ✅ | [demo](https://mosn.io/layotto/#/zh/start/faas/start) | 把用 TinyGo 开发的代码编译成 \*.wasm 文件跑在 Layotto 上,并且使用 k8s 进行调度。 | -| Rust | ✅ | [demo](https://mosn.io/layotto/#/zh/start/faas/start) | 把用 Rust 开发的代码编译成 \*.wasm 文件跑在 Layotto 上,并且使用 k8s 进行调度。 | -| AssemblyScript | ✅ | [demo](https://mosn.io/layotto/#/zh/start/faas/start) | 把用 AssemblyScript 开发的代码编译成 \*.wasm 文件跑在 Layotto 上,并且使用 k8s 进行调度。 | - -## Landscapes - -

-   -

-Layotto enriches the CNCF CLOUD NATIVE Landscape. -

- -## 社区 - -| 平台 | 联系方式 | -| :------------------------------------------------- |:-----------------------------------------------------------------------------------------------------------------------------------------------| -| 💬 [钉钉](https://www.dingtalk.com/zh) (用户群) | 群号: 31912621 或者扫描下方二维码
| -| 💬 [钉钉](https://www.dingtalk.com/zh) (社区会议群) | 群号:41585216 [Layotto 在每周五晚 8 点进行社区会议,欢迎所有人](/docs/community/meeting.md) | - -[comment]: <> (| 💬 [微信](https://www.wechat.com/) | 扫描下方二维码添加好友,她会邀请您加入微信群
) - -## 如何贡献 - -[新手攻略:从零开始成为 Layotto 贡献者](/docs/development/start-from-zero.md) - -[从哪下手?看看"新手任务"列表](https://github.com/mosn/layotto/issues/108#issuecomment-872779356) - -作为技术同学,你是否有过“想参与某个开源项目的开发、但是不知道从何下手”的感觉? -为了帮助大家更好的参与开源项目,社区会定期发布适合新手的新手开发任务,帮助大家 learning by doing! - -[文档贡献指南](/docs/development/contributing-doc.md) - -[组件开发指南](/docs/development/developing-component.md) - -[Layotto Github Workflow 指南](/docs/development/github-workflows.md) - -[Layotto 命令行指南](/docs/development/commands.md) - -[Layotto 贡献者指南](/docs/development/CONTRIBUTING.md) - -## 贡献者 - -感谢所有的贡献者! - - - - - -## 设计文档 - -[Actuator 设计文档](/docs/design/actuator/actuator-design-doc.md) - -[Pubsub API 与 Dapr Component 的兼容性](/docs/design/pubsub/pubsub-api-and-compability-with-dapr-component.md) - -[Configuration API with Apollo](/docs/design/configuration/configuration-api-with-apollo.md) - -[RPC 设计文档](/docs/design/rpc/rpc_design_document.md) - -[分布式锁 API 设计文档](/docs/design/lock/lock-api-design.md) - -[FaaS 设计文档](/docs/design/faas/faas-poc-design.md) - -## FAQ - -### 跟 dapr 有什么差异? - -dapr 是一款优秀的 Runtime 产品,但它本身缺失了 Service Mesh 的能力,而这部分能力对于实际在生产环境落地是至关重要的,因此我们希望把 Runtime 跟 Service Mesh 两种能力结合在一起,满足更复杂的生产落地需求。 diff --git a/docs/docs/start/istio/README.md b/docs/docs/start/istio/README.md deleted file mode 100644 index 0b1889412b..0000000000 --- a/docs/docs/start/istio/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# 集成 Istio 1.10.6 演示 - -Layotto 最新版集成了 Istio 1.10.6, 可以通过 Istio(控制面) 对 Layotto(数据面)进行流量治理。 - -您可以在[线上实验室](/docs/start/lab.md)体验集成 Istio 1.10.6 - -更多说明见[《通过 Istio 部署 Layotto》](/docs/operation/?id=方案1-通过-istio-部署) \ No newline at end of file diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js deleted file mode 100644 index 9a6674f7d4..0000000000 --- a/docs/docusaurus.config.js +++ /dev/null @@ -1,126 +0,0 @@ - -import {themes as prismThemes} from 'prism-react-renderer'; - -/** @type {import('@docusaurus/types').Config} */ -const config = { - title: 'Layotto', - tagline: 'Layotto (L8): To be the next layer of OSI layer 7', - favicon: 'https://gw.alipayobjects.com/zos/bmw-prod/65518bfc-8ba5-4234-a5c5-2bc065e3a5f0.svg', - - url: 'https://mosn.io', - baseUrl: '/', - - organizationName: 'mosn', - projectName: 'layotto', - - onBrokenLinks: 'warn', - onBrokenMarkdownLinks: 'warn', - i18n: { - defaultLocale: 'zh-Hans', - locales: ['en-US','zh-Hans'], - localeConfigs: { - "en-US": { - label:"English" - } - } - }, - - presets: [ - [ - 'classic', - /** @type {import('@docusaurus/preset-classic').Options} */ - { - docs: { - sidebarPath: require.resolve('./sidebars.js'), - editUrl:({ docPath, locale }) => { - //把docPath 拆分,中间加上对应的路径。 - let newDocPath; - - if (locale !== 'en-US') { - const pathSegments = docPath.split('/'); - newDocPath = ['docs', ...pathSegments].join('/'); - return `https://github.com/mosn/layotto/edit/main/`+docPath; - }else{ - const pathSegments = docPath.split('/'); - newDocPath = ['i18n/en-US/docusaurus-plugin-content-docs/current', ...pathSegments].join('/'); - return `https://github.com/mosn/layotto/edit/main/`+docPath; - } - - }, - }, - blog: { - blogSidebarTitle: '全部博客', - blogSidebarCount: 'ALL', - showReadingTime: true, - - editUrl:({ locale,blogDirPath, blogPath }) => { - //把docPath 拆分,中间加上对应的路径。 - let newDocPath; - if (locale !== 'en-US') { - return `https://github.com/mosn/layotto/edit/main//${blogDirPath}/${blogPath}`; - }else{ - return `https://github.com/mosn/layotto/edit/main//${blogDirPath}/${blogPath}`; - } - - } - }, - theme: { - customCss: './src/css/custom.css', - }, - }, - ], - ], - - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - docs: { - sidebar: { - hideable: true, - autoCollapseCategories: true, - }, - }, - // Replace with your project's social card - image: 'img/docusaurus-social-card.jpg', - navbar: { - title: '', - logo: { - alt: 'Layotto Logo', - src: 'https://gw.alipayobjects.com/zos/bmw-prod/65518bfc-8ba5-4234-a5c5-2bc065e3a5f0.svg', - }, - items: [ - { - type: 'doc', - docId: 'README', - position: 'left', - label: '文档', - }, - { - type: 'localeDropdown', - position: 'right', - }, - {to: '/blog', label: '博客', position: 'left'}, - { - href: 'https://github.com/mosn/layotto', - label: 'GitHub', - position: 'right', - }, - ], - }, - - prism: { - theme: prismThemes.github, - darkTheme: prismThemes.dracula, - }, - algolia: { - appId: 'B0I4Q5CLN8', - apiKey: '79f410a7e620927c50c3ae6c8c9af5bb', - indexName: 'layotto', - contextualSearch: true, - }, - }), -}; - -export default config; - - diff --git a/docs/i18n/en-US/docusaurus-plugin-content-pages/index.md b/docs/en/README.md similarity index 85% rename from docs/i18n/en-US/docusaurus-plugin-content-pages/index.md rename to docs/en/README.md index c403519ef1..dc89f76925 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-pages/index.md +++ b/docs/en/README.md @@ -1,8 +1,8 @@ +
+

Layotto (L8): To be the next layer of OSI layer 7

+ -# Layotto (L8): To be the next layer of OSI layer 7 - - -[![Layotto Env Pipeline 🌊](https://github.com/mosn/layotto/actions/workflows/proto-checker.yml/badge.svg)](https://github.com/mosn/layotto/actions/workflows/proto-checker.yml) +[![Layotto Env Pipeline 🌊](https://github.com/mosn/layotto/actions/workflows/quickstart-checker.yml/badge.svg)](https://github.com/mosn/layotto/actions/workflows/quickstart-checker.yml) [![Layotto Dev Pipeline 🌊](https://github.com/mosn/layotto/actions/workflows/layotto-ci.yml/badge.svg)](https://github.com/mosn/layotto/actions/workflows/layotto-ci.yml) [![GoDoc](https://godoc.org/mosn.io/layotto?status.svg)](https://godoc.org/mosn.io/layotto) @@ -10,6 +10,7 @@ [![codecov](https://codecov.io/gh/mosn/layotto/branch/main/graph/badge.svg?token=10RxwSV6Sz)](https://codecov.io/gh/mosn/layotto) [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/mosn/layotto.svg)](http://isitmaintained.com/project/mosn/layotto "Average time to resolve an issue") +
Layotto(/leɪˈɒtəʊ/) is an application runtime developed using Golang, which provides various distributed capabilities for applications, such as state management, configuration management, and event pub/sub capabilities to simplify application development. @@ -19,7 +20,7 @@ Layotto is built on the open source data plane [MOSN](https://github.com/mosn/mo Layotto aims to combine [Multi-Runtime](https://www.infoq.com/articles/multi-runtime-microservice-architecture/) with Service Mesh into one sidecar. No matter which product you are using as the Service Mesh data plane (e.g. MOSN,Envoy or any other product), you can always attach Layotto to it and add Multi-Runtime capabilities without adding new sidecars. -For example, by adding Runtime capabilities to MOSN, a Layotto process can both [serve as the data plane of istio](/docs/start/istio/) and provide various Runtime APIs (such as Configuration API, Pub/Sub API, etc.) +For example, by adding Runtime capabilities to MOSN, a Layotto process can both [serve as the data plane of istio](en/start/istio/) and provide various Runtime APIs (such as Configuration API, Pub/Sub API, etc.) In addition, we were surprised to find that a sidecar can do much more than that. We are trying to make Layotto even the runtime container of FaaS (Function as a service) with the magic power of [WebAssembly](https://en.wikipedia.org/wiki/WebAssembly) . @@ -27,7 +28,7 @@ In addition, we were surprised to find that a sidecar can do much more than that - Service Communication - Service Governance.Such as traffic hijacking and observation, service rate limiting, etc -- [As the data plane of istio](/docs/tart/istio/) +- [As the data plane of istio](en/start/istio/) - Configuration management - State management - Event publish and subscribe @@ -46,7 +47,7 @@ Layotto provides sdk in various languages. The sdk interacts with Layotto throug ### Get started with Layotto -You can try the quickstart demos below to get started with Layotto. In addition, you can experience the [online laboratory](/docs/start/lab) +You can try the quickstart demos below to get started with Layotto. In addition, you can experience the [online laboratory](en/start/lab) ### API @@ -66,7 +67,7 @@ You can try the quickstart demos below to get started with Layotto. In addition, | feature | status | quick start | desc | | ------- | :----: | :----------------------------------------------------: | -------------------------- | -| istio | ✅ | [demo](/docs/start/istio/) | As the data plane of istio | +| istio | ✅ | [demo](en/start/istio/) | As the data plane of istio | ### Extendability @@ -121,9 +122,9 @@ Layotto enriches the CNCF CLOUD N ### Contact Us -| Platform | Link | -| :----------------------------------------------------- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 💬 [DingTalk](https://www.dingtalk.com/en) (preferred) | Search the group number: 31912621 or scan the QR code below | +| Platform | Link | +| :----------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 💬 [DingTalk](https://www.dingtalk.com/en) (preferred) | Search the group number: 31912621 or scan the QR code below
| [comment]: <> (| 💬 [Wechat](https://www.wechat.com/en/) | Scan the QR code below and she will invite you into the wechat group
) @@ -134,15 +135,15 @@ Layotto enriches the
CNCF CLOUD N As a programming enthusiast , have you ever felt that you want to participate in the development of an open source project, but don't know where to start? In order to help everyone better participate in open source projects, our community will regularly publish community tasks to help everyone learn by doing! -[Document Contribution Guide](/docs/development/contributing-doc) +[Document Contribution Guide](en/development/contributing-doc.md) -[Component Development Guide](/docs/development/developing-component) +[Component Development Guide](en/development/developing-component.md) -[Layotto Github Workflows](/docs/development/github-workflows) +[Layotto Github Workflows](en/development/github-workflows.md) -[Layotto Commands Guide](/docs/development/commands) +[Layotto Commands Guide](en/development/commands.md) -[Layotto contributor guide](/docs/development/CONTRIBUTING) +[Layotto contributor guide](en/development/CONTRIBUTING.md) ## Contributors @@ -154,17 +155,17 @@ Thank y'all! ## Design Documents -[Actuator Design Doc](/docs/design/actuator/actuator-design-doc) +[Actuator Design Doc](en/design/actuator/actuator-design-doc.md) -[Configuration API with Apollo](/docs/design/configuration/configuration-api-with-apollo) +[Configuration API with Apollo](en/design/configuration/configuration-api-with-apollo.md) -[Pubsub API and Compability with Dapr Component](/docs/design/pubsub/pubsub-api-and-compability-with-dapr-component) +[Pubsub API and Compability with Dapr Component](en/design/pubsub/pubsub-api-and-compability-with-dapr-component.md) -[RPC Design Doc](/docs/design/rpc/rpc_design_document) +[RPC Design Doc](en/design/rpc/rpc-design-doc.md) -[Distributed Lock API Design](/docs/design/lock/lock-api-design) +[Distributed Lock API Design](en/design/lock/lock-api-design.md) -[FaaS Design](/docs/design/faas/faas-poc-design) +[FaaS Design](en/design/faas/faas-poc-design.md) ## FAQ diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/README.md b/docs/en/api_reference/README.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/README.md rename to docs/en/api_reference/README.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/appcallback_v1.md b/docs/en/api_reference/appcallback_v1.md similarity index 99% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/appcallback_v1.md rename to docs/en/api_reference/appcallback_v1.md index f072783564..54894d7c90 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/appcallback_v1.md +++ b/docs/en/api_reference/appcallback_v1.md @@ -1,4 +1,7 @@ + + + # appcallback.proto diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/comment_spec_of_proto.md b/docs/en/api_reference/comment_spec_of_proto.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/comment_spec_of_proto.md rename to docs/en/api_reference/comment_spec_of_proto.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/how_to_generate_api_doc.md b/docs/en/api_reference/how_to_generate_api_doc.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/how_to_generate_api_doc.md rename to docs/en/api_reference/how_to_generate_api_doc.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/oss_v1.md b/docs/en/api_reference/oss_v1.md similarity index 99% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/oss_v1.md rename to docs/en/api_reference/oss_v1.md index 5e4ae4206c..98da1ebce9 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/oss_v1.md +++ b/docs/en/api_reference/oss_v1.md @@ -1,4 +1,7 @@ + + + # oss.proto diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/runtime_v1.md b/docs/en/api_reference/runtime_v1.md similarity index 99% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/runtime_v1.md rename to docs/en/api_reference/runtime_v1.md index e481cac24b..787e1605e3 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/api_reference/runtime_v1.md +++ b/docs/en/api_reference/runtime_v1.md @@ -1,4 +1,7 @@ + + + # runtime.proto diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/actuator/actuator.md b/docs/en/building_blocks/actuator/actuator.md similarity index 89% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/actuator/actuator.md rename to docs/en/building_blocks/actuator/actuator.md index 719e8fab81..3ebb8f2918 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/actuator/actuator.md +++ b/docs/en/building_blocks/actuator/actuator.md @@ -49,7 +49,7 @@ var ( ) ``` -Note: By default, the API will only return the health status of Layotto. If you want the API to also return the health status of the App, you need to develop a plugin that calls back the App. You can refer to [Actuator's design document](design/actuator/actuator-design-doc.md), or contact us directly to provide you with a detailed explanation. +Note: By default, the API will only return the health status of Layotto. If you want the API to also return the health status of the App, you need to develop a plugin that calls back the App. You can refer to [Actuator's design document](en/design/actuator/actuator-design-doc.md), or contact us directly to provide you with a detailed explanation. ### /actuator/health/readiness Used to check the health status of Layotto and app. The health status can be used to determine "Do we need to temporarily cut off the traffic and make sure no user visit this machine" @@ -75,7 +75,7 @@ GET,no parameters. } ``` -Note: By default, the API will only return the health status of Layotto. If you want the API to also return the health status of the App, you need to develop a plugin that calls back the App. You can refer to [Actuator's design document](design/actuator/actuator-design-doc.md), or contact us directly to provide you with a detailed explanation. +Note: By default, the API will only return the health status of Layotto. If you want the API to also return the health status of the App, you need to develop a plugin that calls back the App. You can refer to [Actuator's design document](en/design/actuator/actuator-design-doc.md), or contact us directly to provide you with a detailed explanation. ## 2. Query runtime metadata API @@ -107,7 +107,7 @@ We can add more information in the future: Actuator adopts a plug-in architecture, you can also add your own plug-ins as needed, and let the API return the runtime metadata you care about. -Note: By default, the API will only return Layotto's runtime metadata. If you want the API to also return the App's runtime metadata, you need to develop a plugin that calls back the App. You can refer to [Actuator's design document](design/actuator/actuator-design-doc.md), or contact us directly to provide you with a detailed explanation. +Note: By default, the API will only return Layotto's runtime metadata. If you want the API to also return the App's runtime metadata, you need to develop a plugin that calls back the App. You can refer to [Actuator's design document](en/design/actuator/actuator-design-doc.md), or contact us directly to provide you with a detailed explanation. ## 3. Explanation for API path @@ -139,4 +139,4 @@ The paths registered by default are: ``` ## 4. API usage example -See [Quick start document](start/actuator/start.md) \ No newline at end of file +See [Quick start document](en/start/actuator/start.md) \ No newline at end of file diff --git a/docs/docs/building_blocks/configuration/reference.md b/docs/en/building_blocks/configuration/reference.md similarity index 100% rename from docs/docs/building_blocks/configuration/reference.md rename to docs/en/building_blocks/configuration/reference.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/file/file.md b/docs/en/building_blocks/file/file.md similarity index 98% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/file/file.md rename to docs/en/building_blocks/file/file.md index ec14296c73..6bc4f676dd 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/file/file.md +++ b/docs/en/building_blocks/file/file.md @@ -7,7 +7,7 @@ File api is used to implement file operations. Applications can perform CRUD ope ## How to use File API You can call the File API through grpc. The API is defined in [runtime.proto](https://github.com/mosn/layotto/blob/main/spec/proto/runtime/v1/runtime.proto). -The component needs to be configured before use. Different components should have own configuration.For OSS detail configuration items, see [OSS Component Document](component_specs/file/oss.md) +The component needs to be configured before use. Different components should have own configuration.For OSS detail configuration items, see [OSS Component Document](en/component_specs/file/oss.md) ### Example diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/lock/reference.md b/docs/en/building_blocks/lock/reference.md similarity index 96% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/lock/reference.md rename to docs/en/building_blocks/lock/reference.md index eb33755df8..39b14a6301 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/lock/reference.md +++ b/docs/en/building_blocks/lock/reference.md @@ -5,10 +5,10 @@ The distributed lock API is based on a certain storage system (such as Etcd, Zoo ## How to use distributed lock API You can call the distributed lock API through grpc. The API is defined in [runtime.proto](https://github.com/mosn/layotto/blob/main/spec/proto/runtime/v1/runtime.proto). -The component needs to be configured before use. For detailed configuration instructions, see [Distributed Lock Component Document](component_specs/lock/common.md) +The component needs to be configured before use. For detailed configuration instructions, see [Distributed Lock Component Document](en/component_specs/lock/common.md) ### Example -Layotto client sdk encapsulates the logic of grpc calling. For an example of using sdk to call distributed lock API, please refer to [Quick Start: Using Distributed Lock API](start/lock/start.md) +Layotto client sdk encapsulates the logic of grpc calling. For an example of using sdk to call distributed lock API, please refer to [Quick Start: Using Distributed Lock API](en/start/lock/start.md) ### TryLock @@ -76,4 +76,4 @@ req.LockOwner = uuid.New().String() To avoid inconsistencies between the documentation and the code, please refer to [proto file](https://github.com/mosn/layotto/blob/main/spec/proto/runtime/v1/runtime.proto) for detailed input parameters and return values ## Why is the distributed lock API designed like this -If you are interested in the implementation principle and design logic, you can refer to [Distributed Lock API Design Document](design/lock/lock-api-design) +If you are interested in the implementation principle and design logic, you can refer to [Distributed Lock API Design Document](en/design/lock/lock-api-design) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/pubsub/reference.md b/docs/en/building_blocks/pubsub/reference.md similarity index 97% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/pubsub/reference.md rename to docs/en/building_blocks/pubsub/reference.md index 3845bc2802..f37b18ccd5 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/pubsub/reference.md +++ b/docs/en/building_blocks/pubsub/reference.md @@ -19,10 +19,10 @@ Using Pub/Sub API can help you avoid the trouble of maintaining multilingual SDK ## How to use Pub/Sub API You can call Pub/Sub API through grpc. The API is defined in [runtime.proto](https://github.com/mosn/layotto/blob/main/spec/proto/runtime/v1/runtime.proto). -The component needs to be configured before use. For detailed configuration instructions, see [publish/subscribe component documentation](component_specs/pubsub/common.md) +The component needs to be configured before use. For detailed configuration instructions, see [publish/subscribe component documentation](zh/component_specs/pubsub/common.md) ### Example -Layotto client sdk encapsulates the logic of grpc call. For examples of using sdk to call Pub/Sub API, please refer to [Quick Start: Use Pub/Sub API](start/pubsub/start.md) +Layotto client sdk encapsulates the logic of grpc call. For examples of using sdk to call Pub/Sub API, please refer to [Quick Start: Use Pub/Sub API](en/start/pubsub/start.md) ### PublishEvent Used to publish events to the specified topic diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/rpc/reference.md b/docs/en/building_blocks/rpc/reference.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/rpc/reference.md rename to docs/en/building_blocks/rpc/reference.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/sequencer/reference.md b/docs/en/building_blocks/sequencer/reference.md similarity index 96% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/sequencer/reference.md rename to docs/en/building_blocks/sequencer/reference.md index ed61f35857..1a1d342022 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/sequencer/reference.md +++ b/docs/en/building_blocks/sequencer/reference.md @@ -38,9 +38,9 @@ When you want the generated id incremental without any regression, it is recomme ## How to use Sequencer API You can call the Sequencer API through grpc. The API is defined in [runtime.proto](https://github.com/mosn/layotto/blob/main/spec/proto/runtime/v1/runtime.proto). -Layotto client sdk encapsulates the logic of grpc calling. For an example of using sdk to call Sequencer API, please refer to [Quick Start: Use Sequencer API](start/sequencer/start.md) +Layotto client sdk encapsulates the logic of grpc calling. For an example of using sdk to call Sequencer API, please refer to [Quick Start: Use Sequencer API](en/start/sequencer/start.md) -The components need to be configured before use. For detailed configuration options, see [Sequencer component document](component_specs/sequencer/common.md) +The components need to be configured before use. For detailed configuration options, see [Sequencer component document](en/component_specs/sequencer/common.md) ### Get next unique id ```protobuf diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/state/reference.md b/docs/en/building_blocks/state/reference.md similarity index 98% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/state/reference.md rename to docs/en/building_blocks/state/reference.md index ce12fc8275..e92c9ac80c 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/state/reference.md +++ b/docs/en/building_blocks/state/reference.md @@ -20,10 +20,10 @@ Using State API can help you avoid the trouble of maintaining multilingual SDKs. ## How to use State API You can call the State API through grpc. The API is defined in [runtime.proto](https://github.com/mosn/layotto/blob/main/spec/proto/runtime/v1/runtime.proto). -The component needs to be configured before use. For detailed configuration items, see [State Component Document](component_specs/state/common.md) +The component needs to be configured before use. For detailed configuration items, see [State Component Document](en/component_specs/state/common.md) ### Example -Layotto client sdk encapsulates the logic of grpc call. For examples of using sdk to call State API, please refer to [Quick Start: Use State API](start/state/start.md) +Layotto client sdk encapsulates the logic of grpc call. For examples of using sdk to call State API, please refer to [Quick Start: Use State API](en/start/state/start.md) ### Save state diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/configuration/apollo.md b/docs/en/component_specs/configuration/apollo.md similarity index 96% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/configuration/apollo.md rename to docs/en/component_specs/configuration/apollo.md index bbe0556dc5..2e8b223476 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/configuration/apollo.md +++ b/docs/en/component_specs/configuration/apollo.md @@ -2,7 +2,7 @@ ## Configuration item description Example: configs/config_apollo.json -![img.png](/img/configuration/apollo/img.png) +![img.png](../../../img/configuration/apollo/img.png) | Field | Required | Description | | --- | --- | --- | diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/configuration/etcd.md b/docs/en/component_specs/configuration/etcd.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/configuration/etcd.md rename to docs/en/component_specs/configuration/etcd.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/configuration/nacos.md b/docs/en/component_specs/configuration/nacos.md similarity index 90% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/configuration/nacos.md rename to docs/en/component_specs/configuration/nacos.md index d280e210e3..9bf87427c4 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/configuration/nacos.md +++ b/docs/en/component_specs/configuration/nacos.md @@ -6,7 +6,7 @@ Example: configs/config_nacos.json | Field | Required | Description | |-----------------------|----------|---------------------------------------------------------------------------------------------------------------------------------------| -| address | Y | Nacos server address in `` format. By default, `/nacos` is used as the URL context, and `http` is used as the connection protocol. If the ACM connection field is not specified in the configuration file, this field is **required**. Multiple address addresses can be provided for connection. | +| address | Y | Nacos server address in format. By default, `/nacos` is used as the URL context, and `http` is used as the connection protocol. If the ACM connection field is not specified in the configuration file, this field is **required**. Multiple address addresses can be provided for connection. | | timeout | N | Timeout for connecting to the Nacos server, in seconds. Default is 10s. | | metadata.namespace_id | N | Nacos namespace for isolating configuration files at the namespace level. Default is empty, which represents using the "default" namespace in Nacos. | | metadata.username | N | Username for Nacos service authentication verification. | @@ -27,7 +27,7 @@ The `app_id` field needs to be configured, and it is a required field. It repres However, it is not added in the configuration of the Nacos ConfigStore component but in additional configuration items, making it convenient for other components that need to reuse `app_id`. -![img.png](/img/configuration/nacos/img.png) +![img.png](../../../img/configuration/nacos/img.png) ## How to Start Nacos diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/file/oss.md b/docs/en/component_specs/file/oss.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/file/oss.md rename to docs/en/component_specs/file/oss.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/file/qiniu_oss.md b/docs/en/component_specs/file/qiniu_oss.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/file/qiniu_oss.md rename to docs/en/component_specs/file/qiniu_oss.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/file/tencentcloud_oss.md b/docs/en/component_specs/file/tencentcloud_oss.md similarity index 95% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/file/tencentcloud_oss.md rename to docs/en/component_specs/file/tencentcloud_oss.md index 11f07b0d88..ed1988b9bc 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/file/tencentcloud_oss.md +++ b/docs/en/component_specs/file/tencentcloud_oss.md @@ -19,7 +19,7 @@ Example:configs/config_file_tencentcloud_oss.json visit https://console.cloud.tencent.com/cos/bucket to create bucket -![](/img/file/create_tencent_oss_bucket.png) +![](../../../img/file/create_tencent_oss_bucket.png) 3.Create AK and SK diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/common.md b/docs/en/component_specs/lock/common.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/common.md rename to docs/en/component_specs/lock/common.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/consul.md b/docs/en/component_specs/lock/consul.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/consul.md rename to docs/en/component_specs/lock/consul.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/etcd.md b/docs/en/component_specs/lock/etcd.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/etcd.md rename to docs/en/component_specs/lock/etcd.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/mongo.md b/docs/en/component_specs/lock/mongo.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/mongo.md rename to docs/en/component_specs/lock/mongo.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/redis.md b/docs/en/component_specs/lock/redis.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/redis.md rename to docs/en/component_specs/lock/redis.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/zookeeper.md b/docs/en/component_specs/lock/zookeeper.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/zookeeper.md rename to docs/en/component_specs/lock/zookeeper.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/overview.md b/docs/en/component_specs/overview.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/overview.md rename to docs/en/component_specs/overview.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/pubsub/common.md b/docs/en/component_specs/pubsub/common.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/pubsub/common.md rename to docs/en/component_specs/pubsub/common.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/pubsub/others.md b/docs/en/component_specs/pubsub/others.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/pubsub/others.md rename to docs/en/component_specs/pubsub/others.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/pubsub/redis.md b/docs/en/component_specs/pubsub/redis.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/pubsub/redis.md rename to docs/en/component_specs/pubsub/redis.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/secret/common.md b/docs/en/component_specs/secret/common.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/secret/common.md rename to docs/en/component_specs/secret/common.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/common.md b/docs/en/component_specs/sequencer/common.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/common.md rename to docs/en/component_specs/sequencer/common.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/etcd.md b/docs/en/component_specs/sequencer/etcd.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/etcd.md rename to docs/en/component_specs/sequencer/etcd.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/in-memory.md b/docs/en/component_specs/sequencer/in-memory.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/in-memory.md rename to docs/en/component_specs/sequencer/in-memory.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/mongo.md b/docs/en/component_specs/sequencer/mongo.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/mongo.md rename to docs/en/component_specs/sequencer/mongo.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/mysql.md b/docs/en/component_specs/sequencer/mysql.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/mysql.md rename to docs/en/component_specs/sequencer/mysql.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/redis.md b/docs/en/component_specs/sequencer/redis.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/redis.md rename to docs/en/component_specs/sequencer/redis.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/snowflake.md b/docs/en/component_specs/sequencer/snowflake.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/snowflake.md rename to docs/en/component_specs/sequencer/snowflake.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/zookeeper.md b/docs/en/component_specs/sequencer/zookeeper.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/sequencer/zookeeper.md rename to docs/en/component_specs/sequencer/zookeeper.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/state/common.md b/docs/en/component_specs/state/common.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/state/common.md rename to docs/en/component_specs/state/common.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/state/others.md b/docs/en/component_specs/state/others.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/state/others.md rename to docs/en/component_specs/state/others.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/state/redis.md b/docs/en/component_specs/state/redis.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/state/redis.md rename to docs/en/component_specs/state/redis.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/configuration/overview.md b/docs/en/configuration/overview.md similarity index 93% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/configuration/overview.md rename to docs/en/configuration/overview.md index 6d2a1ae8ef..a6211878ed 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/configuration/overview.md +++ b/docs/en/configuration/overview.md @@ -3,7 +3,7 @@ Example: configs/config_apollo.json Currently, Layotto uses a MOSN layer 4 filter to integrate with MOSN and run on MOSN, so the configuration file used by Layotto is actually a MOSN configuration file. -![img.png](/img/configuration/layotto/img.png) +![img.png](../../img/configuration/layotto/img.png) As shown in the example above, most of the configurations are MOSN configuration items, please refer to [MOSN configuration instructions](https://mosn.io/docs/configuration/); @@ -36,4 +36,4 @@ The configuration item in `grpc_config` is Layotto's component configuration, th } ``` -As for what to fill in each ``, what is each ``, and which `"": ""` configuration items can be configured with the components, you can refer to [Component specs](component_specs/overview) . +As for what to fill in each ``, what is each ``, and which `"": ""` configuration items can be configured with the components, you can refer to [Component specs](en/component_specs/overview) . diff --git a/docs/en/design/actuator/actuator-design-doc.md b/docs/en/design/actuator/actuator-design-doc.md new file mode 100644 index 0000000000..819a2e3f80 --- /dev/null +++ b/docs/en/design/actuator/actuator-design-doc.md @@ -0,0 +1,298 @@ +# Actuator's Design Document +# 1. Product Design +## 1.1. Requirements + +- Health check + +Users can check the health status of both Layotto internal components and the applications behind Layotto through the Actuator API, + +- Query runtime metadata + +Through the Actuator API, Layotto's own metadata information (such as version, git information) and metadata information of business applications can be obtained (such as the list of subscribed topics, such as application version information) + +- Support integration into open source infrastructure, including: + - Can be integrated into k8s health check + - Can be integrated into a monitoring system, such as Prometheus+Grafana + - If necessary, the service registry can remove nodes based on the health check results + - We can build dashboard projects or GUI tools based on this API in the future to troubleshoot problems. + +- Similar to the functions of Spring Boot Actuator, there will be more room for imagination in the future: Monitoring, Metrics, Auditing, and more. + +## 1.2. Explanation + +**Q: What is the value? People use the health check API for what?** + +1. For troubleshooting.Developers can access the Actuator API directly to query runtime metadata or reasons for unavailability, or using a dashboard page/GUI tool based on the API. + +2. For monitoring by the monitoring system; + +3. For automated operation provided by the infrastructure.For example,the deployment system can use the health check results to determine the deployment progress, whether should it continue or not; the service registry can remove abnormal nodes based on health checks;the k8s can kill and recreate containers based on health checks. + + +**Q: It seems that there is no need to return detailed information,since a status code is enough? Who will use the detailed runtime information?** + +1. We can build a dashboard page or GUI tool based on the detailed information in the future to troubleshoot problems; + +Similar to the spring boot community wrote a 'spring boot admin' web page based on the spring boot actuator + +2. With these information,we can integrate Layotto into monitoring system like Prometheus+Grafana + +Similar to Spring Boot Actuator being integrated with Prometheus+Grafana + +**Q: Should we add some admin API to control the ability, such as "turn off the ability of specific components inside Layotto"** + +A: Don't do it. Switching some components off will leave the app in a partial failure state, which can lead to uncertainty. +However, we can consider adding debug capabilities in the future, such as mock, packet capture and package modification, etc. + + +**Q: Does the health check API do permission control?** + +A: Don't do it for now, add a hook if we receive feedbacks in the future. + + +# 2. High-level design + +## 2.1. Overview + +Develop the http API first, because the health check function of the open source infrastructure basically supports http (such as k8s, prometheus), while grpc is not supported. + +In order to reuse filter capabilities such as the authentication filter of MOSN, Actuator runs on MOSN using a layer-7 filter as a glue layer. + +Specifically, add a new listener and a new stream_filter to MOSN. This filter is responsible for http request processing and calling Actuator. + +Endpoint is an abstract inside Actuator. After a new request arrives at the server, Actuator will entrust the corresponding Endpoint to process it. Endpoint supports on-demand expansion and injection into Actuator: + +![img.png](../../../img/actuator/abstract.png) + +## 2.2. Http API design + +### 2.2.1. Explanation for API path + +The path adopts restful style. After different Endpoints are registered in Actuator, the path is: + +``` +/actuator/{endpoint_name}/{params} +``` + +For example: + +``` +/actuator/health/liveness +``` + +The 'health' element in the path above identifies the Endpoint name is health, and 'liveness' is the parameter passed to the health Endpoint. + +Multiple parameters can be passed, such as /actuator/xxxendpoint/a/b/c/d, and the semantics of the parameters are determined by each Endpoint. + + +The paths registered by default are: + +``` +/actuator/health/liveness + +/actuator/health/readiness + +/actuator/info +``` + +### 2.2.2. Health Endpoint +#### /actuator/health/liveness +GET + +```json +// http://localhost:8080/actuator/health/liveness +// HTTP/1.1 200 OK + +{ + "status": "UP", + "components": { + "livenessProbe": { + "status": "UP", + "details":{ + + } + } + } +} +``` + +Return field description: + +HTTP status code 200 means success, other (status code above 400) means failure. + +There are three types of status fields: + +```go +var ( + // INIT means it is starting + INIT = Status("INIT") + // UP means it is healthy + UP = Status("UP") + // DOWN means it is unhealthy + DOWN = Status("DOWN") +) +``` + +#### /actuator/health/readiness +GET + +```json +// http://localhost:8080/actuator/health/readiness +// HTTP/1.1 503 SERVICE UNAVAILABLE + +{ + "status": "DOWN", + "components": { + "readinessProbe": { + "status": "DOWN" + } + } +} +``` + +### 2.2.3. Info Endpoint + +#### /actuator/info + +GET + +```json +// http://localhost:8080/actuator/health/liveness +// HTTP/1.1 200 OK + +{ + "app" : { + "version" : "1.0.0", + "name" : "Layotto" + } +} +``` + +**Q: What are the runtime metadata requirements?** + +Phase 1: + +- version number + +We can add more information in the future: + +- Callback app +- Runtime configuration parameters + + +**Q: Is it mandatory for components to implement the health check API?** + +Temporarily not mandatory + +## 2.3. Schema of config data + +![img.png](../../../img/actuator/actuator_config.png) + +A new listener is added for handling actuator requests. A new stream_filter called actuator_filter is added for http request processing(see below) + +## 2.4. Internal structure and request processing flow + +![img.png](../../../img/actuator/actuator_process.png) + +explanation: + +### 2.4.1. When requests arrive + +The request arrives at the mosn, enters Layotto through the stream filter, and calls the Actuator. + +The http protocol implementation class (struct) of the stream filter layer is DispatchFilter, which is responsible for dispatching requests and calling Actuator according to the http path: + +```go + +type DispatchFilter struct { + handler api.StreamReceiverFilterHandler +} + +func (dis *DispatchFilter) SetReceiveFilterHandler(handler api.StreamReceiverFilterHandler) { + dis.handler = handler +} + +func (dis *DispatchFilter) OnDestroy() {} + +func (dis *DispatchFilter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffer.IoBuffer, trailers api.HeaderMap) api.StreamFilterStatus { +} +``` + +The protocol layer is decoupled from Actuator. If the API of other protocols is needed in the future, the stream filter of this protocol can be implemented. + +### 2.4.2. Requests will be assigned to Endpoints inside Actuator + +Drawing lessons from the design of spring boot: Actuator abstracts the concept of Endpoint, which supports on-demand expansion and injection of Endpoint. + +Built-in Endpoints are health Endpoint and info Endpoint. + +```go +type Actuator struct { + endpointRegistry map[string]Endpoint +} + +func (act *Actuator) GetEndpoint(name string) (endpoint Endpoint, ok bool) { + e, ok := act.endpointRegistry[name] + return e, ok +} + +func (act *Actuator) AddEndpoint(name string, ep Endpoint) { + act.endpointRegistry[name] = ep +} + +``` + +When a new request arrives at Actuator,it will be assigned to the corresponding Endpoint according to the path. + +For example, /actuator/health/readiness will be assigned to health.Endpoint + +### 2.4.3. health.Endpoint collect information from all the implementation of health.Indicator + +The components that need to report health check information should implement the Indicator interface and inject it into health.Endpoint: + +```go +type Indicator interface { + Report() Health +} +``` + +When a new request arrives,health.Endpoint will collect information from all the implementation of health.Indicator + +### 2.4.4. info.Endpoint collect information from all the implementation of info.Contributor + +Components that need to report runtime information should implement the Contributor interface and inject it into info.Endpoint: + +```go +type Contributor interface { + GetInfo() (info interface{}, err error) +} +``` + +When the path '/actuator/info' is visited,Actuator dispatch the request to info.Endpoint. + +info.Endpoint will collect information from all the implementation of info.Contributor + +# 3. Detailed design + +## 3.1. When will health state change +### 3.1.1. runtime_startup Indicator + +- SetStarted + +![img.png](../../../img/actuator/set_started.png) + +- SetUnhealthy + +When the startup fails: + +![img.png](../../../img/actuator/img.png) + +When server stops: + +![img_1.png](../../../img/actuator/img_1.png) + +### 3.1.2. apollo's Indicator + +When failing in initializing the component: + +![img_2.png](../../../img/actuator/img_2.png) \ No newline at end of file diff --git a/docs/en/design/configuration/configuration-api-with-apollo.md b/docs/en/design/configuration/configuration-api-with-apollo.md new file mode 100644 index 0000000000..046880c1da --- /dev/null +++ b/docs/en/design/configuration/configuration-api-with-apollo.md @@ -0,0 +1,121 @@ +# Implement Configuration API with ctripcorp/apollo +## Goals +Implement [Configuration API(level-2)](https://github.com/dapr/dapr/issues/2988) with ctripcorp/apollo. + +## Schema + +### From Configuration API to apollo schema + +The mapping rule is: + +| Params in Configuration API | apollo schema | +| --------------------------- | -------------------------------------------------------------------------- | +| app_id | //ignore it when querying or subscribing,use app_id in config file instead | +| group | namespace | +| label | //append to key. So the actual key stored in apollo will be 'key@$label' | +| tag | // put into another configuration item with json format | + +The actual key stored in apollo will be `key@$label` and the value will be raw value. + +Tags will be stored in a special namespace `sidecar_config_tags`, + +with key=`group@$key@$label` and value= + +```json +{ + "tag1": "tag1value", + "tag2": "tag2value" +} +``` + + +**Q: Why not store value and tags in a single configuration item to reduce times of queries,like:** + +```json +{ + "value":"raw value", + "tags":{ + "tag1":"tag1value", + "tag2":"tag2value" + } +} +``` + +A: Legacy systems using apollo can't migrate to our sidecar if we design like this. + +### How to migrate legacy systems + +1. Get and subscribe APIs are compatible.Users can easily put legacy systems onto our sidecar if they don't use save/delete APIs.Just keep `label` field blank in config.json,and the sidecar will use the raw key instead of `key@$label` to interact with apollo. + +2. Save/delete APIs might be incompatible.The sidecar use fixed `cluster` field configurated in config.json and fixed `env` field in code,which means users can't pass `cluster` and `env` field as a parameter for save/delete API when they want to change some configuration items with other appid. + +### config.json for sidecar + +```json +{ + "config_store": { + "type": "apollo", + "address": [ + "http://106.54.227.205:8080" + ], + "metadata": { + "app_id": "testApplication_yang", + "cluster": "dev", + "namespace_name": "dubbo,product.joe", + "is_backup_config": true, + "secret": "6ce3ff7e96a24335a9634fe9abca6d51" + } + } +} +``` + + +## API + +### Which Go SDK for apollo should I Use? + +We are using the official maintained [sdk](https://github.com/apolloconfig/agollo), the others sdks you can find in this [repo](https://www.apolloconfig.com/#/zh/usage/third-party-sdks-user-guide). + +Some problems with the sdk: +1. Users must declare all namespaces in AppConfig before connecting to the server and constructing a client,like: + +```go + c := &config.AppConfig{ + AppID: "testApplication_yang", + Cluster: "dev", + IP: "http://106.54.227.205:8080", + NamespaceName: "dubbo", // declare before connecting to the server + IsBackupConfig: true, + Secret: "6ce3ff7e96a24335a9634fe9abca6d51", + } + client,err:=agollo.StartWithConfig(func() (*config.AppConfig, error) { + return c, nil + }) +``` + +2. Nowhere to configurate `env` field. + +3. No save/delete API. + +4. No bulk query API. + +5. No sure about the concurrent safety. + +6. Nowhere to configurate or use [Apollo Meta Server](https://www.apolloconfig.com/#/zh/usage/java-sdk-user-guide?id=_122-apollo-meta-server) + +7. Not sure about the consistency property between local cache and backend database. + +8. The two operations(set kv+set tags) are not transaction,which may cause inconsistency. + +### Which apollo sdk API should I use? + +| Configuration API | apollo sdk API | +| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| GetConfiguration | cache := client.GetConfigCache(c.NamespaceName)
value,_ := client.Get("key") | +| SaveConfiguration | use open API via http. [update](https://www.apolloconfig.com/#/zh/usage/apollo-open-api-platform?id=_3211-%e4%bf%ae%e6%94%b9%e9%85%8d%e7%bd%ae%e6%8e%a5%e5%8f%a3) + [commit](https://www.apolloconfig.com/#/zh/usage/apollo-open-api-platform?id=_3213-%e5%8f%91%e5%b8%83%e9%85%8d%e7%bd%ae%e6%8e%a5%e5%8f%a3) | +| DeleteConfiguration | use open API via http. [delete](https://www.apolloconfig.com/#/zh/usage/apollo-open-api-platform?id=_3212-%e5%88%a0%e9%99%a4%e9%85%8d%e7%bd%ae%e6%8e%a5%e5%8f%a3) + [commit](https://www.apolloconfig.com/#/zh/usage/apollo-open-api-platform?id=_3213-%e5%8f%91%e5%b8%83%e9%85%8d%e7%bd%ae%e6%8e%a5%e5%8f%a3) | +| SubscribeConfiguration | https://github.com/apolloconfig/agollo/wiki/%E7%9B%91%E5%90%AC%E5%8F%98%E6%9B%B4%E4%BA%8B%E4%BB%B6 | + +### How to subscribe all config changes of the specified app + +Subscribe all namespaces declared in config.json \ No newline at end of file diff --git a/docs/en/design/faas/faas-poc-design.md b/docs/en/design/faas/faas-poc-design.md new file mode 100644 index 0000000000..b5bcd395b7 --- /dev/null +++ b/docs/en/design/faas/faas-poc-design.md @@ -0,0 +1,45 @@ +## FaaS design document + +### 1. Architecture + +![img.png](../../../img/faas/faas-design.jpg) + +In this FaaS solution, the following two problems are mainly solved: +1. What is the relationship between the compiled wasm file and the docker image? + 1. The target wasm file is finally built into an ordinary image and pushed to Dockerhub. The process of pulling the image is also consistent with the original image, but the target wasm file will be extracted from the image and loaded separately during actual operation. +2. How to make k8s manage and deploy wasm files? + 1. Incorporating into the k8s life cycle management and scheduling strategy, the Containerd-shim-layotto-v2 plugin implements the v2 interface definition of Containerd, and changes the container runtime to Layotto Runtime. For example, the implementation of k8s creating a container is modified to load and run functions in form of wasm. + 2. Thanks to the excellent sandbox isolation environment of WebAssembly, Layotto as a function base can load and run multiple wasm functions. Although they all run in the same process, they do not affect each other. Compared with docker, this idea of nanoprocess can make fuller use of resources. + +### 2. Core components + +#### A、Function + +The wasm1 and wasm2 in the above figure respectively represent two functions. After the function is developed, it will be compiled into the form of `*.wasm` and loaded and run. It makes full use of the sandbox isolation environment provided by [WebAssembly(wasm)](https://webassembly.org/) to avoid mutual influence between multiple functions. + +#### B、[Layotto](https://github.com/mosn/layotto) + +The goal is to provide services, resources, and safety for the function. As the base of function runtime, it provides functions including WebAssembly runtime, access to infrastructure, maximum resource limit for functions, and system call permission verification for functions. + +#### C、[Containerd](https://containerd.io/) + +Officially supported container runtime, docker is currently the most widely used implementation. In addition, secure containers such as kata and gvisor also use this technology. Layotto also refers to their implementation ideas and integrates the process of loading and running functions into the container runtime. + +#### D、[Containerd-shim-layotto-v2](https://github.com/layotto/containerd-wasm) + +Based on the V2 interface definition of Containerd, the runtime logic of the container is customized. For example, the implementation of creating a container is modified to let Layotto load and run the wasm function. + +#### E、[Kubernetes](https://kubernetes.io/) + +The current container scheduling standards, life cycle management and scheduling strategies are excellent. Layotto chose to use the containerd in order to perfectly integrate the scheduling of functions with the k8s ecology. + +### 3. Runtime ABI + +#### A. [proxy-wasm-go-sdk](https://github.com/layotto/proxy-wasm-go-sdk) + +On the basis of [proxy-wasm/spec](https://github.com/proxy-wasm/spec), refer to the definition of [Runtime API](https://github.com/mosn/layotto/blob/main/spec/proto/runtime/v1/runtime.proto), add APIs for functions to access infrastructure. + +#### B. [proxy-wasm-go-host](https://github.com/layotto/proxy-wasm-go-host) + +It is used to implement the logic of Runtime ABI in Layotto. + diff --git a/docs/en/design/lock/lock-api-design.md b/docs/en/design/lock/lock-api-design.md new file mode 100644 index 0000000000..4b08c2d0fa --- /dev/null +++ b/docs/en/design/lock/lock-api-design.md @@ -0,0 +1,258 @@ +# 0. tl;dl +This proposal try to add TryLock and Unlock API. + +The Lock Renewal API might be controversial and will not be added into the first version + +# 1. Why it is needed +Application developers need distributed locks to keep their data safe from race conditions,but implementing a distributed lock correctly is challenging,since you have to be careful to prevent deadlock or some incorrect corner cases from happening. + +An easy-to-use distributed lock API provided by runtime sidecar can be helpful. + + +# 2. Evaluation of products on the market +| **System** | **tryLock(non-blocking lock)** | **Blocking lock(based on watch)** | **Availability** | **Write operations are linearizable** | **sequencer([chubby's feature](https://static.googleusercontent.com/media/research.google.com/zh-TW//archive/chubby-osdi06.pdf))** | **Lock renewal** | +| --- | --- | --- | --- | --- | --- | --- | +| Stand-alone redis | yes | x | unavailable when single failure | yes | yes(need poc) | yes | +| redis cluster | yes | x | yes | no. Locks will be unsafe when fail-over happens | yes(need poc) | yes | +| redis Redlock | yes | | | | | | +| consul | yes | | | | | | +| zookeeper | yes | yes | yes. [the election completes within 200 ms](https://pdos.csail.mit.edu/6.824/papers/zookeeper.pdf) | yes | yes use zxid as sequencer | yes | +| etcd | yes | yes | yes | yes | yes use revision | yes lease.KeepAlive | + +There are some differences in feature supporting. + +# 2. High-level design +## 2.1. API +### 2.1.0. Design principles +We are faced with many temptations. In fact, there are many lock related features that can be supported (blocking locks, reentrant locks, read-write locks, sequencer, etc.) + +But after all, our goal is to design a general API specification, so we should be as conservative as possible in API definition.Start simple, abstract the simplest and most commonly used functions into API specifications, and wait for user feedback before considering adding more abstraction into API specification. + +### 2.1.1. TryLock/Unlock API +The most basic locking and unlocking API. + +TryLock is non-blocking, it return directly if the lock is not obtained. + +proto: + +```protobuf + // Distributed Lock API + // A non-blocking method trying to get a lock with ttl. + rpc TryLock(TryLockRequest)returns (TryLockResponse) {} + + rpc Unlock(UnlockRequest)returns (UnlockResponse) {} + + + +message TryLockRequest { + // Required. The lock store name,e.g. `redis`. + string store_name = 1; + + // Required. resource_id is the lock key. e.g. `order_id_111` + // It stands for "which resource I want to protect" + string resource_id = 2; + + // Required. lock_owner indicate the identifier of lock owner. + // You can generate a uuid as lock_owner.For example,in golang: + // + // req.LockOwner = uuid.New().String() + // + // This field is per request,not per process,so it is different for each request, + // which aims to prevent multi-thread in the same process trying the same lock concurrently. + // + // The reason why we don't make it automatically generated is: + // 1. If it is automatically generated,there must be a 'my_lock_owner_id' field in the response. + // This name is so weird that we think it is inappropriate to put it into the api spec + // 2. If we change the field 'my_lock_owner_id' in the response to 'lock_owner',which means the current lock owner of this lock, + // we find that in some lock services users can't get the current lock owner.Actually users don't need it at all. + // 3. When reentrant lock is needed,the existing lock_owner is required to identify client and check "whether this client can reenter this lock". + // So this field in the request shouldn't be removed. + string lock_owner = 3; + + // Required. expire is the time before expire.The time unit is second. + int32 expire = 4; +} + + +message TryLockResponse { + + bool success = 1; +} + +message UnlockRequest { + string store_name = 1; + // resource_id is the lock key. + string resource_id = 2; + + string lock_owner = 3; +} + +message UnlockResponse { + enum Status { + SUCCESS = 0; + LOCK_UNEXIST = 1; + LOCK_BELONG_TO_OTHERS = 2; + INTERNAL_ERROR = 3; + } + + Status status = 1; +} + +``` + +**Q: What is the time unit of the expire field?** + +A: Seconds. + +**Q: Can we force the user to set the number of seconds to be large enough(instead of too small)?** + +A: There is no way to limit it at compile time or startup, forget it + +**Q: What would happen if different applications pass the same lock_owner?** + +case 1. If two apps with different app-id pass the same lock_owner,they won't conflict because lock_owner is grouped by 'app-id ',while 'app-id' is configurated in sidecar's static config(configurated in config.json or passed as parameters at startup) + +case 2.If two apps with same app-id pass the same lock_owner,they will conflict and the second app will obtained the same lock already used by the first app.Then the correctness property will be broken. + +So user has to care about the uniqueness property of lock_owner. + +**Q: Why not add metadata field** + +A: Try to be conservative at the beginning, wait until someone feedbacks that there is a need, or find that there is a need to be added in the process of implementing the component + +**Q: How to add features such as sequencer and reentrant locks in the future?** + +A: Add feature options in the API parameters,and the component must also implement the Support() function + +### 2.1.2. Lock Renewal API +Renewal API aims to refresh the existing lock and postpone the expiration time. + +Lock Renewal API won't be in the first version of this API. Here are some considerations for discussion. + +#### Solution A: add an API "LockKeepAlive" + ![img_3.png](../../../img/lock/img_3.png) + +```protobuf +rpc LockKeepAlive(stream LockKeepAliveRequest) returns (stream LockKeepAliveResponse){} + +message LockKeepAliveRequest { + // resource_id is the lock key. + string resource_id = 1; + + string lock_owner = 2; + // expire is the time to expire + int64 expire = 3; +} + +message LockKeepAliveResponse { + enum Status { + SUCCESS = 0; + LOCK_UNEXIST = 1; + LOCK_BELONG_TO_OTHERS = 2; + } + // resource_id is the lock key. + string resource_id = 1; + + Status status = 2; +} +``` + +Users have to start a thread or coroutine to periodically renew the lock. + +The input parameters and return results of this API are all streams. App and sidecar only need to maintain one connection. Each time the lock needs to be renewed, the connection is reused to transfer the renewal request. + +**Q: Why not put the lock renewal as a stream parameter into tryLock?** + +- Lock renewal is not a high frequency demand, so we want trylock to be as simple as possible; + +- Single responsibility principle.When we want to add a blocking lock,the renewal API can be reused; + +**Q: The renewal logic is too complicated, can we make it transparent to users?** + +A: sdk can do this logic for users.Sdk will start a thread,coroutine or nodejs timing event to automatically renew the lease + + +#### Solution B: Make users not aware of the renewal logic +Our sidecar can automatically renew the lease with heartbeat. App and sidecar maintain a heartbeat for failure detection. + +![img_1.png](../../../img/lock/img_1.png) + +Disadvantages/difficulties: + +1. If we reuse a public heartbeat, it is difficult to customize the heartbeat interval + +An option is to ensure that the heartbeat interval low enough, such as 1 time per second + +2. How to ensure reliable failure detection? + +For example, the following java code `unlock()` method may fail: + +```java +try{ + +}finally{ + lock.unlock() +} +``` + +If it is a lock in JVM, unlock can guarantee success (unless the entire JVM fails), but unlock may fail if it is called via the network. How to ensure that the heartbeat is interrupted after the call fails? + +Here shows the corner case: +![](https://user-images.githubusercontent.com/26001097/124790369-ae1d6480-df7d-11eb-8f87-401635c49b69.png) + +![](https://user-images.githubusercontent.com/26001097/124790972-38fe5f00-df7e-11eb-8d0b-685750dcc3ba.png) + +![img_2.png](../../../img/lock/img_2.png) + +Solving this case requires the app to report some fine-grained status with the heartbeat. + +We can define a http callback SPI, which is polled and detected by the sidecar, and the data structure returned by the callback is as follows: + +```json +{ + "status": "UP", + "details": { + "lock": [ + { + "resource_id": "res1", + "lock_owner": "dasfdasfasdfa", + "type": "unlock_fail" + } + ], + "xxx": [] + } +} +``` + +The application has to handle status collection, reporting, cleaning up after the report is successful, and limiting the map capacity (for example, what if the map is too large when report fails too much times?), which requires the app to implement some complex logic, and it must be put in the SDK. + +3. This implementation is actually the same as Solution A. It opens a separate connection for status management and failure detection, and user reports the status through this public connection when necessary. + +4. Solution B actually make API spec rely on heartbeat logic. It relies on the heartbeat interval and the data structure returned by the heartbeat. It is equivalent to that the API spec relies on the implementation of sidecar, unless we can also standardize the heartbeat API (including interval, returned data structure, etc.) + +#### Conclusion +At present, the Lock Renewal API might be controversial and will not be added into the first version. + +Personally I prefer the solution A.Let the SDK do the renewal logic. Although users have to directly deal with the lease renewal logic when using grpc, it is not hard for developers to understand. + +I put it here to see your opinion. + +# 3. Future work + +- Reentrant Lock + +There will be some counting logic.We need to consider whether all locks support reentrancy by default, or add a feature option in the parameter to identify that the user needs it to be reentrant + +- Heartbeat API + +If we want to implement more coordinator APIs such as blocking lock and leader election,we need a heartbeat API for failure detection,like `LeaseKeepAlive` in Etcd. + +- Blocking lock + +- Sequencer + +# 4. Reference + +[How to do distributed locking](https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html) + +[The Chubby lock service for loosely-coupled distributed systems](https://static.googleusercontent.com/media/research.google.com/zh-TW//archive/chubby-osdi06.pdf) \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/notify/phone_call.md b/docs/en/design/notify/phone_call.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/notify/phone_call.md rename to docs/en/design/notify/phone_call.md diff --git a/docs/en/design/pluggable/design.md b/docs/en/design/pluggable/design.md new file mode 100644 index 0000000000..e17384f56e --- /dev/null +++ b/docs/en/design/pluggable/design.md @@ -0,0 +1,41 @@ +# Pluggable Component Design Document + +## Background + +Currently, the components of Layotto are implemented in Layotto's projects, which requires users to develop new components using Golang language and implement them in the Layotto project before compiling them uniformly. +It is very unfriendly for multilingual users, so Layotto needs to provide the capability of pluggable components, allowing users to implement their own components in any language. Layotto communicates with external components through the GRPC protocol. + +## Programme + +- Implementing local cross language component service discovery based on UDS (Unix domain socket) to reduce communication overhead. +- Implement cross language implementation capabilities for components based on protobuf. + +## Data Flow Architecture + +![](../../../img/pluggable/layotto_datatflow.png) + +This is the data flow starting from the current user's call to SDK. +The dashed portion is the data flow that the pluggable component primarily participates in. + +### Component Discovery + +![](../../../img/pluggable/layotto.png) + +As shown in the above figure, the user-defined component starts the socket service and places the socket file in the specified directory. +When Layotto starts, it will read all socket files in the directory (skipping folders) and establish a socket connection. + +At present, layotto aligns with dapr and is not responsible for the lifecycle of user components. +If the user components are offline during the service period, there will be no reconnection, and the component service cannot be used. + +Based on the usage of the community, it will be decided whether Layotto needs to support a process management module or use a separate service for management. + +Due to the incomplete support for UDS in Windows and the cancellation of compatibility with Windows by Layotto itself, +the new feature adopts a UDS discovery mode that is not compatible with Windows systems. + +## Component Register + +- As shown in the data flow framework composition above, the components registered by the user need to implement the GRPC service defined by the pluggable proto. +Layotto will generate golang's grpc file based on the protobuf idl. Here Corresponds to the wrap component in the data flow diagram. +- There is no difference between wrap component and build in component for layotto runtime, and there is no special perception for users. +- Layotto uses the GRPC reflect library to obtain which components are implemented by the user's provided services, and registers them in the global component registry for users to use. + diff --git a/docs/en/design/pluggable/usage.md b/docs/en/design/pluggable/usage.md new file mode 100644 index 0000000000..7c6ac73e31 --- /dev/null +++ b/docs/en/design/pluggable/usage.md @@ -0,0 +1,57 @@ +# Pluggable Component Usage Guide + +This example demonstrates how users can implement and register their own components through the pluggable component capabilities provided by Layotto. +And verify the correctness of your component writing through Layotto SDK calls. + +## step1.Write and run pluggable components + +Next, run the already written code + +```shell +cd demo/pluggable/hello +go run . +``` + +Printing the following result indicates successful service startup + +```shell +start grpc server +``` + +>1. Taking the go implementation of the `hello` component as an example, find the corresponding component's proto file in `layotto/spec/proto/pluggable` and generate the corresponding implementation language's grpc file. +The Go language's pb file has been generated and placed under `spec/proto/pluggable/v1`, and users can directly reference it when using it. +>2. In addition to implementing the interfaces defined in the protobuf file, the component also needs to use socket mode to start the file and store the socket file in the default path of `/tmp/runtime/component-sockets`, +You can also use the environment variable `LAYOTTO_COMPONENTS_SOCKETS_FOLDER` modify the sock storage path location. +>3. In addition, users also need to register the reflection service in the GRPC server, which is used to obtain the specific implementation interface spec of the GRPC service during layotto service discovery. For specific code, please refer to `demo/pluggable/hello/main.go` + +## step2. Launch Layotto + +```shell +cd cmd/layotto +go build -o layotto . +./layotto start -c ../../configs/config_hello_component.json +``` + +> The type of the component filled in the configuration file is `hello-grpc-demo`, which is determined by the prefix name of the socket file. +> The configuration items are consistent with registering regular hello components. +> Provide metadata items for users to set custom configuration requirements. + +## step3. Component verification + +Based on existing component testing code, test the correctness of user implemented pluggable components. + +```shell +cd demo/hello/common +go run . -s helloworld +``` + +The program outputs the following results to indicate successful registration and operation of pluggable components. + +```shell +runtime client initializing for: 127.0.0.1:34904 +hello +``` + +## Understand the implementation principle of Layotto pluggable components + +If you are interested in the implementation principles or want to extend some functions, you can read the [Design Document for Pluggable Components](en/design/pluggable/design.md) \ No newline at end of file diff --git a/docs/en/design/pubsub/pubsub-api-and-compability-with-dapr-component.md b/docs/en/design/pubsub/pubsub-api-and-compability-with-dapr-component.md new file mode 100644 index 0000000000..67e71b5d4a --- /dev/null +++ b/docs/en/design/pubsub/pubsub-api-and-compability-with-dapr-component.md @@ -0,0 +1,149 @@ +# Pub/Sub API and compatibility with Dapr's packages +# 1. Requirements +1. Support Pub/Sub API +2. The architecture can reuse Dapr's packages as much as possible + +# 2. High-level design +## 2.1. Architecture: whether to reuse Dapr's sdk and proto +In order to develop a set of universally accepted API specs with the Dapr and Envoy communities in the future, we try to be consistent with the Dapr API at present. + +Dapr's component library can be reused directly; the following discusses whether sdk and proto are reused and how to reuse. + +### The problems we are facing + +1. The SDK of dapr is hard-coded to call the package name of the API, and there is 'dapr' word in the name + ![img.png](../../../img/mq/design/img.png) +2. We will have differentiated requirements in the future, such as new fields and new APIs. If we use dapr.proto directly, it will be inflexible +### Solution + +#### Do not reuse sdk and proto; move the proto file to a neutral path +![img_1.png](../../../img/mq/design/img_1.png) + +We first define an api-spec.proto, this proto is a superset of dapr API, and the path name is neutral without the word 'layotto' or 'dapr'.Based on this proto, we can develop a neutral RuntimeAPI sdk. + +Later, try to promote the proto into an api-spec accepted by the runtime community, or rebuild a path-neutral api-spec.proto with other communities. + +It does not matter if the proto changes during the promotion process. Layotto internally extracts an API layer under the proto to prevent proto changes; + +If it is not easy to push, we can write a dapr adapter in the neutral SDK in the short term, and use our SDK to adjust dapr and layotto: +![img_2.png](../../../img/mq/design/img_2.png) + +Advantages: + +1. Neat and tidy. If you want to reuse Dapr's sdk and proto, there is an inevitable problem: when the API and dapr are different, you need to encapsulate a layer of your own logic, which will bring complexity, hacky, a sense of copycat, and raise the difficulty of code reading. +1. Extendible when the APIs are different from Dapr's + +Disadvantages: + +1. Subsequent Dapr client or proto changes, we may not know, resulting in inconsistencies + + +## 2.2. API Design +### 2.2.1. Design principle: How to add fields to Dapr's API +We want to reuse Dapr API, but in the long run, there will definitely be customization requirements. When our API and dapr's are different (for example, we just want to add a new field to a certain API of Dapr), should we create a new method name or just add a field to the original method? + +If we add a field to the original method, it may cause field conflicts. + +After serveral discussion,we finally decide to add fields directly in that situation.Conflicts of API are inevitable (of course,we will try to raise pull requests to the Dapr community to avoid conflicts) + +In the future, when everyone really sits together to reach a consensus and build api-spec, a new proto with a new path will be created. Anyway, there will be a new proto at that time, so don't worry about the current conflict. + +### 2.2.2. Between APP and Layotto +Use the same grpc API as Dapr + +```protobuf +service AppCallback { + // Lists all topics subscribed by this app. + rpc ListTopicSubscriptions(google.protobuf.Empty) returns (ListTopicSubscriptionsResponse) {} + + // Subscribes events from Pubsub + rpc OnTopicEvent(TopicEventRequest) returns (TopicEventResponse) {} + +} +``` + +```protobuf +service Dapr { + // Publishes events to the specific topic. + rpc PublishEvent(PublishEventRequest) returns (google.protobuf.Empty) {} +} + +``` + +### 2.2.3. Between Layotto and Component +Use the same as Dapr; +PublishRequest.Data and NewMessage.Data put json data conforming to CloudEvent 1.0 specification (can be deserialized and put into map[string]interface{}) + +```go +// PubSub is the interface for message buses +type PubSub interface { + Init(metadata Metadata) error + Features() []Feature + Publish(req *PublishRequest) error + Subscribe(req SubscribeRequest, handler func(msg *NewMessage) error) error + Close() error +} + +// PublishRequest is the request to publish a message +type PublishRequest struct { + Data []byte `json:"data"` + PubsubName string `json:"pubsubname"` + Topic string `json:"topic"` + Metadata map[string]string `json:"metadata"` +} + + +// NewMessage is an event arriving from a message bus instance +type NewMessage struct { + Data []byte `json:"data"` + Topic string `json:"topic"` + Metadata map[string]string `json:"metadata"` +} + +``` + +### 2.2.4. How does the sidecar know which port to call back + +Configure the callback port at startup. The price is that the sidecar can only serve one process. + +Temporarily choose this plan in this issue + +### 2.2.5. How to keep the subscription list real-time + +The app is called when the sidecar starts, and the subscription relationship is obtained at that time. Therefore, there are requirements for the startup sequence. Start the app first. + +It can be optimized into a timed polling mechanism in the future + +### 2.2.6. Does the subscription relationship support declarative configuration? + +In the first phase, only the way of opening an API for callback is supported, and the subsequent optimization will be declarative configuration or dynamic configuration. + +## 2.3. Config Design +![img.png](../../../img/mq/design/config.png) + +# 3. Future Work +## A Bigger Control Plane + +The Control Plane in the Service Mesh era only serves RPC, but in the Runtime API era, component configuration also needs to be distributed by the cluster; components also need service discovery and routing, so components also need their own Control Plane. + +It is convenient to have a Bigger Control Plane that integrates RPC and all middleware configuration data + +Maybe we have to extend the xDS protocol, like 'runtime Discovery Service'. + +## Subscription relationship support configuration + +The subscription relationship is now obtained by the callback mechanism.We want the subscription relationship be obtained through configuration. + +## appcallback support TLS + + +## Separate component configuration and personality configuration (callback port, app-id) +The current component configuration and app personality configuration (callback port, app-id) are put together, and there are some problems: + +1. It's not easy to distribute the configuration to the whole cluster +1. Can't do component access control (for example, Dapr can restrict app-id1 to only access topic_id1) +![img_4.png](../../../img/mq/design/img_4.png) + +Need to refactor the original component logic. + +## Tracing diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/rpc/rpc-design-doc.md b/docs/en/design/rpc/rpc-design-doc.md similarity index 84% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/rpc/rpc-design-doc.md rename to docs/en/design/rpc/rpc-design-doc.md index fbd98b37a9..4ca4ea4608 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/rpc/rpc-design-doc.md +++ b/docs/en/design/rpc/rpc-design-doc.md @@ -1,6 +1,6 @@ -# RPC DESIGN +RPC DESIGN -## API +### API runtime rpc API is same with Dapr. ### Core Abstraction @@ -9,9 +9,9 @@ in order to decoupling with pb definition,add independent RPC abstrations. - invoker: provide complete rpc ability,currently only Mosn invoker - callback:before/after filter,extend with custom logic(eg: protocol convertion) - channel:send request and receive response, talk to diffrent transport protocol(http、bolt...) - + due to Mosn do all the dirty work, a lightweight framework is enough for layotto currently. - + ![img.png](../../../img/rpc/rpc-layer.png) @@ -48,9 +48,9 @@ In layotto, we design a convenient way to support xprotocols. The only task need "channel": [{ "size": 16, // analogy to connection nums "protocol": "http", // communicate with mosn via this protocol - "listener": "egress_runtime_http" // mosn's protocol listener name - }] - } - } - } + "listener": "egress_runtime_http" // mosn's protocol listener name + }] + } + } +} ``` \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/CONTRIBUTING.md b/docs/en/development/CONTRIBUTING.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/CONTRIBUTING.md rename to docs/en/development/CONTRIBUTING.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/commands.md b/docs/en/development/commands.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/commands.md rename to docs/en/development/commands.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/component_ref/component_ref.md b/docs/en/development/component_ref/component_ref.md similarity index 97% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/component_ref/component_ref.md rename to docs/en/development/component_ref/component_ref.md index 4fb806b747..5a455a576a 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/component_ref/component_ref.md +++ b/docs/en/development/component_ref/component_ref.md @@ -1,13 +1,13 @@ -# layotto component reference +## layotto component reference -## Background +### Background When a component starts, it may need to use another component's skill. For example, when the `sequencer` component `A` starts, it needs to read its settings from the `config` component `B`. To make this happen, layotto offers the "component reference" feature. This feature lets component A use the features of component B. ### Related Designs -Currently, other components can only reference two types of components: ConfigStore and SecretStore. These are used to get configuration and secret keys. +Currently, other components can only reference two types of components: ConfigStore and SecretStore. These are used to get configuration and secret keys. The "referenced" components must implement the interface : diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/contributing-doc.md b/docs/en/development/contributing-doc.md similarity index 91% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/contributing-doc.md rename to docs/en/development/contributing-doc.md index bc537ac24a..41ff32d759 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/contributing-doc.md +++ b/docs/en/development/contributing-doc.md @@ -8,7 +8,7 @@ This document describes how to modify/add documents. Documentation for this repo Documents are stored in the 'docs/' directory, where 'docs/en' stores English documents and 'docs/zh' stores Chinese documents. -![img_2.png](/img/development/doc/img_2.png) +![img_2.png](../../img/development/doc/img_2.png) ## 2. Documentation Site Description Files under docs/ directory will be automatically deployed to github pages and rendered through [docsify](https://docsify.js.org/#/). @@ -19,7 +19,7 @@ Generally speaking, after the .md file is merged into the main branch, you can s ### step 1. Write a new markdown file To add a document, create a folder and a .md file based on the directory structure. For example, if you want to write a design document for the distributed lock API, just create a new directory: -![img_1.png](/img/development/doc/img_1.png) +![img_1.png](../../img/development/doc/img_1.png) ### step 2. Update the sidebar Remember to update the sidebar after adding new documents or revising existing documents. @@ -42,9 +42,9 @@ The hyperlink mentioned here is the kind of links that will jump to other docume ### Incorrect Syntax If you try to create a hyperlink with a relative path, then a 404 page will appear once you clicked it: -![img_6.png](/img/development/doc/img_6.png) +![img_6.png](../../img/development/doc/img_6.png) -![img_7.png](/img/development/doc/img_7.png) +![img_7.png](../../img/development/doc/img_7.png) ### Correct Syntax @@ -52,7 +52,7 @@ There are two suggested ways to write hyperlinks: a. Use a path relative to the 'docs/' directory. Such as: -![img_5.png](/img/development/doc/img_5.png) +![img_5.png](../../img/development/doc/img_5.png) b. Use the full Url. Such as: @@ -63,7 +63,7 @@ see [runtime_config.json](https://github.com/mosn/layotto/blob/main/configs/runt ## 5. Tips on image links Images are stored under docs/img/ directory for the purpose that the Docsify site can access it -![img.png](/img/development/doc/img.png) +![img.png](../../img/development/doc/img.png) It is recommended to use the full path when referencing images in documents, to avoid a bunch of messy path problems. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/developing-api.md b/docs/en/development/developing-api.md similarity index 99% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/developing-api.md rename to docs/en/development/developing-api.md index 0a4bce2db8..b965e9e7b4 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/developing-api.md +++ b/docs/en/development/developing-api.md @@ -78,7 +78,7 @@ need to have: Correct example:[Dapr pub-sub quickstart](https://github.com/dapr/quickstarts/tree/v1.0.0/pub-sub) Before the operation, explain what effect this demo want to achieve with illustration -![img.png](/img/development/api/img.png) +![img.png](../../img/development/api/img.png) Counter-example: The document only writes operation steps 1234, and users do not understand what they want to do. @@ -102,7 +102,7 @@ Need to have : ##### How to use this API - List of interfaces.For example: -![img_4.png](/img/development/api/img_4.png) +![img_4.png](../../img/development/api/img_4.png) List out which interfaces are there. On the one hand, the users of the province go to the proto and don’t know which APIs are related. On the other hand, it can avoid the disgust of users due to the lack of interface documentation - About the interface`s input and output parameters: use proto comments as interface documentation diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/developing-component.md b/docs/en/development/developing-component.md similarity index 87% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/developing-component.md rename to docs/en/development/developing-component.md index 4be0c27418..e484bfe9cc 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/developing-component.md +++ b/docs/en/development/developing-component.md @@ -16,7 +16,7 @@ When developing new components, you can refer to the existing components. For ex The folder name can use the component name, referring to the redis component below -![img.png](/img/development/component/img.png) +![img.png](../../img/development/component/img.png) Tools you may use in the process of development (for the purpose of reference only, hope to simplify the development) : @@ -43,23 +43,23 @@ components/configstores/ apollo/configstore_test.go: First, in configstore.go, encapsulate all calls to the SDK, network and Apollo into a single interface. -![mock.png](/img/development/component/mock.png) -![img_8.png](/img/development/component/img_8.png) +![mock.png](../../img/development/component/mock.png) +![img_8.png](../../img/development/component/img_8.png) Then, encapsulate your code that calls the SDK and network into a struct which achieves that interface: -![img_9.png](/img/development/component/img_9.png) +![img_9.png](../../img/development/component/img_9.png) Once you've done this refactoring, your code is testable (this is part of the idea of test-driven development, refactoring code into a form that can be injectable in order to improve its testability) Next, we can mock that interface when we write ut: -![img_10.png](/img/development/component/img_10.png) +![img_10.png](../../img/development/component/img_10.png) Just mock it into the struct you want to test, and test it. -![img_11.png](/img/development/component/img_11.png) +![img_11.png](../../img/development/component/img_11.png) Note: Generally, during "integration test", network call will be made and a normal ZooKeeper or Redis will be called. On contract, the single test focuses on the local logic, and will not call the real environment @@ -72,10 +72,10 @@ So how should let Layotto load the components at startup? Need to integrate new components in cmd/layotto/main.go, including: ### 3.1. Import your components in main.go -![img_1.png](/img/development/component/img_1.png) +![img_1.png](../../img/development/component/img_1.png) ### 3.2. Register your component in the NewRuntimeGrpcServer function of main.go -![img_4.png](/img/development/component/img_4.png) +![img_4.png](../../img/development/component/img_4.png) After that, Layotto initializes the ZooKeeper component if the user has configured "I want to use ZooKeeper" in the Layotto configuration file @@ -93,7 +93,7 @@ So how to configure when users want to use Zookeeper? We need to provide a sampl We can copy a json configuration file from another component. For example, copy configs/config_redis.json and paste it into configs/config_zookeeper.json when developing a plug-in component Then edit and modify the configuration shown below: -![img_3.png](/img/development/component/img_3.png) +![img_3.png](../../img/development/component/img_3.png) @@ -103,12 +103,12 @@ We need a client demo, such as the distributed lock client demo that has two cor #### a. If the component has a generic client, it doesn't need to be developed If there is a common folder under demo directory, it means the demo is a general purpose demo, which can be used by different components. You can pass the storeName parameter on the command line, and you don't need to develop a demo if you have this -![img_6.png](/img/development/component/img_6.png) +![img_6.png](../../img/development/component/img_6.png) #### b. If the component does not have a generic client or requires custom metadata arguments, copy and paste them For example, when implementing distributed locks using ZooKeeper, you need some custom configurations. Then you can write your demo based on the Redis demo -![img_7.png](/img/development/component/img_7.png) +![img_7.png](../../img/development/component/img_7.png) Note: If there are errors in the demo code that shouldn't be there , you can panic directly. Later, we will directly use demo to run the integration test. If panic occurs, it means that the integration test fails. For example the demo/lock/redis/client.go: @@ -122,19 +122,19 @@ Note: If there are errors in the demo code that shouldn't be there , you can pan ``` ### 4.3. Refer to the QuickStart documentation to start Layotto and Demo and see if any errors are reported -For example, refer to the [QuickStart documentation of the Distributed Lock API](start/lock/start.md) , start your dependent environment (such as ZooKeeper), and start Layotto (remember to use the configuration file you just added!). And check for errors. +For example, refer to the [QuickStart documentation of the Distributed Lock API](zh/start/lock/start.md) , start your dependent environment (such as ZooKeeper), and start Layotto (remember to use the configuration file you just added!). And check for errors. Note: The following Error is ok, just ignore it -![img_2.png](/img/development/component/img_2.png) +![img_2.png](../../img/development/component/img_2.png) Start demo and call Layotto to see if any errors are reported. If it is a universal client, you can pass storeName with -s storeName in the command line -![img_5.png](/img/development/component/img_5.png) +![img_5.png](../../img/development/component/img_5.png) If there is no error when running, it means the test passed! ## 5、New component description documents When the above code work is completed , it is better to add the configuration documentation of the component, explaining what configuration items the component supports and how to start the environment that the component depends on (for example, how to start ZooKeeper with Docker). -You can refer to the [Redis component description of the Lock API (Chinese)](component_specs/lock/redis.md) and [the Redis component description of the Lock API (English)](component_specs/lock/redis.md), also can copy and paste change. \ No newline at end of file +You can refer to the [Redis component description of the Lock API (Chinese)](zh/component_specs/lock/redis.md) and [the Redis component description of the Lock API (English)](en/component_specs/lock/redis.md), also can copy and paste change. \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/github-workflows.md b/docs/en/development/github-workflows.md similarity index 93% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/github-workflows.md rename to docs/en/development/github-workflows.md index b9947b2359..1da577af77 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/github-workflows.md +++ b/docs/en/development/github-workflows.md @@ -85,7 +85,7 @@ Layotto Env Pipeline Task Trigger Events: ## Layotto Dev Pipeline 🌊 (Before Merged) -![release.png](/img/development/workflow/workflow-dev.png) +![release.png](../../img/development/workflow/workflow-dev.png) ### Job Task Content @@ -121,7 +121,7 @@ The layotto dev pipeline (before merged) is mainly responsible for verifying th ## Layotto Dev Pipeline 🌊 (After Merged) -![release.png](/img/development/workflow/workflow-merge.png) +![release.png](../../img/development/workflow/workflow-merge.png) ### Job Task Content @@ -160,7 +160,7 @@ The layotto dev pipeline (after merged) is mainly responsible for the verificat ## Layotto Release Pipeline 🌊 -![release.png](/img/development/workflow/workflow-release.png) +![release.png](../../img/development/workflow/workflow-release.png) ### Job Task Content @@ -177,9 +177,9 @@ The layotto release pipeline is mainly responsible for the release and verifica + Linux AMD64 Artifact : Build linux amd64 binary verification for code + Linux ARM64 Artifact : Build linux arm64 binary verification for code + Linux AMD64 WASM Artifact : Build linux AMD64 binary verification for layotto wasm -+ Linux AMD64 WASM Image : Release the latest version of layotto wasm image. The image specification is `layotto/faas-amd64:{latest_tagname}` -+ Linux AMD64 Image : Release the latest version of layotto wasm image. The image specification is `layotto/layotto:{latest_tagname}` -+ Linux ARMD64 Image : Release the latest version of layotto wasm image. The image specification is `layotto/layotto.arm64:{latest_tagname}` ++ Linux AMD64 WASM Image : Release the latest version of layotto wasm image. The image specification is layotto/faas-amd64:{latest_tagname} ++ Linux AMD64 Image : Release the latest version of layotto wasm image. The image specification is layotto/layotto:{latest_tagname} ++ Linux ARMD64 Image : Release the latest version of layotto wasm image. The image specification is layotto/layotto.arm64:{latest_tagname} ### Job Trigger Event diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/test-quickstart.md b/docs/en/development/test-quickstart.md similarity index 99% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/test-quickstart.md rename to docs/en/development/test-quickstart.md index d8f8785b3d..f489ea64ae 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/test-quickstart.md +++ b/docs/en/development/test-quickstart.md @@ -6,7 +6,7 @@ So we need to test Quickstart regularly to make sure it works. But the process of manually testing Quickstart periodically and fixing exceptions in the documentation is too time-consuming. - + It's a pain in the ass! diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/operation/README.md b/docs/en/operation/README.md similarity index 95% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/operation/README.md rename to docs/en/operation/README.md index 0be93f1eb3..70bf84a217 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/operation/README.md +++ b/docs/en/operation/README.md @@ -10,7 +10,7 @@ There are some ways to deploy Layotto that you can find below. ### Deploy Layotto using released binaries -You can start Layotto directly via executing the binary file. Refer to the [Quick start](start) guide. +You can start Layotto directly via executing the binary file. Refer to the [Quick start](en/start) guide. ### Deploy using Docker @@ -25,7 +25,7 @@ It does not contain a `config.json` configuration file in the image, you can mou docker run -v "$(pwd)/configs/config.json:/runtime/configs/config.json" -d -p 34904:34904 --name layotto layotto/layotto start ``` -Of course, you can also run Layotto and other systems (such as Redis) at the same time via docker-compose. Refer to the [Quick start](start/state/start?id=step-1-deploy-redis-and-layotto) +Of course, you can also run Layotto and other systems (such as Redis) at the same time via docker-compose. Refer to the [Quick start](en/start/state/start?id=step-1-deploy-redis-and-layotto) ### Deploy on Kubernetes @@ -51,7 +51,7 @@ The principle of this script is to replace the binary file in the MOSN proxyv2 i You can prepare your own image and K8s configuration file, then deploy Layotto via Kubernetes. -We are working on the official Layotto image and the solution for deploying to Kubernetes using Helm, so feel free to join us to build it. More details in `` +We are working on the official Layotto image and the solution for deploying to Kubernetes using Helm, so feel free to join us to build it. More details in ## 2.Toggle existing MOSN to Layotto for MOSN users diff --git a/docs/docs/operation/sidecar_injector.md b/docs/en/operation/sidecar_injector.md similarity index 100% rename from docs/docs/operation/sidecar_injector.md rename to docs/en/operation/sidecar_injector.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/sdk_reference/go/start.md b/docs/en/sdk_reference/go/start.md similarity index 97% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/sdk_reference/go/start.md rename to docs/en/sdk_reference/go/start.md index 0ce299e4a6..ddc2551d9c 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/sdk_reference/go/start.md +++ b/docs/en/sdk_reference/go/start.md @@ -66,7 +66,7 @@ func main() { Start Layotto and test the HelloWorld program above by using the simplest configuration file, the content is as follows: -> For a more detailed introduction to configuration files, please refer to [configuration](configuration/overview.md). +> For a more detailed introduction to configuration files, please refer to [configuration](en/configuration/overview.md). ```json { @@ -141,7 +141,7 @@ NewClientWithConnection(conn *grpc.ClientConn) Client ## Experience other interface functions -Taking the distributed id `sequencer` as an example, use the 'redis' type. Please refer to this [document](component_specs/sequencer/redis. md) for relevant parameters usage. +Taking the distributed id `sequencer` as an example, use the 'redis' type. Please refer to this [document](en/component_specs/sequencer/redis. md) for relevant parameters usage. Please refer to `demo/sequencer/common/client.go` for specific code configuration, as follows: @@ -258,7 +258,7 @@ Currently, go-sdk only encapsulates GRPC with a thin layer, so for interfaces th Here, take the `local` component type in the `file` interface as an example. -You can view the proto files in [`spec/proto/runtime`](https://github.com/mosn/layotto/tree/main/spec/proto/runtime/v1) or the [GRPC API docs](api_reference/README.md) +You can view the proto files in [`spec/proto/runtime`](https://github.com/mosn/layotto/tree/main/spec/proto/runtime/v1) or the [GRPC API docs](en/api_reference/README.md) The complete code reference is `demo/file/local/client.go`, and the content is as follows: @@ -344,6 +344,6 @@ func main() { ## More Examples -For other SDK interfaces, please refer to the code examples in the [demo directory](https://github.com/mosn/layotto/tree/main/demo) and [quick start startup document](start/state/state.md) +For other SDK interfaces, please refer to the code examples in the [demo directory](https://github.com/mosn/layotto/tree/main/demo) and [quick start startup document](en/start/state/state.md) -Refer to the [configs example](https://github.com/mosn/layotto/tree/main/configs) for writing relevant configuration files and [Component Configuration Document](configuration/overview.md) \ No newline at end of file +Refer to the [configs example](https://github.com/mosn/layotto/tree/main/configs) for writing relevant configuration files and [Component Configuration Document](en/configuration/overview.md) \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/actuator/start.md b/docs/en/start/actuator/start.md similarity index 98% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/actuator/start.md rename to docs/en/start/actuator/start.md index 70198c3997..33153eb6c7 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/actuator/start.md +++ b/docs/en/start/actuator/start.md @@ -165,4 +165,4 @@ If you are implementing your own Layotto component, you can add health check cap ### How it works -If you are interested in the implementation principle, or want to extend some functions in Actuator, you can read [Actuator's design document](design/actuator/actuator-design-doc.md) \ No newline at end of file +If you are interested in the implementation principle, or want to extend some functions in Actuator, you can read [Actuator's design document](en/design/actuator/actuator-design-doc.md) \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/api_plugin/generate.md b/docs/en/start/api_plugin/generate.md similarity index 92% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/api_plugin/generate.md rename to docs/en/start/api_plugin/generate.md index 3587aa62aa..9da10dc2d6 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/api_plugin/generate.md +++ b/docs/en/start/api_plugin/generate.md @@ -9,7 +9,7 @@ Writing the API plugin yourself is boring. You can use Layotto's code generator > > The code of in-tree plugins is located in the layotto repo, while the code of out-of-tree plugins can be placed in your own repo outside the layotto repo. > -> **This guide will show you how to generate out-of-tree plugins**. If you want to generate in-tree plugins, see [the other doc](api_reference/how_to_generate_api_doc) for help. +> **This guide will show you how to generate out-of-tree plugins**. If you want to generate in-tree plugins, see [the other doc](en/api_reference/how_to_generate_api_doc) for help. Let's say you want to add a `PublishTransactionalMessage` method to the existing pubsub API. You write a new proto file `cmd/layotto_multiple_api/advanced_queue/advanced_queue.proto`: @@ -55,6 +55,6 @@ Fix the path error and then you can register this API plugin in your `main`. ## Reference -[How to generate code and documentation from the .proto files](api_reference/how_to_generate_api_doc) +[How to generate code and documentation from the .proto files](en/api_reference/how_to_generate_api_doc) [protoc-gen-p6](https://github.com/layotto/protoc-gen-p6) \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/api_plugin/helloworld.md b/docs/en/start/api_plugin/helloworld.md similarity index 94% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/api_plugin/helloworld.md rename to docs/en/start/api_plugin/helloworld.md index bf36e1389e..bf4c1c5e22 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/api_plugin/helloworld.md +++ b/docs/en/start/api_plugin/helloworld.md @@ -58,4 +58,4 @@ This message is the response of the helloworld API you just registered in step 1 ## Next You can refer to the demo code to implement your own API. Have a try ! -For more details,you can refer to the [design doc](design/api_plugin/design.md) \ No newline at end of file +For more details,you can refer to the [design doc](zh/design/api_plugin/design.md) \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/configuration/overview.md b/docs/en/start/configuration/overview.md similarity index 90% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/configuration/overview.md rename to docs/en/start/configuration/overview.md index c92d7f6242..e5d130934f 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/configuration/overview.md +++ b/docs/en/start/configuration/overview.md @@ -20,6 +20,6 @@ A: Configuration has some special capabilities, such as sidecar caching, such as This is like the difference between the configuration center and the database, both are storage, but the former is domain-specific and has special functions ## Quick start -- [Use Apollo as Configuration Center](start/configuration/start-apollo.md) -- [Use Etcd as Configuration Center](start/configuration/start.md) -- [Use Nacos as Configuration Center](start/configuration/start-nacos.md) \ No newline at end of file +- [Use Apollo as Configuration Center](en/start/configuration/start-apollo.md) +- [Use Etcd as Configuration Center](en/start/configuration/start.md) +- [Use Nacos as Configuration Center](en/start/configuration/start-nacos.md) \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/configuration/start-apollo.md b/docs/en/start/configuration/start-apollo.md similarity index 97% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/configuration/start-apollo.md rename to docs/en/start/configuration/start-apollo.md index 781a3576f1..01d4b60ec9 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/configuration/start-apollo.md +++ b/docs/en/start/configuration/start-apollo.md @@ -3,7 +3,7 @@ This example shows how to add, delete, modify, and watch the [apollo configurati The architecture of this example is shown in the figure below. The processes started are: client APP, Layotto, Apollo server -![img.png](/img/configuration/apollo/arch.png) +![img.png](../../../img/configuration/apollo/arch.png) ## Step 1.Deploy Apollo (optional) @@ -39,7 +39,7 @@ After success, a new layotto file will be generated in the directory. Let's run > >A: With the default configuration, Layotto will connect to apollo's demo server, but the configuration in that demo server may be modified by others. So the error may be because some configuration has been modified. > -> In this case, you can try other demos, such as [the etcd demo](start/configuration/start.md) +> In this case, you can try other demos, such as [the etcd demo](en/start/configuration/start.md) ## Step 3. Run the client demo diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/configuration/start-nacos.md b/docs/en/start/configuration/start-nacos.md similarity index 97% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/configuration/start-nacos.md rename to docs/en/start/configuration/start-nacos.md index 3bce31a88b..131df84455 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/configuration/start-nacos.md +++ b/docs/en/start/configuration/start-nacos.md @@ -4,7 +4,7 @@ TThis example shows how to add, delete, modify, and watch the [nacos configurati The architecture of this example is shown in the figure below. The processes started are: client APP, Layotto, Nacos server -![](/img/configuration/nacos/layotto-nacos-configstore-component.png) +![](../../../img/configuration/nacos/layotto-nacos-configstore-component.png) [Then config file](https://github.com/mosn/layotto/blob/main/configs/config_nacos.json) claims `nacos` in the `config_store` section, but users can change it to other configuration center they want (currently only support nacos and nacos). ## Deploy Nacos and Layotto diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/configuration/start.md b/docs/en/start/configuration/start.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/configuration/start.md rename to docs/en/start/configuration/start.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/cryption/start.md b/docs/en/start/cryption/start.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/cryption/start.md rename to docs/en/start/cryption/start.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/delay_queue/start.md b/docs/en/start/delay_queue/start.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/delay_queue/start.md rename to docs/en/start/delay_queue/start.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/email/start.md b/docs/en/start/email/start.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/email/start.md rename to docs/en/start/email/start.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/faas/start.md b/docs/en/start/faas/start.md similarity index 94% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/faas/start.md rename to docs/en/start/faas/start.md index b2045aafa3..8ade1f9d0a 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/faas/start.md +++ b/docs/en/start/faas/start.md @@ -1,10 +1,10 @@ -# FaaS QuickStart +## FaaS QuickStart -## 1. Features +### 1. Features Layotto supports loading and running functions in the form of wasm, and supports calling each other between functions and accessing infrastructure, such as Redis. -Detailed design documents can refer to:[FaaS design](design/faas/faas-poc-design.md) +Detailed design documents can refer to:[FaaS design](en/design/faas/faas-poc-design.md) ### 2. Dependent software @@ -19,7 +19,7 @@ The following software needs to be installed to run this demo: Follow the instructions on the official website. 3. [virtualbox](https://www.oracle.com/virtualization/technologies/vm/virtualbox.html) - + Download the installation package from the official website and install it. You can also use [homebrew](https://brew.sh/) to install it on mac. If the startup fails after installation, please refer to [The host-only adapter we just created is not visible](https://github.com/kubernetes/minikube/issues/3614). @@ -145,7 +145,7 @@ There are 100 inventories for book1. ### 5. Process introduction -![img.png](/img/faas/faas-request-process.jpg) +![img.png](../../../img/faas/faas-request-process.jpg) 1. send http request to func1 2. func1 calls func2 through Runtime ABI @@ -156,7 +156,7 @@ There are 100 inventories for book1. 1. Virtualbox failed to start, "The host-only adapter we just created is not visible": - refer [The host-only adapter we just created is not visible](https://github.com/kubernetes/minikube/issues/3614) + refer [The host-only adapter we just created is not visible](https://github.com/kubernetes/minikube/issues/3614) 2. When Layotto is started, the redis connection fails, and "occurs an error: redis store: error connecting to redis at" is printed: diff --git a/docs/en/start/istio/README.md b/docs/en/start/istio/README.md new file mode 100644 index 0000000000..68be20b05b --- /dev/null +++ b/docs/en/start/istio/README.md @@ -0,0 +1,7 @@ +# Demo of Istio 1.10.6 integration + +The latest version of Layotto integrates Istio 1.10.6. You can manage the traffic of Layotto (data plane) using Istio (control plane). + +You can experience integrating Istio 1.10.6 in [Online Lab](en/start/lab.md) + +For more details, see ["Deploying Layotto using Istio"](en/operation/?id=option-1-deploy-using-istio) \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/istio/start.md b/docs/en/start/istio/start.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/istio/start.md rename to docs/en/start/istio/start.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/lab.md b/docs/en/start/lab.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/lab.md rename to docs/en/start/lab.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/lifecycle/start.md b/docs/en/start/lifecycle/start.md similarity index 98% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/lifecycle/start.md rename to docs/en/start/lifecycle/start.md index c8f5fd0dc9..dbedb4a97f 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/lifecycle/start.md +++ b/docs/en/start/lifecycle/start.md @@ -128,7 +128,7 @@ Explore other Quickstarts through the navigation bar on the left. [API Reference](https://mosn.io/layotto/api/v1/runtime.html) -[Design doc](design/lifecycle/apply_configuration) +[Design doc](zh/design/lifecycle/apply_configuration) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/lock/start.md b/docs/en/start/lock/start.md similarity index 97% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/lock/start.md rename to docs/en/start/lock/start.md index 360adfe04e..f0de2c3e7c 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/lock/start.md +++ b/docs/en/start/lock/start.md @@ -4,7 +4,7 @@ This example shows how to call redis through Layotto to trylock/unlock. The architecture of this example is shown in the figure below, and the started processes are: redis, Layotto, a client program with two goroutines trying the same lock concurrently. -![img.png](/img/lock/img.png) +![img.png](../../../img/lock/img.png) ## step 1. Deploy Redis and Layotto @@ -41,7 +41,7 @@ Use the following command to check if redis is installed: docker images ``` -![img.png](/img/mq/start/img.png) +![img.png](../../../img/mq/start/img.png) 3. Run the container @@ -159,4 +159,4 @@ Explore other Quickstarts through the navigation bar on the left. ### Understand the design principle of Distributed Lock API -If you are interested in the design principle, or want to extend some functions, you can read [Distributed Lock API design document](design/lock/lock-api-design.md) \ No newline at end of file +If you are interested in the design principle, or want to extend some functions, you can read [Distributed Lock API design document](en/design/lock/lock-api-design.md) \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/network_filter/tcpcopy.md b/docs/en/start/network_filter/tcpcopy.md similarity index 84% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/network_filter/tcpcopy.md rename to docs/en/start/network_filter/tcpcopy.md index 5ca17897d1..4e51266c08 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/network_filter/tcpcopy.md +++ b/docs/en/start/network_filter/tcpcopy.md @@ -2,10 +2,9 @@ ## Introduction -When you run the demo according to the quick-start document [Configuration demo with apollo](start/configuration/start-apollo.md), you may notice that there is such a configuration in the configuration file config_apollo.json: +When you run the demo according to the quick-start document [Configuration demo with apollo](en/start/configuration/start-apollo.md), you may notice that there is such a configuration in the configuration file config_apollo.json: ```json - { "type": "tcpcopy", "config": { @@ -17,16 +16,15 @@ When you run the demo according to the quick-start document [Configuration demo "mem_max_rate": 80 } } - ``` The meaning of this configuration is to load the tcpcopy plug-in at startup to dump the tcp traffic. After enabling this configuration, when Layotto receives a request and the conditions for traffic dump are met, it will write the binary request data to the local file system. -The "dumped" binary traffic data will be stored in the `${user's home directory}/logs/mosn` directory, or under the /home/admin/logs/mosn directory: +The "dumped" binary traffic data will be stored in the ${user's home directory}/logs/mosn directory, or under the /home/admin/logs/mosn directory: -![img.png](/img/tcp_dump.png) +![img.png](../../../img/tcp_dump.png) You can use these data in combination with other tools and infrastructure to do something cool, such as traffic playback, bypass verification, etc. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/oss/start.md b/docs/en/start/oss/start.md similarity index 98% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/oss/start.md rename to docs/en/start/oss/start.md index 980fa34f0a..86bfca9920 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/oss/start.md +++ b/docs/en/start/oss/start.md @@ -147,7 +147,7 @@ Explore other Quickstarts through the navigation bar on the left. [API reference](https://mosn.io/layotto/api/v1/s3.html) -[Design doc of ObjectStorageService API ](design/oss/design) +[Design doc of ObjectStorageService API ](zh/design/oss/design) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/phone/start.md b/docs/en/start/phone/start.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/phone/start.md rename to docs/en/start/phone/start.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/pubsub/start.md b/docs/en/start/pubsub/start.md similarity index 98% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/pubsub/start.md rename to docs/en/start/pubsub/start.md index fdf63cbed8..1670fb4f08 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/pubsub/start.md +++ b/docs/en/start/pubsub/start.md @@ -11,7 +11,7 @@ This example shows how to call redis through Layotto to publish/subscribe messag The architecture of this example is shown in the figure below. The running processes are: redis, a Subscriber program that listens to events, Layotto, and a Publisher program that publishes events. -![img_1.png](/img/mq/start/img_1.png) +![img_1.png](../../../img/mq/start/img_1.png) ### Step 1. Start the Subscriber @@ -210,4 +210,4 @@ Explore other Quickstarts through the navigation bar on the left. #### Understand the principle of Pub/Sub API implementation -If you are interested in the implementation principle, or want to extend some functions, you can read [Pub/Sub API design document](design/pubsub/pubsub-api-and-compability-with-dapr-component.md) +If you are interested in the implementation principle, or want to extend some functions, you can read [Pub/Sub API design document](en/design/pubsub/pubsub-api-and-compability-with-dapr-component.md) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/rpc/dubbo_json_rpc.md b/docs/en/start/rpc/dubbo_json_rpc.md similarity index 86% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/rpc/dubbo_json_rpc.md rename to docs/en/start/rpc/dubbo_json_rpc.md index 5a52cfa88e..ba69391288 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/rpc/dubbo_json_rpc.md +++ b/docs/en/start/rpc/dubbo_json_rpc.md @@ -3,7 +3,7 @@ ## Quick Start ### step 1. Edit config file,add `dubbo_json_rpc` filter -![jsonrpc.jpg](/img/rpc/jsonrpc.jpg) +![jsonrpc.jpg](../../../img/rpc/jsonrpc.jpg) ### step 2. Compile and start layotto @@ -54,8 +54,8 @@ Start dubbo server: go run demo/rpc/dubbo_json_rpc/dubbo_json_client/client.go -d '{"jsonrpc":"2.0","method":"GetUser","params":["A003"],"id":9527}' ``` -![jsonrpc.jpg](/img/rpc/jsonrpcresult.jpg) +![jsonrpc.jpg](../../../img/rpc/jsonrpcresult.jpg) ## Next Step -If you are interested in the implementation principle, or want to extend some functions, you can read [RPC design document](design/rpc/rpc-design-doc.md) +If you are interested in the implementation principle, or want to extend some functions, you can read [RPC design document](en/design/rpc/rpc-design-doc.md) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/rpc/helloworld.md b/docs/en/start/rpc/helloworld.md similarity index 95% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/rpc/helloworld.md rename to docs/en/start/rpc/helloworld.md index d83a4db834..5a5497d2e6 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/rpc/helloworld.md +++ b/docs/en/start/rpc/helloworld.md @@ -37,7 +37,7 @@ go run ${project_path}/demo/rpc/http/echoserver/echoserver.go go run ${project_path}/demo/rpc/http/echoclient/echoclient.go -d 'hello layotto' ``` -![rpchello.png](/img/rpc/rpchello.png) +![rpchello.png](../../../img/rpc/rpchello.png) ## Explanation diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/secret/secret_ref.md b/docs/en/start/secret/secret_ref.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/secret/secret_ref.md rename to docs/en/start/secret/secret_ref.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/secret/start.md b/docs/en/start/secret/start.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/secret/start.md rename to docs/en/start/secret/start.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/sequencer/start.md b/docs/en/start/sequencer/start.md similarity index 96% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/sequencer/start.md rename to docs/en/start/sequencer/start.md index 70d51042f4..6870230653 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/sequencer/start.md +++ b/docs/en/start/sequencer/start.md @@ -10,7 +10,7 @@ This example shows how to call Etcd through Layotto to generate a distributed un The architecture of this example is shown in the figure below, and the processes started are: Etcd, Layotto, and client programs -![img.png](/img/sequencer/etcd/img.png) +![img.png](../../../img/sequencer/etcd/img.png) ### step 1. Deploy etcd and Layotto #### **With Docker Compose** @@ -174,7 +174,7 @@ In fact, sdk is only a very thin package for grpc, using sdk is about equal to d #### Want to learn more about Sequencer API? What does the Sequencer API do, what problems it solves, and in what scenarios should I use it? -If you are confused and want to know more details about the use of Sequencer API, you can read [Sequencer API Usage Document](api_reference/sequencer/reference) +If you are confused and want to know more details about the use of Sequencer API, you can read [Sequencer API Usage Document](en/api_reference/sequencer/reference) #### Details later, let's continue to experience other APIs Explore other Quickstarts through the navigation bar on the left. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/sms/start.md b/docs/en/start/sms/start.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/sms/start.md rename to docs/en/start/sms/start.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/state/start.md b/docs/en/start/state/start.md similarity index 96% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/state/start.md rename to docs/en/start/state/start.md index fa2a15ee46..a54113e73d 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/state/start.md +++ b/docs/en/start/state/start.md @@ -9,7 +9,7 @@ This example shows how to call redis through Layotto to add, delete, modify and The architecture of this example is shown in the figure below, and the started processes are: redis, Layotto, client program -![img.png](/img/state/img.png) +![img.png](../../../img/state/img.png) ### step 1. Deploy Redis and Layotto @@ -46,7 +46,7 @@ Use the following command to check if redis is installed: docker images ``` -![img.png](/img/mq/start/img.png) +![img.png](../../../img/mq/start/img.png) 3. Run the container @@ -183,7 +183,7 @@ In fact, sdk is only a very thin package for grpc, using sdk is about equal to d #### Want to learn more about State API? What does the State API do, what problems it solves, and in what scenarios should I use it? -If you have such confusion and want to know more details about State API, you can read [State API Usage Document](building_blocks/state/reference.md) +If you have such confusion and want to know more details about State API, you can read [State API Usage Document](zh/api_reference/state/reference) #### Details later, let's continue to experience other APIs Explore other Quickstarts through the navigation bar on the left. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/stream_filter/flow_control.md b/docs/en/start/stream_filter/flow_control.md similarity index 94% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/stream_filter/flow_control.md rename to docs/en/start/stream_filter/flow_control.md index b71ab961a4..0e088f095a 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/stream_filter/flow_control.md +++ b/docs/en/start/stream_filter/flow_control.md @@ -1,4 +1,4 @@ -[查看中文版本](start/stream_filter/flow_control.md) +[查看中文版本](zh/start/stream_filter/flow_control.md) ## Method Level Flow Control @@ -29,7 +29,7 @@ this can help `/spec.proto.runtime.v1.Runtime/SayHello` method has a flow contro this code of the client is here [client.go](https://github.com/mosn/layotto/blob/main/demo/flowcontrol/client.go),the logic is very simple, send 10 times request to the server,and the result is below: -![img.png](/img/flow_control.png) +![img.png](../../../img/flow_control.png) the previous 5 times request access is succeed while the last 5 times request is under control. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/trace/prometheus.md b/docs/en/start/trace/prometheus.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/trace/prometheus.md rename to docs/en/start/trace/prometheus.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/trace/skywalking.md b/docs/en/start/trace/skywalking.md similarity index 98% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/trace/skywalking.md rename to docs/en/start/trace/skywalking.md index 51670ccf48..9d4beb8368 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/trace/skywalking.md +++ b/docs/en/start/trace/skywalking.md @@ -86,7 +86,7 @@ Run the demo client: Access http://127.0.0.1:8080 -![](/img/trace/sky.png) +![](../../../img/trace/sky.png) ## Release resources If you run Layotto with docker, remember to shut it down: diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/trace/trace.md b/docs/en/start/trace/trace.md similarity index 97% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/trace/trace.md rename to docs/en/start/trace/trace.md index 688f8224ca..9524980ee3 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/trace/trace.md +++ b/docs/en/start/trace/trace.md @@ -50,7 +50,7 @@ The corresponding client demo is in [client.go](https://github.com/mosn/layotto/ Check the log of layotto, you will see the detailed tracking log printed out: -![img.png](/img/trace/trace.png) +![img.png](../../../img/trace/trace.png) ### Configuration parameter description @@ -79,7 +79,7 @@ The interceptor will start tracing every time the grpc method is called, generat Overall diagram of the tracing framework: -![img.png](/img/trace/structure.png) +![img.png](../../../img/trace/structure.png) #### Span structure: @@ -150,7 +150,7 @@ trace.SetExtraComponentInfo(ctx, fmt.Sprintf("method: %+v, store: %+v", "Get", " The results printed by trace are as follows: -![img.png](/img/trace/trace.png) +![img.png](../../../img/trace/trace.png) ## 2. Metrics @@ -162,6 +162,6 @@ curl --location --request GET 'http://127.0.0.1:34903/metrics' The result is shown below: -![img.png](/img/trace/metric.png) +![img.png](../../../img/trace/metric.png) For the metric principle of mosn, please refer to [mosn official document](https://mosn.io/blog/code/mosn-log/) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/wasm/start.md b/docs/en/start/wasm/start.md similarity index 89% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/wasm/start.md rename to docs/en/start/wasm/start.md index 3bba3001f9..22a69cf992 100644 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/wasm/start.md +++ b/docs/en/start/wasm/start.md @@ -1,4 +1,3 @@ -# Run business logic in Layotto using WASM ## Run business logic in Layotto using WASM ### What is WASM on Layotto? @@ -6,11 +5,11 @@ The sidecar of service mesh and multi-runtime is a common infrastructure for the For example, a business system has developed an SDK in the form of a jar package for use by other business systems. Their features are not universal to the entire company, so they cannot persuade the middleware team to develop them into the company's unified sidecar. -![img_1.png](/img/wasm/img_1.png) +![img_1.png](../../../img/wasm/img_1.png) And if it becomes like this: -![img.png](/img/wasm/img.png) +![img.png](../../../img/wasm/img.png) If developers no longer develop sdk (jar package), change to develop .wasm files and support independent upgrade and deployment, there will be no pain to push the users to upgrade. @@ -101,26 +100,24 @@ docker rm -f redis-test We can specify the WASM file to be loaded in `./demo/faas/config.json` config file: ```json - "config": { -"function1": { -"name": "function1", -"instance_num": 1, -"vm_config": { -"engine": "wasmtime", -"path": "demo/faas/code/golang/client/function_1.wasm" -} -}, -"function2": { -"name": "function2", -"instance_num": 1, -"vm_config": { -"engine": "wasmtime", -"path": "demo/faas/code/golang/server/function_2.wasm" -} + "function1": { + "name": "function1", + "instance_num": 1, + "vm_config": { + "engine": "wasmtime", + "path": "demo/faas/code/golang/client/function_1.wasm" + } + }, + "function2": { + "name": "function2", + "instance_num": 1, + "vm_config": { + "engine": "wasmtime", + "path": "demo/faas/code/golang/server/function_2.wasm" + } + } } -} - ``` tip: we also support wasmer as the engine value in vm_config. diff --git a/docs/i18n/en-US/code.json b/docs/i18n/en-US/code.json deleted file mode 100644 index 77e305f432..0000000000 --- a/docs/i18n/en-US/code.json +++ /dev/null @@ -1,420 +0,0 @@ -{ - "theme.ErrorPageContent.title": { - "message": "page crashed", - "description": "The title of the fallback page when the page crashed" - }, - "theme.BackToTopButton.buttonAriaLabel": { - "message": "回到顶部", - "description": "The ARIA label for the back to top button" - }, - "theme.blog.paginator.navAriaLabel": { - "message": "博文列表分页导航", - "description": "The ARIA label for the blog pagination" - }, - "theme.blog.paginator.newerEntries": { - "message": "较新的博文", - "description": "The label used to navigate to the newer blog posts page (previous page)" - }, - "theme.blog.paginator.olderEntries": { - "message": "较旧的博文", - "description": "The label used to navigate to the older blog posts page (next page)" - }, - "theme.blog.archive.title": { - "message": "历史博文", - "description": "The page & hero title of the blog archive page" - }, - "theme.blog.archive.description": { - "message": "历史博文", - "description": "The page & hero description of the blog archive page" - }, - "theme.blog.post.paginator.navAriaLabel": { - "message": "博文分页导航", - "description": "The ARIA label for the blog posts pagination" - }, - "theme.blog.post.paginator.newerPost": { - "message": "The new post", - "description": "The blog post button label to navigate to the newer/previous post" - }, - "theme.blog.post.paginator.olderPost": { - "message": "The old post", - "description": "The blog post button label to navigate to the older/next post" - }, - "theme.blog.post.plurals": { - "message": "{count} Post", - "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" - }, - "theme.blog.tagTitle": { - "message": "{nPosts} 含有标签「{tagName}」", - "description": "The title of the page for a blog tag" - }, - "theme.tags.tagsPageLink": { - "message": "查看所有标签", - "description": "The label of the link targeting the tag list page" - }, - "theme.colorToggle.ariaLabel": { - "message": "切换浅色/暗黑模式(当前为{mode})", - "description": "The ARIA label for the navbar color mode toggle" - }, - "theme.colorToggle.ariaLabel.mode.dark": { - "message": "暗黑模式", - "description": "The name for the dark color mode" - }, - "theme.colorToggle.ariaLabel.mode.light": { - "message": "浅色模式", - "description": "The name for the light color mode" - }, - "theme.docs.DocCard.categoryDescription.plurals": { - "message": "{count} 个项目", - "description": "The default description for a category card in the generated index about how many items this category includes" - }, - "theme.docs.breadcrumbs.navAriaLabel": { - "message": "页面路径", - "description": "The ARIA label for the breadcrumbs" - }, - "theme.docs.paginator.navAriaLabel": { - "message": "文件选项卡", - "description": "The ARIA label for the docs pagination" - }, - "theme.docs.paginator.previous": { - "message": "pre page", - "description": "The label used to navigate to the previous doc" - }, - "theme.docs.paginator.next": { - "message": "next page", - "description": "The label used to navigate to the next doc" - }, - "theme.docs.tagDocListPageTitle.nDocsTagged": { - "message": "{count} 篇文档带有标签", - "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" - }, - "theme.docs.tagDocListPageTitle": { - "message": "{nDocsTagged}「{tagName}」", - "description": "The title of the page for a docs tag" - }, - "theme.docs.versionBadge.label": { - "message": "版本:{versionLabel}" - }, - "theme.docs.versions.unreleasedVersionLabel": { - "message": "此为 {siteTitle} {versionLabel} 版尚未发行的文档。", - "description": "The label used to tell the user that he's browsing an unreleased doc version" - }, - "theme.docs.versions.unmaintainedVersionLabel": { - "message": "此为 {siteTitle} {versionLabel} 版的文档,现已不再积极维护。", - "description": "The label used to tell the user that he's browsing an unmaintained doc version" - }, - "theme.docs.versions.latestVersionSuggestionLabel": { - "message": "最新的文档请参阅 {latestVersionLink} ({versionLabel})。", - "description": "The label used to tell the user to check the latest version" - }, - "theme.docs.versions.latestVersionLinkLabel": { - "message": "latest version", - "description": "The label used for the latest version suggestion link label" - }, - "theme.common.headingLinkTitle": { - "message": "{heading}的直接链接", - "description": "Title for link to heading" - }, - "theme.common.editThisPage": { - "message": "Edit this page", - "description": "The link label to edit the current page" - }, - "theme.lastUpdated.atDate": { - "message": "于 {date} ", - "description": "The words used to describe on which date a page has been last updated" - }, - "theme.lastUpdated.byUser": { - "message": "由 {user} ", - "description": "The words used to describe by who the page has been last updated" - }, - "theme.lastUpdated.lastUpdatedAtBy": { - "message": "最后{byUser}{atDate}更新", - "description": "The sentence used to display when a page has been last updated, and by who" - }, - "theme.navbar.mobileVersionsDropdown.label": { - "message": "选择版本", - "description": "The label for the navbar versions dropdown on mobile view" - }, - "theme.NotFound.title": { - "message": "404 page", - "description": "The title of the 404 page" - }, - "theme.tags.tagsListLabel": { - "message": "tag:", - "description": "The label alongside a tag list" - }, - "theme.AnnouncementBar.closeButtonAriaLabel": { - "message": "关闭", - "description": "The ARIA label for close button of announcement bar" - }, - "theme.admonition.caution": { - "message": "warn", - "description": "The default label used for the Caution admonition (:::caution)" - }, - "theme.admonition.danger": { - "message": "danger", - "description": "The default label used for the Danger admonition (:::danger)" - }, - "theme.admonition.info": { - "message": "info", - "description": "The default label used for the Info admonition (:::info)" - }, - "theme.admonition.note": { - "message": "note", - "description": "The default label used for the Note admonition (:::note)" - }, - "theme.admonition.tip": { - "message": "tip", - "description": "The default label used for the Tip admonition (:::tip)" - }, - "theme.admonition.warning": { - "message": "注意", - "description": "The default label used for the Warning admonition (:::warning)" - }, - "theme.blog.sidebar.navAriaLabel": { - "message": "最近博文导航", - "description": "The ARIA label for recent posts in the blog sidebar" - }, - "theme.CodeBlock.copied": { - "message": "复制成功", - "description": "The copied button label on code blocks" - }, - "theme.CodeBlock.copyButtonAriaLabel": { - "message": "复制代码到剪贴板", - "description": "The ARIA label for copy code blocks button" - }, - "theme.CodeBlock.copy": { - "message": "复制", - "description": "The copy button label on code blocks" - }, - "theme.CodeBlock.wordWrapToggle": { - "message": "切换自动换行", - "description": "The title attribute for toggle word wrapping button of code block lines" - }, - "theme.DocSidebarItem.expandCategoryAriaLabel": { - "message": "展开侧边栏分类 '{label}'", - "description": "The ARIA label to expand the sidebar category" - }, - "theme.DocSidebarItem.collapseCategoryAriaLabel": { - "message": "折叠侧边栏分类 '{label}'", - "description": "The ARIA label to collapse the sidebar category" - }, - "theme.NavBar.navAriaLabel": { - "message": "主导航", - "description": "The ARIA label for the main navigation" - }, - "theme.navbar.mobileLanguageDropdown.label": { - "message": "选择语言", - "description": "The label for the mobile language switcher dropdown" - }, - "theme.NotFound.p1": { - "message": "我们找不到您要找的页面。", - "description": "The first paragraph of the 404 page" - }, - "theme.NotFound.p2": { - "message": "请联系原始链接来源网站的所有者,并告知他们链接已损坏。", - "description": "The 2nd paragraph of the 404 page" - }, - "theme.TOCCollapsible.toggleButtonLabel": { - "message": "Overview", - "description": "The label used by the button on the collapsible TOC component" - }, - "theme.blog.post.readingTime.plurals": { - "message": "Read will take {readingTime} min", - "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" - }, - "theme.blog.post.readMore": { - "message": "Read More", - "description": "The label used in blog post item excerpts to link to full blog posts" - }, - "theme.blog.post.readMoreLabel": { - "message": "Read {title} ", - "description": "The ARIA label for the link to full blog posts from excerpts" - }, - "theme.docs.breadcrumbs.home": { - "message": "Home Page", - "description": "The ARIA label for the home page in the breadcrumbs" - }, - "theme.docs.sidebar.collapseButtonTitle": { - "message": "收起侧边栏", - "description": "The title attribute for collapse button of doc sidebar" - }, - "theme.docs.sidebar.collapseButtonAriaLabel": { - "message": "收起侧边栏", - "description": "The title attribute for collapse button of doc sidebar" - }, - "theme.docs.sidebar.navAriaLabel": { - "message": "文档侧边栏", - "description": "The ARIA label for the sidebar navigation" - }, - "theme.docs.sidebar.closeSidebarButtonAriaLabel": { - "message": "关闭导航栏", - "description": "The ARIA label for close button of mobile sidebar" - }, - "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { - "message": "切换导航栏", - "description": "The ARIA label for hamburger menu button of mobile navigation" - }, - "theme.docs.sidebar.expandButtonTitle": { - "message": "展开侧边栏", - "description": "The ARIA label and title attribute for expand button of doc sidebar" - }, - "theme.docs.sidebar.expandButtonAriaLabel": { - "message": "展开侧边栏", - "description": "The ARIA label and title attribute for expand button of doc sidebar" - }, - "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { - "message": "← 回到主菜单", - "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" - }, - "theme.ErrorPageContent.tryAgain": { - "message": "重试", - "description": "The label of the button to try again rendering when the React error boundary captures an error" - }, - "theme.common.skipToMainContent": { - "message": "跳到主要内容", - "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" - }, - "theme.tags.tagsPageTitle": { - "message": "Tag", - "description": "The title of the tag list page" - }, - "theme.unlistedContent.title": { - "message": "Unlisted", - "description": "The unlisted content banner title" - }, - "theme.unlistedContent.message": { - "message": "此页面未列出。搜索引擎不会对其索引,只有拥有直接链接的用户才能访问。", - "description": "The unlisted content banner message" - }, - "theme.SearchBar.seeAll": { - "message": "See all {count} results" - }, - "theme.SearchPage.documentsFound.plurals": { - "message": "One document found|{count} documents found", - "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" - }, - "theme.SearchPage.existingResultsTitle": { - "message": "Search results for \"{query}\"", - "description": "The search page title for non-empty query" - }, - "theme.SearchPage.emptyResultsTitle": { - "message": "Search the documentation", - "description": "The search page title for empty query" - }, - "theme.SearchPage.inputPlaceholder": { - "message": "Type your search here", - "description": "The placeholder for search page input" - }, - "theme.SearchPage.inputLabel": { - "message": "Search", - "description": "The ARIA label for search page input" - }, - "theme.SearchPage.algoliaLabel": { - "message": "Search by Algolia", - "description": "The ARIA label for Algolia mention" - }, - "theme.SearchPage.noResultsText": { - "message": "No results were found", - "description": "The paragraph for empty search result" - }, - "theme.SearchPage.fetchingNewResults": { - "message": "Fetching new results...", - "description": "The paragraph for fetching new search results" - }, - "theme.SearchBar.label": { - "message": "Search", - "description": "The ARIA label and placeholder for search button" - }, - "theme.SearchModal.searchBox.resetButtonTitle": { - "message": "Clear the query", - "description": "The label and ARIA label for search box reset button" - }, - "theme.SearchModal.searchBox.cancelButtonText": { - "message": "Cancel", - "description": "The label and ARIA label for search box cancel button" - }, - "theme.SearchModal.startScreen.recentSearchesTitle": { - "message": "Recent", - "description": "The title for recent searches" - }, - "theme.SearchModal.startScreen.noRecentSearchesText": { - "message": "No recent searches", - "description": "The text when no recent searches" - }, - "theme.SearchModal.startScreen.saveRecentSearchButtonTitle": { - "message": "Save this search", - "description": "The label for save recent search button" - }, - "theme.SearchModal.startScreen.removeRecentSearchButtonTitle": { - "message": "Remove this search from history", - "description": "The label for remove recent search button" - }, - "theme.SearchModal.startScreen.favoriteSearchesTitle": { - "message": "Favorite", - "description": "The title for favorite searches" - }, - "theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle": { - "message": "Remove this search from favorites", - "description": "The label for remove favorite search button" - }, - "theme.SearchModal.errorScreen.titleText": { - "message": "Unable to fetch results", - "description": "The title for error screen of search modal" - }, - "theme.SearchModal.errorScreen.helpText": { - "message": "You might want to check your network connection.", - "description": "The help text for error screen of search modal" - }, - "theme.SearchModal.footer.selectText": { - "message": "to select", - "description": "The explanatory text of the action for the enter key" - }, - "theme.SearchModal.footer.selectKeyAriaLabel": { - "message": "Enter key", - "description": "The ARIA label for the Enter key button that makes the selection" - }, - "theme.SearchModal.footer.navigateText": { - "message": "to navigate", - "description": "The explanatory text of the action for the Arrow up and Arrow down key" - }, - "theme.SearchModal.footer.navigateUpKeyAriaLabel": { - "message": "Arrow up", - "description": "The ARIA label for the Arrow up key button that makes the navigation" - }, - "theme.SearchModal.footer.navigateDownKeyAriaLabel": { - "message": "Arrow down", - "description": "The ARIA label for the Arrow down key button that makes the navigation" - }, - "theme.SearchModal.footer.closeText": { - "message": "to close", - "description": "The explanatory text of the action for Escape key" - }, - "theme.SearchModal.footer.closeKeyAriaLabel": { - "message": "Escape key", - "description": "The ARIA label for the Escape key button that close the modal" - }, - "theme.SearchModal.footer.searchByText": { - "message": "Search by", - "description": "The text explain that the search is making by Algolia" - }, - "theme.SearchModal.noResultsScreen.noResultsText": { - "message": "No results for", - "description": "The text explains that there are no results for the following search" - }, - "theme.SearchModal.noResultsScreen.suggestedQueryText": { - "message": "Try searching for", - "description": "The text for the suggested query when no results are found for the following search" - }, - "theme.SearchModal.noResultsScreen.reportMissingResultsText": { - "message": "Believe this query should return results?", - "description": "The text for the question where the user thinks there are missing results" - }, - "theme.SearchModal.noResultsScreen.reportMissingResultsLinkText": { - "message": "Let us know.", - "description": "The text for the link to report missing results" - }, - "theme.SearchModal.placeholder": { - "message": "Search docs", - "description": "The placeholder of the input of the DocSearch pop-up modal" - } -} diff --git a/docs/i18n/en-US/docusaurus-plugin-content-blog/code/flowcontrol/flowcontrol_code_analyze.md b/docs/i18n/en-US/docusaurus-plugin-content-blog/code/flowcontrol/flowcontrol_code_analyze.md deleted file mode 100644 index 2751e4c5cd..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-blog/code/flowcontrol/flowcontrol_code_analyze.md +++ /dev/null @@ -1,80 +0,0 @@ -# Source Parsing 7 Layer Traffic Governance, Interface Limit - -> Author Profile: -> was a fester of an open source community committed to embracing open sources and hoping to interact with each other’s open-source enthusiasts for progress and growth. -> -> Writing Time: 20 April 2022 - -## Overview - -The purpose of this document is to analyze the implementation of the interface flow - -## Prerequisite: - -Document content refers to the following version of the code - -[https://github.com/mosn/mosn](https://github.com/mosn/mosn) - -Mosn d11b5a638a137045c2fb03d9d8ca36ecc0def11 (Division Develop) - -## Source analysis - -### Overall analysis - -Reference to
[https://mosn.io/docs/concept/extensions/](https://mosn.io/docs/concept/extensions/) - -Mosn Stream Filter Extension - -![01.png](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*tSn4SpIkAa4AAAAAAAAAAAAAARQnAQ) - -### Code in: [flowcontrol代码](https://github.com/mosn/mosn/tree/master/pkg/filter/stream/flowcontrol) - -### stream_filter_factory.go analysis - -This class is a factory class to create StreamFilter. - -Some constant values are defined for default values - -![02.png](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*PAWCTL6MS40AAAAAAAAAAAAAARQnAQ) - -Defines the restricted stream config class to load yaml definition and parse production corresponding functions - -![03.png](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*Ua32SokhILEAAAAAAAAAAAAAARQnAQ) - -init() Inner initialization is the storage of name and corresponding constructor to the filter blocking plant map - -![04.png](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*kb3qRqWnqxYAAAAAAAAAAAAAARQnAQ) - -Highlight createRpcFlowControlFilterFactory Production rpc Current Factory - -![05.png](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*u5rkS54zkgAAAAAAAAAAAAAAARQnAQ) - -Before looking at streamfilter, we see how factory classes are producing restricted streamers - -![06.png](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*cj0nT5O69OYAAAAAAAAAAAAAARQnAQ) - -Limit the streaming to the restricted stream chain structure to take effect in sequential order. - -CreateFilterChain method adds multiple filters to the link structure - -![07.png](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*a8ClQ76odpEAAAAAAAAAAAAAARQnAQ) - -We can see that this interface is achieved by a wide variety of plant types, including those that we are studying today. - -![08.png](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*sBDbT44r2vgAAAAAAAAAAAAAARQnAQ) - -### Stream_filter.go Analysis - -![09.png](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*wsw3RKe1GH8AAAAAAAAAAAAAARQnAQ) - -## Overall process: - -Finally, we look back at the overall process progress: - -1. Starting from the initialization function of stream_filter_factory.go, the program inserted createRpcFlowControlFilterFactory. - -2. Mosn created a filter chain (code position[factory.go](https://github.com/mosn/mosn/tree/master/pkg/streamfilter/factory.go)) by circulating CreateFilterChain to include all filters in the chain structure, including our master restricted streaming today. - -3. Create Limiter NewStreamFilter(). - -4. OnReceive() and eventually by sentinel (whether the threshold has been reached, whether to release traffic or stop traffic, StreamFilterStop or StreamFilterContinue). diff --git a/docs/i18n/en-US/docusaurus-plugin-content-blog/code/layotto-rpc/index.md b/docs/i18n/en-US/docusaurus-plugin-content-blog/code/layotto-rpc/index.md deleted file mode 100644 index 02dd0e66c0..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-blog/code/layotto-rpc/index.md +++ /dev/null @@ -1,946 +0,0 @@ -# Layotto Source Parsing — Processing RPC requests - -> This paper is based on the Dubbo Json RPC as an example of the Layotto RPC processing. -> -> by:[Wang Zhilong](https://github.com/rayowang) | 21April 2022 - -- [overview](#overview) -- [source analysis](#source analysis) - - [0x00 Layotto initialize RPC](#_0x00-layotto-initializ-rpc) - - [0x01 Dubbo-go-sample client to request request] (#_0x01-dubbo-go-sample-client-request request) - - [0x02 Mosn EventLoop Reader Processing Request Data](#_0x02-mosn-eventloop-read processing request) - - [0x03 Grpc Sever as NetworkFilter to process requests](#_0x03-grpc-sever as -networkfilter-process requests) - - [0x04 Layotto send RPC requests and write to Local Virtual Connections](#_0x04-layotto -rpc-request and write to -local-virtual connection) - - [0x05 Mosn reads Remote and executes Filter and Proxy Forwarding](#_0x05-mosn-read-remote-remote--and --filter-and proxy forward) - - [0x06 Dubbo-go-sample server received response to request return] (#_0x06-dubbo-go-sample-server-received response return) - - [0x07 Mosn Framework handles response and writes back to Remote Virtual Connections](#_0x07-mosn-Framework handles response and -remote-virtual connection) - - [0x08 Layotto receive RPC responses and read Local Virtual Connections](#_0x08-layotto-receive-rpc-response and read -local-virtual connection) - - [0x09 Grpc Sever processed data frames returned to client](#_0x09-grpc-sever processed frame returned to client) - - [0x10 Dubbo-go-sample client receiving response](#_0x10-dubbo-go-sample-client-receiving response) -- [summary](#summary) - -## General description - -Layotto has a clear and rich semiconductor API as a distributed prototype collection of prototype language distinguished from the network proxy service Mesh and using standard protocol API, which is part of the RPC API.Through RPC API app developers can interact with local Layotto instances of applications that also use the Sidecar architecture, thereby indirectly calling different service methods and using built-in capabilities to perform distributive tracking and diagnosis, traffic control, error handling, secure links, etc.and Layotto is based on the Grpc handler design, using the X-Protocol protocol for secure and reliable communications, except for Http/Grpc communications with other services.As shown in the following code, the RPC API interface is in line with Dapr and is available for RPC calls through the Grpc interface InvokeService. - -```go -type DaprClient interface { - // Invokes a method on a remote Dapr app. - InvokeService(ctx context.Context, in *InvokeServiceRequest, opts ...grpc.CallOption) (*v1.InvokeResponse, error) - ... -} -``` - -## Source analysis - -For ease of understanding, from outside to inside, from inside to outside, from flow to source code, that is, from Client, through one layer of logic to the Server receiving a return response to requests, from another layer of return to client, and from one layer of analysis of Layotto RPC processes, split into 10 steps.Also, since the content of Gypc Client and Server handshakes and interactions is not the focus of this paper, the analysis is relatively brief and the other steps are relatively detailed and one can move directly from the directory to the corresponding step depending on his or her case. - -Note:based on commit hash:1d2bed68c3b2372c34a12aeed41be125a4fdd15a - -### 0x00 Layotto initialize RPC - -Layotto starts the process involves a large number of processes in which only the initialization of the process related to RPC and described below is analyzed because Layotto is based on Mosn and is therefore starting from the Main function, urfave/cli library calls Mosn StageManager Mos, thus initializing GrpcServer in Mosn NetworkFilter as follows. - -```go -mosn.io/mosn/pkg/stagemanager.(*StageManager).runInitStage at stage_manager.go -=> -mosn.io/mosn/pkg/mosn.(*Mosn).initServer at mosn.go -=> -mosn.io/mosn/pkg/filter/network/grpc.(*grpcServerFilterFactory).Init at factory.go -=> -mosn.io/mosn/pkg/filter/network/grpc.(*Handler).New at factory.go -// 新建一个带有地址的 Grpc 服务器。同一个地址返回同一个服务器,只能启动一次 -func (s *Handler) New(addr string, conf json.RawMessage, options ...grpc.ServerOption) (*registerServerWrapper, error) { - s.mutex.Lock() - defer s.mutex.Unlock() - sw, ok := s.servers[addr] - if ok { - return sw, nil - } - ln, err := NewListener(addr) - if err != nil { - log.DefaultLogger.Errorf("create a listener failed: %v", err) - return nil, err - } - // 调用 NewRuntimeGrpcServer - srv, err := s.f(conf, options...) - if err != nil { - log.DefaultLogger.Errorf("create a registered server failed: %v", err) - return nil, err - } - sw = ®isterServerWrapper{ - server: srv, - ln: ln, - } - s.servers[addr] = sw - return sw, nil -} -= -main.NewRunvtimeGrpcServer at main.go -=> -mosn.io/layotto/pkg/runtime.(*MosnRuntime).initRuntime at runtime.go -=> -mosn.io/layotto/pkg/runtime.(*MosnRuntime).initRpcs at runtime.go -=> -mosn.io/layotto/components/rpc/invoker/mosn.(*mosnInvoker).Init at mosninvoker.go -func (m *mosnInvoker) Init(conf rpc.RpcConfig) error { - var config mosnConfig - if err := json.Unmarshal(conf.Config, &config); err != nil { - return err - } - - // 初始化 RPC 调用前的 Filter - for _, before := range config.Before { - m.cb.AddBeforeInvoke(before) - } - - // 初始化 RPC 调用后的 Filter - for _, after := range config.After { - m.cb.AddAfterInvoke(after) - } - - if len(config.Channel) == 0 { - return errors.New("missing channel config") - } - - // 初始化与 Mosn 通信使用的通道、协议及对应端口 - channel, err := channel.GetChannel(config.Channel[0]) - if err != nil { - return err - } - m.channel = channel - return nil -} -... -// 完成一些列初始化后在 grpcServerFilter 中启动 Grpc Server -mosn.io/mosn/pkg/filter/network/grpc.(*grpcServerFilterFactory).Init at factory.go -func (f *grpcServerFilterFactory) Init(param interface{}) error { - ... - opts := []grpc.ServerOption{ - grpc.UnaryInterceptor(f.UnaryInterceptorFilter), - grpc.StreamInterceptor(f.StreamInterceptorFilter), - } - // 经过上述初始化,完成 Grpc registerServerWrapper 的初始化 - sw, err := f.handler.New(addr, f.config.GrpcConfig, opts...) - if err != nil { - return err - } - // 启动 Grpc sever - sw.Start(f.config.GracefulStopTimeout) - f.server = sw - log.DefaultLogger.Debugf("grpc server filter initialized success") - return nil -} -... -// StageManager 在 runInitStage 之后进入 runStartStage 启动 Mosn -func (stm *StageManager) runStartStage() { - st := time.Now() - stm.SetState(Starting) - for _, f := range stm.startupStages { - f(stm.app) - } - - stm.wg.Add(1) - // 在所有启动阶段完成后启动 Mosn - stm.app.Start() - ... -} -``` - -### 0x01 Dubbo-go-sample client request - -Follow the example of [Dubbo Json Rpc Example](https://mosn.io/layotto/#/en/start/rpc/dub_json_rpc) - -```shell -go un demo/rpc/dubbo_json_rpc/dub_json_client/client.go -d '{"jsonrpc": "2.0", "method":"GetUser", "params":["A003"],"id":9527}' -``` - -Use Layotto for App Gypc API InvokeService initiate RPC calls, data filling and connecting processes leading to the dispatch of data to Layotto via SendMsg in Grpc clientStream, as follows. - -```go - -func main() { - data := flag.String("d", `{"jsonrpc":"2.0","method":"GetUser","params":["A003"],"id":9527}`, "-d") - flag.Parse() - - conn, err := grpc.Dial("localhost:34904", grpc.WithInsecure()) - if err != nil { - log.Fatal(err) - } - - cli := runtimev1pb.NewRuntimeClient(conn) - ctx, cancel := context.WithCancel(context.TODO()) - defer cancel() - // 通过 Grpc 接口 InvokeService 进行 RPC 调用 - resp, err := cli.InvokeService( - ctx, - // 使用 runtimev1pb.InvokeServiceRequest 发起 Grpc 请求 - &runtimev1pb.InvokeServiceRequest{ - // 要请求的 server 接口 ID - Id: "org.apache.dubbo.samples.UserProvider", - Message: &runtimev1pb.CommonInvokeRequest{ - // 要请求的接口对应的方法名 - Method: "GetUser", - ContentType: "", - Data: &anypb.Any{Value: []byte(*data)}, - HttpExtension: &runtimev1pb.HTTPExtension{Verb: runtimev1pb.HTTPExtension_POST}, - }, - }, - ) - if err != nil { - log.Fatal(err) - } - - fmt.Println(string(resp.Data.GetValue())) -} -=> -mosn.io/layotto/spec/proto/runtime/v1.(*runtimeClient).InvokeService at runtime.pb.go -=> -google.golang.org/grpc.(*ClientConn).Invoke at call.go -=> -google.golang.org/grpc.(*clientStream).SendMsg at stream.go -=> -google.golang.org/grpc.(*csAttempt).sendMsg at stream.go -=> -google.golang.org/grpc/internal/transport.(*http2Client).Write at http2_client.go -``` - -### 0x02 Mosn EventLoop Reader Processing Request Data - -The kernel from Layotto mentioned above is a mock-up of Mosn, so when network connection data arrives, it will first be read and written at the L4 network level in Mosn as follows. - -```go -mosn.io/mosn/pkg/network.(*listener).accept at listener.go -=> -mosn.io/mosn/pkg/server.(*activeListener).OnAccept at handler.go -=> -mosn.io/mosn/pkg/server.(*activeRawConn).ContinueFilterChain at handler.go -=> -mosn.io/mosn/pkg/server.(*activeListener).newConnection at handler.go -=> -mosn.io/mosn/pkg/network.(*connection).Start at connection.go -=> -mosn.io/mosn/pkg/network.(*connection).startRWLoop at connection.go -func (c *connection) startRWLoop(lctx context.Context) { - c.internalLoopStarted = true - - utils.GoWithRecover(func() { - // 读协程 - c.startReadLoop() - }, func(r interface{}) { - c.Close(api.NoFlush, api.LocalClose) - }) - - if c.checkUseWriteLoop() { - c.useWriteLoop = true - utils.GoWithRecover(func() { - // 写协程 - c.startWriteLoop() - }, func(r interface{}) { - c.Close(api.NoFlush, api.LocalClose) - }) - } -} -``` - -In the startRWLoop method, we can see that two separate protocols will be opened to deal with reading and writing operations on the connection: startReadLoop and startWriteLoop; the following streams will be made in startReadLoop; the data read at the network level will be handled by the filterManager filter chain, as follows. - -```go -mosn.io/mosn/pkg/network.(*connection).doRead at connection.go -=> -mosn.io/mosn/pkg/network.(*connection).onRead at connection.go -=> -mosn.io/mosn/pkg/network.(*filterManager).OnRead at filtermanager.go -=> -mosn.io/mosn/pkg/network.(*filterManager).onContinueReading at filtermanager.go -func (fm *filterManager) onContinueReading(filter *activeReadFilter) { - var index int - var uf *activeReadFilter - - if filter != nil { - index = filter.index + 1 - } - - // filterManager遍历过滤器进行数据处理 - for ; index < len(fm.upstreamFilters); index++ { - uf = fm.upstreamFilters[index] - uf.index = index - // 对没有初始化的过滤器调用其初始化方法 OnNewConnection,本例为func (f *grpcFilter) OnNewConnection() api.FilterStatus(向 Listener 发送 grpc 连接以唤醒 Listener 的 Accept) - if !uf.initialized { - uf.initialized = true - - status := uf.filter.OnNewConnection() - - if status == api.Stop { - return - } - } - - buf := fm.conn.GetReadBuffer() - - if buf != nil && buf.Len() > 0 { - // 通知相应过滤器处理 - status := uf.filter.OnData(buf) - - if status == api.Stop { - return - } - } - } -} -=> -mosn.io/mosn/pkg/filter/network/grpc.(*grpcFilter).OnData at filter.go -=> -mosn.io/mosn/pkg/filter/network/grpc.(*grpcFilter).dispatch at filter.go -func (f *grpcFilter) dispatch(buf buffer.IoBuffer) { - if log.DefaultLogger.GetLogLevel() >= log.DEBUG { - log.DefaultLogger.Debugf("grpc get datas: %d", buf.Len()) - } - // 发送数据唤醒连接读取 - f.conn.Send(buf) - if log.DefaultLogger.GetLogLevel() >= log.DEBUG { - log.DefaultLogger.Debugf("read dispatch finished") - } -} -``` - -### 0x03 Grpc Sever processed requests as NetworkFilter - -Reading data from the original connection in the first phase will enter the Grpc Serve handling, the Serve method will use the net.Listener listener, each time a new protocol is launched to handle the new connection (handleRawCon), and a RPC call based on Http2-based transport will be set out below. - -```go -google.golang.org/grpc.(*Server).handleRawConn at server.go -func (s *Server) handleRawConn(lisAddr string, rawConn net.Conn) { - // 校验服务状态 - if s.quit.HasFired() { - rawConn.Close() - return - } - rawConn.SetDeadline(time.Now().Add(s.opts.connectionTimeout)) - conn, authInfo, err := s.useTransportAuthenticator(rawConn) - if err != nil { - ... - } - // HTTP2 握手,创建 Http2Server 与客户端交换帧的初始化信息,帧和窗口大小等 - st := s.newHTTP2Transport(conn, authInfo) - if st == nil { - return - } - - rawConn.SetDeadline(time.Time{}) - if !s.addConn(lisAddr, st) { - return - } - // 创建一个协程进行流处理 - go func() { - s.serveStreams(st) - s.removeConn(lisAddr, st) - }() - ... -} -=> -google.golang.org/grpc.(*Server).serveStreams at server.go -=> -google.golang.org/grpc.(*Server).handleStream at server.go -func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Stream, trInfo *traceInfo) { - // 找到到需要调用的 FullMethod,此例为 spec.proto.runtime.v1.Runtime/InvokeService - sm := stream.Method() - if sm != "" && sm[0] == '/' { - sm = sm[1:] - } - ... - service := sm[:pos] - method := sm[pos+1:] - - // 从注册的 service 列表中找到对应 serviceInfo 对象 - srv, knownService := s.services[service] - if knownService { - // 根据方法名找到单向请求的 md——MethodDesc,此 demo 为 mosn.io/layotto/spec/proto/runtime/v1._Runtime_InvokeService_Handler - if md, ok := srv.methods[method]; ok { - s.processUnaryRPC(t, stream, srv, md, trInfo) - return - } - // 流式请求 - if sd, ok := srv.streams[method]; ok { - s.processStreamingRPC(t, stream, srv, sd, trInfo) - return - } - } - ... -=> -google.golang.org/grpc.(*Server).processUnaryRPC at server.go -=> -mosn.io/layotto/spec/proto/runtime/v1._Runtime_InvokeService_Handler at runtime.pb.go -=> -google.golang.org/grpc.chainUnaryServerInterceptors at server.go -=> -// 服务端单向调用拦截器,用以调用 Mosn 的 streamfilter -mosn.io/mosn/pkg/filter/network/grpc.(*grpcServerFilterFactory).UnaryInterceptorFilter at factory.go -=> -google.golang.org/grpc.getChainUnaryHandler at server.go -// 递归生成链式UnaryHandler -func getChainUnaryHandler(interceptors []UnaryServerInterceptor, curr int, info *UnaryServerInfo, finalHandler UnaryHandler) UnaryHandler { - if curr == len(interceptors)-1 { - return finalHandler - } - - return func(ctx context.Context, req interface{}) (interface{}, error) { - // finalHandler就是mosn.io/layotto/spec/proto/runtime/v1._Runtime_InvokeService_Handler - return interceptors[curr+1](ctx, req, info, getChainUnaryHandler(interceptors, curr+1, info, finalHandler)) - } -} -``` - -### 0x04 Layotto send RPC requests and write to local virtual connections - -The 0x03 process follows Runtime_InvokeService_Handler, converted from the GRPC Default API to Dapr API, entering the light RPC framework provided by Layotto in Mosn, as follows. - -```go -mosn.io/layotto/spec/proto/runtime/v1._Runtime_InvokeService_Handler at runtime.pb.go -=> -mosn.io/layotto/pkg/grpc/default_api.(*api).InvokeService at api.go -=> -mosn.io/layotto/pkg/grpc/dapr.(*daprGrpcAPI).InvokeService at dapr_api.go -=> -mosn.io/layotto/components/rpc/invoker/mosn.(*mosnInvoker).Invoke at mosninvoker.go -// 请求 Mosn 底座和返回响应 -func (m *mosnInvoker) Invoke(ctx context.Context, req *rpc.RPCRequest) (resp *rpc.RPCResponse, err error) { - defer func() { - if r := recover(); r != nil { - err = fmt.Errorf("[runtime][rpc]mosn invoker panic: %v", r) - log.DefaultLogger.Errorf("%v", err) - } - }() - - // 1. 如果超时时间为 0,设置默认 3000ms 超时 - if req.Timeout == 0 { - req.Timeout = 3000 - } - req.Ctx = ctx - log.DefaultLogger.Debugf("[runtime][rpc]request %+v", req) - // 2. 触发请求执行前的自定义逻辑 - req, err = m.cb.BeforeInvoke(req) - if err != nil { - log.DefaultLogger.Errorf("[runtime][rpc]before filter error %s", err.Error()) - return nil, err - } - // 3. 核心调用,下文会进行详细分析 - resp, err = m.channel.Do(req) - if err != nil { - log.DefaultLogger.Errorf("[runtime][rpc]error %s", err.Error()) - return nil, err - } - resp.Ctx = req.Ctx - // 4. 触发请求返回后的自定义逻辑 - resp, err = m.cb.AfterInvoke(resp) - if err != nil { - log.DefaultLogger.Errorf("[runtime][rpc]after filter error %s", err.Error()) - } - return resp, err -} -=> -mosn.io/layotto/components/rpc/invoker/mosn/channel.(*httpChannel).Do at httpchannel.go -func (h *httpChannel) Do(req *rpc.RPCRequest) (*rpc.RPCResponse, error) { - // 1. 使用上一阶段设置的默认超时设置 context 超时 - timeout := time.Duration(req.Timeout) * time.Millisecond - ctx, cancel := context.WithTimeout(req.Ctx, timeout) - defer cancel() - - // 2. 创建连接得到,启动 readloop 协程进行 Layotto 和 Mosn 的读写交互(具体见下文分析) - conn, err := h.pool.Get(ctx) - if err != nil { - return nil, err - } - - // 3. 设置数据写入连接的超时时间 - hstate := conn.state.(*hstate) - deadline, _ := ctx.Deadline() - if err = conn.SetWriteDeadline(deadline); err != nil { - hstate.close() - h.pool.Put(conn, true) - return nil, common.Error(common.UnavailebleCode, err.Error()) - } - // 4. 因为初始化时配置的 Layotto 与 Mosn 交互使用的是 Http 协议,所以这里会构造 Http 请求 - httpReq := h.constructReq(req) - defer fasthttp.ReleaseRequest(httpReq) - - // 借助 fasthttp 请求体写入虚拟连接 - if _, err = httpReq.WriteTo(conn); err != nil { - hstate.close() - h.pool.Put(conn, true) - return nil, common.Error(common.UnavailebleCode, err.Error()) - } - - // 5. 构造 fasthttp.Response 结构体读取和解析 hstate 的返回,并设置读取超时时间 - httpResp := &fasthttp.Response{} - hstate.reader.SetReadDeadline(deadline) - - // 在 Mosn 数据返回前这里会阻塞,readloop 协程读取 Mosn 返回的数据之后流程见下述 0x08 阶段 - if err = httpResp.Read(bufio.NewReader(hstate.reader)); err != nil { - hstate.close() - h.pool.Put(conn, true) - return nil, common.Error(common.UnavailebleCode, err.Error()) - } - h.pool.Put(conn, false) - ... -} -=> -mosn.io/layotto/components/rpc/invoker/mosn/channel.(*connPool).Get at connpool.go -// Get is get wrapConn by context.Context -func (p *connPool) Get(ctx context.Context) (*wrapConn, error) { - if err := p.waitTurn(ctx); err != nil { - return nil, err - } - - p.mu.Lock() - // 1. 从连接池获取连接 - if ele := p.free.Front(); ele != nil { - p.free.Remove(ele) - p.mu.Unlock() - wc := ele.Value.(*wrapConn) - if !wc.isClose() { - return wc, nil - } - } else { - p.mu.Unlock() - } - - // 2. 创建新的连接 - c, err := p.dialFunc() - if err != nil { - p.freeTurn() - return nil, err - } - wc := &wrapConn{Conn: c} - if p.stateFunc != nil { - wc.state = p.stateFunc() - } - // 3. 启动 readloop 独立协程读取 Mosn 返回的数据 - if p.onDataFunc != nil { - utils.GoWithRecover(func() { - p.readloop(wc) - }, nil) - } - return wc, nil -} -=> -``` - -The creation of a new connection in the second step above requires attention by calling dialFunc func() in the protocol that initialized the init phase (net.Conn, error), because the configuration interacted with Mosn with Http protocols, this is newHttpChanel, which is currently supported by the Bolt, Dubbo et al. - -```go -mosn.io/layotto/components/rpc/invoker/mosn/channel.newHttpChannel at httpchannel.go -// newHttpChannel is used to create rpc.Channel according to ChannelConfig -func newHttpChannel(config ChannelConfig) (rpc.Channel, error) { - hc := &httpChannel{} - // 为减少连接创建开销的连接池,定义在 mosn.io/layotto/components/rpc/invoker/mosn/channel/connpool.go - hc.pool = newConnPool( - config.Size, - // dialFunc - func() (net.Conn, error) { - _, _, err := net.SplitHostPort(config.Listener) - if err == nil { - return net.Dial("tcp", config.Listener) - } - //创建一对虚拟连接(net.Pipe),Layotto 持有 local,Mosn 持有 remote, Layotto 向 local 写入,Mosn 会收到数据, Mosn 从 remote读取,执行 filter 逻辑并进行代理转发,再将响应写到 remote ,最后 Layotto 从 remote 读取,获得响应 - local, remote := net.Pipe() - localTcpConn := &fakeTcpConn{c: local} - remoteTcpConn := &fakeTcpConn{c: remote} - // acceptFunc 是定义在 mosn.io/layotto/components/rpc/invoker/mosn/channel.go 中的闭包,闭包中监听了 remote 虚拟连接 - if err := acceptFunc(remoteTcpConn, config.Listener); err != nil { - return nil, err - } - // the goroutine model is: - // request goroutine ---> localTcpConn ---> mosn - // ^ | - // | | - // | | - // hstate <-- readloop goroutine <------ - return localTcpConn, nil - }, - // stateFunc - func() interface{} { - // hstate 是 readloop 协程与 request 协程通信的管道,是一对读写 net.Conn,请求协程从 reader net.Conn 中读数据,readloop 协程序往 writer net.Conn 写数据 - s := &hstate{} - s.reader, s.writer = net.Pipe() - return s - }, - hc.onData, - hc.cleanup, - ) - return hc, nil -} -``` - -### 0x05 Mosn read Remote and execute Filter and proxy forwarding - -(1) Similar to 0x02, filtermanager executes the filter processing phase where proxy forwarding is made in proxy with the following code. - -```go -... -mosn.io/mosn/pkg/network.(*filterManager).onContinueReading at filtermanager.go -=> -mosn.io/mosn/pkg/proxy.(*proxy).OnData at proxy.go -func (p *proxy) OnData(buf buffer.IoBuffer) api.FilterStatus { - if p.fallback { - return api.Continue - } - - if p.serverStreamConn == nil { - ... - p.serverStreamConn = stream.CreateServerStreamConnection(p.context, proto, p.readCallbacks.Connection(), p) - } - //把数据分发到对应协议的解码器,在这里因为是 POST /org.apache.dubbo.samples.UserProvider HTTP/1.1,所以是 mosn.io/mosn/pkg/stream/http.(*serverStreamConnection).serve at stream.go - p.serverStreamConn.Dispatch(buf) - - return api.Stop -} -=> -``` - -(2) ServerStreamConnection.serve listens and handles requests to downstream OnReceive, as described below. - -```go -mosn.io/mosn/pkg/stream/http.(*serverStream).handleRequest at stream.go -func (s *serverStream) handleRequest(ctx context.Context) { - if s.request != nil { - // set non-header info in request-line, like method, uri - injectCtxVarFromProtocolHeaders(ctx, s.header, s.request.URI()) - hasData := true - if len(s.request.Body()) == 0 { - hasData = false - } - - if hasData { - //在此进入 downstream OnReceive - s.receiver.OnReceive(s.ctx, s.header, buffer.NewIoBufferBytes(s.request.Body()), nil) - } else { - s.receiver.OnReceive(s.ctx, s.header, nil, nil) - } - } -} -=> -mosn.io/mosn/pkg/proxy.(*downStream).OnReceive at downstream.go -func (s *downStream) OnReceive(ctx context.Context, headers types.HeaderMap, data types.IoBuffer, trailers types.HeaderMap) { - ... - var task = func() { - ... - - phase := types.InitPhase - for i := 0; i < 10; i++ { - s.cleanNotify() - - phase = s.receive(s.context, id, phase) - ... - } - } - } - - if s.proxy.serverStreamConn.EnableWorkerPool() { - if s.proxy.workerpool != nil { - // use the worker pool for current proxy - s.proxy.workerpool.Schedule(task) - } else { - // use the global shared worker pool - pool.ScheduleAuto(task) - } - return - } - - task() - return - -} -``` - -(3) The above ScheduleAuto schedule, after processing the reveive of downstream Stream, processing upstam Request, as well as an application with an application from the network layer, eventually sending data from connection.Write and entering WaitNotify phases, as detailed below. - -```go -mosn.io/mosn/pkg/sync.(*workerPool).ScheduleAuto at workerpool.go -=> -mosn.io/mosn/pkg/sync.(*workerPool).spawnWorker at workerpool.go -=> -mosn.io/mosn/pkg/proxy.(*downStream).receive at downstream.go -=> -InitPhase=>DownFilter=>MatchRoute=>DownFilterAfterRoute=>ChooseHost=>DownFilterAfterChooseHost=>DownRecvHeader=>DownRecvData -=> -mosn.io/mosn/pkg/proxy.(*downStream).receiveData at downstream.go -=> -mosn.io/mosn/pkg/proxy.(*upstreamRequest).appendData at upstream.go -=> -mosn.io/mosn/pkg/stream/http.(*clientStream).doSend at stream.go -=> -github.com/valyala/fasthttp.(*Request).WriteTo at http.go -=> -mosn.io/mosn/pkg/stream/http.(*streamConnection).Write at stream.go -> -mosn.io/mosn/pkg/network.(*connection).Write at connection.go -=> -mosn.io/mosn/pkg/proxy.(*downStream).receive at downstream.go -func (s *downStream) receive(ctx context.Context, id uint32, phase types.Phase) types.Phase { - for i := 0; i <= int(types.End-types.InitPhase); i++ { - s.phase = phase - - switch phase { - ... - case types.WaitNotify: - s.printPhaseInfo(phase, id) - if p, err := s.waitNotify(id); err != nil { - return p - } - - if log.Proxy.GetLogLevel() >= log.DEBUG { - log.Proxy.Debugf(s.context, "[proxy] [downstream] OnReceive send downstream response %+v", s.downstreamRespHeaders) - } - ... -} -=> -func (s *downStream) waitNotify(id uint32) (phase types.Phase, err error) { - if atomic.LoadUint32(&s.ID) != id { - return types.End, types.ErrExit - } - - if log.Proxy.GetLogLevel() >= log.DEBUG { - log.Proxy.Debugf(s.context, "[proxy] [downstream] waitNotify begin %p, proxyId = %d", s, s.ID) - } - select { - // 阻塞等待 - case <-s.notify: - } - return s.processError(id) -} -``` - -### 0x06 Dubbo-go-sample server received request return response - -Here is a dubo-go-sample server handling, leave it now, post log messages and check the source code by interested classes. - -``` -[2022-04-18/21:03:03:18 github.com/apache/dub-go-samples/rpc/jsonrpc/go-server/pkg.(*UserProvider2).GetUser: user_provider2.go: 53] userID: "A003" -[2022-04-18/21:03:18 github.com/apache/dub-go-samples/rpc/jsonrpc/go-server/pkg. (*UserProvider2).GetUser: user_provider2.go: 56] rsp:&pkg.User{ID:"113", Name:"Moorse", Age:30, sex:0, Birth:703391943, Sex:"MAN"MAN"} -``` - -### 0x07 Mosn framework handles responses and writes back to Remote Virtual Connection - -After the third phase of 0x05 above, the response logic goes into the UpRecvData phase of the reveive cycle phase through a series of final response writing back to the remote virtual connection at 0x04, as follows. - -```go -mosn.io/mosn/pkg/proxy.(*downStream).receive at downstream.go -func (s *downStream) waitNotify(id uint32) (phase types.Phase, err error) { - if atomic.LoadUint32(&s.ID) != id { - return types.End, types.ErrExit - } - - if log.Proxy.GetLogLevel() >= log.DEBUG { - log.Proxy.Debugf(s.context, "[proxy] [downstream] waitNotify begin %p, proxyId = %d", s, s.ID) - } - // 返回响应 - select { - case <-s.notify: - } - return s.processError(id) -} -=> -UpFilter -=> -UpRecvHeader -=> -func (s *downStream) receive(ctx context.Context, id uint32, phase types.Phase) types.Phase { - for i := 0; i <= int(types.End-types.InitPhase); i++ { - s.phase = phase - - switch phase { - ... - case types.UpRecvData: - if s.downstreamRespDataBuf != nil { - s.printPhaseInfo(phase, id) - s.upstreamRequest.receiveData(s.downstreamRespTrailers == nil) - if p, err := s.processError(id); err != nil { - return p - } - } - ... -} -=> -mosn.io/mosn/pkg/proxy.(*upstreamRequest).receiveData at upstream.go -=> -mosn.io/mosn/pkg/proxy.(*downStream).onUpstreamData at downstream.go -=> -mosn.io/mosn/pkg/proxy.(*downStream).appendData at downstream.go -=> -mosn.io/mosn/pkg/stream/http.(*serverStream).AppendData at stream.go -=> -mosn.io/mosn/pkg/stream/http.(*serverStream).endStream at stream.go -=> -mosn.io/mosn/pkg/stream/http.(*serverStream).doSend at stream.go -=> -github.com/valyala/fasthttp.(*Response).WriteTo at http.go -=> -github.com/valyala/fasthttp.writeBufio at http.go -=> -github.com/valyala/fasthttp.(*statsWriter).Write at http.go -=> -mosn.io/mosn/pkg/stream/http.(*streamConnection).Write at stream.go -``` - -### 0x08 Layotto receive RPC responses and read Local Virtual Connection - -Readloop Reading IO, activated by 0x04 above, is activated from connection read data from Mosn and then forwarded to the hstate pipe to return to the request process, as follows. - -```go -mosn.io/layotto/components/rpc/invoker/mosn/channel.(*connPool).readloop at connpool.go -// readloop is loop to read connected then exec onDataFunc -func (p *connPool) readloop(c *wrapConn) { - var err error - - defer func() { - c.close() - if p.cleanupFunc != nil { - p.cleanupFunc(c, err) - } - }() - - c.buf = buffer.NewIoBuffer(defaultBufSize) - for { - // 从连接读取数据 - n, readErr := c.buf.ReadOnce(c) - if readErr != nil { - err = readErr - if readErr == io.EOF { - log.DefaultLogger.Debugf("[runtime][rpc]connpool readloop err: %s", readErr.Error()) - } else { - log.DefaultLogger.Errorf("[runtime][rpc]connpool readloop err: %s", readErr.Error()) - } - } - - if n > 0 { - // 在onDataFunc 委托给 hstate 处理数据 - if onDataErr := p.onDataFunc(c); onDataErr != nil { - err = onDataErr - log.DefaultLogger.Errorf("[runtime][rpc]connpool onData err: %s", onDataErr.Error()) - } - } - - if err != nil { - break - } - - if c.buf != nil && c.buf.Len() == 0 && c.buf.Cap() > maxBufSize { - c.buf.Free() - c.buf.Alloc(defaultBufSize) - } - } -} -=> -mosn.io/layotto/components/rpc/invoker/mosn/channel.(*httpChannel).onData at httpchannel.go -=> -mosn.io/layotto/components/rpc/invoker/mosn/channel.(*hstate).onData at httpchannel.go -=> -net.(*pipe).Write at pipe.go -=> -mosn.io/layotto/components/rpc/invoker/mosn/channel.(*httpChannel).Do at httpchannel.go -func (h *httpChannel) Do(req *rpc.RPCRequest) (*rpc.RPCResponse, error) { - ... - // 接上述0x04阶段,mosn 数据返回后,从 hstate 读取 readloop 协程从 mosn 返回的数据 - if err = httpResp.Read(bufio.NewReader(hstate.reader)); err != nil { - hstate.close() - h.pool.Put(conn, true) - return nil, common.Error(common.UnavailebleCode, err.Error()) - } - h.pool.Put(conn, false) - - // 获取 fasthttp 的数据部分,解析状态码,失败返回错误信息和状态码 - body := httpResp.Body() - if httpResp.StatusCode() != http.StatusOK { - return nil, common.Errorf(common.UnavailebleCode, "http response code %d, body: %s", httpResp.StatusCode(), string(body)) - } - - // 6. 将结果转换为 rpc.RPCResponse 返回 - rpcResp := &rpc.RPCResponse{ - ContentType: string(httpResp.Header.ContentType()), - Data: body, - Header: map[string][]string{}, - } - httpResp.Header.VisitAll(func(key, value []byte) { - rpcResp.Header[string(key)] = []string{string(value)} - }) - return rpcResp, nil -``` - -### 0x09 Grpc Sever processed data frames returned to clients - -Grpc does not write data directly to connections, but uses a systray loop to fetch frames from a cache structure and write them back to the client, as follows. - -```go -google.golang.org/grpc/internal/transport.NewServerTransport at http2_server.go -func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, err error) { - ... - // 协程异步loop循环 - go func() { - t.loopy = newLoopyWriter(serverSide, t.framer, t.controlBuf, t.bdpEst) - t.loopy.ssGoAwayHandler = t.outgoingGoAwayHandler - if err := t.loopy.run(); err != nil { - if logger.V(logLevel) { - logger.Errorf("transport: loopyWriter.run returning. Err: %v", err) - } - } - t.conn.Close() - t.controlBuf.finish() - close(t.writerDone) - }() - go t.keepalive() - return t, nil -} -=> -google.golang.org/grpc/internal/transport.(*loopyWriter).run at controlbuf.go -=> -google.golang.org/grpc/internal/transport.(*bufWriter).Flush at http_util.go -=> -mosn.io/mosn/pkg/filter/network/grpc.(*Connection).Write at conn.go -=> -mosn.io/mosn/pkg/network.(*connection).Write at connection.go -=> -mosn.io/mosn/pkg/network.(*connection).writeDirectly at connection.go -=> -mosn.io/mosn/pkg/network.(*connection).doWrite at connection.go -``` - -### 0x10 dubbo-go-sample customer received response - -The transmission of data from 0x01 above will be blocked in the client grpc bottom reading, and Layotto returns data from some of the processing layers above to enable ClientBottom Read IO, as follows. - -```go -google.golang.org/grpc.(*ClientCon). Invoke at call.go -=> -google.golang.org/grpc.(*ClientCon). Invoke at call.go -=> -google.golang.org/grpc.(*clientStream). RecvMsg at stream. o -=> -google.golang.org/grpc.(*clientStream).withRetry at stream.go -=> -google.golang.org/grpc.(*csAtempt.recvMsg at stream.go -=> -google.golang.org/grpc.recvAndDecompress at rpc_util. o -=> -google.golang.org/grpc.recv at rpc_util.go -=> -google.golang.org/grpc.(*parser).recvMsg at rpc_util.go -=> -google.golang.org/grpc.(*csAttempt).recvMsg at stream. o -func (p *parser) recvMsg(maxReceiveMessageSize int) (pf payloadFormat, msg []byte, err error) LO - if _, err := p. .Read(p.header[:]); err != nil { - return 0, nil, err - } - ... -} -``` - -Last returned data: - -```json -{"jsonrpc": "2.0", "id":9527, "result":{"id":"113", "name":"Moorse", "age":30,"time":703394193,"sex":"MAN"}} -``` - -## Summary - -The Layotto RPC process involves knowledge related to GRPC, Dapr, Mosn and others, and the overall process is lengthy, although it is clearer and simpler simply to see Layotto for Mosn an abstract lightweight RPC framework and is more innovative and useful for further study.Here Layotto RPC requests are analyzed and time-limited without some more comprehensive and in-depth profiles, such as defects, welcome contact:rayo.wangzl@gmail.com.It is also hoped that there will be greater participation in source analysis and open source communities, learning together and making progress together. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-blog/code/start_process/start_process.md b/docs/i18n/en-US/docusaurus-plugin-content-blog/code/start_process/start_process.md deleted file mode 100644 index 83225298ac..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-blog/code/start_process/start_process.md +++ /dev/null @@ -1,291 +0,0 @@ -# Source parsing layotto startup process - -> Author Intro to: -> Libin, https://github.com/ZLBer -> -> Writing: 4 May 2022 - -- [Overview](#Overview) -- [source analysis](#source analysis) - - [1.cmd analysis](#1.cmd analysis) - - [2.Callback functionNewRuntimeGrpcServer分析](#2.callback function NewRuntimeGrpcServer analysis) - - [3.runtimeanalyze](#3.runtime analyse) -- [summary](#summary) - -## Overview - -Layotto "Parasite" in MOSN. The start process is in effect starting MOSN, MOSN back Layotto during startup to get Layotto start. - -## Source analysis - -Everything originating from our command line: layotto start -c `configpath` - -### 1.cmd analysis - -Main init function starts with: - -``` -func init() { - //将layotto的初始化函数传给mosn,让mosn启动的时候进行回调 - mgrpc.RegisterServerHandler("runtime", NewRuntimeGrpcServer) - .... -} -``` - -cmd action starts to execute: - -``` - Action: func(c *cli.Context) error { - app := mosn.NewMosn() - //stagemanager用于管理mosn启动的每个阶段,可以添加相应的阶段函数,比如下面的ParamsParsedStage、InitStage、PreStartStage、AfterStartStage - //这里是将configpath传给mosn,下面都是mosn相关的逻辑 - stm := stagemanager.InitStageManager(c, c.String("config"), app) - stm.AppendParamsParsedStage(ExtensionsRegister) - stm.AppendParamsParsedStage(func(c *cli.Context) { - err := featuregate.Set(c.String("feature-gates")) - if err != nil { - os.Exit(1) - } - })· - stm.AppendInitStage(mosn.DefaultInitStage) - stm.AppendPreStartStage(mosn.DefaultPreStartStage) - stm.AppendStartStage(mosn.DefaultStartStage) - //这里添加layotto的健康检查机制 - stm.AppendAfterStartStage(SetActuatorAfterStart) - stm.Run() - // wait mosn finished - stm.WaitFinish() - return nil - }, -``` - -### NewRuntimeGrpcServer Analysis - -Returns NewRuntimeGrpcServer when MOSN is launched, data is an unparsed configuration, opts is a grpc configuration, returning Gpc server - -``` -func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrpc.RegisteredServer, error) { - // 将原始的配置文件解析成结构体形式。 - cfg, err := runtime.ParseRuntimeConfig(data) - // 新建layotto runtime, runtime包含各种组件的注册器和各种组件的实例。 - rt := runtime.NewMosnRuntime(cfg) - // 3.runtime开始启动 - server, err := rt.Run( - ... - // 4. 添加所有组件的初始化函数 - // 我们只看下File组件的,将NewXXX()添加到组件Factory里 - runtime.WithFileFactory( - file.NewFileFactory("aliyun.oss", alicloud.NewAliCloudOSS), - file.NewFileFactory("minio", minio.NewMinioOss), - file.NewFileFactory("aws.s3", aws.NewAwsOss), - file.NewFileFactory("tencent.oss", tencentcloud.NewTencentCloudOSS), - file.NewFileFactory("local", local.NewLocalStore), - file.NewFileFactory("qiniu.oss", qiniu.NewQiniuOSS), - ), - ... - return server, err - - ) - - // -} - -``` - -### runtime analysis - -Look at the structure of runtime, the composition of the `runtime' at the aggregate level of the`:' - -``` -type MosnRuntime struct { - // 包括组件的config - runtimeConfig *MosnRuntimeConfig - info *info.RuntimeInfo - srv mgrpc.RegisteredServer - // 组件注册器,用来注册和新建组件,里面有组件的NewXXX()函数 - helloRegistry hello.Registry - configStoreRegistry configstores.Registry - rpcRegistry rpc.Registry - pubSubRegistry runtime_pubsub.Registry - stateRegistry runtime_state.Registry - lockRegistry runtime_lock.Registry - sequencerRegistry runtime_sequencer.Registry - fileRegistry file.Registry - bindingsRegistry mbindings.Registry - secretStoresRegistry msecretstores.Registry - customComponentRegistry custom.Registry - hellos map[string]hello.HelloService - // 各种组件 - configStores map[string]configstores.Store - rpcs map[string]rpc.Invoker - pubSubs map[string]pubsub.PubSub - states map[string]state.Store - files map[string]file.File - locks map[string]lock.LockStore - sequencers map[string]sequencer.Store - outputBindings map[string]bindings.OutputBinding - secretStores map[string]secretstores.SecretStore - customComponent map[string]map[string]custom.Component - AppCallbackConn *rawGRPC.ClientConn - errInt ErrInterceptor - started bool - //初始化函数 - initRuntimeStages []initRuntimeStage -} -``` - -runtime is the run function logic as follows: - -``` -func (m *MosnRuntime) Run(opts..Option) (mgrpc.RegisteredServer, error) um - // launch flag - m. targeted = true - // newly created runtime configuration - o := newRuntimeOptions() - // run our previously imported option,. Really register various components Factory with - for _, opt := range opts { - opt(o) - } - //initialization component - if err := m. nitRuntime(o); err != nil { - return nil, err - } - - //initialize Grpc,api assignment - var grpcOpts[]grpc. Absorption - if o.srvMaker != nil LO - grpcOpts = append(grpcOpts, grpc.GithNewServer(o.srvMaker)) - } - var apis []grpc.GrpcAPI - ac := &grpc. pimplicationContextFe - m.runtimeConfig.AppManagement.AppId, - m.hellos, - m.configStories, - m.rpcs, - m.pubSubs, - m. tates, - m.files, - m.locks, - m.sequencers, - m.sendToOutputBinding, - m.secretStories, - m. ustomCompany, - } - // Factor generation of each component - for _, apiFactory := range o. piFactorys LOR - api := apiFactory(ac) - // init the GrpcAPI - if err := api.Init(m. ppCallbackCon); err != nil { - return nil, err - } - apis = append(apis, api) - } - // pass the api interface and configuration to grpc - grpcOpts = append(grpcOpts, - grpc.GrpOptions(o.options... , - grpc.MithGrpcAPIs(apis), - ) - //start grpc - var err error = nil - m. rv, err = grpc.NewGrpServer (grpcOpts...) - return m.srv, err -} - -``` - -Component initialization function initRuntime : - -``` -func (m *MosnRuntime) initRuntime (r *runtimeOptions) errant error LO - st := time.Now() - if len(m.initRuntimeStages) === 0 56 - m.initRuntimeStages = append(m. nitRuntimeStages, DefaultInitRuntimeStage - } - // Call DefaultInitRuntimeStage - for _, f := range m. nitRuntime Stages FEM - err := f(r, m) - if err != nil { - return err - } - } - . . - return nil -} -``` - -DefaultInitRuntimeStage component initialization logic, call init method for each component: - -``` -func DefaultInitRuntimeStage(o *runtimeOptions, m *MosnRuntime) error { - ... - //初始化config/state/file/lock/sequencer/secret等各种组件 - if err := m.initCustomComponents(o.services.custom); err != nil { - return err - } - if err := m.initHellos(o.services.hellos...); err != nil { - return err - } - if err := m.initConfigStores(o.services.configStores...); err != nil { - return err - } - if err := m.initStates(o.services.states...); err != nil { - return err - } - if err := m.initRpcs(o.services.rpcs...); err != nil { - return err - } - if err := m.initOutputBinding(o.services.outputBinding...); err != nil { - return err - } - if err := m.initPubSubs(o.services.pubSubs...); err != nil { - return err - } - if err := m.initFiles(o.services.files...); err != nil { - return err - } - if err := m.initLocks(o.services.locks...); err != nil { - return err - } - if err := m.initSequencers(o.services.sequencers...); err != nil { - return err - } - if err := m.initInputBinding(o.services.inputBinding...); err != nil { - return err - } - if err := m.initSecretStores(o.services.secretStores...); err != nil { - return err - } - return nil -} -``` - -Example file component, see initialization function: - -``` -func (m *MosnRuntime) initFiles(files ...file.FileFactory) ERRORY ERROR LO - - //register configured components on - m.fileRegistry.Register(files...) - for name, config := range m. untimesConfig.Files Fact - //create/create a new component instance - c, err := m.fileRegistry.Create(name) - if err !=nil L/ - m. rrInt(err, "creation files component %s failed", name) - return err - } - if err := c. nit(context.TODO(), &config); err != nil LO - m. rrInt(err, "init files component %s failed", name) - return err - } - //assignment to runtime - m. files[name] = c - } - return nil -} -``` - -Here MOSN, Grpc and Layotto are all started, and the code logic of the component can be called through the Gypc interface. - -## Summary - -Overall view of the entire startup process, Layotto integration with MOSN to start, parse configuration files, generate component classes in the configuration file and expose the api of Grpc. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-blog/code/webassembly/index.md b/docs/i18n/en-US/docusaurus-plugin-content-blog/code/webassembly/index.md deleted file mode 100644 index 6953d27192..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-blog/code/webassembly/index.md +++ /dev/null @@ -1,634 +0,0 @@ -# Layotto Source Parsing — WebAssembly - -> This paper mainly analyses the relevant implementation and application of Layotto Middle WASM. -> -> by:[Wang Zhilong](https://github.com/rayowang) | 18 May 2022 - -- [overview](#overview) -- [source analysis](#source analysis) - - [Frame INIT](#Frame INIT) - - [workflow](#workflow) - - [FaaSmode](#FaaS mode) -- [summary](#summary) - -## General description - -WebAssemly Abbreviations WASM, a portable, small and loaded binary format operating in sandboxing implementation environment, was originally designed to achieve high-performance applications in web browsers, benefiting from its good segregation and security, multilingual support, cool-start fast flexibility and agility and application to embed other applications for better expansion, and obviously we can embed it into Layotto.Layotto supports loading compiled WASM files and interacting with the Target WASM API via proxy_abi_version_0_2_0; -other Layotto also supports loading and running WASM carrier functions and supports interfaces between Function and access to infrastructure; and Layotto communities are also exploring the compilation of components into WASM modules to increase segregation between modules.This article uses the Layotto official [quickstart](https://mosn.io/layotto/#/zh/start/wasm/start) example of accessing redis as an example to analyze WebAssemly in Layotto Related implementation and application. - -## Source analysis - -Note:is based on commit hash:f1cf350a52b5a1a0b3788a31681007a056e332ef - -### Frame INIT - -As the bottom layer of Layotto is Mosn, the WASM extension framework is also the WASM extension framework that reuses Mosn, as shown in figure 1 Layotto & Mosn WASM framework [1]. - -![mosn\_wasm\_ext\_framework\_module](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*jz4BSJmVQ3gAAAAAAAAAAAAAARQnAQ) - -
Figure 1 Layotto & Mosn WASM framework
- -Among them, Manager is responsible for managing and dynamically updating WASM plugins;VM for managing WASM virtual machines, modules and instances;ABI serves as the application binary interface to provide an external interface [2]. - -Here a brief review of the following concepts:\ -[Proxy-Wasm](https://github.com/proxy-wasm) :WebAssembly for Proxies (ABI specification) is an unrelated ABI standard that defines how proxy and WASM modules interact [3] in functions and callbacks. -[proxy-wasm-go-sdk](https://github.com/tetratelabs/proxy-wasm-go-sdk) :defines the interface of function access to system resources and infrastructure services based on [proxy-wasm/spec](https://github.com/proxy-wasm/spec) which brings together the Runtime API to increase access to infrastructure.\ -[proxy-wasm-go-host](https://github.com/mosn/proxy-wasm-go-host) WebAssembly for Proxies (GoLang host implementation):Proxy-Wasm golang implementation to implement Runtime ABI logic in Layotto.\ -VM: Virtual Machine Virtual machine. The Runtime types are wasmtime, wasmer, V8, Lucet, WAMR, and wasm3 - -1, see first the configuration of stream filter in [quickstart例子](https://mosn.io/layotto/#/start/waste/start) as follows, two WASM plugins can be seen, using waste VM to start a separate instance with configuration: below - -```json - "stream_filters": [ - LO - "type": "Layotto", - "config": API - "Function1": LOs - "name": "function1", // Plugin name - "instance_num": 1, // Number of sandbox instances - "vm_config": LO - "engine": "waste", // Virtual Machine Type Runtime Type - "path": "demo/faas/code/golang/client/function_1. asm" /waste file path - } - }, - "Function2": LO - "name": "function2", // Plugin name - "instance_num": 1, // Number of sandbox instances - "vm_config": LO - "engine": "waste", // Virtual Machine Type Runtime Type - "path": "demo/faas/code/golang/server/function_2. asm" /wasm file path - } - } - } - } -] -``` - -The primary logic in the configuration above is to receive HTTP requests, then call function2 through ABI, and return function2 as detailed below in code: - -```go -func (Ctx *pHeaders) OnHttpRequestBody(bodySize int, endOfStream bool) types.Action Led - /1. get request body - body, err := proxywasm. etHttpRequestBody(0, bodySize) - if err != nil L/ - proxywasm.LogErrorf("GetHttpRequestBody failed: %v", err) - return types. ctionPause - } - - /2. parse request param - bookName, err := getQueryParam(string(body), "name") - if err != nil Led - proxywasm. ogErrorf("param not found: %v", err) - returns types. ctionPause - } - - /3. Request function2 through ABI - inventories, err := proxywasm. nvokeService("id_2", "", bookName) - if err != nil LO - proxywasm.Logrorf("invoke service failed: %v", err) - return types. ctionPause - } - - /4. return result - proxywasm. ppendHttpResponseBody([]byte ("There are " + inventories + " inventories for " + bookName + ".") - return types.ActionContinue -} -``` - -Function2 Primary logic is to receive HTTP requests, then call redisis through ABI and return to redis, as shown below in code: - -```go -func (Ctx *pHeaders) OnHttpRequestBody(bodySize int, endOfStream bool) types.Action 6 - //1. get requested body - body, err := proxywasm.GetHttpRequestBody(0, bodySize) - if err != nil Led - proxywasm. ogErrorf("GetHttpRequestBody failed: %v", err) - returns types.ActionPause - } - bookName:= string(body) - - / 2. get request state from redis by specific key through ABI - inventories, err := proxywastem. etState("redis", bookName) - if err != nil LO - proxywasm.LogErrorf("GetState failed: %v", err) - returns types. ctionPause - } - - / 3. return result - proxywasm.AppendHttpResponseBody([]byte(inventories)) - return types.ActionContinue -} -``` - -2. The Manager component of the Frame 1 WASM is initialized at Mosn filter Init stage as shown below in code: - -```go -// Create a proxy factory for WasmFilter -func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilterChainFactory, error) { - factory := &FilterConfigFactory{ - config: make([]*filterConfigItem, 0, len(confs)), - RootContextID: 1, - plugins: make(map[string]*WasmPlugin), - router: &Router{routes: make(map[string]*Group)}, - } - - for configID, confIf := range confs { - conf, ok := confIf.(map[string]interface{}) - if !ok { - log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory config not a map, configID: %s", configID) - return nil, errors.New("config not a map") - } - // Parse the wasm filter configuration - config, err := parseFilterConfigItem(conf) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory fail to parse config, configID: %s, err: %v", configID, err) - return nil, err - } - - var pluginName string - if config.FromWasmPlugin == "" { - pluginName = utils.GenerateUUID() - - // The WASM plug-in configuration is initialized according to the stream filter configuration. VmConfig is vm_config, and InstanceNum is instance_num - v2Config := v2.WasmPluginConfig{ - PluginName: pluginName, - VmConfig: config.VmConfig, - InstanceNum: config.InstanceNum, - } - - // The WasmManager instance manages the configuration of all plug-ins in a unified manner by managing the PluginWrapper object, providing the ability to add, delete, check and modify. Continue 3 - err = wasm.GetWasmManager().AddOrUpdateWasm(v2Config) - if err != nil { - config.PluginName = pluginName - addWatchFile(config, factory) - continue - } - - addWatchFile(config, factory) - } else { - pluginName = config.FromWasmPlugin - } - config.PluginName = pluginName - - // PluginWrapper wraps the plug-in and configuration in AddOrUpdateWasm above to complete the initialization, which is pulled from sync.Map according to the plug-in name to manage and register the PluginHandler - pw := wasm.GetWasmManager().GetWasmPluginWrapperByName(pluginName) - if pw == nil { - return nil, errors.New("plugin not found") - } - - config.VmConfig = pw.GetConfig().VmConfig - factory.config = append(factory.config, config) - - wasmPlugin := &WasmPlugin{ - pluginName: config.PluginName, - plugin: pw.GetPlugin(), - rootContextID: config.RootContextID, - config: config, - } - factory.plugins[config.PluginName] = wasmPlugin - // Register PluginHandler to provide extended callback capabilities for the plug-in's life cycle, such as the plug-in starting OnPluginStart and updating OnConfigUpdate. Continue 4 - pw.RegisterPluginHandler(factory) - } - - return factory, nil -} -``` - -3 Corresponding to Figure 1 WASM frame, NewWasmPlugin, for creating initialization of the WASM plugin, where VM, Module and Instance refer to virtual machines, modules and instances in WASM, as shown below in code: - -```go -func NewWasmPlugin(wasmConfig v2.WasmPluginConfig) (types.WasmPlugin, error) { - // check instance num - instanceNum := wasmConfig.InstanceNum - if instanceNum <= 0 { - instanceNum = runtime.NumCPU() - } - - wasmConfig.InstanceNum = instanceNum - - // Get the wasmer compilation and execution engine according to the configuration - vm := GetWasmEngine(wasmConfig.VmConfig.Engine) - if vm == nil { - log.DefaultLogger.Errorf("[wasm][plugin] NewWasmPlugin fail to get wasm engine: %v", wasmConfig.VmConfig.Engine) - return nil, ErrEngineNotFound - } - - // load wasm bytes - var wasmBytes []byte - if wasmConfig.VmConfig.Path != "" { - wasmBytes = loadWasmBytesFromPath(wasmConfig.VmConfig.Path) - } else { - wasmBytes = loadWasmBytesFromUrl(wasmConfig.VmConfig.Url) - } - - if len(wasmBytes) == 0 { - log.DefaultLogger.Errorf("[wasm][plugin] NewWasmPlugin fail to load wasm bytes, config: %v", wasmConfig) - return nil, ErrWasmBytesLoad - } - - md5Bytes := md5.Sum(wasmBytes) - newMd5 := hex.EncodeToString(md5Bytes[:]) - if wasmConfig.VmConfig.Md5 == "" { - wasmConfig.VmConfig.Md5 = newMd5 - } else if newMd5 != wasmConfig.VmConfig.Md5 { - log.DefaultLogger.Errorf("[wasm][plugin] NewWasmPlugin the hash(MD5) of wasm bytes is incorrect, config: %v, real hash: %s", - wasmConfig, newMd5) - return nil, ErrWasmBytesIncorrect - } - - // Create the WASM module, which is the stateless binary code that has been compiled - module := vm.NewModule(wasmBytes) - if module == nil { - log.DefaultLogger.Errorf("[wasm][plugin] NewWasmPlugin fail to create module, config: %v", wasmConfig) - return nil, ErrModuleCreate - } - - plugin := &wasmPluginImpl{ - config: wasmConfig, - vm: vm, - wasmBytes: wasmBytes, - module: module, - } - - plugin.SetCpuLimit(wasmConfig.VmConfig.Cpu) - plugin.SetMemLimit(wasmConfig.VmConfig.Mem) - - // Contains module and runtime state to create instance, notable is that here will call proxywasm. RegisterImports registered users realize the Imports of function, Examples include proxy_invoke_service and proxy_get_state -actual := plugin.EnsureInstanceNum(wasmConfig.InstanceNum) - if actual == 0 { - log.DefaultLogger.Errorf("[wasm][plugin] NewWasmPlugin fail to ensure instance num, want: %v got 0", instanceNum) - return nil, ErrInstanceCreate - } - - return plugin, nil -} -``` - -Corresponding to ABI components in Figure 1 WASM frames, the OnPluginStart method calls proxy-wasm-go-host corresponding to ABI Exports and Imports etc. - -```go -// Execute the plugin of FilterConfigFactory -func (f *FilterConfigFactory) OnPluginStart(plugin types.WasmPlugin) { - plugin.Exec(func(instance types.WasmInstance) bool { - wasmPlugin, ok := f.plugins[plugin.PluginName()] - if !ok { - log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory fail to get wasm plugin, PluginName: %s", - plugin.PluginName()) - return true - } - - // 获取 proxy_abi_version_0_2_0 版本的与 WASM 交互的 API - a := abi.GetABI(instance, AbiV2) - a.SetABIImports(f) - exports := a.GetABIExports().(Exports) - f.LayottoHandler.Instance = instance - - instance.Lock(a) - defer instance.Unlock() - - // Use the exports function proxy_get_id (which corresponds to the GetID function in the WASM plug-in) to get the ID of WASM - id, err := exports.ProxyGetID() - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory fail to get wasm id, PluginName: %s, err: %v", - plugin.PluginName(), err) - return true - } - // If you register the ID and the corresponding plug-in in the route, the route can be performed using the key-value pair in the http Header. For example, 'id:id_1' is routed to Function1 based on id_1 - f.router.RegisterRoute(id, wasmPlugin) - - // The root context is created by proxy_on_context_create when the first plug-in is loaded with the given root ID and persists for the entire life of the virtual machine until proxy_on_delete is deleted - // It is worth noting that the first plug-in here refers to a use case where multiple loosely bound plug-ins (accessed via the SDK using the Root ID to the Root Context) share data within the same configured virtual machine [4] - err = exports.ProxyOnContextCreate(f.RootContextID, 0) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][factory] OnPluginStart fail to create root context id, err: %v", err) - return true - } - - vmConfigSize := 0 - if vmConfigBytes := wasmPlugin.GetVmConfig(); vmConfigBytes != nil { - vmConfigSize = vmConfigBytes.Len() - } - - // VM is called when the plug-in is started with the startup - _, err = exports.ProxyOnVmStart(f.RootContextID, int32(vmConfigSize)) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][factory] OnPluginStart fail to create root context id, err: %v", err) - return true - } - - pluginConfigSize := 0 - if pluginConfigBytes := wasmPlugin.GetPluginConfig(); pluginConfigBytes != nil { - pluginConfigSize = pluginConfigBytes.Len() - } - - // Called when the plug-in loads or reloads its configuration - _, err = exports.ProxyOnConfigure(f.RootContextID, int32(pluginConfigSize)) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][factory] OnPluginStart fail to create root context id, err: %v", err) - return true - } - - return true - }) -} -``` - -### Workflow - -The workflow for Layotto Middle WASM is broadly as shown in figure 2 Layotto & Mosn WASM workflow, where the configuration is largely covered by the initial elements above, with a focus on the request processing. -![mosn\_wasm\_ext\_framework\_workflow](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*XTDeRq0alYsAAAAAAAAAAAAAARQnAQ) - -
Figure 2 Layotto & Mosn WAS Workflow
- -By Layotto underneath Mosn, as a workpool schedule, implement the OnReceive method of StreamFilterChain to Wasm StreamFilter in proxy downstream, as configured and detailed in code: below - -```go -func (f *Filter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffer.IoBuffer, trailers api.HeaderMap) api.StreamFilterStatus { - // Gets the id of the WASM plug-in - id, ok := headers.Get("id") - if !ok { - log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestHeaders no id in headers") - return api.StreamFilterStop - } - - // Obtain the WASM plug-in from the router based on its id - wasmPlugin, err := f.router.GetRandomPluginByID(id) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestHeaders id, err: %v", err) - return api.StreamFilterStop - } - f.pluginUsed = wasmPlugin - - plugin := wasmPlugin.plugin - // Obtain an instance of WasmInstance - instance := plugin.GetInstance() - f.instance = instance - f.LayottoHandler.Instance = instance - - // The ABI consists of Exports and Imports, through which users interact with the WASM extension - pluginABI := abi.GetABI(instance, AbiV2) - if pluginABI == nil { - log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive fail to get instance abi") - plugin.ReleaseInstance(instance) - return api.StreamFilterStop - } - // Set the Imports section. The import section is provided by the user. The execution of the virtual machine depends on some of the capabilities provided by the host Layotto, such as obtaining request information, which are provided by the user through the import section and invoked by the WASM extension - pluginABI.SetABIImports(f) - - // The Exports section is provided by the WASM plug-in and can be called directly by the user to wake up the WASM virtual machine and execute the corresponding WASM plug-in code in the virtual machine - exports := pluginABI.GetABIExports().(Exports) - f.exports = exports - - instance.Lock(pluginABI) - defer instance.Unlock() - - // Create the current plug-in context according to rootContextID and contextID - err = exports.ProxyOnContextCreate(f.contextID, wasmPlugin.rootContextID) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to create context id: %v, rootContextID: %v, err: %v", - f.contextID, wasmPlugin.rootContextID, err) - return api.StreamFilterStop - } - - endOfStream := 1 - if (buf != nil && buf.Len() > 0) || trailers != nil { - endOfStream = 0 - } - - // Call proxy-wasm-go-host, encoding the request header in the format specified by the specification - action, err := exports.ProxyOnRequestHeaders(f.contextID, int32(headerMapSize(headers)), int32(endOfStream)) - if err != nil || action != proxywasm.ActionContinue { - log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestHeaders err: %v", err) - return api.StreamFilterStop - } - - endOfStream = 1 - if trailers != nil { - endOfStream = 0 - } - - if buf == nil { - arg, _ := variable.GetString(ctx, types.VarHttpRequestArg) - f.requestBuffer = buffer.NewIoBufferString(arg) - } else { - f.requestBuffer = buf - } - - if f.requestBuffer != nil && f.requestBuffer.Len() > 0 { - // Call proxy-wasm-go-host, encoding the request body in the format specified by the specification - action, err = exports.ProxyOnRequestBody(f.contextID, int32(f.requestBuffer.Len()), int32(endOfStream)) - if err != nil || action != proxywasm.ActionContinue { - log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestBody err: %v", err) - return api.StreamFilterStop - } - } - - if trailers != nil { - // Call proxy-wasm-go-host, encoding the request tail in the format specified by the specification - action, err = exports.ProxyOnRequestTrailers(f.contextID, int32(headerMapSize(trailers))) - if err != nil || action != proxywasm.ActionContinue { - log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestTrailers err: %v", err) - return api.StreamFilterStop - } - } - - return api.StreamFilterContinue -} -``` - -2, proxy-wasm-go-host encode Mosn requests for triplets into the specified format and call Proxy-Wasm ABI equivalent interface in Proxy_on_request_headers and call the WASMER virtual machine to pass the request information to the WASM plugin. - -```go -func (a *ABIContext) CallWasmFunction (functionName string, args ..interface{}) (interface{}, Action, error) um - ff, err := a.Instance. eExportsFunc(functionName) - if err != nil { - return nil, ActionContinue, err - } - - // Call waste virtual machine (Github.com/wasmerio/wasmer-go/wasmer.(*Function).Call at function.go) - res, err := ff. all(args....) - if err != nil L/ - a.Instance.HandleError(err) - return nil, ActionContinue, err - } - - // if we have sync call, e. HttpCall, then unlocked the waste instance and wait until it resp - action := a.Imports.Wait() - - return res, action, nil -} -``` - -3. The WASMER virtual machine is processed to call specific functions of the WASM plug-in, such as the OnHttpRequestBody function in the example - // function, _:= instance.Exports.GetFunction("exported_function") - // nativeFunction = function.Native() - //_ = nativeFunction(1, 2, 3) - // Native converts Function to a native Go function that can be called - -```go -func (self *Function) Native() NativeFunction { - ... - self.lazyNative = func(receivedParameters ...interface{}) (interface{}, error) { - numberOfReceivedParameters := len(receivedParameters) - numberOfExpectedParameters := len(expectedParameters) - ... - results := C.wasm_val_vec_t{} - C.wasm_val_vec_new_uninitialized(&results, C.size_t(len(ty.Results()))) - defer C.wasm_val_vec_delete(&results) - - arguments := C.wasm_val_vec_t{} - defer C.wasm_val_vec_delete(&arguments) - - if numberOfReceivedParameters > 0 { - C.wasm_val_vec_new(&arguments, C.size_t(numberOfReceivedParameters), (*C.wasm_val_t)(unsafe.Pointer(&allArguments[0]))) - } - - // Call functions inside the WASM plug-in - trap := C.wasm_func_call(self.inner(), &arguments, &results) - - runtime.KeepAlive(arguments) - runtime.KeepAlive(results) - ... - } - - return self.lazyNative -} -``` - -4, proxy-wasm-go-sdk converts the requested data from the normative format to a user-friendly format and then calls the user extension code.Proxy-wasm-go-sdk, based on proxy-waste/spec implementation, defines the interface between function access to system resources and infrastructure services, and builds on this integration of the Runtime API, adding ABI to infrastructure access. - -```go -// function1The main logic is to receive the HTTP request, call function2 using the ABI, and return the function2 result. The code is as follows -func (ctx *httpHeaders) OnHttpRequestBody(bodySize int, endOfStream bool) types.Action { - //1. get request body - body, err := proxywasm.GetHttpRequestBody(0, bodySize) - if err != nil { - proxywasm.LogErrorf("GetHttpRequestBody failed: %v", err) - return types.ActionPause - } - - //2. parse request param - bookName, err := getQueryParam(string(body), "name") - if err != nil { - proxywasm.LogErrorf("param not found: %v", err) - return types.ActionPause - } - - //3. request function2 through ABI - inventories, err := proxywasm.InvokeService("id_2", "", bookName) - if err != nil { - proxywasm.LogErrorf("invoke service failed: %v", err) - return types.ActionPause - } - - //4. return result - proxywasm.AppendHttpResponseBody([]byte("There are " + inventories + " inventories for " + bookName + ".")) - return types.ActionContinue -} -``` - -5, WASM plugin is registered at RegisterFunc initialization. For example, Function1 RPC calls Proxy InvokeService,Function2 to get ProxyGetState specified in Redis as shown below in: - -Function1 Call Function2, Proxy InvokeService for Imports function proxy_invoke_service through the Proxy InvokeService - -```go -func ProxyInvokeService(instance common). asmInstance, idPtr int32, idSize int32, methodPtr int32, methodPtr int32, paramPtr int32, resultPtr int32, resultSize int32) int32 56 - id, err := instance. etMemory(uint64(idPtr), uint64(idSize)) - if err != nil LO - returnWasmResultInvalidMemoryAcces.Int32() - } - - method, err := instance. etMemory(uint64 (methodPtr), uint64 (methodSize)) - if err != nil LO - returnWasmResultInvalidMemoryAccess. nt32() - } - - param, err := instance.GetMemory(uint64 (paramPtr), uint64 (paramSize)) - if err != nil Fe - returnn WasmResultInvalidMemoryAccess. nt32() - } - - ctx:= getImportHandler(instance) - - // Laytto rpc calls - ret, res := ctx. nvokeService(string(id), string(param)) - if res != WasmResultOk 6 - return res.Int32() - - - return copyIntoInstance(instance, ret, resultPtr, resultSize).Int32() -} -``` - -Function2 Get Redis via ProxyGetState to specify key Valye, ProxyGetState for Imports function proxy_get_state - -```go -func ProxyGetState(instance common.WasmInstance, storeNamePtr int32, storeNameSize int32, keyPtr int32, valuePtr int32, valueSize int32) int32 Fe - storeName, err := instance. etMemory(uint64 (storeNamePtr), uint64 (storeNameSize)) - if err != nil LO - returnWasmResultInvalidMemoryAccess.Int32() - } - - key, err := instance. etMemory(uint64(keyPtr), uint64(keySize)) - if err != nil LO - returnWasmResultInvalidMemoryAccess.Int32() - } - - ctx := getImportHandler(instance) - - ret, res := ctx. etState(string(storeName), string(key)) - if res != WasmResultOk 6 - return res.Int32() - } - - return copyIntoInstance(instance, ret, valuePtr, valueSize). Int32() -} -``` - -More than the Layotto rpc process is briefly described as the implementation of [5]by two virtual connections using the Dapr API and underneath Mosn, see previous order articles [Layotto source parsing — processing RPC requests] (https://mosn.io/layotto/#/blog/code/layotto-rpc/index), where data from Redis can be obtained directly from Dapr State code and is not developed here. - -### FaaS Mode - -Look back back to the WASM features:bytes code that match the machine code; guarantee good segregation and security in the sandbox; compile cross-platforms, easily distributed, and load running; have lightweight and multilingual flexibilities and seem naturally suitable for FaaS. - -So Layotto also explores support for WASM FaaS mode by loading and running WASM carrier functions and supporting interfaces and access to infrastructure between Function.Since the core logic of loading the WASM has not changed, except that there is a difference between usage and deployment methods and those described above, the Layotto load part of the ASM logic is not redundant. - -In addition to the Wasm-Proxy implementation, the core logic of the FaaS mode is to manage the \*.wasm package and Kubernetes excellent structuring capabilities by expanding Containerd to multiple-run plugins containerd-shim-layotto-v2 [6]and using this "piercing wire" ingenuity to use Docker mirror capability. Specific structures and workflows can be found in Figure 3 Layotto FaaS Workflow. - -![layotto_faas_workflow](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*XWmNT6-7FoEAAAAAAAAAAAAAARQnAQ) - -
Figure 3 Layotto FaaS Workflow
- -Here a simple look at the master function of containerd-shim-layotto-v2. It can be seen that shim.Run runs the WASM as io.containerd.layotto.v2, and runtime_type of the containerd plugins.crimerd.runtimes corresponding to the plugin.When creating a Pod, you specify runtimeClassName: layotto in yaml speed, and eventually kubelet will load and run them when cric-plugin calls containerd-shim-layotto-v2 is running. - -```go -func main() { - startLayotto() - // 解析输入参数,初始化运行时环境,调用 wasm.New 实例化 service 对象 - shim.Run("io.containerd.layotto.v2", wasm.New) -} - -func startLayotto() { - conn, err := net.Dial("tcp", "localhost:2045") - if err == nil { - conn.Close() - return - } - - cmd := exec.Command("layotto", "start", "-c", "/home/docker/config.json") - cmd.Start() -} -``` - -## Summary - -Layotto WebAssemly involves more basic WASM knowledge, but it is understandable that the examples are shallow deeper and gradual.At the end of the spectrum, the ASM technology can be seen to have been applied to many fields such as Web-Front, Serverlessness, Game Scene, Edge Computing, Service Grids, or even to the Docker parent Solomon Hykes recently said: "If the WASM technology is available in 2008, I will not be able to do the Docker" (later added that:Docker will not be replaced and will walk side by side with WASM) The ASM seems to be becoming lighter and better performing cloud-origin technology and being applied to more areas after the VM and Container, while believing that there will be more use scenes and users in Mosn community push and in Layotto continue exploration, here Layotto WebAssemly relevant source code analysis has been completed. Given time and length, some more comprehensive and in-depth profiles have not been carried out, and if there are flaws, welcome fingers, contact:rayo. angzl@gmail.com. - -### References - -- [1] [WebAssembly practice in MOSN](https://mosn.io/blog/posts/mosn-wasm-framework/) -- [2] [feature: WASM plugin framework](https://github.com/mosn/mosn/pull/1589) -- [3] [WebAssembly for Proxies (ABI Spec)](https://github.com/proxy-wasm/spec) -- [4] [Proxy WebAssembly Architecture](https://techhenzy.com/proxy-webassembly-archive/) -- [5] [Layotto source parse — processing RPC requests](https://mosn.io/layotto/#/blog/code/layotto-rpc/index) -- [6] [Cloud native runtime for the next five years](https://www.soft.tech/blog/the-next-fuve-years-of-cloud-native-runtime/) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-blog/exploration-and-practice-of-antcloud-native-application-runtime-archsummit-shanghai.md b/docs/i18n/en-US/docusaurus-plugin-content-blog/exploration-and-practice-of-antcloud-native-application-runtime-archsummit-shanghai.md deleted file mode 100644 index 19977b713f..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-blog/exploration-and-practice-of-antcloud-native-application-runtime-archsummit-shanghai.md +++ /dev/null @@ -1,189 +0,0 @@ -# Ant Cloud Native Apps Exploring and Practice - ArchiSummit - -> The introduction of the Mesh model is a key path to the application of clouds and ant groups have achieved mass landings internally.The sinking of more middleware capabilities, such as Message, DB, Cache Mesh and others, will be the future shape of intermediate technology when the app evolves from Mesh.Apps run to help developers construct cloud native apps quickly and to further decouple apps and infrastructure, while the app runs at the core of API standards, the community is expected to build together. - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*nergRo8-RI0AAAAAAAAAAAAAARQnAQ) - -## Ant Group Mesh Introduction - -Ant is a technology and innovation-driven company, from its earliest days as a payment app on Taobao to its current services -As a large company with 1.2 billion users worldwide, Ant's technical architecture evolution will probably be divided into the following stages: - -Prior to 2006, the earliest payment was a centralized monolithic application with modular development of different businesses. - -In 2007, as more scenes of payments were promoted, an application and data splitting began to be made and some modifications to SOA were made. - -After 2010, rapid payments, mobile payments, support for two-eleven and balance jewels have been introduced, and users have reached the level of hundreds of millions, and the number of ant applications has grown, and ants have developed many full sets of microservice middleware to support ant operations; - -In 2014, like the advent of more business formalities like rush flow, online payments and more scenes, higher requirements for ant availability and stability, ants supported LDC moderation in microservice intermediation, off-site support for business support, and elasticity scaling-up in mixed clouds that support bi-11 ultra-mass traffic. - -In 2020, ant business was not only digital finance, but also the emergence of new strategies such as digital life and internationalization, which prompted us to have a more efficient technical structure that would allow the operation to run faster and more steadily, so ant ants were able to internalize a more popular concept of cloud-origin in the industry. - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*KCSVTZWSf8wAAAAAAAAAAAAAARQnAQ) - -The technical structure of ant can also be seen to evolve along with the business innovations of the company from centralization to SOA to microservices, believing that the classmates with microservices are well known and that the practice of microservices to clouds has been explored by ants themselves in recent years. - -## Why to introduce Service Mesh - -Since ant has a complete set of microservice governance intermediaries, why do you need to introduce Service Mesh? - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*Sq7oR6eO2QAAAAAAAAAAAAAAARQnAQ) - -The service framework for ant self-research is SOFARPC as an example of a powerful SDK that includes a range of capabilities such as discovery of services, routing, melting out streams, etc.In a basic SOFA(Javaa) app, business code integrates SOFARP's SDK, both running in a process.After the large scale of sunk microservice, we faced some of the following problems with: - -**Upgrade cost**:SDK requires business code introduction. Each upgrade requires a change code to be published.Because of the large scale of applications, some major technological changes or safety problems are being repaired.It takes thousands of apps to upgrade each time it takes time. -**Version Fragment**:is highly fragmented, due to the high cost of upgrades, which makes it difficult for us to use historical logic when writing our code and to evolve across technology. -**Cross-language is unmanageable**:ant online applications mostly use Java as a technical stack, but there are many cross-language applications in the front office, AI, Big Data, for example C++/Python/Golang etc. Their service governance capacity is missing due to SDK without a corresponding language. - -We note that some concepts of Service Mesh in the cloud are beginning to emerge, so we are beginning to explore this direction.In the concept of Service Mesh, there are two concepts, one Control Plane Control and one Data Plane Dataplane.The core idea of the data plane is to decouple and to abstract some of the unconnected and complex logic (such as service discovery in RPC calls, service routing, melting breaks, security) into an independent process.As long as there is no change in the communications agreement between the operational and independent processes, the evolution of these capabilities can follow the autonomous upgrading of this independent process and the evolution of the entire Mesh can take place in a unified manner.Our cross-language applications, as long as the traffic passes through our Data Plane, are able to enjoy the capacities related to the governance of the services just mentioned, and the application of infrastructure capabilities to the bottom is transparent and truly cloud. - -## Ant Mesh landing process - -So, starting at the end of 2017, ant began to explore the technical direction of Service Mesh and presented a vision of a unified infrastructure with a sense of business upgrade.The main milestone is: - -The Technology Advance Research Service Mesh technology was launched at the end of 2017 and set the direction for the future; - -Beginning in early 2018 with Golang Self Research Sidecar MOSN and its source, mainly supporting RPC on a two-decimal scale pilot; - -2019 New Message Mesh and DB Mesh shape in 618, covering a number of core links and exponentially 618 - -Two-11 years in 2019, covering hundreds of applications from all high-profile core links, supporting the Big Eleven at that time; - -Twenty and eleven years in 2020, more than 80% of online applications are connected to the Mesh system and can be upgraded from capacity development to full capacity for 2 months. - -## Ant Mesh Landing Architecture - -Mesh at ant landing size is about thousands of applications and hundreds of thousands of levels of containers, a scale that falls in industry to a few and two times without a previous path to learn, so as ant arrives in a complete system of research and development delivery to support the mesh of ants as he arrives. - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*eAlMT7SMTpMAAAAAAAAAAAAAARQnAQ) -Ant Mesh structure is probably our control plane, as shown in the graph, and the service end of the service governance centre, PaaS, monitoring centre, etc. are deployed as some of the existing products.There are also our transport systems, including R&D platforms and PaaS platforms.The middle is our main player data plane MOSN, which manages RPC, messages, MVC, Tasks four streams, as well as basic capabilities for health screening, monitoring, configuration, security, and technical risks, and MOSN blocks some interaction between operations and basic platforms.DBMesh is an independent product in the ant and is not drawn in the graph.Then the top tier is some of our applications that currently support access to many languages such as Java, Nodejs. -For applications, while infrastructure decoupling, access will require an additional upgrade cost, so in order to promote access to the app, ant makes the entire research and development delivery process, including by making the simplest access to the existing framework, by pushing forward in batches to manage risks and progress, and by allowing new applications default access to Mesh to do so. - -At the same time, as sincerity grows, each of the capacities faced some problems of collaboration in R&D, and even of mutual impact on performance and stability, so that for the development effectiveness of the Mesh itself, we have made improvements in modular isolation, dynamic plugging of new capacities, automatic regression, and so on, which can be completed within two months from development to roll-out across the site. - -## Explore on Cloud Native Apps Run - -**New issues and reflections on mass backwardness** - -Ant Mesh has now encountered some new problems with: -cross-language SDK maintenance master:Canada RPC examples. Most of the logic is already sinking into MOSN, but there is still some communication decoding protocol logic in Java, this SDK has some maintenance costs, how many lightweight SDKs, how many languages a team cannot have research and development in all languages. The quality of the Institute's code in this lightweight SDK is a problem. - -A part of the application of the new:ant in business compatible with different environments is deployed both inside the ant and externally exported to financial institutions.When they are deployed to ant the control face of the ant and when the bank is received, the control of the bank is already in place.Most of the applications now contain a layer of their code and temporarily support the next when they meet unsupported components. - -The earliest scenes from Service Mesh to Multi-Mesh:ant are Service Mesh, MOSN intercept traffic through network connecting agents, and other intermediates interact with the server through the original SDK.Now MOSN is more than a Service Mosh, but multi-Mesh, because, with the exception of RPC, we have supported more mesh Mesh landing sites, including messages, configurations, caches, etc.Each sinking intermediate can be seen, and almost all have a lightweight SDK on the side of the app, which, in the context of the first issue just a moment ago, finds a very large amount of lightweight SDK that needs to be maintained.In order to keep the features do not interact with each other, each feature opens different ports, calls with MOSN via different protocol.e.g. RPC protocol for RPC, MQ protocol for messages, cached Redis protocol.Then the current MOSN is more than just a flow orientation. For example, the configuration is to expose the API to use business code. - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*80o8SYwyHJoAAAAAAAAAAAAAARQnAQ) - -To solve the problems and scenes we are thinking about the following points: - -Can the SDK be styled in different intermediaries, languages and languages? - -Can interoperability protocols be unified? - -3. Do we sink under our intermediate part to components or capabilities? - -Can the implementation of the bottom be replaced? - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*hsZBQJg0VnoAAAAAAAAAAAAAARQnAQ) - -## Ant Cloud Native Apps Runtime Structure - -Beginning last March, following several rounds of internal discussions and research into new ideas in industry, we introduced a concept of “cloud native apps” (hereinafter referred to as running on).By definition, we want this operation to include all distributive capabilities that the app cares for, help developers build your cloud native apps quickly, help apps and infrastructure to decouple more! - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*iqQoTYAma4YAAAAAAAAAAAAAARQnAQ) - -The core points of runtime design for cloud-native applications are as follows: - -\*\*First \*\*, due to experience of MOSN sizing and associated shipping systems, we decided to build up our cloud native app on the basis of MOSN kernel. - -\*\*Second \*\*, Abilities instead of Component Orientation, define the APIs for this running time. - -**Third**, the interaction between business code and the Runtime API uses a uniform gRPC protocol so that the side of the business can generate a client directly and directly call through proto file. - -**Four**'s component implementation after ability is replacable, for example, registration service provider may be SOFARegistry, or Nacos or Zookeper. - -**Running abstract capabilities** - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*hWIVR6ccduYAAAAAAAAAAAAAARQnAQ) - -To abstract some of the capabilities most needed for cloud apping, we set a few principles: - -1. Follow the APIs and Scenarios required for distributed apps instead of components; - 2.APIs are intuitive, used in boxes, and are better than configured; - 3.APIs are not bound to implement and differentiate using extension fields. - -With this principle, we abstract out the primary API, which is the app for mosn.proto, the appcallback.proto for the app when running, and the relevant actuator.proto for the app when running.For example, RPC calls, messages, read caches, read configurations are all applied to running, while RPC receipts, messages, incoming task schedules, are applied when running. Other control checks, component management, traffic controls are related to running wikes. - -Three examples of this proto can be seen at: - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*J76nQoLLYWgAAAAAAAAAAAAAARQnAQ) - -**Run Component Controls** - -On the other hand, we have two concepts in MOSN for the purpose of realizing replaceability when running. We call a distribution capability and then have a different component to perform this Service, a service that can be implemented with multiple components, and a component that can deliver multiple services.For example, the example in the graph is that the service with the message "MQ-pub" is implemented by SOFAMQ and Kafka Component, while Kafka Component implements both the message and health check service. -When a transaction is actually requested via a gRPC-generated client, the data will be sent to Runtime via the gRPC protocol and distributed to the next specific implementation.In this way, the app needs to use only the same set of API, which can be implemented differently by the parameters in the request or when the configuration is running. - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*dK9rRLTvtlMAAAAAAAAAAAAAARQnAQ) - -**Compare between runtime and Mesh** - -Based on the above, when the cloud app is running and just just Mesh are easy to compare with: - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*xyu9T74SD9MAAAAAAAAAAAAAARQnAQ) - -Scene -started research last year while the cloud native app is running. The following scenes are currently falling inside the ant area. - -**Isomer Technical Stack Access** - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*8UJhRbBg3zsAAAAAAAAAAAAAARQnAQ) - -In the case of ants, applications in different languages, in addition to the need for RPC service governance, messages, etc., the infrastructure capabilities such as the one-size-fits-all intermediate of the ant are desirable and Java and Nodejs have corresponding SDKs, while the other languages are not corresponding SDKs.After the application runs, these isomer languages can be used directly through GRPC Client to the ant infrastructure. - -**Unbind the manufacturer** - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*eVoqRbkTFFwAAAAAAAAAAAAAARQnAQ) - -As mentioned earlier, ant blockchains, wind control, intelligent support services, financial intermediaries, etc., are scenes where they are deployed on their main stations, where there is either Aliyun or cloud.After running, the app can combine a set of code with a mirror when running. By configuring it to determine which bottom layer of implementation to be called, without being bound to specific implementations.For example, the internal interface between ant is for products such as SOFARegistration and SOFAMQ, and on the cloud is for products such as Nacos, RocketMQ, to Zokeper, Kafka and others.This scenario is in the process of reaching us.Of course, this can also be used for legacy system governance, such as upgrading from SOFAMQ 1.0 to SOFAMQ 2.0, and then running apps need not be upgraded. - -\*\*FaaS Cold Pool Pool \*\* - -FaaS Cool is also a recent scene we are exploring and you know that the Function in FaaS needs to go from Pod creation to Download Function to Start, a process that will be lengthy.After running time, we can create Pod in advance and start up good running. Wait a very simple app logic when the app starts. Test it can be shortened from 5s to 1s.We will continue to explore this direction as well. - -## Planning and outlook - -**API** - -The most important part of the running time is the definition of the API. We already have a more complete set of APIs for the sake of getting inside, but we also see that many products in industry have similar demands, such as dapr, envoy, etc.So one of the next things we will do is to bring together communities to launch a set of recognized cloud native API. - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*d2BORogVotoAAAAAAAAAAAAAARQnAQ) - -**Continuous Open Source** - -We will also develop our internal running practice in the near future, with a release of 0.1 in May and June, and keep a small monthly release pace, aiming to publish 1.0 by the end of the year. - ->![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*Kgr9QLc5TH4AAAAAAAAAAAAAARQnAQ) - -## Summary - -**Last Summary:** - -1.Service Mesh mode introduction is a key path to the application of the cloud; - -Any mesh that allows Mesh to be generated, but the problem of R&D efficiency remains partially present; - -3.Mesh Large-scale landfall is a matter of engineering and requires a complete suite of systems; - -4. Cloud native applications will be the future shape of basic technologies such as intermediaries, further decoupling and distributive capabilities; - -The cloud native app runs at the heart of the API, and the community is expected to build one standard together. - -Extend Reading - -- [Take you into Cloud Native Technology:Native Open Delivery Systems Exploration and Practices](https://mp.weixin.qq.com/s?_biz=MzUzU5Mjc1Nw===\&mid=2247488044\&idx=1\&sn=e6300d4b451723a5001cd3deb17fbc\&chksm=faa0f6cdd774e03ccd91300996747a8e7e109ecf810af147e08c663676946490\&scene=21) - -- [Taking a thousand miles one step at a time: A comprehensive overview of the QUIC protocol landing at Ant Group](https://mp.weixin.qq.com/s?__biz=MzUzMzU5Mjc1Nw==\&mid=2247487717\&idx=1\&sn=ca9452cdc10989f61afbac2f012ed712\&chksm=faa0ff3fcdd77629d8e5c8f6c42af3b4ea227ee3da3d5cdf297b970f51d18b8b1580aac786c3\&scene=21) - -- [Rust's emerging field showing its prowess: confidential computing](https://mp.weixin.qq.com/s?__biz=MzUzMzU5Mjc1Nw==\&mid=2247487576\&idx=1\&sn=0d0575395476db930dab4e0f75e863e5\&chksm=faa0ff82cdd77694a6fc42e47d6f20c20310b26cedc13f104f979acd1f02eb5a37ea9cdc8ea5\&scene=21) - -- [Protocol Extension Base on Wasm — protocol extension](https://mp.weixin.qq.com/s?_biz=MzUzU5Mjc1Nw===\&mid=2247487546\&idx=1\&sn=72c3f1e27ca4ace788e11ca20d5f9\&chksm=faa0ffe0cd776f6d17323466b500acee50a371663f18da34d8e4d72304d7681cf589b45\&scene=21) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-blog/mosn-subproject-layotto-opening-a-new-chapter-in-service-grid-application-runtime/index.md b/docs/i18n/en-US/docusaurus-plugin-content-blog/mosn-subproject-layotto-opening-a-new-chapter-in-service-grid-application-runtime/index.md deleted file mode 100644 index 52e21acddc..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-blog/mosn-subproject-layotto-opening-a-new-chapter-in-service-grid-application-runtime/index.md +++ /dev/null @@ -1,269 +0,0 @@ -# MOSN subproject Layotto:opens the service grid + new chapter when app runs - -> Author profile: -> Magnetic Army. Fancy is an ancient one, cultivating for many years in the infrastructure domain, with in-depth practical experience of Service Mosh, and currently responsible for the development of projects such as MOSN, Layotto and others in the middle group of ant groups. -> Layotto official GitHub address: [https://github.com/mosn/layotto](https://github.com/mosn/layotto) - -Click on a link to view the live video:[https://www.bilibili.com/video/BV1hq4y1L7FY/](https://www.bilibili.com/video/BV1hq4y1L7FY/) - -Service Mesh is already very popular in the area of microservices, and a growing number of companies are starting to fall inside, and ants have been investing heavily in this direction from the very beginning of Service Mesh programme. So far, the internal Mesh programme has covered thousands of applications, hundreds of thousands of containers and has been tested many times, the decoupling of business coupling brought about by Service Mosh, smooth upgrades and other advantages have greatly increased iterative efficiency in intermediaries. - -We have encountered new problems after mass landings, and this paper focuses on a review of service Mesh's internal landings and on sharing solutions to new problems encountered after service Mesh landing. - -## Service Mesh Review and Summary - -### Instrument for standardized international reporting of military expenditures - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*p8tGTbpLRegAAAAAAAAAAAAAARQnAQ) -> Under the microservice architecture, infrastructure team typically provides a SDK that encapsulates the ability to govern the various services, while ensuring the proper functioning of the application, it is also clear that each infrastructure team iterates a new feature that requires the involvement of the business party to use it, especially in the bug version of the framework, often requiring a forceful upgrade of the business side, where every member of the infrastructure team has a deep sense of pain. - -The difficulties associated with upgrading are compounded by the very different versions of the SDK versions used by the application and the fact that the production environment runs in various versions of the SDK, which in turn makes it necessary to consider compatibility for the iterations of new functions as if they go ahead with the shacks, so that the maintenance of the code is very difficult and some ancestral logic becomes uncareful. - -The development pattern of the “heavy” SDKs makes the governance of the isomer language very weak and the cost of providing a functionally complete and continuously iterative SDK for all programming languages is imaginable. - -In 18 years, Service Mesh continued to explode in the country, a framework concept designed to decouple service governance capacity with business and allow them to interact through process-level communications.Under this architecture model, service governance capacity is isolated from the application and operated in independent processes, iterative upgrading is unrelated to business processes, which allows for rapid iterations of service governance capacity, and each version can be fully upgraded because of the low cost of upgrading, which has addressed the historical burden and the SDK “light” directly reduces the governance threshold for isomer languages and no longer suffers from the SDK that needs to develop the same service governance capability for each language. - -### Current status of service Mesh landings - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*rRG_TYlHMqYAAAAAAAAAAAAAARQnAQ) -> 蚂蚁很快意识到了 Service Mesh 的价值,全力投入到这个方向,用 Go 语言开发了 MOSN 这样可以对标 envoy 的优秀数据面,全权负责服务路由,负载均衡,熔断限流等能力的建设,大大加快了公司内部落地 Service Mesh 的进度。 - -Now that MOSN has overwritten thousands of apps and hundreds of thousands of containers inside ant ants, newly created apps have default access to MOSN to form closers.And MOSN handed over a satisfactory: in terms of resource occupancy and loss of performance that is of greatest concern to all. - -1. RT is less than 0.2 ms - -2. Increase CPU usage by 0% to 2% - -3. Memory consumption growth less than 15M - -The technical stack of the NodeJS, C+++ isomers is also continuously connected to MOSN due to the Service Mesh service management thresholds that lower the isomer language. - -After seeing the huge gains from RPC capacity Mih, internal ants also transformed MQ, Cache, Config and other middleware capabilities, sinking to MOSN, improving the iterative efficiency of the intermediate product as a whole. - -### C. New challenges - -1. Apply strong binding to infrastructure - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*nKxcTKLp4EoAAAAAAAAAAAAAARQnAQ) -> A modern distributed application often relies on RPC, Cache, MQ, Config and other distributed capabilities to complete the processing of business logic. - -When RPC was initially seen, other capabilities were quickly sinking.Initially, they were developed in the most familiar way, leading to a lack of integrated planning management, as shown in the graph above, which relied on SDKs of a variety of infrastructure, and in which SDK interacted with MOSN in a unique way, often using private agreements provided by the original infrastructure, which led directly to a complex intermediate capability, but in essence the application was tied to the infrastructure, such as the need to upgrade the SDK from Redis to Memcache, which was more pronounced in the larger trend of the application cloud, assuming that if an application was to be deployed on the cloud, because the application relied on a variety of infrastructures, it would be necessary to move the entire infrastructure to the cloud before the application could be successfully deployed. -So how to untie the application to the infrastructure so that it can be transplantable and that it can feel free to deploy across the platform is our first problem. - -2. Isomal language connectivity - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*oIdQQZmgtyUAAAAAAAAAAAAAARQnAQ) -> It has been proved that Service Mesh does reduce the access threshold of heterogeneous languages, but after more and more basic capabilities sink to MOSN, we gradually realized that in order to allow applications to interact with MOSN, various SDKS need to develop communication protocols and serialization protocols. If you add in the need to provide the same functionality for a variety of heterogeneous languages, the difficulty of maintenance increases exponentially - -Service Mesh has made the SDK historic, but for the current scenario of programming languages and applications with strong infrastructural dependence, we find that the existing SDK is not thin enough, that the threshold for access to the isomer language is not low enough and that the threshold for further lowering the isomer language is the second problem we face. - -## Multi Runtime Theory Overview - -### A, what is Runtime? - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*hQT-Spc5rI4AAAAAAAAAAAAAARQnAQ) -> In the early 20th century, Bilgin lbryam published a paper called -> Multi-Runtime Microservices Architecture -> This article discusses the shape of the next phase of microservices architecture. - -As shown in the graph above, the author abstracts the demand for distributed services and is divided into four chaos: - -1. Life Cycle (Lifecycle) - mainly refers to compilation, packing, deployment and so forth, and is largely contracted by docker and kubernetes in the broad cloud of origins. - -2. Network (Networking) - A reliable network is the basic guarantee of communication between microservices, and Service Mesh is trying to do so and the stability and usefulness of the current popular data face of MOSN and envoy have been fully tested. - -3. The status (State) - services that are required for distribution systems, workflow, distribution single, dispatching, power equivalent, state error restoration, caching, etc. can be uniformly classified as bottom status management. - -4. Binding (Binding) - requires not only communication with other systems but also integration of various external systems in distributed systems, and therefore has strong reliance on protocol conversion, multiple interactive models, error recovery processes, etc. - -After the need has been clarified, drawing on the ideas of Service Mesh, the author has summarized the evolution of the distributed services architecture as: below. - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*rwS2Q5yMp_sAAAAAAAAAAAAAARQnAQ) -> Phase I is to decouple infrastructure capabilities from the application and to convert them into an independent residecar model that runs with the application. - -The second stage is to unify the capabilities offered by the sidecar into a single settlement run from the development of the basic component to the development of the various distributive capabilities to the development of the various distributive capacities, completely block the details of the substrate and, as a result of the ability orientation of the API, the application no longer needs to rely on SDK from a wide range of infrastructures, except for the deployment of the APIs that provide the capabilities. - -The author's thinking is consistent with what we want to resolve, and we have decided to use the Runtime concept to solve the new problems that Service Mesh has encountered to date. - -### B, Service Mesh vs Runtime - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*srPVSYTEHc4AAAAAAAAAAAAAARQnAQ) -> In order to create a clearer understanding of Runtime, a summary of Service Mesh with regard to the positioning, interaction, communication protocols and capacity richness of the two concepts of Runtime is shown, as can be seen from Service Mosh, when Runtime provides a clearly defined and capable API, making the application more straightforward to interact with it. - -## MOSN sub-project Layotto - -### A, dapr research - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*Ab9HSYIK7CQAAAAAAAAAAAAAARQnAQ) -> dapr is a well-known Runtime product in the community and has a high level of activity, so we first looked at the dapr case, finding that the dapr has the following advantage of: - -1. A variety of distributive capabilities are provided, and the API is clearly defined and generally meets the general usage scenario. - -2. Different delivery components are provided for each capability, essentially covering commonly used intermediate products that can be freely chosen by users as needed. - -When considering how to set up a dapr within a company, we propose two options, such as the chart: above - -1. Replace:with the current MOSN and replace with the dapr. There are two problems with: - -Dapr does not currently have the full range of service governance capabilities included in Service Mesh although it provides many distributive capabilities. - -b. MOSN has fallen on a large scale within the company and has been tested on numerous occasions with the direct replacement of MOSN stability by a dapr. - -2. In:, add a dapr container that will be deployed with MOSN in two sidecar mode.This option also has two problems with: - -The introduction of a new sidecar will require consideration of upgrading, monitoring, infusion and so forth, and the cost of transport will soar. - -b. The increased maintenance of a container implies an additional risk of being hacked and this reduces the availability of the current system. - -Similarly, if you are currently using envoy as a data face, you will also face the above problems. -We therefore wish to combine Runtime with Service Mesh and deploy through a full sidecar to maximize the use of existing MSh capabilities while ensuring stability and the constant cost of delivery.In addition, we hope that, in addition to being associated with MOSN, the capacity of the RPF will be combined in the future with envoy to solve the problems in more scenarios, in which Layotto was born. - -### Layout B & Layout - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*sdGoSYB_XFUAAAAAAAAAAAAAARQnAQ) -> As shown in the above chart, Layotto is above all over the infrastructure and provides a standard API for upper-tier applications with a uniform range of distributive capabilities.For Layotto applications, developers no longer need to care for differences in the implementation of substrate components, but just what competencies the app needs and then call on the adaptive API, which can be completely untied to the underlying infrastructure. - -For applications, interaction is divided into two blocks, one as a standard API for GRPC Clients calling Layotto and another as a GRPC Server to implement the Layotto callback and benefit from the gRPC excellent cross-language support capability, which no longer requires attention to communications, serialization, etc., and further reduces the threshold for the use of the technical stack of isomers. - -In addition to its application-oriented, Layotto also provides a unified interface to the platform that feeds the app along with the sidecar state of operation, facilitates SRE peer learning to understand the state of the app and make different initiatives for different states, taking into account existing platform integration with k8s and so we provide access to HTTP protocol. - -In addition to Layotto itself design, the project involves two standardized constructions, firstly to develop a set of terminological clocks; the application of a broad range of APIs is not an easy task. We have worked with the Ari and Dapr communities in the hope that the building of the Runtime API will be advanced, and secondly for the components of the capabilities already achieved in the dapr community, our principle is to reuse, redevelop and minimize wasting efforts over existing components and repeat rotations. - -In the end, Layotto is now built over MOSN, we would like Layotto to be able to run on envoy, so that you can increase Runtime capacity as long as you use Service Mesh, regardless of whether the data face is used by MOSN or envoy. - -### C, Layotto transplantation - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*2DrSQJ6GL8cAAAAAAAAAAAAAARQnAQ) -> As shown in the graph above, once the standardisation of the Runtime API is completed, access to Layotto applications is naturally portable, applications can be deployed on private clouds and various public clouds without any modification, and since standard API is used, applications can be freely switched between Layotto and dapr without any modification. - -### Meaning of name - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*CCckTZ_gRsMAAAAAAAAAAAAAARQnAQ) -> As can be seen from the above schematic chart, the Layotto project itself is intended to block the details of the infrastructure and to provide a variety of distributive capabilities to the upper level of application. This approach is as if it adds a layer of abstraction between the application and the infrastructure, so we draw on the OSI approach to defining a seven-tiered model of the network and want Layot to serve the eighth tier of the application, to be 8 in Italian, Layer otto is meant to simplify to become Layotto, along with Project Code L8, which is also the eighth tier and is the source of inspiration for - -An overview of the completion of the project is presented below, with details of the achievement of four of its main functions. - -### E. Configuration of original language - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*mfkRQZH3oNwAAAAAAAAAAAAAARQnAQ) -> First is the configuration function commonly used in distributed systems, applications generally use the configuration center to switch or dynamically adjust the running state of the application.The implementation of the configuration module in Layotto consists of two parts. One is a reflection on how to define the API for this capability, and one is a specific implementation, each of which is seen below. - -It is not easy to define a configuration API that meets most of the actual production demands. Dapr currently lacks this capability, so we worked with Ali and the Dapr community to engage in intense discussions on how to define a version of a reasonable configuration API. - -As the outcome of the discussions has not yet been finalized, Layotto is therefore based on the first version of the draft we have submitted to the community, and a brief description of our draft is provided below. - -We first defined the basic element: for general configuration - -1. appId:indicates which app the configuration belongs to - -2. Key configured for key: - -3. Value of content:configuration - -4. group:configurations are configured. If an appId is too many configurations, we can group these configurations for maintenance. - -In addition, we added two advanced features to suit more complex configurations using Scene: - -1. label, used to label configurations, such as where the configuration belongs, and when conducting configuration queries, we'll use label + key to query configuration. - -2. tags, users give configuration additional information such as description, creator information, final modification time, etc. to facilitate configuration management, audits, etc. - -For the specific implementation of the configuration API as defined above, we currently support query, subscription, delete, create, and modify five kinds of actions in which subscriptions to configuration changes use the stream feature of GRPC and the components where the configuration capacity is implemented at the bottom, we have selected the domestically popular apollo and will add others later depending on demand. - -### F: Pub/Sub - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*YJs-R6WFhkgAAAAAAAAAAAAAARQnAQ) -> for Pub/Sub capabilities, we have explored the current implementation of dapr and have found that we have largely met our needs, so we have directly reintroduced the Dapr API and components that have been suitably matched in Layotto, which has saved us a great deal of duplication and we would like to maintain a collaborative approach with the dapr community rather than repeat the rotation. - -Pub is an event interface provided by the App calls Layotto and the Sub function is one that implements ListTopicSubscriptions with OnTopicEvent in the form of a gRPC Server, one that tells Layotto apps that need to subscribe to which topics, and a callback event for Layotto receive a change in top. - -Dapr for the definition of Pub/Sub basically meets our needs, but there are still shortfalls in some scenarios, dapr uses CloudEvent standards, so the pub interface does not return value, which does not meet the need in our production scenes to require pub messages to return to the messageID that we have already submitted the needs to dapr communities, and we are waiting for feedback, taking into account mechanisms for community asynchronous collaboration, we may first increase the results and then explore with the community a better compatibility programme. - -### G and RPC original - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*i-JnSaeZbJ4AAAAAAAAAAAAAARQnAQ) -> The capacity of RPC is not unfamiliar and may be the most basic needs under the microservice architecture, the definition of RPC interfaces, we also refer to the dapr community definition and therefore the interface definition is fully responsive to our needs and thus the interface definition is a direct reuse of dapr but the current RPC delivery programme provided by dapr is still weak, and MOSN is very mature over the years, This is a brave combination of Runtime with Service Mesh and MOSN itself as a component of our capacity to implement RPC and thereby Layotto submit to MOSN for actual data transfer upon receipt of RPC requests, The option could change routing rules through istio, downgraded flow and so on, which would amount to a direct replication of Service Mesh's capabilities. This would also indicate that Runtime is not about listing the Service Mesh, but rather a step forward on that basis. - -In terms of details, in order to better integrate with MOSN, we have added one Channel, default support for dubbo, bolt, HTTP three common RPC protocols to the RPC. If we still fail to meet the user scene, we have added Before/After filter to allow users to customize extensions and implement protocol conversions, etc. - -### H, Actuator - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*E_Q-T4d_bm4AAAAAAAAAAAAAARQnAQ) -> In actual production environments, in addition to the various distributive capabilities required for the application, we often need to understand the operational state of the application, based on this need, we abstract an actuator interface, and we currently do not have the capability to do so at the moment, dapr and so we are designed on the basis of internal demand scension scenarios to expose the full range of information on the application at the startup and running stages, etc. - -Layotto divides the exposure information into an individual: - -1. Health:This module determines whether the app is healthy, e.g. a strongly dependent component needs to be unhealthy if initialization fails, and we refer to k8s for the type of health check to: - -a. Readiness:indicates that the app is ready to start and can start processing requests. - -b. Liveness:indicates the state of life of the app, which needs to be cut if it does not exist. - -2. Info:This module is expected to expose some of the dependencies of the app, such as the service on which the app depends, the subscription configuration, etc. for troubleshooting issues. - -Health exposure health status is divided into the following Atlash: - -1. INIT:indicates that the app is still running. If the app returns this value during the release process, the PaaS platform should continue waiting for the app to be successfully started. - -2. UP:indicates that the app is starting up normally, and if the app returns this value, the PasS platform can start loading traffic. - -3. DOWN:indicates that the app failed to boot, meaning PaaS needs to stop publishing and notify the app owner if the app returns this value during the release process. - -The search for Layotto is now largely complete in the Runtime direction, and we have addressed the current problems of infrastructure binding and the high cost of isomer language access using a standard interactive protocol such as gRPC to define a clearly defined API.As the future API standardises the application of Layotto can be deployed on various privately owned and publicly owned clouds, on the one hand, and free switching between Layotto, dapr and more efficient research and development, on the other. - -Currently, Serverless fields are also flown and there is no single solution, so Layotto makes some attempts in Serverless directions, in addition to the input in the Runtime direction described above. - -## Exploring WebAssembly - -### Introduction to the Web Assembly - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*-ACRSpqbuJ0AAAAAAAAAAAAAARQnAQ) -> WebAssembly, abbreviated WASM, a collection of binary commands initially running on the browser to solve the JavaScript performance problems, but due to its good safety, isolation, and linguistic indifference, one quickly starts to get it to run outside the browser. With the advent of the WASI definition, only one WASM will be able to execute the WAS document anywhere. - -Since WebAssembly can run outside the browser, can we use it in Serverless fields?Some attempts had been made in that regard, but if such a solution were to be found to be a real one, it would be the first question of how to address the dependence of a functioning Web Assembly on infrastructure. - -### Principles of B and Web Assembly landing - -Currently MOSN runs on MOSN by integrating WASM Runtime to meet the need for custom extensions to MOSN.Layotto is also built over MOSN so we consider combining the two in order to implement the following graph: - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*U7UDRYyBOvIAAAAAAAAAAAAAARQnAQ) -> Developers can develop their code using a variety of preferred languages such as Go/C+/Rust and then run them over MOSN to produce WASM files and call Layotto provide standard API via local function when WASM style applications need to rely on various distribution capabilities in processing requests, thereby directly resolving the dependency of WASM patterns. - -Layotto now provides Go with the implementation of the Rust version of WASM, while supporting the demo tier function only, is enough for us to see the potential value of such a programme. - -In addition, the WASM community is still in its early stages and there are many places to be refined, and we have submitted some PRs to the community to build up the backbone of the WASM technology. - -### C. WebAssembly Landscape Outlook - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*NzwKRY2GZPcAAAAAAAAAAAAAARQnAQ) -> Although the use of WAS in Layotto is still in the experimental stage, we hope that it will eventually become a service unless it is developed through a variety of programming languages, as shown in the graph above, and then codify the WASM document, which will eventually run on Layotto+MOSN, while the application wiki management is governed by k8, docker, prometheus and others. - -## Community planning - -Finally, look at what Layotto does in the community. - -### A, Layotto vs Dapr - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*OpQTRqoMpK0AAAAAAAAAAAAAARQnAQ) -> Charted Layotto in contrast to the existing capabilities in Layotto, our development process at Layotto, always aim to achieve the goal of a common building, based on the principle of re-use, secondary development, and for the capacity being built or to be built in the future, we plan to give priority to Layotto and then to the community to merge into standard API, so that in the short term it is possible that the Layotto API will take precedence over the community, but will certainly be unified in the long term, given the mechanism for community asynchronous collaboration. - -### The APP - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*nKxcTKLp4EoAAAAAAAAAAAAAARQnAQ) -> We have had extensive discussions in the community about how to define a standard API and how Layotto can run on envoy, and we will continue to do so. - -### C, Road map - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*iUV3Q7S3VLEAAAAAAAAAAAAAARQnAQ) -> Layotto currently support four major functionalities in support of RPC, Config, Pub/Sub, Actuator and is expected to devote attention to distribution locks and observations in September, and Layotto plugging in December, which it will be able to run on envoy, with the hope that further outputs will be produced for the WebCongress exploration. - -### Official open source - -> ![](https://gw.alipayobjects.com/mdn/rms_1c90e8/afts/img/A*S6mdTqAapLQAAAAAAAAAAAAAARQnAQ) -> gave a detailed presentation of the Layotto project and most importantly the project is being officially opened today as a sub-project of MOSN and we have provided detailed documentation and demo examples to facilitate quick experience. - -The construction of the API standardization is a matter that needs to be promoted over the long term, while standardization means not meeting one or two scenarios, but the best possible fitness for most use scenarios, so we hope that more people can participate in the Layotto project, describe your use scenario, discuss the API definition options, come together to the community, ultimately reach the ultimate goal of Write once, Run any! diff --git a/docs/i18n/en-US/docusaurus-plugin-content-blog/options.json b/docs/i18n/en-US/docusaurus-plugin-content-blog/options.json deleted file mode 100644 index 8337316afc..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-blog/options.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "title": { - "message": "Blog", - "description": "The title for the blog used in SEO" - }, - "description": { - "message": "Blog", - "description": "The description for the blog used in SEO" - }, - "sidebar.title": { - "message": "All Post", - "description": "The label for the left sidebar" - } -} diff --git a/docs/i18n/en-US/docusaurus-plugin-content-blog/tcpcopy_code_analyze.md b/docs/i18n/en-US/docusaurus-plugin-content-blog/tcpcopy_code_analyze.md deleted file mode 100644 index e02beaf4ea..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-blog/tcpcopy_code_analyze.md +++ /dev/null @@ -1,170 +0,0 @@ -# Source Parse 4 Layer Traffic Governance, tcp traffic dump - -> Author profile: -> Giggon, is an open source community lover committed to embracing open sources. -> -> Writing on: April 26, 2022 - -## Overview - -The purpose of this document is to analyze the implementation of tcp traffic dump - -## Prerequisite: - -Document content refers to the following version of the code - -[https://github.com/mosn/layotto](https://github.com/mosn/layotto) - -Layotto 0e97e97e970dc504e0298017bd956d2841c44c0810b (main) - -## Source analysis - -### Code in: [tcpcopy CODE](https://github.com/mosn/layotto/tree/main/pkg/filter/network/tcpcopy) - -### model.go analysis - -This is the core class of tcpcopy's configuration objects - -```go -Type DumpConfig struct {- - Switch `json:"twitch"` // dump switch. Values:'ON' or 'OFF' - Interval int `json:"interval" //dump sampling interval Unit: Second - Duration int `json:"duration"// Single Sampling Cycle Unit: Second - CpuMaxate float64 `json:"cpu_max_rate"\/ cpu Maximum usage The ump feature will stop - MemMaxRate float64 `json:"mem_max_rate"` // mem maximum usage. When this threshold is exceeded, The ump feature will stop -} - -Type DumpUpadDynamic Architect 6 - Unique_sample_windowing string// Specify sample window - BusinessType _type. usinessType // Business Type - Port string // Port - Binary_flow_data []byte// binary data - Portrait_data string // User uploaded data -} -``` - -### persistence.go analysis - -This is the dump persistent core processing class of tcpcopy - -```go -// This method is called in OnData in tcpcopy.go -func IsPersistence() bool { - // 判断 dump 开关是否开启 - if !strategy.DumpSwitch { - if log.DefaultLogger.GetLogLevel() >= log.DEBUG { - log.DefaultLogger.Debugf("%s the dump switch is %t", model.LogDumpKey, strategy.DumpSwitch) - } - return false - } - - // Check whether it is in the sampling window - if atomic.LoadInt32(&strategy.DumpSampleFlag) == 0 { - if log.DefaultLogger.GetLogLevel() >= log.DEBUG { - log.DefaultLogger.Debugf("%s the dump sample flag is %d", model.LogDumpKey, strategy.DumpSampleFlag) - } - return false - } - - // Check whether the dump function is stopped. Obtain the system load and check whether the processor and memory exceeds the threshold of the tcpcopy. If yes, stop the dump function. - if !strategy.IsAvaliable() { - if log.DefaultLogger.GetLogLevel() >= log.DEBUG { - log.DefaultLogger.Debugf("%s the system usages are beyond max rate.", model.LogDumpKey) - } - return false - } - - return true -} - -// Persist data based on configuration information -func persistence(config *model.DumpUploadDynamicConfig) { - // 1.Persisting binary data - if config.Binary_flow_data != nil && config.Port != "" { - if GetTcpcopyLogger().GetLogLevel() >= log.INFO { - GetTcpcopyLogger().Infof("[%s][%s]% x", config.Unique_sample_window, config.Port, config.Binary_flow_data) - } - } - if config.Portrait_data != "" && config.BusinessType != "" { - // 2. Persisting Binary data Persisting user-defined data - if GetPortraitDataLogger().GetLogLevel() >= log.INFO { - GetPortraitDataLogger().Infof("[%s][%s][%s]%s", config.Unique_sample_window, config.BusinessType, config.Port, config.Portrait_data) - } - - // 3. Changes in configuration information in incrementally persistent memory - buf, err := configmanager.DumpJSON() - if err != nil { - if log.DefaultLogger.GetLogLevel() >= log.DEBUG { - log.DefaultLogger.Debugf("[dump] Failed to load mosn config mem.") - } - return - } - // 3.1. dump if the data changes - tmpMd5ValueOfMemDump := common.CalculateMd5ForBytes(buf) - memLogger := GetMemLogger() - if tmpMd5ValueOfMemDump != md5ValueOfMemDump || - (tmpMd5ValueOfMemDump == md5ValueOfMemDump && common.GetFileSize(getMemConfDumpFilePath()) <= 0) { - md5ValueOfMemDump = tmpMd5ValueOfMemDump - if memLogger.GetLogLevel() >= log.INFO { - memLogger.Infof("[%s]%s", config.Unique_sample_window, buf) - } - } else { - if memLogger.GetLogLevel() >= log.INFO { - memLogger.Infof("[%s]%+v", config.Unique_sample_window, incrementLog) - } - } - } -} -``` - -### tcpcopy.go analysis - -This is the core class of tcpcopy. - -```go -// Sign up to NetWork -func init() with MFA - api. egisterNetwork("tcpcopy", CreateTccopyFactory) -} - -// returns tcpcopy Factory -func CreateTccopyFactory(cfg map[string]interface{}) (api. etworkFilterChainFactory, error) LO - tcpConfig := &config{} - // dump policy transition to static configuration - if stg, ok := cfg["strategy"]; ok { - ... - } - //TODO excerpt some other fields - return &tcpcopyFactoryLU - cfg: tcpConfig, - }, nil -} - -// for pkg/configmanager/parser. o Call to add or update Network filter factory -func (f *tcpcopyFactory) Init(param interface{}) error error 56 - // Set listening address and port configuration - ... - return nil -} - -// implements the OnData Interface of ReadFilter, processing -func (f *tcpcopyFactory) OnData(data types.IoBuffer) (res api. ilterStatus) online - // Determines whether the current requested data requires sampling dump - if !persiste.Isistence() { - return api.Continue - } - - // Asynchronous sample dump - config := model.NewDumpUpadDynamic Config(strategy. umpSampleUuid, "", f.cfg.port, data.Bytes(), "") - persistence.GetDumpWorkPoolInstance().Schedule(config) - return api.Continue -} -``` - -Finally, we look back at the overall process progress: - -1. Starting from the initialization function init() of tccopy.go to CreateGRPCServerFilterFactory Incoming CreateTcpcopyFactory. - -2. Mosn created a filter chain (code position[factory.go](https://github.com/mosn/mosn/tree/master/pkg/filter/network/proxy/factory.go)) by circulating CreateFilterChain to add all filters to the chain structure, including tccopy. - -3. When the traffic passes through mosn will enter the tcpcopy.go OnData method for tcpcopump logical processing. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current.json b/docs/i18n/en-US/docusaurus-plugin-content-docs/current.json deleted file mode 100644 index 86fe27e7df..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current.json +++ /dev/null @@ -1,487 +0,0 @@ -{ - "version.label": { - "message": "Next", - "description": "The label for version current" - }, - - "sidebar.mySidebar.category.快速开始": { - "message": "Quick Start", - "description": "The label for category 快速开始 in sidebar mySidebar" - }, - "sidebar.mySidebar.category.使用Configuration API": { - "message": "Use Configuration API", - "description": "The label for category 使用Configuration API in sidebar mySidebar" - }, - "sidebar.mySidebar.category.API插件": { - "message": "API Plugin", - "description": "The label for category API插件 in sidebar mySidebar" - }, - "sidebar.mySidebar.category.作为 Istio 的数据面": { - "message": "As the data plane for Istio", - "description": "The label for category 作为 Istio 的数据面 in sidebar mySidebar" - }, - "sidebar.mySidebar.category.在四层网络进行流量干预": { - "message": "Performing traffic intervention at the four-layer network", - "description": "The label for category 在四层网络进行流量干预 in sidebar mySidebar" - }, - "sidebar.mySidebar.category.在七层网络进行流量干预": { - "message": "Performing traffic intervention at the seven-layer network", - "description": "The label for category 在七层网络进行流量干预 in sidebar mySidebar" - }, - "sidebar.mySidebar.category.可观测性": { - "message": "Observability", - "description": "The label for category 可观测性 in sidebar mySidebar" - }, - "sidebar.mySidebar.category.用户手册": { - "message": "User Manual", - "description": "The label for category 用户手册 in sidebar mySidebar" - }, - "sidebar.mySidebar.category.功能介绍": { - "message": "Feature Introduction", - "description": "The label for category 功能介绍 in sidebar mySidebar" - }, - "sidebar.mySidebar.category.可扩展性": { - "message": "Scalability", - "description": "The label for category 可扩展性 in sidebar mySidebar" - }, - "sidebar.mySidebar.category.运维手册": { - "message": "Operations Manual", - "description": "The label for category 运维手册 in sidebar mySidebar" - }, - "sidebar.mySidebar.category.如何配置 Layotto": { - "message": "How To Config Layotto", - "description": "The label for category 如何配置 Layotto in sidebar mySidebar" - }, - "sidebar.mySidebar.category.组件配置说明": { - "message": "Component Config Instruction", - "description": "The label for category 组件配置说明 in sidebar mySidebar" - }, - "sidebar.mySidebar.category.State": { - "message": "State", - "description": "The label for category State in sidebar mySidebar" - }, - "sidebar.mySidebar.category.Pub/Sub": { - "message": "Pub/Sub", - "description": "The label for category Pub/Sub in sidebar mySidebar" - }, - "sidebar.mySidebar.category.Distributed Lock": { - "message": "Distributed Lock", - "description": "The label for category Distributed Lock in sidebar mySidebar" - }, - "sidebar.mySidebar.category.Sequencer": { - "message": "Sequencer", - "description": "The label for category Sequencer in sidebar mySidebar" - }, - "sidebar.mySidebar.category.设计文档": { - "message": "Design Doc", - "description": "The label for category 设计文档 in sidebar mySidebar" - }, - "sidebar.mySidebar.category.贡献指南": { - "message": "Contribute Guide", - "description": "The label for category 贡献指南 in sidebar mySidebar" - }, - "sidebar.mySidebar.category.想要贡献文档?": { - "message": "Want to contribute doc?", - "description": "The label for category 想要贡献文档? in sidebar mySidebar" - }, - "sidebar.mySidebar.category.想要修改proto文件或API定义?": { - "message": "Want to modify proto files or API definitions?", - "description": "The label for category 想要修改proto文件或API定义? in sidebar mySidebar" - }, - "sidebar.mySidebar.category.如何给 issue 打 label": { - "message": "How to label issue", - "description": "The label for category 如何给 issue 打 label in sidebar mySidebar" - }, - "sidebar.mySidebar.category.社区": { - "message": "Community", - "description": "The label for category 社区 in sidebar mySidebar" - }, - "sidebar.mySidebar.link.java sdk": { - "message": "java sdk", - "description": "The label for link java sdk in sidebar mySidebar, linking to https://github.com/layotto/java-sdk" - }, - "sidebar.mySidebar.link..net sdk": { - "message": ".net sdk", - "description": "The label for link .net sdk in sidebar mySidebar, linking to https://github.com/layotto/dotnet-sdk" - }, - "sidebar.mySidebar.link.js sdk": { - "message": "js sdk", - "description": "The label for link js sdk in sidebar mySidebar, linking to https://github.com/layotto/js-sdk" - }, - "sidebar.mySidebar.doc.首页": { - "message": "Home Page", - "description": "The label for the doc item 首页 in sidebar mySidebar, linking to the doc README" - }, - "sidebar.mySidebar.doc.使用State API": { - "message": "使用State API", - "description": "The label for the doc item 使用State API in sidebar mySidebar, linking to the doc start/state/start" - }, - "sidebar.mySidebar.doc.使用Apollo配置中心": { - "message": "使用Apollo配置中心", - "description": "The label for the doc item 使用Apollo配置中心 in sidebar mySidebar, linking to the doc start/configuration/start-apollo" - }, - "sidebar.mySidebar.doc.使用Etcd配置中心": { - "message": "使用Etcd配置中心", - "description": "The label for the doc item 使用Etcd配置中心 in sidebar mySidebar, linking to the doc start/configuration/start" - }, - "sidebar.mySidebar.doc.使用Nacos配置中心": { - "message": "使用Nacos配置中心", - "description": "The label for the doc item 使用Nacos配置中心 in sidebar mySidebar, linking to the doc start/configuration/start-nacos" - }, - "sidebar.mySidebar.doc.发布、订阅消息": { - "message": "发布、订阅消息", - "description": "The label for the doc item 发布、订阅消息 in sidebar mySidebar, linking to the doc start/pubsub/start" - }, - "sidebar.mySidebar.doc.(建设中) 使用 DelayQueue API": { - "message": "(建设中) 使用 DelayQueue API", - "description": "The label for the doc item (建设中) 使用 DelayQueue API in sidebar mySidebar, linking to the doc start/delay_queue/start" - }, - "sidebar.mySidebar.doc.使用分布式锁 API": { - "message": "使用分布式锁 API", - "description": "The label for the doc item 使用分布式锁 API in sidebar mySidebar, linking to the doc start/lock/start" - }, - "sidebar.mySidebar.doc.使用Sequencer API生成分布式自增id": { - "message": "使用Sequencer API生成分布式自增id", - "description": "The label for the doc item 使用Sequencer API生成分布式自增id in sidebar mySidebar, linking to the doc start/sequencer/start" - }, - "sidebar.mySidebar.doc.使用 Secret API": { - "message": "使用 Secret API", - "description": "The label for the doc item 使用 Secret API in sidebar mySidebar, linking to the doc start/secret/start" - }, - "sidebar.mySidebar.doc.进行RPC调用": { - "message": "进行RPC调用", - "description": "The label for the doc item 进行RPC调用 in sidebar mySidebar, linking to the doc start/rpc/helloworld" - }, - "sidebar.mySidebar.doc.使用File API": { - "message": "使用File API", - "description": "The label for the doc item 使用File API in sidebar mySidebar, linking to the doc start/file/minio" - }, - "sidebar.mySidebar.doc.使用 OSS API": { - "message": "使用 OSS API", - "description": "The label for the doc item 使用 OSS API in sidebar mySidebar, linking to the doc start/oss/oss" - }, - "sidebar.mySidebar.doc.使用UDS通信": { - "message": "使用UDS通信", - "description": "The label for the doc item 使用UDS通信 in sidebar mySidebar, linking to the doc start/uds/start" - }, - "sidebar.mySidebar.doc.(建设中)使用 sms API": { - "message": "(建设中)使用 sms API", - "description": "The label for the doc item (建设中)使用 sms API in sidebar mySidebar, linking to the doc start/sms/start" - }, - "sidebar.mySidebar.doc.(建设中)使用 cryption API": { - "message": "(建设中)使用 cryption API", - "description": "The label for the doc item (建设中)使用 cryption API in sidebar mySidebar, linking to the doc start/cryption/start" - }, - "sidebar.mySidebar.doc.(建设中)使用 phone API": { - "message": "(建设中)使用 phone API", - "description": "The label for the doc item (建设中)使用 phone API in sidebar mySidebar, linking to the doc start/phone/start" - }, - "sidebar.mySidebar.doc.(建设中)使用 email API": { - "message": "(建设中)使用 email API", - "description": "The label for the doc item (建设中)使用 email API in sidebar mySidebar, linking to the doc start/email/start" - }, - "sidebar.mySidebar.doc.使用 lifecycle API": { - "message": "使用 lifecycle API", - "description": "The label for the doc item 使用 lifecycle API in sidebar mySidebar, linking to the doc start/lifecycle/start" - }, - "sidebar.mySidebar.doc.注册您自己的API": { - "message": "注册您自己的API", - "description": "The label for the doc item 注册您自己的API in sidebar mySidebar, linking to the doc start/api_plugin/helloworld" - }, - "sidebar.mySidebar.doc.自动生成 API 插件": { - "message": "自动生成 API 插件", - "description": "The label for the doc item 自动生成 API 插件 in sidebar mySidebar, linking to the doc start/api_plugin/generate" - }, - "sidebar.mySidebar.doc.集成 Istio 1.10.6 演示": { - "message": "集成 Istio 1.10.6 演示", - "description": "The label for the doc item 集成 Istio 1.10.6 演示 in sidebar mySidebar, linking to the doc start/istio/README" - }, - "sidebar.mySidebar.doc.集成 Istio 1.5.x 演示": { - "message": "集成 Istio 1.5.x 演示", - "description": "The label for the doc item 集成 Istio 1.5.x 演示 in sidebar mySidebar, linking to the doc start/istio/start" - }, - "sidebar.mySidebar.doc.Dump TCP 流量": { - "message": "Dump TCP 流量", - "description": "The label for the doc item Dump TCP 流量 in sidebar mySidebar, linking to the doc start/network_filter/tcpcopy" - }, - "sidebar.mySidebar.doc.方法级别限流": { - "message": "方法级别限流", - "description": "The label for the doc item 方法级别限流 in sidebar mySidebar, linking to the doc start/stream_filter/flow_control" - }, - "sidebar.mySidebar.doc.健康检查、查询运行时元数据": { - "message": "健康检查、查询运行时元数据", - "description": "The label for the doc item 健康检查、查询运行时元数据 in sidebar mySidebar, linking to the doc start/actuator/start" - }, - "sidebar.mySidebar.doc.Trace, Metrics": { - "message": "Trace, Metrics", - "description": "The label for the doc item Trace, Metrics in sidebar mySidebar, linking to the doc start/trace/trace" - }, - "sidebar.mySidebar.doc.Trace 接入 Skywalking": { - "message": "Trace 接入 Skywalking", - "description": "The label for the doc item Trace 接入 Skywalking in sidebar mySidebar, linking to the doc start/trace/skywalking" - }, - "sidebar.mySidebar.doc.Trace 接入 Zipkin": { - "message": "Trace 接入 Zipkin", - "description": "The label for the doc item Trace 接入 Zipkin in sidebar mySidebar, linking to the doc start/trace/zipkin" - }, - "sidebar.mySidebar.doc.Trace 接入 Jaeger": { - "message": "Trace 接入 Jaeger", - "description": "The label for the doc item Trace 接入 Jaeger in sidebar mySidebar, linking to the doc start/trace/jaeger" - }, - "sidebar.mySidebar.doc.Metrics 接入 Prometheus": { - "message": "Metrics 接入 Prometheus", - "description": "The label for the doc item Metrics 接入 Prometheus in sidebar mySidebar, linking to the doc start/trace/prometheus" - }, - "sidebar.mySidebar.doc.将业务逻辑通过 WASM 下沉进sidecar": { - "message": "将业务逻辑通过 WASM 下沉进sidecar", - "description": "The label for the doc item 将业务逻辑通过 WASM 下沉进sidecar in sidebar mySidebar, linking to the doc start/wasm/start" - }, - "sidebar.mySidebar.doc.基于 WASM 跟 Runtime 实现的 Faas 模型": { - "message": "基于 WASM 跟 Runtime 实现的 Faas 模型", - "description": "The label for the doc item 基于 WASM 跟 Runtime 实现的 Faas 模型 in sidebar mySidebar, linking to the doc start/faas/start" - }, - "sidebar.mySidebar.doc.线上实验室": { - "message": "Online Lab", - "description": "The label for the doc item 线上实验室 in sidebar mySidebar, linking to the doc start/lab" - }, - "sidebar.mySidebar.doc.File API": { - "message": "File API", - "description": "The label for the doc item File API in sidebar mySidebar, linking to the doc building_blocks/file/file" - }, - "sidebar.mySidebar.doc.Actuator API": { - "message": "Actuator API", - "description": "The label for the doc item Actuator API in sidebar mySidebar, linking to the doc building_blocks/actuator/actuator" - }, - "sidebar.mySidebar.doc.State API": { - "message": "State API", - "description": "The label for the doc item State API in sidebar mySidebar, linking to the doc building_blocks/state/reference" - }, - "sidebar.mySidebar.doc.Sequencer API": { - "message": "Sequencer API", - "description": "The label for the doc item Sequencer API in sidebar mySidebar, linking to the doc building_blocks/sequencer/reference" - }, - "sidebar.mySidebar.doc.Distributed Lock API": { - "message": "Distributed Lock API", - "description": "The label for the doc item Distributed Lock API in sidebar mySidebar, linking to the doc building_blocks/lock/reference" - }, - "sidebar.mySidebar.doc.Pub/Sub API": { - "message": "Pub/Sub API", - "description": "The label for the doc item Pub/Sub API in sidebar mySidebar, linking to the doc building_blocks/pubsub/reference" - }, - "sidebar.mySidebar.doc.RPC API": { - "message": "RPC API", - "description": "The label for the doc item RPC API in sidebar mySidebar, linking to the doc building_blocks/rpc/reference" - }, - "sidebar.mySidebar.doc.Configuration API": { - "message": "Configuration API", - "description": "The label for the doc item Configuration API in sidebar mySidebar, linking to the doc building_blocks/configuration/reference" - }, - "sidebar.mySidebar.doc.API插件": { - "message": "API插件", - "description": "The label for the doc item API插件 in sidebar mySidebar, linking to the doc design/api_plugin/design" - }, - "sidebar.mySidebar.doc.pluggable component 组件": { - "message": "pluggable component 组件", - "description": "The label for the doc item pluggable component 组件 in sidebar mySidebar, linking to the doc design/pluggable/usage" - }, - "sidebar.mySidebar.doc.gRPC API 接口文档": { - "message": "gRPC API 接口文档", - "description": "The label for the doc item gRPC API 接口文档 in sidebar mySidebar, linking to the doc api_reference/README" - }, - "sidebar.mySidebar.doc.go sdk": { - "message": "go sdk", - "description": "The label for the doc item go sdk in sidebar mySidebar, linking to the doc sdk_reference/go/start" - }, - "sidebar.mySidebar.doc.Layotto 配置文件介绍": { - "message": "Layotto 配置文件介绍", - "description": "The label for the doc item Layotto 配置文件介绍 in sidebar mySidebar, linking to the doc configuration/overview" - }, - "sidebar.mySidebar.doc.Redis": { - "message": "Redis", - "description": "The label for the doc item Redis in sidebar mySidebar, linking to the doc component_specs/sequencer/redis" - }, - "sidebar.mySidebar.doc.其他组件": { - "message": "其他组件", - "description": "The label for the doc item 其他组件 in sidebar mySidebar, linking to the doc component_specs/pubsub/others" - }, - "sidebar.mySidebar.doc.Etcd": { - "message": "Etcd", - "description": "The label for the doc item Etcd in sidebar mySidebar, linking to the doc component_specs/sequencer/etcd" - }, - "sidebar.mySidebar.doc.Zookeeper": { - "message": "Zookeeper", - "description": "The label for the doc item Zookeeper in sidebar mySidebar, linking to the doc component_specs/sequencer/zookeeper" - }, - "sidebar.mySidebar.doc.Consul": { - "message": "Consul", - "description": "The label for the doc item Consul in sidebar mySidebar, linking to the doc component_specs/lock/consul" - }, - "sidebar.mySidebar.doc.MongoDB": { - "message": "MongoDB", - "description": "The label for the doc item MongoDB in sidebar mySidebar, linking to the doc component_specs/sequencer/mongo" - }, - "sidebar.mySidebar.doc.Configuration": { - "message": "Configuration", - "description": "The label for the doc item Configuration in sidebar mySidebar, linking to the doc component_specs/configuration/etcd" - }, - "sidebar.mySidebar.doc.File": { - "message": "File", - "description": "The label for the doc item File in sidebar mySidebar, linking to the doc component_specs/file/oss" - }, - "sidebar.mySidebar.doc.Mysql": { - "message": "Mysql", - "description": "The label for the doc item Mysql in sidebar mySidebar, linking to the doc component_specs/sequencer/mysql" - }, - "sidebar.mySidebar.doc.Snowflake": { - "message": "Snowflake", - "description": "The label for the doc item Snowflake in sidebar mySidebar, linking to the doc component_specs/sequencer/snowflake" - }, - "sidebar.mySidebar.doc.Secret Store": { - "message": "Secret Store", - "description": "The label for the doc item Secret Store in sidebar mySidebar, linking to the doc component_specs/secret/common" - }, - "sidebar.mySidebar.doc.自定义组件": { - "message": "自定义组件", - "description": "The label for the doc item 自定义组件 in sidebar mySidebar, linking to the doc component_specs/custom/common" - }, - "sidebar.mySidebar.doc.如何部署、升级 Layotto": { - "message": "如何部署、升级 Layotto", - "description": "The label for the doc item 如何部署、升级 Layotto in sidebar mySidebar, linking to the doc operation/README" - }, - "sidebar.mySidebar.doc.Layotto sidecar injector": { - "message": "Layotto sidecar injector", - "description": "The label for the doc item Layotto sidecar injector in sidebar mySidebar, linking to the doc operation/sidecar_injector" - }, - "sidebar.mySidebar.doc.如何本地开发、本地调试": { - "message": "如何本地开发、本地调试", - "description": "The label for the doc item 如何本地开发、本地调试 in sidebar mySidebar, linking to the doc operation/local" - }, - "sidebar.mySidebar.doc.动态配置下发、组件热重载": { - "message": "动态配置下发、组件热重载", - "description": "The label for the doc item 动态配置下发、组件热重载 in sidebar mySidebar, linking to the doc design/lifecycle/apply_configuration" - }, - "sidebar.mySidebar.doc.Actuator设计文档": { - "message": "Actuator设计文档", - "description": "The label for the doc item Actuator设计文档 in sidebar mySidebar, linking to the doc design/actuator/actuator-design-doc" - }, - "sidebar.mySidebar.doc.gRPC框架设计文档": { - "message": "gRPC框架设计文档", - "description": "The label for the doc item gRPC框架设计文档 in sidebar mySidebar, linking to the doc design/actuator/grpc-design-doc" - }, - "sidebar.mySidebar.doc.Configuration API with Apollo": { - "message": "Configuration API with Apollo", - "description": "The label for the doc item Configuration API with Apollo in sidebar mySidebar, linking to the doc design/configuration/configuration-api-with-apollo" - }, - "sidebar.mySidebar.doc.Pub/Sub API以及与dapr component的兼容性": { - "message": "Pub/Sub API以及与dapr component的兼容性", - "description": "The label for the doc item Pub/Sub API以及与dapr component的兼容性 in sidebar mySidebar, linking to the doc design/pubsub/pubsub-api-and-compability-with-dapr-component" - }, - "sidebar.mySidebar.doc.RPC设计文档": { - "message": "RPC设计文档", - "description": "The label for the doc item RPC设计文档 in sidebar mySidebar, linking to the doc design/rpc/rpc_design_document" - }, - "sidebar.mySidebar.doc.分布式锁API设计文档": { - "message": "分布式锁API设计文档", - "description": "The label for the doc item 分布式锁API设计文档 in sidebar mySidebar, linking to the doc design/lock/lock-api-design" - }, - "sidebar.mySidebar.doc.Sequencer API设计文档": { - "message": "Sequencer API设计文档", - "description": "The label for the doc item Sequencer API设计文档 in sidebar mySidebar, linking to the doc design/sequencer/design" - }, - "sidebar.mySidebar.doc.File API设计文档": { - "message": "File API设计文档", - "description": "The label for the doc item File API设计文档 in sidebar mySidebar, linking to the doc design/file/file-design" - }, - "sidebar.mySidebar.doc.FaaS 设计文档": { - "message": "FaaS 设计文档", - "description": "The label for the doc item FaaS 设计文档 in sidebar mySidebar, linking to the doc design/faas/faas-poc-design" - }, - "sidebar.mySidebar.doc.支持Dapr API": { - "message": "支持Dapr API", - "description": "The label for the doc item 支持Dapr API in sidebar mySidebar, linking to the doc design/api_plugin/dapr_api" - }, - "sidebar.mySidebar.doc.OSS API设计文档": { - "message": "OSS API设计文档", - "description": "The label for the doc item OSS API设计文档 in sidebar mySidebar, linking to the doc design/oss/design" - }, - "sidebar.mySidebar.doc.pluggable component 设计文档": { - "message": "pluggable component 设计文档", - "description": "The label for the doc item pluggable component 设计文档 in sidebar mySidebar, linking to the doc design/pluggable/design" - }, - "sidebar.mySidebar.doc.Layotto 贡献指南": { - "message": "Layotto 贡献指南", - "description": "The label for the doc item Layotto 贡献指南 in sidebar mySidebar, linking to the doc development/CONTRIBUTING" - }, - "sidebar.mySidebar.doc.新手攻略:从零开始成为 Layotto 贡献者": { - "message": "新手攻略:从零开始成为 Layotto 贡献者", - "description": "The label for the doc item 新手攻略:从零开始成为 Layotto 贡献者 in sidebar mySidebar, linking to the doc development/start-from-zero" - }, - "sidebar.mySidebar.doc.文档贡献指南": { - "message": "文档贡献指南", - "description": "The label for the doc item 文档贡献指南 in sidebar mySidebar, linking to the doc development/contributing-doc" - }, - "sidebar.mySidebar.doc.使用工具自动测试 Quickstart 文档": { - "message": "使用工具自动测试 Quickstart 文档", - "description": "The label for the doc item 使用工具自动测试 Quickstart 文档 in sidebar mySidebar, linking to the doc development/test-quickstart" - }, - "sidebar.mySidebar.doc.想要开发新的组件?": { - "message": "想要开发新的组件?", - "description": "The label for the doc item 想要开发新的组件? in sidebar mySidebar, linking to the doc development/developing-component" - }, - "sidebar.mySidebar.doc.组件引用开发指南": { - "message": "组件引用开发指南", - "description": "The label for the doc item 组件引用开发指南 in sidebar mySidebar, linking to the doc development/component_ref/component_ref" - }, - "sidebar.mySidebar.doc.如何基于proto文件生成代码、接口文档": { - "message": "如何基于proto文件生成代码、接口文档", - "description": "The label for the doc item 如何基于proto文件生成代码、接口文档 in sidebar mySidebar, linking to the doc api_reference/how_to_generate_api_doc" - }, - "sidebar.mySidebar.doc.proto文件注释规范": { - "message": "proto文件注释规范", - "description": "The label for the doc item proto文件注释规范 in sidebar mySidebar, linking to the doc api_reference/comment_spec_of_proto" - }, - "sidebar.mySidebar.doc.新增API时的开发规范": { - "message": "新增API时的开发规范", - "description": "The label for the doc item 新增API时的开发规范 in sidebar mySidebar, linking to the doc development/developing-api" - }, - "sidebar.mySidebar.doc.Layotto 四大 Github Workflows 说明": { - "message": "Layotto 四大 Github Workflows 说明", - "description": "The label for the doc item Layotto 四大 Github Workflows 说明 in sidebar mySidebar, linking to the doc development/github-workflows" - }, - "sidebar.mySidebar.doc.Layotto 命令行工具指南": { - "message": "Layotto 命令行工具指南", - "description": "The label for the doc item Layotto 命令行工具指南 in sidebar mySidebar, linking to the doc development/commands" - }, - "sidebar.mySidebar.doc.新手任务 (good first issue) 的 label 规范": { - "message": "新手任务 (good first issue) 的 label 规范", - "description": "The label for the doc item 新手任务 (good first issue) 的 label 规范 in sidebar mySidebar, linking to the doc development/label-spec" - }, - "sidebar.mySidebar.doc.发布手册": { - "message": "发布手册", - "description": "The label for the doc item 发布手册 in sidebar mySidebar, linking to the doc development/release-guide" - }, - "sidebar.mySidebar.doc.待解决的问题": { - "message": "待解决的问题", - "description": "The label for the doc item 待解决的问题 in sidebar mySidebar, linking to the doc development/problems-to-solve" - }, - "sidebar.mySidebar.doc.社区会议": { - "message": "社区会议", - "description": "The label for the doc item 社区会议 in sidebar mySidebar, linking to the doc community/meeting" - }, - "sidebar.mySidebar.doc.SOFAStack & MOSN 社区角色说明": { - "message": "SOFAStack & MOSN 社区角色说明", - "description": "The label for the doc item SOFAStack & MOSN 社区角色说明 in sidebar mySidebar, linking to the doc community/governance" - }, - "sidebar.mySidebar.doc.Layotto社区晋升规则": { - "message": "Layotto社区晋升规则", - "description": "The label for the doc item Layotto社区晋升规则 in sidebar mySidebar, linking to the doc community/promote" - }, - "sidebar.mySidebar.doc.Layotto社区成员": { - "message": "Layotto社区成员", - "description": "The label for the doc item Layotto社区成员 in sidebar mySidebar, linking to the doc community/people" - }, - "sidebar.mySidebar.doc.视频合集": { - "message": "Video Compilation", - "description": "The label for the doc item 视频合集 in sidebar mySidebar, linking to the doc video/README" - } -} diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/README.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/README.md deleted file mode 100644 index 6552476c09..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/README.md +++ /dev/null @@ -1,175 +0,0 @@ - -# Layotto (L8): To be the next layer of OSI layer 7 - - -[![Layotto Env Pipeline 🌊](https://github.com/mosn/layotto/actions/workflows/proto-checker.yml/badge.svg)](https://github.com/mosn/layotto/actions/workflows/proto-checker.yml) -[![Layotto Dev Pipeline 🌊](https://github.com/mosn/layotto/actions/workflows/layotto-ci.yml/badge.svg)](https://github.com/mosn/layotto/actions/workflows/layotto-ci.yml) - -[![GoDoc](https://godoc.org/mosn.io/layotto?status.svg)](https://godoc.org/mosn.io/layotto) -[![Go Report Card](https://goreportcard.com/badge/github.com/mosn/layotto)](https://goreportcard.com/report/mosn.io/layotto) -[![codecov](https://codecov.io/gh/mosn/layotto/branch/main/graph/badge.svg?token=10RxwSV6Sz)](https://codecov.io/gh/mosn/layotto) -[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/mosn/layotto.svg)](http://isitmaintained.com/project/mosn/layotto "Average time to resolve an issue") - - -Layotto(/leɪˈɒtəʊ/) is an application runtime developed using Golang, which provides various distributed capabilities for applications, such as state management, configuration management, and event pub/sub capabilities to simplify application development. - -Layotto is built on the open source data plane [MOSN](https://github.com/mosn/mosn) .In addition to providing distributed building blocks, Layotto can also serve as the data plane of Service Mesh and has the ability to control traffic. - -## Motivation - -Layotto aims to combine [Multi-Runtime](https://www.infoq.com/articles/multi-runtime-microservice-architecture/) with Service Mesh into one sidecar. No matter which product you are using as the Service Mesh data plane (e.g. MOSN,Envoy or any other product), you can always attach Layotto to it and add Multi-Runtime capabilities without adding new sidecars. - -For example, by adding Runtime capabilities to MOSN, a Layotto process can both [serve as the data plane of istio](start/istio/) and provide various Runtime APIs (such as Configuration API, Pub/Sub API, etc.) - -In addition, we were surprised to find that a sidecar can do much more than that. We are trying to make Layotto even the runtime container of FaaS (Function as a service) with the magic power of [WebAssembly](https://en.wikipedia.org/wiki/WebAssembly) . - -## Features - -- Service Communication -- Service Governance.Such as traffic hijacking and observation, service rate limiting, etc -- [As the data plane of istio](start/istio/) -- Configuration management -- State management -- Event publish and subscribe -- Health check, query runtime metadata -- Multilingual programming based on WASM - -## Project Architecture - -As shown in the architecture diagram below, Layotto uses the open source MOSN as the base to provide network layer management capabilities while providing distributed capabilities. The business logic can directly interact with Layotto through a lightweight SDK without paying attention to the specific back-end infrastructure. - -Layotto provides sdk in various languages. The sdk interacts with Layotto through grpc. Application developers only need to specify their own infrastructure type through the [configuration file](https://github.com/mosn/layotto/blob/main/configs/runtime_config.json) provided by Layotto. No coding changes are required, which greatly improves the portability of the program. - - - -## Quickstarts - -### Get started with Layotto - -You can try the quickstart demos below to get started with Layotto. In addition, you can experience the [online laboratory](start/lab.md) - -### API - -| API | status | quick start | desc | -| -------------- | :----: | :-------------------------------------------------------------------: | -------------------------------------------------------------- | -| State | ✅ | [demo](https://mosn.io/layotto/#/en/start/state/start) | Write/Query the data of the Key/Value model | -| Pub/Sub | ✅ | [demo](https://mosn.io/layotto/#/en/start/pubsub/start) | Publish/Subscribe message through various Message Queue | -| Service Invoke | ✅ | [demo](https://mosn.io/layotto/#/en/start/rpc/helloworld) | Call Service through MOSN (another istio data plane) | -| Config | ✅ | [demo](https://mosn.io/layotto/#/en/start/configuration/start-apollo) | Write/Query/Subscribe the config through various Config Center | -| Lock | ✅ | [demo](https://mosn.io/layotto/#/en/start/lock/start) | Distributed lock API | -| Sequencer | ✅ | [demo](https://mosn.io/layotto/#/en/start/sequencer/start) | Generate distributed unique and incremental ID | -| File | ✅ | TODO | File API implementation | -| Binding | ✅ | TODO | Transparent data transmission API | - - -### Service Mesh - -| feature | status | quick start | desc | -| ------- | :----: |:----------------------------:| -------------------------- | -| istio | ✅ | [demo](start/istio/start.md) | As the data plane of istio | - -### Extendability - -| feature | status | quick start | desc | -| ---------- | :----: | :--------------------------------------------------------------: | -------------------------- | -| API plugin | ✅ | [demo](https://mosn.io/layotto/#/en/start/api_plugin/helloworld) | You can add your own API ! | - -### Actuator - -| feature | status | quick start | desc | -| -------------- | :----: | :-------------------------------------------------------: | --------------------------------------------------- | -| Health Check | ✅ | [demo](https://mosn.io/layotto/#/en/start/actuator/start) | Query health state of app and components in Layotto | -| Metadata Query | ✅ | [demo](https://mosn.io/layotto/#/en/start/actuator/start) | Query metadata in Layotto/app | - -### Traffic Control - -| feature | status | quick start | desc | -| ------------ | :----: | :-------------------------------------------------------------------: | --------------------------------------------------------------- | -| TCP Copy | ✅ | [demo](https://mosn.io/layotto/#/en/start/network_filter/tcpcopy) | Dump the tcp traffic received by Layotto into local file system | -| Flow Control | ✅ | [demo](https://mosn.io/layotto/#/en/start/stream_filter/flow_control) | limit access to the APIs provided by Layotto | - -### Write your bussiness logic using WASM - -| feature | status | quick start | desc | -| -------------- | :----: | :---------------------------------------------------: | -------------------------------------------------------------------- | -| Go (TinyGo) | ✅ | [demo](https://mosn.io/layotto/#/en/start/wasm/start) | Compile Code written by TinyGo to \*.wasm and run in Layotto | -| Rust | ✅ | [demo](https://mosn.io/layotto/#/en/start/wasm/start) | Compile Code written by Rust to \*.wasm and run in Layotto | -| AssemblyScript | ✅ | [demo](https://mosn.io/layotto/#/en/start/wasm/start) | Compile Code written by AssemblyScript to \*.wasm and run in Layotto | - -### As a FaaS(Serverless) runtime (Layotto + WebAssembly + k8s) - -| feature | status | quick start | desc | -| -------------- | :----: | :---------------------------------------------------: | ------------------------------------------------------------------------------------------ | -| Go (TinyGo) | ✅ | [demo](https://mosn.io/layotto/#/en/start/faas/start) | Compile Code written by TinyGo to \*.wasm and run in Layotto And Scheduled by k8s. | -| Rust | ✅ | [demo](https://mosn.io/layotto/#/en/start/faas/start) | Compile Code written by Rust to \*.wasm and run in Layotto And Scheduled by k8s. | -| AssemblyScript | ✅ | [demo](https://mosn.io/layotto/#/en/start/faas/start) | Compile Code written by AssemblyScript to \*.wasm and run in Layotto And Scheduled by k8s. | - -## Presentations - -- [Layotto - A new chapter of Service Mesh and Application Runtime](https://www.youtube.com/watch?v=5v8gTrFUDk8) -- [WebAssembly + Application Runtime = A New Era of FaaS?](https://www.youtube.com/watch?v=g01CJ4S9Qao) - -## Landscapes - -

-   -

-Layotto enriches the CNCF CLOUD NATIVE Landscape. -

- -## Community - -### Contact Us - -| Platform | Link | -| :----------------------------------------------------- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 💬 [DingTalk](https://www.dingtalk.com/en) (preferred) | Search the group number: 31912621 or scan the QR code below | - -[comment]: <> (| 💬 [Wechat](https://www.wechat.com/en/) | Scan the QR code below and she will invite you into the wechat group
) - -## How to contribute - -[Where to start? Check "Community tasks" list!](https://github.com/mosn/layotto/issues/108) - -As a programming enthusiast , have you ever felt that you want to participate in the development of an open source project, but don't know where to start? -In order to help everyone better participate in open source projects, our community will regularly publish community tasks to help everyone learn by doing! - -[Document Contribution Guide](development/contributing-doc.md) - -[Component Development Guide](development/developing-component.md) - -[Layotto Github Workflows](development/github-workflows.md) - -[Layotto Commands Guide](development/commands.md) - -[Layotto contributor guide](development/CONTRIBUTING.md) - -## Contributors - -Thank y'all! - - - - - -## Design Documents - -[Actuator Design Doc](design/actuator/actuator-design-doc.md) - -[Configuration API with Apollo](design/configuration/configuration-api-with-apollo.md) - -[Pubsub API and Compability with Dapr Component](design/pubsub/pubsub-api-and-compability-with-dapr-component.md) - -[RPC Design Doc](design/rpc/rpc_design_document.md) - -[Distributed Lock API Design](design/lock/lock-api-design.md) - -[FaaS Design](design/faas/faas-poc-design.md) - -## FAQ - -### Difference with dapr? - -dapr is an excellent Runtime product, but it lacks the ability of Service Mesh, which is necessary for the Runtime -product used in production environment, so we hope to combine Runtime with Service Mesh into one sidecar to meet -more complex production requirements. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/README.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/README.md deleted file mode 100644 index 097ec66a40..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# 用户手册 - -本文介绍下在开发应用时,如何面向 Layotto API 编程,如何通过调用 Layotto API 来使用各种分布式能力(例如使用数据库,使用分布式锁等)。 \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/community/governance.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/community/governance.md deleted file mode 100644 index 15ff15b46c..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/community/governance.md +++ /dev/null @@ -1,147 +0,0 @@ -# SOFAStack & MOSN Community Role Description v2.0 - -![](https://gw.alipayobjects.com/mdn/rms_95b965/afts/img/A*DpjGQqAcRyQAAAAAAAAAAAAAARQnAQ) - -Layotto is a sub-project of the MOSN community. This paper presents proposal v2.0 on the role of the SOFAStack & MOSN community - -The proposal would initially be linked to the Layotto and SOFA-Registration project - -## Design objectives - -- Attracting more people into the community**Maintainer, Manager** rather than merely maintaining the community by the core developer, single point bottlenecks -- Increase community activity - -## Principles - -### Coming a friend - -Decrease the threshold so that interested enthusiasts can participate in community maintenance and management - -### Community Title:All Community titles, Competencies and Irrelevance of Companies/Organizations of Participants - -In order to motivate everybody to get the project to get involved in the community for personal hobbies/personal honours, regardless of where the company goes or SOFAStack MC member/Co-founder; to involve every interested technical student in the core decisions of the community and promote community activism. - -For example, a developer created Project A which, after many years, continues to be the Co-founder of Project A even if he is no longer involved in community maintenance, runs over several companies, has experienced storm, started off, decided to switch off as a programmer and opened a fire boiler. - -For example, a programmer who is the owner and not a programmer, who can also be a PMC member or Project Reviewer, provided he has sufficient contributions to the project. - -### Definitive return:establishes clear promotion rules for community members - -What contribution can members of the community make to promotion?There is a transparent and specific rule that allows community students to grow from Contribor to Committer or Maintainer,**Let people feel that they are “investing in a reward”** -to develop their own promotion rules for each project, but to make clear what can be done so that people see the return to the community - -### Communitization of decision-making - -#### Communitize:Needs and Technology Program Public Review - -Evaluation of critical needs and evaluation of technical programmes should be conducted in an open manner within the community\*\* rather than in internal review sessions for several persons\*\* - -For example, when conducting a technical programme review, community members can organize online meetings, live broadcasts and allow each interested person to watch and participate in meetings in their own user communities or in the Core Team group.If you feel too heavy a live broadcast, the issue is proposed as well. - -Invert:3 are a fire boiler owner and also a project's Committer.He was very keen to participate in community building, but was not accompanied by any evaluation of the technology programme, which was a dismal one. - -#### Community promotion - -Promotion rules, nominations to be decided by community members in a group - -## Interpretation of new roles - -### Lifelong Honour (Project Founder) - -#### Role Description - -Honour for life, but not for power. -For example, a developer created Project A and has been a Co-founder of Project A even after many years, even if he is no longer involved in community maintenance or switching as a programmer. - -This is an honour and an incentive to make people feel open for their personal influence - -#### Designing the purpose of this role - -Incentives for new open source projects for SOFAStack and MOSN communities (several students have thought in the second half of the year and sofa-bolt-go is already developing); - -Inspire the current owner (if it is the founder); - -Thanks for the initial developers who have left the community, invite back to the community - -### Member States - -#### Role Description - -Add a new Member’s role to invite to join the organization, and the profile page will show the logo. - -Of course, given that in the past some projects were organized only by the Community, with a higher threshold, the role was optional and not mandatory, projects could decide whether or not to join the role in their own project. -The idea is to join this role on a trial basis in Layotto and SOFA-Registry. - -#### Purpose to add this role? - -After joining the organization, the github profile page of the contributor shows the organization's logo, which is cool enough to motivate people to join the community and contribute. - -#### Member's duties - -Member's duties are code reviewed and issues processed and can be Reviewer if the member handles issues and code review with a high frequency (see below); - -#### The github's permissions assigned by the Member - -Default permission, no write permission.However, LGTM is active - -#### Conditions for becoming a Member (conditions for joining organizations) - -Each project itself - -### Reviewer - -#### Role Description - -Like Member, it is responsible for code review and for dealing with issues as well as recognition and appreciation of Members' contributions.Long-term review contributions can promote Committer - -Reviewer has some responsibility for review.For example, a issue/Pull request involves a module in which project maintainers can request reviewers for the module to review and take responsibility for the puzzle.For example, you can request the WASM module reviewer @zhenjunMa if someone makes a bug to the WASM module - -#### Condition to Reviewer - -Each project itself - -#### Whether Reviewer will return to Member - -Each project customizes.The different views collected at this time are: - -After becoming Reviewer, the responsibility is clearer than that of the member; it is to deal with issues and PR; it must remain at least two issues per week or one PR; if there is a two-week processing frequency within a month, it will return to the member; - -b. Believing that setting a target for Reviewer is too odd for KPI to work with KPI - -#### Reviewer assigned githuborganization permissions - -![](https://user-images.githubusercontent.com/26001097/129857585-2f2ddcda-4a5d-4f94-a36d-48e6a9f52e0e.png) - -#### Purpose to add this role? - -1. I would like to get the MOSN and SOFAStack communities to respond faster, and to respond more quickly (in terms of how to improve the response speed on issue), I am not thinking about what to do and welcome suggestions - -2. Community decision making,code review can be made by active contributors, don't want only one or two people to review - -3. Many enthusiasts may be empty for some time, empty for some time (domestic programmers status quo...) and free time for review of PRs and issues to participate in, contribute to and learn about changes in the project's time frame - -#### When code is reviewed, can one vote LGTM or two votes be merged with LGTM? - -A: The current idea is to refer to the vue community, if the review responds to LGTM, but without merge permission, project defenders (writers are) are responsible for the actual mergers. -Project defenders who have trust in reviewer can simply look at prs and merge without problems; if the printer changes are big and less assured, they have to look carefully at prs themselves. - -Thus, about two votes are combined. - -This design is intended to force project core defenders to understand each pr, every change. - -## Other - -Use English as far as possible on issues and PRs - -The type of IMs to be used is to be discussed at the discretion of each project. Options include micromessages, Slack, gitter - -Community-based meetings themselves - -## References - -Apollo -[https://github.com/apolloconfig/apollo/pull/3670](https://github.com/apolloconfig/apollo/pull/3670) -[https://github.com/apolloconfig/apollo/issues/3684](https://github.com/apolloconfig/apollo/issues/3684) -[https://github.com/apolloconfig/apollo/discussions/categories/announcements](https://github.com/apolloconfig/apollo/discussions/categories/announcements) - -Tidb's community-based organization [https://pingcap.com/blog-cn/tidb-community-upgrade/](https://pingcap.com/blog-cn/tidb-community-upgrade/) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/community/meeting.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/community/meeting.md deleted file mode 100644 index 6e3d78dde4..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/community/meeting.md +++ /dev/null @@ -1,9 +0,0 @@ -# Community meetings - -There are weekly community meetings in Layotto and everyone is invited to join.Typical communication is not efficient, mutual responses are not always timely, and there are any questions to talk and communicate efficiently. - -Weekly meeting time, meeting topics, summary of meetings are recorded in [Discussion Area] (https://github.com/mosn/layotto/discussions/627) - -Meeting videos at [B Community Conference Video Collection](https://space.bilibili.com/228717294/channel/seriesdetail?sid=2222011) - -Community meetings are pegged and welcome to nail, group:41585216 diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/community/people.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/community/people.md deleted file mode 100644 index b000f6bec6..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/community/people.md +++ /dev/null @@ -1,38 +0,0 @@ -# Layotto Community Members - -Note:All Rankings do not represent all rankings - -## PMC Member - -@seefluod @zhenjunMa @wenxuwan - -## Commit - -https://github.com/mosn/layotto/discussions/categories/announcements - -@stulzq @ZLBer @Xunzhuo - -## Reviewer - -invite.welcome-interested Contribor to join the community by contacting @seeflod and becoming Reviewer - -| Modules | Reviewer | -| ----------------- | ---------------------------------------------- | -| Layotto Component | @stulzq @ZLBer | -| Layotto sdk | @stulzq @ZLBer | -| API Definition | @seefod | -| Layotto Runtime | @seefluod @zhenjunMa | -| WASM | @seefluod @zhenjunMa | -| RPC-related | @MoonShining | - -## Contributor - -Thanks to all contributors! - - - - - -## Promotion Rules - -See[Layotto社区晋升规则](community/promote.md) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/community/promote.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/community/promote.md deleted file mode 100644 index f461ca8e12..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/community/promote.md +++ /dev/null @@ -1,94 +0,0 @@ -# Layotto Community Promotion Rules - -![](https://gw.alipayobjects.com/mdn/rms_95b965/afts/img/A*DpjGQqAcRyQAAAAAAAAAAAAAARQnAQ) - -## Member States - -### Conditions for Membership - -You can apply to become a Member if you meet the following conditions: - -- Contributed a valuable PR, such as an Easy-Level Community Development Task -- There is a willingness to work together to maintain the community - -### How to apply for Member - -Posts, brief self-introductions can be made under [discussion zone](https://github.com/mosn/layotto/discussions), such as which prs have been submitted, which areas are interested in technology and what contribution will be followed up together.Do not write personal information if you do not want to reveal privacy. - -The purpose of this link is to make people aware of each other and to make a few brief remarks. - -References to https://github.com/mosn/layotto/discussions/675 - -### Duties - -Member needs to help reply to issue/pr,triage(assign issues to the counterpart module) - -### Permissions - -Triage permissions.Permission to operate issues and prs, such as labels, assignment issues. -See [permissions-for-each-role]for a detailed description of permissions (https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-roles-for-an-organization#permissions-for-each-role) - -## Reviewer - -### Condition to Reviewer - -The issue review and code review of a module, and the PR's contribution to this module satisfies one of the following conditions:\*\* - -- 1 Hard Level PR -- 2 Medium Level PR -- 1 Medium+2 Easy-Level PR - -Note:equals `Hard:Medium:Easy` to `1:2:4` - -The logic of designing this rule is that: Reviewer needs to understand a module before turning it off to it.How can he judge that he knows well?Just see his PR, 1 hard level pr, or 2 medium pr, or 1 medium+2 easy level pr - -The design disadvantage:does not include the contribution of the review and does not inspire participants to make a review.Consideration had also been given to including the number of reviews in terms of promotion, but it had been carefully thought out that the statistics were not good and it had been suggested that the discussion should be welcomed. - -### Duties - -Issue review and code review for a module, giving technical advice.Significant changes related to this module will request the module Reviewer. - -## Committer - -### Conditions to become Committer - -Contributed PR meets the following conditions: - -- Merged PR reaches 10; -- At least 1 Hard Level PR, or 4 Medium Level PR; - -### Duties - -- Community consultation support; -- Stricter assigned to your issue or PR; -- The right to vote for major decisions of the community; -- Review community PR; - -### Certification, Business Promotion - -- Issuance of electronic certificates in the Discussion Zone - -Example: [Welcome new committer: Zhang Li Bin](https://github.com/mosn/layotto/discussions/352) - -- Mail Entity Certificate - -- Public information - -Example: - -[Congratulate Zhang for becoming Layotto committer!](https://mp.weixin.qq.com/s/no6mDymNEGxH3uoZbl1YTQ) - -[Congratulate Zhao for becoming SOFAJRaft committer!](https://mp.weixin.qq.com/s/BKJ0bcaGBeYNErDhpjk42Q) - -## PMC - -Project Management Committee, which develops key community-related resolutions for the core project management team and participation in roadmap - -### Conditions for joining the PMC - -Nominated by PMC Member and then PMC polls to promote to PMC Member by half - -### Duties - -Active participation in community discussions and guidance for major community decision-making; -to ensure that the community activities of open source projects are functioning well; diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/custom/common.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/custom/common.md deleted file mode 100644 index d170ae3d93..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/custom/common.md +++ /dev/null @@ -1,57 +0,0 @@ -# Custom Component - -## What is a custom component? - -Component in Layotto is divided into prime mill: - -- Preset Component - -Like the `PubSub` component, eg. `state.Store` - -- Custom Component - -Allows you to expand your own components, such as the `HelloWorld` component in[使用指南](design/api_plugin/design?id=_24-Use Guide). - -## Profile Structure - -```json - "custom_component": LOs - "": LO - "": LO - "type":"", - "mettatata": LO - "": "", - "": "" - } - }, - "": LO - "type:"", - "mettatata": LO - "": "", - "": "" - } - } - } -}, -``` - -You can configure the key/value configuration that the component is interested in in metatata. - -## Example - -For example, in `configs/config_standalone.json`, the keyd is configured as `customComponent`, with only one component named `demo`, type is `in-memory`: - -```json - "custom_component": { - "helloworld": { - "demo": { - "type":"in-memory", - "metadata": {} - } - } - }, -``` - -## How to use "Custom components"? - -See [使用指南](design/api_plugin/design?id=_24 - Use Guide) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/file/common.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/file/common.md deleted file mode 100644 index ada5fc9420..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/file/common.md +++ /dev/null @@ -1,55 +0,0 @@ -# 文件管理组件 - -**配置文件结构** - -json配置文件有如下结构: - -```json -"file": { - "file_demo": { - "type": "aliyun.oss" - "metadata":[ - { - "endpoint": "endpoint_address", - "accessKeyID": "accessKey", - "accessKeySecret": "secret", - "bucket": ["bucket1", "bucket2"] - } - ] - } -} -``` - - -**配置项说明** - -配置项定义如下: - -```golang - type FileConfig struct { - Type string - Metadata json.RawMessage - } - - Files map[string]file.FileConfig `json:"file"` -``` - -上面的Files是一个map,key为component的名字,比如上述json的aliyun.oss,component的配置没有具体的格式限制,不同component可以根据需求自己定义,比如: - -```json -"file": { - "file_demo": { - "type": "localFile", - "group":{ - "name": "group1" - "permisson":"rwx", - "users":[ - "layotto","mosn" - ] - } - } -} -``` - - - diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/in-memory.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/in-memory.md deleted file mode 100644 index aacfd9c556..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/component_specs/lock/in-memory.md +++ /dev/null @@ -1,27 +0,0 @@ -# In-Memory - -## 配置项说明 - -直接使用配置:configs/config_standalone.json - - -## 启动 layotto - -````shell -cd ${project_path}/cmd/layotto -go build -```` - -编译成功后执行: - -````shell -./layotto start -c ../../configs/config_standalone.json -```` - -## 运行 Demo - -````shell -cd ${project_path}/demo/lock/in-memory/ - go build -o client - ./client -```` \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/configuration/README.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/configuration/README.md deleted file mode 100644 index b3c32d2a0b..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/configuration/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# 如何配置 Layotto? -本文介绍一下如何配置 Layotto \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/actuator/actuator-design-doc.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/actuator/actuator-design-doc.md deleted file mode 100644 index b64150f586..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/actuator/actuator-design-doc.md +++ /dev/null @@ -1,291 +0,0 @@ -# Actuator Design Document - -# Product design - -## Requirements - -- Health Check - -Use the actuator interface to access health status of all internal Layotto components and business applications uniformly - -- View running metadata - -Access to Layotto its own metadata information (e.g. version, git information) and to the metadata information for business applications (e.g. a list of configuration items subscribed to by the Configuration Centre, such as app version information) can be obtained uniformly via the actuator interface. - -- Supporting integrated and open source infrastructure, including: - - Can integrate into k8s health check - - Can be integrated into monitoring systems, such as Prometheus+Grafana - - If necessary, the registration centre may remove the node based on the results of the health check - - This interface can be used as the dashboard project or GUI tool to list problems. -- Similar to Spring Boot Actuator, more imaginary space:Monitoring, Metrics, Auditing, and more. - -## Explanation - -**Q: What values?Who is using the health check interface opened?** - -1. For developing troubleshooting, direct interfaces to query runtime information, or a dashboard page/GUI tool - -2. For monitoring system monitoring; - -3. Automated shipping for infrastructure, such as deploying systems based on health checks to judge deployment progress, stop or continue to deploy in batchs; e.g. registration centres remove abnormal nodes based on health check-ups; e.g. k8s recreate containers based on health check-ups - -**Q: It looks like returning a status code is running, there is no need to return running information?Who will find detailed information on the run?** - -1. This interface can be used as a dashboard page or GUI tool for troubleshooting questions; - -Similar to the spring boot community wrote a spring boot admin page -for reference [https://segmentfault.com/a/1190000017816452](https://segmentfault.com/a/1190000017816452](https://segmentfault.com/a/1190000017816452). - -2. Integrated Monitoring System: Access to Prometheus+Grafana - -Similar to Spring Boot Actuator's access to Prometheus+Grafana -reference[Spring-Boot-Metrics监控之Prometheus-Grafana](https://bigjar.github.io/2018/08/19/Spring-Boot-Metrics监控之Prometheus-Grafana/) - -**Q: Do not control capabilities like "toggle the traffic of specific components inside Layotto"** - -A: No, switching parts will leave the app in partial failure, with uncertainty. -But follow-up could consider adding debug capabilities such as mock, packets, etc. - -**Q: Health check interface does not allow permission control** - -A: Do not get started with feedback needs plus hook - -# Overview design - -## Overall programme - -Open the http's interface first, because the health screening function of open source infrastructure basically supports https (e.g. k8s, prometheus) and does not support grpc. - -In order to be able to reuse filters such as MOSN authentication, Actuator will run on MOSN as a seven-storey filter. - -Specifically, MOSN adds a listener, writing a new stream_filter, which is responsible for http's request processing and calling the Actuator. - -The Endpoint concept is abstracted within the actuator, and when a new request arrives on the server, the Actuator will commission the corresponding endpoint.Endpoint supports the extension and injection of actuator: - -![img.png](/img/actuator/abstract.png) - -## Http API Design - -### Pathways interpretation - -Path is restul style. After different Endpoint is registered in actuator, the path is - -``` -/actuator/{endpoint_name}/{params} -``` - -like - -``` -/actuator/health/livelihood -``` - -The name of the health flag endpoint is health,liveness is the parameter passed to the endpoint. - -Parameters are supported for multiple passes, such as /a/b/c/d, and the semicolon is defined by each endpoint itself - -Default registered path is: - -``` -/actuator/health/liveness -/actuator/health/readability -/actuator/info -``` - -### Health Endpoint - -#### /actuator/health/livelihood - -GET - -```json -// http://localhost:8080/actuator/health/liveness -// HTTP/1.1 200 OK - -{ - "status": "UP", - "components": { - "livenessProbe": { - "status": "UP", - "details":{ - - } - } - } -} -``` - -Returns field description: -HTTP status code 200 for successes, others (over 400) failed -status field with cascade: - -```go -var ( - // INIT means it is starting - INIT = Status("INIT") - // UP means it is healthy - UP = Status("UP") - // DOWN means it is unhealthy - DOWN = Status("DOWN") -) -``` - -#### /actuator/health/readiness - -GET - -```json -// http://localhost:8080/actuator/health/readness -//HTTP/1. 503 SERVICE UNAVAILABLE - -LO - "status": "DOWN", - "components": LO - "readinessProbe": LO - "status": "DOWN" - } - } -} -``` - -### Info Endpoint - -#### /actuator/info - -GET - -```json -// http://localhost:8080/actuator/health/liveness -// HTTP/1.1200 OK - -LO - "app" : LO - "version" : "1.0.0", - "name" : "Layotto" - } -} -``` - -**Q: What is running time metadata?** - -Junk: - -- Version number - -You can add: - -- Callback app -- Runtime config parameter - -**Q: Are components required to perform health check interfaces?** - -Don't force for now - -## Data model for configuration of data - -![img.png](/img/actuator/actuator_config.png) - -Add a listener to handle actuator,stream_filters adding actuator_filter, to handle actuators' requests (see below) - -## Internal structure and request processing process - -![img.png](/img/actuator/actuator_process.png) - -Explanation: - -### Request arrived at mosn, enter Layotto via stream filter and call actuator - -Stream filter implementation class is DispatchFilter, responsible for distributing requests and calling actuator along the http's path: - -```go - -type DispatchFilter struct { - handler api.StreamReceiverFilterHandler -} - -func (dis *DispatchFilter) SetReceiveFilterHandler(handler api.StreamReceiverFilterHandler) { - dis.handler = handler -} - -func (dis *DispatchFilter) OnDestroy() {} - -func (dis *DispatchFilter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffer.IoBuffer, trailers api.HeaderMap) api.StreamFilterStatus { -} -``` - -The protocol layer and actuator decouple coupling. If interfaces from other protocols are required in the future, the protocol will be implemented with stream. - -### Request for distribution to End point within Actuator - -Reference is made to the design of spring boot actuator: -Actuator abstracts the Endpoint concept to support the expansion and inject the Endpoint as needed.Health and info EndPoint are implemented in-house. - -```go -type Actuator struct { - endpointRegistry map[string]Endpoint -} - -func (act *Actuator) GetEndpoint(name string) (endpoint Endpoint, ok bool) { - e, ok := act.endpointRegistry[name] - return e, ok -} - -func (act *Actuator) AddEndpoint(name string, ep Endpoint) { - act.endpointRegistry[name] = ep -} - -``` - -The request will then be distributed to the corresponding endpoint according to the path.e.g. /actuator/health/readiness will be distributed to health.Endpoint - -### Health.Endpoint requests for distribution to health.Indicator - -Component to report health check information implements the Indicator interface, inject health.Endpoint: - -```go -Type Indicator interface LO - Report() Health -} -``` - -Health.Endpoint will distribute the request to health.Indicator - -### Info.Endpoint requests for distribution to info.Contributor - -Components that need to report runtime information achieve Contribor interface, inject info.Endpoint: - -```go -type Contributor interface { - GetInfo() (info interface{}, err error) -} -``` - -info.Endpoint request for distribution to info.Contributor implementation - -# Detailed design - -## Scene design - -### runtime_startup - -- SetsStarted - -![img.png](/img/actuator/set_started.png) - -- SetUnhealth burial point - -Startup failed: - -![img.png](/img/actuator/img.png) - -On Stop's: - -![img.png](/img/actuator/img_1.png) - -### Apollo components - -init: - -![img_2.png](/img/actuator/img_2.png) - -There is no place where the burial is required, because the runtime_startup indicator can also report unhealth if the initialization connection fails. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/actuator/grpc-design-doc.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/actuator/grpc-design-doc.md deleted file mode 100644 index c0db7c7041..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/actuator/grpc-design-doc.md +++ /dev/null @@ -1,114 +0,0 @@ -# MOSN gRPC framework design document - -## Background - -MOSN is able to provide a GRPC Server based on the go grpc server framework. Compared to the original go grpc server framework, the following capacity: is available - -- Full reuse of MOSN Sidecar deployments, upgrades, shipping capabilities -- Reuse basic:HotUps, Listener Filter, Network Filter, etc. common in MOSN -- StreamFilter extension capability in MOSN - -## Idea - -- MOSN's gRPC capacity is largely based on the achievement of core competencies in the official gRPC library and varies from gRPC Server developers -- Based on NetworkFilter - -## Detailed Design - -Split NetworkFilter Mechanisms & Processes - -![networkfilter.png](/img/actuator/networkfilter.jpg) - -- When configuring the resolution, complete the start of the gRPC Server and start providing the service with the Listener listener listener for MOSN -- A connection to a NetworkFilter object - - InitializeFilterCallbacks and OnNewConnections are also the interfaces called when the connection is created. They are responsible for initializing connections - - OnData is an interface called after data is received and is responsible for data transmission -- go gRPC Server library, one connection from Listener to 'listen' and then read and write, while Listener's listening and connection data have been processed in the MOSN framework, where a layer of treatment is required - - Listener and Conn are interface. Once processed in the MOSN Filter, then get data to gRPC Server, do gRPC Server without knowledge - - Implementing Listener's package when configuring parsing - - Implementing Conn packages in InitializeReadFilterCallbacks - - Transmit the packed Conn to the encapsulated Listener, triggering Listener.Accept - - Send read data in OnData to encapsulated Conns, Trigger Conn.Read - -![networkfilter-grpc.png](/img/actuator/networkfilter-grpc.jpg) - -- gRPC Server implementation - - In implementing the gRPC Server using the official gRPC framework, the developer needs to generate a .pb.go file based on proto file, and a set of interfaces that meet the performance defined in the interface to register (Register) into the gRPC Server framework - - MOSN gRPC NetworkFilter needs to provide a similar registration capability, allowing developers to focus only on gRPC Server for logic, and then register in MOSN framework enough - -- The MOSN GRPC framework requires the developer to implement a function, which returns a grpc server that does not call the Serve method.The framework will use the custom Listener to call the Serve method to block data - -```Go -func init() { - mgrpc.RegisterServerHandler("mygrpc", MyFunc) -} -func MyFunc(_ json.RawMessage) *grpc.Server { - s := grpc.NewServer() - // pb 是.pb.go 所在的 package 路径 - // server 是开发者实现的 api 接口 - pb.RegisterGreeterServer(s, &server{}) - return s -} -``` - -- Example of intended configuration (layotto) - -```json -{ - "servers":[ - { - "default_log_path":"stdout", - "default_log_level": "INFO", - "listeners":[ - { - "name":"grpc", - "address": "0.0.0.0:34904", - "bind_port": true, - "filter_chains": [{ - "filters": [ - { - "type": "grpc", - "config": { - "server_name":"runtime", - "grpc_config": { - "hellos": { - "helloworld": { - "type": "helloworld", - "hello": "greeting" - } - }, - "config_store": { - "config_store_demo": { - "type": "etcd", - "address": ["127.0.0.1:2379"], - "timeout": "10" - } - } - } - } - } - ] - }], - "stream_filters": [ - { - "type": "flowControlFilter", - "config": { - "global_switch": true, - "limit_key_type": "PATH", - "rules": [ - { - "resource": "/spec.proto.runtime.v1.Runtime/SayHello", - "grade": 1, - "threshold": 5 - } - ] - } - } - ] - } - ] - } - ] -} - -``` diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/api_plugin/dapr_api.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/api_plugin/dapr_api.md deleted file mode 100644 index 38cfdb1a73..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/api_plugin/dapr_api.md +++ /dev/null @@ -1,52 +0,0 @@ -## TLDR - -This proposal seeks to allow the open source Layotto to support both the Layotto API and the Dapr API.Similar to "Minio supports both Minio API, and AWS S3 API" - -## Issues to solve - -1. At present, we try to ensure that the various fields in the Layotto API are defined in the same way as Dapr, but the real concern of the users is whether they can be reused.While we are trying to ensure consistency in the proto field, as long as sdk cannot be reused, we do not solve users' problems and increase maintenance costs for ourselves. - e.g.: - ![image](https://user-images.githubusercontent.com/26001097/145837477-00fc5cd8-32eb-4ce9-bbfb-6e590172fce8.png) - -So we want Layotto directly support the grpc API in Dapr (like a package, including package), which he can freely switch between with Dapr sdk without fear of being bound by the manufacturer. - -2. On the other hand, some expansion is required.We found that the current Dapr API was not able to meet the needs completely, and some extension of the API was unavoidable.The extended API has been added to the current Layotto API. The proposal has been submitted to the Dapr community but is still waiting for it to be accepted by the community, such as config Is, such as the Lock API. - -## Programmes - -### Layotto API on Dapr API - -![image](https://user-images.githubusercontent.com/26001097/145838604-e3a0caad-9473-4092-a2c6-0cc46c972790.png) - -1. Layotto will start a grpc server with the frontline just adding an API plugin in the form of an API plugin. -2. On the other hand, the Layotto API is retained.Layotto received the Layotto API request and translated into Dapr API, then proceeded to Dapr API. - Such benefits are: - -- Reuse Code -- The Layotto API can be expanded according to production needs, such as support to the Lock API, configuration API, etc.; it can be extended to the Dapr community and then slowly discuss, even if the outcome of the final discussion differs from the original proposal, it only affects the resulting Dapr API, and does not affect users already using Layotto API. - -### User Value - -For users Issal: - -- If users worry about the manufacturer's binding, they can only use Dapr API to migrate between Dapr and Layotto with the same set of Dapr sdk. -- If users believe our landed experience and are willing to use Layotto API, they can use Layotto API, at the cost of not migrating between two sidecar with the same sdk - -### Q&A - -#### How to add a field to Dapr API - -##### Want to add a field (field) - -For example, if you want to add a abc field to your layotto api, you can pass this field on to the dap API -dapr API implementation and then pass it over to the component, which parses this field - -##### Not only fields but also logic, mechanisms (mechanism) - -For example, layotto api adds a abc field if abc=true, then runtime takes a special logic - -This will change the implementation of the Dapr API, plus an if else - -#### Want to add new API - -Add to the layotto API, the new API does not need to reuse Dapr API; wait for Dapr to receive the proposal before modifying it, layotto APIs. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/api_plugin/design.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/api_plugin/design.md deleted file mode 100644 index 21fc65fc1f..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/api_plugin/design.md +++ /dev/null @@ -1,338 +0,0 @@ -# API Plugin Design Documentation & Use Guide - -The first half of this paper discusses what the API plugin solves and why it is designed, and the second half describes how the API plugin works. - -If you use only API plugins, you can jump directly to [2.4.Use Guide](design/api_plugin/design?id=_24 - Use Guide) - -## Needs analysis - -### What issues to address - -Resolve extension issues.The API, either Dapr or open source Layotto, is currently unable to fully meet production needs. - -Looking at the development history of POSIX API and system call in the operating system domain, we can learn a lot to predict the future of Runtime.We can say that the Runtime API is unlikely to fully meet user needs in the future.Split OS Realm, even if there is a POSIX API, some scenes need to bypass standard -API, operate special hardware with special instructions. - -Dapr extension is resolved through the Binding API, but this unstructured API has many problems (e.g. destroying portability, not supporting stream etc.) - -### User scenarios and needs - -For example, there are the following user scenes: - -1. Companies have their own customized API needs because they are non-common and unsuited to open source Layotto/Dapr, so a company’s intermediate team wants to develop itself into sidecar.If a company's project import source Layotto or Dapr, there is no way to extend API development under the current architecture, only Fork - to make an extension - -![image](https://user-images.githubusercontent.com/26001097/131614836-60d797c8-b80b-4018-ad43-c2b874d35660.png) - -User needs: in this case - -- sdk sink; -- Multilingualism; -- Cloud deployment (just need intermediate teams themselves to develop components for cloud environments without community ready-made components) - -2. Companies have new API requirements that fit into open source projects and thus demand the community, but the community has had difficulty in reaching consensus and has been struggling for months (e.g. https://github.com/dapr/dapr/issues/2988 - ).In such cases, companies may have operational pressures, cannot afford to wait for so long and want to relocate themselves before they move to new functions in the community. - -User needs: in this case - -- The user is autonomous about this feature and does not need to persuade the community (along with Chinese and English) to make this feature work for the world -- Rapid expansion, service operations - -3. Users want to add fields to the Dapr API, first add fields to their Fork version, meet online needs, and then raise PR to the community.The community refused to add the field, PR was closed.用户很尴尬:这字段已经在线上使用了,怎么处理? - -## High level design - -### Hierarchical API - -Refer to the OS Realm API for this year, we can design the Runtime API into multi-layer: - -![img.png](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*bWnHR7yhiF4AAAAAAAAAAAAAARQnAQ) - -: for OS fields - -- POSIX API -- Various Unix-like system of its own System Call (with portability, implementing the same interface with different hardware drivers) -- Special features provided by special hardware (no portable) - -Based on this idea, we can design API plugins to support users extending their own private APIs. - -![image](https://user-images.githubusercontent.com/26001097/131614802-c6f6a556-4e8b-4fee-b899-275a80e00eb6.png) - -### Design objectives - -1. Let open source users with customized development needs use Layotto instead of Fork by importing Layotto - -2. Simple enough to develop api plugin - -3. Config file is the same json, new api plugin does not need to add new configuration file - -### Functional design - -![image](https://user-images.githubusercontent.com/26001097/131614952-ccfc7d11-d376-41b0-b16c-2f17bfd2c9fc.png) - -Layotto add a number of new extensions. - -When using Layotto, a company user can maintain a project, import Layotto himself.Various extensions and components are stored in your project.If you are familiar with Java, this is similar to [Eureka]for Java communities (https://github.com/Netflix/eureka), you can -import Eureka and then expand. - -When users want to add an API, they can develop a package in their own project (including their proto,pb files, their own API implementation), then call Layotto extension points in `main.go` and register their API in Layotto. - -### Guide to use - -How to add your own proto, add your own private API? - -An example is [the shellowold package provided in the project](https://github.com/mosn/layotto/tree/main/cmd/layotto_multiple_api/helloworld) which implements custom API, \`\`Sayhello\` - -Use this as an example to explain the steps to write an API plugin: - -#### step 0. Define your own proto file and compile a pb - -For example, users would like to add their own `Greeter` API, offering the `Sayhello` method, write a proto: -(this example is my paste from [grpc official exams](https://github.com/grpc/grpc-go/blob/master/examples/helloworld/helloworld/helloworld.proto) - -```protobuf -syntax = "proto3"; - -option go_package = "google.golang.org/grpc/exames/hellotorld/hellowld"; -option java_multiple_files = true; -option java_package = "io. rpc.examples.hellowld"; -option java_outer_classname = "HelloWorldProto"; - -package helloord; - -// The greening service definition. -Service Greeter {} - // Sends a greening - rpc Sayhello (HelloRequest) returns (HelloReply) {} -} - -// The request message containing the user's name. -message HelloRequest { - string name = 1; -} - -// The response message containing the greies -message Hello Reply to the LO - string message = 1; -} -``` - -Then compile it into the `.pb.go` file. - -[Bellowold example pack provided by the project] (https://github.com/mosn/layotto/tree/main/cmd/layotto_multiple_api/helloworld) steal a lazy, direct import of grpc officially compiled .pb.go -file: - -score - -#### step 1. Write implementation for the API just defined - -The protoc compiler will help you compile the interface `hellotorld.GreeterServer`, based on proto file, but the interface needs to be translated by itself. - -For example, the `server` we wrote in the example implements `helloworl.GreeterServer` interface, with `Sayhello` method: - -```go -//server is used to implement elllowld.GreeterServer. -type server struct LO - appId strating - // custom-components which implement the `HelloWorld` interface - name2component map[string]component. World - // LockStore components. They are not used in this demo, we put them here as a demo. - name2LockStore map[string]block. ockStore - pb.UnimplementedGreeterServer -} - -// Sayhello implements hellowd. reeterServer.Sayhello -func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) 6 - if _, ok := s.name2component[componentName]; !ok $6 - return &pb. elloReply{Message: "We don't want to talk with you!"}, nil - } - message, err := s.name2component[componentName]. ayHello(in.GetName() - if err != nil { - return nil, err - } - return &pb.HelloReply{Message: message}, nil -} -``` - -#### Step 2. Implement [`GrpcAPI` interface](https://github.com/mosn/layotto/blob/main/pkg/grpc/grpc_api.go), manage the life cycle of API plugins - -Now that you have your own API implementation, you need to register it on Layotto next step. - -> **Rememberly**:How to register the API on the original grpc server? -> -> Just write this line of code: -> -> pb.RegisterGreeterServer (s, &server{}) - -To register your API on Layotto,: - -- Implementing [`GrpcAPI` interface](https://github.com/mosn/layotto/blob/main/pkg/grpc/grpc_api.go), implementing some lifecycle hooks - -This GrpcAPI manages your API lifecycle and provides various life cycle hooks.There are currently Init and Register in the current lifecycle hook. - -```go -// GrpcAPI is the interface of API plugin. It has lifecycle related methods -type GrpcAPI interface of the APIs - // init this API before binding it to the grpc server. - // For example, you can call the app to every their subscriptions. - Init (conn *grpc. lientConn) error - - // Bind this API to the grpc server - Register(s *grpc. erver, registeredServer mgrp.RegisteredServer) (mgrpc.RegisteredServer, error) -} -``` - -- Performs the corresponding constructor `NewGrpcAPI` to create your `GrpcAPI`. - -```go -// NewGrpcAPI is the constructor of GpcAPI -type NewGrpcAPI func (applicationContext *ApplicationContext) GrpcAPI -``` - -`*ApplicationContext` is defined as: - -```go -// ApplicationContext contains all you need to construct your GrpcAPI, such as all the components. -// For example, your `SuperState` GrpcAPI can hold the `StateStores` components and use them to implement your own `Super State API` logic. -type ApplicationContext struct { - AppId string - Hellos map[string]hello.HelloService - ConfigStores map[string]configstores.Store - Rpcs map[string]rpc.Invoker - PubSubs map[string]pubsub.PubSub - StateStores map[string]state.Store - Files map[string]file.File - LockStores map[string]lock.LockStore - Sequencers map[string]sequencer.Store - SendToOutputBindingFn func(name string, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) - SecretStores map[string]secretstores.SecretStore - CustomComponent map[string]map[string]custom.Component -} -``` - -##### What is the interpretation of:`CustomComponent`? - -is "Custom components". - -Component in Layotto is divided into prime mill: - -- Preset Component - -e.g. `pubsub` components, like `state` component - -- Custom Component - -Allows you to expand your own components, such as the `HelloWorld` component in the example below. - -##### How does:configure a custom component? - -See[自定义组件的配置文档](component_specs/custom/common.md) - -##### View Example - -Look at a specific example, in [helloowold exams](https://github.com/mosn/layotto/blob/main/cmd/layotto_multiple_api/helloworld/grpc_api.go), `*server` implements `Init` -and `Register`: - -```go -func (s *server) Init (conn *rawGRPC.ClientConn) error { - return nil -} - -func (s *server) Register(grpcServer *rawGRPC.Server, registeredServer mgrpc. egisteredServer) (mgrpc.RegisteredServer, error) um - pb.RegisterGreeterServer (GrpcServer, s) - return registeredServer, nil -} -``` - -There is also a construction: - -```go -func NewHelloWorldAPI(ac *grpc_api.ApplicationContext) grpc.GrpcAPI - // 1. convert custom-components components - name2component := make(map[string]component. elloWorld) - if len(ac.CustomComponent) != 0 56 - /we only care about those components of type "helloowl" - name2comp, ok := ac. customomComponent[kind] - if ok & len (name2comp) > 0 F6 - for name, ::= range name2comp LO - // convert them using type assortion - comp, ok := v. component.HelloWorld) - if !ok - errMsg := fmt. printf("customom component %s does not implement HelloWorld interface", name) - log.DefaultLogger. rorf(errMsg) - } - name2component[name] = comp - } - } - } - / 2. Construct your API implementation - return &server - appId: ac. ppId, - // Your API plugins in can store and use all the components. - // For example, this demand set all the LockStore components here. - name2LockStore: ac.LockStories, - // Customers components of type "helloorl" - name2component: name2component, - } -} -``` - -##### Explain:these callbacks, constructions? - -Look at this example, you might ask:these callbacks, constructions and calls? - -The hook above is used to customize the start logic for the user extension.Layotto reverses the above life-cycle hooks and constructions during startup.Call order roughly: - -`Layotto initialize all components` ---> Call `NewGrpcAPI` constructor ---> `GrpcAPI.Init` ---> ``Layotto create grpc server` --->``GrpcAPI.Register\`\` - -Graph below: - -score - -#### step 3. Sign up your own API into Layotto - -After achieving your private API -following the above steps, you can [register it in your main main in Layotto](https://github.com/mosn/layotto/blob/5234a80cdc97798162d03546eb8e0ee163c0ad60/cmd/layotto_multiple_api/main.go#L203): - -```go - -func NewRuntimeGrpcServer (data json.RawMessage, options..grpc.ServerOption) (mgrpc. egisteredServer, error) LO - // ...... - - /3. run - server, err := rt. un( - runtime.WithGrpcOptions(opts... , - // register your GrpcAPI here - runtime. ithGrpcAPI( - // default GrpcAPI - default_api. ewGrpcAPI, - // a demo to show how to register your own GrpcAPI - helloord_api. ewHelloWorldAPI, - ), - // Hello - runtime. ithHelloFactory ( - hello.NewHelloFactory ("hellotorld", hellold. ewHelloWorld), - ), - // ... -``` - -We recommend that users customize main functions and customize startup processes in their own projects. - -Specifically, you can paste the main copy of Layotto into your project, modify it as necessary, and remove something that is not available (e.g. in a distribution lock component that is not etcd, you can remove it from your main name) - -#### Step 4. Compile Run Layotto - -Ready to start Layotto. - -Example hellowd: - -```shell -cd ${project_path}/cmd/layotto_multiple_api -go build -o layotto -# run it -./layotto start -c ../../configs/config_standalone.json -``` - -During Layotto launch, each registered API lifecycle method (Init, Register) will be callback to each registered API - -Once startup, your API will offer grpc services externally diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/configuration/configuration-api-with-apollo.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/configuration/configuration-api-with-apollo.md deleted file mode 100644 index 2bb3a5521f..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/configuration/configuration-api-with-apollo.md +++ /dev/null @@ -1,119 +0,0 @@ -# Implementing Configuration API with ctripcorp/apollo - -## Objective - -Implementation of [Configuration API(level-2)](https://github.com/dapr/dapr/issues/2988) with ctripcorp/apollo - -## Schema - -### Configuration API map apollo schema - -The mapping rules are as follows: - -| Configuration API Parameters | apollo schema | -| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | -| app_id | ///ignore this parameter when searching for or subscribed to it, use app_id in configuration file instead | -| Group | name | -| label | //追加到key的后面. 在apollo中key实际存储的格式为'key@$label' | -| tag | // Put an item in the configuration in json | - -在apollo中key实际存储的格式为`key@$label`,value为原始值。 - -Tags将以key=`group@$key@$label` and value= - -```json -LO - "tag1": "tag1value", - "tag2": "tag2value" -} -``` - -Format is stored in a specific namespace `sidecar_config_tags` - -**Q: Why don't you have an item to store values and tags to reduce the number of queries, e.g. :** - -```json -{ - "value":"raw value", - "tags":{ - "tag1":"tag1value", - "tag2":"tag2value" - } -} -``` - -A: If this design is adopted, the historical legacy of the use of apollo will not be able to migrate to sidecar - -### How to migrate historical legacy projects - -1. Get/subscripbe API is compatible.Without save/delete API, users can easily migrate legacy projects to sidecar.只需要在config.json文件中保持`label`字段为空,sidecar将会使用原始key来替代`key@$label`与apollo进行交互。 -2. Save/delete API may not be compatible.sidecar uses fixed `cluster` and `env` fields in config.json.This means that users cannot use `cluster` and `env` fields as parameters for save/deleteAPI if they want to change some configuration items with other appids. - -### sidecar config.json file - -```json -{ - "config_store": { - "type": "apollo", - "address": [ - "http://106.54.227.205:8080" - ], - "metadata": { - "app_id": "testApplication_yang", - "cluster": "dev", - "namespace_name": "dubbo,product.joe", - "is_backup_config": true, - "secret": "6ce3ff7e96a24335a9634fe9abca6d51" - } - } -} -``` - -## API - -### Which Apollo SDK should I use? - -Currently using official maintenance[SDK](https://github.com/apolloconfig/agollo), other Apollo's third party SDK can be found from[链接](https://www.apolloconfig.com/#/usage/third-party-sdks-user-guide). - -Use some of this sdk's attention: - -1. Before connecting to the server and creating the client, the user must declare all namespace in the AppConfig, as shown below in: - -```go - c := &config. ppConfigL - AppID: "testApplication_yang", - Cluster: "dev", - IP: "http://106. 4.227. 05:8080", - NamespaceName: "dubbo", // Statement - IsBackupConfig: true, - Secret: "6ce3ff7e96a24335a9634fe9abca6d51", - } - client, err := agolloConfig. tartWithConfig(func() (*config.AppConfig, error) { - return c, nil - }) -``` - -1. You cannot configure the `env` field. - -2. No Save/delete API. - -3. No bulk queries for API. - -4. Security cannot be ensured in parallel. - -5. Configure or don't use [Apollo Meta Server](https://www.apollocconfig.com/#/usage/java-sdk-user-guide?id=_122-apollo-meta-server). - -6. There is a problem setting kv and tags. There is no transaction. - -### How I should use the Apollo SDK API - -| Configuration API | apollo sdk API | -| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| GetConfiguration | cache := client.GetConfigCache(c.NamespaceName)value,_:= client.Get("key") | -| SaveConfiguration | 通过http. [update](https://www.apolloconfig.com/#/zh/usage/apollo-open-api-platform?id=_3211-%e4%bf%ae%e6%94%b9%e9%85%8d%e7%bd%ae%e6%8e%a5%e5%8f%a3) + [commit](https://www.apolloconfig.com/#/zh/usage/apollo-open-api-platform?id=_3213-%e5%8f%91%e5%b8%83%e9%85%8d%e7%bd%ae%e6%8e%a5%e5%8f%a3) 使用open API | -| DeleteConfiguration | 使用http. [delete](https://www.apolloconfig.com/#/zh/usage/apollo-open-api-platform?id=_3212-%e5%88%a0%e9%99%a4%e9%85%8d%e7%bd%ae%e6%8e%a5%e5%8f%a3) + [commit](https://www.apolloconfig.com/#/zh/usage/apollo-open-api-platform?id=_3213-%e5%8f%91%e5%b8%83%e9%85%8d%e7%bd%ae%e6%8e%a5%e5%8f%a3) 使用open API | -| SubscripbeConfiguration | https://github.com/apolloconfig/agollo/wiki/%E7%9B%91%E5%90%AC%E5%8F%98%E6%9B%B4%E4%BA%8B%E4%BB%B6 | - -### How to subscribe to all configuration changes for the specified app - -Subscribe to all declared namespaces in config.json file. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/faas/faas-poc-design.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/faas/faas-poc-design.md deleted file mode 100644 index 743c8cb12e..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/faas/faas-poc-design.md +++ /dev/null @@ -1,45 +0,0 @@ -# FaaS Design Document - -## Structure design - -![img.png](/img/faas/faas-design.jpg) - -In the package FaaS, the following two issues were resolved mainly by the following question: - -1. What is the relationship between compiled waste files and mirrors? - 1. The target waste file is eventually built into a normal mirror, pushed to Dockerhub. The pulse pulls the image as well as the original image. However, when running, the target waste file will be extracted from the image to load it separately. -2. How can k8s be managed to deploy wasm documents? - 1. Based on k8s' life-cycle management and movement strategy, the Containerd-shim-layotto-v2 plugins are customized in connection with Containerd's v2 interfaces and converted to Layotto Runtime when the container is running, for example, the k8s's creation of a container is turned into a function that loads the waste shape and runs. - 2. A sandbox isolation environment with a good Web Assembly and Layotto as a base can load functions that run multiple wasm forms, all of which are running in a process but not influential, and this nanoprocity thinks more than a docker can make full use of resources. - -### Core components - -#### A, [WebAssembly (wasm)](https://webassembly.org/) - -Wasm1,wasm2 in the corresponding architectural charts, which codify and run the developed function as `*.wasm` as the form of function existing, using the sandbox isolation provided by WebAssembly technology for purposes that do not affect each function. - -#### B,[Layotto](https://github.com/mosn/layotto) - -Positions are designed to provide services, resources and security for functions.As a base from which functions will operate, provide access to the entrance to the infrastructure including WebAssembly running, functions can use maximum resource limits, functions for system call permission validation, etc. - -#### C,[Containerd](https://containerd.io/) - -When officially supported containers are running, docker is one of the most scenic implementations currently used, and security containers such as kata and gvisor are also using the technology and Layotto builds on their thinking and integrates the function loading process into concrete implementation when the container is running. - -#### D,[Containerd-shim-layotto-v2](https://github.com/layotto/containerd-wasm) - -Based on Containerd's V2 interface definition, the logic of the running of the container is customized, such as creating the container to perform the operation to allow Layotto load and run the wasm function. - -#### E,[Kubernetes](https://kubernetes.io/) - -The factual standard of the current container schedule, life-cycle management and movement strategy are excellent, and the containerd-based solution is designed to combine function movement with k8s ecologically perfect. - -### Runtime ABI - -#### A. [proxy-wasm-go-sdk](https://github.com/layotto/proxy-wasm-go-sdk) - -The interface of function access to system resources and infrastructure services is defined and implemented on a community-based basis [proxy-waste/spec] (https://github.com/proxy-wasm/spec) that brings together the [Runtime API](https://github.com/mosn/layotto/blob/main/spec/proto/runtime/v1/runtime.proto) and adds ABI to infrastructure visits. - -#### B. [proxy-wasm-go-host](https://github.com/layotto/proxy-wasm-go-host) - -Concrete logic for Runtime ABI in Layotto. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/file/file-design.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/file/file-design.md deleted file mode 100644 index 52e798a8d0..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/file/file-design.md +++ /dev/null @@ -1,123 +0,0 @@ -# File API design documentation - -## API - -The API definition is mainly based on commonly used file operations and is divided into four additional and deleted interfaces. For the Get/Put interface, file upload and download require support for streaming transfer.Thus the following interface definition is: - -```protobuf - // Get file with stream - rpc GetFile(GetFileRequest) returns (stream GetFileResponse) {} - - // Put file with stream - rpc PutFile(stream PuteRequest) returns (google. Rotobuf. mpty) {} - - // List all files - rpc ListFile(ListFileRequest) returns (ListFileResponse){} - - // Delete specific file - rpc DelFile(DelFileRequest) returns (google. Rotobuf.Empty {} -``` - -Discussion of the definition of interfaces can be based on[issue98](https://github.com/mosn/layotto/issues/98) - -## Definition of parameters - -```protobuf -message GetFileRequest { - // - string store_name = 1; - // The name of the file or object want to get. - string name = 2; - // The metadata for user extension. - map metadata = 3; -} - -message GetFileResponse { - bytes data = 1; -} - -message PutFileRequest { - string store_name = 1; - // The name of the file or object want to put. - string name = 2; - // The data will be store. - bytes data = 3; - // The metadata for user extension. - map metadata = 4; -} - -message FileRequest { - string store_name = 1; - // The name of the directory - string name = 2; - // The metadata for user extension. - map metadata = 3; -} - -message ListFileRequest { - FileRequest request = 1; -} - -message ListFileResp { - repeated string file_name = 1; -} - -message DelFileRequest { - FileRequest request = 1; -} -``` - -### Get Interface - -Get's main entry is three: - -\| **Parameter Name** | **Mean** | -\| ---- | -- | -- | -- | -- | -- -- | -- | -- -- | -- -- | -- -- | -- | -- | -\| store_name | corresponding backend components (eg: aliyun. ss, aws.s3) | yes | -\| name | file name | yes| -\| metadata | Metadata where users can specify some of the fields that component needs, (eg:per, username etc.) | yes| - -### Put Interface - -Put interfaces have three main interfaces and more than one data field is used to transfer file content: - -\| **Parameter Name** | **Mean** | -\| ---- | -- | -- | -- | -- | -- -- | -- | -- -- | -- -- | -- -- | -- | -- | -\| store_name | corresponding backend components (eg: aliyun. ss, aws. 3) | yes | -\| name | yes| -\| data | file content | nos (allowing users to upload empty data, each component can be operationalized)| -\| metadata, which users can specify some of the fields that component needs, (eg:permission, username, etc.) | yes| - -### Lists and Dels Interfaces - -Parameters for both interfaces are the same: - -\| **Parameter Name** | **Mean** | -\| ---- | -- | -- | -- | -- | -- -- | -- | -- -- | -- -- | -- -- | -- | -- | -\| store_name | corresponding backend components (eg: aliyun. ss, aws.s3) | yes | -\| name | file name | yes| -\| metadata | Metadata where users can specify some of the fields that component needs, (eg:per, username etc.) | yes| - -### Configure Parameters - -Configure parameters, different components can be configured in different formats such as aliyun.oss below: - -```protobuf - -{ - "file": { - "file_demo": { - "type": "aliyun.oss", - "metadata":[ - { - "endpoint": "endpoint_address", - "accessKeyID": "accessKey", - "accessKeySecret": "secret", - "bucket": ["bucket1", "bucket2"] - } - ] - } - } -} - -``` diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/lifecycle/apply_configuration.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/lifecycle/apply_configuration.md deleted file mode 100644 index d51062e569..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/lifecycle/apply_configuration.md +++ /dev/null @@ -1,200 +0,0 @@ -# Dynamically configure the sending, component heated reload - -## Issues addressed - -- Now the producer user has a customized set of initialization configurations:with some configurations in the app, after app starts, sidecar, allowing sidecar to be initialized based on these configurations.Programmes are not common enough and are more common to do - -![image](https://user-images.githubusercontent.com/26001097/168947177-6a26397e-4648-47f0-a8df-e898285cd8f9.png) - -- Support "Dynamically Down Configuration". - - One idea is to couple the configuration file and mirror to the container via disk.For example, Dapr config item is released into Configuration CRD, CRD changes will require the carrier to reboot the cluster via k8s scroll. - - Another line of thought is [inject config_store components into other components] (https://github.com/mosn/layotto/issues/500#issuomment-1119390497) but has some disadvantages: - - Users who want to use the "Dynamic Configuration" function have no means of extending hands, no community ready-made components, and have to develop their components. - The runtime level is best used for some common features, "empowerment" all components, community maintenance of ready-made components, support for dynamic configuration, and user-friendliness and open boxes. - - Another line of thought is to split the configuration between the first expert:bootstrap configuration (static configuration), which is not placed in mirrors, and the dynamic configuration which supports the release of the configuration and heated reload based on the configuration. - -## Product design - -### User story - -1. The user changed the disaster switching configuration to Redis on the apollo page, so that the Redis component received the new configuration and switches the traffic to the Disaster Preparedness Cluster -2. There are already producing users who can migrate the initialization process to a new model that will be compatible downward. - -### Programming UI - -For example, the start configuration for state.redis now has the following (screenshot taken from [dapr documents](https://docs.dapr.io/reference/components-reference/supported-state-stores/setup-redis/) -![image](https://user-images.githubusercontent.com/26001097/168946975-9804d792-8851-463f-80ee-26231468f0aa.png) - -The status quo is that these configurations kv are initialized when the:redis component startup; all configurations are static configurations, only once, and no subsequent configuration changes are listened. - -But we can change: - -- These kv can be dynamically employed -- layotto listen to these kv changes, except for changes that **Reinitialize component with the latest configuration** -- Dynamic update interface can be implemented if the component feels too small to reinitialize - -Advantage and disadvantages analysis: - -- pros - - runtime layer can perform some general functionality, "empowerment" all components; easy access for users, community maintenance of ready-made components, and dynamic configuration support, user open boxes -- Cons - - Realization is complex.How do you ensure that traffic does not damage during reinitialization? - - I am not aware that this will not meet users' production needs, worries about early design, over-design - -## High-level design - -![image](https://user-images.githubusercontent.com/26001097/168949648-3f440a84-45d3-45c1-89ef-79cb25d49713.png) - -### Exposes UpdateConfiguration API after startup - -Sidear starts up or uses json files to make a new API for configuration thermal changes once it is passed: - -```protobuf -rpc UpdateConfiguration( RuntimeConfig) returns (UpdateResponse) -``` - -### Agent is responsible for interacting and calling the UpdateConfiguration API - -That is, Sidecar is just opening an interface and waiting for others to configure it.And things that interact with the face and subscribe to configuration changes can be done with an agent 2 on the map, which subscribes to the apollo configuration change, which changes the interface with Sidecar to make Sidecar hot updates. - -For existing production users, you can listen to the app feeding configuration, dump configuration, load configuration on reboot and push configuration to Sidecar. - -For example, you can write a File Agent issue, listen to file changes, read the new configuration and notify Sidecar to reload. - -Agent does not have to be a separate process but also start a separate process in the main one. - -### Component Hot Reload - -When Sidecar is brought to an UpdateConfiguration API, it will: - -1. No "Increment Update" interface has been implemented by the judging component: - -```go -UpdateConfig(ctx context.Context, metadata map[string]string) (err error, needReload bool) -``` - -2. runtime tries to update components if they have an interface, runtime -3. runtime **Reinitialize component based on full configuration** if incremental update fails, or if the interface is not implemented -4. After the new component has been reinitialized (check through readability), take over traffic from the original component - -## Detailed design - -### GRPC API design - -```protobuf -Service Lifecycle L/ - - rpc ApplyConfiguration(DynamicConfiguration) returnns (ApplyConfigurationResponse) {} - -} - -message Dynamic Configuration{ - - Component_config = 1; - -} } } - -message ApplyConfigurationResponse -} -``` - -#### ComponentConfig Field Design - -##### Design of a common updating interface - -```protobuf -message Composiconfig Fact - - // For example, `lock`, `state` - string type = 1; - - // The component name. For example, `state_demo` - string name = 2; - - map metadata = 3; -} -``` - -~With google/protobuf/struct.proto describe dynamic json see https://stackoverflow.com/questions/5296644/is-google-proto-the-best-way-to-send-dynamic-json-over-grpc~! - -Upload configuration with `map`. - -- Advantages - Do not change the sdk of each language for each new API or configuration structure to allow users to pass through and sidecar side to deserialize - -- The - field format does not show definitions, are not clear, and does not have enough personnel - -##### b. Structured definitions of each class configuration - -```protobuf -// Component configuration -message ComponentConfigure - // For example, `lock`, `state` - string kind = 1; - // The component name. For example, `state_demo` - string name = 2; - - google. Rotobuf. Cart metadata = 3; - - one of common_config LO - LockCommonConfigurationlock_config = 4; - - StateCommonConfiguration state_config = 5; - - // . - } -} -``` - -Advantage and disadvantages above - -##### Conclusion - -Select A, reduce the cost of SDK maintenance - -#### Q: A separate API plugin or an existing API plugin - -Write a separate API plugin - -#### Q: Was to configure vs active pull configuration vs push back - -Wait Push Configuration - -#### Q: API accepts full or incremental configuration - -Additions, sequencing issues are guaranteed by stream. - -```protobuf -service Lifecycle { - - rpc UpdateComponentConfiguration(stream ComponentConfig) returns (UpdateResponse){} - -} -``` - -b. Full amount - -Conclusion: b, simplerYou can add an additional interface to make incremental changes via stream, if needed. - -### Component API design - -```go -Type Dynamic interface of Jean-Marie - ApplyConfig(ctx context.Context, metadata map[string]string) (err error, needReload bool) -} -``` - -## Future work - -### pubsub subscriber service - -Requires some more structured configuration data to be released - -### Component Hot Reload - -//TODO - -- How to ensure the loss of data during reinitialization -- Config Priority:has some configurations that are customized for a single app and some are common configurations for all app utilities, with priority for both parties -- Configure transaction reading and writing to avoid dirty reading diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/lock/lock-api-design.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/lock/lock-api-design.md deleted file mode 100644 index e33ce525af..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/lock/lock-api-design.md +++ /dev/null @@ -1,277 +0,0 @@ -# Add TryLock and Unlock API - -Add TryLock and Unlock API. - -The renewal API is disputed and version 1 is not part of the renewal API - -# Research - -| **System** | **Distributed Lock** | **Block lock (watch)** | **Availability** | **Write line consistent** | **sequencer ([chubby论文里提出的feature](https://static.googleusercontent.com/media/research.google.com/zh-TW//archive/chubby-osdi06.pdf)** | **Renewed** | -| ------------- | -------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | -| Solo Redis | yes | x | Lock service is not available when single point expires | yes | yes(needed pic) | yes | -| rediscluster | yes | x | yes | no. Failures can cause locking | yes(needed pic) | yes | -| redis Redlock | yes | | | | | | -| consul | yes | | | | | | -| zookeeper | yes | yes | yes has fo, [elections within 200 ms] (https://pdos.csail.mit.edu/6.824/papers/zookeeper.pdf) | yes | yes use zxid as sensor | yes | -| etcd | yes | yes | yes | yes | yes use revision | yes lease. KeepAlive | - -Can see some difference in capacity or - -# High-level design - -## API - -### Design principles - -We are faced with many temptations, distributive locks have many features that can be done (blocked, relocked, read, lock, sequencer, etc.) - -But after all, our goal is to design a sufficient set of common API specifications, so as to be as conservative as possible on the API, to abstract simple and common features into API specifications before considering more features into API norms - -### TryLock/Unlock - -Base Lockout and unlock features.TryLock is not blocked, return directly if no locks are grabbed - -proto: - -```protobuf -// Distributed Lock API -rpc TryLock(TryLockRequest)returns (TryLockResponse) {} - -rpc Unlock(UnlockRequest)returns (UnlockResponse) {} - -message TryLockRequest { - string store_name = 1; - // resource_id is the lock key. - string resource_id = 2; - // lock_owner indicate the identifier of lock owner. - // This field is required.You can generate a uuid as lock_owner.For example,in golang: - // - // req.LockOwner = uuid.New().String() - // - // This field is per request,not per process,so it is different for each request, - // which aims to prevent multi-thread in the same process trying the same lock concurrently. - // - // The reason why we don't make it automatically generated is: - // 1. If it is automatically generated,there must be a 'my_lock_owner_id' field in the response. - // This name is so weird that we think it is inappropriate to put it into the api spec - // 2. If we change the field 'my_lock_owner_id' in the response to 'lock_owner',which means the current lock owner of this lock, - // we find that in some lock services users can't get the current lock owner.Actually users don't need it at all. - // 3. When reentrant lock is needed,the existing lock_owner is required to identify client and check "whether this client can reenter this lock". - // So this field in the request shouldn't be removed. - string lock_owner = 3; - // expire is the time before expire.The time unit is second. - int32 expire = 4; -} - -message TryLockResponse { - - bool success = 1; -} - -message UnlockRequest { - string store_name = 1; - // resource_id is the lock key. - string resource_id = 2; - - string lock_owner = 3; -} - -message UnlockResponse { - enum Status { - SUCCESS = 0; - LOCK_UNEXIST = 1; - LOCK_BELONG_TO_OTHERS = 2; - INTERNAL_ERROR = 3; - } - - Status status = 1; -} - -``` - -**Q: the time unit for the expire?** - -A: seconds. - -**Q: Can you force users to make seconds large points without being too small?** - -A: is not allowed on compilation or on startup. - -**Q: What if multiple clients transmit the same LockOwner?** - -Case 1. Two client app-id is different, with the same lockOwner passed and no conflict - -Case 2. Like the two client app-ids, there is a conflict between LockOwner with the same passage.There may be exceptional circumstances in which someone can be robbed, frees someone else's lock. - -The user therefore needs to ensure the uniqueness of LockOwner, such as assigning a UUID, golangprototype: per request - -```go -import "github.com/google/uuid" -//... -req.LockOwner = uuid.New().String() -``` - -**Q: What does not meta** - -A: Be as conservative as possible at the beginning, and some people get feedback about additional needs or find out in the implementation of the component that there is a real need for settlement - -**Q: Do you want to support sequentier and relocking features like then?** - -A: Add feature option to add components to support interface - -### Renewal - -#### Solvation A: add an API "LockKeepAlive" - -```protobuf -rpc LockKeepAlive(stream LockKeepAliveRequest) returns (stream LockKeepAliveResponse) {} - -message LockKeepAliveRequest L$ - // resource_id is the lock key. - string resource_id = 1; - - string client_id = 2; - // expire is the time to expire - int64 expire = 3; -} - -message LockKeepAliveResponse LO - enum Status Fit - SUCCESS = 0; - LOCK_UNEXIST = 1; - LOCK_BELONG_TO_OTHERS = 2; - } - // resource_id is the lock key. - string resource_id = 1; - - Status status = 2; -} -``` - -The re-entry of the lease and the return result is stream, where the implementation of the reference etcd, the app and sidecar need to maintain only one connection and use the link to relay the renewal lease request every time the lock requires a renewal lease. - -**Q: Why don't you use the renewal as a stream parameter to tryLock?** - -A: Many businesses are not rented to make trylock as simple as possible; - -To maximize single responsibilities, followed by blocklocks that can be used to renew the API; - -Split parts with streams into an interface to make it easy for https. - -**Q: The renewal logic is too complex to make users unknown?** - -A: sdk block this logic, start thread/protocol/nodejs timing, automatic renewal - -#### Solvolution B: Users are not aware of continued lease logic, auto-rent, app and sidecar maintain a unified heart jump - -Disadvantages/Difficulty: - -1. Use uniform heart jumps, it is difficult to customize interval - -Solve is a guaranteed low jump intervals, for example 1 second time in 1 second - -2. How to ensure reliable troubleshooting? - -e.g. the java code below, unlock may fail: - -```java -tryLO - -}finallyLO - lock.unlock() -} -``` - -If a single machine lock, unlock guarantees success (unless the entire jvm failure), but unlocks can fail.How can you make sure to jump off when the call fails? - -This requires business to jump to the state of some fine particle levels when developing the business. - -We can define the HTML callback interface to be detected by actuator wheel and agree that the callback returned data structure is: - -```json -{ - "status": "UP", - "details": { - "lock": [ - { - "resource_id": "res1", - "client_id": "dasfdasfasdfa", - "type": "unlock_fail" - } - ], - "xxx": [] - } -} -``` - -App handles state gathering, reporting and clearing after successful reporting, limiting map capacity (e.g. the number of failed reports and the size of the map's big OOOM). Altogether, it requires the app to perform some complicated logic, as well as to release the sdk - -3. This implementation, like renewal of rent, is managed on a separate connection that needs to be reported through this public connection. -4. API speciality dependency jump logic.Dependency jumps interval and heart jump back data structure.The equivalent of the API speck relies on Layotto implementation, unless we can also standardize heart jump and drop (including intervals, returned data structures, etc.) -5. Heart jump failed once. Do sidecar continue rent?If the sidecar stopped renting anymore, will the next heart jump test be normal, will sidecar resume the lease?It is more difficult to define, because there is a skeptical mechanism (for example, a few failures of heart failure), when the skepticism ends too slowly and when the radical stop of the lease can be repeated -6. The app skipped once and then restored. sidecar knows how to know if the app continues to be locked (it may be just a short time to shake, then restored, or it may simply restart unlocked) - -#### Solvation C:app retries unlock - -If unlocks fail, apply your own asynchronous retry unlock - -#### Conclusion - -There are currently divergent views on the renewal of the rental scheme and the renewal of the rental function will not be achieved in one issue. - -Personal inclination to Program A, sdk blocks the logic of renewal of rent.While a grpc direct transfer would require the processing of the renewal logic, the renewal of the lease would be a distributed localized locking programme and a low cost of understanding by the developers. - -Throw out for everybody - -## Components - -### How to deal with "components do not support a feature option" - -Simulate >Run Error>ignore - -Exceptional circumstances, such as consistence, are eventual, but the storage system itself is strong and can be used as an option - -### How to deal with "components do not support an API" - -Simulate >Run Error - -As transaction API examples - -### Selection: - -Select Single Machine Redisimplementation - -### "Running missing" designs destroy portability and how can users be made simpler to assess whether they can transplant? - -Providing a document, where each component of the document gives a different guarantee, feature, allowing users to assess themselves - -Declares the feature option supported by the API in the sidecar configuration. If sidecar starts to discover that the component is not match, report an error on startup - -C. Residecar running time logs, automatic statistical data on what features the app uses and log analysis when transplant is required - -D. Profiling first - -E. Providing a static analysis tool for automatic transplantation analysis - -Conclusion:Option A because it is simple - -# Future work - -- Remindable - -There will be some arithmetic logic.You need to consider whether all locks can be reentered by default, or add a feature to the upload. - -- Block Lock -- sequencer - -# Reference - -[How to do distressed blocking](https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html) - -[The Chubby lock service for loosely-coupled distributed systems](https://static.googleusercontent.com/media/research.google.com/zh-TW//archive/chubby-osdi06.pdf) - -[https://www.jianshu.com/p/6e72e3eee5623](https://www.jianshu.com/p/6e72eee5623) - -[http://zhangtielei.com/posts/blog-redlock-reasoning.html](http://zhangtielei.com/posts/blog-redlock-reasoning.html) - -[http://zhangtielei.com/posts/blog-redlock-reasoning-part2.html](http://zhangtielei.com/posts/blog-redlock-reasoning-part2.html) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/oss/design.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/oss/design.md deleted file mode 100644 index 940151388d..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/oss/design.md +++ /dev/null @@ -1,230 +0,0 @@ -# Layotto object storage (OSS) and collection of API interface definitions and design - -## Background - -In order for layotto support object storage capability, an abstract interface of oss is required.Abstracts of interfaces need to satisfy the theoretical “portable” and to give the interface a clear terminology. - -## Interface Design - -The design of the entire interface will follow the following principle: - -1. **Semantical, i.e. abstract interfaces have a clear semantic meaning.** -2. **Functional completeness, i.e. abstract interfaces need to satisfy different kinds of abilities as much as possible.** -3. **Maximum portability, i.e. abstract interfaces need to meet the transplantability requirement to the maximum extent possible.** - -These principles are designed at a high and low level of priority.In order to meet the above requirements, there may be the following question: - -1. The field is redundant, entry and exit may have fields corresponding to specific manufacturers. -2. Some of the interfaces may be supported only by some of the oss manufacturers, i.e. “maximum portability possible”. - -## Configure Module Design - -The fields of the original configuration module are abstract as shown below in: - -```go -/OssMetadata wraps the configuration of loss implementation -type OssMetadata structure LO - Endpoint string `json:`endpoint` - AccessKeyID string`json:`accessKeyID`` - AccessKeySecret string `json:"accessKeySecret`` - Region string `json:"region" -} -``` - -EndPoint, AccessKeyID, AccessKeySecretariat and Regions are all of the concepts available to them and are not explained at length here. - -## Interface Design - -The definition of the interface is primarily divided into one of the main fields: - -1. Generic interfaces are those that are similar to those supported by all of PutObject, GetObject and others. -2. Non-common interfaces are those that are only partially supported by the oss service.For example, ListParts interfaces, aws cannot support. - -The design of the interface primarily refers to the aliyun and aws and the minio interface definitions. - -> https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_GetObject.html -> https://help.aliyun.com/document_detail/31980.html -> https://docs.min.io/docs/golang-client-api-reference.html - -### PutObject - -Object upload interface, used as file upload, is the most basic ability of the goss. - -> [https://docs.aws.amazon.com/en_cn/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/en_cn/AmazonS3/latest/API/API_PutObject.html) -> -> [https://help.aliyun.com/document_detail/31978.html](https://help.aliyun.com/document_detail/31978.html) - -### GetObject - -Object download interface, used as file downloads, is the most basic ability of oss. - -> [https://docs.aws.amazon.com/en_cn/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/en_cn/AmazonS3/latest/API/API_GetObject.html) -> -> [https://help.aliyun.com/document_detail/31980.html](https://help.aliyun.com/document_detail/31980.html) - -### DeleteObject - -Object delete interface, used as file deletion, is the most basic ability of the goss.For the definition of the interface please find the link or pb definition above. - -### PutObjectTagging - -Label an object as the most basic ability of oss.For the definition of the interface please find the link or pb definition above. - -### DeleteObjectTagging - -Removing the tag of an object is the most basic ability of the oss.For the definition of the interface please find the link or pb definition above. - -### GetObjectTagging - -Get the tag of the object, which is the most basic ability of the oss.For the definition of the interface please find the link or pb definition above. - -### CopyObject - -Duplicate an existing object, is the most basic ability of the mass.For the definition of the interface please find the link or pb definition above. - -### DeleteObjects - -Deleting multiple objects, is the most basic ability of the mass.For the definition of the interface please find the link or pb definition above. - -### ListObjects - -Query all objects below bucket, supporting pagination queries, is the most basic ability of the mass.For the definition of the interface please find the link or pb definition above. - -### GetObjectCannedAcl - -Reading the object's announced acl. Users can set an object's action to control the object's access. First issue is the first issue. The following question: needs to be considered when designing the interface. - -1. Whether to allow users to set object's action by api. -2. Whether the announced acl is portable - -For the first issue, Aliyun is allowed to specify an object's action when uploading and to modify the object dynamically at any time. - ---- - -**Aliyun acl defines the following:** - -| Right Limit | Permissions Description | -| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| public-read-write | Public read/write and write to:anyone (including anonymous visitors). | -| Public-read | Public reading:can only be written by the owner of the Object, and anyone (including anonymous visitors) can read the object. | -| Private | Private:only the owner of an object can read and write the object. No one else can access the object. | -| default | Default:this object follows the write permissions of Bucket, which permissions are for Bucket, what permissions are for the Object. | - ---- - -**Tencent cloud defined below:** - -| Right Limit | Permissions Description | -| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| default | Empty description, at this time you determine whether requests are allowed (default) based on the explicit settings of the various levels of directories and the bucket settings | -| Private | Has FULL_CONTROL permissions for the creator (master account). Others don't have permission | -| Public-read | FULL_CONTROL permissions for creator, READ permissions for anonymous user groups | -| authenticated - read | FULL_CONTROL permissions for creator, READ permissions for authentication user groups | -| bucket-owner-read | FULL_CONTROL permissions for creator, READ permissions for bucket owners | -| bucket-owner-full-control | Has both creator and bucket owner FULL_CONTROL permissions | - -**Description:** -objects do not support granting public-read-write permissions. - ---- - -**aws defined below:** - -| **Canned ACL** | **Applies to** | **Permissions added to ACL** | -| ------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Private | Bucket and object | Owner gets FULL_CONTROL. No one else has access rights (default). | -| Public-read | Bucket and object | Owner gotsFULL_CONTROL. The AllUser group (see [Who is a grante?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#specifying-grante))) gets READ access. | -| public-read-write | Bucket and object | Owner getsFULL_CONTROL. The AllUsers group gets READ and WRITE. Granting this on a bucket is generally not recommended. | -| aws-exec-read | Bucket and object | Owner gets FULL_CONTROL. Amazon EC2 gets READ access to GET an Amazon Machine Image (AMI) bundle from Amazon S3. | -| authenticated - read | Bucket and object | Owner gets FULL_CONTROL. The AuthenticatedUser group gets READ access. | -| bucket-owner-read | Object | Object owner gets FULL_CONTROL. Bucket owner gets READ access. If you specify this ACL when creating a bucket, Amazon S3 ignores it. | -| bucket-owner-full-control | Object | Both the object owner and the bucket owner get FULL_CONTROL over the object. If you specify this announced ACL when creating a bucket, Amazon S3 ignores it. | -| log-delivery-write | Bucket | For more information about logs, see ([Logging requests using server access loging](https://docs.aws.amazon.com/AmazonS3/latest/userLogs.html)). | - ---- - -As can be seen from the above list, the definition of acl is differentiated by different oss-manufacturers, but the concept of canned acl exists and therefore the interface belongs to an interface that does not guarantee portability, -this requires a judgement on the value of acl in the implementation of a specific component.For example, during the migration of users from Tencent to Aliyun -to assign ACls to public-read-write and return to Aliyun like “not supported acl”, -as long as it can be done to remind users that the interface does not fit the portable. - -**Note: Layotto offers acl, but users need to be cautious about the use of acl, because differences in the service may lead to unanticipated results.** - -> [https://help.aliyun.com/document_detail/100676.html] (https://help.aliun.com/document_detail/100676.html) Aliyun object acl type\ -> [https://cloud.tencent.com/document/product/436/30752#E9.A2.84.E8.E7.E7.9A.84-acl] (https://cloud.tenent.com/document/product/436/30752#E9.A2.84.E.84.E.8.BE.7.9A.84-acl) Tencast cloud acltype\ -> [https://docs.aws.amazon.com/AmazonS3/useruide/acl-overview.html#CannedACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#CannedACL) -> [https://github.com/minio/minio/issues/8195](https://github.com/minio/minio/issues/8195) 对于minio是否应该支持acl的讨论 - -### PutObjectCannedAcl - -This corresponds to the above-mentioned GetObjectCannedAcl, which is used to set an object. - -**Note: Layotto offers acl, but users need to be cautious about the use of acl, because differences in the service may lead to unanticipated results.** - -### RestoreObject - -Launch the RestoreObject interface to unfreeze files of Archive Type (Archive) or Cold Archive.For the definition of the corresponding interface, -please find in the above link or in the reference to the pb interface definition annotation. - -### CreateMultipartUpload - -Creating a split upload interface, is the most basic ability of oss.For the definition of the corresponding interface, please find in the above link or in the reference to the pb interface definition annotation. - -### Upload Part - -Snippet upload interface, is the most basic ability of oss.For the definition of the corresponding interface, please find in the above link or in the reference to the pb interface definition annotation. - -### Upload PartCopy - -The decimal copy interface, is the most basic ability of oss.For the definition of the corresponding interface, please find in the above link or in the reference to the pb interface definition annotation. - -### CompleteMultipartUpload - -Finish the split upload interface, which is the most basic ability of oss.For the definition of the corresponding interface, please find in the above link or in the reference to the pb interface definition annotation. - -### AbortMultipartUpload - -Disconnect the particle upload interface, which is the most basic ability of oss.For the definition of the corresponding interface, please find in the above link or in the reference to the pb interface definition annotation. - -### ListMultipartUpload - -Query for uploaded fragments is the most basic ability of oss.For the definition of the corresponding interface, please find in the above link or in the reference to the pb interface definition annotation. - -### ListObjectVersions - -Query all version information for the object is the most basic ability of the goss.For the definition of the corresponding interface, please find in the above link or in the reference to the pb interface definition annotation. - -### HeadObject - -Returns the metadata data of the object, which is the most basic ability of the goss.For the definition of the corresponding interface, please find in the above link or in the reference to the pb interface definition annotation. - -### IsObjectExist - -The interface is not clearly defined in s3, and users can determine whether an object exists by way of the http's standard error code returned by HeadObject, which is abstracted separately to make the interface more semicolon. - -> [http://biercoff.com/how-to-check-with-aws-cli-if-file-exiss-in-s3/](ttp://biercoff.com/how-to-check-with-aws-cli-if-file-exists-in-s3/) -> [https://stackoverflow.com/questions/41871948/aws-s3-how-to-check-if-a-file-exiss-in-a-bucket-using-bash](https://stackoverflow.com/questions/41871948/aws-on-to-the-file-existing-bash) - -### SignURL - -This interface generates an url for object upload and downloads, mainly for unauthorized users.It is the most basic ability of oss.For the definition of the corresponding interface, -please find in the above link or in the reference to the pb interface definition annotation. - -### UpdateDownloadBandwidthRateLimit - -This interface provides an interface for Aliyun that can limit the download speed of customers.For specific information, reference may be made to annotations in the pb definition. - -### UpdateBandwidthRatteLimit - -This interface provides an interface for Aliyun that can limit the upload speed of customers.For specific information, reference may be made to annotations in the pb definition. - -### AppendObject - -The interface is an additional interface mainly used for the application of the file, which is not supported by aw but is provided by both Aliyun and Tencent clouds and minio. - -> https://help.aliyun.com/document_detail/31981.html -> https://github.com/minio/minio-java/issues/980 - -### ListParts - -Query for uploaded fragments is the most basic ability of oss.For the definition of the corresponding interface, please find in the above link or in the reference to the pb interface definition annotation. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/pluggable/design.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/pluggable/design.md deleted file mode 100644 index 94ac2b1d1b..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/pluggable/design.md +++ /dev/null @@ -1,35 +0,0 @@ -# Pluggable Component Design Document - -## Background - -The current Layotto component is actually working in Layotto, which requires users to develop in golang language in order to use the new component, and to do so in Layotto project, and then compile uniformly. -Being highly unfriendly to multilingual users, Layotto therefore needs to provide the ability to plugable components to allow users to communicate in any language using their components, Layotto via the grpc protocol and external components. - -## Programmes - -- Local cross-language component service discovery based on unix domain socket reduces communication costs. -- Based on proto achieve cross-language implementation of components. - -## Stream Architecture - -![](/img/pluggable/layotto_datatflow.png) - -This is the current user's stream of data starting with sdk.The dotted section is the main data flow involved with pluggable components. - -### Component Found - -![](/img/pluggable/layotto.png) - -As shown in the graph above, the user-defined component starts the socket service and places the socket file in the specified directory. When layotto starts, all socket files in this directory are read (skipped folder) and socket connected. - -At present, layotto is aligned to the dapr and is not responsible for the lifecycle of the user component, which cannot be used if the user component is offline during the service period. -Later, depending on community use, it was decided whether layotto needed to support process management modules or to use a separate service to manage them. - -As windows support for uds is not yet perfect, and layotto itself eliminates compatibility with windows, the uds discovery mode used for new features is not compatible with windows. - -## Component Registration - -The user registered component needs to implement plugable proto defined grpc services, as shown in the data stream architecture chart above. layotto will implement the forward interface based on the grpc interface, here -corresponds to the wrapp component in the data flow.prap component does not differ from build-in component for layotto runtime and has no special perception for users. - -layotto gets what components have been implemented by the user service through grpc reflected library registered in the global component registration centre for user use. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/pluggable/usage.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/pluggable/usage.md deleted file mode 100644 index 1be9931281..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/pluggable/usage.md +++ /dev/null @@ -1,54 +0,0 @@ -# Pluggable Component Use Documents - -This example shows how users can implement and register their components with the ability provided by Layotto to plug components.and use Layotto sdk to verify the correctness of their components. - -## Step1. Write and Run Plug Components - -Next, run code already written - -```shell -cd demo/pluggable/hello -go run. -``` - -Print the results below for successful service startup - -```shell -start grpc server -``` - -> 1. Use go to implement hello components as an example, find proto file for corresponding components in `layotto/spec/proto/pluggable`, and generate grpc files for the corresponding language. -> The pb file in the go language has been generated and placed under `spec/proto/plugable/v1` to use it directly when referenced by the user. -> 2. In addition to implementing the interface defined in the protocoluf file, the component needs to start the file using socket and store the sock file in the `/tmp/runtime/component-sockets` default path. -> can also modify the location of the sock store path through the environmental variable `LAYOTTO_COMPONETS_SOCKETS_FOLDER`. -> 3. In addition to this, the user needs to register a reflection service in grpserver for the specific implementation interface of the grpc service when the layotto service is found. Specific code can be referenced to `demo/plugble/hello/main.go` - -## Step2. Launch Layotto - -```shell -cd cmd/layotto -go build -o layotto. -./layotto start -c ../../configs/config_hello_component.json -``` - -> The type of the component in the configuration file is `hello-grpc-demo`, determined by the prefix of the socket file. The configuration item is consistent with the registered normal hello component.Provides metadata items to allow users to set custom configuration requirements. - -## Step 3. Validate component - -Based on existing component test code, test the validity of plug-in plugins implemented by the user. - -```shell -cd demo/hello/common -go run -``` - -The following result of the program output indicates that the unpluggable component registration is running successfully. - -```shell -runtime client initializing for: 127.0.0.1:34904 -hello -``` - -## Learn how the Layotto Plug Components can be implemented - -If you are interested in implementing the rationale or want to expand some features, you can read[可插拔组件的设计文档](design/pluggable/design.md) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/pubsub/pubsub-api-and-compability-with-dapr-component.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/pubsub/pubsub-api-and-compability-with-dapr-component.md deleted file mode 100644 index e735c73ca0..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/pubsub/pubsub-api-and-compability-with-dapr-component.md +++ /dev/null @@ -1,190 +0,0 @@ -# Layotto Pub/Sub, Compatible Dapr Package Scheme - -# Needs analysis - -1. Support Pub/Sub API -2. Packages that can be reused as much as possible on the architecture - -# Overview design - -## Whether the corporate architecture:reuses Dapr's sdk and proto - -In order to be able to develop a set of API specs with the Dapr and Envoy communities in the future, the Dapr API is being kept as close as possible. - -Dapr component libraries can be reused directly; below discuss whether sdk and proto are repeated and how to use them again. - -### Problems encountered - -1. dapr sdk wrote the pack name in which the call interface was called, with dapr - ![img.png](/img/mq/design/img.png) -2. We will have differentiated needs, such as new fields, new APIs, if directly using dapr.proto will not be flexible - -### Programmes - -#### No longer using sdk and proto; detach proto file, neutral path - -![img_1.png](/img/mq/design/img_1.png) - -We first define an api-spec.proto, a superset of dapr API, with a neutral path name without layotto, based on this proto itself develop a neutral RuntimeAPI sdk. - -Then try promoting proto into a community-sanctioned api-spec, or working with other communities to rebuild a path neutral api-spec.proto. - -If proto changes in the promotion process does not matter anything, Layotto draws a layer of API below proto to prevent proto; - -If not, we can write a dapr adapter first in a neutral sdk, using our sdk to both adjust the dapr and layotto: - -![img_2.png](/img/mq/design/img_2.png) - -Advantages: - -1. Clean.If you want to revert to Dapr's sdk and proto, there is an unavoidable problem:when the API and dapr are different, you need to encapsulate a layer of logic for yourself, which will bring complexity, hacky, hill sense and increase the code reading threshold -2. Extensions between API and Dapr - -: Disadvantages - -1. Follow Dapr client or proto modified. We may not know, causing inconsistency - -## API Design - -### Design Principle:To deal with new fields for Dapr API - -We want to revert to the Dapr API, but there is certainly a need for customization in the long term.When our API and dapr are different (e.g. just want to give a new API field to Dapr), whether to open a new method name, or to add a field to the old method? -to add a field to the original method, this may cause a field conflict. - -Some of the following ideas: - -#### New method name as long as the API changes different from Dapr - -![img_3.png](/img/mq/design/img_3.png) - -New and old methods are supported when new methods are opened.**For example, version v1 is Dapr API and version v2 is extended** - -: Disadvantages - -1. To support two APIs - -#### New fields also use old method names, but jumps in numbers, leave white - -: Disadvantages - -1. Make no more sense?If Dapr later added this field but the numbers are different, we would find it difficult to do so (e.g. we define it as 10, dapr then as 5, and we have one field that takes up both 5 and 10?) -2. If Dapr adds a similar but nuanced field, we find it difficult to add:to the field? - -#### C. Fields are directly added to the conflict without allowing for a conflict (will, of course, try to raise issues for the Dapr community) - -In the future, when you really sit together to reach a consensus and make api-spec, you will start a new path to proto, and you will not worry about the current conflict. - -#### Conclusion - -Discussion decides to follow C line - -### Between APP and Layotto - -Use the grpc API like Dapr - -```protobuf -service AppCallback { - // Lists all topics subscribed by this app. - rpc ListTopicSubscriptions(google.protobuf.Empty) returns (ListTopicSubscriptionsResponse) {} - - // Subscribes events from Pubsub - rpc OnTopicEvent(TopicEventRequest) returns (TopicEventResponse) {} - -} -``` - -```protobuf -Service Dapr LO - // Publishes events to the specific topic. - rpc PublishEvent(PublishEventRequest) returns (google.protect.Empt) {} - - -``` - -### Between Layotto and Component - -In the same way as Dapr; -PublishRequest.Data-and NewMessage.Data-fit for CloudEvent 1.0 (deserializable into map[string]interface{} - -```go -// PubSub is the interface for message buses -type PubSub interface { - Init(metadata Metadata) error - Features() []Feature - Publish(req *PublishRequest) error - Subscribe(req SubscribeRequest, handler func(msg *NewMessage) error) error - Close() error -} - -// PublishRequest is the request to publish a message -type PublishRequest struct { - Data []byte `json:"data"` - PubsubName string `json:"pubsubname"` - Topic string `json:"topic"` - Metadata map[string]string `json:"metadata"` -} - - -// NewMessage is an event arriving from a message bus instance -type NewMessage struct { - Data []byte `json:"data"` - Topic string `json:"topic"` - Metadata map[string]string `json:"metadata"` -} - -``` - -### sidecar knows which port of the callback - -Reference Dapr, configure callback port on startup.The cost is that sidecar can only serve one process. - -Select this option for the current period - -### How to maintain the antecedents of the subscription list - -Ask an app on sidecar startup to get subscription at once.There is therefore a requirement for the order of start and start the app first. - -Follow up the app to optimize it into scheduled poll app - -### Subscription support declaration configuration - -First issue only supports the format of the interface callback and then optimized with the declaration configuration - -## Config Design - -![img.png](/img/mq/design/config.png) - -The relevant configuration of the app is in the loaded, and the code you want to reconfigure the configuration API, etc. (see below). - -**Q: How to pass configuration data to Dapr and Layotto components** - -A: pass metadata's data through the Init interface to components - -# Future Work - -## A Bigger Control Plane - -The Control Plane of Service Mesh serves only RPC, but in Runtime API the configuration of components also needs to be distributed in clusters; components also need to be discovered, routed, and so also have their own control Plane. - -It would be better to have a Bigger Control Plane, which integrates RPC's and all middleware configuration data. - -may require extension of the ODS protocol, such as runtime Discovery Service - -## Subscription Support Configuration - -Subscription is now obtained by callback app, which can be added to get subscription by configuration - -## appcallback supports tls - -## Detach component configuration and personality configuration (callback port, app-id) - -Component configuration and app profile (callback port,app-id) are placed together with the following question: - -1. Not good at making cluster configuration leader -2. Component control configuration is not available (e.g. Dapr can limit app-id1 access only to topic_id1) - -![img_4.png](/img/mq/design/img_4.png) - -Need to reconstruct the original component logic - -## Tracing diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/rpc/rpc_design_document.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/rpc/rpc_design_document.md deleted file mode 100644 index 07d39192f2..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/rpc/rpc_design_document.md +++ /dev/null @@ -1,56 +0,0 @@ -# RPC Design Document - -## API Design - -[layotto rpc API](https://github.com/mosn/layotto/blob/f70cdc6196963ad762cf809daf0579403c341def1/spec/proto/runtime/v1/runtime.proto) is consistent with Dapr. - -### Core Abstract - -In order to decouple with pb definition, a layer of RFC core abstraction has been added. - -- Invoker: provides full RPC capability, currently only Mosn -- callback:before/after filter, can execute custom logic before and after request execution (e.g. add request head, such as protocol conversion) -- channel:send requests, receive responses, and interact with different transmission protocols - -Since Mosn already has full RPC capacity support, layotto provides only a very light RPC framework - -![img.png](/img/rpc/rpc-layer.png) - -### Mosn Integration - -The layotto RPC, based on Mosn grpc handler, works on 7 floors, while Mosn's proxy, as well as various filters, work on 4 floors and cannot be interacted by simple functional calls. - -For **Full Replicate**Mosn, layotto uses new ideas for Mosn integration. - -1. Channel will re-encode the request from L7 to L4 -2. Create a virtual connection (net.Pipe), layotto holds one end local, mosn holding remote at the other end -3. layotto write to local, mosn will receive data -4. mosn reads from remote, executes filter and redisseminates it to remote -5. layotto read from remote, get responses - -#### xprotocol - -Mosn supports the popular RPC protocol via xprotocol. -designed a corresponding extension in Layotto. Simply complete the interface between RPC requests and xprotocol frame, it will be easy to support the xprotocol protocol. - -#### Configure Parameters - -```bigquery -{ - "mosn": { - "config": { - "before_invoke": [{ - "name": "xxx" // rpc调用前的filter - }], - "after_invoke": [{ - "name": "xxx" // rpc调用后的filter - }], - "channel": { - "size": 1, // 与mosn通信使用的通道数量,可以简单理解成连接数 - "protocol": "http", // 与mosn通信使用的协议 - "listener": "egress_runtime_http" // mosn对应的listener端口 - } - } - } -} -``` diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/sequencer/design.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/sequencer/design.md deleted file mode 100644 index 0d17d1ff2e..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/design/sequencer/design.md +++ /dev/null @@ -1,242 +0,0 @@ -# Sequencer API design document - -This document discusses the API "Generate Distributed Unique (auto-ad) id" - -## Requirements - -### Generating global unique id - -Q: When does a global unique id be generated? - -A: db does not help you automatically generate it.Like: - -- db has a split table that does not help you create id automatically, you need a global unique business id -- No db, like request to generate a traceId - -### There is an incremental need for this id.More specifically there are various: - -- No increment required.This situation can be resolved by UUID, although the disadvantage is lengthy.**This API does not consider this for the time** -- “Growing trends”.Without a certain increase, most of the cases are on the increase. - -Q: What scenarios require trend incremental? - -1. For b+ tree db (e.g. MYSQL), the incremental main key can make better use of the cache (cache friendly). - -2. Sort the most recent data.For example, needs are up to 100 news. Developers do not want to add timestamp fields or indexes. If the id itself is incremental, the latest 100 messages are sorted by id and sorted directly to: - -``` -Select * from message order by message-id limit 100 -``` - -This is common when using nosql, because nosql has difficulty indexing the timestamp field - -- Increase in lone transfer in sharding.e.g.[Tidb的自增id](https://docs.pingcap.com/zh/tidb/stable/auto-increment) ensures the ID increment generated on a single server and does not guarantee a global (multi-servers) one-tone. - -- Global monochrome - -The desired id is necessarily incremental, and there is no regression. - -### There may be a need for custom id schema - -For example, the required id is in the format "Uid first 8 and auto-id" - -### Possible information security related requirements - -If the ID is continuous, the pick-ups of malicious users will be very easy and the specified URL will be downloaded directly in order; - -If an order number is more dangerous, competing for a direct knowledge of the user's volume of one day.So in some application scenarios, IDs are unruly and unruly. - -## Product research - -| **System** | **Securing the generated id unique** | **Trends** | **Strict increment** | **Availability** | **Information Security** | -| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- | ------------------------------------------------------------- | ----------------------------- | ------------------------ | -| Solo Redis | yes.[Special configuration needs to be configured to redis, open and write disks for each of the two disk policies](https://redis.io/topics/persistence) to avoid data loss | yes | yes.premised on delay restarting without data | has single point failure risk | | -| redis main copy from +sentinel | no.Copy is asynchronous, that is, waiting for sync copy using Wait command or may drop data after fo, see[文档](https://redis.io/topics/reapplication) | yes | Depending on which data will not be lost | | | -| redis cluster | Id. | yes | Id. | | | -| snowflake | no.(Clock callbacks, etc, can cause idrepeat; need to rely on external storage; or declare that NTP must be closed or reliable NTP used to prevent callbacks) | yes | No | | Good | -| Leaf snowflake | yes | yes | No | | Good | -| Leaf segment | yes | yes | No | | | -| Leaf segment only one Leaf server | yes | yes | yes | has single point failure risk | | -| zookeeper | yes | yes | yes | | | -| etcd | yes | yes | yes | | | -| mysql Single Library Table | yes | yes | yes | has single point failure risk | | - -## 3. grpc API design - -### Proto definition - -```protobuf -// Sequencer API -rpc GetNextIdd (GetNextIdReques) returnns (GetNextIdResponse) {} - - -message GetNextIdest Lum - string store_name = 1; - /key is the identification of a consequence. - string key = 2; - - Sequencer options = 3; - // The metadata which will be sent to the component. - map metadata = 4; -} - -/// Sequencer Options requirements for increased and unproductive guarantees -message Sequencer Options Fact - enum AutoAddition - // WEAK meaning a "best forest" increasing service. t there is no strict guarantee - WAK = 0; - // STRONG means a strict guarantee of global monotonically increasing - STRONG = 1; - } - -/// enum Uniqueness$6 -// / WEAK means a "best ffort" unqueness guarantee. -/// But it might duplicate in some corner cases. -// WEAK = 0; -// STRONG means a strict guarantee of global unity -// STRONG = 1; -// } - - AutoIncreasing revenue = 1; -// Uniqueness union=2; -} - -message GetNextIdResponse - int64 next_id=1; -} -``` - -Explanation: - -In fact, a GetNextId interface requires a key to be passed as a namespace (e.g. an order form name, "order_table"), and a sequencer ensures that the id generated is unique and incremental in that naming space. - -SequencerOptions. AutoCreation is used to state user demand for incremental increments, whether trend increase (WEAK) or strict global increment (STRONG) - -**Q: Do you want to spell the user as needed?** - -A: The API and Layotto run regardless of this, are handled by the sdk or the user themselves, or a special component can do the feature. - -**Q: Return type string or int64** - -If you return string, if a user uses a return int64 implementation to convert the returned string into int64 in the user's code, then migrate to another component, this conversion may be misreported - -If you return int64, the component does not help the user to make some customized spelling. - -Select int64 for portability.Do things spelling in sdk - -**Q: What to do with the int64 spill?** - -Do not consider this for now - -### Disputes concerning singularity - -The API was originally defined as the user sender's SequencerOptions. Uniqueness enumeration, in which the WEAK representative is "trying to ensure global uniqueness, but the very low probability is likely to be repeat", requires business code to be prepared for repeating and retrying if you get an id to write the library; and STRONG's representatives are strictly global and the user code does not take into account the need for repetition, retry. - -- Defines the reason for this enumeration value (benefits) - -If strict uniqueness is to be assured, the component will be more productive.For example, a one-stop cron policy will not work and may cause data to be lost and a repeat id to be generated when the machine is restarted; for example, writing a snowflake algorithm directly in the sidecar will not work because there may be a clock-back problem that leads to duplicate calls (NTP clock-synchronization, leap seconds, etc.).[Leaf的snowflake实现](https://tech.meituan.com/2017/04/21/mt-leaf.html) relies on zookeper's callback to the clock; - -- Define the disadvantage of this enumeration - -More understanding costs for users - -- Conclusion - -There is a controversy. No value is added for this period.The result of the default return must be a global unique (STRONG). - -## Component API - -```go -package sequencer - -type Store interface { - // Init this component. - // - // The number 'BiggerThan' means that the id generated by this component must be bigger than this number. - // - // If the component find that currently the storage can't guarantee this, - // it can do some initialization like inserting a new id equal to or bigger than this 'BiggerThan' into the storage, - // or just return an error - Init(config Configuration) error - - GetNextId(*GetNextIdRequest) (*GetNextIdResponse, error) - - // GetSegment returns a range of id. - // 'support' indicates whether this method is supported by the component. - // Layotto runtime will cache the result if this method is supported. - GetSegment(*GetSegmentRequest) (support bool, result *GetSegmentResponse, err error) -} - -type GetNextIdRequest struct { - Key string - Options SequencerOptions - Metadata map[string]string -} - -type SequencerOptions struct { - AutoIncrement AutoIncrementOption -} - -type AutoIncrementOption string - -const ( - WEAK AutoIncrementOption = "weak" - STRONG AutoIncrementOption = "strong" -) - -type GetNextIdResponse struct { - NextId int64 -} - -type GetSegmentRequest struct { - Size int - Key string - Options SequencerOptions - Metadata map[string]string -} - -type GetSegmentResponse struct { - Segment []int64 -} - -type Configuration struct { - BiggerThan map[string]int64 - Properties map[string]string -} -``` - -**Q: What is the BiggerThan's field?** - -All IDs that require components to generate are larger than "biggerThan". - -This configuration item is designed to facilitate transplantation by users.For example, the system originally used mysql for hairdressing, id has been generated to 1000 and later migrated to PostgreSQL, and BiggerThan needs to be configured for 1000 so that the PostgreSQL components will be set up at initialization, force id above 1000 or report errors when the id is not found to meet the requirements and direct start. - -**Q: What BiggerThan is a map?** - -Because each key may have its own biggerThan. - -For example, the original app1 made a split table, used some kind of distribution service to generate orders and commodity table ids, which reached 1000 and reached 2000. - -The app1 then wants to replace the store as a sequence, then he would like to state that the order form id is over 1,000 and the product table id is above 2000. - -Another example is[Leaf的设计](https://tech.meituan.com/2017/04/21/mt-leaf.htm) and one max_id per biz_tag (Leaf's max_id is our biggerThan) - -![leaf_max_id.png](/img/sequencer/design/leaf_max_id.png) - -**Q: Do not cache at runtime layer?** - -Component implementation method: if runtime is cached - -```go -GetSegment (*GetSegmentRequest) (support bool, result *GetSegmentResponse, err error) -``` - -You can define interfaces first, components are not implemented first, and there is performance need to implement them later - -## References - -[设计分布式唯一id生成](https://www.jianshu.com/p/fb9478687e55) - -[Architectural Chat ID generation](https://www.w3cschool.cn/architectroad/architectroad-distributed-id.html) - -[Leaf - USG point ID generation system] (https://tech.meituan.com/2017/04/21/mt-leaf.html) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/label-spec.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/label-spec.md deleted file mode 100644 index 76bd9d3c64..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/label-spec.md +++ /dev/null @@ -1,39 +0,0 @@ -# Label specification of newer tasks (good first issue) - -点击链接可以查看所有“待认领”的“新手任务": https://github.com/mosn/layotto/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22+no%3Aassignee - -Normative: for new tasks (good first issue) - -1. In issue label, issues with "good first issue" labels are considered to be "tasks suitable to newcomers"; - ![image](https://user-images.githubusercontent.com/26001097/173573038-07586e85-4f51-4a34-a594-53296726557b.png) - - -2. If no assignee, represent 'ad litem'; if there is a assignnee representative' who already claims ': - ![image](https://user-images.githubusercontent.com/26001097/173572716-855917f7-daf6-49dc-b101-447d4e0c053c.png) - -3. For task classification: - issue requires a label "kind/xxxx", where xx represents the task category. - -Like "kind/ci" for category "ci" : -![image](https://user-images.githubusercontent.com/26001097/173573518-5e990bbd-712e-4675-980f-90cbdafff090.png) -like "kind/demo" for category "demo" : -![image](https://user-images.githubusercontent.com/26001097/173573829-73791d39-0099-4e87-aa90-67474a32773e.png) - -4. For task difficulty - issue requires some labels for hardship, including "easy", "medium", "hard", as follows: - ![image](https://user-images.githubusercontent.com/26001097/173574281-528374c6-258a-4499-82ab-2122bbe68be6.png) - -5. When you run an operation, do you write "Task Name" in Chinese or English? - - If the title of the issue is in Chinese, the name of the task will be in Chinese; if there are no Chinese names, an English name - like: - ![image](https://user-images.githubusercontent.com/26001097/173575931-d8a0bec4-5468-4db3-917a-75879f6533ff.png) - -## Events and Tasks Recommendations - -1. One or two tasks can be selected for each type of task, such as demo category two, ci challenges one (feel that some less people are thinking about them?) -2. You can select an updated task because old issue may not be attractive if it is unavailable - -## Related links - -[proposal](https://github.com/mosn/layotto/issues/653) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/problems-to-solve.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/problems-to-solve.md deleted file mode 100644 index 54cc704054..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/problems-to-solve.md +++ /dev/null @@ -1,41 +0,0 @@ -# Multi-Runtime 2022:pending issue - -## API Standard-Building - -Building API standards based on the production needs of landed users continues to be presented to the Dapr community.Like: - -- Distributed LockAPI -- Configure API -- Delay Message API - -## Ecological development - -How to smooth migration to Multi-Runtime for users who have fallen Service Mesh?One thing currently being done is Layotto on Envoy's support; - -Can the Runtime API be better integrated into K8S ecology?What is being done is Layotto integration into k8s ecology; - -## Early productive users of services - -Open source functions that are universal and that address production problems.Watch early production users, currently facing the following problems: - -### Expansion - -Let the entire project be extended, for example, a company wants to expand some of its features with layotto, either by starting up a project, by importing the layoto's source layoutto, or by expanding the layoutto binary files by connecting dynamically to the library.Neither of these options, dapr nor layotto cannot, want to extend to fork to change code - -### Stability risk - -After an important open source of Layotto, the panic is at great risk because it relies on all Dapr components, which use a wide variety of libraries and may be panic, and may rely on conflict.Can panic risks be reduced by customizing, isolating designs? - -There are currently too few open source project test inputs relative to the testing process in the firm, how to build an open source test system; - -### Detectability - -> There were problems with my service mesh. Then there was the service messh. I could only look for someone else to check on -> — a test goes on. - -Service Mesh in the productive environment makes troubleshooting, and multi-Runtime is more functional and more difficult. -Multi-Runtime observability needs to be built to avoid making problems more difficult for productive users. - -## New research and development models - -sidecar supports serverless land; diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/release-guide.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/release-guide.md deleted file mode 100644 index 559d383707..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/release-guide.md +++ /dev/null @@ -1,62 +0,0 @@ -# Publish Handbook - -What should be done by publishing a new version under this section - -## Publish Period - -The Layotto publication cycle is tentatively scheduled to be issued on a quarterly basis. - -## Publish checklist - -### Step1: Check [Roadmap]for current iterations (https://github.com/mosn/layotto/projects) - -1. Check ongoing tasks -2. Check unfinished tasks -3. Confirm Task Status and Publish Content with Owner - -### Step2: Create Release tag, push to github, and check workflow - -1. 规范:请按照 `v{majorVersion}.{subVersion}.{latestVersion}` 格式创建 tag。 - -2. Waiting for CI to end, confirm the following: - - CI Test Jobs through: - - Go code style verification - - Go code specification validation - - Go Unit Test - - Go Integration Test - - CI Multiplatform Artifacts build Jobs through: - - Linux/AMD64 Artifacts successfully built and uploaded - - Linux/ARM64 Artifacts successfully built and uploaded - - Darwin/AMD64 Artifacts successfully built and uploaded - - Darwin/ARM64 Artifacts successfully built and uploaded - - CI Multiplatform Image build/publish Jobs through: - - Linux/AMD64 Image successfully built and Push DockerHub - - Linux/ARM64 Image successfully built and Push DockerHub - - Image Tag specification: - - AMD64/X86 架构的镜像:`layotto/layotto:{tag}` - - ARM64 架构的镜像:`layotto/layotto.arm64:{tag}` - -![release.png](/img/development/workflow/release.png) - -### Step3: Draft a new release and prepare a release report - -> Publish reports can be automatically generated using the github's functionality before making changes based on the generated content. - -> Reference can be made to previous [发版报告](https://github.com/mosn/layotto/releases) - -![img\_1.png](/img/development/release/img_1.png) - -### Step4: Upload Binars of Multi-Platform Architecture - -> Update:by 2022/05/04 is negligible.Release Pipeline from Layotto will automatically upload binary files without having to upload manually.PR See https://github.com/mosn/layotto/pull/566 - -> If you do not upload automatically, you can manually download and upload the multi-platform Artifacts built in `Step 2` - -![img.png](/img/development/release/img.png) - -### Step5: Confirm Publish - -1. Click to publish -2. General information -3. Check [Roadmap](https://github.com/mosn/layotto/projects), modify unfinished tasks in previous version, change milestone to next version -4. If there is a SDK release, it needs to be published in the SDK repository and upload the central repository (e.g. Java SDK needs to be uploaded to Maven central repository). diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/start-from-zero.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/start-from-zero.md deleted file mode 100644 index 44c1af7707..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/development/start-from-zero.md +++ /dev/null @@ -1,51 +0,0 @@ -# Newhanded offensive:became a Layotto contributor from zero - -This paper is a new hand-walker for the purpose of attempting to participate in this open source project, but it is not clear from what classmates know about which to upgrade. - -## Step 1. Hello world, understand Layotto is dry - -Learn what the project was. Use quickstart to run hello around the world by reference to quickstart demo like: - -- [Use configuration API](https://mosn.io/layotto/#/en/start/configuration/start-apollo) -- [State API for status management](https://mosn.io/layotto/#/start/state/start) -- [Use distributed lock API](https://mosn.io/layotto/#/start/lock/start) - -Tips: Ask issues in github, if a bug is started during the process. - -Tips: If you feel that a document is not written in sufficient detail to add it, or the document is written incorrectly, you can make a PR.This is probably the fastest route to contribor :) - -(可选)扩展阅读:有一些介绍项目的演讲视频,比如[《MOSN 子项目 Layotto:开启服务网格+应用运行时新篇章》](https://mosn.io/layotto/#/zh/blog/mosn-subproject-layotto-opening-a-new-chapter-in-service-grid-application-runtime/index) , -比如 [《Service Mesh落地之后:为 sidecar 注入灵魂》](https://www.bilibili.com/video/BV1RL4y1b7U9?from=search\&seid=1492521025214444985\&spm_id_from=333.337.0.0) -。But looking at videos takes time, lazy to run more than a few demo experiments, quickstart more brutally - -## Step 2. Select your task - -当你大概知道这个项目是做什么的了,可以从 [good first issue 列表](https://github.com/mosn/layotto/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22good+first+issue%22) 中挑选感兴趣的任务,没打勾的任务都可以认领。Complete task to become Layotto Contribor. -Recommended: when selecting a task - -- Recourse to the language you want to learn - -You can first select the task "Add a comment to the specified module", read the code with annotations, and learn the towriting method. - -Or select a single task with a single metering process that can be used to write go; - -At the same time, the Easy level will have some code writing tasks that are not difficult to write but are very helpful to the project. Interest can be taken directly to the handwritten code, such as https://github.com/mosn/layotto/issues/275#issuomment-957711746 like [Developing in-memory components] (https://github.com/mosn/layotto/issues/67#issuomment_975134341) - -- For students who want to write other languages (java, c++, python, typescript, etc.) - -Although Layotto is a project for development of the language of go, there is a need to develop sdk in various languages, which does not need to understand the language of go. -For example, students familiar with java can claim java sdk and do not need to know go. - -It is therefore possible to look at tasks in the task list related to sdk. - -- Recourse to some back-end base, go-language base - -If available, select tasks by interest, such as interested in distributive locks, such as Webassembly, and select tasks related to these technologies. - -## Step 3. 认领任务之后……沟通很重要! - -When it is assumed that there is a certain development cost, it is best to describe its own design programme below the issue and avoid returning to work. - -The difficulties encountered in the development process, such as misreporting and continuing misconduct, were normal, and it was therefore important to know when asking and asking for help from others to describe their own problems. - -Problems can be discussed in an issue area or pegged group, which can describe the anomalies that they encounter (e.g. misinformation for misinformation) and the steps taken to replicate them so that they can be easily checked. diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/operation/local.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/operation/local.md deleted file mode 100644 index a928c61cdf..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/operation/local.md +++ /dev/null @@ -1,35 +0,0 @@ -# How to Debugging Locally - -## 1. How the app developers can develop and debug the app - -There are generally the following types of programmes: - -### Local commencement of sidecar - -Start Layotto+other storage systems with a docker to sidecar, or docker-compose. Start Layotto+Other storage (e.g. Reddis) - -### The company provides remote Layotto sidecar - -For example, test environments in remote areas, pull up a Pod, running Layotto sidecar inside. - -- If you have direct access to the remote test environment with ip, pod: - - You can change Layp to Pod Pip, local ip link pod -- 如果不能以ip直接访问远端测试环境pod: - - This pod service type can be set to `NodePort` or `LoadBalancer`, local direct service - - You can register the pod to gateway, directly to gateway - -When debugging locally, the "Local app process is connected to remote Layotto sidecar" is implemented in the above way. - -To go further, the team in the company responsible for research and development can automate the above actions by providing the "One click to apply for remote sidecar" feature. - -### Cloud R&D environment - -If a company has a cloud research environment similar to the github codespace, it can send sidecar in a research environment - -## How Layotto developers locally, debugging Layotto - -The local compilation will run Layotto. - -For example, when running Layotto with Goland IDE, the configuration is as follows: - -![](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*CHFYQK6kMEgAAAAAAAAAAAAAARQnAQ) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/README.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/README.md deleted file mode 100644 index 790d5c2c6e..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Quick Start - -We have provided many Demo for you to quickly run Layotto on your computer and feel its strength. - -Before you start, you need to prepare the following environment: on your computer - -- Golang 1.14 and above, \*\*or \*\* Java 8, Maven 3 -- Docker - -If you are ready, you can tap various Demo in the navigation bar on the left to start our travel! - -Note:if you do not support Docker, you can experience [使用Apollo配置中心](configuration/start-apollo.md) this Demo, this does not require Docker; or experience [线上实验室](start/lab.md) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/file/minio.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/file/minio.md deleted file mode 100644 index 9b5a794d18..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/file/minio.md +++ /dev/null @@ -1,134 +0,0 @@ -# Addition and deletion of files based on MinIO OSS - -## Quick Start - -Layotto provides examples [demo](https://github.com/mosn/layotto/blob/main/demo/file/client.go) for access files. - -### step 1. Start MinIO and Layotto - - - -#### **Using Docker Compose** - -You can start MinIO and Layotto with docker-compose - -```bash -cd docker/layotto-minio -# Start MinIO and layotto with docker-compose -docker-compose up -d -``` - -#### **Local compilation (not for Windows)** - -You can use Docker to run MinIO, and then compile locally and run Layotto. - -> [!TIP|label: don't fit for Windows users] -> Layotto will fail to compile under Windows.It is recommended that Windows users deploy using docker-compose - -#### step 1.1. Start MinIO service - -You can use Docker to launch local MinIO, reference[官方文档](https://min.io/docs/minio/container/index.html). - -```shell -docker run -d -p 9000:9000-p 90:9090 --name minio \ --e "MINIO_ROOT_USER=layotto" \ --e "MINIO_ROOT_PASSORD=layotto_secretariat" \ ---restore=always \ -minio/minio server / data --console-address ':909' -``` - -#### step 1.2. Start layotto - -layotto offers minio's configuration file[oss配置](https://github.com/mosn/layotto/blob/main/configs/config_file.json), as shown below - -```json - "file": { - "minio": { - "metadata":[ - { - "endpoint": "play.min.io", - "accessKeyID": "Q3AM3UQ867SPQQA43P2F", - "accessKeySecret": "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG", - "SSL":true, - "region":"us-east-1" - } - ] - } - } -``` - -The default configuration will be linked to `play.min.io`. If you deploy Minio, you can modify the configuration as necessary. - -When configured, toggle directory: - -```shell -#备注 请将${project_path}替换成你的项目路径 -cd ${project_path}/cmd/layotto -``` - -Build: - -```shell @if.not.exist layotto -go build -o layotto -``` - -Start Layotto: - -```shell @background -./layotto start --config ../../configs/config_file.json -``` - - - -### step 2. Start testing demo - -Layotto provides example [demo]for access files (https://github.com/mosn/layotto/blob/main/demo/file/client.go) - -```shell -cd ${project_path}/demo/file -go build client.go - -# 创建名为test的bucket -./client bucket test -# 上传文件到test bucket,前缀为hello,内容为"hello layotto" -./client put test/hello/layotto.txt "hello layotto" -# 获取 layotto.txt的内容 -./client get test/hello/layotto.txt -# 获取test bucket下的前缀为hello的所有文件列表 -./client list test/hello -# 获取layotto.txt文件的元数据 -./client stat test/hello/layotto.txt -# 删除layotto.txt文件 -./client del test/hello/layotto.txt -``` - -### Step 3. Destruction of containers, release of resources - - - -#### **Close Docker Compose** - -If you started with docker-compose, MinIO and Layotto can be turned off: as follows. - -```bash -cd ${project_path}/docker/layotto-minio -docker-compose stop -``` - -#### **Destroy the MinIO Docker container** - -If you are MinIO, started with Docker, you can destroy the MinIO container: - -```shell -docker rm -f minio -``` - - - -#### Continue to experience other APIs later - -Continue to experience other APIs with the navigation bar on the left! - -#### Learn how to implement File API - -If you are interested in implementing the rationale or want to expand some features, you can read the [File API design document](../../design/file/file-design.md) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/istio/README.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/istio/README.md deleted file mode 100644 index ec657c1419..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/istio/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Demo of Istio 1.10.6 integration - -The latest version of Layotto integrates Istio 1.10.6. You can manage the traffic of Layotto (data plane) using Istio (control plane). - -You can experience integrating Istio 1.10.6 in [Online Lab](start/lab.md) - -For more details, see ["Deploying Layotto using Istio"](operation/?id=option-1-deploy-using-istio) \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/oss/oss.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/oss/oss.md deleted file mode 100644 index 5019bfdb47..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/oss/oss.md +++ /dev/null @@ -1,12 +0,0 @@ -# OSS - -## Configuration Item Description - -Example:configs/config_file.json - -| Fields | Required | Note | -| ---------------- | -------- | -------------------------------------- | -| endpoint | Y | OSS Server Address | -| accessKeyID | Y | Passage ID | -| Access KeySecret | Y | Passcode | -| bucket | Y | bucket collection, an array of strings | diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/trace/jaeger.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/trace/jaeger.md deleted file mode 100644 index 5427af500f..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/trace/jaeger.md +++ /dev/null @@ -1,88 +0,0 @@ -# Jaeger trace - -## Configuration - -Example:configs/config_trace_jaeger.json - -```json -{ - "tracing": { - "enable": true, - "driver": "jaeger", - "config": { - "service_name": "layotto" - } - } -} -``` - -| Fields | Required | Note | -| --------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | -| service_name | Y | Service Name | -| agent_host | N | agent component port | -| Strategy | N | Data reporting, default using collector method. Optional configuration values include `collector` and `agent` | -| collector_endpoint | N | port number for collector, default http:///127.0.0.1:14268/api/traces | - -## Run Jaeger - -```shell -cd ${project_path}/diagnostics/jaeger - -docker-compose -f jaeger-docker-compose.yaml up -d -``` - -## Run layotto - -A layoto's server: can be started as follows. - -Switch directory: - -```shell -cd ${project_path}/cmd/layotto_multiple_api -``` - -Build: - -```shell @if.not.exist layotto -go build -o layotto -``` - -Run: - -```shell @background -./layotto start -c ../../configs/config_trace_jaeger.json -``` - -## Run Demo - -The corresponding call end code is in[client.go](https://github.com/mosn/layotto/blob/main/demo/flowcontrol/client.go), which runs the Sayhello interface with layotto: - -Switch directory: - -```shell - cd ${project_path}/demo/flowcontrol/ -``` - -Build: - -```shell @if.not.exist client - go build -o customer -``` - -Run: - -```shell -./client -``` - -Visit http://localhost:16686 - -![img.png](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*-f2LSLAR9YMAAAAAAAAAAAAAARQnAQ) - -## Clean up resources - -```shell -cd ${project_path}/diagnostics/jaeger - -docker-compose -f jaeger-docker-compose.yaml down -``` diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/trace/zipkin.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/trace/zipkin.md deleted file mode 100644 index db347ed93d..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/trace/zipkin.md +++ /dev/null @@ -1,103 +0,0 @@ -# ZipKin trace access - -## Configuration - -Example:configs/config_trace_zipkin.json - -```json -LO - "tracing": LO - "enable": true, - "driver": "Zipkin", - "config": LO - "config": LO - "service_name": "layotto", - "reporter_endpoint": "http://127. .0.1:9411/api/v2/spans", - "recorder_host_post": "127![img.png](img.png).0.0. :3494" - } - } - } -} - -``` - -| Fields | Required | Note | -| ------------------------------------------------------------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -| service_name | Y | Current service name such as layotto | -| reporter_endpoint | Y | Link log reported url | -| recorder_host_post | Y | Current server port information such as layotto service port is 127.0.0.1:34904 | - -Note that:currently only supports Http-style Reporters. - -## Run ZipKin - -```shell -dock-compose -f diagnostics/zipkin/zipkin-docker-compose.yaml up -d -``` - -## Run layotto - - - -### **Use Docker** - -You can start Layotto with a docker - -```bash -docker run -d \ - -v "$(pwd)/configs/config_trace_zipkin.json:/runtime/configs/config.json" \ - -p 34904:34904 --network=zipkin_default --name layotto \ - layotto/layotto start -``` - -### **Local compilation (not for Windows)** - -You can locally compile and run Layotto. - -> [!TIP|label: don't fit for Windows users] -> Layotto will fail to compile under Windows.It is recommended that Windows users deploy using docker - -Build: - -```shell -cd ${project_path}/cmd/layotto_multiple_api/ -``` - -```shell @if.not.exist layotto -go build -o layotto -``` - -Run: - -```shell @background -./layotto start -c ../../configs/config_trace_zipkin.json -``` - - - -## Run Demo - -```shell - cd ${project_path}/demo/flowcontrol/ - go run client.go -``` - -Visit:http://localhost:9411/zipkin/?serviceName=layotto&lookback=15m&endT=1655559536414&limit=10 - -![](https://gw.alipayobjects.com/mdn/rms_5891a1/afts/img/A*WodlQKsN5UcAAAAAAAAAAAAAARQnAQ) - -## Clean up resources - -If you start Layotto using Docker, delete container: - -```bash -docker rm -f layotto -``` - -Remember to close zipkin: - -```shell -cd ${project_path}/diagnostics/zipkin - -docker-compose -f zipkin-docker-compose.yaml down -``` diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/uds/start.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/uds/start.md deleted file mode 100644 index d634d15727..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/start/uds/start.md +++ /dev/null @@ -1,129 +0,0 @@ -# Layotto Support ODS Communications - -## Quick Start - -Layotto provides the ability to communicate on ODS and has a better performance than the TCP. - -### step 1. Start layotto - -layotto provides the configuration file `configs/config_uds.json` to support UDS communications. The configuration file reads as follows: - -```json -{ - "servers": [ - { - "default_log_path": "stdout", - "default_log_level": "DEBUG", - "routers": [ - { - "router_config_name": "actuator_dont_need_router" - } - ], - "listeners": [ - { - "name": "grpc", - "address": "/tmp/client-proxy.sock", - "bind_port": true, - "network": "unix", - "filter_chains": [ - { - "filters": [ - { - "type": "grpc", - "config": { - "server_name": "runtime", - "grpc_config": { - "hellos": { - "helloworld": { - "type": "helloworld", - "hello": "greeting" - } - } - } - } - } - ] - } - ] - } - ] - } - ] -} -``` - -There are two main differences compared to the TCP configuration, the type of network changed from tcp to unix, addresses from IP to unix socket file. - -When configured, toggle directory: - -```shell -#备注 请将${project_path}替换成你的项目路径 -cd ${project_path}/cmd/layotto -``` - -Build: - -```shell @if.not.exist layotto -go build -o layotto -``` - -Start Layotto: - -```shell @background -./layotto start -c ../../configs/config_uds.json -``` - -### step 2. Start testing demo - - - -#### **Go** - -Build and run go language demo: - -Layotto provides examples [demo]to call gRPC interfaces via ODS (https://github.com/mosn/layotto/blob/main/demo/uds/client.go) - -```shell -cd ${project_path}/demo/uds/ -go build client.go - -# 通过UDS访问layotto的hellos组件 -./client -``` - -#### **Java** - -Build, run java language demo: - -Layotto java-sdk has supported calling gRPC via ODS - -```shell @if.not.exist java-sdk -git clone https://github.com/layotto/java-sdk -``` - -Switch directory: - -```shell -cd java-sdk -``` - -Build: - -```shell @if.not.exist examples-uds/target/examples-uds-jar-with-dependencies.jar -# build example jar -mvn -f examples-uds/pom.xml clean package -``` - -Run: - -``` -java -jar examples-uds/target/examples-uds-in-with-dependencies.jar -``` - -The following information was printed and run successfully: - -```bash -greeting, helloowold -``` - - diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/video/README.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/video/README.md deleted file mode 100644 index 5fdacb95eb..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/video/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Video collection - -## Community meetings - -- [Community meeting video collection](https://space.bilibili.com/228717294/channel/seriesdetail?sid=2222011) - -## Lecture Video - -- [B Lecture Video Collection](https://space.bilibili.com/228717294/channel/seriesdetail?sid=2222014) -- [Layotto opens service grid + new chapter while app running, Stone building (ant Group Senior Technical Experts)](https://www.bilibili.com/video/BV1ty4y1M7SX?spm_id_from=333.337.search-card.all.click) -- [Layotto - A new chapter of Service Mesh and Application Runtime] (https://www.youtube.com/watch?v=5v8gTrUDk8) -- [WebAssembly + Application Runtime = A New Era of FaaS?](https://www.youtube.com/watch?v=g01CJ4S9Qao) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/video/a-new-chapter-in-service-mesh-application-runtime.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/video/a-new-chapter-in-service-mesh-application-runtime.md deleted file mode 100644 index 36553bf948..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/video/a-new-chapter-in-service-mesh-application-runtime.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/video/inject-soul-into-sidecar.md b/docs/i18n/en-US/docusaurus-plugin-content-docs/current/video/inject-soul-into-sidecar.md deleted file mode 100644 index a12dee56e0..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/video/inject-soul-into-sidecar.md +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/i18n/en-US/docusaurus-plugin-content-pages/markdown-page.md b/docs/i18n/en-US/docusaurus-plugin-content-pages/markdown-page.md deleted file mode 100644 index 828c6a2480..0000000000 --- a/docs/i18n/en-US/docusaurus-plugin-content-pages/markdown-page.md +++ /dev/null @@ -1,8 +0,0 @@ -[--- -title: Markdown page example ---- - -# Markdown page example - -You don't need React to write simple standalone pages. -]() \ No newline at end of file diff --git a/docs/i18n/en-US/docusaurus-theme-classic/footer.json b/docs/i18n/en-US/docusaurus-theme-classic/footer.json deleted file mode 100644 index 714f4502e4..0000000000 --- a/docs/i18n/en-US/docusaurus-theme-classic/footer.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "link.title.Docs": { - "message": "Docs", - "description": "The title of the footer links column with title=Docs in the footer" - }, - "link.title.Community": { - "message": "Community", - "description": "The title of the footer links column with title=Community in the footer" - }, - "link.title.More": { - "message": "More", - "description": "The title of the footer links column with title=More in the footer" - }, - "link.item.label.Tutorial": { - "message": "Tutorial", - "description": "The label of footer link with label=Tutorial linking to /docs/README.md" - }, - "link.item.label.Stack Overflow": { - "message": "Stack Overflow", - "description": "The label of footer link with label=Stack Overflow linking to https://stackoverflow.com/questions/tagged/docusaurus" - }, - "link.item.label.Discord": { - "message": "Discord", - "description": "The label of footer link with label=Discord linking to https://discordapp.com/invite/docusaurus" - }, - "link.item.label.Twitter": { - "message": "Twitter", - "description": "The label of footer link with label=Twitter linking to https://twitter.com/docusaurus" - }, - "link.item.label.Blog": { - "message": "Blog", - "description": "The label of footer link with label=Blog linking to /blog" - }, - "link.item.label.GitHub": { - "message": "GitHub", - "description": "The label of footer link with label=GitHub linking to https://github.com/mosn/layotto" - }, - "copyright": { - "message": "Copyright © 2024 My Project, Inc. Built with Docusaurus.", - "description": "The footer copyright" - }, - "link.title.文档": { - "message": "Doc", - "description": "The title of the footer links column with title=文档 in the footer" - }, - "link.title.社区": { - "message": "Community", - "description": "The title of the footer links column with title=社区 in the footer" - }, - "link.item.label.文档": { - "message": "Doc", - "description": "The label of footer link with label=文档 linking to /docs" - }, - "link.item.label.博客": { - "message": "Blog", - "description": "The label of footer link with label=博客 linking to /blog" - } -} diff --git a/docs/i18n/en-US/docusaurus-theme-classic/navbar.json b/docs/i18n/en-US/docusaurus-theme-classic/navbar.json deleted file mode 100644 index 43fff351af..0000000000 --- a/docs/i18n/en-US/docusaurus-theme-classic/navbar.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "title": { - "message": "Layotto", - "description": "The title in the navbar" - }, - "logo.alt": { - "message": "Layotto Logo", - "description": "The alt text of navbar logo" - }, - "item.label.Tutorial": { - "message": "Tutorial", - "description": "Navbar item with label Tutorial" - }, - "item.label.Blog": { - "message": "Blog", - "description": "Navbar item with label Blog" - }, - "item.label.GitHub": { - "message": "GitHub", - "description": "Navbar item with label GitHub" - }, - "item.label.文档": { - "message": "Docs", - "description": "Navbar item with label 文档" - }, - "item.label.博客": { - "message": "Blog", - "description": "Navbar item with label 博客" - } -} diff --git a/docs/static/img/actuator/abstract.png b/docs/img/actuator/abstract.png similarity index 100% rename from docs/static/img/actuator/abstract.png rename to docs/img/actuator/abstract.png diff --git a/docs/static/img/actuator/actuator.png b/docs/img/actuator/actuator.png similarity index 100% rename from docs/static/img/actuator/actuator.png rename to docs/img/actuator/actuator.png diff --git a/docs/static/img/actuator/actuator_config.png b/docs/img/actuator/actuator_config.png similarity index 100% rename from docs/static/img/actuator/actuator_config.png rename to docs/img/actuator/actuator_config.png diff --git a/docs/static/img/actuator/actuator_process.png b/docs/img/actuator/actuator_process.png similarity index 100% rename from docs/static/img/actuator/actuator_process.png rename to docs/img/actuator/actuator_process.png diff --git a/docs/static/img/actuator/img.png b/docs/img/actuator/img.png similarity index 100% rename from docs/static/img/actuator/img.png rename to docs/img/actuator/img.png diff --git a/docs/static/img/actuator/img_1.png b/docs/img/actuator/img_1.png similarity index 100% rename from docs/static/img/actuator/img_1.png rename to docs/img/actuator/img_1.png diff --git a/docs/static/img/actuator/img_2.png b/docs/img/actuator/img_2.png similarity index 100% rename from docs/static/img/actuator/img_2.png rename to docs/img/actuator/img_2.png diff --git a/docs/static/img/actuator/networkfilter-grpc.jpg b/docs/img/actuator/networkfilter-grpc.jpg similarity index 100% rename from docs/static/img/actuator/networkfilter-grpc.jpg rename to docs/img/actuator/networkfilter-grpc.jpg diff --git a/docs/static/img/actuator/networkfilter.jpg b/docs/img/actuator/networkfilter.jpg similarity index 100% rename from docs/static/img/actuator/networkfilter.jpg rename to docs/img/actuator/networkfilter.jpg diff --git a/docs/static/img/actuator/set_started.png b/docs/img/actuator/set_started.png similarity index 100% rename from docs/static/img/actuator/set_started.png rename to docs/img/actuator/set_started.png diff --git a/docs/static/img/community/img2.png b/docs/img/community/img2.png similarity index 100% rename from docs/static/img/community/img2.png rename to docs/img/community/img2.png diff --git a/docs/static/img/configuration/apollo/arch.png b/docs/img/configuration/apollo/arch.png similarity index 100% rename from docs/static/img/configuration/apollo/arch.png rename to docs/img/configuration/apollo/arch.png diff --git a/docs/static/img/configuration/apollo/img.png b/docs/img/configuration/apollo/img.png similarity index 100% rename from docs/static/img/configuration/apollo/img.png rename to docs/img/configuration/apollo/img.png diff --git a/docs/static/img/configuration/layotto/img.png b/docs/img/configuration/layotto/img.png similarity index 100% rename from docs/static/img/configuration/layotto/img.png rename to docs/img/configuration/layotto/img.png diff --git a/docs/static/img/configuration/nacos/img.png b/docs/img/configuration/nacos/img.png similarity index 100% rename from docs/static/img/configuration/nacos/img.png rename to docs/img/configuration/nacos/img.png diff --git a/docs/static/img/configuration/nacos/layotto-nacos-configstore-component.png b/docs/img/configuration/nacos/layotto-nacos-configstore-component.png similarity index 100% rename from docs/static/img/configuration/nacos/layotto-nacos-configstore-component.png rename to docs/img/configuration/nacos/layotto-nacos-configstore-component.png diff --git a/docs/static/img/development/api/img.png b/docs/img/development/api/img.png similarity index 100% rename from docs/static/img/development/api/img.png rename to docs/img/development/api/img.png diff --git a/docs/static/img/development/api/img_1.png b/docs/img/development/api/img_1.png similarity index 100% rename from docs/static/img/development/api/img_1.png rename to docs/img/development/api/img_1.png diff --git a/docs/static/img/development/api/img_2.png b/docs/img/development/api/img_2.png similarity index 100% rename from docs/static/img/development/api/img_2.png rename to docs/img/development/api/img_2.png diff --git a/docs/static/img/development/api/img_3.png b/docs/img/development/api/img_3.png similarity index 100% rename from docs/static/img/development/api/img_3.png rename to docs/img/development/api/img_3.png diff --git a/docs/static/img/development/api/img_4.png b/docs/img/development/api/img_4.png similarity index 100% rename from docs/static/img/development/api/img_4.png rename to docs/img/development/api/img_4.png diff --git a/docs/static/img/development/component/img.png b/docs/img/development/component/img.png similarity index 100% rename from docs/static/img/development/component/img.png rename to docs/img/development/component/img.png diff --git a/docs/static/img/development/component/img_1.png b/docs/img/development/component/img_1.png similarity index 100% rename from docs/static/img/development/component/img_1.png rename to docs/img/development/component/img_1.png diff --git a/docs/static/img/development/component/img_10.png b/docs/img/development/component/img_10.png similarity index 100% rename from docs/static/img/development/component/img_10.png rename to docs/img/development/component/img_10.png diff --git a/docs/static/img/development/component/img_11.png b/docs/img/development/component/img_11.png similarity index 100% rename from docs/static/img/development/component/img_11.png rename to docs/img/development/component/img_11.png diff --git a/docs/static/img/development/component/img_2.png b/docs/img/development/component/img_2.png similarity index 100% rename from docs/static/img/development/component/img_2.png rename to docs/img/development/component/img_2.png diff --git a/docs/static/img/development/component/img_3.png b/docs/img/development/component/img_3.png similarity index 100% rename from docs/static/img/development/component/img_3.png rename to docs/img/development/component/img_3.png diff --git a/docs/static/img/development/component/img_4.png b/docs/img/development/component/img_4.png similarity index 100% rename from docs/static/img/development/component/img_4.png rename to docs/img/development/component/img_4.png diff --git a/docs/static/img/development/component/img_5.png b/docs/img/development/component/img_5.png similarity index 100% rename from docs/static/img/development/component/img_5.png rename to docs/img/development/component/img_5.png diff --git a/docs/static/img/development/component/img_6.png b/docs/img/development/component/img_6.png similarity index 100% rename from docs/static/img/development/component/img_6.png rename to docs/img/development/component/img_6.png diff --git a/docs/static/img/development/component/img_7.png b/docs/img/development/component/img_7.png similarity index 100% rename from docs/static/img/development/component/img_7.png rename to docs/img/development/component/img_7.png diff --git a/docs/static/img/development/component/img_8.png b/docs/img/development/component/img_8.png similarity index 100% rename from docs/static/img/development/component/img_8.png rename to docs/img/development/component/img_8.png diff --git a/docs/static/img/development/component/img_9.png b/docs/img/development/component/img_9.png similarity index 100% rename from docs/static/img/development/component/img_9.png rename to docs/img/development/component/img_9.png diff --git a/docs/static/img/development/component/mock.png b/docs/img/development/component/mock.png similarity index 100% rename from docs/static/img/development/component/mock.png rename to docs/img/development/component/mock.png diff --git a/docs/static/img/development/doc/img.png b/docs/img/development/doc/img.png similarity index 100% rename from docs/static/img/development/doc/img.png rename to docs/img/development/doc/img.png diff --git a/docs/static/img/development/doc/img_1.png b/docs/img/development/doc/img_1.png similarity index 100% rename from docs/static/img/development/doc/img_1.png rename to docs/img/development/doc/img_1.png diff --git a/docs/static/img/development/doc/img_2.png b/docs/img/development/doc/img_2.png similarity index 100% rename from docs/static/img/development/doc/img_2.png rename to docs/img/development/doc/img_2.png diff --git a/docs/static/img/development/doc/img_3.png b/docs/img/development/doc/img_3.png similarity index 100% rename from docs/static/img/development/doc/img_3.png rename to docs/img/development/doc/img_3.png diff --git a/docs/static/img/development/doc/img_4.png b/docs/img/development/doc/img_4.png similarity index 100% rename from docs/static/img/development/doc/img_4.png rename to docs/img/development/doc/img_4.png diff --git a/docs/static/img/development/doc/img_5.png b/docs/img/development/doc/img_5.png similarity index 100% rename from docs/static/img/development/doc/img_5.png rename to docs/img/development/doc/img_5.png diff --git a/docs/static/img/development/doc/img_6.png b/docs/img/development/doc/img_6.png similarity index 100% rename from docs/static/img/development/doc/img_6.png rename to docs/img/development/doc/img_6.png diff --git a/docs/static/img/development/doc/img_7.png b/docs/img/development/doc/img_7.png similarity index 100% rename from docs/static/img/development/doc/img_7.png rename to docs/img/development/doc/img_7.png diff --git a/docs/static/img/development/release/img.png b/docs/img/development/release/img.png similarity index 100% rename from docs/static/img/development/release/img.png rename to docs/img/development/release/img.png diff --git a/docs/static/img/development/release/img_1.png b/docs/img/development/release/img_1.png similarity index 100% rename from docs/static/img/development/release/img_1.png rename to docs/img/development/release/img_1.png diff --git a/docs/static/img/development/workflow/release.png b/docs/img/development/workflow/release.png similarity index 100% rename from docs/static/img/development/workflow/release.png rename to docs/img/development/workflow/release.png diff --git a/docs/static/img/development/workflow/workflow-dev.png b/docs/img/development/workflow/workflow-dev.png similarity index 100% rename from docs/static/img/development/workflow/workflow-dev.png rename to docs/img/development/workflow/workflow-dev.png diff --git a/docs/static/img/development/workflow/workflow-merge.png b/docs/img/development/workflow/workflow-merge.png similarity index 100% rename from docs/static/img/development/workflow/workflow-merge.png rename to docs/img/development/workflow/workflow-merge.png diff --git a/docs/static/img/development/workflow/workflow-release.png b/docs/img/development/workflow/workflow-release.png similarity index 100% rename from docs/static/img/development/workflow/workflow-release.png rename to docs/img/development/workflow/workflow-release.png diff --git a/docs/static/img/ding-talk-group-1.png b/docs/img/ding-talk-group-1.png similarity index 100% rename from docs/static/img/ding-talk-group-1.png rename to docs/img/ding-talk-group-1.png diff --git a/docs/static/img/faas/faas-design.jpg b/docs/img/faas/faas-design.jpg similarity index 100% rename from docs/static/img/faas/faas-design.jpg rename to docs/img/faas/faas-design.jpg diff --git a/docs/static/img/faas/faas-request-process.jpg b/docs/img/faas/faas-request-process.jpg similarity index 100% rename from docs/static/img/faas/faas-request-process.jpg rename to docs/img/faas/faas-request-process.jpg diff --git a/docs/static/img/file/create_tencent_oss_bucket.png b/docs/img/file/create_tencent_oss_bucket.png similarity index 100% rename from docs/static/img/file/create_tencent_oss_bucket.png rename to docs/img/file/create_tencent_oss_bucket.png diff --git a/docs/static/img/file/img.png b/docs/img/file/img.png similarity index 100% rename from docs/static/img/file/img.png rename to docs/img/file/img.png diff --git a/docs/static/img/file/minio.png b/docs/img/file/minio.png similarity index 100% rename from docs/static/img/file/minio.png rename to docs/img/file/minio.png diff --git a/docs/static/img/file/put.png b/docs/img/file/put.png similarity index 100% rename from docs/static/img/file/put.png rename to docs/img/file/put.png diff --git a/docs/static/img/flow_control.png b/docs/img/flow_control.png similarity index 100% rename from docs/static/img/flow_control.png rename to docs/img/flow_control.png diff --git a/docs/static/img/lock/img.png b/docs/img/lock/img.png similarity index 100% rename from docs/static/img/lock/img.png rename to docs/img/lock/img.png diff --git a/docs/static/img/lock/img_1.png b/docs/img/lock/img_1.png similarity index 100% rename from docs/static/img/lock/img_1.png rename to docs/img/lock/img_1.png diff --git a/docs/static/img/lock/img_2.png b/docs/img/lock/img_2.png similarity index 100% rename from docs/static/img/lock/img_2.png rename to docs/img/lock/img_2.png diff --git a/docs/static/img/lock/img_3.png b/docs/img/lock/img_3.png similarity index 100% rename from docs/static/img/lock/img_3.png rename to docs/img/lock/img_3.png diff --git a/docs/static/img/logo/black1-1.svg b/docs/img/logo/black1-1.svg similarity index 100% rename from docs/static/img/logo/black1-1.svg rename to docs/img/logo/black1-1.svg diff --git a/docs/static/img/logo/black1-2.svg b/docs/img/logo/black1-2.svg similarity index 100% rename from docs/static/img/logo/black1-2.svg rename to docs/img/logo/black1-2.svg diff --git a/docs/static/img/logo/grey2-1.svg b/docs/img/logo/grey2-1.svg similarity index 100% rename from docs/static/img/logo/grey2-1.svg rename to docs/img/logo/grey2-1.svg diff --git a/docs/static/img/logo/grey2-2.svg b/docs/img/logo/grey2-2.svg similarity index 100% rename from docs/static/img/logo/grey2-2.svg rename to docs/img/logo/grey2-2.svg diff --git a/docs/static/img/logo/white-logo-right.svg b/docs/img/logo/white-logo-right.svg similarity index 100% rename from docs/static/img/logo/white-logo-right.svg rename to docs/img/logo/white-logo-right.svg diff --git a/docs/static/img/logo/white-logo.svg b/docs/img/logo/white-logo.svg similarity index 100% rename from docs/static/img/logo/white-logo.svg rename to docs/img/logo/white-logo.svg diff --git a/docs/static/img/logo/white2-1.svg b/docs/img/logo/white2-1.svg similarity index 100% rename from docs/static/img/logo/white2-1.svg rename to docs/img/logo/white2-1.svg diff --git a/docs/static/img/logo/white2-2.svg b/docs/img/logo/white2-2.svg similarity index 100% rename from docs/static/img/logo/white2-2.svg rename to docs/img/logo/white2-2.svg diff --git a/docs/static/img/mq/design/config.png b/docs/img/mq/design/config.png similarity index 100% rename from docs/static/img/mq/design/config.png rename to docs/img/mq/design/config.png diff --git a/docs/static/img/mq/design/img.png b/docs/img/mq/design/img.png similarity index 100% rename from docs/static/img/mq/design/img.png rename to docs/img/mq/design/img.png diff --git a/docs/static/img/mq/design/img_1.png b/docs/img/mq/design/img_1.png similarity index 100% rename from docs/static/img/mq/design/img_1.png rename to docs/img/mq/design/img_1.png diff --git a/docs/static/img/mq/design/img_2.png b/docs/img/mq/design/img_2.png similarity index 100% rename from docs/static/img/mq/design/img_2.png rename to docs/img/mq/design/img_2.png diff --git a/docs/static/img/mq/design/img_3.png b/docs/img/mq/design/img_3.png similarity index 100% rename from docs/static/img/mq/design/img_3.png rename to docs/img/mq/design/img_3.png diff --git a/docs/static/img/mq/design/img_4.png b/docs/img/mq/design/img_4.png similarity index 100% rename from docs/static/img/mq/design/img_4.png rename to docs/img/mq/design/img_4.png diff --git a/docs/static/img/mq/start/img.png b/docs/img/mq/start/img.png similarity index 100% rename from docs/static/img/mq/start/img.png rename to docs/img/mq/start/img.png diff --git a/docs/static/img/mq/start/img_1.png b/docs/img/mq/start/img_1.png similarity index 100% rename from docs/static/img/mq/start/img_1.png rename to docs/img/mq/start/img_1.png diff --git a/docs/static/img/pluggable/layotto.png b/docs/img/pluggable/layotto.png similarity index 100% rename from docs/static/img/pluggable/layotto.png rename to docs/img/pluggable/layotto.png diff --git a/docs/static/img/pluggable/layotto_datatflow.png b/docs/img/pluggable/layotto_datatflow.png similarity index 100% rename from docs/static/img/pluggable/layotto_datatflow.png rename to docs/img/pluggable/layotto_datatflow.png diff --git a/docs/static/img/rpc/jsonrpc.jpg b/docs/img/rpc/jsonrpc.jpg similarity index 100% rename from docs/static/img/rpc/jsonrpc.jpg rename to docs/img/rpc/jsonrpc.jpg diff --git a/docs/static/img/rpc/jsonrpcresult.jpg b/docs/img/rpc/jsonrpcresult.jpg similarity index 100% rename from docs/static/img/rpc/jsonrpcresult.jpg rename to docs/img/rpc/jsonrpcresult.jpg diff --git a/docs/static/img/rpc/rpc-layer.png b/docs/img/rpc/rpc-layer.png similarity index 100% rename from docs/static/img/rpc/rpc-layer.png rename to docs/img/rpc/rpc-layer.png diff --git a/docs/static/img/rpc/rpchello.png b/docs/img/rpc/rpchello.png similarity index 100% rename from docs/static/img/rpc/rpchello.png rename to docs/img/rpc/rpchello.png diff --git a/docs/static/img/runtime-architecture.png b/docs/img/runtime-architecture.png similarity index 100% rename from docs/static/img/runtime-architecture.png rename to docs/img/runtime-architecture.png diff --git a/docs/static/img/sdk/img.png b/docs/img/sdk/img.png similarity index 100% rename from docs/static/img/sdk/img.png rename to docs/img/sdk/img.png diff --git a/docs/static/img/sequencer/design/leaf_max_id.png b/docs/img/sequencer/design/leaf_max_id.png similarity index 100% rename from docs/static/img/sequencer/design/leaf_max_id.png rename to docs/img/sequencer/design/leaf_max_id.png diff --git a/docs/static/img/sequencer/etcd/img.png b/docs/img/sequencer/etcd/img.png similarity index 100% rename from docs/static/img/sequencer/etcd/img.png rename to docs/img/sequencer/etcd/img.png diff --git a/docs/static/img/state/img.png b/docs/img/state/img.png similarity index 100% rename from docs/static/img/state/img.png rename to docs/img/state/img.png diff --git a/docs/static/img/tcp_dump.png b/docs/img/tcp_dump.png similarity index 100% rename from docs/static/img/tcp_dump.png rename to docs/img/tcp_dump.png diff --git a/docs/static/img/trace/metric.png b/docs/img/trace/metric.png similarity index 100% rename from docs/static/img/trace/metric.png rename to docs/img/trace/metric.png diff --git a/docs/static/img/trace/sky.png b/docs/img/trace/sky.png similarity index 100% rename from docs/static/img/trace/sky.png rename to docs/img/trace/sky.png diff --git a/docs/static/img/trace/structure.png b/docs/img/trace/structure.png similarity index 100% rename from docs/static/img/trace/structure.png rename to docs/img/trace/structure.png diff --git a/docs/static/img/trace/trace.png b/docs/img/trace/trace.png similarity index 100% rename from docs/static/img/trace/trace.png rename to docs/img/trace/trace.png diff --git a/docs/static/img/wasm/img.png b/docs/img/wasm/img.png similarity index 100% rename from docs/static/img/wasm/img.png rename to docs/img/wasm/img.png diff --git a/docs/static/img/wasm/img_1.png b/docs/img/wasm/img_1.png similarity index 100% rename from docs/static/img/wasm/img_1.png rename to docs/img/wasm/img_1.png diff --git a/docs/static/img/wechat-group.jpg b/docs/img/wechat-group.jpg similarity index 100% rename from docs/static/img/wechat-group.jpg rename to docs/img/wechat-group.jpg diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000000..c1c3d16e0e --- /dev/null +++ b/docs/index.html @@ -0,0 +1,116 @@ + + + + + + + Layotto + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/js/docsify-plugin-flexible-alerts.min.js b/docs/js/docsify-plugin-flexible-alerts.min.js new file mode 100644 index 0000000000..f06031f6b2 --- /dev/null +++ b/docs/js/docsify-plugin-flexible-alerts.min.js @@ -0,0 +1,9 @@ +/*! + * docsify-plugin-flexible-alerts + * v1.1.0 + * https://github.com/fzankl/docsify-plugin-flexible-alerts#readme + * (c) 2020 Fabian Zankl + * MIT license + */ +!function(){"use strict";function h(t){return(h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var e;!function(t,e){void 0===e&&(e={});var a,l,o=e.insertAt;t&&"undefined"!=typeof document&&(a=document.head||document.getElementsByTagName("head")[0],(l=document.createElement("style")).type="text/css","top"===o&&a.firstChild?a.insertBefore(l,a.firstChild):a.appendChild(l),l.styleSheet?l.styleSheet.cssText=t:l.appendChild(document.createTextNode(t)))}(".alert{display:block;position:relative;word-wrap:break-word;word-break:break-word;padding:.75rem 1.25rem!important;margin-bottom:1rem!important}.alert>*{max-width:100%}.alert>:first-child{margin-top:0}.alert>:last-child{margin-bottom:0}.alert:before{content:unset!important}.alert+.alert{margin-top:-.25rem!important}.alert p{margin-top:.5rem;margin-bottom:.5rem}.alert .title{display:flex;align-items:center;flex-wrap:wrap;font-weight:600;margin:0}.icon{display:inline-block;width:16px;height:16px;background-repeat:no-repeat;margin-right:.5rem}.alert.callout{border:1px solid #eee;border-left-width:.25rem;border-radius:.25rem;background:var(--background)}.alert.callout.note{border-left-color:#17a2b8!important}.alert.callout.note .title{color:#17a2b8}.alert.callout.note .icon-note{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='1em' height='1em' viewBox='0 0 16 16' fill='%2317a2b8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' d='M8 16A8 8 0 108 0a8 8 0 000 16zm.93-9.412l-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM8 5.5a1 1 0 100-2 1 1 0 000 2z'/%3E%3C/svg%3E\")}.alert.callout.tip{border-left-color:#28a745!important}.alert.callout.tip .title{color:#28a745}.alert.callout.tip .icon-tip{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='1em' height='1em' viewBox='0 0 352 512' fill='%2328a745' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M96.06 454.35c.01 6.29 1.87 12.45 5.36 17.69l17.09 25.69a31.99 31.99 0 0026.64 14.28h61.71a31.99 31.99 0 0026.64-14.28l17.09-25.69a31.989 31.989 0 005.36-17.69l.04-38.35H96.01l.05 38.35zM0 176c0 44.37 16.45 84.85 43.56 115.78 16.52 18.85 42.36 58.23 52.21 91.45.04.26.07.52.11.78h160.24c.04-.26.07-.51.11-.78 9.85-33.22 35.69-72.6 52.21-91.45C335.55 260.85 352 220.37 352 176 352 78.61 272.91-.3 175.45 0 73.44.31 0 82.97 0 176zm176-80c-44.11 0-80 35.89-80 80 0 8.84-7.16 16-16 16s-16-7.16-16-16c0-61.76 50.24-112 112-112 8.84 0 16 7.16 16 16s-7.16 16-16 16z'/%3E%3C/svg%3E\")}.alert.callout.warning{border-left-color:#f0ad4e!important}.alert.callout.warning .title{color:#f0ad4e}.alert.callout.warning .icon-warning{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='1em' height='1em' viewBox='0 0 17 16' fill='%23f0ad4e' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' d='M8.982 1.566a1.13 1.13 0 00-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5a.905.905 0 00-.9.995l.35 3.507a.552.552 0 001.1 0l.35-3.507A.905.905 0 008 5zm.002 6a1 1 0 100 2 1 1 0 000-2z'/%3E%3C/svg%3E\")}.alert.callout.attention{border-left-color:#dc3545!important}.alert.callout.attention .title{color:#dc3545}.alert.callout.attention .icon-attention{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='1em' height='1em' viewBox='0 0 16 16' fill='%23dc3545' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' d='M8 15A7 7 0 108 1a7 7 0 000 14zm0 1A8 8 0 108 0a8 8 0 000 16z'/%3E%3Cpath fill-rule='evenodd' d='M11.354 4.646a.5.5 0 010 .708l-6 6a.5.5 0 01-.708-.708l6-6a.5.5 0 01.708 0z'/%3E%3C/svg%3E\")}.alert.flat{border-radius:.125rem;color:#383d41;background-color:#e2e3e5;border:1px solid #d6d8db}.alert.flat.note{color:#02587f;background-color:#cdeefd;border-color:#b4e6fc}.alert.flat.note .title{color:#01354d}.alert.flat.note .icon-note{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='1em' height='1em' viewBox='0 0 16 16' fill='%2301354d' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' d='M8 16A8 8 0 108 0a8 8 0 000 16zm.93-9.412l-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM8 5.5a1 1 0 100-2 1 1 0 000 2z'/%3E%3C/svg%3E\")}.alert.flat.tip{color:#285b2a;background-color:#dbefdc;border-color:#c9e7cb}.alert.flat.tip .title{color:#18381a}.alert.flat.tip .icon-tip{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='1em' height='1em' viewBox='0 0 352 512' fill='%2318381a' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M96.06 454.35c.01 6.29 1.87 12.45 5.36 17.69l17.09 25.69a31.99 31.99 0 0026.64 14.28h61.71a31.99 31.99 0 0026.64-14.28l17.09-25.69a31.989 31.989 0 005.36-17.69l.04-38.35H96.01l.05 38.35zM0 176c0 44.37 16.45 84.85 43.56 115.78 16.52 18.85 42.36 58.23 52.21 91.45.04.26.07.52.11.78h160.24c.04-.26.07-.51.11-.78 9.85-33.22 35.69-72.6 52.21-91.45C335.55 260.85 352 220.37 352 176 352 78.61 272.91-.3 175.45 0 73.44.31 0 82.97 0 176zm176-80c-44.11 0-80 35.89-80 80 0 8.84-7.16 16-16 16s-16-7.16-16-16c0-61.76 50.24-112 112-112 8.84 0 16 7.16 16 16s-7.16 16-16 16z'/%3E%3C/svg%3E\")}.alert.flat.warning{color:#852d12;background-color:#ffddd3;border-color:#ffc9ba}.alert.flat.warning .title{color:#581e0c}.alert.flat.warning .icon-warning{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='1em' height='1em' viewBox='0 0 17 16' fill='%23581e0c' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' d='M8.982 1.566a1.13 1.13 0 00-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5a.905.905 0 00-.9.995l.35 3.507a.552.552 0 001.1 0l.35-3.507A.905.905 0 008 5zm.002 6a1 1 0 100 2 1 1 0 000-2z'/%3E%3C/svg%3E\")}.alert.flat.attention{color:#7f231c;background-color:#fdd9d7;border-color:#fcc2bf}.alert.flat.attention .title{color:#551713}.alert.flat.attention .icon-attention{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='1em' height='1em' viewBox='0 0 16 16' fill='%23551713' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' d='M8 15A7 7 0 108 1a7 7 0 000 14zm0 1A8 8 0 108 0a8 8 0 000 16z'/%3E%3Cpath fill-rule='evenodd' d='M11.354 4.646a.5.5 0 010 .708l-6 6a.5.5 0 01-.708-.708l6-6a.5.5 0 01.708 0z'/%3E%3C/svg%3E\")}"),e={style:"callout",note:{label:"Note",icon:"icon-note",className:"note"},tip:{label:"Tip",icon:"icon-tip",className:"tip"},warning:{label:"Warning",icon:"icon-warning",className:"warning"},attention:{label:"Attention",icon:"icon-attention",className:"attention"},typeMappings:{info:"note",danger:"attention"}},window.$docsify=window.$docsify||{},window.$docsify.plugins=[].concat(function(t,f){function p(t,e,a,l){var o=(t||"").match(new RegExp("".concat(e,":(([\\s\\w\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF-]*))")));return o?l?l(o[1]):o[1]:l?l(a):a}var w=function t(e,a,l){var o,r=2]*>(?:

|[\S\n]*)?\[!(\w*)((?:\|[\w*:[\s\w\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF-]*)*?)\]([\s\S]*?)(?:<\/p>)?<\s*\/\s*blockquote>/g,function(t,e,a,l){!w[e.toLowerCase()]&&w.typeMappings[e.toLowerCase()]&&(e=w.typeMappings[e.toLowerCase()]);var o=w[e.toLowerCase()];if(!o)return t;var r,n=p(a,"style",w.style),i=p(a,"iconVisibility","visible",function(t){return"hidden"!==t}),c=p(a,"labelVisibility","visible",function(t){return"hidden"!==t}),d=p(a,"label",o.label),s=p(a,"icon",o.icon),g=p(a,"className",o.className);"object"===h(d)&&((r=Object.keys(d).filter(function(t){return-1'),u='

'.concat(i?m:"").concat(c?d:"","

");return'
\n ').concat(i||c?u:"","\n

").concat(l,"

\n
")}))})},window.$docsify.plugins)}(); +//# sourceMappingURL=docsify-plugin-flexible-alerts.min.js.map \ No newline at end of file diff --git a/docs/js/docsify-sidebar-collapse.min.js b/docs/js/docsify-sidebar-collapse.min.js new file mode 100644 index 0000000000..2b067c7e25 --- /dev/null +++ b/docs/js/docsify-sidebar-collapse.min.js @@ -0,0 +1 @@ +!function(e){("object"!=typeof exports||"undefined"==typeof module)&&"function"==typeof define&&define.amd?define(e):e()}(function(){"use strict";function e(e,n){var t,a=(n=void 0===n?{}:n).insertAt;e&&"undefined"!=typeof document&&(t=document.head||document.getElementsByTagName("head")[0],(n=document.createElement("style")).type="text/css","top"===a&&t.firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e)))}var t;function a(e){e&&null!=t&&(e=e.getBoundingClientRect().top,document.querySelector(".sidebar").scrollBy(0,e-t))}function n(){requestAnimationFrame(function(){var e=document.querySelector(".app-sub-sidebar > .active");if(e)for(e.parentNode.parentNode.querySelectorAll(".app-sub-sidebar").forEach(function(e){return e.classList.remove("open")});e.parentNode.classList.contains("app-sub-sidebar")&&!e.parentNode.classList.contains("open");)e.parentNode.classList.add("open"),e=e.parentNode})}function o(e){t=e.target.getBoundingClientRect().top;var n=d(e.target,"LI",2);n&&(n.classList.contains("open")?(n.classList.remove("open"),setTimeout(function(){n.classList.add("collapse")},0)):(function(e){if(e)for(e.classList.remove("open","active");e&&"sidebar-nav"!==e.className&&e.parentNode;)"LI"!==e.parentNode.tagName&&"app-sub-sidebar"!==e.parentNode.className||e.parentNode.classList.remove("open"),e=e.parentNode}(s()),i(n),setTimeout(function(){n.classList.remove("collapse")},0)),a(n))}function s(){var e=document.querySelector(".sidebar-nav .active");return e||(e=d(document.querySelector('.sidebar-nav a[href="'.concat(decodeURIComponent(location.hash).replace(/ /gi,"%20"),'"]')),"LI",2))&&e.classList.add("active"),e}function i(e){if(e)for(e.classList.add("open","active");e&&"sidebar-nav"!==e.className&&e.parentNode;)"LI"!==e.parentNode.tagName&&"app-sub-sidebar"!==e.parentNode.className||e.parentNode.classList.add("open"),e=e.parentNode}function d(e,n,t){if(e&&e.tagName===n)return e;for(var a=0;e;){if(t<++a)return;if(e.parentNode.tagName===n)return e.parentNode;e=e.parentNode}}e(".sidebar-nav > ul > li ul {\n display: none;\n}\n\n.app-sub-sidebar {\n display: none;\n}\n\n.app-sub-sidebar.open {\n display: block;\n}\n\n.sidebar-nav .open > ul:not(.app-sub-sidebar),\n.sidebar-nav .active:not(.collapse) > ul {\n display: block;\n}\n\n/* 抖动 */\n.sidebar-nav li.open:not(.collapse) > ul {\n display: block;\n}\n\n.active + ul.app-sub-sidebar {\n display: block;\n}\n"),document.addEventListener("scroll",n);e("@media screen and (max-width: 768px) {\n /* 移动端适配 */\n .markdown-section {\n max-width: none;\n padding: 16px;\n }\n /* 改变原来按钮热区大小 */\n .sidebar-toggle {\n padding: 0 0 10px 10px;\n }\n /* my pin */\n .sidebar-pin {\n appearance: none;\n outline: none;\n position: fixed;\n bottom: 0;\n border: none;\n width: 40px;\n height: 40px;\n background: transparent;\n }\n}\n");var r,c="DOCSIFY_SIDEBAR_PIN_FLAG";function l(){var e="true"===(e=localStorage.getItem(c));localStorage.setItem(c,!e),e?(document.querySelector(".sidebar").style.transform="translateX(0)",document.querySelector(".content").style.transform="translateX(0)"):(document.querySelector(".sidebar").style.transform="translateX(300px)",document.querySelector(".content").style.transform="translateX(300px)")}768 ul"),1),a(t),n(e)}),e.ready(function(){document.querySelector(".sidebar-nav").addEventListener("click",o)})})}); \ No newline at end of file diff --git a/docs/js/docsify-tabs.min.js b/docs/js/docsify-tabs.min.js new file mode 100644 index 0000000000..db7fea6483 --- /dev/null +++ b/docs/js/docsify-tabs.min.js @@ -0,0 +1,9 @@ +/*! + * docsify-tabs + * v1.5.2 + * https://jhildenbiddle.github.io/docsify-tabs/ + * (c) 2018-2021 John Hildenbiddle + * MIT license + */ +!function(){"use strict";!function(t,o){void 0===o&&(o={});var a=o.insertAt;if(t&&"undefined"!=typeof document){var e=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style");c.type="text/css","top"===a&&e.firstChild?e.insertBefore(c,e.firstChild):e.appendChild(c),c.styleSheet?c.styleSheet.cssText=t:c.appendChild(document.createTextNode(t))}}(':root{--docsifytabs-border-color:#ededed;--docsifytabs-border-px:1px;--docsifytabs-border-radius-px: ;--docsifytabs-margin:1.5em 0;--docsifytabs-tab-background:#f8f8f8;--docsifytabs-tab-background--active:var(--docsifytabs-content-background);--docsifytabs-tab-color:#999;--docsifytabs-tab-color--active:inherit;--docsifytabs-tab-highlight-px:3px;--docsifytabs-tab-highlight-color:var(--theme-color,currentColor);--docsifytabs-tab-padding:0.6em 1em;--docsifytabs-content-background:inherit;--docsifytabs-content-padding:1.5rem}.docsify-tabs:before,.docsify-tabs__tab{z-index:1}.docsify-tabs__tab--active,.docsify-tabs__tab:focus{z-index:2}.docsify-tabs{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;position:relative}.docsify-tabs:before{-ms-flex-order:0;content:"";-ms-flex:1 1;flex:1 1;order:0}.docsify-tabs__tab{-ms-flex-order:-1;appearance:none;font-size:inherit;margin:0;order:-1;position:relative}.docsify-tabs__content{height:0;overflow:hidden;position:absolute;visibility:hidden;width:100%}.docsify-tabs__content :first-child{margin-top:0}.docsify-tabs__content :first-child~:last-child,.docsify-tabs__content :last-child{margin-bottom:0}.docsify-tabs__tab--active+.docsify-tabs__content{height:auto;overflow:auto;position:relative;visibility:visible}[class*=docsify-tabs--]{margin:1.5em 0;margin:var(--docsifytabs-margin)}[class*=docsify-tabs--] .docsify-tabs__tab{background:#f8f8f8;background:var(--docsifytabs-tab-background);color:#999;color:var(--docsifytabs-tab-color);padding:.6em 1em;padding:var(--docsifytabs-tab-padding)}[class*=docsify-tabs--] .docsify-tabs__tab--active{background:inherit;background:var(--docsifytabs-tab-background--active);color:inherit;color:var(--docsifytabs-tab-color--active)}[class*=docsify-tabs--] .docsify-tabs__content{background:inherit;background:var(--docsifytabs-content-background);padding:1.5rem;padding:var(--docsifytabs-content-padding)}.docsify-tabs--classic .docsify-tabs__content,.docsify-tabs--classic .docsify-tabs__tab,.docsify-tabs--classic:before{border-color:#ededed;border-width:1px;border:var(--docsifytabs-border-px) solid var(--docsifytabs-border-color)}.docsify-tabs--classic:before{border-left-width:0;border-right-width:0;border-top-width:0;margin-right:1px;margin-right:var(--docsifytabs-border-px)}.docsify-tabs--classic .docsify-tabs__tab:first-of-type{border-top-left-radius:var(--docsifytabs-border-radius-px)}.docsify-tabs--classic .docsify-tabs__tab:last-of-type{border-top-right-radius:var(--docsifytabs-border-radius-px)}.docsify-tabs--classic .docsify-tabs__tab~.docsify-tabs__tab{margin-left:-1px;margin-left:calc(0px - var(--docsifytabs-border-px))}.docsify-tabs--classic .docsify-tabs__tab--active{border-bottom-width:0;box-shadow:inset 0 3px 0 0 var(--theme-color,currentColor);box-shadow:inset 0 var(--docsifytabs-tab-highlight-px) 0 0 var(--docsifytabs-tab-highlight-color)}.docsify-tabs--classic .docsify-tabs__content{border-radius:0;border-radius:0 var(--docsifytabs-border-radius-px) var(--docsifytabs-border-radius-px) var(--docsifytabs-border-radius-px);border-top:0;margin-top:-1px;margin-top:calc(0px - var(--docsifytabs-border-px))}.docsify-tabs--material .docsify-tabs__tab{background:transparent;border:0;margin-bottom:2px;margin-bottom:calc(var(--docsifytabs-tab-highlight-px) - var(--docsifytabs-border-px))}.docsify-tabs--material .docsify-tabs__tab--active{background:transparent;box-shadow:0 3px 0 0 var(--theme-color,currentColor);box-shadow:0 var(--docsifytabs-tab-highlight-px) 0 0 var(--docsifytabs-tab-highlight-color)}.docsify-tabs--material .docsify-tabs__content{border-color:#ededed;border-width:1px 0;border-bottom:var(--docsifytabs-border-px) solid var(--docsifytabs-border-color);border-left:0 solid var(--docsifytabs-border-color);border-right:0 solid var(--docsifytabs-border-color);border-top:var(--docsifytabs-border-px) solid var(--docsifytabs-border-color)}',{insertAt:"top"});var t="tabs:replace",o={tabsContainer:"content",tabBlock:"docsify-tabs",tabButton:"docsify-tabs__tab",tabButtonActive:"docsify-tabs__tab--active",tabContent:"docsify-tabs__content"},a={codeMarkup:/(```[\s\S]*?```)/gm,commentReplaceMarkup:new RegExp("\x3c!-- ".concat(t," (.*) --\x3e")),tabBlockMarkup:/[\r\n]*(\s*)()[\r\n]+([\s|\S]*?)[\r\n\s]+()/m,tabCommentMarkup:/[\r\n]*(\s*)[\r\n]+([\s\S]*?)[\r\n]*\s*(?=)/m},e={persist:!0,sync:!0,theme:"classic",tabComments:!0,tabHeadings:!0};function c(t,o){if(Element.prototype.closest)return t.closest(o);for(;t;){if(r(t,o))return t;t=t.parentNode||null}return t}function r(t,o){return(Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector).call(t,o)}function s(t){var a=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=c(t,".".concat(o.tabButton));if(r){var n=r.getAttribute("data-tab"),i=document.querySelector(".".concat(o.tabsContainer)),d=r.parentNode,b=Array.apply(null,d.querySelectorAll(".".concat(o.tabButton))),f=d.offsetTop;if(b.forEach((function(t){return t.classList.remove(o.tabButtonActive)})),r.classList.add(o.tabButtonActive),!a){if(e.persist){var l=i?Array.apply(null,i.querySelectorAll(".".concat(o.tabBlock))):[],u=l.indexOf(d),y=JSON.parse(sessionStorage.getItem(window.location.href))||{};y[u]=n,sessionStorage.setItem(window.location.href,JSON.stringify(y))}if(e.sync){var p=i?Array.apply(null,i.querySelectorAll(".".concat(o.tabButton,'[data-tab="').concat(n,'"]'))):[],m=JSON.parse(sessionStorage.getItem("*"))||[];p.forEach((function(t){s(t,!0)})),window.scrollBy(0,0-(f-d.offsetTop)),m.indexOf(n)>0&&m.splice(m.indexOf(n),1),0!==m.indexOf(n)&&(m.unshift(n),sessionStorage.setItem("*",JSON.stringify(m)))}}}}function n(){var t=decodeURIComponent((window.location.hash.match(/(?:id=)([^&]+)/)||[])[1]),a=t&&".".concat(o.tabBlock," #").concat(t);if(t&&document.querySelector(a)){var e,c=document.querySelector("#".concat(t));if(c.closest)e=c.closest(".".concat(o.tabContent));else for(e=c.parentNode;e!==document.body&&!e.classList.contains("".concat(o.tabContent));)e=e.parentNode;s(e.previousElementSibling)}}window&&(window.$docsify=window.$docsify||{},window.$docsify.tabs=window.$docsify.tabs||{},Object.keys(window.$docsify.tabs).forEach((function(t){Object.prototype.hasOwnProperty.call(e,t)&&(e[t]=window.$docsify.tabs[t])})),window.$docsify.tabs.version="1.5.2",(e.tabComments||e.tabHeadings)&&(window.$docsify.plugins=[].concat((function(c,r){var i=!1;c.beforeEach((function(c){return(i=a.tabBlockMarkup.test(c))&&(c=function(c,r){for(var s,n,i=c.match(a.codeMarkup)||[],d=i.map((function(o,a){var e="\x3c!-- ".concat(t," CODEBLOCK").concat(a," --\x3e");return c=c.replace(o,(function(){return e})),e})),b=e.theme?"".concat(o.tabBlock,"--").concat(e.theme):"",f=document.createElement("div"),l=1,u=function(){var i=s[0],d="",u="",y=e.tabComments&&a.tabCommentMarkup.test(i),p=e.tabHeadings&&a.tabHeadingMarkup.test(i),m=s[1],h=s[2],g=s[4];if(y||p){d="\x3c!-- ".concat(t,'
--\x3e'),u="\n".concat(m,"\x3c!-- ").concat(t,"
--\x3e");for(var v=function(){f.innerHTML=n[2].trim()?r.compiler.compile(n[2]).replace(/<\/?p>/g,""):"Tab ".concat(l);var a=f.innerHTML,e=(n[3]||"").trim(),c=(f.textContent||f.firstChild.getAttribute("alt")||f.firstChild.getAttribute("src")).trim().toLowerCase();i=i.replace(n[0],(function(){return["\n".concat(m,"\x3c!-- ").concat(t,' --\x3e"),"\n".concat(m,"\x3c!-- ").concat(t,'
--\x3e'),"\n\n".concat(m).concat(e),"\n\n".concat(m,"\x3c!-- ").concat(t,"
--\x3e")].join("")})),l++};null!==(n=(e.tabComments?a.tabCommentMarkup.exec(i):null)||(e.tabHeadings?a.tabHeadingMarkup.exec(i):null));)v()}i=(i=i.replace(h,(function(){return d}))).replace(g,(function(){return u})),c=c.replace(s[0],(function(){return i}))};null!==(s=a.tabBlockMarkup.exec(c));)u();return d.forEach((function(t,o){c=c.replace(t,(function(){return i[o]}))})),c}(c,r)),c})),c.afterEach((function(t,o){i&&(t=function(t){for(var o,e=function(){var a=o[0],e=o[1]||"";t=t.replace(a,(function(){return e}))};null!==(o=a.commentReplaceMarkup.exec(t));)e();return t}(t)),o(t)})),c.doneEach((function(){var t,a,c,r;i&&(a=(t=document.querySelector(".".concat(o.tabsContainer)))?Array.apply(null,t.querySelectorAll(".".concat(o.tabBlock))):[],c=JSON.parse(sessionStorage.getItem(window.location.href))||{},r=JSON.parse(sessionStorage.getItem("*"))||[],n(),a.forEach((function(t,a){var s=t.querySelector(".".concat(o.tabButtonActive));s||(e.sync&&r.length&&(s=r.map((function(a){return t.querySelector(".".concat(o.tabButton,'[data-tab="').concat(a,'"]'))})).filter((function(t){return t}))[0]),!s&&e.persist&&(s=t.querySelector(".".concat(o.tabButton,'[data-tab="').concat(c[a],'"]'))),(s=s||t.querySelector(".".concat(o.tabButton)))&&s.classList.add(o.tabButtonActive))})))})),c.mounted((function(){var t=document.querySelector(".".concat(o.tabsContainer));t&&t.addEventListener("click",(function(t){s(t.target)})),window.addEventListener("hashchange",n,!1)}))}),window.$docsify.plugins||[])))}(); +//# sourceMappingURL=docsify-tabs.min.js.map diff --git a/docs/js/index.js b/docs/js/index.js new file mode 100644 index 0000000000..4a6ec1bc59 --- /dev/null +++ b/docs/js/index.js @@ -0,0 +1,61 @@ +;(function(win) { + function isFunction(functionToCheck) { + return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]' + } + + win.EditOnGithubPlugin = {} + + function create(docBase, docEditBase, title) { + title = title || 'Edit on github' + docEditBase = docEditBase || docBase.replace(/\/blob\//, '/edit/') + + function editDoc(event, vm) { + var docName = vm.route.file + + if (docName) { + var editLink = docEditBase + docName + window.open(editLink) + event.preventDefault() + return false + } else { + return true + } + } + + win.EditOnGithubPlugin.editDoc = editDoc + + function generateHeader(title) { + return header = [ + '
', + '

', + title, + '

', + '
' + ].join('') + } + + return function(hook, vm) { + win.EditOnGithubPlugin.onClick = function(event) { + EditOnGithubPlugin.editDoc(event, vm) + } + + if (isFunction(title)) { + + hook.afterEach(function (html) { + return generateHeader(title(vm.route.file)) + html + }) + } else { + var header = generateHeader(title) + + hook.afterEach(function (html) { + return header + html + }) + } + + + } + } + + win.EditOnGithubPlugin.create = create +}) (window) diff --git a/docs/js/pangu.min.js b/docs/js/pangu.min.js new file mode 100644 index 0000000000..35aa599fa2 --- /dev/null +++ b/docs/js/pangu.min.js @@ -0,0 +1 @@ +$docsify.plugins=[].concat(function(n){n.init(function(n){var c;(c=document.createElement("script")).async=!0,c.src="https://cdn.jsdelivr.net/npm/pangu",document.body.appendChild(c)}),n.doneEach(function(n){try{pangu.spacingElementByClassName("content")}catch(n){}})},$docsify.plugins); diff --git a/docs/js/progress.js b/docs/js/progress.js new file mode 100644 index 0000000000..087951e8a8 --- /dev/null +++ b/docs/js/progress.js @@ -0,0 +1,70 @@ +function plugin(hook, vm) { + let marginTop + hook.mounted(function () { + const content = document.getElementsByClassName("content")[0] + marginTop = parseFloat( + window.getComputedStyle(content).paddingTop.replace("px", "") + ) + + let insertDOM = ` +
+
+
+ ` + const mainDOM = document.getElementsByTagName("body")[0] + mainDOM.innerHTML = mainDOM.innerHTML + insertDOM + + function switcher() { + const body = document.getElementsByTagName("body")[0] + if (!body.classList.contains("close")) { + body.classList.add("close") + } else { + body.classList.remove("close") + } + } + + const btn = document.querySelector("div.sidebar-toggle-button") + btn.addEventListener("click", function (e) { + e.stopPropagation() + switcher() + }) + }) + hook.ready(function () { + window.addEventListener("scroll", function (e) { + let totalHeight = + marginTop + + parseFloat( + window + .getComputedStyle(document.getElementById("main")) + .height.replace("px", "") + ) + let scrollTop = + document.body.scrollTop + document.documentElement.scrollTop + let remain = totalHeight - document.body.offsetHeight + document.getElementById("progress-display").style.width = + Math.ceil((scrollTop / remain) * 100) + "%" + }) + }) +} + +// Docsify plugin options +window.$docsify["progress"] = Object.assign( + { + position: "top", + color: "var(--theme-color,#42b983)", + height: "3px", + }, + window.$docsify["progress"] +) +window.$docsify.plugins = [].concat(plugin, window.$docsify.plugins) diff --git a/docs/js/time-updater.min.js b/docs/js/time-updater.min.js new file mode 100644 index 0000000000..5e891b480e --- /dev/null +++ b/docs/js/time-updater.min.js @@ -0,0 +1 @@ +let defaultDocsifyUpdatedOptions={text:">Last Modify: {docsify-updated}",formatUpdated:"{YYYY}/{MM}/{DD}",whereToPlace:"bottom"};function plugin(t,d){let o=d.config.timeUpdater.text,i=String(d.config.timeUpdater.whereToPlace).toLowerCase();t.beforeEach(function(t){return"top"!==i?t+"\n\n"+o:o+"\n\n"+t})}window.$docsify=window.$docsify||{},window.$docsify.formatUpdated=(window.$docsify.timeUpdater||defaultDocsifyUpdatedOptions).formatUpdated,window.$docsify.timeUpdater=Object.assign(defaultDocsifyUpdatedOptions,window.$docsify.timeUpdater),window.$docsify.plugins=(window.$docsify.plugins||[]).concat(plugin); \ No newline at end of file diff --git a/docs/sdk/go-sdk b/docs/sdk/go-sdk new file mode 100644 index 0000000000..4be35e39d6 --- /dev/null +++ b/docs/sdk/go-sdk @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/sidebars.js b/docs/sidebars.js deleted file mode 100644 index 84ab33a393..0000000000 --- a/docs/sidebars.js +++ /dev/null @@ -1,553 +0,0 @@ - - -const sidebars = { - - mySidebar: [ - { - type: 'doc', - label: '首页', - id: 'README' - }, - { - type: 'category', - label: '快速开始', - link: { - type: 'doc', - id: 'start/README', - }, - items: [ - { - type: "doc", - - id: "start/state/start", - }, - { - type: "category", - label: "使用Configuration API", - items:[ - "start/configuration/start-apollo", - { - type: "doc", - id: "start/configuration/start", - }, - { - type: "doc", - id: "start/configuration/start-nacos", - }, - ] - }, - { - type: "doc", - id: "start/pubsub/start", - }, - { - type: "doc", - id: "start/delay_queue/start", - }, - { - type: "doc", - id: "start/lock/start", - }, - { - type: "doc", - id: "start/sequencer/start", - }, - { - type: "doc", - id: "start/secret/start", - }, - { - type: "doc", - id: "start/rpc/helloworld", - }, - { - type: "doc", - id: "start/file/minio", - }, - { - type: "doc", - id: "start/oss/oss", - }, - { - type: "doc", - id: "start/uds/start", - }, - { - type: "doc", - id: "start/sms/start", - }, - { - type: "doc", - id: "start/cryption/start", - }, - { - type: "doc", - id: "start/phone/start", - }, - { - type: "doc", - id: "start/email/start", - }, - { type: "doc", id: "start/lifecycle/start", }, - { - type: 'category', - label: 'API插件', - items: [ - { - type: 'doc', - id: 'start/api_plugin/helloworld', - }, - { - type: 'doc', - id: 'start/api_plugin/generate', - } - ]}, - { - type: 'category', - label: '作为 Istio 的数据面', - items: [ - { - type: 'doc', - id: 'start/istio/README', - }, - { - type: 'doc', - id: 'start/istio/start', - }, - ], - }, - { - type: 'category', - label: '在四层网络进行流量干预', - items: [ - { - type: 'doc', - id: 'start/network_filter/tcpcopy', - }, - ], - }, - { - type: 'category', - label: '在七层网络进行流量干预', - items: [ - { - type: 'doc', - id: 'start/stream_filter/flow_control', - }, - ], - }, - { - type: 'doc', - id: 'start/actuator/start', - }, - { - type: 'category', - label: '可观测性', - items: [ - { - type: 'doc', - id: 'start/trace/trace', - }, - { - type: 'doc', - id: 'start/trace/skywalking', - }, - { - type: 'doc', - id: 'start/trace/zipkin', - }, - { - type: 'doc', - id: 'start/trace/jaeger', - }, - { - type: 'doc', - id: 'start/trace/prometheus', - }, - ], - }, - { - type: 'doc', - id: 'start/wasm/start', - }, - { - type: 'doc', - id: 'start/faas/start', - }] - }, - { - type: 'doc', - label: '线上实验室', - id: 'start/lab' - }, - { - type: 'category', - label: '用户手册', - items: [ - { - type: 'category', - label: '功能介绍', - items: [ - { - type: 'doc', - id: 'building_blocks/file/file', - }, - { - type: 'doc', - id: 'building_blocks/actuator/actuator', - }, - { - type: 'doc', - id: 'building_blocks/state/reference', - }, - { - type: 'doc', - id: 'building_blocks/sequencer/reference', - }, - { - type: 'doc', - id: 'building_blocks/lock/reference', - }, - { - type: 'doc', - id: 'building_blocks/pubsub/reference', - }, - { - type: 'doc', - id: 'building_blocks/rpc/reference', - }, - { - type: 'doc', - id: 'building_blocks/configuration/reference', - }, - { - type: 'category', - label: '可扩展性', - items: [ - { - type: 'doc', - id: 'design/api_plugin/design', - }, - { - type: 'doc', - id: 'design/pluggable/usage', - }, - ], - }, - ], - }, - { - "type": "doc", - "id": "api_reference/README" - }, - { - "type": "link", - label: 'java sdk', - "href": "https://github.com/layotto/java-sdk" - }, - { - "type": "link", - label: '.net sdk', - - "href": "https://github.com/layotto/dotnet-sdk" - }, - { - "type": "link", - label: 'js sdk', - "href": "https://github.com/layotto/js-sdk" - }, - { - "type": "doc", - "id": "sdk_reference/go/start" - } - - ], - }, - - // - -{ - type: 'category', - label: '运维手册', - items: [ - { - type: 'category', - label: '如何配置 Layotto', - items: [ - { - type: 'doc', - id: 'configuration/overview', - }, - { - type: 'category', - label: '组件配置说明', - link:{ - type:"doc", - id:"component_specs/overview" - }, - items: [ - { - type: 'category', - label: 'State', - link:{ - type:"doc", - id:"component_specs/state/common" - }, - items: [ - { - type: 'doc', - id: 'component_specs/state/redis', - }, - { - type: 'doc', - id: 'component_specs/state/others', - }, - ], - }, - { - type: 'category', - label: 'Pub/Sub', - link:{ - type:"doc", - id:"component_specs/pubsub/common" - }, - items: [ - { - type: 'doc', - id: 'component_specs/pubsub/redis', - }, - { - type: 'doc', - id: 'component_specs/pubsub/others', - }, - ], - }, - { - type: 'category', - label: 'Distributed Lock', - link:{ - type:"doc", - id:"component_specs/lock/common" - }, - items: [ - { - type: 'doc', - id: 'component_specs/lock/redis', - }, - { - type: 'doc', - id: 'component_specs/lock/etcd', - }, - { - type: 'doc', - id: 'component_specs/lock/zookeeper', - }, - { - type: 'doc', - id: 'component_specs/lock/consul', - }, - { - type: 'doc', - id: 'component_specs/lock/mongo', - }, - ], - }, - { - type: 'doc', - id: 'component_specs/configuration/etcd', - }, - { - type: 'doc', - id: 'component_specs/file/oss', - }, - { - type: 'category', - label: 'Sequencer', - items: [{ - "type": "doc", - "id": "component_specs/sequencer/etcd" - }, - { - "type": "doc", - "id": "component_specs/sequencer/redis" - }, - { - "type": "doc", - "id": "component_specs/sequencer/zookeeper" - }, - { - "type": "doc", - "id": "component_specs/sequencer/mongo" - }, - { - "type": "doc", - "id": "component_specs/sequencer/mysql" - }, - { - "type": "doc", - "id": "component_specs/sequencer/snowflake" - } - - ], - }, - { - type: 'doc', - id: 'component_specs/secret/common', - }, - { - type: 'doc', - id: 'component_specs/custom/common', - }, - ], - }, - ], - }, - { - type: 'doc', - id: 'operation/README', - }, - { - type: 'doc', - id: 'operation/sidecar_injector', - }, - { - type: 'doc', - id: 'operation/local', - }, - ] -}, - - - // - { - type: 'category', - label: '设计文档', - items: [ - { - type: 'doc', - id: 'design/lifecycle/apply_configuration', - }, - { - type: 'doc', - id: 'design/actuator/actuator-design-doc', - }, - { - type: 'doc', - id: 'design/actuator/grpc-design-doc', - }, - { - type: 'doc', - id: 'design/configuration/configuration-api-with-apollo', - }, - { - type: 'doc', - id: 'design/pubsub/pubsub-api-and-compability-with-dapr-component', - }, - { - type: 'doc', - id: 'design/rpc/rpc_design_document', - }, - { - type: 'doc', - id: 'design/lock/lock-api-design', - }, - { - type: 'doc', - id: 'design/sequencer/design', - }, - { - type: 'doc', - id: 'design/file/file-design', - }, - { - type: 'doc', - id: 'design/faas/faas-poc-design', - }, - { - type: 'doc', - id: 'design/api_plugin/design', - }, - { - type: 'doc', - id: 'design/api_plugin/dapr_api', - }, - { - type: 'doc', - id: 'design/oss/design', - }, - { - type: 'doc', - id: 'design/pluggable/design', - }, - ], - }, - { - type: "category", - label: "贡献指南", - items: [ - "development/CONTRIBUTING", - "development/start-from-zero", - { - type: "category", - label: "想要贡献文档?", - items: ["development/contributing-doc", "development/test-quickstart"] - }, - "development/developing-component", - "development/component_ref/component_ref", - { - type: "category", - label: "想要修改proto文件或API定义?", - items: [ - "api_reference/how_to_generate_api_doc", - "api_reference/comment_spec_of_proto", - "development/developing-api" - ] - }, - { - type: "doc", - id: "development/github-workflows" - }, - { - type: "doc", - id: "development/commands" - }, - { - type: "category", - label: "如何给 issue 打 label", - items: [ - { - type: "doc", - id: "development/label-spec" - } - ] - }, - { - type: "doc", - id: "development/release-guide" - }, - { - type: "doc", - id: "development/problems-to-solve" - } - ] - } -, - { - type: "category", - label: "社区", - items: [ - "community/meeting", - "community/governance", - "community/promote", - "community/people" - ] - }, - - { - type: "doc", - id: "video/README" - } - ] -}; - -export default sidebars; diff --git a/docs/spec b/docs/spec new file mode 100644 index 0000000000..4be35e39d6 --- /dev/null +++ b/docs/spec @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/src/components/HomepageFeatures/index.js b/docs/src/components/HomepageFeatures/index.js deleted file mode 100644 index 784b0a9d64..0000000000 --- a/docs/src/components/HomepageFeatures/index.js +++ /dev/null @@ -1,61 +0,0 @@ -import clsx from 'clsx'; -import Heading from '@theme/Heading'; -import styles from './styles.module.css'; - -const FeatureList = [ - { - title: '易用性', - Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, - description: ( - <> - 非常容易使用 - - ), - }, - { - title: '专注方面', - Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, - description: ( - <> - 网络 - - ), - }, - { - title: '适合人群', - Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, - description: ( - <> - 适合人群:程序员等 - - ), - }, -]; - -function Feature({Svg, title, description}) { - return ( -
-
- -
-
- {title} -

{description}

-
-
- ); -} - -export default function HomepageFeatures() { - return ( -
-
-
- {FeatureList.map((props, idx) => ( - - ))} -
-
-
- ); -} diff --git a/docs/src/components/HomepageFeatures/styles.module.css b/docs/src/components/HomepageFeatures/styles.module.css deleted file mode 100644 index b248eb2e5d..0000000000 --- a/docs/src/components/HomepageFeatures/styles.module.css +++ /dev/null @@ -1,11 +0,0 @@ -.features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; -} - -.featureSvg { - height: 200px; - width: 200px; -} diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css deleted file mode 100644 index e634b10d91..0000000000 --- a/docs/src/css/custom.css +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Any CSS included here will be global. The classic template - * bundles Infima by default. Infima is a CSS framework designed to - * work well for content-centric websites. - */ - -/* You can override the default Infima variables here. */ -:root { - --ifm-color-primary: #2e8555; - --ifm-color-primary-dark: #29784c; - --ifm-color-primary-darker: #277148; - --ifm-color-primary-darkest: #205d3b; - --ifm-color-primary-light: #33925d; - --ifm-color-primary-lighter: #359962; - --ifm-color-primary-lightest: #3cad6e; - --ifm-code-font-size: 95%; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); -} - -/* For readability concerns, you should choose a lighter palette in dark mode. */ -[data-theme='dark'] { - --ifm-color-primary: #25c2a0; - --ifm-color-primary-dark: #21af90; - --ifm-color-primary-darker: #1fa588; - --ifm-color-primary-darkest: #1a8870; - --ifm-color-primary-light: #29d5b0; - --ifm-color-primary-lighter: #32d8b4; - --ifm-color-primary-lightest: #4fddbf; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); -} -.navbar__title { - display: none !important; -} diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css deleted file mode 100644 index 9f71a5da77..0000000000 --- a/docs/src/pages/index.module.css +++ /dev/null @@ -1,23 +0,0 @@ -/** - * CSS files with the .module.css suffix will be treated as CSS modules - * and scoped locally. - */ - -.heroBanner { - padding: 4rem 0; - text-align: center; - position: relative; - overflow: hidden; -} - -@media screen and (max-width: 996px) { - .heroBanner { - padding: 2rem; - } -} - -.buttons { - display: flex; - align-items: center; - justify-content: center; -} diff --git a/docs/src/pages/index_back.js b/docs/src/pages/index_back.js deleted file mode 100644 index bdfeb7026f..0000000000 --- a/docs/src/pages/index_back.js +++ /dev/null @@ -1,61 +0,0 @@ -import clsx from 'clsx'; -import Link from '@docusaurus/Link'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import Layout from '@theme/Layout'; -import HomepageFeatures from '@site/src/components/HomepageFeatures'; -import Heading from '@theme/Heading'; -import styles from './index.module.css'; -// -// function HomepageHeader() { -// const {siteConfig} = useDocusaurusContext(); -// return ( -//
-//
-// -// {siteConfig.title} -// -//

{siteConfig.tagline}

-//
-// -// Layotto Tutorial - 5min ⏱️ -// -//
-//
-//
-// ); -// } -// -// export default function Home() { -// const {siteConfig} = useDocusaurusContext(); -// return ( -// -// -//
-// -//
-//
-// ); -// } - - -import { useEffect } from 'react'; -import { useHistory } from 'react-router-dom'; - -function RedirectToDocs() { - const history = useHistory(); - const {siteConfig} = useDocusaurusContext(); - - useEffect(() => { - console.log("本地化:"+siteConfig.i18n.locales) - history.replace('/layotto-docusaurus/'); - }, []); - - return null; -} - -export default RedirectToDocs; - diff --git a/docs/src/pages/markdown-page.md b/docs/src/pages/markdown-page.md deleted file mode 100644 index 828c6a2480..0000000000 --- a/docs/src/pages/markdown-page.md +++ /dev/null @@ -1,8 +0,0 @@ -[--- -title: Markdown page example ---- - -# Markdown page example - -You don't need React to write simple standalone pages. -]() \ No newline at end of file diff --git a/docs/static/.nojekyll b/docs/static/.nojekyll deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/static/img/docusaurus-social-card.jpg b/docs/static/img/docusaurus-social-card.jpg deleted file mode 100644 index ffcb448210..0000000000 Binary files a/docs/static/img/docusaurus-social-card.jpg and /dev/null differ diff --git a/docs/static/img/docusaurus.png b/docs/static/img/docusaurus.png deleted file mode 100644 index f458149e3c..0000000000 Binary files a/docs/static/img/docusaurus.png and /dev/null differ diff --git a/docs/static/img/favicon.ico b/docs/static/img/favicon.ico deleted file mode 100644 index c01d54bcd3..0000000000 Binary files a/docs/static/img/favicon.ico and /dev/null differ diff --git a/docs/static/img/logo.svg b/docs/static/img/logo.svg deleted file mode 100644 index 9db6d0d066..0000000000 --- a/docs/static/img/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/static/img/undraw_docusaurus_mountain.svg b/docs/static/img/undraw_docusaurus_mountain.svg deleted file mode 100644 index af961c49a8..0000000000 --- a/docs/static/img/undraw_docusaurus_mountain.svg +++ /dev/null @@ -1,171 +0,0 @@ - - Easy to Use - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/static/img/undraw_docusaurus_react.svg b/docs/static/img/undraw_docusaurus_react.svg deleted file mode 100644 index 94b5cf08f8..0000000000 --- a/docs/static/img/undraw_docusaurus_react.svg +++ /dev/null @@ -1,170 +0,0 @@ - - Powered by React - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/static/img/undraw_docusaurus_tree.svg b/docs/static/img/undraw_docusaurus_tree.svg deleted file mode 100644 index d9161d3392..0000000000 --- a/docs/static/img/undraw_docusaurus_tree.svg +++ /dev/null @@ -1,40 +0,0 @@ - - Focus on What Matters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/template/api_ref_html.tmpl b/docs/template/api_ref_html.tmpl new file mode 100644 index 0000000000..8705bb8261 --- /dev/null +++ b/docs/template/api_ref_html.tmpl @@ -0,0 +1,418 @@ + + + + + Protocol Documentation + + + + + + + + + + +

Protocol Documentation

+ +

Table of Contents

+ +
+
    + {{range .Files}} + {{$file_name := .Name}} +
  • + {{.Name}} +
      + + {{range .Services}} +
    • + S{{.Name}} +
    • + {{end}} +
    +
  • + {{end}} + +
+
+ + {{range .Files}} + {{$file_name := .Name}} +
+

{{.Name}}

Top +
+ {{p .Description}} + + {{range .Services}} +

[gRPC Service] {{.Name}}

+ {{p .Description}} + + + + + + {{range .Methods}} + + + + + + + {{end}} + +
Method NameRequest TypeResponse TypeDescription
{{.Name}}{{.RequestLongType}}{{if .RequestStreaming}} stream{{end}}{{.ResponseLongType}}{{if .ResponseStreaming}} stream{{end}}

{{.Description}}

+ + {{$service := .}} + {{- range .MethodOptions}} + {{$option := .}} + {{if eq . "google.api.http"}} +

Methods with HTTP bindings

+ + + + + + + + + + + {{range $service.MethodsWithOption .}} + {{$name := .Name}} + {{range (.Option $option).Rules}} + + + + + + + {{end}} + {{end}} + +
Method NameMethodPatternBody
{{$name}}{{.Method}}{{.Pattern}}{{.Body}}
+ {{else}} +

Methods with {{.}} option

+ + + + + + + + + {{range $service.MethodsWithOption .}} + + + + + {{end}} + +
Method NameOption
{{.Name}}

{{ printf "%+v" (.Option $option)}}

+ {{end}} + {{end -}} + {{end}} + + {{range .Messages}} +

{{.LongName}}

+ {{p .Description}} + + {{if .HasFields}} + + + + + + {{range .Fields}} + + + + + + + {{end}} + +
FieldTypeLabelDescription
{{.Name}}{{.LongType}}{{.Label}}

{{if (index .Options "deprecated"|default false)}}Deprecated. {{end}}{{.Description}} {{if .DefaultValue}}Default: {{.DefaultValue}}{{end}}

+ + {{$message := .}} + {{- range .FieldOptions}} + {{$option := .}} + {{if eq . "validator.field" "validate.rules" }} +

Validated Fields

+ + + + + + + + + {{range $message.FieldsWithOption .}} + + + + + {{end}} + +
FieldValidations
{{.Name}} +
    + {{range (.Option $option).Rules}} +
  • {{.Name}}: {{.Value}}
  • + {{end}} +
+
+ {{else}} +

Fields with {{.}} option

+ + + + + + + + + {{range $message.FieldsWithOption .}} + + + + + {{end}} + +
NameOption
{{.Name}}

{{ printf "%+v" (.Option $option)}}

+ {{end}} + {{end -}} + {{end}} + + {{if .HasExtensions}} +
+ + + + + + {{range .Extensions}} + + + + + + + + {{end}} + +
ExtensionTypeBaseNumberDescription
{{.Name}}{{.LongType}}{{.ContainingLongType}}{{.Number}}

{{.Description}}{{if .DefaultValue}} Default: {{.DefaultValue}}{{end}}

+ {{end}} + {{end}} + + {{range .Enums}} +

{{.LongName}}

+ {{p .Description}} + + + + + + {{range .Values}} + + + + + + {{end}} + +
NameNumberDescription
{{.Name}}{{.Number}}

{{.Description}}

+ {{end}} + + {{if .HasExtensions}} +

File-level Extensions

+ + + + + + {{range .Extensions}} + + + + + + + + {{end}} + +
ExtensionTypeBaseNumberDescription
{{.Name}}{{.LongType}}{{.ContainingLongType}}{{.Number}}

{{.Description}}{{if .DefaultValue}} Default: {{.DefaultValue}}{{end}}

+ {{end}} + + {{end}} + + + diff --git a/docs/template/api_ref_md.tmpl b/docs/template/api_ref_md.tmpl new file mode 100644 index 0000000000..64fff10254 --- /dev/null +++ b/docs/template/api_ref_md.tmpl @@ -0,0 +1,75 @@ +{{range .Files}} +{{$file_name := .Name}} + + +# {{.Name}} + + +This document is automaticallly generated from the [`.proto`](https://github.com/mosn/layotto/tree/main/spec/proto/runtime/v1) files. + +{{.Description}} + +{{range .Services}} + + +## [gRPC Service] {{.Name}} +{{.Description}} + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +{{range .Methods -}} + | {{.Name}} | [{{.RequestLongType}}](#{{.RequestFullType}}){{if .RequestStreaming}} stream{{end}} | [{{.ResponseLongType}}](#{{.ResponseFullType}}){{if .ResponseStreaming}} stream{{end}} | {{nobr .Description}} | +{{end}} +{{end}} + +{{range .Messages}} + +

Top

+ +## {{.LongName}} +{{.Description}} + +{{if .HasFields}} +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +{{range .Fields -}} + | {{.Name}} | [{{.LongType}}](#{{.FullType}}) | {{.Label}} | {{if (index .Options "deprecated"|default false)}}**Deprecated.** {{end}}{{nobr .Description}}{{if .DefaultValue}} Default: {{.DefaultValue}}{{end}} | +{{end}} +{{end}} + +{{if .HasExtensions}} +| Extension | Type | Base | Number | Description | +| --------- | ---- | ---- | ------ | ----------- | +{{range .Extensions -}} + | {{.Name}} | {{.LongType}} | {{.ContainingLongType}} | {{.Number}} | {{nobr .Description}}{{if .DefaultValue}} Default: {{.DefaultValue}}{{end}} | +{{end}} +{{end}} + +{{end}} + +{{range .Enums}} + + +## {{.LongName}} +{{.Description}} + +| Name | Number | Description | +| ---- | ------ | ----------- | +{{range .Values -}} + | {{.Name}} | {{.Number}} | {{nobr .Description}} | +{{end}} + +{{end}} + +{{if .HasExtensions}} + + +## File-level Extensions +| Extension | Type | Base | Number | Description | +| --------- | ---- | ---- | ------ | ----------- | +{{range .Extensions -}} + | {{.Name}} | {{.LongType}} | {{.ContainingLongType}} | {{.Number}} | {{nobr .Description}}{{if .DefaultValue}} Default: `{{.DefaultValue}}`{{end}} | +{{end}} +{{end}} + +{{end}} \ No newline at end of file diff --git a/docs/template/quickstart.tmpl b/docs/template/quickstart.tmpl new file mode 100644 index 0000000000..3f05417993 --- /dev/null +++ b/docs/template/quickstart.tmpl @@ -0,0 +1,125 @@ +{{range .Files}} {{$file_name := .Name}} {{if .HasServices}} {{range .Services}} +# {{.Name}} API demo + +This example shows how to invoke Layotto {{.Name}} API. + +## What is {{.Name}} API used for? + +{{.Description}} + +## step 1. Deploy Layotto + +### **With Docker** +You can start Layotto with docker + +```bash +docker run -v "$(pwd)/configs/config_standalone.json:/runtime/configs/config.json" -d -p 34904:34904 --name layotto layotto/layotto start +``` + +### **Compile locally (not for Windows)** +You can compile and run Layotto locally. + +> [!TIP|label: Not for Windows users] +> Layotto fails to compile under Windows. Windows users are recommended to deploy using docker + +After downloading the project code to the local, switch the code directory and compile: + +```shell +cd ${project_path}/cmd/layotto +``` + +```shell @if.not.exist layotto +go build +``` + +Once finished, the layotto binary will be generated in the directory. + +Run it: + +```shell @background +./layotto start -c ../../configs/config_standalone.json +``` + + + +## step 2. Run the client program to invoke Layotto {{.Name}} API + +### **Go** +Build and run the golang demo: + +```shell + cd ${project_path}/demo/{{$file_name}}/common/ + go build -o client + ./client -s "demo" +``` + +If the following information is printed, the demo is successful: + +```bash +TODO +``` + +### **Java** + +Download java sdk and examples: + +```shell @if.not.exist java-sdk +git clone https://github.com/layotto/java-sdk +``` + +```shell +cd java-sdk +``` + +Build the demo: + +```shell @if.not.exist examples-{{$file_name}}/target/examples-{{$file_name}}-jar-with-dependencies.jar +# build example jar +mvn -f examples-{{$file_name}}/pom.xml clean package +``` + +Run it: + +```shell +java -jar examples-{{$file_name}}/target/examples-{{$file_name}}-jar-with-dependencies.jar +``` + +If the following information is printed, the demo is successful: + +```bash +TODO +``` + + + +## step 3. Stop containers and release resources + +### **Destroy the Docker container** +If you started Layotto with docker, you can destroy the container as follows: + +```bash +docker rm -f layotto +``` + + + +## Next step +### What does this client program do? +The demo client program uses the SDK provided by Layotto to invoke the Layotto {{.Name}} API. + +The golang sdk is located in the `sdk` directory, and the java sdk is in https://github.com/layotto/java-sdk + +In addition to using sdk, you can also interact with Layotto directly through grpc in any language you like. + +### Details later, let's continue to experience other APIs +Explore other Quickstarts through the navigation bar on the left. + +### Reference + + + + + +{{end}} +{{end}} +{{end}} \ No newline at end of file diff --git a/docs/template/quickstart_zh.tmpl b/docs/template/quickstart_zh.tmpl new file mode 100644 index 0000000000..c98b064bf7 --- /dev/null +++ b/docs/template/quickstart_zh.tmpl @@ -0,0 +1,125 @@ +{{range .Files}} {{$file_name := .Name}} {{if .HasServices}} {{range .Services}} +# {{.Name}} API demo + +本示例演示如何调用 Layotto {{.Name}} API. + +## 什么是 {{.Name}} API ? + +{{.Description}} + +## step 1. 运行 Layotto + +### **With Docker** +您可以用 Docker 启动 Layotto + +```bash +docker run -v "$(pwd)/configs/config_standalone.json:/runtime/configs/config.json" -d -p 34904:34904 --name layotto layotto/layotto start +``` + +### **本地编译(不适合 Windows)** +您可以本地编译、运行 Layotto。 +> [!TIP|label: 不适合 Windows 用户] +> Layotto 在 Windows 下会编译失败。建议 Windows 用户使用 docker 部署 + +将项目代码下载到本地后,切换代码目录: + +```shell +cd ${project_path}/cmd/layotto +``` + +构建: + +```shell @if.not.exist layotto +go build +``` + +完成后目录下会生成 Layotto文件,运行它: + +```shell @background +./layotto start -c ../../configs/config_standalone.json +``` + + + +## step 2. 运行客户端程序,调用 Layotto {{.Name}} API + +### **Go** + +构建、运行 go 语言 demo: + +```shell + cd ${project_path}/demo/{{$file_name}}/common/ + go build -o client + ./client -s "demo" +``` + +打印出如下信息则代表调用成功: + +```bash +TODO +``` + +### **Java** + +下载 java sdk 和示例代码: + +```shell @if.not.exist java-sdk +git clone https://github.com/layotto/java-sdk +``` + +```shell +cd java-sdk +``` + +构建 examples: + +```shell @if.not.exist examples-{{$file_name}}/target/examples-{{$file_name}}-jar-with-dependencies.jar +# build example jar +mvn -f examples-{{$file_name}}/pom.xml clean package +``` + +运行: + +```shell +java -jar examples-{{$file_name}}/target/examples-{{$file_name}}-jar-with-dependencies.jar +``` + +打印出以下信息说明运行成功: + +```bash +TODO +``` + + + +## step 3. 销毁容器,释放资源 + +### **销毁 Docker container** +如果您是用 Docker 启动的 Layotto,可以按以下方式销毁容器: + +```bash +docker rm -f layotto +``` + + + +## 下一步 +### 这个客户端程序做了什么? +示例客户端程序中使用了 Layotto 提供的多语言 sdk,调用Layotto {{.Name}} API。 + +go sdk位于`sdk`目录下,java sdk 在 https://github.com/layotto/java-sdk + +除了使用sdk调用Layotto提供的API,您也可以用任何您喜欢的语言、通过grpc直接和Layotto交互。 + +### 细节以后再说,继续体验其他API +通过左侧的导航栏,继续体验别的API吧! + +### Reference + + + + + +{{end}} +{{end}} +{{end}} \ No newline at end of file diff --git a/docs/src/pages/index.md b/docs/zh/README.md similarity index 85% rename from docs/src/pages/index.md rename to docs/zh/README.md index defd6ba739..50c1aaec9b 100644 --- a/docs/src/pages/index.md +++ b/docs/zh/README.md @@ -1,7 +1,8 @@ -# Layotto (L8): To be the next layer of OSI layer 7 - +
+

Layotto (L8): To be the next layer of OSI layer 7

+ -[![Layotto Env Pipeline 🌊](https://github.com/mosn/layotto/actions/workflows/proto-checker.yml/badge.svg)](https://github.com/mosn/layotto/actions/workflows/proto-checker.yml) +[![Layotto Env Pipeline 🌊](https://github.com/mosn/layotto/actions/workflows/quickstart-checker.yml/badge.svg)](https://github.com/mosn/layotto/actions/workflows/quickstart-checker.yml) [![Layotto Dev Pipeline 🌊](https://github.com/mosn/layotto/actions/workflows/layotto-ci.yml/badge.svg)](https://github.com/mosn/layotto/actions/workflows/layotto-ci.yml) [![GoDoc](https://godoc.org/mosn.io/layotto?status.svg)](https://godoc.org/mosn.io/layotto) @@ -9,7 +10,7 @@ [![codecov](https://codecov.io/gh/mosn/layotto/branch/main/graph/badge.svg?token=10RxwSV6Sz)](https://codecov.io/gh/mosn/layotto) [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/mosn/layotto.svg)](http://isitmaintained.com/project/mosn/layotto "Average time to resolve an issue") - +
Layotto(/leɪˈɒtəʊ/) 是一款使用 Golang 开发的应用运行时, 旨在帮助开发人员快速构建云原生应用,帮助应用和基础设施解耦。它为应用提供了各种分布式能力,比如状态管理,配置管理,事件发布订阅等能力,以简化应用的开发。 @@ -20,7 +21,7 @@ Layotto 以开源的 [MOSN](https://github.com/mosn/mosn) 为底座,在提供 Layotto 希望可以把 [Multi-Runtime](https://www.infoq.com/articles/multi-runtime-microservice-architecture/) 跟 Service Mesh 两者的能力结合起来,无论你是使用 MOSN 还是 Envoy 或者其他产品作为 Service Mesh 的数据面,都可以在不增加新的 sidecar 的前提下,使用 Layotto 为这些数据面追加 Runtime 的能力。 -例如,通过为 MOSN 添加 Runtime 能力,一个 Layotto 进程可以[既作为 istio 的数据面](/docs/start/istio/start) 又提供各种 Runtime API(例如 Configuration API,Pub/Sub API 等) +例如,通过为 MOSN 添加 Runtime 能力,一个 Layotto 进程可以[既作为 istio 的数据面](zh/start/istio/) 又提供各种 Runtime API(例如 Configuration API,Pub/Sub API 等) 此外,随着探索实践,我们发现 sidecar 能做的事情远不止于此。 通过引入[WebAssembly](https://en.wikipedia.org/wiki/WebAssembly) ,我们正在尝试将 Layotto 做成 FaaS (Function as a service) 的运行时容器 。 @@ -31,7 +32,7 @@ Mesh 两者的能力结合起来,无论你是使用 MOSN 还是 Envoy 或者 - 服务通信 - 服务治理,例如流量的劫持和观测,服务限流等 -- [作为 istio 的数据面](/docs/start/istio/start) +- [作为 istio 的数据面](zh/start/istio/) - 配置管理 - 状态管理 - 事件发布订阅 @@ -53,7 +54,7 @@ Layotto 提供了多种语言版本的 SDK,SDK 通过 gRPC 与 Layotto 进行 ### Get started with Layotto -您可以尝试以下 Quickstart demo,体验 Layotto 的功能;或者体验[线上实验室](/docs/start/lab) +您可以尝试以下 Quickstart demo,体验 Layotto 的功能;或者体验[线上实验室](zh/start/lab.md) ### API @@ -128,31 +129,31 @@ Layotto enriches the CNCF CLOUD N ## 社区 -| 平台 | 联系方式 | -| :------------------------------------------------- |:-----------------------------------------------------------------------------------------------------------------------------------------------| -| 💬 [钉钉](https://www.dingtalk.com/zh) (用户群) | 群号: 31912621 或者扫描下方二维码
| -| 💬 [钉钉](https://www.dingtalk.com/zh) (社区会议群) | 群号:41585216 [Layotto 在每周五晚 8 点进行社区会议,欢迎所有人](/docs/community/meeting) | +| 平台 | 联系方式 | +| :------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 💬 [钉钉](https://www.dingtalk.com/zh) (用户群) | 群号: 31912621 或者扫描下方二维码

| +| 💬 [钉钉](https://www.dingtalk.com/zh) (社区会议群) | 群号:41585216
[Layotto 在每周五晚 8 点进行社区会议,欢迎所有人](zh/community/meeting.md) | [comment]: <> (| 💬 [微信](https://www.wechat.com/) | 扫描下方二维码添加好友,她会邀请您加入微信群
) ## 如何贡献 -[新手攻略:从零开始成为 Layotto 贡献者](/docs/development/start-from-zero) +[新手攻略:从零开始成为 Layotto 贡献者](zh/development/start-from-zero.md) [从哪下手?看看"新手任务"列表](https://github.com/mosn/layotto/issues/108#issuecomment-872779356) 作为技术同学,你是否有过“想参与某个开源项目的开发、但是不知道从何下手”的感觉? 为了帮助大家更好的参与开源项目,社区会定期发布适合新手的新手开发任务,帮助大家 learning by doing! -[文档贡献指南](/docs/development/contributing-doc) +[文档贡献指南](zh/development/contributing-doc.md) -[组件开发指南](/docs/development/developing-component) +[组件开发指南](zh/development/developing-component.md) -[Layotto Github Workflow 指南](/docs/development/github-workflows) +[Layotto Github Workflow 指南](zh/development/github-workflows.md) -[Layotto 命令行指南](/docs/development/commands) +[Layotto 命令行指南](zh/development/commands.md) -[Layotto 贡献者指南](/docs/development/CONTRIBUTING) +[Layotto 贡献者指南](zh/development/CONTRIBUTING.md) ## 贡献者 @@ -164,17 +165,17 @@ Layotto enriches the
CNCF CLOUD N ## 设计文档 -[Actuator 设计文档](/docs/design/actuator/actuator-design-doc) +[Actuator 设计文档](zh/design/actuator/actuator-design-doc.md) -[Pubsub API 与 Dapr Component 的兼容性](/docs/design/pubsub/pubsub-api-and-compability-with-dapr-component) +[Pubsub API 与 Dapr Component 的兼容性](zh/design/pubsub/pubsub-api-and-compability-with-dapr-component.md) -[Configuration API with Apollo](/docs/design/configuration/configuration-api-with-apollo) +[Configuration API with Apollo](zh/design/configuration/configuration-api-with-apollo.md) -[RPC 设计文档](/docs/design/rpc/rpc_design_document) +[RPC 设计文档](zh/design/rpc/rpc设计文档.md) -[分布式锁 API 设计文档](/docs/design/lock/lock-api-design) +[分布式锁 API 设计文档](zh/design/lock/lock-api-design.md) -[FaaS 设计文档](/docs/design/faas/faas-poc-design) +[FaaS 设计文档](zh/design/faas/faas-poc-design.md) ## FAQ diff --git a/docs/zh/_navbar.md b/docs/zh/_navbar.md new file mode 100644 index 0000000000..4b8f5dfae5 --- /dev/null +++ b/docs/zh/_navbar.md @@ -0,0 +1 @@ +* [English](/en/README.md) \ No newline at end of file diff --git a/docs/zh/_sidebar.md b/docs/zh/_sidebar.md new file mode 100644 index 0000000000..c4121a26ee --- /dev/null +++ b/docs/zh/_sidebar.md @@ -0,0 +1,149 @@ +- [首页](/zh/README.md) +- [快速开始](/zh/start/) + - [使用State API](zh/start/state/start.md) + - 使用Configuration API + - [使用Apollo配置中心](zh/start/configuration/start-apollo.md) + - [使用Etcd配置中心](zh/start/configuration/start.md) + - [使用Nacos配置中心](zh/start/configuration/start-nacos.md) + - 发布、订阅消息 + - [使用Pub/Sub API](zh/start/pubsub/start.md) + - [(建设中) 使用 DelayQueue API](zh/start/delay_queue/start) + - [使用分布式锁 API](zh/start/lock/start.md) + - [使用Sequencer API生成分布式自增id](zh/start/sequencer/start.md) + - 使用 Secret API + - [查询 secrets](zh/start/secret/start.md) + - [在组件配置中引用 secret](zh/start/secret/secret_ref.md) + - 进行RPC调用 + - [Hello World](zh/start/rpc/helloworld.md) + - [Dubbo JSON RPC](zh/start/rpc/dubbo_json_rpc.md) + - 使用File API + - [基于Minio](zh/start/file/minio.md) + - [使用 OSS API](zh/start/oss/oss.md) + - [使用UDS通信](zh/start/uds/start.md) + + - [(建设中)使用 sms API](zh/start/sms/start) + - [(建设中)使用 cryption API](zh/start/cryption/start) + - [(建设中)使用 phone API](zh/start/phone/start) + - [(建设中)使用 email API](zh/start/email/start) + - [使用 lifecycle API](zh/start/lifecycle/start) + - API插件 + - [注册您自己的API](zh/start/api_plugin/helloworld.md) + - [自动生成 API 插件](zh/start/api_plugin/generate.md) + - 作为 Istio 的数据面 + - [集成 Istio 1.10.6 演示](zh/start/istio/) + - [集成 Istio 1.5.x 演示](zh/start/istio/start.md) + - 在四层网络进行流量干预 + - [Dump TCP 流量](zh/start/network_filter/tcpcopy.md) + - 在七层网络进行流量干预 + - [方法级别限流](zh/start/stream_filter/flow_control.md) + - [健康检查、查询运行时元数据](zh/start/actuator/start.md) + - 可观测性 + - [Trace, Metrics](zh/start/trace/trace.md) + - [Trace 接入 Skywalking](zh/start/trace/skywalking.md) + - [Trace 接入 Zipkin](zh/start/trace/zipkin.md) + - [Trace 接入 Jaeger](zh/start/trace/jaeger.md) + - [Metrics 接入 Prometheus](zh/start/trace/prometheus.md) + - [将业务逻辑通过 WASM 下沉进sidecar](zh/start/wasm/start.md) + - [基于 WASM 跟 Runtime 实现的 Faas 模型](zh/start/faas/start.md) +- [线上实验室](zh/start/lab.md) +- [用户手册](zh/building_blocks/) + - 功能介绍 + - [File API](zh/building_blocks/file/file.md) + - [Actuator API](zh/building_blocks/actuator/actuator.md) + - [State API](zh/building_blocks/state/reference.md) + - [Sequencer API](zh/building_blocks/sequencer/reference.md) + - [Distributed Lock API](zh/building_blocks/lock/reference.md) + - [Pub/Sub API](zh/building_blocks/pubsub/reference.md) + - [RPC API](zh/building_blocks/rpc/reference.md) + - [Configuration API](zh/building_blocks/configuration/reference.md) + - 可扩展性 + - [API插件](zh/design/api_plugin/design.md) + - [pluggable component 组件](zh/design/pluggable/usage.md) + - [gRPC API 接口文档](zh/api_reference/README.md) + - SDK文档 + - [java sdk](https://github.com/layotto/java-sdk) + - [.net sdk](https://github.com/layotto/dotnet-sdk) + - [js sdk](https://github.com/layotto/js-sdk) + - [go sdk](zh/sdk_reference/go/start.md) +- 运维手册 + - [如何配置 Layotto](zh/configuration/) + - [Layotto 配置文件介绍](zh/configuration/overview.md) + - [组件配置说明](zh/component_specs/overview.md) + - [State](zh/component_specs/state/common.md) + - [Redis](zh/component_specs/state/redis.md) + - [其他组件](zh/component_specs/state/others.md) + - [Pub/Sub](zh/component_specs/pubsub/common.md) + - [Redis](zh/component_specs/pubsub/redis.md) + - [其他组件](zh/component_specs/pubsub/others.md) + - [Distributed Lock](zh/component_specs/lock/common.md) + - [Redis](zh/component_specs/lock/redis.md) + - [Etcd](zh/component_specs/lock/etcd.md) + - [Zookeeper](zh/component_specs/lock/zookeeper.md) + - [Consul](zh/component_specs/lock/consul.md) + - [MongoDB](zh/component_specs/lock/mongo.md) + - Configuration + - [Etcd](zh/component_specs/configuration/etcd.md) + - [Apollo](zh/component_specs/configuration/apollo.md) + - [Nacos](zh/component_specs/configuration/nacos.md) + - [File](zh/component_specs/file/common.md) + - [OSS](zh/component_specs/file/oss.md) + - [Sequencer](zh/component_specs/sequencer/common.md) + - [Etcd](zh/component_specs/sequencer/etcd.md) + - [Redis](zh/component_specs/sequencer/redis.md) + - [Zookeeper](zh/component_specs/sequencer/zookeeper.md) + - [MongoDB](zh/component_specs/sequencer/mongo.md) + - [Mysql](zh/component_specs/sequencer/mysql.md) + - [Snowflake](zh/component_specs/sequencer/snowflake.md) + - [Secret Store](zh/component_specs/secret/common.md) + - [自定义组件](zh/component_specs/custom/common.md) + - [如何部署、升级 Layotto](zh/operation/) + - [Layotto sidecar injector](zh/operation/sidecar_injector.md) + - [如何本地开发、本地调试](zh/operation/local.md) +- 设计文档 + - [动态配置下发、组件热重载](zh/design/lifecycle/apply_configuration.md) + - [Actuator设计文档](zh/design/actuator/actuator-design-doc.md) + - [gRPC框架设计文档](zh/design/actuator/grpc-design-doc.md) + - [Configuration API with Apollo](zh/design/configuration/configuration-api-with-apollo.md) + - [Pub/Sub API以及与dapr component的兼容性](zh/design/pubsub/pubsub-api-and-compability-with-dapr-component.md) + - [RPC设计文档](zh/design/rpc/rpc设计文档.md) + - [分布式锁API设计文档](zh/design/lock/lock-api-design.md) + - [Sequencer API设计文档](zh/design/sequencer/design.md) + - [File API设计文档](zh/design/file/file-design.md) + - [FaaS 设计文档](zh/design/faas/faas-poc-design.md) + - [API插件](zh/design/api_plugin/design.md) + - [支持Dapr API](zh/design/api_plugin/dapr_api.md) + - [OSS API设计文档](zh/design/oss/design.md) + - [pluggable component 设计文档](zh/design/pluggable/design.md) +- 贡献指南 + - [Layotto 贡献指南](zh/development/CONTRIBUTING.md) + - [新手攻略:从零开始成为 Layotto 贡献者](zh/development/start-from-zero.md) + - 想要贡献文档? + - [文档贡献指南](zh/development/contributing-doc.md) + - [使用工具自动测试 Quickstart 文档](zh/development/test-quickstart.md) + - [想要开发新的组件?](zh/development/developing-component.md) + - [组件引用开发指南](zh/development/component_ref/component_ref.md) + - 想要修改proto文件或API定义? + - [如何基于proto文件生成代码、接口文档](zh/api_reference/how_to_generate_api_doc.md) + - [proto文件注释规范](zh/api_reference/comment_spec_of_proto.md) + - [新增API时的开发规范](zh/development/developing-api.md) + - [Layotto 四大 Github Workflows 说明](zh/development/github-workflows.md) + - [Layotto 命令行工具指南](zh/development/commands.md) + - 如何给 issue 打 label + - [新手任务 (good first issue) 的 label 规范](zh/development/label-spec.md) + - [发布手册](zh/development/release-guide.md) + - [待解决的问题](zh/development/problems-to-solve.md) +- 社区 + - [社区会议](zh/community/meeting.md) + - [SOFAStack & MOSN 社区角色说明](zh/community/governance.md) + - [Layotto社区晋升规则](zh/community/promote.md) + - [Layotto社区成员](zh/community/people.md) +- 博客 + - [蚂蚁云原生应用运行时的探索和实践 - ArchSummit 上海](zh/blog/exploration-and-practice-of-antcloud-native-application-runtime-archsummit-shanghai.md) + - [MOSN子项目Layotto:开启服务网格+应用运行时新篇章](zh/blog/mosn-subproject-layotto-opening-a-new-chapter-in-service-grid-application-runtime/index.md) + - 源码分析 + - [启动流程](zh/blog/code/start_process/start_process.md) + - [处理 RPC 请求](zh/blog/code/layotto-rpc/index.md) + - [WebAssembly 相关](zh/blog/code/webassembly/index.md) + - [7层流量治理,接口限流](zh/blog/code/flowcontrol/flowcontrol_code_analyze.md) + - [源码解析 4层流量治理,tcp流量dump](zh/blog/tcpcopy_code_analyze.md) +- [视频合集](zh/video/README.md) diff --git a/docs/docs/api_reference/README.md b/docs/zh/api_reference/README.md similarity index 100% rename from docs/docs/api_reference/README.md rename to docs/zh/api_reference/README.md diff --git a/docs/docs/api_reference/comment_spec_of_proto.md b/docs/zh/api_reference/comment_spec_of_proto.md similarity index 100% rename from docs/docs/api_reference/comment_spec_of_proto.md rename to docs/zh/api_reference/comment_spec_of_proto.md diff --git a/docs/docs/api_reference/how_to_generate_api_doc.md b/docs/zh/api_reference/how_to_generate_api_doc.md similarity index 100% rename from docs/docs/api_reference/how_to_generate_api_doc.md rename to docs/zh/api_reference/how_to_generate_api_doc.md diff --git a/docs/blog/code/flowcontrol/flowcontrol_code_analyze.md b/docs/zh/blog/code/flowcontrol/flowcontrol_code_analyze.md similarity index 100% rename from docs/blog/code/flowcontrol/flowcontrol_code_analyze.md rename to docs/zh/blog/code/flowcontrol/flowcontrol_code_analyze.md diff --git a/docs/blog/code/layotto-rpc/index.md b/docs/zh/blog/code/layotto-rpc/index.md similarity index 99% rename from docs/blog/code/layotto-rpc/index.md rename to docs/zh/blog/code/layotto-rpc/index.md index 359a4e8e85..698ce36cac 100644 --- a/docs/blog/code/layotto-rpc/index.md +++ b/docs/zh/blog/code/layotto-rpc/index.md @@ -935,10 +935,7 @@ func (p *parser) recvMsg(maxReceiveMessageSize int) (pf payloadFormat, msg []byt ``` 最终收到返回数据: - -```json {"jsonrpc":"2.0","id":9527,"result":{"id":"113","name":"Moorse","age":30,"time":703394193,"sex":"MAN"}} -``` ## 总结 Layotto RPC 处理流程涉及 GRPC、Dapr、Mosn 等相关的知识,整体流程较长,不过单纯看 Layotto 针对 Mosn 抽象的轻量 RPC 框架还是比较清晰和简单的,与 Mosn 集成的方式也比较新颖,值得进一步研读。至此 Layotto RPC 请求处理就分析完了,时间有限,没有进行一些更全面和深入的剖析,如有纰漏之处,欢迎指正,联系方式:rayo.wangzl@gmail.com。另外在此也希望大家能踊跃参与源码分析和开源社区来,一起学习,共同进步。 diff --git a/docs/blog/code/start_process/start_process.md b/docs/zh/blog/code/start_process/start_process.md similarity index 100% rename from docs/blog/code/start_process/start_process.md rename to docs/zh/blog/code/start_process/start_process.md diff --git a/docs/blog/code/webassembly/index.md b/docs/zh/blog/code/webassembly/index.md similarity index 100% rename from docs/blog/code/webassembly/index.md rename to docs/zh/blog/code/webassembly/index.md diff --git a/docs/blog/exploration-and-practice-of-antcloud-native-application-runtime-archsummit-shanghai.md b/docs/zh/blog/exploration-and-practice-of-antcloud-native-application-runtime-archsummit-shanghai.md similarity index 100% rename from docs/blog/exploration-and-practice-of-antcloud-native-application-runtime-archsummit-shanghai.md rename to docs/zh/blog/exploration-and-practice-of-antcloud-native-application-runtime-archsummit-shanghai.md diff --git a/docs/blog/mosn-subproject-layotto-opening-a-new-chapter-in-service-grid-application-runtime/index.md b/docs/zh/blog/mosn-subproject-layotto-opening-a-new-chapter-in-service-grid-application-runtime/index.md similarity index 100% rename from docs/blog/mosn-subproject-layotto-opening-a-new-chapter-in-service-grid-application-runtime/index.md rename to docs/zh/blog/mosn-subproject-layotto-opening-a-new-chapter-in-service-grid-application-runtime/index.md diff --git a/docs/blog/tcpcopy_code_analyze.md b/docs/zh/blog/tcpcopy_code_analyze.md similarity index 100% rename from docs/blog/tcpcopy_code_analyze.md rename to docs/zh/blog/tcpcopy_code_analyze.md diff --git a/docs/docs/building_blocks/README.md b/docs/zh/building_blocks/README.md similarity index 100% rename from docs/docs/building_blocks/README.md rename to docs/zh/building_blocks/README.md diff --git a/docs/docs/building_blocks/actuator/actuator.md b/docs/zh/building_blocks/actuator/actuator.md similarity index 89% rename from docs/docs/building_blocks/actuator/actuator.md rename to docs/zh/building_blocks/actuator/actuator.md index f2601b1739..7efcba4451 100644 --- a/docs/docs/building_blocks/actuator/actuator.md +++ b/docs/zh/building_blocks/actuator/actuator.md @@ -1,4 +1,4 @@ -# 执行器 Http API +# Actuator Http API Layotto Actuator API提供健康检查、查看运行时元数据等功能,用于查看Layotto和app的健康状况、运行时元数据,支持集成进开源基础设施(例如可以集成进k8s健康检查) @@ -50,7 +50,7 @@ var ( ) ``` -注:默认情况下,接口只会返回Layotto的健康状态,如果希望接口也返回App的健康状态,需要开发一个回调App的插件。您可以参考[Actuator的设计文档](/docs/design/actuator/actuator-design-doc.md) ,或者直接联系我们,为您提供详细的解释。 +注:默认情况下,接口只会返回Layotto的健康状态,如果希望接口也返回App的健康状态,需要开发一个回调App的插件。您可以参考[Actuator的设计文档](zh/design/actuator/actuator-design-doc.md) ,或者直接联系我们,为您提供详细的解释。 ### /actuator/health/readiness @@ -77,7 +77,7 @@ GET,不需要传参 } ``` -注:默认情况下,接口只会返回Layotto的健康状态,如果希望接口也返回App的健康状态,需要开发一个回调App的插件。您可以参考[Actuator的设计文档](/docs/design/actuator/actuator-design-doc.md) ,或者直接联系我们,为您提供详细的解释。 +注:默认情况下,接口只会返回Layotto的健康状态,如果希望接口也返回App的健康状态,需要开发一个回调App的插件。您可以参考[Actuator的设计文档](zh/design/actuator/actuator-design-doc.md) ,或者直接联系我们,为您提供详细的解释。 ## 2. 查询运行时元数据API @@ -109,7 +109,7 @@ GET Actuator采用插件化架构,您也可以按需添加自己的插件,让API返回您关注的运行时元数据 -注:默认情况下,接口只会返回Layotto的运行时元数据,如果希望接口也返回App的运行时元数据,需要开发一个回调App的插件。您可以参考[Actuator的设计文档](/docs/design/actuator/actuator-design-doc.md) ,或者直接联系我们,为您提供详细的解释。 +注:默认情况下,接口只会返回Layotto的运行时元数据,如果希望接口也返回App的运行时元数据,需要开发一个回调App的插件。您可以参考[Actuator的设计文档](zh/design/actuator/actuator-design-doc.md) ,或者直接联系我们,为您提供详细的解释。 ## 3. API路径解释 @@ -139,4 +139,4 @@ Actuator API的路径采用restful风格,不同的Endpoint注册进Actuator后 ``` ## 4. API使用示例 -您可以查看[Quick start文档](/docs/start/actuator/start.md) +您可以查看[Quick start文档](zh/start/actuator/start.md) diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/configuration/reference.md b/docs/zh/building_blocks/configuration/reference.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/building_blocks/configuration/reference.md rename to docs/zh/building_blocks/configuration/reference.md diff --git a/docs/docs/building_blocks/file/file.md b/docs/zh/building_blocks/file/file.md similarity index 97% rename from docs/docs/building_blocks/file/file.md rename to docs/zh/building_blocks/file/file.md index 9ea6c6371d..4933dbd902 100644 --- a/docs/docs/building_blocks/file/file.md +++ b/docs/zh/building_blocks/file/file.md @@ -9,7 +9,7 @@ File api 用于实现文件操作。应用程序可以通过该接口对文件 File api定义在 [runtime.proto](https://github.com/mosn/layotto/blob/main/spec/proto/runtime/v1/runtime.proto) 。应用可以通过grpc调用 对应的File api,实现文件的操作。 -该接口在使用前需要进行配置。不同的文件系统可能配置不同,用户可根据自己的文件系统进行配置。比如OSS详细配置项可参考 [OSS组件文档](/docs/component_specs/file/oss.md) +该接口在使用前需要进行配置。不同的文件系统可能配置不同,用户可根据自己的文件系统进行配置。比如OSS详细配置项可参考 [OSS组件文档](en/component_specs/file/oss.md) ### 例子 diff --git a/docs/docs/building_blocks/lock/reference.md b/docs/zh/building_blocks/lock/reference.md similarity index 94% rename from docs/docs/building_blocks/lock/reference.md rename to docs/zh/building_blocks/lock/reference.md index cc9e2965a3..ee392146d4 100644 --- a/docs/docs/building_blocks/lock/reference.md +++ b/docs/zh/building_blocks/lock/reference.md @@ -5,10 +5,10 @@ ## 如何使用分布式锁 API 您可以通过grpc调用分布式锁 API,接口定义在[runtime.proto](https://github.com/mosn/layotto/blob/main/spec/proto/runtime/v1/runtime.proto) 中。 -使用前需要先对组件进行配置,详细的配置说明见[分布式锁组件文档](/docs/component_specs/lock/common.md) +使用前需要先对组件进行配置,详细的配置说明见[分布式锁组件文档](zh/component_specs/lock/common.md) ### 使用示例 -Layotto client sdk封装了grpc调用的逻辑,使用sdk调用分布式锁 API的示例可以参考[快速开始:使用分布式锁API](/docs/start/lock/start.md) +Layotto client sdk封装了grpc调用的逻辑,使用sdk调用分布式锁 API的示例可以参考[快速开始:使用分布式锁API](zh/start/lock/start.md) ### TryLock @@ -77,4 +77,4 @@ req.LockOwner = uuid.New().String() 为避免文档和代码不一致,详细入参和返回值请参考[proto文件](https://github.com/mosn/layotto/blob/main/spec/proto/runtime/v1/runtime.proto) ## 为什么分布式锁 API被设计成这样 -如果您对实现原理、设计逻辑感兴趣,可以查阅[分布式锁API设计文档](/docs/design/lock/lock-api-design) \ No newline at end of file +如果您对实现原理、设计逻辑感兴趣,可以查阅[分布式锁API设计文档](zh/design/lock/lock-api-design) \ No newline at end of file diff --git a/docs/docs/building_blocks/pubsub/reference.md b/docs/zh/building_blocks/pubsub/reference.md similarity index 96% rename from docs/docs/building_blocks/pubsub/reference.md rename to docs/zh/building_blocks/pubsub/reference.md index cf97d0e503..56d092b4bb 100644 --- a/docs/docs/building_blocks/pubsub/reference.md +++ b/docs/zh/building_blocks/pubsub/reference.md @@ -20,10 +20,10 @@ Pub/Sub API 提供至少一次(at-least-once)的保证,并与各种消息 ## 如何使用Pub/Sub API 您可以通过grpc调用Pub/Sub API,接口定义在[runtime.proto](https://github.com/mosn/layotto/blob/main/spec/proto/runtime/v1/runtime.proto) 中。 -使用前需要先对组件进行配置,详细的配置说明见[发布/订阅组件文档](/docs/component_specs/pubsub/common.md) +使用前需要先对组件进行配置,详细的配置说明见[发布/订阅组件文档](zh/component_specs/pubsub/common.md) ### 使用示例 -Layotto client sdk封装了grpc调用的逻辑,使用sdk调用Pub/Sub API的示例可以参考[快速开始:使用Pub/Sub API](/docs/start/pubsub/start.md) +Layotto client sdk封装了grpc调用的逻辑,使用sdk调用Pub/Sub API的示例可以参考[快速开始:使用Pub/Sub API](zh/start/pubsub/start.md) ### PublishEvent 用于发布事件到指定topic diff --git a/docs/docs/building_blocks/rpc/reference.md b/docs/zh/building_blocks/rpc/reference.md similarity index 100% rename from docs/docs/building_blocks/rpc/reference.md rename to docs/zh/building_blocks/rpc/reference.md diff --git a/docs/docs/building_blocks/sequencer/reference.md b/docs/zh/building_blocks/sequencer/reference.md similarity index 96% rename from docs/docs/building_blocks/sequencer/reference.md rename to docs/zh/building_blocks/sequencer/reference.md index 51e7eade76..767eff90cc 100644 --- a/docs/docs/building_blocks/sequencer/reference.md +++ b/docs/zh/building_blocks/sequencer/reference.md @@ -36,9 +36,9 @@ select * from message order by message-id limit 100 ## 如何使用Sequencer API 您可以通过grpc调用Sequencer API,接口定义在[runtime.proto](https://github.com/mosn/layotto/blob/main/spec/proto/runtime/v1/runtime.proto) 中。 -Layotto client sdk封装了grpc调用的逻辑,使用sdk调用Sequencer API的示例可以参考[快速开始:使用Sequencer API](/docs/start/sequencer/start.md) +Layotto client sdk封装了grpc调用的逻辑,使用sdk调用Sequencer API的示例可以参考[快速开始:使用Sequencer API](zh/start/sequencer/start.md) -使用前需要先对组件进行配置,详细的配置说明见[Sequencer组件文档](/docs/component_specs/sequencer/common.md) +使用前需要先对组件进行配置,详细的配置说明见[Sequencer组件文档](zh/component_specs/sequencer/common.md) ### Get next unique id diff --git a/docs/docs/building_blocks/state/reference.md b/docs/zh/building_blocks/state/reference.md similarity index 97% rename from docs/docs/building_blocks/state/reference.md rename to docs/zh/building_blocks/state/reference.md index 28768c527a..558ad18cbf 100644 --- a/docs/docs/building_blocks/state/reference.md +++ b/docs/zh/building_blocks/state/reference.md @@ -20,10 +20,10 @@ API支持批量CRUD操作,支持声明对并发安全和数据一致性的要 ## 如何使用State API 您可以通过grpc调用State API,接口定义在[runtime.proto](https://github.com/mosn/layotto/blob/main/spec/proto/runtime/v1/runtime.proto) 中。 -使用前需要先对组件进行配置,详细的配置说明见[状态管理组件文档](/docs/component_specs/state/common.md) +使用前需要先对组件进行配置,详细的配置说明见[状态管理组件文档](zh/component_specs/state/common.md) ### 使用示例 -Layotto client sdk封装了grpc调用的逻辑,使用sdk调用State API的示例可以参考[快速开始:使用State API](/docs/start/state/start.md) +Layotto client sdk封装了grpc调用的逻辑,使用sdk调用State API的示例可以参考[快速开始:使用State API](zh/start/state/start.md) ### Save state diff --git a/docs/docs/community/governance.md b/docs/zh/community/governance.md similarity index 100% rename from docs/docs/community/governance.md rename to docs/zh/community/governance.md diff --git a/docs/docs/community/meeting.md b/docs/zh/community/meeting.md similarity index 100% rename from docs/docs/community/meeting.md rename to docs/zh/community/meeting.md diff --git a/docs/docs/community/people.md b/docs/zh/community/people.md similarity index 92% rename from docs/docs/community/people.md rename to docs/zh/community/people.md index 3fa745a385..30df31686d 100644 --- a/docs/docs/community/people.md +++ b/docs/zh/community/people.md @@ -30,4 +30,4 @@ https://github.com/mosn/layotto/discussions/categories/announcements ## 晋升规则 -见[Layotto社区晋升规则](/docs/community/promote.md) \ No newline at end of file +见[Layotto社区晋升规则](zh/community/promote.md) \ No newline at end of file diff --git a/docs/docs/community/promote.md b/docs/zh/community/promote.md similarity index 100% rename from docs/docs/community/promote.md rename to docs/zh/community/promote.md diff --git a/docs/docs/component_specs/configuration/apollo.md b/docs/zh/component_specs/configuration/apollo.md similarity index 96% rename from docs/docs/component_specs/configuration/apollo.md rename to docs/zh/component_specs/configuration/apollo.md index 545676d000..709b484e66 100644 --- a/docs/docs/component_specs/configuration/apollo.md +++ b/docs/zh/component_specs/configuration/apollo.md @@ -2,7 +2,7 @@ ## 配置项说明 示例:configs/config_apollo.json -![img.png](/img/configuration/apollo/img.png) +![img.png](../../../img/configuration/apollo/img.png) | 字段 | 必填 | 说明 | | --- | --- | --- | diff --git a/docs/docs/component_specs/configuration/etcd.md b/docs/zh/component_specs/configuration/etcd.md similarity index 100% rename from docs/docs/component_specs/configuration/etcd.md rename to docs/zh/component_specs/configuration/etcd.md diff --git a/docs/docs/component_specs/configuration/nacos.md b/docs/zh/component_specs/configuration/nacos.md similarity index 79% rename from docs/docs/component_specs/configuration/nacos.md rename to docs/zh/component_specs/configuration/nacos.md index 4561f272df..1f8a8d3ead 100644 --- a/docs/docs/component_specs/configuration/nacos.md +++ b/docs/zh/component_specs/configuration/nacos.md @@ -4,20 +4,20 @@ 示例:configs/config_nacos.json -| 字段 | 必填 | 说明 | -|-----------------------|-----|----------------------------------------------------------------------------------------------------------------------------------| -| address | Y | nacos 服务地址,填写 模式即可。默认使用 `/nacos` 作为 url context,使用 http 作为连接协议。如果配置文件中没有填写 acm 连接字段,则这个字段是必填字段。可以填写多个 address 地址进行连接。 | -| timeout | N | 连接 nacos 服务的超时时间,单位秒。默认 10s. | -| metadata.namespace_id | N | nacos 命名空间,用于配置文件在命名空间级别的隔离。默认为空,代表使用 nacos 的 default 命名空间。 | -| metadata.username | N | nacos 服务 auth 校验所需的用户名。 | -| metadata.password | N | nacos 服务 auth 校验所需的密码。 | -| metadata.end_point | N | acm 模式字段,表示连接的nacos服务地址,[参考文档](https://help.aliyun.com/document_detail/130146.html) | -| metadata.region_id | N | acm 模式字段,表示 nacos 服务所在区域。 | -| metadata.access_key | N | acm 模式字段,表示阿里云 nacos 服务中的 access key。 | -| metadata.secret_key | N | acm 模式字段,表示阿里云 nacos 服务中的 secret key。 | -| metadata.log_dir | N | nacos go sdk 输出日志文件目录地址。默认目录名称为`/tmp/layotto/nacos/logs`,默认日志名称为`nacos-sdk.log`。 | -| metadata.log_level | N | nacos go sdk 输出日志等级。支持日志等级为 `debug`,`info`,`warn`,`error`。默认日志等级为`debug`。 | -| metadata.cache_dir | N | nacos 配置本地缓存文件路径。默认缓存路径为`/tmp/layotto/nacos/cache`。 | +| 字段 | 必填 | 说明 | +|-----------------------|-----|---------------------------------------------------------------------------------------------------------------------------------| +| address | Y | nacos 服务地址,填写 模式即可。默认使用 `/nacos` 作为 url context,使用 http 作为连接协议。如果配置文件中没有填写 acm 连接字段,则这个字段是必填字段。可以填写多个 address 地址进行连接。 | +| timeout | N | 连接 nacos 服务的超时时间,单位秒。默认 10s. | +| metadata.namespace_id | N | nacos 命名空间,用于配置文件在命名空间级别的隔离。默认为空,代表使用 nacos 的 default 命名空间。 | +| metadata.username | N | nacos 服务 auth 校验所需的用户名。 | +| metadata.password | N | nacos 服务 auth 校验所需的密码。 | +| metadata.end_point | N | acm 模式字段,表示连接的nacos服务地址,[参考文档](https://help.aliyun.com/document_detail/130146.html) | +| metadata.region_id | N | acm 模式字段,表示 nacos 服务所在区域。 | +| metadata.access_key | N | acm 模式字段,表示阿里云 nacos 服务中的 access key。 | +| metadata.secret_key | N | acm 模式字段,表示阿里云 nacos 服务中的 secret key。 | +| metadata.log_dir | N | nacos go sdk 输出日志文件目录地址。默认目录名称为`/tmp/layotto/nacos/logs`,默认日志名称为`nacos-sdk.log`。 | +| metadata.log_level | N | nacos go sdk 输出日志等级。支持日志等级为 `debug`,`info`,`warn`,`error`。默认日志等级为`debug`。 | +| metadata.cache_dir | N | nacos 配置本地缓存文件路径。默认缓存路径为`/tmp/layotto/nacos/cache`。 | > 当有任一 acm 字段出现在配置文件中,则 layotto 采用 acm 模式连接到 nacos 服务,忽略 address、username、password 等字段。 @@ -27,7 +27,7 @@ 不过不是添加在 nacos configstore 组件的配置里,添加在而外的配置项中,方便其他需要使用 `app_id` 的组件复用。 -![img.png](/img/configuration/nacos/img.png) +![img.png](../../../img/configuration/nacos/img.png) ## 怎么启动 Nacos diff --git a/docs/docs/component_specs/custom/common.md b/docs/zh/component_specs/custom/common.md similarity index 82% rename from docs/docs/component_specs/custom/common.md rename to docs/zh/component_specs/custom/common.md index 0cd1e92e29..df970fc5f8 100644 --- a/docs/docs/component_specs/custom/common.md +++ b/docs/zh/component_specs/custom/common.md @@ -8,7 +8,7 @@ Layotto 中的组件分为两种: - 自定义组件 -允许您自己扩展自己的组件,比如[使用指南](/docs/design/api_plugin/design?id=_24-使用指南) 中的 `HelloWorld` 组件。 +允许您自己扩展自己的组件,比如[使用指南](zh/design/api_plugin/design?id=_24-使用指南) 中的 `HelloWorld` 组件。 ## 配置文件结构 @@ -51,4 +51,4 @@ Layotto 中的组件分为两种: ## 如何使用"自定义组件"? -详见 [使用指南](/docs/design/api_plugin/design?id=_24-使用指南) \ No newline at end of file +详见 [使用指南](zh/design/api_plugin/design?id=_24-使用指南) \ No newline at end of file diff --git a/docs/docs/component_specs/file/common.md b/docs/zh/component_specs/file/common.md similarity index 100% rename from docs/docs/component_specs/file/common.md rename to docs/zh/component_specs/file/common.md diff --git a/docs/docs/component_specs/file/oss.md b/docs/zh/component_specs/file/oss.md similarity index 100% rename from docs/docs/component_specs/file/oss.md rename to docs/zh/component_specs/file/oss.md diff --git a/docs/docs/component_specs/file/qiniu_oss.md b/docs/zh/component_specs/file/qiniu_oss.md similarity index 100% rename from docs/docs/component_specs/file/qiniu_oss.md rename to docs/zh/component_specs/file/qiniu_oss.md diff --git a/docs/docs/component_specs/file/tencentcloud_oss.md b/docs/zh/component_specs/file/tencentcloud_oss.md similarity index 96% rename from docs/docs/component_specs/file/tencentcloud_oss.md rename to docs/zh/component_specs/file/tencentcloud_oss.md index 8385528300..e86997c2ef 100644 --- a/docs/docs/component_specs/file/tencentcloud_oss.md +++ b/docs/zh/component_specs/file/tencentcloud_oss.md @@ -19,7 +19,7 @@ 访问 https://console.cloud.tencent.com/cos/bucket 创建存储桶 -![](/img/file/create_tencent_oss_bucket.png) +![](../../../img/file/create_tencent_oss_bucket.png) 3.创建 AK 和 SK diff --git a/docs/docs/component_specs/lock/common.md b/docs/zh/component_specs/lock/common.md similarity index 100% rename from docs/docs/component_specs/lock/common.md rename to docs/zh/component_specs/lock/common.md diff --git a/docs/docs/component_specs/lock/consul.md b/docs/zh/component_specs/lock/consul.md similarity index 100% rename from docs/docs/component_specs/lock/consul.md rename to docs/zh/component_specs/lock/consul.md diff --git a/docs/docs/component_specs/lock/etcd.md b/docs/zh/component_specs/lock/etcd.md similarity index 100% rename from docs/docs/component_specs/lock/etcd.md rename to docs/zh/component_specs/lock/etcd.md diff --git a/docs/docs/component_specs/lock/in-memory.md b/docs/zh/component_specs/lock/in-memory.md similarity index 100% rename from docs/docs/component_specs/lock/in-memory.md rename to docs/zh/component_specs/lock/in-memory.md diff --git a/docs/docs/component_specs/lock/mongo.md b/docs/zh/component_specs/lock/mongo.md similarity index 100% rename from docs/docs/component_specs/lock/mongo.md rename to docs/zh/component_specs/lock/mongo.md diff --git a/docs/docs/component_specs/lock/redis.md b/docs/zh/component_specs/lock/redis.md similarity index 100% rename from docs/docs/component_specs/lock/redis.md rename to docs/zh/component_specs/lock/redis.md diff --git a/docs/docs/component_specs/lock/zookeeper.md b/docs/zh/component_specs/lock/zookeeper.md similarity index 100% rename from docs/docs/component_specs/lock/zookeeper.md rename to docs/zh/component_specs/lock/zookeeper.md diff --git a/docs/docs/component_specs/overview.md b/docs/zh/component_specs/overview.md similarity index 100% rename from docs/docs/component_specs/overview.md rename to docs/zh/component_specs/overview.md diff --git a/docs/docs/component_specs/pubsub/common.md b/docs/zh/component_specs/pubsub/common.md similarity index 100% rename from docs/docs/component_specs/pubsub/common.md rename to docs/zh/component_specs/pubsub/common.md diff --git a/docs/docs/component_specs/pubsub/others.md b/docs/zh/component_specs/pubsub/others.md similarity index 100% rename from docs/docs/component_specs/pubsub/others.md rename to docs/zh/component_specs/pubsub/others.md diff --git a/docs/docs/component_specs/pubsub/redis.md b/docs/zh/component_specs/pubsub/redis.md similarity index 100% rename from docs/docs/component_specs/pubsub/redis.md rename to docs/zh/component_specs/pubsub/redis.md diff --git a/docs/docs/component_specs/secret/common.md b/docs/zh/component_specs/secret/common.md similarity index 100% rename from docs/docs/component_specs/secret/common.md rename to docs/zh/component_specs/secret/common.md diff --git a/docs/docs/component_specs/sequencer/common.md b/docs/zh/component_specs/sequencer/common.md similarity index 100% rename from docs/docs/component_specs/sequencer/common.md rename to docs/zh/component_specs/sequencer/common.md diff --git a/docs/docs/component_specs/sequencer/etcd.md b/docs/zh/component_specs/sequencer/etcd.md similarity index 100% rename from docs/docs/component_specs/sequencer/etcd.md rename to docs/zh/component_specs/sequencer/etcd.md diff --git a/docs/docs/component_specs/sequencer/in-memory.md b/docs/zh/component_specs/sequencer/in-memory.md similarity index 100% rename from docs/docs/component_specs/sequencer/in-memory.md rename to docs/zh/component_specs/sequencer/in-memory.md diff --git a/docs/docs/component_specs/sequencer/mongo.md b/docs/zh/component_specs/sequencer/mongo.md similarity index 100% rename from docs/docs/component_specs/sequencer/mongo.md rename to docs/zh/component_specs/sequencer/mongo.md diff --git a/docs/docs/component_specs/sequencer/mysql.md b/docs/zh/component_specs/sequencer/mysql.md similarity index 100% rename from docs/docs/component_specs/sequencer/mysql.md rename to docs/zh/component_specs/sequencer/mysql.md diff --git a/docs/docs/component_specs/sequencer/redis.md b/docs/zh/component_specs/sequencer/redis.md similarity index 100% rename from docs/docs/component_specs/sequencer/redis.md rename to docs/zh/component_specs/sequencer/redis.md diff --git a/docs/docs/component_specs/sequencer/snowflake.md b/docs/zh/component_specs/sequencer/snowflake.md similarity index 100% rename from docs/docs/component_specs/sequencer/snowflake.md rename to docs/zh/component_specs/sequencer/snowflake.md diff --git a/docs/docs/component_specs/sequencer/zookeeper.md b/docs/zh/component_specs/sequencer/zookeeper.md similarity index 100% rename from docs/docs/component_specs/sequencer/zookeeper.md rename to docs/zh/component_specs/sequencer/zookeeper.md diff --git a/docs/docs/component_specs/state/common.md b/docs/zh/component_specs/state/common.md similarity index 100% rename from docs/docs/component_specs/state/common.md rename to docs/zh/component_specs/state/common.md diff --git a/docs/docs/component_specs/state/others.md b/docs/zh/component_specs/state/others.md similarity index 100% rename from docs/docs/component_specs/state/others.md rename to docs/zh/component_specs/state/others.md diff --git a/docs/docs/component_specs/state/redis.md b/docs/zh/component_specs/state/redis.md similarity index 100% rename from docs/docs/component_specs/state/redis.md rename to docs/zh/component_specs/state/redis.md diff --git a/docs/docs/configuration/README.md b/docs/zh/configuration/README.md similarity index 100% rename from docs/docs/configuration/README.md rename to docs/zh/configuration/README.md diff --git a/docs/docs/configuration/overview.md b/docs/zh/configuration/overview.md similarity index 93% rename from docs/docs/configuration/overview.md rename to docs/zh/configuration/overview.md index 8bb6244d43..4549f6a174 100644 --- a/docs/docs/configuration/overview.md +++ b/docs/zh/configuration/overview.md @@ -3,7 +3,7 @@ Layotto 启动时需要读取一个 json 格式的配置文件。示例配置文 目前,Layotto使用一个MOSN 4层filter与MOSN集成、跑在MOSN上,**所以Layotto用到的配置文件其实就是MOSN配置文件。** -![img.png](/img/configuration/layotto/img.png) +![img.png](../../img/configuration/layotto/img.png) 如上图示例,大部分配置是MOSN的配置项,参考[MOSN的配置说明](https://mosn.io/docs/configuration/) ; @@ -36,4 +36,4 @@ Layotto 启动时需要读取一个 json 格式的配置文件。示例配置文 } ``` -至于每个API NAME填啥、每个组件名是啥、组件能配哪些Key/Value配置项,您可以查阅[组件配置说明](/docs/component_specs/overview) \ No newline at end of file +至于每个API NAME填啥、每个组件名是啥、组件能配哪些Key/Value配置项,您可以查阅[组件配置说明](zh/component_specs/overview) \ No newline at end of file diff --git a/docs/docs/design/actuator/actuator-design-doc.md b/docs/zh/design/actuator/actuator-design-doc.md similarity index 95% rename from docs/docs/design/actuator/actuator-design-doc.md rename to docs/zh/design/actuator/actuator-design-doc.md index 1aa37f706f..92c180efaa 100644 --- a/docs/docs/design/actuator/actuator-design-doc.md +++ b/docs/zh/design/actuator/actuator-design-doc.md @@ -65,7 +65,7 @@ A: 先不搞,有反馈需求再加个钩子 Actuator内部抽象出Endpoint概念,新请求到达服务器后,Actuator会委托对应的Endpoint进行处理。Endpoint支持按需扩展、注入进Actuator: -![img.png](/img/actuator/abstract.png) +![img.png](../../../img/actuator/abstract.png) ## 2.2. Http API设计 @@ -190,13 +190,13 @@ GET ## 2.3. 配置数据的数据模型 -![img.png](/img/actuator/actuator_config.png) +![img.png](../../../img/actuator/actuator_config.png) 新增listener用于处理actuator,stream_filters新增actuator_filter,用于处理actuator的请求(见下) ## 2.4. 内部结构与请求处理流程 -![img.png](/img/actuator/actuator_process.png) +![img.png](../../../img/actuator/actuator_process.png) 解释: @@ -275,23 +275,23 @@ info.Endpoint将请求分发给info.Contributor的实现 - SetStarted埋点 -![img.png](/img/actuator/set_started.png) +![img.png](../../../img/actuator/set_started.png) - SetUnhealthy埋点 启动失败: -![img.png](/img/actuator/img.png) +![img.png](../../../img/actuator/img.png) Stop的时候: -![img.png](/img/actuator/img_1.png) +![img.png](../../../img/actuator/img_1.png) ### 3.1.2. apollo组件 init: -![img_2.png](/img/actuator/img_2.png) +![img_2.png](../../../img/actuator/img_2.png) 其实目前没有需要埋点的地方,因为这里init初始化连接失败的话,runtime_startup的indicator也能报unhealthy diff --git a/docs/docs/design/actuator/grpc-design-doc.md b/docs/zh/design/actuator/grpc-design-doc.md similarity index 96% rename from docs/docs/design/actuator/grpc-design-doc.md rename to docs/zh/design/actuator/grpc-design-doc.md index 701fac85d6..55b76a3fd8 100644 --- a/docs/docs/design/actuator/grpc-design-doc.md +++ b/docs/zh/design/actuator/grpc-design-doc.md @@ -17,7 +17,7 @@ MOSN 基于 go grpc server 框架提供一个 GRPC Server 的能力,相比于 首先梳理一下 NetworkFilter 机制与处理流程 -![networkfilter.png](/img/actuator/networkfilter.jpg) +![networkfilter.png](../../../img/actuator/networkfilter.jpg) + 在配置解析时,完成 gRPC Server 的启动,随着 MOSN 的 Listener 监听开始提供服务 + 一个连接对应一个 NetworkFilter 对象 @@ -30,7 +30,7 @@ MOSN 基于 go grpc server 框架提供一个 GRPC Server 的能力,相比于 + 在 OnNewConnection 中将封装的 Conn 传递给封装的 Listener,触发 Listener.Accept + 在 OnData 中将读取到的数据传递给封装的 Conn,触发 Conn.Read -![networkfilter-grpc.png](/img/actuator/networkfilter-grpc.jpg) +![networkfilter-grpc.png](../../../img/actuator/networkfilter-grpc.jpg) + gRPC Server 的实现 + 在使用官方 gRPC 框架实现 gRPC Server 的时候,开发者需要基于 proto 文件生成一个.pb.go 文件,同时需要实现一组接口满足 proto 中定义的接口实现,将其注册(Register)到 gRPC Server 框架中 diff --git a/docs/docs/design/api_plugin/dapr_api.md b/docs/zh/design/api_plugin/dapr_api.md similarity index 100% rename from docs/docs/design/api_plugin/dapr_api.md rename to docs/zh/design/api_plugin/dapr_api.md diff --git a/docs/docs/design/api_plugin/design.md b/docs/zh/design/api_plugin/design.md similarity index 97% rename from docs/docs/design/api_plugin/design.md rename to docs/zh/design/api_plugin/design.md index 8977da828b..ab4a208c50 100644 --- a/docs/docs/design/api_plugin/design.md +++ b/docs/zh/design/api_plugin/design.md @@ -2,7 +2,7 @@ 本文前半部分讨论 API 插件解决什么问题、为什么这样设计,后半部分介绍 API 插件怎么用。 -如果您只关心 API 插件的用法,可以直接跳到 [2.4. 使用指南](/docs/design/api_plugin/design?id=_24-使用指南) +如果您只关心 API 插件的用法,可以直接跳到 [2.4. 使用指南](zh/design/api_plugin/design?id=_24-使用指南) ## 1. 需求分析 @@ -122,7 +122,7 @@ message HelloReply { [项目中提供的 helloworld 示例包](https://github.com/mosn/layotto/tree/main/cmd/layotto_multiple_api/helloworld) 偷了个懒,直接 import 了 grpc 官方编译好的 .pb.go 文件: -score + score #### step 1. 为刚才定义的 API 编写实现 @@ -223,7 +223,7 @@ Layotto 中的组件分为两种: 允许您自己扩展自己的组件,比如下面示例中的 `HelloWorld` 组件。 ##### 解释:如何配置自定义组件? -详见[自定义组件的配置文档](/docs/component_specs/custom/common) +详见[自定义组件的配置文档](zh/component_specs/custom/common) ##### 看个例子 看个具体的例子,在[helloworld 示例中](https://github.com/mosn/layotto/blob/main/cmd/layotto_multiple_api/helloworld/grpc_api.go), `*server` 实现了 `Init` @@ -282,7 +282,7 @@ func NewHelloWorldAPI(ac *grpc_api.ApplicationContext) grpc.GrpcAPI { 图示如下: -score +score #### step 3. 将自己的 API 注册进 Layotto diff --git a/docs/docs/design/configuration/configuration-api-with-apollo.md b/docs/zh/design/configuration/configuration-api-with-apollo.md similarity index 97% rename from docs/docs/design/configuration/configuration-api-with-apollo.md rename to docs/zh/design/configuration/configuration-api-with-apollo.md index 3b689df784..927e5585fe 100644 --- a/docs/docs/design/configuration/configuration-api-with-apollo.md +++ b/docs/zh/design/configuration/configuration-api-with-apollo.md @@ -104,12 +104,12 @@ A: 如果采用这种设计方案,那么原来使用apollo的历史遗留项 ### 我应该如何使用Apollo SDK API -| Configuration API | apollo sdk API | -| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| GetConfiguration | cache := client.GetConfigCache(c.NamespaceName) value,_ := client.Get("key") | +| Configuration API | apollo sdk API | +| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| GetConfiguration | cache := client.GetConfigCache(c.NamespaceName)
value,_ := client.Get("key") | | SaveConfiguration | 通过http. [update](https://www.apolloconfig.com/#/zh/usage/apollo-open-api-platform?id=_3211-%e4%bf%ae%e6%94%b9%e9%85%8d%e7%bd%ae%e6%8e%a5%e5%8f%a3) + [commit](https://www.apolloconfig.com/#/zh/usage/apollo-open-api-platform?id=_3213-%e5%8f%91%e5%b8%83%e9%85%8d%e7%bd%ae%e6%8e%a5%e5%8f%a3) 使用open API | | DeleteConfiguration | 使用http. [delete](https://www.apolloconfig.com/#/zh/usage/apollo-open-api-platform?id=_3212-%e5%88%a0%e9%99%a4%e9%85%8d%e7%bd%ae%e6%8e%a5%e5%8f%a3) + [commit](https://www.apolloconfig.com/#/zh/usage/apollo-open-api-platform?id=_3213-%e5%8f%91%e5%b8%83%e9%85%8d%e7%bd%ae%e6%8e%a5%e5%8f%a3) 使用open API | -| SubscribeConfiguration | https://github.com/apolloconfig/agollo/wiki/%E7%9B%91%E5%90%AC%E5%8F%98%E6%9B%B4%E4%BA%8B%E4%BB%B6 | +| SubscribeConfiguration | https://github.com/apolloconfig/agollo/wiki/%E7%9B%91%E5%90%AC%E5%8F%98%E6%9B%B4%E4%BA%8B%E4%BB%B6 | ### 如何订阅指定应用的所有配置变更 diff --git a/docs/docs/design/faas/faas-poc-design.md b/docs/zh/design/faas/faas-poc-design.md similarity index 71% rename from docs/docs/design/faas/faas-poc-design.md rename to docs/zh/design/faas/faas-poc-design.md index 444d890be6..6b06e6cae6 100644 --- a/docs/docs/design/faas/faas-poc-design.md +++ b/docs/zh/design/faas/faas-poc-design.md @@ -1,15 +1,15 @@ -# FaaS设计文档 +## FaaS设计文档 -## 一、架构设计 +### 一、架构设计 -![img.png](/img/faas/faas-design.jpg) +![img.png](../../../img/faas/faas-design.jpg) 整套FaaS的方案中,主要解决了以下两个问题: 1. 编译产生的 wasm 文件跟镜像之间的关系是什么? - 1. 目标 wasm 文件最终被构建到一个普通镜像中,推送到 Dockerhub 里,拉取镜像的过程也跟原生的镜像保持一致,只不过实际运行时会把目标 wasm 文件从镜像中提取出来单独加载。 + 1. 目标 wasm 文件最终被构建到一个普通镜像中,推送到 Dockerhub 里,拉取镜像的过程也跟原生的镜像保持一致,只不过实际运行时会把目标 wasm 文件从镜像中提取出来单独加载。 2. 如何让k8s管理部署 wasm 文件? - 1. 基于k8s的生命周期管理及调度策略,结合Containerd的v2接口定义,自定义了Containerd-shim-layotto-v2插件,把容器运行时改造为Layotto Runtime,比如k8s创建容器的动作变成了加载 wasm 形态的函数并运行。 - 2. 得益于 WebAssembly 优秀的沙箱隔离环境,Layotto 作为基座可以加载运行多个 wasm 形态的函数,它们虽然都跑在一个进程里但互不影响,这种 nanoprocess 的思路相比于 docker 可以进一步充分利用资源。 + 1. 基于k8s的生命周期管理及调度策略,结合Containerd的v2接口定义,自定义了Containerd-shim-layotto-v2插件,把容器运行时改造为Layotto Runtime,比如k8s创建容器的动作变成了加载 wasm 形态的函数并运行。 + 2. 得益于 WebAssembly 优秀的沙箱隔离环境,Layotto 作为基座可以加载运行多个 wasm 形态的函数,它们虽然都跑在一个进程里但互不影响,这种 nanoprocess 的思路相比于 docker 可以进一步充分利用资源。 ### 二、核心组件 diff --git a/docs/docs/design/file/file-design.md b/docs/zh/design/file/file-design.md similarity index 100% rename from docs/docs/design/file/file-design.md rename to docs/zh/design/file/file-design.md diff --git a/docs/docs/design/lifecycle/apply_configuration.md b/docs/zh/design/lifecycle/apply_configuration.md similarity index 100% rename from docs/docs/design/lifecycle/apply_configuration.md rename to docs/zh/design/lifecycle/apply_configuration.md diff --git a/docs/docs/design/lock/lock-api-design.md b/docs/zh/design/lock/lock-api-design.md similarity index 99% rename from docs/docs/design/lock/lock-api-design.md rename to docs/zh/design/lock/lock-api-design.md index 6e373cb0ad..4f01229dd0 100644 --- a/docs/docs/design/lock/lock-api-design.md +++ b/docs/zh/design/lock/lock-api-design.md @@ -1,4 +1,4 @@ -# 添加TryLock和Unlock API +# 0. 太长,不看 添加TryLock和Unlock API. 续租API有争议,第一版不加入续租API diff --git a/docs/docs/design/oss/design.md b/docs/zh/design/oss/design.md similarity index 100% rename from docs/docs/design/oss/design.md rename to docs/zh/design/oss/design.md diff --git a/docs/docs/design/pluggable/design.md b/docs/zh/design/pluggable/design.md similarity index 95% rename from docs/docs/design/pluggable/design.md rename to docs/zh/design/pluggable/design.md index ea8e2ca683..c5665bedc8 100644 --- a/docs/docs/design/pluggable/design.md +++ b/docs/zh/design/pluggable/design.md @@ -12,13 +12,13 @@ ## 数据流架构 -![](/img/pluggable/layotto_datatflow.png) +![](../../../img/pluggable/layotto_datatflow.png) 这是当前用户调用 sdk 开始的数据流向。虚线部分是与 pluggable component 主要参与的数据流。 ### 组件发现 -![](/img/pluggable/layotto.png) +![](../../../img/pluggable/layotto.png) 如上图所示,用户自定义组件启动 socket 服务,并将 socket 文件放到指定目录中。 layotto 启动时,会读取该目录中的所有 socket 文件(跳过文件夹),并建立 socket 连接。 diff --git a/docs/docs/design/pluggable/usage.md b/docs/zh/design/pluggable/usage.md similarity index 96% rename from docs/docs/design/pluggable/usage.md rename to docs/zh/design/pluggable/usage.md index e2477d812c..d5fa7b863a 100644 --- a/docs/docs/design/pluggable/usage.md +++ b/docs/zh/design/pluggable/usage.md @@ -51,4 +51,4 @@ hello ## 了解 Layotto 可插拔组件的实现原理 -如果您对实现原理感兴趣,或者想扩展一些功能,可以阅读[可插拔组件的设计文档](/docs/design/pluggable/design.md) +如果您对实现原理感兴趣,或者想扩展一些功能,可以阅读[可插拔组件的设计文档](zh/design/pluggable/design.md) diff --git a/docs/docs/design/pubsub/pubsub-api-and-compability-with-dapr-component.md b/docs/zh/design/pubsub/pubsub-api-and-compability-with-dapr-component.md similarity index 95% rename from docs/docs/design/pubsub/pubsub-api-and-compability-with-dapr-component.md rename to docs/zh/design/pubsub/pubsub-api-and-compability-with-dapr-component.md index 2ca0188f28..f0de81993c 100644 --- a/docs/docs/design/pubsub/pubsub-api-and-compability-with-dapr-component.md +++ b/docs/zh/design/pubsub/pubsub-api-and-compability-with-dapr-component.md @@ -12,13 +12,13 @@ Dapr的组件库可以直接复用;下文讨论sdk和proto是否复用、怎 ### 面临的问题 1. dapr的sdk写死了调用接口的包名,名字里有dapr - ![img.png](/img/mq/design/img.png) + ![img.png](../../../img/mq/design/img.png) 2. 我们会有差异化的需求,比如新字段、新API,如果直接使用 dapr.proto会不灵活 ### 方案 #### 不复用sdk和proto;把proto文件剥离,路径中立 -![img_1.png](/img/mq/design/img_1.png) +![img_1.png](../../../img/mq/design/img_1.png) 我们自己先定义个api-spec.proto,这个proto是dapr API的超集,并且路径名中立、没有layotto字样,基于这个proto自己开发个中立的RuntimeAPI sdk。 @@ -28,7 +28,7 @@ Dapr的组件库可以直接复用;下文讨论sdk和proto是否复用、怎 如果不好推的话,短期我们可以先在中立sdk里写个dapr适配器,用我们的sdk既能调dapr又能用layotto: -![img_2.png](/img/mq/design/img_2.png) +![img_2.png](../../../img/mq/design/img_2.png) 优点: @@ -49,7 +49,7 @@ Dapr的组件库可以直接复用;下文讨论sdk和proto是否复用、怎 #### A. 只要API做变更、和Dapr不一样,就新开个方法名 -![img_3.png](/img/mq/design/img_3.png) +![img_3.png](../../../img/mq/design/img_3.png) 新开方法名后,新老方法都得支持。**比如v1版是Dapr API版,v2版是扩展版本** @@ -143,7 +143,7 @@ sidecar启动时调用app,一次性获取订阅关系。因此对启动顺序 一期先只支持开接口callback的形式,后续再优化加上声明式配置 ## 2.3. Config Design -![img.png](/img/mq/design/config.png) +![img.png](../../../img/mq/design/config.png) 现在的app相关配置是放组件里的,后面要提出来、重构下Configuration API等代码(见下)。 @@ -173,7 +173,7 @@ Service Mesh时代的Control Plane只服务RPC,但Runtime API时代,组件 1. 不好做集群配置下发 1. 没法做组件权限管控配置(比如Dapr能限制app-id1只能访问topic_id1) -![img_4.png](/img/mq/design/img_4.png) +![img_4.png](../../../img/mq/design/img_4.png) 需要重构下原先组件逻辑 diff --git a/docs/docs/design/rpc/rpc_design_document.md b/docs/zh/design/rpc/rpc_design_document.md similarity index 96% rename from docs/docs/design/rpc/rpc_design_document.md rename to docs/zh/design/rpc/rpc_design_document.md index 4b9a7985db..9d0c7aaddb 100644 --- a/docs/docs/design/rpc/rpc_design_document.md +++ b/docs/zh/design/rpc/rpc_design_document.md @@ -1,6 +1,6 @@ -# RPC 设计文档 +RPC 设计文档 -## API 设计 +### API 设计 [layotto rpc API](https://github.com/mosn/layotto/blob/f70cdc619693ad762cf809daf0579403c341def1/spec/proto/runtime/v1/runtime.proto#L19https://github.com/mosn/layotto/blob/f70cdc619693ad762cf809daf0579403c341def1/spec/proto/runtime/v1/runtime.proto#L19) 与Dapr保持一致. ### 核心抽象 @@ -12,7 +12,7 @@ 由于Mosn已经有了完整的RPC能力支持,layotto只提供了非常轻量的RPC框架 -![img.png](/img/rpc/rpc-layer.png) +![img.png](../../../img/rpc/rpc-layer.png) ### Mosn集成 diff --git a/docs/docs/design/sequencer/design.md b/docs/zh/design/sequencer/design.md similarity index 99% rename from docs/docs/design/sequencer/design.md rename to docs/zh/design/sequencer/design.md index 5d9bebb028..c2550a014f 100644 --- a/docs/docs/design/sequencer/design.md +++ b/docs/zh/design/sequencer/design.md @@ -215,7 +215,7 @@ type Configuration struct { 另一个例子是[Leaf的设计](https://tech.meituan.com/2017/04/21/mt-leaf.htm) ,也是每个biz_tag对应一个max_id(Leaf的max_id就是我们的biggerThan) -![leaf_max_id.png](/img/sequencer/design/leaf_max_id.png) +![leaf_max_id.png](../../../img/sequencer/design/leaf_max_id.png) **Q: 要不要在runtime层实现缓存?** diff --git a/docs/docs/development/CONTRIBUTING.md b/docs/zh/development/CONTRIBUTING.md similarity index 90% rename from docs/docs/development/CONTRIBUTING.md rename to docs/zh/development/CONTRIBUTING.md index e02d6574bd..b3ec863b56 100644 --- a/docs/docs/development/CONTRIBUTING.md +++ b/docs/zh/development/CONTRIBUTING.md @@ -6,8 +6,8 @@ Layotto 基于 Apache 2.0 许可发布,遵循标准的 Github 开发流程, - 首次提交 Pull Request 后,您需要先签署[贡献者许可协议(CLA)](http://cla.sofastack.tech/mosn) - 优化您的 Pull Request,确保能通过自动化测试(CI) - 如果是首次贡献者,您提交 Pull Request 是没法自动触发 CI 的,需要由项目维护者手动运行 CI. 这是 Github 的默认限制, 但您做过一次贡献、成为 contributor 后,再提新 PR 就能自动触发 CI 了。 - - CI 的详细说明见 [Layotto GitHub Workflows](github-workflows) - - 为了方便开发, Layotto 有一套 make 脚本,可以在本地跑检查、跑测试,在本地启动好 docker 后,敲 `make all` 即可,详见[文档说明](/docs/development/commands) + - CI 的详细说明见 [Layotto GitHub Workflows](zh/development/github-workflows) + - 为了方便开发, Layotto 有一套 make 脚本,可以在本地跑检查、跑测试,在本地启动好 docker 后,敲 `make all` 即可,详见[文档说明](zh/development/commands) - 由社区维护者来 code review - code review 如果有修改意见,会在 PR 下留言 - code review 有两票 approve 后, PR 就可以合并 @@ -22,10 +22,10 @@ Layotto 基于 Apache 2.0 许可发布,遵循标准的 Github 开发流程, 4. 添加文档 5. 进行一些单元测试也会有很大帮助。 6. 请确保代码覆盖率不会降低。 -7. 确保提交 Pull Request 之前所有的测试能够正确通过。你可以本地启动好 docker 后,执行 `make all` 去格式化你的代码,进行风格测试,linter 规范测试,单元测试,以及集成测试。但是执行前[请先查看注意事项](/docs/development/commands) +7. 确保提交 Pull Request 之前所有的测试能够正确通过。你可以本地启动好 docker 后,执行 `make all` 去格式化你的代码,进行风格测试,linter 规范测试,单元测试,以及集成测试。但是执行前[请先查看注意事项](zh/development/commands) 9. 按照 Github 工作流提交 Pull Request ,并遵循 Pull Request 的规则。 -> Layotto 提供了很多方便本地开发的命令行工具,请在[这里](commands)进行查阅 +> Layotto 提供了很多方便本地开发的命令行工具,请在[这里](zh/development/commands)进行查阅 ## 版本命名约定 diff --git a/docs/docs/development/commands.md b/docs/zh/development/commands.md similarity index 100% rename from docs/docs/development/commands.md rename to docs/zh/development/commands.md diff --git a/docs/docs/development/component_ref/component_ref.md b/docs/zh/development/component_ref/component_ref.md similarity index 83% rename from docs/docs/development/component_ref/component_ref.md rename to docs/zh/development/component_ref/component_ref.md index bd060e708a..1090f75393 100644 --- a/docs/docs/development/component_ref/component_ref.md +++ b/docs/zh/development/component_ref/component_ref.md @@ -1,18 +1,18 @@ -# layotto组件引用 +## layotto组件引用 -## 背景 +### 背景 组件初始化的时候,需要引用其他组件的能力,比如sequencer组件初始化的时候需要从config组件读取相关的配置,以此实现组件之间的引用。 ### 相关设计 目前只支持最需要被应用的两个组件类型:ConfigStore和SecretStore,即配置组件和秘钥组件。 -Ref接口设计,组件需实现此接口才能实现注入。 +Ref接口设计,组件需实现此接口才能实现注入。 ```go type SetComponent interface { -SetConfigStore(cs configstores.Store) (err error) -SetSecretStore(ss secretstores.SecretStore) (err error) + SetConfigStore(cs configstores.Store) (err error) + SetSecretStore(ss secretstores.SecretStore) (err error) } ``` @@ -39,13 +39,13 @@ return nil } //fetch secret/config when component init func (hw *HelloWorld) Init(config *hello.HelloConfig) error { -hw.secretStore.GetSecret(secretstores.GetSecretRequest{ -Name: "dbPassword", -}) -hw.config.Get(context.Background(),&configstores.GetRequest{ -Keys: []string{"dbAddress"}, -}) -return nil + hw.secretStore.GetSecret(secretstores.GetSecretRequest{ + Name: "dbPassword", + }) + hw.config.Get(context.Background(),&configstores.GetRequest{ + Keys: []string{"dbAddress"}, + }) + return nil } ``` diff --git a/docs/docs/development/contributing-doc.md b/docs/zh/development/contributing-doc.md similarity index 89% rename from docs/docs/development/contributing-doc.md rename to docs/zh/development/contributing-doc.md index 97361c79ac..ebc631f296 100644 --- a/docs/docs/development/contributing-doc.md +++ b/docs/zh/development/contributing-doc.md @@ -8,7 +8,7 @@ 文档统一放在docs/目录下,其中docs/en存放英文文档,docs/zh存放中文文档。 -![img_2.png](/img/development/doc/img_2.png) +![img_2.png](../../img/development/doc/img_2.png) ## 2. 文档站点说明 docs/目录下的文件,会被自动部署到github pages,通过[docsify](https://docsify.js.org/#/) 渲染。 @@ -39,7 +39,7 @@ step 3. 打开 http://localhost:3000/ 查看文档站点。 ### step 1. 新建 markdown 文档 当需要新增文档时,可以按目录结构新建文件夹、新建.md文件。比如想写分布式锁API的设计文档,就新建目录: -![img_1.png](/img/development/doc/img_1.png) +![img_1.png](../../img/development/doc/img_1.png) ### step 2. 把文档加入侧边栏 新增文档、写完内容后,记得更新一下侧边栏哦。 @@ -60,14 +60,14 @@ step 3. 打开 http://localhost:3000/ 查看文档站点。 这里说的超链接是那种点了后会跳转到其他文档的链接,比如下面这种: -![img_4.png](/img/development/doc/img_4.png) +![img_4.png](../../img/development/doc/img_4.png) ### 4.1. 错误的写法 如果你尝试用相对路径写超链接url,会发现在站点里点击他就会404: -![img_6.png](/img/development/doc/img_6.png) +![img_6.png](../../img/development/doc/img_6.png) -![img_7.png](/img/development/doc/img_7.png) +![img_7.png](../../img/development/doc/img_7.png) ### 4.2. 正确的写法 @@ -75,7 +75,7 @@ step 3. 打开 http://localhost:3000/ 查看文档站点。 a. 用相对于docs/目录的相对路径。例如: -![img_5.png](/img/development/doc/img_5.png) +![img_5.png](../../img/development/doc/img_5.png) b. 用完整的Url。例如: @@ -86,7 +86,7 @@ see [runtime_config.json](https://github.com/mosn/layotto/blob/main/configs/runt ## 5. 图片目录与图片链接 图片放在docs/img/ 目录下。放这里是为了能让docsify站点能访问到: -![img.png](/img/development/doc/img.png) +![img.png](../../img/development/doc/img.png) 文档中引用图片建议就用完整路径,免得遇到一堆乱七八糟的路径问题。 diff --git a/docs/docs/development/developing-api.md b/docs/zh/development/developing-api.md similarity index 92% rename from docs/docs/development/developing-api.md rename to docs/zh/development/developing-api.md index 0da9eb5f58..6930bddb58 100644 --- a/docs/docs/development/developing-api.md +++ b/docs/zh/development/developing-api.md @@ -9,9 +9,9 @@ A: 目前缺少使用文档,用户不好用,例如: -![img_1.png](/img/development/api/img_1.png) +![img_1.png](../../img/development/api/img_1.png) -![img_2.png](/img/development/api/img_2.png) +![img_2.png](../../img/development/api/img_2.png) 代码缺少注释,感兴趣的贡献者看不懂,例如 https://github.com/mosn/layotto/issues/112 @@ -45,11 +45,11 @@ A: **本规范只限制“新增Layotto API的pr需要有哪些东西”(比 提案需要包含以下内容: - 需求分析 - - 为什么要做这个API - - 定义需求的边界,哪些feature支持,哪些不支持 -- 市面上产品调研 + - 为什么要做这个API + - 定义需求的边界,哪些feature支持,哪些不支持 +- 市面上产品调研 - grpc/http API设计 -- 组件API设计 +- 组件API设计 - 解释你的设计 一个优秀的提案示例:https://github.com/dapr/dapr/issues/2988 @@ -79,7 +79,7 @@ A: **本规范只限制“新增Layotto API的pr需要有哪些东西”(比 正例:[Dapr pub-sub quickstart](https://github.com/dapr/quickstarts/tree/v1.0.0/pub-sub) 在操作之前贴图解释下要做什么事情 -![img.png](/img/development/api/img.png) +![img.png](../../img/development/api/img.png) 反例:文档只写了操作步骤1234,用户看不懂操作这些想干啥 @@ -87,14 +87,14 @@ A: **本规范只限制“新增Layotto API的pr需要有哪些东西”(比 文档路径在"用户手册--接口文档"下,例如 State API的见 https://mosn.io/layotto/#/zh/api_reference/state/reference >调研发现Dapr的使用文档较多,比如光State API就有: -> +> > https://docs.dapr.io/developing-applications/building-blocks/state-management/ -> https://docs.dapr.io/reference/api/state_api/ -> +> https://docs.dapr.io/reference/api/state_api/ +> > https://docs.dapr.io/operations/components/setup-state-store/ -> +> > https://docs.dapr.io/reference/components-reference/supported-state-stores/ -> +> > 我们处于项目早期,可以轻一些 需要有: @@ -102,12 +102,12 @@ A: **本规范只限制“新增Layotto API的pr需要有哪些东西”(比 ##### when.什么场景适合用这个API ##### how.怎么用这个API - 接口列表。例如: - -![img_4.png](/img/development/api/img_4.png) - + +![img_4.png](../../img/development/api/img_4.png) + 列出来有哪些接口,一方面省的用户自己去翻proto、不知道哪些是相关API,一方面避免用户产生"这项目连接口文档都没有?!"的反感 - 关于接口的出入参:拿proto注释当接口文档 - 考虑到接口文档用中英文写要写两份、时间长了还有可能和代码不一致,因此建议不写接口文档,直接把proto注释写的足够详细、当接口文档。例如: +考虑到接口文档用中英文写要写两份、时间长了还有可能和代码不一致,因此建议不写接口文档,直接把proto注释写的足够详细、当接口文档。例如: ```protobuf // GetStateRequest is the message to get key-value states from specific state store. @@ -124,7 +124,7 @@ message GetStateRequest { // (optional) The metadata which will be sent to state store components. map metadata = 4; } - + // StateOptions configures concurrency and consistency for state operations message StateOptions { // Enum describing the supported concurrency for state. @@ -162,7 +162,7 @@ message StateOptions { 这就要求proto注释里写清楚: - 是必传参数还是可选参数; - 解释这个字段啥含义;光解释字面意思是不够的,要解释背后的使用机制,比如上面的consistency和concurrency要解释用户传了某个选项后,服务器能提供什么样的保证 - + (consistency和concurrency上面的注释其实是我把Dapr文档上的描述精简后粘过来的,省了写双语文档) - 注释讲不清楚的,在文档上解释 @@ -202,7 +202,7 @@ message StateOptions { ```protobuf //StopSubscribe stop subs - StopSubscribe() + StopSubscribe() ``` ## 三、提交pull request diff --git a/docs/docs/development/developing-component.md b/docs/zh/development/developing-component.md similarity index 84% rename from docs/docs/development/developing-component.md rename to docs/zh/development/developing-component.md index 98dfb808ec..88390a5033 100644 --- a/docs/docs/development/developing-component.md +++ b/docs/zh/development/developing-component.md @@ -10,7 +10,7 @@ 1. git clone下载代码到您喜欢的目录 2. 使用Docker启动您需要的环境。比如您想用zookeeper开发分布式锁API,就需要本地用Docker启动一个zookeeper容器,用于本地测试。 - + 如果您本地没有Docker也不用害怕,可以参照 [Docker Desktop教程](https://www.runoob.com/docker/windows-docker-install.html) 装一个Docker Desktop,Mac和Windows都可以,用起来特别简单。 ## 二、开发组件和单元测试 @@ -18,7 +18,7 @@ 文件夹名用组件名就行,比如redis的组件如下图 -![img.png](/img/development/component/img.png) +![img.png](../../img/development/component/img.png) 开发过程中可能用到的工具类(不是强制一定要用哈,列在这只是供参考,希望能简化开发): @@ -29,7 +29,7 @@ - 其他:Layotto的pkg/common目录下有一些工具类,以及mosn.io/pkg下也有很多工具类 ### 2.2. 复制粘贴别的组件 - + 简单起见,可以直接复制粘贴别的组件过来,修改开发。比如想用zookeeper实现分布式锁API的话,可以把redis组件复制粘贴过来改 ### 2.3. 记得编写单元测试哦! @@ -43,24 +43,24 @@ 一般是把所有网络调用的代码封装成一个interface,然后在ut中mock掉这个interface。以apollo配置中心的单元测试为例,见components/configstores/apollo/configstore.go 和 components/configstores/apollo/configstore_test.go : -首先,在configstore.go里,把所有调sdk、发起网络调用调apollo的地方给封装成一个interface +首先,在configstore.go里,把所有调sdk、发起网络调用调apollo的地方给封装成一个interface -![mock.png](/img/development/component/mock.png) -![img_8.png](/img/development/component/img_8.png) +![mock.png](../../img/development/component/mock.png) +![img_8.png](../../img/development/component/img_8.png) 然后,把你代码中调sdk、做网络调用的代码封装成一个struct、实现刚才的interface: -![img_9.png](/img/development/component/img_9.png) +![img_9.png](../../img/development/component/img_9.png) 做了这一步重构后,你的代码就有可测性了(这也是"测试驱动开发"思想的一种体现,为了让代码可测性好,把代码重构成可以依赖注入的形式) 接下来,写ut的时候,可以mock刚才的interface: -![img_10.png](/img/development/component/img_10.png) +![img_10.png](../../img/development/component/img_10.png) 把mock后的东西注入到要测的struct里就行,然后测那个struct就行 -![img_11.png](/img/development/component/img_11.png) +![img_11.png](../../img/development/component/img_11.png) 注:一般“集成测试”的时候,会真正做网络调用、调一个正常的zookeeper或者redis;而单测注重测局部逻辑,不会调真实环境 @@ -72,10 +72,10 @@ 需要在cmd/layotto/main.go里集成进新的组件,包括: ### 3.1. 在main.go里import你的组件 -![img_1.png](/img/development/component/img_1.png) +![img_1.png](../../img/development/component/img_1.png) ### 3.2. 在main.go的NewRuntimeGrpcServer函数中注册你的组件 -![img_4.png](/img/development/component/img_4.png) +![img_4.png](../../img/development/component/img_4.png) 之后,用户如果在Layotto配置文件中配置了"我要用zookeeper",那么Layotto就会初始化zookeeper组件 @@ -93,7 +93,7 @@ 之后编辑修改一下图中的配置: -![img_3.png](/img/development/component/img_3.png) +![img_3.png](../../img/development/component/img_3.png) @@ -103,12 +103,12 @@ #### a. 如果该组件有通用客户端,就不用开发啦 如果demo目录下有common文件夹,代表这是个通用demo、能给不同的组件用,可以通过命令行传参传storeName,有这个就不用再开发demo啦 -![img_6.png](/img/development/component/img_6.png) +![img_6.png](../../img/development/component/img_6.png) #### b. 如果该组件没有通用客户端,或者需要定制一些metadata传参,那就复制粘贴改一改 比如zookeeper实现分布式锁,有一些定制配置,所以想自己新写个demo,那就复制粘贴redis的demo、改一改 -![img_7.png](/img/development/component/img_7.png) +![img_7.png](../../img/development/component/img_7.png) 注:demo的代码里如果出现不该有的错误,可以直接panic。后续我们会直接用demo跑集成测试,如果panic了代表集成测试没有通过。 例如demo/lock/redis/client.go 里: @@ -123,22 +123,22 @@ ``` ### 4.3. 参照quickstart文档,启动Layotto和demo看看有没有报错 -比如参考[分布式锁API的quickstart文档](/docs/start/lock/start.md) ,启动你依赖的环境(比如zookeeper)、启动Layotto(记得用你刚才新增的配置文件!),看看有没有报错。 +比如参考[分布式锁API的quickstart文档](zh/start/lock/start.md) ,启动你依赖的环境(比如zookeeper)、启动Layotto(记得用你刚才新增的配置文件!),看看有没有报错。 注:下面这个Error没事,无视就好 -![img_2.png](/img/development/component/img_2.png) +![img_2.png](../../img/development/component/img_2.png) -启动demo、调用Layotto,看看有没有报错。如果是通用客户端,可以在命令行命令里带上-s storeName传入storeName +启动demo、调用Layotto,看看有没有报错。如果是通用客户端,可以在命令行命令里带上-s storeName传入storeName -![img_5.png](/img/development/component/img_5.png) +![img_5.png](../../img/development/component/img_5.png) 没有报错的话说明测试通过! ## 五、新增组件说明文档 以上就算完成了代码工作,最好能新增组件的配置说明文档,说明一下这个组件支持哪些配置项、怎么启动该组件依赖的环境(比如用docker怎么启动zookeeper) -可以参考 [lock API的redis组件说明(中文)](/docs/component_specs/lock/redis.md) +可以参考 [lock API的redis组件说明(中文)](zh/component_specs/lock/redis.md) 和 -[lock API的redis组件说明(英文)](/docs/component_specs/lock/redis.md),同样可以复制粘贴改一改。 +[lock API的redis组件说明(英文)](en/component_specs/lock/redis.md),同样可以复制粘贴改一改。 diff --git a/docs/docs/development/github-workflows.md b/docs/zh/development/github-workflows.md similarity index 92% rename from docs/docs/development/github-workflows.md rename to docs/zh/development/github-workflows.md index 9c861552a6..4fdda1da56 100644 --- a/docs/docs/development/github-workflows.md +++ b/docs/zh/development/github-workflows.md @@ -23,8 +23,8 @@ Layotto Env Pipeline 流水线主要负责 Layotto 的项目以及相关环境 ### Job 触发方式 Layotto Env Pipeline 流水线任务触发方式: -+ Title Validation: - ++ Title Validation: + ``` pull_request: types: @@ -34,9 +34,9 @@ Layotto Env Pipeline 流水线任务触发方式: - labeled PR 添加 Label - unlabeled PR 取消 Label ``` - -+ Quickstart Validation: - + ++ Quickstart Validation: + ``` push: branches: @@ -45,17 +45,17 @@ Layotto Env Pipeline 流水线任务触发方式: branches: - main 提交 PR ``` - -+ Update Stale Status: - + ++ Update Stale Status: + ``` on: schedule: - cron: '30 1 * * *' 定时任务 ``` - -+ License Validation: - + ++ License Validation: + ``` push: branches: @@ -64,17 +64,17 @@ Layotto Env Pipeline 流水线任务触发方式: branches: - main 提交 PR ``` - -+ DeadLink Validation: - + ++ DeadLink Validation: + ``` pull_request: branches: - main 提交 PR ``` - -+ CodeQL: - + ++ CodeQL: + ``` schedule: - cron: '0 4 * * 5' 定时任务 @@ -82,7 +82,7 @@ Layotto Env Pipeline 流水线任务触发方式: ## Layotto Dev Pipeline 🌊 (Before Merged) -![release.png](/img/development/workflow/workflow-dev.png) +![release.png](../../img/development/workflow/workflow-dev.png) ### Job 任务内容 @@ -118,7 +118,7 @@ Layotto Dev Pipeline (Before Merged) 流水线主要负责 Layotto 提交 PR 后 ## Layotto Dev Pipeline 🌊 (After Merged) -![release.png](/img/development/workflow/workflow-merge.png) +![release.png](../../img/development/workflow/workflow-merge.png) ### Job 任务内容 @@ -157,7 +157,7 @@ Layotto Dev Pipeline (After Merged) 流水线主要负责 Layotto 代码合并 ## Layotto Release Pipeline 🌊 -![release.png](/img/development/workflow/work(/img/lease.png) +![release.png](../../img/development/workflow/workflow-release.png) ### Job 任务内容 @@ -174,9 +174,9 @@ Layotto Release Pipeline 流水线主要负责 Layotto 新版本发布以及校 + Linux AMD64 Artifact 对代码构建 Linux AMD64Binary 校验 + Linux ARM64 Artifact 对代码构建 Linux ARM64 Binary 校验 + Linux AMD64 WASM Artifact 对 Layotto WASM 构建 Linux AMD64 Binary 校验 -+ Linux AMD64 WASM Image 发布 Release 版本的 Layotto WASM 镜像,镜像规范为 `layotto/faas-amd64:{latest_tagname}` -+ Linux AMD64 Image 发布 Release 版本的 Layotto 镜像,镜像规范为 `layotto/layotto:{latest_tagname}` -+ Linux ARMD64 Image 发布 Release 版本的 Layotto 镜像,镜像规范为 `layotto/layotto.arm64:{latest_tagname}` ++ Linux AMD64 WASM Image 发布 Release 版本的 Layotto WASM 镜像,镜像规范为 layotto/faas-amd64:{latest_tagname} ++ Linux AMD64 Image 发布 Release 版本的 Layotto 镜像,镜像规范为 layotto/layotto:{latest_tagname} ++ Linux ARMD64 Image 发布 Release 版本的 Layotto 镜像,镜像规范为 layotto/layotto.arm64:{latest_tagname} ### Job 触发方式 diff --git a/docs/docs/development/label-spec.md b/docs/zh/development/label-spec.md similarity index 100% rename from docs/docs/development/label-spec.md rename to docs/zh/development/label-spec.md diff --git a/docs/docs/development/problems-to-solve.md b/docs/zh/development/problems-to-solve.md similarity index 100% rename from docs/docs/development/problems-to-solve.md rename to docs/zh/development/problems-to-solve.md diff --git a/docs/docs/development/release-guide.md b/docs/zh/development/release-guide.md similarity index 93% rename from docs/docs/development/release-guide.md rename to docs/zh/development/release-guide.md index fd9d29c290..6a46d250a2 100644 --- a/docs/docs/development/release-guide.md +++ b/docs/zh/development/release-guide.md @@ -34,7 +34,7 @@ Layotto 发布周期暂定为每季度发布一次。 + AMD64/X86 架构的镜像:`layotto/layotto:{tag}` + ARM64 架构的镜像:`layotto/layotto.arm64:{tag}` -![release.png](/img/development/workflow/release.png) +![release.png](../../img/development/workflow/release.png) ### Step3: Draft a new release 并编写发布报告 @@ -42,14 +42,14 @@ Layotto 发布周期暂定为每季度发布一次。 > 可以参考以前的 [发版报告](https://github.com/mosn/layotto/releases) -![img_1.png](/img/development/release/img_1.png) +![img_1.png](../../img/development/release/img_1.png) ### Step4: 上传多平台架构的 Binaries > 2022/05/04更新:这一步可以忽略。打 tag 发布后,Layotto 的 Release Pipeline 会自动上传二进制文件,无需手动上传。PR 见 https://github.com/mosn/layotto/pull/566 > 如果没有自动上传,可以手动将 `步骤 2` 中构建的多平台 Artifacts 下载、上传 -![img.png](/img/development/release/img.png) +![img.png](../../img/development/release/img.png) ### Step5: 确认发布 diff --git a/docs/docs/development/start-from-zero.md b/docs/zh/development/start-from-zero.md similarity index 100% rename from docs/docs/development/start-from-zero.md rename to docs/zh/development/start-from-zero.md diff --git a/docs/docs/development/test-quickstart.md b/docs/zh/development/test-quickstart.md similarity index 99% rename from docs/docs/development/test-quickstart.md rename to docs/zh/development/test-quickstart.md index 660ef228d8..b23d8343e7 100644 --- a/docs/docs/development/test-quickstart.md +++ b/docs/zh/development/test-quickstart.md @@ -5,7 +5,7 @@ Quickstart 是项目的门面, 如果新用户进入仓库后,发现 Quickstar 但是……定期手动测试 Quickstart、修复文档中的异常,这个过程实在太花时间了: - + 烦死了! diff --git a/docs/docs/operation/README.md b/docs/zh/operation/README.md similarity index 95% rename from docs/docs/operation/README.md rename to docs/zh/operation/README.md index b9d439eb2d..6ae300383c 100644 --- a/docs/docs/operation/README.md +++ b/docs/zh/operation/README.md @@ -7,7 +7,7 @@ - 通过 Kubernetes 部署 ### 直接部署 -您可以直接运行 Layotto 二进制文件、启动 Layotto。参考[快速开始](/docs/start/) +您可以直接运行 Layotto 二进制文件、启动 Layotto。参考[快速开始](zh/start/) ### 使用 Docker 部署 Layotto 提供了官方 Docker 镜像,包括: @@ -20,7 +20,7 @@ Layotto 提供了官方 Docker 镜像,包括: docker run -v "$(pwd)/configs/config.json:/runtime/configs/config.json" -d -p 34904:34904 --name layotto layotto/layotto start ``` -您也可以通过 docker-compose 同时启动 Layotto 和 其他系统(比如 Redis),参考[快速开始](/docs/start/state/start?id=step-1-%e5%90%af%e5%8a%a8-redis-%e5%92%8c-layotto) +您也可以通过 docker-compose 同时启动 Layotto 和 其他系统(比如 Redis),参考[快速开始](zh/start/state/start?id=step-1-%e5%90%af%e5%8a%a8-redis-%e5%92%8c-layotto) ### 在 Kubernetes 集群中部署 #### 方案1. 通过 Istio 部署 diff --git a/docs/docs/operation/local.md b/docs/zh/operation/local.md similarity index 100% rename from docs/docs/operation/local.md rename to docs/zh/operation/local.md diff --git a/docs/i18n/en-US/docusaurus-plugin-content-docs/current/operation/sidecar_injector.md b/docs/zh/operation/sidecar_injector.md similarity index 100% rename from docs/i18n/en-US/docusaurus-plugin-content-docs/current/operation/sidecar_injector.md rename to docs/zh/operation/sidecar_injector.md diff --git a/docs/docs/sdk_reference/go/start.md b/docs/zh/sdk_reference/go/start.md similarity index 96% rename from docs/docs/sdk_reference/go/start.md rename to docs/zh/sdk_reference/go/start.md index 63e962a820..57fa25eea7 100644 --- a/docs/docs/sdk_reference/go/start.md +++ b/docs/zh/sdk_reference/go/start.md @@ -65,7 +65,7 @@ func main() { 可以通过使用一个最简单配置文件来启动 Layotto,测试上面的 HelloWorld 程序. 内容如下: -> 有关配置文件更详细的介绍可以参考 [Layotto 配置文件介绍](/docs/configuration/overview.md). +> 有关配置文件更详细的介绍可以参考 [Layotto 配置文件介绍](zh/configuration/overview.md). ```json { @@ -115,7 +115,7 @@ func main() { instance 属性里还有 `type` 和 `hello` 两个子属性: - `type` 属性是每个 instance 都有的,表明使用什么类型来实现了该接口,这里是 `helloworld` 类型. 这个 `type` 目前要求是已经注册到 Layotto 中组件类型,可以通过 [cmd/layotto/main.go](https://github.com/mosn/layotto/blob/6f6508b11783f1e4fa947ff47632e74064333384/cmd/layotto/main.go#LL275C1-L275C1) 中查看注册的组件类型. -也可以查看各种类型组件配置文件的[文档](/docs/configuration/overview.md). +也可以查看各种类型组件配置文件的[文档](zh/configuration/overview.md). - `hello` 属性用于初始化组件,不同类型的接口有不同的属性字段. 不同 `type` 的 instance 也有不同的属性字段来初始化. 可以通过[代码](https://github.com/mosn/layotto/blob/6f6508b11783f1e4fa947ff47632e74064333384/components/hello/hello.go#L32-L36)查看相关配置属性的用法. @@ -140,7 +140,7 @@ NewClientWithConnection(conn *grpc.ClientConn) Client ## 体验其他接口函数 -以分布式id `sequencer` 为例,使用 `redis` 类型,相关参数请参考这篇[文档](/docs/component_specs/sequencer/redis.md). +以分布式id `sequencer` 为例,使用 `redis` 类型,相关参数请参考这篇[文档](zh/component_specs/sequencer/redis.md). 具体代码配置参考 `demo/sequencer/common/client.go`,内容如下. @@ -259,7 +259,7 @@ localhost:6379> get "sequencer|||app1||key666" 这里以 `file` 接口中的 `local` 组件类型为例。 -通过可以查看 [`spec/proto/runtime`](https://github.com/mosn/layotto/tree/main/spec/proto/runtime/v1) 中的 proto 文件或[GRPC API文档](/docs/api_reference/README.md) +通过可以查看 [`spec/proto/runtime`](https://github.com/mosn/layotto/tree/main/spec/proto/runtime/v1) 中的 proto 文件或[GRPC API文档](zh/api_reference/README.md) 完整代码参考 `demo/file/local/client.go`,内容如下: @@ -344,7 +344,7 @@ func main() { ## 更多示例 -sdk 其他接口使用可以参考 [demo目录下的代码示例](https://github.com/mosn/layotto/tree/main/demo) 及 [quick-start 启动文档](/docs/start/README.md) +sdk 其他接口使用可以参考 [demo目录下的代码示例](https://github.com/mosn/layotto/tree/main/demo) 及 [quick-start 启动文档](zh/start/README.md) -查看相关配置文件编写可以参考 [configs示例](https://github.com/mosn/layotto/tree/main/configs) 及 [组件配置文档](/docs/configuration/overview.md) +查看相关配置文件编写可以参考 [configs示例](https://github.com/mosn/layotto/tree/main/configs) 及 [组件配置文档](zh/configuration/overview.md) diff --git a/docs/docs/start/README.md b/docs/zh/start/README.md similarity index 76% rename from docs/docs/start/README.md rename to docs/zh/start/README.md index 7d1f2964aa..4d8dd3681d 100644 --- a/docs/docs/start/README.md +++ b/docs/zh/start/README.md @@ -8,4 +8,4 @@ 如果您准备好了,可以点击左侧导航栏里的各种 Demo,开始我们的旅行! -注:如果您没装 Docker,可以体验 [使用Apollo配置中心](/docs/configuration/start-apollo.md) 这个 Demo, 这个不需要 Docker; 或者体验 [线上实验室](/docs/start/lab.md) \ No newline at end of file +注:如果您没装 Docker,可以体验 [使用Apollo配置中心](zh/start/configuration/start-apollo.md) 这个 Demo, 这个不需要 Docker; 或者体验 [线上实验室](zh/start/lab.md) \ No newline at end of file diff --git a/docs/docs/start/actuator/start.md b/docs/zh/start/actuator/start.md similarity index 97% rename from docs/docs/start/actuator/start.md rename to docs/zh/start/actuator/start.md index 1889ca6cfb..5d74bdf7aa 100644 --- a/docs/docs/start/actuator/start.md +++ b/docs/zh/start/actuator/start.md @@ -157,4 +157,4 @@ Layotto内置提供了/actuator/health/readiness和/actuator/health/liveness 两 ### 了解Actuator实现原理 -如果您对实现原理感兴趣,或者想在Actuator扩展一些功能,可以阅读[Actuator的设计文档](/docs/design/actuator/actuator-design-doc.md) \ No newline at end of file +如果您对实现原理感兴趣,或者想在Actuator扩展一些功能,可以阅读[Actuator的设计文档](zh/design/actuator/actuator-design-doc.md) \ No newline at end of file diff --git a/docs/docs/start/api_plugin/generate.md b/docs/zh/start/api_plugin/generate.md similarity index 91% rename from docs/docs/start/api_plugin/generate.md rename to docs/zh/start/api_plugin/generate.md index dcae3b5243..ba6b26a210 100644 --- a/docs/docs/start/api_plugin/generate.md +++ b/docs/zh/start/api_plugin/generate.md @@ -10,7 +10,7 @@ Writing the API plugin yourself is boring. You can use Layotto's code generator > > The code of in-tree plugins is located in the layotto repo, while the code of out-of-tree plugins can be placed in your own repo outside the layotto repo. > -> **This guide will show you how to generate out-of-tree plugins**. If you want to generate in-tree plugins, see [the other doc](/docs/api_reference/how_to_generate_api_doc) for help. +> **This guide will show you how to generate out-of-tree plugins**. If you want to generate in-tree plugins, see [the other doc](en/api_reference/how_to_generate_api_doc) for help. Let's say you want to add a `PublishTransactionalMessage` method to the existing pubsub API. You write a new proto file `cmd/layotto_multiple_api/advanced_queue/advanced_queue.proto`: @@ -56,6 +56,6 @@ Fix the path error and then you can register this API plugin in your `main`. ## Reference -[How to generate code and documentation from the .proto files](/docs/api_reference/how_to_generate_api_doc) +[How to generate code and documentation from the .proto files](zh/api_reference/how_to_generate_api_doc) [protoc-gen-p6](https://github.com/layotto/protoc-gen-p6) \ No newline at end of file diff --git a/docs/docs/start/api_plugin/helloworld.md b/docs/zh/start/api_plugin/helloworld.md similarity index 91% rename from docs/docs/start/api_plugin/helloworld.md rename to docs/zh/start/api_plugin/helloworld.md index 117bb75138..ee895044a2 100644 --- a/docs/docs/start/api_plugin/helloworld.md +++ b/docs/zh/start/api_plugin/helloworld.md @@ -59,6 +59,6 @@ Greeting: Hello world 您可以参考演示的代码来实现你自己的API。快来试试吧! -想要了解更多的详情,您可以参考[设计文档](/docs/design/api_plugin/design.md) +想要了解更多的详情,您可以参考[设计文档](zh/design/api_plugin/design.md) -为了简化 API 插件的开发,Layotto 社区提供了一套代码生成器,可以基于 proto 文件生成 API 插件相关代码,见 [文档](/docs/start/api_plugin/generate.md) \ No newline at end of file +为了简化 API 插件的开发,Layotto 社区提供了一套代码生成器,可以基于 proto 文件生成 API 插件相关代码,见 [文档](zh/start/api_plugin/generate.md) \ No newline at end of file diff --git a/docs/docs/start/configuration/overview.md b/docs/zh/start/configuration/overview.md similarity index 89% rename from docs/docs/start/configuration/overview.md rename to docs/zh/start/configuration/overview.md index 3568e09e51..c4600618da 100644 --- a/docs/docs/start/configuration/overview.md +++ b/docs/zh/start/configuration/overview.md @@ -19,6 +19,6 @@ A: Configuration会有一些特殊的能力,比如sidecar做配置缓存,比 这就像配置中心和数据库的区别,都是存储,但是前者领域特定,有特殊功能 ## 快速入门 -- [使用Apollo配置中心](/docs/start/configuration/start-apollo.md) -- [使用Etcd配置中心](/docs/start/configuration/start.md) -- [使用nacos配置中心](/docs/start/confguration/start-nacos.md) \ No newline at end of file +- [使用Apollo配置中心](zh/start/configuration/start-apollo.md) +- [使用Etcd配置中心](zh/start/configuration/start.md) +- [使用nacos配置中心](zh/start/confguration/start-nacos.md) \ No newline at end of file diff --git a/docs/docs/start/configuration/start-apollo.md b/docs/zh/start/configuration/start-apollo.md similarity index 96% rename from docs/docs/start/configuration/start-apollo.md rename to docs/zh/start/configuration/start-apollo.md index d4d0196b74..cf40a28dee 100644 --- a/docs/docs/start/configuration/start-apollo.md +++ b/docs/zh/start/configuration/start-apollo.md @@ -4,7 +4,7 @@ 该示例的架构如下图,启动的进程有:客户端程程序、Layotto、Apollo服务器 -![img.png](/img/configuration/apollo/arch.png) +![img.png](../../../img/configuration/apollo/arch.png) ## 第一步:部署apollo配置中心(可选) @@ -49,7 +49,7 @@ go build -o layotto > [!TIP|label: 使用默认配置时,demo启动报错?] > 默认配置会连接 apollo 的演示服务器,但是演示服务器的配置可能被其他人随意修改。报错可能是因为某些配置被修改了。 > -> 遇到这种情况,您可以先尝试其他 demo,例如 [etcd demo](/docs/start/configuration/start.md) +> 遇到这种情况,您可以先尝试其他 demo,例如 [etcd demo](zh/start/configuration/start) ## 第三步:启动客户端Demo,调用Layotto增删改查 diff --git a/docs/docs/start/configuration/start-nacos.md b/docs/zh/start/configuration/start-nacos.md similarity index 97% rename from docs/docs/start/configuration/start-nacos.md rename to docs/zh/start/configuration/start-nacos.md index b89a06ec4b..f5bddbfa5d 100644 --- a/docs/docs/start/configuration/start-nacos.md +++ b/docs/zh/start/configuration/start-nacos.md @@ -2,7 +2,7 @@ 该示例展示了如何通过Layotto,对nacos配置中心进行增删改查以及watch的过程。 -![](/img/configuration/nacos/layotto-nacos-configstore-component.png) +![](../../../img/configuration/nacos/layotto-nacos-configstore-component.png) ## 第一步:启动 Nacos 和 Layotto diff --git a/docs/docs/start/configuration/start.md b/docs/zh/start/configuration/start.md similarity index 100% rename from docs/docs/start/configuration/start.md rename to docs/zh/start/configuration/start.md diff --git a/docs/docs/start/cryption/start.md b/docs/zh/start/cryption/start.md similarity index 98% rename from docs/docs/start/cryption/start.md rename to docs/zh/start/cryption/start.md index 3cff4deb0a..5edb3ab49b 100644 --- a/docs/docs/start/cryption/start.md +++ b/docs/zh/start/cryption/start.md @@ -1,5 +1,5 @@ -# 如何调用 Layotto CryptionService API +# CryptionService API demo 本示例演示如何调用 Layotto CryptionService API. diff --git a/docs/docs/start/delay_queue/start.md b/docs/zh/start/delay_queue/start.md similarity index 98% rename from docs/docs/start/delay_queue/start.md rename to docs/zh/start/delay_queue/start.md index 69fe164088..5aa6674f96 100644 --- a/docs/docs/start/delay_queue/start.md +++ b/docs/zh/start/delay_queue/start.md @@ -1,5 +1,5 @@ -# 如何调用 Layotto DelayQueue API +# DelayQueue API demo 本示例演示如何调用 Layotto DelayQueue API. diff --git a/docs/docs/start/email/start.md b/docs/zh/start/email/start.md similarity index 98% rename from docs/docs/start/email/start.md rename to docs/zh/start/email/start.md index 045463c8e6..fca423eef2 100644 --- a/docs/docs/start/email/start.md +++ b/docs/zh/start/email/start.md @@ -1,5 +1,5 @@ -# 如何调用 Layotto EmailService API +# EmailService API demo 本示例演示如何调用 Layotto EmailService API. diff --git a/docs/docs/start/faas/start.md b/docs/zh/start/faas/start.md similarity index 95% rename from docs/docs/start/faas/start.md rename to docs/zh/start/faas/start.md index 1677775ace..5923632be5 100644 --- a/docs/docs/start/faas/start.md +++ b/docs/zh/start/faas/start.md @@ -1,10 +1,10 @@ -# FaaS 快速开始 +## FaaS 快速开始 -## 一、功能介绍 +### 一、功能介绍 Layotto支持加载并运行以 wasm 为载体的 Function,并支持Function之间互相调用以及访问基础设施,如Redis。 -详细的设计文档可以参考:[FaaS design](/docs/design/faas/faas-poc-design.md) +详细的设计文档可以参考:[FaaS design](zh/design/faas/faas-poc-design.md) ### 二、准备工作 @@ -19,7 +19,7 @@ Layotto支持加载并运行以 wasm 为载体的 Function,并支持Function 按照官网操作即可。 3. [virtualbox](https://www.oracle.com/virtualization/technologies/vm/virtualbox.html) - + 直接官网下载安装包安装即可,mac下也可以使用 [homebrew](https://brew.sh/) 进行安装。安装完以后如果启动失败,请参考[The host-only adapter we just created is not visible](https://github.com/kubernetes/minikube/issues/3614) @@ -145,7 +145,7 @@ There are 100 inventories for book1. ### 五、示例流程介绍 -![img.png](/img/faas/faas-request-process.jpg) +![img.png](../../../img/faas/faas-request-process.jpg) 1. HTTP 请求 func1 2. func1 通过 Runtime ABI 调用 func2 @@ -160,7 +160,7 @@ There are 100 inventories for book1. 2.启动Layotto时,redis连接失败,打印 "occurs an error: redis store: error connecting to redis at": -检查redis的配置,看是否redis配置错误造成的。 + 检查redis的配置,看是否redis配置错误造成的。 diff --git a/docs/docs/start/file/minio.md b/docs/zh/start/file/minio.md similarity index 97% rename from docs/docs/start/file/minio.md rename to docs/zh/start/file/minio.md index c8edbb99bd..9c9b948670 100644 --- a/docs/docs/start/file/minio.md +++ b/docs/zh/start/file/minio.md @@ -118,4 +118,4 @@ docker rm -f minio #### 了解File API的实现原理 -如果您对实现原理感兴趣,或者想扩展一些功能,可以阅读[File API的设计文档](/docs/design/file/file-design.md) +如果您对实现原理感兴趣,或者想扩展一些功能,可以阅读[File API的设计文档](zh/design/file/file-design.md) diff --git a/docs/zh/start/istio/README.md b/docs/zh/start/istio/README.md new file mode 100644 index 0000000000..ba1ba27991 --- /dev/null +++ b/docs/zh/start/istio/README.md @@ -0,0 +1,7 @@ +# 集成 Istio 1.10.6 演示 + +Layotto 最新版集成了 Istio 1.10.6, 可以通过 Istio(控制面) 对 Layotto(数据面)进行流量治理。 + +您可以在[线上实验室](zh/start/lab.md)体验集成 Istio 1.10.6 + +更多说明见[《通过 Istio 部署 Layotto》](zh/operation/?id=方案1-通过-istio-部署) \ No newline at end of file diff --git a/docs/docs/start/istio/start.md b/docs/zh/start/istio/start.md similarity index 100% rename from docs/docs/start/istio/start.md rename to docs/zh/start/istio/start.md diff --git a/docs/docs/start/lab.md b/docs/zh/start/lab.md similarity index 100% rename from docs/docs/start/lab.md rename to docs/zh/start/lab.md diff --git a/docs/docs/start/lifecycle/start.md b/docs/zh/start/lifecycle/start.md similarity index 96% rename from docs/docs/start/lifecycle/start.md rename to docs/zh/start/lifecycle/start.md index 6290c3076a..8721f1ac4f 100644 --- a/docs/docs/start/lifecycle/start.md +++ b/docs/zh/start/lifecycle/start.md @@ -1,5 +1,5 @@ -# 如何调用 Layotto Lifecycle API +# Lifecycle API demo 本示例演示如何调用 Layotto Lifecycle API. @@ -128,7 +128,7 @@ go sdk位于`sdk`目录下,java sdk 在 https://github.com/layotto/java-sdk [API Reference](https://mosn.io/layotto/api/v1/runtime.html) -[Design doc](/docs/design/lifecycle/apply_configuration) +[Design doc](zh/design/lifecycle/apply_configuration) diff --git a/docs/docs/start/lock/start.md b/docs/zh/start/lock/start.md similarity index 95% rename from docs/docs/start/lock/start.md rename to docs/zh/start/lock/start.md index 773d274dc3..a224cfd1e8 100644 --- a/docs/docs/start/lock/start.md +++ b/docs/zh/start/lock/start.md @@ -4,7 +4,7 @@ 该示例的架构如下图,启动的进程有:Redis、Layotto、一个演示用的client程序(其中包含两个协程,并发抢锁) -![img.png](/img/lock/img.png) +![img.png](../../../img/lock/img.png) ## step 1. 部署 Redis 和 Layotto @@ -39,7 +39,7 @@ docker pull redis:latest docker images ``` -![img.png](/img/mq/start/img.png) +![img.png](../../../img/mq/start/img.png) 3. 运行容器 @@ -156,4 +156,4 @@ sdk位于`sdk`目录下,用户可以通过sdk调用Layotto提供的API。 ### 了解分布式锁 API的实现原理 -如果您对实现原理感兴趣,或者想扩展一些功能,可以阅读[分布式锁 API的设计文档](/docs/design/lock/lock-api-design.md) \ No newline at end of file +如果您对实现原理感兴趣,或者想扩展一些功能,可以阅读[分布式锁 API的设计文档](zh/design/lock/lock-api-design.md) \ No newline at end of file diff --git a/docs/docs/start/network_filter/tcpcopy.md b/docs/zh/start/network_filter/tcpcopy.md similarity index 84% rename from docs/docs/start/network_filter/tcpcopy.md rename to docs/zh/start/network_filter/tcpcopy.md index 3e9e9cbbb0..c4fdf2eb09 100644 --- a/docs/docs/start/network_filter/tcpcopy.md +++ b/docs/zh/start/network_filter/tcpcopy.md @@ -2,9 +2,9 @@ ## 介绍 -当您按照quick start文档[通过Layotto调用apollo配置中心](/docs/start/configuration/start-apollo.md)运行demo时,可能会注意到配置文件config_apollo.json中有这么一段配置: +当您按照quick start文档[通过Layotto调用apollo配置中心](zh/start/configuration/start-apollo.md)运行demo时,可能会注意到配置文件config_apollo.json中有这么一段配置: -``` +```json { "type": "tcpcopy", "config": { @@ -22,9 +22,9 @@ 开启该配置后,当Layotto接到请求,如果判断满足流量dump的条件,就会把请求的二进制数据写到本地文件系统。 -dump下来的二进制流量数据会存放在 ` ${user's home directory}/logs/mosn `目录,或/home/admin/logs/mosn 目录下: +dump下来的二进制流量数据会存放在 ${user's home directory}/logs/mosn 目录,或/home/admin/logs/mosn 目录下: -![img.png](/img/tcp_dump.png) +![img.png](../../../img/tcp_dump.png) 您可以结合其他工具和基础设施使用这些数据,例如进行流量回放、旁路验证等。 diff --git a/docs/docs/start/oss/oss.md b/docs/zh/start/oss/oss.md similarity index 100% rename from docs/docs/start/oss/oss.md rename to docs/zh/start/oss/oss.md diff --git a/docs/docs/start/phone/start.md b/docs/zh/start/phone/start.md similarity index 100% rename from docs/docs/start/phone/start.md rename to docs/zh/start/phone/start.md diff --git a/docs/docs/start/pubsub/start.md b/docs/zh/start/pubsub/start.md similarity index 97% rename from docs/docs/start/pubsub/start.md rename to docs/zh/start/pubsub/start.md index 4949fcde68..0df36731da 100644 --- a/docs/docs/start/pubsub/start.md +++ b/docs/zh/start/pubsub/start.md @@ -12,7 +12,7 @@ Layotto Pub/Sub API的设计目标是定义一套统一的消息发布/订阅API 该示例的架构如下图,启动的进程有:redis、一个监听事件的Subscriber程序、Layotto、一个发布事件的Publisher程序 -![img_1.png](/img/mq/start/img_1.png) +![img_1.png](../../../img/mq/start/img_1.png) ### step 1. 启动 Subscriber 程序,订阅事件 @@ -218,4 +218,4 @@ sdk位于`sdk`目录下,用户可以通过sdk调用Layotto提供的API。 #### 了解Pub/Sub API实现原理 -如果您对实现原理感兴趣,或者想扩展一些功能,可以阅读[Pub/Sub API的设计文档](/docs/design/pubsub/pubsub-api-and-compability-with-dapr-component.md) \ No newline at end of file +如果您对实现原理感兴趣,或者想扩展一些功能,可以阅读[Pub/Sub API的设计文档](zh/design/pubsub/pubsub-api-and-compability-with-dapr-component.md) \ No newline at end of file diff --git a/docs/docs/start/rpc/dubbo_json_rpc.md b/docs/zh/start/rpc/dubbo_json_rpc.md similarity index 86% rename from docs/docs/start/rpc/dubbo_json_rpc.md rename to docs/zh/start/rpc/dubbo_json_rpc.md index 2832a05d61..820ddf9649 100644 --- a/docs/docs/start/rpc/dubbo_json_rpc.md +++ b/docs/zh/start/rpc/dubbo_json_rpc.md @@ -1,9 +1,9 @@ -# Dubbo JSON RPC 事例 +# Dubbo JSON RPC Example *注意: 这个例子需要运行在go v1.17下* ## 快速开始 ### step 1. 修改配置文件,加入`dubbo_json_rpc`插件 -![jsonrpc.jpg](/img/rpc/jsonrpc.jpg) +![jsonrpc.jpg](../../../img/rpc/jsonrpc.jpg) ### step 2. 编译运行layotto @@ -57,8 +57,8 @@ go build -o server . go run demo/rpc/dubbo_json_rpc/dubbo_json_client/client.go -d '{"jsonrpc":"2.0","method":"GetUser","params":["A003"],"id":9527}' ``` -![jsonrpc.jpg](/img/rpc/jsonrpcresult.jpg) +![jsonrpc.jpg](../../../img/rpc/jsonrpcresult.jpg) ### 下一步 -如果您对实现原理感兴趣,或者想扩展一些功能,可以阅读[RPC的设计文档](/docs/design/rpc/rpc设计文档.md) +如果您对实现原理感兴趣,或者想扩展一些功能,可以阅读[RPC的设计文档](zh/design/rpc/rpc设计文档.md) diff --git a/docs/docs/start/rpc/helloworld.md b/docs/zh/start/rpc/helloworld.md similarity index 95% rename from docs/docs/start/rpc/helloworld.md rename to docs/zh/start/rpc/helloworld.md index abfa7a6f81..3df61fc838 100644 --- a/docs/docs/start/rpc/helloworld.md +++ b/docs/zh/start/rpc/helloworld.md @@ -34,7 +34,7 @@ go run ${project_path}/demo/rpc/http/echoserver/echoserver.go go run ${project_path}/demo/rpc/http/echoclient/echoclient.go -d 'hello layotto' ``` -![rpchello.png](/img/rpc/rpchello.png) +![rpchello.png](../../../img/rpc/rpchello.png) #### 解释 diff --git a/docs/docs/start/secret/secret_ref.md b/docs/zh/start/secret/secret_ref.md similarity index 100% rename from docs/docs/start/secret/secret_ref.md rename to docs/zh/start/secret/secret_ref.md diff --git a/docs/docs/start/secret/start.md b/docs/zh/start/secret/start.md similarity index 100% rename from docs/docs/start/secret/start.md rename to docs/zh/start/secret/start.md diff --git a/docs/docs/start/sequencer/start.md b/docs/zh/start/sequencer/start.md similarity index 96% rename from docs/docs/start/sequencer/start.md rename to docs/zh/start/sequencer/start.md index 63a5309871..e99e564ee3 100644 --- a/docs/docs/start/sequencer/start.md +++ b/docs/zh/start/sequencer/start.md @@ -10,7 +10,7 @@ Sequencer API支持声明对自增的需求,包括趋势递增(WEAK)和严格 该示例的架构如下图,启动的进程有:Etcd、Layotto、客户端程程序 -![img.png](/img/sequencer/etcd/img.png) +![img.png](../../../img/sequencer/etcd/img.png) ### step 1. 启动 etcd 和 Layotto @@ -181,7 +181,7 @@ go sdk位于`sdk`目录下,java sdk 在 https://github.com/layotto/java-sdk #### 想要详细了解Sequencer API? Sequencer API是干嘛的,解决什么问题,我应该在什么场景使用它? -如果您产生了这样的困惑,想要了解Sequencer API的更多使用细节,可以进一步阅读[Sequencer API使用文档](/docs/api_reference/sequencer/reference) +如果您产生了这样的困惑,想要了解Sequencer API的更多使用细节,可以进一步阅读[Sequencer API使用文档](zh/api_reference/sequencer/reference) #### 细节以后再说,继续体验其他API 通过左侧的导航栏,继续体验别的API吧! @@ -189,4 +189,4 @@ Sequencer API是干嘛的,解决什么问题,我应该在什么场景使用 #### 了解Sequencer API的实现原理 -如果您对实现原理感兴趣,或者想扩展一些功能,可以阅读[Sequencer API的设计文档](/docs/design/sequencer/design.md) \ No newline at end of file +如果您对实现原理感兴趣,或者想扩展一些功能,可以阅读[Sequencer API的设计文档](zh/design/sequencer/design.md) \ No newline at end of file diff --git a/docs/docs/start/sms/start.md b/docs/zh/start/sms/start.md similarity index 98% rename from docs/docs/start/sms/start.md rename to docs/zh/start/sms/start.md index ed713f57b9..1a145566cd 100644 --- a/docs/docs/start/sms/start.md +++ b/docs/zh/start/sms/start.md @@ -1,5 +1,5 @@ -# 如何调用 Layotto SmsService API +# SmsService API demo 本示例演示如何调用 Layotto SmsService API. diff --git a/docs/docs/start/state/start.md b/docs/zh/start/state/start.md similarity index 96% rename from docs/docs/start/state/start.md rename to docs/zh/start/state/start.md index 5e1beb3f59..cfff537990 100644 --- a/docs/docs/start/state/start.md +++ b/docs/zh/start/state/start.md @@ -10,7 +10,7 @@ API支持批量CRUD操作,支持声明对并发安全和数据一致性的要 该示例的架构如下图,启动的进程有:Redis、Layotto、客户端程程序 -![img.png](/img/state/img.png) +![img.png](../../../img/state/img.png) ### step 1. 启动 Redis 和 Layotto @@ -46,7 +46,7 @@ docker pull redis:latest docker images ``` -![img.png](/img/mq/start/img.png) +![img.png](../../../img/mq/start/img.png) 3. 运行容器 @@ -185,7 +185,7 @@ sdk位于`sdk`目录下,用户可以通过sdk调用Layotto提供的API。 #### 想要详细了解State API? State API是干嘛的,解决什么问题,我应该在什么场景使用它? -如果您产生了这样的困惑,想要了解State API的更多细节,可以进一步阅读[State API使用文档](/docs/building_blocks/state/reference.md) +如果您产生了这样的困惑,想要了解State API的更多细节,可以进一步阅读[State API使用文档](zh/building_blocks/state/reference) #### 细节以后再说,继续体验其他API 通过左侧的导航栏,继续体验别的API吧! \ No newline at end of file diff --git a/docs/docs/start/stream_filter/flow_control.md b/docs/zh/start/stream_filter/flow_control.md similarity index 94% rename from docs/docs/start/stream_filter/flow_control.md rename to docs/zh/start/stream_filter/flow_control.md index 7eb85708b7..183d44298e 100644 --- a/docs/docs/start/stream_filter/flow_control.md +++ b/docs/zh/start/stream_filter/flow_control.md @@ -1,6 +1,6 @@ -# 方法级别流量控制 +## 方法级别流量控制 -## 功能介绍 +### 功能介绍 在[runtime_config.json](https://github.com/mosn/layotto/blob/main/configs/runtime_config.json) 中,有一段关于限流的配置如下: @@ -27,7 +27,7 @@ 对应的调用端代码在[client.go](https://github.com/mosn/layotto/blob/main/demo/flowcontrol/client.go) 中,代码逻辑很简单,就是想服务端发起10次调用,调用结果如下: -![img.png](/img/flow_control.png) +![img.png](../../../img/flow_control.png) 可以看到前5次请求正常,后5次请求被限流。 diff --git a/docs/docs/start/trace/jaeger.md b/docs/zh/start/trace/jaeger.md similarity index 100% rename from docs/docs/start/trace/jaeger.md rename to docs/zh/start/trace/jaeger.md diff --git a/docs/docs/start/trace/prometheus.md b/docs/zh/start/trace/prometheus.md similarity index 100% rename from docs/docs/start/trace/prometheus.md rename to docs/zh/start/trace/prometheus.md diff --git a/docs/docs/start/trace/skywalking.md b/docs/zh/start/trace/skywalking.md similarity index 98% rename from docs/docs/start/trace/skywalking.md rename to docs/zh/start/trace/skywalking.md index 905a68eace..55aea56526 100644 --- a/docs/docs/start/trace/skywalking.md +++ b/docs/zh/start/trace/skywalking.md @@ -75,7 +75,7 @@ go run client.go 访问 http://127.0.0.1:8080 -![](/img/trace/sky.png) +![](../../../img/trace/sky.png) ## 清理资源 如果您使用 Docker 启动 Layotto,记得删除容器: diff --git a/docs/docs/start/trace/trace.md b/docs/zh/start/trace/trace.md similarity index 97% rename from docs/docs/start/trace/trace.md rename to docs/zh/start/trace/trace.md index e3b76ec006..0169bf230b 100644 --- a/docs/docs/start/trace/trace.md +++ b/docs/zh/start/trace/trace.md @@ -50,7 +50,7 @@ go build -o layotto 查看layotto的日志,会看到打印出详细的链路追踪日志: -![img.png](/img/trace/trace.png) +![img.png](../../../img/trace/trace.png) ### 配置参数说明 @@ -80,7 +80,7 @@ Layotto中的 Tracing 会对grpc调用进行记录,依赖于在grpc里添加 ### Trace 框架的设计 整体结构图: -![img.png](/img/trace/structure.png) +![img.png](../../../img/trace/structure.png) #### Span结构: @@ -152,7 +152,7 @@ _ = variable.Set(ctx, types.VariableTraceSpan, span) trace打印的结果如下: -![img.png](/img/trace/trace.png) +![img.png](../../../img/trace/trace.png) ## 2. Metrics管理 @@ -168,7 +168,7 @@ curl --location --request GET 'http://127.0.0.1:34903/metrics' 结果如下图所示: -![img.png](/img/trace/metric.png) +![img.png](../../../img/trace/metric.png) ### 配置解释 解释一下[config_standalone.json](https://github.com/mosn/layotto/blob/main/configs/config_standalone.json) 里 metrics 相关配置 diff --git a/docs/docs/start/trace/zipkin.md b/docs/zh/start/trace/zipkin.md similarity index 100% rename from docs/docs/start/trace/zipkin.md rename to docs/zh/start/trace/zipkin.md diff --git a/docs/docs/start/uds/start.md b/docs/zh/start/uds/start.md similarity index 100% rename from docs/docs/start/uds/start.md rename to docs/zh/start/uds/start.md diff --git a/docs/docs/start/wasm/start.md b/docs/zh/start/wasm/start.md similarity index 87% rename from docs/docs/start/wasm/start.md rename to docs/zh/start/wasm/start.md index dc6885d547..fb3914384c 100644 --- a/docs/docs/start/wasm/start.md +++ b/docs/zh/start/wasm/start.md @@ -1,14 +1,14 @@ -# 将业务逻辑通过WASM下沉进sidecar -## 功能介绍 +## 将业务逻辑通过WASM下沉进sidecar +### 功能介绍 service mesh 和 multi-runtime 的 sidecar 是全公司通用的基础设施,但实践中,业务系统也会有自己的sdk,也会有推动用户升级难、版本碎片的问题. 比如某中台系统以jar包形式开发了sdk,供上层业务系统使用。他们的feature不算全公司通用,因此没法说服中间件团队、开发到公司统一的sidecar里。 -![img_1.png](/img/wasm/img_1.png) +![img_1.png](../../../img/wasm/img_1.png) 而如果变成这样: -![img.png](/img/wasm/img.png) +![img.png](../../../img/wasm/img.png) 如果开发者不再开发sdk(jar包),改成开发.wasm文件、支持独立升级部署,就没有推动业务方升级的痛苦了,想要升级的时候在运维平台上操作发布即可,不需要app和sidecar重启 @@ -98,22 +98,22 @@ docker rm -f redis-test ```json "config": { -"function1": { -"name": "function1", -"instance_num": 1, -"vm_config": { -"engine": "wasmtime", -"path": "demo/faas/code/golang/client/function_1.wasm" -} -}, -"function2": { -"name": "function2", -"instance_num": 1, -"vm_config": { -"engine": "wasmtime", -"path": "demo/faas/code/golang/server/function_2.wasm" -} -} + "function1": { + "name": "function1", + "instance_num": 1, + "vm_config": { + "engine": "wasmtime", + "path": "demo/faas/code/golang/client/function_1.wasm" + } + }, + "function2": { + "name": "function2", + "instance_num": 1, + "vm_config": { + "engine": "wasmtime", + "path": "demo/faas/code/golang/server/function_2.wasm" + } + } } ``` diff --git a/docs/docs/video/README.md b/docs/zh/video/README.md similarity index 100% rename from docs/docs/video/README.md rename to docs/zh/video/README.md diff --git a/docs/docs/video/a-new-chapter-in-service-mesh-application-runtime.md b/docs/zh/video/a-new-chapter-in-service-mesh-application-runtime.md similarity index 100% rename from docs/docs/video/a-new-chapter-in-service-mesh-application-runtime.md rename to docs/zh/video/a-new-chapter-in-service-mesh-application-runtime.md diff --git a/docs/docs/video/inject-soul-into-sidecar.md b/docs/zh/video/inject-soul-into-sidecar.md similarity index 100% rename from docs/docs/video/inject-soul-into-sidecar.md rename to docs/zh/video/inject-soul-into-sidecar.md diff --git a/etc/script/check-dead-link.sh b/etc/script/check-dead-link.sh index 3f62bdfb7a..9fa1d1867f 100644 --- a/etc/script/check-dead-link.sh +++ b/etc/script/check-dead-link.sh @@ -6,11 +6,9 @@ NC='\033[0m' # No Color GREEN='\033[0;32m' YELLOW='\033[0;33m' -#for file in $(find . -name "*.md"); do -#for file in $(find docs/blog -name "*.md"); do -# markdown-link-check -c .github/dead_link_check_config.json -q "$file" >> result.txt 2>&1 -#done - markdown-link-check -c .github/dead_link_check_config.json -q docs/docs/README.md >> result.txt 2>&1 +for file in $(find . -name "*.md"); do + markdown-link-check -c .github/dead_link_check_config.json -q "$file" >> result.txt 2>&1 +done if [ -e result.txt ] ; then cat result.txt diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index c347b85b03..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,14952 +0,0 @@ -{ - "name": "layotto-docusaurus", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "layotto-docusaurus", - "version": "0.0.0", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/preset-classic": "3.4.0", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "markdown-link-check": "^3.12.2", - "prism-react-renderer": "^2.3.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "3.4.0", - "@docusaurus/types": "3.4.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", - "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", - "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", - "@algolia/autocomplete-shared": "1.9.3" - } - }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", - "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", - "dependencies": { - "@algolia/autocomplete-shared": "1.9.3" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", - "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", - "dependencies": { - "@algolia/autocomplete-shared": "1.9.3" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", - "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.3.tgz", - "integrity": "sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==", - "dependencies": { - "@algolia/cache-common": "4.23.3" - } - }, - "node_modules/@algolia/cache-common": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.3.tgz", - "integrity": "sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==" - }, - "node_modules/@algolia/cache-in-memory": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.3.tgz", - "integrity": "sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==", - "dependencies": { - "@algolia/cache-common": "4.23.3" - } - }, - "node_modules/@algolia/client-account": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.3.tgz", - "integrity": "sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==", - "dependencies": { - "@algolia/client-common": "4.23.3", - "@algolia/client-search": "4.23.3", - "@algolia/transporter": "4.23.3" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.3.tgz", - "integrity": "sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==", - "dependencies": { - "@algolia/client-common": "4.23.3", - "@algolia/client-search": "4.23.3", - "@algolia/requester-common": "4.23.3", - "@algolia/transporter": "4.23.3" - } - }, - "node_modules/@algolia/client-common": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.3.tgz", - "integrity": "sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==", - "dependencies": { - "@algolia/requester-common": "4.23.3", - "@algolia/transporter": "4.23.3" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.3.tgz", - "integrity": "sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==", - "dependencies": { - "@algolia/client-common": "4.23.3", - "@algolia/requester-common": "4.23.3", - "@algolia/transporter": "4.23.3" - } - }, - "node_modules/@algolia/client-search": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.3.tgz", - "integrity": "sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==", - "dependencies": { - "@algolia/client-common": "4.23.3", - "@algolia/requester-common": "4.23.3", - "@algolia/transporter": "4.23.3" - } - }, - "node_modules/@algolia/events": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" - }, - "node_modules/@algolia/logger-common": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.3.tgz", - "integrity": "sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==" - }, - "node_modules/@algolia/logger-console": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.3.tgz", - "integrity": "sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==", - "dependencies": { - "@algolia/logger-common": "4.23.3" - } - }, - "node_modules/@algolia/recommend": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.3.tgz", - "integrity": "sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.23.3", - "@algolia/cache-common": "4.23.3", - "@algolia/cache-in-memory": "4.23.3", - "@algolia/client-common": "4.23.3", - "@algolia/client-search": "4.23.3", - "@algolia/logger-common": "4.23.3", - "@algolia/logger-console": "4.23.3", - "@algolia/requester-browser-xhr": "4.23.3", - "@algolia/requester-common": "4.23.3", - "@algolia/requester-node-http": "4.23.3", - "@algolia/transporter": "4.23.3" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.3.tgz", - "integrity": "sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==", - "dependencies": { - "@algolia/requester-common": "4.23.3" - } - }, - "node_modules/@algolia/requester-common": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.3.tgz", - "integrity": "sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==" - }, - "node_modules/@algolia/requester-node-http": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.3.tgz", - "integrity": "sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==", - "dependencies": { - "@algolia/requester-common": "4.23.3" - } - }, - "node_modules/@algolia/transporter": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.3.tgz", - "integrity": "sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==", - "dependencies": { - "@algolia/cache-common": "4.23.3", - "@algolia/logger-common": "4.23.3", - "@algolia/requester-common": "4.23.3" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", - "dependencies": { - "@babel/types": "^7.24.7", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", - "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", - "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", - "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", - "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", - "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-wrap-function": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", - "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", - "dependencies": { - "@babel/helper-function-name": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", - "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", - "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", - "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", - "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", - "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", - "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", - "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", - "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", - "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", - "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", - "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", - "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", - "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", - "dependencies": { - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", - "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", - "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.7.tgz", - "integrity": "sha512-7LidzZfUXyfZ8/buRW6qIIHBY8wAZ1OrY9c/wTr8YhZ6vMPo+Uc/CVFLYY1spZrEQlD4w5u8wjqk5NQ3OVqQKA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", - "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz", - "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", - "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", - "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", - "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", - "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz", - "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-typescript": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", - "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", - "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.24.7", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.24.7", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.24.7", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.7", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.24.7", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.24.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-modules-systemjs": "^7.24.7", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.7", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz", - "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.24.7", - "@babel/plugin-transform-react-jsx-development": "^7.24.7", - "@babel/plugin-transform-react-pure-annotations": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", - "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, - "node_modules/@babel/runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", - "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.7.tgz", - "integrity": "sha512-eytSX6JLBY6PVAeQa2bFlDx/7Mmln/gaEpsit5a3WEvjGfiIytEsgAwuIXCPM0xvw0v0cJn3ilq0/TvXrW0kgA==", - "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", - "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docsearch/css": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", - "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==" - }, - "node_modules/@docsearch/react": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", - "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", - "dependencies": { - "@algolia/autocomplete-core": "1.9.3", - "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.6.0", - "algoliasearch": "^4.19.1" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0", - "search-insights": ">= 1 < 3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } - } - }, - "node_modules/@docusaurus/core": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.4.0.tgz", - "integrity": "sha512-g+0wwmN2UJsBqy2fQRQ6fhXruoEa62JDeEa5d8IdTJlMoaDaEDfHh7WjwGRn4opuTQWpjAwP/fbcgyHKlE+64w==", - "dependencies": { - "@babel/core": "^7.23.3", - "@babel/generator": "^7.23.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.22.9", - "@babel/preset-env": "^7.22.9", - "@babel/preset-react": "^7.22.5", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@babel/runtime-corejs3": "^7.22.6", - "@babel/traverse": "^7.22.8", - "@docusaurus/cssnano-preset": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "autoprefixer": "^10.4.14", - "babel-loader": "^9.1.3", - "babel-plugin-dynamic-import-node": "^2.3.3", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "clean-css": "^5.3.2", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.31.1", - "css-loader": "^6.8.1", - "css-minimizer-webpack-plugin": "^5.0.1", - "cssnano": "^6.1.2", - "del": "^6.1.1", - "detect-port": "^1.5.1", - "escape-html": "^1.0.3", - "eta": "^2.2.0", - "eval": "^0.1.8", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "html-minifier-terser": "^7.2.0", - "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.5.3", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.7.6", - "p-map": "^4.0.0", - "postcss": "^8.4.26", - "postcss-loader": "^7.3.3", - "prompts": "^2.4.2", - "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.4", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.4", - "rtl-detect": "^1.0.4", - "semver": "^7.5.4", - "serve-handler": "^6.1.5", - "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.9", - "tslib": "^2.6.0", - "update-notifier": "^6.0.2", - "url-loader": "^4.1.1", - "webpack": "^5.88.1", - "webpack-bundle-analyzer": "^4.9.0", - "webpack-dev-server": "^4.15.1", - "webpack-merge": "^5.9.0", - "webpackbar": "^5.0.2" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.4.0.tgz", - "integrity": "sha512-qwLFSz6v/pZHy/UP32IrprmH5ORce86BGtN0eBtG75PpzQJAzp9gefspox+s8IEOr0oZKuQ/nhzZ3xwyc3jYJQ==", - "dependencies": { - "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.4.38", - "postcss-sort-media-queries": "^5.2.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/logger": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.4.0.tgz", - "integrity": "sha512-bZwkX+9SJ8lB9kVRkXw+xvHYSMGG4bpYHKGXeXFvyVc79NMeeBSGgzd4TQLHH+DYeOJoCdl8flrFJVxlZ0wo/Q==", - "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/mdx-loader": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.4.0.tgz", - "integrity": "sha512-kSSbrrk4nTjf4d+wtBA9H+FGauf2gCax89kV8SUSJu3qaTdSIKdWERlngsiHaCFgZ7laTJ8a67UFf+xlFPtuTw==", - "dependencies": { - "@docusaurus/logger": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^1.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.4.0.tgz", - "integrity": "sha512-A1AyS8WF5Bkjnb8s+guTDuYmUiwJzNrtchebBHpc0gz0PyHJNMaybUlSrmJjHVcGrya0LKI4YcR3lBDQfXRYLw==", - "dependencies": { - "@docusaurus/types": "3.4.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.4.0.tgz", - "integrity": "sha512-vv6ZAj78ibR5Jh7XBUT4ndIjmlAxkijM3Sx5MAAzC1gyv0vupDQNhzuFg1USQmQVj3P5I6bquk12etPV3LJ+Xw==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "cheerio": "^1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "reading-time": "^1.5.0", - "srcset": "^4.0.0", - "tslib": "^2.6.0", - "unist-util-visit": "^5.0.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.4.0.tgz", - "integrity": "sha512-HkUCZffhBo7ocYheD9oZvMcDloRnGhBMOZRyVcAQRFmZPmNqSyISlXA1tQCIxW+r478fty97XXAGjNYzBjpCsg==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/module-type-aliases": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "@types/react-router-config": "^5.0.7", - "combine-promises": "^1.1.0", - "fs-extra": "^11.1.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.4.0.tgz", - "integrity": "sha512-h2+VN/0JjpR8fIkDEAoadNjfR3oLzB+v1qSXbIAKjQ46JAHx3X22n9nqS+BWSQnTnp1AjkjSvZyJMekmcwxzxg==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-debug": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.4.0.tgz", - "integrity": "sha512-uV7FDUNXGyDSD3PwUaf5YijX91T5/H9SX4ErEcshzwgzWwBtK37nUWPU3ZLJfeTavX3fycTOqk9TglpOLaWkCg==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "fs-extra": "^11.1.1", - "react-json-view-lite": "^1.2.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.4.0.tgz", - "integrity": "sha512-mCArluxEGi3cmYHqsgpGGt3IyLCrFBxPsxNZ56Mpur0xSlInnIHoeLDH7FvVVcPJRPSQ9/MfRqLsainRw+BojA==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.4.0.tgz", - "integrity": "sha512-Dsgg6PLAqzZw5wZ4QjUYc8Z2KqJqXxHxq3vIoyoBWiLEEfigIs7wHR+oiWUQy3Zk9MIk6JTYj7tMoQU0Jm3nqA==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "@types/gtag.js": "^0.0.12", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.4.0.tgz", - "integrity": "sha512-O9tX1BTwxIhgXpOLpFDueYA9DWk69WCbDRrjYoMQtFHSkTyE7RhNgyjSPREUWJb9i+YUg3OrsvrBYRl64FCPCQ==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.4.0.tgz", - "integrity": "sha512-+0VDvx9SmNrFNgwPoeoCha+tRoAjopwT0+pYO1xAbyLcewXSemq+eLxEa46Q1/aoOaJQ0qqHELuQM7iS2gp33Q==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "fs-extra": "^11.1.1", - "sitemap": "^7.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/preset-classic": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.4.0.tgz", - "integrity": "sha512-Ohj6KB7siKqZaQhNJVMBBUzT3Nnp6eTKqO+FXO3qu/n1hJl3YLwVKTWBg28LF7MWrKu46UuYavwMRxud0VyqHg==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/plugin-content-blog": "3.4.0", - "@docusaurus/plugin-content-docs": "3.4.0", - "@docusaurus/plugin-content-pages": "3.4.0", - "@docusaurus/plugin-debug": "3.4.0", - "@docusaurus/plugin-google-analytics": "3.4.0", - "@docusaurus/plugin-google-gtag": "3.4.0", - "@docusaurus/plugin-google-tag-manager": "3.4.0", - "@docusaurus/plugin-sitemap": "3.4.0", - "@docusaurus/theme-classic": "3.4.0", - "@docusaurus/theme-common": "3.4.0", - "@docusaurus/theme-search-algolia": "3.4.0", - "@docusaurus/types": "3.4.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-classic": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.4.0.tgz", - "integrity": "sha512-0IPtmxsBYv2adr1GnZRdMkEQt1YW6tpzrUPj02YxNpvJ5+ju4E13J5tB4nfdaen/tfR1hmpSPlTFPvTf4kwy8Q==", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/module-type-aliases": "3.4.0", - "@docusaurus/plugin-content-blog": "3.4.0", - "@docusaurus/plugin-content-docs": "3.4.0", - "@docusaurus/plugin-content-pages": "3.4.0", - "@docusaurus/theme-common": "3.4.0", - "@docusaurus/theme-translations": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "copy-text-to-clipboard": "^3.2.0", - "infima": "0.2.0-alpha.43", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.4.26", - "prism-react-renderer": "^2.3.0", - "prismjs": "^1.29.0", - "react-router-dom": "^5.3.4", - "rtlcss": "^4.1.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-common": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.4.0.tgz", - "integrity": "sha512-0A27alXuv7ZdCg28oPE8nH/Iz73/IUejVaCazqu9elS4ypjiLhK3KfzdSQBnL/g7YfHSlymZKdiOHEo8fJ0qMA==", - "dependencies": { - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/module-type-aliases": "3.4.0", - "@docusaurus/plugin-content-blog": "3.4.0", - "@docusaurus/plugin-content-docs": "3.4.0", - "@docusaurus/plugin-content-pages": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^2.0.0", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^2.3.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.4.0.tgz", - "integrity": "sha512-aiHFx7OCw4Wck1z6IoShVdUWIjntC8FHCw9c5dR8r3q4Ynh+zkS8y2eFFunN/DL6RXPzpnvKCg3vhLQYJDmT9Q==", - "dependencies": { - "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/plugin-content-docs": "3.4.0", - "@docusaurus/theme-common": "3.4.0", - "@docusaurus/theme-translations": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "algoliasearch": "^4.18.0", - "algoliasearch-helper": "^3.13.3", - "clsx": "^2.0.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-translations": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.4.0.tgz", - "integrity": "sha512-zSxCSpmQCCdQU5Q4CnX/ID8CSUUI3fvmq4hU/GNP/XoAWtXo9SAVnM3TzpU8Gb//H3WCsT8mJcTfyOk3d9ftNg==", - "dependencies": { - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", - "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/utils": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.4.0.tgz", - "integrity": "sha512-fRwnu3L3nnWaXOgs88BVBmG1yGjcQqZNHG+vInhEa2Sz2oQB+ZjbEMO5Rh9ePFpZ0YDiDUhpaVjwmS+AU2F14g==", - "dependencies": { - "@docusaurus/logger": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@svgr/webpack": "^8.1.0", - "escape-string-regexp": "^4.0.0", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "github-slugger": "^1.5.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "jiti": "^1.20.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "prompts": "^2.4.2", - "resolve-pathname": "^3.0.0", - "shelljs": "^0.8.5", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } - } - }, - "node_modules/@docusaurus/utils-common": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.4.0.tgz", - "integrity": "sha512-NVx54Wr4rCEKsjOH5QEVvxIqVvm+9kh7q8aYTU5WzUU9/Hctd6aTrcZ3G0Id4zYJ+AeaG5K5qHA4CY5Kcm2iyQ==", - "dependencies": { - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } - } - }, - "node_modules/@docusaurus/utils-validation": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.4.0.tgz", - "integrity": "sha512-hYQ9fM+AXYVTWxJOT1EuNaRnrR2WGpRdLDQG07O8UOpsvCPWUVOeo26Rbm0JWY2sGLfzAb+tvJ62yF+8F+TV0g==", - "dependencies": { - "@docusaurus/logger": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" - }, - "node_modules/@mdx-js/mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", - "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-to-js": "^2.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-estree": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "periscopic": "^3.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/react": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", - "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", - "dependencies": { - "@types/mdx": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.25", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", - "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==" - }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@slorber/remark-comment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", - "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.1.0", - "micromark-util-symbol": "^1.0.1" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", - "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/webpack": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", - "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/acorn": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", - "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz", - "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/gtag.js": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" - }, - "node_modules/@types/node": { - "version": "20.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", - "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, - "node_modules/@types/prismjs": { - "version": "1.26.4", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.4.tgz", - "integrity": "sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" - }, - "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "node_modules/@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-config": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", - "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "node_modules/@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/algoliasearch": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.3.tgz", - "integrity": "sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.23.3", - "@algolia/cache-common": "4.23.3", - "@algolia/cache-in-memory": "4.23.3", - "@algolia/client-account": "4.23.3", - "@algolia/client-analytics": "4.23.3", - "@algolia/client-common": "4.23.3", - "@algolia/client-personalization": "4.23.3", - "@algolia/client-search": "4.23.3", - "@algolia/logger-common": "4.23.3", - "@algolia/logger-console": "4.23.3", - "@algolia/recommend": "4.23.3", - "@algolia/requester-browser-xhr": "4.23.3", - "@algolia/requester-common": "4.23.3", - "@algolia/requester-node-http": "4.23.3", - "@algolia/transporter": "4.23.3" - } - }, - "node_modules/algoliasearch-helper": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.21.0.tgz", - "integrity": "sha512-hjVOrL15I3Y3K8xG0icwG1/tWE+MocqBrhW6uVBWpU+/kVEMK0BnM2xdssj6mZM61eJ4iRxHR0djEI3ENOpR8w==", - "dependencies": { - "@algolia/events": "^4.0.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/astring": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", - "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", - "bin": { - "astring": "bin/astring" - } - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001632", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001632.tgz", - "integrity": "sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-table3/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/collapse-white-space": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "node_modules/combine-promises": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", - "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compressible/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/copy-text-to-clipboard": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", - "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", - "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", - "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", - "dependencies": { - "browserslist": "^4.23.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.1.tgz", - "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "cssnano": "^6.0.1", - "jest-worker": "^29.4.3", - "postcss": "^8.4.24", - "schema-utils": "^4.0.1", - "serialize-javascript": "^6.0.1" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", - "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", - "dependencies": { - "cssnano-preset-default": "^6.1.2", - "lilconfig": "^3.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-advanced": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", - "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", - "dependencies": { - "autoprefixer": "^10.4.19", - "browserslist": "^4.23.0", - "cssnano-preset-default": "^6.1.2", - "postcss-discard-unused": "^6.0.5", - "postcss-merge-idents": "^6.0.3", - "postcss-reduce-idents": "^6.0.3", - "postcss-zindex": "^6.0.2" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-default": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", - "dependencies": { - "browserslist": "^4.23.0", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^4.0.2", - "postcss-calc": "^9.0.1", - "postcss-colormin": "^6.1.0", - "postcss-convert-values": "^6.1.0", - "postcss-discard-comments": "^6.0.2", - "postcss-discard-duplicates": "^6.0.3", - "postcss-discard-empty": "^6.0.3", - "postcss-discard-overridden": "^6.0.2", - "postcss-merge-longhand": "^6.0.5", - "postcss-merge-rules": "^6.1.1", - "postcss-minify-font-values": "^6.1.0", - "postcss-minify-gradients": "^6.0.3", - "postcss-minify-params": "^6.1.0", - "postcss-minify-selectors": "^6.0.4", - "postcss-normalize-charset": "^6.0.2", - "postcss-normalize-display-values": "^6.0.2", - "postcss-normalize-positions": "^6.0.2", - "postcss-normalize-repeat-style": "^6.0.2", - "postcss-normalize-string": "^6.0.2", - "postcss-normalize-timing-functions": "^6.0.2", - "postcss-normalize-unicode": "^6.1.0", - "postcss-normalize-url": "^6.0.2", - "postcss-normalize-whitespace": "^6.0.2", - "postcss-ordered-values": "^6.0.2", - "postcss-reduce-initial": "^6.1.0", - "postcss-reduce-transforms": "^6.0.2", - "postcss-svgo": "^6.0.3", - "postcss-unique-selectors": "^6.0.4" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-utils": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" - }, - "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "node_modules/detect-port": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.799", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.799.tgz", - "integrity": "sha512-3D3DwWkRTzrdEpntY0hMLYwj7SeBk1138CkPE8sBDSj3WzrzOiG2rHm3luw8jucpf+WiyLBCZyU9lMHyQI9M9Q==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/emoticon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz", - "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", - "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==" - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-util-attach-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-build-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-walker": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-to-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-value-to-estree": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.1.tgz", - "integrity": "sha512-5mvUrF2suuv5f5cGDnDphIy4/gW86z82kl5qG6mM9z04SEQI4FB5Apmaw/TGEf3l55nLtMs5s51dmhUzvAHQCA==", - "dependencies": { - "@types/estree": "^1.0.0", - "is-plain-obj": "^4.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/remcohaszing" - } - }, - "node_modules/estree-util-visit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eta": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", - "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "url": "https://github.com/eta-dev/eta?sponsor=1" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "dependencies": { - "@types/node": "*", - "require-like": ">= 0.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/express/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "dependencies": { - "xml-js": "^1.6.11" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/file-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/file-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^8.0.0", - "property-information": "^6.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.3.tgz", - "integrity": "sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-estree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", - "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-attach-comments": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unist-util-position": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", - "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", - "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", - "dependencies": { - "inline-style-parser": "0.2.3" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", - "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "node_modules/html-link-extractor": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-link-extractor/-/html-link-extractor-1.0.5.tgz", - "integrity": "sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==", - "dependencies": { - "cheerio": "^1.0.0-rc.10" - } - }, - "node_modules/html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "engines": { - "node": ">=14" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", - "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/html-webpack-plugin/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/infima": { - "version": "0.2.0-alpha.43", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", - "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" - }, - "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-absolute-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", - "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-relative-url": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-4.0.0.tgz", - "integrity": "sha512-PkzoL1qKAYXNFct5IKdKRH/iBQou/oCC85QhXj6WKtUQBliZ4Yfd3Zk27RHu9KQG8r6zgvAA2AQKC9p+rqTszg==", - "dependencies": { - "is-absolute-url": "^4.0.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/isemail": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", - "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", - "dependencies": { - "punycode": "2.x.x" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/isemail/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/joi": { - "version": "17.13.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.1.tgz", - "integrity": "sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/link-check": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/link-check/-/link-check-5.3.0.tgz", - "integrity": "sha512-Jhb7xueDgQgBaZzkfOtAyOZEZAIMJQIjUpYD2QY/zEB+LKTY1tWiBwZg8QIDbzQdPBOcqzg7oLQDNcES/tQmXg==", - "dependencies": { - "is-relative-url": "^4.0.0", - "isemail": "^3.2.0", - "ms": "^2.1.3", - "needle": "^3.3.1", - "proxy-agent": "^6.4.0" - } - }, - "node_modules/link-check/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/markdown-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-link-check": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/markdown-link-check/-/markdown-link-check-3.12.2.tgz", - "integrity": "sha512-GWMwSvxuZn+uGGydi5yywnnDZy08SGps4I/63xqvWT7lxtH4cVLnhgZZYtEcPz/QvgPg9vbH2rvWpa29owMtHA==", - "dependencies": { - "async": "^3.2.5", - "chalk": "^5.3.0", - "commander": "^12.1.0", - "link-check": "^5.3.0", - "lodash": "^4.17.21", - "markdown-link-extractor": "^4.0.2", - "needle": "^3.3.1", - "progress": "^2.0.3", - "proxy-agent": "^6.4.0" - }, - "bin": { - "markdown-link-check": "markdown-link-check" - } - }, - "node_modules/markdown-link-check/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/markdown-link-check/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/markdown-link-extractor": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/markdown-link-extractor/-/markdown-link-extractor-4.0.2.tgz", - "integrity": "sha512-5cUOu4Vwx1wenJgxaudsJ8xwLUMN7747yDJX3V/L7+gi3e4MsCm7w5nbrDQQy8nEfnl4r5NV3pDXMAjhGXYXAw==", - "dependencies": { - "html-link-extractor": "^1.0.5", - "marked": "^12.0.1" - } - }, - "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/marked": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", - "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mdast-util-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", - "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", - "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/mdast-util-frontmatter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", - "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "escape-string-regexp": "^5.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", - "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz", - "integrity": "sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-frontmatter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", - "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", - "dependencies": { - "fault": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", - "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", - "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", - "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-mdx-md": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", - "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^3.0.0", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs-esm": "^3.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", - "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-space/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-character/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", - "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", - "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", - "dependencies": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-emoji": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", - "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.5", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-convert-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-comments": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-empty": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-unused": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", - "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-loader": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", - "dependencies": { - "cosmiconfig": "^8.3.5", - "jiti": "^1.20.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-merge-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", - "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^4.0.2", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", - "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-params": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", - "dependencies": { - "browserslist": "^4.23.0", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-string": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-url": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-ordered-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", - "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-sort-media-queries": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", - "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", - "dependencies": { - "sort-css-media-queries": "2.2.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.4.23" - } - }, - "node_modules/postcss-svgo": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.2.0" - }, - "engines": { - "node": "^14 || ^16 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/postcss-zindex": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", - "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/prism-react-renderer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", - "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", - "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-dev-utils/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", - "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dev-utils/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" - }, - "node_modules/react-helmet-async": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-json-view-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.4.0.tgz", - "integrity": "sha512-wh6F6uJyYAmQ4fK0e8dSQMEWuvTs2Wr3el3sLD9bambX1+pSWUVXIz1RFaoy3TI1mZ0FqdpKq9YgbgTTgyrmXA==", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-loadable": { - "name": "@docusaurus/react-loadable", - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", - "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", - "dependencies": { - "@types/react": "*" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "dependencies": { - "@babel/runtime": "^7.10.3" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "react-loadable": "*", - "webpack": ">=4.41.1 || 5.x" - } - }, - "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "dependencies": { - "@babel/runtime": "^7.1.2" - }, - "peerDependencies": { - "react": ">=15", - "react-router": ">=5" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reading-time": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remark-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", - "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-directive": "^3.0.0", - "micromark-extension-directive": "^3.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-emoji": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", - "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", - "dependencies": { - "@types/mdast": "^4.0.2", - "emoticon": "^4.0.1", - "mdast-util-find-and-replace": "^3.0.1", - "node-emoji": "^2.1.0", - "unified": "^11.0.4" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/remark-frontmatter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", - "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-frontmatter": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", - "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", - "dependencies": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", - "engines": { - "node": "*" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rtl-detect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", - "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==" - }, - "node_modules/rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0", - "postcss": "^8.4.21", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "rtlcss": "bin/rtlcss.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/search-insights": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.14.0.tgz", - "integrity": "sha512-OLN6MsPMCghDOqlCtsIsYgtsC0pnwVTyT9Mu6A3ewOj1DxvzZF6COrn2g86E/c05xbktB0XN04m/t1Z+n+fTGw==", - "peer": true - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/send/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/sitemap": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", - "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", - "dependencies": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "bin": { - "sitemap": "dist/cli.js" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=5.6.0" - } - }, - "node_modules/sitemap/node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" - }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", - "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/sort-css-media-queries": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", - "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", - "engines": { - "node": ">= 6.3.0" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/srcset": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", - "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/stylehacks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.31.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", - "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unified": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", - "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/url-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/url-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/url-loader/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", - "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", - "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/webpack": { - "version": "5.92.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.0.tgz", - "integrity": "sha512-Bsw2X39MYIgxouNATyVpCNVWBCuUwDgWtN78g6lSdPJRLaQ/PUVm/oXcaRAyY/sMFoKFQrsPeqvTizWtq7QPCA==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", - "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", - "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.3", - "pretty-time": "^1.1.0", - "std-env": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "webpack": "3 || 4 || 5" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 61eb4b3687..0000000000 --- a/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "layotto-docusaurus", - "version": "0.0.0", - "private": true, - "scripts": { - "docusaurus": "docusaurus", - "start": "docusaurus start", - "build": "docusaurus build", - "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", - "clear": "docusaurus clear", - "serve": "docusaurus serve", - "write-translations": "docusaurus write-translations", - "write-heading-ids": "docusaurus write-heading-ids", - "translations": "local-crowdin-api translations", - "crowdin:upload": "crowdin upload sources --auto-update --config ./crowdin.yaml", - "crowdin:download": "crowdin download --verbose --config ./crowdin.yaml", - "crowdin:sync": "docusaurus write-translations && crowdin upload && crowdin download" - }, - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/preset-classic": "3.4.0", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "prism-react-renderer": "^2.3.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "3.4.0", - "@docusaurus/types": "3.4.0" - }, - "browserslist": { - "production": [ - ">0.5%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 3 chrome version", - "last 3 firefox version", - "last 5 safari version" - ] - }, - "engines": { - "node": ">=18.0" - } -}