"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ "default", { enumerable: true, get: function() { return _default; } }); var _definerule = require("../utils/define-rule"); // Keep in sync with next.js polyfills file : https://github.com/vercel/next.js/blob/master/packages/next-polyfill-nomodule/src/index.js var NEXT_POLYFILLED_FEATURES = [ 'Array.prototype.@@iterator', 'Array.prototype.at', 'Array.prototype.copyWithin', 'Array.prototype.fill', 'Array.prototype.find', 'Array.prototype.findIndex', 'Array.prototype.flatMap', 'Array.prototype.flat', 'Array.from', 'Array.prototype.includes', 'Array.of', 'Function.prototype.name', 'fetch', 'Map', 'Number.EPSILON', 'Number.Epsilon', 'Number.isFinite', 'Number.isNaN', 'Number.isInteger', 'Number.isSafeInteger', 'Number.MAX_SAFE_INTEGER', 'Number.MIN_SAFE_INTEGER', 'Number.parseFloat', 'Number.parseInt', 'Object.assign', 'Object.entries', 'Object.fromEntries', 'Object.getOwnPropertyDescriptor', 'Object.getOwnPropertyDescriptors', 'Object.hasOwn', 'Object.is', 'Object.keys', 'Object.values', 'Reflect', 'Set', 'Symbol', 'Symbol.asyncIterator', 'String.prototype.codePointAt', 'String.prototype.endsWith', 'String.fromCodePoint', 'String.prototype.includes', 'String.prototype.@@iterator', 'String.prototype.padEnd', 'String.prototype.padStart', 'String.prototype.repeat', 'String.raw', 'String.prototype.startsWith', 'String.prototype.trimEnd', 'String.prototype.trimStart', 'URL', 'URL.prototype.toJSON', 'URLSearchParams', 'WeakMap', 'WeakSet', 'Promise', 'Promise.prototype.finally', 'es2015', 'es2016', 'es2017', 'es2018', 'es2019', 'es5', 'es6', 'es7' ]; var url = 'https://nextjs.org/docs/messages/no-unwanted-polyfillio'; var _default = (0, _definerule.defineRule)({ meta: { docs: { description: 'Prevent duplicate polyfills from Polyfill.io.', category: 'HTML', recommended: true, url: url }, type: 'problem', schema: [] }, create: function create(context) { var scriptImport = null; return { ImportDeclaration: function ImportDeclaration(node) { if (node.source && node.source.value === 'next/script') { scriptImport = node.specifiers[0].local.name; } }, JSXOpeningElement: function JSXOpeningElement(node) { if (node.name && node.name.name !== 'script' && node.name.name !== scriptImport) { return; } if (node.attributes.length === 0) { return; } var srcNode = node.attributes.find(function(attr) { return attr.type === 'JSXAttribute' && attr.name.name === 'src'; }); if (!srcNode || srcNode.value.type !== 'Literal') { return; } var src = srcNode.value.value; if (src.startsWith('https://cdn.polyfill.io/v2/') || src.startsWith('https://polyfill.io/v3/') || // https://community.fastly.com/t/new-options-for-polyfill-io-users/2540 src.startsWith('https://polyfill-fastly.net/') || src.startsWith('https://polyfill-fastly.io/') || // https://blog.cloudflare.com/polyfill-io-now-available-on-cdnjs-reduce-your-supply-chain-risk src.startsWith('https://cdnjs.cloudflare.com/polyfill/')) { var featureQueryString = new URL(src).searchParams.get('features'); var featuresRequested = (featureQueryString || '').split(','); var unwantedFeatures = featuresRequested.filter(function(feature) { return NEXT_POLYFILLED_FEATURES.includes(feature); }); if (unwantedFeatures.length > 0) { context.report({ node: node, message: "No duplicate polyfills from Polyfill.io are allowed. ".concat(unwantedFeatures.join(', '), " ").concat(unwantedFeatures.length > 1 ? 'are' : 'is', " already shipped with Next.js. See: ").concat(url) }); } } } }; } });