diff --git a/package-lock.json b/package-lock.json index 1dd504b0d..94d00da4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "husky": "9.1.7", "lint-staged": "16.4.0", "prettier": "3.8.1", - "typescript": "5.9.2" + "typescript": "6.0.2" }, "engines": { "node": "~22.14.0", @@ -19959,9 +19959,9 @@ } }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", "devOptional": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 24416d27b..f3f81ad45 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "husky": "9.1.7", "lint-staged": "16.4.0", "prettier": "3.8.1", - "typescript": "5.9.2" + "typescript": "6.0.2" }, "browserslist": { "production": [ diff --git a/src/components/AdrTable.tsx b/src/components/AdrTable.tsx index c915e1dba..de50ad543 100644 --- a/src/components/AdrTable.tsx +++ b/src/components/AdrTable.tsx @@ -1,20 +1,49 @@ import React from "react"; -const formatDate = (date: Date) => { +const formatDate = (date: Date): string | undefined => { try { return date.toISOString().split("T")[0]; - } catch {} + } catch { + return undefined; + } }; -const badgeColors = { - Proposed: "primary", - Accepted: "success", - Rejected: "danger", - Deprecated: "warning", - Superseded: "warning", +const AdrStatus = { + Proposed: "Proposed", + Accepted: "Accepted", + Rejected: "Rejected", + Deprecated: "Deprecated", + Superseded: "Superseded", +} as const; + +type AdrStatus = (typeof AdrStatus)[keyof typeof AdrStatus]; + +const badgeColors: Record = { + [AdrStatus.Proposed]: "primary", + [AdrStatus.Accepted]: "success", + [AdrStatus.Rejected]: "danger", + [AdrStatus.Deprecated]: "warning", + [AdrStatus.Superseded]: "warning", }; -export default function AdrTable({ frontMatter }): JSX.Element { +function isAdrStatus(value: unknown): value is AdrStatus { + return typeof value === "string" && value in AdrStatus; +} + +interface AdrFrontMatter { + adr: string; + status?: string; + date: Date; +} + +export default function AdrTable({ + frontMatter, +}: { + frontMatter: AdrFrontMatter; +}): React.JSX.Element { + const { status } = frontMatter; + const badgeColor = isAdrStatus(status) ? badgeColors[status] : "secondary"; + return ( @@ -22,13 +51,11 @@ export default function AdrTable({ frontMatter }): JSX.Element { - {frontMatter.status && ( + {status && ( )} diff --git a/src/components/Bitwarden.tsx b/src/components/Bitwarden.tsx index b31171db7..4102b8d4f 100644 --- a/src/components/Bitwarden.tsx +++ b/src/components/Bitwarden.tsx @@ -1,7 +1,7 @@ -import React from "react"; +import React, { type ReactNode } from "react"; import { useDevMode } from "../contexts/devMode"; -export default function Bitwarden({ children }): JSX.Element { +export default function Bitwarden({ children }: { children: ReactNode }): React.JSX.Element { const { devMode } = useDevMode(); if (devMode === "bitwarden") { diff --git a/src/components/Community.tsx b/src/components/Community.tsx index 9011f6212..03ed5bcd9 100644 --- a/src/components/Community.tsx +++ b/src/components/Community.tsx @@ -1,7 +1,7 @@ -import React from "react"; +import React, { type ReactNode } from "react"; import { useDevMode } from "../contexts/devMode"; -export default function Community({ children }): JSX.Element { +export default function Community({ children }: { children: ReactNode }): React.JSX.Element { const { devMode } = useDevMode(); if (devMode === "community") { diff --git a/src/components/DevDropdown/index.tsx b/src/components/DevDropdown/index.tsx index c3cdc7633..9eca7ca6c 100644 --- a/src/components/DevDropdown/index.tsx +++ b/src/components/DevDropdown/index.tsx @@ -1,5 +1,7 @@ import React from "react"; import DropdownNavbarItem from "@theme-original/NavbarItem/DropdownNavbarItem"; +import type { Props as DropdownNavbarItemProps } from "@theme/NavbarItem/DropdownNavbarItem"; +import type { LinkLikeNavbarItemProps } from "@theme/NavbarItem"; import { useDevMode, DevModes } from "@site/src/contexts/devMode"; const dropdownOptions = [ @@ -11,28 +13,31 @@ const dropdownOptions = [ id: DevModes.bitwarden, label: "Bitwarden Developer", }, -]; +] as const; + +interface Props extends Omit { + readonly dropdownItemsBefore?: LinkLikeNavbarItemProps[]; + readonly dropdownItemsAfter?: LinkLikeNavbarItemProps[]; +} export default function DevDropdown({ mobile, dropdownItemsBefore, dropdownItemsAfter, ...props -}): JSX.Element { +}: Props): React.JSX.Element { const { devMode, setDevMode } = useDevMode(); - const items = dropdownOptions.map((item) => { - return { - label: item.label, - to: "#", - onClick: (e) => { - setDevMode(item.id); - e.preventDefault(); - }, - }; - }); + const items: DropdownNavbarItemProps["items"] = dropdownOptions.map((item) => ({ + label: item.label, + to: "#", + onClick: (e: React.MouseEvent) => { + setDevMode(item.id); + e.preventDefault(); + }, + })); - const dropdownLabel = dropdownOptions.find((i) => i.id == devMode).label; + const dropdownLabel = dropdownOptions.find((i) => i.id === devMode)?.label; return ; } diff --git a/src/contexts/devMode.tsx b/src/contexts/devMode.tsx index 0ff88758b..9c2b6a417 100644 --- a/src/contexts/devMode.tsx +++ b/src/contexts/devMode.tsx @@ -74,7 +74,7 @@ function useContextValue(): ContextValue { ); } -export function DevModeProvider({ children }: { children: ReactNode }): JSX.Element { +export function DevModeProvider({ children }: { children: ReactNode }): React.JSX.Element { const value = useContextValue(); return {children}; } diff --git a/src/theme/Layout/Provider/index.tsx b/src/theme/Layout/Provider/index.tsx index 6eb1791c9..57dda1a77 100644 --- a/src/theme/Layout/Provider/index.tsx +++ b/src/theme/Layout/Provider/index.tsx @@ -7,7 +7,7 @@ import { DevModeProvider } from "@site/src/contexts/devMode"; const Provider = composeProviders([DevModeProvider]); -export default function LayoutProvider({ children }: Props): JSX.Element { +export default function LayoutProvider({ children }: Props): React.JSX.Element { return ( {children} diff --git a/tsconfig.json b/tsconfig.json index 314eab8a4..6682a5637 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,9 @@ // This file is not used in compilation. It is here just for a nice editor experience. "extends": "@docusaurus/tsconfig", "compilerOptions": { - "baseUrl": "." + "baseUrl": null, + "paths": { + "@site/*": ["./*"] + } } } diff --git a/types/remark-kroki.d.ts b/types/remark-kroki.d.ts new file mode 100644 index 000000000..14faa22c6 --- /dev/null +++ b/types/remark-kroki.d.ts @@ -0,0 +1,14 @@ +// FIXME: delete this file once `remark-kroki` ships its own type definitions +// (or once `@types/remark-kroki` is published on DefinitelyTyped). Track +// upstream at https://github.com/show-docs/remark-kroki. +declare module "remark-kroki" { + export interface RemarkKrokiOptions { + server?: string; + headers?: Record; + alias?: string[]; + output?: string; + target?: "html" | "mdx3"; + } + + export function remarkKroki(options?: RemarkKrokiOptions): (tree: unknown) => Promise; +}
ID: ADR-{frontMatter.adr}
Status: - - {frontMatter.status?.toUpperCase()} - + {status.toUpperCase()}