UNPKG

next-csrf

Version:

CSRF mitigation library for Next.js

1 lines 10.5 kB
{"ast":null,"code":"\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = initHeadManager;\nvar DOMAttributeNames = {\n acceptCharset: 'accept-charset',\n className: 'class',\n htmlFor: 'for',\n httpEquiv: 'http-equiv'\n};\n\nfunction reactElementToDOM(_ref) {\n var type = _ref.type,\n props = _ref.props;\n var el = document.createElement(type);\n\n for (var p in props) {\n if (!props.hasOwnProperty(p)) continue;\n if (p === 'children' || p === 'dangerouslySetInnerHTML') continue; // we don't render undefined props to the DOM\n\n if (props[p] === undefined) continue;\n var attr = DOMAttributeNames[p] || p.toLowerCase();\n el.setAttribute(attr, props[p]);\n }\n\n var children = props.children,\n dangerouslySetInnerHTML = props.dangerouslySetInnerHTML;\n\n if (dangerouslySetInnerHTML) {\n el.innerHTML = dangerouslySetInnerHTML.__html || '';\n } else if (children) {\n el.textContent = typeof children === 'string' ? children : children.join('');\n }\n\n return el;\n}\n\nfunction updateElements(type, components) {\n var headEl = document.getElementsByTagName('head')[0];\n var headCountEl = headEl.querySelector('meta[name=next-head-count]');\n\n if (true) {\n if (!headCountEl) {\n console.error('Warning: next-head-count is missing. https://err.sh/next.js/next-head-count-missing');\n return;\n }\n }\n\n var headCount = Number(headCountEl.content);\n var oldTags = [];\n\n for (var i = 0, j = headCountEl.previousElementSibling; i < headCount; i++, j = j.previousElementSibling) {\n if (j.tagName.toLowerCase() === type) {\n oldTags.push(j);\n }\n }\n\n var newTags = components.map(reactElementToDOM).filter(function (newTag) {\n for (var k = 0, len = oldTags.length; k < len; k++) {\n var oldTag = oldTags[k];\n\n if (oldTag.isEqualNode(newTag)) {\n oldTags.splice(k, 1);\n return false;\n }\n }\n\n return true;\n });\n oldTags.forEach(function (t) {\n return t.parentNode.removeChild(t);\n });\n newTags.forEach(function (t) {\n return headEl.insertBefore(t, headCountEl);\n });\n headCountEl.content = (headCount - oldTags.length + newTags.length).toString();\n}\n\nfunction initHeadManager() {\n var updatePromise = null;\n return {\n mountedInstances: new Set(),\n updateHead: function updateHead(head) {\n var promise = updatePromise = Promise.resolve().then(function () {\n if (promise !== updatePromise) return;\n updatePromise = null;\n var tags = {};\n head.forEach(function (h) {\n var components = tags[h.type] || [];\n components.push(h);\n tags[h.type] = components;\n });\n var titleComponent = tags.title ? tags.title[0] : null;\n var title = '';\n\n if (titleComponent) {\n var children = titleComponent.props.children;\n title = typeof children === 'string' ? children : children.join('');\n }\n\n if (title !== document.title) document.title = title;\n ['meta', 'base', 'link', 'style', 'script'].forEach(function (type) {\n updateElements(type, tags[type] || []);\n });\n });\n }\n };\n}","map":{"version":3,"sources":["../../client/head-manager.ts"],"names":["DOMAttributeNames","acceptCharset","className","htmlFor","httpEquiv","el","document","props","p","attr","dangerouslySetInnerHTML","children","headEl","headCountEl","console","headCount","Number","oldTags","i","j","newTags","components","newTag","k","len","oldTag","t","updatePromise","mountedInstances","updateHead","head","promise","Promise","tags","h","titleComponent","title","type","updateElements"],"mappings":";;;;AAAA,IAAMA,iBAAyC,GAAG;AAChDC,EAAAA,aAAa,EADmC,gBAAA;AAEhDC,EAAAA,SAAS,EAFuC,OAAA;AAGhDC,EAAAA,OAAO,EAHyC,KAAA;AAIhDC,EAAAA,SAAS,EAJX;AAAkD,CAAlD;;AAOA,SAAA,iBAAA,OAAsE;AAAA,MAA3C,IAA2C,QAA3C,IAA2C;AAAA,MAAtE,KAAsE,QAAtE,KAAsE;AACpE,MAAMC,EAAE,GAAGC,QAAQ,CAARA,aAAAA,CAAX,IAAWA,CAAX;;AACA,OAAK,IAAL,CAAA,IAAA,KAAA,EAAuB;AACrB,QAAI,CAACC,KAAK,CAALA,cAAAA,CAAL,CAAKA,CAAL,EAA8B;AAC9B,QAAIC,CAAC,KAADA,UAAAA,IAAoBA,CAAC,KAAzB,yBAAA,EAAyD,SAFpC,CAIrB;;AACA,QAAID,KAAK,CAALA,CAAK,CAALA,KAAJ,SAAA,EAA4B;AAE5B,QAAME,IAAI,GAAGT,iBAAiB,CAAjBA,CAAiB,CAAjBA,IAAwBQ,CAAC,CAAtC,WAAqCA,EAArC;AACAH,IAAAA,EAAE,CAAFA,YAAAA,CAAAA,IAAAA,EAAsBE,KAAK,CAA3BF,CAA2B,CAA3BA;AAGF;;AAboE,MAa9D,QAb8D,GAapE,KAboE,CAa9D,QAb8D;AAAA,MAa9D,uBAb8D,GAapE,KAboE,CAa9D,uBAb8D;;AAcpE,MAAA,uBAAA,EAA6B;AAC3BA,IAAAA,EAAE,CAAFA,SAAAA,GAAeK,uBAAuB,CAAvBA,MAAAA,IAAfL,EAAAA;AADF,GAAA,MAEO,IAAA,QAAA,EAAc;AACnBA,IAAAA,EAAE,CAAFA,WAAAA,GAAiB,OAAA,QAAA,KAAA,QAAA,GAAA,QAAA,GAA0CM,QAAQ,CAARA,IAAAA,CAA3DN,EAA2DM,CAA3DN;AAEF;;AAAA,SAAA,EAAA;AAGF;;AAAA,SAAA,cAAA,CAAA,IAAA,EAAA,UAAA,EAAiE;AAC/D,MAAMO,MAAM,GAAGN,QAAQ,CAARA,oBAAAA,CAAAA,MAAAA,EAAf,CAAeA,CAAf;AACA,MAAMO,WAA4B,GAAGD,MAAM,CAANA,aAAAA,CAArC,4BAAqCA,CAArC;;AAGA,YAA2C;AACzC,QAAI,CAAJ,WAAA,EAAkB;AAChBE,MAAAA,OAAO,CAAPA,KAAAA,CAAAA,qFAAAA;AAGA;AAEH;AAED;;AAAA,MAAMC,SAAS,GAAGC,MAAM,CAACH,WAAW,CAApC,OAAwB,CAAxB;AACA,MAAMI,OAAkB,GAAxB,EAAA;;AAEA,OACE,IAAIC,CAAC,GAAL,CAAA,EAAWC,CAAC,GAAGN,WAAW,CAD5B,sBAAA,EAEEK,CAAC,GAFH,SAAA,EAGEA,CAAC,IAAIC,CAAC,GAAGA,CAAC,CAHZ,sBAAA,EAIE;AACA,QAAIA,CAAC,CAADA,OAAAA,CAAAA,WAAAA,OAAJ,IAAA,EAAuC;AACrCF,MAAAA,OAAO,CAAPA,IAAAA,CAAAA,CAAAA;AAEH;AACD;;AAAA,MAAMG,OAAO,GAAIC,UAAU,CAAVA,GAAAA,CAAD,iBAACA,EAAD,MAACA,CACdC,UAAAA,MAAD,EAAY;AACV,SAAK,IAAIC,CAAC,GAAL,CAAA,EAAWC,GAAG,GAAGP,OAAO,CAA7B,MAAA,EAAsCM,CAAC,GAAvC,GAAA,EAA+CA,CAA/C,EAAA,EAAoD;AAClD,UAAME,MAAM,GAAGR,OAAO,CAAtB,CAAsB,CAAtB;;AACA,UAAIQ,MAAM,CAANA,WAAAA,CAAJ,MAAIA,CAAJ,EAAgC;AAC9BR,QAAAA,OAAO,CAAPA,MAAAA,CAAAA,CAAAA,EAAAA,CAAAA;AACA,eAAA,KAAA;AAEH;AACD;;AAAA,WAAA,IAAA;AATJ,GAAiBI,CAAjB;AAaAJ,EAAAA,OAAO,CAAPA,OAAAA,CAAiBS,UAAAA,CAAD;AAAA,WAAOA,CAAC,CAADA,UAAAA,CAAAA,WAAAA,CAAvBT,CAAuBS,CAAP;AAAA,GAAhBT;AACAG,EAAAA,OAAO,CAAPA,OAAAA,CAAiBM,UAAAA,CAAD;AAAA,WAAOd,MAAM,CAANA,YAAAA,CAAAA,CAAAA,EAAvBQ,WAAuBR,CAAP;AAAA,GAAhBQ;AACAP,EAAAA,WAAW,CAAXA,OAAAA,GAAsB,CAACE,SAAS,GAAGE,OAAO,CAAnBF,MAAAA,GAA6BK,OAAO,CAArC,MAAA,EAAtBP,QAAsB,EAAtBA;AAGa;;AAAA,SAAA,eAAA,GAA2B;AACxC,MAAIc,aAAmC,GAAvC,IAAA;AAEA,SAAO;AACLC,IAAAA,gBAAgB,EAAE,IADb,GACa,EADb;AAELC,IAAAA,UAAU,EAAGC,oBAAAA,IAAD,EAAyB;AACnC,UAAMC,OAAO,GAAIJ,aAAa,GAAGK,OAAO,CAAPA,OAAAA,GAAAA,IAAAA,CAAuB,YAAM;AAC5D,YAAID,OAAO,KAAX,aAAA,EAA+B;AAE/BJ,QAAAA,aAAa,GAAbA,IAAAA;AACA,YAAMM,IAAmC,GAAzC,EAAA;AAEAH,QAAAA,IAAI,CAAJA,OAAAA,CAAcI,UAAAA,CAAD,EAAO;AAClB,cAAMb,UAAU,GAAGY,IAAI,CAACC,CAAC,CAAND,IAAI,CAAJA,IAAnB,EAAA;AACAZ,UAAAA,UAAU,CAAVA,IAAAA,CAAAA,CAAAA;AACAY,UAAAA,IAAI,CAACC,CAAC,CAAND,IAAI,CAAJA,GAAAA,UAAAA;AAHFH,SAAAA;AAMA,YAAMK,cAAc,GAAGF,IAAI,CAAJA,KAAAA,GAAaA,IAAI,CAAJA,KAAAA,CAAbA,CAAaA,CAAbA,GAAvB,IAAA;AACA,YAAIG,KAAK,GAAT,EAAA;;AACA,YAAA,cAAA,EAAoB;AAAA,cACZ,QADY,GACGD,cAAc,CAAnC,KADkB,CACZ,QADY;AAElBC,UAAAA,KAAK,GAAG,OAAA,QAAA,KAAA,QAAA,GAAA,QAAA,GAA0CzB,QAAQ,CAARA,IAAAA,CAAlDyB,EAAkDzB,CAAlDyB;AAEF;;AAAA,YAAIA,KAAK,KAAK9B,QAAQ,CAAtB,KAAA,EAA8BA,QAAQ,CAARA,KAAAA,GAAAA,KAAAA;AAC7B,SAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,OAAA,CAAqD+B,UAAAA,IAAD,EAAU;AAC7DC,UAAAA,cAAc,CAAA,IAAA,EAAOL,IAAI,CAAJA,IAAI,CAAJA,IAArBK,EAAc,CAAdA;AADD,SAAA;AAnBH,OAAiCN,CAAjC;AAHJ;AAAO,GAAP;AA4BD","sourcesContent":["const DOMAttributeNames: Record<string, string> = {\n acceptCharset: 'accept-charset',\n className: 'class',\n htmlFor: 'for',\n httpEquiv: 'http-equiv',\n}\n\nfunction reactElementToDOM({ type, props }: JSX.Element): HTMLElement {\n const el = document.createElement(type)\n for (const p in props) {\n if (!props.hasOwnProperty(p)) continue\n if (p === 'children' || p === 'dangerouslySetInnerHTML') continue\n\n // we don't render undefined props to the DOM\n if (props[p] === undefined) continue\n\n const attr = DOMAttributeNames[p] || p.toLowerCase()\n el.setAttribute(attr, props[p])\n }\n\n const { children, dangerouslySetInnerHTML } = props\n if (dangerouslySetInnerHTML) {\n el.innerHTML = dangerouslySetInnerHTML.__html || ''\n } else if (children) {\n el.textContent = typeof children === 'string' ? children : children.join('')\n }\n return el\n}\n\nfunction updateElements(type: string, components: JSX.Element[]) {\n const headEl = document.getElementsByTagName('head')[0]\n const headCountEl: HTMLMetaElement = headEl.querySelector(\n 'meta[name=next-head-count]'\n ) as HTMLMetaElement\n if (process.env.NODE_ENV !== 'production') {\n if (!headCountEl) {\n console.error(\n 'Warning: next-head-count is missing. https://err.sh/next.js/next-head-count-missing'\n )\n return\n }\n }\n\n const headCount = Number(headCountEl.content)\n const oldTags: Element[] = []\n\n for (\n let i = 0, j = headCountEl.previousElementSibling;\n i < headCount;\n i++, j = j!.previousElementSibling\n ) {\n if (j!.tagName.toLowerCase() === type) {\n oldTags.push(j!)\n }\n }\n const newTags = (components.map(reactElementToDOM) as HTMLElement[]).filter(\n (newTag) => {\n for (let k = 0, len = oldTags.length; k < len; k++) {\n const oldTag = oldTags[k]\n if (oldTag.isEqualNode(newTag)) {\n oldTags.splice(k, 1)\n return false\n }\n }\n return true\n }\n )\n\n oldTags.forEach((t) => t.parentNode!.removeChild(t))\n newTags.forEach((t) => headEl.insertBefore(t, headCountEl))\n headCountEl.content = (headCount - oldTags.length + newTags.length).toString()\n}\n\nexport default function initHeadManager() {\n let updatePromise: Promise<void> | null = null\n\n return {\n mountedInstances: new Set(),\n updateHead: (head: JSX.Element[]) => {\n const promise = (updatePromise = Promise.resolve().then(() => {\n if (promise !== updatePromise) return\n\n updatePromise = null\n const tags: Record<string, JSX.Element[]> = {}\n\n head.forEach((h) => {\n const components = tags[h.type] || []\n components.push(h)\n tags[h.type] = components\n })\n\n const titleComponent = tags.title ? tags.title[0] : null\n let title = ''\n if (titleComponent) {\n const { children } = titleComponent.props\n title = typeof children === 'string' ? children : children.join('')\n }\n if (title !== document.title) document.title = title\n ;['meta', 'base', 'link', 'style', 'script'].forEach((type) => {\n updateElements(type, tags[type] || [])\n })\n }))\n },\n }\n}\n"]},"metadata":{},"sourceType":"script"}