default-param-last.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /**
  2. * @fileoverview enforce default parameters to be last
  3. * @author Chiawen Chen
  4. */
  5. "use strict";
  6. /**
  7. * Checks if node is required: i.e. does not have a default value or ? optional indicator.
  8. * @param {ASTNode} node the node to be evaluated
  9. * @returns {boolean} true if the node is required, false if not.
  10. */
  11. function isRequiredParameter(node) {
  12. return !(
  13. node.type === "AssignmentPattern" ||
  14. node.type === "RestElement" ||
  15. node.optional
  16. );
  17. }
  18. /** @type {import('../types').Rule.RuleModule} */
  19. module.exports = {
  20. meta: {
  21. dialects: ["javascript", "typescript"],
  22. language: "javascript",
  23. type: "suggestion",
  24. docs: {
  25. description: "Enforce default parameters to be last",
  26. recommended: false,
  27. frozen: true,
  28. url: "https://eslint.org/docs/latest/rules/default-param-last",
  29. },
  30. schema: [],
  31. messages: {
  32. shouldBeLast: "Default parameters should be last.",
  33. },
  34. },
  35. create(context) {
  36. /**
  37. * Handler for function contexts.
  38. * @param {ASTNode} node function node
  39. * @returns {void}
  40. */
  41. function handleFunction(node) {
  42. let hasSeenRequiredParameter = false;
  43. for (let i = node.params.length - 1; i >= 0; i -= 1) {
  44. const current = node.params[i];
  45. const param =
  46. current.type === "TSParameterProperty"
  47. ? current.parameter
  48. : current;
  49. if (isRequiredParameter(param)) {
  50. hasSeenRequiredParameter = true;
  51. continue;
  52. }
  53. if (hasSeenRequiredParameter) {
  54. context.report({
  55. node: current,
  56. messageId: "shouldBeLast",
  57. });
  58. }
  59. }
  60. }
  61. return {
  62. FunctionDeclaration: handleFunction,
  63. FunctionExpression: handleFunction,
  64. ArrowFunctionExpression: handleFunction,
  65. };
  66. },
  67. };