This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch docs
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/docs by this push:
new 54f071f452 feat(docs): TODO-71 — local stage/prod deploy scripts +
Algolia → @easyops-cn/docusaurus-search-local swap + README/release-notes
updates
54f071f452 is described below
commit 54f071f452c87ea71a4a06e576718d6b6b9be712
Author: James Bognar <[email protected]>
AuthorDate: Tue May 26 14:43:04 2026 -0400
feat(docs): TODO-71 — local stage/prod deploy scripts + Algolia →
@easyops-cn/docusaurus-search-local swap + README/release-notes updates
Co-authored-by: Cursor <[email protected]>
---
README.md | 62 +-
docusaurus.config.ts | 47 +-
package-lock.json | 1542 ++++++++++++++++++++++++++++++++++++++---
package.json | 1 +
pages/release-notes/9.5.0.md | 8 +
scripts/build-docs.py | 146 ++--
scripts/release-docs-stage.py | 41 +-
scripts/release-docs.py | 39 +-
8 files changed, 1714 insertions(+), 172 deletions(-)
diff --git a/README.md b/README.md
index 07557b5654..879199d02b 100644
--- a/README.md
+++ b/README.md
@@ -313,7 +313,67 @@ Juneau is packed with features that may not be obvious at
first. Users are encou
* juneau-rest-client - Apache HttpClient 4.5+.
* Built on top of Servlet and Apache HttpClient APIs that allow you to use the
newest HTTP/2 features such as request/response multiplexing and server push.
-## Building
+## Building the docs site
+
+The documentation site is a [Docusaurus 3](https://docusaurus.io/) project.
Builds and deploys are driven by local Python scripts under `scripts/` — there
is no longer a `push`-triggered GitHub Action; publishes happen when a human
runs the script.
+
+**Prerequisites:**
+* Node.js 18+ and npm
+* Java 17 (`~/jdk/openjdk_17.0.14.0.101_17.57.18_aarch64/bin/java` on this
workstation)
+* Apache Maven (for the Java tree's `site` build)
+* A sibling `master` checkout of the Juneau Java repository at `../master/`
(`scripts/build-docs.py` runs Maven `site` there to harvest the javadocs)
+
+**Dev server (hot reload, no deploy):**
+
+```bash
+python3 scripts/start-docusaurus.py # serves http://localhost:3000
+```
+
+The script kills any process on port 3000, clears the Docusaurus cache, runs
`npm install` if needed, and starts `npm start`. Edit `pages/` and the page
reloads automatically.
+
+**Full local build (Maven site + Docusaurus + link checks):**
+
+```bash
+python3 scripts/build-docs.py # full pipeline
+python3 scripts/build-docs.py --dry-run # print everything it
would do, run nothing
+python3 scripts/build-docs.py --verbose # full per-stage banners
+python3 scripts/build-docs.py --skip-maven # Docusaurus only (no Java
work)
+python3 scripts/build-docs.py --skip-npm # Maven site only
+python3 scripts/build-docs.py --staging # set SITE_URL to
juneau.staged.apache.org
+```
+
+Output lands in `build/`. On a successful full build the script prints a
publish reminder.
+
+**Local production preview** (no deploy, just `docusaurus serve` over the prod
build):
+
+```bash
+npm run build && npm run serve
+```
+
+**Deploy to staging** (`https://juneau.staged.apache.org`):
+
+```bash
+git config --get user.email # must be [email protected]
+python3 scripts/release-docs-stage.py
+# (use --no-push to rehearse without pushing)
+```
+
+The script verifies the git identity, runs the staged build, clones (or
updates) a sibling `../asf-staging/` checkout, copies the build output in,
commits, and force-pushes `asf-staging` to origin. Open
`http://juneau.staged.apache.org` to verify before promoting.
+
+**Promote staging to production** (`https://juneau.apache.org`):
+
+```bash
+git config --get user.email # must be [email protected]
+python3 scripts/release-docs.py
+# (use --no-push to rehearse)
+```
+
+This promotes whatever is currently on `origin/asf-staging` to `asf-site`.
Only run after eyeballing the staged site.
+
+**AI-driven flows:** the Cursor / Claude `@juneau-docs-workflow` skill
provides natural-phrase routing for all of the above ("start docs locally",
"deploy docs to stage", "deploy docs to prod", "add to release notes", etc.).
+
+## Building the Java tree
+
Building requires:
* [Apache Maven](https://maven.apache.org/)
* Java 17 is required to build and run.
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 1e2a092516..34d639ed5a 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -44,36 +44,6 @@ const giscusConfig: GiscusThemeConfig = {
const baseThemeConfig: Preset.ThemeConfig = {
// Replace with your project's social card
image: 'img/docusaurus-social-card.jpg',
- algolia: {
- // The application ID provided by Algolia
- appId: 'DVIGEYTUK7',
-
- // Public API key: it is safe to commit it
- apiKey: 'db9fd10aa92e0ad212e08340e37293c0',
-
- indexName: 'juneau_docsJuneau Website',
-
- // Optional: see doc section below
- contextualSearch: true,
-
- // Optional: Specify domains where the navigation should occur through
window.location instead on history.push. Useful when our Algolia config crawls
multiple documentation sites and we want to navigate with window.location.href
to them.
- // externalUrlRegex: 'external\\.com|domain\\.com',
-
- // Optional: Replace parts of the item URLs from Algolia. Useful when
using the same search index for multiple deployments using a different baseUrl.
You can use regexp or string in the `from` param. For example: localhost:3000
vs myCompany.com/docs
- // replaceSearchResultPathname: {
- // from: '/docs/', // or as RegExp: /\/docs\//
- // to: '/',
- // },
-
- // Optional: Algolia search parameters
- searchParameters: {},
-
- // Optional: path for search page that enabled by default (`false` to
disable it)
- searchPagePath: 'search',
-
- // Optional: whether the insights feature is enabled or not on Docsearch
(`false` by default)
- insights: false,
- },
navbar: {
title: 'Apache Juneau',
logo: {
@@ -246,6 +216,23 @@ const config: Config = {
],
],
+ // Client-side local search — built into the deployed bundle at site-build
time.
+ // Replaces the previous Algolia DocSearch integration: no external service,
+ // no API key, search index is always in sync with the source.
+ themes: [
+ [
+ '@easyops-cn/docusaurus-search-local',
+ {
+ hashed: true,
+ language: ['en'],
+ indexDocs: true,
+ indexBlog: true,
+ indexPages: true,
+ docsRouteBasePath: '/docs',
+ },
+ ],
+ ],
+
themeConfig,
};
diff --git a/package-lock.json b/package-lock.json
index f75059075a..e3b30b4b43 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,6 +23,7 @@
"@docusaurus/module-type-aliases": "3.8.1",
"@docusaurus/tsconfig": "3.8.1",
"@docusaurus/types": "3.8.1",
+ "@easyops-cn/docusaurus-search-local": "^0.54.1",
"string-replace-loader": "^3.2.0",
"typescript": "~5.6.2",
"unist-util-visit": "^5.0.0"
@@ -4023,6 +4024,162 @@
"node": ">=18.0"
}
},
+ "node_modules/@easyops-cn/autocomplete.js": {
+ "version": "0.38.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz",
+ "integrity":
"sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "immediate": "^3.2.3"
+ }
+ },
+ "node_modules/@easyops-cn/docusaurus-search-local": {
+ "version": "0.54.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.54.1.tgz",
+ "integrity":
"sha512-CexWCS1ktR7ZtvKWvbBhY7+NBRzQPVCAReBed6k5U9M2hdAARI3cK+NBUCegbd4F8VV54Re1HpIb2+GZwl8zEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@docusaurus/plugin-content-docs": "^2 || ^3",
+ "@docusaurus/theme-translations": "^2 || ^3",
+ "@docusaurus/utils": "^2 || ^3",
+ "@docusaurus/utils-common": "^2 || ^3",
+ "@docusaurus/utils-validation": "^2 || ^3",
+ "@easyops-cn/autocomplete.js": "^0.38.1",
+ "@node-rs/jieba": "^1.6.0",
+ "cheerio": "^1.0.0",
+ "clsx": "^2.1.1",
+ "comlink": "^4.4.2",
+ "debug": "^4.2.0",
+ "fs-extra": "^10.0.0",
+ "klaw-sync": "^6.0.0",
+ "lunr": "^2.3.9",
+ "lunr-languages": "^1.4.0",
+ "mark.js": "^8.11.1",
+ "tslib": "^2.4.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "open-ask-ai": "^0.7.3"
+ },
+ "peerDependencies": {
+ "@docusaurus/theme-common": "^2 || ^3",
+ "react": "^16.14.0 || ^17 || ^18 || ^19",
+ "react-dom": "^16.14.0 || 17 || ^18 || ^19"
+ }
+ },
+ "node_modules/@easyops-cn/docusaurus-search-local/node_modules/cheerio": {
+ "version": "1.2.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/cheerio/-/cheerio-1.2.0.tgz",
+ "integrity":
"sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.2",
+ "encoding-sniffer": "^0.2.1",
+ "htmlparser2": "^10.1.0",
+ "parse5": "^7.3.0",
+ "parse5-htmlparser2-tree-adapter": "^7.1.0",
+ "parse5-parser-stream": "^7.1.2",
+ "undici": "^7.19.0",
+ "whatwg-mimetype": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.1"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/@easyops-cn/docusaurus-search-local/node_modules/entities": {
+ "version": "7.0.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/entities/-/entities-7.0.1.tgz",
+ "integrity":
"sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/@easyops-cn/docusaurus-search-local/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity":
"sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+
"node_modules/@easyops-cn/docusaurus-search-local/node_modules/htmlparser2": {
+ "version": "10.1.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/htmlparser2/-/htmlparser2-10.1.0.tgz",
+ "integrity":
"sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==",
+ "dev": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.2",
+ "entities": "^7.0.1"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.10.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@emnapi/core/-/core-1.10.0.tgz",
+ "integrity":
"sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.2.1",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.10.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@emnapi/runtime/-/runtime-1.10.0.tgz",
+ "integrity":
"sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
+ "integrity":
"sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
"node_modules/@giscus/react": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@giscus/react/-/react-3.1.0.tgz",
@@ -4152,144 +4309,900 @@
"integrity":
"sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==",
"license": "BSD-3-Clause",
"dependencies": {
- "@lit-labs/ssr-dom-shim": "^1.4.0"
+ "@lit-labs/ssr-dom-shim": "^1.4.0"
+ }
+ },
+ "node_modules/@mdx-js/mdx": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz",
+ "integrity":
"sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdx": "^2.0.0",
+ "acorn": "^8.0.0",
+ "collapse-white-space": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "estree-util-scope": "^1.0.0",
+ "estree-walker": "^3.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "markdown-extensions": "^2.0.0",
+ "recma-build-jsx": "^1.0.0",
+ "recma-jsx": "^1.0.0",
+ "recma-stringify": "^1.0.0",
+ "rehype-recma": "^1.0.0",
+ "remark-mdx": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "source-map": "^0.7.0",
+ "unified": "^11.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/@mdx-js/react": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz",
+ "integrity":
"sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdx": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16",
+ "react": ">=16"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "0.2.12",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
+ "integrity":
"sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
+ "@tybys/wasm-util": "^0.10.0"
+ }
+ },
+ "node_modules/@node-rs/jieba": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba/-/jieba-1.10.4.tgz",
+ "integrity":
"sha512-GvDgi8MnBiyWd6tksojej8anIx18244NmIOc1ovEw8WKNUejcccLfyu8vj66LWSuoZuKILVtNsOy4jvg3aoxIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "optionalDependencies": {
+ "@node-rs/jieba-android-arm-eabi": "1.10.4",
+ "@node-rs/jieba-android-arm64": "1.10.4",
+ "@node-rs/jieba-darwin-arm64": "1.10.4",
+ "@node-rs/jieba-darwin-x64": "1.10.4",
+ "@node-rs/jieba-freebsd-x64": "1.10.4",
+ "@node-rs/jieba-linux-arm-gnueabihf": "1.10.4",
+ "@node-rs/jieba-linux-arm64-gnu": "1.10.4",
+ "@node-rs/jieba-linux-arm64-musl": "1.10.4",
+ "@node-rs/jieba-linux-x64-gnu": "1.10.4",
+ "@node-rs/jieba-linux-x64-musl": "1.10.4",
+ "@node-rs/jieba-wasm32-wasi": "1.10.4",
+ "@node-rs/jieba-win32-arm64-msvc": "1.10.4",
+ "@node-rs/jieba-win32-ia32-msvc": "1.10.4",
+ "@node-rs/jieba-win32-x64-msvc": "1.10.4"
+ }
+ },
+ "node_modules/@node-rs/jieba-android-arm-eabi": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.10.4.tgz",
+ "integrity":
"sha512-MhyvW5N3Fwcp385d0rxbCWH42kqDBatQTyP8XbnYbju2+0BO/eTeCCLYj7Agws4pwxn2LtdldXRSKavT7WdzNA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-android-arm64": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.10.4.tgz",
+ "integrity":
"sha512-XyDwq5+rQ+Tk55A+FGi6PtJbzf974oqnpyCcCPzwU3QVXJCa2Rr4Lci+fx8oOpU4plT3GuD+chXMYLsXipMgJA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-darwin-arm64": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.10.4.tgz",
+ "integrity":
"sha512-G++RYEJ2jo0rxF9626KUy90wp06TRUjAsvY/BrIzEOX/ingQYV/HjwQzNPRR1P1o32a6/U8RGo7zEBhfdybL6w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-darwin-x64": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.10.4.tgz",
+ "integrity":
"sha512-MmDNeOb2TXIZCPyWCi2upQnZpPjAxw5ZGEj6R8kNsPXVFALHIKMa6ZZ15LCOkSTsKXVC17j2t4h+hSuyYb6qfQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-freebsd-x64": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.10.4.tgz",
+ "integrity":
"sha512-/x7aVQ8nqUWhpXU92RZqd333cq639i/olNpd9Z5hdlyyV5/B65LLy+Je2B2bfs62PVVm5QXRpeBcZqaHelp/bg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-linux-arm-gnueabihf": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.10.4.tgz",
+ "integrity":
"sha512-crd2M35oJBRLkoESs0O6QO3BBbhpv+tqXuKsqhIG94B1d02RVxtRIvSDwO33QurxqSdvN9IeSnVpHbDGkuXm3g==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-linux-arm64-gnu": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.10.4.tgz",
+ "integrity":
"sha512-omIzNX1psUzPcsdnUhGU6oHeOaTCuCjUgOA/v/DGkvWC1jLcnfXe4vdYbtXMh4XOCuIgS1UCcvZEc8vQLXFbXQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-linux-arm64-musl": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.10.4.tgz",
+ "integrity":
"sha512-Y/tiJ1+HeS5nnmLbZOE+66LbsPOHZ/PUckAYVeLlQfpygLEpLYdlh0aPpS5uiaWMjAXYZYdFkpZHhxDmSLpwpw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-linux-x64-gnu": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.10.4.tgz",
+ "integrity":
"sha512-WZO8ykRJpWGE9MHuZpy1lu3nJluPoeB+fIJJn5CWZ9YTVhNDWoCF4i/7nxz1ntulINYGQ8VVuCU9LD86Mek97g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-linux-x64-musl": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.10.4.tgz",
+ "integrity":
"sha512-uBBD4S1rGKcgCyAk6VCKatEVQb6EDD5I40v/DxODi5CuZVCANi9m5oee/MQbAoaX7RydA2f0OSCE9/tcwXEwUg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-wasm32-wasi": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-wasm32-wasi/-/jieba-wasm32-wasi-1.10.4.tgz",
+ "integrity":
"sha512-Y2umiKHjuIJy0uulNDz9SDYHdfq5Hmy7jY5nORO99B4pySKkcrMjpeVrmWXJLIsEKLJwcCXHxz8tjwU5/uhz0A==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^0.2.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@node-rs/jieba-win32-arm64-msvc": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.10.4.tgz",
+ "integrity":
"sha512-nwMtViFm4hjqhz1it/juQnxpXgqlGltCuWJ02bw70YUDMDlbyTy3grCJPpQQpueeETcALUnTxda8pZuVrLRcBA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-win32-ia32-msvc": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.10.4.tgz",
+ "integrity":
"sha512-DCAvLx7Z+W4z5oKS+7vUowAJr0uw9JBw8x1Y23Xs/xMA4Em+OOSiaF5/tCJqZUCJ8uC4QeImmgDFiBqGNwxlyA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@node-rs/jieba-win32-x64-msvc": {
+ "version": "1.10.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.10.4.tgz",
+ "integrity":
"sha512-+sqemSfS1jjb+Tt7InNbNzrRh1Ua3vProVvC4BZRPg010/leCbGFFiQHpzcPRfpxAXZrzG5Y0YBTsPzN/I4yHQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved":
"https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity":
"sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved":
"https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity":
"sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved":
"https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity":
"sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pnpm/config.env-replace": {
+ "version": "1.1.0",
+ "resolved":
"https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz",
+ "integrity":
"sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.22.0"
+ }
+ },
+ "node_modules/@pnpm/network.ca-file": {
+ "version": "1.0.2",
+ "resolved":
"https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz",
+ "integrity":
"sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "4.2.10"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ }
+ },
+ "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": {
+ "version": "4.2.10",
+ "resolved":
"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity":
"sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "license": "ISC"
+ },
+ "node_modules/@pnpm/npm-conf": {
+ "version": "2.3.1",
+ "resolved":
"https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz",
+ "integrity":
"sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==",
+ "license": "MIT",
+ "dependencies": {
+ "@pnpm/config.env-replace": "^1.1.0",
+ "@pnpm/network.ca-file": "^1.0.1",
+ "config-chain": "^1.1.11"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.29",
+ "resolved":
"https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
+ "integrity":
"sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/number": {
+ "version": "1.1.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/number/-/number-1.1.1.tgz",
+ "integrity":
"sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.1.3",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/primitive/-/primitive-1.1.3.tgz",
+ "integrity":
"sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.2",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+ "integrity":
"sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.1.2",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+ "integrity":
"sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog": {
+ "version": "1.1.15",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz",
+ "integrity":
"sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity":
"sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-direction": {
+ "version": "1.1.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-direction/-/react-direction-1.1.1.tgz",
+ "integrity":
"sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.11",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz",
+ "integrity":
"sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-escape-keydown": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.1.3",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz",
+ "integrity":
"sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.1.7",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz",
+ "integrity":
"sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.1.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-id/-/react-id-1.1.1.tgz",
+ "integrity":
"sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.1.9",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-portal/-/react-portal-1.1.9.tgz",
+ "integrity":
"sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@mdx-js/mdx": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz",
- "integrity":
"sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==",
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.1.5",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-presence/-/react-presence-1.1.5.tgz",
+ "integrity":
"sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
+ "dev": true,
"license": "MIT",
+ "optional": true,
"dependencies": {
- "@types/estree": "^1.0.0",
- "@types/estree-jsx": "^1.0.0",
- "@types/hast": "^3.0.0",
- "@types/mdx": "^2.0.0",
- "acorn": "^8.0.0",
- "collapse-white-space": "^2.0.0",
- "devlop": "^1.0.0",
- "estree-util-is-identifier-name": "^3.0.0",
- "estree-util-scope": "^1.0.0",
- "estree-walker": "^3.0.0",
- "hast-util-to-jsx-runtime": "^2.0.0",
- "markdown-extensions": "^2.0.0",
- "recma-build-jsx": "^1.0.0",
- "recma-jsx": "^1.0.0",
- "recma-stringify": "^1.0.0",
- "rehype-recma": "^1.0.0",
- "remark-mdx": "^3.0.0",
- "remark-parse": "^11.0.0",
- "remark-rehype": "^11.0.0",
- "source-map": "^0.7.0",
- "unified": "^11.0.0",
- "unist-util-position-from-estree": "^2.0.0",
- "unist-util-stringify-position": "^4.0.0",
- "unist-util-visit": "^5.0.0",
- "vfile": "^6.0.0"
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@mdx-js/react": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz",
- "integrity":
"sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==",
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.3",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz",
+ "integrity":
"sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==",
+ "dev": true,
"license": "MIT",
+ "optional": true,
"dependencies": {
- "@types/mdx": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
+ "@radix-ui/react-slot": "1.2.3"
},
"peerDependencies": {
- "@types/react": ">=16",
- "react": ">=16"
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved":
"https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity":
"sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+
"node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity":
"sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "dev": true,
"license": "MIT",
+ "optional": true,
"dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
+ "@radix-ui/react-compose-refs": "1.1.2"
},
- "engines": {
- "node": ">= 8"
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved":
"https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity":
"sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "node_modules/@radix-ui/react-scroll-area": {
+ "version": "1.2.10",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz",
+ "integrity":
"sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==",
+ "dev": true,
"license": "MIT",
- "engines": {
- "node": ">= 8"
+ "optional": true,
+ "dependencies": {
+ "@radix-ui/number": "1.1.1",
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved":
"https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity":
"sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.2.4",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-slot/-/react-slot-1.2.4.tgz",
+ "integrity":
"sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==",
+ "dev": true,
"license": "MIT",
+ "optional": true,
"dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
+ "@radix-ui/react-compose-refs": "1.1.2"
},
- "engines": {
- "node": ">= 8"
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@pnpm/config.env-replace": {
- "version": "1.1.0",
- "resolved":
"https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz",
- "integrity":
"sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==",
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
+ "integrity":
"sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
+ "dev": true,
"license": "MIT",
- "engines": {
- "node": ">=12.22.0"
+ "optional": true,
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@pnpm/network.ca-file": {
- "version": "1.0.2",
- "resolved":
"https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz",
- "integrity":
"sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.2.2",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
+ "integrity":
"sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
+ "dev": true,
"license": "MIT",
+ "optional": true,
"dependencies": {
- "graceful-fs": "4.2.10"
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
},
- "engines": {
- "node": ">=12.22.0"
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": {
- "version": "4.2.10",
- "resolved":
"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
- "integrity":
"sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
- "license": "ISC"
+ "node_modules/@radix-ui/react-use-effect-event": {
+ "version": "0.0.2",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
+ "integrity":
"sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
},
- "node_modules/@pnpm/npm-conf": {
- "version": "2.3.1",
- "resolved":
"https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz",
- "integrity":
"sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==",
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
+ "integrity":
"sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
+ "dev": true,
"license": "MIT",
+ "optional": true,
"dependencies": {
- "@pnpm/config.env-replace": "^1.1.0",
- "@pnpm/network.ca-file": "^1.0.1",
- "config-chain": "^1.1.11"
+ "@radix-ui/react-use-callback-ref": "1.1.1"
},
- "engines": {
- "node": ">=12"
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@polka/url": {
- "version": "1.0.0-next.29",
- "resolved":
"https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
- "integrity":
"sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
- "license": "MIT"
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+ "integrity":
"sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
},
"node_modules/@sideway/address": {
"version": "4.1.5",
@@ -4619,6 +5532,17 @@
"node": ">=10.13.0"
}
},
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.2",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/@tybys/wasm-util/-/wasm-util-0.10.2.tgz",
+ "integrity":
"sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
"node_modules/@types/body-parser": {
"version": "1.19.6",
"resolved":
"https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
@@ -5500,6 +6424,20 @@
"integrity":
"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"license": "Python-2.0"
},
+ "node_modules/aria-hidden": {
+ "version": "1.2.6",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/aria-hidden/-/aria-hidden-1.2.6.tgz",
+ "integrity":
"sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved":
"https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -6299,6 +7237,13 @@
"node": ">=10"
}
},
+ "node_modules/comlink": {
+ "version": "4.4.2",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/comlink/-/comlink-4.4.2.tgz",
+ "integrity":
"sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
"node_modules/comma-separated-tokens": {
"version": "2.0.3",
"resolved":
"https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
@@ -7302,6 +8247,14 @@
"integrity":
"sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
"license": "MIT"
},
+ "node_modules/detect-node-es": {
+ "version": "1.1.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity":
"sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/detect-port": {
"version": "1.6.1",
"resolved":
"https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz",
@@ -7529,7 +8482,34 @@
"integrity":
"sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"license": "MIT",
"engines": {
- "node": ">= 0.8"
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/encoding-sniffer": {
+ "version": "0.2.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz",
+ "integrity":
"sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "^0.6.3",
+ "whatwg-encoding": "^3.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
+ }
+ },
+ "node_modules/encoding-sniffer/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity":
"sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
"node_modules/enhanced-resolve": {
@@ -8452,6 +9432,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity":
"sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/get-own-enumerable-property-symbols": {
"version": "3.0.2",
"resolved":
"https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
@@ -8762,6 +9753,21 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/hast-util-is-element": {
+ "version": "3.0.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
+ "integrity":
"sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/hast-util-parse-selector": {
"version": "4.0.0",
"resolved":
"https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
@@ -8884,6 +9890,24 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/hast-util-to-text": {
+ "version": "4.0.2",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz",
+ "integrity":
"sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "hast-util-is-element": "^3.0.0",
+ "unist-util-find-after": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/hast-util-whitespace": {
"version": "3.0.0",
"resolved":
"https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
@@ -8923,6 +9947,17 @@
"he": "bin/he"
}
},
+ "node_modules/highlight.js": {
+ "version": "11.11.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/highlight.js/-/highlight.js-11.11.1.tgz",
+ "integrity":
"sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/history": {
"version": "4.10.1",
"resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz",
@@ -9070,6 +10105,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/html-url-attributes": {
+ "version": "3.0.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
+ "integrity":
"sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/html-void-elements": {
"version": "3.0.0",
"resolved":
"https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
@@ -9338,6 +10385,13 @@
"node": ">=16.x"
}
},
+ "node_modules/immediate": {
+ "version": "3.3.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/immediate/-/immediate-3.3.0.tgz",
+ "integrity":
"sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/import-fresh": {
"version": "3.3.1",
"resolved":
"https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
@@ -9959,6 +11013,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/klaw-sync": {
+ "version": "6.0.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/klaw-sync/-/klaw-sync-6.0.0.tgz",
+ "integrity":
"sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.11"
+ }
+ },
"node_modules/kleur": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
@@ -10169,6 +11233,23 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/lowlight": {
+ "version": "3.3.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/lowlight/-/lowlight-3.3.0.tgz",
+ "integrity":
"sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "devlop": "^1.0.0",
+ "highlight.js": "~11.11.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -10178,6 +11259,38 @@
"yallist": "^3.0.2"
}
},
+ "node_modules/lucide-react": {
+ "version": "0.563.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/lucide-react/-/lucide-react-0.563.0.tgz",
+ "integrity":
"sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/lunr": {
+ "version": "2.3.9",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/lunr/-/lunr-2.3.9.tgz",
+ "integrity":
"sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lunr-languages": {
+ "version": "1.20.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/lunr-languages/-/lunr-languages-1.20.0.tgz",
+ "integrity":
"sha512-3LVgE7ekWXt04NBci/hjm+NXJxXZeRXuyClL0kA0HONyBOjxhP3ZQkuWIM4Ok3pbeptUW/rj3XcJcJuJVPwPYA==",
+ "dev": true,
+ "license": "MPL-1.1"
+ },
+ "node_modules/mark.js": {
+ "version": "8.11.1",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/mark.js/-/mark.js-8.11.1.tgz",
+ "integrity":
"sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/markdown-extensions": {
"version": "2.0.0",
"resolved":
"https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz",
@@ -12940,6 +14053,28 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/open-ask-ai": {
+ "version": "0.7.3",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/open-ask-ai/-/open-ask-ai-0.7.3.tgz",
+ "integrity":
"sha512-UxV0HGds4TEUTKQ4B2Ip2uI0sE4UnKhE8Rj1rjfheOXKKWflpgAMsB+jBbiT648zzUfkuS6MHrMrrF5Ee8RiIA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@radix-ui/react-dialog": "^1.1.3",
+ "@radix-ui/react-scroll-area": "^1.2.2",
+ "@radix-ui/react-slot": "^1.1.1",
+ "lowlight": "^3.3.0",
+ "lucide-react": "^0.563.0",
+ "react-markdown": "^10.1.0",
+ "rehype-highlight": "^7.0.2",
+ "remark-gfm": "^4.0.1"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/opener": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
@@ -13167,6 +14302,19 @@
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
+ "node_modules/parse5-parser-stream": {
+ "version": "7.1.2",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
+ "integrity":
"sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
"node_modules/parse5/node_modules/entities": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
@@ -15100,6 +16248,86 @@
"webpack": ">=4.41.1 || 5.x"
}
},
+ "node_modules/react-markdown": {
+ "version": "10.1.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/react-markdown/-/react-markdown-10.1.0.tgz",
+ "integrity":
"sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "html-url-attributes": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "unified": "^11.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=18",
+ "react": ">=18"
+ }
+ },
+ "node_modules/react-remove-scroll": {
+ "version": "2.7.2",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
+ "integrity":
"sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.7",
+ "react-style-singleton": "^2.2.3",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.3",
+ "use-sidecar": "^1.1.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.8",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
+ "integrity":
"sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "react-style-singleton": "^2.2.2",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/react-router": {
"version": "5.3.4",
"resolved":
"https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz",
@@ -15151,6 +16379,30 @@
"react": ">=15"
}
},
+ "node_modules/react-style-singleton": {
+ "version": "2.2.3",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
+ "integrity":
"sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved":
"https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -15324,6 +16576,25 @@
"regjsparser": "bin/parser"
}
},
+ "node_modules/rehype-highlight": {
+ "version": "7.0.2",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/rehype-highlight/-/rehype-highlight-7.0.2.tgz",
+ "integrity":
"sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-to-text": "^4.0.0",
+ "lowlight": "^3.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/rehype-raw": {
"version": "7.0.0",
"resolved":
"https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz",
@@ -16996,6 +18267,16 @@
"integrity":
"sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
"license": "MIT"
},
+ "node_modules/undici": {
+ "version": "7.26.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/undici/-/undici-7.26.0.tgz",
+ "integrity":
"sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.18.1"
+ }
+ },
"node_modules/undici-types": {
"version": "7.16.0",
"resolved":
"https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
@@ -17085,6 +18366,22 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/unist-util-find-after": {
+ "version": "5.0.0",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz",
+ "integrity":
"sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/unist-util-is": {
"version": "6.0.1",
"resolved":
"https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
@@ -17394,6 +18691,53 @@
"url": "https://opencollective.com/webpack"
}
},
+ "node_modules/use-callback-ref": {
+ "version": "1.3.3",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
+ "integrity":
"sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.1.3",
+ "resolved":
"https://nexus-proxy.repo.local.sfdc.net/nexus/content/groups/npm-all/use-sidecar/-/use-sidecar-1.1.3.tgz",
+ "integrity":
"sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved":
"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
diff --git a/package.json b/package.json
index d5672ee6af..91461fb960 100644
--- a/package.json
+++ b/package.json
@@ -32,6 +32,7 @@
"@docusaurus/module-type-aliases": "3.8.1",
"@docusaurus/tsconfig": "3.8.1",
"@docusaurus/types": "3.8.1",
+ "@easyops-cn/docusaurus-search-local": "^0.54.1",
"string-replace-loader": "^3.2.0",
"typescript": "~5.6.2",
"unist-util-visit": "^5.0.0"
diff --git a/pages/release-notes/9.5.0.md b/pages/release-notes/9.5.0.md
index 4be1010299..49bb196ae6 100644
--- a/pages/release-notes/9.5.0.md
+++ b/pages/release-notes/9.5.0.md
@@ -4137,3 +4137,11 @@ Added a paired terminal/chat workflow for triaging
SonarCloud findings on a sour
- **Legacy TSV-export workflow** under `scripts/README_SONARQUBE.md` is
preserved for batch categorization but is no longer the primary path.
See `.cursor/commands/sonarqube.md` and the `5.2. SonarQube Script` section in
`AGENTS.md` for the full reference.
+
+#### Doc-site local build/publish flow + Docusaurus search swap (TODO-71)
+
+Two paired changes that retire the push-triggered GitHub Action for the docs
site in favor of explicit local scripts, and replace the Algolia DocSearch
integration with a self-contained client-side search index.
+
+- **Local build/publish flow.** Doc-site builds are now run locally via
`juneau-docs/scripts/build-docs.py`; the push-triggered
`juneau/.github/workflows/deploy-docs.yml.disabled` workflow has been removed.
Publishing is split across `release-docs-stage.py` (build + push to the
`asf-staging` branch, surfaced at `https://juneau.staged.apache.org`) and
`release-docs.py` (promote `asf-staging` → `asf-site`, surfaced at
`https://juneau.apache.org`). Both release scripts now refuse to run unl [...]
+
+- **Search swap — Algolia → `@easyops-cn/docusaurus-search-local`.** The
previous Algolia DocSearch integration crawled the deployed site (and therefore
lagged behind `master`); the replacement plugin builds the search index at
site-build time so it is always in sync with what was just deployed. No
external service dependency and no API-key management. Configuration lives in
`juneau-docs/docusaurus.config.ts` as a top-level `themes:
[['@easyops-cn/docusaurus-search-local', { hashed: true [...]
diff --git a/scripts/build-docs.py b/scripts/build-docs.py
index d934786c5b..ccfc5b2d6a 100755
--- a/scripts/build-docs.py
+++ b/scripts/build-docs.py
@@ -30,11 +30,15 @@ Steps performed:
Usage:
python3 scripts/build-docs.py [--skip-npm] [--skip-maven] [--skip-copy]
+ [--staging] [--dry-run] [--verbose]
Options:
--skip-npm Skip npm install and Docusaurus build
--skip-maven Skip Maven compilation and site generation
--skip-copy Skip copying Maven site to static directory
+ --staging Build for staging (sets SITE_URL to
juneau.staged.apache.org)
+ --dry-run Print the commands that would run; perform no work
+ --verbose Print full per-stage banner output (default: one line per
stage)
"""
import argparse
@@ -47,28 +51,34 @@ from datetime import datetime
from pathlib import Path
-def find_master_branch_sibling(script_dir):
+def find_master_branch_sibling(script_dir, allow_missing=False):
"""
Find the master branch sibling folder.
-
+
The docs branch and master branch should be sibling folders:
- /git/apache/juneau/docs/
- /git/apache/juneau/master/
-
+
Args:
script_dir: Path to the scripts directory (should be in docs/scripts)
-
+ allow_missing: If True (e.g. during --dry-run), return the expected
path
+ even when it doesn't exist instead of aborting.
+
Returns:
Path to the master branch folder
-
+
Raises:
- SystemExit: If the master branch sibling folder doesn't exist
+ SystemExit: If the master branch sibling folder doesn't exist and
+ allow_missing is False.
"""
# Get the parent of the docs folder (should be /git/apache/juneau/)
docs_dir = script_dir.parent # docs/
parent_dir = docs_dir.parent # /git/apache/juneau/
master_dir = parent_dir / 'master'
-
+
+ if allow_missing:
+ return master_dir
+
if not master_dir.exists():
print(f"ERROR: Master branch sibling folder not found at {master_dir}")
print(f"Expected structure:")
@@ -83,9 +93,27 @@ def find_master_branch_sibling(script_dir):
return master_dir
+# Module-level toggle flipped from main() so every run_command/stage_banner
sees the choice.
+DRY_RUN = False
+VERBOSE = False
+
+
+def stage_banner(title):
+ """Emit a stage header. Verbose mode keeps the full banner; default mode
prints one line."""
+ if VERBOSE:
+ print(f"\n=== {title} ===")
+ else:
+ print(f"-> {title}")
+
+
def run_command(cmd, cwd=None, check=True, env=None):
- """Run a shell command and return the result."""
- print(f"Running: {' '.join(cmd)}")
+ """Run a shell command and return the result. Honors DRY_RUN."""
+ cmd_str = ' '.join(cmd)
+ if DRY_RUN:
+ loc = f" (in {cwd})" if cwd else ""
+ print(f"[dry-run] would run: {cmd_str}{loc}")
+ return None
+ print(f"Running: {cmd_str}")
if cwd:
print(f" (in directory: {cwd})")
result = subprocess.run(cmd, cwd=cwd, check=check, capture_output=False,
env=env)
@@ -115,36 +143,41 @@ def check_prerequisites():
def install_npm_dependencies(docs_dir):
"""Install npm dependencies for Docusaurus."""
- print("\n=== Installing npm dependencies ===")
+ stage_banner("Installing npm dependencies")
run_command(['npm', 'ci'], cwd=docs_dir)
def build_docusaurus(docs_dir, staging=False):
"""Build Docusaurus documentation."""
- print("\n=== Building Docusaurus ===")
+ stage_banner("Building Docusaurus")
env = os.environ.copy()
if staging:
env['SITE_URL'] = 'https://juneau.staged.apache.org'
- print(" Setting SITE_URL for staging build")
+ if VERBOSE:
+ print(" Setting SITE_URL for staging build")
run_command(['npm', 'run', 'build'], cwd=docs_dir, env=env)
def compile_java_modules(master_root):
"""Compile and install all Java modules to local repository."""
- print("\n=== Compiling and installing Java modules ===")
+ stage_banner("Compiling and installing Java modules")
run_command(['mvn', 'clean', 'install', '-DskipTests'], cwd=master_root)
def generate_maven_site(master_root):
"""Generate Maven site."""
- print("\n=== Generating Maven site ===")
+ stage_banner("Generating Maven site")
run_command(['mvn', 'site', '-DskipTests'], cwd=master_root)
def copy_maven_site(master_root, docs_dir):
"""Copy Maven site to static directory (Docusaurus will copy it to
build)."""
- print("\n=== Copying Maven site to static directory ===")
-
+ stage_banner("Copying Maven site to static directory")
+
source_site = Path(master_root) / 'target' / 'site'
static_dir = Path(docs_dir) / 'static'
static_site = static_dir / 'site'
-
+
+ if DRY_RUN:
+ print(f"[dry-run] would copy {source_site} -> {static_site}")
+ return
+
if not source_site.exists():
print(f"ERROR: Maven site not found at {source_site}")
sys.exit(1)
@@ -161,8 +194,11 @@ def copy_maven_site(master_root, docs_dir):
def verify_apidocs(master_root):
"""Verify that apidocs were generated."""
- print("\n=== Verifying apidocs generation ===")
-
+ stage_banner("Verifying apidocs generation")
+ if DRY_RUN:
+ print("[dry-run] would verify apidocs at target/site/apidocs")
+ return
+
apidocs_dir = Path(master_root) / 'target' / 'site' / 'apidocs'
if not apidocs_dir.exists():
@@ -205,8 +241,11 @@ def get_current_release(master_root):
def copy_current_javadocs(master_root, docs_dir):
"""Copy current javadocs to versioned folder and update JSON index."""
- print("\n=== Copying current javadocs to versioned folder ===")
-
+ stage_banner("Copying current javadocs to versioned folder")
+ if DRY_RUN:
+ print("[dry-run] would copy target/site/apidocs to
static/javadocs/<version>")
+ return
+
# Get current release version
current_version = get_current_release(master_root)
if not current_version:
@@ -236,7 +275,7 @@ def copy_current_javadocs(master_root, docs_dir):
def update_javadocs_json(docs_dir, current_version):
"""Update or create JSON file with javadoc release information."""
- print("\n=== Updating javadocs release index ===")
+ stage_banner("Updating javadocs release index")
javadocs_dir = Path(docs_dir) / 'static' / 'javadocs'
json_file = javadocs_dir / 'releases.json'
@@ -294,7 +333,7 @@ def update_javadocs_json(docs_dir, current_version):
def check_topic_links(master_root, docs_dir):
"""Run the topic link checker to validate documentation links."""
- print("\n=== Checking topic links ===")
+ stage_banner("Checking topic links")
# Use the checker script from docs/scripts (it's already there)
script_dir = Path(__file__).parent
checker_script = script_dir / 'check-topic-links.py'
@@ -309,7 +348,7 @@ def check_topic_links(master_root, docs_dir):
def check_ai_artifacts(docs_dir):
"""Run AI artifact drift checks."""
- print("\n=== Checking AI artifacts ===")
+ stage_banner("Checking AI artifacts")
script_dir = Path(__file__).parent
checker_script = script_dir / 'check-ai-artifacts.py'
if not checker_script.exists():
@@ -318,35 +357,49 @@ def check_ai_artifacts(docs_dir):
run_command(['python3', str(checker_script)], cwd=docs_dir)
def main():
+ global DRY_RUN, VERBOSE
+
parser = argparse.ArgumentParser(description='Build Apache Juneau
documentation')
parser.add_argument('--skip-npm', action='store_true', help='Skip npm
install and Docusaurus build')
parser.add_argument('--skip-maven', action='store_true', help='Skip Maven
compilation and site generation')
parser.add_argument('--skip-copy', action='store_true', help='Skip copying
Maven site to static directory')
parser.add_argument('--staging', action='store_true', help='Build for
staging (sets SITE_URL to juneau.staged.apache.org)')
-
+ parser.add_argument('--dry-run', action='store_true', help='Print every
command/copy that would run; perform no work')
+ parser.add_argument('--verbose', action='store_true', help='Print full
per-stage banner output (default: one line per stage)')
+
args = parser.parse_args()
-
+ DRY_RUN = args.dry_run
+ VERBOSE = args.verbose
+
# Determine script directory and find master branch sibling
script_dir = Path(__file__).parent.absolute()
docs_dir = script_dir.parent # docs/
- master_root = find_master_branch_sibling(script_dir)
+ master_root = find_master_branch_sibling(script_dir, allow_missing=DRY_RUN)
print(f"Master branch root: {master_root}")
print(f"Docs directory: {docs_dir}")
-
+ if DRY_RUN:
+ print("DRY-RUN: no commands will be executed")
+
# Check prerequisites
- check_prerequisites()
-
+ if DRY_RUN:
+ print("[dry-run] would check prerequisites (node, npm, mvn, java)")
+ else:
+ check_prerequisites()
+
# Change to docs directory for npm operations
os.chdir(docs_dir)
# Delete build directory to ensure fresh build
build_dir = Path(docs_dir) / 'build'
if build_dir.exists():
- print(f"\n=== Cleaning build directory ===")
- print(f"Removing {build_dir}")
- shutil.rmtree(build_dir)
- print("✓ Build directory cleaned")
+ stage_banner("Cleaning build directory")
+ if DRY_RUN:
+ print(f"[dry-run] would remove {build_dir}")
+ else:
+ print(f"Removing {build_dir}")
+ shutil.rmtree(build_dir)
+ print("✓ Build directory cleaned")
try:
# Install npm dependencies (can be done early)
@@ -386,17 +439,32 @@ def main():
if not args.skip_copy:
build_dir = Path(docs_dir) / 'build'
asf_yaml = Path(master_root) / '.asf.yaml'
- if asf_yaml.exists() and build_dir.exists():
- print(f"\n=== Copying .asf.yaml to build directory ===")
+ if DRY_RUN:
+ stage_banner("Copying .asf.yaml to build directory")
+ print(f"[dry-run] would copy {asf_yaml} ->
{build_dir}/.asf.yaml")
+ elif asf_yaml.exists() and build_dir.exists():
+ stage_banner("Copying .asf.yaml to build directory")
shutil.copy2(asf_yaml, build_dir)
-
+
# Check topic links (runs once at the end)
check_topic_links(master_root, docs_dir)
check_ai_artifacts(docs_dir)
-
+
print("\n=== Documentation build complete ===")
print(f"Documentation is available in: {docs_dir / 'build'}")
-
+
+ # Publish reminder — only when this was a real, complete build
+ # (no skips, not a dry-run). Skipped runs are typically
partial/iterative
+ # and the reminder would be misleading.
+ any_skip = args.skip_npm or args.skip_maven or args.skip_copy
+ if not DRY_RUN and not any_skip:
+ print()
+ print("Next step — publish:")
+ print(" python3 scripts/release-docs-stage.py #
deploy to asf-staging")
+ print(" python3 scripts/release-docs-stage.py --no-push #
rehearse without pushing")
+ print("Then, after eyeballing https://juneau.staged.apache.org:")
+ print(" python3 scripts/release-docs.py #
promote asf-staging -> asf-site (LIVE)")
+
except subprocess.CalledProcessError as e:
print(f"\nERROR: Command failed with exit code {e.returncode}")
sys.exit(1)
diff --git a/scripts/release-docs-stage.py b/scripts/release-docs-stage.py
index 7006fa4669..d5439819c0 100755
--- a/scripts/release-docs-stage.py
+++ b/scripts/release-docs-stage.py
@@ -38,6 +38,36 @@ import sys
import webbrowser
from pathlib import Path
+# Identity guard — required for any push to ASF.
+REQUIRED_GIT_EMAIL = "[email protected]"
+
+
+def verify_apache_identity(repo_dir):
+ """Refuse to proceed unless git is configured with the ASF committer
identity."""
+ try:
+ result = subprocess.run(
+ ["git", "config", "--get", "user.email"],
+ cwd=repo_dir,
+ capture_output=True,
+ text=True,
+ check=False,
+ )
+ email = result.stdout.strip()
+ except Exception as e:
+ print(f"❌ ERROR: Could not read git user.email: {e}")
+ return False
+
+ if email != REQUIRED_GIT_EMAIL:
+ print("❌ ERROR: Git identity is not the ASF committer identity.")
+ print(f" Found: user.email = '{email or '(unset)'}'")
+ print(f" Required: user.email = '{REQUIRED_GIT_EMAIL}'")
+ print("")
+ print(" Fix (this script cannot mutate git config):")
+ print(f" git config user.email {REQUIRED_GIT_EMAIL}")
+ print(' git config user.name "James Bognar"')
+ return False
+ return True
+
def run_command(cmd, cwd=None, check=True, description=None):
"""Run a shell command and handle errors."""
@@ -180,9 +210,16 @@ def main():
print("Release Documentation to Staging Branch")
print("=" * 79)
print()
-
+
+ # Step 0: Identity guard — must hold before any work begins.
+ print("Step 0: Verifying git identity (apache.org email)...")
+ if not verify_apache_identity(docs_dir):
+ play_sound(success=False)
+ sys.exit(1)
+ print("✅ Git identity verified")
+
# Step 1: Run build-docs.py with --staging flag
- print("Step 1: Building documentation for staging...")
+ print("\nStep 1: Building documentation for staging...")
build_script = script_dir / 'build-docs.py'
if not build_script.exists():
print(f"❌ ERROR: {build_script} not found")
diff --git a/scripts/release-docs.py b/scripts/release-docs.py
index 45e401e8ed..ea1dd6022d 100755
--- a/scripts/release-docs.py
+++ b/scripts/release-docs.py
@@ -37,6 +37,36 @@ import subprocess
import sys
from pathlib import Path
+# Identity guard — required for any push to ASF.
+REQUIRED_GIT_EMAIL = "[email protected]"
+
+
+def verify_apache_identity(repo_dir):
+ """Refuse to proceed unless git is configured with the ASF committer
identity."""
+ try:
+ result = subprocess.run(
+ ["git", "config", "--get", "user.email"],
+ cwd=repo_dir,
+ capture_output=True,
+ text=True,
+ check=False,
+ )
+ email = result.stdout.strip()
+ except Exception as e:
+ print(f"❌ ERROR: Could not read git user.email: {e}")
+ return False
+
+ if email != REQUIRED_GIT_EMAIL:
+ print("❌ ERROR: Git identity is not the ASF committer identity.")
+ print(f" Found: user.email = '{email or '(unset)'}'")
+ print(f" Required: user.email = '{REQUIRED_GIT_EMAIL}'")
+ print("")
+ print(" Fix (this script cannot mutate git config):")
+ print(f" git config user.email {REQUIRED_GIT_EMAIL}")
+ print(' git config user.name "James Bognar"')
+ return False
+ return True
+
def run_command(cmd, cwd=None, check=True, description=None):
"""Run a shell command and handle errors."""
@@ -175,7 +205,14 @@ def main():
print("⚠️ WARNING: This will promote documentation from asf-staging to
asf-site,")
print(" making it live on the production website.")
print()
-
+
+ # Step 0: Identity guard — must hold before any work begins.
+ print("Step 0: Verifying git identity (apache.org email)...")
+ if not verify_apache_identity(docs_dir):
+ sys.exit(1)
+ print("✅ Git identity verified")
+ print()
+
# Get git remote URL
remote_url = get_git_remote_url()
if not remote_url: