diff --git a/docusaurus/docusaurus.config.ts b/docusaurus/docusaurus.config.ts index 09b53b727d..f256d86ea4 100644 --- a/docusaurus/docusaurus.config.ts +++ b/docusaurus/docusaurus.config.ts @@ -1,6 +1,7 @@ import {themes as prismThemes} from 'prism-react-renderer'; import type {Config} from '@docusaurus/types'; import type * as Preset from '@docusaurus/preset-classic'; +import redirectsList from './redirects' // Sidebar sorting is handled via explicit `_order.ts` files in `docs/`. // This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) @@ -82,6 +83,12 @@ const config: Config = { searchResultContextMaxLength: 40, }, ], + [ + '@docusaurus/plugin-client-redirects', + { + redirects: redirectsList, + } + ] ], themeConfig: { // Replace with your project's social card diff --git a/docusaurus/package-lock.json b/docusaurus/package-lock.json index d95d69eea6..7741cf58ce 100644 --- a/docusaurus/package-lock.json +++ b/docusaurus/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0", "dependencies": { "@docusaurus/core": "3.9.2", + "@docusaurus/plugin-client-redirects": "^3.9.2", "@docusaurus/preset-classic": "3.9.2", "@easyops-cn/docusaurus-search-local": "^0.52.2", "@mdx-js/react": "^3.0.0", @@ -3594,6 +3595,30 @@ "react-dom": "*" } }, + "node_modules/@docusaurus/plugin-client-redirects": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.9.2.tgz", + "integrity": "sha512-lUgMArI9vyOYMzLRBUILcg9vcPTCyyI2aiuXq/4npcMVqOr6GfmwtmBYWSbNMlIUM0147smm4WhpXD0KFboffw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, "node_modules/@docusaurus/plugin-content-blog": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz", @@ -15328,9 +15353,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" diff --git a/docusaurus/package.json b/docusaurus/package.json index 89a7cd7c0f..f0c9f3bb6c 100644 --- a/docusaurus/package.json +++ b/docusaurus/package.json @@ -16,6 +16,7 @@ }, "dependencies": { "@docusaurus/core": "3.9.2", + "@docusaurus/plugin-client-redirects": "^3.9.2", "@docusaurus/preset-classic": "3.9.2", "@easyops-cn/docusaurus-search-local": "^0.52.2", "@mdx-js/react": "^3.0.0", diff --git a/docusaurus/redirects.ts b/docusaurus/redirects.ts new file mode 100644 index 0000000000..34732cf965 --- /dev/null +++ b/docusaurus/redirects.ts @@ -0,0 +1,406 @@ +type RedirectRule = { + to: string + from: string | string[] +} + +const redirectsList: RedirectRule[] = [ + { + // deleted pages that now redirect to the homepage + to: '/', + from: [ + 'faq/repositories/what-are-logs', + 'faq/repositories/hotspots-overview', + 'chart/configuration/tls-ingress', + 'release-notes/cloud/scheduled-maintenance-saturday,-5th-jan@05:30-gmt-(21:30-pst)', + 'release-notes/cloud/scheduled-maintenance-saturday,-30th-mar@-05:00-gmt-(01:00-edt)', + 'release-notes/cloud/scheduled-maintenance-saturday,-17th-nov@8:00-gmt-(0:00-pst)', + 'repositories-configure/integrations/webhook-notifications', + 'faq/repositories/how-do-i-transfer-delete-a-repository-from-my-account' + ] + }, + { + to: 'getting-started/codacy-quickstart', + from: [ + 'getting-started/setting-up-your-personal-repositories', + ], + }, + { + to: 'getting-started/supported-languages-and-tools', + from: [ + 'getting-started/supported-languages' + ] + }, + { + to: 'repositories-configure/configuring-code-patterns', + from: [ + 'account/default-patterns' + ] + }, + { + to: 'getting-started/supported-languages-and-tools#docker-images-of-supported-tools', + from: [ + 'related-tools/tool-developer-guide', + 'related-tools/tool-developer-guide-using-scala', + 'related-tools/codacy-plugin-tools' + ] + }, + { + to: 'organizations/managing-people', + from: [ + 'organizations/adding-and-managing-authors', + 'organizations/authors-vs-members' + ] + }, + { + to: 'organizations/roles-and-permissions-for-organizations', + from: [ + 'organizations/configuring-which-users-can-ignore-issues', + 'organizations/how-to-configure-which-users-can-ignore-issues', + 'organizations/roles-and-permissions-for-synced-organizations' + ] + }, + { + to: 'repositories-configure/codacy-configuration-file', + from: [ + 'repositories-configure/specifying-language', + 'repositories-configure/specifying-your-python-version', + 'repositories-configure/specifying-your-php-version', + 'repositories-configure/php_codesniffer-specifying-your-php-version' + ] + }, + { + to: 'repositories-configure/managing-branches', + from: [ + 'faq/code-analysis/does-codacy-automatically-analyze-all-pull-requests', + 'repositories/managing-branches' + ] + }, + { + to: 'faq/code-analysis/which-metrics-does-codacy-calculate', + from: [ + 'faq/code-analysis/how-does-codacy-measure-complexity-in-my-repository', + 'faq/repositories/what-are-the-different-grades-and-how-are-they-calculated', + 'repositories/what-are-the-different-grades-and-how-are-they-calculated' + ] + }, + { + to: 'getting-started/integrating-codacy-with-your-git-workflow', + from: [ + 'faq/general/how-do-i-block-merging-prs-using-codacy-as-a-quality-gate', + 'faq/repositories/how-do-i-set-codacy-as-a-required-check-to-merge-my-prs', + 'faq/repositories/how-do-i-set-codacy-as-a-required-check-to-merge-prs' + ] + }, + { + to: 'organizations/integrations/jira-integration', + from: [ + 'repositories-configure/integrations/jira-integration' + ] + }, + { + to: 'organizations/integrations/slack-integration', + from: [ + 'repositories-configure/integrations/slack-integration' + ] + }, + { + to: 'faq/general/how-can-i-change-or-cancel-my-plan', + from: [ + 'faq/general/plan-and-billing' + ] + }, + { + to: 'faq/troubleshooting/why-cant-i-see-my-organization', + from: [ + "organizations/why-cant-i-see-my-organization", + 'faq/general/why-cant-i-see-my-organization' + ] + }, + { + to: 'repositories-configure/integrations/bitbucket-integration', + from: [ + 'repositories-configure/integrations/bitbucket-cloud-integration', + ] + }, + { + to: 'coverage-reporter/index', + from: [ + 'repositories-configure/add-coverage-to-your-repo', + 'repositories-configure/coverage', + 'repositories-configure/generate-coverage', + 'coverage-reporter/advanced/authenticating-using-account-token', + 'coverage-reporter/advanced/multiple-reports', + 'coverage-reporter/troubleshooting/commit-detection', + 'coverage-reporter/troubleshooting/swift-objectivec', + 'coverage-reporter/generating-coverage-reports', + 'coverage-reporter/adding-coverage-to-your-repository' + ] + }, + { + to: 'coverage-reporter/alternative-ways-of-running-coverage-reporter', + from: [ + 'coverage-reporter/advanced/installation-methods' + ] + }, + { + to: 'coverage-reporter/troubleshooting-coverage-cli-issues', + from: [ + 'coverage-reporter/troubleshooting/common-issues', + 'coverage-reporter/troubleshooting-common-issues' + ] + }, + { + to: 'faq/troubleshooting/we-no-longer-have-access-to-this-repository', + from: [ + 'faq/troubleshooting/failed-to-clone-the-repository-generate-a-new-ssh-key' + ] + }, + { + to: 'organizations/organization-overview', + from: [ + 'organizations/organization-dashboard-overview' + ] + }, + { + to: 'repositories/repository-dashboard', + from: [ + 'repositories/repository-dashboard-overview' + ] + }, + { + to: 'organizations/managing-security-and-risk', + from: [ + 'repositories/security-dashboard', + 'repositories/security-monitor' + ] + }, + { + to: 'getting-started/supported-languages-and-tools', + from: [ + 'related-tools/engines' + ] + }, + { + to: 'faq/troubleshooting/why-did-codacy-stop-commenting-on-pull-requests', + from: [ + 'faq/troubleshooting/why-isnt-codacy-commenting-on-pull-requests-anymore' + ] + }, + { + to: 'getting-started/codacy-quickstart', + from: [ + 'getting-started/i-added-a-repository-now-what', + 'getting-started/getting-started-with-codacy' + ] + }, + { + to: 'codacy-api/api-tokens', + from: [ + 'related-tools/api-tokens', + 'repositories-configure/integrations/project-api', + 'related-tools/codacy-api-tokens' + ] + }, + { + to: 'faq/troubleshooting/why-isnt-my-public-repository-being-analyzed', + from: [ + 'faq/troubleshooting/why-isnt-my-public-repository-being-analysed' + ] + }, + { + to: 'repositories-configure/local-analysis/client-side-tools', + from: [ + 'related-tools/running-local-analysis', + 'related-tools/run-local-analysis', + 'related-tools/client-side-tools', + 'related-tools/local-analysis/client-side-tools', + 'related-tools/local-analysis/running-local-analysis', + 'repositories-configure/local-analysis/running-local-analysis' + ] + }, + { + to: 'repositories-configure/local-analysis/running-spotbugs', + from: [ + 'related-tools/run-spotbugs', + 'related-tools/running-spotbugs', + 'related-tools/local-analysis/running-spotbugs' + ] + }, + { + to: 'repositories-configure/ignoring-files', + from: [ + 'repositories-configure/ignore-files-from-codacy-analysis' + ] + }, + { + to: 'repositories-configure/adjusting-quality-gates', + from: [ + 'repositories/quality-settings', + 'repositories-configure/quality-settings', + 'repositories-configure/adjusting-quality-settings' + ] + }, + { + to: 'repositories-configure/removing-your-repository', + from: [ + 'repositories/removing-your-repository' + ] + }, + { + to: 'repositories-configure/integrations/post-commit-hooks', + from: [ + 'repositories/post-commit-hooks' + ] + }, + { + to: 'faq/general/which-platforms-and-technologies-does-codacy-support', + from: [ + 'faq/general/which-version-control-systems-do-you-support', + 'faq/general/which-browsers-do-you-support', + 'faq/general/which-browsers-does-codacy-support', + 'faq/general/which-version-control-systems-does-codacy-support' + ] + }, + { + to: 'repositories/commits', + from: [ + 'repositories/commits-view' + ] + }, + { + to: 'repositories/files', + from: [ + 'repositories/files-view' + ] + }, + { + to: 'repositories/issues', + from: [ + 'repositories/issues-view' + ] + }, + { + to: 'repositories/coverage', + from: [ + 'repositories/coverage-view' + ] + }, + { + to: 'faq/troubleshooting/error-line-endings', + from: [ + 'faq/code-analysis/error-line-endings' + ] + }, + { + to: 'faq/code-analysis/how-to-configure-php-codesniffer-coding-standards', + from: [ + 'repositories-configure/code-standards', + 'faq/code-analysis/how-to-configure-php-codesniffer-code-standards' + ] + }, + { + to: 'codacy-api/examples/adding-repositories-to-codacy-programmatically', + from: [ + 'faq/repositories/how-do-i-programmatically-add-repositories-to-codacy', + 'codacy-api/adding-repositories-to-codacy-programmatically', + 'codacy-api/examples/index' + ] + }, + { + to: 'getting-started/adding-a-codacy-badge', + from: [ + 'repositories/badges' + ] + }, + { + to: 'organizations/managing-repositories', + from: [ + 'organizations/managing-repositories-in-your-organization', + 'faq/repositories/why-cant-i-see-or-add-my-organizations-repositories', + 'faq/troubleshooting/why-cant-i-see-or-add-my-organizations-repositories' + ] + }, + { + to: 'account/emails', + from: [ + 'account/notifications', + 'faq/general/how-do-i-change-my-email-address-in-codacy', + 'faq/general/how-do-i-change-my-email-address-on-codacy' + ] + }, + { + to: 'faq/troubleshooting/why-is-my-file-over-150-kb-missing', + from: [ + 'faq/troubleshooting/why-is-my-file-missing' + ] + }, + { + to: 'repositories-configure/configuring-code-patterns', + from: [ + 'repositories-configure/code-patterns' + ] + }, + { + to: 'faq/code-analysis/how-to-skip-an-analysis', + from: [ + 'faq/code-analysis/skipping-an-analysis' + ] + }, + { + to: 'faq/code-analysis/does-codacy-check-for-dependencies', + from: [ + 'faq/code-analysis/do-you-check-for-dependencies' + ] + }, + { + to: 'faq/code-analysis/how-long-does-it-take-for-my-repository-to-be-analyzed', + from: [ + 'faq/repositories/how-do-i-manually-force-a-repository-update' + ] + }, + { + to: 'repositories-configure/local-analysis/running-aligncheck', + from: [ + 'related-tools/local-analysis/running-aligncheck' + ] + }, + { + to: 'repositories-configure/local-analysis/running-deadcode', + from: [ + 'related-tools/local-analysis/running-deadcode' + ] + }, + { + to: 'organizations/using-coding-standards', + from: [ + 'organizations/using-a-coding-standard', + 'organizations/copying-code-patterns-between-repositories' + ] + }, + { + to: 'organizations/integrations/default-git-provider-integration-settings', + from: [ + 'organizations/configuring-default-git-provider-integration-settings' + ] + }, + { + to: 'codacy-api/examples/creating-repository-api-tokens-programmatically', + from: [ + 'codacy-api/examples/creating-project-api-tokens-programmatically' + ] + }, + { + to: 'organizations/what-are-organizations', + from: [ + 'organizations/what-are-synced-organizations' + ] + }, + { + to: 'repositories-configure/languages', + from: [ + 'repositories-configure/file-extensions' + ] + } +] + +export default redirectsList