From 84fbb008a41f81b395555ab447246fa2439b210c Mon Sep 17 00:00:00 2001 From: Yurii Palamarchuk Date: Tue, 28 Apr 2026 12:18:50 +0200 Subject: [PATCH 1/4] HBASE-30127 Improve Website's SEO --- hbase-website/README.md | 6 +- hbase-website/app/routes.ts | 3 +- hbase-website/app/routes/404.tsx | 57 +++++++ hbase-website/package-lock.json | 160 ++++++++++++++++-- hbase-website/package.json | 6 +- hbase-website/public/robots.txt | 5 + hbase-website/public/sitemap.xml | 1 + hbase-website/scripts/generate-sitemap.ts | 120 +++++++++++++ .../unit-tests/generate-sitemap.test.ts | 90 ++++++++++ 9 files changed, 432 insertions(+), 16 deletions(-) create mode 100644 hbase-website/app/routes/404.tsx create mode 100644 hbase-website/public/robots.txt create mode 100644 hbase-website/public/sitemap.xml create mode 100644 hbase-website/scripts/generate-sitemap.ts create mode 100644 hbase-website/unit-tests/generate-sitemap.test.ts diff --git a/hbase-website/README.md b/hbase-website/README.md index a67a85699757..020bccef96fa 100644 --- a/hbase-website/README.md +++ b/hbase-website/README.md @@ -476,16 +476,18 @@ When you run `mvn site`, the website module automatically: - `npm run extract-hbase-config` - Extract data from `hbase-default.xml` to `app/pages/_docs/docs/_mdx/(multi-page)/configuration/hbase-default.md` - `npm run extract-hbase-version` - Extract version from root `pom.xml` to `app/lib/export-pdf/hbase-version.json` - `npm run test:unit:run` - Vitest unit tests - - `npm run test:e2e` - Playwright e2e tests - `npm run build` - Production build + - `npm run generate-sitemap` - Generates `public/sitemap.xml` and `build/client/sitemap.xml` + - `npm run test:e2e` - Playwright e2e tests `npm run ci-skip-tests` executes: - `npm run extract-developers` - Extract developers from parent pom.xml - `npm run extract-hbase-config` - Extract data from `hbase-default.xml` to `app/pages/_docs/docs/_mdx/(multi-page)/configuration/hbase-default.md` - `npm run extract-hbase-version` - Extract version from root `pom.xml` to `app/lib/export-pdf/hbase-version.json` + - `npm run build` - Production build + - `npm run generate-sitemap` - Generates `public/sitemap.xml` and `build/client/sitemap.xml` - `npx playwright install` - Installs Playwright browsers - `npm run export-pdf` - Generates docs PDF assets through Playwright - - `npm run build` - Production build 6. **Build Output**: Generated files are in `build/` directory diff --git a/hbase-website/app/routes.ts b/hbase-website/app/routes.ts index e66051c7f16d..18311ce3aea9 100644 --- a/hbase-website/app/routes.ts +++ b/hbase-website/app/routes.ts @@ -32,7 +32,8 @@ export default [ route("source-repository", "routes/_landing/source-repository.tsx"), route("acid-semantics", "routes/_landing/acid-semantics.tsx"), route("news", "routes/_landing/news.tsx"), - route("export-control", "routes/_landing/export-control.tsx") + route("export-control", "routes/_landing/export-control.tsx"), + route("404", "routes/404.tsx") ]), // Docs layout("./pages/_docs/docs-layout.tsx", [route("docs/*", "routes/_docs/docs.tsx")]), diff --git a/hbase-website/app/routes/404.tsx b/hbase-website/app/routes/404.tsx new file mode 100644 index 000000000000..159b7f8518fb --- /dev/null +++ b/hbase-website/app/routes/404.tsx @@ -0,0 +1,57 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import type { Route } from "./+types/404"; +import { Link } from "@/components/link"; +import { Button } from "@/ui/button"; + +export function meta({}: Route.MetaArgs) { + return [ + { title: "Page Not Found - Apache HBase" }, + { + name: "description", + content: + "The page you are looking for does not exist. The route you were trying to visit might have changed." + }, + { name: "robots", content: "noindex, nofollow" } + ]; +} + +export default function NotFound() { + return ( +
+
+

+ 404 +

+

+ Page not found +

+

+ The page you are looking for doesn't exist. The route you were trying to visit might + have changed. +

+
+ +
+
+
+ ); +} diff --git a/hbase-website/package-lock.json b/hbase-website/package-lock.json index 79b3260fa8de..5f78220a269c 100644 --- a/hbase-website/package-lock.json +++ b/hbase-website/package-lock.json @@ -22,7 +22,7 @@ "@radix-ui/react-presence": "^1.1.5", "@radix-ui/react-scroll-area": "1.2.2", "@radix-ui/react-separator": "1.1.1", - "@radix-ui/react-slot": "*", + "@radix-ui/react-slot": "latest", "@radix-ui/react-tabs": "1.1.2", "@radix-ui/react-tooltip": "1.1.6", "@react-router/node": "^7.12.0", @@ -49,6 +49,7 @@ "remark-gfm": "^4.0.1", "remark-math": "^6.0.0", "scroll-into-view-if-needed": "^3.1.0", + "sitemap": "^9.0.1", "tailwind-merge": "^2.5.5", "tailwindcss-animate": "^1.0.7" }, @@ -3573,6 +3574,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3586,6 +3588,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3599,6 +3602,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3612,6 +3616,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3625,6 +3630,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3638,6 +3644,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3651,6 +3658,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3664,6 +3672,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3677,6 +3686,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3690,6 +3700,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3703,6 +3714,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3716,6 +3728,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3729,6 +3742,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3742,6 +3756,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3755,6 +3770,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3768,6 +3784,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3781,6 +3798,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3794,6 +3812,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3807,6 +3826,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3820,6 +3840,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3833,6 +3854,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3846,6 +3868,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3859,6 +3882,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3872,6 +3896,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3885,6 +3910,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4582,7 +4608,6 @@ "version": "22.18.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.11.tgz", "integrity": "sha512-Gd33J2XIrXurb+eT2ktze3rJAfAp9ZNjlBdh4SVgyrKEOADwCbdUDaK7QgJno8Ue4kcajscsKqu6n8OBG3hhCQ==", - "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -4607,6 +4632,15 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -5490,7 +5524,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, "license": "MIT" }, "node_modules/argparse": { @@ -6650,7 +6683,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "engines": { "node": ">=8" @@ -7849,6 +7882,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -8855,7 +8889,7 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.12.0.tgz", "integrity": "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -10116,7 +10150,7 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "devOptional": true, + "dev": true, "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" @@ -10292,7 +10326,7 @@ "version": "1.30.1", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", - "devOptional": true, + "dev": true, "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -10324,6 +10358,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -10344,6 +10379,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -10363,6 +10399,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "freebsd" @@ -10382,6 +10419,7 @@ "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "linux" @@ -10401,6 +10439,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -10420,6 +10459,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -10439,6 +10479,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -10458,6 +10499,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -10477,6 +10519,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -10496,6 +10539,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -13361,7 +13405,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "devOptional": true, + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" @@ -13499,6 +13543,15 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -13910,6 +13963,40 @@ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true }, + "node_modules/sitemap": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz", + "integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==", + "license": "MIT", + "dependencies": { + "@types/node": "^24.9.2", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.4.1" + }, + "bin": { + "sitemap": "dist/esm/cli.js" + }, + "engines": { + "node": ">=20.19.5", + "npm": ">=10.8.2" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "24.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/sitemap/node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -14445,7 +14532,7 @@ "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "esbuild": "~0.27.0", @@ -14468,6 +14555,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14484,6 +14572,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14500,6 +14589,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14516,6 +14606,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14532,6 +14623,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14548,6 +14640,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14564,6 +14657,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14580,6 +14674,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14596,6 +14691,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14612,6 +14708,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14628,6 +14725,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14644,6 +14742,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14660,6 +14759,7 @@ "cpu": [ "mips64el" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14676,6 +14776,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14692,6 +14793,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14708,6 +14810,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14724,6 +14827,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14740,6 +14844,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14756,6 +14861,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14772,6 +14878,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14788,6 +14895,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14804,6 +14912,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14820,6 +14929,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14836,6 +14946,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14852,6 +14963,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14868,6 +14980,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -14881,7 +14994,7 @@ "version": "0.27.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", - "devOptional": true, + "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -15107,7 +15220,6 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "devOptional": true, "license": "MIT" }, "node_modules/unified": { @@ -15589,6 +15701,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15605,6 +15718,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15621,6 +15735,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15637,6 +15752,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15653,6 +15769,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15669,6 +15786,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15685,6 +15803,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15701,6 +15820,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15717,6 +15837,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15733,6 +15854,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15749,6 +15871,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15765,6 +15888,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15781,6 +15905,7 @@ "cpu": [ "mips64el" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15797,6 +15922,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15813,6 +15939,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15829,6 +15956,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15845,6 +15973,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15861,6 +15990,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15877,6 +16007,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15893,6 +16024,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15909,6 +16041,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15925,6 +16058,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15941,6 +16075,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15957,6 +16092,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15973,6 +16109,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -15989,6 +16126,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ diff --git a/hbase-website/package.json b/hbase-website/package.json index 09fbbb4f10b9..4d43346658c1 100644 --- a/hbase-website/package.json +++ b/hbase-website/package.json @@ -25,11 +25,12 @@ "extract-hbase-config": "node scripts/extract-hbase-config.js", "extract-hbase-version": "node scripts/extract-hbase-version.js", "extract-all": "node scripts/extract-developers.js && node scripts/extract-hbase-config.js && node scripts/extract-hbase-version.js", + "generate-sitemap": "tsx scripts/generate-sitemap.ts", "export-pdf": "playwright test e2e-tests/export-pdf.spec.ts --project=chromium --workers=1", "fumadocs-init": "fumadocs-mdx", "copy-pdf-to-build": "cp -r public/books build/client", - "ci": "npm run extract-all && npm run fumadocs-init && npm run lint && npm run typecheck && npm run test:unit:run && npm run build && npx playwright install && npm run test:e2e && npm run copy-pdf-to-build", - "ci-skip-tests": "npm run extract-all && npm run fumadocs-init && npm run build && npx playwright install && npm run export-pdf && npm run copy-pdf-to-build" + "ci": "npm run extract-all && npm run fumadocs-init && npm run lint && npm run typecheck && npm run test:unit:run && npm run build && npm run generate-sitemap && npx playwright install && npm run test:e2e && npm run copy-pdf-to-build", + "ci-skip-tests": "npm run extract-all && npm run fumadocs-init && npm run build && npm run generate-sitemap && npx playwright install && npm run export-pdf && npm run copy-pdf-to-build" }, "dependencies": { "@hookform/resolvers": "^3.10.0", @@ -75,6 +76,7 @@ "remark-gfm": "^4.0.1", "remark-math": "^6.0.0", "scroll-into-view-if-needed": "^3.1.0", + "sitemap": "^9.0.1", "tailwind-merge": "^2.5.5", "tailwindcss-animate": "^1.0.7" }, diff --git a/hbase-website/public/robots.txt b/hbase-website/public/robots.txt new file mode 100644 index 000000000000..45e9d4886142 --- /dev/null +++ b/hbase-website/public/robots.txt @@ -0,0 +1,5 @@ +User-agent: * +Allow: / +Disallow: /404 + +Sitemap: https://hbase.apache.org/sitemap.xml diff --git a/hbase-website/public/sitemap.xml b/hbase-website/public/sitemap.xml new file mode 100644 index 000000000000..a4a9b7f29385 --- /dev/null +++ b/hbase-website/public/sitemap.xml @@ -0,0 +1 @@ +https://hbase.apache.org/2026-04-28T09:31:52.221Zhttps://hbase.apache.org/acid-semantics/2026-04-28T09:31:52.285Zhttps://hbase.apache.org/book.html2026-04-28T09:31:39.142Zhttps://hbase.apache.org/code-of-conduct/2026-04-28T09:31:52.228Zhttps://hbase.apache.org/docs/2026-04-28T09:31:53.852Zhttps://hbase.apache.org/docs/acl-matrix/2026-04-28T09:31:53.684Zhttps://hbase.apache.org/docs/amv2/2026-04-28T09:31:53.696Zhttps://hbase.apache.org/docs/architecture/2026-04-28T09:31:54.464Zhttps://hbase.apache.org/docs/architecture/bulk-loading/2026-04-28T09:31:54.420Zhttps://hbase.apache.org/docs/architecture/catalog-tables/2026-04-28T09:31:54.425Zhttps://hbase.apache.org/docs/architecture/client-request-filters/2026-04-28T09:31:54.436Zhttps://hbase.apache.org/docs/architecture/client/2026-04-28T09:31:54.442Zhttps://hbase.apache.org/docs/architecture/hbase-mob/2026-04-28T09:31:54.455Zhttps://hbase.apache.org/docs/architecture/hdfs/2026-04-28T09:31:54.460Zhttps://hbase.apache.org/docs/architecture/master/2026-04-28T09:31:54.473Zhttps://hbase.apache.org/docs/architecture/overview/2026-04-28T09:31:54.478Zhttps://hbase.apache.org/docs/architecture/regions/2026-04-28T09:31:54.491Zhttps://hbase.apache.org/docs/architecture/regionserver/2026-04-28T09:31:54.499Zhttps://hbase.apache.org/docs/architecture/snapshot-scanner/2026-04-28T09:31:54.509Zhttps://hbase.apache.org/docs/architecture/timeline-consistent-reads/2026-04-28T09:31:54.516Zhttps://hbase.apache.org/docs/asf/2026-04-28T09:31:53.702Zhttps://hbase.apache.org/docs/backup-restore/2026-04-28T09:31:54.405Zhttps://hbase.apache.org/docs/backup-restore/additional-topics/2026-04-28T09:31:54.385Zhttps://hbase.apache.org/docs/backup-restore/administration/2026-04-28T09:31:54.390Zhttps://hbase.apache.org/docs/backup-restore/commands/2026-04-28T09:31:54.400Zhttps://hbase.apache.org/docs/backup-restore/overview/2026-04-28T09:31:54.410Zhttps://hbase.apache.org/docs/building-and-developing/2026-04-28T09:31:54.337Zhttps://hbase.apache.org/docs/building-and-developing/announcing/2026-04-28T09:31:54.294Zhttps://hbase.apache.org/docs/building-and-developing/building/2026-04-28T09:31:54.300Zhttps://hbase.apache.org/docs/building-and-developing/developer-guidelines/2026-04-28T09:31:54.313Zhttps://hbase.apache.org/docs/building-and-developing/generating-documentation/2026-04-28T09:31:54.318Zhttps://hbase.apache.org/docs/building-and-developing/getting-involved/2026-04-28T09:31:54.322Zhttps://hbase.apache.org/docs/building-and-developing/ides/2026-04-28T09:31:54.333Zhttps://hbase.apache.org/docs/building-and-developing/releasing/2026-04-28T09:31:54.348Zhttps://hbase.apache.org/docs/building-and-developing/repositories/2026-04-28T09:31:54.352Zhttps://hbase.apache.org/docs/building-and-developing/tests/2026-04-28T09:31:54.366Zhttps://hbase.apache.org/docs/building-and-developing/updating-landing/2026-04-28T09:31:54.371Zhttps://hbase.apache.org/docs/building-and-developing/voting/2026-04-28T09:31:54.376Zhttps://hbase.apache.org/docs/bulk-data-generator-tool/2026-04-28T09:31:53.708Zhttps://hbase.apache.org/docs/case-studies/2026-04-28T09:31:53.718Zhttps://hbase.apache.org/docs/community/2026-04-28T09:31:53.723Zhttps://hbase.apache.org/docs/compression/2026-04-28T09:31:53.736Zhttps://hbase.apache.org/docs/configuration/2026-04-28T09:31:54.285Zhttps://hbase.apache.org/docs/configuration/basic-prerequisites/2026-04-28T09:31:54.230Zhttps://hbase.apache.org/docs/configuration/confirm/2026-04-28T09:31:54.239Zhttps://hbase.apache.org/docs/configuration/default/2026-04-28T09:31:54.249Zhttps://hbase.apache.org/docs/configuration/dynamic/2026-04-28T09:31:54.258Zhttps://hbase.apache.org/docs/configuration/example/2026-04-28T09:31:54.264Zhttps://hbase.apache.org/docs/configuration/hbase-run-models/2026-04-28T09:31:54.269Zhttps://hbase.apache.org/docs/configuration/important/2026-04-28T09:31:54.280Zhttps://hbase.apache.org/docs/contributing-to-documentation/2026-04-28T09:31:53.745Zhttps://hbase.apache.org/docs/cp/2026-04-28T09:31:53.761Zhttps://hbase.apache.org/docs/datamodel/2026-04-28T09:31:53.769Zhttps://hbase.apache.org/docs/external-apis/2026-04-28T09:31:53.788Zhttps://hbase.apache.org/docs/faq/2026-04-28T09:31:53.793Zhttps://hbase.apache.org/docs/getting-started/2026-04-28T09:31:53.807Zhttps://hbase.apache.org/docs/hbase-apis/2026-04-28T09:31:53.812Zhttps://hbase.apache.org/docs/hbase-history/2026-04-28T09:31:53.821Zhttps://hbase.apache.org/docs/hbase-incompatibilities/2026-04-28T09:31:53.827Zhttps://hbase.apache.org/docs/hbtop/2026-04-28T09:31:53.837Zhttps://hbase.apache.org/docs/hfile-format/2026-04-28T09:31:53.843Zhttps://hbase.apache.org/docs/inmemory-compaction/2026-04-28T09:31:53.857Zhttps://hbase.apache.org/docs/mapreduce/2026-04-28T09:31:53.865Zhttps://hbase.apache.org/docs/offheap-read-write/2026-04-28T09:31:53.876Zhttps://hbase.apache.org/docs/operational-management/2026-04-28T09:31:54.168Zhttps://hbase.apache.org/docs/operational-management/backup-and-snapshots/2026-04-28T09:31:54.152Zhttps://hbase.apache.org/docs/operational-management/cluster-replication/2026-04-28T09:31:54.164Zhttps://hbase.apache.org/docs/operational-management/metrics-and-monitoring/2026-04-28T09:31:54.175Zhttps://hbase.apache.org/docs/operational-management/node/2026-04-28T09:31:54.186Zhttps://hbase.apache.org/docs/operational-management/region-and-capacity/2026-04-28T09:31:54.193Zhttps://hbase.apache.org/docs/operational-management/running-multiple-workloads-on-a-single-cluster/2026-04-28T09:31:54.204Zhttps://hbase.apache.org/docs/operational-management/table-rename/2026-04-28T09:31:54.208Zhttps://hbase.apache.org/docs/operational-management/tools/2026-04-28T09:31:54.225Zhttps://hbase.apache.org/docs/orca/2026-04-28T09:31:53.880Zhttps://hbase.apache.org/docs/other-info/2026-04-28T09:31:53.890Zhttps://hbase.apache.org/docs/performance/2026-04-28T09:31:53.899Zhttps://hbase.apache.org/docs/profiler/2026-04-28T09:31:53.909Zhttps://hbase.apache.org/docs/protobuf/2026-04-28T09:31:53.914Zhttps://hbase.apache.org/docs/pv2/2026-04-28T09:31:53.920Zhttps://hbase.apache.org/docs/regionserver-sizing/2026-04-28T09:31:53.934Zhttps://hbase.apache.org/docs/rpc/2026-04-28T09:31:53.938Zhttps://hbase.apache.org/docs/schema-design/2026-04-28T09:31:53.948Zhttps://hbase.apache.org/docs/security/2026-04-28T09:31:54.120Zhttps://hbase.apache.org/docs/security/client-access/2026-04-28T09:31:54.080Zhttps://hbase.apache.org/docs/security/data-access/2026-04-28T09:31:54.101Zhttps://hbase.apache.org/docs/security/example/2026-04-28T09:31:54.111Zhttps://hbase.apache.org/docs/security/hdfs-and-zookeeper-access/2026-04-28T09:31:54.115Zhttps://hbase.apache.org/docs/security/tls/2026-04-28T09:31:54.132Zhttps://hbase.apache.org/docs/security/user-access/2026-04-28T09:31:54.137Zhttps://hbase.apache.org/docs/security/web-ui/2026-04-28T09:31:54.146Zhttps://hbase.apache.org/docs/shell/2026-04-28T09:31:53.956Zhttps://hbase.apache.org/docs/single-page/2026-04-28T09:31:53.675Zhttps://hbase.apache.org/docs/spark/2026-04-28T09:31:53.969Zhttps://hbase.apache.org/docs/sql/2026-04-28T09:31:53.973Zhttps://hbase.apache.org/docs/store-file-tracking/2026-04-28T09:31:53.983Zhttps://hbase.apache.org/docs/sync-replication/2026-04-28T09:31:53.988Zhttps://hbase.apache.org/docs/thrift-filter-language/2026-04-28T09:31:53.997Zhttps://hbase.apache.org/docs/tracing/2026-04-28T09:31:54.002Zhttps://hbase.apache.org/docs/troubleshooting/2026-04-28T09:31:54.016Zhttps://hbase.apache.org/docs/unit-testing/2026-04-28T09:31:54.023Zhttps://hbase.apache.org/docs/upgrading/2026-04-28T09:31:54.043Zhttps://hbase.apache.org/docs/upgrading/paths/2026-04-28T09:31:54.054Zhttps://hbase.apache.org/docs/upgrading/rollback/2026-04-28T09:31:54.059Zhttps://hbase.apache.org/docs/upgrading/rolling/2026-04-28T09:31:54.068Zhttps://hbase.apache.org/docs/upgrading/version-number/2026-04-28T09:31:54.073Zhttps://hbase.apache.org/docs/ycsb/2026-04-28T09:31:54.028Zhttps://hbase.apache.org/docs/zookeeper/2026-04-28T09:31:54.039Zhttps://hbase.apache.org/downloads/2026-04-28T09:31:52.236Zhttps://hbase.apache.org/export-control/2026-04-28T09:31:52.298Zhttps://hbase.apache.org/mailing-lists/2026-04-28T09:31:52.241Zhttps://hbase.apache.org/news/2026-04-28T09:31:52.293Zhttps://hbase.apache.org/other-resources/2026-04-28T09:31:52.269Zhttps://hbase.apache.org/powered-by-hbase/2026-04-28T09:31:52.264Zhttps://hbase.apache.org/source-repository/2026-04-28T09:31:52.280Zhttps://hbase.apache.org/sponsors/2026-04-28T09:31:52.256Zhttps://hbase.apache.org/team/2026-04-28T09:31:52.252Z \ No newline at end of file diff --git a/hbase-website/scripts/generate-sitemap.ts b/hbase-website/scripts/generate-sitemap.ts new file mode 100644 index 000000000000..0caa6b00a722 --- /dev/null +++ b/hbase-website/scripts/generate-sitemap.ts @@ -0,0 +1,120 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import { access, glob, readFile, stat, writeFile } from "node:fs/promises"; +import { join } from "node:path"; +import { fileURLToPath } from "node:url"; +import { SitemapStream, streamToPromise } from "sitemap"; + +const ROOT = join(import.meta.dirname, ".."); +const PUBLIC_DIR = join(ROOT, "public"); +const BUILD_DIR = join(ROOT, "build", "client"); +const PUBLIC_SITEMAP_PATH = join(PUBLIC_DIR, "sitemap.xml"); +const BUILD_SITEMAP_PATH = join(BUILD_DIR, "sitemap.xml"); +const SITE_URL = "https://hbase.apache.org"; + +const EXCLUDED_HTML_PATHS = new Set(["404/index.html", "__spa-fallback.html"]); + +const REDIRECT_PAGE_PATTERNS = [ + /window\.location\.replace\(/i, + /http-equiv=["']refresh/i, + />Redirecting to .*?If it does not happen automatically,/is +]; + +interface SitemapEntry { + url: string; + lastmod: string; +} + +export function normalizePath(relativePath: string): string { + return relativePath.replaceAll("\\", "/"); +} + +export function toSiteUrl(relativePath: string): string { + if (relativePath === "index.html") { + return "/"; + } + + if (relativePath.endsWith("/index.html")) { + return `/${relativePath.slice(0, -"/index.html".length)}/`; + } + + return `/${relativePath}`; +} + +export function isRedirectOnlyPage(html: string): boolean { + return REDIRECT_PAGE_PATTERNS.some((pattern) => pattern.test(html)); +} + +export function shouldIncludeInSitemap(relativePath: string, html: string): boolean { + if (EXCLUDED_HTML_PATHS.has(relativePath)) { + return false; + } + + return !isRedirectOnlyPage(html); +} + +export async function collectSitemapEntries(): Promise { + const entries: SitemapEntry[] = []; + + for await (const htmlPath of glob("**/*.html", { cwd: BUILD_DIR })) { + const relativePath = normalizePath(htmlPath); + const filePath = join(BUILD_DIR, relativePath); + const html = await readFile(filePath, "utf8"); + + if (!shouldIncludeInSitemap(relativePath, html)) { + continue; + } + + const { mtime } = await stat(filePath); + + entries.push({ + url: toSiteUrl(relativePath), + lastmod: mtime.toISOString() + }); + } + + entries.sort((left, right) => left.url.localeCompare(right.url)); + return entries; +} + +export async function main() { + await access(BUILD_DIR); + + const entries = await collectSitemapEntries(); + const sitemap = new SitemapStream({ hostname: SITE_URL }); + + for (const entry of entries) { + sitemap.write(entry); + } + + sitemap.end(); + + const xml = (await streamToPromise(sitemap)).toString(); + await Promise.all([writeFile(PUBLIC_SITEMAP_PATH, xml), writeFile(BUILD_SITEMAP_PATH, xml)]); + + console.log( + `Generated sitemap with ${entries.length} URLs at ${PUBLIC_SITEMAP_PATH} and ${BUILD_SITEMAP_PATH}` + ); +} + +const isDirectRun = process.argv[1] === fileURLToPath(import.meta.url); + +if (isDirectRun) { + await main(); +} diff --git a/hbase-website/unit-tests/generate-sitemap.test.ts b/hbase-website/unit-tests/generate-sitemap.test.ts new file mode 100644 index 000000000000..dd773e52436c --- /dev/null +++ b/hbase-website/unit-tests/generate-sitemap.test.ts @@ -0,0 +1,90 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import { describe, expect, it } from "vitest"; +import { + isRedirectOnlyPage, + normalizePath, + shouldIncludeInSitemap, + toSiteUrl +} from "../scripts/generate-sitemap"; + +describe("normalizePath", () => { + it("preserves forward-slash paths", () => { + expect(normalizePath("docs/index.html")).toBe("docs/index.html"); + }); + + it("converts windows separators to forward slashes", () => { + expect(normalizePath("docs\\configuration\\index.html")).toBe("docs/configuration/index.html"); + }); +}); + +describe("toSiteUrl", () => { + it("maps the root index file to slash", () => { + expect(toSiteUrl("index.html")).toBe("/"); + }); + + it("maps nested index files to trailing-slash URLs", () => { + expect(toSiteUrl("docs/configuration/index.html")).toBe("/docs/configuration/"); + }); + + it("preserves non-index html filenames", () => { + expect(toSiteUrl("llms-full.txt.html")).toBe("/llms-full.txt.html"); + }); +}); + +describe("isRedirectOnlyPage", () => { + it("detects javascript redirect pages", () => { + expect(isRedirectOnlyPage('')).toBe(true); + }); + + it("detects meta refresh redirects", () => { + expect(isRedirectOnlyPage('')).toBe( + true + ); + }); + + it("does not flag ordinary html pages", () => { + expect(isRedirectOnlyPage("

Apache HBase

")).toBe(false); + }); +}); + +describe("shouldIncludeInSitemap", () => { + it("excludes explicitly ignored html paths", () => { + expect(shouldIncludeInSitemap("404/index.html", "")).toBe(false); + expect(shouldIncludeInSitemap("__spa-fallback.html", "")).toBe(false); + }); + + it("excludes redirect-only pages even if the path is not prelisted", () => { + expect( + shouldIncludeInSitemap( + "docs/redirect/index.html", + '' + ) + ).toBe(false); + }); + + it("includes normal prerendered pages", () => { + expect( + shouldIncludeInSitemap( + "docs/configuration/index.html", + "

Configuration

" + ) + ).toBe(true); + }); +}); From 175c897e31739cda67b83ffadcf362d5af22f0ee Mon Sep 17 00:00:00 2001 From: Yurii Palamarchuk Date: Tue, 28 Apr 2026 13:09:42 +0200 Subject: [PATCH 2/4] Fix formatting issue --- hbase-website/public/sitemap.xml | 2 +- hbase-website/scripts/generate-sitemap.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hbase-website/public/sitemap.xml b/hbase-website/public/sitemap.xml index a4a9b7f29385..5f61d86d53c6 100644 --- a/hbase-website/public/sitemap.xml +++ b/hbase-website/public/sitemap.xml @@ -1 +1 @@ -https://hbase.apache.org/2026-04-28T09:31:52.221Zhttps://hbase.apache.org/acid-semantics/2026-04-28T09:31:52.285Zhttps://hbase.apache.org/book.html2026-04-28T09:31:39.142Zhttps://hbase.apache.org/code-of-conduct/2026-04-28T09:31:52.228Zhttps://hbase.apache.org/docs/2026-04-28T09:31:53.852Zhttps://hbase.apache.org/docs/acl-matrix/2026-04-28T09:31:53.684Zhttps://hbase.apache.org/docs/amv2/2026-04-28T09:31:53.696Zhttps://hbase.apache.org/docs/architecture/2026-04-28T09:31:54.464Zhttps://hbase.apache.org/docs/architecture/bulk-loading/2026-04-28T09:31:54.420Zhttps://hbase.apache.org/docs/architecture/catalog-tables/2026-04-28T09:31:54.425Zhttps://hbase.apache.org/docs/architecture/client-request-filters/2026-04-28T09:31:54.436Zhttps://hbase.apache.org/docs/architecture/client/2026-04-28T09:31:54.442Zhttps://hbase.apache.org/docs/architecture/hbase-mob/2026-04-28T09:31:54.455Zhttps://hbase.apache.org/docs/architecture/hdfs/2026-04-28T09:31:54.460Zhttps://hbase.apache.org/docs/architecture/master/2026-04-28T09:31:54.473Zhttps://hbase.apache.org/docs/architecture/overview/2026-04-28T09:31:54.478Zhttps://hbase.apache.org/docs/architecture/regions/2026-04-28T09:31:54.491Zhttps://hbase.apache.org/docs/architecture/regionserver/2026-04-28T09:31:54.499Zhttps://hbase.apache.org/docs/architecture/snapshot-scanner/2026-04-28T09:31:54.509Zhttps://hbase.apache.org/docs/architecture/timeline-consistent-reads/2026-04-28T09:31:54.516Zhttps://hbase.apache.org/docs/asf/2026-04-28T09:31:53.702Zhttps://hbase.apache.org/docs/backup-restore/2026-04-28T09:31:54.405Zhttps://hbase.apache.org/docs/backup-restore/additional-topics/2026-04-28T09:31:54.385Zhttps://hbase.apache.org/docs/backup-restore/administration/2026-04-28T09:31:54.390Zhttps://hbase.apache.org/docs/backup-restore/commands/2026-04-28T09:31:54.400Zhttps://hbase.apache.org/docs/backup-restore/overview/2026-04-28T09:31:54.410Zhttps://hbase.apache.org/docs/building-and-developing/2026-04-28T09:31:54.337Zhttps://hbase.apache.org/docs/building-and-developing/announcing/2026-04-28T09:31:54.294Zhttps://hbase.apache.org/docs/building-and-developing/building/2026-04-28T09:31:54.300Zhttps://hbase.apache.org/docs/building-and-developing/developer-guidelines/2026-04-28T09:31:54.313Zhttps://hbase.apache.org/docs/building-and-developing/generating-documentation/2026-04-28T09:31:54.318Zhttps://hbase.apache.org/docs/building-and-developing/getting-involved/2026-04-28T09:31:54.322Zhttps://hbase.apache.org/docs/building-and-developing/ides/2026-04-28T09:31:54.333Zhttps://hbase.apache.org/docs/building-and-developing/releasing/2026-04-28T09:31:54.348Zhttps://hbase.apache.org/docs/building-and-developing/repositories/2026-04-28T09:31:54.352Zhttps://hbase.apache.org/docs/building-and-developing/tests/2026-04-28T09:31:54.366Zhttps://hbase.apache.org/docs/building-and-developing/updating-landing/2026-04-28T09:31:54.371Zhttps://hbase.apache.org/docs/building-and-developing/voting/2026-04-28T09:31:54.376Zhttps://hbase.apache.org/docs/bulk-data-generator-tool/2026-04-28T09:31:53.708Zhttps://hbase.apache.org/docs/case-studies/2026-04-28T09:31:53.718Zhttps://hbase.apache.org/docs/community/2026-04-28T09:31:53.723Zhttps://hbase.apache.org/docs/compression/2026-04-28T09:31:53.736Zhttps://hbase.apache.org/docs/configuration/2026-04-28T09:31:54.285Zhttps://hbase.apache.org/docs/configuration/basic-prerequisites/2026-04-28T09:31:54.230Zhttps://hbase.apache.org/docs/configuration/confirm/2026-04-28T09:31:54.239Zhttps://hbase.apache.org/docs/configuration/default/2026-04-28T09:31:54.249Zhttps://hbase.apache.org/docs/configuration/dynamic/2026-04-28T09:31:54.258Zhttps://hbase.apache.org/docs/configuration/example/2026-04-28T09:31:54.264Zhttps://hbase.apache.org/docs/configuration/hbase-run-models/2026-04-28T09:31:54.269Zhttps://hbase.apache.org/docs/configuration/important/2026-04-28T09:31:54.280Zhttps://hbase.apache.org/docs/contributing-to-documentation/2026-04-28T09:31:53.745Zhttps://hbase.apache.org/docs/cp/2026-04-28T09:31:53.761Zhttps://hbase.apache.org/docs/datamodel/2026-04-28T09:31:53.769Zhttps://hbase.apache.org/docs/external-apis/2026-04-28T09:31:53.788Zhttps://hbase.apache.org/docs/faq/2026-04-28T09:31:53.793Zhttps://hbase.apache.org/docs/getting-started/2026-04-28T09:31:53.807Zhttps://hbase.apache.org/docs/hbase-apis/2026-04-28T09:31:53.812Zhttps://hbase.apache.org/docs/hbase-history/2026-04-28T09:31:53.821Zhttps://hbase.apache.org/docs/hbase-incompatibilities/2026-04-28T09:31:53.827Zhttps://hbase.apache.org/docs/hbtop/2026-04-28T09:31:53.837Zhttps://hbase.apache.org/docs/hfile-format/2026-04-28T09:31:53.843Zhttps://hbase.apache.org/docs/inmemory-compaction/2026-04-28T09:31:53.857Zhttps://hbase.apache.org/docs/mapreduce/2026-04-28T09:31:53.865Zhttps://hbase.apache.org/docs/offheap-read-write/2026-04-28T09:31:53.876Zhttps://hbase.apache.org/docs/operational-management/2026-04-28T09:31:54.168Zhttps://hbase.apache.org/docs/operational-management/backup-and-snapshots/2026-04-28T09:31:54.152Zhttps://hbase.apache.org/docs/operational-management/cluster-replication/2026-04-28T09:31:54.164Zhttps://hbase.apache.org/docs/operational-management/metrics-and-monitoring/2026-04-28T09:31:54.175Zhttps://hbase.apache.org/docs/operational-management/node/2026-04-28T09:31:54.186Zhttps://hbase.apache.org/docs/operational-management/region-and-capacity/2026-04-28T09:31:54.193Zhttps://hbase.apache.org/docs/operational-management/running-multiple-workloads-on-a-single-cluster/2026-04-28T09:31:54.204Zhttps://hbase.apache.org/docs/operational-management/table-rename/2026-04-28T09:31:54.208Zhttps://hbase.apache.org/docs/operational-management/tools/2026-04-28T09:31:54.225Zhttps://hbase.apache.org/docs/orca/2026-04-28T09:31:53.880Zhttps://hbase.apache.org/docs/other-info/2026-04-28T09:31:53.890Zhttps://hbase.apache.org/docs/performance/2026-04-28T09:31:53.899Zhttps://hbase.apache.org/docs/profiler/2026-04-28T09:31:53.909Zhttps://hbase.apache.org/docs/protobuf/2026-04-28T09:31:53.914Zhttps://hbase.apache.org/docs/pv2/2026-04-28T09:31:53.920Zhttps://hbase.apache.org/docs/regionserver-sizing/2026-04-28T09:31:53.934Zhttps://hbase.apache.org/docs/rpc/2026-04-28T09:31:53.938Zhttps://hbase.apache.org/docs/schema-design/2026-04-28T09:31:53.948Zhttps://hbase.apache.org/docs/security/2026-04-28T09:31:54.120Zhttps://hbase.apache.org/docs/security/client-access/2026-04-28T09:31:54.080Zhttps://hbase.apache.org/docs/security/data-access/2026-04-28T09:31:54.101Zhttps://hbase.apache.org/docs/security/example/2026-04-28T09:31:54.111Zhttps://hbase.apache.org/docs/security/hdfs-and-zookeeper-access/2026-04-28T09:31:54.115Zhttps://hbase.apache.org/docs/security/tls/2026-04-28T09:31:54.132Zhttps://hbase.apache.org/docs/security/user-access/2026-04-28T09:31:54.137Zhttps://hbase.apache.org/docs/security/web-ui/2026-04-28T09:31:54.146Zhttps://hbase.apache.org/docs/shell/2026-04-28T09:31:53.956Zhttps://hbase.apache.org/docs/single-page/2026-04-28T09:31:53.675Zhttps://hbase.apache.org/docs/spark/2026-04-28T09:31:53.969Zhttps://hbase.apache.org/docs/sql/2026-04-28T09:31:53.973Zhttps://hbase.apache.org/docs/store-file-tracking/2026-04-28T09:31:53.983Zhttps://hbase.apache.org/docs/sync-replication/2026-04-28T09:31:53.988Zhttps://hbase.apache.org/docs/thrift-filter-language/2026-04-28T09:31:53.997Zhttps://hbase.apache.org/docs/tracing/2026-04-28T09:31:54.002Zhttps://hbase.apache.org/docs/troubleshooting/2026-04-28T09:31:54.016Zhttps://hbase.apache.org/docs/unit-testing/2026-04-28T09:31:54.023Zhttps://hbase.apache.org/docs/upgrading/2026-04-28T09:31:54.043Zhttps://hbase.apache.org/docs/upgrading/paths/2026-04-28T09:31:54.054Zhttps://hbase.apache.org/docs/upgrading/rollback/2026-04-28T09:31:54.059Zhttps://hbase.apache.org/docs/upgrading/rolling/2026-04-28T09:31:54.068Zhttps://hbase.apache.org/docs/upgrading/version-number/2026-04-28T09:31:54.073Zhttps://hbase.apache.org/docs/ycsb/2026-04-28T09:31:54.028Zhttps://hbase.apache.org/docs/zookeeper/2026-04-28T09:31:54.039Zhttps://hbase.apache.org/downloads/2026-04-28T09:31:52.236Zhttps://hbase.apache.org/export-control/2026-04-28T09:31:52.298Zhttps://hbase.apache.org/mailing-lists/2026-04-28T09:31:52.241Zhttps://hbase.apache.org/news/2026-04-28T09:31:52.293Zhttps://hbase.apache.org/other-resources/2026-04-28T09:31:52.269Zhttps://hbase.apache.org/powered-by-hbase/2026-04-28T09:31:52.264Zhttps://hbase.apache.org/source-repository/2026-04-28T09:31:52.280Zhttps://hbase.apache.org/sponsors/2026-04-28T09:31:52.256Zhttps://hbase.apache.org/team/2026-04-28T09:31:52.252Z \ No newline at end of file +https://hbase.apache.org/2026-04-28T11:07:06.686Zhttps://hbase.apache.org/acid-semantics/2026-04-28T11:07:06.749Zhttps://hbase.apache.org/book.html2026-04-28T11:06:53.932Zhttps://hbase.apache.org/code-of-conduct/2026-04-28T11:07:06.693Zhttps://hbase.apache.org/docs/2026-04-28T11:07:08.607Zhttps://hbase.apache.org/docs/acl-matrix/2026-04-28T11:07:08.318Zhttps://hbase.apache.org/docs/amv2/2026-04-28T11:07:08.429Zhttps://hbase.apache.org/docs/architecture/2026-04-28T11:07:09.252Zhttps://hbase.apache.org/docs/architecture/bulk-loading/2026-04-28T11:07:09.202Zhttps://hbase.apache.org/docs/architecture/catalog-tables/2026-04-28T11:07:09.206Zhttps://hbase.apache.org/docs/architecture/client-request-filters/2026-04-28T11:07:09.217Zhttps://hbase.apache.org/docs/architecture/client/2026-04-28T11:07:09.223Zhttps://hbase.apache.org/docs/architecture/hbase-mob/2026-04-28T11:07:09.238Zhttps://hbase.apache.org/docs/architecture/hdfs/2026-04-28T11:07:09.243Zhttps://hbase.apache.org/docs/architecture/master/2026-04-28T11:07:09.256Zhttps://hbase.apache.org/docs/architecture/overview/2026-04-28T11:07:09.265Zhttps://hbase.apache.org/docs/architecture/regions/2026-04-28T11:07:09.274Zhttps://hbase.apache.org/docs/architecture/regionserver/2026-04-28T11:07:09.287Zhttps://hbase.apache.org/docs/architecture/snapshot-scanner/2026-04-28T11:07:09.292Zhttps://hbase.apache.org/docs/architecture/timeline-consistent-reads/2026-04-28T11:07:09.303Zhttps://hbase.apache.org/docs/asf/2026-04-28T11:07:08.443Zhttps://hbase.apache.org/docs/backup-restore/2026-04-28T11:07:09.187Zhttps://hbase.apache.org/docs/backup-restore/additional-topics/2026-04-28T11:07:09.168Zhttps://hbase.apache.org/docs/backup-restore/administration/2026-04-28T11:07:09.173Zhttps://hbase.apache.org/docs/backup-restore/commands/2026-04-28T11:07:09.183Zhttps://hbase.apache.org/docs/backup-restore/overview/2026-04-28T11:07:09.192Zhttps://hbase.apache.org/docs/building-and-developing/2026-04-28T11:07:09.120Zhttps://hbase.apache.org/docs/building-and-developing/announcing/2026-04-28T11:07:09.071Zhttps://hbase.apache.org/docs/building-and-developing/building/2026-04-28T11:07:09.078Zhttps://hbase.apache.org/docs/building-and-developing/developer-guidelines/2026-04-28T11:07:09.091Zhttps://hbase.apache.org/docs/building-and-developing/generating-documentation/2026-04-28T11:07:09.095Zhttps://hbase.apache.org/docs/building-and-developing/getting-involved/2026-04-28T11:07:09.105Zhttps://hbase.apache.org/docs/building-and-developing/ides/2026-04-28T11:07:09.110Zhttps://hbase.apache.org/docs/building-and-developing/releasing/2026-04-28T11:07:09.126Zhttps://hbase.apache.org/docs/building-and-developing/repositories/2026-04-28T11:07:09.135Zhttps://hbase.apache.org/docs/building-and-developing/tests/2026-04-28T11:07:09.144Zhttps://hbase.apache.org/docs/building-and-developing/updating-landing/2026-04-28T11:07:09.153Zhttps://hbase.apache.org/docs/building-and-developing/voting/2026-04-28T11:07:09.158Zhttps://hbase.apache.org/docs/bulk-data-generator-tool/2026-04-28T11:07:08.450Zhttps://hbase.apache.org/docs/case-studies/2026-04-28T11:07:08.456Zhttps://hbase.apache.org/docs/community/2026-04-28T11:07:08.467Zhttps://hbase.apache.org/docs/compression/2026-04-28T11:07:08.477Zhttps://hbase.apache.org/docs/configuration/2026-04-28T11:07:09.062Zhttps://hbase.apache.org/docs/configuration/basic-prerequisites/2026-04-28T11:07:09.008Zhttps://hbase.apache.org/docs/configuration/confirm/2026-04-28T11:07:09.013Zhttps://hbase.apache.org/docs/configuration/default/2026-04-28T11:07:09.027Zhttps://hbase.apache.org/docs/configuration/dynamic/2026-04-28T11:07:09.032Zhttps://hbase.apache.org/docs/configuration/example/2026-04-28T11:07:09.041Zhttps://hbase.apache.org/docs/configuration/hbase-run-models/2026-04-28T11:07:09.047Zhttps://hbase.apache.org/docs/configuration/important/2026-04-28T11:07:09.058Zhttps://hbase.apache.org/docs/contributing-to-documentation/2026-04-28T11:07:08.491Zhttps://hbase.apache.org/docs/cp/2026-04-28T11:07:08.507Zhttps://hbase.apache.org/docs/datamodel/2026-04-28T11:07:08.517Zhttps://hbase.apache.org/docs/external-apis/2026-04-28T11:07:08.538Zhttps://hbase.apache.org/docs/faq/2026-04-28T11:07:08.545Zhttps://hbase.apache.org/docs/getting-started/2026-04-28T11:07:08.559Zhttps://hbase.apache.org/docs/hbase-apis/2026-04-28T11:07:08.570Zhttps://hbase.apache.org/docs/hbase-history/2026-04-28T11:07:08.575Zhttps://hbase.apache.org/docs/hbase-incompatibilities/2026-04-28T11:07:08.586Zhttps://hbase.apache.org/docs/hbtop/2026-04-28T11:07:08.592Zhttps://hbase.apache.org/docs/hfile-format/2026-04-28T11:07:08.602Zhttps://hbase.apache.org/docs/inmemory-compaction/2026-04-28T11:07:08.613Zhttps://hbase.apache.org/docs/mapreduce/2026-04-28T11:07:08.626Zhttps://hbase.apache.org/docs/offheap-read-write/2026-04-28T11:07:08.631Zhttps://hbase.apache.org/docs/operational-management/2026-04-28T11:07:08.940Zhttps://hbase.apache.org/docs/operational-management/backup-and-snapshots/2026-04-28T11:07:08.923Zhttps://hbase.apache.org/docs/operational-management/cluster-replication/2026-04-28T11:07:08.935Zhttps://hbase.apache.org/docs/operational-management/metrics-and-monitoring/2026-04-28T11:07:08.951Zhttps://hbase.apache.org/docs/operational-management/node/2026-04-28T11:07:08.957Zhttps://hbase.apache.org/docs/operational-management/region-and-capacity/2026-04-28T11:07:08.970Zhttps://hbase.apache.org/docs/operational-management/running-multiple-workloads-on-a-single-cluster/2026-04-28T11:07:08.977Zhttps://hbase.apache.org/docs/operational-management/table-rename/2026-04-28T11:07:08.986Zhttps://hbase.apache.org/docs/operational-management/tools/2026-04-28T11:07:08.997Zhttps://hbase.apache.org/docs/orca/2026-04-28T11:07:08.640Zhttps://hbase.apache.org/docs/other-info/2026-04-28T11:07:08.646Zhttps://hbase.apache.org/docs/performance/2026-04-28T11:07:08.658Zhttps://hbase.apache.org/docs/profiler/2026-04-28T11:07:08.663Zhttps://hbase.apache.org/docs/protobuf/2026-04-28T11:07:08.673Zhttps://hbase.apache.org/docs/pv2/2026-04-28T11:07:08.679Zhttps://hbase.apache.org/docs/regionserver-sizing/2026-04-28T11:07:08.693Zhttps://hbase.apache.org/docs/rpc/2026-04-28T11:07:08.699Zhttps://hbase.apache.org/docs/schema-design/2026-04-28T11:07:08.708Zhttps://hbase.apache.org/docs/security/2026-04-28T11:07:08.885Zhttps://hbase.apache.org/docs/security/client-access/2026-04-28T11:07:08.851Zhttps://hbase.apache.org/docs/security/data-access/2026-04-28T11:07:08.866Zhttps://hbase.apache.org/docs/security/example/2026-04-28T11:07:08.871Zhttps://hbase.apache.org/docs/security/hdfs-and-zookeeper-access/2026-04-28T11:07:08.880Zhttps://hbase.apache.org/docs/security/tls/2026-04-28T11:07:08.897Zhttps://hbase.apache.org/docs/security/user-access/2026-04-28T11:07:08.903Zhttps://hbase.apache.org/docs/security/web-ui/2026-04-28T11:07:08.916Zhttps://hbase.apache.org/docs/shell/2026-04-28T11:07:08.718Zhttps://hbase.apache.org/docs/single-page/2026-04-28T11:07:08.300Zhttps://hbase.apache.org/docs/spark/2026-04-28T11:07:08.732Zhttps://hbase.apache.org/docs/sql/2026-04-28T11:07:08.736Zhttps://hbase.apache.org/docs/store-file-tracking/2026-04-28T11:07:08.746Zhttps://hbase.apache.org/docs/sync-replication/2026-04-28T11:07:08.751Zhttps://hbase.apache.org/docs/thrift-filter-language/2026-04-28T11:07:08.760Zhttps://hbase.apache.org/docs/tracing/2026-04-28T11:07:08.765Zhttps://hbase.apache.org/docs/troubleshooting/2026-04-28T11:07:08.779Zhttps://hbase.apache.org/docs/unit-testing/2026-04-28T11:07:08.787Zhttps://hbase.apache.org/docs/upgrading/2026-04-28T11:07:08.812Zhttps://hbase.apache.org/docs/upgrading/paths/2026-04-28T11:07:08.820Zhttps://hbase.apache.org/docs/upgrading/rollback/2026-04-28T11:07:08.829Zhttps://hbase.apache.org/docs/upgrading/rolling/2026-04-28T11:07:08.835Zhttps://hbase.apache.org/docs/upgrading/version-number/2026-04-28T11:07:08.840Zhttps://hbase.apache.org/docs/ycsb/2026-04-28T11:07:08.796Zhttps://hbase.apache.org/docs/zookeeper/2026-04-28T11:07:08.804Zhttps://hbase.apache.org/downloads/2026-04-28T11:07:06.704Zhttps://hbase.apache.org/export-control/2026-04-28T11:07:06.766Zhttps://hbase.apache.org/mailing-lists/2026-04-28T11:07:06.710Zhttps://hbase.apache.org/news/2026-04-28T11:07:06.762Zhttps://hbase.apache.org/other-resources/2026-04-28T11:07:06.738Zhttps://hbase.apache.org/powered-by-hbase/2026-04-28T11:07:06.733Zhttps://hbase.apache.org/source-repository/2026-04-28T11:07:06.744Zhttps://hbase.apache.org/sponsors/2026-04-28T11:07:06.720Zhttps://hbase.apache.org/team/2026-04-28T11:07:06.716Z diff --git a/hbase-website/scripts/generate-sitemap.ts b/hbase-website/scripts/generate-sitemap.ts index 0caa6b00a722..0304dc09acb9 100644 --- a/hbase-website/scripts/generate-sitemap.ts +++ b/hbase-website/scripts/generate-sitemap.ts @@ -105,7 +105,7 @@ export async function main() { sitemap.end(); - const xml = (await streamToPromise(sitemap)).toString(); + const xml = `${(await streamToPromise(sitemap)).toString().trimEnd()}\n`; await Promise.all([writeFile(PUBLIC_SITEMAP_PATH, xml), writeFile(BUILD_SITEMAP_PATH, xml)]); console.log( From c70d9618e2f8322ba4411d5c5f9eaa1ab650fbdc Mon Sep 17 00:00:00 2001 From: Yurii Palamarchuk Date: Wed, 29 Apr 2026 11:03:06 +0200 Subject: [PATCH 3/4] Adopt requested changes --- hbase-website/.gitignore | 1 + hbase-website/package-lock.json | 10 +++++++++- hbase-website/package.json | 2 +- hbase-website/public/sitemap.xml | 1 - pom.xml | 3 +++ 5 files changed, 14 insertions(+), 3 deletions(-) delete mode 100644 hbase-website/public/sitemap.xml diff --git a/hbase-website/.gitignore b/hbase-website/.gitignore index 00909066a6fa..76974dfd2872 100644 --- a/hbase-website/.gitignore +++ b/hbase-website/.gitignore @@ -39,6 +39,7 @@ lerna-debug.log* /app/pages/_docs/docs/_mdx/(multi-page)/configuration/hbase-default.md /app/lib/export-pdf/hbase-version.json /public/books/** +/public/sitemap.xml # Playwright node_modules/ diff --git a/hbase-website/package-lock.json b/hbase-website/package-lock.json index 5f78220a269c..045eae690034 100644 --- a/hbase-website/package-lock.json +++ b/hbase-website/package-lock.json @@ -49,7 +49,6 @@ "remark-gfm": "^4.0.1", "remark-math": "^6.0.0", "scroll-into-view-if-needed": "^3.1.0", - "sitemap": "^9.0.1", "tailwind-merge": "^2.5.5", "tailwindcss-animate": "^1.0.7" }, @@ -85,6 +84,7 @@ "prettier": "^3.6.2", "prettier-plugin-tailwindcss": "^0.6.14", "serve": "^14.2.6", + "sitemap": "^9.0.1", "tailwindcss": "^4.1.13", "tsx": "^4.21.0", "tw-animate-css": "1.3.3", @@ -4608,6 +4608,7 @@ "version": "22.18.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.11.tgz", "integrity": "sha512-Gd33J2XIrXurb+eT2ktze3rJAfAp9ZNjlBdh4SVgyrKEOADwCbdUDaK7QgJno8Ue4kcajscsKqu6n8OBG3hhCQ==", + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -4636,6 +4637,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -5524,6 +5526,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, "license": "MIT" }, "node_modules/argparse": { @@ -13547,6 +13550,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": ">=11.0.0" @@ -13967,6 +13971,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz", "integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "^24.9.2", @@ -13986,6 +13991,7 @@ "version": "24.12.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~7.16.0" @@ -13995,6 +14001,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, "license": "MIT" }, "node_modules/source-map": { @@ -15220,6 +15227,7 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, "license": "MIT" }, "node_modules/unified": { diff --git a/hbase-website/package.json b/hbase-website/package.json index 4d43346658c1..b2bcb7d5b4ca 100644 --- a/hbase-website/package.json +++ b/hbase-website/package.json @@ -76,7 +76,6 @@ "remark-gfm": "^4.0.1", "remark-math": "^6.0.0", "scroll-into-view-if-needed": "^3.1.0", - "sitemap": "^9.0.1", "tailwind-merge": "^2.5.5", "tailwindcss-animate": "^1.0.7" }, @@ -112,6 +111,7 @@ "prettier": "^3.6.2", "prettier-plugin-tailwindcss": "^0.6.14", "serve": "^14.2.6", + "sitemap": "^9.0.1", "tailwindcss": "^4.1.13", "tsx": "^4.21.0", "tw-animate-css": "1.3.3", diff --git a/hbase-website/public/sitemap.xml b/hbase-website/public/sitemap.xml deleted file mode 100644 index 5f61d86d53c6..000000000000 --- a/hbase-website/public/sitemap.xml +++ /dev/null @@ -1 +0,0 @@ -https://hbase.apache.org/2026-04-28T11:07:06.686Zhttps://hbase.apache.org/acid-semantics/2026-04-28T11:07:06.749Zhttps://hbase.apache.org/book.html2026-04-28T11:06:53.932Zhttps://hbase.apache.org/code-of-conduct/2026-04-28T11:07:06.693Zhttps://hbase.apache.org/docs/2026-04-28T11:07:08.607Zhttps://hbase.apache.org/docs/acl-matrix/2026-04-28T11:07:08.318Zhttps://hbase.apache.org/docs/amv2/2026-04-28T11:07:08.429Zhttps://hbase.apache.org/docs/architecture/2026-04-28T11:07:09.252Zhttps://hbase.apache.org/docs/architecture/bulk-loading/2026-04-28T11:07:09.202Zhttps://hbase.apache.org/docs/architecture/catalog-tables/2026-04-28T11:07:09.206Zhttps://hbase.apache.org/docs/architecture/client-request-filters/2026-04-28T11:07:09.217Zhttps://hbase.apache.org/docs/architecture/client/2026-04-28T11:07:09.223Zhttps://hbase.apache.org/docs/architecture/hbase-mob/2026-04-28T11:07:09.238Zhttps://hbase.apache.org/docs/architecture/hdfs/2026-04-28T11:07:09.243Zhttps://hbase.apache.org/docs/architecture/master/2026-04-28T11:07:09.256Zhttps://hbase.apache.org/docs/architecture/overview/2026-04-28T11:07:09.265Zhttps://hbase.apache.org/docs/architecture/regions/2026-04-28T11:07:09.274Zhttps://hbase.apache.org/docs/architecture/regionserver/2026-04-28T11:07:09.287Zhttps://hbase.apache.org/docs/architecture/snapshot-scanner/2026-04-28T11:07:09.292Zhttps://hbase.apache.org/docs/architecture/timeline-consistent-reads/2026-04-28T11:07:09.303Zhttps://hbase.apache.org/docs/asf/2026-04-28T11:07:08.443Zhttps://hbase.apache.org/docs/backup-restore/2026-04-28T11:07:09.187Zhttps://hbase.apache.org/docs/backup-restore/additional-topics/2026-04-28T11:07:09.168Zhttps://hbase.apache.org/docs/backup-restore/administration/2026-04-28T11:07:09.173Zhttps://hbase.apache.org/docs/backup-restore/commands/2026-04-28T11:07:09.183Zhttps://hbase.apache.org/docs/backup-restore/overview/2026-04-28T11:07:09.192Zhttps://hbase.apache.org/docs/building-and-developing/2026-04-28T11:07:09.120Zhttps://hbase.apache.org/docs/building-and-developing/announcing/2026-04-28T11:07:09.071Zhttps://hbase.apache.org/docs/building-and-developing/building/2026-04-28T11:07:09.078Zhttps://hbase.apache.org/docs/building-and-developing/developer-guidelines/2026-04-28T11:07:09.091Zhttps://hbase.apache.org/docs/building-and-developing/generating-documentation/2026-04-28T11:07:09.095Zhttps://hbase.apache.org/docs/building-and-developing/getting-involved/2026-04-28T11:07:09.105Zhttps://hbase.apache.org/docs/building-and-developing/ides/2026-04-28T11:07:09.110Zhttps://hbase.apache.org/docs/building-and-developing/releasing/2026-04-28T11:07:09.126Zhttps://hbase.apache.org/docs/building-and-developing/repositories/2026-04-28T11:07:09.135Zhttps://hbase.apache.org/docs/building-and-developing/tests/2026-04-28T11:07:09.144Zhttps://hbase.apache.org/docs/building-and-developing/updating-landing/2026-04-28T11:07:09.153Zhttps://hbase.apache.org/docs/building-and-developing/voting/2026-04-28T11:07:09.158Zhttps://hbase.apache.org/docs/bulk-data-generator-tool/2026-04-28T11:07:08.450Zhttps://hbase.apache.org/docs/case-studies/2026-04-28T11:07:08.456Zhttps://hbase.apache.org/docs/community/2026-04-28T11:07:08.467Zhttps://hbase.apache.org/docs/compression/2026-04-28T11:07:08.477Zhttps://hbase.apache.org/docs/configuration/2026-04-28T11:07:09.062Zhttps://hbase.apache.org/docs/configuration/basic-prerequisites/2026-04-28T11:07:09.008Zhttps://hbase.apache.org/docs/configuration/confirm/2026-04-28T11:07:09.013Zhttps://hbase.apache.org/docs/configuration/default/2026-04-28T11:07:09.027Zhttps://hbase.apache.org/docs/configuration/dynamic/2026-04-28T11:07:09.032Zhttps://hbase.apache.org/docs/configuration/example/2026-04-28T11:07:09.041Zhttps://hbase.apache.org/docs/configuration/hbase-run-models/2026-04-28T11:07:09.047Zhttps://hbase.apache.org/docs/configuration/important/2026-04-28T11:07:09.058Zhttps://hbase.apache.org/docs/contributing-to-documentation/2026-04-28T11:07:08.491Zhttps://hbase.apache.org/docs/cp/2026-04-28T11:07:08.507Zhttps://hbase.apache.org/docs/datamodel/2026-04-28T11:07:08.517Zhttps://hbase.apache.org/docs/external-apis/2026-04-28T11:07:08.538Zhttps://hbase.apache.org/docs/faq/2026-04-28T11:07:08.545Zhttps://hbase.apache.org/docs/getting-started/2026-04-28T11:07:08.559Zhttps://hbase.apache.org/docs/hbase-apis/2026-04-28T11:07:08.570Zhttps://hbase.apache.org/docs/hbase-history/2026-04-28T11:07:08.575Zhttps://hbase.apache.org/docs/hbase-incompatibilities/2026-04-28T11:07:08.586Zhttps://hbase.apache.org/docs/hbtop/2026-04-28T11:07:08.592Zhttps://hbase.apache.org/docs/hfile-format/2026-04-28T11:07:08.602Zhttps://hbase.apache.org/docs/inmemory-compaction/2026-04-28T11:07:08.613Zhttps://hbase.apache.org/docs/mapreduce/2026-04-28T11:07:08.626Zhttps://hbase.apache.org/docs/offheap-read-write/2026-04-28T11:07:08.631Zhttps://hbase.apache.org/docs/operational-management/2026-04-28T11:07:08.940Zhttps://hbase.apache.org/docs/operational-management/backup-and-snapshots/2026-04-28T11:07:08.923Zhttps://hbase.apache.org/docs/operational-management/cluster-replication/2026-04-28T11:07:08.935Zhttps://hbase.apache.org/docs/operational-management/metrics-and-monitoring/2026-04-28T11:07:08.951Zhttps://hbase.apache.org/docs/operational-management/node/2026-04-28T11:07:08.957Zhttps://hbase.apache.org/docs/operational-management/region-and-capacity/2026-04-28T11:07:08.970Zhttps://hbase.apache.org/docs/operational-management/running-multiple-workloads-on-a-single-cluster/2026-04-28T11:07:08.977Zhttps://hbase.apache.org/docs/operational-management/table-rename/2026-04-28T11:07:08.986Zhttps://hbase.apache.org/docs/operational-management/tools/2026-04-28T11:07:08.997Zhttps://hbase.apache.org/docs/orca/2026-04-28T11:07:08.640Zhttps://hbase.apache.org/docs/other-info/2026-04-28T11:07:08.646Zhttps://hbase.apache.org/docs/performance/2026-04-28T11:07:08.658Zhttps://hbase.apache.org/docs/profiler/2026-04-28T11:07:08.663Zhttps://hbase.apache.org/docs/protobuf/2026-04-28T11:07:08.673Zhttps://hbase.apache.org/docs/pv2/2026-04-28T11:07:08.679Zhttps://hbase.apache.org/docs/regionserver-sizing/2026-04-28T11:07:08.693Zhttps://hbase.apache.org/docs/rpc/2026-04-28T11:07:08.699Zhttps://hbase.apache.org/docs/schema-design/2026-04-28T11:07:08.708Zhttps://hbase.apache.org/docs/security/2026-04-28T11:07:08.885Zhttps://hbase.apache.org/docs/security/client-access/2026-04-28T11:07:08.851Zhttps://hbase.apache.org/docs/security/data-access/2026-04-28T11:07:08.866Zhttps://hbase.apache.org/docs/security/example/2026-04-28T11:07:08.871Zhttps://hbase.apache.org/docs/security/hdfs-and-zookeeper-access/2026-04-28T11:07:08.880Zhttps://hbase.apache.org/docs/security/tls/2026-04-28T11:07:08.897Zhttps://hbase.apache.org/docs/security/user-access/2026-04-28T11:07:08.903Zhttps://hbase.apache.org/docs/security/web-ui/2026-04-28T11:07:08.916Zhttps://hbase.apache.org/docs/shell/2026-04-28T11:07:08.718Zhttps://hbase.apache.org/docs/single-page/2026-04-28T11:07:08.300Zhttps://hbase.apache.org/docs/spark/2026-04-28T11:07:08.732Zhttps://hbase.apache.org/docs/sql/2026-04-28T11:07:08.736Zhttps://hbase.apache.org/docs/store-file-tracking/2026-04-28T11:07:08.746Zhttps://hbase.apache.org/docs/sync-replication/2026-04-28T11:07:08.751Zhttps://hbase.apache.org/docs/thrift-filter-language/2026-04-28T11:07:08.760Zhttps://hbase.apache.org/docs/tracing/2026-04-28T11:07:08.765Zhttps://hbase.apache.org/docs/troubleshooting/2026-04-28T11:07:08.779Zhttps://hbase.apache.org/docs/unit-testing/2026-04-28T11:07:08.787Zhttps://hbase.apache.org/docs/upgrading/2026-04-28T11:07:08.812Zhttps://hbase.apache.org/docs/upgrading/paths/2026-04-28T11:07:08.820Zhttps://hbase.apache.org/docs/upgrading/rollback/2026-04-28T11:07:08.829Zhttps://hbase.apache.org/docs/upgrading/rolling/2026-04-28T11:07:08.835Zhttps://hbase.apache.org/docs/upgrading/version-number/2026-04-28T11:07:08.840Zhttps://hbase.apache.org/docs/ycsb/2026-04-28T11:07:08.796Zhttps://hbase.apache.org/docs/zookeeper/2026-04-28T11:07:08.804Zhttps://hbase.apache.org/downloads/2026-04-28T11:07:06.704Zhttps://hbase.apache.org/export-control/2026-04-28T11:07:06.766Zhttps://hbase.apache.org/mailing-lists/2026-04-28T11:07:06.710Zhttps://hbase.apache.org/news/2026-04-28T11:07:06.762Zhttps://hbase.apache.org/other-resources/2026-04-28T11:07:06.738Zhttps://hbase.apache.org/powered-by-hbase/2026-04-28T11:07:06.733Zhttps://hbase.apache.org/source-repository/2026-04-28T11:07:06.744Zhttps://hbase.apache.org/sponsors/2026-04-28T11:07:06.720Zhttps://hbase.apache.org/team/2026-04-28T11:07:06.716Z diff --git a/pom.xml b/pom.xml index 92e2fab10f97..6a7dfe415c3d 100644 --- a/pom.xml +++ b/pom.xml @@ -2140,6 +2140,9 @@ **/public/old-book-static-files/hbase.css **/public/old-book-static-files/font-awesome.css + + **/public/robots.txt + **/public/sitemap.xml **/*.vm From 71f3e8c8681fde851d36f3336c0b83106195c518 Mon Sep 17 00:00:00 2001 From: Yurii Palamarchuk Date: Wed, 29 Apr 2026 11:15:28 +0200 Subject: [PATCH 4/4] Remove `lastmod` for sitemap --- hbase-website/scripts/generate-sitemap.ts | 8 ++------ pom.xml | 3 +-- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/hbase-website/scripts/generate-sitemap.ts b/hbase-website/scripts/generate-sitemap.ts index 0304dc09acb9..5feb3b89c102 100644 --- a/hbase-website/scripts/generate-sitemap.ts +++ b/hbase-website/scripts/generate-sitemap.ts @@ -16,7 +16,7 @@ // limitations under the License. // -import { access, glob, readFile, stat, writeFile } from "node:fs/promises"; +import { access, glob, readFile, writeFile } from "node:fs/promises"; import { join } from "node:path"; import { fileURLToPath } from "node:url"; import { SitemapStream, streamToPromise } from "sitemap"; @@ -38,7 +38,6 @@ const REDIRECT_PAGE_PATTERNS = [ interface SitemapEntry { url: string; - lastmod: string; } export function normalizePath(relativePath: string): string { @@ -81,11 +80,8 @@ export async function collectSitemapEntries(): Promise { continue; } - const { mtime } = await stat(filePath); - entries.push({ - url: toSiteUrl(relativePath), - lastmod: mtime.toISOString() + url: toSiteUrl(relativePath) }); } diff --git a/pom.xml b/pom.xml index 6a7dfe415c3d..ace848e6361a 100644 --- a/pom.xml +++ b/pom.xml @@ -2140,9 +2140,8 @@ **/public/old-book-static-files/hbase.css **/public/old-book-static-files/font-awesome.css - + **/public/robots.txt - **/public/sitemap.xml **/*.vm