From 6e00f7c373e2b162cf9520dc71576b680c1983e3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 9 Dec 2025 17:24:56 +0000 Subject: [PATCH 1/2] Initial plan From c00e2847143cf10d0e3b56b2f191efac3850770c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 9 Dec 2025 17:32:27 +0000 Subject: [PATCH 2/2] Fix unsafe type assertions to pass pnpm lint with zero warnings Co-authored-by: stipsan <81981+stipsan@users.noreply.github.com> --- demo/components/Code.tsx | 2 +- demo/components/Leaflet.tsx | 3 ++- src/components/merge.ts | 27 +++++++++++++++------------ 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/demo/components/Code.tsx b/demo/components/Code.tsx index 3d9acd8..2b3828c 100644 --- a/demo/components/Code.tsx +++ b/demo/components/Code.tsx @@ -7,7 +7,7 @@ import typescript from 'refractor/typescript' // Prism auto-highlights, but we only want the API, so we need to set it to manual mode if (typeof window !== 'undefined') { - const prismWindow = window as any + const prismWindow = window as Window & {Prism?: {manual?: boolean}} prismWindow.Prism = prismWindow.Prism || {} prismWindow.Prism.manual = true } diff --git a/demo/components/Leaflet.tsx b/demo/components/Leaflet.tsx index 6e9bbc6..7ad9ef9 100644 --- a/demo/components/Leaflet.tsx +++ b/demo/components/Leaflet.tsx @@ -5,7 +5,8 @@ import markerShadow from 'leaflet/dist/images/marker-shadow.png' import {MapContainer, Marker, Popup, TileLayer} from 'react-leaflet' // Yes, this is unfortunately required, and an intentional side-effect :/ -delete (L.Icon.Default.prototype as any)._getIconUrl +// oxlint-disable-next-line no-unsafe-type-assertion -- Deleting private property not in types +delete (L.Icon.Default.prototype as unknown as Record)['_getIconUrl'] L.Icon.Default.mergeOptions({ iconUrl: markerIcon, iconRetinaUrl: markerIcon2x, diff --git a/src/components/merge.ts b/src/components/merge.ts index 2a5dd0f..ed8058a 100644 --- a/src/components/merge.ts +++ b/src/components/merge.ts @@ -12,36 +12,39 @@ export function mergeComponents( types: _types, ...rest } = overrides - // @todo figure out how to not `as ...` these return { ...parent, - block: mergeDeeply(parent, overrides, 'block') as PortableTextReactComponents['block'], - list: mergeDeeply(parent, overrides, 'list') as PortableTextReactComponents['list'], - listItem: mergeDeeply(parent, overrides, 'listItem') as PortableTextReactComponents['listItem'], - marks: mergeDeeply(parent, overrides, 'marks') as PortableTextReactComponents['marks'], - types: mergeDeeply(parent, overrides, 'types') as PortableTextReactComponents['types'], + block: mergeDeeply(parent, overrides, 'block'), + list: mergeDeeply(parent, overrides, 'list'), + listItem: mergeDeeply(parent, overrides, 'listItem'), + marks: mergeDeeply(parent, overrides, 'marks'), + types: mergeDeeply(parent, overrides, 'types'), ...rest, } } -function mergeDeeply( +function mergeDeeply( parent: PortableTextReactComponents, overrides: PortableTextComponents, - key: 'block' | 'list' | 'listItem' | 'marks' | 'types', -): PortableTextReactComponents[typeof key] { + key: K, +): PortableTextReactComponents[K] { const override = overrides[key] const parentVal = parent[key] if (typeof override === 'function') { - return override + // oxlint-disable-next-line no-unsafe-type-assertion -- Functions are compatible + return override as PortableTextReactComponents[K] } if (override && typeof parentVal === 'function') { - return override + return override as PortableTextReactComponents[K] } if (override) { - return {...parentVal, ...override} as PortableTextReactComponents[typeof key] + if (typeof override === 'object' && typeof parentVal === 'object') { + return {...parentVal, ...override} as PortableTextReactComponents[K] + } + return override as PortableTextReactComponents[K] } return parentVal