From 5040828f4262c43d2c769979a4b32885a5e6c8e4 Mon Sep 17 00:00:00 2001 From: jaimergp Date: Fri, 16 Feb 2024 13:59:00 +0100 Subject: [PATCH] Render Sphinx `/docs` in docusaurus (#2077) * Render Sphinx to markdown * Adjust CFEP index format * Adjust some lists and headers * Fix broken link? (works locally) * Only throw errors on GHA CI (warn on local and Netlify) * push a couple broken links to demo link checker * add an additional link checker GHA step * Use lychee * configure lychee * less verbosity * remap instead * try with this one * where's the report? * remove verbosity * exclude comma separated URLs * a different broken anchor * raise if document not in sidebar * do not show editUrl on docs/ for now (broken) * remove intentionally broken links; this should pass * upgrade prism highlighting * fix indentation in some lists * Publish _static assets * pathname:// for linked files * Use :ref: and :doc: for internal links instead of https://conda-forge.org/ ones * Adjust FAQ output * Formatting adjustments * Fix Maintainer FAQ too * add basic local search for now * add goatcounter * Use Algolia search * exclude algolia from link checker * more explicit * Upgrade to docusaurus 3.1.1 and enable onBrokenAnchors * Fix broken generation of anchor * Remove todo list from misc * vendor goatcounter ourselves * only deploy stats on GHA site * BUG attempt to fix rendering of core and emeritus * BUG maybe one more level? * Fix Jinja rendering in governance and cfep-index * get cfep list from repo archive, not api --------- Co-authored-by: Matthew R. Becker --- .ci_scripts/environment.yml | 2 + .ci_scripts/generate_cfep_index.py | 51 +- .ci_scripts/sphinx_markdown_to_docusaurus.py | 108 +++ .ci_scripts/update_docs | 30 +- .github/workflows/deploy.yml | 17 + .gitignore | 5 + docusaurus.config.js | 85 +- ...rhauled-the-blas-support-in-conda-forge.md | 2 +- package-lock.json | 820 +++++++++--------- package.json | 12 +- sphinx/src/Makefile | 6 + sphinx/src/conf.py | 37 +- sphinx/src/index.rst | 12 +- sphinx/src/maintainer/adding_pkgs.rst | 113 +-- sphinx/src/maintainer/infrastructure.rst | 23 +- sphinx/src/maintainer/knowledge_base.rst | 90 +- sphinx/src/maintainer/maintainer_faq.rst | 170 ++-- sphinx/src/maintainer/pinning_deps.rst | 1 + sphinx/src/maintainer/updating_pkgs.rst | 4 +- sphinx/src/misc/00_intro.rst | 9 +- sphinx/src/orga/cfep-index.rst | 2 + sphinx/src/orga/funding/00_intro.rst | 40 +- sphinx/src/orga/getting-in-touch.rst | 4 +- sphinx/src/orga/governance.rst | 11 +- sphinx/src/orga/guidelines.rst | 5 +- sphinx/src/orga/subteams.rst | 37 +- sphinx/src/user/00_intro.rst | 1 - sphinx/src/user/ci-skeleton.rst | 3 +- sphinx/src/user/contributing.rst | 30 +- sphinx/src/user/faq.rst | 190 ++-- sphinx/src/user/how_to_get_help.rst | 2 +- sphinx/src/user/introduction.rst | 51 +- sphinx/src/user/talks.rst | 2 +- src/components/About/index.jsx | 2 +- src/components/Contributing/index.jsx | 2 +- src/components/Header/index.jsx | 2 +- static/js/count.js | 254 ++++++ 37 files changed, 1378 insertions(+), 857 deletions(-) create mode 100644 .ci_scripts/sphinx_markdown_to_docusaurus.py create mode 100644 static/js/count.js diff --git a/.ci_scripts/environment.yml b/.ci_scripts/environment.yml index fb28c0f609..c02432f04c 100644 --- a/.ci_scripts/environment.yml +++ b/.ci_scripts/environment.yml @@ -18,3 +18,5 @@ dependencies: - python-rapidjson - termcolor - nodejs 20.* + - pip: + - https://github.com/jaimergp/sphinx-markdown-builder/archive/admonitions.tar.gz diff --git a/.ci_scripts/generate_cfep_index.py b/.ci_scripts/generate_cfep_index.py index 221b4476c4..48d49b0ac3 100644 --- a/.ci_scripts/generate_cfep_index.py +++ b/.ci_scripts/generate_cfep_index.py @@ -1,8 +1,13 @@ import re import requests +import sys +import tarfile from dataclasses import dataclass from pathlib import Path +from tempfile import TemporaryDirectory +REPO_URL = "https://github.com/conda-forge/cfep" +REPO_ARCHIVE = "https://github.com/conda-forge/cfep/archive/main.tar.gz" REPO_CONTENTS = "https://api.github.com/repos/conda-forge/cfep/contents/" TITLE_PATTERN = "\s*Title\s*\s*(.*)\s*" STATUS_PATTERN = "\s*Status\s*\s*(.*)\s*" @@ -31,7 +36,7 @@ def md_link(self) -> str: ) -def get_cfeps(): +def get_cfeps_from_gh_api(): """Generator that returns all CFEPs from GitHub repo""" response = requests.get( REPO_CONTENTS, headers={"Accept": "application/vnd.github.v3+json"} @@ -56,10 +61,48 @@ def get_cfeps(): yield Cfep(content["name"], title, status, content["html_url"]) +def get_cfeps(): + """Return a generator of CFEPs, by traversing the contents of the repo archive""" + r = requests.get(REPO_ARCHIVE, stream=True) + r.raise_for_status() + with TemporaryDirectory() as tmp: + # Write the tarball to a temporary directory + tarball = Path(tmp) / "cfep.tar.gz" + with tarball.open("wb") as f: + for chunk in r.iter_content(chunk_size=8192): + f.write(chunk) + # Extract the tarball + extracted_dir = Path(tmp) / "cfep" + extracted_dir.mkdir() + with tarfile.open(tarball) as tar: + tar.extractall(extracted_dir) + # Traverse the extracted directory and return all CFEPs + for cfep in sorted(extracted_dir.rglob("cfep-*.md")): + name = cfep.name + url = f"{REPO_URL}/blob/main/{name}" + if name == "cfep-00.md": + # Hardcode title and status for CFEP-00 + yield Cfep(name, "CFEP Template", "Proposed", url) + continue + cfep_text = cfep.read_text() + m = re.search(TITLE_PATTERN, cfep_text) + title = m.group(1).strip() if m else "" + m = re.search(STATUS_PATTERN, cfep_text) + status = m.group(1).strip() if m else "" + yield Cfep(name, title, status, url) + + def write_cfep_index(): - with CFEP_INDEX_RST.open("a") as f: - for cfep in get_cfeps(): - f.write(f"* {cfep.rst_link()}\n") + contents = CFEP_INDEX_RST.read_text() + if ".. REPLACE-THIS-LINE-WITH-THE-INDEX-OF-CFEPs" not in contents: + print("!!! Skipping writing CFEP index. Already rendered?", file=sys.stderr) + return + rst_links = [f"- {cfep.rst_link()}" for cfep in get_cfeps()] + contents = contents.replace( + ".. REPLACE-THIS-LINE-WITH-THE-INDEX-OF-CFEPs", + "\n".join(rst_links) + ) + CFEP_INDEX_RST.write_text(contents) if __name__ == "__main__": diff --git a/.ci_scripts/sphinx_markdown_to_docusaurus.py b/.ci_scripts/sphinx_markdown_to_docusaurus.py new file mode 100644 index 0000000000..0782b9eb27 --- /dev/null +++ b/.ci_scripts/sphinx_markdown_to_docusaurus.py @@ -0,0 +1,108 @@ +""" +Given the Markdown output of a sphinx site, place it in the correct place for Docusaurus. +""" +import re +import sys +from pathlib import Path + +# The ordering of the sidebar is defined here. This is a list of paths to the markdown files +# as they would appear after being moved into /docs. In other words, how Docusaurus would see them. +SIDEBAR_ORDERING = [ + "/docs/index.md", + "/docs/user/index.md", + "/docs/user/introduction.md", + "/docs/user/tipsandtricks.md", + "/docs/user/ci-skeleton.md", + "/docs/user/faq.md", + "/docs/user/contributing.md", + "/docs/user/how_to_get_help.md", + "/docs/user/talks.md", + "/docs/maintainer/index.md", + "/docs/maintainer/infrastructure.md", + "/docs/maintainer/adding_pkgs.md", + "/docs/maintainer/updating_pkgs.md", + "/docs/maintainer/pinning_deps.md", + "/docs/maintainer/conda_forge_yml.md", + "/docs/maintainer/knowledge_base.md", + "/docs/maintainer/maintainer_faq.md", + "/docs/orga/index.md", + "/docs/orga/guidelines.md", + "/docs/orga/governance.md", + "/docs/orga/subteams.md", + "/docs/orga/joining-the-team.md", + "/docs/orga/funding", + "/docs/orga/minutes/", + "/docs/orga/cfep-index.md", + "/docs/orga/getting-in-touch.md", + "/docs/orga/funding/index.md", + "/docs/misc/index.md", + "/docs/contracting/index.md", +] +# Note we also ignore the /minutes/.* files later in the code +SIDEBAR_ORDERING_IGNORED = { + "/docs/orga/funding/gsod-2023.md", + "/docs/orga/funding/gsoc-2023.md", + "/docs/orga/funding/sdg-2023-1.md", +} + + +def get_mds(basedir): + for path in Path(basedir).glob("**/*.md"): + yield path + + +def sphinx_md_to_docusaurus_md(basedir, mdpath, targetdir, ordering=None): + relmd = mdpath.relative_to(basedir) + target_path = Path(targetdir, relmd) + target_path.parent.mkdir(parents=True, exist_ok=True) + text = mdpath.read_text() + text = text.replace("00_intro.md", "index.md") + text = text.replace("(/_static/", "(pathname:///_static/") + text = re.sub(r"\]\((/\S+\.\S+)\)", r"](pathname://\1)", text) + title = next(re.finditer(r"^# (.+)$", text, re.MULTILINE), None) + if not text.lstrip().startswith("---"): + frontmatter = [] + if title: + frontmatter.append(f"title: '{title.group(1)}'") + if ordering is not None: + frontmatter.append(f"sidebar_position: {ordering}") + if frontmatter: + text = "---\n" + "\n".join(frontmatter) + "\n---\n\n" + text + if mdpath.name == "00_intro.md": + target_path = target_path.parent / "index.md" + target_path.write_text(text) + + +def main(build_dir, targetdir): + md_dir = Path(build_dir) + not_in_sidebar = [] + for path in md_dir.glob("**/*.md"): + print("Processing MD", path) + try: + relmd = path.relative_to(md_dir).as_posix() + relmd_key = f"/docs/{relmd}".replace("00_intro.md", "index.md") + ordering = SIDEBAR_ORDERING.index(relmd_key) + except ValueError: + if "/minutes/" in relmd_key or relmd_key in SIDEBAR_ORDERING_IGNORED: + ordering = 1000 + else: + not_in_sidebar.append(path) + continue + sphinx_md_to_docusaurus_md(md_dir, path, targetdir, ordering=ordering) + if not_in_sidebar: + print( + "The following files are not in the sidebar:", + *not_in_sidebar, + sep="\n- ", + file=sys.stderr, + ) + print( + "Edit SIDEBAR_ORDERING in .ci_scripts/sphinx_markdown_to_docusaurus.py", + file=sys.stderr, + ) + sys.exit(1) + + +if __name__ == "__main__": + build_dir, targetdir = sys.argv[1:3] + main(build_dir, targetdir) diff --git a/.ci_scripts/update_docs b/.ci_scripts/update_docs index 51bca719da..4ee14bef80 100755 --- a/.ci_scripts/update_docs +++ b/.ci_scripts/update_docs @@ -2,6 +2,9 @@ set -ex +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BASE_DIR=$(dirname $HERE) + # configure bot account if [[ "$CI" == "1" ]]; then git config --global user.email "pelson.pub+conda-forge@gmail.com" @@ -9,28 +12,17 @@ if [[ "$CI" == "1" ]]; then git checkout -b new_site_content fi -python .ci_scripts/generate_cfep_index.py - -pushd sphinx/src - +pushd "$BASE_DIR/sphinx/src" +make clean +rm -rf "$BASE_DIR/static-sphinx" # -W --keep-going: list all warnings but fail build in case there are any -# -n: check validity of all links -make html SPHINXOPTS="-W --keep-going -n" -linkcheck_failed=0 -make linkcheck > /dev/null || linkcheck_failed=1 -python ../../.ci_scripts/display_linkcheck.py _build/linkcheck/output.json - -if [[ "${GHREF}" != "refs/heads/main" ]]; then - test "$linkcheck_failed" -eq 0 -fi - -# Move rendered Sphinx docs to a static directory for Docusaurus to use -rm -rf ../../static-sphinx || true -mkdir -p ../../static-sphinx -mv _build/html ../../static-sphinx/docs -rm -rf _build +make markdown SPHINXOPTS="-W --keep-going" popd +# Move rendered Sphinx markdown to Docusaurus +python "$BASE_DIR/.ci_scripts/sphinx_markdown_to_docusaurus.py" "$BASE_DIR/sphinx/src/_build/markdown" docs/ +mkdir -p "$BASE_DIR/static-sphinx/_static" +cp -r "$BASE_DIR/sphinx/src/_static/" "$BASE_DIR/static-sphinx/_static/" # Build docusaurus site npm install npm run build diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index f75104d48c..f8ecff5856 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -41,3 +41,20 @@ jobs: publish_dir: ./build user_name: conda-forge-admin user_email: pelson.pub+conda-forge@gmail.com + + - name: Link Checker + uses: lycheeverse/lychee-action@c053181aa0c3d17606addfe97a9075a32723548a # for v1.9.3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + lycheeVersion: '0.14.3' + args: > + --no-progress + --exclude 'https://polys.me/?$' + --exclude 'https://kb43fqob7u-dsn.algolia.net/' + --exclude '.*/404.html/' + --exclude '.*,.*' + --exclude-path './build/docs/orga/minutes/' + --remap "https://conda-forge.org/status https://conda-forge.org/status" + --remap "https://conda-forge.org/(.*) file://$(pwd)/build/\$1" + './build/**/*.html' + '*.md' diff --git a/.gitignore b/.gitignore index f83c2c5fd0..2dd2840e61 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ sphinx/newsfeed/demo/_build # Sphinx output gets moved to Docusaurus' static folder /static-sphinx +/docs # Docusaurus dependencies /node_modules @@ -42,3 +43,7 @@ sphinx/newsfeed/demo/_build npm-debug.log* yarn-debug.log* yarn-error.log* + +# pyc files +*.pyc +__pycache__/ diff --git a/docusaurus.config.js b/docusaurus.config.js index 39ab54bb7c..2b0e551698 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -1,9 +1,7 @@ // @ts-check // Note: type annotations allow type checking and IDEs autocompletion -const lightCodeTheme = require("prism-react-renderer/themes/github"); -const darkCodeTheme = require("prism-react-renderer/themes/dracula"); - +const prism = require('prism-react-renderer'); const editUrl = { editUrl: "https://github.com/conda-forge/conda-forge.github.io/tree/main/", }; @@ -13,13 +11,21 @@ if (process.env.NETLIFY) { copyright += ` · Deployed on Netlify`; } +const goatcounter = { + // see stats at https://conda-forge.goatcounter.com/ + src: "/js/count.js", + defer: true, + "data-goatcounter": "https://conda-forge.goatcounter.com/count", +} + /** @type {import('@docusaurus/types').Config} */ const config = { title: "conda-forge | community-driven packaging for conda", url: "https://conda-forge.org/", baseUrl: "/", - onBrokenLinks: "throw", - onBrokenMarkdownLinks: "throw", + onBrokenLinks: process.env.GITHUB_ACTIONS ? "throw" : "warn", + onBrokenMarkdownLinks: process.env.GITHUB_ACTIONS ? "throw" : "warn", + onBrokenAnchors: process.env.GITHUB_ACTIONS ? "throw" : "warn", favicon: "img/favicon.ico", trailingSlash: true, staticDirectories: ['static', 'static-sphinx'], @@ -45,9 +51,15 @@ const config = { "/fonts/font-awesome/brands.css", ], + scripts: [ + // Only deploy stats on production site, not locally or on Netlify + ...((process.env.GITHUB_ACTIONS) ? [goatcounter] : []), + ], + // Mermaid configuration markdown: { mermaid: true, + format: "detect", }, themes: ["@docusaurus/theme-mermaid"], @@ -56,11 +68,10 @@ const config = { "classic", /** @type {import('@docusaurus/preset-classic').Options} */ ({ - docs: false, - // docs: { - // breadcrumbs: true, - // ...editUrl, - // }, + docs: { + breadcrumbs: true, + // ...editUrl, + }, blog: { showReadingTime: true, blogSidebarCount: 10, @@ -99,6 +110,7 @@ const config = { [ "@docusaurus/plugin-client-redirects", { + fromExtensions: ["html", "htm"], createRedirects(existingPath) { var redirects = []; if (existingPath.startsWith('/blog/tags/')) { @@ -111,6 +123,20 @@ const config = { redirects.push("/blog/2020/"); redirects.push("/blog/2019/"); } + if ( + [ + "/docs/", + "/docs/user/", + "/docs/orga/", + "/docs/orga/minutes/", + "/docs/orga/funding/", + "/docs/misc/", + "/docs/maintainer/", + "/docs/contracting/", + ].includes(existingPath) + ) { + redirects.push(`${existingPath}00_intro.html`); + } return redirects; }, redirects: [ @@ -167,7 +193,8 @@ const config = { to: "/blog/2020/12/26/year-in-review/", }, { - from: ["/blog/posts/2021-02-02-outreachy/", "/blog/2021/02/02/Outreachy/"], + // case sensitive only on Linux! + from: ["/blog/posts/2021-02-02-outreachy/", ...((process.platform === "linux") ? ["/blog/posts/2021-02-02-Outreachy/"] : [])], to: "/blog/2021/02/02/outreachy/", }, { @@ -217,7 +244,7 @@ const config = { items: [ { // https://docusaurus.io/docs/advanced/routing#escaping-from-spa-redirects - to: "pathname:///docs/", + to: "/docs/", label: "Docs", position: "left", }, @@ -277,19 +304,19 @@ const config = { items: [ { label: "Getting started", - to: "pathname:///docs/", + to: "/docs/", }, { label: "User docs", - to: "pathname:///docs/user/00_intro.html", + to: "/docs/user/", }, { label: "Maintainer docs", - to: "pathname:///docs/maintainer/00_intro.html", + to: "/docs/maintainer/", }, { label: "Organisation docs", - to: "pathname:///docs/orga/00_intro.html", + to: "/docs/orga/", }, ], }, @@ -298,19 +325,19 @@ const config = { items: [ { label: "About conda-forge", - to: "pathname:///docs", + to: "/docs", }, { label: "Governance", - to: "pathname:///docs/orga/governance.html", + to: "/docs/orga/governance/", }, { label: "Meeting minutes", - to: "pathname:///docs/orga/minutes/00_intro.html", + to: "/docs/orga/minutes/", }, { label: "Get in touch", - to: "pathname:///docs/orga/getting-in-touch.html", + to: "/docs/orga/getting-in-touch/", }, ], }, @@ -368,8 +395,9 @@ const config = { copyright: copyright, }, prism: { - theme: lightCodeTheme, - darkTheme: darkCodeTheme, + theme: prism.themes.github, + darkTheme: prism.themes.dracula, + additionalLanguages: ['bash', 'diff', 'json', 'batch', 'yaml', 'python', 'markdown', 'shell-session'], }, docs: { sidebar: { @@ -377,6 +405,19 @@ const config = { hideable: true, }, }, + // search bar engine + algolia: { + // The application ID provided by Algolia + appId: 'KB43FQOB7U', + // Public API key: it is safe to commit it + apiKey: '1a5d6d865203b90af8493b585bbb99dc', + indexName: 'conda-forge', + contextualSearch: true, + searchPagePath: 'search', + // insights: true, + // Set debug to true if you want to inspect the modal + debug: true, + }, }), }; diff --git a/news/2019-03-28-we-overhauled-the-blas-support-in-conda-forge.md b/news/2019-03-28-we-overhauled-the-blas-support-in-conda-forge.md index 49e2b4e500..6d83404737 100644 --- a/news/2019-03-28-we-overhauled-the-blas-support-in-conda-forge.md +++ b/news/2019-03-28-we-overhauled-the-blas-support-in-conda-forge.md @@ -2,4 +2,4 @@ - Our packages now build against NETLIB’s reference implementation. - You as a user can now choose the implementation available at runtime. -For more information please refer to the [documentation](pathname:///docs/maintainer/knowledge_base.html#knowledge-blas). +For more information please refer to the [documentation](/docs/maintainer/knowledge_base/#knowledge-blas). diff --git a/package-lock.json b/package-lock.json index dfbe08faae..ff640c9c6f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,18 +8,18 @@ "name": "cf-infra-docs", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^3.0.0", - "@docusaurus/plugin-client-redirects": "^3.0.0", - "@docusaurus/preset-classic": "^3.0.0", - "@docusaurus/theme-mermaid": "^3.0.0", + "@docusaurus/core": "^3.1.1", + "@docusaurus/plugin-client-redirects": "^3.1.1", + "@docusaurus/preset-classic": "^3.1.1", + "@docusaurus/theme-mermaid": "^3.1.1", "@mdx-js/react": "^3.0.0", "clsx": "^1.2.1", - "prism-react-renderer": "^1.3.5", + "prism-react-renderer": "^2.1.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.0.0", + "@docusaurus/module-type-aliases": "^3.1.1", "prettier": "^2.7.1" }, "engines": { @@ -68,74 +68,74 @@ } }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.0.tgz", - "integrity": "sha512-uZ1uZMLDZb4qODLfTSNHxSi4fH9RdrQf7DXEzW01dS8XK7QFtFh29N5NGKa9S+Yudf1vUMIF+/RiL4i/J0pWlQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", + "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", "dependencies": { - "@algolia/cache-common": "4.22.0" + "@algolia/cache-common": "4.22.1" } }, "node_modules/@algolia/cache-common": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.0.tgz", - "integrity": "sha512-TPwUMlIGPN16eW67qamNQUmxNiGHg/WBqWcrOoCddhqNTqGDPVqmgfaM85LPbt24t3r1z0zEz/tdsmuq3Q6oaA==" + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", + "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==" }, "node_modules/@algolia/cache-in-memory": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.0.tgz", - "integrity": "sha512-kf4Cio9NpPjzp1+uXQgL4jsMDeck7MP89BYThSvXSjf2A6qV/0KeqQf90TL2ECS02ovLOBXkk98P7qVarM+zGA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", + "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", "dependencies": { - "@algolia/cache-common": "4.22.0" + "@algolia/cache-common": "4.22.1" } }, "node_modules/@algolia/client-account": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.0.tgz", - "integrity": "sha512-Bjb5UXpWmJT+yGWiqAJL0prkENyEZTBzdC+N1vBuHjwIJcjLMjPB6j1hNBRbT12Lmwi55uzqeMIKS69w+0aPzA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", + "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", "dependencies": { - "@algolia/client-common": "4.22.0", - "@algolia/client-search": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-analytics": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.0.tgz", - "integrity": "sha512-os2K+kHUcwwRa4ArFl5p/3YbF9lN3TLOPkbXXXxOvDpqFh62n9IRZuzfxpHxMPKAQS3Et1s0BkKavnNP02E9Hg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", + "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", "dependencies": { - "@algolia/client-common": "4.22.0", - "@algolia/client-search": "4.22.0", - "@algolia/requester-common": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-common": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.0.tgz", - "integrity": "sha512-BlbkF4qXVWuwTmYxVWvqtatCR3lzXwxx628p1wj1Q7QP2+LsTmGt1DiUYRuy9jG7iMsnlExby6kRMOOlbhv2Ag==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", + "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", "dependencies": { - "@algolia/requester-common": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-personalization": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.0.tgz", - "integrity": "sha512-pEOftCxeBdG5pL97WngOBi9w5Vxr5KCV2j2D+xMVZH8MuU/JX7CglDSDDb0ffQWYqcUN+40Ry+xtXEYaGXTGow==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", + "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", "dependencies": { - "@algolia/client-common": "4.22.0", - "@algolia/requester-common": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-search": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.0.tgz", - "integrity": "sha512-bn4qQiIdRPBGCwsNuuqB8rdHhGKKWIij9OqidM1UkQxnSG8yzxHdb7CujM30pvp5EnV7jTqDZRbxacbjYVW20Q==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", + "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", "dependencies": { - "@algolia/client-common": "4.22.0", - "@algolia/requester-common": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/events": { @@ -144,47 +144,47 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/logger-common": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.0.tgz", - "integrity": "sha512-HMUQTID0ucxNCXs5d1eBJ5q/HuKg8rFVE/vOiLaM4Abfeq1YnTtGV3+rFEhOPWhRQxNDd+YHa4q864IMc0zHpQ==" + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", + "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==" }, "node_modules/@algolia/logger-console": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.0.tgz", - "integrity": "sha512-7JKb6hgcY64H7CRm3u6DRAiiEVXMvCJV5gRE672QFOUgDxo4aiDpfU61g6Uzy8NKjlEzHMmgG4e2fklELmPXhQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", + "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", "dependencies": { - "@algolia/logger-common": "4.22.0" + "@algolia/logger-common": "4.22.1" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.0.tgz", - "integrity": "sha512-BHfv1h7P9/SyvcDJDaRuIwDu2yrDLlXlYmjvaLZTtPw6Ok/ZVhBR55JqW832XN/Fsl6k3LjdkYHHR7xnsa5Wvg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", + "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", "dependencies": { - "@algolia/requester-common": "4.22.0" + "@algolia/requester-common": "4.22.1" } }, "node_modules/@algolia/requester-common": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.0.tgz", - "integrity": "sha512-Y9cEH/cKjIIZgzvI1aI0ARdtR/xRrOR13g5psCxkdhpgRN0Vcorx+zePhmAa4jdQNqexpxtkUdcKYugBzMZJgQ==" + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", + "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==" }, "node_modules/@algolia/requester-node-http": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.0.tgz", - "integrity": "sha512-8xHoGpxVhz3u2MYIieHIB6MsnX+vfd5PS4REgglejJ6lPigftRhTdBCToe6zbwq4p0anZXjjPDvNWMlgK2+xYA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", + "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", "dependencies": { - "@algolia/requester-common": "4.22.0" + "@algolia/requester-common": "4.22.1" } }, "node_modules/@algolia/transporter": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.0.tgz", - "integrity": "sha512-ieO1k8x2o77GNvOoC+vAkFKppydQSVfbjM3YrSjLmgywiBejPTvU1R1nEvG59JIIUvtSLrZsLGPkd6vL14zopA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", + "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", "dependencies": { - "@algolia/cache-common": "4.22.0", - "@algolia/logger-common": "4.22.0", - "@algolia/requester-common": "4.22.0" + "@algolia/cache-common": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/requester-common": "4.22.1" } }, "node_modules/@ampproject/remapping": { @@ -2170,9 +2170,9 @@ } }, "node_modules/@docusaurus/core": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.0.1.tgz", - "integrity": "sha512-CXrLpOnW+dJdSv8M5FAJ3JBwXtL6mhUWxFA8aS0ozK6jBG/wgxERk5uvH28fCeFxOGbAT9v1e9dOMo1X2IEVhQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.1.1.tgz", + "integrity": "sha512-2nQfKFcf+MLEM7JXsXwQxPOmQAR6ytKMZVSx7tVi9HEm9WtfwBH1fp6bn8Gj4zLUhjWKCLoysQ9/Wm+EZCQ4yQ==", "dependencies": { "@babel/core": "^7.23.3", "@babel/generator": "^7.23.3", @@ -2184,13 +2184,13 @@ "@babel/runtime": "^7.22.6", "@babel/runtime-corejs3": "^7.22.6", "@babel/traverse": "^7.22.8", - "@docusaurus/cssnano-preset": "3.0.1", - "@docusaurus/logger": "3.0.1", - "@docusaurus/mdx-loader": "3.0.1", + "@docusaurus/cssnano-preset": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-common": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.5.1", "autoprefixer": "^10.4.14", @@ -2256,9 +2256,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.0.1.tgz", - "integrity": "sha512-wjuXzkHMW+ig4BD6Ya1Yevx9UJadO4smNZCEljqBoQfIQrQskTswBs7lZ8InHP7mCt273a/y/rm36EZhqJhknQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.1.1.tgz", + "integrity": "sha512-LnoIDjJWbirdbVZDMq+4hwmrTl2yHDnBf9MLG9qyExeAE3ac35s4yUhJI8yyTCdixzNfKit4cbXblzzqMu4+8g==", "dependencies": { "cssnano-preset-advanced": "^5.3.10", "postcss": "^8.4.26", @@ -2270,9 +2270,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.0.1.tgz", - "integrity": "sha512-I5L6Nk8OJzkVA91O2uftmo71LBSxe1vmOn9AMR6JRCzYeEBrqneWMH02AqMvjJ2NpMiviO+t0CyPjyYV7nxCWQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.1.1.tgz", + "integrity": "sha512-BjkNDpQzewcTnST8trx4idSoAla6zZ3w22NqM/UMcFtvYJgmoE4layuTzlfql3VFPNuivvj7BOExa/+21y4X2Q==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" @@ -2282,15 +2282,15 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.0.1.tgz", - "integrity": "sha512-ldnTmvnvlrONUq45oKESrpy+lXtbnTcTsFkOTIDswe5xx5iWJjt6eSa0f99ZaWlnm24mlojcIGoUWNCS53qVlQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.1.1.tgz", + "integrity": "sha512-xN2IccH9+sv7TmxwsDJNS97BHdmlqWwho+kIVY4tcCXkp+k4QuzvWBeunIMzeayY4Fu13A6sAjHGv5qm72KyGA==", "dependencies": { "@babel/parser": "^7.22.7", "@babel/traverse": "^7.22.8", - "@docusaurus/logger": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -2322,12 +2322,12 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.0.1.tgz", - "integrity": "sha512-DEHpeqUDsLynl3AhQQiO7AbC7/z/lBra34jTcdYuvp9eGm01pfH1wTVq8YqWZq6Jyx0BgcVl/VJqtE9StRd9Ag==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.1.1.tgz", + "integrity": "sha512-xBJyx0TMfAfVZ9ZeIOb1awdXgR4YJMocIEzTps91rq+hJDFJgJaylDtmoRhUxkwuYmNK1GJpW95b7DLztSBJ3A==", "dependencies": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "3.0.1", + "@docusaurus/types": "3.1.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2341,15 +2341,15 @@ } }, "node_modules/@docusaurus/plugin-client-redirects": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.0.1.tgz", - "integrity": "sha512-CoZapnHbV3j5jsHCa/zmKaa8+H+oagHBgg91dN5I8/3kFit/xtZPfRaznvDX49cHg2nSoV74B3VMAT+bvCmzFQ==", - "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/logger": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-common": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.1.1.tgz", + "integrity": "sha512-J/1Z75XkO+BmUXHW17FrCIYZQ3b0IKaJECH6yCxW5RQ8NMMJ+SZCtPtx5oYoAd0VHersNiUu+ZAxfOqbsn1jKQ==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "eta": "^2.2.0", "fs-extra": "^11.1.1", "lodash": "^4.17.21", @@ -2364,17 +2364,17 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.0.1.tgz", - "integrity": "sha512-cLOvtvAyaMQFLI8vm4j26svg3ktxMPSXpuUJ7EERKoGbfpJSsgtowNHcRsaBVmfuCsRSk1HZ/yHBsUkTmHFEsg==", - "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/logger": "3.0.1", - "@docusaurus/mdx-loader": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-common": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.1.1.tgz", + "integrity": "sha512-ew/3VtVoG3emoAKmoZl7oKe1zdFOsI0NbcHS26kIxt2Z8vcXKCUgK9jJJrz0TbOipyETPhqwq4nbitrY3baibg==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", @@ -2395,17 +2395,17 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.0.1.tgz", - "integrity": "sha512-dRfAOA5Ivo+sdzzJGXEu33yAtvGg8dlZkvt/NEJ7nwi1F2j4LEdsxtfX2GKeETB2fP6XoGNSQnFXqa2NYGrHFg==", - "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/logger": "3.0.1", - "@docusaurus/mdx-loader": "3.0.1", - "@docusaurus/module-type-aliases": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.1.1.tgz", + "integrity": "sha512-lhFq4E874zw0UOH7ujzxnCayOyAt0f9YPVYSb9ohxrdCM8B4szxitUw9rIX4V9JLLHVoqIJb6k+lJJ1jrcGJ0A==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -2424,15 +2424,15 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.0.1.tgz", - "integrity": "sha512-oP7PoYizKAXyEttcvVzfX3OoBIXEmXTMzCdfmC4oSwjG4SPcJsRge3mmI6O8jcZBgUPjIzXD21bVGWEE1iu8gg==", - "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/mdx-loader": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.1.1.tgz", + "integrity": "sha512-NQHncNRAJbyLtgTim9GlEnNYsFhuCxaCNkMwikuxLTiGIPH7r/jpb7O3f3jUMYMebZZZrDq5S7om9a6rvB/YCA==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" @@ -2446,13 +2446,13 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.0.1.tgz", - "integrity": "sha512-09dxZMdATky4qdsZGzhzlUvvC+ilQ2hKbYF+wez+cM2mGo4qHbv8+qKXqxq0CQZyimwlAOWQLoSozIXU0g0i7g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.1.1.tgz", + "integrity": "sha512-xWeMkueM9wE/8LVvl4+Qf1WqwXmreMjI5Kgr7GYCDoJ8zu4kD+KaMhrh7py7MNM38IFvU1RfrGKacCEe2DRRfQ==", "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils": "3.0.1", + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", "fs-extra": "^11.1.1", "react-json-view-lite": "^1.2.0", "tslib": "^2.6.0" @@ -2466,13 +2466,13 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.0.1.tgz", - "integrity": "sha512-jwseSz1E+g9rXQwDdr0ZdYNjn8leZBnKPjjQhMBEiwDoenL3JYFcNW0+p0sWoVF/f2z5t7HkKA+cYObrUh18gg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.1.1.tgz", + "integrity": "sha512-+q2UpWTqVi8GdlLoSlD5bS/YpxW+QMoBwrPrUH/NpvpuOi0Of7MTotsQf9JWd3hymZxl2uu1o3PIrbpxfeDFDQ==", "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "tslib": "^2.6.0" }, "engines": { @@ -2484,13 +2484,13 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.0.1.tgz", - "integrity": "sha512-UFTDvXniAWrajsulKUJ1DB6qplui1BlKLQZjX4F7qS/qfJ+qkKqSkhJ/F4VuGQ2JYeZstYb+KaUzUzvaPK1aRQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.1.1.tgz", + "integrity": "sha512-0mMPiBBlQ5LFHTtjxuvt/6yzh8v7OxLi3CbeEsxXZpUzcKO/GC7UA1VOWUoBeQzQL508J12HTAlR3IBU9OofSw==", "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, @@ -2503,13 +2503,13 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.0.1.tgz", - "integrity": "sha512-IPFvuz83aFuheZcWpTlAdiiX1RqWIHM+OH8wS66JgwAKOiQMR3+nLywGjkLV4bp52x7nCnwhNk1rE85Cpy/CIw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.1.1.tgz", + "integrity": "sha512-d07bsrMLdDIryDtY17DgqYUbjkswZQr8cLWl4tzXrt5OR/T/zxC1SYKajzB3fd87zTu5W5klV5GmUwcNSMXQXA==", "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "tslib": "^2.6.0" }, "engines": { @@ -2521,16 +2521,16 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.0.1.tgz", - "integrity": "sha512-xARiWnjtVvoEniZudlCq5T9ifnhCu/GAZ5nA7XgyLfPcNpHQa241HZdsTlLtVcecEVVdllevBKOp7qknBBaMGw==", - "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/logger": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-common": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.1.1.tgz", + "integrity": "sha512-iJ4hCaMmDaUqRv131XJdt/C/jJQx8UreDWTRqZKtNydvZVh/o4yXGRRFOplea1D9b/zpwL1Y+ZDwX7xMhIOTmg==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" @@ -2544,23 +2544,23 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.0.1.tgz", - "integrity": "sha512-il9m9xZKKjoXn6h0cRcdnt6wce0Pv1y5t4xk2Wx7zBGhKG1idu4IFHtikHlD0QPuZ9fizpXspXcTzjL5FXc1Gw==", - "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/plugin-content-blog": "3.0.1", - "@docusaurus/plugin-content-docs": "3.0.1", - "@docusaurus/plugin-content-pages": "3.0.1", - "@docusaurus/plugin-debug": "3.0.1", - "@docusaurus/plugin-google-analytics": "3.0.1", - "@docusaurus/plugin-google-gtag": "3.0.1", - "@docusaurus/plugin-google-tag-manager": "3.0.1", - "@docusaurus/plugin-sitemap": "3.0.1", - "@docusaurus/theme-classic": "3.0.1", - "@docusaurus/theme-common": "3.0.1", - "@docusaurus/theme-search-algolia": "3.0.1", - "@docusaurus/types": "3.0.1" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.1.1.tgz", + "integrity": "sha512-jG4ys/hWYf69iaN/xOmF+3kjs4Nnz1Ay3CjFLDtYa8KdxbmUhArA9HmP26ru5N0wbVWhY+6kmpYhTJpez5wTyg==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/plugin-content-blog": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/plugin-content-pages": "3.1.1", + "@docusaurus/plugin-debug": "3.1.1", + "@docusaurus/plugin-google-analytics": "3.1.1", + "@docusaurus/plugin-google-gtag": "3.1.1", + "@docusaurus/plugin-google-tag-manager": "3.1.1", + "@docusaurus/plugin-sitemap": "3.1.1", + "@docusaurus/theme-classic": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/theme-search-algolia": "3.1.1", + "@docusaurus/types": "3.1.1" }, "engines": { "node": ">=18.0" @@ -2583,22 +2583,22 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.0.1.tgz", - "integrity": "sha512-XD1FRXaJiDlmYaiHHdm27PNhhPboUah9rqIH0lMpBt5kYtsGjJzhqa27KuZvHLzOP2OEpqd2+GZ5b6YPq7Q05Q==", - "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/mdx-loader": "3.0.1", - "@docusaurus/module-type-aliases": "3.0.1", - "@docusaurus/plugin-content-blog": "3.0.1", - "@docusaurus/plugin-content-docs": "3.0.1", - "@docusaurus/plugin-content-pages": "3.0.1", - "@docusaurus/theme-common": "3.0.1", - "@docusaurus/theme-translations": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-common": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.1.1.tgz", + "integrity": "sha512-GiPE/jbWM8Qv1A14lk6s9fhc0LhPEQ00eIczRO4QL2nAQJZXkjPG6zaVx+1cZxPFWbAsqSjKe2lqkwF3fGkQ7Q==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/plugin-content-blog": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/plugin-content-pages": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/theme-translations": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", @@ -2629,30 +2629,18 @@ "node": ">=6" } }, - "node_modules/@docusaurus/theme-classic/node_modules/prism-react-renderer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", - "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", - "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, "node_modules/@docusaurus/theme-common": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.0.1.tgz", - "integrity": "sha512-cr9TOWXuIOL0PUfuXv6L5lPlTgaphKP+22NdVBOYah5jSq5XAAulJTjfe+IfLsEG4L7lJttLbhW7LXDFSAI7Ag==", - "dependencies": { - "@docusaurus/mdx-loader": "3.0.1", - "@docusaurus/module-type-aliases": "3.0.1", - "@docusaurus/plugin-content-blog": "3.0.1", - "@docusaurus/plugin-content-docs": "3.0.1", - "@docusaurus/plugin-content-pages": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-common": "3.0.1", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.1.1.tgz", + "integrity": "sha512-38urZfeMhN70YaXkwIGXmcUcv2CEYK/2l4b05GkJPrbEbgpsIZM3Xc+Js2ehBGGZmfZq8GjjQ5RNQYG+MYzCYg==", + "dependencies": { + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/plugin-content-blog": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/plugin-content-pages": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2678,28 +2666,16 @@ "node": ">=6" } }, - "node_modules/@docusaurus/theme-common/node_modules/prism-react-renderer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", - "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", - "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, "node_modules/@docusaurus/theme-mermaid": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.0.1.tgz", - "integrity": "sha512-jquSDnZfazABnC5i+02GzRIvufXKruKgvbYkQjKbI7/LWo0XvBs0uKAcCDGgHhth0t/ON5+Sn27joRfpeSk3Lw==", - "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/module-type-aliases": "3.0.1", - "@docusaurus/theme-common": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.1.1.tgz", + "integrity": "sha512-O6u9/7QX/ZapV4HJJSzNs0Jir1KA/LRLORWYeDvbGswqZNusj6q4iLELrKIClysJ3PB3zWUzyKtI/wjIKiV1vA==", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "mermaid": "^10.4.0", "tslib": "^2.6.0" }, @@ -2712,18 +2688,18 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.0.1.tgz", - "integrity": "sha512-DDiPc0/xmKSEdwFkXNf1/vH1SzJPzuJBar8kMcBbDAZk/SAmo/4lf6GU2drou4Ae60lN2waix+jYWTWcJRahSA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.1.1.tgz", + "integrity": "sha512-tBH9VY5EpRctVdaAhT+b1BY8y5dyHVZGFXyCHgTrvcXQy5CV4q7serEX7U3SveNT9zksmchPyct6i1sFDC4Z5g==", "dependencies": { "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.0.1", - "@docusaurus/logger": "3.0.1", - "@docusaurus/plugin-content-docs": "3.0.1", - "@docusaurus/theme-common": "3.0.1", - "@docusaurus/theme-translations": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/theme-translations": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", "algoliasearch": "^4.18.0", "algoliasearch-helper": "^3.13.3", "clsx": "^2.0.0", @@ -2750,9 +2726,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.0.1.tgz", - "integrity": "sha512-6UrbpzCTN6NIJnAtZ6Ne9492vmPVX+7Fsz4kmp+yor3KQwA1+MCzQP7ItDNkP38UmVLnvB/cYk/IvehCUqS3dg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.1.1.tgz", + "integrity": "sha512-xvWQFwjxHphpJq5fgk37FXCDdAa2o+r7FX8IpMg+bGZBNXyWBu3MjZ+G4+eUVNpDhVinTc+j6ucL0Ain5KCGrg==", "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -2762,10 +2738,11 @@ } }, "node_modules/@docusaurus/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.1.tgz", - "integrity": "sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", + "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", "dependencies": { + "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", @@ -2781,11 +2758,11 @@ } }, "node_modules/@docusaurus/utils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.0.1.tgz", - "integrity": "sha512-TwZ33Am0q4IIbvjhUOs+zpjtD/mXNmLmEgeTGuRq01QzulLHuPhaBTTAC/DHu6kFx3wDgmgpAlaRuCHfTcXv8g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.1.1.tgz", + "integrity": "sha512-ZJfJa5cJQtRYtqijsPEnAZoduW6sjAQ7ZCWSZavLcV10Fw0Z3gSaPKA/B4micvj2afRZ4gZxT7KfYqe5H8Cetg==", "dependencies": { - "@docusaurus/logger": "3.0.1", + "@docusaurus/logger": "3.1.1", "@svgr/webpack": "^6.5.1", "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", @@ -2816,9 +2793,9 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.0.1.tgz", - "integrity": "sha512-W0AxD6w6T8g6bNro8nBRWf7PeZ/nn7geEWM335qHU2DDDjHuV4UZjgUGP1AQsdcSikPrlIqTJJbKzer1lRSlIg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.1.1.tgz", + "integrity": "sha512-eGne3olsIoNfPug5ixjepZAIxeYFzHHnor55Wb2P57jNbtVaFvij/T+MS8U0dtZRFi50QU+UPmRrXdVUM8uyMg==", "dependencies": { "tslib": "^2.6.0" }, @@ -2835,12 +2812,12 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.0.1.tgz", - "integrity": "sha512-ujTnqSfyGQ7/4iZdB4RRuHKY/Nwm58IIb+41s5tCXOv/MBU2wGAjOHq3U+AEyJ8aKQcHbxvTKJaRchNHYUVUQg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.1.1.tgz", + "integrity": "sha512-KlY4P9YVDnwL+nExvlIpu79abfEv6ZCHuOX4ZQ+gtip+Wxj0daccdReIWWtqxM/Fb5Cz1nQvUCc7VEtT8IBUAA==", "dependencies": { - "@docusaurus/logger": "3.0.1", - "@docusaurus/utils": "3.0.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/utils": "3.1.1", "joi": "^17.9.2", "js-yaml": "^4.1.0", "tslib": "^2.6.0" @@ -2947,9 +2924,9 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, "node_modules/@mdx-js/mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.0.tgz", - "integrity": "sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", + "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", @@ -3071,9 +3048,9 @@ "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==" }, "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -3481,9 +3458,9 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/estree-jsx": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz", - "integrity": "sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.4.tgz", + "integrity": "sha512-5idy3hvI9lAMqsyilBM+N+boaCf1MgoefbDxN6KEO5aK17TOHwFAYT9sjxzeKAiIWRUBgLxmZ9mPcnzZXtTcRQ==", "dependencies": { "@types/estree": "*" } @@ -3516,9 +3493,9 @@ "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==" }, "node_modules/@types/hast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", - "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -4034,30 +4011,30 @@ } }, "node_modules/algoliasearch": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.0.tgz", - "integrity": "sha512-gfceltjkwh7PxXwtkS8KVvdfK+TSNQAWUeNSxf4dA29qW5tf2EGwa8jkJujlT9jLm17cixMVoGNc+GJFO1Mxhg==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.22.0", - "@algolia/cache-common": "4.22.0", - "@algolia/cache-in-memory": "4.22.0", - "@algolia/client-account": "4.22.0", - "@algolia/client-analytics": "4.22.0", - "@algolia/client-common": "4.22.0", - "@algolia/client-personalization": "4.22.0", - "@algolia/client-search": "4.22.0", - "@algolia/logger-common": "4.22.0", - "@algolia/logger-console": "4.22.0", - "@algolia/requester-browser-xhr": "4.22.0", - "@algolia/requester-common": "4.22.0", - "@algolia/requester-node-http": "4.22.0", - "@algolia/transporter": "4.22.0" + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", + "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.22.1", + "@algolia/cache-common": "4.22.1", + "@algolia/cache-in-memory": "4.22.1", + "@algolia/client-account": "4.22.1", + "@algolia/client-analytics": "4.22.1", + "@algolia/client-common": "4.22.1", + "@algolia/client-personalization": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/logger-console": "4.22.1", + "@algolia/requester-browser-xhr": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/requester-node-http": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/algoliasearch-helper": { - "version": "3.16.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.16.1.tgz", - "integrity": "sha512-qxAHVjjmT7USVvrM8q6gZGaJlCK1fl4APfdAA7o8O6iXEc68G0xMNrzRkxoB/HmhhvyHnoteS/iMTiHiTcQQcg==", + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.16.2.tgz", + "integrity": "sha512-Yl/Gu5Cq4Z5s/AJ0jR37OPI1H3+z7PHz657ibyaXgMOaWvPlZ3OACN13N+7HCLPUlB0BN+8BtmrG/CqTilowBA==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -4176,9 +4153,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "version": "10.4.17", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", + "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", "funding": [ { "type": "opencollective", @@ -4194,9 +4171,9 @@ } ], "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", + "browserslist": "^4.22.2", + "caniuse-lite": "^1.0.30001578", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -4557,9 +4534,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001574", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz", - "integrity": "sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==", + "version": "1.0.30001587", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz", + "integrity": "sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==", "funding": [ { "type": "opencollective", @@ -7543,9 +7520,9 @@ } }, "node_modules/hast-util-raw": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.1.tgz", - "integrity": "sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", + "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -8487,13 +8464,13 @@ } }, "node_modules/joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "version": "17.12.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.1.tgz", + "integrity": "sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==", "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -8913,9 +8890,9 @@ } }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9041,9 +9018,9 @@ } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.0.tgz", + "integrity": "sha512-A8AJHlR7/wPQ3+Jre1+1rq040fX9A4Q1jG8JxmSNp/PLPHg80A6475wxTp3KzHpApFH6yWxFotHrJQA3dXP6/w==", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -9082,9 +9059,9 @@ } }, "node_modules/mdast-util-phrasing": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz", - "integrity": "sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" @@ -9095,9 +9072,9 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz", - "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -9106,7 +9083,8 @@ "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0" + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", @@ -9736,9 +9714,9 @@ } }, "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9807,9 +9785,9 @@ } }, "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9856,9 +9834,9 @@ } }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9924,9 +9902,9 @@ } }, "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9996,9 +9974,9 @@ } }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10097,9 +10075,9 @@ } }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10178,9 +10156,9 @@ } }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10256,9 +10234,9 @@ } }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10330,9 +10308,9 @@ } }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10415,9 +10393,9 @@ } }, "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10469,9 +10447,9 @@ } }, "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10524,9 +10502,9 @@ } }, "node_modules/micromark-factory-label/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10583,9 +10561,9 @@ } }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10691,9 +10669,9 @@ } }, "node_modules/micromark-factory-title/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10765,9 +10743,9 @@ } }, "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10886,9 +10864,9 @@ } }, "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10993,9 +10971,9 @@ } }, "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11168,9 +11146,9 @@ } }, "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -11287,9 +11265,9 @@ } }, "node_modules/micromark/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -12666,11 +12644,23 @@ } }, "node_modules/prism-react-renderer": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", - "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", + "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, "peerDependencies": { - "react": ">=0.14.9" + "react": ">=16.0.0" + } + }, + "node_modules/prism-react-renderer/node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" } }, "node_modules/prismjs": { @@ -12709,9 +12699,9 @@ } }, "node_modules/property-information": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz", - "integrity": "sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", + "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -13368,9 +13358,9 @@ } }, "node_modules/remark-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.0.tgz", - "integrity": "sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", + "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" @@ -13396,9 +13386,9 @@ } }, "node_modules/remark-rehype": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.0.0.tgz", - "integrity": "sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -14724,9 +14714,9 @@ } }, "node_modules/trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -15209,9 +15199,9 @@ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", "engines": { "node": ">= 4" } diff --git a/package.json b/package.json index 6d1636f3cb..4b466e18d7 100644 --- a/package.json +++ b/package.json @@ -14,18 +14,18 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "^3.0.0", - "@docusaurus/plugin-client-redirects": "^3.0.0", - "@docusaurus/preset-classic": "^3.0.0", - "@docusaurus/theme-mermaid": "^3.0.0", + "@docusaurus/core": "^3.1.1", + "@docusaurus/plugin-client-redirects": "^3.1.1", + "@docusaurus/preset-classic": "^3.1.1", + "@docusaurus/theme-mermaid": "^3.1.1", "@mdx-js/react": "^3.0.0", "clsx": "^1.2.1", - "prism-react-renderer": "^1.3.5", + "prism-react-renderer": "^2.1.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.0.0", + "@docusaurus/module-type-aliases": "^3.1.1", "prettier": "^2.7.1" }, "browserslist": { diff --git a/sphinx/src/Makefile b/sphinx/src/Makefile index 75e635a98e..e8a7e2da8f 100644 --- a/sphinx/src/Makefile +++ b/sphinx/src/Makefile @@ -53,6 +53,12 @@ help: clean: rm -rf $(BUILDDIR)/* +.PHONY: markdown +markdown: + $(SPHINXBUILD) -b markdown $(ALLSPHINXOPTS) $(BUILDDIR)/markdown + @echo + @echo "Build finished. The markdown pages are in $(BUILDDIR)/markdown." + .PHONY: html html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html diff --git a/sphinx/src/conf.py b/sphinx/src/conf.py index 13d8350fbc..48ed9dd6f7 100644 --- a/sphinx/src/conf.py +++ b/sphinx/src/conf.py @@ -13,7 +13,6 @@ # serve to show the default. import csv import os -import sys import datetime import cloud_sptheme as csp @@ -35,8 +34,12 @@ 'myst_parser', 'sphinx.ext.todo', 'sphinxcontrib.fulltoc', + 'sphinx_markdown_builder', ] +# Add Sphinx calculated anchors to each header +markdown_anchor_sections = True + # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -346,21 +349,27 @@ def get_formated_names(path_file): f" `__" for m in sorted_csv ) - if ( - app.builder.format != "html" - or os.path.basename(docname) != "governance" - ): + if app.builder.format not in ("html", "markdown"): return - src = source[0] + src = rendered = source[0] current_file = os.path.dirname(__file__) - context = app.config.html_context - context["core_members"] = get_formated_names( - os.path.join(current_file, "..", "..", "src", "core.csv") - ) - context["emeritus_members"] = get_formated_names( - os.path.join(current_file, "..", "..", "src", "emeritus.csv") - ) - rendered = app.builder.templates.render_string(src, context) + repo_root = os.path.join(current_file, "..", "..") + filename = os.path.basename(docname) + if filename == "governance": + core_members = get_formated_names(os.path.join(repo_root, "src", "core.csv")) + emeritus_members = get_formated_names(os.path.join(repo_root, "src", "emeritus.csv")) + # this is just a simple replacement, no advanced jinja needed + rendered = src.replace("{{ core_members }}", core_members) + rendered = rendered.replace("{{ emeritus_members }}", emeritus_members) + elif filename == "cfep-index": + import importlib + # import cfep helper from path + mod_path = os.path.join(repo_root, ".ci_scripts", "generate_cfep_index.py") + spec = importlib.util.spec_from_file_location("generate_cfep_index", mod_path) + generate_cfep_index = importlib.util.module_from_spec(spec) + spec.loader.exec_module(generate_cfep_index) + rst_links = [f"- {cfep.rst_link()}" for cfep in generate_cfep_index.get_cfeps()] + rendered = src.replace("{{ cfep_list }}", "\n".join(rst_links)) source[0] = rendered diff --git a/sphinx/src/index.rst b/sphinx/src/index.rst index fe71f47887..c496e06c12 100644 --- a/sphinx/src/index.rst +++ b/sphinx/src/index.rst @@ -15,13 +15,13 @@ Chances are we have already packaged it for you. You can `search `__ - - Help update and `maintain packages `__ - - Suggest or implement improvements for our `infrastructure `__ - - Help `improve the documentation `__ - - For a detailed overview please refer to :ref:`becoming_involved`. + - :doc:`Contribute new packages ` + - Help update and :doc:`maintain packages ` + - Suggest or implement improvements for our :doc:`infrastructure ` + - Help :ref:`improve the documentation ` + - For a detailed overview please refer to :doc:`/user/contributing` -- To see our governance policies, see `here `_. +- To see our governance policies, see :doc:`/orga/governance`. - If you find bugs, need help, or want to talk to the developers, use our mailing lists or chat rooms: diff --git a/sphinx/src/maintainer/adding_pkgs.rst b/sphinx/src/maintainer/adding_pkgs.rst index 107e01efab..e0b15434ac 100644 --- a/sphinx/src/maintainer/adding_pkgs.rst +++ b/sphinx/src/maintainer/adding_pkgs.rst @@ -254,6 +254,7 @@ A full reference of the structure and fields of ``meta.yaml`` file can be found In the following, we highlight particularly important and conda-forge specific information and guidelines, ordered by section in ``meta.yaml``. +.. _meta_yaml_source: Source ------ @@ -267,11 +268,11 @@ Packages should be built from tarballs using the ``url`` key, not from repositor There are several reasons behind this rule: - - Repositories are usually larger than tarballs, draining shared CI time and bandwidth - - Repositories are not checksummed. Thus, using a tarball has a - stronger guarantee that the download that is obtained to build from is - in fact the intended package. - - On some systems, it is possible to not have permission to remove a repo once it is created. +- Repositories are usually larger than tarballs, draining shared CI time and bandwidth +- Repositories are not checksummed. Thus, using a tarball has a + stronger guarantee that the download that is obtained to build from is + in fact the intended package. +- On some systems, it is possible to not have permission to remove a repo once it is created. Populating the ``hash`` field ............................. @@ -312,14 +313,14 @@ Use the ``skip`` key in the ``build`` section along with a selector: You can e.g. specify not to build ... - - on specific architectures: +- on specific architectures: .. code-block:: yaml build: skip: true # [win] - - for specific python versions: +- for specific python versions: .. code-block:: yaml @@ -382,35 +383,38 @@ Conda-build distinguishes three different kinds of dependencies. In the following paragraphs, we give a very short overview what packages go where. For a detailed explanation please refer to the `conda-build documentation `__. -**Build** +Build +^^^^^ - Build dependencies are required in the build environment and contain all tools that are not needed on the host of the package. +Build dependencies are required in the build environment and contain all tools that are not needed on the host of the package. - Following packages are examples of typical ``build`` dependencies: +Following packages are examples of typical ``build`` dependencies: - - compilers (see :ref:`dep_compilers`) - - cmake - - make - - pkg-config - - CDT packages (see :ref:`cdt_packages`) +- compilers (see :ref:`dep_compilers`) +- cmake +- make +- pkg-config +- CDT packages (see :ref:`cdt_packages`) -**Host** +Host +^^^^ - Host dependencies are required during build phase, but in contrast to build packages they have to be present on the host. +Host dependencies are required during build phase, but in contrast to build packages they have to be present on the host. - Following packages are typical examples for ``host`` dependencies: +Following packages are typical examples for ``host`` dependencies: - - shared libraries (c/c++) - - python/r libraries that link against c libraries (see e.g. :ref:`linking_numpy`) - - python, r-base - - setuptools, pip (see :ref:`use-pip`) +- shared libraries (c/c++) +- python/r libraries that link against c libraries (see e.g. :ref:`linking_numpy`) +- python, r-base +- setuptools, pip (see :ref:`use-pip`) -**Run** +Run +^^^ - Run dependencies are only required during run time of the package. Run dependencies typically include +Run dependencies are only required during run time of the package. Run dependencies typically include - - most python/r libraries +- most python/r libraries .. _no_external_deps: @@ -524,9 +528,9 @@ Simple existence tests Sometimes defining tests seems to be hard, e.g. due to: - - tests for the underlying code base may not exist. - - test suites may take too long to run on limited :term:`CI` infrastructure. - - tests may take too much bandwidth. +- tests for the underlying code base may not exist. +- test suites may take too long to run on limited :term:`CI` infrastructure. +- tests may take too much bandwidth. In these cases, conda-forge may not be able to execute the prescribed test suite. @@ -681,7 +685,9 @@ pytest tests ^^^^^^^^^^^^ If the tests are installed with the package, pytest can find and run them -for you with the following command:: +for you with the following command: + +.. code-block:: yaml test: requires: @@ -694,7 +700,9 @@ Command Line Utilities ...................... If a python package installs command line utilities, you probably want to test that -they were properly installed:: +they were properly installed: + +.. code-block:: yaml test: commands: @@ -802,38 +810,39 @@ This presents a problem when packaging the license files as each dependency need For some languages, the community provides tools which can automate this process, enabling the automatic inclusion of all needed license files. -* **Rust** +Rust +^^^^ - `cargo-bundle-licenses `__ can be included in the build process of a package and will automatically collect and add the license files of all dependencies of a package. +`cargo-bundle-licenses `__ can be included in the build process of a package and will automatically collect and add the license files of all dependencies of a package. - For a detailed description, please visit the project page but a short example can be found below. +For a detailed description, please visit the project page but a short example can be found below. - First, include the collection of licenses as a step of the build process. +First, include the collection of licenses as a step of the build process. - .. code-block:: yaml +.. code-block:: yaml - build: - number: 0 - script: - - cargo-bundle-licenses --format yaml --output THIRDPARTY.yml - - build_command_goes_here + build: + number: 0 + script: + - cargo-bundle-licenses --format yaml --output THIRDPARTY.yml + - build_command_goes_here - Then, include the tool as a build time dependency. +Then, include the tool as a build time dependency. - .. code-block:: yaml +.. code-block:: yaml - requirements: - build: - - cargo-bundle-licenses + requirements: + build: + - cargo-bundle-licenses - Finally, make sure that the generated file is included in the recipe. +Finally, make sure that the generated file is included in the recipe. - .. code-block:: yaml +.. code-block:: yaml - about: - license_file: - - THIRDPARTY.yml - - package_license.txt + about: + license_file: + - THIRDPARTY.yml + - package_license.txt .. important:: @@ -843,7 +852,7 @@ For some languages, the community provides tools which can automate this process .. note:: - The correct and automated packaging of dependency licenses is an ongoing discussion. Please feel free to add your thoughs to `this `__ discussion. + The correct and automated packaging of dependency licenses is an `ongoing discussion `__. Please feel free to add your thoughts. Extra ----- diff --git a/sphinx/src/maintainer/infrastructure.rst b/sphinx/src/maintainer/infrastructure.rst index 13665a669a..508b7853de 100644 --- a/sphinx/src/maintainer/infrastructure.rst +++ b/sphinx/src/maintainer/infrastructure.rst @@ -19,9 +19,9 @@ Smithy contains maintenance code for conda-forge, which is used by the ``conda-s ``conda-forge/conda-smithy`` is the right repository to report bugs for - - The rerendering process - - The recipe linter - - :term:`CI` support utils +- The rerendering process +- The recipe linter +- :term:`CI` support utils ``conda-smithy`` also contains the command line tool that you should use if you rerender manually from the command line (see :ref:`dev_update_rerender`). @@ -50,9 +50,9 @@ Please open a :term:`PR` and/or an issue there, if you think a pin needs to be a Documentation ------------- -The documentation lives in `conda-forge/conda-forge.github.io `__, and is automatically deployed to our `online version `__. +The documentation website lives in `conda-forge/conda-forge.github.io `__, and is automatically deployed to our `online version `__. -The documentation is built with ``Sphinx`` and the sources files are located in the `src `__ directory of the repository. +The documentation is built with ``Sphinx`` and the sources files are located in the `src `__ directory of the repository. These are then rendered to Markdown and placed in the Docusaurus tree. Docusaurus then renders the documentation to HTML. If you found any typo error, unclear explanations or new topics that can be covered, you can suggest changes to the documentation. For more details, please refer to :ref:`improve_docs`. @@ -105,6 +105,8 @@ Entering the above phrase in an issue will update the team for the feedstock. Th Entering this command in the PR of a feedstock or staged-recipes will close and then open the PR, causing all of the CI builds to restart. +.. _cfa_please_ping_team: + @conda-forge-admin, please ping team ------------------------------------ @@ -112,6 +114,8 @@ Entering this command in the PR of a feedstock or staged-recipes will have the a associated with the repo. This command can be useful for people who are not yet members of conda-forge and so cannot @-mention the ``staged-recipes`` team for PR reviews. +.. _cfa_please_ping_cf_team: + @conda-forge-admin, please ping conda-forge/ -------------------------------------------------- @@ -141,6 +145,8 @@ Please open issue on ``regro/cf-scripts`` for any feedback, bugs, and/or questio Entering this command in the title or comment of an issue will instruct the admin bot to open a PR to disable automerge, undoing the ``please add bot automerge`` command. +.. _cfa_please_add_user: + @conda-forge-admin, please add user @username --------------------------------------------- @@ -289,9 +295,10 @@ principles. * We generally provide notice in the form of an announcement when a compiler is going to be upgraded. Note that these changes take a bit of time to complete, so you will generally have time to prepare should you need to. -* Some of the criteria we think about when considering a compiler migration include - 1) the degree of disruption to the ecosystem, 2) the amount of work for the ``core`` team, - and 3) the amount of time it will cost our (volunteer) feedstock maintainers. +* Some of the criteria we think about when considering a compiler migration include: + - the degree of disruption to the ecosystem, + - the amount of work for the ``core`` team, + - the amount of time it will cost our (volunteer) feedstock maintainers. We do use some unofficial names for our compiler stack internally. Note however that the existence of these names does not imply any level of support or stability for the compilers diff --git a/sphinx/src/maintainer/knowledge_base.rst b/sphinx/src/maintainer/knowledge_base.rst index a4c3c5a993..c475dd6c9a 100644 --- a/sphinx/src/maintainer/knowledge_base.rst +++ b/sphinx/src/maintainer/knowledge_base.rst @@ -39,14 +39,14 @@ Older CMake projects may require similar, but slightly different options. Some optional, but useful CMake options: - - ``-DCMAKE_BUILD_TYPE=Release`` Configure as release build. This is better done on the initial - ``cmake`` call as some packages construct different build configurations depending on this flag. - - ``-DCMAKE_INSTALL_PREFIX=$PREFIX`` Specify the install location. - - ``-DCMAKE_INSTALL_LIBDIR=lib`` Libraries will land in $PREFIX/lib, sometimes projects install - into lib64 or similar but on conda-forge we keep shared libraries in simply lib. - - ``-DBUILD_SHARED_LIBS=ON`` Instruct CMake to build shared libraries instead of static ones. - - ``-DCMAKE_FIND_FRAMEWORK=NEVER`` and ``-DCMAKE_FIND_APPBUNDLE=NEVER`` Prevent CMake from using system-wide macOS packages. - - ``${CMAKE_ARGS}`` Add variables defined by conda-forge internally. This is required to enable various conda-forge enhancements, like `CUDA builds `__. +- ``-DCMAKE_BUILD_TYPE=Release`` Configure as release build. This is better done on the initial + ``cmake`` call as some packages construct different build configurations depending on this flag. +- ``-DCMAKE_INSTALL_PREFIX=$PREFIX`` Specify the install location. +- ``-DCMAKE_INSTALL_LIBDIR=lib`` Libraries will land in $PREFIX/lib, sometimes projects install + into lib64 or similar but on conda-forge we keep shared libraries in simply lib. +- ``-DBUILD_SHARED_LIBS=ON`` Instruct CMake to build shared libraries instead of static ones. +- ``-DCMAKE_FIND_FRAMEWORK=NEVER`` and ``-DCMAKE_FIND_APPBUNDLE=NEVER`` Prevent CMake from using system-wide macOS packages. +- ``${CMAKE_ARGS}`` Add variables defined by conda-forge internally. This is required to enable various conda-forge enhancements, like :ref:`CUDA builds `. Here are some basic commands for you to get started. These are dependent on your source code layout and aren't intended to be used "as is". @@ -279,11 +279,11 @@ Compilers are dependencies with a special syntax and are always added to ``requi There are currently five supported compilers: - - C - - cxx - - Fortran - - Go - - Rust +- C +- cxx +- Fortran +- Go +- Rust A package that needs all five compilers would define @@ -683,7 +683,7 @@ only get the mpi build if explicitly requested. We use a higher build number for Here is an example build section: -:: +.. code-block:: yaml {% if mpi == 'nompi' %} # prioritize nompi variant via build number @@ -737,7 +737,7 @@ For example, if building against the nompi variant will work with any installed given mpi provider requires running with that mpi: -:: +.. code-block:: yaml build: ... @@ -770,7 +770,7 @@ This matches what is done in `hdf5 ` to update the configuration. @@ -1119,8 +1119,8 @@ For example, the package `pyquil `__ only Currently available packages: - - exceptiongroup - - importlib-metadata +- exceptiongroup +- importlib-metadata Noarch builds @@ -1141,19 +1141,19 @@ packages that only need to be built once. In order to qualify as a noarch python package, all of the following criteria must be fulfilled: - - No compiled extensions - - No post-link or pre-link or pre-unlink scripts - - No OS-specific build scripts - - No python version specific requirements - - No skips except for python version. If the recipe is py3 only, remove skip - statement and add version constraint on python in ``host`` and ``run`` - section. - - ``2to3`` is not used - - ``scripts`` argument in ``setup.py`` is not used - - If ``console_scripts`` ``entry_points`` are defined in ``setup.py`` or ``setup.cfg``, they are also - `listed `__ - in the ``build`` section of ``meta.yaml`` - - No activate scripts +- No compiled extensions +- No post-link or pre-link or pre-unlink scripts +- No OS-specific build scripts +- No python version specific requirements +- No skips except for python version. If the recipe is py3 only, remove skip + statement and add version constraint on python in ``host`` and ``run`` + section. +- ``2to3`` is not used +- ``scripts`` argument in ``setup.py`` is not used +- If ``console_scripts`` ``entry_points`` are defined in ``setup.py`` or ``setup.cfg``, they are also + `listed `__ + in the ``build`` section of ``meta.yaml`` +- No activate scripts .. note:: @@ -1551,7 +1551,9 @@ In practice, to enable CUDA on your package, add ``{{ compiler('cuda') }}`` to t section of your requirements and rerender. The matching ``cudatoolkit`` will be added to the ``run`` requirements automatically. -On Linux, CMake users are required to use ``${CMAKE_ARGS}`` so CMake can find CUDA correctly. For example:: +On Linux, CMake users are required to use ``${CMAKE_ARGS}`` so CMake can find CUDA correctly. For example: + +.. code-block:: shell mkdir build && cd build cmake ${CMAKE_ARGS} ${SRC_DIR} @@ -1617,7 +1619,9 @@ As a result, you might get linking errors in the postprocessing steps of ``conda .. is this binary repackaging? -For now, you will have to add ``nvcuda.dll`` to the ``missing_dso_whitelist``:: +For now, you will have to add ``nvcuda.dll`` to the ``missing_dso_whitelist`` + +.. code-block:: yaml build: ... @@ -1885,7 +1889,7 @@ There are several kinds of migrations, which you can read about in `Making Migra To propose a migration in one or more pins, the migrator issues a PR into the pinning feedstock using a yaml file expressing the changes to the global pinning file in the migrations folder. Once the PR is merged, the dependency graph is built. After that, the bot walks through the graph, migrates all the nodes (feedstocks) one by one, and issues PRs for those feedstocks. -Usually, the bot generates these migrations automatically. However, when a pin is first made or added, one may need to be added by hand. To do this, you can follow the steps mentioned in `Updating package pins `__. +Usually, the bot generates these migrations automatically. However, when a pin is first made or added, one may need to be added by hand. To do this, you can follow the steps mentioned in :ref:`Updating package pins `. The way migrations proceed are: @@ -1929,13 +1933,13 @@ Security considerations for conda-forge builds All conda-forge packages are built by strangers on the internet on public cloud infrastructure from source code you likely have not inspected, so you should not use conda-forge packages if you or your team require a high level of security. You are also free to download recipes and rebuild them yourself, if you would like at least that much oversight. However, many people use conda-forge all the time with no issues and here are some things that conda-forge does to help with security in some ways: -1. `Sources `_ (where you specify where the package's source code is coming from) can be pulled from GitHub, PyPI, or other sources and sha256 hashes are always used, so moving of tags or uploading of new sdists can not cause automatic package rebuilds. +1. :ref:`Sources ` (where you specify where the package's source code is coming from) can be pulled from GitHub, PyPI, or other sources and sha256 hashes are always used, so moving of tags or uploading of new sdists can not cause automatic package rebuilds. Also, once packages are accepted and made into feedstocks, only the maintainers of that feedstock have the right to merge PRs made to that feedstock. 2. Each feedstock can only upload packages for that feedstock. This is enforced by using a cf-staging channel where builds are first sent. A bot then assesses that the submitting feedstock has permission to build the package it has submitted, and only then will it relay the build to the ``conda-forge`` channel. This helps mitigate against a bad actor gaining access to an inconspicuous feedstock and then trying to push a build with malicious code into essential infrastructure packages (e.g., OpenSSL or Python). 3. We have `artifact-validation `__ for validating all the conda-forge artifacts uploaded to ``anaconda.org``. This validation scans for various security-related items, such as artifacts that overwrite key pieces of certain packages. -4. We have a dedicated `Security and Systems Sub-Team `__ who works hard towards making sure to secure and maintain appropriate access to the credentials and services/systems used by conda-forge. +4. We have a dedicated :ref:`Security and Systems Sub-Team ` who works hard towards making sure to secure and maintain appropriate access to the credentials and services/systems used by conda-forge. If you have found a security-related issue with conda-forge, please check our `Security Policy `__ to learn how to report it responsibly. diff --git a/sphinx/src/maintainer/maintainer_faq.rst b/sphinx/src/maintainer/maintainer_faq.rst index 90a4f332a3..b12a192772 100644 --- a/sphinx/src/maintainer/maintainer_faq.rst +++ b/sphinx/src/maintainer/maintainer_faq.rst @@ -3,176 +3,190 @@ FAQ .. _mfaq_py37_selector: -:ref:`(Q) ` **Why does conda-build ignore the** ``py37`` **selector in meta.yaml?** +Why does conda-build ignore the ``py37`` selector in meta.yaml? +--------------------------------------------------------------- - TL;DR: replace ``py37`` with ``py==37``. +TL;DR: replace ``py37`` with ``py==37``. - conda-build has changed the selector syntax. - You are now encouraged to use ``py==``, instead of ``py``. - While the legacy selectors ``py27`` and ``py36`` are still valid, selectors ``py37`` and higher are no longer valid. +conda-build has changed the selector syntax. +You are now encouraged to use ``py==``, instead of ``py``. +While the legacy selectors ``py27`` and ``py36`` are still valid, selectors ``py37`` and higher are no longer valid. - Please use the new syntax ``py==27``, ``py==36`` and ``py==37`` to avoid confusion. +Please use the new syntax ``py==27``, ``py==36`` and ``py==37`` to avoid confusion. - .. admonition:: Related links +.. admonition:: Related links - - **Selectors in conda-build documentation** (`Preprocessing selectors `__) - - **Linter: deprecate the use of py27, py36** (`conda-smithy/#1026 `__) + - **Selectors in conda-build documentation** (`Preprocessing selectors `__) + - **Linter: deprecate the use of py27, py36** (`conda-smithy/#1026 `__) .. _mfaq_build_number_1000: -:ref:`(Q) ` **What do build numbers above 1000 signify? How do I treat them?** +What do build numbers above 1000 signify? How do I treat them? +-------------------------------------------------------------- - TL;DR: there is no need for build numbers larger than 1000 anymore. +TL;DR: there is no need for build numbers larger than 1000 anymore. - When you update a feedstock that still uses build numbers > 1000, the following rules apply: +When you update a feedstock that still uses build numbers > 1000, the following rules apply: - - When you increase the version, reset the build number back to 0 (e.g. ``1005 -> 0``). - - When the version stays the same and you need to upload a new package, increase the build number by 1 (e.g. ``1005 -> 1006``). +- When you increase the version, reset the build number back to 0 (e.g. ``1005 -> 0``). +- When the version stays the same and you need to upload a new package, increase the build number by 1 (e.g. ``1005 -> 1006``). - **Backstory:** Build numbers of 1000 and larger are a relic from the compiler migration, where a build number offset of 1000 signified that a package was migrated to the new compilers. - Since the completion of the compiler migration, this offsetting is not needed anymore. - However, we cannot simply subtract the offset without updating the version, due to higher build numbers being preferred by the solver. - Therefore build numbers above 1000 will gradually vanish as packages get updated to newer versions. +**Backstory:** Build numbers of 1000 and larger are a relic from the compiler migration, where a build number offset of 1000 signified that a package was migrated to the new compilers. +Since the completion of the compiler migration, this offsetting is not needed anymore. +However, we cannot simply subtract the offset without updating the version, due to higher build numbers being preferred by the solver. +Therefore build numbers above 1000 will gradually vanish as packages get updated to newer versions. .. _mfaq_windows_cmake: -:ref:`(Q) ` **How to fix CMake not finding MSBuild.exe on Azure Windows builds?** +How to fix CMake not finding MSBuild.exe on Azure Windows builds? +----------------------------------------------------------------- - TL;DR: Use ``Ninja`` or ``NMake Makefiles JOM`` as the CMake generator (``cmake -G"Ninja"``), and add ``build`` requirements for ``ninja`` or ``jom``. +TL;DR: Use ``Ninja`` or ``NMake Makefiles JOM`` as the CMake generator (``cmake -G"Ninja"``), and add ``build`` requirements for ``ninja`` or ``jom``. - Sadly in the Azure Windows images, `MSBuild.exe` is not correctly setup for CMake builds with the ``Visual Studio`` generators. To work around this, you can use a different CMake generator, e.g. ``cmake -GNinja`` or ``cmake -G"NMake Makefiles JOM"``. These two are preferred because they allow for concurrent builds in contrast to e.g. only using ``cmake -G"NMake Makefiles"`` +Sadly in the Azure Windows images, `MSBuild.exe` is not correctly setup for CMake builds with the ``Visual Studio`` generators. To work around this, you can use a different CMake generator, e.g. ``cmake -GNinja`` or ``cmake -G"NMake Makefiles JOM"``. These two are preferred because they allow for concurrent builds in contrast to e.g. only using ``cmake -G"NMake Makefiles"`` .. _mfaq_anaconda_delay: -:ref:`(Q) ` **Why does my new version appear on Anaconda Cloud, but is not installable with conda?** +Why does my new version appear on Anaconda Cloud, but is not installable with conda? +------------------------------------------------------------------------------------ - For certain, high-traffic channels (main & conda-forge), Anaconda uses a `CDN `__ to decrease costs. Therefore, packages will show up on the `Anaconda Cloud `__ about 10 minutes before they are downloadable via conda. You can use ``conda search `` to see if the package is installable, because this command reads from the CDN. +For certain, high-traffic channels (main & conda-forge), Anaconda uses a `CDN `__ to decrease costs. Therefore, packages will show up on the `Anaconda Cloud `__ about 10 minutes before they are downloadable via conda. You can use ``conda search `` to see if the package is installable, because this command reads from the CDN. - If the CDN sync is not happening timely, please check the `status page `_ for the CDN cloning status and see if any problem occurs. If the clone is not sync'ing, you can open a CDN Issue in the `Anaconda Issues repo `_. +If the CDN sync is not happening timely, please check the `status page `_ for the CDN cloning status and see if any problem occurs. If the clone is not sync'ing, you can open a CDN Issue in the `Anaconda Issues repo `_. .. _mfaq_mamba_local: -:ref:`(Q) ` **How can I make local debugging faster?** +How can I make local debugging faster? +-------------------------------------- - If you prefer to debug your recipes locally and not use the provided `scripts `__ but instead your own setup, you may also use the mamba solver through ``mambabuild``. It not only has a faster solve speed but also prints better error messages that make debugging simpler. +If you prefer to debug your recipes locally and not use the provided :ref:`scripts ` but instead your own setup, you may also use the mamba solver through ``mambabuild``. It not only has a faster solve speed but also prints better error messages that make debugging simpler. - To do this, first install the solver and then build the recipe like you normally would +To do this, first install the solver and then build the recipe like you normally would - - ``conda install boa -c conda-forge`` - - ``conda mambabuild myrecipe`` +- ``conda install boa -c conda-forge`` +- ``conda mambabuild myrecipe`` - For more details visit `this `__ page. +For more details visit `this `__ page. .. _mfaq_conda_verify: -:ref:`(Q) ` **I am seeing** ``Importing conda-verify failed.`` **error message during build. What do I do?** +I am seeing ``Importing conda-verify failed.`` error message during build. What do I do? +---------------------------------------------------------------------------------------- - .. code-block:: shell +.. code-block:: shell - Importing conda-verify failed. Please be sure to test your packages. conda install conda-verify to make this message go away. + Importing conda-verify failed. Please be sure to test your packages. conda install conda-verify to make this message go away. - You are seeing this error message because by default, conda-build uses conda-verify to ensure that your recipe and package meet some minimum sanity checks. - This message can be safely ignored as conda-forge doesn't use conda-verify. +You are seeing this error message because by default, conda-build uses conda-verify to ensure that your recipe and package meet some minimum sanity checks. +This message can be safely ignored as conda-forge doesn't use conda-verify. .. _mfaq_version_update: -:ref:`(Q) ` **When the bot creates a pull request to a feedstock to update the version, should I approve the pull request and wait with merging until everybody else that is a code owner has approved the PR?** +When the bot creates a pull request to a feedstock to update the version, should I approve the pull request and wait with merging until everybody else that is a code owner has approved the PR? +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - There is no need to approve the PR. Every maintainer can verify and merge the bot PR without waiting on the approval of the other maintainers. +There is no need to approve the PR. Every maintainer can verify and merge the bot PR without waiting on the approval of the other maintainers. .. _mfaq_docker_139: -:ref:`(Q) ` **How to fix "build-locally.py fails with exit code 139"?** +How to fix "build-locally.py fails with exit code 139"? +------------------------------------------------------- - With Linux Kernel 4.11 there were some changes in the ``vsyscall`` linking. Depending on your distribution this may cause the above error. You can fix that on Debian by editing ``/etc/default/grub`` and specifiy ``GRUB_CMDLINE_LINUX_DEFAULT="vsyscall=emulate"`` in this file. Afterwards, you need to run ``update-grub`` and reboot your system. On other Linux distributions the fix is similar but you need to edit a different configuration file to change the Linux kernel cmdline. This workaround is only needed for images based on CentOS 6 (``cos6``). You could also workaround this by forcing the CentOS 7 based images using ``DOCKER_IMAGE=quay.io/condaforge/linux-anvil-cos7-x86_64 ./build-locally.py``. +With Linux Kernel 4.11 there were some changes in the ``vsyscall`` linking. Depending on your distribution this may cause the above error. You can fix that on Debian by editing ``/etc/default/grub`` and specifiy ``GRUB_CMDLINE_LINUX_DEFAULT="vsyscall=emulate"`` in this file. Afterwards, you need to run ``update-grub`` and reboot your system. On other Linux distributions the fix is similar but you need to edit a different configuration file to change the Linux kernel cmdline. This workaround is only needed for images based on CentOS 6 (``cos6``). You could also workaround this by forcing the CentOS 7 based images using ``DOCKER_IMAGE=quay.io/condaforge/linux-anvil-cos7-x86_64 ./build-locally.py``. - The exit code 139 itself actually is the general exit code for a segmentation fault. This could also mean that you have run into a different issue but the above issue is the most likely one with our CentOS 6-based images. +The exit code 139 itself actually is the general exit code for a segmentation fault. This could also mean that you have run into a different issue but the above issue is the most likely one with our CentOS 6-based images. .. _mfaq_package_submit: -:ref:`(Q) ` **Is it necessary for me to be an upstream maintainer of the package I submit to conda-forge?** +Is it necessary for me to be an upstream maintainer of the package I submit to conda-forge? +------------------------------------------------------------------------------------------- - Everybody can submit a package to conda-forge, irrespective of whether they maintain the upstream version or not. Additionally, it’s not required but considered good practice to inform the upstream of a new package and invite them to be maintainers as well. +Everybody can submit a package to conda-forge, irrespective of whether they maintain the upstream version or not. Additionally, it’s not required but considered good practice to inform the upstream of a new package and invite them to be maintainers as well. .. _mfaq_libGL_so_1: -:ref:`(Q) ` **How do I fix the** ``libGL.so.1`` **import error?** +How do I fix the ``libGL.so.1`` import error? +--------------------------------------------- - Error: +Error: - .. code-block:: shell +.. code-block:: shell - ImportError: libGL.so.1: cannot open shared object file: No such file or directory + ImportError: libGL.so.1: cannot open shared object file: No such file or directory - To fix the error, create a `yum_requirements.txt `__ file and add *mesa-libGL*. +To fix the error, create a :ref:`yum_requirements.txt ` file and add *mesa-libGL*. .. _mfaq_qt_load_xcb: -:ref:`(Q) ` **How can I fix the** ``The Qt platform plugin "xcb" could not be loaded`` **error during testing?** +How can I fix the ``The Qt platform plugin "xcb" could not be loaded`` error during testing? +-------------------------------------------------------------------------------------------- - When testing packages that have a dependency on ``pyqt``, the following error might occur under linux: +When testing packages that have a dependency on ``pyqt``, the following error might occur under linux: - .. code-block:: shell +.. code-block:: shell - qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found. - This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. + qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found. + This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. - Available platform plugins are: eglfs, minimal, minimalegl, offscreen, vnc, webgl, xcb. + Available platform plugins are: eglfs, minimal, minimalegl, offscreen, vnc, webgl, xcb. - This comes from the CI environment being headless and can be fixed by adding the ``QT_QPA_PLATFORM=offscreen`` `environment variable `__. - The variable can either be added directly to the test command or provided in the `meta.yaml `__ like so: +This comes from the CI environment being headless and can be fixed by adding the ``QT_QPA_PLATFORM=offscreen`` `environment variable `__. +The variable can either be added directly to the test command or provided in the :ref:`meta.yaml ` like so: - .. code-block:: yaml +.. code-block:: yaml - build: - script_env: - - QT_QPA_PLATFORM=offscreen + build: + script_env: + - QT_QPA_PLATFORM=offscreen .. _mfaq_contact_core: -:ref:`(Q) ` **How can I contact conda-forge/core?** +How can I contact conda-forge/core? +----------------------------------- - When in an issue or PR, you can contact `conda-forge/core `__ by simply mentioning ``@conda-forge/core`` in a comment. - If you don't receive an an answer after a couple of days, feel free to reach out to us via the public `Element `__ chatroom. +When in an issue or PR, you can contact :ref:`conda-forge/core ` by simply mentioning ``@conda-forge/core`` in a comment. +If you don't receive an an answer after a couple of days, feel free to reach out to us via the public `Element `__ chatroom. - .. note:: +.. note:: - Due to a GitHub limitation, this is disabled for new members. - In that case, you can ping core using the bot command `@conda-forge-admin, please ping conda-forge/core `_. + Due to a GitHub limitation, this is disabled for new members. + In that case, you can ping core using the bot command :ref:`@conda-forge-admin, please ping conda-forge/core `. - In case your issue is longer or you would like to contact us privately, feel free to reach out to us via the options listed `here `_. +In case your issue is longer or you would like to contact us privately, feel free to reach out to us via the options listed at :doc:`/orga/getting-in-touch`. .. _mfaq_abandoned_feedstock: -:ref:`(Q) ` **A feedstock has been abandoned and I would like to take over maintenance.** +A feedstock has been abandoned and I would like to take over maintenance. +------------------------------------------------------------------------- - A feedstock is generally considered abandoned when the maintainer isn't around anymore and doesn't merge new PRs or answer any issues. If that is the case, you can add yourself to the team by using the `@conda-forge-admin, please add user @username `__ command. If the maintainer doesn't merge it after roughly a week, :ref:`contact conda-forge/core` to have it merged. Once added, you have full rights to the feedstock and can continue its maintenance. +A feedstock is generally considered abandoned when the maintainer isn't around anymore and doesn't merge new PRs or answer any issues. If that is the case, you can add yourself to the team by using the :ref:`@conda-forge-admin, please add user @username ` command. If the maintainer doesn't merge it after roughly a week, :ref:`contact conda-forge/core ` to have it merged. Once added, you have full rights to the feedstock and can continue its maintenance. - .. note:: +.. note:: - Even if the maintainer isn't active anymore, we generally like to keep them in the list of maintainers and not remove them, in case they want to take up maintenance at a later date. + Even if the maintainer isn't active anymore, we generally like to keep them in the list of maintainers and not remove them, in case they want to take up maintenance at a later date. .. _mfaq_changes_to_major_projects: -:ref:`(Q) ` **Does conda-forge ever make significant changes or apply code patches to significant upstream packages?** +Does conda-forge ever make significant changes or apply code patches to significant upstream packages? +------------------------------------------------------------------------------------------------------ - We generally try to avoid changes, but there are many notable exceptions and we have no set policy. These changes currently fall into - a few categories. Upstream projects that violate our community norms or pose significant security risks through their policies may - be changed so that they can be distributed on conda-forge. In many cases though, these projects are not distributed at all. We - do employ extensive changes to project build scripts in order to properly build and install projects into conda environments. - Finally, in some cases we add, enable, or disable features in specific projects to ensure they are broadly compatible with the - conda-forge package set. The set of patches/changes we apply is always located in the feedstock that built the package. We - also maintain a list of important packages with changes in our documentation. +We generally try to avoid changes, but there are many notable exceptions and we have no set policy. These changes currently fall into +a few categories. Upstream projects that violate our community norms or pose significant security risks through their policies may +be changed so that they can be distributed on conda-forge. In many cases though, these projects are not distributed at all. We +do employ extensive changes to project build scripts in order to properly build and install projects into conda environments. +Finally, in some cases we add, enable, or disable features in specific projects to ensure they are broadly compatible with the +conda-forge package set. The set of patches/changes we apply is always located in the feedstock that built the package. We +also maintain a list of important packages with changes in our documentation. diff --git a/sphinx/src/maintainer/pinning_deps.rst b/sphinx/src/maintainer/pinning_deps.rst index 035002915f..be2ce0daa1 100644 --- a/sphinx/src/maintainer/pinning_deps.rst +++ b/sphinx/src/maintainer/pinning_deps.rst @@ -66,6 +66,7 @@ If a package is not pinned in `conda-forge-pinning `_. +.. _run_exports: Specifying run_exports ====================== diff --git a/sphinx/src/maintainer/updating_pkgs.rst b/sphinx/src/maintainer/updating_pkgs.rst index 70e2613d45..8ee83bdda1 100644 --- a/sphinx/src/maintainer/updating_pkgs.rst +++ b/sphinx/src/maintainer/updating_pkgs.rst @@ -176,6 +176,8 @@ Updating for newly released Python version When a new Python version is released (e.g. ``3.11``), an automatic migration process is triggered that will have ``@regro-cf-autotick-bot`` eventually automatically open pull requests to all feedstocks, updating their CI setup to include the new Python version in the build matrix. After veryfing that the PR build passes, that automatic PR can simply be merged to roll out packages for new Python version. This process takes time, though, and pull requests will not be opened to all feedstocks at the same time to not overload CI. The current status of the migration can be tracked on the `migration status page `_ and there maintainers can verify that their feedstock is listed under the ``AWAITING-PR`` dropdown list. +.. _testing_changes_locally: + Testing changes locally ======================= @@ -223,7 +225,7 @@ If the new built package depends on another one to be working, i.e. ``other-pack Downloading prebuilt packages from CI ===================================== -A neat feature that feedstocks have is the ability to `upload packages to the CI provider for testing `_. +A neat feature that feedstocks have is the ability to :ref:`upload packages to the CI provider for testing `. This is useful when trying out packages built in a PR. But you first need to download these prebuilt packages. To download prebuilt packages follow the steps below: diff --git a/sphinx/src/misc/00_intro.rst b/sphinx/src/misc/00_intro.rst index a9f5931dbd..8d2c643c8d 100644 --- a/sphinx/src/misc/00_intro.rst +++ b/sphinx/src/misc/00_intro.rst @@ -1,6 +1,8 @@ Miscellaneous ############# +.. _misc_glossary: + Glossary ******** @@ -22,7 +24,7 @@ Glossary **P**\ ull **R**\ equest. Pull Request is a workflow method to submit contributions to an open development project in which the developer asks for changes committed to an external repository to be considered for inclusion in a project's main repository. `Learn More `__. CDT - **C**\ ore **D**\ ependency **T**\ ree. Core Dependency Tree packages take care of the dependencies which are so close to the system that they are not packaged with conda-forge. A CDT package consists of repackaged CentOS binaries from the appropriate version, either 6 or 7 depending on user choice and platform. :ref:`Learn more`. + **C**\ ore **D**\ ependency **T**\ ree. Core Dependency Tree packages take care of the dependencies which are so close to the system that they are not packaged with conda-forge. A CDT package consists of repackaged CentOS binaries from the appropriate version, either 6 or 7 depending on user choice and platform. :ref:`Learn more `. ABI **A**\ pplication **B**\ inary **I**\ nterface. ABI is a document that comprehensively defines the binary system interface between applications and the operating system on which they run. `Learn More `__. @@ -35,8 +37,3 @@ Glossary CFEP **C**\ onda **F**\ orge **E**\ nhancement **P**\ roposal. A CFEP is a document which outlines a suggested change to how the conda-forge project operates, from a technical standpoint as well as to address social topics such as governance and expected conduct. `Learn More `__. - -TODO list -********* - -.. todolist:: diff --git a/sphinx/src/orga/cfep-index.rst b/sphinx/src/orga/cfep-index.rst index 27882f1b3d..18de5cf52d 100644 --- a/sphinx/src/orga/cfep-index.rst +++ b/sphinx/src/orga/cfep-index.rst @@ -7,3 +7,5 @@ These CFEPs are similar to `Python's PEP `_ an CFEPs are stored in the `cfep GitHub repository `_. A list of conda-forge enhancement proposals (CFEP) are as follows: + +{{ cfep_list }} diff --git a/sphinx/src/orga/funding/00_intro.rst b/sphinx/src/orga/funding/00_intro.rst index 06e6d88129..54cd783f89 100644 --- a/sphinx/src/orga/funding/00_intro.rst +++ b/sphinx/src/orga/funding/00_intro.rst @@ -17,33 +17,35 @@ For the sake of transparency, we have made available letters of intent, applicat Submitted but not yet decided ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* 2023 - `CZI EOSS`_ Funding Cycle 6: Next-gen conda-build recipe format and tooling, submitted by Prefix & Quansight - * :download:`Letter of intent `. +- 2023 - `CZI EOSS`_ Funding Cycle 6: Next-gen conda-build recipe format and tooling, submitted by Prefix & Quansight + - :download:`Letter of intent `. Successfully funded ~~~~~~~~~~~~~~~~~~~ -* 2023 - NumFOCUS SDG Round 1: :doc:`Access control improvements for opt-in CI (Continuous Integration) services ` -* 2023 - Google Summer of Code: :doc:`Modernization of the conda-forge.org website ` -* 2022 - `CZI EOSS`_ Funding Cycle 5: Transparent, open & sustainable infrastructure for conda-forge and bioconda, submitted by QuantStack & Quansight - * :download:`Letter of intent `. - * :download:`Full submission `. - * `Proposal summary `__. -* 2022 - `NumFOCUS SDG`_ Round 2: Adding pyproject.toml support to grayskull -* 2021 - `CZI EOSS`_ Funding Cycle 4: Fast Software Package Management for Bio and Data Science, submitted by QuantStack - * `Proposal summary `__. - * `Blog post `__. -* 2021 - `NumFOCUS SDG`_ Round 1: Updating conda-forge compiler infrastructure -* 2020 - `NumFOCUS SDG`_ Round 3: Add messaging functionality to conda and conda-build -* 2019 - `NumFOCUS SDG`_ Round 3: Unified Recipe Regenerator -* 2018 - `NumFOCUS SDG`_ Round 3: conda-forge sprint at SciPy 2019 +- 2023 - NumFOCUS SDG Round 1: :doc:`Access control improvements for opt-in CI (Continuous Integration) services ` +- 2023 - Google Summer of Code: :doc:`Modernization of the conda-forge.org website ` +- 2022 - `CZI EOSS`_ Funding Cycle 5: Transparent, open & sustainable infrastructure for conda-forge and bioconda, submitted by QuantStack & Quansight + - :download:`Letter of intent `. + - :download:`Full submission `. + - `Proposal summary `__. + +- 2022 - `NumFOCUS SDG`_ Round 2: Adding pyproject.toml support to grayskull +- 2021 - `CZI EOSS`_ Funding Cycle 4: Fast Software Package Management for Bio and Data Science, submitted by QuantStack + - `Proposal summary `__. + - `Blog post `__. + +- 2021 - `NumFOCUS SDG`_ Round 1: Updating conda-forge compiler infrastructure +- 2020 - `NumFOCUS SDG`_ Round 3: Add messaging functionality to conda and conda-build +- 2019 - `NumFOCUS SDG`_ Round 3: Unified Recipe Regenerator +- 2018 - `NumFOCUS SDG`_ Round 3: conda-forge sprint at SciPy 2019 Submitted and not funded ~~~~~~~~~~~~~~~~~~~~~~~~ -* 2023 - Google Season of Docs: :doc:`Restructuring the conda-forge documentation ` -* 2022 - `CZI EOSS`_ Funding Cycle 5: Adding a WebAssembly Toolchain to conda-forge, submitted by QuantStack - * :download:`Letter of intent `. +- 2023 - Google Season of Docs: :doc:`Restructuring the conda-forge documentation ` +- 2022 - `CZI EOSS`_ Funding Cycle 5: Adding a WebAssembly Toolchain to conda-forge, submitted by QuantStack + - :download:`Letter of intent `. .. links diff --git a/sphinx/src/orga/getting-in-touch.rst b/sphinx/src/orga/getting-in-touch.rst index c02234be79..3be3d0a54c 100644 --- a/sphinx/src/orga/getting-in-touch.rst +++ b/sphinx/src/orga/getting-in-touch.rst @@ -62,5 +62,5 @@ Staying Up-to-date There are several sources that have the latest conda-forge information. -* `Blog `__: We blog about big feature enhancements and other items. Our blog has an Atom `feed `__. -* `News `__: Our news page has periodic notices about technical changes to our infrastructure. It is also served as an RSS `feed `__. +* `Blog `__: We blog about big feature enhancements and other items. Our blog has an Atom `feed `__. +* `News `__: Our news page has periodic notices about technical changes to our infrastructure. It is also served as an RSS `feed `__. diff --git a/sphinx/src/orga/governance.rst b/sphinx/src/orga/governance.rst index 959f8e2170..ee33a1d080 100644 --- a/sphinx/src/orga/governance.rst +++ b/sphinx/src/orga/governance.rst @@ -1,3 +1,5 @@ +.. _governance: + Governance ========== This document outlines the policies and procedures that manage the conda-forge @@ -14,6 +16,8 @@ Code of Conduct Please refer to the `Code of Conduct section in our README `__ for more information. +.. _teams_roles: + Teams & Roles ------------- Here are defined the primary teams participating in conda-forge activities. @@ -347,8 +351,11 @@ In alphabetical order, {{ core_members }} -Emetirus members ------------------------ +.. keep old anchor around +.. _emetirus_members: + +Emeritus members +---------------- In alphabetical order, {{ emeritus_members }} diff --git a/sphinx/src/orga/guidelines.rst b/sphinx/src/orga/guidelines.rst index 15e9f40afe..424a17f456 100644 --- a/sphinx/src/orga/guidelines.rst +++ b/sphinx/src/orga/guidelines.rst @@ -82,8 +82,9 @@ Maintainers' time and CI resources are what enable conda-forge. They are just as Publishing a package to conda-forge signals it is suitable for users not involved with development. However, publishing does not always happen error-free. Multiple commits are acceptable when debugging issues with the release process itself. Fortunately, there are options for optimizing the development of a package. - - `conda-smithy `__ is a tool used by conda-forge itself to manage feedstocks. conda-smithy can be used to create an internal development feedstock that is separate from conda-forge. - - `ci-helpers `__ is a set of scripts that drive various CI services using environment variables. + +- `conda-smithy `__ is a tool used by conda-forge itself to manage feedstocks. conda-smithy can be used to create an internal development feedstock that is separate from conda-forge. +- `ci-helpers `__ is a set of scripts that drive various CI services using environment variables. Renaming Packages ================= diff --git a/sphinx/src/orga/subteams.rst b/sphinx/src/orga/subteams.rst index 86f11562ed..89b88b2466 100644 --- a/sphinx/src/orga/subteams.rst +++ b/sphinx/src/orga/subteams.rst @@ -1,6 +1,7 @@ A list of current sub-teams *************************** +.. _security_subteam: Security and Systems Sub-Team ============================= @@ -183,16 +184,16 @@ the core team by decreasing support requests. The documentation team is responsible for: - - Keeping the documentation accurate and up-to-date. - - Help expanding the documentation by identifying new topics of common interest. - - Improving the documentation by reorganizing and clarifying its contents. - - Giving feedback on community contributions to the documentation. +- Keeping the documentation accurate and up-to-date. +- Help expanding the documentation by identifying new topics of common interest. +- Improving the documentation by reorganizing and clarifying its contents. +- Giving feedback on community contributions to the documentation. As such following task are performed by the documentation team: - - Reviewing and organizing documentation related issues and PRs in ``conda-forge.github.io``. - - Proposing improvements and new content by opening issues and pull requests. - - Engaging with the community to ensure the effectiveness of the documentation. +- Reviewing and organizing documentation related issues and PRs in ``conda-forge.github.io``. +- Proposing improvements and new content by opening issues and pull requests. +- Engaging with the community to ensure the effectiveness of the documentation. Members @@ -221,11 +222,11 @@ Especially for new maintainers it is crucial to be able to ask questions and rec The staging team is responsible for: - - Reviewing and merging pull requests in ``conda-forge/staged-recipes``. - - Answering questions and giving feedback regarding conda-forge requirements. - - Identifying common misconceptions and problems due to unclear documentation. - - Help the documentation team maintain clear documentation that simplifies contributing packages. - - Assist core in supporting feedstock maintainers when questions/issues arise during recipe maintenance. +- Reviewing and merging pull requests in ``conda-forge/staged-recipes``. +- Answering questions and giving feedback regarding conda-forge requirements. +- Identifying common misconceptions and problems due to unclear documentation. +- Help the documentation team maintain clear documentation that simplifies contributing packages. +- Assist core in supporting feedstock maintainers when questions/issues arise during recipe maintenance. Members ------- @@ -233,12 +234,12 @@ In addition to `core `_, the following are members of the staged-recipes team and have commit rights. - - Amir Mohammadi <183.amir@gmail.com> - - Igor T. Ghisi <> - - Johannes Köster <> - - Nehal J Wani - - Peter M. Landwehr <> - - Patrick Sodré +- Amir Mohammadi <183.amir@gmail.com> +- Igor T. Ghisi <> +- Johannes Köster <> +- Nehal J Wani +- Peter M. Landwehr <> +- Patrick Sodré Miniforge Sub-Team diff --git a/sphinx/src/user/00_intro.rst b/sphinx/src/user/00_intro.rst index 441890ee9f..1929ee2203 100644 --- a/sphinx/src/user/00_intro.rst +++ b/sphinx/src/user/00_intro.rst @@ -1,7 +1,6 @@ User Documentation ################## - .. toctree:: introduction diff --git a/sphinx/src/user/ci-skeleton.rst b/sphinx/src/user/ci-skeleton.rst index 2d3c10a43a..413e372d97 100644 --- a/sphinx/src/user/ci-skeleton.rst +++ b/sphinx/src/user/ci-skeleton.rst @@ -177,8 +177,7 @@ documentation on how to get set up with them. Last, but certainly not least, we need to generate the CI configuration scripts! This is based on the content of the recipe as well as the provider selections made in the ``conda-forge.yml`` file. (Please -refer to `these docs `_ -for a complete list of CI providers.) +refer to :ref:`these docs ` for a complete list of CI providers.) In order to generate the CI configuration files, run: diff --git a/sphinx/src/user/contributing.rst b/sphinx/src/user/contributing.rst index 8245633c59..598d810315 100644 --- a/sphinx/src/user/contributing.rst +++ b/sphinx/src/user/contributing.rst @@ -7,10 +7,10 @@ conda-forge is a community-driven effort of cross-platform packaging and relies We encourage you to contribute to conda-forge. You can do so in several ways: - - `Contribute new packages `_. - - Help update and `maintain packages `_. - - Suggest or implement improvements for our `infrastructure `_. - - Help `improve the documentation `_. +- :doc:`Contribute new packages `. +- Help update and :doc:`maintain packages `. +- Suggest or implement improvements for our :doc:`infrastructure `. +- Help :ref:`improve the documentation `. .. _improve_docs: @@ -48,31 +48,31 @@ If you are new to the conda-forge community, follow the steps below to make your 2. Clone this fork onto your local machine: - - ``git clone https://github.com//conda-forge.github.io.git`` - - ``cd conda-forge.github.io`` + - ``git clone https://github.com//conda-forge.github.io.git`` + - ``cd conda-forge.github.io`` 3. Create a new branch deriving from ``main`` to do your work: - - ``git checkout -b `` + - ``git checkout -b `` 4. Run the following commands: - - ``conda env create -f ./.ci_scripts/environment.yml`` - - ``conda activate conda-forge-docs`` - - ``cd sphinx/src`` + - ``conda env create -f ./.ci_scripts/environment.yml`` + - ``conda activate conda-forge-docs`` + - ``cd sphinx/src`` 5. Make your changes and run the following command to check them: - - ``make html`` + - ``make html`` - You can check the changes locally by opening the html files in ``_build/html`` or running: + You can check the changes locally by opening the html files in ``_build/html`` or running: - - ``python -m http.server --directory _build/html`` + - ``python -m http.server --directory _build/html`` 6. Add and commit your changes: - - ``git add .`` - - ``git commit -m "your commit message"`` + - ``git add .`` + - ``git commit -m "your commit message"`` 7. Submit a `pull request `__ to the main repository proposing your changes. diff --git a/sphinx/src/user/faq.rst b/sphinx/src/user/faq.rst index 12675741ca..c994d9ea77 100644 --- a/sphinx/src/user/faq.rst +++ b/sphinx/src/user/faq.rst @@ -3,149 +3,161 @@ FAQ .. _faq_pkg_not_available: -:ref:`(Q) ` **A package I am looking for is not on conda-forge, what can I do?** +A package I am looking for is not on conda-forge, what can I do? +---------------------------------------------------------------- - We have an overview and step-by-step instruction on contributing packages in the section :ref:`dev_contribute_pkgs`. +We have an overview and step-by-step instruction on contributing packages in the section :ref:`dev_contribute_pkgs`. .. _faq_pkg_update: -:ref:`(Q) ` **The feedstock for a package from conda-forge is updated, how long should it take to update on Anaconda Cloud?** +The feedstock for a package from conda-forge is updated, how long should it take to update on Anaconda Cloud? +------------------------------------------------------------------------------------------------------------- - It depends on the queue, but a good rule of thumb is to wait at least 30 mins - 2 hours. If you don't see it after 24 hrs, please raise an issue. +It depends on the queue, but a good rule of thumb is to wait at least 30 mins - 2 hours. If you don't see it after 24 hrs, please raise an issue. .. _faq_report_issue: -:ref:`(Q) ` **A package from conda-forge is outdated or broken, where can I report the issue?** +A package from conda-forge is outdated or broken, where can I report the issue? +------------------------------------------------------------------------------- - You can open an issue in the packages feedstock repository on GitHub. Search for the repository ``conda-forge/-feedstock``. There you can also suggest fixes or even become a maintainer. Please refer to :ref:`maintaining_pkgs` for details. +You can open an issue in the packages feedstock repository on GitHub. Search for the repository ``conda-forge/-feedstock``. There you can also suggest fixes or even become a maintainer. Please refer to :ref:`maintaining_pkgs` for details. .. _faq_contact: -:ref:`(Q) ` **I have a question/suggestion. How can I contact you?** +I have a question/suggestion. How can I contact you? +---------------------------------------------------- - Please join us on our `Element chatroom `__. We are always happy to answer questions and help beginners. +Please join us on our `Element chatroom `__. We are always happy to answer questions and help beginners. .. _faq_teams: -:ref:`(Q) ` **I have a set of related packages, how do I create a conda-forge team?** +I have a set of related packages, how do I create a conda-forge team? +--------------------------------------------------------------------- - conda-forge github teams are very useful means of adding common maintainers to a set of related packages. For example, most R packages are co-maintained by the conda-forge/R team. - To create a new team, you can just use one of the existing feedstocks from your packages. Each feedstock has automatically a team assigned (formed from the maintainers of that feedstock). - For example, the conda-forge R team is coming from the `r-feedstock `_. Then you can just add `- conda-forge/r` in the maintainers section to - make all maintainers of the r-feedstock also maintainers of the new package. +conda-forge github teams are very useful means of adding common maintainers to a set of related packages. For example, most R packages are co-maintained by the conda-forge/R team. +To create a new team, you can just use one of the existing feedstocks from your packages. Each feedstock has automatically a team assigned (formed from the maintainers of that feedstock). +For example, the conda-forge R team is coming from the `r-feedstock `_. Then you can just add `- conda-forge/r` in the maintainers section to +make all maintainers of the r-feedstock also maintainers of the new package. .. _faq_solver_speed: -:ref:`(Q) ` **Installing and updating takes a long time, what can I do?** +Installing and updating takes a long time, what can I do? +--------------------------------------------------------- - Enabling strict channel priority may help. You can do this via +Enabling strict channel priority may help. You can do this via - .. code-block:: bash +.. code-block:: bash - conda config --set channel_priority strict + conda config --set channel_priority strict - You can also try using a package called `mamba `__. - ``mamba`` is an ``conda``-compatible package that can be used in place of ``conda``. It - employs a faster solver implemented in ``C``. It can be installed via +You can also try using a package called `mamba `__. +``mamba`` is an ``conda``-compatible package that can be used in place of ``conda``. It +employs a faster solver implemented in ``C``. It can be installed via - .. code-block:: bash +.. code-block:: bash - conda install mamba + conda install mamba .. _faq_travis_ci: -:ref:`(Q) ` **Why is Travis-CI failing on my feedstock?** +Why is Travis-CI failing on my feedstock? +----------------------------------------- - Travis CI builds should be enabled or disabled via the ``conda-forge.yml`` configuration. - Nevertheless, sometimes Travis CI ignores this for whatever reason (probably a bug somewhere). - In such a case, please disregard failing builds. - Note that ``travis-ci.org`` builds are soon being phased out and replaced by ``travis-ci.com``. +Travis CI builds should be enabled or disabled via the ``conda-forge.yml`` configuration. +Nevertheless, sometimes Travis CI ignores this for whatever reason (probably a bug somewhere). +In such a case, please disregard failing builds. +Note that ``travis-ci.org`` builds are soon being phased out and replaced by ``travis-ci.com``. .. _faq_compiler_metapkg: -:ref:`(Q) ` **How can I install a C/C++ compiler in my environment?** +How can I install a C/C++ compiler in my environment? +----------------------------------------------------- - You can use our convenient meta-packages ``c-compiler`` and ``cxx-compiler`` to install a compiler stack that fits your platform. Error messages such as +You can use our convenient meta-packages ``c-compiler`` and ``cxx-compiler`` to install a compiler stack that fits your platform. Error messages such as - .. code-block:: +.. code-block:: - x86_64-apple-darwin13.4.0-clang: No such file or directory + x86_64-apple-darwin13.4.0-clang: No such file or directory - are a telltale sign that you are lacking compilers. +are a telltale sign that you are lacking compilers. .. _faq_compiler_required_options: -:ref:`(Q) ` **Why don't the C/C++ compilers automatically know how to find libraries installed by conda?** - - All of our toolchains are built as cross-compilers (even when they are built to run on the same - architecture that they are targeting). We do this because it makes it possible to then install - them anywhere like any other conda package. As a result, the builtin search path for the - compilers only contains the sysroot they were built with. The compiler binary names are also - 'prefixed' with more complete information about the architecture and :std:term:`ABI` they target. So, instead - of ``gcc``, the actual binary will be named something like ``x86_64-conda-linux-gnu-cc``. - - The conda-forge infrastructure provides :ref:`activation scripts ` which are run when - you ``conda activate`` an environment that contains the compiler toolchain. Those scripts set - many environment variables that are typically used by GNU ``autotools`` and ``make`` in the - ``standard`` (i.e. builtin) build rules. For example, you would see the variable ``CC`` set to - the long compiler name ``x86_64-conda-linux-gnu-cc``. The activation scripts also set a - ``CMAKE_ARGS`` variable with many arguments the conda-forge community finds helpful for - configuring cmake build flows. Of particular note, the activation scripts add the - ``CONDA_PREFIX/include`` and ``CONDA_PREFIX/lib`` paths to the appropriate ``FLAGS`` environment - variables (``CLAGS``, ``CPPFLAGS``, ``LDFLAGS``, etc) so that many build systems will pick them up correctly. - - What do you do if you have custom ``FLAGS`` that your project requires for it's build or you can't - build with some of the flags supplied by conda-forge? What if you are building something that - is setup for cross-compiling and expects ``CC`` to contain the name of the target toolchain but - wants to be able to build some things for the build-host to use during the build by just calling - ``gcc``? - - The :ref:`compiler metapackages mentioned above ` also install packages that - create symlinks of the short names (like ``gcc``) to the actual toolchain binary names (like - ``x86_64-conda-linux-gnu-cc``) for toolchains that are targeting the system they are running on. - - A new optional package called ``conda-gcc-specs`` can also be installed that adds: - * ``-include $CONDA_PREFIX/include`` to compile commands - * ``-rpath $CONDA_PREFIX/lib -rpath-link $CONDA_PREFIX/lib -disable-new-dtags -L $CONDA_PREFIX/lib`` to link - commands - - Using the compiler metapackage with ``conda-gcc-specs`` you can incude and link libraries installed - in ``CONDA_PREFIX`` without having to provide any conda-specific cmdline arguments. +Why don't the C/C++ compilers automatically know how to find libraries installed by conda? +------------------------------------------------------------------------------------------ + +All of our toolchains are built as cross-compilers (even when they are built to run on the same +architecture that they are targeting). We do this because it makes it possible to then install +them anywhere like any other conda package. As a result, the builtin search path for the +compilers only contains the sysroot they were built with. The compiler binary names are also +'prefixed' with more complete information about the architecture and :std:term:`ABI` they target. So, instead +of ``gcc``, the actual binary will be named something like ``x86_64-conda-linux-gnu-cc``. + +The conda-forge infrastructure provides :ref:`activation scripts ` which are run when +you ``conda activate`` an environment that contains the compiler toolchain. Those scripts set +many environment variables that are typically used by GNU ``autotools`` and ``make`` in the +``standard`` (i.e. builtin) build rules. For example, you would see the variable ``CC`` set to +the long compiler name ``x86_64-conda-linux-gnu-cc``. The activation scripts also set a +``CMAKE_ARGS`` variable with many arguments the conda-forge community finds helpful for +configuring cmake build flows. Of particular note, the activation scripts add the +``CONDA_PREFIX/include`` and ``CONDA_PREFIX/lib`` paths to the appropriate ``FLAGS`` environment +variables (``CLAGS``, ``CPPFLAGS``, ``LDFLAGS``, etc) so that many build systems will pick them up correctly. + +What do you do if you have custom ``FLAGS`` that your project requires for it's build or you can't +build with some of the flags supplied by conda-forge? What if you are building something that +is setup for cross-compiling and expects ``CC`` to contain the name of the target toolchain but +wants to be able to build some things for the build-host to use during the build by just calling +``gcc``? + +The :ref:`compiler metapackages mentioned above ` also install packages that +create symlinks of the short names (like ``gcc``) to the actual toolchain binary names (like +``x86_64-conda-linux-gnu-cc``) for toolchains that are targeting the system they are running on. + +A new optional package called ``conda-gcc-specs`` can also be installed that adds: + * ``-include $CONDA_PREFIX/include`` to compile commands + * ``-rpath $CONDA_PREFIX/lib -rpath-link $CONDA_PREFIX/lib -disable-new-dtags -L $CONDA_PREFIX/lib`` to link + commands + +Using the compiler metapackage with ``conda-gcc-specs`` you can incude and link libraries installed +in ``CONDA_PREFIX`` without having to provide any conda-specific cmdline arguments. .. _faq_compiler_use_system_libs: -:ref:`(Q) ` **How can I make conda gcc use my system libraries?** +How can I make conda gcc use my system libraries? +------------------------------------------------- - First, the conda-forge infrastructure tries very hard to avoid using any of the system-provided - libraries, otherwise the dependencies betweeen packages quickly become incomplete and nothing works. +First, the conda-forge infrastructure tries very hard to avoid using any of the system-provided +libraries, otherwise the dependencies betweeen packages quickly become incomplete and nothing works. - However, as an end user, when not building something that will be packaged and distributed via - conda-forge, you may need to link against libraries on your system instead of libraries in your - conda environment. This can be accomplished (for gcc) by passing ``-sysroot=/`` on the cmdline. +However, as an end user, when not building something that will be packaged and distributed via +conda-forge, you may need to link against libraries on your system instead of libraries in your +conda environment. This can be accomplished (for gcc) by passing ``-sysroot=/`` on the cmdline. .. _faq_cuda_compiler_header: -:ref:`(Q) ` **How can I compile CUDA (host or device) codes in my environment?** +How can I compile CUDA (host or device) codes in my environment? +---------------------------------------------------------------- - Unfortunately, this is not possible with conda-forge's current infrastructure (``nvcc``, ``cudatoolkit``, etc) if there is no local CUDA Toolkit installation. In particular, the ``nvcc`` package provided on conda-forge is a *wrapper package* that exposes the actual ``nvcc`` compiler to our CI infrastructure in a ``conda``-friendly way; it does not contain the full ``nvcc`` compiler toolchain. One of the reasons is that CUDA headers like ``cuda.h``, ``cuda_runtime.h``, etc, which are needed at compile time, are not redistributable according to NVIDIA's EULA. Likewise, the ``cudatoolkit`` package only contains CUDA runtime libraries and not the compiler toolchain. +Unfortunately, this is not possible with conda-forge's current infrastructure (``nvcc``, ``cudatoolkit``, etc) if there is no local CUDA Toolkit installation. In particular, the ``nvcc`` package provided on conda-forge is a *wrapper package* that exposes the actual ``nvcc`` compiler to our CI infrastructure in a ``conda``-friendly way; it does not contain the full ``nvcc`` compiler toolchain. One of the reasons is that CUDA headers like ``cuda.h``, ``cuda_runtime.h``, etc, which are needed at compile time, are not redistributable according to NVIDIA's EULA. Likewise, the ``cudatoolkit`` package only contains CUDA runtime libraries and not the compiler toolchain. - If you need to compile CUDA code, even if it involves only CUDA host APIs, you will still need a valid CUDA Toolkit installed locally and use it. Please refer to `NVCC's documentation `_ for the CUDA compiler usage and `CUDA Programming Guide `_ for general CUDA programming. +If you need to compile CUDA code, even if it involves only CUDA host APIs, you will still need a valid CUDA Toolkit installed locally and use it. Please refer to `NVCC's documentation `_ for the CUDA compiler usage and `CUDA Programming Guide `_ for general CUDA programming. .. _faq_abi_incompatibility: -:ref:`(Q) ` **How to handle breaking of a package due to ABI incompatibility?** +How to handle breaking of a package due to ABI incompatibility? +--------------------------------------------------------------- - If your package breaks ABI with a version bump, here are a few steps you can take to fix it: +If your package breaks ABI with a version bump, here are a few steps you can take to fix it: - - Rebuild the new version with corrected ``run_exports``. - - Rebuild the old version with corrected ``run_exports``. - - Hot-fix the repodata of dependencies to include corrected pinnings for the package. - - Add a PR to pin the old version in ``conda-forge-pinning`` (if not already present) - - Open a migrator following `CFEP-09 `_ +- Rebuild the new version with corrected ``run_exports``. +- Rebuild the old version with corrected ``run_exports``. +- Hot-fix the repodata of dependencies to include corrected pinnings for the package. +- Add a PR to pin the old version in ``conda-forge-pinning`` (if not already present) +- Open a migrator following `CFEP-09 `_ - To read more on how to specify ``run_exports``, see `this `_. - Some of the examples you can see for reference, where broken packages are fixed by: +To read more on how to specify ``run_exports``, see :ref:`run_exports`. +Some of the examples you can see for reference, where broken packages are fixed by: - - `Replacing an existing pin that was incorrect `_. - - `Pinning packages loosely to rely on their ABI compatibility `_. - - `Pinning packages strictly `_. +- `Replacing an existing pin that was incorrect `_. +- `Pinning packages loosely to rely on their ABI compatibility `_. +- `Pinning packages strictly `_. diff --git a/sphinx/src/user/how_to_get_help.rst b/sphinx/src/user/how_to_get_help.rst index 1daf1551c3..64faa78407 100644 --- a/sphinx/src/user/how_to_get_help.rst +++ b/sphinx/src/user/how_to_get_help.rst @@ -21,7 +21,7 @@ Or you can open an issue about a specific package at the package feedstock via When opening issues, be sure to: -* Try a new environment first following conda-forge `install instructions `__. +* Try a new environment first following conda-forge :ref:`install instructions `. * Always open a new one when an issue is closed. In the packaging world symptoms may be similar but the causes are usually very different. * Fill in the required information. Without the output of `conda list` and `conda info -a` the team cannot debug the problem. diff --git a/sphinx/src/user/introduction.rst b/sphinx/src/user/introduction.rst index 46ade25697..8772816c32 100644 --- a/sphinx/src/user/introduction.rst +++ b/sphinx/src/user/introduction.rst @@ -1,8 +1,3 @@ -.. conda-forge documentation primary file, created by - sphinx-quickstart on Wed Jun 1 01:44:13 2016. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - A brief introduction ==================== @@ -28,45 +23,47 @@ In the past users only had the option to create an `Anaconda Cloud `. +You can refer to the glossary :ref:`misc_glossary`. + +.. _how_to_install: How can I install packages from conda-forge? -------------------------------------------- Using conda-forge is easy! - - Make sure you have ``conda >=4.9``. +- Make sure you have ``conda >=4.9``. - .. code-block:: bash + .. code-block:: bash - conda --version - conda update conda + conda --version + conda update conda - - Add conda-forge as the highest priority channel. +- Add conda-forge as the highest priority channel. - .. code-block:: bash + .. code-block:: bash - conda config --add channels conda-forge + conda config --add channels conda-forge - - Activate ``strict`` channel priority (``strict`` will be activated by default in conda 5.0). +- Activate ``strict`` channel priority (``strict`` will be activated by default in conda 5.0). - .. code-block:: bash + .. code-block:: bash - conda config --set channel_priority strict + conda config --set channel_priority strict From now on using ``conda install `` will also find packages in our conda-forge channels. @@ -100,7 +97,7 @@ Can I contribute packages to conda-forge? Anyone can contribute packages to the ``conda-forge`` channel. You don't have to be the upstream maintainer of a package in order to contribute it to conda-forge. -To learn how to contribute your first package read `the staging process `_. +To learn how to contribute your first package read :ref:`the staging process `. How can I give credit to conda-forge? diff --git a/sphinx/src/user/talks.rst b/sphinx/src/user/talks.rst index 8dd681eb7c..c0f030925d 100644 --- a/sphinx/src/user/talks.rst +++ b/sphinx/src/user/talks.rst @@ -18,7 +18,7 @@ Conferences * **AnacondaCON 2020**: `The Automation of Conda-Forge `__ + :download:`slides `, by CJ Wright * **PyData Global 2021**: `conda-forge in 2021 `__, by Eric Dill * **PyCON DE & PyData Berlin 2022**: `conda-forge: supporting the growth of the volunteer-driven, community-based packaging project `__, by Wolf Vollprecht, Jannis Leidel, Jaime Rodríguez-Guerra - * :download:`Updated slides for EuroScipy 2022 ` + - :download:`Updated slides for EuroScipy 2022 ` Other materials --------------- diff --git a/src/components/About/index.jsx b/src/components/About/index.jsx index 96ce9b6bd5..6aab409e11 100644 --- a/src/components/About/index.jsx +++ b/src/components/About/index.jsx @@ -96,7 +96,7 @@ export default function Stats() {

Learn more about conda-forge by reading our{" "} - docs or watching the following + docs or watching the following episode of{" "} Open Source Directions diff --git a/src/components/Contributing/index.jsx b/src/components/Contributing/index.jsx index e46e23f36a..1eb07e4d2d 100644 --- a/src/components/Contributing/index.jsx +++ b/src/components/Contributing/index.jsx @@ -7,7 +7,7 @@ const contributing = [ Svg: require("@site/static/img/contributing/edit.svg").default, alt: "GitHub edit pen tool icon", title: "Update A Package", - href: "pathname:///docs", + href: "/docs", content: "Edit the recipe as desired. You may even consider adding yourself as a recipe maintainer.", width: 50, diff --git a/src/components/Header/index.jsx b/src/components/Header/index.jsx index f38a500216..5025d968f7 100644 --- a/src/components/Header/index.jsx +++ b/src/components/Header/index.jsx @@ -25,7 +25,7 @@ export default function Header() {

Explore conda-forge diff --git a/static/js/count.js b/static/js/count.js new file mode 100644 index 0000000000..e85f0bc920 --- /dev/null +++ b/static/js/count.js @@ -0,0 +1,254 @@ +// GoatCounter: https://www.goatcounter.com +// This file is released under the ISC license: https://opensource.org/licenses/ISC +;(function() { + 'use strict'; + + if (window.goatcounter && window.goatcounter.vars) // Compatibility with very old version; do not use. + window.goatcounter = window.goatcounter.vars + else + window.goatcounter = window.goatcounter || {} + + // Load settings from data-goatcounter-settings. + var s = document.querySelector('script[data-goatcounter]') + if (s && s.dataset.goatcounterSettings) { + try { var set = JSON.parse(s.dataset.goatcounterSettings) } + catch (err) { console.error('invalid JSON in data-goatcounter-settings: ' + err) } + for (var k in set) + if (['no_onload', 'no_events', 'allow_local', 'allow_frame', 'path', 'title', 'referrer', 'event'].indexOf(k) > -1) + window.goatcounter[k] = set[k] + } + + var enc = encodeURIComponent + + // Get all data we're going to send off to the counter endpoint. + var get_data = function(vars) { + var data = { + p: (vars.path === undefined ? goatcounter.path : vars.path), + r: (vars.referrer === undefined ? goatcounter.referrer : vars.referrer), + t: (vars.title === undefined ? goatcounter.title : vars.title), + e: !!(vars.event || goatcounter.event), + s: [window.screen.width, window.screen.height, (window.devicePixelRatio || 1)], + b: is_bot(), + q: location.search, + } + + var rcb, pcb, tcb // Save callbacks to apply later. + if (typeof(data.r) === 'function') rcb = data.r + if (typeof(data.t) === 'function') tcb = data.t + if (typeof(data.p) === 'function') pcb = data.p + + if (is_empty(data.r)) data.r = document.referrer + if (is_empty(data.t)) data.t = document.title + if (is_empty(data.p)) data.p = get_path() + + if (rcb) data.r = rcb(data.r) + if (tcb) data.t = tcb(data.t) + if (pcb) data.p = pcb(data.p) + return data + } + + // Check if a value is "empty" for the purpose of get_data(). + var is_empty = function(v) { return v === null || v === undefined || typeof(v) === 'function' } + + // See if this looks like a bot; there is some additional filtering on the + // backend, but these properties can't be fetched from there. + var is_bot = function() { + // Headless browsers are probably a bot. + var w = window, d = document + if (w.callPhantom || w._phantom || w.phantom) + return 150 + if (w.__nightmare) + return 151 + if (d.__selenium_unwrapped || d.__webdriver_evaluate || d.__driver_evaluate) + return 152 + if (navigator.webdriver) + return 153 + return 0 + } + + // Object to urlencoded string, starting with a ?. + var urlencode = function(obj) { + var p = [] + for (var k in obj) + if (obj[k] !== '' && obj[k] !== null && obj[k] !== undefined && obj[k] !== false) + p.push(enc(k) + '=' + enc(obj[k])) + return '?' + p.join('&') + } + + // Show a warning in the console. + var warn = function(msg) { + if (console && 'warn' in console) + console.warn('goatcounter: ' + msg) + } + + // Get the endpoint to send requests to. + var get_endpoint = function() { + var s = document.querySelector('script[data-goatcounter]') + if (s && s.dataset.goatcounter) + return s.dataset.goatcounter + return (goatcounter.endpoint || window.counter) // counter is for compat; don't use. + } + + // Get current path. + var get_path = function() { + var loc = location, + c = document.querySelector('link[rel="canonical"][href]') + if (c) { // May be relative or point to different domain. + var a = document.createElement('a') + a.href = c.href + if (a.hostname.replace(/^www\./, '') === location.hostname.replace(/^www\./, '')) + loc = a + } + return (loc.pathname + loc.search) || '/' + } + + // Run function after DOM is loaded. + var on_load = function(f) { + if (document.body === null) + document.addEventListener('DOMContentLoaded', function() { f() }, false) + else + f() + } + + // Filter some requests that we (probably) don't want to count. + goatcounter.filter = function() { + if ('visibilityState' in document && document.visibilityState === 'prerender') + return 'visibilityState' + if (!goatcounter.allow_frame && location !== parent.location) + return 'frame' + if (!goatcounter.allow_local && location.hostname.match(/(localhost$|^127\.|^10\.|^172\.(1[6-9]|2[0-9]|3[0-1])\.|^192\.168\.|^0\.0\.0\.0$)/)) + return 'localhost' + if (!goatcounter.allow_local && location.protocol === 'file:') + return 'localfile' + if (localStorage && localStorage.getItem('skipgc') === 't') + return 'disabled with #toggle-goatcounter' + return false + } + + // Get URL to send to GoatCounter. + window.goatcounter.url = function(vars) { + var data = get_data(vars || {}) + if (data.p === null) // null from user callback. + return + data.rnd = Math.random().toString(36).substr(2, 5) // Browsers don't always listen to Cache-Control. + + var endpoint = get_endpoint() + if (!endpoint) + return warn('no endpoint found') + + return endpoint + urlencode(data) + } + + // Count a hit. + window.goatcounter.count = function(vars) { + var f = goatcounter.filter() + if (f) + return warn('not counting because of: ' + f) + var url = goatcounter.url(vars) + if (!url) + return warn('not counting because path callback returned null') + navigator.sendBeacon(url) + } + + // Get a query parameter. + window.goatcounter.get_query = function(name) { + var s = location.search.substr(1).split('&') + for (var i = 0; i < s.length; i++) + if (s[i].toLowerCase().indexOf(name.toLowerCase() + '=') === 0) + return s[i].substr(name.length + 1) + } + + // Track click events. + window.goatcounter.bind_events = function() { + if (!document.querySelectorAll) // Just in case someone uses an ancient browser. + return + + var send = function(elem) { + return function() { + goatcounter.count({ + event: true, + path: (elem.dataset.goatcounterClick || elem.name || elem.id || ''), + title: (elem.dataset.goatcounterTitle || elem.title || (elem.innerHTML || '').substr(0, 200) || ''), + referrer: (elem.dataset.goatcounterReferrer || elem.dataset.goatcounterReferral || ''), + }) + } + } + + Array.prototype.slice.call(document.querySelectorAll("*[data-goatcounter-click]")).forEach(function(elem) { + if (elem.dataset.goatcounterBound) + return + var f = send(elem) + elem.addEventListener('click', f, false) + elem.addEventListener('auxclick', f, false) // Middle click. + elem.dataset.goatcounterBound = 'true' + }) + } + + // Add a "visitor counter" frame or image. + window.goatcounter.visit_count = function(opt) { + on_load(function() { + opt = opt || {} + opt.type = opt.type || 'html' + opt.append = opt.append || 'body' + opt.path = opt.path || get_path() + opt.attr = opt.attr || {width: '200', height: (opt.no_branding ? '60' : '80')} + + opt.attr['src'] = get_endpoint() + 'er/' + enc(opt.path) + '.' + enc(opt.type) + '?' + if (opt.no_branding) opt.attr['src'] += '&no_branding=1' + if (opt.style) opt.attr['src'] += '&style=' + enc(opt.style) + if (opt.start) opt.attr['src'] += '&start=' + enc(opt.start) + if (opt.end) opt.attr['src'] += '&end=' + enc(opt.end) + + var tag = {png: 'img', svg: 'img', html: 'iframe'}[opt.type] + if (!tag) + return warn('visit_count: unknown type: ' + opt.type) + + if (opt.type === 'html') { + opt.attr['frameborder'] = '0' + opt.attr['scrolling'] = 'no' + } + + var d = document.createElement(tag) + for (var k in opt.attr) + d.setAttribute(k, opt.attr[k]) + + var p = document.querySelector(opt.append) + if (!p) + return warn('visit_count: append not found: ' + opt.append) + p.appendChild(d) + }) + } + + // Make it easy to skip your own views. + if (location.hash === '#toggle-goatcounter') { + if (localStorage.getItem('skipgc') === 't') { + localStorage.removeItem('skipgc', 't') + alert('GoatCounter tracking is now ENABLED in this browser.') + } + else { + localStorage.setItem('skipgc', 't') + alert('GoatCounter tracking is now DISABLED in this browser until ' + location + ' is loaded again.') + } + } + + if (!goatcounter.no_onload) + on_load(function() { + // 1. Page is visible, count request. + // 2. Page is not yet visible; wait until it switches to 'visible' and count. + // See #487 + if (!('visibilityState' in document) || document.visibilityState === 'visible') + goatcounter.count() + else { + var f = function(e) { + if (document.visibilityState !== 'visible') + return + document.removeEventListener('visibilitychange', f) + goatcounter.count() + } + document.addEventListener('visibilitychange', f) + } + + if (!goatcounter.no_events) + goatcounter.bind_events() + }) +})();