UNPKG

next-csrf

Version:

CSRF mitigation library for Next.js

1 lines 28 kB
{"ast":null,"code":"\"use strict\";\n\nvar _slicedToArray = require(\"@babel/runtime/helpers/slicedToArray\");\n\nvar _s = $RefreshSig$();\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _react = _interopRequireWildcard(require(\"react\"));\n\nvar _router = require(\"../next-server/lib/router/router\");\n\nvar _router2 = require(\"./router\");\n\nvar cachedObserver;\nvar listeners = new Map();\nvar IntersectionObserver = true ? window.IntersectionObserver : null;\nvar prefetched = {};\n\nfunction getObserver() {\n // Return shared instance of IntersectionObserver if already created\n if (cachedObserver) {\n return cachedObserver;\n } // Only create shared IntersectionObserver if supported in browser\n\n\n if (!IntersectionObserver) {\n return undefined;\n }\n\n return cachedObserver = new IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (!listeners.has(entry.target)) {\n return;\n }\n\n var cb = listeners.get(entry.target);\n\n if (entry.isIntersecting || entry.intersectionRatio > 0) {\n cachedObserver.unobserve(entry.target);\n listeners[\"delete\"](entry.target);\n cb();\n }\n });\n }, {\n rootMargin: '200px'\n });\n}\n\nvar listenToIntersections = function listenToIntersections(el, cb) {\n var observer = getObserver();\n\n if (!observer) {\n return function () {};\n }\n\n observer.observe(el);\n listeners.set(el, cb);\n return function () {\n try {\n observer.unobserve(el);\n } catch (err) {\n console.error(err);\n }\n\n listeners[\"delete\"](el);\n };\n};\n\nfunction prefetch(router, href, as, options) {\n if (false) return;\n if (!(0, _router.isLocalURL)(href)) return; // Prefetch the JSON page if asked (only in the client)\n // We need to handle a prefetch error here since we may be\n // loading with priority which can reject but we don't\n // want to force navigation since this is only a prefetch\n\n router.prefetch(href, as, options)[\"catch\"](function (err) {\n if (true) {\n // rethrow to show invalid URL errors\n throw err;\n }\n }); // Join on an invalid URI character\n\n prefetched[href + '%' + as] = true;\n}\n\nfunction isModifiedEvent(event) {\n var target = event.currentTarget.target;\n return target && target !== '_self' || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || // triggers resource download\n event.nativeEvent && event.nativeEvent.which === 2;\n}\n\nfunction linkClicked(e, router, href, as, replace, shallow, scroll) {\n var nodeName = e.currentTarget.nodeName;\n\n if (nodeName === 'A' && (isModifiedEvent(e) || !(0, _router.isLocalURL)(href))) {\n // ignore click for browser’s default behavior\n return;\n }\n\n e.preventDefault(); // avoid scroll for urls with anchor refs\n\n if (scroll == null) {\n scroll = as.indexOf('#') < 0;\n } // replace state instead of push if prop is present\n\n\n router[replace ? 'replace' : 'push'](href, as, {\n shallow: shallow\n }).then(function (success) {\n if (!success) return;\n\n if (scroll) {\n window.scrollTo(0, 0);\n document.body.focus();\n }\n });\n}\n\nfunction Link(props) {\n _s();\n\n if (true) {\n var createPropError = function createPropError(args) {\n return new Error(\"Failed prop type: The prop `\".concat(args.key, \"` expects a \").concat(args.expected, \" in `<Link>`, but got `\").concat(args.actual, \"` instead.\") + (true ? \"\\nOpen your browser's console to view the Component stack trace.\" : ''));\n }; // TypeScript trick for type-guarding:\n\n\n var requiredPropsGuard = {\n href: true\n };\n var requiredProps = Object.keys(requiredPropsGuard);\n requiredProps.forEach(function (key) {\n if (key === 'href') {\n if (props[key] == null || typeof props[key] !== 'string' && typeof props[key] !== 'object') {\n throw createPropError({\n key: key,\n expected: '`string` or `object`',\n actual: props[key] === null ? 'null' : typeof props[key]\n });\n }\n } else {\n // TypeScript trick for type-guarding:\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var _ = key;\n }\n }); // TypeScript trick for type-guarding:\n\n var optionalPropsGuard = {\n as: true,\n replace: true,\n scroll: true,\n shallow: true,\n passHref: true,\n prefetch: true\n };\n var optionalProps = Object.keys(optionalPropsGuard);\n optionalProps.forEach(function (key) {\n if (key === 'as') {\n if (props[key] && typeof props[key] !== 'string' && typeof props[key] !== 'object') {\n throw createPropError({\n key: key,\n expected: '`string` or `object`',\n actual: typeof props[key]\n });\n }\n } else if (key === 'replace' || key === 'scroll' || key === 'shallow' || key === 'passHref' || key === 'prefetch') {\n if (props[key] != null && typeof props[key] !== 'boolean') {\n throw createPropError({\n key: key,\n expected: '`boolean`',\n actual: typeof props[key]\n });\n }\n } else {\n // TypeScript trick for type-guarding:\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var _ = key;\n }\n }); // This hook is in a conditional but that is ok because `process.env.NODE_ENV` never changes\n // eslint-disable-next-line react-hooks/rules-of-hooks\n\n var hasWarned = _react[\"default\"].useRef(false);\n\n if (props.prefetch && !hasWarned.current) {\n hasWarned.current = true;\n console.warn('Next.js auto-prefetches automatically based on viewport. The prefetch attribute is no longer needed. More: https://err.sh/vercel/next.js/prefetch-true-deprecated');\n }\n }\n\n var p = props.prefetch !== false;\n\n var _react$default$useSta = _react[\"default\"].useState(),\n _react$default$useSta2 = _slicedToArray(_react$default$useSta, 2),\n childElm = _react$default$useSta2[0],\n setChildElm = _react$default$useSta2[1];\n\n var router = (0, _router2.useRouter)();\n var pathname = router && router.pathname || '/';\n\n var _react$default$useMem = _react[\"default\"].useMemo(function () {\n var resolvedHref = (0, _router.resolveHref)(pathname, props.href);\n return {\n href: resolvedHref,\n as: props.as ? (0, _router.resolveHref)(pathname, props.as) : resolvedHref\n };\n }, [pathname, props.href, props.as]),\n href = _react$default$useMem.href,\n as = _react$default$useMem.as;\n\n _react[\"default\"].useEffect(function () {\n if (p && IntersectionObserver && childElm && childElm.tagName && (0, _router.isLocalURL)(href)) {\n // Join on an invalid URI character\n var isPrefetched = prefetched[href + '%' + as];\n\n if (!isPrefetched) {\n return listenToIntersections(childElm, function () {\n prefetch(router, href, as);\n });\n }\n }\n }, [p, childElm, href, as, router]);\n\n var children = props.children,\n replace = props.replace,\n shallow = props.shallow,\n scroll = props.scroll; // Deprecated. Warning shown by propType check. If the children provided is a string (<Link>example</Link>) we wrap it in an <a> tag\n\n if (typeof children === 'string') {\n children = /*#__PURE__*/_react[\"default\"].createElement(\"a\", null, children);\n } // This will return the first child, if multiple are provided it will throw an error\n\n\n var child = _react.Children.only(children);\n\n var childProps = {\n ref: function ref(el) {\n if (el) setChildElm(el);\n\n if (child && typeof child === 'object' && child.ref) {\n if (typeof child.ref === 'function') child.ref(el);else if (typeof child.ref === 'object') {\n child.ref.current = el;\n }\n }\n },\n onClick: function onClick(e) {\n if (child.props && typeof child.props.onClick === 'function') {\n child.props.onClick(e);\n }\n\n if (!e.defaultPrevented) {\n linkClicked(e, router, href, as, replace, shallow, scroll);\n }\n }\n };\n\n if (p) {\n childProps.onMouseEnter = function (e) {\n if (!(0, _router.isLocalURL)(href)) return;\n\n if (child.props && typeof child.props.onMouseEnter === 'function') {\n child.props.onMouseEnter(e);\n }\n\n prefetch(router, href, as, {\n priority: true\n });\n };\n } // If child is an <a> tag and doesn't have a href attribute, or if the 'passHref' property is\n // defined, we specify the current 'href', so that repetition is not needed by the user\n\n\n if (props.passHref || child.type === 'a' && !('href' in child.props)) {\n childProps.href = (0, _router.addBasePath)(as);\n }\n\n return /*#__PURE__*/_react[\"default\"].cloneElement(child, childProps);\n}\n\n_s(Link, \"Yt4+dEXpDdcToH476p06kPk14D0=\");\n\n_c = Link;\nvar _default = Link;\nexports[\"default\"] = _default;\n\nvar _c;\n\n$RefreshReg$(_c, \"Link\");","map":{"version":3,"sources":["../../client/link.tsx"],"names":["listeners","IntersectionObserver","window","prefetched","cachedObserver","entries","entry","cb","rootMargin","listenToIntersections","observer","getObserver","console","router","err","href","event","target","e","nodeName","isModifiedEvent","scroll","as","replace","shallow","success","document","args","key","expected","requiredPropsGuard","requiredProps","Object","props","createPropError","actual","_","optionalPropsGuard","passHref","prefetch","optionalProps","hasWarned","React","p","pathname","resolvedHref","childElm","isPrefetched","children","child","Children","childProps","ref","el","setChildElm","onClick","linkClicked","priority","Link"],"mappings":"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","sourcesContent":["import React, { Children } from 'react'\nimport { UrlObject } from 'url'\nimport {\n addBasePath,\n isLocalURL,\n NextRouter,\n PrefetchOptions,\n resolveHref,\n} from '../next-server/lib/router/router'\nimport { useRouter } from './router'\n\ntype Url = string | UrlObject\ntype RequiredKeys<T> = {\n [K in keyof T]-?: {} extends Pick<T, K> ? never : K\n}[keyof T]\ntype OptionalKeys<T> = {\n [K in keyof T]-?: {} extends Pick<T, K> ? K : never\n}[keyof T]\n\nexport type LinkProps = {\n href: Url\n as?: Url\n replace?: boolean\n scroll?: boolean\n shallow?: boolean\n passHref?: boolean\n prefetch?: boolean\n}\ntype LinkPropsRequired = RequiredKeys<LinkProps>\ntype LinkPropsOptional = OptionalKeys<LinkProps>\n\nlet cachedObserver: IntersectionObserver\nconst listeners = new Map<Element, () => void>()\nconst IntersectionObserver =\n typeof window !== 'undefined' ? window.IntersectionObserver : null\nconst prefetched: { [cacheKey: string]: boolean } = {}\n\nfunction getObserver(): IntersectionObserver | undefined {\n // Return shared instance of IntersectionObserver if already created\n if (cachedObserver) {\n return cachedObserver\n }\n\n // Only create shared IntersectionObserver if supported in browser\n if (!IntersectionObserver) {\n return undefined\n }\n\n return (cachedObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (!listeners.has(entry.target)) {\n return\n }\n\n const cb = listeners.get(entry.target)!\n if (entry.isIntersecting || entry.intersectionRatio > 0) {\n cachedObserver.unobserve(entry.target)\n listeners.delete(entry.target)\n cb()\n }\n })\n },\n { rootMargin: '200px' }\n ))\n}\n\nconst listenToIntersections = (el: Element, cb: () => void) => {\n const observer = getObserver()\n if (!observer) {\n return () => {}\n }\n\n observer.observe(el)\n listeners.set(el, cb)\n return () => {\n try {\n observer.unobserve(el)\n } catch (err) {\n console.error(err)\n }\n listeners.delete(el)\n }\n}\n\nfunction prefetch(\n router: NextRouter,\n href: string,\n as: string,\n options?: PrefetchOptions\n): void {\n if (typeof window === 'undefined') return\n if (!isLocalURL(href)) return\n // Prefetch the JSON page if asked (only in the client)\n // We need to handle a prefetch error here since we may be\n // loading with priority which can reject but we don't\n // want to force navigation since this is only a prefetch\n router.prefetch(href, as, options).catch((err) => {\n if (process.env.NODE_ENV !== 'production') {\n // rethrow to show invalid URL errors\n throw err\n }\n })\n // Join on an invalid URI character\n prefetched[href + '%' + as] = true\n}\n\nfunction isModifiedEvent(event: React.MouseEvent) {\n const { target } = event.currentTarget as HTMLAnchorElement\n return (\n (target && target !== '_self') ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey || // triggers resource download\n (event.nativeEvent && event.nativeEvent.which === 2)\n )\n}\n\nfunction linkClicked(\n e: React.MouseEvent,\n router: NextRouter,\n href: string,\n as: string,\n replace?: boolean,\n shallow?: boolean,\n scroll?: boolean\n): void {\n const { nodeName } = e.currentTarget\n\n if (nodeName === 'A' && (isModifiedEvent(e) || !isLocalURL(href))) {\n // ignore click for browser’s default behavior\n return\n }\n\n e.preventDefault()\n\n // avoid scroll for urls with anchor refs\n if (scroll == null) {\n scroll = as.indexOf('#') < 0\n }\n\n // replace state instead of push if prop is present\n router[replace ? 'replace' : 'push'](href, as, { shallow }).then(\n (success: boolean) => {\n if (!success) return\n if (scroll) {\n window.scrollTo(0, 0)\n document.body.focus()\n }\n }\n )\n}\n\nfunction Link(props: React.PropsWithChildren<LinkProps>) {\n if (process.env.NODE_ENV !== 'production') {\n function createPropError(args: {\n key: string\n expected: string\n actual: string\n }) {\n return new Error(\n `Failed prop type: The prop \\`${args.key}\\` expects a ${args.expected} in \\`<Link>\\`, but got \\`${args.actual}\\` instead.` +\n (typeof window !== 'undefined'\n ? \"\\nOpen your browser's console to view the Component stack trace.\"\n : '')\n )\n }\n\n // TypeScript trick for type-guarding:\n const requiredPropsGuard: Record<LinkPropsRequired, true> = {\n href: true,\n } as const\n const requiredProps: LinkPropsRequired[] = Object.keys(\n requiredPropsGuard\n ) as LinkPropsRequired[]\n requiredProps.forEach((key: LinkPropsRequired) => {\n if (key === 'href') {\n if (\n props[key] == null ||\n (typeof props[key] !== 'string' && typeof props[key] !== 'object')\n ) {\n throw createPropError({\n key,\n expected: '`string` or `object`',\n actual: props[key] === null ? 'null' : typeof props[key],\n })\n }\n } else {\n // TypeScript trick for type-guarding:\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _: never = key\n }\n })\n\n // TypeScript trick for type-guarding:\n const optionalPropsGuard: Record<LinkPropsOptional, true> = {\n as: true,\n replace: true,\n scroll: true,\n shallow: true,\n passHref: true,\n prefetch: true,\n } as const\n const optionalProps: LinkPropsOptional[] = Object.keys(\n optionalPropsGuard\n ) as LinkPropsOptional[]\n optionalProps.forEach((key: LinkPropsOptional) => {\n if (key === 'as') {\n if (\n props[key] &&\n typeof props[key] !== 'string' &&\n typeof props[key] !== 'object'\n ) {\n throw createPropError({\n key,\n expected: '`string` or `object`',\n actual: typeof props[key],\n })\n }\n } else if (\n key === 'replace' ||\n key === 'scroll' ||\n key === 'shallow' ||\n key === 'passHref' ||\n key === 'prefetch'\n ) {\n if (props[key] != null && typeof props[key] !== 'boolean') {\n throw createPropError({\n key,\n expected: '`boolean`',\n actual: typeof props[key],\n })\n }\n } else {\n // TypeScript trick for type-guarding:\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _: never = key\n }\n })\n\n // This hook is in a conditional but that is ok because `process.env.NODE_ENV` never changes\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const hasWarned = React.useRef(false)\n if (props.prefetch && !hasWarned.current) {\n hasWarned.current = true\n console.warn(\n 'Next.js auto-prefetches automatically based on viewport. The prefetch attribute is no longer needed. More: https://err.sh/vercel/next.js/prefetch-true-deprecated'\n )\n }\n }\n const p = props.prefetch !== false\n\n const [childElm, setChildElm] = React.useState<Element>()\n\n const router = useRouter()\n const pathname = (router && router.pathname) || '/'\n\n const { href, as } = React.useMemo(() => {\n const resolvedHref = resolveHref(pathname, props.href)\n return {\n href: resolvedHref,\n as: props.as ? resolveHref(pathname, props.as) : resolvedHref,\n }\n }, [pathname, props.href, props.as])\n\n React.useEffect(() => {\n if (\n p &&\n IntersectionObserver &&\n childElm &&\n childElm.tagName &&\n isLocalURL(href)\n ) {\n // Join on an invalid URI character\n const isPrefetched = prefetched[href + '%' + as]\n if (!isPrefetched) {\n return listenToIntersections(childElm, () => {\n prefetch(router, href, as)\n })\n }\n }\n }, [p, childElm, href, as, router])\n\n let { children, replace, shallow, scroll } = props\n // Deprecated. Warning shown by propType check. If the children provided is a string (<Link>example</Link>) we wrap it in an <a> tag\n if (typeof children === 'string') {\n children = <a>{children}</a>\n }\n\n // This will return the first child, if multiple are provided it will throw an error\n const child: any = Children.only(children)\n const childProps: {\n onMouseEnter?: React.MouseEventHandler\n onClick: React.MouseEventHandler\n href?: string\n ref?: any\n } = {\n ref: (el: any) => {\n if (el) setChildElm(el)\n\n if (child && typeof child === 'object' && child.ref) {\n if (typeof child.ref === 'function') child.ref(el)\n else if (typeof child.ref === 'object') {\n child.ref.current = el\n }\n }\n },\n onClick: (e: React.MouseEvent) => {\n if (child.props && typeof child.props.onClick === 'function') {\n child.props.onClick(e)\n }\n if (!e.defaultPrevented) {\n linkClicked(e, router, href, as, replace, shallow, scroll)\n }\n },\n }\n\n if (p) {\n childProps.onMouseEnter = (e: React.MouseEvent) => {\n if (!isLocalURL(href)) return\n if (child.props && typeof child.props.onMouseEnter === 'function') {\n child.props.onMouseEnter(e)\n }\n prefetch(router, href, as, { priority: true })\n }\n }\n\n // If child is an <a> tag and doesn't have a href attribute, or if the 'passHref' property is\n // defined, we specify the current 'href', so that repetition is not needed by the user\n if (props.passHref || (child.type === 'a' && !('href' in child.props))) {\n childProps.href = addBasePath(as)\n }\n\n return React.cloneElement(child, childProps)\n}\n\nexport default Link\n"]},"metadata":{},"sourceType":"script"}