sanity-plugin-link-field
Version:
A custom Link field for Sanity Studio
1 lines • 6.11 kB
Source Map (JSON)
{"version":3,"file":"component.cjs","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 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":["isExternalLink","isEmailLink","isPhoneLink","isCustomLink","isInternalLink","forwardRef","jsx"],"mappings":";;;AAKO,MAAM,eAAe;AAAA,EAC1B,UAAU,CAAC,MAAiB,iBAA8D;AACxF,UAAM,eAAe,MACf,eACJ,aAAa,gBAAgB,eAAe,aAAa,YAAY,IAAI;AAG3E,QAAI,OAAO,gBAAiB,YAAY,cAAc,cAAc;AAGlE,UAFA,aAAa,OAAO,aAAa,QAAQ,QAAQ,MAAM,EAAE,GAErD,aAAa,YAAY;AAC3B,cAAM,SAAS,IAAI,gBAAgB,aAAa,UAAU,GACpD,iBAAiB,IAAI,gBAAgB,aAAa,OAAO,SAAA,CAAU;AAEzE,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAA;AAChC,yBAAe,IAAI,KAAK,KAAK;AAG/B,qBAAa,QAAQ,eAAe,SAAA;AAAA,MACtC;AAEA,aAAO;AAAA,IACT;AAEA,QAAI,OACF,iBACC,aAAa,cAAc,MAAM,UAC9B,IAAI,aAAa,aAAa,KAAK,QAAQ,QAAQ,OAAO,EAAE,CAAC,KAC7D;AAEN,WAAI,QAAQ,OAAO,QAAS,aAC1B,SAAS,aAAa,YAAY,KAAA,KAAU,OAAO,aAAa,QAAQ,KAAA,KAAU,MAG7E,QAAQ;AAAA,EACjB;AAAA,EACA,UAAU,CAAC,SACTA,QAAAA,eAAe,IAAI,KAAK,KAAK,MACzB,KAAK,IAAI,UAAU,KAAK,YAAY,KAAA,KAAU,OAAO,KAAK,QAAQ,KAAA,KAAU,MAC5E;AAAA,EACN,OAAO,CAAC,SACNC,QAAAA,YAAY,IAAI,KAAK,KAAK,QAAQ,UAAU,KAAK,MAAM,KAAA,CAAM,KAAK;AAAA,EACpE,OAAO,CAAC,SACNC,QAAAA,YAAY,IAAI,KAAK,KAAK;AAAA;AAAA,IAEtB,OAAO,KAAK,OAAO,QAAQ,QAAQ,EAAE,EAAE,MAAM;AAAA,MAC7C;AAAA,EACN,QAAQ,CAAC,SACPC,QAAAA,aAAa,IAAI,KAAK,KAAK,QACvB,KAAK,MAAM,UAAU,KAAK,YAAY,KAAA,KAAU,OAAO,KAAK,QAAQ,UAAU,MAC9E;AACR,GClDa,cAAc,CAAC,SAC1B,KAAK,SACJC,QAAAA,eAAe,IAAI;AAAA;AAAA,EAEhB,KAAK,cAAc,SAAS,KAAK,cAAc,MAAM;AAAA,IACrDJ,uBAAe,IAAI,IACjB,KAAK,MACLE,QAAAA,YAAY,IAAI,IACd,KAAK,QACLD,QAAAA,YAAY,IAAI,IACd,KAAK,QACLE,qBAAa,IAAI,IACf,KAAK,QACL,WACZ,KCPI,OAAOE,MAAAA;AAAAA,EACX,CACE,EAAC,MAAM,IAAI,YAAY,KAAK,cAAc,UAAU,GAAG,MAAA,GACvD,QAEK,QAKA,aACH,WAAW,YAAY,IAAI,IAI3BC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MACE,KAAK,SAAS,aACV,aAAa,KAAK,IAAI,IAAI,MAAM,YAAY,IAC5C,aAAaH,QAAAA,aAAa,IAAI,IAAI,WAAW,KAAK,IAAI,IAAI,IAAI;AAAA,MAEpE,QAAQ,CAACD,QAAAA,YAAY,IAAI,KAAK,CAACD,QAAAA,YAAY,IAAI,KAAK,KAAK,QAAQ,WAAW;AAAA,MAC5E;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,IAAA;AAAA,EAAA,KAnBI;AAuBb;AAEA,KAAK,cAAc;;"}