no-sparse-arrays.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /**
  2. * @fileoverview Disallow sparse arrays
  3. * @author Nicholas C. Zakas
  4. */
  5. "use strict";
  6. const astUtils = require("./utils/ast-utils");
  7. //------------------------------------------------------------------------------
  8. // Rule Definition
  9. //------------------------------------------------------------------------------
  10. /** @type {import('../types').Rule.RuleModule} */
  11. module.exports = {
  12. meta: {
  13. type: "problem",
  14. docs: {
  15. description: "Disallow sparse arrays",
  16. recommended: true,
  17. url: "https://eslint.org/docs/latest/rules/no-sparse-arrays",
  18. },
  19. schema: [],
  20. messages: {
  21. unexpectedSparseArray: "Unexpected comma in middle of array.",
  22. },
  23. },
  24. create(context) {
  25. //--------------------------------------------------------------------------
  26. // Public
  27. //--------------------------------------------------------------------------
  28. return {
  29. ArrayExpression(node) {
  30. if (!node.elements.includes(null)) {
  31. return;
  32. }
  33. const { sourceCode } = context;
  34. let commaToken;
  35. for (const [index, element] of node.elements.entries()) {
  36. if (index === node.elements.length - 1 && element) {
  37. return;
  38. }
  39. commaToken = sourceCode.getTokenAfter(
  40. element ?? commaToken ?? sourceCode.getFirstToken(node),
  41. astUtils.isCommaToken,
  42. );
  43. if (element) {
  44. continue;
  45. }
  46. context.report({
  47. node,
  48. loc: commaToken.loc,
  49. messageId: "unexpectedSparseArray",
  50. });
  51. }
  52. },
  53. };
  54. },
  55. };