eslint-plugin-nextfriday 1.0.2 → 1.1.1

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.cjs CHANGED
@@ -40,7 +40,7 @@ module.exports = __toCommonJS(index_exports);
40
40
  // package.json
41
41
  var package_default = {
42
42
  name: "eslint-plugin-nextfriday",
43
- version: "1.0.2",
43
+ version: "1.1.1",
44
44
  description: "A comprehensive ESLint plugin providing custom rules and configurations for Next Friday development workflows.",
45
45
  keywords: [
46
46
  "eslint",
@@ -483,6 +483,308 @@ var preferImportType = createRule7({
483
483
  });
484
484
  var prefer_import_type_default = preferImportType;
485
485
 
486
+ // src/rules/prefer-interface-over-inline-types.ts
487
+ var import_utils8 = require("@typescript-eslint/utils");
488
+ var createRule8 = import_utils8.ESLintUtils.RuleCreator(
489
+ (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`
490
+ );
491
+ var preferInterfaceOverInlineTypes = createRule8({
492
+ name: "prefer-interface-over-inline-types",
493
+ meta: {
494
+ type: "suggestion",
495
+ docs: {
496
+ description: "Enforce interface declarations over inline type annotations for React component props"
497
+ },
498
+ fixable: void 0,
499
+ schema: [],
500
+ messages: {
501
+ useInterface: "Use interface declaration for component props instead of inline type annotation"
502
+ }
503
+ },
504
+ defaultOptions: [],
505
+ create(context) {
506
+ function hasJSXInConditional(node) {
507
+ return node.consequent.type === import_utils8.AST_NODE_TYPES.JSXElement || node.consequent.type === import_utils8.AST_NODE_TYPES.JSXFragment || node.alternate.type === import_utils8.AST_NODE_TYPES.JSXElement || node.alternate.type === import_utils8.AST_NODE_TYPES.JSXFragment;
508
+ }
509
+ function hasJSXInLogical(node) {
510
+ return node.right.type === import_utils8.AST_NODE_TYPES.JSXElement || node.right.type === import_utils8.AST_NODE_TYPES.JSXFragment;
511
+ }
512
+ function hasJSXReturn(block) {
513
+ return block.body.some((stmt) => {
514
+ if (stmt.type === import_utils8.AST_NODE_TYPES.ReturnStatement && stmt.argument) {
515
+ return stmt.argument.type === import_utils8.AST_NODE_TYPES.JSXElement || stmt.argument.type === import_utils8.AST_NODE_TYPES.JSXFragment || stmt.argument.type === import_utils8.AST_NODE_TYPES.ConditionalExpression && hasJSXInConditional(stmt.argument) || stmt.argument.type === import_utils8.AST_NODE_TYPES.LogicalExpression && hasJSXInLogical(stmt.argument);
516
+ }
517
+ return false;
518
+ });
519
+ }
520
+ function isReactComponent(node) {
521
+ if (node.type === import_utils8.AST_NODE_TYPES.ArrowFunctionExpression) {
522
+ if (node.body.type === import_utils8.AST_NODE_TYPES.JSXElement || node.body.type === import_utils8.AST_NODE_TYPES.JSXFragment) {
523
+ return true;
524
+ }
525
+ if (node.body.type === import_utils8.AST_NODE_TYPES.BlockStatement) {
526
+ return hasJSXReturn(node.body);
527
+ }
528
+ } else if (node.type === import_utils8.AST_NODE_TYPES.FunctionExpression || node.type === import_utils8.AST_NODE_TYPES.FunctionDeclaration) {
529
+ if (node.body && node.body.type === import_utils8.AST_NODE_TYPES.BlockStatement) {
530
+ return hasJSXReturn(node.body);
531
+ }
532
+ }
533
+ return false;
534
+ }
535
+ function isInlineTypeAnnotation(node) {
536
+ if (node.type === import_utils8.AST_NODE_TYPES.TSTypeLiteral) {
537
+ return true;
538
+ }
539
+ if (node.type === import_utils8.AST_NODE_TYPES.TSTypeReference && node.typeArguments) {
540
+ return node.typeArguments.params.some((param) => param.type === import_utils8.AST_NODE_TYPES.TSTypeLiteral);
541
+ }
542
+ if (node.type === import_utils8.AST_NODE_TYPES.TSUnionType) {
543
+ return node.types.some((type) => isInlineTypeAnnotation(type));
544
+ }
545
+ return false;
546
+ }
547
+ function hasInlineObjectType(node) {
548
+ if (node.type === import_utils8.AST_NODE_TYPES.TSTypeLiteral) {
549
+ return true;
550
+ }
551
+ if (node.type === import_utils8.AST_NODE_TYPES.TSTypeReference && node.typeArguments) {
552
+ return node.typeArguments.params.some((param) => param.type === import_utils8.AST_NODE_TYPES.TSTypeLiteral);
553
+ }
554
+ if (node.type === import_utils8.AST_NODE_TYPES.TSUnionType) {
555
+ return node.types.some((type) => hasInlineObjectType(type));
556
+ }
557
+ return false;
558
+ }
559
+ function checkFunction(node) {
560
+ if (!isReactComponent(node)) {
561
+ return;
562
+ }
563
+ if (node.params.length !== 1) {
564
+ return;
565
+ }
566
+ const param = node.params[0];
567
+ if (param.type === import_utils8.AST_NODE_TYPES.Identifier && param.typeAnnotation) {
568
+ const { typeAnnotation } = param.typeAnnotation;
569
+ if (isInlineTypeAnnotation(typeAnnotation) && hasInlineObjectType(typeAnnotation)) {
570
+ context.report({
571
+ node: param.typeAnnotation,
572
+ messageId: "useInterface"
573
+ });
574
+ }
575
+ }
576
+ }
577
+ return {
578
+ ArrowFunctionExpression: checkFunction,
579
+ FunctionExpression: checkFunction,
580
+ FunctionDeclaration: checkFunction
581
+ };
582
+ }
583
+ });
584
+ var prefer_interface_over_inline_types_default = preferInterfaceOverInlineTypes;
585
+
586
+ // src/rules/prefer-react-import-types.ts
587
+ var import_utils9 = require("@typescript-eslint/utils");
588
+ var createRule9 = import_utils9.ESLintUtils.RuleCreator(
589
+ (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`
590
+ );
591
+ var preferReactImportTypes = createRule9({
592
+ name: "prefer-react-import-types",
593
+ meta: {
594
+ type: "suggestion",
595
+ docs: {
596
+ description: "Enforce importing React types and utilities from 'react' instead of using React.X"
597
+ },
598
+ fixable: "code",
599
+ schema: [],
600
+ messages: {
601
+ preferDirectImport: "Use direct import '{{importStatement}}' instead of 'React.{{typeName}}'"
602
+ }
603
+ },
604
+ defaultOptions: [],
605
+ create(context) {
606
+ const reactTypes = /* @__PURE__ */ new Set([
607
+ "ReactNode",
608
+ "ReactElement",
609
+ "ReactChildren",
610
+ "ReactChild",
611
+ "ComponentType",
612
+ "FC",
613
+ "FunctionComponent",
614
+ "Component",
615
+ "PureComponent",
616
+ "ReactEventHandler",
617
+ "MouseEventHandler",
618
+ "ChangeEventHandler",
619
+ "FormEventHandler",
620
+ "KeyboardEventHandler",
621
+ "TouchEventHandler",
622
+ "PointerEventHandler",
623
+ "FocusEventHandler",
624
+ "UIEventHandler",
625
+ "WheelEventHandler",
626
+ "AnimationEventHandler",
627
+ "TransitionEventHandler",
628
+ "RefObject",
629
+ "MutableRefObject",
630
+ "Ref",
631
+ "ForwardedRef",
632
+ "HTMLProps",
633
+ "ComponentProps",
634
+ "JSXElementConstructor"
635
+ ]);
636
+ const reactRuntimeExports = /* @__PURE__ */ new Set([
637
+ "useState",
638
+ "useEffect",
639
+ "useContext",
640
+ "useReducer",
641
+ "useCallback",
642
+ "useMemo",
643
+ "useRef",
644
+ "useImperativeHandle",
645
+ "useLayoutEffect",
646
+ "useDebugValue",
647
+ "useDeferredValue",
648
+ "useTransition",
649
+ "useId",
650
+ "useSyncExternalStore",
651
+ "useInsertionEffect",
652
+ "createElement",
653
+ "createContext",
654
+ "forwardRef",
655
+ "memo",
656
+ "lazy",
657
+ "Suspense",
658
+ "Fragment",
659
+ "StrictMode",
660
+ "createRef",
661
+ "isValidElement",
662
+ "cloneElement",
663
+ "Children"
664
+ ]);
665
+ const allReactExports = /* @__PURE__ */ new Set([...reactTypes, ...reactRuntimeExports]);
666
+ function checkMemberExpression(node) {
667
+ if (node.object.type === import_utils9.AST_NODE_TYPES.Identifier && node.object.name === "React" && node.property.type === import_utils9.AST_NODE_TYPES.Identifier && allReactExports.has(node.property.name)) {
668
+ const typeName = node.property.name;
669
+ const isType = reactTypes.has(typeName);
670
+ const importStatement = isType ? `import type { ${typeName} } from "react"` : `import { ${typeName} } from "react"`;
671
+ context.report({
672
+ node,
673
+ messageId: "preferDirectImport",
674
+ data: { typeName, importStatement },
675
+ fix(fixer) {
676
+ return fixer.replaceText(node, typeName);
677
+ }
678
+ });
679
+ }
680
+ }
681
+ return {
682
+ MemberExpression: checkMemberExpression,
683
+ "TSTypeReference > TSQualifiedName": (node) => {
684
+ if (node.left.type === import_utils9.AST_NODE_TYPES.Identifier && node.left.name === "React" && node.right.type === import_utils9.AST_NODE_TYPES.Identifier && allReactExports.has(node.right.name)) {
685
+ const typeName = node.right.name;
686
+ const isType = reactTypes.has(typeName);
687
+ const importStatement = isType ? `import type { ${typeName} } from "react"` : `import { ${typeName} } from "react"`;
688
+ context.report({
689
+ node,
690
+ messageId: "preferDirectImport",
691
+ data: { typeName, importStatement },
692
+ fix(fixer) {
693
+ return fixer.replaceText(node, typeName);
694
+ }
695
+ });
696
+ }
697
+ }
698
+ };
699
+ }
700
+ });
701
+ var prefer_react_import_types_default = preferReactImportTypes;
702
+
703
+ // src/rules/react-props-destructure.ts
704
+ var import_utils10 = require("@typescript-eslint/utils");
705
+ var createRule10 = import_utils10.ESLintUtils.RuleCreator(
706
+ (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`
707
+ );
708
+ var reactPropsDestructure = createRule10({
709
+ name: "react-props-destructure",
710
+ meta: {
711
+ type: "suggestion",
712
+ docs: {
713
+ description: "Enforce destructuring props inside React component body instead of parameters"
714
+ },
715
+ fixable: void 0,
716
+ schema: [],
717
+ messages: {
718
+ noParameterDestructuring: "Destructure props inside component body instead of parameters. Use 'const { {{properties}} } = props;'"
719
+ }
720
+ },
721
+ defaultOptions: [],
722
+ create(context) {
723
+ function hasJSXInConditional(node) {
724
+ return node.consequent.type === import_utils10.AST_NODE_TYPES.JSXElement || node.consequent.type === import_utils10.AST_NODE_TYPES.JSXFragment || node.alternate.type === import_utils10.AST_NODE_TYPES.JSXElement || node.alternate.type === import_utils10.AST_NODE_TYPES.JSXFragment;
725
+ }
726
+ function hasJSXInLogical(node) {
727
+ return node.right.type === import_utils10.AST_NODE_TYPES.JSXElement || node.right.type === import_utils10.AST_NODE_TYPES.JSXFragment;
728
+ }
729
+ function hasJSXReturn(block) {
730
+ return block.body.some((stmt) => {
731
+ if (stmt.type === import_utils10.AST_NODE_TYPES.ReturnStatement && stmt.argument) {
732
+ return stmt.argument.type === import_utils10.AST_NODE_TYPES.JSXElement || stmt.argument.type === import_utils10.AST_NODE_TYPES.JSXFragment || stmt.argument.type === import_utils10.AST_NODE_TYPES.ConditionalExpression && hasJSXInConditional(stmt.argument) || stmt.argument.type === import_utils10.AST_NODE_TYPES.LogicalExpression && hasJSXInLogical(stmt.argument);
733
+ }
734
+ return false;
735
+ });
736
+ }
737
+ function isReactComponent(node) {
738
+ if (node.type === import_utils10.AST_NODE_TYPES.ArrowFunctionExpression) {
739
+ if (node.body.type === import_utils10.AST_NODE_TYPES.JSXElement || node.body.type === import_utils10.AST_NODE_TYPES.JSXFragment) {
740
+ return true;
741
+ }
742
+ if (node.body.type === import_utils10.AST_NODE_TYPES.BlockStatement) {
743
+ return hasJSXReturn(node.body);
744
+ }
745
+ } else if (node.type === import_utils10.AST_NODE_TYPES.FunctionExpression || node.type === import_utils10.AST_NODE_TYPES.FunctionDeclaration) {
746
+ if (node.body && node.body.type === import_utils10.AST_NODE_TYPES.BlockStatement) {
747
+ return hasJSXReturn(node.body);
748
+ }
749
+ }
750
+ return false;
751
+ }
752
+ function checkFunction(node) {
753
+ if (!isReactComponent(node)) {
754
+ return;
755
+ }
756
+ if (node.params.length !== 1) {
757
+ return;
758
+ }
759
+ const param = node.params[0];
760
+ if (param.type === import_utils10.AST_NODE_TYPES.ObjectPattern) {
761
+ const properties = param.properties.filter((prop) => prop.type === import_utils10.AST_NODE_TYPES.Property).map((prop) => {
762
+ if (prop.key.type === import_utils10.AST_NODE_TYPES.Identifier) {
763
+ return prop.key.name;
764
+ }
765
+ return null;
766
+ }).filter((name) => name !== null);
767
+ if (properties.length === 0) {
768
+ return;
769
+ }
770
+ context.report({
771
+ node: param,
772
+ messageId: "noParameterDestructuring",
773
+ data: {
774
+ properties: properties.join(", ")
775
+ }
776
+ });
777
+ }
778
+ }
779
+ return {
780
+ ArrowFunctionExpression: checkFunction,
781
+ FunctionExpression: checkFunction,
782
+ FunctionDeclaration: checkFunction
783
+ };
784
+ }
785
+ });
786
+ var react_props_destructure_default = reactPropsDestructure;
787
+
486
788
  // src/index.ts
487
789
  var meta = {
488
790
  name: package_default.name,
@@ -495,7 +797,10 @@ var rules = {
495
797
  "no-emoji": no_emoji_default,
496
798
  "no-explicit-return-type": no_explicit_return_type_default,
497
799
  "prefer-destructuring-params": prefer_destructuring_params_default,
498
- "prefer-import-type": prefer_import_type_default
800
+ "prefer-import-type": prefer_import_type_default,
801
+ "prefer-interface-over-inline-types": prefer_interface_over_inline_types_default,
802
+ "prefer-react-import-types": prefer_react_import_types_default,
803
+ "react-props-destructure": react_props_destructure_default
499
804
  };
500
805
  var plugin = {
501
806
  meta,
@@ -507,7 +812,8 @@ var baseRules = {
507
812
  "nextfriday/md-filename-case-restriction": "warn",
508
813
  "nextfriday/prefer-destructuring-params": "warn",
509
814
  "nextfriday/no-explicit-return-type": "warn",
510
- "nextfriday/prefer-import-type": "warn"
815
+ "nextfriday/prefer-import-type": "warn",
816
+ "nextfriday/prefer-react-import-types": "warn"
511
817
  };
512
818
  var baseRecommendedRules = {
513
819
  "nextfriday/no-emoji": "error",
@@ -515,13 +821,18 @@ var baseRecommendedRules = {
515
821
  "nextfriday/md-filename-case-restriction": "error",
516
822
  "nextfriday/prefer-destructuring-params": "error",
517
823
  "nextfriday/no-explicit-return-type": "error",
518
- "nextfriday/prefer-import-type": "error"
824
+ "nextfriday/prefer-import-type": "error",
825
+ "nextfriday/prefer-react-import-types": "error"
519
826
  };
520
827
  var jsxRules = {
521
- "nextfriday/jsx-pascal-case": "warn"
828
+ "nextfriday/jsx-pascal-case": "warn",
829
+ "nextfriday/prefer-interface-over-inline-types": "warn",
830
+ "nextfriday/react-props-destructure": "warn"
522
831
  };
523
832
  var jsxRecommendedRules = {
524
- "nextfriday/jsx-pascal-case": "error"
833
+ "nextfriday/jsx-pascal-case": "error",
834
+ "nextfriday/prefer-interface-over-inline-types": "error",
835
+ "nextfriday/react-props-destructure": "error"
525
836
  };
526
837
  var createConfig = (configRules) => ({
527
838
  plugins: {
package/lib/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../package.json","../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"],"sourcesContent":["import packageJson from \"../package.json\" assert { type: \"json\" };\n\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\";\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 \"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} 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} 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} as const;\n\nconst jsxRules = {\n \"nextfriday/jsx-pascal-case\": \"warn\",\n} as const;\n\nconst jsxRecommendedRules = {\n \"nextfriday/jsx-pascal-case\": \"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 { meta, configs, rules };\n\nexport default nextfridayPlugin;\n","{\n \"name\": \"eslint-plugin-nextfriday\",\n \"version\": \"1.0.2\",\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 path from \"path\";\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst isKebabCase = (str: string) => {\n if (/\\.(config|rc|setup|spec|test)$/.test(str)) {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\.[a-z0-9]+)*$/.test(str);\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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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 checkFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression,\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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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"],"mappings":"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","names":["path","import_path","import_utils","createRule","path","import_path","import_utils","createRule","path","import_utils","createRule","emojiRegex","import_utils","createRule","import_utils","createRule","import_utils","createRule"]}
1
+ {"version":3,"sources":["../src/index.ts","../package.json","../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"],"sourcesContent":["import packageJson from \"../package.json\" assert { type: \"json\" };\n\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 \"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} 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} 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","{\n \"name\": \"eslint-plugin-nextfriday\",\n \"version\": \"1.1.1\",\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 path from \"path\";\n\nimport { ESLintUtils } from \"@typescript-eslint/utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.md`,\n);\n\nconst isKebabCase = (str: string) => {\n if (/\\.(config|rc|setup|spec|test)$/.test(str)) {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\.[a-z0-9]+)*$/.test(str);\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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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 checkFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression,\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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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) => `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name}.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"],"mappings":"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","names":["path","import_path","import_utils","createRule","path","import_path","import_utils","createRule","path","import_utils","createRule","emojiRegex","import_utils","createRule","import_utils","createRule","import_utils","createRule","import_utils","createRule","import_utils","createRule","import_utils","createRule"]}