diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts index 7e2226dab9..1b3b1f5b95 100644 --- a/website/docusaurus.config.ts +++ b/website/docusaurus.config.ts @@ -42,882 +42,936 @@ const addDocsRoutePrefix = ({ from, ...rest }) => { }; }; -const config: Config = { - title: 'Unleash Documentation', - tagline: 'The enterprise ready feature flag service', - url: 'https://docs.getunleash.io', - baseUrl: '/', - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'throw', - favicon: 'img/favicon.ico', - organizationName: 'Unleash', // Usually your GitHub org/user name. - projectName: 'unleash.github.io', // Usually your repo name. - trailingSlash: false, - customFields: { - // expose env vars etc here - environment: process.env.NODE_ENV, - }, - themeConfig: { - defaultMode: 'light', - disableSwitch: true, - respectPrefersColorScheme: false, - algolia: { - appId: '5U05JI5NE1', - apiKey: 'dc9c4491fcf9143ee34015f22d1dd9d6', - indexName: 'getunleash', - }, - navbar: { - logo: { - alt: 'Unleash logo', - src: 'img/unleash_logo_white.svg', - href: 'https://www.getunleash.io', - }, - items: [ - { - type: 'doc', - position: 'right', - docId: 'quickstart', - html: 'Quickstart', - }, - { - type: 'doc', - position: 'right', - docId: 'welcome', - html: 'Docs', - }, - { - type: 'html', - value: 'Product', - position: 'right', - }, - { - type: 'html', - value: 'Plans', - position: 'right', - }, - { - type: 'html', - value: 'Blog', - position: 'right', - }, - { - type: 'html', - position: 'right', - value: '', - }, - { - type: 'dropdown', - position: 'right', - html: 'Unleash Academy', - to: 'unleash-academy/introduction', - items: [ - { - type: 'doc', - docId: 'unleash-academy/foundational', - label: 'Foundational', - }, - { - type: 'doc', - docId: 'unleash-academy/advanced-for-devs', - label: 'Advanced for Developers', - }, - { - type: 'doc', - docId: 'unleash-academy/managing-unleash-for-devops', - label: 'Managing Unleash for DevOps/Admins', - }, - ], - }, +const getUnleashRepoStars = async () => { + const response = await fetch( + `https://api.github.com/repos/unleash/unleash`, + ); + const data = await response.json(); + const unleashRepoStars = data.stargazers_count; + const formattedStars = + unleashRepoStars >= 1000 + ? `${(unleashRepoStars / 1000).toFixed(1)}k` + : unleashRepoStars.toString(); + return formattedStars; +}; + +export default async function createConfigAsync(): Promise { + const stars = await getUnleashRepoStars(); + return { + title: 'Unleash Documentation', + tagline: 'The enterprise ready feature flag service', + url: 'https://docs.getunleash.io', + baseUrl: '/', + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'throw', + favicon: 'img/favicon.ico', + organizationName: 'Unleash', // Usually your GitHub org/user name. + projectName: 'unleash.github.io', // Usually your repo name. + trailingSlash: false, + customFields: { + // expose env vars etc here + environment: process.env.NODE_ENV, + }, + themeConfig: { + defaultMode: 'light', + disableSwitch: true, + respectPrefersColorScheme: false, + algolia: { + appId: '5U05JI5NE1', + apiKey: 'dc9c4491fcf9143ee34015f22d1dd9d6', + indexName: 'getunleash', + }, + navbar: { + logo: { + alt: 'Unleash logo', + src: 'https://getunleash.io/logos/unleash_pos.svg', + srcDark: 'img/unleash_logo_white.svg', + href: 'https://www.getunleash.io', + height: '2rem', + }, + items: [ + { + label: 'Product', + href: 'https://www.getunleash.io/enterprise-feature-management-platform', + position: 'left', + }, + { + label: 'Plans', + href: 'https://www.getunleash.io/plans', + position: 'left', + }, + { + label: 'Blog', + href: 'https://www.getunleash.io/blog', + position: 'left', + }, + { + type: 'dropdown', + position: 'left', + html: 'Unleash Academy', + to: 'unleash-academy/introduction', + items: [ + { + type: 'doc', + docId: 'unleash-academy/foundational', + label: 'Foundational', + }, + { + type: 'doc', + docId: 'unleash-academy/advanced-for-devs', + label: 'Advanced for Developers', + }, + { + type: 'doc', + docId: 'unleash-academy/managing-unleash-for-devops', + label: 'Managing Unleash for DevOps/Admins', + }, + ], + }, + { + type: 'dropdown', + position: 'left', + html: 'Unleash Certification', + items: [ + { + label: 'Foundational Unleash', + href: 'https://docs.google.com/forms/d/1iPUk2I0k5xMzicn9aLMcPF3b9ub3ZwdVjRxCxWxV7js/viewform', + }, + { + label: 'Advanced Unleash for Developers', + href: 'https://docs.google.com/forms/d/1NUL9hyO8Ys916TB6fPV3-jkvD97OmPXZ8_TO84Wjqgc/viewform', + }, + { + label: 'Managing Unleash for DevOps/Admins', + href: 'https://docs.google.com/forms/d/1JlIqmXI3P7dj0n-OiUs2IYsYXgmqw23BChaemlSgHJA/viewform', + }, + ], + }, + { + type: 'search', + position: 'right', + }, + { + label: 'Sign in', + href: 'https://app.unleash-hosted.com/sign-in', + position: 'right', + }, + { + type: 'html', + position: 'right', + value: ` + + Stars + ${stars} + `, + }, + { + label: 'Get a demo', + href: 'https://www.getunleash.io/plans/enterprise', + position: 'right', + }, + ], + }, + prism: { + additionalLanguages: [ + 'csharp', + 'dart', + 'java', + 'php', + 'ruby', + 'bash', + 'diff', + ], + }, + languageTabs: [ { - type: 'dropdown', - position: 'right', - html: 'Unleash Certification', - items: [ - { - label: 'Foundational Unleash', - href: 'https://docs.google.com/forms/d/1iPUk2I0k5xMzicn9aLMcPF3b9ub3ZwdVjRxCxWxV7js/viewform', - }, - { - label: 'Advanced Unleash for Developers', - href: 'https://docs.google.com/forms/d/1NUL9hyO8Ys916TB6fPV3-jkvD97OmPXZ8_TO84Wjqgc/viewform', - }, - { - label: 'Managing Unleash for DevOps/Admins', - href: 'https://docs.google.com/forms/d/1JlIqmXI3P7dj0n-OiUs2IYsYXgmqw23BChaemlSgHJA/viewform', - }, - ], + highlight: 'bash', + language: 'curl', }, { - type: 'html', - position: 'right', - value: '', + highlight: 'python', + language: 'python', + variant: 'requests', }, { - type: 'html', - value: 'Sign in', - position: 'right', + highlight: 'go', + language: 'go', }, { - type: 'html', - position: 'right', - value: '', + highlight: 'javascript', + language: 'nodejs', + variant: 'native', }, { - href: 'https://github.com/Unleash/unleash', - position: 'right', - className: 'header-github-link', - 'aria-label': 'Unleash GitHub repository', + highlight: 'ruby', + language: 'ruby', + }, + { + highlight: 'csharp', + language: 'csharp', + variant: 'httpclient', + }, + { + highlight: 'php', + language: 'php', + }, + { + highlight: 'java', + language: 'java', + }, + { + highlight: 'powershell', + language: 'powershell', }, ], + footer: { + links: [ + { + title: 'Feature Flag use cases', + items: [ + { + label: 'Secure, scalable feature flags', + to: 'https://getunleash.io/TBD', + }, + { + label: 'Rollbacks', + to: 'https://getunleash.io/TBD', + }, + { + label: 'Fedramp, SOC2, ISO2700 compliance', + to: 'https://getunleash.io/TBD', + }, + { + label: 'Progressive or gradual rollouts', + to: 'https://getunleash.io/TBD', + }, + { + label: 'Trunk-based development', + to: 'https://getunleash.io/TBD', + }, + { + label: 'Software kill switches', + to: 'https://getunleash.io/TBD', + }, + { + label: 'A/B testing', + to: 'https://getunleash.io/TBD', + }, + { + label: 'Feature Management', + to: 'https://getunleash.io/TBD', + }, + { + label: 'Canary releases', + to: 'https://getunleash.io/TBD', + }, + ], + }, + { + title: 'Product', + items: [ + { + label: 'Docs', + to: '/', + }, + { + label: 'Unleash on GitHub', + href: 'https://github.com/Unleash/unleash', + }, + { + label: 'Roadmap', + href: 'https://github.com/orgs/Unleash/projects/10', + }, + { + label: 'Unleash help center', + href: 'https://getunleash.zendesk.com/hc/en-gb', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'GitHub discussions', + href: 'https://github.com/unleash/unleash/discussions/', + }, + { + label: 'Slack', + href: 'https://slack.unleash.run/', + }, + { + label: 'Stack Overflow', + href: 'https://stackoverflow.com/questions/tagged/unleash', + }, + { + label: 'Twitter', + href: 'https://twitter.com/getunleash', + }, + ], + }, + ], + }, + image: 'img/logo.png', + imageZoom: { + // Optional medium-zoom options at + // https://www.npmjs.com/package/medium-zoom#options + options: { + background: 'var(--ifm-background-color)', + }, + }, }, - prism: { - additionalLanguages: [ - 'csharp', - 'dart', - 'java', - 'php', - 'ruby', - 'bash', - 'diff', + presets: [ + [ + '@docusaurus/preset-classic', + { + docs: { + // Please change this to your repo. + editUrl: + 'https://github.com/Unleash/unleash/edit/main/website/', + routeBasePath: '/', + remarkPlugins: [[pluginNpm2Yarn, { sync: true }]], + docItemComponent: '@theme/ApiItem', + sidebarPath: './sidebars.ts', + }, + theme: { + customCss: './src/css/custom.css', + }, + googleAnalytics: { + trackingID: 'UA-134882379-1', + }, + googleTagManager: { + containerId: 'GTM-KV5PRR2', + }, + sitemap: { + changefreq: 'weekly', + lastmod: 'date', + priority: 0.5, + createSitemapItems: async (params) => { + const { defaultCreateSitemapItems, ...rest } = + params; + const items = await defaultCreateSitemapItems(rest); + return items.filter( + (item) => !item.url.includes('/page/'), + ); + }, + }, + }, ], - }, - languageTabs: [ - { - highlight: 'bash', - language: 'curl', - }, - { - highlight: 'python', - language: 'python', - variant: 'requests', - }, - { - highlight: 'go', - language: 'go', - }, - { - highlight: 'javascript', - language: 'nodejs', - variant: 'native', - }, - { - highlight: 'ruby', - language: 'ruby', - }, - { - highlight: 'csharp', - language: 'csharp', - variant: 'httpclient', - }, - { - highlight: 'php', - language: 'php', - }, - { - highlight: 'java', - language: 'java', - }, - { - highlight: 'powershell', - language: 'powershell', - }, ], - footer: { - style: 'dark', - links: [ + plugins: [ + [ + // heads up to anyone making redirects: + // + // remember that redirects only work in production and not in + // development, as mentioned in the docs + // https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-client-redirects/ + '@docusaurus/plugin-client-redirects', { - title: 'Product', - items: [ + fromExtensions: ['html', 'htm'], + redirects: [ { - label: 'Docs', + to: '/how-to/how-to-create-api-tokens', + from: [ + '/user_guide/api-token', + '/deploy/user_guide/api-token', + ], + }, + { + from: '/advanced/audit_log', + to: '/reference/events', + }, + { + from: '/reference/event-log', + to: '/reference/events', + }, + { + from: '/reference/event-types', + to: '/reference/events', + }, + { + from: '/advanced/api_access', + to: '/how-to/how-to-use-the-admin-api', + }, + { + from: '/advanced/archived_toggles', + to: '/reference/feature-toggles', + }, + { + from: [ + '/advanced/custom-activation-strategy', + '/advanced/custom_activation_strategy', + ], + to: '/reference/custom-activation-strategies', + }, + { + from: '/advanced/feature_toggle_types', + to: '/reference/feature-toggles', + }, + { + from: [ + '/toggle_variants', + '/advanced/feature_toggle_variants', + '/advanced/toggle_variants', + ], + to: '/reference/feature-toggle-variants', + }, + { + from: [ + '/advanced/impression-data', + '/advanced/impression_data', + ], + to: '/reference/impression-data', + }, + { + from: '/advanced/stickiness', + to: '/reference/stickiness', + }, + { + from: '/advanced/sso-google', + to: '/how-to/how-to-add-sso-google', + }, + { + from: '/advanced/sso-open-id-connect', + to: '/how-to/how-to-add-sso-open-id-connect', + }, + { + from: '/advanced/sso-saml-keycloak', + to: '/how-to/how-to-add-sso-saml-keycloak', + }, + { + from: '/advanced/sso-saml', + to: '/how-to/how-to-add-sso-saml', + }, + { + from: '/advanced/enterprise-authentication', + to: '/reference/sso', + }, + { + from: ['/addons', '/reference/addons'], + to: '/reference/integrations', + }, + { + from: [ + '/addons/datadog', + '/reference/addons/datadog', + ], + to: '/reference/integrations/datadog', + }, + { + from: ['/addons/slack', '/reference/addons/slack'], + to: '/reference/integrations/slack', + }, + { + from: [ + '/addons/slack-app', + '/reference/addons/slack-app', + ], + to: '/reference/integrations/slack-app', + }, + { + from: ['/addons/teams', '/reference/addons/teams'], + to: '/reference/integrations/teams', + }, + { + from: [ + '/addons/webhook', + '/reference/addons/webhook', + ], + to: '/reference/integrations/webhook', + }, + { + from: '/guides/feature_updates_to_slack', + to: '/how-to/how-to-send-feature-updates-to-slack-deprecated', + }, + { + from: [ + '/integrations/integrations', + '/integrations', + ], + to: '/reference/integrations', + }, + { + from: '/integrations/jira_server_plugin_installation', + to: '/reference/integrations/jira-server-plugin-installation', + }, + { + from: '/integrations/jira_server_plugin_usage', + to: '/reference/integrations/jira-server-plugin-usage', + }, + { + from: [ + '/sdks', + '/user_guide/client-sdk', + '/client-sdk', + '/user_guide/connect_sdk', + '/sdks/community', + ], + to: '/reference/sdks', + }, + { + from: '/sdks/go_sdk', + to: '/reference/sdks/go', + }, + { + from: '/sdks/java_sdk', + to: '/reference/sdks/java', + }, + { + from: '/sdks/node_sdk', + to: '/reference/sdks/node', + }, + { + from: '/sdks/php_sdk', + to: '/reference/sdks/php', + }, + { + from: '/sdks/python_sdk', + to: '/reference/sdks/python', + }, + { + from: '/sdks/dot_net_sdk', + to: '/reference/sdks/dotnet', + }, + { + from: '/sdks/ruby_sdk', + to: '/reference/sdks/ruby', + }, + { + from: '/sdks/android_proxy_sdk', + to: '/reference/sdks/android-proxy', + }, + { + from: '/sdks/proxy-ios', + to: '/reference/sdks/ios-proxy', + }, + { + from: [ + '/sdks/proxy-javascript', + '/sdks/javascript-browser', + ], + to: '/reference/sdks/javascript-browser', + }, + { + from: ['/sdks/proxy-react', '/sdks/react'], + to: '/reference/sdks/react', + }, + { + from: '/sdks/proxy-vue', + to: '/reference/sdks/vue', + }, + { + from: '/sdks/proxy-svelte', + to: '/reference/sdks/svelte', + }, + { + from: [ + '/user_guide/native_apps', + '/user_guide/proxy-api', + '/sdks/unleash-proxy', + ], + to: '/reference/unleash-proxy', + }, + { + to: '/reference/activation-strategies', + from: [ + '/user_guide/control_rollout', + '/user_guide/activation_strategy', + ], + }, + { + from: '/user_guide/environments', + to: '/reference/environments', + }, + { + from: '/user_guide/projects', + to: '/reference/projects', + }, + { + from: ['/user_guide/rbac', '/advanced/groups'], + to: '/reference/rbac', + }, + { + from: '/user_guide/technical_debt', + to: '/reference/technical-debt', + }, + { + from: '/user_guide/unleash_context', + to: '/reference/unleash-context', + }, + { + from: '/user_guide/user-management', + to: '/how-to/how-to-add-users-to-unleash', + }, + { + from: '/user_guide/v4-whats-new', + to: '/reference/whats-new-v4', + }, + { + from: [ + '/user_guide/important-concepts', + '/tutorials/important-concepts', + '/reference/concepts/', + ], + to: '/reference', + }, + { + from: [ + '/user_guide/quickstart', + '/docs/getting_started', + '/tutorials/quickstart', + '/tutorials/getting-started', + ], + to: '/quickstart', + }, + { + from: '/api/basic-auth', + to: '/reference/api/legacy/unleash/basic-auth', + }, + { + from: '/api', + to: '/reference/api/legacy/unleash', + }, + { + from: '/api/admin/addons', + to: '/reference/api/legacy/unleash/admin/addons', + }, + { + from: '/api/admin/context', + to: '/reference/api/legacy/unleash/admin/context', + }, + { + from: '/api/admin/events', + to: '/reference/api/legacy/unleash/admin/events', + }, + { + from: '/api/admin/feature-toggles-v2', + to: '/reference/api/legacy/unleash/admin/features-v2', + }, + { + from: '/api/admin/feature-types', + to: '/reference/api/legacy/unleash/admin/feature-types', + }, + { + from: '/api/admin/features', + to: '/reference/api/legacy/unleash/admin/features', + }, + { + from: '/api/admin/features-archive', + to: '/reference/api/legacy/unleash/admin/archive', + }, + { + from: '/api/admin/metrics', + to: '/reference/api/legacy/unleash/admin/metrics', + }, + { + from: '/api/admin/projects', + to: '/reference/api/legacy/unleash/admin/projects', + }, + { + from: '/api/admin/segments', + to: '/reference/api/legacy/unleash/admin/segments', + }, + { + from: '/api/admin/state', + to: '/reference/api/legacy/unleash/admin/state', + }, + { + from: '/api/admin/strategies', + to: '/reference/api/legacy/unleash/admin/strategies', + }, + { + from: '/api/admin/tags', + to: '/reference/api/legacy/unleash/admin/tags', + }, + { + from: '/api/admin/user-admin', + to: '/reference/api/legacy/unleash/admin/user-admin', + }, + { + from: '/api/client/features', + to: '/reference/api/legacy/unleash/client/features', + }, + { + from: '/api/client/metrics', + to: '/reference/api/legacy/unleash/client/metrics', + }, + { + from: '/api/client/register', + to: '/reference/api/legacy/unleash/client/register', + }, + { + from: '/api/internal/internal', + to: '/reference/api/legacy/unleash/internal/prometheus', + }, + { + from: '/api/internal/health', + to: '/reference/api/legacy/unleash/internal/health', + }, + { + from: '/help', to: '/', }, { - label: 'Unleash on GitHub', - href: 'https://github.com/Unleash/unleash', + from: [ + '/topics/feature-flags/tutorials', + '/tutorials', + ], + to: '/feature-flag-tutorials', }, { - label: 'Roadmap', - href: 'https://github.com/orgs/Unleash/projects/10', + from: ['/tutorials/academy', '/unleash-academy'], + to: '/unleash-academy/introduction', }, { - label: 'Unleash help center', - href: 'https://getunleash.zendesk.com/hc/en-gb', - }, - ], - }, - { - title: 'Community', - items: [ - { - label: 'GitHub discussions', - href: 'https://github.com/unleash/unleash/discussions/', + from: '/tutorials/academy-foundational', + to: '/unleash-academy/foundational', }, { - label: 'Slack', - href: 'https://slack.unleash.run/', + from: '/tutorials/academy-advanced-for-devs', + to: '/unleash-academy/advanced-for-devs', }, { - label: 'Stack Overflow', - href: 'https://stackoverflow.com/questions/tagged/unleash', + from: '/tutorials/academy-managing-unleash-for-devops', + to: '/unleash-academy/managing-unleash-for-devops', }, { - label: 'Twitter', - href: 'https://twitter.com/getunleash', + from: '/developer-guide', + to: '/contributing', }, - ], + { + from: [ + '/tutorials/unleash-overview', + '/user_guide/unleash_overview', + ], + to: '/understanding-unleash/unleash-overview', + }, + { + from: [ + '/tutorials/managing-constraints', + '/topics/managing-constraints', + ], + to: '/understanding-unleash/managing-constraints', + }, + { + from: [ + '/tutorials/the-anatomy-of-unleash', + '/topics/the-anatomy-of-unleash', + ], + to: '/understanding-unleash/the-anatomy-of-unleash', + }, + { + from: [ + '/tutorials/proxy-hosting', + '/topics/proxy-hosting', + ], + to: '/understanding-unleash/proxy-hosting', + }, + { + from: [ + '/tutorials/data-collection', + '/topics/data-collection', + ], + to: '/understanding-unleash/data-collection', + }, + + { + from: '/how-to/how-to-troubleshoot-flag-exposure', + to: '/using-unleash/troubleshooting/flag-exposure', + }, + { + from: '/how-to/how-to-troubleshoot-flag-not-returned', + to: '/using-unleash/troubleshooting/flag-not-returned', + }, + { + from: '/how-to/how-to-troubleshoot-cors', + to: '/using-unleash/troubleshooting/cors', + }, + { + from: '/how-to/how-to-troubleshoot-https', + to: '/using-unleash/troubleshooting/https', + }, + { + from: '/how-to/how-to-troubleshoot-feature-not-available', + to: '/using-unleash/troubleshooting/feature-not-available', + }, + { + from: ['/reference/deploy', '/deploy'], + to: '/using-unleash/deploy', + }, + { + from: [ + '/reference/deploy/getting-started', + '/deploy/getting_started', + ], + to: '/using-unleash/deploy/getting-started', + }, + { + from: [ + '/reference/deploy/configuring-unleash', + '/deploy/configuring_unleash', + ], + to: '/using-unleash/deploy/configuring-unleash', + }, + { + from: [ + '/reference/deploy/database-setup', + '/deploy/database-setup', + ], + to: '/using-unleash/deploy/database-setup', + }, + { + from: [ + '/reference/deploy/database-backup', + '/deploy/database-backup', + ], + to: '/using-unleash/deploy/database-backup', + }, + { + from: [ + '/reference/deploy/email-service', + '/deploy/email', + ], + to: '/using-unleash/deploy/email-service', + }, + { + from: [ + '/reference/deploy/google-auth-hook', + '/deploy/google_auth', + ], + to: '/using-unleash/deploy/google-auth-hook', + }, + { + from: [ + '/deploy/migration_guide', + '/reference/deploy/migration-guide', + ], + to: '/using-unleash/deploy/upgrading-unleash', + }, + { + from: [ + '/reference/deploy/securing-unleash', + '/deploy/securing_unleash', + ], + to: '/using-unleash/deploy/securing-unleash', + }, + { + from: [ + '/reference/deploy/import-export', + '/deploy/import_export', + ], + to: '/how-to/how-to-import-export', + }, + { + from: [ + '/reference/deploy/environment-import-export', + '/deploy/environment-import-export', + ], + to: '/how-to/how-to-environment-import-export', + }, + { + from: [ + '/topics/feature-flags/runtime-control', + '/topics/feature-flags/never-expose-pii', + '/topics/feature-flags/evaluate-flags-close-to-user', + '/topics/feature-flags/scale-horizontally', + '/topics/feature-flags/limit-payloads', + '/topics/feature-flags/availability-over-consistency', + '/topics/feature-flags/short-lived-feature-flags', + '/topics/feature-flags/unique-names', + '/topics/feature-flags/democratize-feature-flag-access', + '/topics/feature-flags/prioritize-ux', + '/topics/feature-flags/enable-traceability', + ], + to: '/topics/feature-flags/feature-flag-best-practices', + }, + { + from: [ + '/topics/feature-flag-migration/feature-flag-migration-scope', + '/topics/feature-flag-migration/business-case-feature-flag-migration', + '/topics/feature-flag-migration/planning-feature-flag-migration', + '/topics/feature-flag-migration/how-to-execute-feature-flag-migration', + '/topics/feature-flag-migration/onbording-users-to-feature-flag-service', + ], + to: '/topics/feature-flag-migration/feature-flag-migration-best-practices', + }, + { + from: '/topics/a-b-testing', + to: '/feature-flag-tutorials/use-cases/a-b-testing', + }, + ].map(addDocsRoutePrefix), // add /docs prefixes + createRedirects: (toPath) => { + if ( + toPath.indexOf('/docs/') === -1 && + toPath.indexOf('index.html') === -1 + ) { + return `/docs/${toPath}`; + } + }, }, ], - copyright: `Copyright © ${new Date().getFullYear()} Unleash. Built with Docusaurus.`, - logo: { - src: 'img/logo.svg', - alt: 'Unleash logo', - }, - }, - image: 'img/logo.png', - imageZoom: { - // Optional medium-zoom options at - // https://www.npmjs.com/package/medium-zoom#options - options: { - background: 'var(--ifm-background-color)', - }, - }, - }, - presets: [ - [ - '@docusaurus/preset-classic', - { - docs: { - // Please change this to your repo. - editUrl: - 'https://github.com/Unleash/unleash/edit/main/website/', - routeBasePath: '/', - remarkPlugins: [[pluginNpm2Yarn, { sync: true }]], - docItemComponent: '@theme/ApiItem', - sidebarPath: './sidebars.ts', - }, - theme: { - customCss: './src/css/custom.css', - }, - googleAnalytics: { - trackingID: 'UA-134882379-1', - }, - googleTagManager: { - containerId: 'GTM-KV5PRR2', - }, - sitemap: { - changefreq: 'weekly', - lastmod: 'date', - priority: 0.5, - createSitemapItems: async (params) => { - const { defaultCreateSitemapItems, ...rest } = params; - const items = await defaultCreateSitemapItems(rest); - return items.filter( - (item) => !item.url.includes('/page/'), - ); - }, - }, - }, - ], - ], - plugins: [ - [ - // heads up to anyone making redirects: - // - // remember that redirects only work in production and not in - // development, as mentioned in the docs - // https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-client-redirects/ - '@docusaurus/plugin-client-redirects', - { - fromExtensions: ['html', 'htm'], - redirects: [ - { - to: '/how-to/how-to-create-api-tokens', - from: [ - '/user_guide/api-token', - '/deploy/user_guide/api-token', - ], - }, - { - from: '/advanced/audit_log', - to: '/reference/events', - }, - { - from: '/reference/event-log', - to: '/reference/events', - }, - { - from: '/reference/event-types', - to: '/reference/events', - }, - { - from: '/advanced/api_access', - to: '/how-to/how-to-use-the-admin-api', - }, - { - from: '/advanced/archived_toggles', - to: '/reference/feature-toggles', - }, - { - from: [ - '/advanced/custom-activation-strategy', - '/advanced/custom_activation_strategy', - ], - to: '/reference/custom-activation-strategies', - }, - { - from: '/advanced/feature_toggle_types', - to: '/reference/feature-toggles', - }, - { - from: [ - '/toggle_variants', - '/advanced/feature_toggle_variants', - '/advanced/toggle_variants', - ], - to: '/reference/feature-toggle-variants', - }, - { - from: [ - '/advanced/impression-data', - '/advanced/impression_data', - ], - to: '/reference/impression-data', - }, - { - from: '/advanced/stickiness', - to: '/reference/stickiness', - }, - { - from: '/advanced/sso-google', - to: '/how-to/how-to-add-sso-google', - }, - { - from: '/advanced/sso-open-id-connect', - to: '/how-to/how-to-add-sso-open-id-connect', - }, - { - from: '/advanced/sso-saml-keycloak', - to: '/how-to/how-to-add-sso-saml-keycloak', - }, - { - from: '/advanced/sso-saml', - to: '/how-to/how-to-add-sso-saml', - }, - { - from: '/advanced/enterprise-authentication', - to: '/reference/sso', - }, - { - from: ['/addons', '/reference/addons'], - to: '/reference/integrations', - }, - { - from: ['/addons/datadog', '/reference/addons/datadog'], - to: '/reference/integrations/datadog', - }, - { - from: ['/addons/slack', '/reference/addons/slack'], - to: '/reference/integrations/slack', - }, - { - from: [ - '/addons/slack-app', - '/reference/addons/slack-app', - ], - to: '/reference/integrations/slack-app', - }, - { - from: ['/addons/teams', '/reference/addons/teams'], - to: '/reference/integrations/teams', - }, - { - from: ['/addons/webhook', '/reference/addons/webhook'], - to: '/reference/integrations/webhook', - }, - { - from: '/guides/feature_updates_to_slack', - to: '/how-to/how-to-send-feature-updates-to-slack-deprecated', - }, - { - from: ['/integrations/integrations', '/integrations'], - to: '/reference/integrations', - }, - { - from: '/integrations/jira_server_plugin_installation', - to: '/reference/integrations/jira-server-plugin-installation', - }, - { - from: '/integrations/jira_server_plugin_usage', - to: '/reference/integrations/jira-server-plugin-usage', - }, - { - from: [ - '/sdks', - '/user_guide/client-sdk', - '/client-sdk', - '/user_guide/connect_sdk', - '/sdks/community', - ], - to: '/reference/sdks', - }, - { - from: '/sdks/go_sdk', - to: '/reference/sdks/go', - }, - { - from: '/sdks/java_sdk', - to: '/reference/sdks/java', - }, - { - from: '/sdks/node_sdk', - to: '/reference/sdks/node', - }, - { - from: '/sdks/php_sdk', - to: '/reference/sdks/php', - }, - { - from: '/sdks/python_sdk', - to: '/reference/sdks/python', - }, - { - from: '/sdks/dot_net_sdk', - to: '/reference/sdks/dotnet', - }, - { - from: '/sdks/ruby_sdk', - to: '/reference/sdks/ruby', - }, - { - from: '/sdks/android_proxy_sdk', - to: '/reference/sdks/android-proxy', - }, - { - from: '/sdks/proxy-ios', - to: '/reference/sdks/ios-proxy', - }, - { - from: [ - '/sdks/proxy-javascript', - '/sdks/javascript-browser', - ], - to: '/reference/sdks/javascript-browser', - }, - { - from: ['/sdks/proxy-react', '/sdks/react'], - to: '/reference/sdks/react', - }, - { - from: '/sdks/proxy-vue', - to: '/reference/sdks/vue', - }, - { - from: '/sdks/proxy-svelte', - to: '/reference/sdks/svelte', - }, - { - from: [ - '/user_guide/native_apps', - '/user_guide/proxy-api', - '/sdks/unleash-proxy', - ], - to: '/reference/unleash-proxy', - }, - { - to: '/reference/activation-strategies', - from: [ - '/user_guide/control_rollout', - '/user_guide/activation_strategy', - ], - }, - { - from: '/user_guide/environments', - to: '/reference/environments', - }, - { - from: '/user_guide/projects', - to: '/reference/projects', - }, - { - from: ['/user_guide/rbac', '/advanced/groups'], - to: '/reference/rbac', - }, - { - from: '/user_guide/technical_debt', - to: '/reference/technical-debt', - }, - { - from: '/user_guide/unleash_context', - to: '/reference/unleash-context', - }, - { - from: '/user_guide/user-management', - to: '/how-to/how-to-add-users-to-unleash', - }, - { - from: '/user_guide/v4-whats-new', - to: '/reference/whats-new-v4', - }, - { - from: [ - '/user_guide/important-concepts', - '/tutorials/important-concepts', - '/reference/concepts/', - ], - to: '/reference', - }, - { - from: [ - '/user_guide/quickstart', - '/docs/getting_started', - '/tutorials/quickstart', - '/tutorials/getting-started', - ], - to: '/quickstart', - }, - { - from: '/api/basic-auth', - to: '/reference/api/legacy/unleash/basic-auth', - }, - { - from: '/api', - to: '/reference/api/legacy/unleash', - }, - { - from: '/api/admin/addons', - to: '/reference/api/legacy/unleash/admin/addons', - }, - { - from: '/api/admin/context', - to: '/reference/api/legacy/unleash/admin/context', - }, - { - from: '/api/admin/events', - to: '/reference/api/legacy/unleash/admin/events', - }, - { - from: '/api/admin/feature-toggles-v2', - to: '/reference/api/legacy/unleash/admin/features-v2', - }, - { - from: '/api/admin/feature-types', - to: '/reference/api/legacy/unleash/admin/feature-types', - }, - { - from: '/api/admin/features', - to: '/reference/api/legacy/unleash/admin/features', - }, - { - from: '/api/admin/features-archive', - to: '/reference/api/legacy/unleash/admin/archive', - }, - { - from: '/api/admin/metrics', - to: '/reference/api/legacy/unleash/admin/metrics', - }, - { - from: '/api/admin/projects', - to: '/reference/api/legacy/unleash/admin/projects', - }, - { - from: '/api/admin/segments', - to: '/reference/api/legacy/unleash/admin/segments', - }, - { - from: '/api/admin/state', - to: '/reference/api/legacy/unleash/admin/state', - }, - { - from: '/api/admin/strategies', - to: '/reference/api/legacy/unleash/admin/strategies', - }, - { - from: '/api/admin/tags', - to: '/reference/api/legacy/unleash/admin/tags', - }, - { - from: '/api/admin/user-admin', - to: '/reference/api/legacy/unleash/admin/user-admin', - }, - { - from: '/api/client/features', - to: '/reference/api/legacy/unleash/client/features', - }, - { - from: '/api/client/metrics', - to: '/reference/api/legacy/unleash/client/metrics', - }, - { - from: '/api/client/register', - to: '/reference/api/legacy/unleash/client/register', - }, - { - from: '/api/internal/internal', - to: '/reference/api/legacy/unleash/internal/prometheus', - }, - { - from: '/api/internal/health', - to: '/reference/api/legacy/unleash/internal/health', - }, - { - from: '/help', - to: '/', - }, - { - from: ['/topics/feature-flags/tutorials', '/tutorials'], - to: '/feature-flag-tutorials', - }, - { - from: ['/tutorials/academy', '/unleash-academy'], - to: '/unleash-academy/introduction', - }, - { - from: '/tutorials/academy-foundational', - to: '/unleash-academy/foundational', - }, - { - from: '/tutorials/academy-advanced-for-devs', - to: '/unleash-academy/advanced-for-devs', - }, - { - from: '/tutorials/academy-managing-unleash-for-devops', - to: '/unleash-academy/managing-unleash-for-devops', - }, - { - from: '/developer-guide', - to: '/contributing', - }, - { - from: [ - '/tutorials/unleash-overview', - '/user_guide/unleash_overview', - ], - to: '/understanding-unleash/unleash-overview', - }, - { - from: [ - '/tutorials/managing-constraints', - '/topics/managing-constraints', - ], - to: '/understanding-unleash/managing-constraints', - }, - { - from: [ - '/tutorials/the-anatomy-of-unleash', - '/topics/the-anatomy-of-unleash', - ], - to: '/understanding-unleash/the-anatomy-of-unleash', - }, - { - from: [ - '/tutorials/proxy-hosting', - '/topics/proxy-hosting', - ], - to: '/understanding-unleash/proxy-hosting', - }, - { - from: [ - '/tutorials/data-collection', - '/topics/data-collection', - ], - to: '/understanding-unleash/data-collection', - }, - - { - from: '/how-to/how-to-troubleshoot-flag-exposure', - to: '/using-unleash/troubleshooting/flag-exposure', - }, - { - from: '/how-to/how-to-troubleshoot-flag-not-returned', - to: '/using-unleash/troubleshooting/flag-not-returned', - }, - { - from: '/how-to/how-to-troubleshoot-cors', - to: '/using-unleash/troubleshooting/cors', - }, - { - from: '/how-to/how-to-troubleshoot-https', - to: '/using-unleash/troubleshooting/https', - }, - { - from: '/how-to/how-to-troubleshoot-feature-not-available', - to: '/using-unleash/troubleshooting/feature-not-available', - }, - { - from: ['/reference/deploy', '/deploy'], - to: '/using-unleash/deploy', - }, - { - from: [ - '/reference/deploy/getting-started', - '/deploy/getting_started', - ], - to: '/using-unleash/deploy/getting-started', - }, - { - from: [ - '/reference/deploy/configuring-unleash', - '/deploy/configuring_unleash', - ], - to: '/using-unleash/deploy/configuring-unleash', - }, - { - from: [ - '/reference/deploy/database-setup', - '/deploy/database-setup', - ], - to: '/using-unleash/deploy/database-setup', - }, - { - from: [ - '/reference/deploy/database-backup', - '/deploy/database-backup', - ], - to: '/using-unleash/deploy/database-backup', - }, - { - from: [ - '/reference/deploy/email-service', - '/deploy/email', - ], - to: '/using-unleash/deploy/email-service', - }, - { - from: [ - '/reference/deploy/google-auth-hook', - '/deploy/google_auth', - ], - to: '/using-unleash/deploy/google-auth-hook', - }, - { - from: [ - '/deploy/migration_guide', - '/reference/deploy/migration-guide', - ], - to: '/using-unleash/deploy/upgrading-unleash', - }, - { - from: [ - '/reference/deploy/securing-unleash', - '/deploy/securing_unleash', - ], - to: '/using-unleash/deploy/securing-unleash', - }, - { - from: [ - '/reference/deploy/import-export', - '/deploy/import_export', - ], - to: '/how-to/how-to-import-export', - }, - { - from: [ - '/reference/deploy/environment-import-export', - '/deploy/environment-import-export', - ], - to: '/how-to/how-to-environment-import-export', - }, - { - from: [ - '/topics/feature-flags/runtime-control', - '/topics/feature-flags/never-expose-pii', - '/topics/feature-flags/evaluate-flags-close-to-user', - '/topics/feature-flags/scale-horizontally', - '/topics/feature-flags/limit-payloads', - '/topics/feature-flags/availability-over-consistency', - '/topics/feature-flags/short-lived-feature-flags', - '/topics/feature-flags/unique-names', - '/topics/feature-flags/democratize-feature-flag-access', - '/topics/feature-flags/prioritize-ux', - '/topics/feature-flags/enable-traceability', - ], - to: '/topics/feature-flags/feature-flag-best-practices', - }, - { - from: [ - '/topics/feature-flag-migration/feature-flag-migration-scope', - '/topics/feature-flag-migration/business-case-feature-flag-migration', - '/topics/feature-flag-migration/planning-feature-flag-migration', - '/topics/feature-flag-migration/how-to-execute-feature-flag-migration', - '/topics/feature-flag-migration/onbording-users-to-feature-flag-service', - ], - to: '/topics/feature-flag-migration/feature-flag-migration-best-practices', - }, - { - from: '/topics/a-b-testing', - to: '/feature-flag-tutorials/use-cases/a-b-testing', - }, - ].map(addDocsRoutePrefix), // add /docs prefixes - createRedirects: (toPath) => { - if ( - toPath.indexOf('/docs/') === -1 && - toPath.indexOf('index.html') === -1 - ) { - return `/docs/${toPath}`; - } - }, - }, - ], - [ - 'docusaurus-plugin-openapi-docs', - { - id: 'api-operations', - docsPluginId: 'classic', - config: { - server: { - specPath: 'docs/generated/openapi.json', - outputDir: 'docs/reference/api/unleash', - sidebarOptions: { - groupPathsBy: 'tag', - categoryLinkSource: 'tag', + [ + 'docusaurus-plugin-openapi-docs', + { + id: 'api-operations', + docsPluginId: 'classic', + config: { + server: { + specPath: 'docs/generated/openapi.json', + outputDir: 'docs/reference/api/unleash', + sidebarOptions: { + groupPathsBy: 'tag', + categoryLinkSource: 'tag', + }, }, }, }, - }, + ], + [ + 'docusaurus-plugin-remote-content', + { + // more info at https://github.com/rdilweb/docusaurus-plugin-remote-content#options + name: 'content-sdks', + sourceBaseUrl: 'https://raw.githubusercontent.com/Unleash/', // gets prepended to all of the documents when fetching + outDir: 'docs/generated', // the base directory to output to. + documents: sdks.urls, // the file names to download + modifyContent: sdks.modifyContent, + noRuntimeDownloads: true, + }, + ], + [ + 'docusaurus-plugin-remote-content', + { + // more info at https://github.com/rdilweb/docusaurus-plugin-remote-content#options + name: 'content-external', + sourceBaseUrl: 'https://raw.githubusercontent.com/Unleash/', // gets prepended to all of the documents when fetching + outDir: 'docs/generated/', // the base directory to output to. + documents: edgeAndProxy.urls, // the file names to download + modifyContent: edgeAndProxy.modifyContent, + noRuntimeDownloads: true, + }, + ], + 'plugin-image-zoom', ], - [ - 'docusaurus-plugin-remote-content', + themes: [ + 'docusaurus-theme-openapi-docs', // Allows use of @theme/ApiItem and other components + ], + scripts: [ { - // more info at https://github.com/rdilweb/docusaurus-plugin-remote-content#options - name: 'content-sdks', - sourceBaseUrl: 'https://raw.githubusercontent.com/Unleash/', // gets prepended to all of the documents when fetching - outDir: 'docs/generated', // the base directory to output to. - documents: sdks.urls, // the file names to download - modifyContent: sdks.modifyContent, - noRuntimeDownloads: true, + src: 'https://widget.kapa.ai/kapa-widget.bundle.js', + 'data-website-id': '1d187510-1726-4011-b0f7-62742ae064ee', + 'data-project-name': 'Unleash', + 'data-project-color': '#1A4049', + 'data-project-logo': + 'https://cdn.getunleash.io/uploads/2022/05/logo.png', + 'data-button-position-bottom': '80px', + defer: true, }, ], - [ - 'docusaurus-plugin-remote-content', - { - // more info at https://github.com/rdilweb/docusaurus-plugin-remote-content#options - name: 'content-external', - sourceBaseUrl: 'https://raw.githubusercontent.com/Unleash/', // gets prepended to all of the documents when fetching - outDir: 'docs/generated/', // the base directory to output to. - documents: edgeAndProxy.urls, // the file names to download - modifyContent: edgeAndProxy.modifyContent, - noRuntimeDownloads: true, - }, - ], - 'plugin-image-zoom', - ], - themes: [ - 'docusaurus-theme-openapi-docs', // Allows use of @theme/ApiItem and other components - ], - scripts: [ - { - src: 'https://widget.kapa.ai/kapa-widget.bundle.js', - 'data-website-id': '1d187510-1726-4011-b0f7-62742ae064ee', - 'data-project-name': 'Unleash', - 'data-project-color': '#1A4049', - 'data-project-logo': - 'https://cdn.getunleash.io/uploads/2022/05/logo.png', - defer: true, - }, - ], - clientModules: ['./global.js'], -}; - -export default config; + clientModules: ['./global.js'], + }; +}