| | "use strict"; |
| | var _definerule = require("../utils/define-rule"); |
| | var url = 'https://nextjs.org/docs/messages/inline-script-id'; |
| | module.exports = (0, _definerule.defineRule)({ |
| | meta: { |
| | docs: { |
| | description: 'Enforce `id` attribute on `next/script` components with inline content.', |
| | recommended: true, |
| | url: url |
| | }, |
| | type: 'problem', |
| | schema: [] |
| | }, |
| | create: function create(context) { |
| | var nextScriptImportName = null; |
| | return { |
| | ImportDeclaration: function ImportDeclaration(node) { |
| | if (node.source.value === 'next/script') { |
| | nextScriptImportName = node.specifiers[0].local.name; |
| | } |
| | }, |
| | JSXElement: function JSXElement(node) { |
| | if (nextScriptImportName == null) return; |
| | if (node.openingElement && node.openingElement.name && node.openingElement.name.name !== nextScriptImportName) { |
| | return; |
| | } |
| | var attributeNames = new Set(); |
| | var hasNonCheckableSpreadAttribute = false; |
| | node.openingElement.attributes.forEach(function(attribute) { |
| | |
| | if (hasNonCheckableSpreadAttribute) return; |
| | if (attribute.type === 'JSXAttribute') { |
| | attributeNames.add(attribute.name.name); |
| | } else if (attribute.type === 'JSXSpreadAttribute') { |
| | if (attribute.argument && attribute.argument.properties) { |
| | attribute.argument.properties.forEach(function(property) { |
| | attributeNames.add(property.key.name); |
| | }); |
| | } else { |
| | |
| | hasNonCheckableSpreadAttribute = true; |
| | } |
| | } |
| | }); |
| | |
| | |
| | if (hasNonCheckableSpreadAttribute) return; |
| | if (node.children.length > 0 || attributeNames.has('dangerouslySetInnerHTML')) { |
| | if (!attributeNames.has('id')) { |
| | context.report({ |
| | node: node, |
| | message: "`next/script` components with inline content must specify an `id` attribute. See: ".concat(url) |
| | }); |
| | } |
| | } |
| | } |
| | }; |
| | } |
| | }); |
| |
|