unicode-bom.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /**
  2. * @fileoverview Require or disallow Unicode BOM
  3. * @author Andrew Johnston <https://github.com/ehjay>
  4. */
  5. "use strict";
  6. //------------------------------------------------------------------------------
  7. // Rule Definition
  8. //------------------------------------------------------------------------------
  9. /** @type {import('../types').Rule.RuleModule} */
  10. module.exports = {
  11. meta: {
  12. type: "layout",
  13. defaultOptions: ["never"],
  14. docs: {
  15. description: "Require or disallow Unicode byte order mark (BOM)",
  16. recommended: false,
  17. url: "https://eslint.org/docs/latest/rules/unicode-bom",
  18. },
  19. fixable: "whitespace",
  20. schema: [
  21. {
  22. enum: ["always", "never"],
  23. },
  24. ],
  25. messages: {
  26. expected: "Expected Unicode BOM (Byte Order Mark).",
  27. unexpected: "Unexpected Unicode BOM (Byte Order Mark).",
  28. },
  29. },
  30. create(context) {
  31. //--------------------------------------------------------------------------
  32. // Public
  33. //--------------------------------------------------------------------------
  34. return {
  35. Program: function checkUnicodeBOM(node) {
  36. const sourceCode = context.sourceCode,
  37. location = { column: 0, line: 1 };
  38. const [requireBOM] = context.options;
  39. if (!sourceCode.hasBOM && requireBOM === "always") {
  40. context.report({
  41. node,
  42. loc: location,
  43. messageId: "expected",
  44. fix(fixer) {
  45. return fixer.insertTextBeforeRange(
  46. [0, 1],
  47. "\uFEFF",
  48. );
  49. },
  50. });
  51. } else if (sourceCode.hasBOM && requireBOM === "never") {
  52. context.report({
  53. node,
  54. loc: location,
  55. messageId: "unexpected",
  56. fix(fixer) {
  57. return fixer.removeRange([-1, 0]);
  58. },
  59. });
  60. }
  61. },
  62. };
  63. },
  64. };