next-csrf
Version:
CSRF mitigation library for Next.js
1 lines • 27 kB
JSON
{"ast":null,"code":"\"use strict\";\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\nlet cachedObserver;\nconst listeners = new Map();\nconst IntersectionObserver = false ? window.IntersectionObserver : null;\nconst 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(entries => {\n entries.forEach(entry => {\n if (!listeners.has(entry.target)) {\n return;\n }\n\n const 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\nconst listenToIntersections = (el, cb) => {\n const observer = getObserver();\n\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\n listeners.delete(el);\n };\n};\n\nfunction prefetch(router, href, as, options) {\n if (true) 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(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 const {\n target\n } = event.currentTarget;\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 const {\n nodeName\n } = e.currentTarget;\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\n }).then(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 if (true) {\n function createPropError(args) {\n return new Error(`Failed prop type: The prop \\`${args.key}\\` expects a ${args.expected} in \\`<Link>\\`, but got \\`${args.actual}\\` instead.` + (false ? \"\\nOpen your browser's console to view the Component stack trace.\" : ''));\n } // TypeScript trick for type-guarding:\n\n\n const requiredPropsGuard = {\n href: true\n };\n const requiredProps = Object.keys(requiredPropsGuard);\n requiredProps.forEach(key => {\n if (key === 'href') {\n if (props[key] == null || typeof props[key] !== 'string' && typeof props[key] !== 'object') {\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 _ = key;\n }\n }); // TypeScript trick for type-guarding:\n\n const optionalPropsGuard = {\n as: true,\n replace: true,\n scroll: true,\n shallow: true,\n passHref: true,\n prefetch: true\n };\n const optionalProps = Object.keys(optionalPropsGuard);\n optionalProps.forEach(key => {\n if (key === 'as') {\n if (props[key] && typeof props[key] !== 'string' && typeof props[key] !== 'object') {\n throw createPropError({\n 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,\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 _ = 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 const 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 const p = props.prefetch !== false;\n\n const [childElm, setChildElm] = _react.default.useState();\n\n const router = (0, _router2.useRouter)();\n const pathname = router && router.pathname || '/';\n\n const {\n href,\n as\n } = _react.default.useMemo(() => {\n const 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\n _react.default.useEffect(() => {\n if (p && IntersectionObserver && childElm && childElm.tagName && (0, _router.isLocalURL)(href)) {\n // Join on an invalid URI character\n const isPrefetched = prefetched[href + '%' + as];\n\n if (!isPrefetched) {\n return listenToIntersections(childElm, () => {\n prefetch(router, href, as);\n });\n }\n }\n }, [p, childElm, href, as, router]);\n\n let {\n children,\n replace,\n shallow,\n scroll\n } = props; // 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 const child = _react.Children.only(children);\n\n const childProps = {\n 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: 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 = 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\nvar _default = Link;\nexports.default = _default;","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","success","document","args","key","expected","actual","requiredPropsGuard","requiredProps","Object","props","createPropError","_","optionalPropsGuard","shallow","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"}