eslint-plugin-nextfriday 1.2.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // package.json
2
2
  var package_default = {
3
3
  name: "eslint-plugin-nextfriday",
4
- version: "1.2.3",
4
+ version: "1.3.0",
5
5
  description: "A comprehensive ESLint plugin providing custom rules and configurations for Next Friday development workflows.",
6
6
  keywords: [
7
7
  "eslint",
@@ -666,12 +666,74 @@ var preferInterfaceOverInlineTypes = createRule9({
666
666
  });
667
667
  var prefer_interface_over_inline_types_default = preferInterfaceOverInlineTypes;
668
668
 
669
- // src/rules/prefer-react-import-types.ts
669
+ // src/rules/prefer-named-param-types.ts
670
670
  import { AST_NODE_TYPES as AST_NODE_TYPES5, ESLintUtils as ESLintUtils10 } from "@typescript-eslint/utils";
671
671
  var createRule10 = ESLintUtils10.RuleCreator(
672
672
  (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, "_").toUpperCase()}.md`
673
673
  );
674
- var preferReactImportTypes = createRule10({
674
+ var preferNamedParamTypes = createRule10({
675
+ name: "prefer-named-param-types",
676
+ meta: {
677
+ type: "suggestion",
678
+ docs: {
679
+ description: "Enforce named interfaces/types instead of inline object types for function parameters"
680
+ },
681
+ messages: {
682
+ preferNamedParamTypes: "Use a named interface or type for object parameter types instead of inline type annotations"
683
+ },
684
+ schema: []
685
+ },
686
+ defaultOptions: [],
687
+ create(context) {
688
+ function hasInlineObjectType(param) {
689
+ if (param.type === AST_NODE_TYPES5.AssignmentPattern) {
690
+ return hasInlineObjectType(param.left);
691
+ }
692
+ if (param.type === AST_NODE_TYPES5.ObjectPattern) {
693
+ if (param.typeAnnotation?.typeAnnotation.type === AST_NODE_TYPES5.TSTypeLiteral) {
694
+ return true;
695
+ }
696
+ }
697
+ if (param.type === AST_NODE_TYPES5.Identifier) {
698
+ if (param.typeAnnotation?.typeAnnotation.type === AST_NODE_TYPES5.TSTypeLiteral) {
699
+ return true;
700
+ }
701
+ }
702
+ return false;
703
+ }
704
+ function checkFunction(node) {
705
+ let params = [];
706
+ if ("params" in node) {
707
+ params = node.params;
708
+ } else if ("value" in node && node.value) {
709
+ params = node.value.params;
710
+ }
711
+ params.forEach((param) => {
712
+ if (hasInlineObjectType(param)) {
713
+ context.report({
714
+ node: param,
715
+ messageId: "preferNamedParamTypes"
716
+ });
717
+ }
718
+ });
719
+ }
720
+ return {
721
+ FunctionDeclaration: checkFunction,
722
+ FunctionExpression: checkFunction,
723
+ ArrowFunctionExpression: checkFunction,
724
+ TSMethodSignature: checkFunction,
725
+ MethodDefinition: checkFunction
726
+ };
727
+ }
728
+ });
729
+ var prefer_named_param_types_default = preferNamedParamTypes;
730
+
731
+ // src/rules/prefer-react-import-types.ts
732
+ import { AST_NODE_TYPES as AST_NODE_TYPES6, ESLintUtils as ESLintUtils11 } from "@typescript-eslint/utils";
733
+ var createRule11 = ESLintUtils11.RuleCreator(
734
+ (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, "_").toUpperCase()}.md`
735
+ );
736
+ var preferReactImportTypes = createRule11({
675
737
  name: "prefer-react-import-types",
676
738
  meta: {
677
739
  type: "suggestion",
@@ -747,7 +809,7 @@ var preferReactImportTypes = createRule10({
747
809
  ]);
748
810
  const allReactExports = /* @__PURE__ */ new Set([...reactTypes, ...reactRuntimeExports]);
749
811
  function checkMemberExpression(node) {
750
- if (node.object.type === AST_NODE_TYPES5.Identifier && node.object.name === "React" && node.property.type === AST_NODE_TYPES5.Identifier && allReactExports.has(node.property.name)) {
812
+ if (node.object.type === AST_NODE_TYPES6.Identifier && node.object.name === "React" && node.property.type === AST_NODE_TYPES6.Identifier && allReactExports.has(node.property.name)) {
751
813
  const typeName = node.property.name;
752
814
  const isType = reactTypes.has(typeName);
753
815
  const importStatement = isType ? `import type { ${typeName} } from "react"` : `import { ${typeName} } from "react"`;
@@ -764,7 +826,7 @@ var preferReactImportTypes = createRule10({
764
826
  return {
765
827
  MemberExpression: checkMemberExpression,
766
828
  "TSTypeReference > TSQualifiedName": (node) => {
767
- if (node.left.type === AST_NODE_TYPES5.Identifier && node.left.name === "React" && node.right.type === AST_NODE_TYPES5.Identifier && allReactExports.has(node.right.name)) {
829
+ if (node.left.type === AST_NODE_TYPES6.Identifier && node.left.name === "React" && node.right.type === AST_NODE_TYPES6.Identifier && allReactExports.has(node.right.name)) {
768
830
  const typeName = node.right.name;
769
831
  const isType = reactTypes.has(typeName);
770
832
  const importStatement = isType ? `import type { ${typeName} } from "react"` : `import { ${typeName} } from "react"`;
@@ -784,11 +846,11 @@ var preferReactImportTypes = createRule10({
784
846
  var prefer_react_import_types_default = preferReactImportTypes;
785
847
 
786
848
  // src/rules/react-props-destructure.ts
787
- import { AST_NODE_TYPES as AST_NODE_TYPES6, ESLintUtils as ESLintUtils11 } from "@typescript-eslint/utils";
788
- var createRule11 = ESLintUtils11.RuleCreator(
849
+ import { AST_NODE_TYPES as AST_NODE_TYPES7, ESLintUtils as ESLintUtils12 } from "@typescript-eslint/utils";
850
+ var createRule12 = ESLintUtils12.RuleCreator(
789
851
  (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, "_").toUpperCase()}.md`
790
852
  );
791
- var reactPropsDestructure = createRule11({
853
+ var reactPropsDestructure = createRule12({
792
854
  name: "react-props-destructure",
793
855
  meta: {
794
856
  type: "suggestion",
@@ -804,29 +866,29 @@ var reactPropsDestructure = createRule11({
804
866
  defaultOptions: [],
805
867
  create(context) {
806
868
  function hasJSXInConditional(node) {
807
- return node.consequent.type === AST_NODE_TYPES6.JSXElement || node.consequent.type === AST_NODE_TYPES6.JSXFragment || node.alternate.type === AST_NODE_TYPES6.JSXElement || node.alternate.type === AST_NODE_TYPES6.JSXFragment;
869
+ return node.consequent.type === AST_NODE_TYPES7.JSXElement || node.consequent.type === AST_NODE_TYPES7.JSXFragment || node.alternate.type === AST_NODE_TYPES7.JSXElement || node.alternate.type === AST_NODE_TYPES7.JSXFragment;
808
870
  }
809
871
  function hasJSXInLogical(node) {
810
- return node.right.type === AST_NODE_TYPES6.JSXElement || node.right.type === AST_NODE_TYPES6.JSXFragment;
872
+ return node.right.type === AST_NODE_TYPES7.JSXElement || node.right.type === AST_NODE_TYPES7.JSXFragment;
811
873
  }
812
874
  function hasJSXReturn(block) {
813
875
  return block.body.some((stmt) => {
814
- if (stmt.type === AST_NODE_TYPES6.ReturnStatement && stmt.argument) {
815
- return stmt.argument.type === AST_NODE_TYPES6.JSXElement || stmt.argument.type === AST_NODE_TYPES6.JSXFragment || stmt.argument.type === AST_NODE_TYPES6.ConditionalExpression && hasJSXInConditional(stmt.argument) || stmt.argument.type === AST_NODE_TYPES6.LogicalExpression && hasJSXInLogical(stmt.argument);
876
+ if (stmt.type === AST_NODE_TYPES7.ReturnStatement && stmt.argument) {
877
+ return stmt.argument.type === AST_NODE_TYPES7.JSXElement || stmt.argument.type === AST_NODE_TYPES7.JSXFragment || stmt.argument.type === AST_NODE_TYPES7.ConditionalExpression && hasJSXInConditional(stmt.argument) || stmt.argument.type === AST_NODE_TYPES7.LogicalExpression && hasJSXInLogical(stmt.argument);
816
878
  }
817
879
  return false;
818
880
  });
819
881
  }
820
882
  function isReactComponent(node) {
821
- if (node.type === AST_NODE_TYPES6.ArrowFunctionExpression) {
822
- if (node.body.type === AST_NODE_TYPES6.JSXElement || node.body.type === AST_NODE_TYPES6.JSXFragment) {
883
+ if (node.type === AST_NODE_TYPES7.ArrowFunctionExpression) {
884
+ if (node.body.type === AST_NODE_TYPES7.JSXElement || node.body.type === AST_NODE_TYPES7.JSXFragment) {
823
885
  return true;
824
886
  }
825
- if (node.body.type === AST_NODE_TYPES6.BlockStatement) {
887
+ if (node.body.type === AST_NODE_TYPES7.BlockStatement) {
826
888
  return hasJSXReturn(node.body);
827
889
  }
828
- } else if (node.type === AST_NODE_TYPES6.FunctionExpression || node.type === AST_NODE_TYPES6.FunctionDeclaration) {
829
- if (node.body && node.body.type === AST_NODE_TYPES6.BlockStatement) {
890
+ } else if (node.type === AST_NODE_TYPES7.FunctionExpression || node.type === AST_NODE_TYPES7.FunctionDeclaration) {
891
+ if (node.body && node.body.type === AST_NODE_TYPES7.BlockStatement) {
830
892
  return hasJSXReturn(node.body);
831
893
  }
832
894
  }
@@ -840,9 +902,9 @@ var reactPropsDestructure = createRule11({
840
902
  return;
841
903
  }
842
904
  const param = node.params[0];
843
- if (param.type === AST_NODE_TYPES6.ObjectPattern) {
844
- const properties = param.properties.filter((prop) => prop.type === AST_NODE_TYPES6.Property).map((prop) => {
845
- if (prop.key.type === AST_NODE_TYPES6.Identifier) {
905
+ if (param.type === AST_NODE_TYPES7.ObjectPattern) {
906
+ const properties = param.properties.filter((prop) => prop.type === AST_NODE_TYPES7.Property).map((prop) => {
907
+ if (prop.key.type === AST_NODE_TYPES7.Identifier) {
846
908
  return prop.key.name;
847
909
  }
848
910
  return null;
@@ -883,6 +945,7 @@ var rules = {
883
945
  "prefer-destructuring-params": prefer_destructuring_params_default,
884
946
  "prefer-import-type": prefer_import_type_default,
885
947
  "prefer-interface-over-inline-types": prefer_interface_over_inline_types_default,
948
+ "prefer-named-param-types": prefer_named_param_types_default,
886
949
  "prefer-react-import-types": prefer_react_import_types_default,
887
950
  "react-props-destructure": react_props_destructure_default
888
951
  };
@@ -897,6 +960,7 @@ var baseRules = {
897
960
  "nextfriday/prefer-destructuring-params": "warn",
898
961
  "nextfriday/no-explicit-return-type": "warn",
899
962
  "nextfriday/prefer-import-type": "warn",
963
+ "nextfriday/prefer-named-param-types": "warn",
900
964
  "nextfriday/prefer-react-import-types": "warn"
901
965
  };
902
966
  var baseRecommendedRules = {
@@ -906,6 +970,7 @@ var baseRecommendedRules = {
906
970
  "nextfriday/prefer-destructuring-params": "error",
907
971
  "nextfriday/no-explicit-return-type": "error",
908
972
  "nextfriday/prefer-import-type": "error",
973
+ "nextfriday/prefer-named-param-types": "error",
909
974
  "nextfriday/prefer-react-import-types": "error"
910
975
  };
911
976
  var jsxRules = {
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/rules/enforce-readonly-component-props.ts","../src/rules/file-kebab-case.ts","../src/rules/jsx-pascal-case.ts","../src/rules/md-filename-case-restriction.ts","../src/rules/no-emoji.ts","../src/rules/no-explicit-return-type.ts","../src/rules/prefer-destructuring-params.ts","../src/rules/prefer-import-type.ts","../src/rules/prefer-interface-over-inline-types.ts","../src/rules/prefer-react-import-types.ts","../src/rules/react-props-destructure.ts","../src/index.ts"],"sourcesContent":["{\n \"name\": \"eslint-plugin-nextfriday\",\n \"version\": \"1.2.3\",\n \"description\": \"A comprehensive ESLint plugin providing custom rules and configurations for Next Friday development workflows.\",\n \"keywords\": [\n \"eslint\",\n \"eslintplugin\",\n \"eslint-plugin\",\n \"nextfriday\",\n \"next-friday\",\n \"linting\",\n \"code-quality\",\n \"javascript\",\n \"typescript\",\n \"development-tools\"\n ],\n \"homepage\": \"https://github.com/next-friday/eslint-plugin-nextfriday\",\n \"bugs\": {\n \"url\": \"https://github.com/next-friday/eslint-plugin-nextfriday/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/next-friday/eslint-plugin-nextfriday.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"Next Friday <nextfriday.developer@gmail.com>\",\n \"contributors\": [\n \"@joetakara\"\n ],\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./lib/index.d.ts\",\n \"import\": \"./lib/index.js\",\n \"require\": \"./lib/index.cjs\"\n }\n },\n \"main\": \"lib/index.js\",\n \"types\": \"lib/index.d.ts\",\n \"files\": [\n \"LICENSE\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"docs\",\n \"lib\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"changeset\": \"changeset\",\n \"changeset:publish\": \"npm publish --provenance --access public\",\n \"changeset:version\": \"changeset version\",\n \"clear\": \"rm -rf lib node_modules/.cache .eslintcache\",\n \"eslint\": \"eslint src --ext .js,.ts,.mjs --fix\",\n \"eslint:check\": \"eslint src --ext .js,.ts,.mjs\",\n \"preinstall\": \"npx only-allow pnpm\",\n \"prepare\": \"husky\",\n \"prepublishOnly\": \"pnpm run build\",\n \"prettier\": \"prettier --write .\",\n \"prettier:check\": \"prettier --check .\",\n \"sort-package-json\": \"pnpm exec sort-package-json\",\n \"sort-package-json:check\": \"pnpm exec sort-package-json --check\",\n \"test\": \"jest\",\n \"test:coverage\": \"jest --coverage\",\n \"test:watch\": \"jest --watch\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@typescript-eslint/utils\": \"^8.42.0\",\n \"emoji-regex\": \"^10.5.0\",\n \"tsup\": \"^8.5.0\"\n },\n \"devDependencies\": {\n \"@changesets/changelog-github\": \"^0.5.1\",\n \"@changesets/cli\": \"^2.29.6\",\n \"@commitlint/cli\": \"^19.8.1\",\n \"@commitlint/config-conventional\": \"^19.8.1\",\n \"@eslint/js\": \"^9.35.0\",\n \"@jest/globals\": \"^30.1.2\",\n \"@stylistic/eslint-plugin\": \"^3.1.0\",\n \"@swc/core\": \"^1.13.5\",\n \"@types/eslint\": \"^9.6.1\",\n \"@types/jest\": \"^30.0.0\",\n \"@types/node\": \"^22.5.4\",\n \"@types/ramda\": \"^0.31.0\",\n \"@typescript-eslint/parser\": \"^8.42.0\",\n \"@typescript-eslint/rule-tester\": \"^8.42.0\",\n \"eslint\": \"^9.35.0\",\n \"eslint-config-airbnb-extended\": \"^2.2.0\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-import-resolver-typescript\": \"^4.4.4\",\n \"eslint-plugin-import-x\": \"^4.16.1\",\n \"eslint-plugin-jest\": \"^29.0.1\",\n \"eslint-plugin-prettier\": \"^5.5.4\",\n \"eslint-plugin-sonarjs\": \"^3.0.5\",\n \"husky\": \"^9.1.7\",\n \"jest\": \"^29.7.0\",\n \"lint-staged\": \"^16.1.6\",\n \"prettier\": \"^3.6.2\",\n \"sort-package-json\": \"^3.4.0\",\n \"ts-jest\": \"^29.4.1\",\n \"ts-node\": \"^10.9.2\",\n \"typescript\": \"^5.6.2\",\n \"typescript-eslint\": \"^8.42.0\"\n },\n \"peerDependencies\": {\n \"eslint\": \"^9.0.0\"\n },\n \"packageManager\": \"pnpm@9.12.0\",\n \"engines\": {\n \"node\": \">=22.0.0\",\n \"pnpm\": \">=9.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst enforceReadonlyComponentProps = createRule({\n name: \"enforce-readonly-component-props\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce Readonly wrapper for React component props when using named types or interfaces\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n useReadonly: \"Component props should be wrapped with Readonly<> for immutability\",\n },\n },\n defaultOptions: [],\n create(context) {\n function hasJSXInConditional(node: TSESTree.ConditionalExpression): boolean {\n return (\n node.consequent.type === AST_NODE_TYPES.JSXElement ||\n node.consequent.type === AST_NODE_TYPES.JSXFragment ||\n node.alternate.type === AST_NODE_TYPES.JSXElement ||\n node.alternate.type === AST_NODE_TYPES.JSXFragment\n );\n }\n\n function hasJSXInLogical(node: TSESTree.LogicalExpression): boolean {\n return node.right.type === AST_NODE_TYPES.JSXElement || node.right.type === AST_NODE_TYPES.JSXFragment;\n }\n\n function hasJSXReturn(block: TSESTree.BlockStatement): boolean {\n return block.body.some((stmt) => {\n if (stmt.type === AST_NODE_TYPES.ReturnStatement && stmt.argument) {\n return (\n stmt.argument.type === AST_NODE_TYPES.JSXElement ||\n stmt.argument.type === AST_NODE_TYPES.JSXFragment ||\n (stmt.argument.type === AST_NODE_TYPES.ConditionalExpression && hasJSXInConditional(stmt.argument)) ||\n (stmt.argument.type === AST_NODE_TYPES.LogicalExpression && hasJSXInLogical(stmt.argument))\n );\n }\n return false;\n });\n }\n\n function isReactComponent(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression | TSESTree.FunctionDeclaration,\n ): boolean {\n if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {\n if (node.body.type === AST_NODE_TYPES.JSXElement || node.body.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n if (node.body.type === AST_NODE_TYPES.BlockStatement) {\n return hasJSXReturn(node.body);\n }\n } else if (node.type === AST_NODE_TYPES.FunctionExpression || node.type === AST_NODE_TYPES.FunctionDeclaration) {\n if (node.body && node.body.type === AST_NODE_TYPES.BlockStatement) {\n return hasJSXReturn(node.body);\n }\n }\n return false;\n }\n\n function isNamedType(node: TSESTree.TypeNode): boolean {\n return node.type === AST_NODE_TYPES.TSTypeReference;\n }\n\n function isAlreadyReadonly(node: TSESTree.TypeNode): boolean {\n if (node.type === AST_NODE_TYPES.TSTypeReference && node.typeName) {\n if (node.typeName.type === AST_NODE_TYPES.Identifier && node.typeName.name === \"Readonly\") {\n return true;\n }\n }\n return false;\n }\n\n function checkFunction(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression | TSESTree.FunctionDeclaration,\n ) {\n if (!isReactComponent(node)) {\n return;\n }\n if (node.params.length !== 1) {\n return;\n }\n const param = node.params[0];\n if (param.type === AST_NODE_TYPES.Identifier && param.typeAnnotation) {\n const { typeAnnotation } = param.typeAnnotation;\n if (isNamedType(typeAnnotation) && !isAlreadyReadonly(typeAnnotation)) {\n const { sourceCode } = context;\n const typeText = sourceCode.getText(typeAnnotation);\n context.report({\n node: param.typeAnnotation,\n messageId: \"useReadonly\",\n fix(fixer) {\n return fixer.replaceText(typeAnnotation, `Readonly<${typeText}>`);\n },\n });\n }\n }\n }\n\n return {\n ArrowFunctionExpression: checkFunction,\n FunctionExpression: checkFunction,\n FunctionDeclaration: checkFunction,\n };\n },\n});\n\nexport default enforceReadonlyComponentProps;\n","import path from \"path\";\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst isKebabCase = (str: string) => {\n if (/\\.(config|rc|setup|spec|test)$/.test(str) || /^[a-z0-9]+(?:-[a-z0-9]+)*\\.[a-z0-9]+(?:-[a-z0-9]+)*$/.test(str)) {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\.[a-z0-9]+(?:-[a-z0-9]+)*)*$/.test(str);\n }\n\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(str);\n};\n\nconst fileKebabCase = createRule({\n name: \"file-kebab-case\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce kebab-case filenames for .ts and .js files\",\n },\n messages: {\n fileKebabCase: \"File names must be kebab-case\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Program() {\n const { filename } = context;\n const ext = path.extname(filename);\n\n if (ext !== \".ts\" && ext !== \".js\") {\n return;\n }\n\n const basename = path.basename(filename, ext);\n\n if (!isKebabCase(basename)) {\n context.report({\n loc: { line: 1, column: 0 },\n messageId: \"fileKebabCase\",\n });\n }\n },\n };\n },\n});\n\nexport default fileKebabCase;\n","import path from \"path\";\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst isPascalCase = (str: string) => /^[A-Z][a-zA-Z0-9]*$/.test(str) && !/^[A-Z]+$/.test(str);\n\nconst jsxPascalCase = createRule({\n name: \"jsx-pascal-case\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce PascalCase filenames for .jsx and .tsx files\",\n },\n messages: {\n jsxPascalCase: \"JSX/TSX file names must be PascalCase\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Program() {\n const { filename } = context;\n const ext = path.extname(filename);\n\n if (ext !== \".jsx\" && ext !== \".tsx\") {\n return;\n }\n\n const basename = path.basename(filename, ext);\n\n if (!isPascalCase(basename)) {\n context.report({\n loc: { line: 1, column: 0 },\n messageId: \"jsxPascalCase\",\n });\n }\n },\n };\n },\n});\n\nexport default jsxPascalCase;\n","import path from \"path\";\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst mdFilenameCaseRestriction = createRule({\n name: \"md-filename-case-restriction\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce .md filenames to be SNAKE_CASE only\",\n },\n messages: {\n invalidFilenameCase: \"Markdown filename must be SNAKE_CASE (UPPERCASE with underscores). Found: '{{ filename }}'\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Program() {\n const { filename } = context;\n\n if (!filename.endsWith(\".md\")) {\n return;\n }\n\n const basename = path.basename(filename, \".md\");\n\n function isSnakeCase(text: string): boolean {\n return /^[A-Z][A-Z0-9_]*$/.test(text);\n }\n\n function isValidCase(text: string): boolean {\n return isSnakeCase(text);\n }\n\n if (!isValidCase(basename)) {\n context.report({\n node: context.sourceCode.ast,\n messageId: \"invalidFilenameCase\",\n data: { filename: basename },\n });\n }\n },\n };\n },\n});\n\nexport default mdFilenameCaseRestriction;\n","import emojiRegex from \"emoji-regex\";\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst noEmoji = createRule({\n name: \"no-emoji\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow emoji characters in source code\",\n },\n messages: {\n noEmoji: \"Emoji are not allowed in source code\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { sourceCode } = context;\n\n return {\n Program() {\n const text = sourceCode.getText();\n const regex = emojiRegex();\n const matches = Array.from(text.matchAll(regex));\n\n matches.forEach((match) => {\n const loc = sourceCode.getLocFromIndex(match.index);\n\n context.report({\n loc,\n messageId: \"noEmoji\",\n });\n });\n },\n };\n },\n});\n\nexport default noEmoji;\n","import { ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst noExplicitReturnType = createRule({\n name: \"no-explicit-return-type\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow explicit return types on functions\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n noExplicitReturnType: \"Remove explicit return type '{{returnType}}' - TypeScript can infer it automatically\",\n },\n },\n defaultOptions: [],\n create(context) {\n const checkFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression,\n ) => {\n if (node.returnType) {\n const returnTypeText = context.sourceCode.getText(node.returnType);\n context.report({\n node: node.returnType,\n messageId: \"noExplicitReturnType\",\n data: {\n returnType: returnTypeText,\n },\n fix(fixer) {\n return fixer.remove(node.returnType!);\n },\n });\n }\n };\n\n return {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n };\n },\n});\n\nexport default noExplicitReturnType;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst preferDestructuringParams = createRule({\n name: \"prefer-destructuring-params\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce destructuring for functions with multiple parameters\",\n },\n messages: {\n preferDestructuring: \"Functions with multiple parameters should use destructuring\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const isCallbackFunction = (node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression) => {\n const { parent } = node;\n return parent?.type === AST_NODE_TYPES.CallExpression;\n };\n\n const isDeveloperFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression,\n ) => {\n if (node.type === AST_NODE_TYPES.FunctionDeclaration) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.FunctionExpression || node.type === AST_NODE_TYPES.ArrowFunctionExpression) {\n if (isCallbackFunction(node)) {\n return false;\n }\n\n const { parent } = node;\n return (\n parent?.type === AST_NODE_TYPES.VariableDeclarator ||\n parent?.type === AST_NODE_TYPES.AssignmentExpression ||\n parent?.type === AST_NODE_TYPES.Property ||\n parent?.type === AST_NODE_TYPES.MethodDefinition\n );\n }\n\n return false;\n };\n\n const checkFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression,\n ) => {\n const { filename } = context;\n if (filename.includes(\"node_modules\") || filename.includes(\".d.ts\")) {\n return;\n }\n\n if (!isDeveloperFunction(node)) {\n return;\n }\n\n if (node.type === AST_NODE_TYPES.FunctionDeclaration && node.id) {\n const functionName = node.id.name;\n if (functionName.startsWith(\"_\") || functionName.includes(\"$\") || /^[A-Z][a-zA-Z]*$/.test(functionName)) {\n return;\n }\n }\n\n if (node.params.length <= 1) {\n return;\n }\n\n const hasNonDestructuredParams = node.params.some(\n (param: TSESTree.Parameter) =>\n param.type !== AST_NODE_TYPES.ObjectPattern && param.type !== AST_NODE_TYPES.RestElement,\n );\n\n if (hasNonDestructuredParams) {\n context.report({\n node,\n messageId: \"preferDestructuring\",\n });\n }\n };\n\n return {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n };\n },\n});\n\nexport default preferDestructuringParams;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst preferImportType = createRule({\n name: \"prefer-import-type\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce using 'import type' for type-only imports\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n preferImportType: \"Use 'import type' for type-only imports\",\n },\n },\n defaultOptions: [],\n create(context) {\n function checkImportDeclaration(node: TSESTree.ImportDeclaration) {\n if (node.importKind === \"type\") {\n return;\n }\n\n if (\n context.filename.includes(\".test.\") ||\n context.filename.includes(\".spec.\") ||\n context.filename.includes(\"__tests__\")\n ) {\n return;\n }\n\n if (node.specifiers.length === 0) {\n return;\n }\n\n const source = node.source.value;\n const isRuntimeImport =\n /\\.(css|scss|sass|less|styl)(\\?.*)?$/.test(source) ||\n /\\.(png|jpg|jpeg|gif|svg|webp|ico|bmp)(\\?.*)?$/.test(source) ||\n /\\.(woff|woff2|ttf|eot|otf)(\\?.*)?$/.test(source) ||\n /\\.(mp4|webm|ogg|mp3|wav|flac|aac)(\\?.*)?$/.test(source) ||\n /\\.(json|txt|md|xml|yml|yaml)(\\?.*)?$/.test(source) ||\n /^next\\/(font|image|link|head|script|dynamic|router)/.test(source) ||\n source.includes(\"/font/\") ||\n source === \"react-dom\" ||\n source === \"react-dom/client\" ||\n source === \"react-dom/server\" ||\n source.startsWith(\"@emotion/\") ||\n source.startsWith(\"styled-components\") ||\n source.includes(\"polyfill\") ||\n source.includes(\"shim\") ||\n source === \"styled-jsx/css\" ||\n source.startsWith(\"webpack/\");\n\n if (isRuntimeImport) {\n return;\n }\n\n const isTypeOnlyImport = node.specifiers.every((specifier) => {\n if (specifier.type === AST_NODE_TYPES.ImportDefaultSpecifier) {\n return false;\n }\n if (specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier) {\n return false;\n }\n if (specifier.type === AST_NODE_TYPES.ImportSpecifier) {\n const importedName =\n specifier.imported.type === AST_NODE_TYPES.Identifier ? specifier.imported.name : specifier.imported.value;\n\n const isKnownTypeOnly =\n (node.source.value === \"@typescript-eslint/utils\" && [\"TSESTree\", \"RuleContext\"].includes(importedName)) ||\n (node.source.value === \"react\" &&\n [\"Component\", \"ComponentProps\", \"ReactNode\", \"FC\", \"JSX\", \"ReactElement\", \"PropsWithChildren\"].includes(\n importedName,\n )) ||\n importedName.endsWith(\"Type\") ||\n importedName.endsWith(\"Interface\") ||\n importedName.endsWith(\"Props\");\n\n return isKnownTypeOnly;\n }\n return false;\n });\n\n if (isTypeOnlyImport) {\n context.report({\n node,\n messageId: \"preferImportType\",\n fix(fixer) {\n const sourceText = context.sourceCode.getText(node);\n const fixedSource = sourceText.replace(/^import\\s+/, \"import type \");\n return fixer.replaceText(node, fixedSource);\n },\n });\n }\n }\n\n return {\n ImportDeclaration: checkImportDeclaration,\n };\n },\n});\n\nexport default preferImportType;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst preferInterfaceOverInlineTypes = createRule({\n name: \"prefer-interface-over-inline-types\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce interface declarations over inline type annotations for React component props\",\n },\n fixable: undefined,\n schema: [],\n messages: {\n useInterface: \"Use interface declaration for component props instead of inline type annotation\",\n },\n },\n defaultOptions: [],\n create(context) {\n function hasJSXInConditional(node: TSESTree.ConditionalExpression): boolean {\n return (\n node.consequent.type === AST_NODE_TYPES.JSXElement ||\n node.consequent.type === AST_NODE_TYPES.JSXFragment ||\n node.alternate.type === AST_NODE_TYPES.JSXElement ||\n node.alternate.type === AST_NODE_TYPES.JSXFragment\n );\n }\n\n function hasJSXInLogical(node: TSESTree.LogicalExpression): boolean {\n return node.right.type === AST_NODE_TYPES.JSXElement || node.right.type === AST_NODE_TYPES.JSXFragment;\n }\n\n function hasJSXReturn(block: TSESTree.BlockStatement): boolean {\n return block.body.some((stmt) => {\n if (stmt.type === AST_NODE_TYPES.ReturnStatement && stmt.argument) {\n return (\n stmt.argument.type === AST_NODE_TYPES.JSXElement ||\n stmt.argument.type === AST_NODE_TYPES.JSXFragment ||\n (stmt.argument.type === AST_NODE_TYPES.ConditionalExpression && hasJSXInConditional(stmt.argument)) ||\n (stmt.argument.type === AST_NODE_TYPES.LogicalExpression && hasJSXInLogical(stmt.argument))\n );\n }\n return false;\n });\n }\n\n function isReactComponent(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression | TSESTree.FunctionDeclaration,\n ): boolean {\n if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {\n if (node.body.type === AST_NODE_TYPES.JSXElement || node.body.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n if (node.body.type === AST_NODE_TYPES.BlockStatement) {\n return hasJSXReturn(node.body);\n }\n } else if (node.type === AST_NODE_TYPES.FunctionExpression || node.type === AST_NODE_TYPES.FunctionDeclaration) {\n if (node.body && node.body.type === AST_NODE_TYPES.BlockStatement) {\n return hasJSXReturn(node.body);\n }\n }\n return false;\n }\n\n function isInlineTypeAnnotation(node: TSESTree.TypeNode): boolean {\n if (node.type === AST_NODE_TYPES.TSTypeLiteral) {\n return true;\n }\n if (node.type === AST_NODE_TYPES.TSTypeReference && node.typeArguments) {\n return node.typeArguments.params.some((param) => param.type === AST_NODE_TYPES.TSTypeLiteral);\n }\n if (node.type === AST_NODE_TYPES.TSUnionType) {\n return node.types.some((type) => isInlineTypeAnnotation(type));\n }\n return false;\n }\n\n function hasInlineObjectType(node: TSESTree.TypeNode): boolean {\n if (node.type === AST_NODE_TYPES.TSTypeLiteral) {\n return true;\n }\n if (node.type === AST_NODE_TYPES.TSTypeReference && node.typeArguments) {\n return node.typeArguments.params.some((param) => param.type === AST_NODE_TYPES.TSTypeLiteral);\n }\n if (node.type === AST_NODE_TYPES.TSUnionType) {\n return node.types.some((type) => hasInlineObjectType(type));\n }\n return false;\n }\n\n function checkFunction(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression | TSESTree.FunctionDeclaration,\n ) {\n if (!isReactComponent(node)) {\n return;\n }\n if (node.params.length !== 1) {\n return;\n }\n const param = node.params[0];\n if (param.type === AST_NODE_TYPES.Identifier && param.typeAnnotation) {\n const { typeAnnotation } = param.typeAnnotation;\n if (isInlineTypeAnnotation(typeAnnotation) && hasInlineObjectType(typeAnnotation)) {\n context.report({\n node: param.typeAnnotation,\n messageId: \"useInterface\",\n });\n }\n }\n }\n\n return {\n ArrowFunctionExpression: checkFunction,\n FunctionExpression: checkFunction,\n FunctionDeclaration: checkFunction,\n };\n },\n});\n\nexport default preferInterfaceOverInlineTypes;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst preferReactImportTypes = createRule({\n name: \"prefer-react-import-types\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce importing React types and utilities from 'react' instead of using React.X\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n preferDirectImport: \"Use direct import '{{importStatement}}' instead of 'React.{{typeName}}'\",\n },\n },\n defaultOptions: [],\n create(context) {\n const reactTypes = new Set([\n \"ReactNode\",\n \"ReactElement\",\n \"ReactChildren\",\n \"ReactChild\",\n \"ComponentType\",\n \"FC\",\n \"FunctionComponent\",\n \"Component\",\n \"PureComponent\",\n \"ReactEventHandler\",\n \"MouseEventHandler\",\n \"ChangeEventHandler\",\n \"FormEventHandler\",\n \"KeyboardEventHandler\",\n \"TouchEventHandler\",\n \"PointerEventHandler\",\n \"FocusEventHandler\",\n \"UIEventHandler\",\n \"WheelEventHandler\",\n \"AnimationEventHandler\",\n \"TransitionEventHandler\",\n \"RefObject\",\n \"MutableRefObject\",\n \"Ref\",\n \"ForwardedRef\",\n \"HTMLProps\",\n \"ComponentProps\",\n \"JSXElementConstructor\",\n ]);\n\n const reactRuntimeExports = new Set([\n \"useState\",\n \"useEffect\",\n \"useContext\",\n \"useReducer\",\n \"useCallback\",\n \"useMemo\",\n \"useRef\",\n \"useImperativeHandle\",\n \"useLayoutEffect\",\n \"useDebugValue\",\n \"useDeferredValue\",\n \"useTransition\",\n \"useId\",\n \"useSyncExternalStore\",\n \"useInsertionEffect\",\n \"createElement\",\n \"createContext\",\n \"forwardRef\",\n \"memo\",\n \"lazy\",\n \"Suspense\",\n \"Fragment\",\n \"StrictMode\",\n \"createRef\",\n \"isValidElement\",\n \"cloneElement\",\n \"Children\",\n ]);\n\n const allReactExports = new Set([...reactTypes, ...reactRuntimeExports]);\n\n function checkMemberExpression(node: TSESTree.MemberExpression) {\n if (\n node.object.type === AST_NODE_TYPES.Identifier &&\n node.object.name === \"React\" &&\n node.property.type === AST_NODE_TYPES.Identifier &&\n allReactExports.has(node.property.name)\n ) {\n const typeName = node.property.name;\n const isType = reactTypes.has(typeName);\n const importStatement = isType\n ? `import type { ${typeName} } from \"react\"`\n : `import { ${typeName} } from \"react\"`;\n\n context.report({\n node,\n messageId: \"preferDirectImport\",\n data: { typeName, importStatement },\n fix(fixer) {\n return fixer.replaceText(node, typeName);\n },\n });\n }\n }\n\n return {\n MemberExpression: checkMemberExpression,\n \"TSTypeReference > TSQualifiedName\": (node: TSESTree.TSQualifiedName) => {\n if (\n node.left.type === AST_NODE_TYPES.Identifier &&\n node.left.name === \"React\" &&\n node.right.type === AST_NODE_TYPES.Identifier &&\n allReactExports.has(node.right.name)\n ) {\n const typeName = node.right.name;\n const isType = reactTypes.has(typeName);\n const importStatement = isType\n ? `import type { ${typeName} } from \"react\"`\n : `import { ${typeName} } from \"react\"`;\n\n context.report({\n node,\n messageId: \"preferDirectImport\",\n data: { typeName, importStatement },\n fix(fixer) {\n return fixer.replaceText(node, typeName);\n },\n });\n }\n },\n };\n },\n});\n\nexport default preferReactImportTypes;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst reactPropsDestructure = createRule({\n name: \"react-props-destructure\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce destructuring props inside React component body instead of parameters\",\n },\n fixable: undefined,\n schema: [],\n messages: {\n noParameterDestructuring:\n \"Destructure props inside component body instead of parameters. Use 'const { {{properties}} } = props;'\",\n },\n },\n defaultOptions: [],\n create(context) {\n function hasJSXInConditional(node: TSESTree.ConditionalExpression): boolean {\n return (\n node.consequent.type === AST_NODE_TYPES.JSXElement ||\n node.consequent.type === AST_NODE_TYPES.JSXFragment ||\n node.alternate.type === AST_NODE_TYPES.JSXElement ||\n node.alternate.type === AST_NODE_TYPES.JSXFragment\n );\n }\n\n function hasJSXInLogical(node: TSESTree.LogicalExpression): boolean {\n return node.right.type === AST_NODE_TYPES.JSXElement || node.right.type === AST_NODE_TYPES.JSXFragment;\n }\n\n function hasJSXReturn(block: TSESTree.BlockStatement): boolean {\n return block.body.some((stmt) => {\n if (stmt.type === AST_NODE_TYPES.ReturnStatement && stmt.argument) {\n return (\n stmt.argument.type === AST_NODE_TYPES.JSXElement ||\n stmt.argument.type === AST_NODE_TYPES.JSXFragment ||\n (stmt.argument.type === AST_NODE_TYPES.ConditionalExpression && hasJSXInConditional(stmt.argument)) ||\n (stmt.argument.type === AST_NODE_TYPES.LogicalExpression && hasJSXInLogical(stmt.argument))\n );\n }\n\n return false;\n });\n }\n\n function isReactComponent(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression | TSESTree.FunctionDeclaration,\n ) {\n if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {\n if (node.body.type === AST_NODE_TYPES.JSXElement || node.body.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n\n if (node.body.type === AST_NODE_TYPES.BlockStatement) {\n return hasJSXReturn(node.body);\n }\n } else if (node.type === AST_NODE_TYPES.FunctionExpression || node.type === AST_NODE_TYPES.FunctionDeclaration) {\n if (node.body && node.body.type === AST_NODE_TYPES.BlockStatement) {\n return hasJSXReturn(node.body);\n }\n }\n\n return false;\n }\n\n function checkFunction(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression | TSESTree.FunctionDeclaration,\n ) {\n if (!isReactComponent(node)) {\n return;\n }\n\n if (node.params.length !== 1) {\n return;\n }\n\n const param = node.params[0];\n\n if (param.type === AST_NODE_TYPES.ObjectPattern) {\n const properties = param.properties\n .filter((prop): prop is TSESTree.Property => prop.type === AST_NODE_TYPES.Property)\n .map((prop) => {\n if (prop.key.type === AST_NODE_TYPES.Identifier) {\n return prop.key.name;\n }\n return null;\n })\n .filter((name): name is string => name !== null);\n\n if (properties.length === 0) {\n return;\n }\n\n context.report({\n node: param,\n messageId: \"noParameterDestructuring\",\n data: {\n properties: properties.join(\", \"),\n },\n });\n }\n }\n\n return {\n ArrowFunctionExpression: checkFunction,\n FunctionExpression: checkFunction,\n FunctionDeclaration: checkFunction,\n };\n },\n});\n\nexport default reactPropsDestructure;\n","import packageJson from \"../package.json\" assert { type: \"json\" };\n\nimport enforceReadonlyComponentProps from \"./rules/enforce-readonly-component-props\";\nimport fileKebabCase from \"./rules/file-kebab-case\";\nimport jsxPascalCase from \"./rules/jsx-pascal-case\";\nimport mdFilenameCaseRestriction from \"./rules/md-filename-case-restriction\";\nimport noEmoji from \"./rules/no-emoji\";\nimport noExplicitReturnType from \"./rules/no-explicit-return-type\";\nimport preferDestructuringParams from \"./rules/prefer-destructuring-params\";\nimport preferImportType from \"./rules/prefer-import-type\";\nimport preferInterfaceOverInlineTypes from \"./rules/prefer-interface-over-inline-types\";\nimport preferReactImportTypes from \"./rules/prefer-react-import-types\";\nimport reactPropsDestructure from \"./rules/react-props-destructure\";\n\nimport type { TSESLint } from \"@typescript-eslint/utils\";\n\nconst meta = {\n name: packageJson.name,\n version: packageJson.version,\n} as const;\n\nconst rules = {\n \"enforce-readonly-component-props\": enforceReadonlyComponentProps,\n \"file-kebab-case\": fileKebabCase,\n \"jsx-pascal-case\": jsxPascalCase,\n \"md-filename-case-restriction\": mdFilenameCaseRestriction,\n \"no-emoji\": noEmoji,\n \"no-explicit-return-type\": noExplicitReturnType,\n \"prefer-destructuring-params\": preferDestructuringParams,\n \"prefer-import-type\": preferImportType,\n \"prefer-interface-over-inline-types\": preferInterfaceOverInlineTypes,\n \"prefer-react-import-types\": preferReactImportTypes,\n \"react-props-destructure\": reactPropsDestructure,\n} as const satisfies Record<string, TSESLint.RuleModule<string, readonly unknown[]>>;\n\nconst plugin = {\n meta,\n rules,\n} as const;\n\nconst baseRules = {\n \"nextfriday/no-emoji\": \"warn\",\n \"nextfriday/file-kebab-case\": \"warn\",\n \"nextfriday/md-filename-case-restriction\": \"warn\",\n \"nextfriday/prefer-destructuring-params\": \"warn\",\n \"nextfriday/no-explicit-return-type\": \"warn\",\n \"nextfriday/prefer-import-type\": \"warn\",\n \"nextfriday/prefer-react-import-types\": \"warn\",\n} as const;\n\nconst baseRecommendedRules = {\n \"nextfriday/no-emoji\": \"error\",\n \"nextfriday/file-kebab-case\": \"error\",\n \"nextfriday/md-filename-case-restriction\": \"error\",\n \"nextfriday/prefer-destructuring-params\": \"error\",\n \"nextfriday/no-explicit-return-type\": \"error\",\n \"nextfriday/prefer-import-type\": \"error\",\n \"nextfriday/prefer-react-import-types\": \"error\",\n} as const;\n\nconst jsxRules = {\n \"nextfriday/jsx-pascal-case\": \"warn\",\n \"nextfriday/prefer-interface-over-inline-types\": \"warn\",\n \"nextfriday/react-props-destructure\": \"warn\",\n \"nextfriday/enforce-readonly-component-props\": \"warn\",\n} as const;\n\nconst jsxRecommendedRules = {\n \"nextfriday/jsx-pascal-case\": \"error\",\n \"nextfriday/prefer-interface-over-inline-types\": \"error\",\n \"nextfriday/react-props-destructure\": \"error\",\n \"nextfriday/enforce-readonly-component-props\": \"error\",\n} as const;\n\nconst createConfig = (configRules: Record<string, string>) => ({\n plugins: {\n nextfriday: plugin,\n },\n rules: configRules,\n});\n\nconst configs = {\n base: createConfig(baseRules),\n \"base/recommended\": createConfig(baseRecommendedRules),\n react: createConfig({\n ...baseRules,\n ...jsxRules,\n }),\n \"react/recommended\": createConfig({\n ...baseRecommendedRules,\n ...jsxRecommendedRules,\n }),\n nextjs: createConfig({\n ...baseRules,\n ...jsxRules,\n }),\n \"nextjs/recommended\": createConfig({\n ...baseRecommendedRules,\n ...jsxRecommendedRules,\n }),\n} as const;\n\nconst nextfridayPlugin = {\n meta,\n configs,\n rules,\n} as const;\n\nexport default nextfridayPlugin;\n\nexport { meta, configs, rules };\n"],"mappings":"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","names":["ESLintUtils","createRule","path","ESLintUtils","createRule","path","ESLintUtils","createRule","ESLintUtils","createRule","ESLintUtils","createRule","AST_NODE_TYPES","ESLintUtils","createRule","AST_NODE_TYPES","ESLintUtils","createRule","AST_NODE_TYPES","ESLintUtils","createRule","AST_NODE_TYPES","ESLintUtils","createRule","AST_NODE_TYPES","ESLintUtils","createRule"]}
1
+ {"version":3,"sources":["../package.json","../src/rules/enforce-readonly-component-props.ts","../src/rules/file-kebab-case.ts","../src/rules/jsx-pascal-case.ts","../src/rules/md-filename-case-restriction.ts","../src/rules/no-emoji.ts","../src/rules/no-explicit-return-type.ts","../src/rules/prefer-destructuring-params.ts","../src/rules/prefer-import-type.ts","../src/rules/prefer-interface-over-inline-types.ts","../src/rules/prefer-named-param-types.ts","../src/rules/prefer-react-import-types.ts","../src/rules/react-props-destructure.ts","../src/index.ts"],"sourcesContent":["{\n \"name\": \"eslint-plugin-nextfriday\",\n \"version\": \"1.3.0\",\n \"description\": \"A comprehensive ESLint plugin providing custom rules and configurations for Next Friday development workflows.\",\n \"keywords\": [\n \"eslint\",\n \"eslintplugin\",\n \"eslint-plugin\",\n \"nextfriday\",\n \"next-friday\",\n \"linting\",\n \"code-quality\",\n \"javascript\",\n \"typescript\",\n \"development-tools\"\n ],\n \"homepage\": \"https://github.com/next-friday/eslint-plugin-nextfriday\",\n \"bugs\": {\n \"url\": \"https://github.com/next-friday/eslint-plugin-nextfriday/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/next-friday/eslint-plugin-nextfriday.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"Next Friday <nextfriday.developer@gmail.com>\",\n \"contributors\": [\n \"@joetakara\"\n ],\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./lib/index.d.ts\",\n \"import\": \"./lib/index.js\",\n \"require\": \"./lib/index.cjs\"\n }\n },\n \"main\": \"lib/index.js\",\n \"types\": \"lib/index.d.ts\",\n \"files\": [\n \"LICENSE\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"docs\",\n \"lib\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"changeset\": \"changeset\",\n \"changeset:publish\": \"npm publish --provenance --access public\",\n \"changeset:version\": \"changeset version\",\n \"clear\": \"rm -rf lib node_modules/.cache .eslintcache\",\n \"eslint\": \"eslint src --ext .js,.ts,.mjs --fix\",\n \"eslint:check\": \"eslint src --ext .js,.ts,.mjs\",\n \"preinstall\": \"npx only-allow pnpm\",\n \"prepare\": \"husky\",\n \"prepublishOnly\": \"pnpm run build\",\n \"prettier\": \"prettier --write .\",\n \"prettier:check\": \"prettier --check .\",\n \"sort-package-json\": \"pnpm exec sort-package-json\",\n \"sort-package-json:check\": \"pnpm exec sort-package-json --check\",\n \"test\": \"jest\",\n \"test:coverage\": \"jest --coverage\",\n \"test:watch\": \"jest --watch\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@typescript-eslint/utils\": \"^8.42.0\",\n \"emoji-regex\": \"^10.5.0\",\n \"tsup\": \"^8.5.0\"\n },\n \"devDependencies\": {\n \"@changesets/changelog-github\": \"^0.5.1\",\n \"@changesets/cli\": \"^2.29.6\",\n \"@commitlint/cli\": \"^19.8.1\",\n \"@commitlint/config-conventional\": \"^19.8.1\",\n \"@eslint/js\": \"^9.35.0\",\n \"@jest/globals\": \"^30.1.2\",\n \"@stylistic/eslint-plugin\": \"^3.1.0\",\n \"@swc/core\": \"^1.13.5\",\n \"@types/eslint\": \"^9.6.1\",\n \"@types/jest\": \"^30.0.0\",\n \"@types/node\": \"^22.5.4\",\n \"@types/ramda\": \"^0.31.0\",\n \"@typescript-eslint/parser\": \"^8.42.0\",\n \"@typescript-eslint/rule-tester\": \"^8.42.0\",\n \"eslint\": \"^9.35.0\",\n \"eslint-config-airbnb-extended\": \"^2.2.0\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-import-resolver-typescript\": \"^4.4.4\",\n \"eslint-plugin-import-x\": \"^4.16.1\",\n \"eslint-plugin-jest\": \"^29.0.1\",\n \"eslint-plugin-prettier\": \"^5.5.4\",\n \"eslint-plugin-sonarjs\": \"^3.0.5\",\n \"husky\": \"^9.1.7\",\n \"jest\": \"^29.7.0\",\n \"lint-staged\": \"^16.1.6\",\n \"prettier\": \"^3.6.2\",\n \"sort-package-json\": \"^3.4.0\",\n \"ts-jest\": \"^29.4.1\",\n \"ts-node\": \"^10.9.2\",\n \"typescript\": \"^5.6.2\",\n \"typescript-eslint\": \"^8.42.0\"\n },\n \"peerDependencies\": {\n \"eslint\": \"^9.0.0\"\n },\n \"packageManager\": \"pnpm@9.12.0\",\n \"engines\": {\n \"node\": \">=22.0.0\",\n \"pnpm\": \">=9.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst enforceReadonlyComponentProps = createRule({\n name: \"enforce-readonly-component-props\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce Readonly wrapper for React component props when using named types or interfaces\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n useReadonly: \"Component props should be wrapped with Readonly<> for immutability\",\n },\n },\n defaultOptions: [],\n create(context) {\n function hasJSXInConditional(node: TSESTree.ConditionalExpression): boolean {\n return (\n node.consequent.type === AST_NODE_TYPES.JSXElement ||\n node.consequent.type === AST_NODE_TYPES.JSXFragment ||\n node.alternate.type === AST_NODE_TYPES.JSXElement ||\n node.alternate.type === AST_NODE_TYPES.JSXFragment\n );\n }\n\n function hasJSXInLogical(node: TSESTree.LogicalExpression): boolean {\n return node.right.type === AST_NODE_TYPES.JSXElement || node.right.type === AST_NODE_TYPES.JSXFragment;\n }\n\n function hasJSXReturn(block: TSESTree.BlockStatement): boolean {\n return block.body.some((stmt) => {\n if (stmt.type === AST_NODE_TYPES.ReturnStatement && stmt.argument) {\n return (\n stmt.argument.type === AST_NODE_TYPES.JSXElement ||\n stmt.argument.type === AST_NODE_TYPES.JSXFragment ||\n (stmt.argument.type === AST_NODE_TYPES.ConditionalExpression && hasJSXInConditional(stmt.argument)) ||\n (stmt.argument.type === AST_NODE_TYPES.LogicalExpression && hasJSXInLogical(stmt.argument))\n );\n }\n return false;\n });\n }\n\n function isReactComponent(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression | TSESTree.FunctionDeclaration,\n ): boolean {\n if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {\n if (node.body.type === AST_NODE_TYPES.JSXElement || node.body.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n if (node.body.type === AST_NODE_TYPES.BlockStatement) {\n return hasJSXReturn(node.body);\n }\n } else if (node.type === AST_NODE_TYPES.FunctionExpression || node.type === AST_NODE_TYPES.FunctionDeclaration) {\n if (node.body && node.body.type === AST_NODE_TYPES.BlockStatement) {\n return hasJSXReturn(node.body);\n }\n }\n return false;\n }\n\n function isNamedType(node: TSESTree.TypeNode): boolean {\n return node.type === AST_NODE_TYPES.TSTypeReference;\n }\n\n function isAlreadyReadonly(node: TSESTree.TypeNode): boolean {\n if (node.type === AST_NODE_TYPES.TSTypeReference && node.typeName) {\n if (node.typeName.type === AST_NODE_TYPES.Identifier && node.typeName.name === \"Readonly\") {\n return true;\n }\n }\n return false;\n }\n\n function checkFunction(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression | TSESTree.FunctionDeclaration,\n ) {\n if (!isReactComponent(node)) {\n return;\n }\n if (node.params.length !== 1) {\n return;\n }\n const param = node.params[0];\n if (param.type === AST_NODE_TYPES.Identifier && param.typeAnnotation) {\n const { typeAnnotation } = param.typeAnnotation;\n if (isNamedType(typeAnnotation) && !isAlreadyReadonly(typeAnnotation)) {\n const { sourceCode } = context;\n const typeText = sourceCode.getText(typeAnnotation);\n context.report({\n node: param.typeAnnotation,\n messageId: \"useReadonly\",\n fix(fixer) {\n return fixer.replaceText(typeAnnotation, `Readonly<${typeText}>`);\n },\n });\n }\n }\n }\n\n return {\n ArrowFunctionExpression: checkFunction,\n FunctionExpression: checkFunction,\n FunctionDeclaration: checkFunction,\n };\n },\n});\n\nexport default enforceReadonlyComponentProps;\n","import path from \"path\";\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst isKebabCase = (str: string) => {\n if (/\\.(config|rc|setup|spec|test)$/.test(str) || /^[a-z0-9]+(?:-[a-z0-9]+)*\\.[a-z0-9]+(?:-[a-z0-9]+)*$/.test(str)) {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\.[a-z0-9]+(?:-[a-z0-9]+)*)*$/.test(str);\n }\n\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(str);\n};\n\nconst fileKebabCase = createRule({\n name: \"file-kebab-case\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce kebab-case filenames for .ts and .js files\",\n },\n messages: {\n fileKebabCase: \"File names must be kebab-case\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Program() {\n const { filename } = context;\n const ext = path.extname(filename);\n\n if (ext !== \".ts\" && ext !== \".js\") {\n return;\n }\n\n const basename = path.basename(filename, ext);\n\n if (!isKebabCase(basename)) {\n context.report({\n loc: { line: 1, column: 0 },\n messageId: \"fileKebabCase\",\n });\n }\n },\n };\n },\n});\n\nexport default fileKebabCase;\n","import path from \"path\";\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst isPascalCase = (str: string) => /^[A-Z][a-zA-Z0-9]*$/.test(str) && !/^[A-Z]+$/.test(str);\n\nconst jsxPascalCase = createRule({\n name: \"jsx-pascal-case\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce PascalCase filenames for .jsx and .tsx files\",\n },\n messages: {\n jsxPascalCase: \"JSX/TSX file names must be PascalCase\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Program() {\n const { filename } = context;\n const ext = path.extname(filename);\n\n if (ext !== \".jsx\" && ext !== \".tsx\") {\n return;\n }\n\n const basename = path.basename(filename, ext);\n\n if (!isPascalCase(basename)) {\n context.report({\n loc: { line: 1, column: 0 },\n messageId: \"jsxPascalCase\",\n });\n }\n },\n };\n },\n});\n\nexport default jsxPascalCase;\n","import path from \"path\";\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst mdFilenameCaseRestriction = createRule({\n name: \"md-filename-case-restriction\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce .md filenames to be SNAKE_CASE only\",\n },\n messages: {\n invalidFilenameCase: \"Markdown filename must be SNAKE_CASE (UPPERCASE with underscores). Found: '{{ filename }}'\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Program() {\n const { filename } = context;\n\n if (!filename.endsWith(\".md\")) {\n return;\n }\n\n const basename = path.basename(filename, \".md\");\n\n function isSnakeCase(text: string): boolean {\n return /^[A-Z][A-Z0-9_]*$/.test(text);\n }\n\n function isValidCase(text: string): boolean {\n return isSnakeCase(text);\n }\n\n if (!isValidCase(basename)) {\n context.report({\n node: context.sourceCode.ast,\n messageId: \"invalidFilenameCase\",\n data: { filename: basename },\n });\n }\n },\n };\n },\n});\n\nexport default mdFilenameCaseRestriction;\n","import emojiRegex from \"emoji-regex\";\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst noEmoji = createRule({\n name: \"no-emoji\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow emoji characters in source code\",\n },\n messages: {\n noEmoji: \"Emoji are not allowed in source code\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { sourceCode } = context;\n\n return {\n Program() {\n const text = sourceCode.getText();\n const regex = emojiRegex();\n const matches = Array.from(text.matchAll(regex));\n\n matches.forEach((match) => {\n const loc = sourceCode.getLocFromIndex(match.index);\n\n context.report({\n loc,\n messageId: \"noEmoji\",\n });\n });\n },\n };\n },\n});\n\nexport default noEmoji;\n","import { ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst noExplicitReturnType = createRule({\n name: \"no-explicit-return-type\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow explicit return types on functions\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n noExplicitReturnType: \"Remove explicit return type '{{returnType}}' - TypeScript can infer it automatically\",\n },\n },\n defaultOptions: [],\n create(context) {\n const checkFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression,\n ) => {\n if (node.returnType) {\n const returnTypeText = context.sourceCode.getText(node.returnType);\n context.report({\n node: node.returnType,\n messageId: \"noExplicitReturnType\",\n data: {\n returnType: returnTypeText,\n },\n fix(fixer) {\n return fixer.remove(node.returnType!);\n },\n });\n }\n };\n\n return {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n };\n },\n});\n\nexport default noExplicitReturnType;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst preferDestructuringParams = createRule({\n name: \"prefer-destructuring-params\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce destructuring for functions with multiple parameters\",\n },\n messages: {\n preferDestructuring: \"Functions with multiple parameters should use destructuring\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const isCallbackFunction = (node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression) => {\n const { parent } = node;\n return parent?.type === AST_NODE_TYPES.CallExpression;\n };\n\n const isDeveloperFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression,\n ) => {\n if (node.type === AST_NODE_TYPES.FunctionDeclaration) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.FunctionExpression || node.type === AST_NODE_TYPES.ArrowFunctionExpression) {\n if (isCallbackFunction(node)) {\n return false;\n }\n\n const { parent } = node;\n return (\n parent?.type === AST_NODE_TYPES.VariableDeclarator ||\n parent?.type === AST_NODE_TYPES.AssignmentExpression ||\n parent?.type === AST_NODE_TYPES.Property ||\n parent?.type === AST_NODE_TYPES.MethodDefinition\n );\n }\n\n return false;\n };\n\n const checkFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression,\n ) => {\n const { filename } = context;\n if (filename.includes(\"node_modules\") || filename.includes(\".d.ts\")) {\n return;\n }\n\n if (!isDeveloperFunction(node)) {\n return;\n }\n\n if (node.type === AST_NODE_TYPES.FunctionDeclaration && node.id) {\n const functionName = node.id.name;\n if (functionName.startsWith(\"_\") || functionName.includes(\"$\") || /^[A-Z][a-zA-Z]*$/.test(functionName)) {\n return;\n }\n }\n\n if (node.params.length <= 1) {\n return;\n }\n\n const hasNonDestructuredParams = node.params.some(\n (param: TSESTree.Parameter) =>\n param.type !== AST_NODE_TYPES.ObjectPattern && param.type !== AST_NODE_TYPES.RestElement,\n );\n\n if (hasNonDestructuredParams) {\n context.report({\n node,\n messageId: \"preferDestructuring\",\n });\n }\n };\n\n return {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n };\n },\n});\n\nexport default preferDestructuringParams;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst preferImportType = createRule({\n name: \"prefer-import-type\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce using 'import type' for type-only imports\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n preferImportType: \"Use 'import type' for type-only imports\",\n },\n },\n defaultOptions: [],\n create(context) {\n function checkImportDeclaration(node: TSESTree.ImportDeclaration) {\n if (node.importKind === \"type\") {\n return;\n }\n\n if (\n context.filename.includes(\".test.\") ||\n context.filename.includes(\".spec.\") ||\n context.filename.includes(\"__tests__\")\n ) {\n return;\n }\n\n if (node.specifiers.length === 0) {\n return;\n }\n\n const source = node.source.value;\n const isRuntimeImport =\n /\\.(css|scss|sass|less|styl)(\\?.*)?$/.test(source) ||\n /\\.(png|jpg|jpeg|gif|svg|webp|ico|bmp)(\\?.*)?$/.test(source) ||\n /\\.(woff|woff2|ttf|eot|otf)(\\?.*)?$/.test(source) ||\n /\\.(mp4|webm|ogg|mp3|wav|flac|aac)(\\?.*)?$/.test(source) ||\n /\\.(json|txt|md|xml|yml|yaml)(\\?.*)?$/.test(source) ||\n /^next\\/(font|image|link|head|script|dynamic|router)/.test(source) ||\n source.includes(\"/font/\") ||\n source === \"react-dom\" ||\n source === \"react-dom/client\" ||\n source === \"react-dom/server\" ||\n source.startsWith(\"@emotion/\") ||\n source.startsWith(\"styled-components\") ||\n source.includes(\"polyfill\") ||\n source.includes(\"shim\") ||\n source === \"styled-jsx/css\" ||\n source.startsWith(\"webpack/\");\n\n if (isRuntimeImport) {\n return;\n }\n\n const isTypeOnlyImport = node.specifiers.every((specifier) => {\n if (specifier.type === AST_NODE_TYPES.ImportDefaultSpecifier) {\n return false;\n }\n if (specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier) {\n return false;\n }\n if (specifier.type === AST_NODE_TYPES.ImportSpecifier) {\n const importedName =\n specifier.imported.type === AST_NODE_TYPES.Identifier ? specifier.imported.name : specifier.imported.value;\n\n const isKnownTypeOnly =\n (node.source.value === \"@typescript-eslint/utils\" && [\"TSESTree\", \"RuleContext\"].includes(importedName)) ||\n (node.source.value === \"react\" &&\n [\"Component\", \"ComponentProps\", \"ReactNode\", \"FC\", \"JSX\", \"ReactElement\", \"PropsWithChildren\"].includes(\n importedName,\n )) ||\n importedName.endsWith(\"Type\") ||\n importedName.endsWith(\"Interface\") ||\n importedName.endsWith(\"Props\");\n\n return isKnownTypeOnly;\n }\n return false;\n });\n\n if (isTypeOnlyImport) {\n context.report({\n node,\n messageId: \"preferImportType\",\n fix(fixer) {\n const sourceText = context.sourceCode.getText(node);\n const fixedSource = sourceText.replace(/^import\\s+/, \"import type \");\n return fixer.replaceText(node, fixedSource);\n },\n });\n }\n }\n\n return {\n ImportDeclaration: checkImportDeclaration,\n };\n },\n});\n\nexport default preferImportType;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst preferInterfaceOverInlineTypes = createRule({\n name: \"prefer-interface-over-inline-types\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce interface declarations over inline type annotations for React component props\",\n },\n fixable: undefined,\n schema: [],\n messages: {\n useInterface: \"Use interface declaration for component props instead of inline type annotation\",\n },\n },\n defaultOptions: [],\n create(context) {\n function hasJSXInConditional(node: TSESTree.ConditionalExpression): boolean {\n return (\n node.consequent.type === AST_NODE_TYPES.JSXElement ||\n node.consequent.type === AST_NODE_TYPES.JSXFragment ||\n node.alternate.type === AST_NODE_TYPES.JSXElement ||\n node.alternate.type === AST_NODE_TYPES.JSXFragment\n );\n }\n\n function hasJSXInLogical(node: TSESTree.LogicalExpression): boolean {\n return node.right.type === AST_NODE_TYPES.JSXElement || node.right.type === AST_NODE_TYPES.JSXFragment;\n }\n\n function hasJSXReturn(block: TSESTree.BlockStatement): boolean {\n return block.body.some((stmt) => {\n if (stmt.type === AST_NODE_TYPES.ReturnStatement && stmt.argument) {\n return (\n stmt.argument.type === AST_NODE_TYPES.JSXElement ||\n stmt.argument.type === AST_NODE_TYPES.JSXFragment ||\n (stmt.argument.type === AST_NODE_TYPES.ConditionalExpression && hasJSXInConditional(stmt.argument)) ||\n (stmt.argument.type === AST_NODE_TYPES.LogicalExpression && hasJSXInLogical(stmt.argument))\n );\n }\n return false;\n });\n }\n\n function isReactComponent(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression | TSESTree.FunctionDeclaration,\n ): boolean {\n if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {\n if (node.body.type === AST_NODE_TYPES.JSXElement || node.body.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n if (node.body.type === AST_NODE_TYPES.BlockStatement) {\n return hasJSXReturn(node.body);\n }\n } else if (node.type === AST_NODE_TYPES.FunctionExpression || node.type === AST_NODE_TYPES.FunctionDeclaration) {\n if (node.body && node.body.type === AST_NODE_TYPES.BlockStatement) {\n return hasJSXReturn(node.body);\n }\n }\n return false;\n }\n\n function isInlineTypeAnnotation(node: TSESTree.TypeNode): boolean {\n if (node.type === AST_NODE_TYPES.TSTypeLiteral) {\n return true;\n }\n if (node.type === AST_NODE_TYPES.TSTypeReference && node.typeArguments) {\n return node.typeArguments.params.some((param) => param.type === AST_NODE_TYPES.TSTypeLiteral);\n }\n if (node.type === AST_NODE_TYPES.TSUnionType) {\n return node.types.some((type) => isInlineTypeAnnotation(type));\n }\n return false;\n }\n\n function hasInlineObjectType(node: TSESTree.TypeNode): boolean {\n if (node.type === AST_NODE_TYPES.TSTypeLiteral) {\n return true;\n }\n if (node.type === AST_NODE_TYPES.TSTypeReference && node.typeArguments) {\n return node.typeArguments.params.some((param) => param.type === AST_NODE_TYPES.TSTypeLiteral);\n }\n if (node.type === AST_NODE_TYPES.TSUnionType) {\n return node.types.some((type) => hasInlineObjectType(type));\n }\n return false;\n }\n\n function checkFunction(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression | TSESTree.FunctionDeclaration,\n ) {\n if (!isReactComponent(node)) {\n return;\n }\n if (node.params.length !== 1) {\n return;\n }\n const param = node.params[0];\n if (param.type === AST_NODE_TYPES.Identifier && param.typeAnnotation) {\n const { typeAnnotation } = param.typeAnnotation;\n if (isInlineTypeAnnotation(typeAnnotation) && hasInlineObjectType(typeAnnotation)) {\n context.report({\n node: param.typeAnnotation,\n messageId: \"useInterface\",\n });\n }\n }\n }\n\n return {\n ArrowFunctionExpression: checkFunction,\n FunctionExpression: checkFunction,\n FunctionDeclaration: checkFunction,\n };\n },\n});\n\nexport default preferInterfaceOverInlineTypes;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst preferNamedParamTypes = createRule({\n name: \"prefer-named-param-types\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce named interfaces/types instead of inline object types for function parameters\",\n },\n messages: {\n preferNamedParamTypes:\n \"Use a named interface or type for object parameter types instead of inline type annotations\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n function hasInlineObjectType(param: TSESTree.Parameter): boolean {\n if (param.type === AST_NODE_TYPES.AssignmentPattern) {\n return hasInlineObjectType(param.left);\n }\n\n if (param.type === AST_NODE_TYPES.ObjectPattern) {\n if (param.typeAnnotation?.typeAnnotation.type === AST_NODE_TYPES.TSTypeLiteral) {\n return true;\n }\n }\n\n if (param.type === AST_NODE_TYPES.Identifier) {\n if (param.typeAnnotation?.typeAnnotation.type === AST_NODE_TYPES.TSTypeLiteral) {\n return true;\n }\n }\n\n return false;\n }\n\n function checkFunction(\n node:\n | TSESTree.FunctionDeclaration\n | TSESTree.FunctionExpression\n | TSESTree.ArrowFunctionExpression\n | TSESTree.TSMethodSignature\n | TSESTree.MethodDefinition,\n ) {\n let params: TSESTree.Parameter[] = [];\n\n if (\"params\" in node) {\n params = node.params;\n } else if (\"value\" in node && node.value) {\n params = node.value.params;\n }\n\n params.forEach((param) => {\n if (hasInlineObjectType(param)) {\n context.report({\n node: param,\n messageId: \"preferNamedParamTypes\",\n });\n }\n });\n }\n\n return {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n TSMethodSignature: checkFunction,\n MethodDefinition: checkFunction,\n };\n },\n});\n\nexport default preferNamedParamTypes;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst preferReactImportTypes = createRule({\n name: \"prefer-react-import-types\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce importing React types and utilities from 'react' instead of using React.X\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n preferDirectImport: \"Use direct import '{{importStatement}}' instead of 'React.{{typeName}}'\",\n },\n },\n defaultOptions: [],\n create(context) {\n const reactTypes = new Set([\n \"ReactNode\",\n \"ReactElement\",\n \"ReactChildren\",\n \"ReactChild\",\n \"ComponentType\",\n \"FC\",\n \"FunctionComponent\",\n \"Component\",\n \"PureComponent\",\n \"ReactEventHandler\",\n \"MouseEventHandler\",\n \"ChangeEventHandler\",\n \"FormEventHandler\",\n \"KeyboardEventHandler\",\n \"TouchEventHandler\",\n \"PointerEventHandler\",\n \"FocusEventHandler\",\n \"UIEventHandler\",\n \"WheelEventHandler\",\n \"AnimationEventHandler\",\n \"TransitionEventHandler\",\n \"RefObject\",\n \"MutableRefObject\",\n \"Ref\",\n \"ForwardedRef\",\n \"HTMLProps\",\n \"ComponentProps\",\n \"JSXElementConstructor\",\n ]);\n\n const reactRuntimeExports = new Set([\n \"useState\",\n \"useEffect\",\n \"useContext\",\n \"useReducer\",\n \"useCallback\",\n \"useMemo\",\n \"useRef\",\n \"useImperativeHandle\",\n \"useLayoutEffect\",\n \"useDebugValue\",\n \"useDeferredValue\",\n \"useTransition\",\n \"useId\",\n \"useSyncExternalStore\",\n \"useInsertionEffect\",\n \"createElement\",\n \"createContext\",\n \"forwardRef\",\n \"memo\",\n \"lazy\",\n \"Suspense\",\n \"Fragment\",\n \"StrictMode\",\n \"createRef\",\n \"isValidElement\",\n \"cloneElement\",\n \"Children\",\n ]);\n\n const allReactExports = new Set([...reactTypes, ...reactRuntimeExports]);\n\n function checkMemberExpression(node: TSESTree.MemberExpression) {\n if (\n node.object.type === AST_NODE_TYPES.Identifier &&\n node.object.name === \"React\" &&\n node.property.type === AST_NODE_TYPES.Identifier &&\n allReactExports.has(node.property.name)\n ) {\n const typeName = node.property.name;\n const isType = reactTypes.has(typeName);\n const importStatement = isType\n ? `import type { ${typeName} } from \"react\"`\n : `import { ${typeName} } from \"react\"`;\n\n context.report({\n node,\n messageId: \"preferDirectImport\",\n data: { typeName, importStatement },\n fix(fixer) {\n return fixer.replaceText(node, typeName);\n },\n });\n }\n }\n\n return {\n MemberExpression: checkMemberExpression,\n \"TSTypeReference > TSQualifiedName\": (node: TSESTree.TSQualifiedName) => {\n if (\n node.left.type === AST_NODE_TYPES.Identifier &&\n node.left.name === \"React\" &&\n node.right.type === AST_NODE_TYPES.Identifier &&\n allReactExports.has(node.right.name)\n ) {\n const typeName = node.right.name;\n const isType = reactTypes.has(typeName);\n const importStatement = isType\n ? `import type { ${typeName} } from \"react\"`\n : `import { ${typeName} } from \"react\"`;\n\n context.report({\n node,\n messageId: \"preferDirectImport\",\n data: { typeName, importStatement },\n fix(fixer) {\n return fixer.replaceText(node, typeName);\n },\n });\n }\n },\n };\n },\n});\n\nexport default preferReactImportTypes;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport type { TSESTree } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replace(/-/g, \"_\").toUpperCase()}.md`,\n);\n\nconst reactPropsDestructure = createRule({\n name: \"react-props-destructure\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce destructuring props inside React component body instead of parameters\",\n },\n fixable: undefined,\n schema: [],\n messages: {\n noParameterDestructuring:\n \"Destructure props inside component body instead of parameters. Use 'const { {{properties}} } = props;'\",\n },\n },\n defaultOptions: [],\n create(context) {\n function hasJSXInConditional(node: TSESTree.ConditionalExpression): boolean {\n return (\n node.consequent.type === AST_NODE_TYPES.JSXElement ||\n node.consequent.type === AST_NODE_TYPES.JSXFragment ||\n node.alternate.type === AST_NODE_TYPES.JSXElement ||\n node.alternate.type === AST_NODE_TYPES.JSXFragment\n );\n }\n\n function hasJSXInLogical(node: TSESTree.LogicalExpression): boolean {\n return node.right.type === AST_NODE_TYPES.JSXElement || node.right.type === AST_NODE_TYPES.JSXFragment;\n }\n\n function hasJSXReturn(block: TSESTree.BlockStatement): boolean {\n return block.body.some((stmt) => {\n if (stmt.type === AST_NODE_TYPES.ReturnStatement && stmt.argument) {\n return (\n stmt.argument.type === AST_NODE_TYPES.JSXElement ||\n stmt.argument.type === AST_NODE_TYPES.JSXFragment ||\n (stmt.argument.type === AST_NODE_TYPES.ConditionalExpression && hasJSXInConditional(stmt.argument)) ||\n (stmt.argument.type === AST_NODE_TYPES.LogicalExpression && hasJSXInLogical(stmt.argument))\n );\n }\n\n return false;\n });\n }\n\n function isReactComponent(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression | TSESTree.FunctionDeclaration,\n ) {\n if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {\n if (node.body.type === AST_NODE_TYPES.JSXElement || node.body.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n\n if (node.body.type === AST_NODE_TYPES.BlockStatement) {\n return hasJSXReturn(node.body);\n }\n } else if (node.type === AST_NODE_TYPES.FunctionExpression || node.type === AST_NODE_TYPES.FunctionDeclaration) {\n if (node.body && node.body.type === AST_NODE_TYPES.BlockStatement) {\n return hasJSXReturn(node.body);\n }\n }\n\n return false;\n }\n\n function checkFunction(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression | TSESTree.FunctionDeclaration,\n ) {\n if (!isReactComponent(node)) {\n return;\n }\n\n if (node.params.length !== 1) {\n return;\n }\n\n const param = node.params[0];\n\n if (param.type === AST_NODE_TYPES.ObjectPattern) {\n const properties = param.properties\n .filter((prop): prop is TSESTree.Property => prop.type === AST_NODE_TYPES.Property)\n .map((prop) => {\n if (prop.key.type === AST_NODE_TYPES.Identifier) {\n return prop.key.name;\n }\n return null;\n })\n .filter((name): name is string => name !== null);\n\n if (properties.length === 0) {\n return;\n }\n\n context.report({\n node: param,\n messageId: \"noParameterDestructuring\",\n data: {\n properties: properties.join(\", \"),\n },\n });\n }\n }\n\n return {\n ArrowFunctionExpression: checkFunction,\n FunctionExpression: checkFunction,\n FunctionDeclaration: checkFunction,\n };\n },\n});\n\nexport default reactPropsDestructure;\n","import packageJson from \"../package.json\" assert { type: \"json\" };\n\nimport enforceReadonlyComponentProps from \"./rules/enforce-readonly-component-props\";\nimport fileKebabCase from \"./rules/file-kebab-case\";\nimport jsxPascalCase from \"./rules/jsx-pascal-case\";\nimport mdFilenameCaseRestriction from \"./rules/md-filename-case-restriction\";\nimport noEmoji from \"./rules/no-emoji\";\nimport noExplicitReturnType from \"./rules/no-explicit-return-type\";\nimport preferDestructuringParams from \"./rules/prefer-destructuring-params\";\nimport preferImportType from \"./rules/prefer-import-type\";\nimport preferInterfaceOverInlineTypes from \"./rules/prefer-interface-over-inline-types\";\nimport preferNamedParamTypes from \"./rules/prefer-named-param-types\";\nimport preferReactImportTypes from \"./rules/prefer-react-import-types\";\nimport reactPropsDestructure from \"./rules/react-props-destructure\";\n\nimport type { TSESLint } from \"@typescript-eslint/utils\";\n\nconst meta = {\n name: packageJson.name,\n version: packageJson.version,\n} as const;\n\nconst rules = {\n \"enforce-readonly-component-props\": enforceReadonlyComponentProps,\n \"file-kebab-case\": fileKebabCase,\n \"jsx-pascal-case\": jsxPascalCase,\n \"md-filename-case-restriction\": mdFilenameCaseRestriction,\n \"no-emoji\": noEmoji,\n \"no-explicit-return-type\": noExplicitReturnType,\n \"prefer-destructuring-params\": preferDestructuringParams,\n \"prefer-import-type\": preferImportType,\n \"prefer-interface-over-inline-types\": preferInterfaceOverInlineTypes,\n \"prefer-named-param-types\": preferNamedParamTypes,\n \"prefer-react-import-types\": preferReactImportTypes,\n \"react-props-destructure\": reactPropsDestructure,\n} as const satisfies Record<string, TSESLint.RuleModule<string, readonly unknown[]>>;\n\nconst plugin = {\n meta,\n rules,\n} as const;\n\nconst baseRules = {\n \"nextfriday/no-emoji\": \"warn\",\n \"nextfriday/file-kebab-case\": \"warn\",\n \"nextfriday/md-filename-case-restriction\": \"warn\",\n \"nextfriday/prefer-destructuring-params\": \"warn\",\n \"nextfriday/no-explicit-return-type\": \"warn\",\n \"nextfriday/prefer-import-type\": \"warn\",\n \"nextfriday/prefer-named-param-types\": \"warn\",\n \"nextfriday/prefer-react-import-types\": \"warn\",\n} as const;\n\nconst baseRecommendedRules = {\n \"nextfriday/no-emoji\": \"error\",\n \"nextfriday/file-kebab-case\": \"error\",\n \"nextfriday/md-filename-case-restriction\": \"error\",\n \"nextfriday/prefer-destructuring-params\": \"error\",\n \"nextfriday/no-explicit-return-type\": \"error\",\n \"nextfriday/prefer-import-type\": \"error\",\n \"nextfriday/prefer-named-param-types\": \"error\",\n \"nextfriday/prefer-react-import-types\": \"error\",\n} as const;\n\nconst jsxRules = {\n \"nextfriday/jsx-pascal-case\": \"warn\",\n \"nextfriday/prefer-interface-over-inline-types\": \"warn\",\n \"nextfriday/react-props-destructure\": \"warn\",\n \"nextfriday/enforce-readonly-component-props\": \"warn\",\n} as const;\n\nconst jsxRecommendedRules = {\n \"nextfriday/jsx-pascal-case\": \"error\",\n \"nextfriday/prefer-interface-over-inline-types\": \"error\",\n \"nextfriday/react-props-destructure\": \"error\",\n \"nextfriday/enforce-readonly-component-props\": \"error\",\n} as const;\n\nconst createConfig = (configRules: Record<string, string>) => ({\n plugins: {\n nextfriday: plugin,\n },\n rules: configRules,\n});\n\nconst configs = {\n base: createConfig(baseRules),\n \"base/recommended\": createConfig(baseRecommendedRules),\n react: createConfig({\n ...baseRules,\n ...jsxRules,\n }),\n \"react/recommended\": createConfig({\n ...baseRecommendedRules,\n ...jsxRecommendedRules,\n }),\n nextjs: createConfig({\n ...baseRules,\n ...jsxRules,\n }),\n \"nextjs/recommended\": createConfig({\n ...baseRecommendedRules,\n ...jsxRecommendedRules,\n }),\n} as const;\n\nconst nextfridayPlugin = {\n meta,\n configs,\n rules,\n} as const;\n\nexport default nextfridayPlugin;\n\nexport { meta, configs, rules };\n"],"mappings":"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","names":["ESLintUtils","createRule","path","ESLintUtils","createRule","path","ESLintUtils","createRule","ESLintUtils","createRule","ESLintUtils","createRule","AST_NODE_TYPES","ESLintUtils","createRule","AST_NODE_TYPES","ESLintUtils","createRule","AST_NODE_TYPES","ESLintUtils","createRule","AST_NODE_TYPES","ESLintUtils","createRule","AST_NODE_TYPES","ESLintUtils","createRule","AST_NODE_TYPES","ESLintUtils","createRule"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-nextfriday",
3
- "version": "1.2.3",
3
+ "version": "1.3.0",
4
4
  "description": "A comprehensive ESLint plugin providing custom rules and configurations for Next Friday development workflows.",
5
5
  "keywords": [
6
6
  "eslint",