{"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;;"}