/** * @fileoverview Require or disallow Unicode BOM * @author Andrew Johnston */ 'use strict'; //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ /** @type {import('../types').Rule.RuleModule} */ module.exports = { meta: { type: 'layout', defaultOptions: ['never'], docs: { description: 'Require or disallow Unicode byte order mark (BOM)', recommended: false, url: 'https://eslint.org/docs/latest/rules/unicode-bom', }, fixable: 'whitespace', schema: [ { enum: ['always', 'never'], }, ], messages: { expected: 'Expected Unicode BOM (Byte Order Mark).', unexpected: 'Unexpected Unicode BOM (Byte Order Mark).', }, }, create(context) { //-------------------------------------------------------------------------- // Public //-------------------------------------------------------------------------- return { Program: function checkUnicodeBOM(node) { const sourceCode = context.sourceCode, location = { column: 0, line: 1 }; const [requireBOM] = context.options; if (!sourceCode.hasBOM && requireBOM === 'always') { context.report({ node, loc: location, messageId: 'expected', fix(fixer) { return fixer.insertTextBeforeRange([0, 1], '\uFEFF'); }, }); } else if (sourceCode.hasBOM && requireBOM === 'never') { context.report({ node, loc: location, messageId: 'unexpected', fix(fixer) { return fixer.removeRange([-1, 0]); }, }); } }, }; }, };