From 97ebd29707dc022cf945b7e2d8c110ca90cdb3a9 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Fri, 28 Oct 2022 15:31:31 +0530 Subject: docs: add version banner (#1487) --- docs/.vitepress/components/Banner.vue | 108 ++++++++++++++++++++++++++++++++++ docs/.vitepress/components/shims.d.ts | 7 +++ docs/.vitepress/config.ts | 29 ++++++++- docs/.vitepress/theme/index.ts | 20 ++++++- docs/.vitepress/tsconfig.json | 1 + docs/.vitepress/versions.ts | 13 ++++ 6 files changed, 175 insertions(+), 3 deletions(-) create mode 100644 docs/.vitepress/components/Banner.vue create mode 100644 docs/.vitepress/components/shims.d.ts (limited to 'docs') diff --git a/docs/.vitepress/components/Banner.vue b/docs/.vitepress/components/Banner.vue new file mode 100644 index 00000000..9eea81c9 --- /dev/null +++ b/docs/.vitepress/components/Banner.vue @@ -0,0 +1,108 @@ + + + + + + These docs are of {{ version }}. For docs of the current version visit: + fakerjs.dev + + + + + + + + + + + + + diff --git a/docs/.vitepress/components/shims.d.ts b/docs/.vitepress/components/shims.d.ts new file mode 100644 index 00000000..7ae275ab --- /dev/null +++ b/docs/.vitepress/components/shims.d.ts @@ -0,0 +1,7 @@ +declare const __BANNER__: string | false; + +declare module '*.vue' { + import type { DefineComponent } from 'vue'; + const component: DefineComponent; + export default component; +} diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 1191ddd1..aa0045d8 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -1,7 +1,7 @@ import { defineConfig } from 'vitepress'; import { DefaultTheme } from 'vitepress/theme'; import { apiPages } from './api-pages'; -import { currentVersion, oldVersions } from './versions'; +import { currentVersion, oldVersions, versionBannerInfix } from './versions'; type SidebarGroup = DefaultTheme.SidebarGroup; @@ -51,7 +51,7 @@ function extendSideNav(current: SidebarGroup): SidebarGroup[] { return links; } -export default defineConfig({ +const config = defineConfig({ title: 'Faker', description, @@ -229,4 +229,29 @@ export default defineConfig({ }), }, }, + + vite: { + define: { + __BANNER__: versionBannerInfix ?? false, + }, + }, }); + +if (versionBannerInfix) { + config.head?.push([ + 'script', + { id: 'restore-banner-preference' }, + ` +(() => { + const restore = (key, cls, def = false) => { + const saved = localStorage.getItem(key); + if (saved ? saved !== 'false' && new Date() < saved : def) { + document.documentElement.classList.add(cls); + } + }; + restore('faker-version-banner', 'banner-dismissed'); +})();`, + ]); +} + +export default config; diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 2423da6b..8555a839 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,4 +1,22 @@ import DefaultTheme from 'vitepress/theme'; +import { defineAsyncComponent, h } from 'vue'; import './index.css'; -export default DefaultTheme; +export default { + ...DefaultTheme, + Layout() { + return h( + DefaultTheme.Layout, + null, + __BANNER__ + ? { + 'layout-top': () => + h( + defineAsyncComponent(() => import('../components/Banner.vue')), + { version: __BANNER__ } + ), + } + : null + ); + }, +}; diff --git a/docs/.vitepress/tsconfig.json b/docs/.vitepress/tsconfig.json index 74d4053a..75b15f9e 100644 --- a/docs/.vitepress/tsconfig.json +++ b/docs/.vitepress/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "target": "ES2020", + "module": "ES2020", "moduleResolution": "Node", "resolveJsonModule": true } diff --git a/docs/.vitepress/versions.ts b/docs/.vitepress/versions.ts index 7d37619d..2964557c 100644 --- a/docs/.vitepress/versions.ts +++ b/docs/.vitepress/versions.ts @@ -41,6 +41,19 @@ const hiddenLink = const otherVersions = readOtherLatestReleaseTagNames(); const isReleaseBranch = /^v\d+$/.test(branchName); +export const versionBannerInfix: string | null = (() => { + if (deployContext === 'production') { + return null; + } + if (isReleaseBranch) { + return '"an old version"'; + } + if (branchName === 'next') { + return '"the next (unreleased) version"'; + } + return '"a development version"'; +})(); + export const currentVersion = isReleaseBranch ? `v${version}` : branchName; export const oldVersions = [ { -- cgit v1.2.3