Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion demo/components/Code.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
3 changes: 2 additions & 1 deletion demo/components/Leaflet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, unknown>)['_getIconUrl']
L.Icon.Default.mergeOptions({
iconUrl: markerIcon,
iconRetinaUrl: markerIcon2x,
Expand Down
27 changes: 15 additions & 12 deletions src/components/merge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<K extends 'block' | 'list' | 'listItem' | 'marks' | 'types'>(
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
Expand Down