sanity-plugin-link-field
Version:
A custom Link field for Sanity Studio
1 lines • 6.5 kB
Source Map (JSON)
{"version":3,"file":"component.mjs","sources":["../src/helpers/generateHref.ts","../src/helpers/getLinkText.ts","../src/components/Link.tsx"],"sourcesContent":["import {type UrlObject} from 'url'\n\nimport {InternalLink, LinkValue} from '../types'\nimport {isCustomLink, isEmailLink, isExternalLink, isPhoneLink} from './typeGuards'\n\nexport const generateHref = {\n internal: (link: LinkValue, hrefResolver?: (link: InternalLink) => string | UrlObject) => {\n const internalLink = link as InternalLink\n const resolvedHref =\n internalLink.internalLink && hrefResolver ? hrefResolver(internalLink) : undefined\n\n // Support UrlObjects, e.g. from Next.js\n if (typeof resolvedHref === 'object' && 'pathname' in resolvedHref) {\n resolvedHref.hash = internalLink.anchor?.replace(/^#/, '')\n\n if (internalLink.parameters) {\n const params = new URLSearchParams(internalLink.parameters)\n const resolvedParams = new URLSearchParams(resolvedHref.query?.toString())\n\n for (const [key, value] of params.entries()) {\n resolvedParams.set(key, value)\n }\n\n resolvedHref.query = resolvedParams.toString()\n }\n\n return resolvedHref\n }\n\n let href =\n resolvedHref ||\n (internalLink.internalLink?.slug?.current\n ? `/${internalLink.internalLink.slug.current.replace(/^\\//, '')}`\n : undefined)\n\n if (href && typeof href === 'string') {\n href += (internalLink.parameters?.trim() || '') + (internalLink.anchor?.trim() || '')\n }\n\n return href || '#'\n },\n external: (link: LinkValue) =>\n isExternalLink(link) && link.url\n ? link.url.trim() + (link.parameters?.trim() || '') + (link.anchor?.trim() || '')\n : '#',\n email: (link: LinkValue) =>\n isEmailLink(link) && link.email ? `mailto:${link.email.trim()}` : '#',\n phone: (link: LinkValue) =>\n isPhoneLink(link) && link.phone\n ? // Tel links cannot contain spaces\n `tel:${link.phone?.replace(/\\s+/g, '').trim()}`\n : '#',\n custom: (link: LinkValue) =>\n isCustomLink(link) && link.value\n ? link.value.trim() + (link.parameters?.trim() || '') + (link.anchor?.trim() || '')\n : '#',\n}\n","import {LinkValue} from '../types'\nimport {isCustomLink, isEmailLink, isExternalLink, isInternalLink, isPhoneLink} from './typeGuards'\n\n/**\n * Get the text to display for the given link.\n */\nexport const getLinkText = (link: LinkValue): string =>\n link.text ||\n (isInternalLink(link)\n ? // Naively try to get the title or slug of the internal link\n link.internalLink?.title || link.internalLink?.slug?.current\n : isExternalLink(link)\n ? link.url\n : isPhoneLink(link)\n ? link.phone\n : isEmailLink(link)\n ? link.email\n : isCustomLink(link)\n ? link.value\n : undefined) ||\n '#'\n","import React, {type ElementType, type ForwardedRef, forwardRef} from 'react'\n\nimport {generateHref} from '../helpers/generateHref'\nimport {getLinkText} from '../helpers/getLinkText'\nimport {isCustomLink, isEmailLink, isPhoneLink} from '../helpers/typeGuards'\nimport {InternalLink, LinkValue} from '../types'\n\ntype LinkProps = {\n link?: LinkValue\n as?: ElementType\n hrefResolver?: (link: InternalLink) => string\n} & Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href' | 'target'>\n\nconst Link = forwardRef(\n (\n {link, as: Component = 'a', hrefResolver, children, ...props}: LinkProps,\n ref: ForwardedRef<HTMLAnchorElement>,\n ) => {\n if (!link) {\n return null\n }\n\n // If no link text is provided, try and find a fallback\n if (!children) {\n // eslint-disable-next-line no-param-reassign\n children = getLinkText(link)\n }\n\n return (\n <Component\n href={\n link.type === 'internal'\n ? generateHref[link.type]?.(link, hrefResolver)\n : generateHref[isCustomLink(link) ? 'custom' : link.type]?.(link)\n }\n target={!isPhoneLink(link) && !isEmailLink(link) && link.blank ? '_blank' : undefined}\n ref={ref}\n {...props}\n >\n {children}\n </Component>\n )\n },\n)\n\nLink.displayName = 'Link'\n\nexport {Link, type LinkProps}\n"],"names":[],"mappings":"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"}