@ndla/safelink 2.1.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/es/SafeLink.js CHANGED
@@ -15,7 +15,7 @@ function _EMOTION_STRINGIFIED_CSS_ERROR__() { return "You have tried to stringif
15
15
  * LICENSE file in the root directory of this source tree.
16
16
  *
17
17
  */
18
- import React, { useContext } from 'react';
18
+ import React, { forwardRef, useContext } from 'react';
19
19
  import { Link } from 'react-router-dom';
20
20
  import { Launch } from '@ndla/icons/common';
21
21
  import isString from 'lodash/isString';
@@ -39,32 +39,31 @@ var LaunchIcon = /*#__PURE__*/_styled(Launch, {
39
39
  } : {
40
40
  name: "vum9tn",
41
41
  styles: "margin-left:6px;height:auto;width:auto;margin-top:1px;",
42
- map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNhZmVMaW5rLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvQmlDIiwiZmlsZSI6IlNhZmVMaW5rLnRzeCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LXByZXNlbnQsIE5ETEEuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMdjMgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKi9cblxuaW1wb3J0IFJlYWN0LCB7IEhUTUxBdHRyaWJ1dGVzLCBNdXRhYmxlUmVmT2JqZWN0LCBSZWFjdE5vZGUsIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBMaW5rLCBMaW5rUHJvcHMgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcbmltcG9ydCB7IExhdW5jaCB9IGZyb20gJ0BuZGxhL2ljb25zL2NvbW1vbic7XG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAnbG9kYXNoL2lzU3RyaW5nJztcbmltcG9ydCBNaXNzaW5nUm91dGVyQ29udGV4dCBmcm9tICcuL01pc3NpbmdSb3V0ZXJDb250ZXh0JztcblxuY29uc3QgaXNFeHRlcm5hbExpbmsgPSAodG8/OiBMaW5rUHJvcHNbJ3RvJ10pID0+XG4gIHRvICYmIGlzU3RyaW5nKHRvKSAmJiAodG8uc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSB8fCB0by5zdGFydHNXaXRoKCdodHRwOi8vJykpO1xuXG5leHBvcnQgY29uc3QgaXNPbGROZGxhTGluayA9ICh0bz86IExpbmtQcm9wc1sndG8nXSkgPT4gdG8gJiYgaXNTdHJpbmcodG8pICYmIHRvLm1hdGNoKC8oLiopXFwvP25vZGVcXC8oXFxkKykuKi8pICE9PSBudWxsO1xuXG5jb25zdCBMYXVuY2hJY29uID0gc3R5bGVkKExhdW5jaClgXG4gIG1hcmdpbi1sZWZ0OiA2cHg7XG4gIGhlaWdodDogYXV0bztcbiAgd2lkdGg6IGF1dG87XG4gIG1hcmdpbi10b3A6IDFweDtcbmA7XG5cbnR5cGUgUHJvcHMgPSB7XG4gIHNob3dOZXdXaW5kb3dJY29uPzogYm9vbGVhbjtcbiAgcmVmPzogTXV0YWJsZVJlZk9iamVjdDxIVE1MQW5jaG9yRWxlbWVudCB8IG51bGw+O1xuICBjaGlsZHJlbj86IFJlYWN0Tm9kZTtcbn07XG5cbmV4cG9ydCB0eXBlIFNhZmVMaW5rUHJvcHMgPSBQcm9wcyAmIExpbmtQcm9wcyAmIEhUTUxBdHRyaWJ1dGVzPEhUTUxFbGVtZW50PjtcblxuLy8gRmFsbGJhY2sgdG8gbm9ybWFsIGxpbmsgaWYgYXBwIGlzIG1pc3NpbmcgUm91dGVyQ29udGV4dCwgbGluayBpcyBleHRlcm5hbCBvciBpcyBvbGQgbmRsYSBsaW5rXG5jb25zdCBTYWZlTGluayA9ICh7IHRvLCByZXBsYWNlLCBjaGlsZHJlbiwgc2hvd05ld1dpbmRvd0ljb24sIHRhYkluZGV4LCByZWYsIC4uLnJlc3QgfTogU2FmZUxpbmtQcm9wcykgPT4ge1xuICBjb25zdCBpc01pc3NpbmdSb3V0ZXJDb250ZXh0ID0gdXNlQ29udGV4dChNaXNzaW5nUm91dGVyQ29udGV4dCk7XG5cbiAgaWYgKGlzTWlzc2luZ1JvdXRlckNvbnRleHQgfHwgaXNFeHRlcm5hbExpbmsodG8pIHx8IGlzT2xkTmRsYUxpbmsodG8pKSB7XG4gICAgY29uc3QgaHJlZiA9IHR5cGVvZiB0byA9PT0gJ3N0cmluZycgPyB0byA6ICcjJztcbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPGEgaHJlZj17aHJlZn0gcmVmPXtyZWZ9IHsuLi5yZXN0fT5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAge3Nob3dOZXdXaW5kb3dJY29uICYmIDxMYXVuY2hJY29uIHN0eWxlPXt7IHZlcnRpY2FsQWxpZ246ICd0ZXh0LXRvcCcgfX0gLz59XG4gICAgICAgIDwvYT5cbiAgICAgIDwvPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIC8vIFJSNiBsaW5rIGltbWVkaWF0ZWx5IGZhaWxzIGlmIHRvIGlzIHNvbWVob3cgdW5kZWZpbmVkLCBzbyB3ZSBwcm92aWRlIGFuIGVtcHR5IGZhbGxiYWNrIHRvIHJlY292ZXIuXG4gICAgPExpbmsgcmVmPXtyZWZ9IHRhYkluZGV4PXt0YWJJbmRleCA/PyAwfSB0bz17dG8gPz8gJyd9IHJlcGxhY2U9e3JlcGxhY2V9IHsuLi5yZXN0fT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICAgIHtzaG93TmV3V2luZG93SWNvbiAmJiA8TGF1bmNoSWNvbiBzdHlsZT17eyB2ZXJ0aWNhbEFsaWduOiAndGV4dC10b3AnIH19IC8+fVxuICAgIDwvTGluaz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNhZmVMaW5rO1xuIl19 */",
42
+ map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNhZmVMaW5rLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvQmlDIiwiZmlsZSI6IlNhZmVMaW5rLnRzeCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LXByZXNlbnQsIE5ETEEuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMdjMgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKi9cblxuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYsIEhUTUxBdHRyaWJ1dGVzLCBNdXRhYmxlUmVmT2JqZWN0LCBSZWFjdE5vZGUsIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBMaW5rLCBMaW5rUHJvcHMgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcbmltcG9ydCB7IExhdW5jaCB9IGZyb20gJ0BuZGxhL2ljb25zL2NvbW1vbic7XG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAnbG9kYXNoL2lzU3RyaW5nJztcbmltcG9ydCBNaXNzaW5nUm91dGVyQ29udGV4dCBmcm9tICcuL01pc3NpbmdSb3V0ZXJDb250ZXh0JztcblxuY29uc3QgaXNFeHRlcm5hbExpbmsgPSAodG8/OiBMaW5rUHJvcHNbJ3RvJ10pID0+XG4gIHRvICYmIGlzU3RyaW5nKHRvKSAmJiAodG8uc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSB8fCB0by5zdGFydHNXaXRoKCdodHRwOi8vJykpO1xuXG5leHBvcnQgY29uc3QgaXNPbGROZGxhTGluayA9ICh0bz86IExpbmtQcm9wc1sndG8nXSkgPT4gdG8gJiYgaXNTdHJpbmcodG8pICYmIHRvLm1hdGNoKC8oLiopXFwvP25vZGVcXC8oXFxkKykuKi8pICE9PSBudWxsO1xuXG5jb25zdCBMYXVuY2hJY29uID0gc3R5bGVkKExhdW5jaClgXG4gIG1hcmdpbi1sZWZ0OiA2cHg7XG4gIGhlaWdodDogYXV0bztcbiAgd2lkdGg6IGF1dG87XG4gIG1hcmdpbi10b3A6IDFweDtcbmA7XG5cbnR5cGUgUHJvcHMgPSB7XG4gIHNob3dOZXdXaW5kb3dJY29uPzogYm9vbGVhbjtcbiAgcmVmPzogTXV0YWJsZVJlZk9iamVjdDxIVE1MQW5jaG9yRWxlbWVudCB8IG51bGw+O1xuICBjaGlsZHJlbj86IFJlYWN0Tm9kZTtcbn07XG5cbmV4cG9ydCB0eXBlIFNhZmVMaW5rUHJvcHMgPSBQcm9wcyAmIExpbmtQcm9wcyAmIEhUTUxBdHRyaWJ1dGVzPEhUTUxFbGVtZW50PjtcblxuLy8gRmFsbGJhY2sgdG8gbm9ybWFsIGxpbmsgaWYgYXBwIGlzIG1pc3NpbmcgUm91dGVyQ29udGV4dCwgbGluayBpcyBleHRlcm5hbCBvciBpcyBvbGQgbmRsYSBsaW5rXG5cbmNvbnN0IFNhZmVMaW5rID0gZm9yd2FyZFJlZjxIVE1MQW5jaG9yRWxlbWVudCwgU2FmZUxpbmtQcm9wcz4oXG4gICh7IHRvLCByZXBsYWNlLCBjaGlsZHJlbiwgc2hvd05ld1dpbmRvd0ljb24sIHRhYkluZGV4LCAuLi5yZXN0IH0sIHJlZikgPT4ge1xuICAgIGNvbnN0IGlzTWlzc2luZ1JvdXRlckNvbnRleHQgPSB1c2VDb250ZXh0KE1pc3NpbmdSb3V0ZXJDb250ZXh0KTtcblxuICAgIGlmIChpc01pc3NpbmdSb3V0ZXJDb250ZXh0IHx8IGlzRXh0ZXJuYWxMaW5rKHRvKSB8fCBpc09sZE5kbGFMaW5rKHRvKSkge1xuICAgICAgY29uc3QgaHJlZiA9IHR5cGVvZiB0byA9PT0gJ3N0cmluZycgPyB0byA6ICcjJztcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxhIGhyZWY9e2hyZWZ9IHJlZj17cmVmfSB7Li4ucmVzdH0+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgIHtzaG93TmV3V2luZG93SWNvbiAmJiA8TGF1bmNoSWNvbiBzdHlsZT17eyB2ZXJ0aWNhbEFsaWduOiAndGV4dC10b3AnIH19IC8+fVxuICAgICAgICA8L2E+XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAvLyBSUjYgbGluayBpbW1lZGlhdGVseSBmYWlscyBpZiB0byBpcyBzb21laG93IHVuZGVmaW5lZCwgc28gd2UgcHJvdmlkZSBhbiBlbXB0eSBmYWxsYmFjayB0byByZWNvdmVyLlxuICAgICAgPExpbmsgcmVmPXtyZWZ9IHRhYkluZGV4PXt0YWJJbmRleCA/PyAwfSB0bz17dG8gPz8gJyd9IHJlcGxhY2U9e3JlcGxhY2V9IHsuLi5yZXN0fT5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgICB7c2hvd05ld1dpbmRvd0ljb24gJiYgPExhdW5jaEljb24gc3R5bGU9e3sgdmVydGljYWxBbGlnbjogJ3RleHQtdG9wJyB9fSAvPn1cbiAgICAgIDwvTGluaz5cbiAgICApO1xuICB9LFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgU2FmZUxpbms7XG4iXX0= */",
43
43
  toString: _EMOTION_STRINGIFIED_CSS_ERROR__
44
44
  });
45
45
 
46
46
  // Fallback to normal link if app is missing RouterContext, link is external or is old ndla link
47
- var SafeLink = function SafeLink(_ref) {
47
+ var SafeLink = /*#__PURE__*/forwardRef(function (_ref, ref) {
48
48
  var to = _ref.to,
49
49
  replace = _ref.replace,
50
50
  children = _ref.children,
51
51
  showNewWindowIcon = _ref.showNewWindowIcon,
52
52
  tabIndex = _ref.tabIndex,
53
- ref = _ref.ref,
54
- rest = _objectWithoutProperties(_ref, ["to", "replace", "children", "showNewWindowIcon", "tabIndex", "ref"]);
53
+ rest = _objectWithoutProperties(_ref, ["to", "replace", "children", "showNewWindowIcon", "tabIndex"]);
55
54
 
56
55
  var isMissingRouterContext = useContext(MissingRouterContext);
57
56
 
58
57
  if (isMissingRouterContext || isExternalLink(to) || isOldNdlaLink(to)) {
59
58
  var href = typeof to === 'string' ? to : '#';
60
- return ___EmotionJSX(React.Fragment, null, ___EmotionJSX("a", _extends({
59
+ return ___EmotionJSX("a", _extends({
61
60
  href: href,
62
61
  ref: ref
63
62
  }, rest), children, showNewWindowIcon && ___EmotionJSX(LaunchIcon, {
64
63
  style: {
65
64
  verticalAlign: 'text-top'
66
65
  }
67
- })));
66
+ }));
68
67
  }
69
68
 
70
69
  return (// RR6 link immediately fails if to is somehow undefined, so we provide an empty fallback to recover.
@@ -79,6 +78,5 @@ var SafeLink = function SafeLink(_ref) {
79
78
  }
80
79
  }))
81
80
  );
82
- };
83
-
81
+ });
84
82
  export default SafeLink;
package/lib/SafeLink.d.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
7
  */
8
- import { HTMLAttributes, MutableRefObject, ReactNode } from 'react';
8
+ import React, { HTMLAttributes, MutableRefObject, ReactNode } from 'react';
9
9
  import { LinkProps } from 'react-router-dom';
10
10
  export declare const isOldNdlaLink: (to?: string | Partial<import("history").Path> | undefined) => boolean | "" | undefined;
11
11
  declare type Props = {
@@ -14,5 +14,5 @@ declare type Props = {
14
14
  children?: ReactNode;
15
15
  };
16
16
  export declare type SafeLinkProps = Props & LinkProps & HTMLAttributes<HTMLElement>;
17
- declare const SafeLink: ({ to, replace, children, showNewWindowIcon, tabIndex, ref, ...rest }: SafeLinkProps) => JSX.Element;
17
+ declare const SafeLink: React.ForwardRefExoticComponent<Pick<SafeLinkProps, "replace" | "media" | "hidden" | "dir" | "slot" | "style" | "title" | "color" | "translate" | "prefix" | "children" | "to" | "state" | "download" | "hrefLang" | "ping" | "rel" | "target" | "type" | "referrerPolicy" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "draggable" | "id" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "css" | "reloadDocument" | "showNewWindowIcon"> & React.RefAttributes<HTMLAnchorElement>>;
18
18
  export default SafeLink;
package/lib/SafeLink.js CHANGED
@@ -53,32 +53,30 @@ var LaunchIcon = ( /*#__PURE__*/0, _styledBase["default"])(_common.Launch, {
53
53
  } : {
54
54
  name: "vum9tn",
55
55
  styles: "margin-left:6px;height:auto;width:auto;margin-top:1px;",
56
- map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNhZmVMaW5rLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvQmlDIiwiZmlsZSI6IlNhZmVMaW5rLnRzeCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LXByZXNlbnQsIE5ETEEuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMdjMgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKi9cblxuaW1wb3J0IFJlYWN0LCB7IEhUTUxBdHRyaWJ1dGVzLCBNdXRhYmxlUmVmT2JqZWN0LCBSZWFjdE5vZGUsIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBMaW5rLCBMaW5rUHJvcHMgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcbmltcG9ydCB7IExhdW5jaCB9IGZyb20gJ0BuZGxhL2ljb25zL2NvbW1vbic7XG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAnbG9kYXNoL2lzU3RyaW5nJztcbmltcG9ydCBNaXNzaW5nUm91dGVyQ29udGV4dCBmcm9tICcuL01pc3NpbmdSb3V0ZXJDb250ZXh0JztcblxuY29uc3QgaXNFeHRlcm5hbExpbmsgPSAodG8/OiBMaW5rUHJvcHNbJ3RvJ10pID0+XG4gIHRvICYmIGlzU3RyaW5nKHRvKSAmJiAodG8uc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSB8fCB0by5zdGFydHNXaXRoKCdodHRwOi8vJykpO1xuXG5leHBvcnQgY29uc3QgaXNPbGROZGxhTGluayA9ICh0bz86IExpbmtQcm9wc1sndG8nXSkgPT4gdG8gJiYgaXNTdHJpbmcodG8pICYmIHRvLm1hdGNoKC8oLiopXFwvP25vZGVcXC8oXFxkKykuKi8pICE9PSBudWxsO1xuXG5jb25zdCBMYXVuY2hJY29uID0gc3R5bGVkKExhdW5jaClgXG4gIG1hcmdpbi1sZWZ0OiA2cHg7XG4gIGhlaWdodDogYXV0bztcbiAgd2lkdGg6IGF1dG87XG4gIG1hcmdpbi10b3A6IDFweDtcbmA7XG5cbnR5cGUgUHJvcHMgPSB7XG4gIHNob3dOZXdXaW5kb3dJY29uPzogYm9vbGVhbjtcbiAgcmVmPzogTXV0YWJsZVJlZk9iamVjdDxIVE1MQW5jaG9yRWxlbWVudCB8IG51bGw+O1xuICBjaGlsZHJlbj86IFJlYWN0Tm9kZTtcbn07XG5cbmV4cG9ydCB0eXBlIFNhZmVMaW5rUHJvcHMgPSBQcm9wcyAmIExpbmtQcm9wcyAmIEhUTUxBdHRyaWJ1dGVzPEhUTUxFbGVtZW50PjtcblxuLy8gRmFsbGJhY2sgdG8gbm9ybWFsIGxpbmsgaWYgYXBwIGlzIG1pc3NpbmcgUm91dGVyQ29udGV4dCwgbGluayBpcyBleHRlcm5hbCBvciBpcyBvbGQgbmRsYSBsaW5rXG5jb25zdCBTYWZlTGluayA9ICh7IHRvLCByZXBsYWNlLCBjaGlsZHJlbiwgc2hvd05ld1dpbmRvd0ljb24sIHRhYkluZGV4LCByZWYsIC4uLnJlc3QgfTogU2FmZUxpbmtQcm9wcykgPT4ge1xuICBjb25zdCBpc01pc3NpbmdSb3V0ZXJDb250ZXh0ID0gdXNlQ29udGV4dChNaXNzaW5nUm91dGVyQ29udGV4dCk7XG5cbiAgaWYgKGlzTWlzc2luZ1JvdXRlckNvbnRleHQgfHwgaXNFeHRlcm5hbExpbmsodG8pIHx8IGlzT2xkTmRsYUxpbmsodG8pKSB7XG4gICAgY29uc3QgaHJlZiA9IHR5cGVvZiB0byA9PT0gJ3N0cmluZycgPyB0byA6ICcjJztcbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPGEgaHJlZj17aHJlZn0gcmVmPXtyZWZ9IHsuLi5yZXN0fT5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAge3Nob3dOZXdXaW5kb3dJY29uICYmIDxMYXVuY2hJY29uIHN0eWxlPXt7IHZlcnRpY2FsQWxpZ246ICd0ZXh0LXRvcCcgfX0gLz59XG4gICAgICAgIDwvYT5cbiAgICAgIDwvPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIC8vIFJSNiBsaW5rIGltbWVkaWF0ZWx5IGZhaWxzIGlmIHRvIGlzIHNvbWVob3cgdW5kZWZpbmVkLCBzbyB3ZSBwcm92aWRlIGFuIGVtcHR5IGZhbGxiYWNrIHRvIHJlY292ZXIuXG4gICAgPExpbmsgcmVmPXtyZWZ9IHRhYkluZGV4PXt0YWJJbmRleCA/PyAwfSB0bz17dG8gPz8gJyd9IHJlcGxhY2U9e3JlcGxhY2V9IHsuLi5yZXN0fT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICAgIHtzaG93TmV3V2luZG93SWNvbiAmJiA8TGF1bmNoSWNvbiBzdHlsZT17eyB2ZXJ0aWNhbEFsaWduOiAndGV4dC10b3AnIH19IC8+fVxuICAgIDwvTGluaz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNhZmVMaW5rO1xuIl19 */",
56
+ map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNhZmVMaW5rLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvQmlDIiwiZmlsZSI6IlNhZmVMaW5rLnRzeCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LXByZXNlbnQsIE5ETEEuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMdjMgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKi9cblxuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYsIEhUTUxBdHRyaWJ1dGVzLCBNdXRhYmxlUmVmT2JqZWN0LCBSZWFjdE5vZGUsIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBMaW5rLCBMaW5rUHJvcHMgfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcbmltcG9ydCB7IExhdW5jaCB9IGZyb20gJ0BuZGxhL2ljb25zL2NvbW1vbic7XG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAnbG9kYXNoL2lzU3RyaW5nJztcbmltcG9ydCBNaXNzaW5nUm91dGVyQ29udGV4dCBmcm9tICcuL01pc3NpbmdSb3V0ZXJDb250ZXh0JztcblxuY29uc3QgaXNFeHRlcm5hbExpbmsgPSAodG8/OiBMaW5rUHJvcHNbJ3RvJ10pID0+XG4gIHRvICYmIGlzU3RyaW5nKHRvKSAmJiAodG8uc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSB8fCB0by5zdGFydHNXaXRoKCdodHRwOi8vJykpO1xuXG5leHBvcnQgY29uc3QgaXNPbGROZGxhTGluayA9ICh0bz86IExpbmtQcm9wc1sndG8nXSkgPT4gdG8gJiYgaXNTdHJpbmcodG8pICYmIHRvLm1hdGNoKC8oLiopXFwvP25vZGVcXC8oXFxkKykuKi8pICE9PSBudWxsO1xuXG5jb25zdCBMYXVuY2hJY29uID0gc3R5bGVkKExhdW5jaClgXG4gIG1hcmdpbi1sZWZ0OiA2cHg7XG4gIGhlaWdodDogYXV0bztcbiAgd2lkdGg6IGF1dG87XG4gIG1hcmdpbi10b3A6IDFweDtcbmA7XG5cbnR5cGUgUHJvcHMgPSB7XG4gIHNob3dOZXdXaW5kb3dJY29uPzogYm9vbGVhbjtcbiAgcmVmPzogTXV0YWJsZVJlZk9iamVjdDxIVE1MQW5jaG9yRWxlbWVudCB8IG51bGw+O1xuICBjaGlsZHJlbj86IFJlYWN0Tm9kZTtcbn07XG5cbmV4cG9ydCB0eXBlIFNhZmVMaW5rUHJvcHMgPSBQcm9wcyAmIExpbmtQcm9wcyAmIEhUTUxBdHRyaWJ1dGVzPEhUTUxFbGVtZW50PjtcblxuLy8gRmFsbGJhY2sgdG8gbm9ybWFsIGxpbmsgaWYgYXBwIGlzIG1pc3NpbmcgUm91dGVyQ29udGV4dCwgbGluayBpcyBleHRlcm5hbCBvciBpcyBvbGQgbmRsYSBsaW5rXG5cbmNvbnN0IFNhZmVMaW5rID0gZm9yd2FyZFJlZjxIVE1MQW5jaG9yRWxlbWVudCwgU2FmZUxpbmtQcm9wcz4oXG4gICh7IHRvLCByZXBsYWNlLCBjaGlsZHJlbiwgc2hvd05ld1dpbmRvd0ljb24sIHRhYkluZGV4LCAuLi5yZXN0IH0sIHJlZikgPT4ge1xuICAgIGNvbnN0IGlzTWlzc2luZ1JvdXRlckNvbnRleHQgPSB1c2VDb250ZXh0KE1pc3NpbmdSb3V0ZXJDb250ZXh0KTtcblxuICAgIGlmIChpc01pc3NpbmdSb3V0ZXJDb250ZXh0IHx8IGlzRXh0ZXJuYWxMaW5rKHRvKSB8fCBpc09sZE5kbGFMaW5rKHRvKSkge1xuICAgICAgY29uc3QgaHJlZiA9IHR5cGVvZiB0byA9PT0gJ3N0cmluZycgPyB0byA6ICcjJztcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxhIGhyZWY9e2hyZWZ9IHJlZj17cmVmfSB7Li4ucmVzdH0+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgIHtzaG93TmV3V2luZG93SWNvbiAmJiA8TGF1bmNoSWNvbiBzdHlsZT17eyB2ZXJ0aWNhbEFsaWduOiAndGV4dC10b3AnIH19IC8+fVxuICAgICAgICA8L2E+XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAvLyBSUjYgbGluayBpbW1lZGlhdGVseSBmYWlscyBpZiB0byBpcyBzb21laG93IHVuZGVmaW5lZCwgc28gd2UgcHJvdmlkZSBhbiBlbXB0eSBmYWxsYmFjayB0byByZWNvdmVyLlxuICAgICAgPExpbmsgcmVmPXtyZWZ9IHRhYkluZGV4PXt0YWJJbmRleCA/PyAwfSB0bz17dG8gPz8gJyd9IHJlcGxhY2U9e3JlcGxhY2V9IHsuLi5yZXN0fT5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgICB7c2hvd05ld1dpbmRvd0ljb24gJiYgPExhdW5jaEljb24gc3R5bGU9e3sgdmVydGljYWxBbGlnbjogJ3RleHQtdG9wJyB9fSAvPn1cbiAgICAgIDwvTGluaz5cbiAgICApO1xuICB9LFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgU2FmZUxpbms7XG4iXX0= */",
57
57
  toString: _EMOTION_STRINGIFIED_CSS_ERROR__
58
58
  });
59
-
60
59
  // Fallback to normal link if app is missing RouterContext, link is external or is old ndla link
61
- var SafeLink = function SafeLink(_ref) {
60
+ var SafeLink = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
62
61
  var to = _ref.to,
63
62
  replace = _ref.replace,
64
63
  children = _ref.children,
65
64
  showNewWindowIcon = _ref.showNewWindowIcon,
66
65
  tabIndex = _ref.tabIndex,
67
- ref = _ref.ref,
68
- rest = _objectWithoutProperties(_ref, ["to", "replace", "children", "showNewWindowIcon", "tabIndex", "ref"]);
66
+ rest = _objectWithoutProperties(_ref, ["to", "replace", "children", "showNewWindowIcon", "tabIndex"]);
69
67
 
70
68
  var isMissingRouterContext = (0, _react.useContext)(_MissingRouterContext["default"]);
71
69
 
72
70
  if (isMissingRouterContext || isExternalLink(to) || isOldNdlaLink(to)) {
73
71
  var href = typeof to === 'string' ? to : '#';
74
- return (0, _core.jsx)(_react["default"].Fragment, null, (0, _core.jsx)("a", _extends({
72
+ return (0, _core.jsx)("a", _extends({
75
73
  href: href,
76
74
  ref: ref
77
75
  }, rest), children, showNewWindowIcon && (0, _core.jsx)(LaunchIcon, {
78
76
  style: {
79
77
  verticalAlign: 'text-top'
80
78
  }
81
- })));
79
+ }));
82
80
  }
83
81
 
84
82
  return (// RR6 link immediately fails if to is somehow undefined, so we provide an empty fallback to recover.
@@ -93,7 +91,6 @@ var SafeLink = function SafeLink(_ref) {
93
91
  }
94
92
  }))
95
93
  );
96
- };
97
-
94
+ });
98
95
  var _default = SafeLink;
99
96
  exports["default"] = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ndla/safelink",
3
- "version": "2.1.2",
3
+ "version": "2.2.0",
4
4
  "description": "SafeLink component for NDLA",
5
5
  "license": "GPL-3.0",
6
6
  "main": "lib/index.js",
@@ -26,7 +26,7 @@
26
26
  "es"
27
27
  ],
28
28
  "dependencies": {
29
- "@ndla/button": "^3.1.1",
29
+ "@ndla/button": "^3.1.2",
30
30
  "@ndla/icons": "^1.10.0"
31
31
  },
32
32
  "peerDependencies": {
@@ -38,5 +38,5 @@
38
38
  "publishConfig": {
39
39
  "access": "public"
40
40
  },
41
- "gitHead": "38b047f42fcb12c9b44d18246479c51f22d8bf63"
41
+ "gitHead": "5f018a6a78778970d0d448896de96bb16e970fab"
42
42
  }