diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index b3973671dc49..0887a43f6e0e 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -1,45 +1,45 @@ -name: Generate Documentation - -permissions: - contents: write +name: Deploy starlight documentation to GitHub Pages on: push: branches: [upload] workflow_dispatch: -concurrency: - group: documentation - cancel-in-progress: true + +defaults: + run: + working-directory: doc + +permissions: + contents: read + pages: write + id-token: write jobs: - documentation: + build: runs-on: ubuntu-22.04 - + environment: github-pages steps: - - name: checkout repository + - name: Checkout your repository using git uses: actions/checkout@v3 - - - name: cache css - id: cache-css - uses: actions/cache@v3 + - name: Install, build, and upload site + uses: withastro/action@v0 with: - key: doxygen-css-cache - path: ./doxygen_doc/doxygen-awesome-css - - - if: ${{ steps.cache-css.outputs.cache-hit != 'true' }} - name: download css - run: | - git clone https://github.com/jothepro/doxygen-awesome-css ./doxygen_doc/doxygen-awesome-css - - name: run doxygen - uses: mattnotmitt/doxygen-action@v1.9.2 - with: - working-directory: . - doxyfile-path: ./doxygen_doc/Doxyfile - # additional-packages: font-fira-code - - - name: deploy - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./doxygen_doc/html/ + path: doc + node-version: 20 + package-manager: pnpm + pnpm-version: 8.7.x + env: + CUSTOM_SITE_URL: ${{ vars.CUSTOM_SITE_URL }} + CUSTOM_REPO_URL: ${{ vars.CUSTOM_REPO_URL }} + + deploy: + needs: build + runs-on: ubuntu-22.04 + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v1 diff --git a/.github/workflows/doxygen.yml b/.github/workflows/doxygen.yml new file mode 100644 index 000000000000..b3973671dc49 --- /dev/null +++ b/.github/workflows/doxygen.yml @@ -0,0 +1,45 @@ +name: Generate Documentation + +permissions: + contents: write + +on: + push: + branches: [upload] + workflow_dispatch: + +concurrency: + group: documentation + cancel-in-progress: true + +jobs: + documentation: + runs-on: ubuntu-22.04 + + steps: + - name: checkout repository + uses: actions/checkout@v3 + + - name: cache css + id: cache-css + uses: actions/cache@v3 + with: + key: doxygen-css-cache + path: ./doxygen_doc/doxygen-awesome-css + + - if: ${{ steps.cache-css.outputs.cache-hit != 'true' }} + name: download css + run: | + git clone https://github.com/jothepro/doxygen-awesome-css ./doxygen_doc/doxygen-awesome-css + - name: run doxygen + uses: mattnotmitt/doxygen-action@v1.9.2 + with: + working-directory: . + doxyfile-path: ./doxygen_doc/Doxyfile + # additional-packages: font-fira-code + + - name: deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./doxygen_doc/html/ diff --git a/LICENSE.txt b/LICENSE.txt index f28164a3970d..25615b7d0bd0 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,5 +1,7 @@ Cataclysm is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. +Documentation site (doc/*, excluding doc/src/content/docs/*) is licensed under the AGPL 3.0-only license, see doc/LICENSE for text of license. + GNU Unifont (data/font/unifont.ttf) is licensed under GNU General Public License v2+ with the GNU font embedding exception. Visit http://unifoundry.com/LICENSE.txt for details. Terminus Font (data/font/terminus.ttf) is licensed under the SIL Open Font License (see LICENSE-OFL-Terminus-Font.txt). @@ -14,8 +16,6 @@ Lua (src/lua/*) is licensed under the MIT license, see src_lua/LICENSE.md for te sol2 (src/sol/*) is licensed under the MIT license, see src/sol/sol.hpp for text of license. - - fmtlib (src/fmtlib_*) is licensed under the MIT license (https://github.com/fmtlib/fmt/blob/master/LICENSE.rst). The full license text is as follows: # Copyright (c) 2012 - present, Victor Zverovich @@ -55,13 +55,13 @@ libbacktrace is licensed under a BSD license (https://github.com/ianlancetaylor/ # met: # (1) Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. +# notice, this list of conditions and the following disclaimer. # (2) Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the -# distribution. - +# distribution. + # (3) The name of the author may not be used to # endorse or promote products derived from this software without # specific prior written permission. diff --git a/Makefile b/Makefile index d4ebcb583b60..fa1832d22cf9 100644 --- a/Makefile +++ b/Makefile @@ -37,7 +37,7 @@ # Run: make NATIVE=win32 # OS X # Run: make NATIVE=osx OSX_MIN=11 -# It is highly recommended to supply OSX_MIN > 10.11 +# It is highly recommended to supply OSX_MIN > 11 # otherwise optimizations are automatically disabled with -O0 # Build types: diff --git a/README.ko.md b/README.ko.md index fd39ffe1f0c4..8f10ab0f1a2a 100644 --- a/README.ko.md +++ b/README.ko.md @@ -1,7 +1,7 @@ # 카타클리즘: 밝은 밤
- + [![en][icon-en]][en] [![ko][icon-ko]][ko] @@ -49,17 +49,15 @@ ## 빌드하기 -[COMPILING.md](doc/COMPILING/COMPILING.md)를 참고하세요 - 리눅스, OS X, 윈도우즈와 BSD에서 빌드하기 -위한 일반적인 정보부터 보다 자세한 레시피가 담겨있습니다. -[COMPILER_SUPPORT.md](doc/COMPILING/COMPILER_SUPPORT.md)에서 지원하는 컴파일러를 확인할 수 있습니다. -더 자세한 정보는 [doc/](https://github.com/cataclysmbnteam/cataclysm-BN/tree/upload/doc)에서도 -찾아볼 수 있습니다. +- [makefile](doc/src/content/docs/en/dev/guides/building/makefile.md)로 빌드하기: Linux, macOS, + BSD를 지원합니다. +- [MSYS2](doc/src/content/docs/en/dev/guides/building/msys.md) +- [vcpkjg](doc/src/content/docs/en/dev/guides/building/vs_vcpkg.md) +- [cmake](doc/src/content/docs/en/dev/guides/building/cmake.md) +- [지원하는 컴파일러 목록](doc/src/content/docs/en/dev/reference/compiler_support.md) -또한 다음 빌드 가이드도 있습니다. - -- 윈도우즈에서 `MSYS2`로 빌드하기 [COMPILING-MSYS.md](doc/COMPILING/COMPILING-MSYS.md) -- 윈도우즈에서 `vcpkg`로 빌드하기 [COMPILING-VS-VCPKG.md](doc/COMPILING/COMPILING-VS-VCPKG.md) -- `cmake`로 빌드하기 [COMPILING-CMAKE.md](doc/COMPILING/COMPILING-CMAKE.md) (_비공식 가이드_) +자세한 내용은 [공식 문서](https://docs.cataclysmbn.org/en/dev/guides/building/cmake/)를 +참고해주세요. ## 기여하기 @@ -69,10 +67,20 @@ > 배포되지만, 다른 소프트웨어 라이선스에 따라 배포됩니다. 다른 소프트웨어 라이선스에 따라 배포되는 > 파일들은 각 파일에 라이선스 공지가 포함되어 있습니다. -[CONTRIBUTING.ko.md](./doc/CONTRIBUTING.ko.md)에서 자세한 내용을 확인할 수 있습니다. +[공식 사이트](https://docs.cataclysmbn.org/ko/contribute/contributing/)에서 자세한 내용을 확인할 수 +있습니다. + +## 공식 사이트 + +게임플레이 및 개발 가이드는 [doc](./doc/src/content/docs/) 디렉토리에 마크다운으로 작성되어 +있습니다. 또는 + +- [공식 문서 사이트](https://docs.cataclysmbn.org/ko/)를 방문하거나 +- [로컬에서 사이트를 빌드하고 실행](./doc/src/content/docs/en/contribute/docs.md)할 수 있습니다. ## 커뮤니티 +[![공식 문서](https://img.shields.io/badge/Docs-LightGray?style=for-the-badge&logo=astro)][docs] [![Discussions](https://img.shields.io/badge/포럼에서%20토론하기-black?style=for-the-badge&logo=github)][discussion] [![Discord](https://img.shields.io/discord/830879262763909202?style=for-the-badge&logo=discord&label=공식%20디스코드%20서버)][discord] [![Discussions](https://img.shields.io/badge/CDDA%20모딩%20커뮤니티-green?style=for-the-badge&logo=discord)][modding] @@ -80,6 +88,7 @@ [discussion]: https://github.com/cataclysmbnteam/cataclysm-BN/discussions [discord]: https://discord.gg/XW7XhXuZ89 [modding]: https://discord.gg/B5q4XCa "비공식 DDA모딩 커뮤니티에도 BN 채널이 있습니다." +[docs]: https://docs.cataclysmbn.org "공식 BN 개발문서" ## 자주 묻는 질문 @@ -105,11 +114,11 @@ 게임 내에서 `Submit a bug report on github`를 실행하여 이슈를 제출할 수 있습니다. -| 1. 옵션 (ESC) -> 디버그 메뉴 (a) | 2. 정보 (i) | -| :------------------------------: | :--------------------------: | -| ![](doc/img/readme-bug1.png) | ![](doc/img/readme-bug2.png) | -| 3. 버그 리포트 제출 (U) | 4. 이슈 링크가 생성됩니다 | -| ![](doc/img/readme-bug3.png) | ![](doc/img/readme-bug4.png) | +| 1. 옵션 (ESC) -> 디버그 메뉴 (a) | 2. 정보 (i) | +| :---------------------------------------------------------: | :---------------------------------------------------------: | +| ![](doc/src/content/docs/en/contribute/img/readme-bug1.png) | ![](doc/src/content/docs/en/contribute/img/readme-bug2.png) | +| 3. 버그 리포트 제출 (U) | 4. 이슈 링크가 생성됩니다 | +| ![](doc/src/content/docs/en/contribute/img/readme-bug3.png) | ![](doc/src/content/docs/en/contribute/img/readme-bug4.png) | `버전 및 환경 설정(Version and configuration)` 항목이 채워진 이슈가 브라우저에서 열립니다. diff --git a/README.md b/README.md index e03b4a2754b5..57542624b775 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Cataclysm: Bright Nights
- + [![en][icon-en]][en] [![ko][icon-ko]][ko] @@ -47,22 +47,19 @@ Find a way to stop the Cataclysm ... or become one of its strongest monsters. [clone]: https://github.com/cataclysmbnteam/Cataclysm-BN/ "clone from our GitHub repo" [clone-badge]: https://img.shields.io/badge/Clone%20From%20Repo-black?style=for-the-badge&logo=github -## Compile +## Building -Please read [COMPILING.md](doc/COMPILING/COMPILING.md) - it covers general information and more -specific recipes for Linux, OS X, Windows and BSD. See -[COMPILER_SUPPORT.md](doc/COMPILING/COMPILER_SUPPORT.md) for details on which compilers we support. -And you can always dig for more information in -[doc/](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/doc). +- [with makefile](doc/src/content/docs/en/dev/guides/building/makefile.md): supports Linux, macOS, + and BSD. +- [with MSYS2](doc/src/content/docs/en/dev/guides/building/msys.md) +- [with vcpkjg](doc/src/content/docs/en/dev/guides/building/vs_vcpkg.md) +- [with cmake](doc/src/content/docs/en/dev/guides/building/cmake.md) +- [which compilers we support](doc/src/content/docs/en/dev/reference/compiler_support.md) -We also have the following build guides: +Please read the [official docs](https://docs.cataclysmbn.org/en/dev/guides/building/cmake/) for +details. -- Building on Windows with `MSYS2` at [COMPILING-MSYS.md](doc/COMPILING/COMPILING-MSYS.md) -- Building on Windows with `vcpkg` at [COMPILING-VS-VCPKG.md](doc/COMPILING/COMPILING-VS-VCPKG.md) -- Building with `cmake` at [COMPILING-CMAKE.md](doc/COMPILING/COMPILING-CMAKE.md) (_unofficial - guide_) - -## Contribute +## Contributing > Cataclysm: Bright Nights developed under Creative Commons Attribution ShareAlike 3.0 license. The > code and content of the game is free to use, modify, and redistribute for any purpose whatsoever. @@ -70,10 +67,20 @@ We also have the following build guides: > project is not part of the project and is released under different software licenses, the files > covered by different software licenses have their own license notices. -Please see [CONTRIBUTING.md](./doc/CONTRIBUTING.md) for details. +Please check the [official docs](https://docs.cataclysmbn.org/en/contribute/contributing/) for +details. + +## Documentation + +Gameplay and developing documentation is available in the [doc](./doc/src/content/docs/) directory +in markdown format. You can also + +- visit the [official docs](https://docs.cataclysmbn.org/en/) site +- [build and serve the documentation locally](./doc/src/content/docs/en/contribute/docs.md) ## Community +[![Official Docs](https://img.shields.io/badge/Docs-LightGray?style=for-the-badge&logo=astro)][docs] [![Discussions](https://img.shields.io/badge/Discussions-black?style=for-the-badge&logo=github)][discussion] [![Discord](https://img.shields.io/discord/830879262763909202?style=for-the-badge&logo=discord)][discord] [![Discussions](https://img.shields.io/badge/CDDA%20Modding-green?style=for-the-badge&logo=discord)][modding] @@ -81,6 +88,7 @@ Please see [CONTRIBUTING.md](./doc/CONTRIBUTING.md) for details. [discussion]: https://github.com/cataclysmbnteam/Cataclysm-BN/discussions [discord]: https://discord.gg/XW7XhXuZ89 [modding]: https://discord.gg/B5q4XCa "Unofficial DDA modding community discord has a BN channel" +[docs]: https://docs.cataclysmbn.org "Official BN documentation" ## Frequently Asked Questions @@ -107,11 +115,11 @@ be submitted via debug menu. Run `Submit a bug report on github` inside the game to submit an issue. -| 1. open Options (ESC) -> Debug Menu (a) | 2. open Info (i) | -| :-------------------------------------: | :------------------------------: | -| ![](doc/img/readme-bug1.png) | ![](doc/img/readme-bug2.png) | -| 3. Submit a bug report on github (U) | 4. An link to issue is generated | -| ![](doc/img/readme-bug3.png) | ![](doc/img/readme-bug4.png) | +| 1. open Options (ESC) -> Debug Menu (a) | 2. open Info (i) | +| :---------------------------------------------------------: | :---------------------------------------------------------: | +| ![](doc/src/content/docs/en/contribute/img/readme-bug1.png) | ![](doc/src/content/docs/en/contribute/img/readme-bug2.png) | +| 3. Submit a bug report on github (U) | 4. An link to issue is generated | +| ![](doc/src/content/docs/en/contribute/img/readme-bug3.png) | ![](doc/src/content/docs/en/contribute/img/readme-bug4.png) | It will open a bug report on browser with `Version and configuration` filled in. diff --git a/data/raw/generate_docs.lua b/data/raw/generate_docs.lua index 58aa5697c406..d0732e35996e 100644 --- a/data/raw/generate_docs.lua +++ b/data/raw/generate_docs.lua @@ -56,7 +56,7 @@ local fmt_constructors = function(typename, ctors) else local ret = "" for k,v in pairs(ctors) do - ret=ret.."- `"..fmt_one_constructor(typename, v).."`\n" + ret=ret.."#### `"..fmt_one_constructor(typename, v).."`\n" end return ret end @@ -64,9 +64,9 @@ end local fmt_one_member = function(typename, member) local ret = "#### "..tostring(member.name).."\n"; - + if member.comment then - ret=ret.." // "..member.comment.."\n" + ret=ret..member.comment.."\n" end if member.type == "var" then @@ -140,23 +140,39 @@ local fmt_enum_entries = function(typename, entries) end doc_gen_func.impl = function() - local ret = "# Lua documentation\n\n" + local ret = [[--- +title: Lua API reference +editUrl: false +sidebar: + badge: + text: Generated + status: note +--- - local dt = catadoc +:::note + +This page is auto-generated from [`data/raw/generate_docs.lua`][generate_docs] +and should not be edited directly. + +[generate_docs]: https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/raw/generate_docs.lua - ret = ret.."# Types\n\n" +::: + +]] + + local dt = catadoc local types_table = dt["#types"] local types_sorted = sorted_by(types_table) for _,it in pairs(types_sorted) do local typename = it.k - local dt_type = it.v + local dt_type = it.v local type_comment = dt_type.type_comment ret = ret.."## "..typename.."\n" if type_comment then - ret = ret.."// "..type_comment.."\n" + ret = ret..type_comment.."\n" end local bases = dt_type["#bases"] @@ -182,7 +198,7 @@ doc_gen_func.impl = function() local enums_sorted = sorted_by(enums_table) for _,it in pairs(enums_sorted) do local typename = it.k - local dt_type = it.v + local dt_type = it.v ret = ret.."## "..typename.."\n" local entries = dt_type["entries"] @@ -200,12 +216,12 @@ doc_gen_func.impl = function() local libs_sorted = sorted_by( libs_table ) for _,it in pairs(libs_sorted) do local typename = it.k - local dt_lib = it.v + local dt_lib = it.v local lib_comment = dt_lib.lib_comment ret = ret.."## "..typename.."\n" if lib_comment then - ret = ret.."// "..lib_comment.."\n" + ret = ret..lib_comment.."\n" end local members = dt_lib["#member"] diff --git a/deno.jsonc b/deno.jsonc index af42dc86124e..cca75b44fb84 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -1,10 +1,15 @@ { "tasks": { - "tools": "deno run --watch -A" + "tools": "deno run --watch -A", + + "doc": "deno task doc:cli & deno task doc:lua && deno fmt", + "doc:cli": "deno run -A ./tools/gen_cli_docs.ts", + "doc:lua": "./cataclysm-tiles --lua-doc && cp config/lua_doc.md doc/src/content/docs/en/mod/lua/reference/lua.md" }, "test": { "include": ["./tools"] }, "lint": { "include": ["./tools"] }, "fmt": { + "exclude": ["./doc/dist", "./doc/.astro"], "include": ["./tools", "./doc", "*.md"], "semiColons": false, "lineWidth": 100 diff --git a/deno.lock b/deno.lock new file mode 100644 index 000000000000..fd01e6bd0517 --- /dev/null +++ b/deno.lock @@ -0,0 +1,96 @@ +{ + "version": "3", + "remote": { + "https://deno.land/std@0.201.0/assert/_constants.ts": "8a9da298c26750b28b326b297316cdde860bc237533b07e1337c021379e6b2a9", + "https://deno.land/std@0.201.0/assert/_diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea", + "https://deno.land/std@0.201.0/assert/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7", + "https://deno.land/std@0.201.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", + "https://deno.land/std@0.201.0/assert/assert_equals.ts": "d8ec8a22447fbaf2fc9d7c3ed2e66790fdb74beae3e482855d75782218d68227", + "https://deno.land/std@0.201.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", + "https://deno.land/std@0.201.0/assert/equal.ts": "9f1a46d5993966d2596c44e5858eec821859b45f783a5ee2f7a695dfc12d8ece", + "https://deno.land/std@0.201.0/collections/chunk.ts": "f82c52a82ad9338018570c42f6de0fb132fcb14914c31a444e360ac104d7b55b", + "https://deno.land/std@0.201.0/fmt/colors.ts": "87544aa2bc91087bb37f9c077970c85bfb041b48e4c37356129d7b450a415b6f", + "https://deno.land/std@0.201.0/front_matter/mod.ts": "f4a40ed1d5c41af2e664a661879c9dc0c9ca49199f6406da8b62c0aa2a2fb640", + "https://deno.land/std@0.201.0/front_matter/yaml.ts": "a681fbff79b9641379b1ceda27308b6e83ca5d26a1bcfe669cd1289fc3692ac7", + "https://deno.land/std@0.201.0/fs/_util.ts": "fbf57dcdc9f7bc8128d60301eece608246971a7836a3bb1e78da75314f08b978", + "https://deno.land/std@0.201.0/fs/walk.ts": "a16146724a6aaf9efdb92023a74e9805195c3469900744ce5de4113b07b29779", + "https://deno.land/std@0.201.0/path/_basename.ts": "057d420c9049821f983f784fd87fa73ac471901fb628920b67972b0f44319343", + "https://deno.land/std@0.201.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.201.0/path/_dirname.ts": "355e297236b2218600aee7a5301b937204c62e12da9db4b0b044993d9e658395", + "https://deno.land/std@0.201.0/path/_extname.ts": "eaaa5aae1acf1f03254d681bd6a8ce42a9cb5b7ff2213a9d4740e8ab31283664", + "https://deno.land/std@0.201.0/path/_format.ts": "4a99270d6810f082e614309164fad75d6f1a483b68eed97c830a506cc589f8b4", + "https://deno.land/std@0.201.0/path/_from_file_url.ts": "6eadfae2e6f63ad9ee46b26db4a1b16583055c0392acedfb50ed2fc694b6f581", + "https://deno.land/std@0.201.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", + "https://deno.land/std@0.201.0/path/_is_absolute.ts": "05dac10b5e93c63198b92e3687baa2be178df5321c527dc555266c0f4f51558c", + "https://deno.land/std@0.201.0/path/_join.ts": "815f5e85b042285175b1492dd5781240ce126c23bd97bad6b8211fe7129c538e", + "https://deno.land/std@0.201.0/path/_normalize.ts": "a19ec8706b2707f9dd974662a5cd89fad438e62ab1857e08b314a8eb49a34d81", + "https://deno.land/std@0.201.0/path/_os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", + "https://deno.land/std@0.201.0/path/_parse.ts": "0f9b0ff43682dd9964eb1c4398610c4e165d8db9d3ac9d594220217adf480cfa", + "https://deno.land/std@0.201.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5", + "https://deno.land/std@0.201.0/path/_resolve.ts": "7a3616f1093735ed327e758313b79c3c04ea921808ca5f19ddf240cb68d0adf6", + "https://deno.land/std@0.201.0/path/_to_file_url.ts": "a141e4a525303e1a3a0c0571fd024552b5f3553a2af7d75d1ff3a503dcbb66d8", + "https://deno.land/std@0.201.0/path/_to_namespaced_path.ts": "0d5f4caa2ed98ef7a8786286df6af804b50e38859ae897b5b5b4c8c5930a75c8", + "https://deno.land/std@0.201.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221", + "https://deno.land/std@0.201.0/path/basename.ts": "bdfa5a624c6a45564dc6758ef2077f2822978a6dbe77b0a3514f7d1f81362930", + "https://deno.land/std@0.201.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", + "https://deno.land/std@0.201.0/path/dirname.ts": "b6533f4ee4174a526dec50c279534df5345836dfdc15318400b08c62a62a39dd", + "https://deno.land/std@0.201.0/path/extname.ts": "62c4b376300795342fe1e4746c0de518b4dc9c4b0b4617bfee62a2973a9555cf", + "https://deno.land/std@0.201.0/path/format.ts": "110270b238514dd68455a4c54956215a1aff7e37e22e4427b7771cefe1920aa5", + "https://deno.land/std@0.201.0/path/from_file_url.ts": "9f5cb58d58be14c775ec2e57fc70029ac8b17ed3bd7fe93e475b07280adde0ac", + "https://deno.land/std@0.201.0/path/glob.ts": "593e2c3573883225c25c5a21aaa8e9382a696b8e175ea20a3b6a1471ad17aaed", + "https://deno.land/std@0.201.0/path/is_absolute.ts": "0b92eb35a0a8780e9f16f16bb23655b67dace6a8e0d92d42039e518ee38103c1", + "https://deno.land/std@0.201.0/path/join.ts": "31c5419f23d91655b08ec7aec403f4e4cd1a63d39e28f6e42642ea207c2734f8", + "https://deno.land/std@0.201.0/path/mod.ts": "6e1efb0b13121463aedb53ea51dabf5639a3172ab58c89900bbb72b486872532", + "https://deno.land/std@0.201.0/path/normalize.ts": "6ea523e0040979dd7ae2f1be5bf2083941881a252554c0f32566a18b03021955", + "https://deno.land/std@0.201.0/path/parse.ts": "be8de342bb9e1924d78dc4d93c45215c152db7bf738ec32475560424b119b394", + "https://deno.land/std@0.201.0/path/posix.ts": "0a1c1952d132323a88736d03e92bd236f3ed5f9f079e5823fae07c8d978ee61b", + "https://deno.land/std@0.201.0/path/relative.ts": "8bedac226afd360afc45d451a6c29fabceaf32978526bcb38e0c852661f66c61", + "https://deno.land/std@0.201.0/path/resolve.ts": "133161e4949fc97f9ca67988d51376b0f5eef8968a6372325ab84d39d30b80dc", + "https://deno.land/std@0.201.0/path/separator.ts": "40a3e9a4ad10bef23bc2cd6c610291b6c502a06237c2c4cd034a15ca78dedc1f", + "https://deno.land/std@0.201.0/path/to_file_url.ts": "00e6322373dd51ad109956b775e4e72e5f9fa68ce2c6b04e4af2a6eed3825d31", + "https://deno.land/std@0.201.0/path/to_namespaced_path.ts": "1b1db3055c343ab389901adfbda34e82b7386bcd1c744d54f9c1496ee0fd0c3d", + "https://deno.land/std@0.201.0/path/win32.ts": "8b3f80ef7a462511d5e8020ff490edcaa0a0d118f1b1e9da50e2916bdd73f9dd", + "https://deno.land/std@0.201.0/yaml/_error.ts": "b59e2c76ce5a47b1b9fa0ff9f96c1dd92ea1e1b17ce4347ece5944a95c3c1a84", + "https://deno.land/std@0.201.0/yaml/_loader/loader.ts": "63ec7f0a265dbbabc54b25a4beefff7650e205160a2d75c7d8f8363b5f84851a", + "https://deno.land/std@0.201.0/yaml/_loader/loader_state.ts": "0841870b467169269d7c2dfa75cd288c319bc06f65edd9e42c29e5fced91c7a4", + "https://deno.land/std@0.201.0/yaml/_mark.ts": "dcd8585dee585e024475e9f3fe27d29740670fb64ebb970388094cad0fc11d5d", + "https://deno.land/std@0.201.0/yaml/_state.ts": "ef03d55ec235d48dcfbecc0ab3ade90bfae69a61094846e08003421c2cf5cfc6", + "https://deno.land/std@0.201.0/yaml/_type/binary.ts": "24d49614463a7339a8a16d894919c2ec18a10588ae360ec352093b60e2cc8b0d", + "https://deno.land/std@0.201.0/yaml/_type/bool.ts": "5bfa75da84343d45347b521ba4e5aeace9fe6f53447405290d53315a3fc20e66", + "https://deno.land/std@0.201.0/yaml/_type/float.ts": "056bd3cb9c5586238b20517511014fb24b0e36f98f9f6073e12da308b6b9808a", + "https://deno.land/std@0.201.0/yaml/_type/function.ts": "ff574fe84a750695302864e1c31b93f12d14ada4bde79a5f93197fc33ad17471", + "https://deno.land/std@0.201.0/yaml/_type/int.ts": "563ad074f0fa7aecf6b6c3d84135bcc95a8269dcc15de878de20ce868fd773fa", + "https://deno.land/std@0.201.0/yaml/_type/map.ts": "7b105e4ab03a361c61e7e335a0baf4d40f06460b13920e5af3fb2783a1464000", + "https://deno.land/std@0.201.0/yaml/_type/merge.ts": "8192bf3e4d637f32567917f48bb276043da9cf729cf594e5ec191f7cd229337e", + "https://deno.land/std@0.201.0/yaml/_type/mod.ts": "060e2b3d38725094b77ea3a3f05fc7e671fced8e67ca18e525be98c4aa8f4bbb", + "https://deno.land/std@0.201.0/yaml/_type/nil.ts": "606e8f0c44d73117c81abec822f89ef81e40f712258c74f186baa1af659b8887", + "https://deno.land/std@0.201.0/yaml/_type/omap.ts": "cfe59a294726f5cea705c39a61fd2b08199cf48f4ccd6b040cb550ec0f38d0a1", + "https://deno.land/std@0.201.0/yaml/_type/pairs.ts": "0032fdfe57558d21696a4f8cf5b5cfd1f698743177080affc18629685c905666", + "https://deno.land/std@0.201.0/yaml/_type/regexp.ts": "1ce118de15b2da43b4bd8e4395f42d448b731acf3bdaf7c888f40789f9a95f8b", + "https://deno.land/std@0.201.0/yaml/_type/seq.ts": "95333abeec8a7e4d967b8c8328b269e342a4bbdd2585395549b9c4f58c8533a2", + "https://deno.land/std@0.201.0/yaml/_type/set.ts": "f28ba44e632ef2a6eb580486fd47a460445eeddbdf1dbc739c3e62486f566092", + "https://deno.land/std@0.201.0/yaml/_type/str.ts": "a67a3c6e429d95041399e964015511779b1130ea5889fa257c48457bd3446e31", + "https://deno.land/std@0.201.0/yaml/_type/timestamp.ts": "706ea80a76a73e48efaeb400ace087da1f927647b53ad6f754f4e06d51af087f", + "https://deno.land/std@0.201.0/yaml/_type/undefined.ts": "94a316ca450597ccbc6750cbd79097ad0d5f3a019797eed3c841a040c29540ba", + "https://deno.land/std@0.201.0/yaml/_utils.ts": "26b311f0d42a7ce025060bd6320a68b50e52fd24a839581eb31734cd48e20393", + "https://deno.land/std@0.201.0/yaml/parse.ts": "1fbbda572bf3fff578b6482c0d8b85097a38de3176bf3ab2ca70c25fb0c960ef", + "https://deno.land/std@0.201.0/yaml/schema.ts": "96908b78dc50c340074b93fc1598d5e7e2fe59103f89ff81e5a49b2dedf77a67", + "https://deno.land/std@0.201.0/yaml/schema/core.ts": "fa406f18ceedc87a50e28bb90ec7a4c09eebb337f94ef17468349794fa828639", + "https://deno.land/std@0.201.0/yaml/schema/default.ts": "0047e80ae8a4a93293bc4c557ae8a546aabd46bb7165b9d9b940d57b4d88bde9", + "https://deno.land/std@0.201.0/yaml/schema/extended.ts": "0784416bf062d20a1626b53c03380e265b3e39b9409afb9f4cb7d659fd71e60d", + "https://deno.land/std@0.201.0/yaml/schema/failsafe.ts": "d219ab5febc43f770917d8ec37735a4b1ad671149846cbdcade767832b42b92b", + "https://deno.land/std@0.201.0/yaml/schema/json.ts": "5f41dd7c2f1ad545ef6238633ce9ee3d444dfc5a18101e1768bd5504bf90e5e5", + "https://deno.land/std@0.201.0/yaml/schema/mod.ts": "4472e827bab5025e92bc2eb2eeefa70ecbefc64b2799b765c69af84822efef32", + "https://deno.land/std@0.201.0/yaml/type.ts": "1aabb8e0a3f4229ce0a3526256f68826d9bdf65a36c8a3890ead8011fcba7670", + "https://deno.land/x/asynciter@0.0.18/asynciter.ts": "8b0a25e426e0c747dadb15123c450e676b389ac24b480fb075a61f971ebdc673", + "https://deno.land/x/asynciter@0.0.18/collect.ts": "dea80ad4df11603912cad276a211671d67539dbcf7e627de99d11b2dd90a66fe", + "https://deno.land/x/asynciter@0.0.18/concurrent-map.ts": "8503926d0801981d2041127f5966cb34878ee54ca21a1a85e1e0727950311eaf", + "https://deno.land/x/asynciter@0.0.18/filter.ts": "a82a1a1bc952d62b5f45048887382d9d05bdcf4f5f29b876e50607b66a83e866", + "https://deno.land/x/asynciter@0.0.18/first.ts": "cf5e9924b4aecc98ff5358e260cca5aadba052d060b7d33793749e84169b8aa4", + "https://deno.land/x/asynciter@0.0.18/flatten.ts": "354be48cd754e5277b237c4dfb4ce98f177b40f3975b671ba70603a4c3d52a2e", + "https://deno.land/x/asynciter@0.0.18/for-each.ts": "213a0aa26439edc20fbf6350c3f0ccb38187a0b41875fa0e973a3eaf154aeae1", + "https://deno.land/x/asynciter@0.0.18/map.ts": "862688e7ad18d96011aab9be0bf98cea98ac26fe2a8872373bceb6cbb9fea89e", + "https://deno.land/x/asynciter@0.0.18/mod.ts": "03c709ac8604e86af0f6277bafef611aa317d9f5cf2e54b97671354e0c9f22d5", + "https://deno.land/x/asynciter@0.0.18/reduce.ts": "e3a7bbb52626f445c502eee237c5f5f71c8a220b614e2cf93276c23386964737" + } +} diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 000000000000..6240da8b10bf --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1,21 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store diff --git a/doc/Blank Building Template.txt b/doc/Blank Building Template.txt deleted file mode 100644 index c833f3a9d168..000000000000 --- a/doc/Blank Building Template.txt +++ /dev/null @@ -1,96 +0,0 @@ -json for buildings blank template - - "rows": [ - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " " - ], - "terrain": { - ".": "t_pavement_y", - "7": "t_backboard", - "|": "t_chainfence_v", - "-": "t_chainfence_h", - "+": "t_chaingate_c", - "H": "t_pavement", - "R": "t_pavement" - }, - "furniture": { - "H": "f_bench", - "R": "f_trashcan" - }, - "toilets": { - "t": { } - }, - "rows": [ - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################", - "########################" - ], - "rows": [ - "-----------++-----------", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "+ +", - "+ +", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "- -", - "-----------++-----------" - ], diff --git a/doc/CODE_STYLE.md b/doc/CODE_STYLE.md deleted file mode 100644 index b871a759a1d9..000000000000 --- a/doc/CODE_STYLE.md +++ /dev/null @@ -1,68 +0,0 @@ -# Code Style Guide - -All of the C++ code in the project is styled, you should run any changes you make through astyle -before pushing a pull request. - -We are using astyle version 3.0.1. Version 3.1 should also work, though there are a few cases where -they disagree and require annotation. - -Blocks of code can be passed through astyle to ensure that their formatting is correct: - - astyle --style=1tbs --attach-inlines --indent=spaces=4 --align-pointer=name --max-code-length=100 --break-after-logical --indent-classes --indent-preprocessor --indent-switches --indent-col1-comments --min-conditional-indent=0 --pad-oper --unpad-paren --pad-paren-in --add-brackets --convert-tabs - -These options are mirrored in `.astylerc`, `doc/CODE_STYLE.txt` and -`msvc-full-features/AStyleExtension-Cataclysm-BN.cfg` - -For example, from `vi`, set marks a and b around the block, then: - - :'a,'b ! astyle --style=1tbs --attach-inlines --indent=spaces=4 --align-pointer=name --max-code-length=100 --break-after-logical --indent-classes --indent-preprocessor --indent-switches --indent-col1-comments --min-conditional-indent=0 --pad-oper --unpad-paren --pad-paren-in --add-brackets --convert-tabs - -See [DEVELOPER_TOOLING.md](DEVELOPER_TOOLING.md) for other environments. - -## Code Example - -Here's an example that illustrates the most common points of style: - -```c++ -int foo( int arg1, int *arg2 ) -{ - if( arg1 < 5 ) { - switch( *arg2 ) { - case 0: - return arg1 + 5; - break; - case 1: - return arg1 + 7; - break; - default: - return 0; - break; - } - } else if( arg1 > 17 ) { - int i = 0; - while( i < arg1 ) { - printf( _( "Really long message that's pointless except for the number %d and for its " - "length as it's illustrative of how to break strings properly.\n" ), i ); - } - } - return 0; -} -``` - -## Code Guidelines - -These are less generic guidelines and more pain points we've stumbled across over time. - -1. Use int for everything. - 1. Long in particular is problematic since it is _not_ a larger type than int on platforms we - care about. - 1. If you need an integral value larger than 32 bits, you don't. But if you do, use int64_t. - 2. Uint is also a problem, it has poor behavior when overflowing and should be avoided for - general purpose programming. - 1. If you need binary data, unsigned int or unsigned char are fine, but you should probably - use a std::bitset instead. - 3. Float is to be avoided, but has valid uses. -2. Auto Almost Nothing. Auto has two uses, others should be avoided. - 1. Aliasing for extremely long iterator or functional declarations. - 2. Generic code support (but decltype is better). -3. Avoid using declaration for standard namespaces. diff --git a/doc/JSON_LOADING_ORDER.md b/doc/JSON_LOADING_ORDER.md deleted file mode 120000 index f8db7c347a6b..000000000000 --- a/doc/JSON_LOADING_ORDER.md +++ /dev/null @@ -1 +0,0 @@ -../data/json/LOADING_ORDER.md \ No newline at end of file diff --git a/doc/LICENSE b/doc/LICENSE new file mode 100644 index 000000000000..d3ac20e43b14 --- /dev/null +++ b/doc/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 2023 the Cataclysm: Bright Nights contributors + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/doc/LUA_SUPPORT.md b/doc/LUA_SUPPORT.md deleted file mode 100644 index 4134a306b723..000000000000 --- a/doc/LUA_SUPPORT.md +++ /dev/null @@ -1,533 +0,0 @@ -# LUA SUPPORT - -Use the `Home` key to return to the top. - -- [LUA SUPPORT](#lua-support) - - [Introduction](#introduction) - - [Useful links](#useful-links) - - [Example mods](#example-mods) - - [Ingame Lua console](#ingame-lua-console) - - [Lua hot-reload](#lua-hot-reload) - - [Game data loading](#game-data-loading) - - [preload.lua](#preloadlua) - - [finalize.lua](#finalizelua) - - [main.lua](#mainlua) - - [Lua API details](#lua-api-details) - - [Lua libraries and functions](#lua-libraries-and-functions) - - [Global state](#global-state) - - [Game Bindings](#game-bindings) - - [Global overrides](#global-overrides) - - [Hooks](#hooks) - - [Item use function](#item-use-function) - - [Translation functions](#translation-functions) - - [C++ layout](#c-layout) - - [Lua source files](#lua-source-files) - - [Sol2 source files](#sol2-source-files) - - [Game source files](#game-source-files) - - [Adding new type to the doc generator without binding internals](#adding-new-type-to-the-doc-generator-without-binding-internals) - - [Binding new type to Lua](#binding-new-type-to-lua) - - [Binding new enum to Lua](#binding-new-enum-to-lua) - - [Binding new string\_id or int\_id to Lua](#binding-new-string_id-or-int_id-to-lua) - -## Introduction - -This document describes implementation details behind Lua integration in Cataclysm: Bright Nights. - -BN uses Lua 5.3.6 to run scripts and relies on sol2 v3.3.0 for bindings on C++ side. - -## Useful links - -Lua 5.3 Reference Manual: https://www.lua.org/manual/5.3/ - -Sol2 documentation: https://sol2.readthedocs.io/en/latest/ - -Programming in Lua (first edition): https://www.lua.org/pil/contents.html - -## Example mods - -There are a couple heavily-commented example mods in `data/mods/` that make use of Lua API described -here: - -- `smart_house_remotes` - Add remotes for controlling garage doors and window curtains. -- `saveload_lua_test` - Mod for testing Lua save/load API. - -## Ingame Lua console - -In-game Lua console is available through the debug menu or via `Lua Console` hotkey (unbound by -default). - -It is rather simple, but is capable of keeping input history, showing output and errors from Lua -scripts as well as running Lua snippets and printing the returned values. - -You can adjust console log capacity by running `gdebug.set_log_capacity( num )` (default is 100 -entries), or clear it by running `gdebug.clear_lua_log()`. - -## Lua hot-reload - -To speed up mod development process, BN supports Lua hot-reload functionality. - -There is no filesystem watcher, so hot-reload must be triggered manually via a corresponding -`Reload Lua Code` hotkey (unbound by default). The hot-reload can also be triggered from console -window by pressing the corresponding hotkey, or by running `gdebug.reload_lua_code()` command. -Running the command from regular Lua scripts may have unintended consequences, use at your own risk! - -Note that not all code can be hot-reloaded, it'll be explained in later sections. - -## Game data loading - -When a world is being loaded, game does it in roughly these steps: - -1. Initializes world-related internal state, sets the world as active -2. Loads world's artifact item types (artifacts are hacky and will likely be removed soon in favor - of relics + Lua) -3. Retrieves list of mods used by the world -4. Loads the mods according to the list -5. Initializes avatar-related internal state -6. Loads from save dir actual overmap data, avatar data and reality bubble data - -What we care about here is the mod loading stage. It has a number of sub-steps: - -1. Loading function receives list of world mods -2. It discards the missing ones and prints debug message for each -3. It checks remaining mods on the list, and throws error if a mod needs Lua, but the game build - does NOT support Lua -4. It also throws a warning if game's Lua API version differs from the one used by the mod -5. For every mod on the list that uses Lua, it runs the mod's `preload.lua` script (if present) -6. It goes over all mods in same order as in the list, and loads JSON definitions from each mod's - folder -7. It finalizes loaded data (resolves copy-from, prepares some types with complex state for use) -8. For every mod on the list that uses Lua, it runs the mod's `finalize.lua` script (if present) -9. It checks consistency of loaded data (validates values, warns about iffy combinations of values, - etc.) -10. (R) For every mod on the list that uses Lua, it runs the mod's `main.lua` script (if present) - -As such, we only have 3 scipts to place a mod's Lua code into: `preload.lua`, `finalize.lua` and -`main.lua`. The differences between the 3 and their intended use cases will be explained below. - -You can use only one script, two or all three, depending on your needs. - -When executing hot-reload, the game repeats the step marked with (R). That means if you want the -code you're working on to be hot-reloadable, put it into `main.lua`. - -### preload.lua - -This script is supposed to register event hooks and set up definitions that will then be referred by -game JSON loading system (e.g. item use actions). Note that you can registers them here, and define -them in some later stage (e.g. in `main.lua` to allow hot-reload to affect your hooks). - -### finalize.lua - -This script is supposed to allow mods to modify definitions loaded from JSON after copy-from has -been resolved, but there is no API for this yet. - -TODO: api for finalization - -### main.lua - -This script is supposed to implement the main logic of the mod. This includes, but not limited, to: - -1. Mod runtime state -2. Mod initialization on game start -3. Mod save/load code, if required -4. Implementation of hooks that were set up in `preload.lua` - -## Lua API details - -While you can do a lot of interesting stuff with vanilla Lua, the integration imposes some limits to -prevent potential bugs: - -- Loading packages (or Lua modules) is disabled. -- Your current mod id is stored in `game.current_mod` variable -- Your mod's runtime state should live in `game.mod_runtime[ game.current_mod ]` table. You can also - interface with other mods if you know their id, by accessing their runtime state in a similar way - with `game.mod_runtime[ that_other_mod_id ]` -- Changes to global state are not available between scripts. This is to prevent accidental - collisions between function names and variable names. You still can define global variables and - functions, but they will be visible to your mod only. - -### Lua libraries and functions - -When script is called, it comes with some standard Lua libraries pre-loaded: - -| Library | Description | -| -------- | -------------------------------------------- | -| `base` | print, assert, and other base functions | -| `math` | all things math | -| `string` | string library | -| `table` | the table manipulator and observer functions | - -See `Standard Libraries` section in Lua manual for details. - -Some of the functions here are overloaded by BN, see [Global overrides](#global-overrides) for -details. - -### Global state - -Most of necessary data and game runtime state is available through global `game` table. It has the -following members: - -game.current_mod Id of mod that's being loaded (available only when script is executed) -game.active_mods List of active world mods, in load order game.mod_runtime. Runtime data for -mods (each mod gets its own table named after its id) game.mod_storage. Per-mod storage that -gets automatically saved/loaded on game save/load. game.cata_internal For internal game purposes, -please don't use this game.hooks. Hooks exposed to Lua scripts, will be called on -corresponding events game.iuse. Item use functions that will be recognized by the item -factory and called on item use - -### Game Bindings - -The game exposes various functions, constants and types to Lua. Functions and constants are -organized into "libraries" for organizational purposes. Types are available globally, and may have -member functions and fields. - -To see the full list of functions, constants and types, run the game with `--lua-doc` command line -argument. This will generate documentation file `lua_doc.md` that will be placed in your `config` -folder. - -#### Global overrides - -Some functions have been globally overriden to improve integration with the game. - -| Function | Description | -| ---------- | -------------------------------------------------------------- | -| print | Print as `INFO LUA` to debug.log (overrides default Lua print) | -| dofile | Disabled | -| loadfile | Disabled | -| load | Disabled | -| loadstring | Disabled | - -TODO: alternatives for dofile and such - -#### Hooks - -To see the list of hooks, check `hooks_doc` section of the autogenerated documentation file. There, -you will see the list of hook ids as well as function signatures that they expect. You can register -new hooks by appending to the hooks table like so: - -```lua --- In preload.lua -local mod = game.mod_runtime[ game.current_mod ] -game.hooks.on_game_save[ #game.hooks.on_game_save + 1 ] = function( ... ) - -- This is essentially a forward declaration. - -- We declare that the hook exists, it should be called on game_save event, - -- but we will forward all possible arguments (even if there is none) to, - -- and return value from, the function that we'll declare later on. - return mod.my_awesome_hook( ... ) -end - --- In main.lua -local mod = game.mod_runtime[ game.current_mod ] -mod.my_awesome_hook = function() - -- Do actual work here -end -``` - -#### Item use function - -Item use functions use unique id to register themselves in item factory. On item activation, they -receive multiple arguments that will be described in the example below. - -```lua --- In preload.lua -local mod = game.mod_runtime[ game.current_mod ] -game.iuse_functions[ "SMART_HOUSE_REMOTE" ] = function(...) - -- This is just a forward declaration, - -- but it will allow us to use SMART_HOUSE_REMOTE iuse in JSONs. - return mod.my_awesome_iuse_function(...) -end - --- In main.lua -local mod = game.mod_runtime[ game.current_mod ] -mod.my_awesome_iuse_function = function( who, item, pos ) - -- Do actual activation effect here. - -- `who` is the character that activated the item - -- `item` is the item itself - -- `pos` is the position of the item (equal to character pos if character has it on them) -end -``` - -#### Translation functions - -To make the mod translatable to other languages, get your text via functions bound in `locale` -library. See [TRANSLATING.md](TRANSLATING.md) for detailed explanation of their C++ counterparts. - -Usage examples are shown below: - -```lua --- Simple string. --- --- The "Experimental Lab" text will be extracted from this code by a script, --- and will be available for translators. --- When your Lua script runs, this function will search for translation of --- "Experimental Lab" string and return either translated string, --- or the original string if there was no translation found. -local location_name_translated = locale.gettext( "Experimental Lab" ) - --- ERROR: you must call `gettext` with a string literal. --- Calling it like this will make it so "Experimental Lab" is NOT extracted, --- and translators won't see it when they translate the text. -local location_name_original = "Experimental Lab" -local location_name_translated = locale.gettext( location_name_original ) - --- ERROR: don't alias the function under different name. --- Calling it like this will make it so "Experimental Lab" is NOT extracted, --- and translators won't see it when they translate the text. -local gettext_alt = locale.gettext -local location_name_translated = gettext_alt( "Experimental Lab" ) - --- This, however, is fine. -local gettext = locale.gettext -local location_name_translated = gettext( "Experimental Lab" ) - --- String with possible plural form. --- Many languages have more than 2 plural forms with complex rules related to which one to use. -local item_display_name = locale.vgettext( "X-37 Prototype", "X-37 Prototypes", num_of_prototypes ) - --- String with context -local text_1 = locale.pgettext("the one made of metal", "Spring") -local text_2 = locale.pgettext("the one that makes water", "Spring") -local text_3 = locale.pgettext("time of the year", "Spring") - --- String with both context and plural forms. -local item_display_name = locale.vpgettext("the one made of metal", "Spring", "Springs", num_of_springs) - ---[[ - When some text is tricky and requires explanation, - it's common to place a special comment denoted with `~` to help translators. - The comment MUST BE right above the function call. -]] - ---~ This comment is good and will be visible for translators. -local ok = locale.gettext("Confusing text that needs explanation.") - ---~ ERROR: This comment is too far from gettext call and won't be extracted! -local not_ok = locale. - gettext("Confusing text that needs explanation.") - -local not_ok = locale.gettext( - --~ ERROR: This comment is in wrong place and won't be extracted! - "Confusing text that needs explanation." - ) - ---[[~ - ERROR: Multiline Lua comments can't be used as translator comments! - This comment won't be extracted! -]] -local ok = locale.gettext("Confusing text that needs explanation.") - ---~ If you need a multiline translator comment, ---~ just use 2 or more single-line comments. ---~ They'll be concatenated and shown as a single multi-line comment. -local ok = locale.gettext("Confusing text that needs explanation.") -``` - -## C++ layout - -Lua build can be enabled by passing `LUA=1` to the Makefile, or enabling `LUA` build switch in CMake -builds. Both msvc and android for simplicity always build with Lua **enabled**. - -### Lua source files - -To simplify build setup and improve portability we bundle `Lua 5.3.6` source code in `src/lua/` -directory and have the build systems compile it and link into the game executable and library for -tests. - -### Sol2 source files - -Sol2 makes it easy to bundle, we have `sol2 v3.3.0` single-header amalgamated version in `src/sol/` -and just include it as needed. The header is quite large, so the less source files include it the -better. - -- `sol/config.hpp` - Configuration header, we have a few options defined there -- `sol/forward.hpp` - Forward declarations, a lightweight header that should be included in game - headers instead of `sol/sol.hpp` -- `sol/sol.hpp` - Main sol2 header file, quite large, avoid including in game headers - -### Game source files - -All Lua-related game source files have the `catalua` prefix. - -If you want to add new bindings, consider looking at existing examples in `src/catalua_bindings.cpp` -and reading relevant part of Sol2 docs. - -- `catalua.h` (and `catalua.cpp`) - Main Lua interface. It's the only header most of the codebase - will have to include, and it provides a public interface that works in both `LUA=1` and `LUA=0` - builds ( in builds without Lua, most of the functions there are no-op ). -- `catalua_sol.h` and `catalua_sol_fwd.h` - Wrappers for `sol/sol.hpp` and `sol/forward.hpp` with - custom pragmas to make them compile. -- `catalua_bindings*` - Game Lua bindings live here. -- `catalua_console.h`(`.cpp`) - Ingame Lua console. -- `catalua_impl.h`(`.cpp`) - Implementation details for `catalua.h`(`.cpp`). -- `catalua_iuse_actor.h`(`.cpp`) - Lua-driven `iuse_actor`. -- `catalua_log.h`(`.cpp`) - In-memory logging for the console. -- `catalua_luna.h` - Usertype registration interface with automatic doc generation, aka `luna`. -- `catalua_luna_doc.h` - List of types registration through `luna` or exposed to its doc generator. -- `catalua_readonly.h`(`.cpp`) - Functions for marking Lua tables as read-only. -- `catalua_serde.h`(`.cpp`) - Lua table to/from JSON (de-)serialization. -- `catalua_type_operators.h` - Macro that helps with implementing bindings for string_ids - -### Adding new type to the doc generator without binding internals - -If a C++ type has not been registered in the doc generator, it will show up as -``. To mitigate this problem, you can add -`LUNA_VAL( your_type, "YourType" )` in `catalua_luna_doc.h`, and the generator will use `YourType` -string for argument type. - -### Binding new type to Lua - -First, we need to register the new type with the bindings system. It needs to be done for many -reasons, including so that the doc generator understands it, and the runtime can deserialize from -JSON any Lua table that contains that type. If you don't you'll get a compile error saying -`Type must implement luna_traits`. - -1. In `catala_luna_doc.h`, add declaration for your type. For example, if we're binding an imaginary - `horde` type (which is a `struct`), it will be a single line near the top of the file: - ```c++ - struct horde; - ``` - Complex templated types may need to actually pull in the relevant header, but please avoid it as - it heavily impacts compilation times. - -2. In the same file, register your type with the doc generator. Continuing with the `horde` example, - it's done like this: - ```c++ - LUNA_VAL( horde, "Horde" ); - ``` - While C++ types use all kinds of style for their names, on Lua side they all should be in - `CamelCase`. - -Now we can actually get to the details. The bindings are implemented in `catalua_bindings*.cpp` -files. They are spread out into multiple `.cpp` files to speed up compilation and make it easy to -navigate, so you can put yours into any existing `catalua_bindings*.cpp` file or make your own -similar file. They are also spread out into functions, for the same reasons. Let's register our -`horde` type, and put it in a new file and a new function: - -1. Add a new function declaration in `catalua_bindings.h`: - ```c++ - void reg_horde( sol::state &lua ); - ``` -2. Call the function in `reg_all_bindings` in `catalua_bindings.cpp`: - ```c++ - reg_horde( lua ); - ``` -3. Make a new file, `catalua_bindings_horde.cpp`, with the following contents: - ```c++ - #ifdef LUA - #include "catalua_bindings.h" - - #include "horde.h" // Replace with the header where your type is defined - - void cata::detail::reg_horde( sol::state &lua ) - { - sol::usertype ut = - luna::new_usertype( - lua, - luna::no_bases, - luna::constructors < - // Define your actual constructors here - horde(), - horde( const point & ), - horde( int, int ) - > () - ); - - // Register all needed members - luna::set( ut, "pos", &horde::pos ); - luna::set( ut, "size", &horde::size ); - - // Register all needed methods - luna::set_fx( ut, "move_to", &horde::move_to ); - luna::set_fx( ut, "update", &horde::update ); - luna::set_fx( ut, "get_printable_name", &horde::get_printable_name ); - - // Add (de-)serialization functions so we can carry - // our horde over the save/load boundary - reg_serde_functions( ut ); - - // Add more stuff like arithmetic operators, to_string operator, etc. - } - ``` -4. That's it. Your type is now visible in Lua under name `Horde`, and you can use the binded methods - and members. - -### Binding new enum to Lua - -Binding enums is similar to binding types. Let's bind an imaginary `horde_type` enum here: - -1. If enum does not have an explicitly defined container (the `: type` part after `enum name` in the - header where it's defined), you'll have to specify the container first, for example: - ```diff - // hordes.h - - enum class horde_type { - + enum class horde_type : int { - animals, - robots, - zombies - } - ``` -2. Add the declaration to `catalua_luna_doc.h` - ```c++ - enum horde_type : int; - ``` -3. Register it in `catalua_luna_doc.h` with - ```c++ - LUNA_ENUM( horde_type, "HordeType" ) - ``` -4. Ensure the enum implements the automatic conversion to/from `std::string`, see - `enum_conversions.h` for details. Some enums will already have it, but most won't. Usually it's - just a matter of specializing `enum_traits` for your enum `T` in the header, then defining - `io::enum_to_string` in the `.cpp` file with enum -> string conversion. Some enums won't have - the "last" value required for `enum_traits`. In that case, you'd have to add one: - ```diff - enum class horde_type : int { - animals, - robots, - - zombies - + zombies, - + num_horde_types - } - ``` - Note that this only works for "monotonic" enums, i.e. ones that start with 0 and don't skip any - values. In the example above, `animals` has implicit value of `0`, robots has implicit value of - `1` and `zombies` has implicit value of `2`, so we can easily add `num_horde_types`, which will - have correct and expected implicit value of `3`. -5. Bind enum fields in `reg_enums` function in `catalua_bindings.cpp`: - ```c++ - reg_enum( lua ); - ``` - This uses the automatic convertion from step 4, so we have equal names between JSON and Lua. - -### Binding new string_id or int_id to Lua - -Binding these can be done separately from binding `T` itself. - -1. Register your type `T` with the doc generator if you haven't already (see - [relevant docs](#adding-new-type-to-the-doc-generator-without-binding-internals)). -2. Replace `LUNA_VAL` from step 1 with `LUNA_ID`. -3. Ensure your type `T` implements operators `<` and `==`. It's usually easy implement them - manually, and can be done semi-automatically with macro `LUA_TYPE_OPS` found in - `catalua_type_operators.h`. -4. In `catalua_bindings_ids.cpp`, add the header where your type T is defined: - ```c++ - #include "your_type_definition.h" - ``` -5. In `reg_game_ids` function, register it like so: - ```c++ - reg_id( lua ); - ``` - -That `true` can be replaced with `false` if you only want to bind `string_id` and don't care -about (or can't implement) `int_id`. - -You may get linker errors at this stage, e.g. about `is_valid()` or `NULL_ID()` methods, which are -for various reasons not implemented forall string or int ids. In this case, you'll have to define -these manually, see relevant docs on `string_id` and `int_id` for more info. - -And that's it. Now, your type `T` will show up in Lua with `Raw` postfix, `string_id` will have -`Id` postfix, and `int_id` will have `IntId` postfix. As example, for -`LUNA_ID( horde, "Horde" )`, we'll get: - -- `horde` -> `HordeRaw` -- `string_id` -> `HordeId` -- `int_id` -> `HordeIntId` All type conversions between the 3 are implemented automatically - by the system. Actual fields and methods of `T` can be binded to Lua same way as usual. diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 000000000000..ee4c18cde72d --- /dev/null +++ b/doc/README.md @@ -0,0 +1,18 @@ +# Documentation Site + +![image](https://github.com/cataclysmbnteam/Cataclysm-BN/assets/54838975/b96a856a-9937-4f45-a508-b27766e2004b) + +Visit to see the deployed version of this site. + +## Run locally + +```sh +(Cataclysm-BN) $ cd doc +(Cataclysm-BN/doc) $ pnpm install +(Cataclysm-BN/doc) $ pnpm dev +``` + +## License + +[AGPL 3.0 only](./LICENSE), except `doc/src/content/docs`, which follows the same license as the +game. See [License.txt](../LICENSE.txt) for details. diff --git a/doc/TRANSLATING.md b/doc/TRANSLATING.md deleted file mode 100644 index 9e704a7047c3..000000000000 --- a/doc/TRANSLATING.md +++ /dev/null @@ -1,394 +0,0 @@ -# Translating Cataclysm: BN - -- [Translating Cataclysm: BN](#translating-cataclysm-bn) - - [Translators](#translators) - - [Getting Started](#getting-started) - - [Grammatical gender](#grammatical-gender) - - [Tips](#tips) - - [Developers](#developers) - - [Translation Functions](#translation-functions) - - [`_()`](#_) - - [`pgettext()`](#pgettext) - - [`vgettext()`](#vgettext) - - [`vpgettext()`](#vpgettext) - - [`translation`](#translation) - - [Lua](#lua) - - [Recommendations](#recommendations) - - [Maintainers](#maintainers) - -## Translators - -The official location for translating Cataclysm: BN is the [Transifex translations project][1]. - -If you're looking for a way to translate mods not included in game repository, see -[TRANSLATING_MODS.md](TRANSLATING_MODS.md). - -Some of the currently supported languages are: - -- Arabic -- Bulgarian -- Chinese (Simplified) -- Chinese (Traditional) -- Dutch -- Esperanto -- French -- German -- Italian (Italy) -- Japanese -- Korean -- Polish -- Portuguese (Brazil) -- Russian -- Serbian -- Spanish (Argentina) -- Spanish (Spain) -- Turkish - -Don't see your language in the list above? You can add it into the project at Transifex! - -### Getting Started - -To begin translating, head over the [translation project][1] and click on the "Help Translate -Cataclysm: BN" button. This should take you to a page where you can either create a free account on -Transifex, or login using GitHub, Google+ or LinkedIn. - -![Start translating](img/translating-start.png) - -After you've created your account, return to the [translation project][1] and click on the "Join -team" button. This will open a window where you can choose the language you are interested on -translating, so pick one and click the "Join" button. - -![Join project](img/translating-join.png) - -After this, the most straightforward thing to do is to reload the page, which should redirect you to -the translation project's dashboard. Here, you can click the "Languages" link on the sidebar to see -the list of supported languages and the current progress of the translation effort. - -Note that you can request for the inclusion of additional languages, if the one you are interested -in is not available on the list. - -![Language list](img/translating-list.png) - -From this list, you can click on the language of your choice, and then click on the "Translate" to -get started right away. Otherwise, you can click on any other language and click on the "Join team" -button, if you are interested in translating for that language as well. - -After clicking on the "Translate" button, you will be taken to the web editor. To begin, you need to -choose a resource to translate. Most of the in-game text is contained in the -`cataclysm-bright-nights` resource, so click on it to start. - -![Choose a resource](img/translating-resource.png) - -At this point, the editor should show you the list of text available for translation, now you only -need to click on the string you want to translate and type your translation on the translation area -on the right side of the screen. Click on the "Save" button when you are satisfied with your -translation. - -![Web editor](img/translating-editor.png) - -See [Transifex's documentation][2] for more information. - -### Grammatical gender - -For NPC dialogue (and potentially other strings) some languages may wish to have alternate -translations depending on the gender of the conversation participants. This two pieces of initial -configuration. - -1. The dialogue must have the relevant genders listed in the json file defining it. See - [the NPC docs](NPCs.md). -2. Each language must specify the genders it wishes to use via `genders` list of the language's - entry in `data/raw/languages.json`. Don't add genders there until you're sure you will need them, - because it will make more work for you. Current choices are: `m` (male), `f` (female), `n` - (neuter). If you need different genders than the ones currently supported, see relevant note in - `src/language.h`. - -Having done this, the relevant dialogue lines will appear multiple times for translation, with -different genders specified in the message context. For example, a context of `npc:m` would indicate -that the NPC participant in the conversation is male. - -Because of technical limitations, all supported genders will appear as contexts, but you only need -to provide translations for the genders listed in the grammatical gender list for your language. - -Other parts of the game have various ad hoc solutions to grammatical gender, so don't be surprised -to see other contexts appearing for other strings. - -### Tips - -There are issues specific to Cataclysm: BN which translators should be aware of. These include the -use of terms like `%s` and `%3$d` (leave them as they are), and the use of tags like ``, which -shouldn't be translated. - -Information about these and any other issues specific to individual languages, can be found in -Cataclysm: BN's [language notes folder][3]. - -General notes for all translators are in `README_all_translators.txt`, and notes specific to a -language may be stored as `.txt`, for example `de.txt` for German. - -Cataclysm: BN has more than 14000 translatable strings, but don't be discouraged. The more -translators there are, the easier it becomes 😄. - -## Developers - -Cataclysm: BN uses custom runtime library that works similarly to [GNU gettext][4] to display -translated texts. - -Using `gettext` requires two actions: - -- Marking strings that should be translated in the source code. -- Calling translation functions at run time. - -Marking translatable string allows for their automatic extraction. This process generates a file -that maps the original string (usually in English) as it appears in the source code to the -translated string. These mappings are used at run time by the translation functions. - -Note that only extracted strings can get translated, since the original string is acting as the -identifier used to request the translation. If a translation function can't find the translation, it -returns the original string. - -### Translation Functions - -In order to mark a string for translation and to obtain its translation at runtime, you should use -one of the following functions and classes. - -String _literals_ that are used in any of these functions are automatically extracted. Non-literal -strings are still translated at run time, but they won't get extracted. - -#### `_()` - -This function is appropriate for use on simple strings, for example: - -```c++ -const char *translated = _( "text marked for translation" ) -``` - -It also works directly: - -```c++ -add_msg( _( "You drop the %s." ), the_item_name ); -``` - -Strings from the JSON files are extracted by the `lang/extract_json_strings.py` script, and can be -translated at run time using `_()`. If translation context is desired for a JSON string, -`class translation` can be used instead, which is documented below. - -#### `pgettext()` - -This function is useful when the original string's meaning is ambiguous in isolation. For example, -the word "blue", which can mean either a color or an emotion. - -In addition to the translatable string, `pgettext` receives a context which is provided to the -translators, but is not part of the translated string itself. This function's first parameter is the -context, the second is the string to be translated: - -```c++ -const char *translated = pgettext( "The color", "blue" ); -``` - -#### `vgettext()` - -Some languages have complex rules for plural forms. `vgettext` can be used to translate these -plurals correctly. Its first parameter is the untranslated string in singular form, the second -parameter is the untranslated string in plural form and the third one is used to determine which one -of the first two should be used at run time: - -```c++ -const char *translated = vgettext( "%d zombie", "%d zombies", num_of_zombies ); -``` - -#### `vpgettext()` - -Same as `vgettext`, but allows to specify translation context. - -```c++ -const char *translated = vpgettext( "water source, not time of year", "%d spring", "%d springs", num_of_springs ); -``` - -### `translation` - -There are times when you want to store a string for translation, maybe with translation context; -Sometimes you may also want to store a string that needs no translation or has plural forms. -`class translation` in `translations.h|cpp` offers these functionalities in a single wrapper: - -```c++ -const translation text = to_translation( "Context", "Text" ); -``` - -```c++ -const translation text = to_translation( "Text without context" ); -``` - -```c++ -const translation text = pl_translation( "Singular", "Plural" ); -``` - -```c++ -const translation text = pl_translation( "Context", "Singular", "Plural" ); -``` - -```c++ -const translation text = no_translation( "This string will not be translated" ); -``` - -The string can then be translated/retrieved with the following code - -```c++ -const std::string translated = text.translated(); -``` - -```c++ -// this translates the plural form of the text corresponding to the number 2 -const std::string translated = text.translated( 2 ); -``` - -`class translation` can also be read from JSON. The method `translation::deserialize()` handles -deserialization from a `JsonIn` object, so translations can be read from JSON using the appropriate -JSON functions. The JSON syntax is as follows: - -```JSON -"name": "bar" -``` - -```JSON -"name": { "ctxt": "foo", "str": "bar", "str_pl": "baz" } -``` - -or - -```JSON -"name": { "ctxt": "foo", "str_sp": "foo" } -``` - -In the above code, `"ctxt"` and `"str_pl"` are both optional, whereas `"str_sp"` is equivalent to -specifying `"str"` and `"str_pl"` with the same string. Additionally, `"str_pl"` and `"str_sp"` will -only be read if the translation object is constructed using `plural_tag` or `pl_translation()`, or -converted using `make_plural()`. Here's an example: - -```c++ -translation name{ translation::plural_tag() }; -jsobj.read( "name", name ); -``` - -If neither "str_pl" nor "str_sp" is specified, the plural form defaults to the singular form + "s". - -You can also add comments for translators by writing it like below (the order of the entries does -not matter): - -```JSON -"name": { - "//~": "as in 'foobar'", - "str": "bar" -} -``` - -Do note that currently the JSON syntax is only supported for some JSON values, which are listed -below. If you want other json strings to use this format, refer to `translations.h|cpp` and migrate -the corresponding code. Afterwards you may also want to test `update_pot.sh` to ensure that the -strings are correctly extracted for translation, and run the unit test to fix text styling issues -reported by the `translation` class. - -| Supported JSON values | -| ------------------------------------------------- | -| Effect names | -| Item action names | -| Item category names | -| Activity verbs | -| Gate action messages | -| Spell names and descriptions | -| Terrain/furniture descriptions | -| Monster melee attack messages | -| Morale effect descriptions | -| Mutation names/descriptions | -| NPC class names/descriptions | -| Tool quality names | -| Score descriptions | -| Skill names/descriptions | -| Bionic names/descriptions | -| Terrain bash sound descriptions | -| Trap-vehicle collision sound descriptions | -| Vehicle part names/descriptions | -| Skill display type names | -| NPC dialogue u_buy_monster unique names | -| Spell messages and monster spell messages | -| Martial art names and descriptions | -| Mission names and descriptions | -| Fault names and descriptions | -| Plant names in item seed data | -| Transform use action messages and menu text | -| Template NPC names and name suffixes | -| NPC talk response text | -| Relic name overrides | -| Relic recharge messages | -| Speech text | -| Tutorial messages | -| Vitamin names | -| Recipe blueprint names | -| Recipe group recipe descriptions | -| Item names (plural supported) and descriptions | -| Recipe descriptions | -| Inscribe use action verbs/gerunds | -| Monster names (plural supported) and descriptions | -| Snippets | -| Bodypart names | -| Keybinding action names | -| Field level names | - -### Lua - -The 4 translation functions are exposed to the Lua code. See [LUA_SUPPORT.md](LUA_SUPPORT.md) for -details. - -### Recommendations - -In Cataclysm: BN, some classes, like `itype` and `mtype`, provide a wrapper for the translation -functions, called `nname`. - -When an empty string is marked for translation, it is always translated into debug information, -rather than an empty string. On most cases, strings can be considered to be never empty, and thus -always safe to mark for translation, however, when handling a string that can be empty and _needs_ -to remain empty after translation, the string should be checked for emptiness and only passed to a -translation function when is non-empty. - -Error and debug messages must not be marked for translation. When they appear, the player is -expected to report them _exactly_ as they are printed by the game. - -See the [gettext manual][5] for more information. - -## Maintainers - -Several steps need to be done in the correct order to correctly merge and maintain the translation -files. - -There are scripts available for these, so usually the process will be as follows: - -1. Download the translations in `.po` format. -2. Put them in `lang/incoming/`, ensuring they are named consistently with the files in `lang/po/`. -3. Run `lang/update_pot.sh` to update `lang/po/cataclysm-BN.pot` (requires python with `polib` and - `luaparser` modules installed). -4. Run `lang/merge_po.sh` to update `lang/po/*.po`. (This is only used to test translations locally - as the project now uses Transifex for translation) - - This will also merge the translations from `lang/incoming/`. - -These steps should be enough to keep the translation files up-to-date. - -To compile the .po files into `.mo` files for use, run `lang/compile_mo.sh`. It will create a -directory in `lang/mo/` for each language found. - -Also note that both `lang/merge_po.sh` and `lang/compile_mo.sh` accept arguments specifying which -languages to merge or compile. So to compile only the translation for, say, Traditional Chinese -(zh_TW), one would run `lang/compile_mo.sh zh_TW`. - -After compiling the appropriate .mo file, if the language has been selected in game settings, the -translations will be automatically used when you run cataclysm. - -When `System language` is selected in settings, the game tries to use language that matches system -language based on language definitions file `data/raw/languages.json`. - -If you're testing translations for a new language, or the language does not show up in settings, -make sure it has its own entry in the definitions file. - -[1]: https://app.transifex.com/bn-team/cataclysm-bright-nights -[2]: https://docs.transifex.com/ -[3]: ../lang/notes -[4]: https://www.gnu.org/software/gettext/ -[5]: https://www.gnu.org/software/gettext/manual/index.html diff --git a/doc/astro.config.ts b/doc/astro.config.ts new file mode 100644 index 000000000000..da91c2e0014f --- /dev/null +++ b/doc/astro.config.ts @@ -0,0 +1,93 @@ +import { join } from "node:path" +import { fileURLToPath } from "node:url" + +import { defineConfig } from "astro/config" +import starlight from "@astrojs/starlight" +import starlightLinksValidator from "starlight-links-validator" +import { loadEnv } from "vite" + +import { fixRelativeLinks } from "./remark.js" + +const envPath = join(fileURLToPath(import.meta.url), "..") +const env = loadEnv("", envPath, "CUSTOM") + +console.log(env) + +const { CUSTOM_SITE_URL, CUSTOM_REPO_URL } = env + +const site = CUSTOM_SITE_URL || "https://docs.cataclysmbn.org" +const github = CUSTOM_REPO_URL || "https://github.com/cataclysmbnteam/Cataclysm-BN" +const itemGuide = "https://cbn-guide.mythoscraft.org" +const discord = "https://discord.gg/XW7XhXuZ89" + +const docModes = (dir: string) => [ + { label: "tutorial", autogenerate: { directory: `${dir}/tutorial` } }, + { label: "guides", autogenerate: { directory: `${dir}/guides` } }, + { label: "reference", autogenerate: { directory: `${dir}/reference` } }, + { label: "explanation", autogenerate: { directory: `${dir}/explanation` } }, +] + +export default defineConfig({ + site, + redirects: { "/": `/en/` }, + markdown: { + remarkPlugins: [fixRelativeLinks], + }, + integrations: [ + starlightLinksValidator(), + starlight({ + title: "Cataclysm: Bright Nights", + defaultLocale: "en", + locales: { + en: { label: "English" }, + ko: { label: "한국어", lang: "ko-KR" }, + }, + logo: { src: "./src/assets/icon-round.svg" }, + social: { github, discord }, + /* https://starlight.astro.build/guides/css-and-tailwind/#color-theme-editor */ + customCss: [ + "./src/styles/theme.css", + "./src/styles/capitalize.css", + ], + editLink: { baseUrl: `${github}/edit/upload/doc` }, + lastUpdated: true, + navbar: { + game: { + label: "Play", + link: "/game/new_player_guide", + translations: { "ko-KR": "게임 가이드" }, + items: [{ label: "Game Guides", autogenerate: { directory: "game" } }], + }, + mod: { + label: "Mod", + link: "/mod/json/tutorial/modding", + translations: { "ko-KR": "모딩" }, + items: [ + { label: "JSON", items: docModes("mod/json") }, + { label: "Lua", items: docModes("mod/lua") }, + ], + }, + dev: { + label: "Develop", + link: "/dev/guides/building/cmake", + translations: { "ko-KR": "게임 개발" }, + items: docModes("dev"), + }, + "i18n": { + label: "I18n", + link: "/i18n/tutorial/transifex", + translations: { "ko-KR": "번역" }, + items: docModes("i18n"), + }, + contribute: { + label: "Contribute", + link: "/contribute/contributing", + translations: { "ko-KR": "기여하기" }, + items: [ + { label: "Contributing", autogenerate: { directory: "contribute" } }, + ], + }, + }, + }), + ], +}) diff --git a/doc/package-lock.json b/doc/package-lock.json new file mode 100644 index 000000000000..b15dbf80fb4e --- /dev/null +++ b/doc/package-lock.json @@ -0,0 +1,7123 @@ +{ + "name": "docs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "docs", + "license": "AGPL-3.0-only", + "dependencies": { + "@astrojs/starlight": "https://github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz", + "astro": "^3.0.12", + "sharp": "^0.32.5", + "starlight-links-validator": "^0.3.0", + "unist-util-visit": "^5.0.0" + }, + "devDependencies": { + "@types/mdast": "^3.0.12", + "@types/node": "^20.5.9", + "@types/unist": "^3.0.0", + "vite": "^4.4.9" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.1.0.tgz", + "integrity": "sha512-Mp+qrNhly+27bL/Zq8lGeUY+YrdoU0eDfIlAeGIPrzt0PnI/jGpvPUdCaugv4zbCrDkOUScFfcbeEiYumrdJnw==" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.2.0.tgz", + "integrity": "sha512-NQ4ppp1CM0HNkKbJNM4saVSfmUYzGlRalF6wx7F6T/MYHYSWGuojY89/oFTy4t8VlOGUCUijlsVNNeziWaUo5g==" + }, + "node_modules/@astrojs/markdown-remark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-3.2.0.tgz", + "integrity": "sha512-jigyLfefUZPKgVmmraCkVpdUuFH1R3SrpgQO13axsgwLDBgkggaQpNR5Ag4O9PDualeBtbdt30aYSfvnBKx9Hg==", + "dependencies": { + "@astrojs/prism": "^3.0.0", + "github-slugger": "^2.0.0", + "import-meta-resolve": "^3.0.0", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^6.1.1", + "rehype-stringify": "^9.0.4", + "remark-gfm": "^3.0.1", + "remark-parse": "^10.0.2", + "remark-rehype": "^10.1.0", + "remark-smartypants": "^2.0.0", + "shiki": "^0.14.3", + "unified": "^10.1.2", + "unist-util-visit": "^4.1.2", + "vfile": "^5.3.7" + }, + "peerDependencies": { + "astro": "^3.1.0" + } + }, + "node_modules/@astrojs/markdown-remark/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/@astrojs/markdown-remark/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@astrojs/mdx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-1.1.0.tgz", + "integrity": "sha512-rmLZBw3CUCkp+5blBJloV2EqJGRaJTraJygWMfCvrLcCA3vzhwzACnVQKdUDlts8EEr6V6+HXYVqi46AVEfobg==", + "dependencies": { + "@astrojs/markdown-remark": "3.2.0", + "@mdx-js/mdx": "^2.3.0", + "acorn": "^8.10.0", + "es-module-lexer": "^1.3.0", + "estree-util-visit": "^1.2.1", + "github-slugger": "^2.0.0", + "gray-matter": "^4.0.3", + "hast-util-to-html": "^8.0.4", + "kleur": "^4.1.4", + "rehype-raw": "^6.1.1", + "remark-gfm": "^3.0.1", + "remark-smartypants": "^2.0.0", + "source-map": "^0.7.4", + "unist-util-visit": "^4.1.2", + "vfile": "^5.3.7" + }, + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "astro": "^3.1.0" + } + }, + "node_modules/@astrojs/mdx/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/@astrojs/mdx/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@astrojs/prism": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.0.0.tgz", + "integrity": "sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==", + "dependencies": { + "prismjs": "^1.29.0" + }, + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/@astrojs/sitemap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.0.0.tgz", + "integrity": "sha512-qm7npHuUW4q3OOmulqhJ1g69jEQu0Sdc6P8NbOzqIoosj/L+3v4i8dtKBnp6n1UQ4Sx8H8Vdi3Z/On7i9/ZJhw==", + "dependencies": { + "sitemap": "^7.1.1", + "zod": "3.21.1" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.9.1", + "resolved": "https://github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz", + "integrity": "sha512-q2cgTtOfenFxEyTchz+Tc49pnJbjGJBw0uysFSjRXS1/bSrsps8d+48T7IcQApEbDHTNyBFTVv3bfICfVJGwgg==", + "license": "MIT", + "dependencies": { + "@astrojs/mdx": "^1.0.0", + "@astrojs/sitemap": "^3.0.0", + "@pagefind/default-ui": "1.0.0-beta.2", + "@types/mdast": "^3.0.11", + "bcp-47": "^2.1.0", + "execa": "^7.1.1", + "hast-util-select": "^5.0.5", + "hastscript": "^7.2.0", + "pagefind": "1.0.0-beta.2", + "rehype": "^12.0.1", + "remark-directive": "^2.0.1", + "unified": "^10.1.2", + "unist-util-remove": "^3.1.1", + "unist-util-visit": "^4.1.2", + "vfile": "^5.3.7" + }, + "peerDependencies": { + "astro": "^3.0.0" + } + }, + "node_modules/@astrojs/starlight/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/@astrojs/starlight/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.0.1.tgz", + "integrity": "sha512-7zJMuikRDQ0LLLivteu0+y4pqdgznrChFiRrY3qmKlOEkLWD1T3u1a5M970lvpErP7Vgh4P298JBPjv8LTj+sw==", + "dependencies": { + "ci-info": "^3.8.0", + "debug": "^4.3.4", + "dlv": "^1.1.3", + "dset": "^3.1.2", + "is-docker": "^3.0.0", + "is-wsl": "^3.0.0", + "undici": "^5.23.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.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.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "dependencies": { + "@babel/types": "^7.22.15", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "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-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", + "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", + "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", + "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.19", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.3.tgz", + "integrity": "sha512-Lemgw4io4VZl9GHJmjiBGzQ7ONXRfRPHcUEerndjwiSkbxzrpq0Uggku5MxxrXdwJ+pTj1qyw4jwTu7hkPsgIA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.3.tgz", + "integrity": "sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.3.tgz", + "integrity": "sha512-FKQJKkK5MXcBHoNZMDNUAg1+WcZlV/cuXrWCoGF/TvdRiYS4znA0m5Il5idUwfxrE20bG/vU1Cr5e1AD6IEIjQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.3.tgz", + "integrity": "sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.3.tgz", + "integrity": "sha512-tPfZiwF9rO0jW6Jh9ipi58N5ZLoSjdxXeSrAYypy4psA2Yl1dAMhM71KxVfmjZhJmxRjSnb29YlRXXhh3GqzYw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.3.tgz", + "integrity": "sha512-ERDyjOgYeKe0Vrlr1iLrqTByB026YLPzTytDTz1DRCYM+JI92Dw2dbpRHYmdqn6VBnQ9Bor6J8ZlNwdZdxjlSg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.3.tgz", + "integrity": "sha512-nXesBZ2Ad1qL+Rm3crN7NmEVJ5uvfLFPLJev3x1j3feCQXfAhoYrojC681RhpdOph8NsvKBBwpYZHR7W0ifTTA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.3.tgz", + "integrity": "sha512-zr48Cg/8zkzZCzDHNxXO/89bf9e+r4HtzNUPoz4GmgAkF1gFAFmfgOdCbR8zMbzFDGb1FqBBhdXUpcTQRYS1cQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.3.tgz", + "integrity": "sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.3.tgz", + "integrity": "sha512-7XlCKCA0nWcbvYpusARWkFjRQNWNGlt45S+Q18UeS///K6Aw8bB2FKYe9mhVWy/XLShvCweOLZPrnMswIaDXQA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.3.tgz", + "integrity": "sha512-qGTgjweER5xqweiWtUIDl9OKz338EQqCwbS9c2Bh5jgEH19xQ1yhgGPNesugmDFq+UUSDtWgZ264st26b3de8A==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.3.tgz", + "integrity": "sha512-gy1bFskwEyxVMFRNYSvBauDIWNggD6pyxUksc0MV9UOBD138dKTzr8XnM2R4mBsHwVzeuIH8X5JhmNs2Pzrx+A==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.3.tgz", + "integrity": "sha512-UrYLFu62x1MmmIe85rpR3qou92wB9lEXluwMB/STDzPF9k8mi/9UvNsG07Tt9AqwPQXluMQ6bZbTzYt01+Ue5g==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.3.tgz", + "integrity": "sha512-9E73TfyMCbE+1AwFOg3glnzZ5fBAFK4aawssvuMgCRqCYzE0ylVxxzjEfut8xjmKkR320BEoMui4o/t9KA96gA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.3.tgz", + "integrity": "sha512-LlmsbuBdm1/D66TJ3HW6URY8wO6IlYHf+ChOUz8SUAjVTuaisfuwCOAgcxo3Zsu3BZGxmI7yt//yGOxV+lHcEA==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.3.tgz", + "integrity": "sha512-ogV0+GwEmvwg/8ZbsyfkYGaLACBQWDvO0Kkh8LKBGKj9Ru8VM39zssrnu9Sxn1wbapA2qNS6BiLdwJZGouyCwQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.3.tgz", + "integrity": "sha512-o1jLNe4uzQv2DKXMlmEzf66Wd8MoIhLNO2nlQBHLtWyh2MitDG7sMpfCO3NTcoTMuqHjfufgUQDFRI5C+xsXQw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.3.tgz", + "integrity": "sha512-AZJCnr5CZgZOdhouLcfRdnk9Zv6HbaBxjcyhq0StNcvAdVZJSKIdOiPB9az2zc06ywl0ePYJz60CjdKsQacp5Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.3.tgz", + "integrity": "sha512-Acsujgeqg9InR4glTRvLKGZ+1HMtDm94ehTIHKhJjFpgVzZG9/pIcWW/HA/DoMfEyXmANLDuDZ2sNrWcjq1lxw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.3.tgz", + "integrity": "sha512-FSrAfjVVy7TifFgYgliiJOyYynhQmqgPj15pzLyJk8BUsnlWNwP/IAy6GAiB1LqtoivowRgidZsfpoYLZH586A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.3.tgz", + "integrity": "sha512-xTScXYi12xLOWZ/sc5RBmMN99BcXp/eEf7scUC0oeiRoiT5Vvo9AycuqCp+xdpDyAU+LkrCqEpUS9fCSZF8J3Q==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.3.tgz", + "integrity": "sha512-FbUN+0ZRXsypPyWE2IwIkVjDkDnJoMJARWOcFZn4KPPli+QnKqF0z1anvfaYe3ev5HFCpRDLLBDHyOALLppWHw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "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.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.3.0.tgz", + "integrity": "sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/mdx": "^2.0.0", + "estree-util-build-jsx": "^2.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "estree-util-to-js": "^1.1.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^2.0.0", + "markdown-extensions": "^1.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^2.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "unified": "^10.0.0", + "unist-util-position-from-estree": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/@mdx-js/mdx/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/@pagefind/darwin-arm64": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.0.0-beta.2.tgz", + "integrity": "sha512-r9aSd1PreWJeGwrdK92udvySHfJSSvKyV6T+4YONh9lGKS3K2+YbX8K584IotFKB/60XLkdzmFIFLoK3CjOZ7w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.0.0-beta.2.tgz", + "integrity": "sha512-1YjlJu75oScva4PPDH2Q/FWAzfvP15XAxCmfqsMl6dtwfaZ4oqZ0Vx2jQ5CAxX2/FeDzqGQg7xkdngLekGiQwA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/default-ui": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.0.0-beta.2.tgz", + "integrity": "sha512-x75qS7ywD8iG95CLyCTmfn07tMIfAhWTuu6mT56WGpl9Ci3Z4PTfqMRhzhRDTinHEAIKO3aAtQ5TrXuCCnXVoQ==" + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.0.0-beta.2.tgz", + "integrity": "sha512-vPBFjWsmI9CBsZctmXSGc2qT7O8OPv9iLoXlQcmUrXSirwY4kESmi2W/t2Cpq6Theatyb+D7zMd0KZc6u0bX3w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.0.0-beta.2.tgz", + "integrity": "sha512-jUyS6+OH8x8q8Sn4OPi1Br7DkTlUqeaiDBAqGmfcQARonD5lf/JpNidTSM+YYa/1cRgTijOyX1RbrwQE749LUg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.0.0-beta.2.tgz", + "integrity": "sha512-I7vrQQswID6+9MdjSwnugqY9xBrSaCDdVJ9YCQMobsv5PONzdVXRjDUwDR72MAli0y/KxDYWGzBpDfKMSsvz6g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "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/babel__core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", + "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", + "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", + "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", + "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/debug": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.0.tgz", + "integrity": "sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.6.tgz", + "integrity": "sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg==", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/hast/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/@types/json5": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.30.tgz", + "integrity": "sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==" + }, + "node_modules/@types/mdast": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", + "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/mdast/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/@types/mdx": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.7.tgz", + "integrity": "sha512-BG4tyr+4amr3WsSEmHn/fXPqaCba/AYZ7dsaQTiavihQunHSIxk+uAtqsjvicNpyHN6cm+B9RVrUOtW9VzIKHw==" + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, + "node_modules/@types/nlcst": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-1.0.1.tgz", + "integrity": "sha512-aVIyXt6pZiiMOtVByE4Y0gf+BLm1Cxc4ZLSK8VRHn1CgkO+kXbQwN/EBhQmhPdBMjFJCMBKtmNW2zWQuFywz8Q==", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/nlcst/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/@types/node": { + "version": "20.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.3.tgz", + "integrity": "sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA==" + }, + "node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" + }, + "node_modules/@types/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz", + "integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==" + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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/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/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-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-align/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/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/ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==" + }, + "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/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-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/astro": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/astro/-/astro-3.1.1.tgz", + "integrity": "sha512-KLtzCcLiQEsoWHJO0vQ5QZ/9/80P3cUuBeIkl87YezRkzs3Am0kuzfeGLumb6OOcrR2W0AZGlVlS0ub+q/yiaA==", + "dependencies": { + "@astrojs/compiler": "^2.1.0", + "@astrojs/internal-helpers": "0.2.0", + "@astrojs/markdown-remark": "3.2.0", + "@astrojs/telemetry": "3.0.1", + "@babel/core": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/parser": "^7.22.10", + "@babel/plugin-transform-react-jsx": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", + "@types/babel__core": "^7.20.1", + "acorn": "^8.10.0", + "boxen": "^7.1.1", + "chokidar": "^3.5.3", + "ci-info": "^3.8.0", + "clsx": "^2.0.0", + "common-ancestor-path": "^1.0.1", + "cookie": "^0.5.0", + "debug": "^4.3.4", + "devalue": "^4.3.2", + "diff": "^5.1.0", + "es-module-lexer": "^1.3.0", + "esbuild": "^0.19.2", + "estree-walker": "^3.0.3", + "execa": "^8.0.1", + "fast-glob": "^3.3.1", + "github-slugger": "^2.0.0", + "gray-matter": "^4.0.3", + "html-escaper": "^3.0.3", + "http-cache-semantics": "^4.1.1", + "js-yaml": "^4.1.0", + "kleur": "^4.1.4", + "magic-string": "^0.30.3", + "mime": "^3.0.0", + "ora": "^7.0.1", + "p-limit": "^4.0.0", + "path-to-regexp": "^6.2.1", + "preferred-pm": "^3.1.2", + "probe-image-size": "^7.2.3", + "prompts": "^2.4.2", + "rehype": "^12.0.1", + "resolve": "^1.22.4", + "semver": "^7.5.4", + "server-destroy": "^1.0.1", + "shiki": "^0.14.3", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0", + "tsconfig-resolver": "^3.0.1", + "undici": "^5.23.0", + "unist-util-visit": "^4.1.2", + "vfile": "^5.3.7", + "vite": "^4.4.9", + "vitefu": "^0.2.4", + "which-pm": "^2.1.1", + "yargs-parser": "^21.1.1", + "zod": "3.21.1" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": ">=18.14.1", + "npm": ">=6.14.0" + }, + "optionalDependencies": { + "sharp": "^0.32.5" + } + }, + "node_modules/astro/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/astro/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/astro/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/astro/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/astro/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/astro/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + }, + "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/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "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": "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/boxen/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/boxen/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/boxen/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/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "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.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "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/caniuse-lite": { + "version": "1.0.30001538", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", + "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "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": "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/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/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "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-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", + "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "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/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/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/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/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/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/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "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/css-selector-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", + "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "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/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/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/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", + "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==" + }, + "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/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/dset": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz", + "integrity": "sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==", + "engines": { + "node": ">=4" + } + }, + "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/electron-to-chromium": { + "version": "1.4.525", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.525.tgz", + "integrity": "sha512-GIZ620hDK4YmIqAWkscG4W6RwY6gOx1y5J6f4JUQwctiJrqH2oxZYU4mXHi35oV32tr630UcepBzSBGJ/WYcZA==" + }, + "node_modules/emoji-regex": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.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/es-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==" + }, + "node_modules/esbuild": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.3.tgz", + "integrity": "sha512-UlJ1qUUA2jL2nNib1JTSkifQTcYTroFqRjwCFW4QYEKEsixXD5Tik9xML7zh2gTxkYTBKGHNH9y7txMwVyPbjw==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.3", + "@esbuild/android-arm64": "0.19.3", + "@esbuild/android-x64": "0.19.3", + "@esbuild/darwin-arm64": "0.19.3", + "@esbuild/darwin-x64": "0.19.3", + "@esbuild/freebsd-arm64": "0.19.3", + "@esbuild/freebsd-x64": "0.19.3", + "@esbuild/linux-arm": "0.19.3", + "@esbuild/linux-arm64": "0.19.3", + "@esbuild/linux-ia32": "0.19.3", + "@esbuild/linux-loong64": "0.19.3", + "@esbuild/linux-mips64el": "0.19.3", + "@esbuild/linux-ppc64": "0.19.3", + "@esbuild/linux-riscv64": "0.19.3", + "@esbuild/linux-s390x": "0.19.3", + "@esbuild/linux-x64": "0.19.3", + "@esbuild/netbsd-x64": "0.19.3", + "@esbuild/openbsd-x64": "0.19.3", + "@esbuild/sunos-x64": "0.19.3", + "@esbuild/win32-arm64": "0.19.3", + "@esbuild/win32-ia32": "0.19.3", + "@esbuild/win32-x64": "0.19.3" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "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/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/estree-util-attach-comments": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz", + "integrity": "sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz", + "integrity": "sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz", + "integrity": "sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz", + "integrity": "sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==", + "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-visit": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.1.tgz", + "integrity": "sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "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/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=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-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "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/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/find-yarn-workspace-root2": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", + "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "dependencies": { + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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-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/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + }, + "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/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/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/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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/hast-util-from-html": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", + "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html/node_modules/@types/hast": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.1.tgz", + "integrity": "sha512-hs/iBJx2aydugBQx5ETV3ZgeSS0oIreQrFJ4bjBl0XvM4wAmDjFEALY7p0rTSLt2eL+ibjRAAs9dTPiCLtmbqQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-from-html/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-from-html/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-from-html/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/hast-util-from-html/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/hast-util-from-html/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/hast-util-from-html/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/hast-util-from-html/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/hast-util-from-html/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/hast-util-from-parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", + "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/hast-util-has-property": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz", + "integrity": "sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", + "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", + "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-util-from-parse5": "^7.0.0", + "hast-util-to-parse5": "^7.0.0", + "html-void-elements": "^2.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/hast-util-raw/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-5.0.5.tgz", + "integrity": "sha512-QQhWMhgTFRhCaQdgTKzZ5g31GLQ9qRb1hZtDPMqQaOhpLBziWcshUS0uCR5IJ0U1jrK/mxg35fmcq+Dp/Cy2Aw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^2.0.0", + "hast-util-to-string": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "not": "^0.1.0", + "nth-check": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/hast-util-select/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz", + "integrity": "sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "estree-util-attach-comments": "^2.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdxjs-esm": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.1", + "unist-util-position": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/hast-util-to-html": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz", + "integrity": "sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-raw": "^7.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/hast-util-to-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", + "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.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-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz", + "integrity": "sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", + "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" + }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "engines": { + "node": ">=14.18.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/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/import-meta-resolve": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", + "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/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.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "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-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "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-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "engines": { + "node": ">=12" + }, + "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-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-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-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.0.0.tgz", + "integrity": "sha512-TQ7xXW/fTBaz/HhGSV779AC99ocpvb9qJPuPwyIea+F+Z+htcQ1wouAA0xEQaa4saVqyP8mwkoYp5efeM/4Gbg==", + "dependencies": { + "is-docker": "^3.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "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/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/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/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "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": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/load-yaml-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", + "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-yaml-file/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/load-yaml-file/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/load-yaml-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "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/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/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/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/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/magic-string": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", + "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/markdown-extensions": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz", + "integrity": "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "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/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/@types/mdast": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.0.tgz", + "integrity": "sha512-YLeG8CujC9adtj/kuDzq1N4tCDYKoZ5l/bnjq8d74+t/3q/tHquJOJKUQXJrLCflOHpKjXgcI/a929gpmLOEng==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-directive": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-2.2.4.tgz", + "integrity": "sha512-sK3ojFP+jpj1n7Zo5ZKvoxP1MvLyzVG63+gm40Z/qI00avzdPCYxt7RBMgofwAva9gBjbDBWVRB/i+UD+fUCzQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-from-markdown": "^1.3.0", + "mdast-util-to-markdown": "^1.5.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^5.1.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.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": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz", + "integrity": "sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdx-jsx": "^2.0.0", + "mdast-util-mdxjs-esm": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz", + "integrity": "sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz", + "integrity": "sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "ccount": "^2.0.0", + "mdast-util-from-markdown": "^1.1.0", + "mdast-util-to-markdown": "^1.3.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^4.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz", + "integrity": "sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/mdast-util-to-hast/node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "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", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "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-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-2.2.1.tgz", + "integrity": "sha512-ZFKZkNaEqAP86IghX1X7sE8NNnx6kFNq9mSBRvEHjArutTCJZ3LYg6VH151lXVb1JHpmIcW/7rX25oMoIHuSug==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "parse-entities": "^4.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz", + "integrity": "sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz", + "integrity": "sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz", + "integrity": "sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz", + "integrity": "sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^1.0.0", + "micromark-extension-mdx-jsx": "^1.0.0", + "micromark-extension-mdx-md": "^1.0.0", + "micromark-extension-mdxjs-esm": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz", + "integrity": "sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==", + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-core-commonmark": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.1.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "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-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "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-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz", + "integrity": "sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "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-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "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-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "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-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "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": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "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": "1.2.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz", + "integrity": "sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==", + "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": "^2.0.0", + "estree-util-visit": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "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-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "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": "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/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, + "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/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "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/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nlcst-to-string": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz", + "integrity": "sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==", + "dependencies": { + "@types/nlcst": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-abi": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "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/not": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/not/-/not-0.1.0.tgz", + "integrity": "sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==" + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", + "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.3.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/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/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": "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/p-locate/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/p-locate/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/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/pagefind": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.0.0-beta.2.tgz", + "integrity": "sha512-YwtoH63JRdh4ZoEeo4aPEKXyUyNR8l/wgH9up4HVB0xaGEz4R0BgefHC2MAvkIAX1sq4TgITgInqunL0wQWumA==", + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.0.0-beta.2", + "@pagefind/darwin-x64": "1.0.0-beta.2", + "@pagefind/linux-arm64": "1.0.0-beta.2", + "@pagefind/linux-x64": "1.0.0-beta.2", + "@pagefind/windows-x64": "1.0.0-beta.2" + } + }, + "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.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/parse-latin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-5.0.1.tgz", + "integrity": "sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==", + "dependencies": { + "nlcst-to-string": "^3.0.0", + "unist-util-modify-children": "^3.0.0", + "unist-util-visit-children": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "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/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": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" + }, + "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.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "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/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", + "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.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/prebuild-install/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/preferred-pm": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.1.2.tgz", + "integrity": "sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==", + "dependencies": { + "find-up": "^5.0.0", + "find-yarn-workspace-root2": "1.2.16", + "path-exists": "^4.0.0", + "which-pm": "2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/preferred-pm/node_modules/which-pm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", + "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", + "dependencies": { + "load-yaml-file": "^0.2.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8.15" + } + }, + "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/probe-image-size": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", + "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", + "dependencies": { + "lodash.merge": "^4.6.2", + "needle": "^2.5.2", + "stream-parser": "~0.3.1" + } + }, + "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/prompts/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/property-information": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.3.0.tgz", + "integrity": "sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, + "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/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/rehype": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.1.tgz", + "integrity": "sha512-ey6kAqwLM3X6QnMDILJthGvG1m1ULROS9NT4uG9IDCuv08SFyLlreSuvOa//DgEvbXx62DS6elGVqusWhRUbgw==", + "dependencies": { + "@types/hast": "^2.0.0", + "rehype-parse": "^8.0.0", + "rehype-stringify": "^9.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.5.tgz", + "integrity": "sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^7.0.0", + "parse5": "^6.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", + "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-raw": "^7.2.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.4.tgz", + "integrity": "sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-directive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-2.0.1.tgz", + "integrity": "sha512-oosbsUAkU/qmUE78anLaJePnPis4ihsE7Agp0T/oqTzvTea8pOiaYEtfInU/+xMOVTS9PN5AhGOiaIVe4GD8gw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-directive": "^2.0.0", + "micromark-extension-directive": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.3.0.tgz", + "integrity": "sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==", + "dependencies": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-2.0.0.tgz", + "integrity": "sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==", + "dependencies": { + "retext": "^8.1.0", + "retext-smartypants": "^5.1.0", + "unist-util-visit": "^4.1.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-smartypants/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/remark-smartypants/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "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/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/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/restore-cursor/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/retext": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-8.1.0.tgz", + "integrity": "sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==", + "dependencies": { + "@types/nlcst": "^1.0.0", + "retext-latin": "^3.0.0", + "retext-stringify": "^3.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-3.1.0.tgz", + "integrity": "sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==", + "dependencies": { + "@types/nlcst": "^1.0.0", + "parse-latin": "^5.0.0", + "unherit": "^3.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-5.2.0.tgz", + "integrity": "sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==", + "dependencies": { + "@types/nlcst": "^1.0.0", + "nlcst-to-string": "^3.0.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/retext-smartypants/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-3.1.0.tgz", + "integrity": "sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==", + "dependencies": { + "@types/nlcst": "^1.0.0", + "nlcst-to-string": "^3.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/rollup": { + "version": "3.29.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.2.tgz", + "integrity": "sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "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/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "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/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==" + }, + "node_modules/sharp": { + "version": "0.32.6", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", + "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "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/shiki": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.4.tgz", + "integrity": "sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ==", + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "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/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", + "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "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/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.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "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/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/starlight-links-validator": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/starlight-links-validator/-/starlight-links-validator-0.3.0.tgz", + "integrity": "sha512-nQ0fq1yuo8LAGZGD7J7ntKkVht1Qe2djaw544DuOeBxV5JSHNTkAs3c+UxgG3JRZcbNHSb7e+N/cUjxCNOUR6w==", + "dependencies": { + "github-slugger": "2.0.0", + "hast-util-from-html": "2.0.1", + "hast-util-has-property": "3.0.0", + "kleur": "4.1.5", + "mdast-util-to-string": "3.2.0", + "unist-util-visit": "4.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@astrojs/starlight": ">=0.0.1", + "astro": ">=2.5.0" + } + }, + "node_modules/starlight-links-validator/node_modules/@types/hast": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.1.tgz", + "integrity": "sha512-hs/iBJx2aydugBQx5ETV3ZgeSS0oIreQrFJ4bjBl0XvM4wAmDjFEALY7p0rTSLt2eL+ibjRAAs9dTPiCLtmbqQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/starlight-links-validator/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/starlight-links-validator/node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/starlight-links-validator/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", + "dependencies": { + "debug": "2" + } + }, + "node_modules/stream-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/stream-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/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/streamx": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", + "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, + "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": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/style-to-object": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.2.tgz", + "integrity": "sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "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/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/tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "dependencies": { + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + } + }, + "node_modules/tar-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "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/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.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tsconfig-resolver": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tsconfig-resolver/-/tsconfig-resolver-3.0.1.tgz", + "integrity": "sha512-ZHqlstlQF449v8glscGRXzL6l2dZvASPCdXJRWG4gHEZlUVx2Jtmr+a2zeVG4LCsKhDXKRj5R3h0C/98UcVAQg==", + "dependencies": { + "@types/json5": "^0.0.30", + "@types/resolve": "^1.17.0", + "json5": "^2.1.3", + "resolve": "^1.17.0", + "strip-bom": "^4.0.0", + "type-fest": "^0.13.1" + }, + "funding": { + "url": "https://github.com/sponsors/ifiokjr" + } + }, + "node_modules/tsconfig-resolver/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "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/undici": { + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.25.0.tgz", + "integrity": "sha512-DgU98Ll+r1ssO8PcGFWIfj6kie0ttV20DSyE/CVYDVeHvfwBwQbjlsIYJIwAoU1WRhGuEEbj+jgZqcKPco5vkQ==", + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/unherit": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-3.0.1.tgz", + "integrity": "sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/unist-util-modify-children": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-3.1.1.tgz", + "integrity": "sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==", + "dependencies": { + "@types/unist": "^2.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz", + "integrity": "sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/unist-util-position/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/unist-util-remove": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-3.1.1.tgz", + "integrity": "sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz", + "integrity": "sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/unist-util-remove-position/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "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-children": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-2.0.2.tgz", + "integrity": "sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/unist-util-visit/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-visit/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/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "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.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "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/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", + "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/vfile/node_modules/@types/unist": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/vitefu": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", + "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==" + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==" + }, + "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/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/which-pm": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.1.1.tgz", + "integrity": "sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==", + "dependencies": { + "load-yaml-file": "^0.2.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8.15" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "engines": { + "node": ">=4" + } + }, + "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/widest-line/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/widest-line/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/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-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/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/wrap-ansi/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/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/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "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/zod": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.1.tgz", + "integrity": "sha512-+dTu2m6gmCbO9Ahm4ZBDapx2O6ZY9QSPXst2WXjcznPMwf2YNpn3RevLx4KkZp1OPW/ouFcoBtBzFz/LeY69oA==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "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/doc/package.json b/doc/package.json new file mode 100644 index 000000000000..e3a2f5ba7171 --- /dev/null +++ b/doc/package.json @@ -0,0 +1,35 @@ +{ + "homepage": "https://github.com/cataclysmbnteam/Cataclysm-BN", + "private": true, + "license": "AGPL-3.0-only", + "name": "docs", + "type": "module", + "packageManager": "pnpm@8.7.4", + "contributors": [ + { + "name": "scarf", + "email": "greenscarf005@gmail.com", + "url": "https://github.com/scarf005" + } + ], + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/starlight": "https://github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz", + "astro": "^3.0.12", + "sharp": "^0.32.5", + "starlight-links-validator": "^0.3.0", + "unist-util-visit": "^5.0.0" + }, + "devDependencies": { + "@types/mdast": "^3.0.12", + "@types/node": "^20.5.9", + "@types/unist": "^3.0.0", + "vite": "^4.4.9" + } +} diff --git a/doc/pnpm-lock.yaml b/doc/pnpm-lock.yaml new file mode 100644 index 000000000000..62b7aaae132a --- /dev/null +++ b/doc/pnpm-lock.yaml @@ -0,0 +1,4061 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@astrojs/starlight': + specifier: https://github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz + version: '@github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz(astro@3.0.12)' + astro: + specifier: ^3.0.12 + version: 3.0.12(@types/node@20.5.9) + sharp: + specifier: ^0.32.5 + version: 0.32.5 + starlight-links-validator: + specifier: ^0.3.0 + version: 0.3.0(@astrojs/starlight@0.9.1)(astro@3.0.12) + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 + +devDependencies: + '@types/mdast': + specifier: ^3.0.12 + version: 3.0.12 + '@types/node': + specifier: ^20.5.9 + version: 20.5.9 + '@types/unist': + specifier: ^3.0.0 + version: 3.0.0 + vite: + specifier: ^4.4.9 + version: 4.4.9(@types/node@20.5.9) + +packages: + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + dev: false + + /@astrojs/compiler@2.1.0: + resolution: {integrity: sha512-Mp+qrNhly+27bL/Zq8lGeUY+YrdoU0eDfIlAeGIPrzt0PnI/jGpvPUdCaugv4zbCrDkOUScFfcbeEiYumrdJnw==} + dev: false + + /@astrojs/internal-helpers@0.2.0: + resolution: {integrity: sha512-NQ4ppp1CM0HNkKbJNM4saVSfmUYzGlRalF6wx7F6T/MYHYSWGuojY89/oFTy4t8VlOGUCUijlsVNNeziWaUo5g==} + dev: false + + /@astrojs/markdown-remark@3.0.0(astro@3.0.12): + resolution: {integrity: sha512-s8I49Je4++ImgYAgwL32HgN8m6we2qz3RtBpN4AjObMODPwDylmzUHZksD8Toy31q/P59ED3MuwphqOGm9l03w==} + peerDependencies: + astro: ^3.0.0 + dependencies: + '@astrojs/prism': 3.0.0 + astro: 3.0.12(@types/node@20.5.9) + github-slugger: 2.0.0 + import-meta-resolve: 3.0.0 + rehype-raw: 6.1.1 + rehype-stringify: 9.0.4 + remark-gfm: 3.0.1 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + remark-smartypants: 2.0.0 + shiki: 0.14.4 + unified: 10.1.2 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/markdown-remark@3.1.0(astro@3.0.12): + resolution: {integrity: sha512-5UwamK0iFxN0n1Nw44vUk8AkQr4psKS63hM3D1/4bhhjs4ZFRyrYmg5NjScaMEXZcrd2KgGPsd+PEwNs4mlBOw==} + peerDependencies: + astro: ^3.0.11 + dependencies: + '@astrojs/prism': 3.0.0 + astro: 3.0.12(@types/node@20.5.9) + github-slugger: 2.0.0 + import-meta-resolve: 3.0.0 + rehype-raw: 6.1.1 + rehype-stringify: 9.0.4 + remark-gfm: 3.0.1 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + remark-smartypants: 2.0.0 + shiki: 0.14.4 + unified: 10.1.2 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/mdx@1.0.2(astro@3.0.12): + resolution: {integrity: sha512-dcGw+Idi/xM3GF1E9b/RyRw4ot5kzVCUNZkkhSELZxiFLPa94xlAz3BcplXlUiKs7NTIOp3ehLqCmbneiC78sA==} + engines: {node: '>=18.14.1'} + peerDependencies: + astro: ^3.0.10 + dependencies: + '@astrojs/markdown-remark': 3.0.0(astro@3.0.12) + '@astrojs/prism': 3.0.0 + '@mdx-js/mdx': 2.3.0 + acorn: 8.10.0 + astro: 3.0.12(@types/node@20.5.9) + es-module-lexer: 1.3.0 + estree-util-visit: 1.2.1 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + hast-util-to-html: 8.0.4 + kleur: 4.1.5 + rehype-raw: 6.1.1 + remark-frontmatter: 4.0.1 + remark-gfm: 3.0.1 + remark-smartypants: 2.0.0 + shiki: 0.14.4 + source-map: 0.7.4 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/prism@3.0.0: + resolution: {integrity: sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==} + engines: {node: '>=18.14.1'} + dependencies: + prismjs: 1.29.0 + dev: false + + /@astrojs/sitemap@3.0.0: + resolution: {integrity: sha512-qm7npHuUW4q3OOmulqhJ1g69jEQu0Sdc6P8NbOzqIoosj/L+3v4i8dtKBnp6n1UQ4Sx8H8Vdi3Z/On7i9/ZJhw==} + dependencies: + sitemap: 7.1.1 + zod: 3.21.1 + dev: false + + /@astrojs/telemetry@3.0.1: + resolution: {integrity: sha512-7zJMuikRDQ0LLLivteu0+y4pqdgznrChFiRrY3qmKlOEkLWD1T3u1a5M970lvpErP7Vgh4P298JBPjv8LTj+sw==} + engines: {node: '>=18.14.1'} + dependencies: + ci-info: 3.8.0 + debug: 4.3.4 + dlv: 1.1.3 + dset: 3.1.2 + is-docker: 3.0.0 + is-wsl: 3.0.0 + undici: 5.23.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.13 + chalk: 2.4.2 + dev: false + + /@babel/compat-data@7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/core@7.22.15: + resolution: {integrity: sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.15 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.22.15(@babel/core@7.22.15) + '@babel/helpers': 7.22.15 + '@babel/parser': 7.22.16 + '@babel/template': 7.22.15 + '@babel/traverse': 7.22.15 + '@babel/types': 7.22.15 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/generator@7.22.15: + resolution: {integrity: sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.15 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + dev: false + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: false + + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.22.15 + dev: false + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@babel/helper-module-transforms@7.22.15(@babel/core@7.22.15): + resolution: {integrity: sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.15 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.15 + dev: false + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-identifier@7.22.15: + resolution: {integrity: sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helpers@7.22.15: + resolution: {integrity: sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.22.15 + '@babel/types': 7.22.15 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/highlight@7.22.13: + resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.15 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: false + + /@babel/parser@7.22.16: + resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.15): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.22.15): + resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.15 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.15) + '@babel/types': 7.22.15 + dev: false + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.22.16 + '@babel/types': 7.22.15 + dev: false + + /@babel/traverse@7.22.15: + resolution: {integrity: sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.15 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.16 + '@babel/types': 7.22.15 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/types@7.22.15: + resolution: {integrity: sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.15 + to-fast-properties: 2.0.0 + dev: false + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm64@0.19.2: + resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm@0.19.2: + resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-x64@0.19.2: + resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-arm64@0.19.2: + resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-x64@0.19.2: + resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64@0.19.2: + resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-x64@0.19.2: + resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm64@0.19.2: + resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm@0.19.2: + resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ia32@0.19.2: + resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64@0.19.2: + resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-mips64el@0.19.2: + resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ppc64@0.19.2: + resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-riscv64@0.19.2: + resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-s390x@0.19.2: + resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-x64@0.19.2: + resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/netbsd-x64@0.19.2: + resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-x64@0.19.2: + resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /@esbuild/sunos-x64@0.19.2: + resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-arm64@0.19.2: + resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-ia32@0.19.2: + resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-x64@0.19.2: + resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + dev: false + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: false + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@mdx-js/mdx@2.3.0: + resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/mdx': 2.0.7 + estree-util-build-jsx: 2.2.2 + estree-util-is-identifier-name: 2.1.0 + estree-util-to-js: 1.2.0 + estree-walker: 3.0.3 + hast-util-to-estree: 2.3.3 + markdown-extensions: 1.1.1 + periscopic: 3.1.0 + remark-mdx: 2.3.0 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + unified: 10.1.2 + unist-util-position-from-estree: 1.1.2 + unist-util-stringify-position: 3.0.3 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: false + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: false + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: false + + /@pagefind/darwin-arm64@1.0.0-beta.2: + resolution: {integrity: sha512-r9aSd1PreWJeGwrdK92udvySHfJSSvKyV6T+4YONh9lGKS3K2+YbX8K584IotFKB/60XLkdzmFIFLoK3CjOZ7w==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@pagefind/darwin-x64@1.0.0-beta.2: + resolution: {integrity: sha512-1YjlJu75oScva4PPDH2Q/FWAzfvP15XAxCmfqsMl6dtwfaZ4oqZ0Vx2jQ5CAxX2/FeDzqGQg7xkdngLekGiQwA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@pagefind/default-ui@1.0.0-beta.2: + resolution: {integrity: sha512-x75qS7ywD8iG95CLyCTmfn07tMIfAhWTuu6mT56WGpl9Ci3Z4PTfqMRhzhRDTinHEAIKO3aAtQ5TrXuCCnXVoQ==} + dev: false + + /@pagefind/linux-arm64@1.0.0-beta.2: + resolution: {integrity: sha512-vPBFjWsmI9CBsZctmXSGc2qT7O8OPv9iLoXlQcmUrXSirwY4kESmi2W/t2Cpq6Theatyb+D7zMd0KZc6u0bX3w==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@pagefind/linux-x64@1.0.0-beta.2: + resolution: {integrity: sha512-jUyS6+OH8x8q8Sn4OPi1Br7DkTlUqeaiDBAqGmfcQARonD5lf/JpNidTSM+YYa/1cRgTijOyX1RbrwQE749LUg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@pagefind/windows-x64@1.0.0-beta.2: + resolution: {integrity: sha512-I7vrQQswID6+9MdjSwnugqY9xBrSaCDdVJ9YCQMobsv5PONzdVXRjDUwDR72MAli0y/KxDYWGzBpDfKMSsvz6g==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /@types/babel__core@7.20.1: + resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} + dependencies: + '@babel/parser': 7.22.16 + '@babel/types': 7.22.15 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.20.1 + dev: false + + /@types/babel__generator@7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@types/babel__template@7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.22.16 + '@babel/types': 7.22.15 + dev: false + + /@types/babel__traverse@7.20.1: + resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} + dependencies: + '@babel/types': 7.22.15 + dev: false + + /@types/debug@4.1.8: + resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} + dependencies: + '@types/ms': 0.7.31 + dev: false + + /@types/estree-jsx@1.0.0: + resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: false + + /@types/hast@2.3.5: + resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /@types/hast@3.0.0: + resolution: {integrity: sha512-SoytUJRuf68HXYqcXicQIhCrLQjqeYU2anikr4G3p3Iz+OZO5QDQpDj++gv+RenHsnUBwNZ2dumBArF8VLSk2Q==} + dependencies: + '@types/unist': 3.0.0 + dev: false + + /@types/json5@0.0.30: + resolution: {integrity: sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==} + dev: false + + /@types/mdast@3.0.12: + resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + dependencies: + '@types/unist': 2.0.8 + + /@types/mdx@2.0.7: + resolution: {integrity: sha512-BG4tyr+4amr3WsSEmHn/fXPqaCba/AYZ7dsaQTiavihQunHSIxk+uAtqsjvicNpyHN6cm+B9RVrUOtW9VzIKHw==} + dev: false + + /@types/ms@0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: false + + /@types/nlcst@1.0.1: + resolution: {integrity: sha512-aVIyXt6pZiiMOtVByE4Y0gf+BLm1Cxc4ZLSK8VRHn1CgkO+kXbQwN/EBhQmhPdBMjFJCMBKtmNW2zWQuFywz8Q==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /@types/node@17.0.45: + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + dev: false + + /@types/node@20.5.9: + resolution: {integrity: sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==} + + /@types/parse5@6.0.3: + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + dev: false + + /@types/resolve@1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: false + + /@types/sax@1.2.4: + resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} + dependencies: + '@types/node': 20.5.9 + dev: false + + /@types/unist@2.0.8: + resolution: {integrity: sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==} + + /@types/unist@3.0.0: + resolution: {integrity: sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==} + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: false + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + + /ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} + dev: false + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: false + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + + /array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + dev: false + + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + dev: false + + /astro@3.0.12(@types/node@20.5.9): + resolution: {integrity: sha512-nDLI9OGEjYIX90a1Md1orqyurPxqXTWTy7Sm3ZsWl5dpzSjcUXo3VB/GTvNjAMS9sE40BOxhay7/hnnQuI8p7A==} + engines: {node: '>=18.14.1', npm: '>=6.14.0'} + hasBin: true + dependencies: + '@astrojs/compiler': 2.1.0 + '@astrojs/internal-helpers': 0.2.0 + '@astrojs/markdown-remark': 3.1.0(astro@3.0.12) + '@astrojs/telemetry': 3.0.1 + '@babel/core': 7.22.15 + '@babel/generator': 7.22.15 + '@babel/parser': 7.22.16 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.22.15) + '@babel/traverse': 7.22.15 + '@babel/types': 7.22.15 + '@types/babel__core': 7.20.1 + acorn: 8.10.0 + boxen: 7.1.1 + chokidar: 3.5.3 + ci-info: 3.8.0 + clsx: 2.0.0 + common-ancestor-path: 1.0.1 + cookie: 0.5.0 + debug: 4.3.4 + devalue: 4.3.2 + diff: 5.1.0 + es-module-lexer: 1.3.0 + esbuild: 0.19.2 + estree-walker: 3.0.3 + execa: 8.0.1 + fast-glob: 3.3.1 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + html-escaper: 3.0.3 + http-cache-semantics: 4.1.1 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.3 + mime: 3.0.0 + ora: 7.0.1 + p-limit: 4.0.0 + path-to-regexp: 6.2.1 + preferred-pm: 3.1.2 + prompts: 2.4.2 + rehype: 12.0.1 + resolve: 1.22.4 + semver: 7.5.4 + server-destroy: 1.0.1 + shiki: 0.14.4 + string-width: 6.1.0 + strip-ansi: 7.1.0 + tsconfig-resolver: 3.0.1 + undici: 5.23.0 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + vite: 4.4.9(@types/node@20.5.9) + vitefu: 0.2.4(vite@4.4.9) + which-pm: 2.1.1 + yargs-parser: 21.1.1 + zod: 3.21.1 + optionalDependencies: + sharp: 0.32.5 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: false + + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + dev: false + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + dev: false + + /bcp-47@2.1.0: + resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} + dependencies: + is-alphabetical: 2.0.1 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: false + + /boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + dev: false + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001528 + electron-to-chromium: 1.4.511 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + dev: false + + /caniuse-lite@1.0.30001528: + resolution: {integrity: sha512-0Db4yyjR9QMNlsxh+kKWzQtkyflkG/snYheSzkjmvdEtEXB1+jt7A2HmSEiO6XIJPIbo92lHNGNySvE5pZcs5Q==} + dev: false + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: false + + /cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + dev: false + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: false + + /cli-spinners@2.9.0: + resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} + engines: {node: '>=6'} + dev: false + + /clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + + /common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + dev: false + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + + /css-selector-parser@1.4.1: + resolution: {integrity: sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==} + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: false + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + + /devalue@4.3.2: + resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} + dev: false + + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: false + + /direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + dev: false + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: false + + /dset@3.1.2: + resolution: {integrity: sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==} + engines: {node: '>=4'} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + + /electron-to-chromium@1.4.511: + resolution: {integrity: sha512-udHyLfdy390CObLy3uFQitCBvK+WxWu6WZWQMBzO/npNiRy6tanDKR1c/F6OImfAiSt1ylgNszPJBxix2c0w3w==} + dev: false + + /emoji-regex@10.2.1: + resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + + /es-module-lexer@1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + dev: false + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + /esbuild@0.19.2: + resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.2 + '@esbuild/android-arm64': 0.19.2 + '@esbuild/android-x64': 0.19.2 + '@esbuild/darwin-arm64': 0.19.2 + '@esbuild/darwin-x64': 0.19.2 + '@esbuild/freebsd-arm64': 0.19.2 + '@esbuild/freebsd-x64': 0.19.2 + '@esbuild/linux-arm': 0.19.2 + '@esbuild/linux-arm64': 0.19.2 + '@esbuild/linux-ia32': 0.19.2 + '@esbuild/linux-loong64': 0.19.2 + '@esbuild/linux-mips64el': 0.19.2 + '@esbuild/linux-ppc64': 0.19.2 + '@esbuild/linux-riscv64': 0.19.2 + '@esbuild/linux-s390x': 0.19.2 + '@esbuild/linux-x64': 0.19.2 + '@esbuild/netbsd-x64': 0.19.2 + '@esbuild/openbsd-x64': 0.19.2 + '@esbuild/sunos-x64': 0.19.2 + '@esbuild/win32-arm64': 0.19.2 + '@esbuild/win32-ia32': 0.19.2 + '@esbuild/win32-x64': 0.19.2 + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /estree-util-attach-comments@2.1.1: + resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /estree-util-build-jsx@2.2.2: + resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + dependencies: + '@types/estree-jsx': 1.0.0 + estree-util-is-identifier-name: 2.1.0 + estree-walker: 3.0.3 + dev: false + + /estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + dev: false + + /estree-util-to-js@1.2.0: + resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + dependencies: + '@types/estree-jsx': 1.0.0 + astring: 1.8.6 + source-map: 0.7.4 + dev: false + + /estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/unist': 2.0.8 + dev: false + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: false + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: false + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: false + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: false + + /fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + dependencies: + format: 0.2.2 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: false + + /find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + dev: false + + /format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + dev: false + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: false + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: false + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: false + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: false + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + + /github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: false + + /hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + dependencies: + '@types/hast': 3.0.0 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.1 + parse5: 7.1.2 + vfile: 6.0.1 + vfile-message: 4.0.2 + dev: false + + /hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + dependencies: + '@types/hast': 2.3.5 + '@types/unist': 2.0.8 + hastscript: 7.2.0 + property-information: 6.3.0 + vfile: 5.3.7 + vfile-location: 4.1.0 + web-namespaces: 2.0.1 + dev: false + + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + dependencies: + '@types/hast': 3.0.0 + '@types/unist': 3.0.0 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.3.0 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 + dev: false + + /hast-util-has-property@2.0.1: + resolution: {integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==} + dev: false + + /hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + dependencies: + '@types/hast': 3.0.0 + dev: false + + /hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + dependencies: + '@types/hast': 2.3.5 + dev: false + + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + dependencies: + '@types/hast': 3.0.0 + dev: false + + /hast-util-raw@7.2.3: + resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + dependencies: + '@types/hast': 2.3.5 + '@types/parse5': 6.0.3 + hast-util-from-parse5: 7.1.2 + hast-util-to-parse5: 7.1.0 + html-void-elements: 2.0.1 + parse5: 6.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-select@5.0.5: + resolution: {integrity: sha512-QQhWMhgTFRhCaQdgTKzZ5g31GLQ9qRb1hZtDPMqQaOhpLBziWcshUS0uCR5IJ0U1jrK/mxg35fmcq+Dp/Cy2Aw==} + dependencies: + '@types/hast': 2.3.5 + '@types/unist': 2.0.8 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 1.4.1 + direction: 2.0.1 + hast-util-has-property: 2.0.1 + hast-util-to-string: 2.0.0 + hast-util-whitespace: 2.0.1 + not: 0.1.0 + nth-check: 2.1.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + dev: false + + /hast-util-to-estree@2.3.3: + resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + dependencies: + '@types/estree': 1.0.1 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/unist': 2.0.8 + comma-separated-tokens: 2.0.3 + estree-util-attach-comments: 2.1.1 + estree-util-is-identifier-name: 2.1.0 + hast-util-whitespace: 2.0.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdxjs-esm: 1.3.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.2 + unist-util-position: 4.0.4 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-html@8.0.4: + resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} + dependencies: + '@types/hast': 2.3.5 + '@types/unist': 2.0.8 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 7.2.3 + hast-util-whitespace: 2.0.1 + html-void-elements: 2.0.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.3 + zwitch: 2.0.4 + dev: false + + /hast-util-to-parse5@7.1.0: + resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + dependencies: + '@types/hast': 2.3.5 + comma-separated-tokens: 2.0.3 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-to-string@2.0.0: + resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==} + dependencies: + '@types/hast': 2.3.5 + dev: false + + /hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + dev: false + + /hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + dependencies: + '@types/hast': 2.3.5 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + dev: false + + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + dependencies: + '@types/hast': 3.0.0 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + dev: false + + /html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + dev: false + + /html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + dev: false + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: false + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /import-meta-resolve@3.0.0: + resolution: {integrity: sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: false + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + dev: false + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: false + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + + /is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /is-reference@3.0.1: + resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} + dependencies: + '@types/estree': 1.0.1 + dev: false + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: false + + /is-wsl@3.0.0: + resolution: {integrity: sha512-TQ7xXW/fTBaz/HhGSV779AC99ocpvb9qJPuPwyIea+F+Z+htcQ1wouAA0xEQaa4saVqyP8mwkoYp5efeM/4Gbg==} + engines: {node: '>=16'} + dependencies: + is-docker: 3.0.0 + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: false + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: false + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: false + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: false + + /load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: false + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: false + + /log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + dev: false + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /magic-string@0.30.3: + resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /markdown-extensions@1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + dev: false + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + + /mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.8 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-directive@2.2.4: + resolution: {integrity: sha512-sK3ojFP+jpj1n7Zo5ZKvoxP1MvLyzVG63+gm40Z/qI00avzdPCYxt7RBMgofwAva9gBjbDBWVRB/i+UD+fUCzQ==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.8 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-visit-parents: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-find-and-replace@2.2.2: + resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + dependencies: + '@types/mdast': 3.0.12 + escape-string-regexp: 5.0.0 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.8 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-frontmatter@1.0.1: + resolution: {integrity: sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + micromark-extension-frontmatter: 1.1.1 + dev: false + + /mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + dependencies: + '@types/mdast': 3.0.12 + ccount: 2.0.1 + mdast-util-find-and-replace: 2.2.2 + micromark-util-character: 1.2.0 + dev: false + + /mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + micromark-util-normalize-identifier: 1.1.0 + dev: false + + /mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + dev: false + + /mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + dependencies: + '@types/mdast': 3.0.12 + markdown-table: 3.0.3 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + dev: false + + /mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-gfm-autolink-literal: 1.0.3 + mdast-util-gfm-footnote: 1.0.2 + mdast-util-gfm-strikethrough: 1.0.3 + mdast-util-gfm-table: 1.0.7 + mdast-util-gfm-task-list-item: 1.0.2 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + '@types/unist': 2.0.8 + ccount: 2.0.1 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 4.0.2 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdx-jsx: 2.1.4 + mdast-util-mdxjs-esm: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + dependencies: + '@types/mdast': 3.0.12 + unist-util-is: 5.2.1 + dev: false + + /mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + dependencies: + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.2.0 + trim-lines: 3.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.8 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.1.0 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + dev: false + + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + dependencies: + '@types/mdast': 3.0.12 + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-directive@2.2.1: + resolution: {integrity: sha512-ZFKZkNaEqAP86IghX1X7sE8NNnx6kFNq9mSBRvEHjArutTCJZ3LYg6VH151lXVb1JHpmIcW/7rX25oMoIHuSug==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + parse-entities: 4.0.1 + uvu: 0.5.6 + dev: false + + /micromark-extension-frontmatter@1.1.1: + resolution: {integrity: sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==} + dependencies: + fault: 2.0.1 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-gfm-autolink-literal@1.0.5: + resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-gfm-footnote@1.1.2: + resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + dependencies: + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-strikethrough@1.0.7: + resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-table@1.0.7: + resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-tagfilter@1.0.2: + resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-gfm-task-list-item@1.0.5: + resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm@2.0.3: + resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + dependencies: + micromark-extension-gfm-autolink-literal: 1.0.5 + micromark-extension-gfm-footnote: 1.1.2 + micromark-extension-gfm-strikethrough: 1.0.7 + micromark-extension-gfm-table: 1.0.7 + micromark-extension-gfm-tagfilter: 1.0.2 + micromark-extension-gfm-task-list-item: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + dependencies: + '@types/estree': 1.0.1 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.1 + estree-util-is-identifier-name: 2.1.0 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + dependencies: + '@types/estree': 1.0.1 + micromark-core-commonmark: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + micromark-extension-mdx-expression: 1.0.8 + micromark-extension-mdx-jsx: 1.0.5 + micromark-extension-mdx-md: 1.0.1 + micromark-extension-mdxjs-esm: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + dependencies: + '@types/estree': 1.0.1 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + dev: false + + /micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.1 + '@types/unist': 2.0.8 + estree-util-visit: 1.2.1 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false + + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + dev: false + + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + dev: false + + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + dev: false + + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + dependencies: + '@types/debug': 4.1.8 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + + /nlcst-to-string@3.1.1: + resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} + dependencies: + '@types/nlcst': 1.0.1 + dev: false + + /node-abi@3.47.0: + resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + dev: false + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /not@0.1.0: + resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} + dev: false + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + + /ora@7.0.1: + resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} + engines: {node: '>=16'} + dependencies: + chalk: 5.3.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.0 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + stdin-discarder: 0.1.0 + string-width: 6.1.0 + strip-ansi: 7.1.0 + dev: false + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: false + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: false + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: false + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: false + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: false + + /pagefind@1.0.0-beta.2: + resolution: {integrity: sha512-YwtoH63JRdh4ZoEeo4aPEKXyUyNR8l/wgH9up4HVB0xaGEz4R0BgefHC2MAvkIAX1sq4TgITgInqunL0wQWumA==} + hasBin: true + optionalDependencies: + '@pagefind/darwin-arm64': 1.0.0-beta.2 + '@pagefind/darwin-x64': 1.0.0-beta.2 + '@pagefind/linux-arm64': 1.0.0-beta.2 + '@pagefind/linux-x64': 1.0.0-beta.2 + '@pagefind/windows-x64': 1.0.0-beta.2 + dev: false + + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.8 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: false + + /parse-latin@5.0.1: + resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + dependencies: + nlcst-to-string: 3.1.1 + unist-util-modify-children: 3.1.1 + unist-util-visit-children: 2.0.2 + dev: false + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: false + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false + + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.1 + estree-walker: 3.0.3 + is-reference: 3.0.1 + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: false + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: false + + /postcss@8.4.29: + resolution: {integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.47.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + + /preferred-pm@3.1.2: + resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: false + + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + dev: false + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: false + + /property-information@6.3.0: + resolution: {integrity: sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==} + dev: false + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: false + + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /rehype-parse@8.0.5: + resolution: {integrity: sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A==} + dependencies: + '@types/hast': 2.3.5 + hast-util-from-parse5: 7.1.2 + parse5: 6.0.1 + unified: 10.1.2 + dev: false + + /rehype-raw@6.1.1: + resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} + dependencies: + '@types/hast': 2.3.5 + hast-util-raw: 7.2.3 + unified: 10.1.2 + dev: false + + /rehype-stringify@9.0.4: + resolution: {integrity: sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ==} + dependencies: + '@types/hast': 2.3.5 + hast-util-to-html: 8.0.4 + unified: 10.1.2 + dev: false + + /rehype@12.0.1: + resolution: {integrity: sha512-ey6kAqwLM3X6QnMDILJthGvG1m1ULROS9NT4uG9IDCuv08SFyLlreSuvOa//DgEvbXx62DS6elGVqusWhRUbgw==} + dependencies: + '@types/hast': 2.3.5 + rehype-parse: 8.0.5 + rehype-stringify: 9.0.4 + unified: 10.1.2 + dev: false + + /remark-directive@2.0.1: + resolution: {integrity: sha512-oosbsUAkU/qmUE78anLaJePnPis4ihsE7Agp0T/oqTzvTea8pOiaYEtfInU/+xMOVTS9PN5AhGOiaIVe4GD8gw==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-directive: 2.2.4 + micromark-extension-directive: 2.2.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-frontmatter@4.0.1: + resolution: {integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-frontmatter: 1.0.1 + micromark-extension-frontmatter: 1.1.1 + unified: 10.1.2 + dev: false + + /remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-gfm: 2.0.2 + micromark-extension-gfm: 2.0.3 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + dependencies: + mdast-util-mdx: 2.0.1 + micromark-extension-mdxjs: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + dependencies: + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-to-hast: 12.3.0 + unified: 10.1.2 + dev: false + + /remark-smartypants@2.0.0: + resolution: {integrity: sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + retext: 8.1.0 + retext-smartypants: 5.2.0 + unist-util-visit: 4.1.2 + dev: false + + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /retext-latin@3.1.0: + resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} + dependencies: + '@types/nlcst': 1.0.1 + parse-latin: 5.0.1 + unherit: 3.0.1 + unified: 10.1.2 + dev: false + + /retext-smartypants@5.2.0: + resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} + dependencies: + '@types/nlcst': 1.0.1 + nlcst-to-string: 3.1.1 + unified: 10.1.2 + unist-util-visit: 4.1.2 + dev: false + + /retext-stringify@3.1.0: + resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} + dependencies: + '@types/nlcst': 1.0.1 + nlcst-to-string: 3.1.1 + unified: 10.1.2 + dev: false + + /retext@8.1.0: + resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} + dependencies: + '@types/nlcst': 1.0.1 + retext-latin: 3.1.0 + retext-stringify: 3.1.0 + unified: 10.1.2 + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: false + + /rollup@3.29.0: + resolution: {integrity: sha512-nszM8DINnx1vSS+TpbWKMkxem0CDWk3cSit/WWCBVs9/JZ1I/XLwOsiUglYuYReaeWWSsW9kge5zE5NZtf/a4w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: false + + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: false + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /server-destroy@1.0.1: + resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} + dev: false + + /sharp@0.32.5: + resolution: {integrity: sha512-0dap3iysgDkNaPOaOL4X/0akdu0ma62GcdC2NBQ+93eqpePdDdr2/LM0sFdDSMmN7yS+odyZtPsb7tx/cYBKnQ==} + engines: {node: '>=14.15.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.2 + node-addon-api: 6.1.0 + prebuild-install: 7.1.1 + semver: 7.5.4 + simple-get: 4.0.1 + tar-fs: 3.0.4 + tunnel-agent: 0.6.0 + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /shiki@0.14.4: + resolution: {integrity: sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ==} + dependencies: + ansi-sequence-parser: 1.1.1 + jsonc-parser: 3.2.0 + vscode-oniguruma: 1.7.0 + vscode-textmate: 8.0.0 + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: false + + /sitemap@7.1.1: + resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} + engines: {node: '>=12.0.0', npm: '>=5.6.0'} + hasBin: true + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.4 + arg: 5.0.2 + sax: 1.2.4 + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: false + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + + /starlight-links-validator@0.3.0(@astrojs/starlight@0.9.1)(astro@3.0.12): + resolution: {integrity: sha512-nQ0fq1yuo8LAGZGD7J7ntKkVht1Qe2djaw544DuOeBxV5JSHNTkAs3c+UxgG3JRZcbNHSb7e+N/cUjxCNOUR6w==} + engines: {node: '>=18'} + peerDependencies: + '@astrojs/starlight': '>=0.0.1' + astro: '>=2.5.0' + dependencies: + '@astrojs/starlight': '@github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz(astro@3.0.12)' + astro: 3.0.12(@types/node@20.5.9) + github-slugger: 2.0.0 + hast-util-from-html: 2.0.1 + hast-util-has-property: 3.0.0 + kleur: 4.1.5 + mdast-util-to-string: 3.2.0 + unist-util-visit: 4.1.2 + dev: false + + /stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + bl: 5.1.0 + dev: false + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /streamx@2.15.1: + resolution: {integrity: sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + + /string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 10.2.1 + strip-ansi: 7.1.0 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: false + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: false + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + + /style-to-object@0.4.2: + resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: false + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + dependencies: + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 3.1.6 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + dependencies: + b4a: 1.6.4 + fast-fifo: 1.3.2 + streamx: 2.15.1 + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: false + + /tsconfig-resolver@3.0.1: + resolution: {integrity: sha512-ZHqlstlQF449v8glscGRXzL6l2dZvASPCdXJRWG4gHEZlUVx2Jtmr+a2zeVG4LCsKhDXKRj5R3h0C/98UcVAQg==} + dependencies: + '@types/json5': 0.0.30 + '@types/resolve': 1.20.2 + json5: 2.2.3 + resolve: 1.22.4 + strip-bom: 4.0.0 + type-fest: 0.13.1 + dev: false + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + dev: false + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false + + /undici@5.23.0: + resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} + engines: {node: '>=14.0'} + dependencies: + busboy: 1.6.0 + dev: false + + /unherit@3.0.1: + resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} + dev: false + + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.8 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + dev: false + + /unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + dev: false + + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.0 + dev: false + + /unist-util-modify-children@3.1.1: + resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} + dependencies: + '@types/unist': 2.0.8 + array-iterate: 2.0.1 + dev: false + + /unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + dependencies: + '@types/unist': 2.0.8 + unist-util-visit: 4.1.2 + dev: false + + /unist-util-remove@3.1.1: + resolution: {integrity: sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw==} + dependencies: + '@types/unist': 2.0.8 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.0 + dev: false + + /unist-util-visit-children@2.0.2: + resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} + dependencies: + '@types/unist': 2.0.8 + dev: false + + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.8 + unist-util-is: 5.2.1 + dev: false + + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.0 + unist-util-is: 6.0.0 + dev: false + + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.8 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /unist-util-visit@5.0.0: + resolution: {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.1 + dev: false + + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + dev: false + + /vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + dependencies: + '@types/unist': 2.0.8 + vfile: 5.3.7 + dev: false + + /vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + dependencies: + '@types/unist': 3.0.0 + vfile: 6.0.1 + dev: false + + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.8 + unist-util-stringify-position: 3.0.3 + dev: false + + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.0 + unist-util-stringify-position: 4.0.0 + dev: false + + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.8 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false + + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + dependencies: + '@types/unist': 3.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: false + + /vite@4.4.9(@types/node@20.5.9): + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.5.9 + esbuild: 0.18.20 + postcss: 8.4.29 + rollup: 3.29.0 + optionalDependencies: + fsevents: 2.3.3 + + /vitefu@0.2.4(vite@4.4.9): + resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + vite: 4.4.9(@types/node@20.5.9) + dev: false + + /vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + dev: false + + /vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + dev: false + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false + + /which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + dev: false + + /which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: false + + /which-pm@2.1.1: + resolution: {integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: false + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: false + + /zod@3.21.1: + resolution: {integrity: sha512-+dTu2m6gmCbO9Ahm4ZBDapx2O6ZY9QSPXst2WXjcznPMwf2YNpn3RevLx4KkZp1OPW/ouFcoBtBzFz/LeY69oA==} + dev: false + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false + + '@github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz(astro@3.0.12)': + resolution: {tarball: https://github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz} + id: '@github.com/scarf005/starlight/releases/download/v2023-09-11/2023-09-11T22-36.tgz' + name: '@astrojs/starlight' + version: 0.9.1 + peerDependencies: + astro: ^3.0.0 + dependencies: + '@astrojs/mdx': 1.0.2(astro@3.0.12) + '@astrojs/sitemap': 3.0.0 + '@pagefind/default-ui': 1.0.0-beta.2 + '@types/mdast': 3.0.12 + astro: 3.0.12(@types/node@20.5.9) + bcp-47: 2.1.0 + execa: 7.2.0 + hast-util-select: 5.0.5 + hastscript: 7.2.0 + pagefind: 1.0.0-beta.2 + rehype: 12.0.1 + remark-directive: 2.0.1 + unified: 10.1.2 + unist-util-remove: 3.1.1 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false diff --git a/doc/public/.nojekyll b/doc/public/.nojekyll new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/doc/public/CNAME b/doc/public/CNAME new file mode 100644 index 000000000000..58ebddeb013d --- /dev/null +++ b/doc/public/CNAME @@ -0,0 +1 @@ +docs.cataclysmbn.org diff --git a/doc/public/favicon.svg b/doc/public/favicon.svg new file mode 100644 index 000000000000..b8721b7c5fdd --- /dev/null +++ b/doc/public/favicon.svg @@ -0,0 +1,44 @@ + + + + diff --git a/doc/remark.ts b/doc/remark.ts new file mode 100644 index 000000000000..81d1031268e3 --- /dev/null +++ b/doc/remark.ts @@ -0,0 +1,29 @@ +import { join } from "node:path" + +import type { Root } from "mdast" +import { visit } from "unist-util-visit" + +/** Check if a string starts with one of `http://` or `https://`. */ +export const isAbsolute = (link: string) => /^https?:\/\//.test(link) + +// starts with ./ or ../ +const relativePath = new RegExp(`^\\.\\.?/`) + +const isRelative = (url: string) => !isAbsolute(url) && relativePath.test(url) + +const relativeUrl = (url: string) => join("..", url) + +const suffix = new RegExp(`\\.(md|mdx)$`) +const suffixAnchor = new RegExp(`\\.(md|mdx)#`) + +const removeSuffix = (url: string) => + url + .replace(suffix, "") + .replace(suffixAnchor, "#") + +export const fixRelativeLinks = () => (tree: Root) => + visit(tree, "link", (node) => { + if (!isRelative(node.url)) return + + node.url = relativeUrl(removeSuffix(node.url)).toLowerCase() + }) diff --git a/doc/src/assets/icon-round.svg b/doc/src/assets/icon-round.svg new file mode 100644 index 000000000000..b8721b7c5fdd --- /dev/null +++ b/doc/src/assets/icon-round.svg @@ -0,0 +1,44 @@ + + + + diff --git a/doc/src/assets/icon.svg b/doc/src/assets/icon.svg new file mode 100644 index 000000000000..8eb037bc15a2 --- /dev/null +++ b/doc/src/assets/icon.svg @@ -0,0 +1,56 @@ + + + + diff --git a/doc/src/components/.prettierrc.yml b/doc/src/components/.prettierrc.yml new file mode 100644 index 000000000000..52513a6ebf1f --- /dev/null +++ b/doc/src/components/.prettierrc.yml @@ -0,0 +1,6 @@ +semi: false +arrowParens: always +singleQuote: false +jsxSingleQuote: false +printWidth: 100 +trailingComma: all diff --git a/doc/src/components/Video.astro b/doc/src/components/Video.astro new file mode 100644 index 000000000000..f3d0b3ad9236 --- /dev/null +++ b/doc/src/components/Video.astro @@ -0,0 +1,11 @@ +--- +type Props = { + src: string +} + +const src = Astro.props.src +--- + + diff --git a/doc/src/content/config.ts b/doc/src/content/config.ts new file mode 100644 index 000000000000..9b431bc80029 --- /dev/null +++ b/doc/src/content/config.ts @@ -0,0 +1,7 @@ +import { defineCollection } from "astro:content" +import { docsSchema, i18nSchema } from "@astrojs/starlight/schema" + +export const collections = { + docs: defineCollection({ schema: docsSchema() }), + // i18n: defineCollection({ type: "data", schema: i18nSchema() }), +} diff --git a/doc/CHANGELOG_GUIDELINES.md b/doc/src/content/docs/en/contribute/changelog_guidelines.md similarity index 88% rename from doc/CHANGELOG_GUIDELINES.md rename to doc/src/content/docs/en/contribute/changelog_guidelines.md index 153791c55438..732db059db9b 100644 --- a/doc/CHANGELOG_GUIDELINES.md +++ b/doc/src/content/docs/en/contribute/changelog_guidelines.md @@ -1,7 +1,9 @@ -# Changelog Guidelines +--- +title: Changelog Guidelines +--- - categories used by `Pull Request Summary` in the - [PR Template](../.github/pull_request_template.md). + [PR Template](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/.github/pull_request_template.md). - these are only guidelines, not rules. choose the best category for your PR freely. ## Features diff --git a/doc/CONTRIBUTING.md b/doc/src/content/docs/en/contribute/contributing.md similarity index 79% rename from doc/CONTRIBUTING.md rename to doc/src/content/docs/en/contribute/contributing.md index 5cb202d96e08..0e1784f02a7d 100644 --- a/doc/CONTRIBUTING.md +++ b/doc/src/content/docs/en/contribute/contributing.md @@ -1,54 +1,48 @@ -# Contribute - -[![en][icon-en]][en] [![ko][icon-ko]][ko] - -[en]: ./CONTRIBUTING.md -[icon-en]: https://img.shields.io/badge/lang-en-red?style=flat-square -[ko]: ./CONTRIBUTING.ko.md -[icon-ko]: https://img.shields.io/badge/lang-ko-orange?style=flat-square - -- [Contribute](#contribute) - - [Guidelines](#guidelines) - - [Code Style](#code-style) - - [C++](#c) - - [JSON](#json) - - [Markdown](#markdown) - - [Translations](#translations) - - [Documentation](#documentation) - - [Doxygen Comments](#doxygen-comments) - - [Guidelines for adding documentation](#guidelines-for-adding-documentation) - - [Building the documentation for viewing it locally](#building-the-documentation-for-viewing-it-locally) - - [Example Workflow](#example-workflow) - - [Setup your environment](#setup-your-environment) - - [Update your `upload` branch](#update-your-upload-branch) - - [Make your changes](#make-your-changes) - - [Pull Request Notes](#pull-request-notes) - - [All PRs should have a `"Summary"` line](#all-prs-should-have-a-summary-line) - - [Closing issues using keywords](#closing-issues-using-keywords) - - [keyword](#keyword) - - [issue](#issue) - - [closing multiple issues at once](#closing-multiple-issues-at-once) - - [Tooling support](#tooling-support) - - [Advanced Techniques](#advanced-techniques) - - [Using remote tracking branches](#using-remote-tracking-branches) - - [Unit tests](#unit-tests) - - [In-game testing, test environment and the debug menu](#in-game-testing-test-environment-and-the-debug-menu) - - [Frequently Asked Questions](#frequently-asked-questions) - - [Why does `git pull --ff-only` result in an error?](#why-does-git-pull---ff-only-result-in-an-error) - -**Opening new issue?** Please read [ISSUES.md](../ISSUES.md) first. +--- +title: Contributing +--- + +:::tip{title="Opening new issue"} + +Check [how to open a issue](./issues). + +::: + +# Want to help? + +Help is appreciated, especially with: + +- Reporting bugs. Including ones inherited from DDA. +- Identifying problems that aren't bugs. Misleading descriptions, values that are clearly off + compared to similar cases, grammar mistakes, UI wonkiness that has an obvious solution. +- Making useless things useful or putting them on a blacklist. Adding deconstruction recipes for + things that should have them but don't, replacing completely redundant items with their generic + versions (say, "tiny marked bottle" with just "tiny bottle") in spawn lists. +- Tileset work. I'm occasionally adding new objects, like the new electric grid elements, and they + could use new tiles. +- Balance analysis. Those should be rather in depth or "obviously correct". Obviously correct would + be things like: "weapon x has strictly better stats than y, but y requires rarer components and + has otherwise identical requirements". +- Identifying performance bottlenecks with a profiler. +- Code quality help. + +## How-to Contributing to Cataclysm: Bright Nights is easy: 1. Fork the repository here on GitHub. -1. Make your changes. -1. Send us a pull request. +2. Make your changes. +3. Send us a pull request. -> Cataclysm: Bright Nights is released under the Creative Commons Attribution ShareAlike 3.0 -> license. The code and content of the game is free to use, modify, and redistribute for any purpose -> whatsoever. See http://creativecommons.org/licenses/by-sa/3.0/ for details. This means any -> contribution you make to the project will also be covered by the same license, and this license is -> irrevocable. +:::note{title="License"} + +Cataclysm: Bright Nights is released under the Creative Commons Attribution ShareAlike 3.0 license. +The code and content of the game is free to use, modify, and redistribute for any purpose +whatsoever. See http://creativecommons.org/licenses/by-sa/3.0/ for details. This means any +contribution you make to the project will also be covered by the same license, and this license is +irrevocable. + +::: ## Guidelines @@ -65,13 +59,13 @@ There are a couple of guidelines we suggest sticking to: ### C++ -Code style is enforced across the codebase by `astyle`. See [CODE_STYLE](../doc/CODE_STYLE.md) for -details. +Code style is enforced across the codebase by `astyle`. See +[CODE_STYLE](../dev/explanation/code_style.md) for details. ### JSON JSON files are formatted using custom formatter available in `tools/format`. Visit -[JSON Style Guide](../doc/JSON_STYLE.md) for details. +[JSON Style Guide](../mod/json/explanation/json_style.md) for details. ### Markdown @@ -95,21 +89,20 @@ The translation of Cataclysm: BN is done using Transifex. Look at the [translation project](https://app.transifex.com/bn-team/cataclysm-bright-nights/) for an up-to-date list of supported languages. -See [TRANSLATING](../doc/TRANSLATING.md) for more information: +For more information: -- [For translators](../doc/TRANSLATING.md#translators) -- [For developers](../doc/TRANSLATING.md#developers) -- [For maintainers](../doc/TRANSLATING.md#maintainers) +- [For translators](../i18n/tutorial/transifex) +- [For developers](../i18n/reference/translation) +- [For maintainers](../i18n/guides/maintain) ## Documentation -

- - -

+ ### Doxygen Comments @@ -118,18 +111,20 @@ contributors. New doxygen comments for existing classes are a welcomed contribut Use the following template for commenting classes: -```c++ +```cpp /** * Brief description * * Lengthy description with many words. (optional) */ class foo { + +} ``` Use the following template for commenting functions: -```c++ +```cpp /** * Brief description * @@ -142,7 +137,7 @@ int foo(int param1); Use the following template for commenting member variables: -```c++ +```cpp /** Brief description **/ int foo; ``` @@ -254,8 +249,8 @@ to explain the problem your PR is solving in full detail. ### All PRs should have a `"Summary"` line -Summary is a one-line description of your change that will be extracted and added to the project -changelog at +Summary is a one-line description of your change that will be extracted and added to the +[project changelog](../game/changelog.md) The format is: `SUMMARY: Category "description"` @@ -264,16 +259,14 @@ Performance, Infrastructure, Build, I18N. Example: `SUMMARY: Content "Adds new mutation category 'Mouse'"` -See the -[Changelog Guidelines](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/doc/CHANGELOG_GUIDELINES.md) -for explanations of the categories. +See the [Changelog Guidelines](./changelog_guidelines.md) for explanations of the categories. ### Closing issues using keywords One more thing: when marking your PR as closing, fixing, or resolving issues, please include this somewhere in the description: -``` +```md - {keyword} #{issue} ``` @@ -296,16 +289,16 @@ slightly faster. ### closing multiple issues at once -``` +```md - {keyword} #{issue}, {keyword} #{issue} ``` -See for more. +See https://help.github.com/articles/closing-issues-using-keywords for more. ## Tooling support Various tools are available to help you keep your contributions conforming to the appropriate style. -See [DEVELOPER_TOOLING](../doc/DEVELOPER_TOOLING.md) for more details. +See [DEVELOPER_TOOLING](../dev/reference/tooling) for more details. ## Advanced Techniques @@ -446,4 +439,4 @@ $ git pull --ff-only upstream upload $ git checkout new_branch ``` -For more frequently asked questions, see the [developer FAQ](../doc/DEVELOPER_FAQ.md). +For more frequently asked questions, see the [developer FAQ](../dev/reference/FAQ). diff --git a/doc/src/content/docs/en/contribute/docs.md b/doc/src/content/docs/en/contribute/docs.md new file mode 100644 index 000000000000..26c1de75a3fa --- /dev/null +++ b/doc/src/content/docs/en/contribute/docs.md @@ -0,0 +1,158 @@ +--- +title: Updating documentation +--- + +To update the documentation site, you need to: + +- [learn markdown in y minutes](https://learnxinyminutes.com/docs/markdown/) +- [create a github account](https://github.com/join) as the source code for docs site is hosted on + github. + +## Browser + +### Update existing docs + + + +this is the most straightforward way to update the documentation site. + +![edit page][edit-button] + +1. Click the `Edit page` button on the bottom of the page. + +[edit-button]: https://github.com/scarf005/Cataclysm-BN/assets/54838975/b31d27d7-f2e5-434b-9541-8bdab85e491e + +![github web editor](https://github.com/scarf005/Cataclysm-BN/assets/54838975/eba2738d-5e65-4262-bb3c-354ea75d430a) + +2. You will be redirected to the github page of the documentation site. You can edit and preview + your changes here. + +:::note + +- `.md` in `CONTRIBUTING.md` stands for markdown files +- `.mdx` in `docs.mdx` stands for [MarkDown eXtended](https://mdxjs.com) + - it's a superset of markdown with javascript and [jsx component][jsx] support + - they are a bit more complicated but allows to use interactive components + +[jsx]: https://www.typescriptlang.org/docs/handbook/jsx.html + +::: + +![propose changes window](https://github.com/scarf005/Cataclysm-BN/assets/54838975/d4a06795-1680-4706-a84c-072346bff109) + +3. Click the `Commit changes...` button on the top right corner to + [commit your changes](https://github.com/git-guides/git-commit). Make sure to + +- Write a short and descriptive `Commit message` +- Check the `Create a new branch for this commit and start a pull request` checkbox. + +![comparing changes page](https://github.com/scarf005/Cataclysm-BN/assets/54838975/3551797e-847b-45fe-8869-8b0b15bfb948) + +4. You will be redirected to the `Comparing changes` page. Click the `Create pull request` button to + [create a pull request](./contributing.md#pull-request-notes). + +![open a pull request page](https://github.com/scarf005/Cataclysm-BN/assets/54838975/2a987c19-b165-43c2-a5a2-639f22202926) + +5. Fill in the `Open a pull request` page and click the `Create pull request` button to + [open a PR](./contributing.md#pull-request-notes). + +### Creating a new page + + + +This one is a bit more involved, but similar to the previous one. + +![image](https://github.com/scarf005/Cataclysm-BN/assets/54838975/978568f4-3d76-4d22-bc49-ccc539ea7911) + +1. Go to the directory you want to create a new post. Click the `Edit link` button then immediately + navigate to directory you'd like to edit (in this case, `contributing`). + +![Create new file](https://github.com/scarf005/Cataclysm-BN/assets/54838975/209a5dae-a0ec-410c-a523-462b8860aaac) + +2. Click the `Add file` > `Create new file` button on the top right corner. Name your file + `.md` then add the [frontmatter](https://jekyllrb.com/docs/front-matter/) like: + +```md +--- +title: +--- +``` + +currently only `title` is required. + +3. After editing, follow the same steps as [Update existing docs](#update-existing-docs) to create a + pull request. + +## Local development + +:::note + +This section assumes you have some knowledge of [git](https://git-scm.com), +[node](https://nodejs.org/en) and +[javascript](https://developer.mozilla.org/en-US/docs/Web/JavaScript). Of course, you can learn them +as you go. + +::: + +To run the documentation site locally, you need to: + +- install [node](https://nodejs.org/en) for dev server +- (optional) [pnpm](https://pnpm.io) as faster and more space efficient alternative to node's stock + npm +- (optional) [deno](https://deno.com) to format and generate automated documentation + +### Setup dev server + + + +```sh +(Cataclysm-BN) $ cd doc +(Cataclysm-BN/doc) $ pnpm install # 'pnpm i' for short +(Cataclysm-BN/doc) $ pnpm dev +``` + +Or, if you're not using pnpm: + +```sh +(Cataclysm-BN) $ cd doc +(Cataclysm-BN/doc) $ npm install # 'npm i' for short +(Cataclysm-BN/doc) $ npm run dev +``` + +You will be able to access the documentation site at `http://localhost:4321`. + +## Live preview + + + +The dev server will automatically reload when you make changes to the documentation. + +### Automated docs generation + +Lua and CLI docs are generated automatically from the source code. To generate them, go to project +root and run: + +```sh +(Cataclysm-BN) $ deno task docs +``` + +## License + +- By contributing to markdown files (including, but not limited to `.md` and `.mdx` files), you + agree to license your contributions under + [CC-BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/), the same license as the game. + +- By contributing to source code of documentation page (including, but not limited to `.ts` and + `.astro` files), you agree to license your contributions under + [AGPL 3.0](https://www.gnu.org/licenses/agpl-3.0.en.html). diff --git a/doc/img/contributing-doxy1.png b/doc/src/content/docs/en/contribute/img/contributing-doxy1.png similarity index 100% rename from doc/img/contributing-doxy1.png rename to doc/src/content/docs/en/contribute/img/contributing-doxy1.png diff --git a/doc/img/contributing-doxy2.png b/doc/src/content/docs/en/contribute/img/contributing-doxy2.png similarity index 100% rename from doc/img/contributing-doxy2.png rename to doc/src/content/docs/en/contribute/img/contributing-doxy2.png diff --git a/doc/img/readme-bug1.png b/doc/src/content/docs/en/contribute/img/readme-bug1.png similarity index 100% rename from doc/img/readme-bug1.png rename to doc/src/content/docs/en/contribute/img/readme-bug1.png diff --git a/doc/img/readme-bug2.png b/doc/src/content/docs/en/contribute/img/readme-bug2.png similarity index 100% rename from doc/img/readme-bug2.png rename to doc/src/content/docs/en/contribute/img/readme-bug2.png diff --git a/doc/img/readme-bug3.png b/doc/src/content/docs/en/contribute/img/readme-bug3.png similarity index 100% rename from doc/img/readme-bug3.png rename to doc/src/content/docs/en/contribute/img/readme-bug3.png diff --git a/doc/img/readme-bug4.png b/doc/src/content/docs/en/contribute/img/readme-bug4.png similarity index 100% rename from doc/img/readme-bug4.png rename to doc/src/content/docs/en/contribute/img/readme-bug4.png diff --git a/doc/img/readme-title.png b/doc/src/content/docs/en/contribute/img/readme-title.png similarity index 100% rename from doc/img/readme-title.png rename to doc/src/content/docs/en/contribute/img/readme-title.png diff --git a/ISSUES.md b/doc/src/content/docs/en/contribute/issues.md similarity index 91% rename from ISSUES.md rename to doc/src/content/docs/en/contribute/issues.md index 5fa8ba6ce18f..382bf556214a 100644 --- a/ISSUES.md +++ b/doc/src/content/docs/en/contribute/issues.md @@ -1,6 +1,16 @@ -# Issues +--- +title: Opening Issues +sidebar: + badge: + text: Outdated + variant: caution +--- -## How to create new issues properly +:::caution + +This document is from DDA and does not necessarily up-to-date with BN guidelines. + +::: GitHub issues are used for everything from bug reporting to suggesting long-term ideas. You can make everything run much smoother by following some simple rules. @@ -57,8 +67,8 @@ Remember to take part in the discussion of your suggestions. ### Questions You should direct your questions to the forum or ask on IRC. You should also read the included -documentation and additional text files, e.g. [COMPILING.md](doc/COMPILING/COMPILING.md) if you have -problems building. +documentation and additional text files, e.g. [compiling](../dev/guides/building/cmake.md) if you +have problems building. ## Bounties diff --git a/doc/ACCESSIBILITY.md b/doc/src/content/docs/en/dev/explanation/accessibility.md similarity index 96% rename from doc/ACCESSIBILITY.md rename to doc/src/content/docs/en/dev/explanation/accessibility.md index a3d75e415445..d64fb6b36617 100644 --- a/doc/ACCESSIBILITY.md +++ b/doc/src/content/docs/en/dev/explanation/accessibility.md @@ -1,4 +1,6 @@ -### Compatibility with screen readers +--- +title: Compatibility with screen readers +--- There are people who uses screen readers to play Cataclysm DDA. In order for screen readers to announce the most important information in a UI, the terminal cursor has to be placed at the correct diff --git a/doc/src/content/docs/en/dev/explanation/best_practices.md b/doc/src/content/docs/en/dev/explanation/best_practices.md new file mode 100644 index 000000000000..e630122b1ce6 --- /dev/null +++ b/doc/src/content/docs/en/dev/explanation/best_practices.md @@ -0,0 +1,62 @@ +--- +title: best practices +--- + +List of conventions used in the project, plus just plain good practices. Not rules per se, most of +the codebase doesn't meet those standards. + +# Naming + +Good names: + +- Are not abbreviated if it could make meaning less obvious - `count`, not `cnt` +- Are obvious from context - `direction::left` is clear, `int rotate` requires reading the + documentation +- Obey same conventions as nearby names - `max_stored_kcal` and `stored_kcal`, not + `max_stored_calories` but `stored_kcal` or `caloried_stored` + +`snake_case` is preferred for consistency with most of the project's code. + +# Classes + +- Don't add methods where a regular function in a namespace would work - + `crafting::consume_tools(tool_list,Character &)`, not `Character.consume_tools(tool_list)` +- Don't add both getters and setters if all they do is read/write a field - those are just disguised + fields + - Getters without (public) setters are OK +- Use `private` where possible, `public` when not, `protected` only when there's a clear reason for + it + +# Types + +- Avoid pointers, instead use references, `std::optional` or even a function overload where possible +- Avoid using `std::pair` and `std::tuple` in headers, instead create a named struct +- Avoid using `int` or `std::string` where an `enum class` would work + +# File organization + +Try to avoid including headers from other headers. This negatively impacts compilation times (both +clean and partial builds), especially when the header in question is already big and widely used +(such as `character.h`, `avatar.h`, `map.h`, `game.h`, `item.h`, `npc.h`, etc.), and frequently +pollutes source files with definitions they have no need to know. + +Some tips here: + +- Compiler doesn't always need to know the whole definition of a class, a declaration may be enough. + Say, if in `character.h` the `vehicle` class is only ever used for a function argument of type + `vehicle &` - references are always of the same size regardless of what type they refer to, so + compiler only needs to know there exists a type named `vehicle`, not its internal details. Adding + `class vehicle;` declaration in `character.h` is enough in this case. +- It's possible to use `pointer-to-implementation` idiom for class members to remove the need for + the definition, see `src/pimpl.h` for implementation and explanation. There are many usage + examples in the codebase (mainly `game.h`), but the overall idea is to replace class member with a + pointer, and only require definition when accessing the member through pointer. This incurs a tiny + performance overhead, but it's unnoticeable in most cases. +- If you're adding some functionality to a frequently included header, and that functionality is + supposed to be used only in a few source files, consider creating a separate header instead. This + way, your code won't make it into dozens or hundreds of compilation units which don't ever use it, + and the compiler wouldn't spend time to build it all these dozens or hundreds of unneeded times. +- Including system and std headers is OK, most of them are precompiled anyway. +- Including common "utility" headers (`optional.h`, `calendar.h`, `coordinates.h`, etc.) is OK, + those are already extensively used in many headers and source files, so not including them makes + too little impact to warrant the inconvenience. diff --git a/doc/src/content/docs/en/dev/explanation/code_style.md b/doc/src/content/docs/en/dev/explanation/code_style.md new file mode 100644 index 000000000000..c48d2a42aa76 --- /dev/null +++ b/doc/src/content/docs/en/dev/explanation/code_style.md @@ -0,0 +1,75 @@ +--- +title: C++ Code Style Guide +--- + +All of the C++ code in the project is styled, you should run any changes you make through astyle +before pushing a pull request. + +We are using astyle version 3.0.1. Version 3.1 should also work, though there are a few cases where +they disagree and require annotation. + +Blocks of code can be passed through astyle to ensure that their formatting is correct: + +```sh +astyle --style=1tbs --attach-inlines --indent=spaces=4 --align-pointer=name --max-code-length=100 --break-after-logical --indent-classes --indent-preprocessor --indent-switches --indent-col1-comments --min-conditional-indent=0 --pad-oper --unpad-paren --pad-paren-in --add-brackets --convert-tabs +``` + +These options are mirrored in `.astylerc`, `doc/CODE_STYLE.txt` and +`msvc-full-features/AStyleExtension-Cataclysm-BN.cfg` + +For example, from `vi`, set marks a and b around the block, then: + +```sh +:'a,'b ! astyle --style=1tbs --attach-inlines --indent=spaces=4 --align-pointer=name --max-code-length=100 --break-after-logical --indent-classes --indent-preprocessor --indent-switches --indent-col1-comments --min-conditional-indent=0 --pad-oper --unpad-paren --pad-paren-in --add-brackets --convert-tabs +``` + +See [DEVELOPER_TOOLING.md](../reference/tooling) for other environments. + +## Code Example + +Here's an example that illustrates the most common points of style: + +```cpp +int foo( int arg1, int *arg2 ) +{ + if( arg1 < 5 ) { + switch( *arg2 ) { + case 0: + return arg1 + 5; + break; + case 1: + return arg1 + 7; + break; + default: + return 0; + break; + } + } else if( arg1 > 17 ) { + int i = 0; + while( i < arg1 ) { + printf( _( "Really long message that's pointless except for the number %d and for its " + "length as it's illustrative of how to break strings properly.\n" ), i ); + } + } + return 0; +} +``` + +## Code Guidelines + +These are less generic guidelines and more pain points we've stumbled across over time. + +- Prefer `int`. + - `long` in particular is problematic since it is _not_ a larger type than int on some platforms + we support. + - Using integral value larger than 32 bits should be avoided. Use `int64_t` if it's really + necessary. + - `uint` is also a problem, it has poor behavior when overflowing and should be avoided for + general purpose programming. + - If you need binary data, `unsigned int` or `unsigned char` are fine, but you should probably + use a `std::bitset` instead. + - `float` is to be avoided, but has valid uses. +- Auto Almost Nothing. Auto has two uses, others should be avoided. + - Aliasing for extremely long iterator or functional declarations. + - Generic code support (but decltype is better). +- Avoid using declaration for standard namespaces. diff --git a/doc/src/content/docs/en/dev/explanation/design_document.md b/doc/src/content/docs/en/dev/explanation/design_document.md new file mode 100644 index 000000000000..bace376e113a --- /dev/null +++ b/doc/src/content/docs/en/dev/explanation/design_document.md @@ -0,0 +1,100 @@ +--- +title: Design document +--- + +See [Game Balance](../../mod/json/explanation/game_balance.md) and +[Lore](../../game/lore/factions.md) for more detailed discussion coresponding to particular elements +of the CDDA design document. This document covers the core philosphy of CBN. + +One of the primary priorities of Cataclysm Bright Nights is fun. + +Gameplay is more important than realism. + +Realism isn't inherently wrong. But it often comes at the expense of the new player experience. So +the fundamentals of Game Design are a priority for Cataclysm Bright Nights. + +Depth is preferable to complexity. But complexity is valuable as long as it isn't overwhelming. See +porting principles 3 and 5. Complexity generally becomes overwhelming when there are too many things +to track at the same time to be able to tell what is important. So then you have to put in more work +than you want to, to understand and filter the information down to what matters. + +Generally a cap should be set for how many things are displayed or being dealt with simultaneously. + +Complexity can be managed: + +- By having the most important info visible at a glance. +- Making the most important menus more apparent and accessible. + +## General rules + +There are six principles applied for content in general: + +1. Things that are useless should be either made useful or removed. + +2. Weird/wonky mechanics should be either reworked or removed. If there is value in retaining them, + they should be clearly communicated to the player through UI. + +3. Each mechanic/item/monster/etc. should fill its own niche or have its own purpose, e.g. there + shouldn't be many different effects that penalize the character in the same way, or a dozen of + guns that differ only in name and +1 to damage value. If such variety is desired, it should be + relegated to mods. + +4. The gameplay should be less about pressing buttons and spending time in submenus and more about + interacting with the surrounding world and progressing (achieving results). + +5. Different play styles should be balanced against each other, with their own upsides and + downsides, so that you can actually choose a different play style and have it not suck just + because "realistically, firearms are better than everything else", but actually be playable and + have a different feel to it. + +6. Rewards should be proportional to amount of effort spent on achieving them (e.g. weapon with + harder craft recipe, or one that requires rarer components, or rarer ammo, should deal more + damage). + +### Reasoning + +1. useless things only serve to clutter interfaces and item lists. increasing complexity for little + value. Often strategically removing things can add more value than an addition. +2. weirdness is a sign that things are unintuitive. Somethings benefit from not being obvious. But + things that are too far from people's expectations break the suspension of disbelief and require + people to remember more disconnected elements. +3. This is sort of an expansion of 1. Adding things that have a distinct purpose for existing adds + more interactions. Things that have some flexibility are particularly valuable. But the purpose + makes new items add more depth than an item which is a slight variant. slight variants. +4. Sorting through complexity in menus isn't fun. menus are only fun when there are meaningful + choices or tradeoffs being made there. (I.E. what to equip, what to carry, what to loot first, + etc.) +5. and 6. are kind of common sense applications of prioritizing gameplay. + +### Removals and re-adding + +Presence or absence of content is often a contentious issue. In cases where it is not obvious: + +- Content should not be kept on the basis of "it can be made good". If it isn't good now, it isn't + good. It can be re-added later, when it becomes good. +- Content should not be re-added on the basis of "it was present before". Re-added content should be + treated the same way new content is. +- Content should not be "spared" from removal by giving it forced updates that still don't make it + good enough. It should be treated like new content is. +- This doesn't cover arguments regarding content being thematic, liked etc., content can still be + given extra "points" based on those. + +In short, don't ask "why remove it?", ask "why should it be present in the game?". + +## Depth + +Depth occurs primarily from interactions between mechanics and different elements of the game. For +example, a common scenario is: + +enemies spot you close, what do you do? The general options are: run away quickly.(Where to?) move +to a good spot and fight them. kite them at location. + +But the exact details change the preferable answer. those factors bring depth into that decision and +interesting gameplay. As well as playing into resource management elements that are classic fun +elements of roguelikes. + +Some factors here are: damage you deal vs. enemy resilience and numbers (How long to kill? Can I +kill?) How much cost do you take from a fight? How far/fast can I run vs. them (Speed + stamina) +terrain nearby.(terrain speed slowdowns. damage terrain, chokepoints, etc.) other clusters of +enemies. How much benefit is there to a fight? (zombie drops + nearby loot locations that are now +safe) diff --git a/doc/POINTS_COORDINATES.md b/doc/src/content/docs/en/dev/explanation/points_coordinates.md similarity index 96% rename from doc/POINTS_COORDINATES.md rename to doc/src/content/docs/en/dev/explanation/points_coordinates.md index eb3fa00444a0..90776d19ac14 100644 --- a/doc/POINTS_COORDINATES.md +++ b/doc/src/content/docs/en/dev/explanation/points_coordinates.md @@ -1,4 +1,6 @@ -# Points, tripoints, and coordinate systems +--- +title: Points, tripoints, and coordinate systems +--- ## Axes @@ -22,7 +24,7 @@ Two origins for map square coordinates are common: relative to a fixed origin. - **Local** coordinates, which are relative to the corner of the current "reality bubble", or `map` roughly centered on the avatar. In local map square coordinates, `x` and `y` values will both fall - in the range [0,`MAPSIZE_X`). + in the range `[0, MAPSIZE_X)`. The next scale is **submap** (sm) coordinates. One submap is 12x12 (`SEEX`x`SEEY`) map squares. Submaps are the scale at which chunks of the map are loaded or saved as they enter or leave the @@ -73,8 +75,8 @@ coordinates do. The z coordinate is relative to the vehicle origin. ## Point types To work with these coordinate systems we have a variety of types. These are defined in -[`coordinates.h`](../src/coordinates.h). For example, we have `point_abs_ms` for absolute map-square -coordinates. The three parts of the type name are _dimension_ `_` _origin_ `_` _scale_. +`coordinates.h`. For example, we have `point_abs_ms` for absolute map-square coordinates. The three +parts of the type name are _dimension_ `_` _origin_ `_` _scale_. - **dimension** is either `point` for two-dimensional or `tripoint` for three-dimensional. - **origin** specifies what the value is relative to, and can be: @@ -111,7 +113,7 @@ New code should prefer to use the types which include their coordinate system wh To change the scale of a point without changing its origin, use `project_to`. For example: -```c++ +```cpp point_abs_ms pos_ms = get_avatar()->global_square_location().xy(); point_abs_omt pos_omt = project_to( pos_ms ); assert( pos_omt == get_avatar()->global_omt_location().xy() ); @@ -127,7 +129,7 @@ relative to that coarser point. It returns a helper struct intended to be used w result. For example, suppose you want to know which overmap the avatar is in, and which overmap terrain they are in within that overmap. -```c++ +```cpp point_abs_omt abs_pos = get_avatar()->global_omt_location().xy(); point_abs_om overmap; point_om_omt omt_within_overmap; @@ -141,7 +143,7 @@ z-coordinate in both parts of the result, so you must choose exactly one to be a example above, z-coodinates do not have much meaning at the overmap scale, so you probably want the z-coordinate in `omt_within_overmap`. That can be done as follows: -```c++ +```cpp tripoint_abs_omt abs_pos = get_avatar()->global_omt_location(); point_abs_om overmap; tripoint_om_omt omt_within_overmap; @@ -153,7 +155,7 @@ operation from `project_remain`. Given two points where the origin of the second of the first, you can combine them into a single value. As you might expect from the above discussion, one of these two can be a `tripoint`, but not both. -```c++ +```cpp tripoint_abs_omt abs_pos = get_avatar()->global_omt_location(); point_abs_om overmap; tripoint_om_omt omt_within_overmap; diff --git a/doc/USER_INTERFACE.md b/doc/src/content/docs/en/dev/explanation/user_interface.md similarity index 94% rename from doc/USER_INTERFACE.md rename to doc/src/content/docs/en/dev/explanation/user_interface.md index 7d58e9904f57..b4248f64f08c 100644 --- a/doc/USER_INTERFACE.md +++ b/doc/src/content/docs/en/dev/explanation/user_interface.md @@ -1,4 +1,6 @@ -# User Interface +--- +title: User Interface +--- Cataclysm: Bright Nights uses ncurses, or in the case of the tiles build, an ncurses port, for user interface. Window management is achieved by `ui_adaptor`, which requires a resizing callback and a diff --git a/doc/COMPILING/COMPILING-CMAKE.md b/doc/src/content/docs/en/dev/guides/building/cmake.md similarity index 82% rename from doc/COMPILING/COMPILING-CMAKE.md rename to doc/src/content/docs/en/dev/guides/building/cmake.md index cb6c9e26d08a..393808f0cde0 100644 --- a/doc/COMPILING/COMPILING-CMAKE.md +++ b/doc/src/content/docs/en/dev/guides/building/cmake.md @@ -1,14 +1,16 @@ -# Disclaimer +--- +title: CMake +--- -**WARNING**: CMake build is **NOT** official and should be used for _dev purposes ONLY_. +:::caution -For official way to build CataclysmBN See: +CMake build is unofficial. -- [COMPILING.md](COMPILING.md) +::: -# Contents +For official way to build CataclysmBN see [Compiler Support](../../reference/compiler_support.md). -# Prerequisites +## Prerequisites You'll need to have these libraries and their development headers installed in order to build CataclysmBN: @@ -34,16 +36,16 @@ CataclysmBN: In order to compile localization files, you'll also need `gettext` package. -# Build Environment +## Build Environment You can obtain the source code tarball for the latest version from [git](https://github.com/cataclysmbnteam/Cataclysm-BN). -## UNIX Environment +### UNIX Environment Obtain packages specified above with your system package manager. -## Windows Environment (MSYS2) +### Windows Environment (MSYS2) 1. Follow steps from here: https://msys2.github.io/ 2. Install CataclysmBN build deps: @@ -58,10 +60,11 @@ pacman -S mingw-w64-i686-toolchain msys/git \ This should get your environment set up to build console and tiles version of windows. -**NOTE**: This is only for 32bit builds. 64bit requires the x86_64 instead of the i686 packages -listed above: +:::caution -``` +This is only for 32bit builds. 64bit requires the x86_64 instead of the i686 packages listed above: + +```sh pacman -S mingw-w64-x86_64-toolchain msys/git \ mingw-w64-x86_64-cmake \ mingw-w64-x86_64-SDL2_{image,mixer,ttf} \ @@ -69,11 +72,16 @@ pacman -S mingw-w64-x86_64-toolchain msys/git \ gettext ``` -**NOTE**: If you're trying to test with Jetbrains CLion, point to the cmake version in the -msys32/mingw32 path instead of using the built in. This will let cmake detect the installed -packages. +::: + +:::note + +If you're trying to test with Jetbrains CLion, point to the cmake version in the `msys32/mingw32` +path instead of using the built in. This will let cmake detect the installed packages. + +::: -# CMake Build +### CMake Build CMake has separate configuration and build steps. Configuration is done using CMake itself, and the actual build is done using either `make` (for Makefiles generator) or build-system agnostic @@ -83,14 +91,18 @@ There are two ways to build CataclysmBN with CMake: inside the source tree or ou Out-of-source builds have the advantage that you can have multiple builds with different options from one source directory. -**WARNING**: Inside the source tree build is **NOT** supported. +:::danger + +Inside the source tree build is **NOT** supported. + +::: To build CataclysmBN out of source: -``` +```sh $ mkdir build && cd build - $ cmake .. -DCMAKE_BUILD_TYPE=Release - $ make +$ cmake .. -DCMAKE_BUILD_TYPE=Release +$ make ``` The above example creates a build directory inside the source directory, but that's not required - @@ -98,25 +110,25 @@ you can just as easily create it in a completely different location. To install CataclysmBN after building (as root using su or sudo if necessary): -``` +```sh # make install ``` To change build options, you can either pass the options on the command line: -``` +```sh $ cmake .. -DOPTION_NAME=option_value ``` Or use either the `ccmake` or `cmake-gui` front-ends, which display all options and their cached values on a console and graphical UI, respectively. -``` +```sh $ ccmake .. - $ cmake-gui .. +$ cmake-gui .. ``` -## CMake Build for MSYS2 (MinGW) +## build for MSYS2 (MinGW) **NOTE**: For development purposes it is preferred to use `MinGW Win64 Shell` or `MinGW Win32 Shell` instead of `MSYS2 Shell`. In other case, you will need to set `PATH` variable manually. @@ -128,12 +140,12 @@ hackery. Example: -``` +```sh $ cd - $ mkdir build - $ cd build - $ cmake .. -G "MSYS Makefiles" - $ make # or $ cmake --build . +$ mkdir build +$ cd build +$ cmake .. -G "MSYS Makefiles" +$ make # or $ cmake --build . ``` The resulting binary will be placed inside the source code directory. @@ -187,7 +199,7 @@ Currently known depends (Maybe outdated use ldd.exe to correct it for Your syste - `smpeg2.dll` - `libvorbisfile-3.dll` -## CMake Build for Visual Studio / MSBuild +## build for Visual Studio / MSBuild CMake can generate `.sln` and `.vcxproj` files used either by Visual Studio itself or by MSBuild command line compiler (if you don't want a full fledged IDE) and have more "native" binaries than @@ -198,19 +210,19 @@ backtrace). Get the tools: -- CMake from the official site - https://cmake.org/download/. -- Microsoft compiler - https://visualstudio.microsoft.com/downloads/?q=build+tools , choose "Build +- CMake from the official site - . +- Microsoft compiler - , choose "Build Tools for Visual Studio 2017". When installing chose "Visual C++ Build Tools" options. - alternatively, you can get download and install the complete Visual Studio, but that's not required. Get the required libraries: -- `SDL2` - https://www.libsdl.org/download-2.0.php (you need the "(Visual C++ 32/64-bit)" version. - Same below) -- `SDL2_ttf` - https://www.libsdl.org/projects/SDL_ttf/ -- `SDL2_image` - https://www.libsdl.org/projects/SDL_image/ -- `SDL2_mixer` (optional, for sound support) - https://www.libsdl.org/projects/SDL_mixer/ +- [SDL2](https://github.com/libsdl-org/SDL/releases/tag/release-2.28.3) (you need the "(Visual C++ + 32/64-bit)" version. Same below) +- [SDL2_ttf](https://github.com/libsdl-org/SDL_ttf) +- [SDL2_image](https://github.com/libsdl-org/SDL_image) +- [SDL2_mixer](https://github.com/libsdl-org/SDL_mixer) (optional, for sound support) - Unsupported (and unused in the following instructions) optional libs: - `ncurses` - ??? @@ -219,28 +231,28 @@ Unpack the archives with the libraries. Open windows command line (or powershell), set the environment variables to point to the libs above as follows (adjusting the paths as appropriate): -``` -> set SDL2DIR=C:\path\to\SDL2-devel-2.0.9-VC -> set SDL2TTFDIR=C:\path\to\SDL2_ttf-devel-2.0.15-VC -> set SDL2IMAGEDIR=C:\path\to\SDL2_image-devel-2.0.4-VC -> set SDL2MIXERDIR=C:\path\to\SDL2_mixer-devel-2.0.4-VC +```sh +$ set SDL2DIR=C:\path\to\SDL2-devel-2.0.9-VC +$ set SDL2TTFDIR=C:\path\to\SDL2_ttf-devel-2.0.15-VC +$ set SDL2IMAGEDIR=C:\path\to\SDL2_image-devel-2.0.4-VC +$ set SDL2MIXERDIR=C:\path\to\SDL2_mixer-devel-2.0.4-VC ``` (for powershell the syntax is `$env:SDL2DIR="C:\path\to\SDL2-devel-2.0.9-VC"`). Make a build directory and run cmake configuration step -``` -> cd -> mkdir build -> cd build -> cmake .. -DTILES=ON -DLANGUAGES=none -DBACKTRACE=OFF -DSOUND=ON +```sh +$ cd +$ mkdir build +$ cd build +$ cmake .. -DTILES=ON -DLANGUAGES=none -DBACKTRACE=OFF -DSOUND=ON ``` Build! ``` -> cmake --build . -j 2 -- /p:Configuration=Release +$ cmake --build . -j 2 -- /p:Configuration=Release ``` The `-j 2` flag controls build parallelism - you can omit it if you wish. The diff --git a/doc/COMPILING/COMPILING-CYGWIN.md b/doc/src/content/docs/en/dev/guides/building/cygwin.md similarity index 89% rename from doc/COMPILING/COMPILING-CYGWIN.md rename to doc/src/content/docs/en/dev/guides/building/cygwin.md index c2540409c77f..c782f7228774 100644 --- a/doc/COMPILING/COMPILING-CYGWIN.md +++ b/doc/src/content/docs/en/dev/guides/building/cygwin.md @@ -1,10 +1,17 @@ -# Compilation guide for 64 bit Windows (using Cygwin) +--- +title: Cygwin +--- -This guide contains instructions for compiling Cataclysm-BN on Windows under Cygwin. **PLEASE -NOTE:** These instructions _are not intended_ to produce a redistributable copy of CBN. Please -download the official builds from the website or -[cross-compile from Linux](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/master/doc/COMPILING/COMPILING.md#cross-compile-to-windows-from-linux) -if that is your intention. +This guide contains instructions for compiling Cataclysm-BN on Windows under Cygwin. + +:::note + +These instructions _are not intended_ to produce a redistributable copy of CBN. Please download the +official builds from the website or +[cross-compile from Linux](./makefile.md#cross-compile-to-windows-from-linux) if that is your +intention. + +::: These instructions were written using 64-bit Windows 7 and the 64-bit version of Cygwin; the steps should be the same for other versions of Windows. diff --git a/doc/COMPILING/COMPILING.md b/doc/src/content/docs/en/dev/guides/building/makefile.md similarity index 67% rename from doc/COMPILING/COMPILING.md rename to doc/src/content/docs/en/dev/guides/building/makefile.md index 9a73208bf9e3..8ac016c83734 100644 --- a/doc/COMPILING/COMPILING.md +++ b/doc/src/content/docs/en/dev/guides/building/makefile.md @@ -1,57 +1,10 @@ -- [General Linux Guide](#general-linux-guide) - - [Compiler](#compiler) - - [Tools](#tools) - - [Dependencies](#dependencies) - - [Make flags](#make-flags) - - [Compiling localization files](#compiling-localization-files) -- [Debian](#debian) - - [Linux (native) ncurses builds](#linux-native-ncurses-builds) - - [Building](#building) - - [Linux (native) SDL builds](#linux-native-sdl-builds) - - [Building](#building-1) - - [Cross-compiling to linux 32-bit from linux 64-bit](#cross-compiling-to-linux-32-bit-from-linux-64-bit) - - [Building](#building-2) - - [Cross-compile to Windows from Linux](#cross-compile-to-windows-from-linux) - - [Installing MXE from binary distribution](#installing-mxe-from-binary-distribution) - - [Installing MXE from source](#installing-mxe-from-source) - - [Building (SDL)](#building-sdl) - - [Cross-compile to Mac OS X from Linux](#cross-compile-to-mac-os-x-from-linux) - - [Dependencies](#dependencies-1) - - [Setup](#setup) - - [Building (SDL)](#building-sdl-1) - - [Building (ncurses)](#building-ncurses) - - [Cross-compile to Android from Linux](#cross-compile-to-android-from-linux) - - [Dependencies](#dependencies-2) - - [Setup](#setup-1) - - [Android device setup](#android-device-setup) - - [Building](#building-3) - - [Additional notes](#additional-notes) - - [Linux Troubleshooting](#linux-troubleshooting) -- [Mac OS X](#mac-os-x) - - [Simple build using Homebrew](#simple-build-using-homebrew) - - [Advanced info for Developers](#advanced-info-for-developers) - - [SDL](#sdl) - - [ncurses](#ncurses) - - [gcc](#gcc) - - [Compiling](#compiling) - - [Make options](#make-options) - - [Make examples](#make-examples) - - [Running](#running) - - [Test suite](#test-suite) - - [dmg distribution](#dmg-distribution) - - [Mac OS X Troubleshooting](#mac-os-x-troubleshooting) - - [ISSUE: Colors don't show up correctly](#issue-colors-dont-show-up-correctly) -- [Windows](#windows) - - [Building with MSYS2](#building-with-msys2) - - [Building with CYGWIN](#building-with-cygwin) - - [Building with Clang and MinGW64](#building-with-clang-and-mingw64) -- [BSDs](#bsds) - - [Building on FreeBSD/amd64 10.1 with the system compiler](#building-on-freebsdamd64-101-with-the-system-compiler) - - [Building ncurses version on FreeBSD/amd64 9.3 with GCC 4.8.4 from ports](#building-ncurses-version-on-freebsdamd64-93-with-gcc-484-from-ports) - - [Building on OpenBSD/amd64 5.8 with GCC 4.9.2 from ports/packages](#building-on-openbsdamd64-58-with-gcc-492-from-portspackages) - - [Building on NetBSD/amd64 7.0RC1 with the system compiler](#building-on-netbsdamd64-70rc1-with-the-system-compiler) - -# General Linux Guide +--- +title: Makefile +sidebar: + badge: + text: Recommended + variant: success +--- To build Cataclysm from source you will need at least a C++ compiler, some basic developer tools, and necessary build dependencies. The exact package names vary greatly from distro to distro, so @@ -70,16 +23,20 @@ You have three major choices here: GCC, Clang and MXE. (Note that your distro may have separate packages e.g. `gcc` only includes the C compiler and for C++ you'll need to install `g++`.) -Cataclysm is targeting C++14 standard and that means you'll need a compiler that supports it. You -can easily check if your version of `g++` supports C++14 by running: +Cataclysm is targeting C++17 standard and that means you'll need a compiler that supports it. You +can easily check if your version of `g++` supports C++17 by running: - $ g++ --std=c++14 - g++: fatal error: no input files - compilation terminated. +```sh +$ g++ --std=c++17 +g++: fatal error: no input files +compilation terminated. +``` If you get a line like: - g++: error: unrecognized command line option ‘--std=c++14’ +```sh +g++: error: unrecognized command line option ‘--std=c++17’ +``` This means you'll need a newer version of GCC (`g++`). @@ -159,7 +116,9 @@ By default, only English language is available, and it does not require localiza If you want to compile files for specific languages, you should add `LANGUAGES=" [lang_id_2] [...]"` option to make command: - make LANGUAGES="zh_CN zh_TW" +```sh +make LANGUAGES="zh_CN zh_TW" +``` You can get the language ID from the filenames of `*.po` in `lang/po` directory or use `LANGUAGES="all"` to compile all available localizations. @@ -181,13 +140,17 @@ Dependencies: Install: - sudo apt-get install libncurses5-dev libncursesw5-dev build-essential astyle +```sh +sudo apt-get install libncurses5-dev libncursesw5-dev build-essential astyle +``` ### Building Run: - make +```sh +make +``` ## Linux (native) SDL builds @@ -201,7 +164,9 @@ Dependencies: Install: - sudo apt-get install libsdl2-dev libsdl2-ttf-dev libsdl2-image-dev libsdl2-mixer-dev libfreetype6-dev build-essential +```sh +sudo apt-get install libsdl2-dev libsdl2-ttf-dev libsdl2-image-dev libsdl2-mixer-dev libfreetype6-dev build-essential +``` check correct version of SDL2 is installed by running: @@ -217,11 +182,15 @@ using old version of SDL could result in A simple installation could be done by simply running: - make TILES=1 +```sh +make TILES=1 +``` A more comprehensive alternative is: - make -j2 TILES=1 SOUND=1 RELEASE=1 USE_HOME_DIR=1 +```sh +make -j2 TILES=1 SOUND=1 RELEASE=1 USE_HOME_DIR=1 +``` The -j2 flag means it will compile with two parallel processes. It can be omitted or changed to -j4 in a more modern processor. If there is no desire to have sound, those flags can also be omitted. @@ -237,13 +206,17 @@ Dependencies: Install: - sudo apt-get install libc6-dev-i386 lib32stdc++-dev g++-multilib lib32ncursesw5-dev +```sh +sudo apt-get install libc6-dev-i386 lib32stdc++-dev g++-multilib lib32ncursesw5-dev +``` ### Building Run: - make NATIVE=linux32 +```sh +make NATIVE=linux32 +``` ## Cross-compile to Windows from Linux @@ -256,18 +229,22 @@ MXE can be either installed from MXE apt repository (much faster) or compiled fr ### Installing MXE from binary distribution - sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 86B72ED9 - sudo add-apt-repository "deb [arch=amd64] https://pkg.mxe.cc/repos/apt `lsb_release -sc` main" - sudo apt-get update - sudo apt-get install astyle bzip2 git make mxe-{i686,x86-64}-w64-mingw32.static-{sdl2,sdl2-ttf,sdl2-image,sdl2-mixer} +```sh +sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 86B72ED9 +sudo add-apt-repository "deb [arch=amd64] https://pkg.mxe.cc/repos/apt `lsb_release -sc` main" +sudo apt-get update +sudo apt-get install astyle bzip2 git make mxe-{i686,x86-64}-w64-mingw32.static-{sdl2,sdl2-ttf,sdl2-image,sdl2-mixer} +``` If you are not planning on building for both 32-bit and 64-bit, you might want to adjust the last apt-get invocation to install only `i686` or `x86-64` packages. Edit your `~/.profile` as follows: - export PLATFORM_32="/usr/lib/mxe/usr/bin/i686-w64-mingw32.static-" - export PLATFORM_64="/usr/lib/mxe/usr/bin/x86_64-w64-mingw32.static-" +```sh +export PLATFORM_32="/usr/lib/mxe/usr/bin/i686-w64-mingw32.static-" +export PLATFORM_64="/usr/lib/mxe/usr/bin/x86_64-w64-mingw32.static-" +``` This is to ensure that the variables for the `make` command will not get reset after a power cycle. @@ -275,15 +252,19 @@ This is to ensure that the variables for the `make` command will not get reset a Install [MXE requirements](http://mxe.cc/#requirements) and build dependencies: - sudo apt install astyle autoconf automake autopoint bash bison bzip2 cmake flex gettext git g++ gperf intltool libffi-dev libgdk-pixbuf2.0-dev libtool libltdl-dev libssl-dev libxml-parser-perl lzip make mingw-w64 openssl p7zip-full patch perl pkg-config python ruby scons sed unzip wget xz-utils g++-multilib libc6-dev-i386 libtool-bin +```sh +sudo apt install astyle autoconf automake autopoint bash bison bzip2 cmake flex gettext git g++ gperf intltool libffi-dev libgdk-pixbuf2.0-dev libtool libltdl-dev libssl-dev libxml-parser-perl lzip make mingw-w64 openssl p7zip-full patch perl pkg-config python ruby scons sed unzip wget xz-utils g++-multilib libc6-dev-i386 libtool-bin +``` Clone MXE repo and build packages required for CBN: - mkdir -p ~/src - cd ~/src - git clone https://github.com/mxe/mxe.git - cd mxe - make -j$((`nproc`+0)) MXE_TARGETS='x86_64-w64-mingw32.static i686-w64-mingw32.static' sdl2 sdl2_ttf sdl2_image sdl2_mixer +```sh +mkdir -p ~/src +cd ~/src +git clone https://github.com/mxe/mxe.git +cd mxe +make -j$((`nproc`+0)) MXE_TARGETS='x86_64-w64-mingw32.static i686-w64-mingw32.static' sdl2 sdl2_ttf sdl2_image sdl2_mixer +``` Building all these packages from MXE might take a while, even on a fast computer. Be patient; the `-j` flag will take advantage of all your processor cores. @@ -293,8 +274,10 @@ MXE_TARGETS. Edit your `~/.profile` as follows: - export PLATFORM_32="~/src/mxe/usr/bin/i686-w64-mingw32.static-" - export PLATFORM_64="~/src/mxe/usr/bin/x86_64-w64-mingw32.static-" +```sh +export PLATFORM_32="~/src/mxe/usr/bin/i686-w64-mingw32.static-" +export PLATFORM_64="~/src/mxe/usr/bin/x86_64-w64-mingw32.static-" +``` This is to ensure that the variables for the `make` command will not get reset after a power cycle. @@ -302,8 +285,10 @@ This is to ensure that the variables for the `make` command will not get reset a Run one of the following commands based on your targeted environment: - make -j$((`nproc`+0)) CROSS="${PLATFORM_32}" TILES=1 SOUND=1 RELEASE=1 BACKTRACE=0 PCH=0 bindist - make -j$((`nproc`+0)) CROSS="${PLATFORM_64}" TILES=1 SOUND=1 RELEASE=1 BACKTRACE=0 PCH=0 bindist +```sh +make -j$((`nproc`+0)) CROSS="${PLATFORM_32}" TILES=1 SOUND=1 RELEASE=1 BACKTRACE=0 PCH=0 bindist +make -j$((`nproc`+0)) CROSS="${PLATFORM_64}" TILES=1 SOUND=1 RELEASE=1 BACKTRACE=0 PCH=0 bindist +``` ## Cross-compile to Mac OS X from Linux @@ -313,7 +298,7 @@ The procedure is very much similar to cross-compilation to Windows from Linux. T Please note that due to historical difficulties with cross-compilation errors, run-time optimizations are disabled for cross-compilation to Mac OS X targets. (`-O0` is specified as a compilation flag.) See -[Pull Request #26564](https://github.com/CleverRaven/Cataclysm-DDA/pull/26564) for details. +[Pull Request #26564](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/26564) for details. ### Dependencies @@ -327,25 +312,32 @@ Make sure that all dependency tools are in search `PATH` before compiling. ### Setup To set up the compiling environment execute the following commands -`git clone https://github.com/tpoechtrager/osxcross.git` to clone the toolchain `cd osxcross` -`cp ~/MacOSX10.11.sdk.tar.bz2 ./tarballs/` copy prepared MacOSX SDK tarball on place. + +``` +git clone https://github.com/tpoechtrager/osxcross.git #clone the toolchain +cd osxcross +cp ~/MacOSX10.11.sdk.tar.bz2 ./tarballs/ # copy prepared MacOSX SDK tarball on place. +OSX_VERSION_MIN=11 ./build.sh # build everything +``` + [Read more about it](https://github.com/tpoechtrager/osxcross/blob/master/README.md#packaging-the-sdk) -`OSX_VERSION_MIN=10.7 ./build.sh to build everything` Note the targeted minimum supported version of -OSX. +Note the targeted minimum supported version of OSX. Have a prepackaged set of libs and frameworks in place, since compiling with `osxcross` built-in MacPorts is rather difficult and not supported at the moment. Your directory tree should look like: - ~/ - ├── Frameworks - │   ├── SDL2.framework - │   ├── SDL2_image.framework - │   ├── SDL2_mixer.framework - │   └── SDL2_ttf.framework - └── libs - └── ncurses - ├── include - └── lib +``` +~/ +├── Frameworks +│   ├── SDL2.framework +│   ├── SDL2_image.framework +│   ├── SDL2_mixer.framework +│   └── SDL2_ttf.framework +└── libs + └── ncurses + ├── include + └── lib +``` Populated with respective frameworks, dylibs and headers. Tested with lib version libncurses.5.4.dylib for ncurses. These libs were obtained from `homebrew` binary distribution at OS @@ -355,9 +347,11 @@ X 10.11 Frameworks were obtained from SDL official website as described in the n To build full feature tiles and sound enabled version with localizations enabled: - make dmgdist CROSS=x86_64-apple-darwin15- NATIVE=osx USE_HOME_DIR=1 CLANG=1 - RELEASE=1 LANGUAGES=all TILES=1 SOUND=1 FRAMEWORK=1 - OSXCROSS=1 LIBSDIR=../libs FRAMEWORKSDIR=../Frameworks +```sh +make dmgdist CROSS=x86_64-apple-darwin15- NATIVE=osx USE_HOME_DIR=1 CLANG=1 + RELEASE=1 LANGUAGES=all TILES=1 SOUND=1 FRAMEWORK=1 + OSXCROSS=1 LIBSDIR=../libs FRAMEWORKSDIR=../Frameworks +``` Make sure that `x86_64-apple-darwin15-clang++` is in `PATH` environment variable. @@ -365,8 +359,10 @@ Make sure that `x86_64-apple-darwin15-clang++` is in `PATH` environment variable To build full curses version with localizations enabled: - make dmgdist CROSS=x86_64-apple-darwin15- NATIVE=osx USE_HOME_DIR=1 CLANG=1 - RELEASE=1 LANGUAGES=all OSXCROSS=1 LIBSDIR=../libs FRAMEWORKSDIR=../Frameworks +```sh +make dmgdist CROSS=x86_64-apple-darwin15- NATIVE=osx USE_HOME_DIR=1 CLANG=1 + RELEASE=1 LANGUAGES=all OSXCROSS=1 LIBSDIR=../libs FRAMEWORKSDIR=../Frameworks +``` Make sure that `x86_64-apple-darwin15-clang++` is in `PATH` environment variable. @@ -374,9 +370,9 @@ Make sure that `x86_64-apple-darwin15-clang++` is in `PATH` environment variable The Android build uses [Gradle](https://gradle.org/) to compile the java and native C++ code, and is based heavily off SDL's -[Android project template](https://hg.libsdl.org/SDL/file/f1084c419f33/android-project). See the +[Android project template](https://github.com/libsdl-org/SDL/tree/main/android-project). See the official SDL documentation -[README-android.md](https://hg.libsdl.org/SDL/file/f1084c419f33/docs/README-android.md) for further +[README-android.md](https://github.com/libsdl-org/SDL/blob/main/docs/README-android.md) for further information. The Gradle project lives in the repository under `android/`. You can build it via the command line @@ -391,36 +387,45 @@ builds the SDL version with all features enabled, including tiles, sound and loc - SDL2_mixer (tested with 2.0.2) - SDL2_image (tested with 2.0.3) -The Gradle build process automatically installs dependencies from [deps.zip](android/app/deps.zip). +The Gradle build process automatically installs dependencies from +[deps.zip](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/android/app/deps.zip). ### Setup Install Linux dependencies. For a desktop Ubuntu installation: - sudo apt-get install openjdk-8-jdk-headless +```sh +sudo apt-get install openjdk-8-jdk-headless +``` Install Android SDK and NDK: - wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip - unzip sdk-tools-linux-4333796.zip -d ~/android-sdk - rm sdk-tools-linux-4333796.zip - ~/android-sdk/tools/bin/sdkmanager --update - ~/android-sdk/tools/bin/sdkmanager "tools" "platform-tools" "ndk-bundle" - ~/android-sdk/tools/bin/sdkmanager --licenses +```sh +wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip +unzip sdk-tools-linux-4333796.zip -d ~/android-sdk +rm sdk-tools-linux-4333796.zip +~/android-sdk/tools/bin/sdkmanager --update +~/android-sdk/tools/bin/sdkmanager "tools" "platform-tools" "ndk-bundle" +~/android-sdk/tools/bin/sdkmanager --licenses +``` Export Android environment variables (you can add these to the end of `~/.bashrc`): - export ANDROID_SDK_ROOT=~/android-sdk - export ANDROID_HOME=~/android-sdk - export ANDROID_NDK_ROOT=~/android-sdk/ndk-bundle - export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools - export PATH=$PATH:$ANDROID_SDK_ROOT/tools - export PATH=$PATH:$ANDROID_NDK_ROOT +```sh +export ANDROID_SDK_ROOT=~/android-sdk +export ANDROID_HOME=~/android-sdk +export ANDROID_NDK_ROOT=~/android-sdk/ndk-bundle +export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools +export PATH=$PATH:$ANDROID_SDK_ROOT/tools +export PATH=$PATH:$ANDROID_NDK_ROOT +``` You can also use this additional variables if you want to use `ccache` to speed up subsequnt builds: - export USE_CCACHE=1 - export NDK_CCACHE=/usr/local/bin/ccache +```sh +export USE_CCACHE=1 +export NDK_CCACHE=/usr/local/bin/ccache +``` **Note:** Path to `ccache` can be different on your system. @@ -430,8 +435,10 @@ Enable [Developer options on your Android device](https://developer.android.com/studio/debug/dev-options). Connect your device to your PC via USB cable and run: - adb devices - adb connect +```sh +adb devices +adb connect +``` ### Building @@ -441,13 +448,17 @@ documentation provides a good summary of how to To build a debug APK, from the `android/` subfolder of the repository run: - ./gradlew assembleDebug +```sh +./gradlew assembleDebug +``` This creates a debug APK in `./android/app/build/outputs/apk/` ready to be installed on your device. To build a debug APK and immediately deploy to your connected device over adb run: - ./gradlew installDebug +```sh +./gradlew installDebug +``` To build a signed release APK (ie. one that can be installed on a device), [build an unsigned release APK and sign it manually](https://developer.android.com/studio/publish/app-signing#signing-manually). @@ -458,44 +469,6 @@ The app stores data files on the device in `/sdcard/Android/data/com.cleverraven/cataclysmdda/files`. The data is backwards compatible with the desktop version. -# Mac OS X - -To build Cataclysm on Mac you'll need -[Command Line Tools for Xcode](https://developer.apple.com/downloads/) and the -[Homebrew](http://brew.sh) package manager. With Homebrew, you can easily install or build Cataclysm -using the [cataclysm](https://formulae.brew.sh/formula/cataclysm) forumla. - -## Simple build using Homebrew - -Homebrew installation will come with tiles and sound support enabled. - -Once you have Homebrew installed, open Terminal and run one of the following commands. - -For a stable tiles build: - - brew install cataclysm - -For an experimental tiles build built from the current HEAD of -[upload](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/): - - brew install cataclysm --HEAD - -Whichever build you choose, Homebrew will install the appropriate dependencies as needed. The -installation will be in `/usr/local/Cellar/cataclysm` with a symlink named `cataclysm` in -`/usr/local/bin`. - -To launch Cataclysm, just open Terminal and run `cataclysm`. - -To update a stable tiles build simply run: - - brew upgrade cataclysm - -To update an experimental build, you must uninstall Cataclysm then reinstall with `--HEAD`, -triggering a new build from source. - - brew uninstall cataclysm - brew install cataclysm --HEAD - ## Advanced info for Developers For most people, the simple Homebrew installation is enough. For developers, here are some more @@ -509,16 +482,16 @@ from source. The SDL framework files can be downloaded here: -- [**SDL2**](http://www.libsdl.org/download-2.0.php) -- [**SDL2_image**](http://www.libsdl.org/projects/SDL_image/) -- [**SDL2_ttf**](http://www.libsdl.org/projects/SDL_ttf/) +- [SDL2](https://github.com/libsdl-org/SDL/releases/tag/release-2.28.3) +- [SDL2_image](https://github.com/libsdl-org/SDL_image) +- [SDL2_ttf](https://github.com/libsdl-org/SDL_ttf) Copy `SDL2.framework`, `SDL2_image.framework`, and `SDL2_ttf.framework` to `/Library/Frameworks` or `/Users/name/Library/Frameworks`. If you want sound support, you will need an additional SDL framework: -- [**SDL2_mixer**](https://www.libsdl.org/projects/SDL_mixer/) +- [SDL2_mixer](https://github.com/libsdl-org/SDL_mixer) (optional, for sound support) Copy `SDL2_mixer.framework` to `/Library/Frameworks` or `/Users/name/Library/Frameworks`. @@ -526,19 +499,27 @@ Alternatively, SDL shared libraries can be installed using a package manager: For Homebrew: - brew install sdl2 sdl2_image sdl2_ttf +```sh +brew install sdl2 sdl2_image sdl2_ttf +``` with sound: - brew install sdl2_mixer libvorbis libogg +```sh +brew install sdl2_mixer libvorbis libogg +``` For MacPorts: - sudo port install libsdl2 libsdl2_image libsdl2_ttf +```sh +sudo port install libsdl2 libsdl2_image libsdl2_ttf +``` with sound: - sudo port install libsdl2_mixer libvorbis libogg +```sh +sudo port install libsdl2_mixer libvorbis libogg +``` ### ncurses @@ -547,12 +528,16 @@ characters For Homebrew: - brew install ncurses +```sh +brew install ncurses +``` For MacPorts: - sudo port install ncurses - hash -r +```sh +sudo port install ncurses +hash -r +``` ### gcc @@ -562,20 +547,26 @@ for the same Apple LLVM as clang. This doesn't necessarily cause issues, but thi will have clang error messages and essentially produce the same results as if using clang. To compile with the "real" gcc/g++, install it with homebrew: - brew install gcc +```sh +brew install gcc +``` However, homebrew installs gcc as gcc-{version} (where {version} is the version) to avoid conflicts. The simplest way to use the homebrew version at `/usr/local/bin/gcc-{version}` instead of the Apple LLVM version at `/usr/bin/gcc` is to symlink the necessary. - cd /usr/local/bin - ln -s gcc-12 gcc - ln -s g++-12 g++ - ln -s c++-12 c++ +```sh +cd /usr/local/bin +ln -s gcc-12 gcc +ln -s g++-12 g++ +ln -s c++-12 c++ +``` Or, to do this for everything in `/usr/local/bin/` ending with `-12`, - find /usr/local/bin -name "*-12" -exec sh -c 'ln -s "$1" $(echo "$1" | sed "s/..$//")' _ {} \; +```sh +find /usr/local/bin -name "*-12" -exec sh -c 'ln -s "$1" $(echo "$1" | sed "s/..$//")' _ {} \; +``` Also, you need to make sure that `/usr/local/bin` appears before `/usr/bin` in your `$PATH`, or else this will not work. @@ -617,26 +608,36 @@ For more info, see the comments in the `Makefile`. Build a release SDL version using Clang: - make NATIVE=osx RELEASE=1 TILES=1 CLANG=1 +```sh +make NATIVE=osx RELEASE=1 TILES=1 CLANG=1 +``` Build a release SDL version using Clang, link to libraries in the OS X Frameworks folders, build all language files, and package it into `Cataclysm.app`: - make app NATIVE=osx RELEASE=1 TILES=1 FRAMEWORK=1 LANGUAGES=all CLANG=1 +```sh +make app NATIVE=osx RELEASE=1 TILES=1 FRAMEWORK=1 LANGUAGES=all CLANG=1 +``` Build a release curses version with curses supplied by Macports: - make NATIVE=osx RELEASE=1 MACPORTS=1 CLANG=1 +```sh +make NATIVE=osx RELEASE=1 MACPORTS=1 CLANG=1 +``` ### Running For curses builds: - ./cataclysm +```sh +./cataclysm +``` For SDL: - ./cataclysm-tiles +```sh +./cataclysm-tiles +``` For `app` builds, launch Cataclysm.app from Finder. @@ -654,10 +655,12 @@ version of OS X, you can download Python [on their official website](https://www.python.org/downloads/) or install it with homebrew `brew install python`. Once you have Python, you should be able to install `dmgbuild` by running: - # This install pip. It might not be required if it is already installed. - curl --silent --show-error --retry 5 https://bootstrap.pypa.io/get-pip.py | sudo python - # dmgbuild install - sudo pip install dmgbuild pyobjc-framework-Quartz +```sh +# This install pip. It might not be required if it is already installed. +curl --silent --show-error --retry 5 https://bootstrap.pypa.io/get-pip.py | sudo python +# dmgbuild install +sudo pip install dmgbuild pyobjc-framework-Quartz +``` Once `dmgbuild` is installed, you will be able to use the `dmgdist` target like this. The use of `USE_HOME_DIR=1` is important here because it will allow for an easy upgrade of the game while @@ -671,12 +674,12 @@ You should see a `Cataclysm.dmg` file. ### ISSUE: Colors don't show up correctly -Open Terminal's preferences, turn on "Use bright colors for bold text" in "Preferences -> Settings --> Text" +Open Terminal's preferences, turn on `Use bright colors for bold text` in +`Preferences -> Settings -> Text` # Windows -See [COMPILING-VS-VCPKG.md](COMPILING-VS-VCPKG.md) for instructions on how to set up and use a build +See [COMPILING-VS-VCPKG.md](./vs_vcpkg.md) for instructions on how to set up and use a build environment using Visual Studio on windows. This is probably the easiest solution for someone used to working with Visual Studio and similar @@ -684,8 +687,8 @@ IDEs. --> ## Building with MSYS2 -See [COMPILING-MSYS.md](COMPILING-MSYS.md) for instructions on how to set up and use a build -environment using MSYS2 on windows. +See [COMPILING-MSYS.md](./msys.md) for instructions on how to set up and use a build environment +using MSYS2 on windows. MSYS2 strikes a balance between a native Windows application and a UNIX-like environment. There's some command-line tools that our project uses (notably our JSON linter) that are harder to use @@ -693,8 +696,8 @@ without a command-line environment such as what MSYS2 or CYGWIN provide. ## Building with CYGWIN -See [COMPILING-CYGWIN.md](COMPILING-CYGWIN.md) for instructions on how to set up and use a build -environment using CYGWIN on windows. +See [COMPILING-CYGWIN.md](./cygwin.md) for instructions on how to set up and use a build environment +using CYGWIN on windows. CYGWIN attempts to more fully emulate a POSIX environment, to be "more unix" than MSYS2. It is a little less modern in some respects, and lacks the convenience of the MSYS2 package manager. @@ -717,7 +720,7 @@ architectures shouldn't work, in principle. ### Building on FreeBSD/amd64 10.1 with the system compiler -FreeBSD uses clang as the default compiler as of 10.0, and combines it with libc++ to provide C++14 +FreeBSD uses clang as the default compiler as of 10.0, and combines it with libc++ to provide C++17 support out of the box. You will however need gmake (examples for binary packages): `pkg install gmake` @@ -729,7 +732,7 @@ Tiles builds will also require SDL2: Then you should be able to build with something like this (you can of course set CXXFLAGS and LDFLAGS in your .profile or something): -``` +```sh export CXXFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib" gmake # ncurses builds gmake TILES=1 # tiles builds @@ -742,7 +745,7 @@ successfully. For ncurses build add to `Makefile`, before `VERSION`: -```Makefile +```make OTHERS += -D_GLIBCXX_USE_C99 CXX = g++48 CXXFLAGS += -I/usr/local/lib/gcc48/include @@ -784,7 +787,7 @@ Then you should be able to build with something like this (LDFLAGS for ncurses b of by the ncurses configuration script; you can of course set CXXFLAGS/LDFLAGS in your .profile or something): -``` +```sh export CXXFLAGS="-I/usr/pkg/include" gmake # ncurses builds LDFLAGS="-L/usr/pkg/lib" gmake TILES=1 # tiles builds diff --git a/doc/COMPILING/COMPILING-MSYS.md b/doc/src/content/docs/en/dev/guides/building/msys.md similarity index 91% rename from doc/COMPILING/COMPILING-MSYS.md rename to doc/src/content/docs/en/dev/guides/building/msys.md index d40984040c13..56144d638c80 100644 --- a/doc/COMPILING/COMPILING-MSYS.md +++ b/doc/src/content/docs/en/dev/guides/building/msys.md @@ -1,10 +1,17 @@ -# Compilation guide for 64-bit Windows (using MSYS2) +--- +title: MSYS2 +--- + +This guide contains instructions for compiling Cataclysm-BN on 64bit Windows under MSYS2. + +:::warning -This guide contains instructions for compiling Cataclysm-BN on Windows under MSYS2. **PLEASE NOTE:** These instructions _are not intended_ to produce a redistributable copy of CBN. Please download the official builds from the website or -[cross-compile from Linux](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/master/doc/COMPILING/COMPILING.md#cross-compile-to-windows-from-linux) -if that is your intention. +[cross-compile from Linux](./makefile#cross-compile-to-windows-from-linux) if that is your +intention. + +::: These instructions were written using 64-bit Windows 7 and the 64-bit version of MSYS2; the steps should be the same for other versions of Windows. diff --git a/doc/COMPILING/COMPILING-VS-VCPKG.md b/doc/src/content/docs/en/dev/guides/building/vs_vcpkg.md similarity index 97% rename from doc/COMPILING/COMPILING-VS-VCPKG.md rename to doc/src/content/docs/en/dev/guides/building/vs_vcpkg.md index 2b02b8fcd8ba..06b46cd4ac25 100644 --- a/doc/COMPILING/COMPILING-VS-VCPKG.md +++ b/doc/src/content/docs/en/dev/guides/building/vs_vcpkg.md @@ -1,4 +1,6 @@ -# Compilation guide for Windows (using Visual Studio and vcpkg) +--- +title: Visual Studio + vcpkg +--- This guide contains steps required to allow compilation of Cataclysm-BN on Windows using Visual Studio and vcpkg. @@ -118,7 +120,7 @@ If you have enough experience with C++ to know: Then you might want to use `Release` build all the time to speed up dev process, and disable optimizations on a file-by-file basis by adding -```c++ +```cpp #pragma optimize("", off) ``` @@ -139,7 +141,7 @@ We use `Artistic Style` source code formatter to keep the style of our C++ code it's available as pre-built Windows executables, which you could install and run or configure to automatically format the code before commit, a much more convenient option for Visual Studio users is to install a specific extension, see -["Astyle extensions for Visual Studio" in doc/DEVELOPER_TOOLING.md](../DEVELOPER_TOOLING.md#astyle-extensions-for-visual-studio) +["Astyle extensions for Visual Studio" in tooling](../../reference/tooling.md#astyle-extensions-for-visual-studio) for more info. As of October 2022, the code style check is run automatically on each PR on GitHub, so if you forgot diff --git a/doc/src/content/docs/en/dev/guides/failed_to_create_glyph_error.md b/doc/src/content/docs/en/dev/guides/failed_to_create_glyph_error.md new file mode 100644 index 000000000000..c66e1d3793ef --- /dev/null +++ b/doc/src/content/docs/en/dev/guides/failed_to_create_glyph_error.md @@ -0,0 +1,21 @@ +--- +title: Failed to create glyph error +--- + +There were similar issues reported in BN and DDA for MSYS Windows builds and some Mac builds. +https://github.com/CleverRaven/Cataclysm-DDA/issues/50115 + +It's something in newer versions of SDL2/freetype not agreeing with with our default font, and +apparently vcpkg updated both of them 20 and 9 days ago respectively +(https://github.com/microsoft/vcpkg/pull/19509, https://github.com/microsoft/vcpkg/pull/19284). I'm +using month old vcpkg, and there's no glyph issue, so that looks to me like the root of the problem. + +Unfortunately, vcpkg being Microsoft's official C++ library manager does not allow you to install +libraries of some specific version. Thus, you have two options: + +1. Grab an older version of vcpkg, from before the updates. I've installed from this one, it should + work: https://github.com/microsoft/vcpkg/tree/6bc4362fb49e53f1fff7f51e4e27e1946755ecc6 + +2. Open config/fonts.json and remove Terminus.ttf entries. I don't remember why we're not using + unifont by default, but if you're not planning on working on i18n/fonts code, it shouldn't affect + you beyond visually. diff --git a/doc/TESTING.md b/doc/src/content/docs/en/dev/guides/testing.md similarity index 98% rename from doc/TESTING.md rename to doc/src/content/docs/en/dev/guides/testing.md index 9cbdeaf8b93f..51f9303cd333 100644 --- a/doc/TESTING.md +++ b/doc/src/content/docs/en/dev/guides/testing.md @@ -1,11 +1,13 @@ -# Testing Cataclysm +--- +title: Testing Cataclysm +--- When you `make` Cataclysm from source, an executable `tests/cata_test` is built from test cases found in the `tests/` directory. These tests are written in the [Catch2 framework](https://github.com/catchorg/Catch2). Run `tests/cata_test --help` to see the available command-line options, and/or consult the -[Catch2 tutorial](https://github.com/catchorg/Catch2/blob/master/docs/tutorial.md) for a more +[Catch2 tutorial](https://github.com/catchorg/Catch2/blob/devel/docs/tutorial.md) for a more thorough introduction. ## Guidelines diff --git a/doc/src/content/docs/en/dev/guides/working_with_both_bn_and_dda_in_git.md b/doc/src/content/docs/en/dev/guides/working_with_both_bn_and_dda_in_git.md new file mode 100644 index 000000000000..ddfb7296ab09 --- /dev/null +++ b/doc/src/content/docs/en/dev/guides/working_with_both_bn_and_dda_in_git.md @@ -0,0 +1,111 @@ +--- +title: Working with both BN and DDA +--- + +Sometimes you may need to port some changes from DDA. It could be done via adding remote and +cherry-picking. + +# tl;dr version + +``` +git remote add dda https://github.com/CleverRaven/Cataclysm-DDA +git fetch dda +git checkout -b ddamaster dda/master +git checkout ddamaster && git pull +``` + +# Explained version + +## Setting up + +Assuming you have a directory with BN named `Cataclysm-BN`, open a terminal there. + +Add the remote tracking branch for DDA. Let's name the branch `dda` (doesn't need to be `dda`): + +``` +git remote add dda https://github.com/CleverRaven/Cataclysm-DDA +``` + +To download the contents of the new branch, it has to be fetched: + +``` +git fetch dda +``` + +This downloads all the content from the remote tracking branch. It shouldn't take very long, because +it doesn't download the things common to both repos. Once fetched, you can `merge`, `pull`, +`checkout` etc. the branches on the remote, but you have to prepend them with `dda/`, for example +`dda/master`. It's useful to have a local branch pointing to the remote tracking one: + +``` +git checkout -b ddamaster dda/master +``` + +This creates an `ddamaster` branch, which is basically DDA's `master` branch. You can take other +name instead of `ddamaster`. + +## Updating + +The simplest way is: + +``` +git checkout ddamaster +git pull +``` + +This shouldn't result in any conflicts. If it did, you probably committed changes to the upload +branch. In this case you may want to back them up: + +``` +git checkout -b temp-branch-name +``` + +And reset the upload branch to the remote: + +``` +git branch -f ddamaster dda/master +``` + +## Contributing + +``` +# Switch to BN branch +git checkout upload +# Update local content +git pull +# Create new branch for your changes +git checkout -b chainsaw-toothbrush-rebalance +# [do stuff with files] +... +# Commit the changes +git commit -a +# Upload your changes to your fork of Cataclysm (assuming its branch is named origin) +git push -u origin chainsaw-toothbrush-rebalance +# Go to BN's github and make a pull request +``` + +# Porting + +Porting is done with `git cherry-pick`. First, you need to find the hash of the merge commit, or the +first and the last of the commits from the range you want to port. On github, those are on the right +side of commit descriptions in a PR. You can use the full hash or the shortened version. In the +examples, `fafafaf` is the merge commit, while `a0a0a0a` and `b1b1b1b` are the first and last commit +from a range (order is important). Then, from a branch you are porting to, cherry-pick the merge +commit or the range of commits: + +``` +# Merge commit +git cherry-pick fafafaf +# Commit range +git cherry-pick a0a0a0a..b1b1b1b +``` + +Resolve the conflicts (there will be many for non-trivial PRs and you'll have to resolve most of +them manually): + +``` +git mergetool +``` + +The above may require setting up a merge conflict resolving tool (TODO: describe how to do that). +Then commit and push, as usual. diff --git a/doc/src/content/docs/en/dev/reference/cli_options.md b/doc/src/content/docs/en/dev/reference/cli_options.md new file mode 100644 index 000000000000..9af1c12e6839 --- /dev/null +++ b/doc/src/content/docs/en/dev/reference/cli_options.md @@ -0,0 +1,114 @@ +--- +title: CLI Options +editUrl: false +sidebar: + badge: + text: Generated + status: note +--- + +:::note + +This page is auto-generated from `tools/gen_cli_docs.ts` and should not be edited directly. + +::: + +The game executable can not only run your favorite roguelike, but also provides a number of command +line options to help modders and developers. + +--- + +## Command line parameters + +### `--seed ` + +Sets the random number generator's seed value. + +### `--jsonverify` + +Checks the BN json files. + +### `--check-mods [mods…]` + +Checks the json files belonging to BN mods. + +### `--dump-stats [mode = TSV] [opts…]` + +Dumps item stats. + +### `--world ` + +Load world. + +### `--basepath ` + +Base path for all game data subdirectories. + +### `--dont-debugmsg` + +If set, no debug messages will be printed. + +### `--lua-doc` + +If set, will generate Lua docs and exit. + +### `--datadir ` + +Sub directory from which game data is loaded. + +### `--autopickupfile ` + +Name of the autopickup options file within the configdir. + +### `--motdfile ` + +Name of the message of the day file within the motd directory. + +## Map sharing + +### `--shared` + +Activates the map-sharing mode. + +### `--username ` + +Instructs map-sharing code to use this name for your character.. + +### `--addadmin ` + +Instructs map-sharing code to use this name for your character and give you access to the cheat +functions.. + +### `--adddebugger ` + +Informs map-sharing code that you're running inside a debugger. + +### `--competitive` + +Instructs map-sharing code to disable access to the in-game cheat functions. + +### `--worldmenu` + +Enables the world menu in the map-sharing code. + +## User directories + +### `--userdir ` + +Base path for user-overrides to files from the ./data directory and named below. + +### `--savedir ` + +Subdirectory for game saves. + +### `--configdir ` + +Subdirectory for game configuration. + +### `--memorialdir ` + +Subdirectory for memorials. + +### `--optionfile ` + +Name of the options file within the configdir. diff --git a/doc/COMPILING/COMPILER_SUPPORT.md b/doc/src/content/docs/en/dev/reference/compiler_support.md similarity index 83% rename from doc/COMPILING/COMPILER_SUPPORT.md rename to doc/src/content/docs/en/dev/reference/compiler_support.md index 8c9d8a3bf4e8..8676a5d8a1cd 100644 --- a/doc/COMPILING/COMPILER_SUPPORT.md +++ b/doc/src/content/docs/en/dev/reference/compiler_support.md @@ -1,4 +1,6 @@ -# Compilers Supported +--- +title: Compiler Support +--- Our goal with compiler support is to make it as easy as possible for new contributors to get started with development of the game, while also using the newest compilers (and thus language standards) @@ -29,12 +31,12 @@ the tests and for the Windows release binaries. ## MSYS2 -MSYS2 is [a way to build the project](COMPILING-MSYS.md) on Windows. It currently offers gcc at -versions 7 or higher. +MSYS2 is [a way to build the project](../guides/building/msys) on Windows. It currently offers gcc +at versions 7 or higher. MSYS also provides clang. We don't currently support using clang here, but work to that end is welcome. ## Visual Studio -We also support [Visual Studio](COMPILING-VS-VCPKG.md) 2015 Update 3 and above. +We also support [Visual Studio](../guides/building/vs_vcpkg) 2015 Update 3 and above. diff --git a/doc/DEVELOPER_FAQ.md b/doc/src/content/docs/en/dev/reference/faq.md similarity index 99% rename from doc/DEVELOPER_FAQ.md rename to doc/src/content/docs/en/dev/reference/faq.md index cb2d88693077..735e67397197 100644 --- a/doc/DEVELOPER_FAQ.md +++ b/doc/src/content/docs/en/dev/reference/faq.md @@ -1,3 +1,7 @@ +--- +title: Frequently Asked Questions +--- + # Adding stuff ## Adding a monster @@ -37,7 +41,7 @@ In the same file in structure `const oter_t oterlist[num_ter_types]` we should d buildings will be displayed, how much they obscure vision and which extras set they have. For example: -```C++ +```cpp {"mil. surplus", '^', c_white, 5, build_extras, false, false}, {"mil. surplus", '>', c_white, 5, build_extras, false, false}, {"mil. surplus", 'v', c_white, 5, build_extras, false, false}, @@ -57,7 +61,7 @@ These structures are also commented in source code. Add new identifier in enum ` before `NUM_OMSPECS` and then add a record in `const overmap_special overmap_specials[NUM_OMSPECS]` array. For example: -```C++ +```cpp {ot_toxic_dump, 0, 5, 15, -1, mcat_null, 0, 0, 0, 0, &omspec_place::wilderness,0} ``` diff --git a/doc/img/VS_Astyle_Step_1.png b/doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_1.png similarity index 100% rename from doc/img/VS_Astyle_Step_1.png rename to doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_1.png diff --git a/doc/img/VS_Astyle_Step_2.png b/doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_2.png similarity index 100% rename from doc/img/VS_Astyle_Step_2.png rename to doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_2.png diff --git a/doc/img/VS_Astyle_Step_3.png b/doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_3.png similarity index 100% rename from doc/img/VS_Astyle_Step_3.png rename to doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_3.png diff --git a/doc/img/VS_Astyle_Step_4.png b/doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_4.png similarity index 100% rename from doc/img/VS_Astyle_Step_4.png rename to doc/src/content/docs/en/dev/reference/img/VS_Astyle_Step_4.png diff --git a/doc/DEVELOPER_TOOLING.md b/doc/src/content/docs/en/dev/reference/tooling.md similarity index 95% rename from doc/DEVELOPER_TOOLING.md rename to doc/src/content/docs/en/dev/reference/tooling.md index afd3da703686..8b9044a2dc8a 100644 --- a/doc/DEVELOPER_TOOLING.md +++ b/doc/src/content/docs/en/dev/reference/tooling.md @@ -1,3 +1,7 @@ +--- +title: Developer Tooling +--- + ## Code style (astyle) Automatic formatting of the source code is performed by @@ -10,7 +14,7 @@ preferences. If you only have `astyle` installed, use: -```BASH +```sh astyle --options=.astylerc --recursive src/*.cpp,*.h tests/*.cpp,*.h tools/*.cpp,*.h ``` @@ -18,7 +22,7 @@ astyle --options=.astylerc --recursive src/*.cpp,*.h tests/*.cpp,*.h tools/*.cpp If you have both `make` and `astyle` installed, use: -```BASH +```sh make astyle ``` @@ -28,7 +32,7 @@ If you have all the relevant tools installed, you can have git automatically che and json by adding these commands to your git pre-commit hook (typically at `.git/hooks/pre-commit`): -```BASH +```sh git diff --cached --name-only -z HEAD | grep -z 'data/.*\.json' | \ xargs -r -0 -L 1 ./tools/format/json_formatter.[ce]* || exit 1 @@ -42,7 +46,7 @@ There are astyle extensions in the Visual Studio Marketplace, but none of them h #### Visual Studio 2022 -Head over to https://github.com/olanti-p/BN_Astyle and follow instructions in the +Head over to and follow instructions in the [README.md](https://github.com/olanti-p/BN_Astyle/blob/master/README.md). You may compile and install the extension from source, or take advantage of the pre-built version in [releases section](https://github.com/olanti-p/BN_Astyle/releases). @@ -78,28 +82,28 @@ manager and then configure it the same way. 1. Go to `Tools` - `Options` - `AStyle Formatter` - `General`. 2. Import - `https://github.com/CleverRaven/Cataclysm-DDA/blob/master/msvc-full-features/AStyleExtension-Cataclysm-DDA.cfg` + `https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/msvc-full-features/AStyleExtension-Cataclysm-BN.cfg` on `Export/Import` tab using `Import` button: -![image](img/VS_Astyle_Step_1.png) +![image](./img/VS_Astyle_Step_1.png) 3. After import is successful you can see imported rules on `C/C++` tab: -![image](img/VS_Astyle_Step_2.png) +![image](./img/VS_Astyle_Step_2.png) 4. Close `Options` menu, open file to be astyled and use `Format Document (Astyle)` or `Format Selection (Astyle)` commands from `Edit` - `Advanced` menu. -![image](img/VS_Astyle_Step_3.png) +![image](./img/VS_Astyle_Step_3.png) _Note:_ You can also configure keybindings for aforementioned commands in `Tools` - `Options` - `Environment` - `Keybindings` menu: -![image](img/VS_Astyle_Step_4.png) +![image](./img/VS_Astyle_Step_4.png) ## JSON style -See the [JSON style guide](JSON_STYLE.md). +See the [JSON style guide](../../mod/json/explanation/json_style). ## ctags @@ -112,9 +116,11 @@ rule in the `Makefile` to do this for you; just run `make ctags` or `make etags` ## clang-tidy -Cataclysm has a [clang-tidy configuration file](../.clang-tidy) and if you have `clang-tidy` -available you can run it to perform static analysis of the codebase. We test with `clang-tidy` from -LLVM 12.0.0 with CI, so for the most consistent results, you might want to use that version. +Cataclysm has a +[clang-tidy configuration file](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/.clang-tidy) +and if you have `clang-tidy` available you can run it to perform static analysis of the codebase. We +test with `clang-tidy` from LLVM 12.0.0 with CI, so for the most consistent results, you might want +to use that version. To run it, you have a few options. @@ -135,12 +141,12 @@ grep '"file": "' build/compile_commands.json | \ To focus on a subset of files add their names into the `egrep` regex in the middle of the command-line. -### Custom clang-tidy plugin +## Custom clang-tidy plugin We have written our own clang-tidy checks in a custom plugin. Unfortunately, `clang-tidy` as distributed by LLVM doesn't support plugins, so making this work requires some extra steps. -#### Ubuntu Focal +### Ubuntu Focal If you are on Ubuntu Focal then you might be able to get it working the same way our CI does. Add the LLVM 12 Focal source [listed here](https://apt.llvm.org/) to your `sources.list`, install the @@ -182,9 +188,9 @@ Then, assuming `build` is your Cataclysm build directory, you can run the tests lit -v build/tools/clang-tidy-plugin/test ``` -#### Windows +### Windows -##### Build LLVM +#### Build LLVM To build LLVM on Windows, you'll first need to get some tools installed. @@ -242,7 +248,7 @@ mingw32-make -j4 clang-tidy clangTidyMain FileCheck Here `clang-tidy` is only added to trigger the building of several targets that are needed to build our custom clang-tidy executable later. -##### Build clang-tidy with custom checks +#### Build clang-tidy with custom checks After building clang-tidy as a library from the LLVM source, the next step is to build clang-tidy as an executable, with the custom checks from the CDDA source. @@ -267,7 +273,7 @@ Currently, the CDDA source is still building the custom checks as a plugin, whic not supported on Windows, so the following patch needs to be applied before the custom checks can be built as an executable. -```patch +```diff diff --git a/tools/clang-tidy-plugin/CMakeLists.txt b/tools/clang-tidy-plugin/CMakeLists.txt index cf0c237645..540d3e29a5 100644 --- a/tools/clang-tidy-plugin/CMakeLists.txt @@ -402,7 +408,7 @@ that worked). Then run: -``` +```sh iwyu_tool.py -p $CMAKE_BUILD_DIR/compile_commands.json -- -Xiwyu --mapping_file=$PWD/tools/iwyu/cata.imp | fix_includes.py --nosafe_headers --reorder ``` @@ -428,7 +434,7 @@ We have to use IWYU pragmas in some situations. Some of the reasons are: the following command to get a list of headers which are not currently associated to any cpp file (requires GNU sed): -``` +```sh diff <(ls src/*.h | sed 's!.*/!!') <(for i in src/*.cpp; do echo $i; sed -n '/^#include/{p; :loop n; p; /^$/q; b loop}' $i; done | grep 'e "' | grep -o '"[^"]*"' | sort -u | tr -d '"') ``` diff --git a/doc/src/content/docs/en/game/changelog.md b/doc/src/content/docs/en/game/changelog.md new file mode 100644 index 000000000000..80b68933feea --- /dev/null +++ b/doc/src/content/docs/en/game/changelog.md @@ -0,0 +1,253 @@ +--- +title: Changelog +--- + +This is an incomplete list compiled for convenience, see pull requests for all changes. + +Starts with +[revision 10614 (just before pockets)](https://github.com/cataclysmbnteam/Cataclysm-BN/commit/8cea0fce70c87ea93c6fd4e409c68558e24ce42e) +of [CleverRaven/Cataclysm-DDA.](https://github.com/CleverRaven/Cataclysm-DDA) + +## Stable v 0.3 + +### Gameplay + +- New scenario: Play as Feral and befriend with zombies (on certain conditions). +- Added ability to manually connect and disconnect multiple power grids via voltmeter and some + materials. +- Added shields to the game. +- Further improvements to Rule of Cool explosions: + - Chain explosions. + - Items turn into shrapnel. + - Custom animations. + +### Balance + +- Improved mechs. +- Added craftable helicopter rotors. +- Water cannons can now fire acid. +- Buffed water purification methods. +- Yet more tweaks to bows (decreased damage, strength cap is now a soft cap). +- Tweaked power armor spawn locations. + +### New content + +- Added new CBMs. Some CBMs ported from existing mods. +- A lot of locations reworked and improved. +- Expansion to the Old Guard faction. + +### Infrastructure + +- Lab Finale rework. +- Updates to build files. +- Weapon categories for martial arts and gunmods (eases mod integrations). +- Allow NPCs to use all bionic weapons not just the hardcoded list. +- Improve code for NPC method of attack, generally improving their ability to choose weapons and + attacks. Allows them to reload magazines and perform combat reloads with single shot weapons. + +### Bugfixes + +- Multiple bugfixes related to NPC AI weapon selection and ranged attacks. +- Fixes to off-road vehicle behavior. +- Fix to the long-standing issue when not all overmap specials could spawn if there were too many + mods enabled. +- Fixes to monster attacks and movement over z-levels. + +### Ported from later versions of DDA + +- Feral humans (with additional tweaks). +- Additional achievements. + +## Stable v 0.2 + +### Gameplay + +- Rework teleglow, nether attention, stare monattack. +- AI now can target and shoot moving cars. +- Food items now show how temperature affects it rot. +- Graphical overmap now enabled by default. Obsolete Graphical Overmap mod, rename to Larwick's + Overmap. +- Reorganized mod resources. All Bright Nights resources now labeled with unique id. +- Allows pushing vehicles over ramps. +- Melee skill actually impacts attack stamina usage. +- Add the ability to mark items as favorite from the multidrop menu. + +### Balance + +- Finished ammo and armor rebalance. Armour piercing ammunition now more effective agaisnt armored + targets, but armor in certain cases provides somewhat better protection against gunshots. Changes + included reworked power armor stats. +- remove glare protection requirement for forged frames. +- Make bicycle alternators (dynamos) craftable. +- Allow repairing items with forges. +- Allow easier installing/removing of some parts. +- Robots no longer completely immune to lasers. +- Prevents dodge gain exploit. +- Wraith and shadow special attack updates. +- Shadow and cult creature updates from Arcana. +- Adjustments to mi-go locations, atmosphere field. + +### Quality of Life + +- Added ability Submit bug report directly from game. +- Reduce blinking effects speed (300 -> 800ms), and add an option to change it in game. +- Deactivate pet robots in pet menu instead of query. +- While flying, warn when letting go of control or stop driving. + +### Infrastructure + +- Migrate to C++17. +- Implement relic recharge. +- Grid constructions now use workshop category. +- Allow marking construction recipes as favorite, sort recipes by name in construction UI. + +### New Content + +- Added new electric grid appliances. +- Adds grid forge rigs, chemistry sets, and chemlabs. +- Added hauler bot. +- Most of the building contains built in electric grids. +- Add grid flag to more specials, mods in particular. +- Added new helicopter parts group to helipad. +- Add mountable autodoc and autodoc couch. + +### Ported from later versions of DDA + +- Port complete leash and lead system. +- Port over fix for spellcasting monsters and summon spells. +- Updated DinoMod. +- Add in-game progression diary. +- Cathedral overhaul. +- add NPCs to biker_dump. +- Port Barbaran Montante and rebalance. + +### Other + +- Add missing damage sources kills and suicide to kills list. + +## Stable v 0.1 + +### Gameplay + +- Victory condition:
spoilersSomewhere in the rectangular region of the + overmap from (0'0, 0'0) to (0'179, 0'179), there's a central lab (accessible from a tile named + "access shaft" on z = -1) that has a red-colored "L" tile at its bottom z-level. Find the lab, + reach the bottom, then either sacrifice your own life or put in a mininuke.
+- (Currently WIP, but already functional) Electric grid system, without use of vehicles, but able to + connect to them. See + [Electric Grids page](https://github.com/cataclysmbnteam/Cataclysm-BN/wiki/Electric-grids) for + more info. +- Lower height levels (z-levels) drawn. +- Angled vehicles don't develop "holes" in their normally-impenetrable walls. This affects all + relevant game mechanics such as monster and player movement, line of sight calculation, light and + scent propagation, etc. +- Reworked helicopters: + - Every character/profession can use helicopters + - It is possible to build helicopters, if you scavenge the blades from an existing one + - Reduced helicopters fuel consumption to allow flying for ingame hours + - Rotors no longer break from collisions + - Atomic Helicopter exist +- Ranged in general: + - Burst fire reworked: all shots fired at same accuracy, with recoil-dependent penalty to all of + them. Penalty is of same magnitude as dispersion for most guns and can be 0 for lighter ones + - Headshots downgraded to crits with 150% damage (from >200%), grazing shots upgraded to 50% (was + 0%-25%) + - Some shotgun ammunition provides cone-shaped aoe attack +- Bows and crossbows: + - Stats buffed (crossbows much more than bows) + - Crossbows easier to craft + - Removed special cases dependent on target hp +- Buffed drugs roughly back to their pre-nerf stats + - Except meth, this one provides a long term (12h), weak (5 speed, 1 per) buff and prevents + sleepiness + - Morale boosts from drugs last as long as drug effects themselves +- Grabs: + - Grab and pain penalties stack less + - Physically damaging a grabbing enemy will often break the grab (100% chance for hits taking at + least 10% of max hp) + - Grabs don't affect blocking and affect dodging much less + - Grab attacks are faster and followed up by a free regular attack on hit +- AoE attacks (from axes, spears and lajatangs) lose their requirements +- Winded condition removed +- Explosives rebalanced: lower ranges, blast damage rounded to 100%/50%/0%, shrapnel hits exactly + once for damage not dependent on distance + - "Rule Of Cool explosions" debug setting: explosions damage only terrain and creatures in their + line of sight, so hiding behind a corner actually works now +- Explosives, wheels and bullets no longer damage items. Strong enough explosions can still destroy + them, and all 3 will pulp corpses that can revive. +- Fires stack less, makes flamethrowers less damaging to player character +- Mutations: + - Trait costs rebalanced to reflect their actual impact better + - Combat mutations (armor, claws) improved + - Some "free points" traits removed from character generation (heavy sleeper, bad liar etc.) + - Undirected mutations happen in bulk, their number based on time since last mutation. + - Mutations tend towards "somewhat better than at start" point-wise, to compensate for the fact + that most bad mutations are more bad than most good mutations are good + - Mutant toxins redesigned: will cause mutations once accumulated high enough, but cause no + penalties +- CBM installation is now guaranteed, but after that failure effects may still appear. So even + failed operation gives bionic to player in workable condition. CBM uninstallation still can fail + completely. Autodoc can't instantly kill the player due to operation failure - instead of doing + fatal damage player will be infected. Damage to player body during operation failures is now + affected by bionic installation difficulty. +- Turrets return fire against silent attackers, but not against attackers outside range. Also the + code respects turrets' stats and skills better now. +- Surgery trains first aid, scaling with target size and number of possible bionics. +- Food: + - Remove obesity mechanics and most of stomach mechanics + - Starvation death now takes a week from fully fed + - Removed slower hunger/thirst during sleep +- Removed animal waste product mechanics +- Removed tetanus, random cold and flu +- Fungal spores no longer spawn fungaloids, fungal disease doesn't break arms +- Reworked food temerature mechanics. Removed "mushy" mechanics. Rot still affected by temperature. + Note that freezers still work as intended and prevent rot, and fire makes you warm. + +### Quality of life + +- Crafting defaults to in inventory/on the ground, best workbench in radius is used anyway +- Can read items on the floor, in vehicles etc. Reading doesn't automatically pick up books, but + leaves them on the spot. +- Crafting in progress displays time left and crafting modifiers +- Butchery uses tools in crafting radius, warns about problems +- Deployable butchery furniture doesn't require deployment, works in item form +- Unloading no longer moves the item to inventory if it wasn't there before +- Can move items up and down z-levels in AIM (Advanced Inventory Management) +- Target list (during shooting and reach attacks) allows shooting through windows and above vehicles + (from a turret) +- Sight range of at least 1 tile is guaranteed when not blind +- Tile memory does not decay +- Added accurate firearm dispersion/recoil stats that include all the modifiers (from skill, + bionics, encumbrance and so on) + +### New content + +- Medical zombie tree, focused on debuffing +- New automated gun turrets replacing CROWS based ones. Less deadly, but don't drop tons of valuable + rifle ammo. +- Bionic scanner, to detect which corpses are worth cutting up + +### Performance + +- Fires do not produce hot air and smoke, no longer affected by wind +- Option to disable event bus system (in Debug tab) - removes one big cycle hog, but also + achievements and statistics +- Food isn't affected by radiant heat or hot air +- Removed slow fd_clairvoyant check which only benefited Magiclysm, but slowed down everyone +- Cache list of all vehicles on map, since getting it is slow in 3D mode + +### Ported from later versions of DDA + +- Ground vehicle z-level transitions and z+1 bridges. Ramps can be enabled through "Z-levels" world + setting, new bridge generation - through "Elevated bridges" mod. +- Graphical overmap drawn with SDL using sprites. +- Improved autodrive. +- Various under-the-hood improvements, such as refactors and optimizations. +- Hundreds of bugfixes and small changes. + +### Other + +- 3rd party mods translation support +- UnDeadPeople tileset included +- Restored atomic cars +- Restored MBR vests (with some rebalance). ESAPI vest removed diff --git a/doc/src/content/docs/en/game/game_files_and_save_corruption.md b/doc/src/content/docs/en/game/game_files_and_save_corruption.md new file mode 100644 index 000000000000..b6d8eb308897 --- /dev/null +++ b/doc/src/content/docs/en/game/game_files_and_save_corruption.md @@ -0,0 +1,134 @@ +--- +title: Game file and save corruption +--- + +Game files and save corruption falls into following categories: + +1. Caused by your system +2. Caused by your launcher +3. Caused by the game +4. Caused by improper upgrade procedure +5. Caused by character death + +## Corruption caused by your system + +### Common symptoms + +- Nonsensical error messages when trying to load a save (e.g. "expected comma", or "expected array") +- Problematic files, when opened with a decent text editor (Notepad++ for you Windows users), are + partially filled with zero bytes or some other gibberish + ![image](https://user-images.githubusercontent.com/60584843/186019683-36a59d3b-31ce-408c-96ee-42390975171c.png) + +### Common causes and ways to avoid + +1. Insufficient disk space (buy a bigger disk) +2. Faulty disk (buy a new disk) +3. Saving on a USB stick / external hard drive and pulling it out without "Safe Removal" (don't do + this) +4. Blackout (buy a UPS for your computer) +5. Power loss due to hardware failure (call for a PC repair crew) +6. Power loss due to user actions (don't pull the power plug of your PC, don't shut down laptop by + long-pressing power button) +7. Blue screen or a similar unrecoverable OS error (again, call PC repair crew) + +### Fixing corruption + +There's nothing we can do about it, but you can try your OS file backup functionality (or game +launcher backup functionality, if its backups didn't get corrupted as well). + +## Corruption caused by your launcher + +### Common symptoms + +1. All (or some) saves are suddenly gone +2. All (or some) of your personal tweaks in `[game root]/data/` are suddenly undone +3. All (or some) of your mods/soundpacks are suddenly gone +4. All (or some) settings are reset to defaults + +### Common causes and ways to avoid + +1. The launcher is buggy. Bug the author(s)/maintainer(s) to fix it, or find a different launcher - + maybe one that [tries to avoid touching user data](https://github.com/qrrk/Catapult). +2. Your mods/soundpacks/personal tweaks were inside `[game root]/data/` folder. That folder is for + base game stuff only, so don't get surprised if it gets overwritten/erased/corrupted after an + update. Specifically to avoid this situation the game allows placing these files into so-called + "user" folders - on Windows, that would be folders named `[game root]/mods/` and + `[game root]/sound/`. All personal tweaks should go into a dedicated mod placed into same + `[game root]/mods/` folder, and when that's not possible due to limitations of modding system - + kept in some backup form, preferably away from `[game root]/` to avoid launcher treating it as + junk. +3. The launcher may have some quirks. For example, one of the recent updates of a popular launcher + had a big warning on it that some people decided to ignore. Advice here is similar, bug the + author(s)/maintainer(s) to solve these (add migration?) or just be more attentive. + ![image](https://user-images.githubusercontent.com/60584843/186022055-0015f2cc-2549-4721-8a0d-8b7047b3d2b1.png) + +### Fixing corruption + +Not much we can do about this either. Try bugging launcher people for a fix or your OS for the +backups. + +## Corruption caused by the game + +### Common symptoms + +1. Whenever you load a save, something weird but non-game-breaking happens (you die, or lose 10 + pounds, or your NPC companion teleports around) +2. Whenever you load a save, the game screams at your about lost item locations + +### Common causes and ways to avoid + +These are game bugs and should be fixed, not avoided. We can't fix what we don't know about, so bugs +need to be reported - either on GitHub via creating a +[Bug Report](https://github.com/cataclysmbnteam/Cataclysm-BN/issues/new/choose) (you only need a +working email address to make a GitHub account, it's not _that_ hard) or by joining +[our Discord server](https://discord.gg/XW7XhXuZ89) and complaining in `#development` channel - +you'll most likely get a faster response there. If you know how to fix it (or want to take a stab at +it) - help is always appreciated. + +### Fixing corruption + +Saves in these cases can usually be fixed, though exact method varies on a case-by-case basis. + +If the game is showing red-on-black messages that say something about `ACT_XXX lost target item` or +`item_location lost target during save/load cycle`, try making a backup of the save, then opening +your character's save file (usually `[game root]/save/[World Name]/#[gibberish].sav`) with any +decent text editor (Notepad++ for Windows is ok), finding all occurrences of sequences starting with +`ACT_` (e.g. `ACT_DROP`, or `ACT_WASH`) and replacing them with `ACT_NULL`. + +## Corruption caused by improper upgrade procedure + +### Common symptoms + +1. After a manual update the game is showing weird errors noone you ask knows about, or experiences, + even if you're not using any mods. +2. The errors go away after a clean reinstall of the game. + +### Common causes and ways to avoid + +You're most likely updating the game by downloading a fresh version and unpacking it over the +existing installation. **This is not supported and has never been supported.** It is generally a bad +idea to update programs in such way, unless they explicitly state they can handle this and it's +allowed. BN can't handle this. The mods you downloaded and upgraded in same way also most likely +can't handle this. + +### Fixing corruption + +Just do a clean reinstall, or use a launcher. + +## Corruption caused by character death + +### Common symptoms + +Your character dies - it's a tragedy, and you wish you could turn back time to the good old days. +And then you realize you can do exactly that by pressing Alt+F4. But when loading the save next +time, you see your corpse nearby with all items duplicated and your vehicle is nowhere to be seen. + +### Common causes and ways to avoid + +You tried to cheat death, but failed, and ultimately was forgotten among the billions lost in the +cataclysm. + +### Fixing corruption + +You'll have to live with the reminder of your mistakes. Try backing up the save next time. +Technically it's a bug, but it's also an easy way out, so noone actually cares about fixing it. diff --git a/doc/src/content/docs/en/game/lore/beginning.md b/doc/src/content/docs/en/game/lore/beginning.md new file mode 100644 index 000000000000..4020ed43d141 --- /dev/null +++ b/doc/src/content/docs/en/game/lore/beginning.md @@ -0,0 +1,150 @@ +--- +title: How it all started +--- + +:::danger{title="spoiler alert"} + +spoilers below! + +::: + +### Day -3 + +The nation goes to high alert. Reasons are sketchy. Rumours of an imminent attack abound. News media +briefly brings up stories of a few drug fueled maniacs attacking civilians, but they are quickly +buried under speculation on a possible invasion. + +### Day -2 + +Speculation continues. There are rumours of a new street drug turning people into violent, brutal +killers. There are sightings of strange, large, aggressive insects in the woods, but no official +confirmation. + +### Day -1 + +There are suspected reports that the killers may be under the influence of a biological attack +slowly creeping it’s way through the population, turning people into killers. Others dismiss these +rumours as nonsense. The government refuses to comment, saying they are investigating and looking +into things. A portal opens in a remote field in, but the government responds quickly and suppresses +information about the event. + +### Day 0 + +The bombs drop. Many cities in New England are hit with high explosives. The klaxons that are +supposed to warn of an attack never sound, and the strikes appear to be precisely targeted, though +there isn’t much special about the areas they strike at first glance. In reality, several of the +smaller labs that scatter the area providing relays for the primary dimensional manipulation +experiments have experience gateways opening in the immediate area, and their machinery refusing to +shut down. Those inside have quickly been overwhelmed by extradimensional horrors. The strikes are +against labs that have been overrun, or where the resonator equipment is still functioning, and +locations believed to have opened portals. It is hoped the high energy yield of high explosives will +collapse the portals, or at least destroy the equipment that makes it possible for them to open. In +many cases, this works. In others, the strikes make things worse, changing how the portals work +instead. + +From several of these strikes, the portals absorb the energy and create a larger, fluctuating rift +that allows noxious alien chemicals to billow forth in huge plumes. Those in the immediate area have +their skin blister, boil, and slough off, and the chemicals quickly enter the atmosphere. Other +areas have their portals turn into blistering infernos, or areas of extreme cold. It is hypothesized +by scientists in-the-know that disrupting the lab network has caused permanent dimensional weakness +and expanded our susceptibility not only to connections to the subprime plane, but also a number of +neighboring planes. This is all fairly meaningless to the average citizen, who is mostly under the +impression that life has turned into hell-on-earth. + +Additional portals begin appearing around the world, even as the number of new portals in New +England steadily dwindles. Creatures from the surviving portals, those expanded or missed by the +bombs, begin venturing forth and slaughtering those they find. One portal expands violently, causing +an explosion that erupts a cloud of spores into the air before closing permanently. These spores +begin floating on the breeze, and several eventually find a home. + +Finally, the klaxons sound, and a biological attack is announced. There is utter chaos, and many +mixed messages. The military is deployed to try to control the situation, and martial law is +declared. It is hard to ignore now that the dead rise again short afterward, and abominations roam +the streets. Many head to evac shelters and bunkers, others try to lock their doors and stay in +their homes. There is a huge migration of vehicles heading west. + +As day turns to night, the first caustic rain occurs, returning the alien chemicals to earth at +great distances even as they continue to pour from the portal rifts. The deadly rain lasts for +almost 9 hours, killing most of those caught outside while evacuating. + +### Day 1 + +Most of the monsters die off, seemingly only able to operate within a certain distance of the +portals, before the effects of the prime plane begin causing severe degeneration. Unfortunately, the +damage has largely been done. Worse, a few find the new plane perfectly comfortable, and begin to +expand aggressively, while others such as the ooze that causes the zombies adapt to find forms that +will let them expand beyond the range of their connection to another plane. + +Those who are killed by monsters, rain, or any of the other new threats to appear raise as zombies, +and even zombies that are killed with bullets or normal weapons will raise again soon afterwards. + +In an effort to combat the new threats of both large amounts of undead humans and various +otherworldly horrors, the automated security forces are quickly reprogrammed to behave much more +aggressively, killing threats instead of just trying to arrest them if they were supposed to, and +adopting a much wider view of what constitutes a threat. Unfortunately, this backfires - though they +do identify the undead as a threat, and in several cases successfully engage them, the new settings +also lead them to target the human “trespassers” running the security networks, and the networked +security systems identify almost any living human as a hostile threat to be eliminated. The larger +network itself collapses shortly afterwards, leaving no way to adjust the settings back, as each +security unit - police station, military turret, autonomous hunter vehicle - reverts to independent +control operating under the last instructions received + +The nation declares a national disaster, and FEMA camps are setup and a large-scale evacuation +begins, even as reports of portals opening in other locations begin to reach official ears. The +evacuation camps prove to be deathtraps, attracting the attention of deadly creatures and the +security forces who view them as “illegal homeless encampments”. + +### Day 2 + +National support is pulled out of New England, and the area is declared a lost cause as efforts +intensify to control the new appearances of portals throughout the rest of the US. + +Acid rain occurs intermittently. The acid breaks down fairly quickly after it falls to earth, but +several portals remain open that pour the caustic material into the sky. Like a volcano, some +portals remain quiet for a while before letting forth a huge belch of a toxic cloud, while others +release a steady, uncomfortable trickle. + +The first fungaloids are encountered by a small military patrol, and retreat to a nearby farmhouse +after one of the soldiers is killed by something erupting from the ground. They report the presence +of several large fungal growths, almost human height, and a haze that has settled over the area. +Fine powder seems to cover every surface within hours. By the end of the day, the spires will be +significantly larger, and the number of fungaloids surrounding the house grow endlessly in number . +The last reports from the soldiers indicate strange symptoms among the soldiers, and that fungal +growths from the engine are preventing their vehicle from starting. They are not heard from again. + +Triffids, strange plant-like creatures that seem to build upon the existing root networks in local +forests, are seen growing in multiple places, having been dropped by Triffid seed-runners that +escaped through one or more portals. They quickly attune to the new landscape, and many regions of +forest begin slowly converting into triffid groves. The Triffids and Fungals seem to be related +somehow. + +The giant insects begin spread as well, serving as a useful vessel for the goo, but maintaining many +of their primitive impulses. Construction begins on enormous hives, dens, and colonies. + +The Netherum - whether zombies, flaming eyes, kreks or migo - can best be seen as individual +specialized cells in a larger organism, like a human being, sponge or (perhaps the best analogy) a +slime mold. The ooze that infects zombies is akin to a kind of netherum stem cell, and can +eventually take many forms. As with stem cells turning into specialized cells, though, more advanced +netherum creatures like the Migo no longer have the versatility of the basic slime and are locked +into their form. + +Every basic component of Netherum contains the information for every possible Netherum creature, +but, just like with DNA, the information expressed depends on a variety of environmental stimulus - +including the proximity of a sufficient amount of nearby Netherum creatures of different types. This +is not the first time the triffids and the Netherum have encountered each other. + +Initially large nether creatures died quite quickly in our world if they stay far from the energies +of a portal or other subprime access point. But some of them were able to adapt to our environment +to a certain extent and gained the ability to survive far away from portals. Still hostility of +Earth 's environment limits the spread of large nether creatures. So far, no reproduction or young +versions were observed. But no one knows how long this limitation holds. + +On the other hand, the more distributed version of the netherum has quickly found its niche living +within the bodies of large native organisms, improving their odds of success in multiple passive +ways, and taking full control if the organisms life ceases to restart the organism’s basic functions +under the Netherum’s control. With a protective fleshy or carapacian shield between it and the +environment, the Netherum is able to comfortably persist in our world far from the portals. + +There is more than one subprime plane. The Netherum comes from a more distant plane than the +triffids and fungals, and is part of why the triffids and fungals can survive in our reality more +reliably than the Netherum. diff --git a/doc/src/content/docs/en/game/lore/factions.md b/doc/src/content/docs/en/game/lore/factions.md new file mode 100644 index 000000000000..ce6e0691e1c1 --- /dev/null +++ b/doc/src/content/docs/en/game/lore/factions.md @@ -0,0 +1,300 @@ +--- +title: Factions +--- + +:::danger{title="spoiler alert"} + +spoilers below! + +::: + +## America + +### Society + +The future government of America is sensationalist, reckless, and in many ways quite dystopian. +However, the average person’s life is pretty good, aside from the constant threat (or at least +claims of a threat) of military attacks by some foreign power (usually China or Russia) that may or +may not actually be plotting major military actions. The government has encouraged disaster +preparedness among the population, and firearm restrictions are distinctly different than they are +now. While not everyone can purchase and own a firearm, and firearm ownership is very closely +tracked, it is also actively encouraged by the government to fight off any potential invaders, and +higher caliber firearms and explosives are actually available on the civilian market. + +### Evac Shelters + +The evac shelters were built as part of a government program to help improve both the morale of the +populace at large (by convincing them the government was looking out for them) while also increasing +the general sense of fear and danger (by convincing the populace such shelters were needed). They +approved effective at these goals. The shelters were not, however, ever actually stocked - the +funding fell out when the military realized both goals had been effectively accomplished, and no +more money needed to be wasted on them. After all, in the event that the shelters would ever +actually be needed, it is unlikely they would end up very useful - any major military attack was +unlikely to leave many survivors. Standing as empty unstocked, relatively insecure buildings on the +outskirts of the city reminding people of what could happen was the only service they were ever +actually expected to provide. + +## Blob + +### Origin + +The Blob, otherwise known as XE037, is a single-cellular organism formed of exotic matter +undetectable without specialized equipment. Through reckless dimensional experimentation, XEDRA +breached into XE037's homeworld, and exposed our world to the Blob. Evading conventional quarantine +procedures, the Blob has entered the Earth's biosphere, spreading and infecting the world via water. +Infection is characterised by the Blob being taken up by eukaryotic cells, in a similar manner as +the proposed model for mitonchondria. Beings that possess a sense of self, even insects and animals, +are relatively unaffected by the Blob, which mostly manifests in accelerated healing by catalysing +metabolic processes when injured. A large percentage of Blob infected creatures, human or animal, +display increased aggression and clouded judgement, a side effect of the integration of Blob into +the brain disrupting normal brain chemistry. Humans affected in this way are considered "feral", +though a small percentage of creatures are more resistant to these changes than others. + +## Effects of blob infection on living hosts + +In living hosts, the Blob is capable of restructuring the body, from simple things like increased +muscle mass, brain matter, or thickened skin to drastic changes like rapid bone restructuring, and +growth of organs that do not typically exist in the species. Some of these effects appear to be the +Blob reactivating dormant phenotypes (perhaps surprisingly gills are classified under these) or +over/under expressing certain genes, however, many of the more drastic changes seem to use DNA that +has never existed within the species. While similar to their earth counterparts, many of these +structures are subtly different, contributing to the theory that the Blob itself may hold a +repository of extraterrestrial or extradimensional DNA (or some equivalent using their exotic +material as base). Strangely, a subject's sense of self and consciousness appears to be involved in +the transformations, and to access the more advanced mutations a subject's sense of self must be +temporarily altered, this alteration however typically becomes permanent once the "threshold" has +been crossed. This strange limitation of ego has casually reignited philosophical questions of +consciousness amongst the more fringe scientists, who suggest that this could be a sign of the soul. +Animals and insects thus far have never been observed to have the same breadth of mutations, it is +suggested that their inability to reinvent themselves mentally contributes to this (Insert +commentary about how humans are capable of lying to themselves). + +## Effects of blob infection on dead hosts + +On death however the seemingly artificial limitations on mutation are removed. Regeneration is +initiated, with the corpse cannibalizing itself as the Blob takes drastic steps to reanimate the +host. The host however, is no longer in control of their body, with the Blob driving them to feed +and survive. The mutations begin to grow ever more bizarre, the Blob hijacking the cellular makeup +to replace normal cells with their own, repurposing the normal biology of the host toward more +aggressive purposes (acid/spitter zombies, skeletal juggernauts, etc). The Blob in this state also +seems capable of hijacking bionics within the body, utilizing power storage as sources of electrical +shocks, electromagnet implants in industrial workers, or utilizing the martial art subroutines +within Close Quarter Battle CBMs (explaining why bio-operatives seem capable of doing martial arts). +It is theorised that the mutations integrating bionics may not be unique to "zombies", but would +require a human with a distorted sense of self that considers the human and machine parts of their +body to be one and the same. Testing of this was prematurely clipped by the Cataclysm (partially +explaining the Prototype/Broken Cyborgs) + +### Countermeasures + +As the Blob has no higher consciousness and no collective it cannot be fought in the conventional +sense. However, humanity is capable of severely diminishing the threat of the Blob, at least in +regards to reanimation. Research prior to the Cataclysm has revealed that the energy deficit +incurred during reanimation and to some extent their activity after is sustained by nearby portal +activity. A certain threshold of energy must be reached before reanimation is even possible, further +explaining why only corpses of a certain size are able to reanimate. Deep underground in New +England, a central lab exists with the largest working portal on the continent. It's activation was +the tipping point of our dimensional instability, leading to rapid global reanimation of corpses and +accelerated mutation where prior cases had been completely limited to the local area within labs and +near portals. (Explaining how the Cataclysm could've gotten so out of control so quickly.) In the +aftermath, once dimensional fatigue had settled to a more stable state, it now generates the portal +energies needed to sustain much of the zombies throughout the continent. If this can be disabled, +zombie activity would become much reduced, as would their evolution. + +## Nether + +### Origin + +The Nethereum is a transitive plane, sequestered between realities. It is a malleable plane, +constantly in flux as it mirrors the various worlds that it borders. The rules and constants between +each reality vary wildly, and within the Nethereum it continuously swings between them, trying and +failing to find a balance. The creatures within are no different, each is a reflection of some +creature from another reality, distorted, incomplete and uncanny. Most are unintelligent or +animalistic, incomplete snapshots. Despite this, greater, intelligent life does exist within the +Nethereum, their forms stretching across the void with an intelligence that regards us with the same +foreign curiosity as a child. Unfortunately, this child is so incomprehensible to us that any true +contact would only cause madness, as they exist in accordance to concepts that make no logical +sense, and indeed do not exist on our world. Fortunately, our world is as difficult for them to +access as theirs is to ours, and they lack the focus and technology to ever succeed on their own. + +### Nether creatures + +Nether creatures are immune to the Blob's control, so alien and beyond the ken of life are they that +the Blob is unable to find purchase in their bodies. Indeed, their continued existence within our +reality is predicated on the dimensional instability that is currently affecting Earth, and if the +fabric of reality can be somehow stabilized many will simply die where they stand and wither away to +nothing. A good starting point for this would be the giant portal that has formed in the Central +Lab. + +### Subconscious connection + +The Nethereum itself has a strange connection to the subconscious mind of sapient life, and in +dreams and more traumatically, while in the throes of madness, it is possible to gain glimpses of +the Nethereum's chaotic plane. Such insights have inspired books across countless civilizations of +eldritch horrors and creatures that haunt beyond the edge of reality. In the same way, most contact +with the Nethereum outside of portals is mental, even with the fabric of reality degraded as it is. +Sometimes information from beings beyond our realm, helpful or not, seeps in through these cracks, +if one is capable of deciphering it. + +### Pocket dimensions + +Pocket dimensions are constantly forming within the Nethereum, echoes and reflections of worlds far +beyond our ability to percieve. Portal storms are locations where these pocket dimensions bleed into +our own, and if the correct conduit can be created, and enough energy gathered, it could be possible +for humanity to reach into these broken reflections to seek out technologies and sciences developed +by othere realities. Be cautious, such dark reflections may not function as originally intended, and +it will be defended by dark reflections of other things as well... + +## Mycus + +### Origin + +The Mycus were once a species of parasitic brain fungus on their homeworld, taking control of +various animals and using them to spread itself across the planet. Over time, the connection between +brain and fungus became more and more tight knit, until eventually brain and fungus melted into one +another, a symbiosis that subsumed their hosts and infiltrated into their very flesh. Their sapience +was originally formed via weak telepathy between each animal they had infected, and since their +existence they have never known the concept of individualism. There is only the Mycus. + +Spreading across the universe, the Mycus found nothing, barren planets and occasionally more hosts, +but no other minds for them to connect to, to commune. The Mycus turned their gaze beyond their +reality, seeking others beyond their reality. Cautious about the world beyond, they never opened the +physical portals into blob space that would allow the Blob purchase. By luck, their first inhabited +universe was our own, in the midst of the Cataclysm. The Mycus watched as civilization was sundered +by the various Nether creatures and reanimated monstrosities, and mourned the passing of an +intelligence that might have finally been their peer. Yet as they watched, the tiny fleshlings +endured. Single fleshlings joined in communion with others, conclaves formed, yet were a pale shadow +of their former glory, while others were lost, wandering into a lost world. + +The Mycus rejoiced, the intelligence must still remain, fragmented between their myriad of hosts, +for them to be able to continue their function. If the fragments could be gathered, combined, they +might yet survive the possibility of local dimensional collapse, and through this the Mycus would +achieve Communion. They gathered their spores, readied their portals, and sent forth a legion of +spores into the Nethereum, toward humanity. Any of their flesh hosts would not be able to survive +the journey, but the spores would, even if many would be lost in the tumultous expanse all that was +needed was a single main node. The Mycus would grow. + +### Mycus infection + +The goal of the Mycus is at its heart, altruistic, it wants to make humanity whole again. +Unfortunately it has no understanding of individuality, and does not understand that humanity is not +a hive mind like itself but a collection of individual minds working together (or against one +another). It's approach toward individual humans is much like the way one would treat a baby or +frightened animal, it believes we have been fractured so badly that we no longer have the +intelligence to comprehend it and have been reduced to hiding from the many monsters in our new +world. It thus entices individuals and conclaves with fruit and the soothing promise of communion. +It forgives humanity for attacking it and refusing communion because we just don't know any better. + +The Mycus is capable of subverting the blob, but only partially. As the blob is inhibited by a +creature's sense of self, a Mycus infection uses the Mycus' own presence to take control of the +body. This is only temporary, and as a result the Mycus weakens the zombies it infects to dispose of +them more permanently later. + +### Countermeasures + +The player should have several ways of dealing with this. The first is the obvious solution, to burn +the Mycus to the ground, there is no Queen that controls the Mycus in its totality, but the +destruction of groves, towers, and similar terrain will prevent the Mycus from properly regrouping +or replenishing their numbers. Another method is for the player that decides humanity's collective +mind is best given to the Mycus, so that they may bring it back to their world where it will live +with the Mycus forever more, all differences erased. The final solution is that of diplomacy, to +explain to the Mycus what it means to be an individual, and convince it that each person is a +precious, individual mind instead of a receptacle. If this can be achieved, the Mycus may be +persuaded to aid humanity in saving their home. Such aid could come in the form of allied +companions, skills loaded into one's mind, or perhaps, the ability to bring an individual anew into +the world by melding with their body before it is lost to the Blob. + +## Migo + +### Origin + +The Migo are a species of carapace covered humanoids with what appears to be an eusocial caste +system. Each individual is uniquely adapted to it's station, and if a unit is needed for a specific +station a worker drone would be elevated to the appropriate position and properly augmented, though +it would appear that such specialization is permanent. Their society is built on an ironclad sense +of responsibility to the perpetuation of their species. Each Migo has a rudimentary telepathic bond +with nearby Migo, allowing them to exchange thoughts and emotions but not memories, despite this +they lack a true ego and will do anything up to and including self-sacrifice if it serves their +interests as a whole. + +### Migo technology + +Migo technology is highly advanced but bio-mechanically engineered, and cannot be directly used by +non-migo. However, the underlying mechanisms and science can be replicated with the right materials +and knowhow, allowing one with the appropriate knowledge to turn their weapons and technology onto +their makers, whether this is resin production and manipulation or the reconstruction of their +"slaver beams" all their technology is repurposable. Their bodies do not tolerate cold well, and +generally function best in what would be charitably described as a sauna for humanity. + +### Migo society + +In the distant past a group of Migo were stranded in the ice caps due to a failed dimensional jump. +Prior to the Cataclysm the craft's remnants and a few migo stuck in stasis, were recovered by the +group that would eventually become Xedra. The incomplete workings of the dimensional drive they used +filled in gaps into the study of space and dimensional travel, though humanity is still a long way +from the controlled travel that the migo themselves seem capable of now. Unbecknowst to them, +meddling with the craft sent out a distress call, which called the Migo toward humanity. + +When the Migo arrived, they originally were meant to function in secret, gathering information on +humanity to assess their threat level to the Migo and provide countermeasures should they ever +breach into true dimensional travel. It was during this operation that the Cataclysm began. In the +ensuing chaos it became abundantly clear to the Migo that humanity had been compromised by an +extradimensional threat. By performing their own research and a few targeted raids they came to the +conclusion that the Blob had infected the world and by extension, them. + +The current migo contingent has quarantined itself on Earth, and is currently looking to investigate +the blob and how it infects humanity. If possible, the Migo would prefer to have the Blob fully +analyzed, with the ability to purge it from themselves while keeping samples that they might +engineer for the species own benefit in the future. The blob has fully infiltrated the Migo, but +they have managed a rudimentary safeguard that prevents reanimation of their corpses upon death by +blocking out the dimensional energies needed for proper reanimation. As this is adapted to migo +physiology, it's unlikely to be usable for humanity. + +The Migo do not resent humanity for its role in experimenting on it's soldier units, as a society +they are unable to hate due to a lack of ego and thus personal investment in their enemy is +anathema. Despite this, the experimentation and mental instability displayed by remaining humans has +caused them to classify humanity as a threat to the Migo, and actions will be taken to prevent +humanity from threatening their home and their people. + +## Triffids + +> The triffids have a strict hive like hierarchy composed of dozens if not hundreds of organisms. +> Each individual organism was tweaked to a specialized task due evolution process from basic form. +> Despite individual triffid creatures relying on very basic instincts, overall triffid collective +> acts very efficiently and appears intelligent. + +### Origin + +The triffids are a species of humanoid plants, but it is more accurate to consider them an ecosystem +unto themselves. The core of this ecosystem is the Triffid Heart, from it, a forest springs forth +that creates the various triffid warriors, queens and other members of their ranks. Despite +appearances, they are not sapient, in fact, it is difficult to say if the Triffids are even +sentient. The triffid ecosystem functions entirely on instinct, it's only purpose is to consume, +grow, and propagate to another planet to continue the cycle. To this end, it's various guardians +roam about gathering materials to feed the construction of a biological cannon capable of launching +a new heart into space. + +Each stimuli triggers a response from the Triffid heart, causing it to pull blueprints and engineer +instinctive responses into the next batch of guardians. The existence of fungus opponents triggers +fungicidal guardians, while contact with the blob seems to have caused them to gain some kind of +resistance to them. It is unknown how the Triffid could have come to possess such a feature, but if +the speculation that the Triffids are a biological machine created by an alien faction are correct, +then it suggests that this alien faction has had contact with the Blob before. Whether it's downfall +was precipitated by the Blob or not, it suggests that the Triffid's creators were well aware of the +risks the Blob can introduce into biological organisms. + +Some scholars speculate that the Triffid Heart was the final time capsule of a dying race, designed +to seed worlds with information for those advanced enough to learn it. The Triffid Heart is thus of +much interest, it could contain incalculable knowledge, whether in regards to the blob, the nether, +blueprints for weapons or the "magic" that the Triffid Queen wields, or perhaps other biological +catalysts that could be of use to humanity. + +### Fungals + +Fungals actually play a vital role in the triffid’s ecosystem, and are carried in small amounts on +most triffids. It is sometimes used by triffids to prepare an area with rich fungal remains before +the triffids move in. However, when it gets out of hand, the triffid’s respond with variants +specifically tailored to controlling and eliminating the fungus. The fungus also has an inhibitory +effect on the ooze, fighting it for dominance - this is how it can take control of infected +organisms, creating giant fungal bugs and fungal zombies. The fungus is mostly unthinking, but quite +effective at converting both enemies and the landscape into allies. diff --git a/doc/src/content/docs/en/game/lore/notes.md b/doc/src/content/docs/en/game/lore/notes.md new file mode 100644 index 000000000000..345c8fe97dbb --- /dev/null +++ b/doc/src/content/docs/en/game/lore/notes.md @@ -0,0 +1,51 @@ +--- +title: Xedra Notes +--- + +:::danger{title="spoiler alert"} + +spoilers below! + +::: + +### Note #356-92-XE + +Earlier conjecture that revivification occurred only in humans was premature. Thanks to the discover +of the substances ability to revivify large canines, the properties of XE-037 in mammalian organisms +is now far more clear. + +From what we can tell so far, exposure introduces a persistent, low level infection in mammal +subjects, regardless of size or nature. The substance seems to multiply within the body until it +reaches a certain point, and then enters a form of stasis and ceases to grow. It is, as yet, unknown +why this halting process occurs in mammals, but not in insects - further research is needed. The +body does not seem to attempt to combat the invader, and in fact no defenses have been noted - the +body simply ignores the presence of the substance. + +The spread seems to halt at roughly 1% of body mass, though exact numbers are difficult to determine +thanks to the risk of mid-autopsy revivification. + +The reason why earlier reports confined revivification to humans was that the process requires a +critical amount of XE-037 within the body, not as a percent but as pure weight. Around half a pound +seems to be enough to insure a post-mortem takeover. Animals small enough that 1% of body mass falls +below this threshold thus fail to revivify, and the infection shrinks and then dies several hours +after it’s host organism has passed. In larger animals, expiration seems to serve only to raise the +cap on XE-037 within the body - expiration quickly leads to the XE-037 breaking down many of the now +inactive bits of it’s host until it makes up almost 4% of body mass. At some point towards the end +of this process, the host organism revives in the manner we are all, by now, familiar with, +seemingly under the full control of the substance. + +### Note #376-92-XE + +Infected subjects that sustain extreme trauma before death seem to exhibit lower growth level in +internal XE-037, which can be lower than the expected 4%. Revivification of subjects in such cases +is slower. This lead to the conclusion that XE-037 “prefers” less damaged corpses.\ +Additionally, damage beyond a certain threshold, such as the removal of several internal organs, +quartering the corpse, or exposure to high explosive or heat, seems to overwhelm the XE-037 +infection, causing the same dwindling and death behaviour seen in smaller organisms. + +### Note #377-92-XE + +Observations that high-trauma revivification subjects are not noticeably different from low-trauma +subjects have proven to be premature. The 93-XE series of studies has been designated for +consolidating existing data and performing additional research after the labs have been repaired and +personnel replaced. diff --git a/doc/src/content/docs/en/game/lore/timeline.md b/doc/src/content/docs/en/game/lore/timeline.md new file mode 100644 index 000000000000..bc297e12cf61 --- /dev/null +++ b/doc/src/content/docs/en/game/lore/timeline.md @@ -0,0 +1,188 @@ +--- +title: Timeline +--- + +:::danger{title="spoiler alert"} + +spoilers below! + +::: + +## Timeline + +### T-6 Years + +Drones (eyebots) used in police work. + +### T-4 Years + +Personal bionics become commonplace for the wealthy, and for those withhigh-demand government +positions. + +### T-3 Years + +Escalations in China and DPRK lead to a “Cold War,” with both sides highly prioritizing defense +research. + +### T-3 Years + +Transposition along 4th axis discovered by DARPA researchers. + +### T-3 Years + +Robotic police officers enter service in limited areas. + +### T-30 Months + +4th dimensional topology mapped out. It’s found that certain areas are "lower" along the 4th axis, +allowing for relatively low-energy transposition into areas of interest. + +### T-28 Months + +Collection of materials along 4th axis commences. First contamination occurs but is confined to the +two research labs with transposition equipment, and is in amounts so tiny (a few dozen molecules) +that it is not remarked upon. + +### T-25 Months + +Gun control laws greatly relaxed as a result of perceived increase in public safety. + +### T-20 Months + +Robotic police officers are used in 95% of police precincts. + +### T-18 Months + +A new federal agency, the Xenophysical Energy Defense Research Agency (XEDRA), is created to oversee +the construction and operation of 12 new 4th axis research labs, scattered across the midwest. + +Other agency names: + +- HYDRA (HYperdimensional Defense Research Agency) +- ATMAR (Agency for Transitional Mechanics & Activity Research) +- APRA (Abnormal Phenomena Research Agency) + +### T-16 Months + +Plasma weapons developed in response to rising threat in China, DPRK + +### T-15 Months + +Increases in extradimensional research leads to collection of living samples. This notably includes +XE037 (blob). As time continues, larger and larger sub-prime monsters are retrieved. + +### T-15 Months to 5 Months + +XEDRA becomes increasingly internally politicized, with different divisions competing for research +dollars, and oversight staff conflicting in their opinions regarding the direction and goals of +research. + +### T-13 Months + +Short-range teleportation becomes a reality using fixed laboratory equipment. + +### T-12 Months to 6 Months + +XEDRA begins storing sub-prime lifeforms, particularly XE037, and researching their potential as a +possible super-weapon. + +### T-10 Months + +Massive troop movements in China and DPRK provoke deployment by USAF. For the first time in history, +a peacetime draft is instated. + +### T-10 Months + +The successes of XEDRA lead to a greatly increased budgets and the construction of hundres of new +research & production facilities in appropriate areas. + +### T-9 Months + +Civil unrest regarding the drafts is widespread. + +### T-7 Months + +Troops begin deploying with cutting-edge bionics systems. They are, according to intelligence, +outpaced by Chinese developments. + +### T-6 Months + +XEDRA gains increasingly unrestricted powers. Convicts with death sentences are used as subjects. +Later, convicts with life sentences are used as well. + +### T-5 Months + +Zombifying effect of XE037 discovered. + +### T-3 Months to T+0 + +Civil unrest progresses into wide-scale riots. Limited martial law instated in several areas. +Deployment of robotic police is increased to maintain order. + +### T-4 Months to 1 Month + +Corruption in XEDRA runs rampant and the legality of actions is frequently ignored. Due to the +perceived importance of XEDRA, and the extenuating circumstances of public unrest and riots, these +oversteps are mostly ignored. + +### T-30 Days + +DPRK troop movements indicate an imminent attack. Missile launches batter South Korean port cities +and act as a show of force. In response, US troop deployment is vastly increased, resulting in a +much smaller military presence in mainland USA. + +### T-15 Days + +XE037 surge occurs. XE037, a kind of sanguine hive mind, is responding to XEDRA’s probes. The surge +occurs in all teleportation facilities simultaneously. During this event, XE037 contaminates the +ground water and establishes “colonies” (slime pits). It is unknown whether Chinese/DPRK facilities +experience this surge, as it is unknown whether they possess the equipment to perform transposition +experiments. + +### T-15 Days to 5 Days + +The first zombification incidents outside of labs occur. These are sometimes covered up by XEDRA; +but often they aren’t even noticed, and the zombie is dismissed as a violent rioter and re-killed. + +### T-3 Days + +Merging of XE037 and insect life occurs, resulting in rapid transformations. + +### T-3 Days to T+0 + +A series of terrorist attacks, including dirty bombs and biological weapons, is unleashed across the +United States. NPRK & Chinese sleeper cells are expected. + +### T+0 + +Zombie outbreaks become widespread and critical mass is achieved; a zombie population which grows +faster than it can be contained/killed. + +### T+18 Hours + +Panic sets in; deaths are rapid and widespread. + +### T+36 Hours + +50% zombification or death. + +### T+48 Hours + +90% zombification or death. + +### T+56 Hours + +Bombing of large US cities by an unknown aggressor commences. A crippled defense infrastructure is +largely unable to respond. + +### T+60 Hours + +A largely-defeated national guard retreats to fortified bunkers and air strips. + +### T+72 Hours + +99% zombification or death. + +### T+5 Days + +The game begins. Now you're on your own. diff --git a/doc/src/content/docs/en/game/new_player_guide.md b/doc/src/content/docs/en/game/new_player_guide.md new file mode 100644 index 000000000000..01cb4ea41812 --- /dev/null +++ b/doc/src/content/docs/en/game/new_player_guide.md @@ -0,0 +1,91 @@ +--- +title: New player guide +--- + +:::tip + +Should you be confused with keybindings at any time, use `?` to check your keybindings in game, or +use the main menu to display the keybindings menu. + +::: + +## Your first character + +Runs can end abruptly. Starting as a default survivor in the evac shelter will allow you to learn +the game in a fairly stress-free environment. It has solar and a battery so little effort is needed +to install an oven or fridge. You can utilize the woods for your food and water, and train up your +skills before you go into town. A wooden spear or some form of ranged attack are fairly safe ways of +taking out starter zombies. You can be entirely self sufficient via the woods but you are on a race +to keep up with monster evolution. The guns in an average gun store will suffice if you can survive +and get into one. When you run into somewhere you can't access, a pickaxe or jackhammer can destroy +concrete and metal walls and doors, and a hacksaw can cut the bars off windows. Managing stamina is +important in combat. You run out, you will probably die, especially as a new player. + +### fabrication + +You can work your way through fabrication to smithing medieval equipment, as a melee character it +will be important. Finding a library in town will let you find the necessary books to read your way +to this skill level but you'll need the book no matter what for recipes. When zombies are little +threat either via firearm or melee combat, you will want to look into training other skills, finding +a working vehicle, and preparing to loot places of greater danger and reward. + +### finding CBM's or mutagens + +CBM's will require an autodoc (unless the manual installation mod is active), and to successfully +install you need high first aid, computers, and electronics. Manual installation requires mechanics +instead of computers. Some zombies will have CBM's on them, and dissection with a scalpel and high +first aid will yield these. Without saying too much of the mutation system, you will want to loot +labs to pursue this route. Turrets are extremely dangerous and can end a run quickly, but that is +not all you will find. Unless you have a science ID, you'll be hacking or using brute force to get +in. + +## Auto actions + +Auto actions allows you to minimize keystrokes. + +### Auto pickup + +you can set casings and shotgun hulls to auto pickup. It's important to utilize auto pickup properly +such as weight and volume limits and alongside safe mode to avoid picking up in combat. + +### Auto pulping + +Auto pulping lets you do pulping in combat without pressing smash `(s)` after every kill. + +### Auto forage + +Auto forage is great for living off the lands but remember to disable it when traveling, and + +### Auto mining + +Auto mining will let you repetitively move into terrain to mine it. Auto mining is dangerous, you +may accidentally walk into walls you don't want to mine or if you use a pickaxe as a weapon you can +very likely destroy your base unintentionally. + +## The Zone manager + +The Zone manager `(Y)` allows you to set sorting zones to auto-sort your loot, deconstruct terrain +or vehicles automatically, construction blueprints, or farm fish and chop trees. It is a powerful +tool for minimizing keystrokes. + +### Zone activities + +Using `(O)` your character can do zone activities once you have at least one zone. + +### Sorting + +You need at least one unsorted loot zone to begin sorting things on the ground. You can set an +entire house to be an unsorted loot zone and they can overlap. You can use zones on vehicle storage +tiles but they can't be multiple tiles, and even sort into your vehicle. You ONLY sort within +unsorted loot zones, not within your inventory. You however use free inventory space to sort loot, +so keep your bags clear. + +## Tips & common questions + +1. You can use `TAB` while in your inventory for selecting an entire category. I.E. using multidrop + with d to drop all food at once. +2. Rebinding keys can improve your ergonomics significantly, especially if you play with WASD. +3. Use Safe mode. You can ignore monsters and If it bothers you too much then set proximity distance + to something reasonable. Safe mod will save you. +4. If you want to change crafting range, skill training speed, or experimental 3D vision, you can + find it in options under the Debug category. diff --git a/doc/src/content/docs/en/game/updating_the_game.md b/doc/src/content/docs/en/game/updating_the_game.md new file mode 100644 index 000000000000..8062ec0e5ea9 --- /dev/null +++ b/doc/src/content/docs/en/game/updating_the_game.md @@ -0,0 +1,29 @@ +--- +title: Updating the game +--- + +# Do + +0. Get the game from https://github.com/cataclysmbnteam/Cataclysm-BN/releases +1. Unpack the game +2. Copy `save` and `config` from old game directory to the new directory +3. (Optional) Copy the `mods` from the old game dir + +# Don't + +### Unpack the new game over old directory + +Unpacking the game over old directory can cause duplicate JSON entry errors. If you really want to +do it, make sure to delete the old `data` directory before unpacking the new version. + +Sometimes data files are deleted in the core. New version of the game will not have those files, but +unpacking an archive doesn't delete the old files. Old files will still be read and loaded, which +can overwrite new entries. + +### Have custom mods in `data/mods` directory + +Put them directly into `mods` directory, on the same level as `data`. This directory doesn't exist +by default, but the game will read it if it's present. + +This will allow you to copy the mods between game versions, while still allowing the "core mods" to +update properly. diff --git a/doc/MANUAL_OF_STYLE.md b/doc/src/content/docs/en/i18n/explanation/manual_of_style.md similarity index 95% rename from doc/MANUAL_OF_STYLE.md rename to doc/src/content/docs/en/i18n/explanation/manual_of_style.md index 85b84c04a15a..8df7b5848670 100644 --- a/doc/MANUAL_OF_STYLE.md +++ b/doc/src/content/docs/en/i18n/explanation/manual_of_style.md @@ -1,3 +1,7 @@ +--- +title: translation style guide +--- + Follow these conventions when adding or editing in-game text: 1. Use US English spelling. diff --git a/doc/src/content/docs/en/i18n/guides/maintain.md b/doc/src/content/docs/en/i18n/guides/maintain.md new file mode 100644 index 000000000000..c7a5d5438509 --- /dev/null +++ b/doc/src/content/docs/en/i18n/guides/maintain.md @@ -0,0 +1,35 @@ +--- +title: Merging and managing translations for maintainers +--- + +Several steps need to be done in the correct order to correctly merge and maintain the translation +files. + +There are scripts available for these, so usually the process will be as follows: + +1. Download the translations in `.po` format. +2. Put them in `lang/incoming/`, ensuring they are named consistently with the files in `lang/po/`. +3. Run `lang/update_pot.sh` to update `lang/po/cataclysm-BN.pot` (requires python with `polib` and + `luaparser` modules installed). +4. Run `lang/merge_po.sh` to update `lang/po/*.po`. (This is only used to test translations locally + as the project now uses Transifex for translation) + + This will also merge the translations from `lang/incoming/`. + +These steps should be enough to keep the translation files up-to-date. + +To compile the .po files into `.mo` files for use, run `lang/compile_mo.sh`. It will create a +directory in `lang/mo/` for each language found. + +Also note that both `lang/merge_po.sh` and `lang/compile_mo.sh` accept arguments specifying which +languages to merge or compile. So to compile only the translation for, say, Traditional Chinese +(zh_TW), one would run `lang/compile_mo.sh zh_TW`. + +After compiling the appropriate .mo file, if the language has been selected in game settings, the +translations will be automatically used when you run cataclysm. + +When `System language` is selected in settings, the game tries to use language that matches system +language based on language definitions file `data/raw/languages.json`. + +If you're testing translations for a new language, or the language does not show up in settings, +make sure it has its own entry in the definitions file. diff --git a/doc/TRANSLATING_MODS.md b/doc/src/content/docs/en/i18n/guides/mods.md similarity index 84% rename from doc/TRANSLATING_MODS.md rename to doc/src/content/docs/en/i18n/guides/mods.md index d4d12fb42649..f2a4eb9f1933 100644 --- a/doc/TRANSLATING_MODS.md +++ b/doc/src/content/docs/en/i18n/guides/mods.md @@ -1,30 +1,6 @@ -# Translating mods for Cataclysm: BN - -- [Translating mods for Cataclysm: BN](#translating-mods-for-cataclysm-bn) - - [Intro](#intro) - - [A short glossary](#a-short-glossary) - - [POT file](#pot-file) - - [PO file](#po-file) - - [MO file](#mo-file) - - [Workflow overview](#workflow-overview) - - [Setting up environment for string extraction](#setting-up-environment-for-string-extraction) - - [Extracting strings](#extracting-strings) - - [Creating new PO](#creating-new-po) - - [Poedit](#poedit) - - [msginit](#msginit) - - [Updating existing PO](#updating-existing-po) - - [Poedit](#poedit-1) - - [msgmerge](#msgmerge) - - [Compiling PO into MO](#compiling-po-into-mo) - - [Poedit](#poedit-2) - - [msgfmt](#msgfmt) - - [Adding MO file to the mod](#adding-mo-file-to-the-mod) - - [Miscellaneous notes](#miscellaneous-notes) - - [Is it possible to use arbitrary location or names for MO files, like with JSONs?](#is-it-possible-to-use-arbitrary-location-or-names-for-mo-files-like-with-jsons) - - [Reloading translations in a running game](#reloading-translations-in-a-running-game) - - [MO load order](#mo-load-order) - - [Dialects](#dialects) - - [What if 2 or more mods provide different translations for same string?](#what-if-2-or-more-mods-provide-different-translations-for-same-string) +--- +title: Translate third-party mods +--- ## Intro @@ -42,7 +18,7 @@ If you desire an in-depth explanation on PO/POT/MO files or how to work with the utilities, see [GNU gettext manual](https://www.gnu.org/software/gettext/manual/gettext.html). To get some generic tips on translating strings for Cataclysm: Bright Nights and its mods, see -[TRANSLATING.md](TRANSLATING.md). +[translation API](../reference/translation). ## A short glossary @@ -264,4 +240,10 @@ Then the game selects which one to use according to this set of rules: If you want a different translation from the one in the base game, or don't want it to conflict with a string from some other mod, add a translation context to the string in the corresponding JSON -object (see [TRANSLATING.md](TRANSLATING.md) for which fields support translation context). +object (see [here](../reference/translation) for which fields support translation context). + +### PR that implements mod translations, for reference + +https://github.com/cataclysmbnteam/Cataclysm-BN/pull/505 + +### [Example of the mod translation](https://github.com/Kenan2000/Bright-Nights-Kenan-Mod-Pack/pull/36) diff --git a/doc/src/content/docs/en/i18n/reference/edge_cases.md b/doc/src/content/docs/en/i18n/reference/edge_cases.md new file mode 100644 index 000000000000..fe6338e8627b --- /dev/null +++ b/doc/src/content/docs/en/i18n/reference/edge_cases.md @@ -0,0 +1,18 @@ +--- +title: Edge cases +--- + +There are issues specific to Cataclysm: BN which translators should be aware of. These include the +use of terms like `%s` and `%3$d` (leave them as they are), and the use of tags like ``, which +shouldn't be translated. + +Information about these and any other issues specific to individual languages, can be found in +Cataclysm: BN's [language notes folder][notes]. + +[notes]: https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/lang/notes + +General notes for all translators are in `README_all_translators.txt`, and notes specific to a +language may be stored as `.txt`, for example `de.txt` for German. + +Cataclysm: BN has more than 14000 translatable strings, but don't be discouraged. The more +translators there are, the easier it becomes 😄. diff --git a/doc/src/content/docs/en/i18n/reference/gender.md b/doc/src/content/docs/en/i18n/reference/gender.md new file mode 100644 index 000000000000..c89c53ca8f63 --- /dev/null +++ b/doc/src/content/docs/en/i18n/reference/gender.md @@ -0,0 +1,25 @@ +--- +title: Grammatical gender +--- + +For NPC dialogue (and potentially other strings) some languages may wish to have alternate +translations depending on the gender of the conversation participants. This two pieces of initial +configuration. + +1. The dialogue must have the relevant genders listed in the json file defining it. See + [the NPC docs](../../mod/json/reference/creatures/npcs). +2. Each language must specify the genders it wishes to use via `genders` list of the language's + entry in `data/raw/languages.json`. Don't add genders there until you're sure you will need them, + because it will make more work for you. Current choices are: `m` (male), `f` (female), `n` + (neuter). If you need different genders than the ones currently supported, see relevant note in + `src/language.h`. + +Having done this, the relevant dialogue lines will appear multiple times for translation, with +different genders specified in the message context. For example, a context of `npc:m` would indicate +that the NPC participant in the conversation is male. + +Because of technical limitations, all supported genders will appear as contexts, but you only need +to provide translations for the genders listed in the grammatical gender list for your language. + +Other parts of the game have various ad hoc solutions to grammatical gender, so don't be surprised +to see other contexts appearing for other strings. diff --git a/doc/src/content/docs/en/i18n/reference/translation.md b/doc/src/content/docs/en/i18n/reference/translation.md new file mode 100644 index 000000000000..682d04477efa --- /dev/null +++ b/doc/src/content/docs/en/i18n/reference/translation.md @@ -0,0 +1,230 @@ +--- +title: Translation API +--- + +Cataclysm: BN uses custom runtime library that works similarly to [GNU gettext][gettext] to display +translated texts. + +Using `gettext` requires two actions: + +- Marking strings that should be translated in the source code. +- Calling translation functions at run time. + +Marking translatable string allows for their automatic extraction. This process generates a file +that maps the original string (usually in English) as it appears in the source code to the +translated string. These mappings are used at run time by the translation functions. + +Note that only extracted strings can get translated, since the original string is acting as the +identifier used to request the translation. If a translation function can't find the translation, it +returns the original string. + +## Translation Functions + +In order to mark a string for translation and to obtain its translation at runtime, you should use +one of the following functions and classes. + +String _literals_ that are used in any of these functions are automatically extracted. Non-literal +strings are still translated at run time, but they won't get extracted. + +### `_()` + +This function is appropriate for use on simple strings, for example: + +```cpp +const char *translated = _( "text marked for translation" ) +``` + +It also works directly: + +```cpp +add_msg( _( "You drop the %s." ), the_item_name ); +``` + +Strings from the JSON files are extracted by the `lang/extract_json_strings.py` script, and can be +translated at run time using `_()`. If translation context is desired for a JSON string, +`class translation` can be used instead, which is documented below. + +### `pgettext()` + +This function is useful when the original string's meaning is ambiguous in isolation. For example, +the word "blue", which can mean either a color or an emotion. + +In addition to the translatable string, `pgettext` receives a context which is provided to the +translators, but is not part of the translated string itself. This function's first parameter is the +context, the second is the string to be translated: + +```cpp +const char *translated = pgettext( "The color", "blue" ); +``` + +### `vgettext()` + +Some languages have complex rules for plural forms. `vgettext` can be used to translate these +plurals correctly. Its first parameter is the untranslated string in singular form, the second +parameter is the untranslated string in plural form and the third one is used to determine which one +of the first two should be used at run time: + +```cpp +const char *translated = vgettext( "%d zombie", "%d zombies", num_of_zombies ); +``` + +### `vpgettext()` + +Same as `vgettext`, but allows to specify translation context. + +```cpp +const char *translated = vpgettext( "water source, not time of year", "%d spring", "%d springs", num_of_springs ); +``` + +## `translation` + +There are times when you want to store a string for translation, maybe with translation context; +Sometimes you may also want to store a string that needs no translation or has plural forms. +`class translation` in `translations.h|cpp` offers these functionalities in a single wrapper: + +```cpp +const translation text = to_translation( "Context", "Text" ); +``` + +```cpp +const translation text = to_translation( "Text without context" ); +``` + +```cpp +const translation text = pl_translation( "Singular", "Plural" ); +``` + +```cpp +const translation text = pl_translation( "Context", "Singular", "Plural" ); +``` + +```cpp +const translation text = no_translation( "This string will not be translated" ); +``` + +The string can then be translated/retrieved with the following code + +```cpp +const std::string translated = text.translated(); +``` + +```cpp +// this translates the plural form of the text corresponding to the number 2 +const std::string translated = text.translated( 2 ); +``` + +`class translation` can also be read from JSON. The method `translation::deserialize()` handles +deserialization from a `JsonIn` object, so translations can be read from JSON using the appropriate +JSON functions. The JSON syntax is as follows: + +```json +"name": "bar" +``` + +```json +"name": { "ctxt": "foo", "str": "bar", "str_pl": "baz" } +``` + +or + +```json +"name": { "ctxt": "foo", "str_sp": "foo" } +``` + +In the above code, `"ctxt"` and `"str_pl"` are both optional, whereas `"str_sp"` is equivalent to +specifying `"str"` and `"str_pl"` with the same string. Additionally, `"str_pl"` and `"str_sp"` will +only be read if the translation object is constructed using `plural_tag` or `pl_translation()`, or +converted using `make_plural()`. Here's an example: + +```cpp +translation name{ translation::plural_tag() }; +jsobj.read( "name", name ); +``` + +If neither `"str_pl"` nor `"str_sp"` is specified, the plural form defaults to the singular form + +"s". + +You can also add comments for translators by writing it like below (the order of the entries does +not matter): + +```json +"name": { + "//~": "as in 'foobar'", + "str": "bar" +} +``` + +Do note that currently the JSON syntax is only supported for some JSON values, which are listed +below. If you want other json strings to use this format, refer to `translations.h|cpp` and migrate +the corresponding code. Afterwards you may also want to test `update_pot.sh` to ensure that the +strings are correctly extracted for translation, and run the unit test to fix text styling issues +reported by the `translation` class. + +### Supported JSON values + +- Effect names +- Item action names +- Item category names +- Activity verbs +- Gate action messages +- Spell names and descriptions +- Terrain/furniture descriptions +- Monster melee attack messages +- Morale effect descriptions +- Mutation names/descriptions +- NPC class names/descriptions +- Tool quality names +- Score descriptions +- Skill names/descriptions +- Bionic names/descriptions +- Terrain bash sound descriptions +- Trap-vehicle collision sound descriptions +- Vehicle part names/descriptions +- Skill display type names +- NPC dialogue u_buy_monster unique names +- Spell messages and monster spell messages +- Martial art names and descriptions +- Mission names and descriptions +- Fault names and descriptions +- Plant names in item seed data +- Transform use action messages and menu text +- Template NPC names and name suffixes +- NPC talk response text +- Relic name overrides +- Relic recharge messages +- Speech text +- Tutorial messages +- Vitamin names +- Recipe blueprint names +- Recipe group recipe descriptions +- Item names (plural supported) and descriptions +- Recipe descriptions +- Inscribe use action verbs/gerunds +- Monster names (plural supported) and descriptions +- Snippets +- Bodypart names +- Keybinding action names +- Field level names + +### Lua + +[The 4 translation functions are exposed to the Lua code](../../mod/lua/tutorial/modding.md#translation-functions). + +### Recommendations + +In Cataclysm: BN, some classes, like `itype` and `mtype`, provide a wrapper for the translation +functions, called `nname`. + +When an empty string is marked for translation, it is always translated into debug information, +rather than an empty string. On most cases, strings can be considered to be never empty, and thus +always safe to mark for translation, however, when handling a string that can be empty and _needs_ +to remain empty after translation, the string should be checked for emptiness and only passed to a +translation function when is non-empty. + +Error and debug messages must not be marked for translation. When they appear, the player is +expected to report them _exactly_ as they are printed by the game. + +See the [gettext manual][manual] for more information. + +[gettext]: https://www.gnu.org/software/gettext/ +[manual]: https://www.gnu.org/software/gettext/manual/index.html diff --git a/doc/img/translating-editor.png b/doc/src/content/docs/en/i18n/tutorial/img/editor.png similarity index 100% rename from doc/img/translating-editor.png rename to doc/src/content/docs/en/i18n/tutorial/img/editor.png diff --git a/doc/img/translating-join.png b/doc/src/content/docs/en/i18n/tutorial/img/join.png similarity index 100% rename from doc/img/translating-join.png rename to doc/src/content/docs/en/i18n/tutorial/img/join.png diff --git a/doc/img/translating-list.png b/doc/src/content/docs/en/i18n/tutorial/img/languages.png similarity index 100% rename from doc/img/translating-list.png rename to doc/src/content/docs/en/i18n/tutorial/img/languages.png diff --git a/doc/img/translating-resource.png b/doc/src/content/docs/en/i18n/tutorial/img/resource.png similarity index 100% rename from doc/img/translating-resource.png rename to doc/src/content/docs/en/i18n/tutorial/img/resource.png diff --git a/doc/img/translating-start.png b/doc/src/content/docs/en/i18n/tutorial/img/start.png similarity index 100% rename from doc/img/translating-start.png rename to doc/src/content/docs/en/i18n/tutorial/img/start.png diff --git a/doc/src/content/docs/en/i18n/tutorial/transifex.md b/doc/src/content/docs/en/i18n/tutorial/transifex.md new file mode 100644 index 000000000000..a0a913a20505 --- /dev/null +++ b/doc/src/content/docs/en/i18n/tutorial/transifex.md @@ -0,0 +1,82 @@ +--- +title: Translate BN with transifex +--- + +## Supported languages + +The official location for translating Cataclysm: BN is the +[Transifex translations project][project]. + +[Looking for a way to translate mods not included in game repository?](../guides/mods.md) + +Some of the currently supported languages are: + +- Arabic +- Bulgarian +- Chinese (Simplified) +- Chinese (Traditional) +- Dutch +- Esperanto +- French +- German +- Italian (Italy) +- Japanese +- Korean +- Polish +- Portuguese (Brazil) +- Russian +- Serbian +- Spanish (Argentina) +- Spanish (Spain) +- Turkish + +Don't see your language in the list above? You can add it into the project at Transifex! + +## Join the BN team + +To begin translating, head over the [translation project][project] and click on the +`Help Translate Cataclysm: BN` button. This should take you to a page where you can either create a +free account on Transifex, or login using GitHub, Google+ or LinkedIn. + +![Start translating](./img/start.png) + +After you've created your account, return to the [translation project][project] and click on the +"Join team" button. This will open a window where you can choose the language you are interested on +translating, so pick one and click the "Join" button. + +![Join project](./img/join.png) + +## Choose a language + +After this, the most straightforward thing to do is to reload the page, which should redirect you to +the translation project's dashboard. Here, you can click the "Languages" link on the sidebar to see +the list of supported languages and the current progress of the translation effort. + +Note that you can request for the inclusion of additional languages, if the one you are interested +in is not available on the list. + +![Language list](./img/languages.png) + +From this list, you can click on the language of your choice, and then click on the "Translate" to +get started right away. Otherwise, you can click on any other language and click on the "Join team" +button, if you are interested in translating for that language as well. + +After clicking on the "Translate" button, you will be taken to the web editor. To begin, you need to +choose a resource to translate. Most of the in-game text is contained in the +`cataclysm-bright-nights` resource, so click on it to start. + +![Choose a resource](./img/resource.png) + +## Using the editor + +At this point, the editor should show you the list of text available for translation, now you only +need to click on the string you want to translate and type your translation on the translation area +on the right side of the screen. Click on the "Save" button when you are satisfied with your +translation. + +![Web editor](./img/editor.png) + +See [Transifex's documentation][docs] for more information. + +[project]: https://app.transifex.com/bn-team/cataclysm-bright-nights +[docs]: https://docs.transifex.com/ diff --git a/doc/src/content/docs/en/index.mdx b/doc/src/content/docs/en/index.mdx new file mode 100644 index 000000000000..e651b50c2c47 --- /dev/null +++ b/doc/src/content/docs/en/index.mdx @@ -0,0 +1,36 @@ +--- +title: "Welcome to Cataclysm: Bright Nights reference" +description: Get started building your docs site with Starlight. +template: splash +hero: + tagline: Learn how to contribute to the project! + image: + file: ../../../assets/icon.svg + actions: + - text: Read the Guide + link: ./mod/json/tutorial/modding + icon: right-arrow + variant: primary + - text: Join the official Discord + link: https://discord.gg/XW7XhXuZ89 + icon: external +--- + +import { Card, CardGrid } from '@astrojs/starlight/components' + +## Next steps + + + + Mod the game using [JSON](mod/json/tutorial/modding) and [Lua](mod/lua/guides/modding). + + + Translate the [base game](i18n/tutorial/transifex) and [custom mods](i18n/guides/mods). + + + Learn to [build](dev/guides/building/cmake) and update the game engine. + + + Learn to [create and update new page](contribute/docs) in the documentation. + + diff --git a/doc/GUIDE_COMESTIBLES.md b/doc/src/content/docs/en/mod/json/explanation/comestibles_file_location.md similarity index 98% rename from doc/GUIDE_COMESTIBLES.md rename to doc/src/content/docs/en/mod/json/explanation/comestibles_file_location.md index 6465417c126c..e1854e4d7a8f 100644 --- a/doc/GUIDE_COMESTIBLES.md +++ b/doc/src/content/docs/en/mod/json/explanation/comestibles_file_location.md @@ -1,4 +1,6 @@ -# Guide to add Comestibles +--- +title: File location for Comestibles +--- There are a large number of files in `json/items/comestibles`, and this guide will help you decide where to put your new comestible! diff --git a/doc/src/content/docs/en/mod/json/explanation/electric_grids.md b/doc/src/content/docs/en/mod/json/explanation/electric_grids.md new file mode 100644 index 000000000000..1218c891a423 --- /dev/null +++ b/doc/src/content/docs/en/mod/json/explanation/electric_grids.md @@ -0,0 +1,95 @@ +--- +title: Electric grids +--- + +Electric grids are electric connections within a building, similar to how all parts of a vehicle +share battery power. + +# Features + +Currently, only the following furniture interacts with an electric grid: + +- Mounted solar panel (like the one on top of the Evac Center) produces energy +- Mounted battery stores energy - when examining it, you receive information about power in a given + battery and in the whole grid. +- Battery charger works like vehicle battery charger/recharging station. Place rechargeable + batteries or items containing them into the recharger and power will be drained from mounted + batteries to recharge those. +- You can use voltmeter to + - tell electric grid connections + - check amount of energy stored + - extend electric grid connections +- Ovens work like hotplates, but with charges equal to charges of the grid +- Jumper cable connector connects a vehicle to an electric grid. To use, connect the jumper cable to + the vehicle and then to the connector. Once connected, the vehicle and the grid will share power + for most purposes, but will usually charge/discharge their own batteries before sending them + through the connector +- Fridges +- Floor lamp +- Electric Kiln +- Food Dehydrator +- Food Processor +- Vaccuum Sealer +- Arc Welder +- Electric Forge +- Electrolysis Kit + +# Grid size + +For the purposes of an electric grid, a building is made out of overmap tiles (the tiles you see on +the map opened with 'M' key, on the local map they are 24x24 tiles). Most city buildings have +individual electric grids. For example, a house with a roof and a basement, with a solar panel on +the roof, oven on the floor and a battery in the basement, will allow using the oven with the energy +from the battery charged by the panel. Overmap tiles without buildings only have grids within their +own overmap tile. There is currently no way of connecting grids together, other than by use of two +connectors, two jumper cables, and a vehicle. + +# Modding + +To create a furniture that uses the grid to power a fake item, create the fake item with a flag +`"USES_GRID_POWER"` and then set furniture's `"crafting_pseudo_item"` to that item's ID. For +example, the oven item is: + +```json +{ + "id": "fake_oven", + "copy-from": "fake_item", + "type": "TOOL", + "name": { "str": "oven" }, + "sub": "hotplate", + "max_charges": 1000, + "flags": ["USES_GRID_POWER"] +} +``` + +And the oven furniture uses it as: + +```json +"crafting_pseudo_item": "fake_oven" +``` + +Currently, the grid can only power fake items used as a part of a furniture. + +# Manually Adding Grids (for map design) + +**Warning: it is for map design. You can built grid in game without editing files. You just have to +build the solars and battery. Jumper cable and connector can connect grid with vehicles.** If you +build a new house, you'll find the new house doesn't have any electric grid. To use electric grid in +your new house, you should get and edit the overmap file, which is stored in your game's save +folder. It's name is o.0.1 or similar. What you need is: + +```json +"electric_grid_connections":[[[0,0,0]], ... ... ... ]} +``` + +Add your coordinate in this place. If your home is at `0'113, 2'56`, then your overmap file is +`o.0.2` and your coordinate to add is `[113,56,0]` (or your z-coordinate) To connect different +floors, add coordinate as like this: + +```json +"electric_grid_connections":[[[113,56,0],[0,0,1]],[[113,56,1],[0,0,-1]]... ... ... ]} +``` + +`[0,0,1]` means this coordinate shares electricity with the upper stair, and `[0,0,-1]` means the +opposite one. If your house is as big as an office tower or city hall, `[0,1,0]` or `[1,0,0]` will +also work. It's actually how the large building's electric grid works. diff --git a/doc/src/content/docs/en/mod/json/explanation/file_description.md b/doc/src/content/docs/en/mod/json/explanation/file_description.md new file mode 100644 index 000000000000..3599b390bd59 --- /dev/null +++ b/doc/src/content/docs/en/mod/json/explanation/file_description.md @@ -0,0 +1,144 @@ +--- +title: File descriptions +--- + +Here's a quick summary of what each of the JSON files contain, broken down by folder. This list is +not comprehensive, but covers the broad strokes. + +## `data/json/` + +| Filename | Description | +| -------------------------- | --------------------------------------------------------------------- | +| achievements.json | achievements | +| anatomy.json | a listing of player body parts - do not edit | +| ascii_arts.json | ascii arts for item descriptions | +| bionics.json | bionics, does NOT include bionic effects | +| body_parts.json | an expansion of anatomy.json - do not edit | +| clothing_mods.json | definition of clothing mods | +| construction.json | definition of construction menu tasks | +| default_blacklist.json | a standard blacklist of joke monsters | +| doll_speech.json | talk doll speech messages | +| dreams.json | dream text and linked mutation categories | +| disease.json | disease definitions | +| effects.json | common effects and their effects | +| emit.json | smoke and gas emissions | +| flags.json | common flags and their descriptions | +| furniture.json | furniture, and features treated like furniture | +| game_balance.json | various options to tweak game balance | +| gates.json | gate terrain definitions | +| harvest.json | item drops for butchering corpses | +| health_msgs.json | messages displayed when the player wakes | +| item_actions.json | descriptions of standard item actions | +| item_category.json | item categories and their default sort | +| item_groups.json | item spawn groups | +| lab_notes.json | lab computer messages | +| martialarts.json | martial arts styles and buffs | +| materials.json | material types | +| monster_attacks.json | monster attacks | +| monster_drops.json | monster item drops on death | +| monster_factions.json | monster factions | +| monstergroups.json | monster spawn groups | +| monstergroups_egg.json | monster spawn groups from eggs | +| monsters.json | monster descriptions, mostly zombies | +| morale_types.json | morale modifier messages | +| mutation_category.json | messages for mutation categories | +| mutation_ordering.json | draw order for mutation and CBM overlays in tiles mode | +| mutations.json | traits/mutations | +| names.json | names used for NPC/player name generation | +| overmap_connections.json | connections for roads and tunnels in the overmap | +| overmap_terrain.json | overmap terrain | +| player_activities.json | player activities | +| professions.json | profession definitions | +| recipes.json | crafting/disassembly recipes | +| regional_map_settings.json | settings for the entire map generation | +| road_vehicles.json | vehicle spawn information for roads | +| rotatable_symbols.json | rotatable symbols - do not edit | +| scent_types.json | type of scent available | +| scores.json | scores | +| skills.json | skill descriptions and ID's | +| snippets.json | flier/poster descriptions | +| species.json | monster species | +| speech.json | monster vocalizations | +| statistics.json | statistics and transformations used to define scores and achievements | +| start_locations.json | starting locations for scenarios | +| techniques.json | generic for items and martial arts | +| terrain.json | terrain types and definitions | +| test_regions.json | test regions | +| tips.json | tips of the day | +| tool_qualities.json | standard tool qualities and their actions | +| traps.json | standard traps | +| tutorial.json | messages for the tutorial (that is out of date) | +| vehicle_groups.json | vehicle spawn groups | +| vehicle_parts.json | vehicle parts, does NOT affect flag effects | +| vitamin.json | vitamins and their deficiencies | + +selected subfolders + +## `data/json/items/` + +See below for specifics on the various items + +| Filename | Description | +| ---------------------------- | ------------------------------------------------------------------ | +| ammo.json | common base components like batteries and marbles | +| ammo_types.json | standard ammo types by gun | +| archery.json | bows and arrows | +| armor.json | armor and clothing | +| bionics.json | Compact Bionic Modules (CBMs) | +| biosignatures.json | animal waste | +| books.json | books | +| chemicals_and_resources.json | chemical precursors | +| comestibles.json | food/drinks | +| containers.json | containers | +| crossbows.json | crossbows and bolts | +| fake.json | fake items for bionics or mutations | +| fuel.json | liquid fuels | +| grenades.json | grenades and throwable explosives | +| handloaded_bullets.json | random ammo | +| melee.json | anything that doesn't go in the other item jsons, melee weapons | +| migration.json | conversions of non-existent items from save games to current items | +| newspaper.json | flyers, newspapers, and survivor notes. snippets.json for messages | +| obsolete.json | items being removed from the game | +| ranged.json | guns | +| software.json | software for SD-cards and USB sticks | +| tool_armor.json | clothes and armor that can be (a)ctivated | +| toolmod.json | modifications of tools | +| tools.json | tools and items that can be (a)ctivated | +| vehicle_parts.json | components of vehicles when they aren't on the vehicle | + +### `data/json/items/comestibles` + +## `data/json/requirements/` + +Standard components and tools for crafting + +| Filename | Description | +| ------------------------- | ----------------------------------------- | +| ammo.json | ammo components | +| cooking_components.json | common ingredient sets | +| cooking_requirements.json | cooking tools and heat sources | +| materials.json | thread, fabric, and other basic materials | +| toolsets.json | sets of tools commonly used together | +| uncraft.json | common results of taking stuff apart | +| vehicle.json | tools to work on vehicles | + +## `data/json/vehicles/` + +Groups of vehicle definitions with self-explanatory names of files: + +| Filename | +| -------------------- | +| bikes.json | +| boats.json | +| cars.json | +| carts.json | +| custom_vehicles.json | +| emergency.json | +| farm.json | +| helicopters.json | +| military.json | +| trains.json | +| trucks.json | +| utility.json | +| vans_busses.json | +| vehicles.json | diff --git a/doc/GAME_BALANCE.md b/doc/src/content/docs/en/mod/json/explanation/game_balance.md similarity index 99% rename from doc/GAME_BALANCE.md rename to doc/src/content/docs/en/mod/json/explanation/game_balance.md index 0284f437c0ea..9a7df844ddac 100644 --- a/doc/GAME_BALANCE.md +++ b/doc/src/content/docs/en/mod/json/explanation/game_balance.md @@ -1,4 +1,6 @@ -# Stat system scaling: +--- +title: Stat system scaling +--- Minimum stat: 0 (should only happen due to penalties, instant failure in most scenarios) @@ -426,7 +428,7 @@ follows: 3. AP variants are considered to have 130% combined damage, 70% damage and 60% arpen (example: 70 damage, 60 arpen) -# LIQUIDS: +## Liquids Multi-charge items are weighed by the charge/use. If you have an item that contains 40 uses, it'll weigh 40x as much (when found in-game) as you entered in the JSON. Liquids are priced by the 250mL @@ -449,7 +451,7 @@ divide the "shelf" price by this value to arrive at the correct price to list in - gallon jug: 15 -# Diamond weapons +## Diamond weapons Diamond weapons should be uniform in their CVD machine requirements. Coal requirements are `floor((weapon_volume+1)/2)*25`. Hydrogen requirements are `coal_requirements/2.5`. diff --git a/doc/IN_REPO_MODS.md b/doc/src/content/docs/en/mod/json/explanation/in_repo_mods.md similarity index 78% rename from doc/IN_REPO_MODS.md rename to doc/src/content/docs/en/mod/json/explanation/in_repo_mods.md index 1a3738b5771e..d866b5ec8f23 100644 --- a/doc/IN_REPO_MODS.md +++ b/doc/src/content/docs/en/mod/json/explanation/in_repo_mods.md @@ -1,18 +1,31 @@ -# Getting Mods Into The Repository +--- +title: In-Repo Mods +sidebar: + badge: + text: Outdated + variant: caution +--- -Cataclysm: Dark Days Ahead is not only moddable, but ships with a number of mods available for users -to select from even without having to obtain mods from a third party source. +:::caution + +Current guideline is in favor of removing +[in-repo mods](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/3026). This page is kept for +historical purposes. + +::: + +BN is not only moddable, but ships with a number of mods available for users to select from even +without having to obtain mods from a third party source. ## Why have in-repo mods? The benefits of having mods in the repository include: - Visibility to a large number of users and potential contributors -- The ability to use the CleverRaven issue tracker to report problems, as well as manage pull - requests for adding to or fixing mods in the repository -- Mods in the CleverRaven repository that demonstrate usage of a game feature which exists only for - mods (i.e. not used by the core DDA game itself) help ensure that feature stays present in the - game. +- The ability to use the BN issue tracker to report problems, as well as manage pull requests for + adding to or fixing mods in the repository +- Mods in the BN repository that demonstrate usage of a game feature which exists only for mods + (i.e. not used by the core DDA game itself) help ensure that feature stays present in the game. There are however things that might be expected but are not guaranteed: @@ -25,12 +38,12 @@ There are however things that might be expected but are not guaranteed: While the developers might defer to an active curator of a mod, if they become inactive anyone else can step forward. -## What kind of mods can be in the CleverRaven repository? +## What kind of mods can be in the BN repository? There are three primary categories of mods: -- Content mods, which provide some kind of distinct experience from the core Dark Days Ahead game. - This could be a change to lore, a change to a specific part of gameplay. +- Content mods, which provide some kind of distinct experience from the core BN game. This could be + a change to lore, a change to a specific part of gameplay. - User Experience (UX) mods, which alter the look and feel of the game interface itself. - Development mods, which aren't "mods" in the typical sense but are instead there to ease the transition between "incomplete feature" and "complete feature", when a feature in the core game is @@ -39,10 +52,10 @@ There are three primary categories of mods: ## What is necessary for a mod to be included in the repository? -The most crucial criteria for a mod to be in the CleverRaven repository is that it has someone -acting as a curator. This ensures that there is someone who is keeping an eye out for possible -problems with the mod, and helping steer its development so that it continues to develop in -accordance with its design purpose. +The most crucial criteria for a mod to be in the BN repository is that it has someone acting as a +curator. This ensures that there is someone who is keeping an eye out for possible problems with the +mod, and helping steer its development so that it continues to develop in accordance with its design +purpose. Furthermore, there are additional criteria: @@ -95,4 +108,4 @@ If the mod otherwise meets inclusion criteria but lacks a curator (ie. has been it's as simple as having someone else step forward as the new curator. Otherwise, it needs to either be made to meet the criteria, or it simply isn't going to be staying -in the CleverRaven repository. +in the BN repository. diff --git a/doc/JSON_STYLE.md b/doc/src/content/docs/en/mod/json/explanation/json_style.md similarity index 75% rename from doc/JSON_STYLE.md rename to doc/src/content/docs/en/mod/json/explanation/json_style.md index 3799f6668823..54457f939b18 100644 --- a/doc/JSON_STYLE.md +++ b/doc/src/content/docs/en/mod/json/explanation/json_style.md @@ -1,7 +1,21 @@ -# JSON Style Guide +--- +title: JSON Style Guide +sidebar: + badge: + text: Unstable + variant: caution +--- -Like in `doc/CODE_STYLE.md`, the JSON styling policy is to update JSON as it is added or edited, and -in relatively small chunks otherwise in order to prevent undue disruption to development. +:::caution + +[A PR may change current JSON style](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/3118) in +favor of better tooling. + +::: + +Like in [C++ Code Style](../../../dev/explanation/code_style.md), the JSON styling policy is to +update JSON as it is added or edited, and in relatively small chunks otherwise in order to prevent +undue disruption to development. We haven't been able to find a decent JSON styling tool, so we wrote our own. It lives in tools/format/format.cpp and it leverages src/json.cpp to parse and emit JSON. @@ -68,3 +82,13 @@ this command by navigating to `Tools` > `Options` > `Environment` > `Keyboard`, commands containing `Tools.ExternalCommand` and pick the one that corresponds to the position of your command in the list (e.g. `Tools.ExternalCommand1` if it's the top item in the list) and then assign shortcut keys to it. + +### For Single file + +To style one JSON file you can run `json_formatter.exe path/to/file.json`. This will style that one +file. If it prints "needs linting", the file wasn't styled, but now should be. You can use +drag&drop: drag the json file onto the `json_formatter` icon, then wait a few seconds. + +### On *nix + +Run `make style-json` in main repo directory. diff --git a/data/json/LOADING_ORDER.md b/doc/src/content/docs/en/mod/json/explanation/loading_order.md similarity index 97% rename from data/json/LOADING_ORDER.md rename to doc/src/content/docs/en/mod/json/explanation/loading_order.md index 9f48a405678e..389bd9af5f49 100644 --- a/data/json/LOADING_ORDER.md +++ b/doc/src/content/docs/en/mod/json/explanation/loading_order.md @@ -1,4 +1,6 @@ -# JSON Loading Order +--- +title: Loading Order +--- All files here in data/json are read eventually, but the order in which they're read can be important for objects with dependencies on other kinds of objects (e.g. recipes depend on skills). diff --git a/doc/melee_weapons/Melee Weapon Evaluation.ods b/doc/src/content/docs/en/mod/json/explanation/melee/Melee Weapon Evaluation.ods similarity index 100% rename from doc/melee_weapons/Melee Weapon Evaluation.ods rename to doc/src/content/docs/en/mod/json/explanation/melee/Melee Weapon Evaluation.ods diff --git a/doc/melee_weapons/MELEE_BALANCE_SPREADSHEET.md b/doc/src/content/docs/en/mod/json/explanation/melee/melee_balance_spreadsheet.md similarity index 97% rename from doc/melee_weapons/MELEE_BALANCE_SPREADSHEET.md rename to doc/src/content/docs/en/mod/json/explanation/melee/melee_balance_spreadsheet.md index aa866ada87a9..2e6d038a318a 100644 --- a/doc/melee_weapons/MELEE_BALANCE_SPREADSHEET.md +++ b/doc/src/content/docs/en/mod/json/explanation/melee/melee_balance_spreadsheet.md @@ -1,6 +1,10 @@ -## Overview +--- +title: Melee balance spreadsheet +--- -This is documentation for the 'Melee Weapons Evaluation.md' spreadsheet. This is the spreadsheet +![spreadsheet](https://github.com/cataclysmbnteam/Cataclysm-BN/assets/54838975/1fa4f7ec-2965-4247-a592-94f246b13662) + +This is documentation for the 'Melee Weapons Evaluation.ods' spreadsheet. This is the spreadsheet that drove the 0.E experimental melee weapon rebalance project. The original spreadsheet is available as a [google doc](https://docs.google.com/spreadsheets/d/14eQIe4AO_f6OxCt1XcB4NLAs6-5R1wQW-ydZG0orYdY/edit#gid=1787713396) diff --git a/doc/src/content/docs/en/mod/json/guides/building_undead_people_tileset.md b/doc/src/content/docs/en/mod/json/guides/building_undead_people_tileset.md new file mode 100644 index 000000000000..47570c4f9e60 --- /dev/null +++ b/doc/src/content/docs/en/mod/json/guides/building_undead_people_tileset.md @@ -0,0 +1,37 @@ +--- +title: Building UDP tileset +--- + +Currently https://github.com/Theawesomeboophis working on UndeadPeople tileset. + +# His discord server: https://discord.gg/ftgMS5Rcsd + +> How do I set up compose.py and properly use unpacked? + +1. Fork repository https://github.com/Theawesomeboophis/UndeadPeopleUnpacked . It contains unpacked + tileset. +2. https://www.python.org/downloads/ . Use latest version. Make sure to check "Add Python to PATH" + in installer settings. +3. Install Libvips. Download it here: https://github.com/libvips/build-win64-mxe/releases . Grab + vips-dev-w64-all-8.11.3.zip (or different version of it). Extract it to some directory (For + example `C:\vips`) and add `C:\vips\bin` to Windows PATH. Instruction on how to add things to + path look here: https://www.architectryan.com/2018/03/17/add-to-the-path-on-windows-10/ (I am + using different directory for Libvips) + ![screenshot 2021-09-13 001](https://user-images.githubusercontent.com/17512620/133093842-ef200cef-898a-4b5b-8a8e-23588e768483.png) + +4. Install pyvips. To do it just write in your console: pip install pyvips + ![screenshot 2021-09-13 003](https://user-images.githubusercontent.com/17512620/133094097-04750819-c729-473c-a1c9-f87b00e5bf9c.png) + +And you are done. Now compose.py will work. + +Final: + +After that run `\UndeadPeopleUnpacked\!COMPOSE_MAIN.bat` to see if it is packing tileset. You will +find packed files in `UndeadPeopleUnpacked\!dda\` if everything was setup right. It will take some +time + +![screenshot 2021-09-13 004](https://user-images.githubusercontent.com/17512620/133094442-30e28aad-4304-4710-8674-7314f2987473.png) + +![screenshot 2021-09-13 005](https://user-images.githubusercontent.com/17512620/133094858-e123f137-a8e9-4d69-bae4-d28c065d9a81.png) + +And here is packed tileset. diff --git a/doc/JSON Mapping Guides/JSON_ROOF_MAPGEN.md b/doc/src/content/docs/en/mod/json/guides/json_roof_mapgen.md similarity index 96% rename from doc/JSON Mapping Guides/JSON_ROOF_MAPGEN.md rename to doc/src/content/docs/en/mod/json/guides/json_roof_mapgen.md index efd6d87f04fb..b86cd904f2e9 100644 --- a/doc/JSON Mapping Guides/JSON_ROOF_MAPGEN.md +++ b/doc/src/content/docs/en/mod/json/guides/json_roof_mapgen.md @@ -1,4 +1,6 @@ -# Adding Json Roof Guide +--- +title: Adding Json Roof Guide +--- Adding json roofs to a building involves using a few more files to link the roof and building together during mapgen. @@ -15,8 +17,7 @@ Files that will be edited: ## Making the Roof Map -Refer to [MAPGEN.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/MAPGEN.md) for -creating the map if you are new to map creation. +Refer to [MAPGEN](../reference/map/mapgen) for creating the map if you are new to map creation. Open the file that contains the map for the building `data/json/mapgen/[name of building].json` Add a new entry for the roof. You can copy the building entry since you want the same foundation @@ -191,7 +192,7 @@ category for your building and add either the overmap_special ID or the city_bui a spawn weight. ```json -""abandonedwarehouse": 200, +"abandonedwarehouse": 200, ``` When testing you can increase the spawn rate if you want to survey your work using natural spawns. diff --git a/doc/JSON Mapping Guides/Guide for beginning mapgen.md b/doc/src/content/docs/en/mod/json/guides/mapgen.md similarity index 88% rename from doc/JSON Mapping Guides/Guide for beginning mapgen.md rename to doc/src/content/docs/en/mod/json/guides/mapgen.md index a461773c02e0..446bb9354dbf 100644 --- a/doc/JSON Mapping Guides/Guide for beginning mapgen.md +++ b/doc/src/content/docs/en/mod/json/guides/mapgen.md @@ -1,9 +1,11 @@ -### Guide for basic mapgen +--- +title: Guide for basic mapgen +--- This guide will cover the basics of mapgen, which files you need to edit, the tags in each file and -the differences in creating specials or regular city buildings. For full technical information about -mapgen entries refer to: -[doc/MAPGEN.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/MAPGEN.md). +the differences in creating specials or regular city buildings. + +[For full technical information about mapgen entries, visit here](../reference/map/mapgen) First, lets cover some basic concepts and the files you'll add or edit. @@ -32,14 +34,14 @@ ground floor mapgen, so it is good practice to include dedicated downstairs if y #### The Files & their purpose: 1. You will add a new mapgen file in: - [data/json/mapgen](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/data/json/mapgen) or - one of its sub-folders. If you are using an existing foundation shape for the building, you may - append it to that building's file. + [data/json/mapgen](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/data/json/mapgen) + or one of its sub-folders. If you are using an existing foundation shape for the building, you + may append it to that building's file. - This is the blueprint for the building. It can also hold all the building’s data for adding furniture and loot (see palette for an alternative). 2. You will add entries for each z level you create in the appropriate overmap_terrain file - ([data/json/overmap/overmap_terrain](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/data/json/overmap/overmap_terrain)). + ([data/json/overmap/overmap_terrain](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/data/json/overmap/overmap_terrain)). - These entries will define what your building looks like in the overmap, its symbol, color, and spawn requirements like adding sidewalks, it will also control flags for some mapgen functions. @@ -84,8 +86,7 @@ Before beginning you’ll want to make some decisions: #### The mapgen map: This covers the mapgen file map flags and what they do in layman’s terms. You can get more extensive -information from -[doc/MAPGEN.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/MAPGEN.md). +information from [MAPGEN](../reference/map/mapgen). the mapgen file has some meta data tags and the `"object"` data which defines everything to make the map. @@ -94,7 +95,7 @@ map. Sample: -``` +```json "type": "mapgen", "method": "json", "om_terrain": "s_restaurant_coffee", @@ -127,7 +128,7 @@ won't be included. If you misplace the end bracket, you probably won't get a loa Sample: -``` +```json "object": { "fill_ter": "t_floor", "rows": [ @@ -288,8 +289,7 @@ can put any item_group into the machines, like those bullet ones_. 6. Item spawns: There are many ways to place items. This tutorial will only cover explicit symbol placement which is the easiest. There is documentation all about loot spawns you can read for - further information. See: - [doc/ITEM_SPAWN.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/ITEM_SPAWN.md). + further information. See: [ITEM_SPAWN.md](../reference/items/ITEM_SPAWN). our sample uses "items": for its tag. others include: "place_item", "place_items", "place_loot". Some of these allow for individual item placement and others groups, or both. This will be covered @@ -297,7 +297,7 @@ in another tutorial. For now lets break this one apart: -``` +```json "items": { "a": { "item": "stash_wood", "chance": 30, "repeat": [ 2, 5 ] }, "d": [ @@ -315,13 +315,13 @@ repeat the roll for that chance 2-5 times, so this fireplace can be extra stocke bit or nothing if it fails its chance rolls. the "d" entry is a dresser. I wanted the dressers to pull from two possible item groups, one a man's -selection and the other women’s. So, there is an array [ ... ] which encompasses all possible +selection and the other women’s. So, there is an array `[ ... ]` which encompasses all possible item_groups for this symbol. You can add as many item_groups to the array as you'd like. This is one of my racks in the generic house palette: -``` +```json "q": [ { "item": "tools_home", "chance": 40 }, { "item": "cleaning", "chance": 30, "repeat": [ 1, 2 ] }, @@ -336,9 +336,9 @@ furniture using that symbol, so it can end up being quite generous. If you want different item spawns, give each bookcase its own symbol, or, use an alternate item spawn format, like the one using x,y coordinates for placement._ -7. Monster spawns: our example has two types of monster spawns listed. +1. Monster spawns: our example has two types of monster spawns listed. -``` +```json "monsters": { "!": { "monster": "GROUP_COFFEE_SHOP_ZOMBIE", "chance": 1 } }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 3, 17 ], "y": [ 13, 18 ], "chance": 1 } ], ``` @@ -350,7 +350,7 @@ spawn for specific reasons. See overmap_terrain section for more information._ 8. Vehicle spawns: -``` +```json "vehicles": { "c": { "vehicle": "swivel_chair", "chance": 100, "status": 1 } } ``` @@ -363,7 +363,7 @@ rather picky in their placement and the rotation doesn't really match what you'd to mean. The 0,0 point of vehicles can vary so you'll have to experiment to get the spawns in the right spots, especially in tight spaces. -``` +```json "place_vehicles": [ { "chance": 75, "fuel": 0, "rotation": 270, "status": 1, "vehicle": "junkyard_vehicles", "x": 12, "y": 18 }, { "chance": 75, "fuel": 0, "rotation": 270, "status": 1, "vehicle": "junkyard_vehicles", "x": 19, "y": 18 }, @@ -390,7 +390,7 @@ Since the planter is a "sealed item" you define what's going into that container places seeds (ready to harvest) in the planters. Note the first one will place a seedling, the others are harvest ready. I've given each planter type an explicit symbol for quicker placement. -``` +```json "sealed_item": { "1": { "item": { "item": "seed_rose" }, "furniture": "f_planter_seedling" }, "2": { "item": { "item": "seed_chamomile" }, "furniture": "f_planter_harvest" }, @@ -422,7 +422,7 @@ others are harvest ready. I've given each planter type an explicit symbol for qu - For your basic grass cover outside please use: `"t_region_groundcover_urban",` to maintain consistency across map boundaries. Here are my standard flora entries for grass, shrubs & trees: -``` +```json ".": "t_region_groundcover_urban", "A": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], "Z": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], @@ -430,7 +430,7 @@ others are harvest ready. I've given each planter type an explicit symbol for qu finally for flowers (which are furniture): -``` +```json "p": "f_region_flower" ``` @@ -448,7 +448,7 @@ extensively in commercial building roofs and we'll cover that in advanced mapgen sample roof: -``` +```json { "type": "mapgen", "method": "json", @@ -481,7 +481,7 @@ sample roof: " ", " " ], - "palettes": [ "roof_palette" ], + "palettes": ["roof_palette"], "terrain": { ".": "t_shingle_flat_roof" } } } @@ -494,19 +494,18 @@ sample roof: "t_shingle_flat_roof" in this mapgen which will override the palettes entry for `".": "t_flat_roof"`. (more on this in advanced mapgen). -I have a separate roof document at: -[doc/JSON Mapping Guides/JSON_ROOF_MAPGEN.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/JSON%20Mapping%20Guides/JSON_ROOF_MAPGEN.md). +I have a separate roof document at: [JSON_ROOF_MAPGEN](./JSON_ROOF_MAPGEN). #### Linking various mapgen maps using multitile_city_buildings.json This file is found at: -[data/json/overmap/multitile_city_buildings.json](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/data/json/overmap/multitile_city_buildings.json). +[data/json/overmap/multitile_city_buildings.json](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/json/overmap/multitile_city_buildings.json). _Remember this file is for city buildings only, not specials_ A standard entry: -``` +```json { "type": "city_building", "id": "house_dogs", @@ -528,8 +527,8 @@ A standard entry: default. 4. `"overmaps"`: this is the bit where you define how the maps fit together, so lets break it up: `{ "point": [ 0, 0, 0 ], "overmap": "house_dogs_north" },` point: its point in relation to the - other mapgen files for your building. The coordinates are [ x, y, z ]. In this example, x,y are 0 - because we only have one map per z level. Zero for y means this is the ground level. Note the + other mapgen files for your building. The coordinates are `[ x, y, z ]`. In this example, x,y are + 0 because we only have one map per z level. Zero for y means this is the ground level. Note the roof above is at 1 and the basement is -1. 5. appending `_north` to the ID's: - If your building rotates you need this compass point so the floors can match up correctly. This @@ -538,7 +537,7 @@ A standard entry: #### Setting overmap spawns using regional_map_settings.json -[data/json/regional_map_settings.json](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/data/json/regional_map_settings.json) +[data/json/regional_map_settings.json](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/json/regional_map_settings.json) 1. For city buildings and houses you'll scroll down to the `"city":` flag. 2. Find your appropriate subtag, `"houses"` or `"shops"` usually. @@ -549,38 +548,38 @@ A standard entry: #### Linking and spawning specials: Put the entry in: -[data/json/overmap/overmap_special/specials.json](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/data/json/overmap/overmap_special/specials.json). +[data/json/overmap/overmap_special/specials.json](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/json/overmap/overmap_special/specials.json). This entry does the job of both the regional_map_settings and multitile_city_buildings plus other fun overmap stuff. Example: -``` +```json { - "type": "overmap_special", - "id": "pump_station", - "overmaps": [ - { "point": [ 0, 0, 0 ], "overmap": "pump_station_1_north" }, - { "point": [ 0, 0, 1 ], "overmap": "pump_station_1_roof_north" }, - { "point": [ 0, 1, 0 ], "overmap": "pump_station_2_north" }, - { "point": [ 0, 1, 1 ], "overmap": "pump_station_2_roof_north" }, - { "point": [ 0, -1, -1 ], "overmap": "pump_station_3_north" }, - { "point": [ 0, 0, -1 ], "overmap": "pump_station_4_north" }, - { "point": [ 0, 1, -1 ], "overmap": "pump_station_5_north" } - ], - "connections": [ - { "point": [ 0, -1, 0 ], "connection": "local_road", "from": [ 0, 0, 0 ] }, - { "point": [ 1, -1, -1 ], "connection": "sewer_tunnel", "from": [ 0, -1, -1 ] }, - { "point": [ -1, -1, -1 ], "connection": "sewer_tunnel", "from": [ 0, -1, -1 ] }, - { "point": [ -1, 1, -1 ], "connection": "sewer_tunnel", "from": [ 0, 1, -1 ] } - ], - "locations": [ "land" ], - "city_distance": [ 1, 4 ], - "city_sizes": [ 4, 12 ], - "occurrences": [ 0, 1 ], - "flags": [ "CLASSIC" ] - } + "type": "overmap_special", + "id": "pump_station", + "overmaps": [ + { "point": [0, 0, 0], "overmap": "pump_station_1_north" }, + { "point": [0, 0, 1], "overmap": "pump_station_1_roof_north" }, + { "point": [0, 1, 0], "overmap": "pump_station_2_north" }, + { "point": [0, 1, 1], "overmap": "pump_station_2_roof_north" }, + { "point": [0, -1, -1], "overmap": "pump_station_3_north" }, + { "point": [0, 0, -1], "overmap": "pump_station_4_north" }, + { "point": [0, 1, -1], "overmap": "pump_station_5_north" } + ], + "connections": [ + { "point": [0, -1, 0], "connection": "local_road", "from": [0, 0, 0] }, + { "point": [1, -1, -1], "connection": "sewer_tunnel", "from": [0, -1, -1] }, + { "point": [-1, -1, -1], "connection": "sewer_tunnel", "from": [0, -1, -1] }, + { "point": [-1, 1, -1], "connection": "sewer_tunnel", "from": [0, 1, -1] } + ], + "locations": ["land"], + "city_distance": [1, 4], + "city_sizes": [4, 12], + "occurrences": [0, 1], + "flags": ["CLASSIC"] +} ``` 1. `"type"`: is overmap_special. @@ -594,23 +593,22 @@ Example: 7. `"occurrences": [ 0, 1 ],`: Ok so occurrences can mean two things depending on if it uses the "UNIQUE" flag or not. When the flag is absent, this simply translates to how many times this special can spawn PER overmap. So 0 to 1 in this case. If you use the UNIQUE flag, this becomes a - percentage so [ 1, 10 ] wouldn't be 1 to 10 times per overmap but a 1 in 10% chance to spawn on + percentage so `[ 1, 10 ]` wouldn't be 1 to 10 times per overmap but a 1 in 10% chance to spawn on the overmap. So 10% chance to spawn once per overmap. 8. `"flags"`: These are flags you can use to further define the special. For a list of flags see: - [doc/JSON_FLAGS.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/JSON_FLAGS.md). + [JSON_FLAGS](../reference/JSON_FLAGS). -Read: [doc/OVERMAP.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/OVERMAP.md) for -more details. +Read: [OVERMAP](../reference/map/OVERMAP) for more details. #### Overmap_terrain entries: Choose a file for your building type at: -[data/json/overmap/overmap_terrain](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/data/json/overmap/overmap_terrain). +[data/json/overmap/overmap_terrain](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/data/json/overmap/overmap_terrain). This set of entries defines how your building will look on the overmap. It supports copy-from. Example: -``` +```json { "type": "overmap_terrain", "id": "s_music", @@ -646,7 +644,7 @@ You need one entry per mapgen ID: appropriate for your location. Others further define the mapgen, like having sidewalks generate. For further information see: -[Overmap Terrain section of doc/OVERMAP.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/OVERMAP.md#overmap-terrain). +[Overmap Terrain section of OVERMAP](../reference/map/OVERMAP#overmap-terrain). #### Palettes: @@ -666,14 +664,14 @@ Example: Entry for the mapgen file object: `"palettes": [ "roof_palette" ],` The palette metadata: -``` +```json "type": "palette", "id": "roof_palette", ``` Everything else will look like a series of object entries, for example the roof_palette: -``` +```json { "type": "palette", "id": "roof_palette", @@ -716,26 +714,26 @@ Everything else will look like a series of object entries, for example the roof_ "t": "f_table", "r": "f_rack", "L": "f_locker", - "C": [ "f_crate_c", "f_cardboard_box" ], + "C": ["f_crate_c", "f_cardboard_box"], "Y": "f_stool", "s": "f_sofa", "S": "f_sink", "e": "f_oven", "F": "f_fridge", - "y": [ "f_indoor_plant_y", "f_indoor_plant" ] + "y": ["f_indoor_plant_y", "f_indoor_plant"] }, - "toilets": { "T": { } } + "toilets": { "T": {} } } ``` If you want to look at more complex palettes, the standard_domestic_palette in -[data/json/mapgen_palettes/house_general_palette.json](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/data/json/mapgen_palettes/house_general_palette.json) +[data/json/mapgen_palettes/house_general_palette.json](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/json/mapgen_palettes/house_general_palette.json) is a good look at a palette designed to work across all CDDA houses. It includes the loot spawns and accounts for most furniture that will be used in a house. I also left a list of symbols open to be used in the mapgen file for specific location needs. Finally, the series of house_w palettes at -[data/json/mapgen_palettes/house_w_palette.json](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/data/json/mapgen_palettes/house_w_palette.json) +[data/json/mapgen_palettes/house_w_palette.json](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/json/mapgen_palettes/house_w_palette.json) are designed to work together for houses using nested mapgen. There is a palette devoted to the foundation, another for the nests, and finally another one I've designed for domestic outdoor nested chunks. diff --git a/doc/POSTAPOC_PRICE_GUIDE.md b/doc/src/content/docs/en/mod/json/guides/postapoc_price_guide.md similarity index 98% rename from doc/POSTAPOC_PRICE_GUIDE.md rename to doc/src/content/docs/en/mod/json/guides/postapoc_price_guide.md index a9856a2f764c..7c774d3e3e5c 100644 --- a/doc/POSTAPOC_PRICE_GUIDE.md +++ b/doc/src/content/docs/en/mod/json/guides/postapoc_price_guide.md @@ -1,4 +1,6 @@ -# How to give items a sensible postapoc_price value +--- +title: How to give items a sensible postapoc_price value +--- ### Pricing philosophy diff --git a/doc/BASECAMP.md b/doc/src/content/docs/en/mod/json/reference/creatures/basecamp.md similarity index 99% rename from doc/BASECAMP.md rename to doc/src/content/docs/en/mod/json/reference/creatures/basecamp.md index 2b3cbe31c26a..abef425fac17 100644 --- a/doc/BASECAMP.md +++ b/doc/src/content/docs/en/mod/json/reference/creatures/basecamp.md @@ -1,10 +1,12 @@ -# Recommended reading +--- +title: Basecamps +--- Basecamps leverage many existing aspects of JSON data such as recipes and mapgen. It's recommended to be familiar with those: -- [JSON info](JSON_INFO.md) has information on common fields for recipes -- [mapgen](MAPGEN.md), see section 3 about `update_mapgen` +- [JSON info](../json_info) has information on common fields for recipes +- [mapgen](../../reference/map/mapgen), see section 3 about `update_mapgen` # Adding alternate basecamp upgrade paths @@ -77,7 +79,7 @@ exclusively at faction camps. ### Sample recipe JSON -```JSON +```json { "type": "recipe", "result": "faction_base_camp_8", diff --git a/doc/EFFECTS_JSON.md b/doc/src/content/docs/en/mod/json/reference/creatures/effects_json.md similarity index 95% rename from doc/EFFECTS_JSON.md rename to doc/src/content/docs/en/mod/json/reference/creatures/effects_json.md index 0d7d3e2e3416..be402f017e2f 100644 --- a/doc/EFFECTS_JSON.md +++ b/doc/src/content/docs/en/mod/json/reference/creatures/effects_json.md @@ -1,4 +1,6 @@ -# Effect data +--- +title: Effects +--- ## How to give effects in-game? @@ -7,7 +9,7 @@ The first way to give a player an effect in-game is through the drug system. To do this your item must have a use_action of type "consume_drug". -```C++ +```json "use_action" : { "type" : "consume_drug", "activation_message" : "You take some oxycodone.", @@ -26,7 +28,7 @@ must have a use_action of type "consume_drug". Notice the "effects" field. Each effect has four potential fields: -```C++ +```json "id" - Required "duration" - Required "bp" - This will cause the effect to target this body part specifically @@ -34,7 +36,7 @@ Notice the "effects" field. Each effect has four potential fields: Valid "bp" entries are (no entry means the effect is untargeted): -```C++ +```json "torso" "head" "eyes" @@ -54,7 +56,7 @@ Valid "bp" entries are (no entry means the effect is untargeted): Creatures have an effect field similar to the "consume_drug" entry for items. You can make a creature's attacks apply effects by adding an "attack_effs" entry for the creature. -```C++ +```json "attack_effs": [ { "//": "applying this multiple times makes intensity go up by 3 instead of 1", @@ -75,7 +77,7 @@ creature's attacks apply effects by adding an "attack_effs" entry for the creatu The fields for "attack_effs" function identically to the ones for "consume_drug". However, creatures have an additional field: -```C++ +```json "chance" - The percentage chance of the effect being applied on a good hit, defaults to 100% ``` @@ -84,7 +86,7 @@ the listed effects to the player. The effects are added one after another. ## Required fields -```C++ +```json "type": "effect_type", - Required "id": "xxxx" - Must be unique ``` @@ -93,7 +95,7 @@ the listed effects to the player. The effects are added one after another. ### Max intensity -```C++ +```json "max_intensity": 3 - Used for many later fields, defaults to 1 "max_effective_intensity" - How many intensity levels will apply effects. Other intensity levels will only increase duration. @@ -101,7 +103,7 @@ the listed effects to the player. The effects are added one after another. ### Name -```C++ +```json "name": ["XYZ"] or "name": [ @@ -111,24 +113,24 @@ or ] ``` -If "max_intensity" > 1 and the number of entries in "name" >= "max_intensity" then it will attempt -to use the proper intensity name. In this case that means an intensity of 1 would give the name -"ABC", 2 would give "XYZ", and 3 would give "123". If "max_intensity" == 1 or the number of entries -in "name" is less than "max_intensity", it will use the first entry followed by the intensity in -brackets if the current intensity > 1, i.e. "ABC", "ABC [2]", "ABC [3]". If the desired entry of -"name" is the empty string ("") or "name" is missing then the effect will not display to the player -in the status screen. +If `"max_intensity" > 1` and the number of entries in `"name" >= "max_intensity"` then it will +attempt to use the proper intensity name. In this case that means an intensity of 1 would give the +name "ABC", 2 would give "XYZ", and 3 would give "123". If `"max_intensity" == 1` or the number of +entries in "name" is less than "max_intensity", it will use the first entry followed by the +intensity in brackets if the current intensity > 1, i.e.`"ABC", "ABC [2]", "ABC [3]"`. If the +desired entry of "name" is the empty string ("") or "name" is missing then the effect will not +display to the player in the status screen. Each entry in "name" can also have an optional context: -```JSON +```json "name": [ { "ctxt": "ECIG", "str": "Smoke" } ] ``` In this case, the game will translate the name with the given context "ECIG", which makes it possible to distinguish the verb "Smoke" from the noun "Smoke" in other languages. -```C++ +```json "speed_name" : "XYZ" - Defaults to the first name value ``` @@ -139,7 +141,7 @@ effect might still have an effect). ### Descriptions -```C++ +```json "desc": ["XYZ"] or "desc": [ @@ -156,7 +158,7 @@ automatically generated from the other effect data. Should a description line be Descriptions also have a second field that can act as a modifier: -```C++ +```json "part_descs": true - Defaults to false if not present ``` @@ -165,7 +167,7 @@ meaning the prior descriptions would appear as "Your left arm ABC". Descriptions can also have a reduced form: -```C++ +```json "reduced_desc": ["XYZ"] or "reduced_desc": [ @@ -180,7 +182,7 @@ normal description if it doesn't exist. ### Rating -```C++ +```json "rating": "good" - Defaults to "neutral" if missing ``` @@ -189,7 +191,7 @@ affects "blood_analysis_description" (see below) field: effects with "good" rati green, effects with any other rating will be colored red when character conducts a blood analysis through some means. Valid entries are: -```C++ +```json "good" "neutral" "bad" @@ -198,7 +200,7 @@ through some means. Valid entries are: ### Messages -```C++ +```json "apply_message": "message", "remove_message": "message" ``` @@ -209,7 +211,7 @@ being added, not if it is simply incrementing a current effect (so only new bite ### Memorial Log -```C++ +```json "apply_memorial_log": "log", "remove_memorial_log": "log" ``` @@ -220,7 +222,7 @@ message to the memorial log on addition or removal of the effect. Similar to the ### Resistances -```C++ +```json "resist_trait": "NOPAIN", "resist_effect": "flumed" ``` @@ -231,7 +233,7 @@ description. Effects can only have one "resist_trait" and one "resist_effect" at ### Removes effects -```C++ +```json "removes_effects": ["bite", "flu"] ``` @@ -242,7 +244,7 @@ duplicate them there. ### Blocks effects -```C++ +```json "blocks_effects": ["cold", "flu"] ``` @@ -253,7 +255,7 @@ ONGOING COLDS OR FLUS). Any effects present in "removes_effects" are automatical ### Effect limiters -```C++ +```json "max_duration": 100, "dur_add_perc": 150 - Defaults to 100% ``` @@ -272,7 +274,7 @@ an existing. An example: Intensities are used to control effect effects, names, and descriptions. They are defined with: -```C++ +```json "int_add_val": 2 - Defaults to 0! This means future applications will not increase intensity unless changed! and/or "int_decay_step": -2, - Defaults to -1 @@ -291,8 +293,8 @@ effect. As an example: "int_decay_step" and "int_decay_tick" require one another to do anything. If both exist then the game will automatically increment the current effect intensities by "int_decay_step" every -"int_decay_tick" ticks, capping the result at [1, "max_intensity"]. This can be used to make effects -automatically increase or decrease in intensity over time. +"int_decay_tick" ticks, capping the result at `[1, "max_intensity"]`. This can be used to make +effects automatically increase or decrease in intensity over time. "int_dur_factor" overrides the other three intensities fields, and forces the intensity to be a number defined as intensity = duration / "int_dur_factor" rounded up (so from 0 to "int_dur_factor" @@ -303,13 +305,13 @@ is intensity 1). An effect that is permanent does not lose duration with time. That is, even if its duration is 1 turn, it will last until removed. -```C++ +```json "permanent": true ``` ### Miss messages -```C++ +```json "miss_messages": [["Your blisters distract you", 1]] or "miss_messages": [ @@ -322,7 +324,7 @@ This will add the following miss messages at the given chances while the effect ### Decay messages -```C++ +```json "decay_messages": [["The jet injector's chemicals wear off. You feel AWFUL!", "bad"]] or "decay_messages": [ @@ -339,7 +341,7 @@ the player. ### Targeting modifiers -```C++ +```json "main_parts_only": true - Defaults to false ``` @@ -348,7 +350,7 @@ main part (arms, head, legs, etc.). ### Effect modifiers -```C++ +```json "pkill_addict_reduces": true, - Defaults to false "pain_sizing": true, - Defaults to false "hurt_sizing": true, - Defaults to false @@ -362,7 +364,7 @@ effect can hurt the player. ### Morale -```C++ +```json "morale": "morale_high" ``` @@ -371,7 +373,7 @@ otherwise. ### Effect effects -```C++ +```json "base_mods" : { arguments }, @@ -386,7 +388,7 @@ zero at the end when calculating actually applied values Basic definitions: -```C++ +```json "X_amount" - Amount applied of X when effect is placed. Like apply messages it will only trigger on new effects "X_min" - Minimum amount of X applied when roll triggers "X_max" - Maximum amount of X applied when roll triggers (no entry means it will give exactly X_min each time instead of rng(min, max) @@ -399,7 +401,7 @@ Basic definitions: Valid arguments: -```C++ +```json "str_mod" - Positive values raises stat, negative values lowers stat "dex_mod" - Positive values raises stat, negative values lowers stat "per_mod" - Positive values raises stat, negative values lowers stat @@ -524,7 +526,7 @@ Valid arguments: Each argument can also take either one or two values. -```C++ +```json "thirst_min": [1] or "thirst_min": [1, 2] @@ -537,7 +539,7 @@ Base mods and Scaling mods: While on intensity = 1 an effect will only have the "base_mods". However for each additional intensity it gains it adds the value of each of its "scaling_mods" to the calculations. So: -```C++ +```json Intensity 1 values = base_mods values Intensity 2 values = base_mods values + scaling_mods values Intensity 3 values = base_mods values + 2 * scaling_mods values @@ -551,7 +553,7 @@ Special case: The only special case is if base_mods' "X_chance_bot" + intensity ## Example Effect -```C++ +```json "type": "effect_type", "id": "drunk", "name": [ @@ -593,7 +595,7 @@ Its description will simply display the stat changes, with no additional descrip As it moves up through the intensity levels its effects will be: -```C++ +```json Intensity 1 +1 STR +5 morale @@ -626,7 +628,7 @@ Intensity 4 ### Blood analysis description -```C++ +```json "blood_analysis_description": "Minor Painkiller" ``` diff --git a/doc/FACTIONS.md b/doc/src/content/docs/en/mod/json/reference/creatures/factions.md similarity index 99% rename from doc/FACTIONS.md rename to doc/src/content/docs/en/mod/json/reference/creatures/factions.md index 0ce0c9a2fc95..4e46d6650d8f 100644 --- a/doc/FACTIONS.md +++ b/doc/src/content/docs/en/mod/json/reference/creatures/factions.md @@ -1,4 +1,6 @@ -# NPC factions +--- +title: NPC factions +--- An NPC faction looks like this: diff --git a/doc/MAGIC.md b/doc/src/content/docs/en/mod/json/reference/creatures/magic.md similarity index 65% rename from doc/MAGIC.md rename to doc/src/content/docs/en/mod/json/reference/creatures/magic.md index 3033dc18b5f6..948a641a9a7a 100644 --- a/doc/MAGIC.md +++ b/doc/src/content/docs/en/mod/json/reference/creatures/magic.md @@ -1,98 +1,71 @@ -# Spells, enchantments and other custom effects - -- [Spells](#spells) - - [Currently Implemented Effects and special rules](#currently-implemented-effects-and-special-rules) - - [Spells that level up](#spells-that-level-up) - - [Learning Spells](#learning-spells) - - [Spells in professions and NPC classes](#spells-in-professions-and-npc-classes) - - [Spells in monsters](#spells-in-monsters) -- [Enchantments](#enchantments) - - [id](#id) - - [has](#has) - - [condition](#condition) - - [emitter](#emitter) - - [ench\_effects](#ench_effects) - - [hit\_you\_effect](#hit_you_effect) - - [hit\_me\_effect](#hit_me_effect) - - [mutations](#mutations) - - [intermittent\_activation](#intermittent_activation) - - [values](#values) - - [IDs of modifiable values](#ids-of-modifiable-values) - - [Character values](#character-values) - - [STRENGTH](#strength) - - [DEXTERITY](#dexterity) - - [PERCEPTION](#perception) - - [INTELLIGENCE](#intelligence) - - [SPEED](#speed) - - [ATTACK\_COST](#attack_cost) - - [MOVE\_COST](#move_cost) - - [METABOLISM](#metabolism) - - [MANA\_CAP](#mana_cap) - - [MANA\_REGEN](#mana_regen) - - [STAMINA\_CAP](#stamina_cap) - - [STAMINA\_REGEN](#stamina_regen) - - [THIRST](#thirst) - - [FATIGUE](#fatigue) - - [BONUS\_DODGE](#bonus_dodge) - - [ARMOR\_X](#armor_x) - - [Item values](#item-values) - - [ITEM\_ATTACK\_COST](#item_attack_cost) - - [ITEM\_DAMAGE\_X](#item_damage_x) - - [ITEM\_ARMOR\_X](#item_armor_x) - - [Examples](#examples) +--- +title: Spells, enchantments and other custom effects +--- # Spells In `data/mods/Magiclysm` there is a template spell, copied here for your perusal: -```C++ +```json { - // This spell exists in json as a template for contributors to see the possible values of the spell - "id": "example_template", // id of the spell, used internally. not translated - "type": "SPELL", - "name": "Template Spell", // name of the spell that shows in game - "description": "This is a template to show off all the available values", - "valid_targets": [ "hostile", "ground", "self", "ally" ], // if a valid target is not included, you cannot cast the spell on that target. - "effect": "shallow_pit", // effects are coded in C++. A list will be provided below of possible effects that have been coded. - "effect_str": "template" // special. see below - "extra_effects": [ { "id": "fireball", "hit_self": false, "max_level": 3 } ], // this allows you to cast multiple spells with only one spell - "affected_body_parts": [ "HEAD", "TORSO", "MOUTH", "EYES", "ARM_L", "ARM_R", "HAND_R", "HAND_L", "LEG_L", "FOOT_L", "FOOT_R" ], // body parts affected by effects - "spell_class": "NONE" // - "base_casting_time": 100, // this is the casting time (in moves) - "base_energy_cost": 10, // the amount of energy (of the requisite type) to cast the spell - "energy_source": "MANA", // the type of energy used to cast the spell. types are: MANA, BIONIC, HP, STAMINA, FATIGUE, NONE (none will not use mana) - "difficulty": 12, // the difficulty to learn/cast the spell - "max_level": 10, // maximum level you can achieve in the spell - "min_damage": 0, // minimum damage (or "starting" damage) - "max_damage": 100, // maximum damage the spell can achieve - "damage_increment": 2.5, // to get damage (and any of the other below stats) multiply this by spell's level and add to minimum damage - "min_aoe": 0, // area of effect (currently not implemented) - "max_aoe": 5, - "aoe_increment": 0.1, - "min_range": 1, // range of the spell - "max_range": 10, - "range_increment": 2, - "min_dot": 0, // damage over time (currently not implemented) - "max_dot": 2, - "dot_increment": 0.1, - "min_duration": 0, // duration of spell effect (if the spell has a special effect) - "max_duration": 1000, - "duration_increment": 4, - "min_pierce": 0, // how much of the spell pierces armor (currently not implemented) - "max_pierce": 1, - "pierce_increment": 0.1, - "field_id": "fd_blood", // the string id of the field (currently hardcoded) - "field_chance": 100, // one_in( field_chance ) chance of spawning a field per tile in aoe - "min_field_intensity": 10, // field intensity of fields generated - "max_field_intensity": 10, - "field_intensity_increment": 1, - "field_intensity_variance": 0.1 // the field can range in intensity from -variance as a percent to +variance as a percent i.e. this spell would be 9-11 - "sound_type": "combat", // the type of sound. possible types are: background, weather, music, movement, speech, activity, destructive_activity, alarm, combat, alert, order - "sound_description": "a whoosh", // the sound description. in the form of "You hear %s" by default it is "an explosion" - "sound_ambient": true, // whether or not this is treated as an ambient sound or not - "sound_id": "misc", // the sound id - "sound_variant": "shockwave" // the sound variant - } + // This spell exists in json as a template for contributors to see the possible values of the spell + "id": "example_template", // id of the spell, used internally. not translated + "type": "SPELL", + "name": "Template Spell", // name of the spell that shows in game + "description": "This is a template to show off all the available values", + "valid_targets": ["hostile", "ground", "self", "ally"], // if a valid target is not included, you cannot cast the spell on that target. + "effect": "shallow_pit", // effects are coded in C++. A list will be provided below of possible effects that have been coded. + "effect_str": "template", // special. see below + "extra_effects": [{ "id": "fireball", "hit_self": false, "max_level": 3 }], // this allows you to cast multiple spells with only one spell + "affected_body_parts": [ + "HEAD", + "TORSO", + "MOUTH", + "EYES", + "ARM_L", + "ARM_R", + "HAND_R", + "HAND_L", + "LEG_L", + "FOOT_L", + "FOOT_R" + ], // body parts affected by effects + "spell_class": "NONE", // + "base_casting_time": 100, // this is the casting time (in moves) + "base_energy_cost": 10, // the amount of energy (of the requisite type) to cast the spell + "energy_source": "MANA", // the type of energy used to cast the spell. types are: MANA, BIONIC, HP, STAMINA, FATIGUE, NONE (none will not use mana) + "difficulty": 12, // the difficulty to learn/cast the spell + "max_level": 10, // maximum level you can achieve in the spell + "min_damage": 0, // minimum damage (or "starting" damage) + "max_damage": 100, // maximum damage the spell can achieve + "damage_increment": 2.5, // to get damage (and any of the other below stats) multiply this by spell's level and add to minimum damage + "min_aoe": 0, // area of effect (currently not implemented) + "max_aoe": 5, + "aoe_increment": 0.1, + "min_range": 1, // range of the spell + "max_range": 10, + "range_increment": 2, + "min_dot": 0, // damage over time (currently not implemented) + "max_dot": 2, + "dot_increment": 0.1, + "min_duration": 0, // duration of spell effect (if the spell has a special effect) + "max_duration": 1000, + "duration_increment": 4, + "min_pierce": 0, // how much of the spell pierces armor (currently not implemented) + "max_pierce": 1, + "pierce_increment": 0.1, + "field_id": "fd_blood", // the string id of the field (currently hardcoded) + "field_chance": 100, // one_in( field_chance ) chance of spawning a field per tile in aoe + "min_field_intensity": 10, // field intensity of fields generated + "max_field_intensity": 10, + "field_intensity_increment": 1, + "field_intensity_variance": 0.1, // the field can range in intensity from -variance as a percent to +variance as a percent i.e. this spell would be 9-11 + "sound_type": "combat", // the type of sound. possible types are: background, weather, music, movement, speech, activity, destructive_activity, alarm, combat, alert, order + "sound_description": "a whoosh", // the sound description. in the form of "You hear %s" by default it is "an explosion" + "sound_ambient": true, // whether or not this is treated as an ambient sound or not + "sound_id": "misc", // the sound id + "sound_variant": "shockwave" // the sound variant +} ``` Most of the default values for the above are either 0 or "NONE", so you may leave out most of the @@ -114,33 +87,33 @@ experience you need to get to a level is below: #### Currently Implemented Effects and special rules -- "pain_split" - makes all of your limbs' damage even out. +- `pain_split` - makes all of your limbs' damage even out. -- "move_earth" - "digs" at the target location. some terrain is not diggable this way. +- `move_earth` - "digs" at the target location. some terrain is not diggable this way. -- "target_attack" - deals damage to a target (ignores walls). Negative damage heals the target. If +- `target_attack` - deals damage to a target (ignores walls). Negative damage heals the target. If "effect_str" is included, it will add that effect (defined elsewhere in json) to the targets if able, to the body parts defined in affected_body_parts. Any aoe will manifest as a circular area centered on the target, and will only deal damage to valid_targets. (aoe does not ignore walls) -- "projectile_attack" - similar to target_attack, except the projectile you shoot will stop short at +- `projectile_attack` - similar to target_attack, except the projectile you shoot will stop short at impassable terrain. If "effect_str" is included, it will add that effect (defined elsewhere in json) to the targets if able, to the body parts defined in affected_body_parts. -- "cone_attack" - fires a cone toward the target up to your range. The arc of the cone in degrees is +- `cone_attack` - fires a cone toward the target up to your range. The arc of the cone in degrees is aoe. Stops at walls. If "effect_str" is included, it will add that effect (defined elsewhere in json) to the targets if able, to the body parts defined in affected_body_parts. -- "line_attack" - fires a line with width aoe toward the target, being blocked by walls on the way. +- `line_attack` - fires a line with width aoe toward the target, being blocked by walls on the way. If "effect_str" is included, it will add that effect (defined elsewhere in json) to the targets if able, to the body parts defined in affected_body_parts. -- "spawn_item" - spawns an item that will disappear at the end of its duration. Default duration +- `spawn_item` - spawns an item that will disappear at the end of its duration. Default duration is 0. Damage determines quantity. -- "teleport_random" - teleports the player randomly range spaces with aoe variation +- `teleport_random` - teleports the player randomly range spaces with aoe variation -- "recover_energy" - recovers an energy source (defined in the effect_str, shown below) equal to +- `recover_energy` - recovers an energy source (defined in the effect_str, shown below) equal to damage of the spell * "MANA" @@ -149,61 +122,61 @@ experience you need to get to a level is below: * "PAIN" * "BIONIC" -- "ter_transform" - transform the terrain and furniture in an area centered at the target. The +- `ter_transform` - transform the terrain and furniture in an area centered at the target. The chance of any one of the points in the area of effect changing is one_in( damage ). The effect_str is the id of a ter_furn_transform. -- "vomit" - any creature within its area of effect will instantly vomit, if it's able to do so. +- `vomit` - any creature within its area of effect will instantly vomit, if it's able to do so. -- "timed_event" - adds a timed event to the player only. valid timed events: "help", "wanted", +- `timed_event` - adds a timed event to the player only. valid timed events: "help", "wanted", "robot_attack", "spawn_wyrms", "amigara", "roots_die", "temple_open", "temple_flood", "temple_spawn", "dim", "artifact_light" NOTE: This was added only for artifact active effects. support is limited, use at your own risk. -- "explosion" - an explosion is centered on the target, with power damage() and factor aoe()/10 +- `explosion` - an explosion is centered on the target, with power damage() and factor aoe()/10 -- "flashbang" - a flashbang effect is centered on the target, with poewr damage() and factor +- `flashbang` - a flashbang effect is centered on the target, with poewr damage() and factor aoe()/10 -- "mod_moves" - adds damage() moves to the target. can be negative to "freeze" the target for that +- `mod_moves` - adds damage() moves to the target. can be negative to "freeze" the target for that amount of time -- "map" - maps the overmap centered on the player out to a radius of aoe() +- `map` - maps the overmap centered on the player out to a radius of aoe() -- "morale" - gives a morale effect to all npcs or avatar within aoe, with value damage(). +- `morale` - gives a morale effect to all npcs or avatar within aoe, with value damage(). decay_start is duration() / 10. -- "charm_monster" - charms a monster that has less hp than damage() for approximately duration() +- `charm_monster` - charms a monster that has less hp than damage() for approximately duration() -- "mutate" - mutates the target(s). if effect_str is defined, mutates toward that category instead +- `mutate` - mutates the target(s). if effect_str is defined, mutates toward that category instead of picking at random. the "MUTATE_TRAIT" flag allows effect_str to be a specific trait instead of a category. damage() / 100 is the percent chance the mutation will be successful (a value of 10000 represents 100.00%) -- "bash" - bashes the terrain at the target. uses damage() as the strength of the bash. +- `bash` - bashes the terrain at the target. uses damage() as the strength of the bash. -- "WONDER" - Unlike the above, this is not an "effect" but a "flag". This alters the behavior of the +- `WONDER` - Unlike the above, this is not an "effect" but a "flag". This alters the behavior of the parent spell drastically: The spell itself doesn't cast, but its damage and range information is used in order to cast the extra_effects. N of the extra_effects will be chosen at random to be cast, where N is the current damage of the spell (stacks with RANDOM_DAMAGE flag) and the message of the spell cast by this spell will also be displayed. If this spell's message is not wanted to be displayed, make sure the message is an empty string. -- "RANDOM_TARGET" - A special spell flag (like wonder) that forces the spell to choose a random +- `RANDOM_TARGET` - A special spell flag (like wonder) that forces the spell to choose a random valid target within range instead of the caster choosing the target. This also affects extra_effects. ##### For Spells that have an attack type, these are the available damage types: -- "fire" -- "acid" -- "bash" -- "bio" - internal damage such as poison -- "cold" -- "cut" -- "electric" -- "stab" -- "none" - this damage type goes through armor altogether. it is the default. +- `fire` +- `acid` +- `bash` +- `bio` - internal damage such as poison +- `cold` +- `cut` +- `electric` +- `stab` +- `none` - this damage type goes through armor altogether. it is the default. #### Spells that level up @@ -243,20 +216,20 @@ There are two ways of granting spells that is implemented: Mutating can grant a spell from an item through a use_action, which is also the only way to train a spell other than using it. Examples of both are shown below: -```C++ +```json { -"id": "DEBUG_spellbook", -"type": "GENERIC", -"name": "A Technomancer's Guide to Debugging C:DDA", -"description": "static std::string description( spell sp ) const;", -"weight": 1, -"volume": "1 ml", -"symbol": "?", -"color": "magenta", -"use_action": { - "type": "learn_spell", - "spells": [ "debug_hp", "debug_stamina", "example_template", "debug_bionic", "pain_split", "fireball" ] // this is a list of spells you can learn from the item -} + "id": "DEBUG_spellbook", + "type": "GENERIC", + "name": "A Technomancer's Guide to Debugging C:DDA", + "description": "static std::string description( spell sp ) const;", + "weight": 1, + "volume": "1 ml", + "symbol": "?", + "color": "magenta", + "use_action": { + "type": "learn_spell", + "spells": [ "debug_hp", "debug_stamina", "example_template", "debug_bionic", "pain_split", "fireball" ] // this is a list of spells you can learn from the item + } }, ``` @@ -338,11 +311,11 @@ emitter. Syntax for single entry: -```C++ +```json { - // (required) Identifier of the effect + // (required) Identifier of the effect "effect": "effect_identifier", - + // (required) Intensity. Setting to 1 works for effects that do not actually have intensities. "intensity": 2 } @@ -355,35 +328,35 @@ creature. Syntax for single entry: -```c++ +```json { // (required) Identifier of the spell "id": "spell_identifier", - + // If true, the spell is centered on the character's location. // If false, the spell is centered on the attacking creature. // Default: false "hit_self": false, - + // Chance to trigger, one in X. // Default: 1 "once_in": 1, - + // Message for when the spell is triggered for you. // %1$s is your name, %2$s is creature's - // Default: no message + // Default: no message "message": "You pierce %2$s with Magic Piercing!", - + // Message for when the spell in triggered for an NPC. // %1$s is their name, %2$s is creature's - // Default: no message + // Default: no message "npc_message": "%1$s pierces %2$s with Magic Piercing!", - + // TODO: broken? "min_level": 1, - + // TODO: broken? - "max_level": 2, + "max_level": 2 } ``` @@ -404,7 +377,7 @@ Same syntax as for `hit_you_effect`. Syntax: -```c++ +```json { // List of checks to run on every turn while enchantment is active. "effects": [ @@ -412,19 +385,18 @@ Syntax: // Average activation frequency. // The exact chance to pass is "one in (X converted to turns)" per turn. "frequency": "5 minutes", - + // List of spells to cast if the check passed. "spell_effects": [ { // (required) Identifier of the spell "id": "nasty_random_effect", - + // TODO: broken? "min_level": 1, - + // TODO: broken? - "max_level": 5, - + "max_level": 5 // TODO: other fields appear to be loaded, but unused } ] @@ -439,23 +411,23 @@ Syntax: Syntax for single entry: -```c++ +```json { // (required) Value ID to modify, refer to list below. - "value": "VALUE_ID_STRING" - + "value": "VALUE_ID_STRING", + // Additive bonus. Optional integer number, default is 0. // May be ignored for some values. "add": 13, - + // Multiplicative bonus. Optional, default is 0. - "multiply": -0.3, + "multiply": -0.3 } ``` Additive bonus is applied separately from multiplicative, like so: -```c++ +```json bonus = add + base_value * multiply ``` diff --git a/doc/MARTIALART_JSON.md b/doc/src/content/docs/en/mod/json/reference/creatures/martialart_json.md similarity index 99% rename from doc/MARTIALART_JSON.md rename to doc/src/content/docs/en/mod/json/reference/creatures/martialart_json.md index 3fa4105a1260..136090c48e8d 100644 --- a/doc/MARTIALART_JSON.md +++ b/doc/src/content/docs/en/mod/json/reference/creatures/martialart_json.md @@ -1,8 +1,10 @@ -# Martial arts and techniques JSON file contents +--- +title: Martial arts & techniques +--- ### Martial arts -```C++ +```json "type" : "martial_art", "id" : "style_debug", // Unique ID. Must be one continuous word, // use underscores if necessary. @@ -35,7 +37,7 @@ ### Techniques -```C++ +```json "id" : "tec_debug_arpen", // Unique ID. Must be one continuous word "name" : "phasing strike", // In-game name displayed "unarmed_allowed" : true, // Can an unarmed character use this technique @@ -73,7 +75,7 @@ ### Buffs -```C++ +```json "id" : "debug_elem_resist", // Unique ID. Must be one continuous word "name" : "Elemental resistance", // In-game name displayed "description" : "+Strength bash armor, +Dexterity acid armor, +Intelligence electricity armor, +Perception fire armor.", // In-game description @@ -94,7 +96,7 @@ The bonuses arrays contain any number of bonus entries like this: -```C++ +```json { "stat": "damage", "type": "bash", diff --git a/doc/MISSIONS_JSON.md b/doc/src/content/docs/en/mod/json/reference/creatures/missions_json.md similarity index 98% rename from doc/MISSIONS_JSON.md rename to doc/src/content/docs/en/mod/json/reference/creatures/missions_json.md index 4bbfc8a7f6a1..cbc117dd28b5 100644 --- a/doc/MISSIONS_JSON.md +++ b/doc/src/content/docs/en/mod/json/reference/creatures/missions_json.md @@ -1,8 +1,10 @@ -# Creating missions +--- +title: Creating missions +--- NPCs can assign missions to the player. There is a fairly regular structure for this: -```JSON +```json { "id": "MISSION_GET_BLACK_BOX_TRANSCRIPT", "type": "mission_definition", @@ -51,7 +53,7 @@ Not required, but it's strongly recommended that you summarize all relevant info You may refer to mission end effects of the "u_buy_item" type, as long as they do not come at a cost to the player. See the example below: -```JSON +```json "id": "MISSION_EXAMPLE_TOKENS", "type": "mission_definition", "name": "Murder Money", @@ -106,8 +108,8 @@ player's current kill count that must be killed to complete the mission. ### goal_condition For "MGOAL_CONDITION", defines the condition that must be satisified for the mission to be -considered complete. Conditions are explained in more detail in [NPCs.md](./NPCs.md), and are used -here in exactly the same way. +considered complete. Conditions are explained in more detail in [NPCs.md](./NPCs), and are used here +in exactly the same way. ### dialogue @@ -142,7 +144,7 @@ If any of these optional fields are present they can be objects with the followi #### effect -This is an effects array, exactly as defined in [NPCs.md](./NPCs.md), and can use any of the values +This is an effects array, exactly as defined in [NPCs.md](./NPCs), and can use any of the values from effects. In all cases, the NPC involved is the quest giver. #### reveal_om_ter @@ -176,7 +178,7 @@ afterwards. The `om_terrain` is the only required field. **example** -```JSON +```json { "assign_mission_target": { "om_terrain": "necropolis_c_44", @@ -255,7 +257,7 @@ the `target` boolean set to `true` in its `place` object in `update_mapgen`. In order to assign missions to NPCs, the first step is to find that NPC's definition. For unique NPCs this is usually at the top of the npc's JSON file and looks something like this: -```JSON +```json { "type": "npc", "id": "refugee_beggar2", @@ -290,7 +292,7 @@ Either of these options will allow the player to do normal mission management di This is an example of how a custom mission inquiry might appear. This will only appear in the NPC's dialogue options if the player has already been assigned a mission. -```JSON +```json { "type": "talk_topic", "//": "Generic responses for Old Guard Necropolis NPCs that can have missions", diff --git a/doc/MONSTERS.md b/doc/src/content/docs/en/mod/json/reference/creatures/monsters.md similarity index 95% rename from doc/MONSTERS.md rename to doc/src/content/docs/en/mod/json/reference/creatures/monsters.md index 3d3abcb5e960..2642bae14d82 100644 --- a/doc/MONSTERS.md +++ b/doc/src/content/docs/en/mod/json/reference/creatures/monsters.md @@ -1,8 +1,14 @@ -# Monster types +--- +title: Monsters +tableOfContents: + maxHeadingLevel: 4 +--- + +## Monster types Monster types are specified as JSON object with "type" member set to "MONSTER": -```JSON +```json { "type": "MONSTER", "id": "mon_foo", @@ -22,17 +28,17 @@ Monster types support the following properties (mandatory, except if noted other (string or object) -```JSON +```json "name": "cow" ``` -```JSON +```json "name": { "ctxt": "fish", "str": "pike", "str_pl": "pikes" } ``` or, if the singular and plural forms are the same: -```JSON +```json "name": { "ctxt": "fish", "str_sp": "bass" } ``` @@ -73,7 +79,7 @@ and UNKNOWN. (string) -```JSON +```json "volume": "40 L" ``` @@ -84,7 +90,7 @@ are not currently accepted. (string) -```JSON +```json "weight": "3 kg" ``` @@ -108,8 +114,8 @@ List of scenttype_id ignored by this monster. scent_types are defined in scent_t (string) Symbol and color representing monster in-game. The symbol must be a UTF-8 string, that is exactly -one console cell width (may be several Unicode characters). See -[COLOR.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/COLOR.md) for details. +one console cell width (may be several Unicode characters). See [COLOR.md](../graphics/COLOR) for +details. ## "size" @@ -249,7 +255,7 @@ amount of damage. - `armor_penetration` how much of the armor the damage instanc `armor_multiplier` is a multiplier on `armor_penetration`. - `damage_multiplier` is a multiplier on `amount`. -```JSON +```json "melee_damage": [ { "damage_type": "electric", "amount": 4.0, "armor_penetration": 1, "armor_multiplier": 1.2, "damage_multiplier": 1.4 } ], ``` @@ -356,7 +362,7 @@ style) or an array (old style). The old style array should contain 2 elements: the id of the attack (see JSON_FLAGS.md for a list) and the cooldown for that attack. Example (grab attack every 10 turns): -```JSON +```json "special_attacks": [ [ "GRAB", 10 ] ] ``` @@ -364,7 +370,7 @@ The new style object should contain at least a "type" member (string) and "coold (integer). It may contain additional members as required by the specific type. Possible types are listed below. Example: -```JSON +```json "special_attacks": [ { "type": "leap", "cooldown": 10, "max_range": 4 } ] @@ -372,7 +378,7 @@ listed below. Example: "special_attacks" may contain any mixture of old and new style entries: -```JSON +```json "special_attacks": [ [ "GRAB", 10 ], { "type": "leap", "cooldown": 10, "max_range": 4 } @@ -383,7 +389,7 @@ One can add entries with "add:death_function", which takes the same content as t member and remove entries with "remove:death_function", which requires an array of attack types. Example: -```JSON +```json "remove:special_attacks": [ "GRAB" ], "add:special_attacks": [ [ "SHRIEK", 20 ] ] ``` @@ -416,7 +422,7 @@ the turret item, which can be picked up and placed elsewhere. An object containing ammo that newly spawned monsters start with. This is useful for a monster that has a special attack that consumes ammo. Example: -```JSON +```json "starting_ammo": { "9mm": 100, "40mm_frag": 100 } ``` @@ -429,7 +435,7 @@ the default and disables upgrading) or an object describing the upgrades. Example: -```JSON +```json "upgrades": { "into_group": "GROUP_ZOMBIE_UPGRADE", "half_life": 28 @@ -492,7 +498,7 @@ A special defense attack, triggered when the monster is attacked. It should cont the id of the defense (see Monster defense attacks in JSON_FLAGS.md) and the chance for that defense to be actually triggered. Example: -```JSON +```json "special_when_hit": [ "ZAPBACK", 100 ] ``` @@ -503,7 +509,7 @@ to be actually triggered. Example: A set of effects that may get applied to the attacked creature when the monster successfully attacks. Example: -```JSON +```json "attack_effs": [ { "id": "paralyzepoison", @@ -564,7 +570,7 @@ Mandatory properties (all that are not marked as optional) are only required if Example (rename the zombie monster, leaves all other properties untouched): -```JSON +```json { "type": "MONSTER", "edit-mode": "modify", @@ -582,7 +588,7 @@ removing a special attack. Modifying a type overrides the properties with the new values, this example sets the special attacks to contain _only_ the "SHRIEK" attack: -```JSON +```json { "type": "MONSTER", "edit-mode": "modify", @@ -594,27 +600,27 @@ to contain _only_ the "SHRIEK" attack: Some properties allow adding and removing entries, as documented above, usually via members with the "add:"/"remove:" prefix. -# Monster special attack types +## Monster special attack types The listed attack types can be as monster special attacks (see "special_attacks"). -## "leap" +### "leap" Makes the monster leap a few tiles. It supports the following additional properties: -### "max_range" +#### "max_range" (Required) Maximal range of attack. -### "min_range" +#### "min_range" (Required) Minimal range needed for attack. -### "allow_no_target" +#### "allow_no_target" This prevents monster from using the ability on empty space. -### "move_cost" +#### "move_cost" Turns needed to complete special attack. 100 move_cost with 100 speed is equal to 1 second/turn. @@ -622,39 +628,39 @@ Turns needed to complete special attack. 100 move_cost with 100 speed is equal t Minimal range and maximal range to consider for using specific attack. -## "bite" +### "bite" Makes monster use teeth to bite opponent. Some monsters can give infection by doing so. -### "damage_max_instance" +#### "damage_max_instance" Max damage it can deal on one bite. -### "min_mul", "max_mul" +#### "min_mul", "max_mul" How hard is to get free of bite without killing attacker. -### "move_cost" +#### "move_cost" Turns needed to complete special attack. 100 move_cost with 100 speed is equal to 1 second/turn. -### "accuracy" +#### "accuracy" (Integer) How accurate it is. Not many monsters use it though. -### "no_infection_chance" +#### "no_infection_chance" Chance to not give infection. -## "gun" +### "gun" Fires a gun at a target. If friendly, will avoid harming the player. -### "gun_type" +#### "gun_type" (Required) Valid item id of a gun that will be used to perform the attack. -### "ammo_type" +#### "ammo_type" (Required) Valid item id of the ammo the gun will be loaded with. Monster should also have a "starting_ammo" field with this ammo. For example @@ -664,72 +670,72 @@ Fires a gun at a target. If friendly, will avoid harming the player. "starting_ammo" : {"50bmg":100} ``` -### "max_ammo" +#### "max_ammo" Cap on ammo. If ammo goes above this value for any reason, a debug message will be printed. -### "fake_str" +#### "fake_str" Strength stat of the fake NPC that will execute the attack. 8 if not specified. -### "fake_dex" +#### "fake_dex" Dexterity stat of the fake NPC that will execute the attack. 8 if not specified. -### "fake_int" +#### "fake_int" Intelligence stat of the fake NPC that will execute the attack. 8 if not specified. -### "fake_per" +#### "fake_per" Perception stat of the fake NPC that will execute the attack. 8 if not specified. -### "fake_skills" +#### "fake_skills" Array of 2 element arrays of skill id and skill level pairs. -### "move_cost" +#### "move_cost" Move cost of executing the attack // If true, gives "grace period" to player -### "require_targeting_player" +#### "require_targeting_player" If true, the monster will need to "target" the player, wasting `targeting_cost` moves, putting the attack on cooldown and making warning sounds, unless it attacked something that needs to be targeted recently. -### "require_targeting_npc" +#### "require_targeting_npc" As above, but with npcs. -### "require_targeting_monster" +#### "require_targeting_monster" As above, but with monsters. -### "targeting_timeout" +#### "targeting_timeout" Targeting status will be applied for this many turns. Note that targeting applies to turret, not targets. -### "targeting_timeout_extend" +#### "targeting_timeout_extend" Successfully attacking will extend the targeting for this many turns. Can be negative. -### "targeting_cost" +#### "targeting_cost" Move cost of targeting the player. Only applied if attacking the player and didn't target player within last 5 turns. -### "no_crits" +#### "no_crits" If true then attacking create will be unable to score ranged critical hit on target, also good hits no longer has high change to go to the head, instead there is high change to score hit to the body and limbs. If false then default behavior used - critical hits are allowed and good hit has high chance to reach head. -### "laser_lock" +#### "laser_lock" If true and attacking a creature that isn't laser-locked but needs to be targeted, the monster will act as if it had no targeting status (and waste time targeting), the target will become @@ -737,30 +743,30 @@ laser-locked, and if the target is the player, it will cause a warning. Laser-locking affects the target, but isn't tied to specific attacker. -### "range" +#### "range" Maximum range at which targets will be acquired. -### "range_no_burst" +#### "range_no_burst" Maximum range at which targets will be attacked with a burst (if applicable). -### "burst_limit" +#### "burst_limit" Limit on burst size. -### "description" +#### "description" Description of the attack being executed if seen by the player. -### "targeting_sound" +#### "targeting_sound" Description of the sound made when targeting. -### "targeting_volume" +#### "targeting_volume" Volume of the sound made when targeting. -### "no_ammo_sound" +#### "no_ammo_sound" Description of the sound made when out of ammo. diff --git a/doc/src/content/docs/en/mod/json/reference/creatures/new_mutations.md b/doc/src/content/docs/en/mod/json/reference/creatures/new_mutations.md new file mode 100644 index 000000000000..8b2c719d723f --- /dev/null +++ b/doc/src/content/docs/en/mod/json/reference/creatures/new_mutations.md @@ -0,0 +1,46 @@ +--- +title: new mutation system +--- + +At the moment the system only covers untargeted mutations. The targeted ones (alpha mutagen etc.) +still use the old one, with the only difference being that it doesn't force negative mutations 33% +of the time and doesn't support Robust Genetics, which would turn those 33% forced negative +mutations into forced positive ones. + +You can use the old system by adding the "Old mutations" mod to a world. This can be safely done to +already generated worlds. Same for removal of this mod. + +## Accumulated mutagen + +The character passively accumulates inactive "mutagenic potential" over time, which is all turned +into new mutations the moment character mutates uncontrollably for any reason. The potential is then +cleared. + +This potential caps at 7.333 potential mutations, which takes 22 days (1 mutation per 3 days). + +## Mutagenic flesh + +Flesh of mutants contains mutagenic toxins, which will cause uncontrollable mutations over a period +of time if allowed to accumulate sufficiently. + +The character loses about 630 kcal of mutant flesh of mutagen per day. If a starved character gorged +on mutant flesh, it would take a little more than 5000 kcal to start mutating. + +### Uncontrollable mutations + +Once the character starts mutating, all the mutagenic potential is immediately turned into new +mutations and the character will continue mutating for at least 4 days. + +The character will gain mutagenic potential at a faster rate and will gain about 2 new mutations by +the end of it, assuming no more mutagenic toxins. Mutagenic toxins will extend the process and may +even speed it up to up to over 1 mutation per day. + +## Mutation selection + +Overall the mutations picked will trend towards positive, until the character has a set of traits +that is "more good than bad". + +Picked mutations trend towards a character with +6 trait score overall. For example, a character +with just Quick (+4) and Fleet Footed (+2) traits will receive positive and negative traits about +equally, while a character with no positive traits and -12 worth of negative ones will be more +likely to get Quick over Fleet Footed and very unlikely to get Junkfood Intolerance. diff --git a/doc/NPCs.md b/doc/src/content/docs/en/mod/json/reference/creatures/npcs.md similarity index 99% rename from doc/NPCs.md rename to doc/src/content/docs/en/mod/json/reference/creatures/npcs.md index 6e125f16bd7d..2274341ea5bd 100644 --- a/doc/NPCs.md +++ b/doc/src/content/docs/en/mod/json/reference/creatures/npcs.md @@ -1,6 +1,12 @@ -TODO: document the "npc" structure, used to load NPC template +--- +title: NPCs +tableOfContents: + maxHeadingLevel: 4 +--- -# Writing dialogues +## Writing Dialogues + +TODO: document the "npc" structure, used to load NPC template Dialogues work like state machines. They start with a certain topic (the NPC says something), the player character can respond (choosing one of several responses), and that response sets the new @@ -9,7 +15,7 @@ talk topic. This goes on until the dialogue is finished, or the NPC turns hostil Note that it is perfectly fine to have a response that switches the topic back to itself. NPC missions are controlled by a separate but related JSON structure and are documented in -[the missions docs](MISSIONS_JSON.md). +[the missions docs](./missions_json.md). Two topics are special: @@ -77,7 +83,7 @@ loading from json will append responses and, if defined in json, override the `d This example adds the "I'm going now!" response to all the listed topics. -```C++ +```cpp { "type": "talk_topic", "id": [ "TALK_ARSONIST", "TALK_STRANGER_FRIENDLY", "TALK_STRANGER_NEUTRAL" ], @@ -528,7 +534,7 @@ will generate separate responses from the item itself. The `effect` field of `speaker_effect` or a `response` can be any of the following effects. Multiple effects should be arranged in a list and are processed in the order listed. -#### Missions +### Missions | Effect | Description | | ----------------- | --------------------------------------------------------------- | @@ -538,7 +544,7 @@ effects should be arranged in a list and are processed in the order listed. | `clear_mission` | Clears the mission from the your character's assigned missions. | | `mission_reward` | Gives the player the mission's reward. | -#### Stats / Morale +### Stats / Morale | Effect | Description | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -550,7 +556,7 @@ effects should be arranged in a list and are processed in the order listed. | `player_weapon_away` | Makes your character put away (unwield) their weapon. | | `player_weapon_drop` | Makes your character drop their weapon. | -#### Character effects / Mutations +### Character effects / Mutations | Effect | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -566,7 +572,7 @@ effects should be arranged in a list and are processed in the order listed. | `u_learn_recipe: recipe_string` | Your character will learn and memorize the recipe `recipe_string`. | | `npc_first_topic: topic_string` | NPC permanently changes first dialogue topic to `topic_string`. | -#### Trade / Items +### Trade / Items | Effect | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -625,22 +631,22 @@ effects should be arranged in a list and are processed in the order listed. | `set_npc_aim_rule: rule_string` | Sets the NPC follower AI rule for aiming speed to the value of `rule_string`. | | `npc_die` | The NPC will die at the end of the conversation. | -#### Map Updates +### Map Updates `mapgen_update: mapgen_update_id_string`
`mapgen_update:` _list of `mapgen_update_id_string`s_, (optional `assign_mission_target` parameters) | With no other parameters, updates the overmap tile at the player's current location with the changes described in `mapgen_update_id` (or for each `mapgen_update_id` in the list). The `assign_mission_target` parameters can be used to change the -location of the overmap tile that gets updated. See [the missions docs](MISSIONS_JSON.md) for -`assign_mission_target` parameters and [the mapgen docs](MAPGEN.md) for `mapgen_update`. +location of the overmap tile that gets updated. See [the missions docs](missions_json) for +`assign_mission_target` parameters and [the mapgen docs](../map/mapgen) for `mapgen_update`. -#### Deprecated +### Deprecated | Effect | Description | | -------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | | `deny_follow`
`deny_lead`
`deny_train`
`deny_personal_info` | Sets the appropriate effect on the NPC for a few hours.
These are _deprecated_ in favor of the more flexible `npc_add_effect` described above. | -#### Sample effects +### Sample effects ```json { "topic": "TALK_EVAC_GUARD3_HOSTILE", "effect": [ { "u_faction_rep": -15 }, { "npc_change_faction": "hells_raiders" } ] } diff --git a/doc/PLAYER_ACTIVITY.md b/doc/src/content/docs/en/mod/json/reference/creatures/player_activity.md similarity index 99% rename from doc/PLAYER_ACTIVITY.md rename to doc/src/content/docs/en/mod/json/reference/creatures/player_activity.md index 831fc79698ce..edc9cedaf4e0 100644 --- a/doc/PLAYER_ACTIVITY.md +++ b/doc/src/content/docs/en/mod/json/reference/creatures/player_activity.md @@ -1,4 +1,6 @@ -# Activities +--- +title: Activities +--- Activities are long term actions, that can be interrupted and (optionally) continued. This allows the avatar or an npc to react to events (like monsters appearing, getting hurt) while doing diff --git a/doc/COLOR.md b/doc/src/content/docs/en/mod/json/reference/graphics/color.md similarity index 98% rename from doc/COLOR.md rename to doc/src/content/docs/en/mod/json/reference/graphics/color.md index 442414a9f2ee..f62b88f98739 100644 --- a/doc/COLOR.md +++ b/doc/src/content/docs/en/mod/json/reference/graphics/color.md @@ -1,6 +1,8 @@ -# Colors +--- +title: Colors +--- -DDA is colorful game. You can use several foreground and background colors in various places: +BN is a colorful game. You can use several foreground and background colors in various places: - map data (terrain and furniture); - item data; diff --git a/doc/src/content/docs/en/mod/json/reference/graphics/mod_tileset.md b/doc/src/content/docs/en/mod/json/reference/graphics/mod_tileset.md new file mode 100644 index 000000000000..aead3057b1fb --- /dev/null +++ b/doc/src/content/docs/en/mod/json/reference/graphics/mod_tileset.md @@ -0,0 +1,46 @@ +--- +title: Mod Tileset +--- + +MOD tileset defines additional sprite sheets. It is specified as JSON object with `type` member set +to `mod_tileset`. + +Example: + +```json +[ + { + "type": "mod_tileset", + "compatibility": ["MshockXottoplus"], + "tiles-new": [ + { + "file": "test_tile.png", + "tiles": [ + { + "id": "player_female", + "fg": 1, + "bg": 0 + }, + { + "id": "player_male", + "fg": 2, + "bg": 0 + } + ] + } + ] + } +] +``` + +## `compatibility` + +(string) + +The internal ID of the compatible tilesets. MOD tileset is only applied when base tileset's ID +exists in this field. + +## `tiles-new` + +Setting of sprite sheets. Same as `tiles-new` field in `tile_config`. Sprite files are loaded from +the same folder json file exists. diff --git a/doc/src/content/docs/en/mod/json/reference/graphics/mutation_overlay.md b/doc/src/content/docs/en/mod/json/reference/graphics/mutation_overlay.md new file mode 100644 index 000000000000..2883fa0faed7 --- /dev/null +++ b/doc/src/content/docs/en/mod/json/reference/graphics/mutation_overlay.md @@ -0,0 +1,75 @@ +--- +title: Mutation overlay ordering +--- + +The file `mutation_ordering.json` defines the order that visual mutation and bionic overlays are +rendered on a character ingame. The layering value from 0 (bottom) - 9999 (top) sets the order. + +Example: + +```json +[ + { + "type": "overlay_order", + "overlay_ordering": [ + { + "id": [ + "BEAUTIFUL", + "BEAUTIFUL2", + "BEAUTIFUL3", + "LARGE", + "PRETTY", + "RADIOACTIVE1", + "RADIOACTIVE2", + "RADIOACTIVE3", + "REGEN" + ], + "order": 1000 + }, + { + "id": ["HOOVES", "ROOTS1", "ROOTS2", "ROOTS3", "TALONS"], + "order": 4500 + }, + { + "id": "FLOWERS", + "order": 5000 + }, + { + "id": [ + "PROF_CYBERCOP", + "PROF_FED", + "PROF_PD_DET", + "PROF_POLICE", + "PROF_SWAT", + "PHEROMONE_INSECT" + ], + "order": 8500 + }, + { + "id": [ + "bio_armor_arms", + "bio_armor_legs", + "bio_armor_torso", + "bio_armor_head", + "bio_armor_eyes" + ], + "order": 500 + } + ] + } +] +``` + +## `id` + +(string) + +The internal ID of the mutation. Can be provided as a single string, or an array of strings. The +order value provided will be applied to all items in the array. + +## `order` + +(integer) + +The ordering value of the mutation overlay. Values range from 0 - 9999, 9999 being the topmost drawn +layer. Mutations that are not in any list will default to 9999. diff --git a/doc/TILESET.md b/doc/src/content/docs/en/mod/json/reference/graphics/tileset.md similarity index 82% rename from doc/TILESET.md rename to doc/src/content/docs/en/mod/json/reference/graphics/tileset.md index 0d04cddda02a..2a3202fc7998 100644 --- a/doc/TILESET.md +++ b/doc/src/content/docs/en/mod/json/reference/graphics/tileset.md @@ -1,4 +1,6 @@ -# TILESETS +--- +title: Tilesets +--- A tileset provides graphic images for the game. Each tileset has one or more tilesheets of image sprites and a `tile_config.json` file that describes how to map the contents of the sprite sheets to @@ -73,7 +75,7 @@ Each `tile_entry` JSON is a dictionary that describes how to map one or more gam more sprites. The simplest version has a single game entity, a single foreground sprite, an _optional_ background sprite, and a rotation value. For instance: -```C++ +```cpp { // this is an object and doesn't require a list "id": "mon_cat", // the game entity represented by this sprite "fg": "mon_cat_black", // some sprite name @@ -115,7 +117,7 @@ sprites to indicate they are holding that item. `"fg"` and `"bg"` can also be a list of dictionaries of weighted, randomly chosen options, any of which can also be a rotated list: -```C++ +```cpp "fg": [ { "weight": 50, "sprite": "t_dirt_brown"}, // appears in 50 of 53 tiles { "weight": 1, "sprite": "t_dirt_black_specks"}, // appears 1 in 53 tiles @@ -132,7 +134,7 @@ a list of dictionaries as above. Each `tile_entry.json` file can have a single object in it, or a list of 1 or more objects like so: -```C++ +```cpp [ { "id": "mon_zombie", "fg": "mon_zombie", "bg": "mon_zombie_bg", "rotates": false }, { "id": "corpse_mon_zombie", "fg": "mon_zombie_corpse", "bg": "mon_zombie_bg", "rotates": false }, @@ -231,34 +233,34 @@ various tile identifiers, different orientations, etc. The ordering of the overl displaying mutations can be controlled as well. The ordering can be used to override the default ordering provided in `mutation_ordering.json`. Example: -```C++ -{ // whole file is a single object - "tile_info": [ // tile_info is mandatory +```json +{ // whole file is a single object + "tile_info": [ // tile_info is mandatory { "height": 32, "width": 32, - "iso" : true, // Optional. Indicates an isometric tileset. Defaults to false. - "pixelscale" : 2 // Optional. Sets a multiplier for resizing a tileset. Defaults to 1. + "iso": true, // Optional. Indicates an isometric tileset. Defaults to false. + "pixelscale": 2 // Optional. Sets a multiplier for resizing a tileset. Defaults to 1. } ], - "tiles-new": [ // tiles-new is an array of sprite sheets - { // alternately, just one "tiles" array - "file": "tiles.png", // file containing sprites in a grid - "tiles": [ // array with one entry per tile + "tiles-new": [ // tiles-new is an array of sprite sheets + { // alternately, just one "tiles" array + "file": "tiles.png", // file containing sprites in a grid + "tiles": [ // array with one entry per tile { - "id": "10mm", // id is how the game maps things to sprites - "fg": 1, // lack of prefix mostly indicates items - "bg": 632, // fg and bg can be sprite indexes in the image + "id": "10mm", // id is how the game maps things to sprites + "fg": 1, // lack of prefix mostly indicates items + "bg": 632, // fg and bg can be sprite indexes in the image "rotates": false }, { - "id": "t_wall", // "t_" indicates terrain - "fg": [2918, 2919, 2918, 2919], // 2 or 4 sprite numbers indicates pre-rotated + "id": "t_wall", // "t_" indicates terrain + "fg": [2918, 2919, 2918, 2919], // 2 or 4 sprite numbers indicates pre-rotated "bg": 633, "rotates": true, "multitile": true, - "additional_tiles": [ // connected/combined versions of sprite - { // or variations, see below + "additional_tiles": [ // connected/combined versions of sprite + { // or variations, see below "id": "center", "fg": [2919, 2918, 2919, 2918] }, @@ -281,14 +283,14 @@ ordering provided in `mutation_ordering.json`. Example: ] }, { - "id": "vp_atomic_lamp", // "vp_" vehicle part + "id": "vp_atomic_lamp", // "vp_" vehicle part "fg": 3019, "bg": 632, "rotates": false, "multitile": true, "additional_tiles": [ { - "id": "broken", // variant sprite + "id": "broken", // variant sprite "fg": 3021 } ] @@ -297,45 +299,45 @@ ordering provided in `mutation_ordering.json`. Example: "id": "t_dirt", "rotates": false, "fg": [ - { "weight":50, "sprite":640}, // weighted random variants - { "weight":1, "sprite":3620}, - { "weight":1, "sprite":3621}, - { "weight":1, "sprite":3622} + { "weight": 50, "sprite": 640 }, // weighted random variants + { "weight": 1, "sprite": 3620 }, + { "weight": 1, "sprite": 3621 }, + { "weight": 1, "sprite": 3622 } ] }, { "id": [ - "overlay_mutation_GOURMAND", // character overlay for mutation - "overlay_mutation_male_GOURMAND", // overlay for specified gender - "overlay_mutation_active_GOURMAND" // overlay for activated mutation + "overlay_mutation_GOURMAND", // character overlay for mutation + "overlay_mutation_male_GOURMAND", // overlay for specified gender + "overlay_mutation_active_GOURMAND" // overlay for activated mutation ], "fg": 4040 } ] }, - { // second entry in tiles-new - "file": "moretiles.png", // another sprite sheet + { // second entry in tiles-new + "file": "moretiles.png", // another sprite sheet "tiles": [ { - "id": ["xxx","yyy"], // define two ids at once + "id": ["xxx", "yyy"], // define two ids at once "fg": 1, "bg": 234 } ] - }d + } ], "overlay_ordering": [ { - "id" : "WINGS_BAT", // mutation name, in a string or array of strings - "order" : 1000 // range from 0 - 9999, 9999 being the topmost layer + "id": "WINGS_BAT", // mutation name, in a string or array of strings + "order": 1000 // range from 0 - 9999, 9999 being the topmost layer }, { - "id" : [ "PLANTSKIN", "BARK" ], // mutation name, in a string or array of strings - "order" : 3500 // order is applied to all items in the array + "id": ["PLANTSKIN", "BARK"], // mutation name, in a string or array of strings + "order": 3500 // order is applied to all items in the array }, { - "id" : "bio_armor_torso", // Overlay order of bionics is controlled in the same way - "order" : 500 + "id": "bio_armor_torso", // Overlay order of bionics is controlled in the same way + "order": 500 } ] } diff --git a/doc/src/content/docs/en/mod/json/reference/ingame_debugging_tools.md b/doc/src/content/docs/en/mod/json/reference/ingame_debugging_tools.md new file mode 100644 index 000000000000..a9c1e567635f --- /dev/null +++ b/doc/src/content/docs/en/mod/json/reference/ingame_debugging_tools.md @@ -0,0 +1,138 @@ +--- +title: In-game debugging tools +--- + +The game features a number of inbuilt tools that aim to aid in debugging issues and testing fixes or +new additions. + +Below are listed some major ones. + +## Debug Message + +Also known as `debugmsg`, or "Red text over black screen". Shows up when the game encounters an +error in data files or an inconsistency within its internal state. + +![image](https://user-images.githubusercontent.com/60584843/192118702-a214bdeb-6376-463d-88cd-2e17b89c4eeb.png) + +Severity varies, from harmless, pedantic warnings to unrecoverable crashes. A copy of each message +is saved in the [debug log](#debug-log), usually prepended with backtrace that describes where (in +the code) the error originated from. + +You can press `space` to dismiss the message, or `i` to dismiss the message and all its subsequent +occurences until game restart. + +You can suppress (at your own risk) all debug messages by running the game executable with +`--dont-debugmsg` command line option. + +In code, you can invoke a debug message like this: + +```cpp +#include "debug.h" // See this header for details + . . . +// 1st argument is a format string, see `string_formatter.h` for details +debugmsg( "Failed to open file, code %d", 123 ); +``` + +## Debug log + +Debug log contains various status messages produced by the game, including general info, warnings or +hard errors. It's usually the go-to place for initial diagnostic of most bugs. + +It's contained in a single file named `debug.log` which is located in user's `config` folder. + +You can manually control debug log verbosity in game options (`Options` -> `Debug` tab -> `Logging` +submenu). + +![image](https://user-images.githubusercontent.com/60584843/192119510-adeb2df9-6698-452d-b68a-d329c3a71024.png) + +In code, you can print to the log like this: + +```cpp +#include "debug.h" // See this header for details + . . . +// 1st argument is severity level, 2nd argument is category +// Don't append a newline at the end, it will be done automatically. +DebugLogFL( DL::Info, DC::Map ) << "My " << "logged" << " info!"; +``` + +## Crash log + +Crash log contains backtrace after game crash. It's extremely helpful for solving crashes, as it +essentially holds the info about what code (and where) experienced the crash. + +It's contained in a single file named `crash.log` which is located in user's `config` folder. + +Sometimes, if crash is "weird" enough, or the executable was compiled without backtrace support, +crash log is not generated. + +In code, you don't have to add any special logic for crash traces, but the build must have +backtraces enabled. Some builds also support optional `libbacktace` that may make the backtraces +more readable. If it takes a long time (up to half a minute) to generate backtraces on Linux, +consider compiling with `clang++` instead of `g++`. + +## Debug mode + +Not to be confused with [debug menu](#debug-menu), debug mode makes the game produce a lot of noisy +messages in the log, and enables additional functionality in some UI windows. + +For example, additional info such as item id, tags and charges will be shown when examining an item, +and vehicle details menu will show pivot point, center of mass and cursor position (in vehicle +coords). + +Debug messages are mostly pertaining to vehicle, effect, sound and NPC processing. + +![image](https://user-images.githubusercontent.com/60584843/192119060-c8257774-dcc5-4826-af1b-bc59898cdc7f.png) +![image](https://user-images.githubusercontent.com/60584843/192119544-84bb03c7-8a01-4c7d-9024-b8a540f337dc.png) + +To access debug mode switch, bind `Toggle Debug Mode` action to some key while in "default" mode +(terrain view with character in the center who you control). Reminder: you can access keybinds list +by pressing `?`. + +In code, you can check for debug mode via `debug_mode` variable found in `cached_options.h`. + +## Debug menu + +Also known as "cheat menu", not to be confused with [debug mode](#debug-mode). The best friend when +it comes to testing. + +![image](https://user-images.githubusercontent.com/60584843/192119123-5aa81c1d-95c5-43ae-8b62-c2e494ead1a1.png) + +It's hidden by default. To access it, bind `Debug Menu` action to any key (backtick key \` is the +usual choice), and then either press that key, or select `Debug Menu` entry from `Esc` menu. + +Most of the functionality there is clearly labeled and split into categories, feel free to explore. + +There's a somewhat hidden feature called "Debug Mutations", which resembles cheat codes in older +games and grants your character immunity to some game mechanics. To quickly access them, press +`p`(Player)->`u`(Mutate)->`/`(Filter) and enter `Debug` in the search box. + +## Additional JSON checks + +It's possible to enable additional JSON data checks, mostly useful for content makers. The list +includes, but not limited to, the following: + +1. Unused fields, such as caused by a typo in JSON or a deprecated field being removed from the + game. +2. Deprecation warnings and migration advice. +3. Checks for potential weird behavior. + +Old or infrequently maintained mods may trigger hundreds of these, so the option is disabled by +default. You can enable it in game options (`Options` -> `Debug` tab -> +`Report unused JSON fields`). + +If you'd like to propose your changes to BN, keep in mind that both the testing executable +`tests/cata_test[.exe]` and automated PR checks in the repository are run with this option +**enabled**. + +TODO: rename the option to imply all listed checks, maybe also enable it by default. + +![image](https://user-images.githubusercontent.com/60584843/192119882-5c45ed88-2dee-495a-8457-c767dbe2d53d.png) + +## Tileset reload and report + +Useful for tileset makers, this feature reloads the active tileset from disk, redraws the screen and +writes completeness report to the [debug log](#debug-log). + +To use the feature, you'll have to bind `Reload Tileset` action to any key and press it. + +![image](https://user-images.githubusercontent.com/60584843/192119479-cba0d733-af66-4ae0-94d9-5af33b13cfe3.png) diff --git a/doc/ITEM_SPAWN.md b/doc/src/content/docs/en/mod/json/reference/items/item_spawn.md similarity index 96% rename from doc/ITEM_SPAWN.md rename to doc/src/content/docs/en/mod/json/reference/items/item_spawn.md index a38cc53e337e..310f290a5850 100644 --- a/doc/ITEM_SPAWN.md +++ b/doc/src/content/docs/en/mod/json/reference/items/item_spawn.md @@ -1,4 +1,6 @@ -# Item spawn system +--- +title: Item spawn system +--- ## Collection or Distribution @@ -213,10 +215,9 @@ not refer to that group as it has no visible id (it has an unspecific/random id most useful when the group is very specific to the place it is used and wont ever appear anywhere else. -As an example: monster death drops (`death_drops` entry in the `MONSTER` object, see -[JSON_INFO.md](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/JSON_INFO.md)) can do -this. If the monster is very specific (e.g. a special robot, a unique endgame monster), the item -spawned upon its death won't (in that form) appear in any other group. +As an example: monster death drops (`death_drops` entry in the `MONSTER` object, check +[here](../json_info)) can do this. If the monster is very specific (e.g. a special robot, a unique +endgame monster), the item spawned upon its death won't (in that form) appear in any other group. Therefore, this snippet: diff --git a/doc/JSON_INHERITANCE.md b/doc/src/content/docs/en/mod/json/reference/items/json_inheritance.md similarity index 73% rename from doc/JSON_INHERITANCE.md rename to doc/src/content/docs/en/mod/json/reference/items/json_inheritance.md index 4cc6919492a7..55c2b4193962 100644 --- a/doc/JSON_INHERITANCE.md +++ b/doc/src/content/docs/en/mod/json/reference/items/json_inheritance.md @@ -1,13 +1,38 @@ -# JSON Inheritance +--- +title: JSON Inheritance +--- To reduce duplication in the JSON data it is possible for some types to inherit from an existing type. +## Properties + +### `abstract` + +Creates an abstract item (an item that does not end up in the game and solely exists in the json to +be copied-from). Use this _instead of_ `"id"`. + +### `copy-from` + +The identifier of the item you wish to copy properties from. This allows you to make an exact copy +of an item **of the same type** and only provide entries that should change from the item you copied +from. + +### `extends` + +Modders can add an `"extends"` field to their definition to append entries to a list instead of +overriding the entire list. + +### `delete` + +Modders can also add a `"delete"` field that removes elements from lists instead of overriding the +entire list. + ## Examples In the following condensed example `556` ammo is derived from `223` ammo via `copy-from`: -``` +```json "id": "556", "copy-from": "223", "type": "AMMO", @@ -41,7 +66,7 @@ The following rules apply to the above example: Reloaded ammo is derived from the factory equivalent but with a 10% penalty to `damage` and `dispersion` and a chance to misfire: -``` +```json "id": "reloaded_556", "copy-from": "556", "type": "AMMO", @@ -69,7 +94,7 @@ It is possible to define an `abstract` type that exists only for other types to cannot itself be used in game. In the following condensed example `magazine_belt` provides values common to all implemented ammo belts: -``` +```json "abstract": "magazine_belt", "type": "MAGAZINE", "name": "Ammo belt", @@ -93,33 +118,31 @@ Missing optional fields are set to the usual defaults for that type The following types currently support inheritance: -``` -GENERIC -AMMO -GUN -GUNMOD -MAGAZINE -TOOL (but not TOOL_ARMOR) -COMESTIBLE -BOOK -ENGINE -``` +- GENERIC +- AMMO +- GUN +- GUNMOD +- MAGAZINE +- TOOL (but not TOOL_ARMOR) +- COMESTIBLE +- BOOK +- ENGINE To find out if a types supports copy-from, you need to know if it has implemented generic_factory. To find out if this is the case, do the following: -- Open [init.cpp](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/src/init.cpp) +- Open [init.cpp](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/src/init.cpp) - Find the line that mentions your type, for example `add( "gate", &gates::load );` - Copy the load function, in this case it would be _gates::load_ - Use this in - [the search bar on github](https://github.com/CleverRaven/Cataclysm-DDA/search?q=%22gates%3A%3Aload%22&unscoped_q=%22gates%3A%3Aload%22&type=Code) + [the search bar on github](https://github.com/cataclysmbnteam/Cataclysm-BN/search?q=%22gates%3A%3Aload%22&unscoped_q=%22gates%3A%3Aload%22&type=Code) to find the file that contains _gates::load_ - In the search results you find - [gates.cpp](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/src/gates.cpp). open it. + [gates.cpp](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/src/gates.cpp). open it. - In gates.cpp, find the generic_factory line, it looks like this: `generic_factory gates_data( "gate type", "handle", "other_handles" );` - Since the generic_factory line is present, you can now conclude that it supports copy-from. - If you don't find generic_factoy present, it does not support copy-from, as is the case for type vitamin (repeat the above steps and find that - [vitamin.cpp](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/src/vitamin.cpp) does not - contain generic_factoy) + [vitamin.cpp](https://github.com/cataclysmbnteam/Cataclysm-BN/tree/upload/src/vitamin.cpp) does + not contain generic_factoy) diff --git a/doc/RELICS.md b/doc/src/content/docs/en/mod/json/reference/items/relics.md similarity index 77% rename from doc/RELICS.md rename to doc/src/content/docs/en/mod/json/reference/items/relics.md index b2ffb54f3397..742d1ca98cc6 100644 --- a/doc/RELICS.md +++ b/doc/src/content/docs/en/mod/json/reference/items/relics.md @@ -1,7 +1,6 @@ -- [Relics](#relics) - - [Relic recharge](#relic-recharge) - - [Recharge type](#recharge-type) - - [Recharge requirements](#recharge-requirements) +--- +title: Relics +--- # Relics @@ -12,7 +11,7 @@ whenever the item is spawned a copy of relic data is attached to the item instan Relic data object can contain the following fields: -```c++ +```json { "name": "Boots of Haste", // Overrides default item name "moves": 100, // (optional) Activation move cost (default 100) @@ -28,17 +27,17 @@ Relic data object can contain the following fields: Relics can recharge under certain conditions. Recharge method is defined as follows (all fields optional): -```c++ +```json { -"type": "time", // Defines what resource is consumed. Default: time -"req": "none", // Defines under what conditions recharge works. Default: none (no special requirements) -"field": "fd_blood", // Field type to be consumed with 'field' recharge type -"trap": "tr_portal", // Trap type to be consumed with 'trap' recharge type -"interval": "5 minutes", // Interval at which the recharge check is done. Default: 1 second -"int_min": 1, // Min intensity of related 'type' effect. Default: 0 -"int_min": 5, // Max intensity of related 'type' effect. Default: 0 -"rate": 2, // Amount of charges restored when recharge operation succeeds. Default: 0 -"message": "Your body decays!", // Optional message to print on success + "type": "time", // Defines what resource is consumed. Default: time + "req": "none", // Defines under what conditions recharge works. Default: none (no special requirements) + "field": "fd_blood", // Field type to be consumed with 'field' recharge type + "trap": "tr_portal", // Trap type to be consumed with 'trap' recharge type + "interval": "5 minutes", // Interval at which the recharge check is done. Default: 1 second + "int_min": 1, // Min intensity of related 'type' effect. Default: 0 + "int_min": 5, // Max intensity of related 'type' effect. Default: 0 + "rate": 2, // Amount of charges restored when recharge operation succeeds. Default: 0 + "message": "Your body decays!" // Optional message to print on success } ``` diff --git a/doc/VITAMIN.md b/doc/src/content/docs/en/mod/json/reference/items/vitamin.md similarity index 98% rename from doc/VITAMIN.md rename to doc/src/content/docs/en/mod/json/reference/items/vitamin.md index 363522a34b34..2239c1a73ed2 100644 --- a/doc/VITAMIN.md +++ b/doc/src/content/docs/en/mod/json/reference/items/vitamin.md @@ -1,8 +1,10 @@ -# vitamin +--- +title: vitamin +--- ## definition -```JSON +```json { "id": "iron", "type": "vitamin", diff --git a/doc/JSON_FLAGS.md b/doc/src/content/docs/en/mod/json/reference/json_flags.md similarity index 97% rename from doc/JSON_FLAGS.md rename to doc/src/content/docs/en/mod/json/reference/json_flags.md index 719955c97bbc..1e0febf26281 100644 --- a/doc/JSON_FLAGS.md +++ b/doc/src/content/docs/en/mod/json/reference/json_flags.md @@ -1,77 +1,6 @@ -# JSON Flags - -- [JSON Flags](#json-flags) - - [Notes](#notes) - - [Inheritance](#inheritance) - - [TODO](#todo) - - [Ammo](#ammo) - - [Ammo type](#ammo-type) - - [Effects](#effects) - - [Armor](#armor) - - [Covers](#covers) - - [Flags](#flags) - - [Bionics](#bionics) - - [Books](#books) - - [Use actions](#use-actions) - - [Comestibles](#comestibles) - - [Comestible type](#comestible-type) - - [Addiction type](#addiction-type) - - [Use action](#use-action) - - [Flags](#flags-1) - - [Furniture and Terrain](#furniture-and-terrain) - - [Flags](#flags-2) - - [Examine Actions](#examine-actions) - - [Fungal Conversions Only](#fungal-conversions-only) - - [Furniture Only](#furniture-only) - - [Generic](#generic) - - [Flags](#flags-3) - - [Guns](#guns) - - [Firing modes](#firing-modes) - - [Faults](#faults) - - [Flags](#flags-4) - - [Parameters](#parameters) - - [Magazines](#magazines) - - [MAP SPECIALS](#map-specials) - - [Material Phases](#material-phases) - - [Melee](#melee) - - [Flags](#flags-5) - - [Monster Groups](#monster-groups) - - [Seasons](#seasons) - - [Time of day](#time-of-day) - - [Monsters](#monsters) - - [Anger, Fear and Placation Triggers](#anger-fear-and-placation-triggers) - - [Categories](#categories) - - [Death Functions](#death-functions) - - [Flags](#flags-6) - - [Monster Defense and Attacks](#monster-defense-and-attacks) - - [Sizes](#sizes) - - [Special attacks](#special-attacks) - - [Mutations](#mutations) - - [Flags](#flags-7) - - [Categories](#categories-1) - - [Overmap](#overmap) - - [Overmap connections](#overmap-connections) - - [Overmap specials](#overmap-specials) - - [Flags](#flags-8) - - [Overmap terrains](#overmap-terrains) - - [Flags](#flags-9) - - [Recipes](#recipes) - - [Categories](#categories-2) - - [Flags](#flags-10) - - [Scenarios](#scenarios) - - [Flags](#flags-11) - - [Season Flags](#season-flags) - - [Skills](#skills) - - [Tags](#tags) - - [Techniques](#techniques) - - [WBLOCK_X](#wblock-x) - - [Tools](#tools) - - [Flags](#flags-12) - - [Flags that apply to items](#flags-that-apply-to-items) - - [Vehicle Parts](#vehicle-parts) - - [Flags](#flags-13) - - [Vehicle parts requiring other vehicle parts](#vehicle-parts-requiring-other-vehicle-parts) - - [Fuel types](#fuel-types) +--- +title: JSON Flags +--- ## Notes @@ -498,7 +427,7 @@ to find which flags work elsewhere. - `MARLOSS` "As you eat the berry, you have a near-religious experience, feeling at one with your surroundings..." - `METH` Adds disease `meth` -- `NONE` "You can't do anything of interest with your [x]." +- `NONE` "You can't do anything of interest with your `[x]`." - `PKILL` Reduces pain. Adds disease `pkill[n]` where `[n]` is the level of flag `PKILL_[n]` used on this comestible. - `PLANTBLECH` Causes vomiting if player does not contain plant mutations diff --git a/doc/JSON_INFO.md b/doc/src/content/docs/en/mod/json/reference/json_info.md similarity index 80% rename from doc/JSON_INFO.md rename to doc/src/content/docs/en/mod/json/reference/json_info.md index 548f4a27f94c..ff94fa17f63a 100644 --- a/doc/JSON_INFO.md +++ b/doc/src/content/docs/en/mod/json/reference/json_info.md @@ -1,189 +1,25 @@ -# JSON INFO - -Use the `Home` key to return to the top. - -- [Introduction](#introduction) -- [Navigating the JSON](#navigating-the-json) -- [File descriptions](#file-descriptions) - - [`data/json/`](#datajson) - - [`data/json/items/`](#datajsonitems) - - [`data/json/items/comestibles`](#datajsonitemscomestibles) - - [`data/json/requirements/`](#datajsonrequirements) - - [`data/json/vehicles/`](#datajsonvehicles) -- [Generic properties and formatting](#generic-properties-and-formatting) - - [Generic properties](#generic-properties) - - [Formatting](#formatting) - - [Time duration](#time-duration) - - [Other formatting](#other-formatting) -- [Description and content of each JSON file](#description-and-content-of-each-json-file) - - [`data/json/` JSONs](#datajson-jsons) - - [Ascii_arts](#ascii_arts) - - [Body_parts](#body_parts) - - [Bionics](#bionics) - - [Dreams](#dreams) - - [Disease](#disease_type) - - [Item Groups](#item-groups) - - [Item Category](#item-category) - - [Materials](#materials) - - [Monster Groups](#monster-groups) - - [Group definition](#group-definition) - - [Monster definition](#monster-definition) - - [Monster Factions](#monster-factions) - - [Monsters](#monsters) - - [Names](#names) - - [Profession item substitution](#profession-item-substitution) - - [`description`](#-description-) - - [`name`](#-name-) - - [`points`](#-points-) - - [`addictions`](#-addictions-) - - [`skills`](#-skills-) - - [`items`](#-items-) - - [`pet`](#-pet-) - - [`flags`](#-flags-) - - [`cbms`](#-cbms-) - - [`traits`](#-traits-) - - [Recipes](#recipes) - - [Constructions](#constructions) - - [Construction groups](#construction-groups) - - [Construction sequences](#construction-sequences) - - [Scent Types](#scent_types) - - [Scores and Achievements](#scores-and-achievements) - - [`event_transformation`](#event_transformation) - - [`event_statistic`](#event_statistic) - - [`score`](#score) - - [`achievement`](#achievement) - - [Skills](#skills) - - [Traits/Mutations](#traits-mutations) - - [Vehicle Groups](#vehicle-groups) - - [Vehicle Parts](#vehicle-parts) - - [Part Resistance](#part-resistance) - - [Vehicle Placement](#vehicle-placement) - - [Vehicle Spawn](#vehicle-spawn) - - [Vehicles](#vehicles) -- [`data/json/items/` JSONs](#datajsonitems-jsons) - - [Generic Items](#generic-items) - - [Ammo](#ammo) - - [Magazine](#magazine) - - [Armor](#armor) - - [Pet Armor](#pet-armor) - - [Books](#books) - - [Color Key](#color-key) - - [Comestibles](#comestibles) - - [Containers](#containers) - - [Melee](#melee) - - [`Melee Weapon_category`](#melee-weapon_category) - - [Gun](#gun) - - [`Ranged Weapon_category`](#ranged-weapon_category) - - [Gunmod](#gunmod) - - [Batteries](#batteries) - - [Tools](#tools) - - [Seed Data](#seed-data) - - [Brewing Data](#brewing-data) - - [Relic Data](#relic-data) - - [Artifact Data](#artifact-data) - - [`Effects_carried`](#effects-carried) - - [`effects_worn`](#effects-worn) - - [`effects_wielded`](#effects-wielded) - - [`effects_activated`](#effects-activated) - - [Software Data](#software-data) - - [Fuel data](#fuel-data) - - [Use Actions](#use-actions) -- [`json/` JSONs](#json-jsons) - - [Harvest](#harvest) - - [`id`](#-id-) - - [`type`](#-type-) - - [`message`](#-message-) - - [`entries`](#-entries-) - - [Furniture](#furniture) - - [`type`](#-type--1) - - [`move_cost_mod`](#-move-cost-mod-) - - [`light_emitted`](#-light-emitted-) - - [`required_str`](#-required-str-) - - [`crafting_pseudo_item`](#-crafting-pseudo-item-) - - [`workbench`](#-workbench-) - - [`plant_data`](#-plant-data-) - - [Terrain](#terrain) - - [`type`](#-type--2) - - [`move_cost`](#-move-cost-) - - [`light_emitted`](#-light-emitted--1) - - [`trap`](#-trap-) - - [`harvestable`](#-harvestable-) - - [`transforms_into`](#-transforms-into-) - - [`harvest_season`](#-harvest-season-) - - [`roof`](#-roof-) - - [Common To Furniture And Terrain](#common-to-furniture-and-terrain) - - [`id`](#-id--1) - - [`name`](#-name--1) - - [`flags`](#-flags--1) - - [`connects_to`](#-connects-to-) - - [`symbol`](#-symbol-) - - [`looks_like`](#-looks-like-) - - [`color` or `bgcolor`](#-color--or--bgcolor-) - - [`max_volume`](#-max-volume-) - - [`examine_action`](#-examine-action-) - - [`close" And "open`](#-close--and--open-) - - [`bash`](#-bash-) - - [`deconstruct`](#-deconstruct-) - - [`pry`](#-pry-) - - [`map_bash_info`](#-map-bash-info-) - - [`str_min`, `str_max`, `str_min_blocked`, `str_max_blocked`, `str_min_supported`, `str_max_supported`](#-str-min----str-max----str-min-blocked----str-max-blocked----str-min-supported----str-max-supported-) - - [`sound`, `sound_fail`, `sound_vol`, `sound_fail_vol`](#-sound----sound-fail----sound-vol----sound-fail-vol-) - - [`furn_set`, `ter_set`](#-furn-set----ter-set-) - - [`explosive`](#-explosive-) - - [`destroy_only`](#-destroy-only-) - - [`bash_below`](#-bash-below-) - - [`tent_centers`, `collapse_radius`](#-tent-centers----collapse-radius-) - - [`items`](#-items--1) - - [`map_deconstruct_info`](#-map-deconstruct-info-) - - [`furn_set`, `ter_set`](#-furn-set----ter-set--1) - - [`items`](#-items-2) - - [`prying_result`](#-prying-result-) - - [`new_ter_type`, `new_furn_type`](#-new-furn-type----new-ter-type-) - - [`success_message`, `fail_message`, `break_message`](#-success-message----fail-message----break-message-) - - [`pry_quality`, `pry_bonus_mult`, `difficulty`](#-pry-quality----pry-bonus-mult----difficulty-) - - [`noise`, `break_noise`, `sound`, `break_sound`](#-noise----break-noise----sound----break-sound-) - - [`breakable`, `break_ter_type`, `break_furn_type`](#-breakable----break-ter-type----break-furn-type-) - - [`break_items`](#-break-items-) - - [`plant_data`](#plant_data-1) - - [`transform`](#-transform-) - - [`base`](#-base-) - - [`growth_multiplier`](#-growth-multiplier-) - - [`harvest_multiplier`](#-harvest-multiplier-) - - [clothing_mod](#clothing_mod) -- [Scenarios](#scenarios) - - [`description`](#-description--1) - - [`name`](#-name--2) - - [`points`](#-points--1) - - [`items`](#-items--3) - - [`flags`](#-flags--2) - - [`cbms`](#-cbms--1) - - [`traits", "forced_traits", "forbidden_traits`](#-traits----forced-traits----forbidden-traits-) - - [`allowed_locs`](#-allowed-locs-) - - [`start_name`](#-start-name-) - - [`professions`](#-professions-) - - [`map_special`](#-map-special-) - - [`missions`](#-missions-) -- [Starting locations](#starting-locations) - - [`name`](#-name--3) - - [`target`](#-target-) - - [`flags`](#-flags--3) - - [`tile_config`](#-tile-config-) -- [Mutation overlay ordering](#mutation-overlay-ordering) - - [`id`](#-id--2) - - [`order`](#-order-) -- [MOD_INFO](#mod_info) -- [MOD tileset](#mod-tileset) - - [`compatibility`](#-compatibility-) - - [`tiles-new`](#-tiles-new-) -- [Field types](#-field-types-) - -# Introduction +--- +title: JSON INFO +--- + +:::note + +This document is being split into multiple pages. + +::: + +:::danger + +Many of the JSON files are not documented yet or is outdated. Check relevent source files to be +sure. + +::: This document describes the contents of the json files used in Cataclysm: Dark days ahead. You are probably reading this if you want to add or change content of Catacysm: Dark days ahead and need to learn more about what to find where and what each file and property does. -# Navigating the JSON +## Navigating the JSON A lot of the JSON involves cross-references to other JSON entities. To make it easier to navigate, we provide a script `tools/json_tools/cddatags.py` that can build a `tags` file for you. @@ -197,169 +33,16 @@ that's working you should be able to easily jump to the definition of any entity positioning your cursor over an id and hitting the appropriate key combination. - In Vim, this feature exists by default, and you can jump to a definition using - [`^]`](http://vimdoc.sourceforge.net/htmldoc/tagsrch.html#tagsrch.txt). + [`^\]`](http://vimdoc.sourceforge.net/htmldoc/tagsrch.html#tagsrch.txt). - In Notepad++ go to "Plugins" -> "Plugins Admin" and enable the "TagLEET" plugin. Then select any id and press Alt+Space to open the references window. -# File descriptions - -Here's a quick summary of what each of the JSON files contain, broken down by folder. This list is -not comprehensive, but covers the broad strokes. - -## `data/json/` - -| Filename | Description | -| -------------------------- | --------------------------------------------------------------------- | -| achievements.json | achievements | -| anatomy.json | a listing of player body parts - do not edit | -| ascii_arts.json | ascii arts for item descriptions | -| bionics.json | bionics, does NOT include bionic effects | -| body_parts.json | an expansion of anatomy.json - do not edit | -| clothing_mods.json | definition of clothing mods | -| construction.json | definition of construction menu tasks | -| default_blacklist.json | a standard blacklist of joke monsters | -| doll_speech.json | talk doll speech messages | -| dreams.json | dream text and linked mutation categories | -| disease.json | disease definitions | -| effects.json | common effects and their effects | -| emit.json | smoke and gas emissions | -| flags.json | common flags and their descriptions | -| furniture.json | furniture, and features treated like furniture | -| game_balance.json | various options to tweak game balance | -| gates.json | gate terrain definitions | -| harvest.json | item drops for butchering corpses | -| health_msgs.json | messages displayed when the player wakes | -| item_actions.json | descriptions of standard item actions | -| item_category.json | item categories and their default sort | -| item_groups.json | item spawn groups | -| lab_notes.json | lab computer messages | -| martialarts.json | martial arts styles and buffs | -| materials.json | material types | -| monster_attacks.json | monster attacks | -| monster_drops.json | monster item drops on death | -| monster_factions.json | monster factions | -| monstergroups.json | monster spawn groups | -| monstergroups_egg.json | monster spawn groups from eggs | -| monsters.json | monster descriptions, mostly zombies | -| morale_types.json | morale modifier messages | -| mutation_category.json | messages for mutation categories | -| mutation_ordering.json | draw order for mutation and CBM overlays in tiles mode | -| mutations.json | traits/mutations | -| names.json | names used for NPC/player name generation | -| overmap_connections.json | connections for roads and tunnels in the overmap | -| overmap_terrain.json | overmap terrain | -| player_activities.json | player activities | -| professions.json | profession definitions | -| recipes.json | crafting/disassembly recipes | -| regional_map_settings.json | settings for the entire map generation | -| road_vehicles.json | vehicle spawn information for roads | -| rotatable_symbols.json | rotatable symbols - do not edit | -| scent_types.json | type of scent available | -| scores.json | scores | -| skills.json | skill descriptions and ID's | -| snippets.json | flier/poster descriptions | -| species.json | monster species | -| speech.json | monster vocalizations | -| statistics.json | statistics and transformations used to define scores and achievements | -| start_locations.json | starting locations for scenarios | -| techniques.json | generic for items and martial arts | -| terrain.json | terrain types and definitions | -| test_regions.json | test regions | -| tips.json | tips of the day | -| tool_qualities.json | standard tool qualities and their actions | -| traps.json | standard traps | -| tutorial.json | messages for the tutorial (that is out of date) | -| vehicle_groups.json | vehicle spawn groups | -| vehicle_parts.json | vehicle parts, does NOT affect flag effects | -| vitamin.json | vitamins and their deficiencies | - -selected subfolders - -## `data/json/items/` - -See below for specifics on the various items - -| Filename | Description | -| ---------------------------- | ------------------------------------------------------------------ | -| ammo.json | common base components like batteries and marbles | -| ammo_types.json | standard ammo types by gun | -| archery.json | bows and arrows | -| armor.json | armor and clothing | -| bionics.json | Compact Bionic Modules (CBMs) | -| biosignatures.json | animal waste | -| books.json | books | -| chemicals_and_resources.json | chemical precursors | -| comestibles.json | food/drinks | -| containers.json | containers | -| crossbows.json | crossbows and bolts | -| fake.json | fake items for bionics or mutations | -| fuel.json | liquid fuels | -| grenades.json | grenades and throwable explosives | -| handloaded_bullets.json | random ammo | -| melee.json | anything that doesn't go in the other item jsons, melee weapons | -| migration.json | conversions of non-existent items from save games to current items | -| newspaper.json | flyers, newspapers, and survivor notes. snippets.json for messages | -| obsolete.json | items being removed from the game | -| ranged.json | guns | -| software.json | software for SD-cards and USB sticks | -| tool_armor.json | clothes and armor that can be (a)ctivated | -| toolmod.json | modifications of tools | -| tools.json | tools and items that can be (a)ctivated | -| vehicle_parts.json | components of vehicles when they aren't on the vehicle | - -### `data/json/items/comestibles` - -## `data/json/requirements/` - -Standard components and tools for crafting - -| Filename | Description | -| ------------------------- | ----------------------------------------- | -| ammo.json | ammo components | -| cooking_components.json | common ingredient sets | -| cooking_requirements.json | cooking tools and heat sources | -| materials.json | thread, fabric, and other basic materials | -| toolsets.json | sets of tools commonly used together | -| uncraft.json | common results of taking stuff apart | -| vehicle.json | tools to work on vehicles | - -## `data/json/vehicles/` - -Groups of vehicle definitions with self-explanatory names of files: - -| Filename | -| -------------------- | -| bikes.json | -| boats.json | -| cars.json | -| carts.json | -| custom_vehicles.json | -| emergency.json | -| farm.json | -| helicopters.json | -| military.json | -| trains.json | -| trucks.json | -| utility.json | -| vans_busses.json | -| vehicles.json | - -# Generic properties and formatting - -This section describes properties and formatting applied to all of the JSON files. - -## Generic properties - -A few properties are applicable to most if not all json files and do not need to be described for -each json file. These properties are: - -| Identifier | Description | -| --------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| type | The type of object this json entry is describing. Setting this entry to 'armor' for example means the game will expect properties specific to armor in that entry. Also ties in with 'copy-from' (see below), if you want to inherit properties of another object, it must be of the same tipe. | -| [copy-from](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/doc/JSON_INHERITANCE.md) | The identifier of the item you wish to copy properties from. This allows you to make an exact copy of an item **of the same type** and only provide entries that should change from the item you copied from. | -| [extends](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/doc/JSON_INHERITANCE.md) | Modders can add an "extends" field to their definition to append entries to a list instead of overriding the entire list. | -| [delete](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/doc/JSON_INHERITANCE.md) | Modders can also add a "delete" field that removes elements from lists instead of overriding the entire list. | -| [abstract](https://github.com/CleverRaven/Cataclysm-DDA/tree/master/doc/JSON_INHERITANCE.md) | Creates an abstract item (an item that does not end up in the game and solely exists in the json to be copied-from. Use this _instead of_ 'id'. | +## The `type` Property + +Entries are distinguished by their `type` property. This property is mandatory for all entries. +Setting this entry to 'armor' for example means the game will expect properties specific to armor in +that entry. Also ties in with [`copy-from`](./items/json_inheritance.md#copy-from), if you want to +[inherit properties of another object](./items/json_inheritance.md), it must be of the same tipe. ## Formatting @@ -382,7 +65,7 @@ Examples: ### Other formatting -```C++ +```json "//" : "comment", // Preferred method of leaving comments inside json files. ``` @@ -391,31 +74,29 @@ exact extraction is handled in `lang/extract_json_strings.py`. Apart from the ob a string without translation context, the string can also have an optional translation context (and sometimes a plural form), by writing it like: -```JSON +```json "name": { "ctxt": "foo", "str": "bar", "str_pl": "baz" } ``` or, if the plural form is the same as the singular form: -```JSON +```json "name": { "ctxt": "foo", "str_sp": "foo" } ``` You can also add comments for translators by adding a "//~" entry like below. The order of the entries does not matter. -```JSON +```json "name": { "//~": "as in 'foobar'", "str": "bar" } ``` -Currently, only some JSON values support this syntax (see -[here](https://github.com/CleverRaven/Cataclysm-DDA/blob/master/doc/TRANSLATING.md#translation) for -a list of supported values and more detailed explanation). +[Currently, only some JSON values support this syntax](../../../i18n/reference/translation#supported-json-values). -# Description and content of each JSON file +## Description and content of each JSON file This section describes each json file and their contents. Each json has their own unique properties that are not shared with other Json files (for example 'chapters' property used in books does not @@ -431,7 +112,7 @@ the appropriate JSON file. | id | Unique ID. Must be one continuous word, use underscores if necessary. | | picture | Array of string, each entry is a line of an ascii picture and must be at most 42 columns long. | -```C++ +```json { "type": "ascii_art", "id": "cashcard", @@ -479,7 +160,7 @@ the appropriate JSON file. | squeamish_penalty | (_optional_) Mood effect of wearing filthy clothing on this part. (default: `0`) | | bionic_slots | (_optional_) How many bionic slots does this part have. | -```C++ +```json { "id": "torso", "type": "body_part", @@ -492,7 +173,7 @@ the appropriate JSON file. "main_part": "torso", "opposite_part": "torso", "hit_size": 45, - "hit_size_relative": [ 20, 33.33, 36.57 ], + "hit_size_relative": [20, 33.33, 36.57], "hit_difficulty": 1, "side": "both", "legacy_id": "TORSO", @@ -545,7 +226,7 @@ the appropriate JSON file. | learned_spells | (_optional_) List of spells (with levels) you gain when installing this CBM, and lose when you uninstall this CBM. Spell classes are automatically gained. | | fake_item | (_optional_) ID of fake item used by this bionic. Mandatory for gun and weapon bionics. | -```C++ +```json { "id" : "bio_batteries", "name" : "Battery System", @@ -588,14 +269,14 @@ item in `data/json/items/bionics.json`. Even for a faulty bionic. | category | Mutation category needed to dream. | | strength | Mutation category strength required (1 = 20-34, 2 = 35-49, 3 = 50+). | -```C++ +```json { - "messages" : [ - "You have a strange dream about birds.", - "Your dreams give you a strange feathered feeling." - ], - "category" : "MUTCAT_BIRD", - "strength" : 1 + "messages": [ + "You have a strange dream about birds.", + "Your dreams give you a strange feathered feeling." + ], + "category": "MUTCAT_BIRD", + "strength": 1 } ``` @@ -628,8 +309,8 @@ item in `data/json/items/bionics.json`. Even for a faulty bionic. ### Item Groups -Item groups have been expanded, look at [the detailed docs](ITEM_SPAWN.md) to their new description. -The syntax listed here is still valid. +Item groups have been expanded, look at [the detailed docs](./items/item_spawn.md) to their new +description. The syntax listed here is still valid. | Identifier | Description | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -637,18 +318,18 @@ The syntax listed here is still valid. | items | List of potential item ID's. Chance of an item spawning is x/T, where X is the value linked to the specific item and T is the total of all item values in a group. | | groups | ?? | -```C++ +```json { - "id":"forest", - "items":[ - ["rock", 40], - ["stick", 95], - ["mushroom", 4], - ["mushroom_poison", 3], - ["mushroom_magic", 1], - ["blueberries", 3] - ], - "groups":[] + "id": "forest", + "items": [ + ["rock", 40], + ["stick", 95], + ["mushroom", 4], + ["mushroom_poison", 3], + ["mushroom_magic", 1], + ["blueberries", 3] + ], + "groups": [] } ``` @@ -664,13 +345,13 @@ When you sort your inventory by category, these are the categories that are disp | sort_rank | Used to sort categories when displaying. Lower values are shown first | | priority_zones | When set, items in this category will be sorted to the priority zone if the conditions are met. If the user does not have the priority zone in the zone manager, the items get sorted into zone set in the 'zone' property. It is a list of objects. Each object has 3 properties: ID: The id of a LOOT_ZONE (see LOOT_ZONES.json), filthy: boolean. setting this means filthy items of this category will be sorted to the priority zone, flags: array of flags | -```C++ +```json { - "id":"armor", - "name": "ARMOR", - "zone": "LOOT_ARMOR", - "sort_rank": -21, - "priority_zones": [ { "id": "LOOT_FARMOR", "filthy": true, "flags": [ "RAINPROOF" ] } ], + "id": "armor", + "name": "ARMOR", + "zone": "LOOT_ARMOR", + "sort_rank": -21, + "priority_zones": [{ "id": "LOOT_FARMOR", "filthy": true, "flags": ["RAINPROOF"] }] } ``` @@ -707,33 +388,33 @@ When you sort your inventory by category, these are the categories that are disp There are six -resist parameters: acid, bash, chip, cut, elec, and fire. These are integer values; the default is 0 and they can be negative to take more damage. -```C++ +```json { - "type": "material", - "id": "hflesh", - "name": "Human Flesh", - "density": 5, - "specific_heat_liquid": 3.7, - "specific_heat_solid": 2.15, - "latent_heat": 260, - "edible": true, - "rotting": true, - "bash_resist": 1, - "cut_resist": 1, - "bullet_resist": 1, - "acid_resist": 1, - "fire_resist": 1, - "elec_resist": 1, - "chip_resist": 2, - "dmg_adj": [ "bruised", "mutilated", "badly mutilated", "thoroughly mutilated" ], - "bash_dmg_verb": "bruised", - "cut_dmg_verb": "sliced", - "vitamins": [ [ "calcium", 0.1 ], [ "vitB", 1 ], [ "iron", 1.3 ] ], - "burn_data": [ - { "fuel": 1, "smoke": 1, "burn": 1, "volume_per_turn": "2500_ml" }, - { "fuel": 2, "smoke": 3, "burn": 2, "volume_per_turn": "10000_ml" }, - { "fuel": 3, "smoke": 10, "burn": 3 } - ] + "type": "material", + "id": "hflesh", + "name": "Human Flesh", + "density": 5, + "specific_heat_liquid": 3.7, + "specific_heat_solid": 2.15, + "latent_heat": 260, + "edible": true, + "rotting": true, + "bash_resist": 1, + "cut_resist": 1, + "bullet_resist": 1, + "acid_resist": 1, + "fire_resist": 1, + "elec_resist": 1, + "chip_resist": 2, + "dmg_adj": ["bruised", "mutilated", "badly mutilated", "thoroughly mutilated"], + "bash_dmg_verb": "bruised", + "cut_dmg_verb": "sliced", + "vitamins": [["calcium", 0.1], ["vitB", 1], ["iron", 1.3]], + "burn_data": [ + { "fuel": 1, "smoke": 1, "burn": 1, "volume_per_turn": "2500_ml" }, + { "fuel": 2, "smoke": 3, "burn": 2, "volume_per_turn": "10000_ml" }, + { "fuel": 3, "smoke": 10, "burn": 3 } + ] } ``` @@ -761,16 +442,22 @@ the default is 0 and they can be negative to take more damage. | `starts` | (_optional_) This entry becomes active after this time. (Measured in hours) | | `ends` | (_optional_) This entry becomes inactive after this time. (Measured in hours) | -```C++ +```json { - "name" : "GROUP_ANT", - "default" : "mon_ant", - "monsters" : [ - { "monster" : "mon_ant_larva", "freq" : 40, "multiplier" : 0 }, - { "monster" : "mon_ant_soldier", "freq" : 90, "multiplier" : 5 }, - { "monster" : "mon_ant_queen", "freq" : 0, "multiplier" : 0 }, - { "monster" : "mon_thing", "freq" : 100, "multiplier" : 0, "pack_size" : [3,5], "conditions" : ["DUSK","DAWN","SUMMER"] } - ] + "name": "GROUP_ANT", + "default": "mon_ant", + "monsters": [ + { "monster": "mon_ant_larva", "freq": 40, "multiplier": 0 }, + { "monster": "mon_ant_soldier", "freq": 90, "multiplier": 5 }, + { "monster": "mon_ant_queen", "freq": 0, "multiplier": 0 }, + { + "monster": "mon_thing", + "freq": 100, + "multiplier": 0, + "pack_size": [3, 5], + "conditions": ["DUSK", "DAWN", "SUMMER"] + } + ] } ``` @@ -785,14 +472,14 @@ the default is 0 and they can be negative to take more damage. | `friendly` | Always be friendly towards this faction. By default a faction is friendly towards itself. | | `hate` | Always be hostile towards this faction. Will change target to monsters of this faction if available. | -```C++ +```json { - "name" : "cult", - "base_faction" : "zombie", - "by_mood" : ["blob"], - "neutral" : ["nether"], - "friendly" : ["blob"], - "hate" : ["fungus"] + "name": "cult", + "base_faction": "zombie", + "by_mood": ["blob"], + "neutral": ["nether"], + "friendly": ["blob"], + "hate": ["fungus"] } ``` @@ -802,7 +489,7 @@ See MONSTERS.md ### Names -```C++ +```json { "name" : "Aaliyah", "gender" : "female", "usage" : "given" }, // Name, gender, "given"/"family"/"city" (first/last/city name). // NOTE: Please refrain from adding name PR's in order to maintain kickstarter exclusivity ``` @@ -816,7 +503,7 @@ the wool allergy trait. If the JSON objects contains a "item" member, it defines a replacement for the given item, like this: -```C++ +```json { "type": "profession_item_substitutions", "item": "sunglasses", @@ -835,7 +522,7 @@ This defines each item of type "sunglasses" shall be replaced with: If the JSON objects contains a "trait" member, it defines a replacement for multiple items that applies when the character has the given trait: -````C++ +````json { "type": "profession_item_substitutions", "trait": "WOOLALLERGY", @@ -844,7 +531,7 @@ applies when the character has the given trait: { "item": "hat_hunting", "new": [ { "item": "hat_cotton", "ratio": 2 } ] } ] } -```C++ +```json This defines characters with the WOOLALLERGY trait get some items replaced: - "blazer" is converted into "jacket_leather_red", - each "hat_hunting" is converted into *two* "hat_cotton" items. @@ -853,7 +540,7 @@ This defines characters with the WOOLALLERGY trait get some items replaced: Professions are specified as JSON object with "type" member set to "profession": -```C++ +```json { "type": "profession", "id": "hunter", @@ -878,7 +565,7 @@ The in-game description. The in-game name, either one gender-neutral string, or an object with gender specific names. Example: -```C++ +```json "name": { "male": "Groom", "female": "Bride" @@ -902,7 +589,7 @@ List of starting addictions. Each entry in the list should be an object with the Example: -```C++ +```json "addictions": [ { "type": "nicotine", "intensity": 10 } ] @@ -911,17 +598,17 @@ Example: Mods can modify this list (requires `"edit-mode": "modify"`, see example) via "add:addictions" and "remove:addictions", removing requires only the addiction type. Example: -```C++ +```json { - "type": "profession", - "id": "hunter", - "edit-mode": "modify", - "remove:addictions": [ - "nicotine" - ], - "add:addictions": [ - { "type": "alcohol", "intensity": 10 } - ] + "type": "profession", + "id": "hunter", + "edit-mode": "modify", + "remove:addictions": [ + "nicotine" + ], + "add:addictions": [ + { "type": "alcohol", "intensity": 10 } + ] } ``` @@ -937,7 +624,7 @@ List of starting skills. Each entry in the list should be an object with the fol Example: -```C++ +```json "skills": [ { "name": "archery", "level": 2 } ] @@ -946,17 +633,17 @@ Example: Mods can modify this list (requires `"edit-mode": "modify"`, see example) via "add:skills" and "remove:skills", removing requires only the skill id. Example: -```C++ +```json { - "type": "profession", - "id": "hunter", - "edit-mode": "modify", - "remove:skills": [ - "archery" - ], - "add:skills": [ - { "name": "computer", "level": 2 } - ] + "type": "profession", + "id": "hunter", + "edit-mode": "modify", + "remove:skills": [ + "archery" + ], + "add:skills": [ + { "name": "computer", "level": 2 } + ] } ``` @@ -971,7 +658,7 @@ multiple times. The syntax for each of the three lists is identical. Example: -```C++ +```json "items": { "both": [ "pants", @@ -999,21 +686,21 @@ is done via "remove:both" / "remove:male" / "remove:female", which may only cont Example for mods: -```C++ +```json { - "type": "profession", - "id": "hunter", - "edit-mode": "modify", - "items": { - "remove:both": [ - "rock", - "tshirt_text" - ], - "add:both": [ "2x4" ], - "add:female": [ - ["tshirt_text", "allyourbase"] - ] - } + "type": "profession", + "id": "hunter", + "edit-mode": "modify", + "items": { + "remove:both": [ + "rock", + "tshirt_text" + ], + "add:both": ["2x4"], + "add:female": [ + ["tshirt_text", "allyourbase"] + ] + } } ``` @@ -1062,7 +749,7 @@ Mods can modify this via `add:traits` and `remove:traits`. Recipes represent both craft and uncraft (disassembly) recipes. -```C++ +```json "type": "recipe", // Recipe type. Possible values: 'recipe' (craft recipe) and 'uncraft' (uncraft recipe). "reversible": false, // Generate an uncraft recipe that is a reverse of this craft recipe. "result": "javelin", // ID of resulting item. By default, also used as the ID of the recipe. @@ -1158,12 +845,13 @@ telescope recipe we could introduce an intermediate item "survivor eyepiece", wh either lens, and then the telescope would require a high-quality lens and an eyepiece. Overall, the requirements are the same, but neither recipe has any overlap. -For more details, see [this pull request](https://github.com/CleverRaven/Cataclysm-DDA/pull/36657) -and the [related issue](https://github.com/CleverRaven/Cataclysm-DDA/issues/32311). +For more details, see +[this pull request](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/36657) and the +[related issue](https://github.com/cataclysmbnteam/Cataclysm-BN/issues/32311). ### Constructions -```C++ +```json "id": "constr_pit_spiked", // Identifier of the construction "group": "spike_pit", // Construction group, used to provide description and group related constructions in UI (e.g. different stages of some construction). "category": "DIG", // Construction category @@ -1188,7 +876,7 @@ and the [related issue](https://github.com/CleverRaven/Cataclysm-DDA/issues/3231 ### Construction groups -```C++ +```json "id": "build_wooden_door", // Group identifier "name": "Build Wooden Door", // Description string displayed in the construction menu ``` @@ -1203,7 +891,7 @@ automatically generates a one-element-long construction sequence, but only as lo other such construction recipes that would produce the same sequence and there isn't an explicitly defined sequence with same results. -```C++ +```json "id": "f_workbench", // Sequence identifier "blacklisted": false, // (Optional) Whether this sequence is blacklisted "post_furniture": "f_workbench", // (Optional) Identifier of resulting furniture @@ -1233,7 +921,7 @@ defined sequence with same results. ### Scores and Achievements Scores are defined in two or three steps based on _events_. To see what events exist and what data -they contain, read [`event.h`](../src/event.h). +they contain, read [`event.h`](../../../../../../../src/event.h). Each event contains a certain set of fields. Each field has a string key and a `cata_variant` value. The fields should provide all the relevant information about the event. @@ -1241,7 +929,7 @@ The fields should provide all the relevant information about the event. For example, consider the `gains_skill_level` event. You can see this specification for it in `event.h`: -```C++ +```json template<> struct event_spec { static constexpr std::array, 3> fields = {{ @@ -1281,14 +969,15 @@ event stream. Any or all of the following alterations can be made to the event stream: - Add new fields to each event based on event field transformations. The event field transformations - can be found in [`event_field_transformation.cpp`](../src/event_field_transformation.cpp). + can be found in + [`event_field_transformation.cpp`](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/src/event_field_transformations.cpp). - Filter events based on the values they contain to produce a stream containing some subset of the input stream. - Drop some fields which are not of interest in the output stream. Here are examples of each modification: -```C++ +```json "id": "avatar_kills_with_species", "type": "event_transformation", "event_type": "character_kills_monster", // Transformation acts upon events of this type @@ -1304,7 +993,7 @@ Here are examples of each modification: } ``` -```C++ +```json "id": "moves_on_horse", "type": "event_transformation", "event_type" : "avatar_moves", // An event type. The transformation will act on events of this type @@ -1326,7 +1015,7 @@ As with `event_transformation`, an `event_statistic` requires an input event str stream can be specified in the same was as for `event_transformation`, via one of the following two entries: -```C++ +```json "event_type" : "avatar_moves" // Events of this built-in type "event_transformation" : "moves_on_horse" // Events resulting from this json-defined transformation ``` @@ -1335,27 +1024,27 @@ Then it specifies a particular `stat_type` and potentially additional details as The number of events: -```C++ +```json "stat_type" : "count" ``` The sum of the numeric value in the specified field across all events: -```C++ +```json "stat_type" : "total" "field" : "damage" ``` The maximum of the numeric value in the specified field across all events: -```C++ +```json "stat_type" : "maximum" "field" : "damage" ``` The minimum of the numeric value in the specified field across all events: -```C++ +```json "stat_type" : "minimum" "field" : "damage" ``` @@ -1363,14 +1052,14 @@ The minimum of the numeric value in the specified field across all events: Assume there is only a single event to consider, and take the value of the given field for that unique event: -```C++ +```json "stat_type": "unique_value", "field": "avatar_id" ``` Regardless of `stat_type`, each `event_statistic` can also have: -```C++ +```json // Intended for use in describing scores and achievement requirements. "description": "Number of things" ``` @@ -1386,7 +1075,7 @@ Note that even though most statistics yield an integer, you should still use `%s If the underlying statistic has a description, then the score description is optional. It defaults to ": ". -```C++ +```json "id": "score_headshots", "type": "score", "description": "Headshots: %s", @@ -1401,7 +1090,7 @@ other games. An achievement is specified via requirements, each of which is a constraint on an `event_statistic`. For example: -```C++ +```json { "id": "achievement_kill_zombie", "type": "achievement", @@ -1422,7 +1111,7 @@ must be present, and must be an integer. There are further optional fields: -```C++ +```json "hidden_by": [ "other_achievement_id" ] ``` @@ -1431,7 +1120,7 @@ achievements UI) until all of the achievements listed have been completed. Use this to prevent spoilers or to reduce clutter in the list of achievements. -```C++ +```json "skill_requirements": [ { "skill": "archery", "is": ">=", "level": 5 } ] ``` @@ -1441,7 +1130,7 @@ be claimed. The `"skill"` field uses the id of a skill. Note that like `"time_constraint"` below achievements can only be captured when a statistic listed in `"requirements"` changes. -```C++ +```json "kill_requirements": [ { "faction": "ZOMBIE", "is": ">=", "count": 1 }, { "monster": "mon_sludge_crawler", "is": ">=", "count": 1 } ], ``` @@ -1457,7 +1146,7 @@ NPCs cannot currently be defined as a target. Note that like `"time_constraint"` below achievements can only be captured when a statistic listed in `"requirements"` changes. -```C++ +```json "time_constraint": { "since": "game_start", "is": "<=", "target": "1 minute" } ``` @@ -1471,7 +1160,7 @@ So, if you want an achievement which would normally be triggered by reaching som trigger it after that time has passed. Pick some statistic which is likely to change often, and add an `"anything"` constraint on it. For example: -```C++ +```json { "id": "achievement_survive_one_day", "type": "achievement", @@ -1486,7 +1175,7 @@ wake up for the first time after 24 hours into the game. ### Skills -```C++ +```json "id" : "smg", // Unique ID. Must be one continuous word, use underscores if necessary "name" : "submachine guns", // In-game name displayed "description" : "Your skill with submachine guns and machine pistols. Halfway between a pistol and an assault rifle, these weapons fire and reload quickly, and may fire in bursts, but they are not very accurate.", // In-game description @@ -1495,7 +1184,7 @@ wake up for the first time after 24 hours into the game. ### Traits/Mutations -```C++ +```json "id": "LIGHTEATER", // Unique ID "name": "Optimist", // In-game name displayed "points": 2, // Point cost of the trait. Positive values cost points and negative values give points @@ -1598,7 +1287,7 @@ wake up for the first time after 24 hours into the game. ### Vehicle Groups -```C++ +```json "id":"city_parked", // Unique ID. Must be one continuous word, use underscores if necessary "vehicles":[ // List of potential vehicle ID's. Chance of a vehicle spawning is X/T, where ["suv", 600], // X is the value linked to the specific vehicle and T is the total of all @@ -1612,7 +1301,7 @@ wake up for the first time after 24 hours into the game. Vehicle components when installed on a vehicle. -```C++ +```json "id": "wheel", // Unique identifier "name": "wheel", // Displayed name "symbol": "0", // ASCII character displayed when part is working @@ -1665,7 +1354,7 @@ Vehicle components when installed on a vehicle. ### Part Resistance -```C++ +```json "all" : 0.0f, // Initial value of all resistances, overridden by more specific types "physical" : 10, // Initial value for bash, cut and stab "non_physical" : 10, // Initial value for acid, heat, cold, electricity and biological @@ -1681,7 +1370,7 @@ Vehicle components when installed on a vehicle. ### Vehicle Placement -```C++ +```json "id":"road_straight_wrecks", // Unique ID. Must be one continuous word, use underscores if necessary "locations":[ { // List of potential vehicle locations. When this placement is used, one of those locations will be chosen at random. "x" : [0,19], // The x placement. Can be a single value or a range of possibilities. @@ -1692,7 +1381,7 @@ Vehicle components when installed on a vehicle. ### Vehicle Spawn -```C++ +```json "id":"default_city", // Unique ID. Must be one continuous word, use underscores if necessary "spawn_types":[ { // List of spawntypes. When this vehicle_spawn is applied, it will choose from one of the spawntypes randomly, based on the weight. "description" : "Clear section of road", // A description of this spawntype @@ -1714,7 +1403,7 @@ Vehicle components when installed on a vehicle. See also VEHICLE_JSON.md -```C++ +```json "id": "shopping_cart", // Internally-used name. "name": "Shopping Cart", // Display name, subject to i18n. "blueprint": "#", // Preview of vehicle - ignored by the code, so use only as documentation @@ -1728,11 +1417,11 @@ See also VEHICLE_JSON.md * (you can't stack non-stackable part flags). */ ``` -# `data/json/items/` JSONs +## `data/json/items/` JSONs ### Generic Items -```C++ +```json "type": "GENERIC", // Defines this as some generic item "id": "socks", // Unique ID. Must be one continuous word, use underscores if necessary "name": { @@ -1795,7 +1484,7 @@ See also VEHICLE_JSON.md ### Ammo -```C++ +```json "type" : "AMMO", // Defines this as ammo ... // same entries as above for the generic item. // additional some ammo specific entries: @@ -1814,7 +1503,7 @@ See also VEHICLE_JSON.md ### Magazine -```C++ +```json "type": "MAGAZINE", // Defines this as a MAGAZINE ... // same entries as above for the generic item. // additional some magazine specific entries: @@ -1831,7 +1520,7 @@ See also VEHICLE_JSON.md Armor can be defined like this: -```C++ +```json "type" : "ARMOR", // Defines this as armor ... // same entries as above for the generic item. // additional some armor specific entries: @@ -1851,7 +1540,7 @@ Armor can be defined like this: Alternately, every item (book, tool, gun, even food) can be used as armor if it has armor_data: -```C++ +```json "type" : "TOOL", // Or any other item type ... // same entries as for the type (e.g. same entries as for any tool), "armor_data" : { // additionally the same armor data like above @@ -1870,7 +1559,7 @@ Alternately, every item (book, tool, gun, even food) can be used as armor if it Pet armor can be defined like this: -```C++ +```json "type" : "PET_ARMOR", // Defines this as armor ... // same entries as above for the generic item. // additional some armor specific entries: @@ -1885,7 +1574,7 @@ Pet armor can be defined like this: Alternately, every item (book, tool, gun, even food) can be used as armor if it has armor_data: -```C++ +```json "type" : "TOOL", // Or any other item type ... // same entries as for the type (e.g. same entries as for any tool), "pet_armor_data" : { // additionally the same armor data like above @@ -1903,7 +1592,7 @@ Alternately, every item (book, tool, gun, even food) can be used as armor if it Books can be defined like this: -```C++ +```json "type" : "BOOK", // Defines this as a BOOK ... // same entries as above for the generic item. // additional some book specific entries: @@ -1918,7 +1607,7 @@ Books can be defined like this: Alternately, every item (tool, gun, even food) can be used as book if it has book_data: -```C++ +```json "type" : "TOOL", // Or any other item type ... // same entries as for the type (e.g. same entries as for any tool), "book_data" : { // additionally the same book data like above @@ -2026,7 +1715,7 @@ be. Never use `yellow` and `red`, those colors are reserved for sounds and infra CBMs can be defined like this: -```C++ +```json "type" : "BIONIC_ITEM", // Defines this as a CBM ... // same entries as above for the generic item. // additional some CBM specific entries: @@ -2038,7 +1727,7 @@ CBMs can be defined like this: ### Comestibles -```C++ +```json "type" : "COMESTIBLE", // Defines this as a COMESTIBLE ... // same entries as above for the generic item. // additional some comestible specific entries: @@ -2068,7 +1757,7 @@ CBMs can be defined like this: ### Containers -```C++ +```json "type": "CONTAINER", // Defines this as a container ... // same data as for the generic item (see above). "contains": 200, // How much volume this container can hold @@ -2079,7 +1768,7 @@ CBMs can be defined like this: Alternately, every item can be used as container: -```C++ +```json "type": "ARMOR", // Any type is allowed here ... // same data as for the type "container_data" : { // The container specific data goes here. @@ -2093,7 +1782,7 @@ container. It could also be written as a generic item ("type": "GENERIC") with " ### Melee -```C++ +```json "id": "hatchet", // Unique ID. Must be one continuous word, use underscores if necessary "symbol": ";", // ASCII character used in-game "color": "light_gray", // ASCII character color @@ -2154,7 +1843,7 @@ container. It could also be written as a generic item ("type": "GENERIC") with " Guns can be defined like this: -```C++ +```json "type": "GUN", // Defines this as a GUN ... // same entries as above for the generic item. // additional some gun specific entries: @@ -2233,7 +1922,7 @@ Alternately, every item (book, tool, armor, even food) can be used as gun if it Gun mods can be defined like this: -```C++ +```json "type": "GUNMOD", // Defines this as a GUNMOD ... // Same entries as above for the generic item. // Additionally some gunmod specific entries: @@ -2270,7 +1959,7 @@ gunmod_data: ### Batteries -```C++ +```json "type": "BATTERY", // Defines this as a BATTERY ... // Same entries as above for the generic item // Additionally some battery specific entries: @@ -2279,7 +1968,7 @@ gunmod_data: ### Tools -```C++ +```json "id": "torch_lit", // Unique ID. Must be one continuous word, use underscores if necessary "type": "TOOL", // Defines this as a TOOL "symbol": "/", // ASCII character used in-game @@ -2313,7 +2002,7 @@ gunmod_data: Every item type can have optional seed data, if the item has seed data, it's considered a seed and can be planted: -```C++ +```json "seed_data" : { "fruit": "weed", // The item id of the fruits that this seed will produce. "seeds": false, // (optional, default is true). If true, harvesting the plant will spawn seeds (the same type as the item used to plant). If false only the fruits are spawned, no seeds. @@ -2333,7 +2022,7 @@ vat and will ferment into a different item type. Currently only vats can only accept and produce liquid items. -```C++ +```json "brewable" : { "time": 3600, // A time duration: how long the fermentation will take. "result": "beer" // The id of the result of the fermentation. @@ -2455,7 +2144,7 @@ Possible values (see src/artifact.h for an up-to-date list): Every item type can have software data, it does not have any behavior: -```C++ +```json "software_data" : { "type": "USELESS", // unused "power" : 91 // unused @@ -2471,7 +2160,7 @@ If a fuel has the PERPETUAL flag, engines powered by it never use any fuel. This intended for the muscle pseudo-fuel, but mods may take advantage of it to make perpetual motion machines. -```C++ +```json "fuel" : { energy": 34.2, // battery charges per mL of fuel. batteries have energy 1 // is also MJ/L from https://en.wikipedia.org/wiki/Energy_density @@ -2495,7 +2184,7 @@ The contents of use_action fields can either be a string indicating a built-in f the item is activated (defined in iuse.cpp), or one of several special definitions that invoke a more structured function. -```C++ +```json "use_action": { "type": "transform", // The type of method, in this case one that transforms the item. "target": "gasoline_lantern_on", // The item to transform to. @@ -2756,28 +2445,28 @@ category: The item descriptions are taken from snippets, which can be specified like this (the value of category must match the snippet_category in the item definition): -```C++ +```json { - "type" : "snippet", - "category" : "newspaper", - "id" : "snippet-id", // id is optional, it's used when the snippet is referenced in the item list of professions - "text": "your flavor text" + "type": "snippet", + "category": "newspaper", + "id": "snippet-id", // id is optional, it's used when the snippet is referenced in the item list of professions + "text": "your flavor text" } ``` or several snippets at once: -```C++ +```json { - "type" : "snippet", - "category" : "newspaper", - "text": [ - "your flavor text", - "more flavor", - // entries can also bo of this form to have a id to reference that specific snippet. - { "id" : "snippet-id", "text" : "another flavor text" } - ], - "text": [ "your flavor text", "another flavor text", "more flavor" ] + "type": "snippet", + "category": "newspaper", + "text": [ + "your flavor text", + "more flavor", + // entries can also bo of this form to have a id to reference that specific snippet. + { "id": "snippet-id", "text": "another flavor text" } + ], + "text": ["your flavor text", "another flavor text", "more flavor"] } ``` @@ -2793,11 +2482,11 @@ One can also put the snippets directly in the item definition: This will automatically create a snippet category specific to that item and populate that category with the given snippets. The format also support snippet ids like above. -# `json/` JSONs +## `json/` JSONs ### Harvest -```C++ +```json { "id": "jabberwock", "type": "harvest", @@ -2894,11 +2583,11 @@ distribution chances for roll values passed to that function Used to classify weapons (guns or melee) into groups, mainly for use in martial arts. -```c++ +```json { - "type": "weapon_category", - "id": "WEAP_CAT" - "name": "Weapon Category" + "type": "weapon_category", + "id": "WEAP_CAT", + "name": "Weapon Category" } ``` @@ -2907,27 +2596,27 @@ entries. ### Furniture -```C++ +```json { - "type": "furniture", - "id": "f_toilet", - "name": "toilet", - "symbol": "&", - "looks_like": "chair", - "color": "white", - "move_cost_mod": 2, - "light_emitted": 5, - "required_str": 18, - "flags": [ "TRANSPARENT", "BASHABLE", "FLAMMABLE_HARD" ], - "crafting_pseudo_item": "anvil", - "examine_action": "toilet", - "close": "f_foo_closed", - "open": "f_foo_open", - "bash": "TODO", - "deconstruct": "TODO", - "max_volume": "1000 L", - "examine_action": "workbench", - "workbench": { "multiplier": 1.1, "mass": 10000, "volume": "50L" } + "type": "furniture", + "id": "f_toilet", + "name": "toilet", + "symbol": "&", + "looks_like": "chair", + "color": "white", + "move_cost_mod": 2, + "light_emitted": 5, + "required_str": 18, + "flags": ["TRANSPARENT", "BASHABLE", "FLAMMABLE_HARD"], + "crafting_pseudo_item": "anvil", + "examine_action": "toilet", + "close": "f_foo_closed", + "open": "f_foo_open", + "bash": "TODO", + "deconstruct": "TODO", + "max_volume": "1000 L", + "examine_action": "workbench", + "workbench": { "multiplier": 1.1, "mass": 10000, "volume": "50L" } } ``` @@ -2978,29 +2667,29 @@ it for the purpose of surgery. ### Terrain -```C++ +```json { - "type": "terrain", - "id": "t_spiked_pit", - "name": "spiked pit", - "symbol": "0", - "looks_like": "pit", - "color": "ltred", - "move_cost": 10, - "light_emitted": 10, - "trap": "spike_pit", - "max_volume": "1000 L", - "flags": ["TRANSPARENT", "DIGGABLE"], - "connects_to" : "WALL", - "close": "t_foo_closed", - "open": "t_foo_open", - "bash": "TODO", - "deconstruct": "TODO", - "harvestable": "blueberries", - "transforms_into": "t_tree_harvested", - "harvest_season": "WINTER", - "roof": "t_roof", - "examine_action": "pit" + "type": "terrain", + "id": "t_spiked_pit", + "name": "spiked pit", + "symbol": "0", + "looks_like": "pit", + "color": "ltred", + "move_cost": 10, + "light_emitted": 10, + "trap": "spike_pit", + "max_volume": "1000 L", + "flags": ["TRANSPARENT", "DIGGABLE"], + "connects_to": "WALL", + "close": "t_foo_closed", + "open": "t_foo_open", + "bash": "TODO", + "deconstruct": "TODO", + "harvestable": "blueberries", + "transforms_into": "t_tree_harvested", + "harvest_season": "WINTER", + "roof": "t_roof", + "examine_action": "pit" } ``` @@ -3016,7 +2705,7 @@ Same as for furniture, see below in the chapter "Common to furniture and terrain Move cost to move through. A value of 0 means it's impassable (e.g. wall). You should not use negative values. The positive value is multiple of 50 move points, e.g. value 2 means the player -uses 2\*50 = 100 move points when moving across the terrain. +uses `2 * 50 = 100` move points when moving across the terrain. #### `light_emitted` @@ -3173,26 +2862,26 @@ will change the object at the affected tile to the given one. For example one co Defines the various things that happen when the player or something else bashes terrain or furniture. -```C++ +```json { - "str_min": 80, - "str_max": 180, - "str_min_blocked": 15, - "str_max_blocked": 100, - "str_min_supported": 15, - "str_max_supported": 100, - "sound": "crunch!", - "sound_vol": 2, - "sound_fail": "whack!", - "sound_fail_vol": 2, - "ter_set": "t_dirt", - "furn_set": "f_rubble", - "explosive": 1, - "collapse_radius": 2, - "destroy_only": true, - "bash_below": true, - "tent_centers": ["f_groundsheet", "f_fema_groundsheet", "f_skin_groundsheet"], - "items": "bashed_item_result_group" + "str_min": 80, + "str_max": 180, + "str_min_blocked": 15, + "str_max_blocked": 100, + "str_min_supported": 15, + "str_max_supported": 100, + "sound": "crunch!", + "sound_vol": 2, + "sound_fail": "whack!", + "sound_fail_vol": 2, + "ter_set": "t_dirt", + "furn_set": "f_rubble", + "explosive": 1, + "collapse_radius": 2, + "destroy_only": true, + "bash_below": true, + "tent_centers": ["f_groundsheet", "f_fema_groundsheet", "f_skin_groundsheet"], + "items": "bashed_item_result_group" } ``` @@ -3236,11 +2925,11 @@ subtype is "collection". Upon successful bashing, items from that group will be #### `map_deconstruct_info` -```C++ +```json { - "furn_set": "f_safe", - "ter_set": "t_dirt", - "items": "deconstructed_item_result_group" + "furn_set": "f_safe", + "ter_set": "t_dirt", + "items": "deconstructed_item_result_group" } ``` @@ -3257,7 +2946,7 @@ subtype is "collection". Upon deconstruction the object, items from that group w #### `prying_result` -```JSON +```json { "success_message": "You pry open the door.", "fail_message": "You pry, but cannot pry open the door.", @@ -3300,12 +2989,12 @@ required if `breakable` is set to true and `break_ter_type` is defined. This determines the minimum prying quality needed to attempt to pry open the terrain / furniture, and the chance of successfully prying it open. From iuse.cpp: -```C++ +```cpp int diff = pry->difficulty; diff -= ( ( pry_level - pry->pry_quality ) * pry->pry_bonus_mult ); ``` -```C++ +```cpp if( dice( 4, diff ) < dice( 4, p->str_cur ) ) { p->add_msg_if_player( m_good, pry->success_message ); ``` @@ -3340,7 +3029,7 @@ attempt will spawn items from that group. ### `plant_data` -```JSON +```json { "transform": "f_planter_harvest", "base": "f_planter", @@ -3371,7 +3060,7 @@ give more produce from harvest, for numbers less than one it will give less prod ### clothing_mod -```JSON +```json "type": "clothing_mod", "id": "leather_padded", // Unique ID. "flag": "leather_padded", // flag to add to clothing. @@ -3391,461 +3080,3 @@ give more produce from harvest, for numbers less than one it will give less prod } ] ``` - -# Scenarios - -Scenarios are specified as JSON object with `type` member set to `scenario`. - -```C++ -{ - "type": "scenario", - "id": "schools_out", - ... -} -``` - -The id member should be the unique id of the scenario. - -The following properties (mandatory, except if noted otherwise) are supported: - -## `description` - -(string) - -The in-game description. - -## `name` - -(string or object with members "male" and "female") - -The in-game name, either one gender-neutral string, or an object with gender specific names. -Example: - -```C++ -"name": { - "male": "Runaway groom", - "female": "Runaway bride" -} -``` - -## `points` - -(integer) - -Point cost of scenario. Positive values cost points and negative values grant points. - -## `items` - -(optional, object with optional members "both", "male" and "female") - -Items the player starts with when selecting this scenario. One can specify different items based on -the gender of the character. Each lists of items should be an array of items ids. Ids may appear -multiple times, in which case the item is created multiple times. - -Example: - -```C++ -"items": { - "both": [ - "pants", - "rock", - "rock" - ], - "male": [ "briefs" ], - "female": [ "panties" ] -} -``` - -This gives the player pants, two rocks and (depending on the gender) briefs or panties. - -Mods can modify the lists of an existing scenario via "add:both" / "add:male" / "add:female" and -"remove:both" / "remove:male" / "remove:female". - -Example for mods: - -```C++ -{ - "type": "scenario", - "id": "schools_out", - "edit-mode": "modify", - "items": { - "remove:both": [ "rock" ], - "add:female": [ "2x4" ] - } -} -``` - -## `flags` - -(optional, array of strings) - -A list of flags. TODO: document those flags here. - -Mods can modify this via "add:flags" and "remove:flags". - -## `cbms` - -(optional, array of strings) - -A list of CBM ids that are implanted in the character. - -Mods can modify this via "add:CBMs" and "remove:CBMs". - -## `traits", "forced_traits", "forbidden_traits` - -(optional, array of strings) - -Lists of trait/mutation ids. Traits in "forbidden_traits" are forbidden and can't be selected during -the character creation. Traits in "forced_traits" are automatically added to character. Traits in -"traits" enables them to be chosen, even if they are not starting traits. - -Mods can modify this via "add:traits" / "add:forced_traits" / "add:forbidden_traits" and -"remove:traits" / "remove:forced_traits" / "remove:forbidden_traits". - -## `allowed_locs` - -(optional, array of strings) - -A list of starting location ids (see start_locations.json) that can be chosen when using this -scenario. - -## `start_name` - -(string) - -The name that is shown for the starting location. This is useful if the scenario allows several -starting locations, but the game can not list them all at once in the scenario description. Example: -if the scenario allows to start somewhere in the wilderness, the starting locations would contain -forest and fields, but its "start_name" may simply be "wilderness". - -## `professions` - -(optional, array of strings) - -A list of allowed professions that can be chosen when using this scenario. The first entry is the -default profession. If this is empty, all professions are allowed. - -## `map_special` - -(optional, string) - -Add a map special to the starting location, see JSON_FLAGS for the possible specials. - -## `missions` - -(optional, array of strings) - -A list of mission ids that will be started and assigned to the player at the start of the game. Only -missions with the ORIGIN_GAME_START origin are allowed. The last mission in the list will be the -active mission, if multiple missions are assigned. - -# Starting locations - -Starting locations are specified as JSON object with "type" member set to "start_location": - -```C++ -{ - "type": "start_location", - "id": "field", - "name": "An empty field", - "target": "field", - ... -} -``` - -The id member should be the unique id of the location. - -The following properties (mandatory, except if noted otherwise) are supported: - -## `name` - -(string) - -The in-game name of the location. - -## `target` - -(string) - -The id of an overmap terrain type (see overmap_terrain.json) of the starting location. The game will -chose a random place with that terrain. - -## `flags` - -(optional, array of strings) - -Arbitrary flags. Mods can modify this via "add:flags" / "remove:flags". TODO: document them. - -### `tile_config` - -Each tileset has a tile_config.json describing how to map the contents of a sprite sheet to various -tile identifiers, different orientations, etc. The ordering of the overlays used for displaying -mutations can be controlled as well. The ordering can be used to override the default ordering -provided in `mutation_ordering.json`. Example: - -```C++ -{ // whole file is a single object - "tile_info": [ // tile_info is mandatory - { - "height": 32, - "width": 32, - "iso" : true, // Optional. Indicates an isometric tileset. Defaults to false. - "pixelscale" : 2 // Optional. Sets a multiplier for resizing a tileset. Defaults to 1. - } - ], - "tiles-new": [ // tiles-new is an array of sprite sheets - { // alternately, just one "tiles" array - "file": "tiles.png", // file containing sprites in a grid - "tiles": [ // array with one entry per tile - { - "id": "10mm", // id is how the game maps things to sprites - "fg": 1, // lack of prefix mostly indicates items - "bg": 632, // fg and bg can be sprite indexes in the image - "rotates": false - }, - { - "id": "t_wall", // "t_" indicates terrain - "fg": [2918, 2919, 2918, 2919], // 2 or 4 sprite numbers indicates pre-rotated - "bg": 633, - "rotates": true, - "multitile": true, - "additional_tiles": [ // connected/combined versions of sprite - { // or variations, see below - "id": "center", - "fg": [2919, 2918, 2919, 2918] - }, - { - "id": "corner", - "fg": [2924, 2922, 2922, 2923] - }, - { - "id": "end_piece", - "fg": [2918, 2919, 2918, 2919] - }, - { - "id": "t_connection", - "fg": [2919, 2918, 2919, 2918] - }, - { - "id": "unconnected", - "fg": 2235 - } - ] - }, - { - "id": "vp_atomic_lamp", // "vp_" vehicle part - "fg": 3019, - "bg": 632, - "rotates": false, - "multitile": true, - "additional_tiles": [ - { - "id": "broken", // variant sprite - "fg": 3021 - } - ] - }, - { - "id": "t_dirt", - "rotates": false, - "fg": [ - { "weight":50, "sprite":640}, // weighted random variants - { "weight":1, "sprite":3620}, - { "weight":1, "sprite":3621}, - { "weight":1, "sprite":3622} - ] - }, - { - "id": [ - "overlay_mutation_GOURMAND", // character overlay for mutation - "overlay_mutation_male_GOURMAND", // overlay for specified gender - "overlay_mutation_active_GOURMAND" // overlay for activated mutation - ], - "fg": 4040 - } - ] - }, - { // second entry in tiles-new - "file": "moretiles.png", // another sprite sheet - "tiles": [ - { - "id": ["xxx","yyy"], // define two ids at once - "fg": 1, - "bg": 234 - } - ] - } - ], - "overlay_ordering": [ - { - "id" : "WINGS_BAT", // mutation name, in a string or array of strings - "order" : 1000 // range from 0 - 9999, 9999 being the topmost layer - }, - { - "id" : [ "PLANTSKIN", "BARK" ], // mutation name, in a string or array of strings - "order" : 3500 // order is applied to all items in the array - }, - { - "id" : "bio_armor_torso", // Overlay order of bionics is controlled in the same way - "order" : 500 - } - ] -} -``` - -# Mutation overlay ordering - -The file `mutation_ordering.json` defines the order that visual mutation and bionic overlays are -rendered on a character ingame. The layering value from 0 (bottom) - 9999 (top) sets the order. - -Example: - -```C++ -[ - { - "type" : "overlay_order", - "overlay_ordering" : - [ - { - "id" : [ "BEAUTIFUL", "BEAUTIFUL2", "BEAUTIFUL3", "LARGE", "PRETTY", "RADIOACTIVE1", "RADIOACTIVE2", "RADIOACTIVE3", "REGEN" ], - "order" : 1000 - },{ - "id" : [ "HOOVES", "ROOTS1", "ROOTS2", "ROOTS3", "TALONS" ], - "order" : 4500 - },{ - "id" : "FLOWERS", - "order" : 5000 - },{ - "id" : [ "PROF_CYBERCOP", "PROF_FED", "PROF_PD_DET", "PROF_POLICE", "PROF_SWAT", "PHEROMONE_INSECT" ], - "order" : 8500 - },{ - "id" : [ "bio_armor_arms", "bio_armor_legs", "bio_armor_torso", "bio_armor_head", "bio_armor_eyes" ], - "order" : 500 - } - ] - } -] -``` - -## `id` - -(string) - -The internal ID of the mutation. Can be provided as a single string, or an array of strings. The -order value provided will be applied to all items in the array. - -## `order` - -(integer) - -The ordering value of the mutation overlay. Values range from 0 - 9999, 9999 being the topmost drawn -layer. Mutations that are not in any list will default to 9999. - -# MOD_INFO - -Also see [MODDING.md](MODDING.md). - -Object with `MOD_INFO` type describes the mod itself. Each mod must have exactly one `MOD_INFO`, and -unlike other types of objects from mods it is loaded on game launch, before the title screen shows -up. As such, any and all errors related to it will show up before the title screen shows up. - -Current convention is to put your `MOD_INFO` in `mod_info.json` file within the root directory of -the mod. - -Example: - -```C++ -[ - { - "type": "MOD_INFO", - - // Mod's unique identifier, prefer to use only ASCII letters, numbers and underscore for clarity. - "id": "better_zeds", - // Mod's category, see MODDING.md for list of supported values. - "category": "content", - // Mod's display name, in English. - "name": "Better Zombies", - // Mod's description, in English. - "description": "Reworks all base game zombies and adds 100+ new variants.", - // Original author(s) of the mod. - "authors": [ "That Guy", "His Friend" ], - // If the author(s) abandoned the mod for some reason, this entry lists current maintainers. - "maintainers": [ "Mr. BugFixer", "BugFixer Jr." ], - // Mod version string. This is for users' and maintainers' convenience, so you can use whatever is most convenient here (e.g. date). - "version": "02 Dec 2021", - // List of mod's dependencies. Dependencies are guaranteed to be loaded before the mod is loaded. - "dependencies": [ "bn", "zed_templates" ], - // List of mods that are incompatible with this mod. - "conflicts": [ "worse_zeds" ], - // Special flag for core game data, can only be used by total overhaul mods. Only 1 core mod can be loaded at a time. - "core": false, - // Marks mod as obsolete. Obsolete mods don't show up in mod selection list by default, and have a warning on them. - "obsolete": false, - // Path of mod's files relative to the modinfo.json file. The game automatically loads all files from the folder with modinfo.json, - // and all the subfolders, so this field is only useful when you for whatever reason want to stick your modinfo.json in a subfolder of your mod. - "path": "../common-data/" - } -] -``` - -## - -# MOD tileset - -MOD tileset defines additional sprite sheets. It is specified as JSON object with `type` member set -to `mod_tileset`. - -Example: - -```C++ -[ - { - "type": "mod_tileset", - "compatibility": [ "MshockXottoplus" ], - "tiles-new": [ - { - "file": "test_tile.png", - "tiles": [ - { - "id": "player_female", - "fg": 1, - "bg": 0 - }, - { - "id": "player_male", - "fg": 2, - "bg": 0 - } - ] - } - ] - } -] -``` - -## `compatibility` - -(string) - -The internal ID of the compatible tilesets. MOD tileset is only applied when base tileset's ID -exists in this field. - -## `tiles-new` - -Setting of sprite sheets. Same as `tiles-new` field in `tile_config`. Sprite files are loaded from -the same folder json file exists. - -# Field types - -{ "type": "field_type", // this is a field type "id": "fd_gum_web", // id of the field -"immune_mtypes": [ "mon_spider_gum" ], // list of monster immune to this field "intensity_levels": [ -{ "name": "shadow", // name of this level of intensity "light_override": 3.7 } //light level on the -tile occupied by this field will be set at 3.7 not matter the ambient light. ], "bash": { "str_min": -1, // lower bracket of bashing damage required to bash "str_max": 3, // higher bracket "sound_vol": -2, // noise made when succesfully bashing the field "sound_fail_vol": 2, // noise made when failing -to bash the field "sound": "shwip", // sound on success "sound_fail": "shwomp", // sound on failure -"msg_success": "You brush the gum web aside.", // message on success "move_cost": 120, // how many -moves it costs to succesfully bash that field (default: 100) "items": [ // item dropped upon -succesful bashing { "item": "2x4", "count": [ 5, 8 ] }, { "item": "nail", "charges": [ 6, 8 ] }, { -"item": "splinter", "count": [ 3, 6 ] }, { "item": "rag", "count": [ 40, 55 ] }, { "item": "scrap", -"count": [ 10, 20 ] } ] } } diff --git a/doc/src/content/docs/en/mod/json/reference/map/field_type.md b/doc/src/content/docs/en/mod/json/reference/map/field_type.md new file mode 100644 index 000000000000..93c65f032f04 --- /dev/null +++ b/doc/src/content/docs/en/mod/json/reference/map/field_type.md @@ -0,0 +1,38 @@ +--- +title: Field Types +--- + +```json +{ + "type": "field_type", // this is a field type + "id": "fd_gum_web", // id of the field + "immune_mtypes": ["mon_spider_gum"], // list of monster immune to this field + "intensity_levels": [ + { + "name": "shadow", // name of this level of intensity + "light_override": 3.7 + } + //light level on the tile occupied by this field will be set at 3.7 not matter the ambient light. + ], + "bash": { + "str_min": 1, // lower bracket of bashing damage required to bash + "str_max": 3, // higher bracket + "sound_vol": 2, // noise made when succesfully bashing the field + "sound_fail_vol": 2, // noise made when failing to bash the field + "sound": "shwip", // sound on success + "sound_fail": "shwomp", // sound on failure + "msg_success": "You brush the gum web aside.", // message on success + "move_cost": 120, // how many moves it costs to succesfully bash that field (default: 100) + "items": [ // item dropped upon succesful bashing + { "item": "2x4", "count": [5, 8] }, + { "item": "nail", "charges": [6, 8] }, + { + "item": "splinter", + "count": [3, 6] + }, + { "item": "rag", "count": [40, 55] }, + { "item": "scrap", "count": [10, 20] } + ] + } +} +``` diff --git a/doc/MAPGEN.md b/doc/src/content/docs/en/mod/json/reference/map/mapgen.md similarity index 92% rename from doc/MAPGEN.md rename to doc/src/content/docs/en/mod/json/reference/map/mapgen.md index 490dc56a27fd..bf56f09ff7b0 100644 --- a/doc/MAPGEN.md +++ b/doc/src/content/docs/en/mod/json/reference/map/mapgen.md @@ -1,63 +1,6 @@ -# MAPGEN - -- [How buildings and terrain are generated](#how-buildings-and-terrain-are-generated) -- [Adding mapgen entries](#adding-mapgen-entries) - - [Methods](#methods) - - [Mapgen definition Placement](#mapgen-definition-placement) - - [Embedded mapgen](#embedded-mapgen) - - [Standalone mapgen](#standalone-mapgen) - - [Format and variables](#format-and-variables) - - [Define mapgen "method"](#define-mapgen-method) - - [Define overmap terrain with "om_terrain" value, array, or nested array](#define-overmap-terrain-with-om_terrain-value-array-or-nested-array) - - [Define mapgen "weight"](#define-mapgen-weight) - - [How "overmap_terrain" variables affect mapgen](#how-overmap_terrain-variables-affect-mapgen) - - [Limitations / TODO](#limitations--todo) -- [JSON object definition](#json-object-definition) - - [Fill terrain using "fill_ter"](#fill-terrain-using-fill_ter) - - [ASCII map using "rows" array](#ascii-map-using-rows-array) - - [Row terrains in "terrain"](#row-terrains-in-terrain) - - [Furniture symbols in "furniture" array](#furniture-symbols-in-furniture-array) - - [Set terrain, furniture, or traps with a "set" array](#set-terrain-furniture-or-traps-with-a-set-array) - - [Set things at a "point"](#set-things-at-a-point) - - [Set things in a "line"](#set-things-in-a-line) - - [Set things in a "square"](#set-things-in-a-square) - - [Spawn item or monster groups with "place_groups"](#spawn-item-or-monster-groups-with-place_groups) - - [Spawn monsters from a group with "monster"](#spawn-monsters-from-a-group-with-monster) - - [Spawn items from a group with "item"](#spawn-items-from-a-group-with-item) - - [Spawn a single monster with "place_monster"](#spawn-a-single-monster-with-place_monster) - - [Spawn an entire group of monsters with "place_monsters"](#spawn-an-entire-group-of-monsters-with-place_monsters) - - [Spawn specific items with a "place_item" array](#spawn-specific-items-with-a-place_item-array) - - [Extra map features with specials](#extra-map-features-with-specials) - - [Place smoke, gas, or blood with "fields"](#place-smoke-gas-or-blood-with-fields) - - [Place NPCs with "npcs"](#place-npcs-with-npcs) - - [Place signs with "signs"](#place-signs-with-signs) - - [Place a vending machine and items with "vendingmachines"](#place-a-vending-machine-and-items-with-vendingmachines) - - [Place a toilet with some amount of water with "toilets"](#place-a-toilet-with-some-amount-of-water-with-toilets) - - [Place a gas or diesel pump with some fuel with "gaspumps"](#place-a-gas-or-diesel-pump-with-some-fuel-with-gaspumps) - - [Place items from an item group with "items"](#place-items-from-an-item-group-with-items) - - [Place monsters from a monster group with "monsters"](#place-monsters-from-a-monster-group-with-monsters) - - [Place a vehicle by type or group with "vehicles"](#place-a-vehicle-by-type-or-group-with-vehicles) - - [Place a specific item with "item"](#place-a-specific-item-with-item) - - [Place a specific monster with "monster"](#place-a-specific-monster-with-monster) - - [Place a trap with "traps"](#place-a-trap-with-traps) - - [Place furniture with "furniture"](#place-furniture-with-furniture) - - [Place terrain with "terrain"](#place-terrain-with-terrain) - - [Place rubble and smash existing terrain with "rubble"](#place-rubble-and-smash-existing-terrain-with-rubble) - - [Place spilled liquids with "place_liquids"](#place-spilled-liquids-with-place_liquids) - - [Place a specific item or an item from a group with "loot"](#place-a-specific-item-or-an-item-from-a-group-with-loot) - - [Plant seeds in a planter with "sealed_item"](#plant-seeds-in-a-planter-with-sealed_item) - - [Place messages with "graffiti"](#place-messages-with-graffiti) - - [Place a zone for an NPC faction with "zones"](#place-a-zone-for-an-npc-faction-with-zones) - - [Translate terrain type with "translate_ter"](#translate-terrain-type-with-translate_ter) - - [Apply mapgen transformation with "ter_furn_transforms"](#apply-mapgen-transformation-with-ter_furn_transforms) - - [Rotate the map with "rotation"](#rotate-the-map-with-rotation) - - [Pre-load a base mapgen with "predecessor_mapgen"](#pre-load-a-base-mapgen-with-predecessor_mapgen) -- [Using update_mapgen](#using-update_mapgen) - - [Overmap tile specification](#overmap-tile-specification) - - ["assign_mission_target"](#assign_mission_target) - - ["om_terrain"](#om_terrain) -- [Mission specials](#mission-specials) - - ["target"](#target) +--- +title: Mapgen +--- # How buildings and terrain are generated @@ -161,7 +104,7 @@ However, the following variables impact where and how often stuff gets applied: **required** Values: _json_ - required -``` +```json "object": { (more json here) } ``` @@ -174,13 +117,13 @@ a list of IDs, or with a nested list (of lists) of IDs. With the first form, simply give the ID of an overmap terrain from `overmap_terrain.json`: -``` +```json "om_terrain": "oter_id" ``` In the second form, provide a list of IDs: -``` +```json "om_terrain": [ "house", "house_base" ] ``` @@ -270,7 +213,7 @@ by "terrain" and optionally "furniture" or other entries below. Usage: -``` +```json "rows": [ "row1...", "row2...", ..., "row24..." ] ``` diff --git a/doc/OVERMAP.md b/doc/src/content/docs/en/mod/json/reference/map/overmap.md similarity index 98% rename from doc/OVERMAP.md rename to doc/src/content/docs/en/mod/json/reference/map/overmap.md index 2d05939bb3db..b5bde1e4142b 100644 --- a/doc/OVERMAP.md +++ b/doc/src/content/docs/en/mod/json/reference/map/overmap.md @@ -1,4 +1,6 @@ -# Overmap Generation +--- +title: Overmap Generation +--- ## Overview @@ -196,7 +198,7 @@ referenced overmap terrains (e.g. the `_north` version for all). | `id` | Unique id. | | `name` | Name for the location shown in game. | | `sym` | Symbol used when drawing the location, like `"F"` (or you may use an ASCII value like `70`). | -| `color` | Color to draw the symbol in. See [COLOR.md](COLOR.md). | +| `color` | Color to draw the symbol in. See [COLOR.md](../graphics/COLOR). | | `looks_like` | Id of another overmap terrain to be used for the graphical tile, if this doesn't have one. | | `connect_group` | Specify that this overmap terrain might be graphically connected to its neighbours, should a tileset wish to. It will connect to any other `overmap_terrain` with the same `connect_group`. | | `see_cost` | Affects player vision on overmap. Higher values obstruct vision more. | @@ -204,7 +206,7 @@ referenced overmap terrains (e.g. the `_north` version for all). | `extras` | Reference to a named `map_extras` in region_settings, defines which map extras can be applied. | | `mondensity` | Summed with values for adjacent overmap terrains to influence density of monsters spawned here. | | `spawns` | Spawns added once at mapgen. Monster group, % chance, population range (min/max). | -| `flags` | See `Overmap terrains` in [JSON_FLAGS.md](JSON_FLAGS.md). | +| `flags` | See `Overmap terrains` in [JSON_FLAGS.md](../JSON_FLAGS). | | `mapgen` | Specify a C++ mapgen function. Don't do this--use JSON. | | `mapgen_straight` | Specify a C++ mapgen function for a LINEAR feature variation. | | `mapgen_curved` | Specify a C++ mapgen function for a LINEAR feature variation. | @@ -288,7 +290,7 @@ level value and then only specify it for individual entries that differ. | `city_distance` | Min/max distance from a city that the special may be placed. Use -1 for unbounded. | | `city_sizes` | Min/max city size for a city that the special may be placed near. Use -1 for unbounded. | | `occurrences` | Min/max number of occurrences when placing the special. If UNIQUE flag is set, becomes X of Y chance. | -| `flags` | See `Overmap specials` in [JSON_FLAGS.md](JSON_FLAGS.md). | +| `flags` | See `Overmap specials` in [JSON_FLAGS.md](../JSON_FLAGS). | | `rotate` | Whether the special can rotate. True if not specified. | ### Example @@ -342,7 +344,7 @@ subset of that for an overmap special, and consequently will not be repeated in City buildings are not subject to the same quantity limitations as overmap specials, and in fact the occurrences attribute does not apply at all. Instead, the placement of city buildings is driven by the frequency assigned to the city building within the `region_settings`. Consult -[REGION_SETTINGS.md](REGION_SETTINGS.md) for more details. +[REGION_SETTINGS.md](./REGION_SETTINGS) for more details. ### Fields @@ -424,7 +426,7 @@ the frequency assigned to the city building within the `region_settings`. Consul | `terrain` | `overmap_terrain` to be placed when the placement location matches `locations`. | | `locations` | List of `overmap_location` that this subtype applies to. Can be empty; signifies `terrain` is valid as is. | | `basic_cost` | Cost of this subtype when pathfinding a route. Default 0. | -| `flags` | See `Overmap connections` in [JSON_FLAGS.md](JSON_FLAGS.md). | +| `flags` | See `Overmap connections` in [JSON_FLAGS.md](../JSON_FLAGS). | ## Overmap Location diff --git a/doc/REGION_SETTINGS.md b/doc/src/content/docs/en/mod/json/reference/map/region_settings.md similarity index 97% rename from doc/REGION_SETTINGS.md rename to doc/src/content/docs/en/mod/json/reference/map/region_settings.md index 9e95659ade61..1cb82d894434 100644 --- a/doc/REGION_SETTINGS.md +++ b/doc/src/content/docs/en/mod/json/reference/map/region_settings.md @@ -1,4 +1,6 @@ -# Region Settings +--- +title: Region Settings +--- The **region_settings** define the attributes for map generation that apply to an entire region. The general settings define the default overmap terrain and ground cover. Additional sections are as @@ -485,19 +487,19 @@ The **weather** section defines the base weather attributes used for the region. ### Fields -| Identifier | Description | -| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `spring_temp` | Mid spring temperature for the region in degrees Celsius | -| `summer_temp` | Mid summer temperature for the region in degrees Celsius | -| `autumn_temp` | Mid autumn temperature for the region in degrees Celsius | -| `winter_temp` | Mid winter temperature for the region in degrees Celsius | -| `base_humidity` | Base humidity for the region in relative humidity % | -| `base_pressure` | Base pressure for the region in millibars. | -| `base_acid` | Base acid for the region in ? units. Value >= 1 is considered acidic. | -| `base_wind` | Base wind for the region in mph units. Roughly the yearly average. | -| `base_wind_distrib_peaks` | How high the wind peaks can go. Higher values produce windier days. | -| `base_wind_season_variation` | How the wind varies with season. Lower values produce more variation | -| `weather_types` | Ids of the weather types allowed in this region. First value will be the default weather type. Declaration order will affect weather selection, see [WEATHER_TYPE.md](WEATHER_TYPE.md) for details. | +| Identifier | Description | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `spring_temp` | Mid spring temperature for the region in degrees Celsius | +| `summer_temp` | Mid summer temperature for the region in degrees Celsius | +| `autumn_temp` | Mid autumn temperature for the region in degrees Celsius | +| `winter_temp` | Mid winter temperature for the region in degrees Celsius | +| `base_humidity` | Base humidity for the region in relative humidity % | +| `base_pressure` | Base pressure for the region in millibars. | +| `base_acid` | Base acid for the region in ? units. Value >= 1 is considered acidic. | +| `base_wind` | Base wind for the region in mph units. Roughly the yearly average. | +| `base_wind_distrib_peaks` | How high the wind peaks can go. Higher values produce windier days. | +| `base_wind_season_variation` | How the wind varies with season. Lower values produce more variation | +| `weather_types` | Ids of the weather types allowed in this region. First value will be the default weather type. Declaration order will affect weather selection, see [WEATHER_TYPE.md](WEATHER_TYPE) for details. | ### Example diff --git a/doc/TER_FURN_TRANSFORM.md b/doc/src/content/docs/en/mod/json/reference/map/ter_furn_transform.md similarity index 98% rename from doc/TER_FURN_TRANSFORM.md rename to doc/src/content/docs/en/mod/json/reference/map/ter_furn_transform.md index 5cfd6f9e9688..9aa12f8f9d0e 100644 --- a/doc/TER_FURN_TRANSFORM.md +++ b/doc/src/content/docs/en/mod/json/reference/map/ter_furn_transform.md @@ -1,4 +1,6 @@ -# ter_furn_transform +--- +title: ter_furn_transform +--- A ter_furn_transform is a type of json object that allows you to specify a transformation of a tile from one terrain to another terrain, and from one furniture to another furniture. diff --git a/doc/WEATHER_TYPE.md b/doc/src/content/docs/en/mod/json/reference/map/weather_type.md similarity index 99% rename from doc/WEATHER_TYPE.md rename to doc/src/content/docs/en/mod/json/reference/map/weather_type.md index 14cb84205926..a402f8d9ea26 100644 --- a/doc/WEATHER_TYPE.md +++ b/doc/src/content/docs/en/mod/json/reference/map/weather_type.md @@ -1,4 +1,6 @@ -## Weather_type +--- +title: Weather Types +--- Weather type specifies conditions under which it can occur (temperature, humidity, pressure, windpower, time of day, etc.) and what effects it causes on the game world and reality bubble. diff --git a/doc/src/content/docs/en/mod/json/reference/mod_info.md b/doc/src/content/docs/en/mod/json/reference/mod_info.md new file mode 100644 index 000000000000..123210975226 --- /dev/null +++ b/doc/src/content/docs/en/mod/json/reference/mod_info.md @@ -0,0 +1,48 @@ +--- +title: MOD_INFO +--- + +Also see [MODDING.md](../tutorial/modding.md). + +Object with `MOD_INFO` type describes the mod itself. Each mod must have exactly one `MOD_INFO`, and +unlike other types of objects from mods it is loaded on game launch, before the title screen shows +up. As such, any and all errors related to it will show up before the title screen shows up. + +Current convention is to put your `MOD_INFO` in `mod_info.json` file within the root directory of +the mod. + +Example: + +```json +[ + { + "type": "MOD_INFO", + + // Mod's unique identifier, prefer to use only ASCII letters, numbers and underscore for clarity. + "id": "better_zeds", + // Mod's category, see MODDING.md for list of supported values. + "category": "content", + // Mod's display name, in English. + "name": "Better Zombies", + // Mod's description, in English. + "description": "Reworks all base game zombies and adds 100+ new variants.", + // Original author(s) of the mod. + "authors": ["That Guy", "His Friend"], + // If the author(s) abandoned the mod for some reason, this entry lists current maintainers. + "maintainers": ["Mr. BugFixer", "BugFixer Jr."], + // Mod version string. This is for users' and maintainers' convenience, so you can use whatever is most convenient here (e.g. date). + "version": "2021-12-02", + // List of mod's dependencies. Dependencies are guaranteed to be loaded before the mod is loaded. + "dependencies": ["bn", "zed_templates"], + // List of mods that are incompatible with this mod. + "conflicts": ["worse_zeds"], + // Special flag for core game data, can only be used by total overhaul mods. Only 1 core mod can be loaded at a time. + "core": false, + // Marks mod as obsolete. Obsolete mods don't show up in mod selection list by default, and have a warning on them. + "obsolete": false, + // Path of mod's files relative to the modinfo.json file. The game automatically loads all files from the folder with modinfo.json, + // and all the subfolders, so this field is only useful when you for whatever reason want to stick your modinfo.json in a subfolder of your mod. + "path": "../common-data/" + } +] +``` diff --git a/doc/src/content/docs/en/mod/json/reference/scenarios.md b/doc/src/content/docs/en/mod/json/reference/scenarios.md new file mode 100644 index 000000000000..f0b142b9940f --- /dev/null +++ b/doc/src/content/docs/en/mod/json/reference/scenarios.md @@ -0,0 +1,148 @@ +--- +title: Scenarios +--- + +Scenarios are specified as JSON object with `type` member set to `scenario`. + +```json +{ + "type": "scenario", + "id": "schools_out", + ... +} +``` + +The id member should be the unique id of the scenario. + +The following properties (mandatory, except if noted otherwise) are supported: + +## `description` + +(string) + +The in-game description. + +## `name` + +(string or object with members "male" and "female") + +The in-game name, either one gender-neutral string, or an object with gender specific names. +Example: + +```json +"name": { + "male": "Runaway groom", + "female": "Runaway bride" +} +``` + +## `points` + +(integer) + +Point cost of scenario. Positive values cost points and negative values grant points. + +## `items` + +(optional, object with optional members "both", "male" and "female") + +Items the player starts with when selecting this scenario. One can specify different items based on +the gender of the character. Each lists of items should be an array of items ids. Ids may appear +multiple times, in which case the item is created multiple times. + +Example: + +```json +"items": { + "both": [ + "pants", + "rock", + "rock" + ], + "male": [ "briefs" ], + "female": [ "panties" ] +} +``` + +This gives the player pants, two rocks and (depending on the gender) briefs or panties. + +Mods can modify the lists of an existing scenario via "add:both" / "add:male" / "add:female" and +"remove:both" / "remove:male" / "remove:female". + +Example for mods: + +```json +{ + "type": "scenario", + "id": "schools_out", + "edit-mode": "modify", + "items": { + "remove:both": ["rock"], + "add:female": ["2x4"] + } +} +``` + +## `flags` + +(optional, array of strings) + +A list of flags. TODO: document those flags here. + +Mods can modify this via "add:flags" and "remove:flags". + +## `cbms` + +(optional, array of strings) + +A list of CBM ids that are implanted in the character. + +Mods can modify this via "add:CBMs" and "remove:CBMs". + +## `traits", "forced_traits", "forbidden_traits` + +(optional, array of strings) + +Lists of trait/mutation ids. Traits in "forbidden_traits" are forbidden and can't be selected during +the character creation. Traits in "forced_traits" are automatically added to character. Traits in +"traits" enables them to be chosen, even if they are not starting traits. + +Mods can modify this via "add:traits" / "add:forced_traits" / "add:forbidden_traits" and +"remove:traits" / "remove:forced_traits" / "remove:forbidden_traits". + +## `allowed_locs` + +(optional, array of strings) + +A list of starting location ids (see start_locations.json) that can be chosen when using this +scenario. + +## `start_name` + +(string) + +The name that is shown for the starting location. This is useful if the scenario allows several +starting locations, but the game can not list them all at once in the scenario description. Example: +if the scenario allows to start somewhere in the wilderness, the starting locations would contain +forest and fields, but its "start_name" may simply be "wilderness". + +## `professions` + +(optional, array of strings) + +A list of allowed professions that can be chosen when using this scenario. The first entry is the +default profession. If this is empty, all professions are allowed. + +## `map_special` + +(optional, string) + +Add a map special to the starting location, see JSON_FLAGS for the possible specials. + +## `missions` + +(optional, array of strings) + +A list of mission ids that will be started and assigned to the player at the start of the game. Only +missions with the ORIGIN_GAME_START origin are allowed. The last mission in the list will be the +active mission, if multiple missions are assigned. diff --git a/doc/SOUNDPACKS.md b/doc/src/content/docs/en/mod/json/reference/soundpacks.md similarity index 95% rename from doc/SOUNDPACKS.md rename to doc/src/content/docs/en/mod/json/reference/soundpacks.md index 6f21ca751a1b..5f09086bee88 100644 --- a/doc/SOUNDPACKS.md +++ b/doc/src/content/docs/en/mod/json/reference/soundpacks.md @@ -1,4 +1,6 @@ -# Soundpacks +--- +title: Soundpacks +--- A soundpack can be installed in the `data/sound` directory. It has to be a subdirectory that contains at least a file named `soundpack.txt`. It can include any number of json files which add @@ -23,15 +25,15 @@ VIEW: Basic Sound effects can be included with a format like this: -```javascript -;[ +```json +[ { "type": "sound_effect", "id": "menu_move", "volume": 100, "files": [ - "nenadsimic_menu_selection_click.wav", - ], + "nenadsimic_menu_selection_click.wav" + ] }, { "type": "sound_effect", @@ -39,9 +41,9 @@ Sound effects can be included with a format like this: "volume": 90, "variant": "bio_laser_gun", "files": [ - "guns/energy_generic/weapon_fire_laser.ogg", - ], - }, + "guns/energy_generic/weapon_fire_laser.ogg" + ] + } ] ``` @@ -60,23 +62,27 @@ more-quietly than your editor does. Sound effects can be included for preloading with a format like this: -```javascript -;[ +```json +[ { "type": "sound_effect_preload", "preload": [ { "id": "fire_gun", "variant": "all" }, { "id": "environment", "variant": "daytime" }, - { "id": "environment" }, - ], - }, + { "id": "environment" } + ] + } ] ``` `"variant": "all"` will be treated specially and load all variants of the given id. -> [!WARNING] `"variant": "all"` uses unoptimal algorithm (because the devs were dumb and lazy and -> used hacks) and will slow down game loading time. +:::warning + +`"variant": "all"` uses unoptimal algorithm (because the dev was dumb and lazy and used hacks) and +will slow down game loading time. + +::: If `"variant"` is omitted, it defaults to `"default"`. @@ -84,8 +90,8 @@ If `"variant"` is omitted, it defaults to `"default"`. A playlist can be included with a format like this: -```javascript -;[ +```json +[ { "type": "playlist", "playlists": [ @@ -95,16 +101,16 @@ A playlist can be included with a format like this: "files": [ { "file": "Dark_Days_Ahead_demo_2.wav", - "volume": 100, + "volume": 100 }, { "file": "cataclysmthemeREV6.wav", - "volume": 90, - }, - ], - }, - ], - }, + "volume": 90 + } + ] + } + ] + } ] ``` @@ -114,7 +120,7 @@ played instead. The file name of the sound effect is relative to the soundpack d file name is set to "sfx.wav" and your soundpack is in `data/sound/mypack`, the file must be placed at `data/sound/mypack/sfx.wav`. -## JSON Format Sound Effects List +## Sound effects list A full list of sound effect id's and variants is given in the following. Each line in the list has the following format: diff --git a/doc/src/content/docs/en/mod/json/reference/starting_locations.md b/doc/src/content/docs/en/mod/json/reference/starting_locations.md new file mode 100644 index 000000000000..0398b07defb2 --- /dev/null +++ b/doc/src/content/docs/en/mod/json/reference/starting_locations.md @@ -0,0 +1,38 @@ +--- +title: Starting locations +--- + +Starting locations are specified as JSON object with "type" member set to "start_location": + +```json +{ + "type": "start_location", + "id": "field", + "name": "An empty field", + "target": "field", + ... +} +``` + +The id member should be the unique id of the location. + +The following properties (mandatory, except if noted otherwise) are supported: + +## `name` + +(string) + +The in-game name of the location. + +## `target` + +(string) + +The id of an overmap terrain type (see overmap_terrain.json) of the starting location. The game will +chose a random place with that terrain. + +## `flags` + +(optional, array of strings) + +Arbitrary flags. Mods can modify this via "add:flags" / "remove:flags". TODO: document them. diff --git a/doc/unicode_chars_palette.txt b/doc/src/content/docs/en/mod/json/reference/unicode_chars_palette.md similarity index 98% rename from doc/unicode_chars_palette.txt rename to doc/src/content/docs/en/mod/json/reference/unicode_chars_palette.md index d25cdfb0b443..e88f4fe2e0e4 100644 --- a/doc/unicode_chars_palette.txt +++ b/doc/src/content/docs/en/mod/json/reference/unicode_chars_palette.md @@ -1,4 +1,6 @@ -# Unicode chars palette: +--- +title: Unicode chars palette +--- ## 2460—24FF Enclosed Alphanumerics @@ -13,7 +15,6 @@ ⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾⓿ ``` - ## 2500—257F Box Drawing ``` @@ -30,7 +31,6 @@ ▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟ ``` - ## 25A0—25FF Geometric Shapes ``` @@ -43,14 +43,12 @@ ◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿ ``` - ## 2600—26FF Miscellaneous Symbols ``` ☀☁☂☃☄★☆☇☈☉☊☋☌☍☎☏☐☑☒☓☔☕☖☗☘☙☚☛☜☝☞☟☠☡☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☺☻☼☽☾☿♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♠♡♢♣♤♥♦♧♨♩♪♫♬♭♮♯♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓⚔⚕⚖⚗⚘⚙⚚⚛⚜⚝⚞⚟⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯⚰⚱⚲⚳⚴⚵⚶⚷⚸⚹⚺⚻⚼⚽⚾⚿⛀⛁⛂⛃⛄⛅⛆⛇⛈⛉⛊⛋⛌⛍⛎⛏⛐⛑⛒⛓⛔⛕⛖⛗⛘⛙⛚⛛⛜⛝⛞⛟⛠⛡⛢⛣⛤⛥⛦⛧⛨⛩⛪⛫⛬⛭⛮⛯⛰⛱⛲⛳⛴⛵⛶⛷⛸⛹⛺⛻⛼⛽⛾⛿ ``` - ## 2700—27BF Dingbats ``` @@ -69,21 +67,18 @@ ➳➴➵➶➷➸➹➺➻➼➽➾➿ ``` - ## 27C0—27EF Miscellaneous Mathematical Symbols-A ``` ⟀⟁⟂⟃⟄⟅⟆⟇⟈⟉⟊⟋⟌⟍⟎⟏⟐⟑⟒⟓⟔⟕⟖⟗⟘⟙⟚⟛⟜⟝⟞⟟⟠⟡⟢⟣⟤⟥⟦⟧⟨⟩⟪⟫⟬⟭⟮⟯ ``` - ## 27F0—27FF Supplemental Arrows-A ``` ⟰⟱⟲⟳⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽⟾⟿ ``` - ## 2800—28FF Braille Patterns ``` @@ -96,7 +91,6 @@ ⣼⣽⣾⣿ ``` - ## 2900—297F Supplemental Arrows-B ``` @@ -111,14 +105,12 @@ ⥰⥱⥲⥳⥴⥵⥶⥷⥸⥹⥺⥻⥼⥽⥾⥿ ``` - ## 2980—29FF Miscellaneous Mathematical Symbols-B ``` ⦀⦁⦂⦃⦄⦅⦆⦇⦈⦉⦊⦋⦌⦍⦎⦏⦐⦑⦒⦓⦔⦕⦖⦗⦘⦙⦚⦛⦜⦝⦞⦟⦠⦡⦢⦣⦤⦥⦦⦧⦨⦩⦪⦫⦬⦭⦮⦯⦰⦱⦲⦳⦴⦵⦶⦷⦸⦹⦺⦻⦼⦽⦾⦿⧀⧁⧂⧃⧄⧅⧆⧇⧈⧉⧊⧋⧌⧍⧎⧏⧐⧑⧒⧓⧔⧕⧖⧗⧘⧙⧚⧛⧜⧝⧞⧟⧠⧡⧢⧣⧤⧥⧦⧧⧨⧩⧪⧫⧬⧭⧮⧯⧰⧱⧲⧳⧴⧵⧶⧷⧸⧹⧺⧻⧼⧽⧾⧿ ``` - ## 2A00—2AFF Supplemental Mathematical Operators ``` @@ -136,8 +128,7 @@ ⫮⫯⫰⫱⫲⫳⫴⫵⫶⫷⫸⫹⫺⫻⫼⫽⫾⫿ ``` - -## 2B00—2BFF Miscellaneous Symbols and Arrows +## 2B00—2BFF Miscellaneous Symbols and Arrows ``` ⬀⬁⬂⬃⬄⬅⬆⬇⬈⬉⬊⬋⬌⬍ @@ -153,4 +144,3 @@ ⯐⯑⯒⯓⯔⯕⯖⯗⯘⯙⯚⯛⯜⯝⯞⯟⯠⯡⯢⯣⯤⯥⯦⯧ ⯨⯩⯪⯫⯬⯭⯮⯯⯰⯱⯲⯳⯴⯵⯶⯷⯸⯹⯺⯻⯼⯽⯾⯿ ``` - diff --git a/doc/VEHICLES_JSON.md b/doc/src/content/docs/en/mod/json/reference/vehicles_json.md similarity index 95% rename from doc/VEHICLES_JSON.md rename to doc/src/content/docs/en/mod/json/reference/vehicles_json.md index 7cddfb36d046..77319dac0463 100644 --- a/doc/VEHICLES_JSON.md +++ b/doc/src/content/docs/en/mod/json/reference/vehicles_json.md @@ -1,4 +1,6 @@ -# Vehicle prototypes JSON file contents +--- +title: Vehicle prototypes +--- Vehicle prototypes are used to spawn stock vehicles. After a vehicle has been spawned, it is saved in a different format. @@ -7,7 +9,7 @@ Vehicle prototypes do not currently accept copy-from ## vehicle prototypes -```C++ +```json "type": "vehicle", "id": "sample_vehicle", // Unique ID. Must be one continuous word, // use underscores if necessary. @@ -42,8 +44,8 @@ can't stack non-stackable part flags). ### Parts list -The part list contains an arbitary number of lines. Each line is of the form: { "x": X, "y": Y, -"part": PARTID, ... } or { "x": X, "y": Y, "parts": [ PARTID1, ... ] } +The part list contains an arbitary number of lines. Each line is of the form: +`{ "x": X, "y": Y, "part": PARTID, ... }` or `{ "x": X, "y": Y, "parts": [ PARTID1, ... ] }` In the first form, the line defines a single part at location X,Y of vehicle part type PARTID. It can have the optional "ammo", "ammo_types", "ammo_qty", or "fuel" keys with an appropriate value @@ -62,7 +64,7 @@ wheel, but after the frame. The items list contains an arbitrary number of lines. Each line is of the form: { "x": X, "y": Y, TYPE: DATA }, and describes the items that may spawn at that location. TYPE and DATA may be one of: -```C++ +```json "items": "itemid" // single item of that type "items": [ "itemid1", "itemid2", ... ] // all the items in the array "item_groups": "groupid" // one or more items in the group, depending on diff --git a/doc/MODDING.md b/doc/src/content/docs/en/mod/json/tutorial/modding.md similarity index 91% rename from doc/MODDING.md rename to doc/src/content/docs/en/mod/json/tutorial/modding.md index 8fc2f5ea7137..8afb77fe49b5 100644 --- a/doc/MODDING.md +++ b/doc/src/content/docs/en/mod/json/tutorial/modding.md @@ -1,11 +1,20 @@ -# Modding guide +--- +title: Modding guide +--- + +:::danger{title="Most of the documentations are not up-to date"} + +Most of the documentations are outdated (unchanged since fork from CDDA) and may not work as +expected. Updates are welcome. + +::: Certain features of the game can be modified without rebuilding the game from source code. This includes professions, monsters, npcs, and more. Just modify the pertinent files and run the game to see your changes. The majority of modding is done by editing JSON files. An in-depth review of all json files and -their appropriate fields is available in [JSON_INFO.md](JSON_INFO.md). +their appropriate fields is available in [JSON_INFO](../reference/JSON_INFO). ## The basics @@ -63,7 +72,7 @@ present in another mod. If you have no dependencies outside of the core game, th `dda` in the list is good enough. If your mod depends on another one to work properly, adding that mod's `id` attribute to the array causes Cataclysm to force that mod to load before yours. -For more details on `MOD_INFO` object, see [JSON_INFO.md](JSON_INFO.md#mod_info). +For more details on `MOD_INFO` object, see [JSON_INFO.md](../reference/json_info#mod_info). ## Actually adding things to your mod @@ -77,12 +86,12 @@ otherwise, there are no restrictions on what you can put where. ### JSON_INFO.md -It's worth reading [JSON_INFO.md](JSON_INFO.md) to get a comprehensive list of everything you can do -with these mods. The rest of this document will have a few examples to copy and paste, but it is by -no means comprehensive. The base game's data is also defined in the same way as any mod you write, -so taking a look through the game's json files (in `data/json`) can also teach you a lot. If the -game finds any issues in your JSON syntax when you try to load a game world, it will spit out an -error message, and you won't be able to load that game until the issue is fixed. +It's worth reading [JSON_INFO.md](../reference/json_info) to get a comprehensive list of everything +you can do with these mods. The rest of this document will have a few examples to copy and paste, +but it is by no means comprehensive. The base game's data is also defined in the same way as any mod +you write, so taking a look through the game's json files (in `data/json`) can also teach you a lot. +If the game finds any issues in your JSON syntax when you try to load a game world, it will spit out +an error message, and you won't be able to load that game until the issue is fixed. ### Adding a scenario @@ -167,8 +176,8 @@ Police Officer profession: ### Adding an item -Items are where you really want to read the [JSON_INFO.md](JSON_INFO.md) file, just because there's -so much that you can do with them, and every category of item is a little bit different. +Items are where you really want to read the [JSON_INFO](../reference/json_info) file, just because +there's so much that you can do with them, and every category of item is a little bit different. diff --git a/doc/src/content/docs/en/mod/lua/explanation/lua_integration.md b/doc/src/content/docs/en/mod/lua/explanation/lua_integration.md new file mode 100644 index 000000000000..7521163222ed --- /dev/null +++ b/doc/src/content/docs/en/mod/lua/explanation/lua_integration.md @@ -0,0 +1,52 @@ +--- +title: C++ Lua integration +--- + +This document describes implementation details behind Lua integration in Cataclysm: Bright Nights. + +BN uses Lua 5.3.6 to run scripts and relies on sol2 v3.3.0 for bindings on C++ side. + +## C++ layout + +Lua build can be enabled by passing `LUA=1` to the Makefile, or enabling `LUA` build switch in CMake +builds. Both msvc and android for simplicity always build with Lua **enabled**. + +### Lua source files + +To simplify build setup and improve portability we bundle `Lua 5.3.6` source code in `src/lua/` +directory and have the build systems compile it and link into the game executable and library for +tests. + +### Sol2 source files + +Sol2 makes it easy to bundle, we have `sol2 v3.3.0` single-header amalgamated version in `src/sol/` +and just include it as needed. The header is quite large, so the less source files include it the +better. + +- `sol/config.hpp` - Configuration header, we have a few options defined there +- `sol/forward.hpp` - Forward declarations, a lightweight header that should be included in game + headers instead of `sol/sol.hpp` +- `sol/sol.hpp` - Main sol2 header file, quite large, avoid including in game headers + +### Game source files + +All Lua-related game source files have the `catalua` prefix. + +If you want to add new bindings, consider looking at existing examples in `src/catalua_bindings.cpp` +and reading relevant part of Sol2 docs. + +- `catalua.h` (and `catalua.cpp`) - Main Lua interface. It's the only header most of the codebase + will have to include, and it provides a public interface that works in both `LUA=1` and `LUA=0` + builds ( in builds without Lua, most of the functions there are no-op ). +- `catalua_sol.h` and `catalua_sol_fwd.h` - Wrappers for `sol/sol.hpp` and `sol/forward.hpp` with + custom pragmas to make them compile. +- `catalua_bindings*` - Game Lua bindings live here. +- `catalua_console.h`(`.cpp`) - Ingame Lua console. +- `catalua_impl.h`(`.cpp`) - Implementation details for `catalua.h`(`.cpp`). +- `catalua_iuse_actor.h`(`.cpp`) - Lua-driven `iuse_actor`. +- `catalua_log.h`(`.cpp`) - In-memory logging for the console. +- `catalua_luna.h` - Usertype registration interface with automatic doc generation, aka `luna`. +- `catalua_luna_doc.h` - List of types registration through `luna` or exposed to its doc generator. +- `catalua_readonly.h`(`.cpp`) - Functions for marking Lua tables as read-only. +- `catalua_serde.h`(`.cpp`) - Lua table to/from JSON (de-)serialization. +- `catalua_type_operators.h` - Macro that helps with implementing bindings for string_ids diff --git a/doc/src/content/docs/en/mod/lua/guides/binding.md b/doc/src/content/docs/en/mod/lua/guides/binding.md new file mode 100644 index 000000000000..7c906863d029 --- /dev/null +++ b/doc/src/content/docs/en/mod/lua/guides/binding.md @@ -0,0 +1,169 @@ +--- +title: Binding new type +--- + +### Adding new type to the doc generator without binding internals + +If a C++ type has not been registered in the doc generator, it will show up as +``. To mitigate this problem, you can add +`LUNA_VAL( your_type, "YourType" )` in `catalua_luna_doc.h`, and the generator will use `YourType` +string for argument type. + +### Binding new type to Lua + +First, we need to register the new type with the bindings system. It needs to be done for many +reasons, including so that the doc generator understands it, and the runtime can deserialize from +JSON any Lua table that contains that type. If you don't you'll get a compile error saying +`Type must implement luna_traits`. + +1. In `catala_luna_doc.h`, add declaration for your type. For example, if we're binding an imaginary + `horde` type (which is a `struct`), it will be a single line near the top of the file: + ```cpp + struct horde; + ``` + Complex templated types may need to actually pull in the relevant header, but please avoid it as + it heavily impacts compilation times. + +2. In the same file, register your type with the doc generator. Continuing with the `horde` example, + it's done like this: + ```cpp + LUNA_VAL( horde, "Horde" ); + ``` + While C++ types use all kinds of style for their names, on Lua side they all should be in + `CamelCase`. + +Now we can actually get to the details. The bindings are implemented in `catalua_bindings*.cpp` +files. They are spread out into multiple `.cpp` files to speed up compilation and make it easy to +navigate, so you can put yours into any existing `catalua_bindings*.cpp` file or make your own +similar file. They are also spread out into functions, for the same reasons. Let's register our +`horde` type, and put it in a new file and a new function: + +1. Add a new function declaration in `catalua_bindings.h`: + ```cpp + void reg_horde( sol::state &lua ); + ``` +2. Call the function in `reg_all_bindings` in `catalua_bindings.cpp`: + ```cpp + reg_horde( lua ); + ``` +3. Make a new file, `catalua_bindings_horde.cpp`, with the following contents: + ```cpp + #ifdef LUA + #include "catalua_bindings.h" + + #include "horde.h" // Replace with the header where your type is defined + + void cata::detail::reg_horde( sol::state &lua ) + { + sol::usertype ut = + luna::new_usertype( + lua, + luna::no_bases, + luna::constructors < + // Define your actual constructors here + horde(), + horde( const point & ), + horde( int, int ) + > () + ); + + // Register all needed members + luna::set( ut, "pos", &horde::pos ); + luna::set( ut, "size", &horde::size ); + + // Register all needed methods + luna::set_fx( ut, "move_to", &horde::move_to ); + luna::set_fx( ut, "update", &horde::update ); + luna::set_fx( ut, "get_printable_name", &horde::get_printable_name ); + + // Add (de-)serialization functions so we can carry + // our horde over the save/load boundary + reg_serde_functions( ut ); + + // Add more stuff like arithmetic operators, to_string operator, etc. + } + ``` +4. That's it. Your type is now visible in Lua under name `Horde`, and you can use the binded methods + and members. + +### Binding new enum to Lua + +Binding enums is similar to binding types. Let's bind an imaginary `horde_type` enum here: + +1. If enum does not have an explicitly defined container (the `: type` part after `enum name` in the + header where it's defined), you'll have to specify the container first, for example: + ```diff + // hordes.h + - enum class horde_type { + + enum class horde_type : int { + animals, + robots, + zombies + } + ``` +2. Add the declaration to `catalua_luna_doc.h` + ```cpp + enum horde_type : int; + ``` +3. Register it in `catalua_luna_doc.h` with + ```cpp + LUNA_ENUM( horde_type, "HordeType" ) + ``` +4. Ensure the enum implements the automatic conversion to/from `std::string`, see + `enum_conversions.h` for details. Some enums will already have it, but most won't. Usually it's + just a matter of specializing `enum_traits` for your enum `T` in the header, then defining + `io::enum_to_string` in the `.cpp` file with enum -> string conversion. Some enums won't have + the "last" value required for `enum_traits`. In that case, you'd have to add one: + ```diff + enum class horde_type : int { + animals, + robots, + - zombies + + zombies, + + num_horde_types + } + ``` + Note that this only works for "monotonic" enums, i.e. ones that start with 0 and don't skip any + values. In the example above, `animals` has implicit value of `0`, robots has implicit value of + `1` and `zombies` has implicit value of `2`, so we can easily add `num_horde_types`, which will + have correct and expected implicit value of `3`. +5. Bind enum fields in `reg_enums` function in `catalua_bindings.cpp`: + ```cpp + reg_enum( lua ); + ``` + This uses the automatic convertion from step 4, so we have equal names between JSON and Lua. + +### Binding new `string_id` or `int_id` to Lua + +Binding these can be done separately from binding `T` itself. + +1. Register your type `T` with the doc generator if you haven't already (see + [relevant docs](#adding-new-type-to-the-doc-generator-without-binding-internals)). +2. Replace `LUNA_VAL` from step 1 with `LUNA_ID`. +3. Ensure your type `T` implements operators `<` and `==`. It's usually easy implement them + manually, and can be done semi-automatically with macro `LUA_TYPE_OPS` found in + `catalua_type_operators.h`. +4. In `catalua_bindings_ids.cpp`, add the header where your type T is defined: + ```cpp + #include "your_type_definition.h" + ``` +5. In `reg_game_ids` function, register it like so: + ```cpp + reg_id( lua ); + ``` + +That `true` can be replaced with `false` if you only want to bind `string_id` and don't care +about (or can't implement) `int_id`. + +You may get linker errors at this stage, e.g. about `is_valid()` or `NULL_ID()` methods, which are +for various reasons not implemented forall string or int ids. In this case, you'll have to define +these manually, see relevant docs on `string_id` and `int_id` for more info. + +And that's it. Now, your type `T` will show up in Lua with `Raw` postfix, `string_id` will have +`Id` postfix, and `int_id` will have `IntId` postfix. As example, for +`LUNA_ID( horde, "Horde" )`, we'll get: + +- `horde` -> `HordeRaw` +- `string_id` -> `HordeId` +- `int_id` -> `HordeIntId` All type conversions between the 3 are implemented automatically + by the system. Actual fields and methods of `T` can be binded to Lua same way as usual. diff --git a/doc/src/content/docs/en/mod/lua/reference/lua.md b/doc/src/content/docs/en/mod/lua/reference/lua.md new file mode 100644 index 000000000000..5b09b678a1be --- /dev/null +++ b/doc/src/content/docs/en/mod/lua/reference/lua.md @@ -0,0 +1,1768 @@ +--- +title: Lua API reference +editUrl: false +sidebar: + badge: + text: Generated + status: note +--- + +:::note + +This page is auto-generated from [`data/raw/generate_docs.lua`][generate_docs] and should not be +edited directly. + +[generate_docs]: https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/raw/generate_docs.lua + +::: + +## Avatar + +### Bases + +- `Player` +- `Character` +- `Creature` + +### Constructors + +No constructors. + +### Members + +No members. + +## BodyPartTypeId + +### Bases + +No base classes. + +### Constructors + +#### `BodyPartTypeId.new()` + +#### `BodyPartTypeId.new( BodyPartTypeId )` + +#### `BodyPartTypeId.new( BodyPartTypeIntId )` + +#### `BodyPartTypeId.new( string )` + +### Members + +#### obj + +Function `( BodyPartTypeId ) -> BodyPartTypeRaw` + +#### int_id + +Function `( BodyPartTypeId ) -> BodyPartTypeIntId` + +#### implements_int_id + +Function `() -> bool` + +#### is_null + +Function `( BodyPartTypeId ) -> bool` + +#### is_valid + +Function `( BodyPartTypeId ) -> bool` + +#### str + +Function `( BodyPartTypeId ) -> string` + +#### NULL_ID + +Function `() -> BodyPartTypeId` + +#### __tostring + +Function `( BodyPartTypeId ) -> string` + +#### serialize + +Function `( BodyPartTypeId, )` + +#### deserialize + +Function `( BodyPartTypeId, )` + +## BodyPartTypeIntId + +### Bases + +No base classes. + +### Constructors + +#### `BodyPartTypeIntId.new()` + +#### `BodyPartTypeIntId.new( BodyPartTypeIntId )` + +#### `BodyPartTypeIntId.new( BodyPartTypeId )` + +### Members + +#### obj + +Function `( BodyPartTypeIntId ) -> BodyPartTypeRaw` + +#### str_id + +Function `( BodyPartTypeIntId ) -> BodyPartTypeId` + +#### is_valid + +Function `( BodyPartTypeIntId ) -> bool` + +#### __tostring + +Function `( BodyPartTypeIntId ) -> string` + +## Character + +### Bases + +- `Creature` + +### Constructors + +No constructors. + +### Members + +No members. + +## Creature + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### get_pos_ms + +Position within map Function `( Creature ) -> Tripoint` + +#### is_monster + +Function `( Creature ) -> bool` + +#### as_monster + +Function `( Creature ) -> Monster` + +#### is_npc + +Function `( Creature ) -> bool` + +#### as_npc + +Function `( Creature ) -> Npc` + +#### is_avatar + +Function `( Creature ) -> bool` + +#### as_avatar + +Function `( Creature ) -> Avatar` + +#### has_effect + +Function `( Creature, EffectTypeId, Opt(BodyPartTypeId) ) -> bool` + +#### get_effect_dur + +Function `( Creature, EffectTypeId, Opt(BodyPartTypeId) ) -> TimeDuration` + +#### get_effect_int + +Function `( Creature, EffectTypeId, Opt(BodyPartTypeId) ) -> int` + +#### add_effect + +Effect type, duration, bodypart and intensity Function +`( Creature, EffectTypeId, TimeDuration, Opt(BodyPartTypeId), Opt(int) )` + +#### remove_effect + +Function `( Creature, EffectTypeId, Opt(BodyPartTypeId) ) -> bool` + +## DistributionGrid + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### get_resource + +Boolean argument controls recursive behavior Function `( DistributionGrid, bool ) -> int` + +#### mod_resource + +Boolean argument controls recursive behavior Function `( DistributionGrid, int, bool ) -> int` + +## DistributionGridTracker + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### get_grid_at_abs_ms + +Function `( DistributionGridTracker, Tripoint ) -> DistributionGrid` + +## EffectTypeId + +### Bases + +No base classes. + +### Constructors + +#### `EffectTypeId.new()` + +#### `EffectTypeId.new( EffectTypeId )` + +#### `EffectTypeId.new( string )` + +### Members + +#### obj + +Function `( EffectTypeId ) -> EffectTypeRaw` + +#### implements_int_id + +Function `() -> bool` + +#### is_null + +Function `( EffectTypeId ) -> bool` + +#### is_valid + +Function `( EffectTypeId ) -> bool` + +#### str + +Function `( EffectTypeId ) -> string` + +#### NULL_ID + +Function `() -> EffectTypeId` + +#### __tostring + +Function `( EffectTypeId ) -> string` + +#### serialize + +Function `( EffectTypeId, )` + +#### deserialize + +Function `( EffectTypeId, )` + +## FactionId + +### Bases + +No base classes. + +### Constructors + +#### `FactionId.new()` + +#### `FactionId.new( FactionId )` + +#### `FactionId.new( string )` + +### Members + +#### obj + +Function `( FactionId ) -> FactionRaw` + +#### implements_int_id + +Function `() -> bool` + +#### is_null + +Function `( FactionId ) -> bool` + +#### is_valid + +Function `( FactionId ) -> bool` + +#### str + +Function `( FactionId ) -> string` + +#### NULL_ID + +Function `() -> FactionId` + +#### __tostring + +Function `( FactionId ) -> string` + +#### serialize + +Function `( FactionId, )` + +#### deserialize + +Function `( FactionId, )` + +## FactionRaw + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### str_id + +Function `( FactionRaw ) -> FactionId` + +## FieldTypeId + +### Bases + +No base classes. + +### Constructors + +#### `FieldTypeId.new()` + +#### `FieldTypeId.new( FieldTypeId )` + +#### `FieldTypeId.new( FieldTypeIntId )` + +#### `FieldTypeId.new( string )` + +### Members + +#### obj + +Function `( FieldTypeId ) -> FieldTypeRaw` + +#### int_id + +Function `( FieldTypeId ) -> FieldTypeIntId` + +#### implements_int_id + +Function `() -> bool` + +#### is_null + +Function `( FieldTypeId ) -> bool` + +#### is_valid + +Function `( FieldTypeId ) -> bool` + +#### str + +Function `( FieldTypeId ) -> string` + +#### NULL_ID + +Function `() -> FieldTypeId` + +#### __tostring + +Function `( FieldTypeId ) -> string` + +#### serialize + +Function `( FieldTypeId, )` + +#### deserialize + +Function `( FieldTypeId, )` + +## FieldTypeIntId + +### Bases + +No base classes. + +### Constructors + +#### `FieldTypeIntId.new()` + +#### `FieldTypeIntId.new( FieldTypeIntId )` + +#### `FieldTypeIntId.new( FieldTypeId )` + +### Members + +#### obj + +Function `( FieldTypeIntId ) -> FieldTypeRaw` + +#### str_id + +Function `( FieldTypeIntId ) -> FieldTypeId` + +#### is_valid + +Function `( FieldTypeIntId ) -> bool` + +#### __tostring + +Function `( FieldTypeIntId ) -> string` + +## FurnId + +### Bases + +No base classes. + +### Constructors + +#### `FurnId.new()` + +#### `FurnId.new( FurnId )` + +#### `FurnId.new( FurnIntId )` + +#### `FurnId.new( string )` + +### Members + +#### obj + +Function `( FurnId ) -> FurnRaw` + +#### int_id + +Function `( FurnId ) -> FurnIntId` + +#### implements_int_id + +Function `() -> bool` + +#### is_null + +Function `( FurnId ) -> bool` + +#### is_valid + +Function `( FurnId ) -> bool` + +#### str + +Function `( FurnId ) -> string` + +#### NULL_ID + +Function `() -> FurnId` + +#### __tostring + +Function `( FurnId ) -> string` + +#### serialize + +Function `( FurnId, )` + +#### deserialize + +Function `( FurnId, )` + +## FurnIntId + +### Bases + +No base classes. + +### Constructors + +#### `FurnIntId.new()` + +#### `FurnIntId.new( FurnIntId )` + +#### `FurnIntId.new( FurnId )` + +### Members + +#### obj + +Function `( FurnIntId ) -> FurnRaw` + +#### str_id + +Function `( FurnIntId ) -> FurnId` + +#### is_valid + +Function `( FurnIntId ) -> bool` + +#### __tostring + +Function `( FurnIntId ) -> string` + +## FurnRaw + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### str_id + +Function `( FurnRaw ) -> FurnId` + +#### int_id + +Function `( FurnRaw ) -> FurnIntId` + +#### open + +Variable of type `FurnId` + +#### close + +Variable of type `FurnId` + +#### transforms_into + +Variable of type `FurnId` + +## Item + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### get_type + +Function `( Item ) -> ItypeId` + +#### has_var + +Check for variable of any type Function `( Item, string ) -> bool` + +#### erase_var + +Erase variable Function `( Item, string )` + +#### clear_vars + +Erase all variables Function `( Item )` + +#### get_var_str + +Get variable as string Function `( Item, string, string ) -> string` + +#### get_var_num + +Get variable as float number Function `( Item, string, double ) -> double` + +#### get_var_tri + +Get variable as tripoint Function `( Item, string, Tripoint ) -> Tripoint` + +#### set_var_str + +Function `( Item, string, string )` + +#### set_var_num + +Function `( Item, string, double )` + +#### set_var_tri + +Function `( Item, string, Tripoint )` + +## ItemStack + +Iterate over this using pairs() + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### __pairs + +Function +`( ItemStack ) -> ( , , nil )` + +## ItypeId + +### Bases + +No base classes. + +### Constructors + +#### `ItypeId.new()` + +#### `ItypeId.new( ItypeId )` + +#### `ItypeId.new( string )` + +### Members + +#### obj + +Function `( ItypeId ) -> ItypeRaw` + +#### implements_int_id + +Function `() -> bool` + +#### is_null + +Function `( ItypeId ) -> bool` + +#### is_valid + +Function `( ItypeId ) -> bool` + +#### str + +Function `( ItypeId ) -> string` + +#### NULL_ID + +Function `() -> ItypeId` + +#### __tostring + +Function `( ItypeId ) -> string` + +#### serialize + +Function `( ItypeId, )` + +#### deserialize + +Function `( ItypeId, )` + +## Map + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### get_abs_ms + +Convert local ms -> absolute ms Function `( Map, Tripoint ) -> Tripoint` + +#### get_local_ms + +Convert absolute ms -> local ms Function `( Map, Tripoint ) -> Tripoint` + +#### get_map_size_in_submaps + +Function `( Map ) -> int` + +#### get_map_size + +In map squares Function `( Map ) -> int` + +#### has_items_at + +Function `( Map, Tripoint ) -> bool` + +#### get_items_at + +Function `( Map, Tripoint ) -> ` + +#### get_ter_at + +Function `( Map, Tripoint ) -> TerIntId` + +#### set_ter_at + +Function `( Map, Tripoint, TerIntId ) -> bool` + +#### get_furn_at + +Function `( Map, Tripoint ) -> FurnIntId` + +#### set_furn_at + +Function `( Map, Tripoint, FurnIntId )` + +#### has_field_at + +Function `( Map, Tripoint, FieldTypeIntId ) -> bool` + +#### get_field_int_at + +Function `( Map, Tripoint, FieldTypeIntId ) -> int` + +#### get_field_age_at + +Function `( Map, Tripoint, FieldTypeIntId ) -> TimeDuration` + +#### mod_field_int_at + +Function `( Map, Tripoint, FieldTypeIntId, int ) -> int` + +#### mod_field_age_at + +Function `( Map, Tripoint, FieldTypeIntId, TimeDuration ) -> TimeDuration` + +#### set_field_int_at + +Function `( Map, Tripoint, FieldTypeIntId, int, bool ) -> int` + +#### set_field_age_at + +Function `( Map, Tripoint, FieldTypeIntId, TimeDuration, bool ) -> TimeDuration` + +#### add_field_at + +Function `( Map, Tripoint, FieldTypeIntId, int, TimeDuration ) -> bool` + +#### remove_field_at + +Function `( Map, Tripoint, FieldTypeIntId )` + +## MapStack + +### Bases + +- `ItemStack` + +### Constructors + +No constructors. + +### Members + +#### as_item_stack + +Function `( MapStack ) -> ItemStack` + +## Monster + +### Bases + +- `Creature` + +### Constructors + +No constructors. + +### Members + +No members. + +## Npc + +### Bases + +- `Player` +- `Character` +- `Creature` + +### Constructors + +No constructors. + +### Members + +No members. + +## Player + +### Bases + +- `Character` +- `Creature` + +### Constructors + +No constructors. + +### Members + +No members. + +## Point + +### Bases + +No base classes. + +### Constructors + +#### `Point.new()` + +#### `Point.new( Point )` + +#### `Point.new( int, int )` + +### Members + +#### x + +Variable of type `int` + +#### y + +Variable of type `int` + +#### abs + +Function `( Point ) -> Point` + +#### rotate + +Function `( Point, int, Point ) -> Point` + +#### serialize + +Function `( Point, )` + +#### deserialize + +Function `( Point, )` + +#### __tostring + +Function `( Point ) -> string` + +#### __eq + +Function `( Point, Point ) -> bool` + +#### __lt + +Function `( Point, Point ) -> bool` + +#### __add + +Function `( Point, Point ) -> Point` + +#### __sub + +Function `( Point, Point ) -> Point` + +#### __mul + +Function `( Point, int ) -> Point` + +#### __div + +Function `( Point, int ) -> Point` + +#### __idiv + +Function `( Point, int ) -> Point` + +#### __unm + +Function `( Point ) -> Point` + +## QueryPopup + +### Bases + +No base classes. + +### Constructors + +#### `QueryPopup.new()` + +### Members + +#### message + +Function `( QueryPopup, ... )` + +#### message_color + +Function `( QueryPopup, Color )` + +#### allow_any_key + +Set whether to allow any key Function `( QueryPopup, bool )` + +#### query + +Returns selected action Function `( QueryPopup ) -> string` + +## TerId + +### Bases + +No base classes. + +### Constructors + +#### `TerId.new()` + +#### `TerId.new( TerId )` + +#### `TerId.new( TerIntId )` + +#### `TerId.new( string )` + +### Members + +#### obj + +Function `( TerId ) -> TerRaw` + +#### int_id + +Function `( TerId ) -> TerIntId` + +#### implements_int_id + +Function `() -> bool` + +#### is_null + +Function `( TerId ) -> bool` + +#### is_valid + +Function `( TerId ) -> bool` + +#### str + +Function `( TerId ) -> string` + +#### NULL_ID + +Function `() -> TerId` + +#### __tostring + +Function `( TerId ) -> string` + +#### serialize + +Function `( TerId, )` + +#### deserialize + +Function `( TerId, )` + +## TerIntId + +### Bases + +No base classes. + +### Constructors + +#### `TerIntId.new()` + +#### `TerIntId.new( TerIntId )` + +#### `TerIntId.new( TerId )` + +### Members + +#### obj + +Function `( TerIntId ) -> TerRaw` + +#### str_id + +Function `( TerIntId ) -> TerId` + +#### is_valid + +Function `( TerIntId ) -> bool` + +#### __tostring + +Function `( TerIntId ) -> string` + +## TerRaw + +### Bases + +No base classes. + +### Constructors + +No constructors. + +### Members + +#### str_id + +Function `( TerRaw ) -> TerId` + +#### int_id + +Function `( TerRaw ) -> TerIntId` + +#### open + +Variable of type `TerId` + +#### close + +Variable of type `TerId` + +#### trap_id_str + +Variable of type `string` + +#### transforms_into + +Variable of type `TerId` + +#### roof + +Variable of type `TerId` + +#### heat_radiation + +Variable of type `int` + +## TimeDuration + +Represent duration between 2 fixed points in time + +### Bases + +No base classes. + +### Constructors + +#### `TimeDuration.new()` + +### Members + +#### from_turns + +Function `( int ) -> TimeDuration` + +#### from_seconds + +Function `( int ) -> TimeDuration` + +#### from_minutes + +Function `( int ) -> TimeDuration` + +#### from_hours + +Function `( int ) -> TimeDuration` + +#### from_days + +Function `( int ) -> TimeDuration` + +#### from_weeks + +Function `( int ) -> TimeDuration` + +#### make_random + +Function `( TimeDuration, TimeDuration ) -> TimeDuration` + +#### to_turns + +Function `( TimeDuration ) -> int` + +#### to_seconds + +Function `( TimeDuration ) -> int` + +#### to_minutes + +Function `( TimeDuration ) -> int` + +#### to_hours + +Function `( TimeDuration ) -> int` + +#### to_days + +Function `( TimeDuration ) -> int` + +#### to_weeks + +Function `( TimeDuration ) -> int` + +#### serialize + +Function `( TimeDuration, )` + +#### deserialize + +Function `( TimeDuration, )` + +#### __tostring + +Function `( TimeDuration ) -> string` + +#### __add + +Function `( TimeDuration, TimeDuration ) -> TimeDuration` + +#### __sub + +Function `( TimeDuration, TimeDuration ) -> TimeDuration` + +#### __mul + +Function `( TimeDuration, int ) -> TimeDuration` + +#### __div + +Function `( TimeDuration, int ) -> TimeDuration` + +#### __unm + +Function `( TimeDuration ) -> TimeDuration` + +## TimePoint + +Represent fixed point in time + +### Bases + +No base classes. + +### Constructors + +#### `TimePoint.new()` + +### Members + +#### from_turn + +Function `( int ) -> TimePoint` + +#### to_turn + +Function `( TimePoint ) -> int` + +#### is_night + +Function `( TimePoint ) -> bool` + +#### is_day + +Function `( TimePoint ) -> bool` + +#### is_dusk + +Function `( TimePoint ) -> bool` + +#### is_dawn + +Function `( TimePoint ) -> bool` + +#### second_of_minute + +Function `( TimePoint ) -> int` + +#### minute_of_hour + +Function `( TimePoint ) -> int` + +#### hour_of_day + +Function `( TimePoint ) -> int` + +#### serialize + +Function `( TimePoint, )` + +#### deserialize + +Function `( TimePoint, )` + +#### to_string_time_of_day + +Function `( TimePoint ) -> string` + +#### __tostring + +Function `( TimePoint ) -> string` + +#### __eq + +Function `( TimePoint, TimePoint ) -> bool` + +#### __lt + +Function `( TimePoint, TimePoint ) -> bool` + +#### __add + +Function `( TimePoint, TimeDuration ) -> TimePoint` + +#### __sub + +Function `( TimePoint, TimePoint ) -> TimeDuration` Function +`( TimePoint, TimeDuration ) -> TimePoint` + +## Tinymap + +### Bases + +- `Map` + +### Constructors + +No constructors. + +### Members + +No members. + +## Tripoint + +### Bases + +No base classes. + +### Constructors + +#### `Tripoint.new()` + +#### `Tripoint.new( Point, int )` + +#### `Tripoint.new( Tripoint )` + +#### `Tripoint.new( int, int, int )` + +### Members + +#### x + +Variable of type `int` + +#### y + +Variable of type `int` + +#### z + +Variable of type `int` + +#### abs + +Function `( Tripoint ) -> Tripoint` + +#### xy + +Function `( Tripoint ) -> Point` + +#### rotate_2d + +Function `( Tripoint, int, Point ) -> Tripoint` + +#### serialize + +Function `( Tripoint, )` + +#### deserialize + +Function `( Tripoint, )` + +#### __tostring + +Function `( Tripoint ) -> string` + +#### __eq + +Function `( Tripoint, Tripoint ) -> bool` + +#### __lt + +Function `( Tripoint, Tripoint ) -> bool` + +#### __add + +Function `( Tripoint, Tripoint ) -> Tripoint` Function `( Tripoint, Point ) -> Tripoint` + +#### __sub + +Function `( Tripoint, Tripoint ) -> Tripoint` Function `( Tripoint, Point ) -> Tripoint` + +#### __mul + +Function `( Tripoint, int ) -> Tripoint` + +#### __div + +Function `( Tripoint, int ) -> Tripoint` + +#### __idiv + +Function `( Tripoint, int ) -> Tripoint` + +#### __unm + +Function `( Tripoint ) -> Tripoint` + +## UiList + +### Bases + +No base classes. + +### Constructors + +#### `UiList.new()` + +### Members + +#### title + +Function `( UiList, string )` + +#### add + +Return value, text Function `( UiList, int, string )` + +#### query + +Returns retval for selected entry, or a negative number on fail/cancel Function `( UiList ) -> int` + +# Enums + +## Color + +### Entries + +- `c_black` = `0` +- `c_white` = `1` +- `c_light_gray` = `2` +- `c_dark_gray` = `3` +- `c_red` = `4` +- `c_green` = `5` +- `c_blue` = `6` +- `c_cyan` = `7` +- `c_magenta` = `8` +- `c_brown` = `9` +- `c_light_red` = `10` +- `c_light_green` = `11` +- `c_light_blue` = `12` +- `c_light_cyan` = `13` +- `c_pink` = `14` +- `c_yellow` = `15` +- `h_black` = `16` +- `h_white` = `17` +- `h_light_gray` = `18` +- `h_dark_gray` = `19` +- `h_red` = `20` +- `h_green` = `21` +- `h_blue` = `22` +- `h_cyan` = `23` +- `h_magenta` = `24` +- `h_brown` = `25` +- `h_light_red` = `26` +- `h_light_green` = `27` +- `h_light_blue` = `28` +- `h_light_cyan` = `29` +- `h_pink` = `30` +- `h_yellow` = `31` +- `i_black` = `32` +- `i_white` = `33` +- `i_light_gray` = `34` +- `i_dark_gray` = `35` +- `i_red` = `36` +- `i_green` = `37` +- `i_blue` = `38` +- `i_cyan` = `39` +- `i_magenta` = `40` +- `i_brown` = `41` +- `i_light_red` = `42` +- `i_light_green` = `43` +- `i_light_blue` = `44` +- `i_light_cyan` = `45` +- `i_pink` = `46` +- `i_yellow` = `47` +- `c_unset` = `48` +- `c_black_red` = `49` +- `c_white_red` = `50` +- `c_light_gray_red` = `51` +- `c_dark_gray_red` = `52` +- `c_red_red` = `53` +- `c_green_red` = `54` +- `c_blue_red` = `55` +- `c_cyan_red` = `56` +- `c_magenta_red` = `57` +- `c_brown_red` = `58` +- `c_light_red_red` = `59` +- `c_light_green_red` = `60` +- `c_light_blue_red` = `61` +- `c_light_cyan_red` = `62` +- `c_pink_red` = `63` +- `c_yellow_red` = `64` +- `c_black_white` = `65` +- `c_dark_gray_white` = `66` +- `c_light_gray_white` = `67` +- `c_white_white` = `68` +- `c_red_white` = `69` +- `c_light_red_white` = `70` +- `c_green_white` = `71` +- `c_light_green_white` = `72` +- `c_brown_white` = `73` +- `c_yellow_white` = `74` +- `c_blue_white` = `75` +- `c_light_blue_white` = `76` +- `c_magenta_white` = `77` +- `c_pink_white` = `78` +- `c_cyan_white` = `79` +- `c_light_cyan_white` = `80` +- `c_black_green` = `81` +- `c_dark_gray_green` = `82` +- `c_light_gray_green` = `83` +- `c_white_green` = `84` +- `c_red_green` = `85` +- `c_light_red_green` = `86` +- `c_green_green` = `87` +- `c_light_green_green` = `88` +- `c_brown_green` = `89` +- `c_yellow_green` = `90` +- `c_blue_green` = `91` +- `c_light_blue_green` = `92` +- `c_magenta_green` = `93` +- `c_pink_green` = `94` +- `c_cyan_green` = `95` +- `c_light_cyan_green` = `96` +- `c_black_yellow` = `97` +- `c_dark_gray_yellow` = `98` +- `c_light_gray_yellow` = `99` +- `c_white_yellow` = `100` +- `c_red_yellow` = `101` +- `c_light_red_yellow` = `102` +- `c_green_yellow` = `103` +- `c_light_green_yellow` = `104` +- `c_brown_yellow` = `105` +- `c_yellow_yellow` = `106` +- `c_blue_yellow` = `107` +- `c_light_blue_yellow` = `108` +- `c_magenta_yellow` = `109` +- `c_pink_yellow` = `110` +- `c_cyan_yellow` = `111` +- `c_light_cyan_yellow` = `112` +- `c_black_magenta` = `113` +- `c_dark_gray_magenta` = `114` +- `c_light_gray_magenta` = `115` +- `c_white_magenta` = `116` +- `c_red_magenta` = `117` +- `c_light_red_magenta` = `118` +- `c_green_magenta` = `119` +- `c_light_green_magenta` = `120` +- `c_brown_magenta` = `121` +- `c_yellow_magenta` = `122` +- `c_blue_magenta` = `123` +- `c_light_blue_magenta` = `124` +- `c_magenta_magenta` = `125` +- `c_pink_magenta` = `126` +- `c_cyan_magenta` = `127` +- `c_light_cyan_magenta` = `128` +- `c_black_cyan` = `129` +- `c_dark_gray_cyan` = `130` +- `c_light_gray_cyan` = `131` +- `c_white_cyan` = `132` +- `c_red_cyan` = `133` +- `c_light_red_cyan` = `134` +- `c_green_cyan` = `135` +- `c_light_green_cyan` = `136` +- `c_brown_cyan` = `137` +- `c_yellow_cyan` = `138` +- `c_blue_cyan` = `139` +- `c_light_blue_cyan` = `140` +- `c_magenta_cyan` = `141` +- `c_pink_cyan` = `142` +- `c_cyan_cyan` = `143` +- `c_light_cyan_cyan` = `144` + +## MsgType + +### Entries + +- `good` = `0` +- `bad` = `1` +- `mixed` = `2` +- `warning` = `3` +- `info` = `4` +- `neutral` = `5` +- `debug` = `6` +- `headshot` = `7` +- `critical` = `8` +- `grazing` = `9` + +# Libraries + +## const + +Various game constants + +### Members + +#### OM_OMT_SIZE + +Variable of type `int` value: `180` + +#### OM_SM_SIZE + +Variable of type `int` value: `360` + +#### OM_MS_SIZE + +Variable of type `int` value: `4320` + +#### OMT_SM_SIZE + +Variable of type `int` value: `2` + +#### OMT_MS_SIZE + +Variable of type `int` value: `24` + +#### SM_MS_SIZE + +Variable of type `int` value: `12` + +## coords + +Methods for manipulating coord systems and calculating distance + +### Members + +#### ms_to_sm + +Function `( Tripoint ) -> ( Tripoint, Point )` + +#### ms_to_omt + +Function `( Tripoint ) -> ( Tripoint, Point )` + +#### ms_to_om + +Function `( Tripoint ) -> ( Point, Tripoint )` + +#### sm_to_ms + +Function `( Tripoint, Opt(Point) ) -> Tripoint` + +#### omt_to_ms + +Function `( Tripoint, Opt(Point) ) -> Tripoint` + +#### om_to_ms + +Function `( Point, Opt(Tripoint) ) -> Tripoint` + +#### rl_dist + +Function `( Tripoint, Tripoint ) -> int` Function `( Point, Point ) -> int` + +#### trig_dist + +Function `( Tripoint, Tripoint ) -> double` Function `( Point, Point ) -> double` + +#### square_dist + +Function `( Tripoint, Tripoint ) -> int` Function `( Point, Point ) -> int` + +## gapi + +Global game methods + +### Members + +#### get_avatar + +Function `() -> Avatar` + +#### get_map + +Function `() -> Map` + +#### get_distribution_grid_tracker + +Function `() -> DistributionGridTracker` + +#### get_character_name + +Function `( Character ) -> string` + +#### add_msg + +Function `( MsgType, ... )` Function `( ... )` + +#### current_turn + +Function `() -> TimePoint` + +#### turn_zero + +Function `() -> TimePoint` + +#### before_time_starts + +Function `() -> TimePoint` + +#### rng + +Function `( int, int ) -> int` + +#### add_on_every_x_hook + +Function `( TimeDuration, function )` + +## gdebug + +Debugging and logging API. + +### Members + +#### log_info + +Function `( ... )` + +#### log_warn + +Function `( ... )` + +#### log_error + +Function `( ... )` + +#### debugmsg + +Function `( ... )` + +#### clear_lua_log + +Function `()` + +#### set_log_capacity + +Function `( int )` + +#### reload_lua_code + +Function `()` + +#### save_game + +Function `() -> bool` + +## hooks_doc + +Documentation for hooks + +### Members + +#### on_game_save + +Called when game is about to save Function `()` + +#### on_game_load + +Called right after game has loaded Function `()` + +#### on_every_x + +Called every in-game period Function `()` + +#### on_mapgen_postprocess + +Called right after mapgen has completed. Map argument is the tinymap that represents 24x24 area (2x2 +submaps, or 1x1 omt), tripoint is the absolute omt pos, and time_point is the current time (for +time-based effects). Function `( Map, Tripoint, TimePoint )` + +## locale + +Localization API. + +### Members + +#### gettext + +Expects english source string, returns translated string. Function `( string ) -> string` + +#### vgettext + +First is english singular string, second is english plural string. Number is amount to translate +for. Function `( string, string, int ) -> string` + +#### pgettext + +First is context string. Second is english source string. Function `( string, string ) -> string` + +#### vpgettext + +First is context string. Second is english singular string. third is english plural. Number is +amount to translate for. Function `( string, string, string, int ) -> string` + +## tests_lib + +Library for testing purposes + +### Members + +#### my_awesome_lambda_1 + +Function `() -> int` + +#### my_awesome_lambda_2 + +Function `() -> int` diff --git a/doc/src/content/docs/en/mod/lua/tutorial/modding.md b/doc/src/content/docs/en/mod/lua/tutorial/modding.md new file mode 100644 index 000000000000..0b7056887446 --- /dev/null +++ b/doc/src/content/docs/en/mod/lua/tutorial/modding.md @@ -0,0 +1,292 @@ +--- +title: Modding with Lua +--- + +## Useful links + +- [Lua 5.3 Reference Manual](https://www.lua.org/manual/5.3/) +- [Sol2 documentation](https://sol2.readthedocs.io/en/latest/) +- [Programming in Lua (first edition)](https://www.lua.org/pil/contents.html) + +## Example mods + +There are a couple heavily-commented example mods in `data/mods/` that make use of Lua API described +here: + +- `smart_house_remotes` - Add remotes for controlling garage doors and window curtains. +- `saveload_lua_test` - Mod for testing Lua save/load API. + +## Ingame Lua console + +In-game Lua console is available through the debug menu or via `Lua Console` hotkey (unbound by +default). + +It is rather simple, but is capable of keeping input history, showing output and errors from Lua +scripts as well as running Lua snippets and printing the returned values. + +You can adjust console log capacity by running `gdebug.set_log_capacity( num )` (default is 100 +entries), or clear it by running `gdebug.clear_lua_log()`. + +## Lua hot-reload + +To speed up mod development process, BN supports Lua hot-reload functionality. + +There is no filesystem watcher, so hot-reload must be triggered manually via a corresponding +`Reload Lua Code` hotkey (unbound by default). The hot-reload can also be triggered from console +window by pressing the corresponding hotkey, or by running `gdebug.reload_lua_code()` command. +Running the command from regular Lua scripts may have unintended consequences, use at your own risk! + +Note that not all code can be hot-reloaded, it'll be explained in later sections. + +## Game data loading + +When a world is being loaded, game does it in roughly these steps: + +1. Initializes world-related internal state, sets the world as active +2. Loads world's artifact item types (artifacts are hacky and will likely be removed soon in favor + of relics + Lua) +3. Retrieves list of mods used by the world +4. Loads the mods according to the list +5. Initializes avatar-related internal state +6. Loads from save dir actual overmap data, avatar data and reality bubble data + +What we care about here is the mod loading stage. It has a number of sub-steps: + +1. Loading function receives list of world mods +2. It discards the missing ones and prints debug message for each +3. It checks remaining mods on the list, and throws error if a mod needs Lua, but the game build + does NOT support Lua +4. It also throws a warning if game's Lua API version differs from the one used by the mod +5. For every mod on the list that uses Lua, it runs the mod's [`preload.lua`](#preloadlua) script + (if present) +6. It goes over all mods in same order as in the list, and loads JSON definitions from each mod's + folder +7. It finalizes loaded data (resolves copy-from, prepares some types with complex state for use) +8. For every mod on the list that uses Lua, it runs the mod's [`finalize.lua`](#finalizelua) script + (if present) +9. It checks consistency of loaded data (validates values, warns about iffy combinations of values, + etc.) +10. (R) For every mod on the list that uses Lua, it runs the mod's [`main.lua`](#mainlua) script (if + present) + +As such, we only have 3 scipts to place a mod's Lua code into: [`preload.lua`](#preloadlua), +[`finalize.lua`](#finalizelua) and [`main.lua`](#mainlua). The differences between the 3 and their +intended use cases will be explained below. + +You can use only one script, two or all three, depending on your needs. + +When executing hot-reload, the game repeats the step marked with (R). That means if you want the +code you're working on to be hot-reloadable, put it into [`main.lua`](#mainlua). + +### `preload.lua` + +This script is supposed to register event hooks and set up definitions that will then be referred by +game JSON loading system (e.g. item use actions). Note that you can registers them here, and define +them in some later stage (e.g. in [`main.lua`](#mainlua) to allow hot-reload to affect your hooks). + +### `finalize.lua` + +This script is supposed to allow mods to modify definitions loaded from JSON after copy-from has +been resolved, but there is no API for this yet. + +TODO: api for finalization + +### `main.lua` + +This script is supposed to implement the main logic of the mod. This includes, but not limited, to: + +1. Mod runtime state +2. Mod initialization on game start +3. Mod save/load code, if required +4. Implementation of hooks that were set up in [`preload.lua`](#preloadlua) + +## Lua API details + +While you can do a lot of interesting stuff with vanilla Lua, the integration imposes some limits to +prevent potential bugs: + +- Loading packages (or Lua modules) is disabled. +- Your current mod id is stored in `game.current_mod` variable +- Your mod's runtime state should live in `game.mod_runtime[ game.current_mod ]` table. You can also + interface with other mods if you know their id, by accessing their runtime state in a similar way + with `game.mod_runtime[ that_other_mod_id ]` +- Changes to global state are not available between scripts. This is to prevent accidental + collisions between function names and variable names. You still can define global variables and + functions, but they will be visible to your mod only. + +### Lua libraries and functions + +When script is called, it comes with some standard Lua libraries pre-loaded: + +| Library | Description | +| -------- | -------------------------------------------- | +| `base` | print, assert, and other base functions | +| `math` | all things math | +| `string` | string library | +| `table` | the table manipulator and observer functions | + +See `Standard Libraries` section in Lua manual for details. + +Some of the functions here are overloaded by BN, see [Global overrides](#global-overrides) for +details. + +### Global state + +Most of necessary data and game runtime state is available through global `game` table. It has the +following members: + +game.current_mod Id of mod that's being loaded (available only when script is executed) +game.active_mods List of active world mods, in load order game.mod_runtime. Runtime data for +mods (each mod gets its own table named after its id) game.mod_storage. Per-mod storage that +gets automatically saved/loaded on game save/load. game.cata_internal For internal game purposes, +please don't use this game.hooks. Hooks exposed to Lua scripts, will be called on +corresponding events game.iuse. Item use functions that will be recognized by the item +factory and called on item use + +### Game Bindings + +The game exposes various functions, constants and types to Lua. Functions and constants are +organized into "libraries" for organizational purposes. Types are available globally, and may have +member functions and fields. + +To see the full list of functions, constants and types, run the game with `--lua-doc` command line +argument. This will generate documentation file `lua_doc.md` that will be placed in your `config` +folder. + +#### Global overrides + +Some functions have been globally overriden to improve integration with the game. + +| Function | Description | +| ---------- | -------------------------------------------------------------- | +| print | Print as `INFO LUA` to debug.log (overrides default Lua print) | +| dofile | Disabled | +| loadfile | Disabled | +| load | Disabled | +| loadstring | Disabled | + +TODO: alternatives for dofile and such + +#### Hooks + +To see the list of hooks, check `hooks_doc` section of the autogenerated documentation file. There, +you will see the list of hook ids as well as function signatures that they expect. You can register +new hooks by appending to the hooks table like so: + +```lua +-- In preload.lua +local mod = game.mod_runtime[ game.current_mod ] +game.hooks.on_game_save[ #game.hooks.on_game_save + 1 ] = function( ... ) + -- This is essentially a forward declaration. + -- We declare that the hook exists, it should be called on game_save event, + -- but we will forward all possible arguments (even if there is none) to, + -- and return value from, the function that we'll declare later on. + return mod.my_awesome_hook( ... ) +end + +-- In main.lua +local mod = game.mod_runtime[ game.current_mod ] +mod.my_awesome_hook = function() + -- Do actual work here +end +``` + +#### Item use function + +Item use functions use unique id to register themselves in item factory. On item activation, they +receive multiple arguments that will be described in the example below. + +```lua +-- In preload.lua +local mod = game.mod_runtime[ game.current_mod ] +game.iuse_functions[ "SMART_HOUSE_REMOTE" ] = function(...) + -- This is just a forward declaration, + -- but it will allow us to use SMART_HOUSE_REMOTE iuse in JSONs. + return mod.my_awesome_iuse_function(...) +end + +-- In main.lua +local mod = game.mod_runtime[ game.current_mod ] +mod.my_awesome_iuse_function = function( who, item, pos ) + -- Do actual activation effect here. + -- `who` is the character that activated the item + -- `item` is the item itself + -- `pos` is the position of the item (equal to character pos if character has it on them) +end +``` + +#### Translation functions + +To make the mod translatable to other languages, get your text via functions bound in `locale` +library. See [translation API](../explanation/lua_integration.md) for detailed explanation of their +C++ counterparts. + +Usage examples are shown below: + +```lua +-- Simple string. +-- +-- The "Experimental Lab" text will be extracted from this code by a script, +-- and will be available for translators. +-- When your Lua script runs, this function will search for translation of +-- "Experimental Lab" string and return either translated string, +-- or the original string if there was no translation found. +local location_name_translated = locale.gettext( "Experimental Lab" ) + +-- ERROR: you must call `gettext` with a string literal. +-- Calling it like this will make it so "Experimental Lab" is NOT extracted, +-- and translators won't see it when they translate the text. +local location_name_original = "Experimental Lab" +local location_name_translated = locale.gettext( location_name_original ) + +-- ERROR: don't alias the function under different name. +-- Calling it like this will make it so "Experimental Lab" is NOT extracted, +-- and translators won't see it when they translate the text. +local gettext_alt = locale.gettext +local location_name_translated = gettext_alt( "Experimental Lab" ) + +-- This, however, is fine. +local gettext = locale.gettext +local location_name_translated = gettext( "Experimental Lab" ) + +-- String with possible plural form. +-- Many languages have more than 2 plural forms with complex rules related to which one to use. +local item_display_name = locale.vgettext( "X-37 Prototype", "X-37 Prototypes", num_of_prototypes ) + +-- String with context +local text_1 = locale.pgettext("the one made of metal", "Spring") +local text_2 = locale.pgettext("the one that makes water", "Spring") +local text_3 = locale.pgettext("time of the year", "Spring") + +-- String with both context and plural forms. +local item_display_name = locale.vpgettext("the one made of metal", "Spring", "Springs", num_of_springs) + +--[[ + When some text is tricky and requires explanation, + it's common to place a special comment denoted with `~` to help translators. + The comment MUST BE right above the function call. +]] + +--~ This comment is good and will be visible for translators. +local ok = locale.gettext("Confusing text that needs explanation.") + +--~ ERROR: This comment is too far from gettext call and won't be extracted! +local not_ok = locale. + gettext("Confusing text that needs explanation.") + +local not_ok = locale.gettext( + --~ ERROR: This comment is in wrong place and won't be extracted! + "Confusing text that needs explanation." + ) + +--[[~ + ERROR: Multiline Lua comments can't be used as translator comments! + This comment won't be extracted! +]] +local ok = locale.gettext("Confusing text that needs explanation.") + +--~ If you need a multiline translator comment, +--~ just use 2 or more single-line comments. +--~ They'll be concatenated and shown as a single multi-line comment. +local ok = locale.gettext("Confusing text that needs explanation.") +``` diff --git a/doc/CONTRIBUTING.ko.md b/doc/src/content/docs/ko/contribute/contributing.md similarity index 80% rename from doc/CONTRIBUTING.ko.md rename to doc/src/content/docs/ko/contribute/contributing.md index f23090e04480..9f08902673bd 100644 --- a/doc/CONTRIBUTING.ko.md +++ b/doc/src/content/docs/ko/contribute/contributing.md @@ -1,55 +1,29 @@ -# 기여하기 - -[![en][icon-en]][en] [![ko][icon-ko]][ko] - -[en]: ./CONTRIBUTING.md -[icon-en]: https://img.shields.io/badge/lang-en-red?style=flat-square -[ko]: ./CONTRIBUTING.ko.md -[icon-ko]: https://img.shields.io/badge/lang-ko-orange?style=flat-square - -- [기여하기](#기여하기) - - [가이드라인](#가이드라인) - - [코드 스타일](#코드-스타일) - - [C++](#c) - - [JSON 스타일](#json-스타일) - - [마크다운](#마크다운) - - [번역](#번역) - - [공식 문서](#공식-문서) - - [독시젠(Doxygen) 주석](#독시젠doxygen-주석) - - [문서 추가 가이드라인](#문서-추가-가이드라인) - - [문서를 로컬에서 빌드하기](#문서를-로컬에서-빌드하기) - - [예시 워크플로우](#예시-워크플로우) - - [작업 환경 설정하기](#작업-환경-설정하기) - - [`upload` 브랜치 업데이트하기](#upload-브랜치-업데이트하기) - - [변경사항 만들기](#변경사항-만들기) - - [풀 리퀘스트 초안](#풀-리퀘스트-초안) - - [모든 풀 리퀘스트에는 `"Summary"`줄이 있어야 합니다.](#모든-풀-리퀘스트에는-summary줄이-있어야-합니다) - - [키워드로 이슈 닫기](#키워드로-이슈-닫기) - - [키워드](#키워드) - - [이슈](#이슈) - - [여러 이슈를 한 번에 닫기](#여러-이슈를-한-번에-닫기) - - [개발 도구 지원](#개발-도구-지원) - - [고급](#고급) - - [원격 추적 브랜치 사용하기](#원격-추적-브랜치-사용하기) - - [단위 테스트](#단위-테스트) - - [게임 내에서 테스트하기, 테스트 환경, 디버그 메뉴](#게임-내에서-테스트하기-테스트-환경-디버그-메뉴) - - [자주 묻는 질문](#자주-묻는-질문) - - [`git pull --ff-only`을 했더니 에러가 나요](#git-pull---ff-only을-했더니-에러가-나요) - -**새 이슈를 열고 싶으신가요?** 먼저 [ISSUES.md](../ISSUES.md)를 읽어주세요. +--- +title: 기여하기 +--- + +:::tip{title="새 이슈를 열고 싶으신가요?"} + +[이슈 여는 법](./issues)을 참고해주세요. + +::: 카타클리즘: 밝은 밤에 기여하는 것은 쉽습니다. 1. GitHub에서 저장소를 포크해주세요. 2. 변경사항을 만들어주세요. -3. 풀 리퀘스트[Pull request][pr]를 보내주세요. +3. [풀 리퀘스트][pr]를 열어주세요. [pr]: https://docs.github.com/ko/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests -> 카타클리즘: 밝은 밤은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스에 따라 -> 배포됩니다. 게임의 코드와 콘텐츠는 어떠한 목적에도 사용, 수정, 재배포할 수 있습니다. 자세한 내용은 -> http://creativecommons.org/licenses/by-sa/3.0/ 를 참고해주세요. 그 말은, 이 프로젝트에 기여하면, -> 그 기여물도 동일한 라이선스에 의해 보호받는다는 것이며, 이 라이선스는 취소될 수 없다는 것입니다. +:::note{title="CC-BY-SA 3.0"} + +카타클리즘: 밝은 밤은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스에 따라 +배포됩니다. 게임의 코드와 콘텐츠는 어떠한 목적에도 사용, 수정, 재배포할 수 있습니다. 자세한 내용은 +http://creativecommons.org/licenses/by-sa/3.0/ 를 참고해주세요. 그 말은, 이 프로젝트에 기여하면, 그 +기여물도 동일한 라이선스에 의해 보호받는다는 것이며, 이 라이선스는 취소될 수 없다는 것입니다. + +::: ## 가이드라인 @@ -68,12 +42,12 @@ ### C++ `astyle`로 일관된 코드 스타일을 강제하고 있습니다. 자세한 내용은 -[CODE_STYLE](../doc/CODE_STYLE.md)을 참고해주세요. +[CODE_STYLE](../dev/explanation/code_style)을 참고해주세요. ### JSON 스타일 `tools/format` 경로에 있는 포매터로 일관된 JSON 스타일을 강제하고 있습니다. -[JSON Style Guide](../doc/JSON_STYLE.md) 을 참고해주세요. +[JSON Style Guide](../mod/json/explanation/json_style) 을 참고해주세요. ### 마크다운 @@ -97,18 +71,16 @@ [번역 프로젝트](https://app.transifex.com/bn-team/cataclysm-bright-nights/)에서 지원되는 언어를 실시간으로 확인할 수 있습니다. -[TRANSLATING](../doc/TRANSLATING.md)에서 더 자세한 내용을 확인할 수 있습니다: - -- [번역자를 위한 내용](../doc/TRANSLATING.md#translators) -- [개발자를 위한 내용](../doc/TRANSLATING.md#developers) -- [관리자를 위한 내용](../doc/TRANSLATING.md#maintainers) +- [번역자를 위한 내용](../i18n/tutorial/transifex) +- [개발자를 위한 내용](../i18n/reference/translation) +- [관리자를 위한 내용](../i18n/guides/maintain) ## 공식 문서 -

- - -

+ 자동 생성된 문서를 [깃허브 페이지](https://cataclysmbnteam.github.io/Cataclysm-BN)에서 읽을 수 있습니다. @@ -120,7 +92,7 @@ 클래스에 주석을 달 때는 다음 템플릿을 사용해주세요: -```c++ +```cpp /** * 간단한 설명 * @@ -131,7 +103,7 @@ class foo { 함수에 주석을 달 때는 다음 템플릿을 사용해주세요: -```c++ +```cpp /** * 간단한 설명 * @@ -144,7 +116,7 @@ int foo(int param1); 멤버 변수에 주석을 달 때는 다음 템플릿을 사용해주세요: -```c++ +```cpp /** 간단한 설명 **/ int foo; ``` @@ -257,9 +229,7 @@ $ git push origin new_feature ### 모든 풀 리퀘스트에는 `"Summary"`줄이 있어야 합니다. -개요(summary)는 -[변경 내역](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/data/changelog.txt)에 추가할 -한 줄 요약입니다. +개요(summary)는 [변경 내역](../game/changelog.md)에 추가할 한 줄 요약입니다. 개요 형식: `SUMMARY: 카테고리 "설명"` @@ -269,8 +239,7 @@ Infrastructure, Build, I18N이 있습니다. 예시: `SUMMARY: Content "Adds new mutation category 'Mouse'"` (해석: `SUMMARY: Content "새로운 변이 카테고리 'Mouse'를 추가합니다."`) -[변경 내역 가이드라인](https://github.com/cataclysmbnteam/Cataclysm-BN/blob/upload/doc/CHANGELOG_GUIDELINES.md)에서 -카테고리에 대한 설명을 볼 수 있습니다. +[변경 내역 가이드라인](./changelog_guidelines.md)에서 카테고리에 대한 설명을 볼 수 있습니다. ### 키워드로 이슈 닫기 @@ -309,7 +278,7 @@ Infrastructure, Build, I18N이 있습니다. ## 개발 도구 지원 코딩 스타일을 지키도록 도와주는 여러 도구들이 있습니다. 자세한 내용은 -[DEVELOPER_TOOLING](../doc/DEVELOPER_TOOLING.md)을 참고해주세요. +[DEVELOPER_TOOLING](../dev/reference/tooling)을 참고해주세요. ## 고급 @@ -447,4 +416,4 @@ $ git pull --ff-only upstream upload $ git checkout new_branch ``` -더 자주 묻는 질문은 [개발자 FAQ](../doc/DEVELOPER_FAQ.md)를 참고해주세요. +더 자주 묻는 질문은 [개발자 FAQ](../dev/reference/FAQ)를 참고해주세요. diff --git a/doc/src/env.d.ts b/doc/src/env.d.ts new file mode 100644 index 000000000000..d8fdfca7f896 --- /dev/null +++ b/doc/src/env.d.ts @@ -0,0 +1,18 @@ +/// +/// + +interface ImportMetaEnv { + /** + * Customizable Deploy URL. + * + * @default "https://docs.cataclysmbn.org" + */ + readonly CUSTOM_SITE_URL?: string + + /** + * Customizable Repository URL for Edit Link and GitHub Social Link. + * + * @default "https://github.com/cataclysmbnteam/Cataclysm-BN" + */ + readonly CUSTOM_REPO_URL?: string +} diff --git a/doc/src/styles/capitalize.css b/doc/src/styles/capitalize.css new file mode 100644 index 000000000000..a69393921d06 --- /dev/null +++ b/doc/src/styles/capitalize.css @@ -0,0 +1,6 @@ +details summary>h2.large, +details li>a>span, +main h1, +aside>p { + text-transform: capitalize; +} diff --git a/doc/src/styles/theme.css b/doc/src/styles/theme.css new file mode 100644 index 000000000000..16972359f4d0 --- /dev/null +++ b/doc/src/styles/theme.css @@ -0,0 +1,30 @@ +/* Dark mode colors. */ +:root { + --sl-color-accent-low: #242424; + --sl-color-accent: #6a6a6a; + --sl-color-accent-high: #c8c8c8; + --sl-color-white: #ffffff; + --sl-color-gray-1: #eceef2; + --sl-color-gray-2: #c0c2c7; + --sl-color-gray-3: #888b96; + --sl-color-gray-4: #545861; + --sl-color-gray-5: #353841; + --sl-color-gray-6: #24272f; + --sl-color-black: #17181c; +} + +/* Light mode colors. */ +:root[data-theme='light'] { + --sl-color-accent-low: #d7d7d7; + --sl-color-accent: #6b6b6b; + --sl-color-accent-high: #323232; + --sl-color-white: #17181c; + --sl-color-gray-1: #24272f; + --sl-color-gray-2: #353841; + --sl-color-gray-3: #545861; + --sl-color-gray-4: #888b96; + --sl-color-gray-5: #c0c2c7; + --sl-color-gray-6: #eceef2; + --sl-color-gray-7: #f5f6f8; + --sl-color-black: #ffffff; +} diff --git a/doc/tsconfig.json b/doc/tsconfig.json new file mode 100644 index 000000000000..bd6a3efddfbb --- /dev/null +++ b/doc/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "astro/tsconfigs/strictest", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "~/*": [ + "./src/*" + ] + } + } +} diff --git a/src/catalua_type_operators.h b/src/catalua_type_operators.h index 11aba63712b3..dad5a0b70538 100644 --- a/src/catalua_type_operators.h +++ b/src/catalua_type_operators.h @@ -13,7 +13,7 @@ * and the member/method that contains/returns the id as id_getter. * * Example implementation: - * ```c++ + * ```cpp * class ter_t { * ter_str_id id; * ... diff --git a/src/main.cpp b/src/main.cpp index 764e1bc5d8a2..49cba33d50af 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -256,7 +256,7 @@ int main( int argc, char *argv[] ) }, { "--jsonverify", nullptr, - "Checks the CDDA json files", + "Checks the BN json files", section_default, [&verifyexit]( int, const char ** ) -> int { verifyexit = true; @@ -265,7 +265,7 @@ int main( int argc, char *argv[] ) }, { "--check-mods", "[mods…]", - "Checks the json files belonging to CDDA mods", + "Checks the json files belonging to BN mods", section_default, [&check_mods, &opts]( int n, const char *params[] ) -> int { check_mods = true; diff --git a/tools/front_matter.ts b/tools/front_matter.ts new file mode 100644 index 000000000000..3903f3ebb879 --- /dev/null +++ b/tools/front_matter.ts @@ -0,0 +1,47 @@ +/** + * Converts first heading into frontmatter. + */ + +import * as frontmatter from "https://deno.land/std@0.201.0/front_matter/yaml.ts" +import { walk } from "https://deno.land/std@0.201.0/fs/walk.ts" +import { asynciter } from "https://deno.land/x/asynciter@0.0.18/mod.ts" + +export const consumeFirstHeading = (lines: string[]): { heading: string; lines: string[] } => { + // consume all empty lines with regex + const spaces = lines.findIndex((line) => !line.match(/^\s*$/)) ?? 0 + // split into frontmatter and content + + const [frontmatter, ...content] = lines.slice(spaces) + return { heading: frontmatter.replace(/^#+\s*/, ""), lines: content } +} + +export const toFrontmatter = (text: string): string => { + if (frontmatter.test(text)) { + return text + } + + const lines = text.split("\n") + + const { heading, lines: content } = consumeFirstHeading(lines) + return /*md*/ `\ +--- +title: ${heading} +--- +${content.join("\n")} +` +} + +if (import.meta.main) { + await asynciter(walk("doc/src/content", { exts: ["md"], includeDirs: false })) + .concurrentUnorderedMap(async ({ path, name }) => ({ + path, + name, + text: await Deno.readTextFile(path), + })) + .filter(({ text }) => !frontmatter.test(text)) + .concurrentUnorderedMap(async ({ path, name, text }) => { + console.log(name) + await Deno.writeTextFile(path, toFrontmatter(text)) + }) + .collect() +} diff --git a/tools/front_matter_test.ts b/tools/front_matter_test.ts new file mode 100644 index 000000000000..895d9c134fd5 --- /dev/null +++ b/tools/front_matter_test.ts @@ -0,0 +1,40 @@ +import { assertEquals } from "https://deno.land/std@0.201.0/assert/assert_equals.ts" +import { consumeFirstHeading, toFrontmatter } from "./front_matter.ts" + +const input = /*md*/ ` + +## Foo asdf + +bar + +### baz + +qux +` +const output = /*md*/ `\ +--- +title: Foo asdf +--- + +bar + +### baz + +qux + +` +Deno.test("first heading is found and consumed", () => { + const result = consumeFirstHeading(input.split("\n")) + assertEquals(result, { + heading: "Foo asdf", + lines: ["", "bar", "", "### baz", "", "qux", ""], + }) +}) +Deno.test("first heading is converted to frontmatter", () => { + const result = toFrontmatter(input) + assertEquals(result, output) +}) +Deno.test("function is idempotent", () => { + const result = toFrontmatter(output) + assertEquals(result, output) +}) diff --git a/tools/gen_cli_docs.ts b/tools/gen_cli_docs.ts new file mode 100644 index 000000000000..d587e8c55c31 --- /dev/null +++ b/tools/gen_cli_docs.ts @@ -0,0 +1,76 @@ +#!/usr/bin/env -S deno run --allow-read --allow-write --allow-run + +/** + * Generates markdown documentation for the game executable. + */ +import { chunk } from "https://deno.land/std@0.201.0/collections/chunk.ts" + +export type Flag = { option: string; desc: string } +export type Section = { title: string; flags: Flag[] } + +/** + * Use simple heuristics to parse the command line help text. + * + * ### Heuristics + * - first line is the section title + * - each flags and description is on a separate line + */ +export const parseSection = (section: string): Section => { + // first line is the title + const [title, ...lines] = section.split("\n") + const flags = chunk(lines, 2).map(([option, desc]) => ({ option, desc: desc.trim() })) + + return { title: title.replace(":", ""), flags } +} + +export const flagToMarkdown = ({ option, desc }: Flag): string => /*md*/ ` +### \`${option}\` + +${desc}.` + +export const sectionToMarkdown = ({ title, flags }: Section): string => /*md*/ ` +## ${title} + +${flags.map(flagToMarkdown).join("\n")}` + +const toMarkdown = (text: string): string => { + const sections = text.trim().split("\n\n").map(parseSection).map(sectionToMarkdown).join("\n") + + return /*md*/ `\ +--- +title: CLI Options +editUrl: false +sidebar: + badge: + text: Generated + status: note +--- + +:::note + +This page is auto-generated from \`tools/gen_cli_docs.ts\` and should not be edited directly. + +::: + +The game executable can not only run your favorite roguelike, +but also provides a number of command line options to help modders and developers. + +--- + +${sections} +` +} + +if (import.meta.main) { + const command = new Deno.Command("./cataclysm-tiles", { args: ["--help"] }) + const { stdout } = await command.output() + + const text = new TextDecoder().decode(stdout) + + const result = toMarkdown(text) + const docsUrl = new URL( + "../doc/src/content/docs/en/dev/reference/cli_options.md", + import.meta.url, + ) + await Deno.writeTextFile(docsUrl, result) +}