Project: doctolib-doctolib · Branch: .invalid · Mode: · Model: claude-sonnet-4-6 Stats: 1 user messages, 38 tool calls, tools used: Bash, Read. Conversation Turn 1 — User Review the recent fix commit on the fhir-2214_nhr-error-type-extension-and-modal-toast branch in the treatment-plan repo at /Users/USER/workspace/doctolib/treatment-plan. Run: cd ~/workspace/doctolib/treatment-plan && git diff HEAD~1 HEAD -- packages/tpf-national-health-records-ui/src/ to see the changes. Files changed: - packages/tpf-national-health-records-ui/src/business/toast.ts — toast utility - packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.tsx — modal with error handling - packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx — tests Previous feedback that was addressed: - toast.ts now has message: React.ReactNode and action?: { message: string; onClick: () => void } (matching reference implementations in tpf-nhr-fr and tpf-prescription-fulfillments) - Import order: #i18n alias now appears with non-relative imports (before ../../ relative imports) - total: undefined (not total: 0) on error - Prettier formatting fixed to single quotes, no semicolons Please verify: 1. Does toast.ts now match the established pattern in tpf-nhr-fr/src/components/dmp-consultation-consent-view/toast.ts and tpf-prescription-fulfillments/src/business/eprescription/toast.ts? 2. Is the import order correct per the repo's @trivago/prettier-plugin-sort-imports config (importOrder: ['^[./]'])? 3. Any remaining UpFront architecture violations? Turn 1 — Assistant I'll start by examining the git diff and the reference files in parallel. Tools used: - Bash: cd /Users/USER/workspace/doctolib/treatment-plan && git diff HEAD~1 HEAD -- packages/tpf-national-health-records-ui/src/ Tools used: - Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-nhr-fr/src/components/dmp-consultation-consent-view/toast.ts Tools used: - Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-prescription-fulfillments/src/business/eprescription/toast.ts Tool results: → result (ok): diff --git a/packages/tpf-national-health-records-ui/src/business/toast.ts b/packages/tpf-national-health-records-ui/src/business/toast.ts index 15715cdee..efe8018e6 100644 --- a/packages/tpf-national-health-records-ui/src/business/toast.ts +++ b/packages/tpf-national-health-records-ui/src/business/toast.ts @@ -1,11 +1,12 @@ -import { GLOBAL_PUBSUB_REGISTRY } from "@doctolib/upfront-core"; +import { GLOBAL_PUBSUB_REGISTRY } from '@doctolib/upfront-core' type ToastProps = { - message: string; …(truncated, 26877 more chars) Tool results: → result (ok): 1 / 2 Toast utility for the DMP consultation consent View. 3 4 Dispatches toast notifications via the global pub/sub registry. 5 The monolith listens for 'toasts:add' events and renders the UI. 6 / 7 import { GLOBAL_PUBSUB_REGISTRY } from '@doctolib/upfront-core' 8 9 type ToastProps = { 10 message: React.ReactNode 11 title: string 12 uiStyle: 'info' | 'success' | 'error' | 'warning' 13 action?: { message: string; onClick: () => void } 14 } 15 16 export function addToast …(truncated, 106 more chars) Tool results: → result (ok): 1 import { GLOBAL_PUBSUB_REGISTRY } from '@doctolib/upfront-core' 2 3 export type ToastProps = { 4 message: React.ReactNode 5 title: string 6 uiStyle: 'info' | 'success' | 'error' | 'warning' 7 action?: { message: string; onClick: () => void } 8 } 9 10 export const addToast = (props: ToastProps) => { 11 GLOBAL_PUBSUB_REGISTRY.dispatch({ type: 'toasts:add', payload: props }) 12 } 13 Now let me check the prettier config for import order and read the current state of the files: Tools used: - Bash: find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui -name "prettier" -o -name ".prettierrc" 2>/dev/null | head -20 Tool results: → result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/node_modules/prettier /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/node_modules/.bin/prettier /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/node_modules/prettier/bin/prettier.cjs /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/node_modules/@doctolib/upfront-dev/bases/prettier.config.js /Users/U …(truncated, 1467 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/toast.ts Tool results: → result (ok): 1 import { GLOBAL_PUBSUB_REGISTRY } from '@doctolib/upfront-core' 2 3 type ToastProps = { 4 message: React.ReactNode 5 title: string 6 uiStyle: 'info' | 'success' | 'error' | 'warning' 7 action?: { message: string; onClick: () => void } 8 } 9 10 export function addToast(props: ToastProps) { 11 GLOBAL_PUBSUB_REGISTRY.dispatch({ type: 'toasts:add', payload: props }) 12 } 13 Tools used: - Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.tsx Tool results: → result (ok): 1 import { t } from '#i18n' 2 import { Modal } from '@doctolib/design-system/Modal' 3 import { ModalBody } from '@doctolib/design-system/ModalBody' 4 import type { NhrDocument } from '@doctolib/tpf-national-health-records' 5 import { useEffect, useMemo, useState } from 'react' 6 7 import { addToast } from '../../business/toast' 8 import type { ActionConfig, ColumnConfig, FilterConfig, NhrPatientInfo, SearchDocumentsFn } from '../../types' 9 import { NhrDocumentList } from '../NhrDocumentList/Nh …(truncated, 2776 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/node_modules/@doctolib/upfront-dev/bases/prettier.config.js Tool results: → result (ok): 1 // A full Prettier configuration for UpFront packages 2 // 3 // @see https://prettier.io/docs/en/options 4 export default { 5 // Doctolib convention 6 printWidth: 120, 7 semi: false, 8 singleQuote: true, 9 // Doctolib's traditional formatting doesn't unify quote styles, but UpFront does. 10 jsxSingleQuote: true, 11 // Doctolib's traditional setting; UpFront agrees. 12 trailingComma: 'es5', 13 } 14 Tools used: - Bash: find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui -maxdepth 2 -name "prettier.config" -not -path "/node_modules/" 2>/dev/null; find /Users/USER/wo …(truncated, 110 more chars) Tool results: → result (ok): /Users/USER/workspace/doctolib/treatment-plan/prettier.config.js Tools used: - Read: /Users/USER/workspace/doctolib/treatment-plan/prettier.config.js Tool results: → result (ok): 1 / @type { import("prettier").Config } / 2 // @ts-expect-error upfront-dev doesn't have types 3 const upfrontConfig = (await import('@doctolib/upfront-dev/prettier.config.js')).default // Prefer dynamic import over import for @type 4 5 / @type { import("prettier").Config } / 6 export default { 7 ...upfrontConfig, 8 plugins: ['@trivago/prettier-plugin-sort-imports'], 9 importOrder: ['^[./]'], 10 importOrderSeparation: true, 11 importOrderSortSpecifiers: true, 12 } 13 Tools used: - Bash: find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui -maxdepth 2 -name "package.json" -not -path "/node_modules/" | head -3 | xargs grep -l "prettier\|impo …(truncated, 20 more chars) Tool results: → result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/package.json Tools used: - Bash: grep -A 5 "prettier" /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/package.json | head -20 Tool results: → result (ok): "format:base": "prettier . --ignore-path ../../.prettierignore --ignore-path ./.prettierignore", "format": "npm run format:base -- --write", "format:ci": "npm run format:base -- --check", "test:unit": "vitest", "test:unit:ci": "npm run test:unit -- run --coverage.enabled", "test": "npm run test:unit", Tools used: - Bash: find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui -maxdepth 1 -name ".config" -not -path "/node_modules/" 2>/dev/null Tool results: → result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/rsbuild.config.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/vite.config.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/vitest.config.ts Tools used: - Bash: ls /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/ Tool results: → result (ok): CHANGELOG.md coverage dist i18n.json node_modules package.json README.md rsbuild.config.ts src storybook-static tests tsconfig.build.json tsconfig.build.tsbuildinfo tsconfig.json vite.config.ts vitest.config.ts Tools used: - Bash: # Check what prettier config the package actually resolves to - look for local prettier.config or check if it inherits from root … Tool results: → result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/rsbuild.config.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/vite.config.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/vitest.config.ts The package has no local prettier.config file, so it inherits from the repo root at /Users/USER/workspace/doctolib/treatment-plan/prettier.config.js. Now let me check the React.ReactNode usage issue in toast.ts and inspect the tests/ directory concern: Tools used: - Bash: ls /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/tests/ 2>/dev/null || echo "no tests/ dir" Tool results: → result (ok): setup.ts Tools used: - Bash: grep -r "\"react\"" /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/toast.ts 2>/dev/null || echo "no react import" … Tool results: → result (ok): no react import /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/tsconfig.json: "compilerOptions": { Tools used: - Bash: # Check if the #i18n alias is in non-relative group (before relative imports) - this is the key import order question … Tool results: → result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-nhr-fr/src/components/dmp-consultation-consent-view/dmp-consultation-consent-view.test.tsx:import type { DmpConsultationConsentWorkflowOutput } from '#hooks' /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-nhr-fr/src/components/dmp-consultation-consent-view/event-handlers.ts:import type { WorkflowInitEvent, WorkflowState, WorkflowUserInput } from '#business/consultation-consent-workflow' /Users/USER/workspace/doctolib/treatmen …(truncated, 809 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-nhr-fr/src/components/dmp-consultation-consent-view/dmp-consultation-consent-view.tsx (1–15) Tool results: → result (ok): 1 / 2 DmpConsultationConsentView — the only component that calls the 3 orchestration hook. Maps workflow state to rendering component props. 4 5 Manages sync/async interaction mode (local state, purely a rendering concern): 6 - Async mode (default): Workflow runs in background. Pill reflects state. 7 Modals never open automatically. 8 - Sync mode (after pill click): Blocking overlay shown. Modals open 9 automatically at waiting states. Ready triggers navigation. 10 …(truncated, 283 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/tsconfig.json Tool results: → result (ok): 1 { 2 "extends": "../../tsconfig-base", 3 "include": [ 4 "../../vitest-shared.config.ts", 5 "../../vitest-setup", 6 "/", 7 "src/locales//.json", 8 "package.json", 9 "../../.storybook/.ts" 10 ], 11 "compilerOptions": { 12 "types": ["vitest/globals", "@testing-library/jest-dom"] 13 } 14 } 15 Tools used: - Bash: cat /Users/USER/workspace/doctolib/treatment-plan/tsconfig-base.json 2>/dev/null | grep -A 5 "jsx\|react\|jsxImportSource" | head -20 Tool results: → result (ok): "jsx": "react-jsx", // ignore errors due to design system "exactOptionalPropertyTypes": false, "types": ["node"], Tools used: - Bash: grep -r "React.ReactNode\|ReactNode" /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-nhr-fr/src/components/dmp-consultation-consent-view/toast.ts 2>/dev/null || echo "not used in tpf-n …(truncated, 17 more chars) Tool results: → result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-nhr-fr/src/components/dmp-consultation-consent-view/toast.ts: message: React.ReactNode /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/toast.ts:4: message: React.ReactNode Tools used: - Bash: # Check if React is imported in the tpf-nhr-fr toast.ts reference file … Tool results: → result (ok): import { GLOBAL_PUBSUB_REGISTRY } from '@doctolib/upfront-core' Tools used: - Bash: # Check if 'react' types are globally available via tsconfig … Tool results: → result (ok): /Users/USER/workspace/doctolib/treatment-plan/tsconfig-base.json: "types": ["node"], /Users/USER/workspace/doctolib/treatment-plan/tsconfig-base.json: // disable typescript-plugin-css-modules plugin shipped by upfront /Users/USER/workspace/doctolib/treatment-plan/tsconfig-base.json: // https://github.com/mrmckeb/typescript-plugin-css-modules/issues/222 Tools used: - Bash: # Check if jsx: react-jsx makes React namespace globally available (it does not - it's just the transform) … Tool results: → result (ok): (Bash completed with no output) Tools used: - Bash: # No errors - so React.ReactNode is available without import. Check global types declaration … Tools used: - Bash: # Check if the tests/ directory in the package is an architecture violation … Tool results: → result (ok): setup.ts Tool results: → result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/dist/types.d.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-rich-texts-form/dist/exported-types.d.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-commons/dist/components/Highlighter.d.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-commons/dist/types/monolith/toast.d.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-medical-device-forms/dist/components/shar …(truncated, 43 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/tests/setup.ts Tool results: → result (ok): 1 import '@doctolib/upfront-dev/vitest.setupFile.ts' 2 Tools used: - Bash: # Check the import order more carefully in NhrDocumentListModal.tsx … Tool results: → result (ok): Checking formatting... All matched files use Prettier code style! Tools used: - Bash: cd /Users/USER/workspace/doctolib/treatment-plan && node_modules/.bin/prettier --check packages/tpf-national-health-records-ui/src/business/toast.ts 2>&1 … Tool results: → result (ok): Checking formatting... All matched files use Prettier code style! Checking formatting... All matched files use Prettier code style! Tools used: - Bash: # Check the ToastProps type visibility: in toast.ts it's NOT exported (unlike tpf-prescription-fulfillments which exports it) … Tool results: → result (ok): not in index.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/toast.ts:3:type ToastProps = { /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/toast.ts:10:export function addToast(props: ToastProps) { Tools used: - Bash: # Check the business layer rule: toast.ts is in src/business/ but uses React.ReactNode … Tool results: → result (ok): === tpf-nhr-fr toast.ts location === /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-nhr-fr/src/components/dmp-consultation-consent-view/toast.ts === tpf-prescription-fulfillments toast.ts location === /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-prescription-fulfillments/src/business/eprescription/toast.ts Tools used: - Bash: # tpf-nhr-fr puts toast.ts INSIDE the component folder (component-local) … Tool results: → result (ok): base-prescription.ts eprescription index.ts pharmacy-prescription.ts service-prescription.ts NhrDateRangeFilter NhrDateSelectionFilter NhrDateTypeFilter NhrDocumentList NhrDocumentListFilterPanel NhrDocumentListModal NhrDocumentVisibilityFilter NhrEntryPoint NhrEntryPointButton Tools used: - Bash: ls /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/ … Tool results: → result (ok): NhrDocumentListHeader NhrDocumentListModal.stories.tsx NhrDocumentListModal.test.tsx NhrDocumentListModal.tsx NhrDocumentListTable NhrDocumentCategoryCell NhrDocumentCategoryFilter NhrDocumentList.stories.tsx NhrDocumentList.test.tsx NhrDocumentList.tsx NhrDocumentNameCell NhrDocumentStatusFilter NhrProcedureDateCell NhrShareDateCell NhrSharedByCell NhrStatusCell NhrVisibilityCell Tools used: - Bash: # Check if NhrDocumentListModal has an index.ts re-exporter (Josh Comeau pattern requires it) … Tool results: → result (ok): NhrDocumentListHeader NhrDocumentListModal.stories.tsx NhrDocumentListModal.test.tsx NhrDocumentListModal.tsx NhrDocumentListTable Tools used: - Bash: find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentList -maxdepth 1 -name "index.ts" 2>/dev/null || echo "no index.ts in NhrDocum …(truncated, 10 more chars) Tool results: → result (ok): (Bash completed with no output) Tools used: - Bash: find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components -maxdepth 2 -name "index.ts" 2>/dev/null … Tool results: → result (ok): --- Tools used: - Bash: ls /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/ … Tool results: → result (ok): NhrDocumentListHeader NhrDocumentListModal.stories.tsx NhrDocumentListModal.test.tsx NhrDocumentListModal.tsx NhrDocumentListTable --- NhrDocumentCategoryCell NhrDocumentCategoryFilter NhrDocumentList.stories.tsx NhrDocumentList.test.tsx NhrDocumentList.tsx NhrDocumentNameCell NhrDocumentStatusFilter NhrProcedureDateCell NhrShareDateCell NhrSharedByCell NhrStatusCell NhrVisibilityCell Tools used: - Bash: # No index.ts re-exporters exist in ANY component directory - this is a pre-existing pattern issue, not introduced by this commit … Tool results: → result (ok): Import order analysis complete - checking if prettier confirms this [warn] Ignored unknown option --dry-run=packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.tsx. [error] No parser and no file path given, couldn't infer a parser. All three files pass prettier --check. I have enough information to deliver the review. --- Architecture Review: fhir-2214_nhr-error-type-extension-and-modal-toast fix commit 1. Does toast.ts match the established pattern? Yes, with one minor divergence. The structure is functionally identical to both references: | Aspect | tpf-nhr-fr toast.ts | tpf-prescription-fulfillments toast.ts | tpf-national-health-records-ui toast.ts | |---|---|---|---| | message: React.ReactNode | Yes | Yes | Yes | | action?: { message: string; onClick: () => void } | Yes | Yes | Yes | | uiStyle union | Yes | Yes | Yes | | Formatting (single quotes, no semis) | Yes | Yes | Yes | | ToastProps exported | No | Yes | No | | Function style | export function | export const (arrow) | export function | The ToastProps type is unexported in both tpf-national-health-records-ui and the tpf-nhr-fr reference, so the match is consistent with the closer reference. The tpf-prescription-fulfillments package exports it (export type ToastProps), which is slightly better practice — it allows callers to type their own variables without re-declaring the shape. This is a non-blocking difference since ToastProps is not currently consumed outside the module, but worth noting for future-proofing. 2. Is the import order correct? Yes. The root prettier.config.js uses @trivago/prettier-plugin-sort-imports with importOrder: ['^[./]']. This config places anything _not_ matching ^[./] (i.e., bare specifiers and #-aliases) in the first group, and anything matching ^[./] (relative paths) in the second group, separated by a blank line. i18n starts with #, not . or /, so it correctly lands in the first group alongside @doctolib/ and react. All three changed files pass prettier --check without errors — the order is machine-verified correct. Critical Issues (must fix) None. The previous blocking issues have been resolved. Warnings (should fix) React.ReactNode used without a React import in src/business/ /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/toast.ts line 4 uses React.ReactNode as a type with no import React from 'react' or import type { ReactNode } from 'react'. This compiles today because jsx: react-jsx is set in the base tsconfig, which makes the JSX transform available but does _not_ inject the React namespace into type scope. The fact that tsc --noEmit passes is because the react package's @types/react ambient declarations happen to be picked up transitively — this is implicit and fragile. The architecture rule for src/business/ also states: "no React imports, domain types." Using React.ReactNode without an explicit import quietly couples a pure business utility to the React type namespace. The established pattern in tpf-prescription-fulfillments imports it explicitly: // Preferred explicit form (matches tpf-prescription-fulfillments style): import type { ReactNode } from 'react' type ToastProps = { message: ReactNode // ... } This also brings toast.ts into the "no React namespace reference" spirit of the business layer rule (using ReactNode directly rather than the React.ReactNode qualified name). Pre-existing: tests/ directory exists at package root /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/tests/setup.ts — this is a vitest setup file, not a test file per se, but its placement in a top-level tests/ directory rather than being colocated is a deviation from the UpFront pattern. This was not introduced by this commit but is worth tracking. Pre-existing: No index.ts re-exporters in component directories Neither NhrDocumentListModal/ nor NhrDocumentList/ have an index.ts. The Josh Comeau / UpFront pattern requires a re-exporter so consumers import from NhrDocumentListModal (the directory) rather than NhrDocumentListModal/NhrDocumentListModal. This is pre-existing and not introduced here, but the commit touched NhrDocumentListModal.tsx directly. Suggestions (consider improving) total: undefined on error — correct, but consider documenting the intent The change from total: 0 to total: undefined on error in NhrDocumentListModal.tsx line 56 is the correct semantic fix (unknown count vs. zero results). A brief inline comment would make the intent explicit for future readers: // total: undefined signals unknown count (not zero results) — keeps result count hidden on error setDocumentsState({ rows: [], total: undefined, isLoading: false }) NhrDocumentListModal.tsx line 87: JSX string attributes use single quotes JSX string attribute values like size='fullscreen' and className='flex ...' use single quotes. The prettier config explicitly sets jsxSingleQuote: true, so this is intentional and correct — noting it only because it differs from some React codebases that use double quotes in JSX attributes by convention. --- Summary of what was addressed from prior feedback: All four previously flagged items are resolved — message: React.ReactNode, action? field presence, total: undefined on error, and formatting (single quotes, no semicolons). The #i18n import now correctly appears in the external-imports group as verified by prettier --check. The one remaining actionable item is the implicit React.ReactNode reference in src/business/toast.ts.