UNPKG

next-csrf

Version:

CSRF mitigation library for Next.js

1 lines 13.6 kB
{"ast":null,"code":"\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = initializeBuildWatcher;\n\nvar _eventsource = require(\"./error-overlay/eventsource\");\n\nfunction initializeBuildWatcher() {\n var shadowHost = document.createElement('div');\n shadowHost.id = '__next-build-watcher'; // Make sure container is fixed and on a high zIndex so it shows\n\n shadowHost.style.position = 'fixed';\n shadowHost.style.bottom = '10px';\n shadowHost.style.right = '20px';\n shadowHost.style.width = 0;\n shadowHost.style.height = 0;\n shadowHost.style.zIndex = 99999;\n document.body.appendChild(shadowHost);\n var shadowRoot;\n var prefix = '';\n\n if (shadowHost.attachShadow) {\n shadowRoot = shadowHost.attachShadow({\n mode: 'open'\n });\n } else {\n // If attachShadow is undefined then the browser does not support\n // the Shadow DOM, we need to prefix all the names so there\n // will be no conflicts\n shadowRoot = shadowHost;\n prefix = '__next-build-watcher-';\n } // Container\n\n\n var container = createContainer(prefix);\n shadowRoot.appendChild(container); // CSS\n\n var css = createCss(prefix);\n shadowRoot.appendChild(css); // State\n\n var isVisible = false;\n var isBuilding = false;\n var timeoutId = null; // Handle events\n\n var evtSource = (0, _eventsource.getEventSourceWrapper)({\n path: '/_next/webpack-hmr'\n });\n evtSource.addMessageListener(function (event) {\n // This is the heartbeat event\n if (event.data === \"\\uD83D\\uDC93\") {\n return;\n }\n\n try {\n handleMessage(event);\n } catch (_unused) {}\n });\n\n function handleMessage(event) {\n var obj = JSON.parse(event.data); // eslint-disable-next-line default-case\n\n switch (obj.action) {\n case 'building':\n timeoutId && clearTimeout(timeoutId);\n isVisible = true;\n isBuilding = true;\n updateContainer();\n break;\n\n case 'built':\n case 'sync':\n isBuilding = false; // Wait for the fade out transtion to complete\n\n timeoutId = setTimeout(function () {\n isVisible = false;\n updateContainer();\n }, 100);\n updateContainer();\n break;\n }\n }\n\n function updateContainer() {\n if (isBuilding) {\n container.classList.add(\"\".concat(prefix, \"building\"));\n } else {\n container.classList.remove(\"\".concat(prefix, \"building\"));\n }\n\n if (isVisible) {\n container.classList.add(\"\".concat(prefix, \"visible\"));\n } else {\n container.classList.remove(\"\".concat(prefix, \"visible\"));\n }\n }\n}\n\nfunction createContainer(prefix) {\n var container = document.createElement('div');\n container.id = \"\".concat(prefix, \"container\");\n container.innerHTML = \"\\n <div id=\\\"\".concat(prefix, \"icon-wrapper\\\">\\n <svg viewBox=\\\"0 0 226 200\\\">\\n <defs>\\n <linearGradient\\n x1=\\\"114.720775%\\\"\\n y1=\\\"181.283245%\\\"\\n x2=\\\"39.5399306%\\\"\\n y2=\\\"100%\\\"\\n id=\\\"\").concat(prefix, \"linear-gradient\\\"\\n >\\n <stop stop-color=\\\"#000000\\\" offset=\\\"0%\\\" />\\n <stop stop-color=\\\"#FFFFFF\\\" offset=\\\"100%\\\" />\\n </linearGradient>\\n </defs>\\n <g id=\\\"\").concat(prefix, \"icon-group\\\" fill=\\\"none\\\" stroke=\\\"url(#\").concat(prefix, \"linear-gradient)\\\" stroke-width=\\\"18\\\">\\n <path d=\\\"M113,5.08219117 L4.28393801,197.5 L221.716062,197.5 L113,5.08219117 Z\\\" />\\n </g>\\n </svg>\\n </div>\\n \");\n return container;\n}\n\nfunction createCss(prefix) {\n var css = document.createElement('style');\n css.textContent = \"\\n #\".concat(prefix, \"container {\\n position: absolute;\\n bottom: 10px;\\n right: 30px;\\n\\n border-radius: 3px;\\n background: #000;\\n color: #fff;\\n font: initial;\\n cursor: initial;\\n letter-spacing: initial;\\n text-shadow: initial;\\n text-transform: initial;\\n visibility: initial;\\n\\n padding: 7px 10px 8px 10px;\\n align-items: center;\\n box-shadow: 0 11px 40px 0 rgba(0, 0, 0, 0.25), 0 2px 10px 0 rgba(0, 0, 0, 0.12);\\n\\n display: none;\\n opacity: 0;\\n transition: opacity 0.1s ease, bottom 0.1s ease;\\n animation: \").concat(prefix, \"fade-in 0.1s ease-in-out;\\n }\\n\\n #\").concat(prefix, \"container.\").concat(prefix, \"visible {\\n display: flex;\\n }\\n\\n #\").concat(prefix, \"container.\").concat(prefix, \"building {\\n bottom: 20px;\\n opacity: 1;\\n }\\n\\n #\").concat(prefix, \"icon-wrapper {\\n width: 16px;\\n height: 16px;\\n }\\n\\n #\").concat(prefix, \"icon-wrapper > svg {\\n width: 100%;\\n height: 100%;\\n }\\n\\n #\").concat(prefix, \"icon-group {\\n animation: \").concat(prefix, \"strokedash 1s ease-in-out both infinite;\\n }\\n\\n @keyframes \").concat(prefix, \"fade-in {\\n from {\\n bottom: 10px;\\n opacity: 0;\\n }\\n to {\\n bottom: 20px;\\n opacity: 1;\\n }\\n }\\n\\n @keyframes \").concat(prefix, \"strokedash {\\n 0% {\\n stroke-dasharray: 0 226;\\n }\\n 80%,\\n 100% {\\n stroke-dasharray: 659 226;\\n }\\n }\\n \");\n return css;\n}","map":{"version":3,"sources":["../../../client/dev/dev-build-watcher.js"],"names":["shadowHost","document","prefix","shadowRoot","mode","container","createContainer","css","createCss","isVisible","isBuilding","timeoutId","evtSource","path","event","handleMessage","obj","JSON","clearTimeout","updateContainer","setTimeout"],"mappings":"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","sourcesContent":["import { getEventSourceWrapper } from './error-overlay/eventsource'\n\nexport default function initializeBuildWatcher() {\n const shadowHost = document.createElement('div')\n shadowHost.id = '__next-build-watcher'\n // Make sure container is fixed and on a high zIndex so it shows\n shadowHost.style.position = 'fixed'\n shadowHost.style.bottom = '10px'\n shadowHost.style.right = '20px'\n shadowHost.style.width = 0\n shadowHost.style.height = 0\n shadowHost.style.zIndex = 99999\n document.body.appendChild(shadowHost)\n\n let shadowRoot\n let prefix = ''\n\n if (shadowHost.attachShadow) {\n shadowRoot = shadowHost.attachShadow({ mode: 'open' })\n } else {\n // If attachShadow is undefined then the browser does not support\n // the Shadow DOM, we need to prefix all the names so there\n // will be no conflicts\n shadowRoot = shadowHost\n prefix = '__next-build-watcher-'\n }\n\n // Container\n const container = createContainer(prefix)\n shadowRoot.appendChild(container)\n\n // CSS\n const css = createCss(prefix)\n shadowRoot.appendChild(css)\n\n // State\n let isVisible = false\n let isBuilding = false\n let timeoutId = null\n\n // Handle events\n const evtSource = getEventSourceWrapper({ path: '/_next/webpack-hmr' })\n evtSource.addMessageListener((event) => {\n // This is the heartbeat event\n if (event.data === '\\uD83D\\uDC93') {\n return\n }\n\n try {\n handleMessage(event)\n } catch {}\n })\n\n function handleMessage(event) {\n const obj = JSON.parse(event.data)\n\n // eslint-disable-next-line default-case\n switch (obj.action) {\n case 'building':\n timeoutId && clearTimeout(timeoutId)\n isVisible = true\n isBuilding = true\n updateContainer()\n break\n case 'built':\n case 'sync':\n isBuilding = false\n // Wait for the fade out transtion to complete\n timeoutId = setTimeout(() => {\n isVisible = false\n updateContainer()\n }, 100)\n updateContainer()\n break\n }\n }\n\n function updateContainer() {\n if (isBuilding) {\n container.classList.add(`${prefix}building`)\n } else {\n container.classList.remove(`${prefix}building`)\n }\n\n if (isVisible) {\n container.classList.add(`${prefix}visible`)\n } else {\n container.classList.remove(`${prefix}visible`)\n }\n }\n}\n\nfunction createContainer(prefix) {\n const container = document.createElement('div')\n container.id = `${prefix}container`\n container.innerHTML = `\n <div id=\"${prefix}icon-wrapper\">\n <svg viewBox=\"0 0 226 200\">\n <defs>\n <linearGradient\n x1=\"114.720775%\"\n y1=\"181.283245%\"\n x2=\"39.5399306%\"\n y2=\"100%\"\n id=\"${prefix}linear-gradient\"\n >\n <stop stop-color=\"#000000\" offset=\"0%\" />\n <stop stop-color=\"#FFFFFF\" offset=\"100%\" />\n </linearGradient>\n </defs>\n <g id=\"${prefix}icon-group\" fill=\"none\" stroke=\"url(#${prefix}linear-gradient)\" stroke-width=\"18\">\n <path d=\"M113,5.08219117 L4.28393801,197.5 L221.716062,197.5 L113,5.08219117 Z\" />\n </g>\n </svg>\n </div>\n `\n\n return container\n}\n\nfunction createCss(prefix) {\n const css = document.createElement('style')\n css.textContent = `\n #${prefix}container {\n position: absolute;\n bottom: 10px;\n right: 30px;\n\n border-radius: 3px;\n background: #000;\n color: #fff;\n font: initial;\n cursor: initial;\n letter-spacing: initial;\n text-shadow: initial;\n text-transform: initial;\n visibility: initial;\n\n padding: 7px 10px 8px 10px;\n align-items: center;\n box-shadow: 0 11px 40px 0 rgba(0, 0, 0, 0.25), 0 2px 10px 0 rgba(0, 0, 0, 0.12);\n\n display: none;\n opacity: 0;\n transition: opacity 0.1s ease, bottom 0.1s ease;\n animation: ${prefix}fade-in 0.1s ease-in-out;\n }\n\n #${prefix}container.${prefix}visible {\n display: flex;\n }\n\n #${prefix}container.${prefix}building {\n bottom: 20px;\n opacity: 1;\n }\n\n #${prefix}icon-wrapper {\n width: 16px;\n height: 16px;\n }\n\n #${prefix}icon-wrapper > svg {\n width: 100%;\n height: 100%;\n }\n\n #${prefix}icon-group {\n animation: ${prefix}strokedash 1s ease-in-out both infinite;\n }\n\n @keyframes ${prefix}fade-in {\n from {\n bottom: 10px;\n opacity: 0;\n }\n to {\n bottom: 20px;\n opacity: 1;\n }\n }\n\n @keyframes ${prefix}strokedash {\n 0% {\n stroke-dasharray: 0 226;\n }\n 80%,\n 100% {\n stroke-dasharray: 659 226;\n }\n }\n `\n\n return css\n}\n"]},"metadata":{},"sourceType":"script"}