eslint-plugin-nextfriday 4.3.2 → 4.4.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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["createRule","createRule","SNAKE_CASE_REGEX","returnsJsx","bodyReturnsJsx","isComponentFunction","isGlobalScope","isStaticValue","createRule","SCREAMING_SNAKE_CASE_REGEX","SNAKE_CASE_REGEX","isGlobalScope","createRule","SCREAMING_SNAKE_CASE_REGEX","createRule","isPascalCase","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","GROUP_NAMES","createRule","createRule","packageJson.name","packageJson.version"],"sources":["../package.json","../src/rules/boolean-naming-prefix.ts","../src/rules/enforce-camel-case.ts","../src/utils.ts","../src/rules/enforce-constant-case.ts","../src/rules/enforce-hook-filename.ts","../src/rules/enforce-hook-naming.ts","../src/rules/enforce-property-case.ts","../src/rules/enforce-props-suffix.ts","../src/rules/enforce-readonly-component-props.ts","../src/rules/enforce-render-naming.ts","../src/rules/enforce-service-naming.ts","../src/rules/enforce-test-filename.ts","../src/rules/enforce-sorted-destructuring.ts","../src/rules/enforce-type-declaration-order.ts","../src/rules/index-export-only.ts","../src/rules/jsx-newline-between-elements.ts","../src/rules/jsx-no-data-array.ts","../src/rules/jsx-no-data-object.ts","../src/rules/jsx-no-inline-object-prop.ts","../src/rules/jsx-no-newline-single-line-elements.ts","../src/rules/jsx-no-non-component-function.ts","../src/rules/jsx-no-sub-interface.ts","../src/rules/jsx-no-ternary-null.ts","../src/rules/jsx-no-variable-in-callback.ts","../src/rules/jsx-require-suspense.ts","../src/rules/jsx-simple-props.ts","../src/rules/jsx-sort-props.ts","../src/rules/jsx-spread-props-last.ts","../src/rules/newline-after-multiline-block.ts","../src/rules/newline-before-return.ts","../src/rules/no-complex-inline-return.ts","../src/rules/no-direct-date.ts","../src/rules/no-emoji.ts","../src/rules/no-env-fallback.ts","../src/rules/no-ghost-wrapper.ts","../src/rules/no-helper-function-in-hook.ts","../src/rules/no-helper-function-in-test.ts","../src/rules/no-inline-default-export.ts","../src/rules/no-inline-nested-object.ts","../src/rules/no-inline-return-properties.ts","../src/rules/no-inline-type-import.ts","../src/rules/no-lazy-identifiers.ts","../src/rules/no-logic-in-params.ts","../src/rules/no-misleading-constant-case.ts","../src/rules/no-nested-interface-declaration.ts","../src/rules/no-nested-ternary.ts","../src/rules/no-redundant-fragment.ts","../src/rules/no-relative-imports.ts","../src/rules/no-single-char-variables.ts","../src/rules/prefer-async-await.ts","../src/rules/prefer-destructuring-params.ts","../src/rules/prefer-function-declaration.ts","../src/rules/prefer-guard-clause.ts","../src/rules/prefer-import-type.ts","../src/rules/prefer-inline-literal-union.ts","../src/rules/prefer-inline-type-export.ts","../src/rules/prefer-interface-for-component-props.ts","../src/rules/prefer-interface-over-inline-types.ts","../src/rules/prefer-jsx-template-literals.ts","../src/rules/prefer-named-param-types.ts","../src/rules/prefer-props-with-children.ts","../src/rules/prefer-react-import-types.ts","../src/rules/react-props-destructure.ts","../src/rules/require-explicit-return-type.ts","../src/rules/sort-exports.ts","../src/rules/sort-imports.ts","../src/rules/sort-type-alphabetically.ts","../src/rules/sort-type-required-first.ts","../src/index.ts"],"sourcesContent":["","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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst BOOLEAN_PREFIXES = [\"is\", \"has\", \"should\", \"can\", \"did\", \"will\", \"was\", \"are\", \"does\", \"had\"];\n\nconst startsWithBooleanPrefix = (name: string): boolean =>\n BOOLEAN_PREFIXES.some((prefix) => {\n if (!name.startsWith(prefix)) {\n return false;\n }\n\n if (name.length === prefix.length) {\n return true;\n }\n\n const nextChar = name.charAt(prefix.length);\n return nextChar === nextChar.toUpperCase() && nextChar !== nextChar.toLowerCase();\n });\n\nconst isBooleanLiteral = (node: TSESTree.Expression): boolean =>\n node.type === AST_NODE_TYPES.Literal && typeof node.value === \"boolean\";\n\nconst isBooleanExpression = (node: TSESTree.Expression): boolean => {\n if (isBooleanLiteral(node)) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.UnaryExpression && node.operator === \"!\") {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.BinaryExpression) {\n const comparisonOperators = [\"===\", \"!==\", \"==\", \"!=\", \"<\", \">\", \"<=\", \">=\", \"in\", \"instanceof\"];\n return comparisonOperators.includes(node.operator);\n }\n\n if (node.type === AST_NODE_TYPES.LogicalExpression) {\n return node.operator === \"&&\" || node.operator === \"||\";\n }\n\n return false;\n};\n\nconst hasBooleanTypeAnnotation = (node: TSESTree.VariableDeclarator | TSESTree.Parameter): boolean => {\n if (node.type === AST_NODE_TYPES.Identifier) {\n const { typeAnnotation } = node;\n if (typeAnnotation?.typeAnnotation.type === AST_NODE_TYPES.TSBooleanKeyword) {\n return true;\n }\n }\n\n if (\"id\" in node && node.id.type === AST_NODE_TYPES.Identifier) {\n const { typeAnnotation } = node.id;\n if (typeAnnotation?.typeAnnotation.type === AST_NODE_TYPES.TSBooleanKeyword) {\n return true;\n }\n }\n\n return false;\n};\n\nconst booleanNamingPrefix = createRule({\n name: \"boolean-naming-prefix\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce boolean variables and parameters to have a prefix like is, has, should, can, did, will for better readability\",\n },\n messages: {\n missingPrefix:\n \"Boolean variable '{{name}}' should have a prefix like is, has, should, can, did, or will. Example: 'is{{suggestedName}}' or 'has{{suggestedName}}'.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const checkBooleanNaming = (name: string, node: TSESTree.Node) => {\n if (startsWithBooleanPrefix(name)) {\n return;\n }\n\n const suggestedName = name.charAt(0).toUpperCase() + name.slice(1);\n\n context.report({\n node,\n messageId: \"missingPrefix\",\n data: { name, suggestedName },\n });\n };\n\n return {\n VariableDeclarator(node) {\n if (node.id.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const { name } = node.id;\n\n if (hasBooleanTypeAnnotation(node)) {\n checkBooleanNaming(name, node.id);\n return;\n }\n\n if (node.init && isBooleanExpression(node.init)) {\n checkBooleanNaming(name, node.id);\n }\n },\n FunctionDeclaration(node) {\n node.params.forEach((param) => {\n if (param.type === AST_NODE_TYPES.Identifier && hasBooleanTypeAnnotation(param)) {\n checkBooleanNaming(param.name, param);\n }\n\n if (param.type === AST_NODE_TYPES.AssignmentPattern) {\n if (param.left.type === AST_NODE_TYPES.Identifier && param.right && isBooleanLiteral(param.right)) {\n checkBooleanNaming(param.left.name, param.left);\n }\n }\n });\n },\n FunctionExpression(node) {\n node.params.forEach((param) => {\n if (param.type === AST_NODE_TYPES.Identifier && hasBooleanTypeAnnotation(param)) {\n checkBooleanNaming(param.name, param);\n }\n\n if (param.type === AST_NODE_TYPES.AssignmentPattern) {\n if (param.left.type === AST_NODE_TYPES.Identifier && param.right && isBooleanLiteral(param.right)) {\n checkBooleanNaming(param.left.name, param.left);\n }\n }\n });\n },\n ArrowFunctionExpression(node) {\n node.params.forEach((param) => {\n if (param.type === AST_NODE_TYPES.Identifier && hasBooleanTypeAnnotation(param)) {\n checkBooleanNaming(param.name, param);\n }\n\n if (param.type === AST_NODE_TYPES.AssignmentPattern) {\n if (param.left.type === AST_NODE_TYPES.Identifier && param.right && isBooleanLiteral(param.right)) {\n checkBooleanNaming(param.left.name, param.left);\n }\n }\n });\n },\n };\n },\n});\n\nexport default booleanNamingPrefix;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst SNAKE_CASE_REGEX = /^[a-z]+_[a-z0-9_]*$/;\nconst PASCAL_CASE_REGEX = /^[A-Z][a-zA-Z0-9]*$/;\n\nconst REACT_WRAPPERS = [\"memo\", \"forwardRef\", \"lazy\"];\n\nconst returnsJsx = (node: TSESTree.Node): boolean => {\n if (node.type === AST_NODE_TYPES.JSXElement || node.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.ConditionalExpression) {\n return returnsJsx(node.consequent) || returnsJsx(node.alternate);\n }\n\n if (node.type === AST_NODE_TYPES.LogicalExpression) {\n return returnsJsx(node.left) || returnsJsx(node.right);\n }\n\n return false;\n};\n\nconst bodyReturnsJsx = (body: TSESTree.BlockStatement | TSESTree.Expression): boolean => {\n if (body.type !== AST_NODE_TYPES.BlockStatement) {\n return returnsJsx(body);\n }\n\n return body.body.some(\n (stmt) => stmt.type === AST_NODE_TYPES.ReturnStatement && stmt.argument !== null && returnsJsx(stmt.argument),\n );\n};\n\nconst isComponentFunction = (init: TSESTree.Expression): boolean => {\n if (init.type === AST_NODE_TYPES.ArrowFunctionExpression || init.type === AST_NODE_TYPES.FunctionExpression) {\n return bodyReturnsJsx(init.body);\n }\n\n if (init.type === AST_NODE_TYPES.CallExpression) {\n const { callee } = init;\n\n if (callee.type === AST_NODE_TYPES.Identifier && REACT_WRAPPERS.includes(callee.name)) {\n return true;\n }\n\n if (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n callee.object.name === \"React\" &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n REACT_WRAPPERS.includes(callee.property.name)\n ) {\n return true;\n }\n }\n\n return false;\n};\n\nconst isGlobalScope = (node: TSESTree.Node): boolean => {\n const declaration = node.parent;\n\n if (!declaration || declaration.type !== AST_NODE_TYPES.VariableDeclaration) {\n return false;\n }\n\n const { parent } = declaration;\n\n if (parent.type === AST_NODE_TYPES.Program) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ExportNamedDeclaration && parent.parent?.type === AST_NODE_TYPES.Program) {\n return true;\n }\n\n return false;\n};\n\nconst isStaticValue = (init: TSESTree.Expression): boolean => {\n if (init.type === AST_NODE_TYPES.Literal) {\n return true;\n }\n\n if (init.type === AST_NODE_TYPES.UnaryExpression && init.argument.type === AST_NODE_TYPES.Literal) {\n return true;\n }\n\n if (init.type === AST_NODE_TYPES.TemplateLiteral && init.expressions.length === 0) {\n return true;\n }\n\n if (init.type === AST_NODE_TYPES.ArrayExpression) {\n return init.elements.every((el) => el !== null && el.type !== AST_NODE_TYPES.SpreadElement && isStaticValue(el));\n }\n\n if (init.type === AST_NODE_TYPES.ObjectExpression) {\n return init.properties.every(\n (prop) => prop.type === AST_NODE_TYPES.Property && isStaticValue(prop.value as TSESTree.Expression),\n );\n }\n\n if (\n init.type === AST_NODE_TYPES.TSAsExpression &&\n init.typeAnnotation.type === AST_NODE_TYPES.TSTypeReference &&\n init.typeAnnotation.typeName.type === AST_NODE_TYPES.Identifier &&\n init.typeAnnotation.typeName.name === \"const\"\n ) {\n return true;\n }\n\n return false;\n};\n\nconst enforceCamelCase = createRule({\n name: \"enforce-camel-case\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce camelCase for variables and functions, ban snake_case, and restrict PascalCase to React components\",\n },\n messages: {\n noSnakeCase: \"Variable '{{ name }}' should not use snake_case. Use camelCase instead.\",\n pascalCaseReserved:\n \"Variable '{{ name }}' uses PascalCase but is not a React component. PascalCase is reserved for components.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n VariableDeclarator(node) {\n if (node.id.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const { name } = node.id;\n\n if (SNAKE_CASE_REGEX.test(name)) {\n const declaration = node.parent;\n\n if (declaration.kind === \"const\" && isGlobalScope(node) && node.init && isStaticValue(node.init)) {\n return;\n }\n\n context.report({\n node: node.id,\n messageId: \"noSnakeCase\",\n data: { name },\n });\n\n return;\n }\n\n if (!node.init || !PASCAL_CASE_REGEX.test(name)) {\n return;\n }\n\n if (isComponentFunction(node.init)) {\n return;\n }\n\n if (\n node.init.type !== AST_NODE_TYPES.ArrowFunctionExpression &&\n node.init.type !== AST_NODE_TYPES.FunctionExpression &&\n node.init.type !== AST_NODE_TYPES.CallExpression\n ) {\n return;\n }\n\n context.report({\n node: node.id,\n messageId: \"pascalCaseReserved\",\n data: { name },\n });\n },\n FunctionDeclaration(node) {\n if (!node.id) {\n return;\n }\n\n const { name } = node.id;\n\n if (SNAKE_CASE_REGEX.test(name)) {\n context.report({\n node: node.id,\n messageId: \"noSnakeCase\",\n data: { name },\n });\n }\n },\n };\n },\n});\n\nexport default enforceCamelCase;\n","import { basename, extname } from \"node:path\";\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\ntype FunctionNode = TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression;\n\nexport const getFunctionParams = (node: FunctionNode) => node.params;\n\nexport const hasMultipleParams = (node: FunctionNode) => node.params.length > 1;\n\nexport const isDestructuredParam = (param: TSESTree.Parameter) =>\n param.type === AST_NODE_TYPES.ObjectPattern || param.type === AST_NODE_TYPES.ArrayPattern;\n\nexport const hasNonDestructuredParams = (node: FunctionNode) =>\n node.params.some(\n (param: TSESTree.Parameter) => !isDestructuredParam(param) && param.type !== AST_NODE_TYPES.RestElement,\n );\n\nexport const getFileExtension = (filename: string) => extname(filename).slice(1);\n\nexport const getBaseName = (filename: string) => basename(filename, extname(filename));\n\nexport const isJsFile = (filename: string) => {\n const ext = getFileExtension(filename);\n return ext === \"js\" || ext === \"ts\";\n};\n\nexport const isJsxFile = (filename: string) => {\n const ext = getFileExtension(filename);\n return ext === \"jsx\" || ext === \"tsx\";\n};\n\nexport const isConfigFile = (filename: string) => {\n const baseName = getBaseName(filename);\n return (\n /\\.(config|rc|setup|spec|test)$/.test(baseName) ||\n /\\.(config|rc|setup|spec|test)\\./.test(filename) ||\n /^\\.(eslintrc|babelrc|prettierrc)/.test(filename)\n );\n};\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isConfigFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst SCREAMING_SNAKE_CASE_REGEX = /^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$/;\nconst SNAKE_CASE_REGEX = /^[a-z]+_[a-z0-9_]*$/;\n\nconst toScreamingSnakeCase = (str: string): string =>\n str\n .replace(/([a-z])([A-Z])/g, \"$1_$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1_$2\")\n .toUpperCase();\n\nconst isMagicLiteral = (init: TSESTree.Expression): boolean => {\n if (init.type === AST_NODE_TYPES.Literal) {\n return typeof init.value === \"string\" || typeof init.value === \"number\";\n }\n\n if (init.type === AST_NODE_TYPES.UnaryExpression) {\n const { argument, operator } = init;\n return (\n (operator === \"-\" || operator === \"+\") &&\n argument.type === AST_NODE_TYPES.Literal &&\n typeof argument.value === \"number\"\n );\n }\n\n return false;\n};\n\nconst isGlobalScope = (node: TSESTree.VariableDeclaration): boolean => {\n const { parent } = node;\n\n if (parent.type === AST_NODE_TYPES.Program) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ExportNamedDeclaration && parent.parent?.type === AST_NODE_TYPES.Program) {\n return true;\n }\n\n return false;\n};\n\nconst enforceConstantCase = createRule({\n name: \"enforce-constant-case\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce SCREAMING_SNAKE_CASE for global magic-number and magic-text constants\",\n },\n messages: {\n useScreamingSnakeCase: \"Constant '{{ name }}' should use SCREAMING_SNAKE_CASE. Rename to '{{ suggestion }}'.\",\n noSnakeCase: \"Global constant '{{ name }}' should not use snake_case. Rename to '{{ suggestion }}'.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (isConfigFile(context.filename)) {\n return {};\n }\n\n return {\n VariableDeclaration(node) {\n if (node.kind !== \"const\" || !isGlobalScope(node)) {\n return;\n }\n\n node.declarations.forEach((declarator) => {\n if (declarator.id.type !== AST_NODE_TYPES.Identifier || !declarator.init) {\n return;\n }\n\n if (!isMagicLiteral(declarator.init)) {\n return;\n }\n\n const { name } = declarator.id;\n\n if (SNAKE_CASE_REGEX.test(name)) {\n context.report({\n node: declarator.id,\n messageId: \"noSnakeCase\",\n data: { name, suggestion: toScreamingSnakeCase(name) },\n });\n\n return;\n }\n\n if (!SCREAMING_SNAKE_CASE_REGEX.test(name)) {\n context.report({\n node: declarator.id,\n messageId: \"useScreamingSnakeCase\",\n data: { name, suggestion: toScreamingSnakeCase(name) },\n });\n }\n });\n },\n };\n },\n});\n\nexport default enforceConstantCase;\n","import path from \"path\";\n\nimport { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst enforceHookFilename = createRule({\n name: \"enforce-hook-filename\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce that files exporting custom hooks are named *.hook.ts or *.hooks.ts\",\n },\n messages: {\n requireHookFilename: \"'{{ name }}' is a custom hook and must be exported from a *.hook.ts or *.hooks.ts file.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const basename = path.basename(context.filename);\n const isHookFile = basename.endsWith(\".hook.ts\") || basename.endsWith(\".hooks.ts\");\n\n if (isHookFile) return {};\n\n function reportIfHook(name: string, node: TSESTree.Node): void {\n if (name.startsWith(\"use\") && name.length > 3 && /^use[A-Z]/.test(name)) {\n context.report({ node, messageId: \"requireHookFilename\", data: { name } });\n }\n }\n\n return {\n ExportNamedDeclaration(node) {\n if (node.declaration?.type === AST_NODE_TYPES.FunctionDeclaration && node.declaration.id) {\n reportIfHook(node.declaration.id.name, node.declaration.id);\n }\n\n if (node.declaration?.type === AST_NODE_TYPES.VariableDeclaration) {\n for (const declarator of node.declaration.declarations) {\n if (\n declarator.id.type === AST_NODE_TYPES.Identifier &&\n declarator.init !== null &&\n (declarator.init.type === AST_NODE_TYPES.ArrowFunctionExpression ||\n declarator.init.type === AST_NODE_TYPES.FunctionExpression)\n ) {\n reportIfHook(declarator.id.name, declarator.id);\n }\n }\n }\n },\n ExportDefaultDeclaration(node) {\n if (node.declaration.type === AST_NODE_TYPES.FunctionDeclaration && node.declaration.id !== null) {\n reportIfHook(node.declaration.id.name, node.declaration.id);\n }\n },\n };\n },\n});\n\nexport default enforceHookFilename;\n","import path from \"path\";\n\nimport { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst enforceHookNaming = createRule({\n name: \"enforce-hook-naming\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce 'use' prefix for functions in custom hook files (*.hook.ts, *.hooks.ts)\",\n },\n messages: {\n missingUsePrefix: \"Custom hook functions must start with 'use'. Rename '{{ name }}' to '{{ suggestion }}'.\",\n defaultExportMissingUsePrefix:\n \"Default export in hook files must start with 'use'. Rename '{{ name }}' to '{{ suggestion }}'.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const basename = path.basename(filename);\n const isHookFile = basename.endsWith(\".hook.ts\") || basename.endsWith(\".hooks.ts\");\n\n if (!isHookFile) {\n return {};\n }\n\n const getSuggestion = (name: string): string => {\n const capitalizedName = name.charAt(0).toUpperCase() + name.slice(1);\n\n return `use${capitalizedName}`;\n };\n\n const checkFunctionName = (\n name: string,\n node: TSESTree.Node,\n messageId: \"missingUsePrefix\" | \"defaultExportMissingUsePrefix\",\n ): void => {\n if (!name.startsWith(\"use\")) {\n context.report({\n node,\n messageId,\n data: {\n name,\n suggestion: getSuggestion(name),\n },\n });\n }\n };\n\n return {\n ExportNamedDeclaration(node) {\n if (node.declaration?.type === AST_NODE_TYPES.FunctionDeclaration && node.declaration.id) {\n checkFunctionName(node.declaration.id.name, node.declaration.id, \"missingUsePrefix\");\n }\n\n if (node.declaration?.type === AST_NODE_TYPES.VariableDeclaration) {\n node.declaration.declarations.forEach((declarator) => {\n if (declarator.id.type === AST_NODE_TYPES.Identifier) {\n checkFunctionName(declarator.id.name, declarator.id, \"missingUsePrefix\");\n }\n });\n }\n },\n ExportDefaultDeclaration(node) {\n if (node.declaration.type === AST_NODE_TYPES.Identifier) {\n checkFunctionName(node.declaration.name, node.declaration, \"defaultExportMissingUsePrefix\");\n }\n\n if (node.declaration.type === AST_NODE_TYPES.FunctionDeclaration && node.declaration.id) {\n checkFunctionName(node.declaration.id.name, node.declaration.id, \"defaultExportMissingUsePrefix\");\n }\n },\n };\n },\n});\n\nexport default enforceHookNaming;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst SNAKE_CASE_REGEX = /^[a-z]+_[a-z0-9_]*$/;\nconst SCREAMING_SNAKE_CASE_REGEX = /^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$/;\n\nconst isInsideAsConst = (node: TSESTree.ObjectExpression): boolean => {\n const { parent } = node;\n\n if (\n parent.type === AST_NODE_TYPES.TSAsExpression &&\n parent.typeAnnotation.type === AST_NODE_TYPES.TSTypeReference &&\n parent.typeAnnotation.typeName.type === AST_NODE_TYPES.Identifier &&\n parent.typeAnnotation.typeName.name === \"const\"\n ) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ArrayExpression) {\n const grandparent = parent.parent;\n\n if (\n grandparent?.type === AST_NODE_TYPES.TSAsExpression &&\n grandparent.typeAnnotation.type === AST_NODE_TYPES.TSTypeReference &&\n grandparent.typeAnnotation.typeName.type === AST_NODE_TYPES.Identifier &&\n grandparent.typeAnnotation.typeName.name === \"const\"\n ) {\n return true;\n }\n }\n\n return false;\n};\n\nconst enforcePropertyCase = createRule({\n name: \"enforce-property-case\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce camelCase for unquoted object property keys\",\n },\n messages: {\n useCamelCase:\n \"Property '{{ name }}' should use camelCase. Use camelCase for object properties, or wrap in quotes if required by an API.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Property(node) {\n if (node.parent.type !== AST_NODE_TYPES.ObjectExpression) {\n return;\n }\n\n if (isInsideAsConst(node.parent)) {\n return;\n }\n\n if (node.computed) {\n return;\n }\n\n if (node.key.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const { name } = node.key;\n\n if (SNAKE_CASE_REGEX.test(name) || SCREAMING_SNAKE_CASE_REGEX.test(name)) {\n context.report({\n node: node.key,\n messageId: \"useCamelCase\",\n data: { name },\n });\n }\n },\n };\n },\n});\n\nexport default enforcePropertyCase;\n","import path from \"path\";\n\nimport { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst enforcePropsSuffix = createRule({\n name: \"enforce-props-suffix\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce 'Props' suffix for interfaces and types in component files (*.tsx)\",\n },\n messages: {\n missingPropsSuffix: \"Interface/type '{{ name }}' should end with 'Props'. Rename to '{{ suggestion }}'.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const ext = path.extname(filename);\n const isComponentFile = ext === \".tsx\" || ext === \".jsx\";\n\n if (!isComponentFile) {\n return {};\n }\n\n const checkTypeName = (name: string, node: TSESTree.Node): void => {\n if (!name.endsWith(\"Props\")) {\n context.report({\n node,\n messageId: \"missingPropsSuffix\",\n data: {\n name,\n suggestion: `${name}Props`,\n },\n });\n }\n };\n\n return {\n TSInterfaceDeclaration(node) {\n if (node.id.type === AST_NODE_TYPES.Identifier) {\n checkTypeName(node.id.name, node.id);\n }\n },\n TSTypeAliasDeclaration(node) {\n if (node.id.type === AST_NODE_TYPES.Identifier) {\n if (node.typeAnnotation.type === AST_NODE_TYPES.TSTypeLiteral) {\n checkTypeName(node.id.name, node.id);\n }\n }\n },\n };\n },\n});\n\nexport default enforcePropsSuffix;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").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 if (!isJsxFile(context.filename)) return {};\n\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 { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { getFileExtension } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst ARRAY_RETURNING_METHODS = new Set([\"map\", \"flatMap\", \"filter\"]);\n\nfunction hasRenderPrefix(name: string): boolean {\n if (!name.startsWith(\"render\")) {\n return false;\n }\n if (name.length === \"render\".length) {\n return true;\n }\n const nextChar = name[\"render\".length];\n return nextChar === nextChar.toUpperCase() && nextChar !== nextChar.toLowerCase();\n}\n\nfunction functionBodyReturnsJsx(body: TSESTree.BlockStatement | TSESTree.Expression): boolean {\n if (body.type === AST_NODE_TYPES.JSXElement || body.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n\n if (body.type === AST_NODE_TYPES.ConditionalExpression) {\n return isJsxProducingExpression(body.consequent) || isJsxProducingExpression(body.alternate);\n }\n\n if (body.type === AST_NODE_TYPES.LogicalExpression) {\n return isJsxProducingExpression(body.right);\n }\n\n if (body.type !== AST_NODE_TYPES.BlockStatement) {\n return false;\n }\n\n for (const statement of body.body) {\n if (statement.type === AST_NODE_TYPES.ReturnStatement && statement.argument) {\n if (isJsxProducingExpression(statement.argument)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nfunction isJsxProducingExpression(node: TSESTree.Expression): boolean {\n if (node.type === AST_NODE_TYPES.JSXElement || node.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.ConditionalExpression) {\n return isJsxProducingExpression(node.consequent) || isJsxProducingExpression(node.alternate);\n }\n\n if (node.type === AST_NODE_TYPES.LogicalExpression) {\n return isJsxProducingExpression(node.right);\n }\n\n if (node.type === AST_NODE_TYPES.ArrayExpression) {\n return node.elements.some((element) => {\n if (!element || element.type === AST_NODE_TYPES.SpreadElement) {\n return false;\n }\n return isJsxProducingExpression(element as TSESTree.Expression);\n });\n }\n\n if (node.type === AST_NODE_TYPES.ArrowFunctionExpression || node.type === AST_NODE_TYPES.FunctionExpression) {\n return functionBodyReturnsJsx(node.body);\n }\n\n if (node.type === AST_NODE_TYPES.CallExpression) {\n if (\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n node.callee.property.type === AST_NODE_TYPES.Identifier &&\n ARRAY_RETURNING_METHODS.has(node.callee.property.name)\n ) {\n const callback = node.arguments[0];\n if (\n callback &&\n (callback.type === AST_NODE_TYPES.ArrowFunctionExpression ||\n callback.type === AST_NODE_TYPES.FunctionExpression)\n ) {\n return functionBodyReturnsJsx(callback.body);\n }\n }\n }\n\n if (node.type === AST_NODE_TYPES.TSAsExpression || node.type === AST_NODE_TYPES.TSSatisfiesExpression) {\n return isJsxProducingExpression(node.expression);\n }\n\n return false;\n}\n\nfunction isPascalCase(name: string): boolean {\n return /^[A-Z]/.test(name);\n}\n\nfunction isComponentFunction(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclaration | TSESTree.FunctionExpression,\n): boolean {\n if (node.type === AST_NODE_TYPES.FunctionDeclaration && node.id && isPascalCase(node.id.name)) {\n return true;\n }\n\n const parent = node.parent;\n if (\n parent?.type === AST_NODE_TYPES.VariableDeclarator &&\n parent.id.type === AST_NODE_TYPES.Identifier &&\n isPascalCase(parent.id.name)\n ) {\n return true;\n }\n\n return false;\n}\n\nconst enforceRenderNaming = createRule({\n name: \"enforce-render-naming\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce 'render' prefix for variables that hold or return JSX inside React components\",\n },\n schema: [],\n messages: {\n missingRenderPrefix:\n \"Variable '{{ name }}' holds JSX-producing content inside a component. Rename it to 'render{{ pascalName }}' so the intent is explicit.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const extension = getFileExtension(filename);\n\n if (extension !== \"tsx\" && extension !== \"jsx\") {\n return {};\n }\n\n const componentStack: boolean[] = [];\n\n function isInsideComponent(): boolean {\n return componentStack.some((value) => value);\n }\n\n function pushFunction(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclaration | TSESTree.FunctionExpression,\n ) {\n componentStack.push(isComponentFunction(node));\n }\n\n function popFunction() {\n componentStack.pop();\n }\n\n return {\n ArrowFunctionExpression: pushFunction,\n FunctionDeclaration: pushFunction,\n FunctionExpression: pushFunction,\n \"ArrowFunctionExpression:exit\": popFunction,\n \"FunctionDeclaration:exit\": popFunction,\n \"FunctionExpression:exit\": popFunction,\n VariableDeclarator(node: TSESTree.VariableDeclarator) {\n if (!isInsideComponent()) {\n return;\n }\n\n if (node.id.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n if (!node.init) {\n return;\n }\n\n if (!isJsxProducingExpression(node.init)) {\n return;\n }\n\n const name = node.id.name;\n if (hasRenderPrefix(name)) {\n return;\n }\n\n const pascalName = name.charAt(0).toUpperCase() + name.slice(1);\n\n context.report({\n node: node.id,\n messageId: \"missingRenderPrefix\",\n data: { name, pascalName },\n });\n },\n };\n },\n});\n\nexport default enforceRenderNaming;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst BANNED_PREFIXES: Record<string, string[]> = {\n delete: [\"remove\", \"archive\"],\n do: [\"submit\", \"process\"],\n handle: [\"create\", \"verify\"],\n set: [\"update\", \"save\", \"patch\"],\n};\n\nconst enforceServiceNaming = createRule({\n name: \"enforce-service-naming\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Ban misleading function name prefixes in *.service.ts files\",\n },\n messages: {\n bannedPrefix:\n \"Avoid '{{ prefix }}' prefix in service functions. Rename '{{ name }}' to use a more descriptive prefix (e.g. {{ suggestions }}).\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const isServiceFile = filename.endsWith(\".service.ts\");\n\n if (!isServiceFile) {\n return {};\n }\n\n const checkFunctionName = (name: string, node: TSESTree.Node): void => {\n const matchedPrefix = Object.keys(BANNED_PREFIXES).find(\n (prefix) =>\n name.startsWith(prefix) &&\n name.length > prefix.length &&\n name[prefix.length] === name[prefix.length]?.toUpperCase(),\n );\n\n if (matchedPrefix) {\n context.report({\n node,\n messageId: \"bannedPrefix\",\n data: {\n prefix: matchedPrefix,\n name,\n suggestions: BANNED_PREFIXES[matchedPrefix].join(\", \"),\n },\n });\n }\n };\n\n const checkExportedFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.ArrowFunctionExpression,\n id: TSESTree.Identifier | null,\n ): void => {\n if (!node.async || !id) {\n return;\n }\n\n checkFunctionName(id.name, id);\n };\n\n return {\n ExportNamedDeclaration(node) {\n if (node.declaration?.type === AST_NODE_TYPES.FunctionDeclaration && node.declaration.id) {\n checkExportedFunction(node.declaration, node.declaration.id);\n }\n\n if (node.declaration?.type === AST_NODE_TYPES.VariableDeclaration) {\n node.declaration.declarations.forEach((declarator) => {\n if (\n declarator.id.type === AST_NODE_TYPES.Identifier &&\n declarator.init?.type === AST_NODE_TYPES.ArrowFunctionExpression\n ) {\n checkExportedFunction(declarator.init, declarator.id);\n }\n });\n }\n },\n };\n },\n});\n\nexport default enforceServiceNaming;\n","import path from \"path\";\n\nimport { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst TEST_GLOBALS = new Set([\"describe\", \"it\", \"test\", \"beforeEach\", \"beforeAll\", \"afterEach\", \"afterAll\"]);\n\nconst enforceTestFilename = createRule({\n name: \"enforce-test-filename\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce that files containing test code are named *.test.ts or *.test.tsx\",\n },\n messages: {\n requireTestFilename: \"Files containing test code must be named *.test.ts or *.test.tsx.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const basename = path.basename(context.filename);\n const isTestFile = basename.endsWith(\".test.ts\") || basename.endsWith(\".test.tsx\");\n\n if (isTestFile) return {};\n\n function isTestGlobalCall(node: TSESTree.CallExpression): boolean {\n return node.callee.type === AST_NODE_TYPES.Identifier && TEST_GLOBALS.has(node.callee.name);\n }\n\n let reported = false;\n\n return {\n CallExpression(node) {\n if (reported) return;\n if (!isTestGlobalCall(node)) return;\n\n reported = true;\n context.report({ node, messageId: \"requireTestFilename\" });\n },\n };\n },\n});\n\nexport default enforceTestFilename;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst enforceSortedDestructuring = createRule({\n name: \"enforce-sorted-destructuring\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce alphabetical sorting of destructured properties with defaults first\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n unsortedDestructuring:\n \"Destructured properties should be sorted alphabetically. Properties with defaults should come first, sorted alphabetically.\",\n },\n },\n defaultOptions: [],\n create(context) {\n function getPropertyName(property: TSESTree.Property | TSESTree.RestElement): string | null {\n if (property.type === AST_NODE_TYPES.RestElement) {\n return null;\n }\n\n if (property.key.type === AST_NODE_TYPES.Identifier) {\n return property.key.name;\n }\n\n return null;\n }\n\n function hasDefaultValue(property: TSESTree.Property): boolean {\n return property.value.type === AST_NODE_TYPES.AssignmentPattern && Boolean(property.value.right);\n }\n\n function checkVariableDeclarator(node: TSESTree.VariableDeclarator) {\n if (node.id.type !== AST_NODE_TYPES.ObjectPattern) {\n return;\n }\n\n const { properties } = node.id;\n\n if (properties.length < 2) {\n return;\n }\n\n const propertyInfo = properties\n .map((prop) => {\n if (prop.type === AST_NODE_TYPES.RestElement) {\n return null;\n }\n return {\n property: prop,\n name: getPropertyName(prop),\n hasDefault: hasDefaultValue(prop),\n };\n })\n .filter((info): info is NonNullable<typeof info> => info !== null && info.name !== null);\n\n const sorted = [...propertyInfo].sort((a, b) => {\n if (a.hasDefault && !b.hasDefault) {\n return -1;\n }\n if (!a.hasDefault && b.hasDefault) {\n return 1;\n }\n\n return a.name!.localeCompare(b.name!);\n });\n\n const isSorted = propertyInfo.every((info, index) => info.name === sorted[index].name);\n\n if (!isSorted) {\n context.report({\n node: node.id,\n messageId: \"unsortedDestructuring\",\n fix(fixer) {\n const { sourceCode } = context;\n const sortedTexts = sorted.map((info) => sourceCode.getText(info.property));\n\n return propertyInfo.map((info, index) => fixer.replaceText(info.property, sortedTexts[index]));\n },\n });\n }\n }\n\n return {\n VariableDeclarator: checkVariableDeclarator,\n };\n },\n});\n\nexport default enforceSortedDestructuring;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction getTypeDeclarationName(node: TSESTree.Node): { name: string; position: number } | null {\n if (node.type === AST_NODE_TYPES.TSInterfaceDeclaration && node.id.type === AST_NODE_TYPES.Identifier) {\n return { name: node.id.name, position: node.range[0] };\n }\n\n if (node.type === AST_NODE_TYPES.TSTypeAliasDeclaration && node.id.type === AST_NODE_TYPES.Identifier) {\n return { name: node.id.name, position: node.range[0] };\n }\n\n return null;\n}\n\nconst enforceTypeDeclarationOrder = createRule({\n name: \"enforce-type-declaration-order\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce that referenced types and interfaces are declared after the type that uses them\",\n },\n fixable: undefined,\n schema: [],\n messages: {\n dependencyBeforeConsumer: \"'{{dependency}}' should be declared after '{{consumer}}' which references it\",\n },\n },\n defaultOptions: [],\n create(context) {\n const typeDeclarations = new Map<string, number>();\n const reported = new Set<string>();\n\n return {\n TSInterfaceDeclaration(node) {\n const info = getTypeDeclarationName(node);\n\n if (info) {\n typeDeclarations.set(info.name, info.position);\n }\n },\n\n TSTypeAliasDeclaration(node) {\n const info = getTypeDeclarationName(node);\n\n if (info) {\n typeDeclarations.set(info.name, info.position);\n }\n },\n\n \"TSPropertySignature TSTypeReference\": function checkTypeReference(node: TSESTree.TSTypeReference) {\n if (node.typeName.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const referencedName = node.typeName.name;\n const referencedPosition = typeDeclarations.get(referencedName);\n\n if (referencedPosition === undefined) {\n return;\n }\n\n let current: TSESTree.Node | undefined = node.parent;\n\n while (current) {\n const consumerInfo = getTypeDeclarationName(current);\n\n if (consumerInfo) {\n if (referencedPosition < consumerInfo.position) {\n const reportKey = `${referencedName}-${consumerInfo.name}`;\n\n if (!reported.has(reportKey)) {\n reported.add(reportKey);\n context.report({\n node: node.typeName,\n messageId: \"dependencyBeforeConsumer\",\n data: {\n dependency: referencedName,\n consumer: consumerInfo.name,\n },\n });\n }\n }\n\n break;\n }\n\n current = current.parent;\n }\n },\n };\n },\n});\n\nexport default enforceTypeDeclarationOrder;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { getBaseName } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst isIndexFile = (filename: string): boolean => getBaseName(filename) === \"index\";\n\nconst isAllowedExportNamed = (node: TSESTree.ExportNamedDeclaration): boolean => {\n if (!node.declaration) {\n return true;\n }\n\n return (\n node.declaration.type === AST_NODE_TYPES.TSTypeAliasDeclaration ||\n node.declaration.type === AST_NODE_TYPES.TSInterfaceDeclaration\n );\n};\n\nconst isAllowedExportDefault = (node: TSESTree.ExportDefaultDeclaration): boolean =>\n node.declaration.type === AST_NODE_TYPES.Identifier;\n\nconst isAllowedTopLevel = (node: TSESTree.ProgramStatement): boolean => {\n switch (node.type) {\n case AST_NODE_TYPES.ImportDeclaration:\n case AST_NODE_TYPES.ExportAllDeclaration:\n case AST_NODE_TYPES.TSTypeAliasDeclaration:\n case AST_NODE_TYPES.TSInterfaceDeclaration:\n case AST_NODE_TYPES.TSImportEqualsDeclaration:\n return true;\n case AST_NODE_TYPES.ExportNamedDeclaration:\n return isAllowedExportNamed(node);\n case AST_NODE_TYPES.ExportDefaultDeclaration:\n return isAllowedExportDefault(node);\n default:\n return false;\n }\n};\n\nconst indexExportOnly = createRule({\n name: \"index-export-only\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Restrict index files to imports, re-exports, and type declarations only.\",\n },\n messages: {\n indexExportOnly:\n \"Index files must contain only imports, re-exports, and type declarations. Move runtime code to a separate module and re-export it from here.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (!isIndexFile(context.filename)) {\n return {};\n }\n\n return {\n Program(node: TSESTree.Program) {\n for (const statement of node.body) {\n if (!isAllowedTopLevel(statement)) {\n context.report({\n node: statement,\n messageId: \"indexExportOnly\",\n });\n }\n }\n },\n };\n },\n});\n\nexport default indexExportOnly;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst jsxNewlineBetweenElements = createRule({\n name: \"jsx-newline-between-elements\",\n meta: {\n type: \"layout\",\n docs: {\n description: \"Require empty lines between sibling JSX elements\",\n },\n fixable: \"whitespace\",\n schema: [],\n messages: {\n requireNewline: \"Expected empty line between sibling JSX elements\",\n forbidNewline: \"Unexpected empty line between single-line sibling JSX elements\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n const { sourceCode } = context;\n\n function isSignificantJSXChild(node: TSESTree.Node): boolean {\n return (\n node.type === AST_NODE_TYPES.JSXElement ||\n node.type === AST_NODE_TYPES.JSXFragment ||\n node.type === AST_NODE_TYPES.JSXExpressionContainer\n );\n }\n\n function isMultiLine(node: TSESTree.Node): boolean {\n return node.loc.start.line !== node.loc.end.line;\n }\n\n function checkSiblings(children: TSESTree.JSXChild[]) {\n const jsxElements = children.filter(\n (child): child is TSESTree.JSXElement | TSESTree.JSXFragment | TSESTree.JSXExpressionContainer =>\n isSignificantJSXChild(child),\n );\n\n for (let i = 0; i < jsxElements.length - 1; i += 1) {\n const current = jsxElements[i];\n const next = jsxElements[i + 1];\n\n const needsNewline = isMultiLine(current) || isMultiLine(next);\n\n if (needsNewline) {\n const currentEndLine = current.loc.end.line;\n const nextStartLine = next.loc.start.line;\n const lineDiff = nextStartLine - currentEndLine;\n\n if (lineDiff < 2) {\n context.report({\n node: next,\n messageId: \"requireNewline\",\n fix(fixer) {\n const textBetween = sourceCode.getText().slice(current.range[1], next.range[0]);\n\n if (textBetween.includes(\"//\") || textBetween.includes(\"/*\")) {\n return null;\n }\n\n return fixer.insertTextAfter(current, \"\\n\");\n },\n });\n }\n }\n }\n }\n\n return {\n JSXElement(node) {\n if (node.children.length > 0) {\n checkSiblings(node.children);\n }\n },\n JSXFragment(node) {\n if (node.children.length > 0) {\n checkSiblings(node.children);\n }\n },\n };\n },\n});\n\nexport default jsxNewlineBetweenElements;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { getFileExtension } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isObjectLikeElement(node: TSESTree.Expression | TSESTree.SpreadElement | null): boolean {\n if (!node) {\n return false;\n }\n\n if (node.type === AST_NODE_TYPES.ObjectExpression) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.TSAsExpression || node.type === AST_NODE_TYPES.TSSatisfiesExpression) {\n return isObjectLikeElement(node.expression);\n }\n\n return false;\n}\n\nfunction getArrayInitializer(init: TSESTree.Expression | null): TSESTree.ArrayExpression | null {\n if (!init) {\n return null;\n }\n\n if (init.type === AST_NODE_TYPES.ArrayExpression) {\n return init;\n }\n\n if (init.type === AST_NODE_TYPES.TSAsExpression || init.type === AST_NODE_TYPES.TSSatisfiesExpression) {\n return getArrayInitializer(init.expression);\n }\n\n return null;\n}\n\nconst jsxNoDataArray = createRule({\n name: \"jsx-no-data-array\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow top-level arrays of object literals in .tsx/.jsx files (extract to a data file)\",\n },\n schema: [],\n messages: {\n noDataArray:\n \"Top-level array of object literals belongs in a data file (e.g. *.data.ts), not a .tsx/.jsx component file. Extract '{{ name }}' to a sibling data module.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const extension = getFileExtension(filename);\n\n if (extension !== \"tsx\" && extension !== \"jsx\") {\n return {};\n }\n\n return {\n \"Program > VariableDeclaration > VariableDeclarator\": function checkDeclarator(\n node: TSESTree.VariableDeclarator,\n ) {\n const arrayInit = getArrayInitializer(node.init);\n if (!arrayInit) {\n return;\n }\n\n const hasObjectElement = arrayInit.elements.some((element) => isObjectLikeElement(element));\n if (!hasObjectElement) {\n return;\n }\n\n const name = node.id.type === AST_NODE_TYPES.Identifier ? node.id.name : \"<destructured>\";\n\n context.report({\n node,\n messageId: \"noDataArray\",\n data: { name },\n });\n },\n \"Program > ExportNamedDeclaration > VariableDeclaration > VariableDeclarator\": function checkExportedDeclarator(\n node: TSESTree.VariableDeclarator,\n ) {\n const arrayInit = getArrayInitializer(node.init);\n if (!arrayInit) {\n return;\n }\n\n const hasObjectElement = arrayInit.elements.some((element) => isObjectLikeElement(element));\n if (!hasObjectElement) {\n return;\n }\n\n const name = node.id.type === AST_NODE_TYPES.Identifier ? node.id.name : \"<destructured>\";\n\n context.report({\n node,\n messageId: \"noDataArray\",\n data: { name },\n });\n },\n };\n },\n});\n\nexport default jsxNoDataArray;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { getFileExtension } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction unwrapAssertion(node: TSESTree.Expression | null): TSESTree.Expression | null {\n if (!node) {\n return null;\n }\n\n if (node.type === AST_NODE_TYPES.TSAsExpression || node.type === AST_NODE_TYPES.TSSatisfiesExpression) {\n return unwrapAssertion(node.expression);\n }\n\n return node;\n}\n\nfunction isNestedValue(value: TSESTree.Expression | null): boolean {\n const unwrapped = unwrapAssertion(value);\n if (!unwrapped) {\n return false;\n }\n\n if (unwrapped.type === AST_NODE_TYPES.ObjectExpression) {\n return true;\n }\n\n if (unwrapped.type === AST_NODE_TYPES.ArrayExpression) {\n return unwrapped.elements.some((element) => {\n if (!element || element.type === AST_NODE_TYPES.SpreadElement) {\n return false;\n }\n const inner = unwrapAssertion(element);\n return inner?.type === AST_NODE_TYPES.ObjectExpression || inner?.type === AST_NODE_TYPES.ArrayExpression;\n });\n }\n\n return false;\n}\n\nfunction hasNestedProperty(object: TSESTree.ObjectExpression): boolean {\n return object.properties.some((property) => {\n if (property.type !== AST_NODE_TYPES.Property) {\n return false;\n }\n if (property.value.type === AST_NODE_TYPES.AssignmentPattern) {\n return false;\n }\n return isNestedValue(property.value as TSESTree.Expression);\n });\n}\n\nfunction getObjectInitializer(init: TSESTree.Expression | null): TSESTree.ObjectExpression | null {\n const unwrapped = unwrapAssertion(init);\n if (!unwrapped) {\n return null;\n }\n\n if (unwrapped.type === AST_NODE_TYPES.ObjectExpression) {\n return unwrapped;\n }\n\n return null;\n}\n\nconst jsxNoDataObject = createRule({\n name: \"jsx-no-data-object\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow top-level nested object literals in .tsx/.jsx files (extract to a data file)\",\n },\n schema: [],\n messages: {\n noDataObject:\n \"Top-level nested object literal belongs in a data file (e.g. *.data.ts), not a .tsx/.jsx component file. Extract '{{ name }}' to a sibling data module.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const extension = getFileExtension(filename);\n\n if (extension !== \"tsx\" && extension !== \"jsx\") {\n return {};\n }\n\n function checkDeclarator(node: TSESTree.VariableDeclarator) {\n const objectInit = getObjectInitializer(node.init);\n if (!objectInit) {\n return;\n }\n\n if (!hasNestedProperty(objectInit)) {\n return;\n }\n\n const name = node.id.type === AST_NODE_TYPES.Identifier ? node.id.name : \"<destructured>\";\n\n context.report({\n node,\n messageId: \"noDataObject\",\n data: { name },\n });\n }\n\n return {\n \"Program > VariableDeclaration > VariableDeclarator\": checkDeclarator,\n \"Program > ExportNamedDeclaration > VariableDeclaration > VariableDeclarator\": checkDeclarator,\n };\n },\n});\n\nexport default jsxNoDataObject;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst jsxNoInlineObjectProp = createRule({\n name: \"jsx-no-inline-object-prop\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow inline object literals in JSX props - extract to const first\",\n },\n messages: {\n noInlineObject:\n \"Avoid inline object literals in JSX props. Extract to a const variable first for better readability and performance.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n return {\n JSXAttribute(node) {\n if (\n node.value?.type === AST_NODE_TYPES.JSXExpressionContainer &&\n node.value.expression.type === AST_NODE_TYPES.ObjectExpression\n ) {\n context.report({\n node: node.value,\n messageId: \"noInlineObject\",\n });\n }\n },\n };\n },\n});\n\nexport default jsxNoInlineObjectProp;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isJSXElementOrFragment(node: TSESTree.Node): boolean {\n return node.type === AST_NODE_TYPES.JSXElement || node.type === AST_NODE_TYPES.JSXFragment;\n}\n\nfunction isSingleLine(node: TSESTree.Node): boolean {\n return node.loc.start.line === node.loc.end.line;\n}\n\nconst jsxNoNewlineSingleLineElements = createRule({\n name: \"jsx-no-newline-single-line-elements\",\n meta: {\n type: \"layout\",\n docs: {\n description: \"Disallow empty lines between single-line sibling JSX elements\",\n },\n fixable: \"whitespace\",\n schema: [],\n messages: {\n forbidNewline: \"Unexpected empty line between single-line sibling JSX elements.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n const { sourceCode } = context;\n\n function checkSiblings(children: TSESTree.JSXChild[]): void {\n const nonWhitespace = children.filter(\n (child) => !(child.type === AST_NODE_TYPES.JSXText && child.value.trim() === \"\"),\n );\n\n nonWhitespace.forEach((next, index) => {\n if (index === 0) {\n return;\n }\n\n const current = nonWhitespace[index - 1];\n\n if (!isJSXElementOrFragment(current) || !isJSXElementOrFragment(next)) {\n return;\n }\n\n if (!isSingleLine(current) || !isSingleLine(next)) {\n return;\n }\n\n const currentEndLine = current.loc.end.line;\n const nextStartLine = next.loc.start.line;\n const lineDiff = nextStartLine - currentEndLine;\n\n if (lineDiff < 2) {\n return;\n }\n\n context.report({\n node: next,\n messageId: \"forbidNewline\",\n fix(fixer) {\n const textBetween = sourceCode.getText().slice(current.range[1], next.range[0]);\n\n if (textBetween.includes(\"//\") || textBetween.includes(\"/*\")) {\n return null;\n }\n\n const indent = \" \".repeat(next.loc.start.column);\n\n return fixer.replaceTextRange([current.range[1], next.range[0]], `\\n${indent}`);\n },\n });\n });\n }\n\n return {\n JSXElement(node) {\n if (node.children.length > 0) {\n checkSiblings(node.children);\n }\n },\n JSXFragment(node) {\n if (node.children.length > 0) {\n checkSiblings(node.children);\n }\n },\n };\n },\n});\n\nexport default jsxNoNewlineSingleLineElements;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { getFileExtension } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst jsxNoNonComponentFunction = createRule({\n name: \"jsx-no-non-component-function\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow non-component functions defined at top level in .tsx and .jsx files\",\n },\n schema: [],\n messages: {\n noTopLevelFunction:\n \"Non-component functions should not be defined at top level in .tsx/.jsx files. Either move it inside the component or extract it to a separate file.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const extension = getFileExtension(filename);\n\n if (extension !== \"tsx\" && extension !== \"jsx\") {\n return {};\n }\n\n function isReactComponent(node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclaration): boolean {\n const functionName = node.type === AST_NODE_TYPES.FunctionDeclaration && node.id ? node.id.name : null;\n\n if (functionName && /^[A-Z]/.test(functionName)) {\n return true;\n }\n\n if (node.returnType?.typeAnnotation) {\n const returnTypeNode = node.returnType.typeAnnotation;\n if (\n returnTypeNode.type === AST_NODE_TYPES.TSTypeReference &&\n returnTypeNode.typeName.type === AST_NODE_TYPES.Identifier\n ) {\n const typeName = returnTypeNode.typeName.name;\n if (typeName === \"JSX\" || typeName === \"ReactElement\" || typeName === \"ReactNode\") {\n return true;\n }\n }\n }\n\n return false;\n }\n\n function checkTopLevelFunction(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclaration,\n declaratorNode?: TSESTree.VariableDeclarator,\n ) {\n if (isReactComponent(node)) {\n return;\n }\n\n const { parent } = node;\n if (!parent) {\n return;\n }\n\n if (\n parent.type === AST_NODE_TYPES.ExportDefaultDeclaration ||\n parent.type === AST_NODE_TYPES.ExportNamedDeclaration\n ) {\n return;\n }\n\n if (declaratorNode?.parent?.parent?.type === AST_NODE_TYPES.ExportNamedDeclaration) {\n return;\n }\n\n if (declaratorNode?.id.type === AST_NODE_TYPES.Identifier) {\n const varName = declaratorNode.id.name;\n if (/^[A-Z]/.test(varName)) {\n return;\n }\n }\n\n context.report({\n node: declaratorNode || node,\n messageId: \"noTopLevelFunction\",\n });\n }\n\n return {\n \"Program > VariableDeclaration > VariableDeclarator > ArrowFunctionExpression\": function checkArrowFunction(\n node: TSESTree.ArrowFunctionExpression,\n ) {\n const declarator = node.parent as TSESTree.VariableDeclarator;\n checkTopLevelFunction(node, declarator);\n },\n \"Program > FunctionDeclaration\": function checkFunctionDeclaration(node: TSESTree.FunctionDeclaration) {\n checkTopLevelFunction(node);\n },\n };\n },\n});\n\nexport default jsxNoNonComponentFunction;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { getFileExtension } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst PROPS_WRAPPER_NAMES = new Set([\"Readonly\", \"Required\", \"Partial\", \"PropsWithChildren\", \"NoInfer\"]);\n\nfunction unwrapWrapperType(node: TSESTree.TypeNode): TSESTree.TypeNode {\n if (\n node.type === AST_NODE_TYPES.TSTypeReference &&\n node.typeName.type === AST_NODE_TYPES.Identifier &&\n PROPS_WRAPPER_NAMES.has(node.typeName.name) &&\n node.typeArguments &&\n node.typeArguments.params.length > 0\n ) {\n return unwrapWrapperType(node.typeArguments.params[0]);\n }\n return node;\n}\n\nfunction getMainTypeName(typeNode: TSESTree.TypeNode | undefined): string | null {\n if (!typeNode) {\n return null;\n }\n const unwrapped = unwrapWrapperType(typeNode);\n if (unwrapped.type === AST_NODE_TYPES.TSTypeReference && unwrapped.typeName.type === AST_NODE_TYPES.Identifier) {\n return unwrapped.typeName.name;\n }\n return null;\n}\n\nfunction getComponentMainTypeName(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclaration | TSESTree.FunctionExpression,\n): string | null {\n const firstParam = node.params[0];\n if (!firstParam) {\n return null;\n }\n\n if (\"typeAnnotation\" in firstParam && firstParam.typeAnnotation) {\n return getMainTypeName(firstParam.typeAnnotation.typeAnnotation);\n }\n\n return null;\n}\n\nfunction isPascalCase(name: string): boolean {\n return /^[A-Z]/.test(name);\n}\n\nfunction getDeclarationFromExportWrapper(node: TSESTree.ProgramStatement): TSESTree.Node {\n if (node.type === AST_NODE_TYPES.ExportNamedDeclaration && node.declaration) {\n return node.declaration;\n }\n if (node.type === AST_NODE_TYPES.ExportDefaultDeclaration) {\n return node.declaration;\n }\n return node;\n}\n\nconst jsxNoSubInterface = createRule({\n name: \"jsx-no-sub-interface\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow sub-interfaces and helper types in component files; keep only the main component props (extract the rest)\",\n },\n schema: [],\n messages: {\n noSubInterface:\n \"Sub-interface or helper type '{{ name }}' should not live in a component file. Extract it to a sibling module (e.g., a *.types.ts file or its own component file).\",\n },\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const extension = getFileExtension(filename);\n\n if (extension !== \"tsx\" && extension !== \"jsx\") {\n return {};\n }\n\n return {\n Program(programNode: TSESTree.Program) {\n const mainTypes = new Set<string>();\n const typeDeclarations: Array<{ name: string; node: TSESTree.Node }> = [];\n let componentCount = 0;\n\n for (const statement of programNode.body) {\n const declaration = getDeclarationFromExportWrapper(statement);\n\n if (\n declaration.type === AST_NODE_TYPES.FunctionDeclaration &&\n declaration.id &&\n isPascalCase(declaration.id.name)\n ) {\n componentCount += 1;\n const mainType = getComponentMainTypeName(declaration);\n if (mainType) {\n mainTypes.add(mainType);\n }\n continue;\n }\n\n if (declaration.type === AST_NODE_TYPES.VariableDeclaration) {\n for (const declarator of declaration.declarations) {\n if (declarator.id.type !== AST_NODE_TYPES.Identifier) {\n continue;\n }\n if (!isPascalCase(declarator.id.name)) {\n continue;\n }\n const init = declarator.init;\n if (\n init &&\n (init.type === AST_NODE_TYPES.ArrowFunctionExpression ||\n init.type === AST_NODE_TYPES.FunctionExpression)\n ) {\n componentCount += 1;\n const mainType = getComponentMainTypeName(init);\n if (mainType) {\n mainTypes.add(mainType);\n }\n }\n }\n continue;\n }\n\n if (declaration.type === AST_NODE_TYPES.TSInterfaceDeclaration) {\n typeDeclarations.push({ name: declaration.id.name, node: declaration });\n continue;\n }\n\n if (declaration.type === AST_NODE_TYPES.TSTypeAliasDeclaration) {\n typeDeclarations.push({ name: declaration.id.name, node: declaration });\n continue;\n }\n }\n\n if (componentCount === 0) {\n return;\n }\n\n for (const declaration of typeDeclarations) {\n if (mainTypes.has(declaration.name)) {\n continue;\n }\n\n context.report({\n node: declaration.node,\n messageId: \"noSubInterface\",\n data: { name: declaration.name },\n });\n }\n },\n };\n },\n});\n\nexport default jsxNoSubInterface;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isNullOrUndefined(node: TSESTree.Node): boolean {\n if (node.type === AST_NODE_TYPES.Literal && node.value === null) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.Identifier && node.name === \"undefined\") {\n return true;\n }\n\n return false;\n}\n\nconst jsxNoTernaryNull = createRule({\n name: \"jsx-no-ternary-null\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce logical AND over ternary with null/undefined in JSX expressions\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n preferLogicalAnd: \"Use logical AND (&&) instead of ternary with null/undefined\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n return {\n JSXExpressionContainer(node: TSESTree.JSXExpressionContainer) {\n const { expression } = node;\n\n if (expression.type !== AST_NODE_TYPES.ConditionalExpression) {\n return;\n }\n\n const { test, consequent, alternate } = expression;\n\n if (isNullOrUndefined(alternate)) {\n const testText = context.sourceCode.getText(test);\n const consequentText = context.sourceCode.getText(consequent);\n\n context.report({\n node: expression,\n messageId: \"preferLogicalAnd\",\n fix(fixer) {\n return fixer.replaceText(expression, `${testText} && (${consequentText})`);\n },\n });\n } else if (isNullOrUndefined(consequent)) {\n const testText = context.sourceCode.getText(test);\n const alternateText = context.sourceCode.getText(alternate);\n\n context.report({\n node: expression,\n messageId: \"preferLogicalAnd\",\n fix(fixer) {\n return fixer.replaceText(expression, `!${testText} && (${alternateText})`);\n },\n });\n }\n },\n };\n },\n});\n\nexport default jsxNoTernaryNull;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst jsxNoVariableInCallback = createRule({\n name: \"jsx-no-variable-in-callback\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow variable declarations inside callback functions within JSX\",\n },\n schema: [],\n messages: {\n noVariableInCallback:\n \"Variable declarations should not be inside callback functions within JSX. Extract the logic to a separate function outside the JSX.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n function isInsideJSX(node: TSESTree.Node): boolean {\n let current = node.parent;\n while (current) {\n if (current.type === AST_NODE_TYPES.JSXElement || current.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n current = current.parent;\n }\n return false;\n }\n\n function isCallbackInJSX(node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression): boolean {\n if (!node.parent) {\n return false;\n }\n\n if (!isInsideJSX(node)) {\n return false;\n }\n\n if (\n node.parent.type === AST_NODE_TYPES.CallExpression ||\n node.parent.type === AST_NODE_TYPES.JSXExpressionContainer\n ) {\n return true;\n }\n\n if (node.parent.type === AST_NODE_TYPES.ArrayExpression && node.parent.parent) {\n if (\n node.parent.parent.type === AST_NODE_TYPES.CallExpression ||\n node.parent.parent.type === AST_NODE_TYPES.JSXExpressionContainer\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n function checkFunctionBody(node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression) {\n if (!isCallbackInJSX(node)) {\n return;\n }\n\n const { body } = node;\n\n if (body.type !== AST_NODE_TYPES.BlockStatement) {\n return;\n }\n\n body.body.forEach((statement) => {\n if (statement.type === AST_NODE_TYPES.VariableDeclaration) {\n context.report({\n node: statement,\n messageId: \"noVariableInCallback\",\n });\n }\n });\n }\n\n return {\n ArrowFunctionExpression: checkFunctionBody,\n FunctionExpression: checkFunctionBody,\n };\n },\n});\n\nexport default jsxNoVariableInCallback;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst jsxRequireSuspense = createRule({\n name: \"jsx-require-suspense\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Require lazy-loaded components to be wrapped in Suspense\",\n },\n messages: {\n requireSuspense:\n \"Lazy component '{{ name }}' must be wrapped in <Suspense>. Add a Suspense boundary with a fallback prop.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n const lazyComponents = new Set<string>();\n\n const isInsideSuspense = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node | undefined = node.parent;\n\n while (current) {\n if (\n current.type === AST_NODE_TYPES.JSXElement &&\n current.openingElement.name.type === AST_NODE_TYPES.JSXIdentifier &&\n current.openingElement.name.name === \"Suspense\"\n ) {\n return true;\n }\n current = current.parent;\n }\n\n return false;\n };\n\n return {\n VariableDeclarator(node) {\n if (node.id.type === AST_NODE_TYPES.Identifier && node.init?.type === AST_NODE_TYPES.CallExpression) {\n const { callee } = node.init;\n\n const isLazyCall =\n (callee.type === AST_NODE_TYPES.Identifier && callee.name === \"lazy\") ||\n (callee.type === AST_NODE_TYPES.MemberExpression &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n callee.object.name === \"React\" &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === \"lazy\");\n\n if (isLazyCall) {\n lazyComponents.add(node.id.name);\n }\n }\n },\n JSXOpeningElement(node) {\n if (node.name.type === AST_NODE_TYPES.JSXIdentifier) {\n const componentName = node.name.name;\n\n if (lazyComponents.has(componentName) && !isInsideSuspense(node)) {\n context.report({\n node,\n messageId: \"requireSuspense\",\n data: {\n name: componentName,\n },\n });\n }\n }\n },\n };\n },\n});\n\nexport default jsxRequireSuspense;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst jsxSimpleProps = createRule({\n name: \"jsx-simple-props\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce JSX props to only contain strings, simple variables, or ReactNode elements\",\n },\n messages: {\n noComplexProp:\n \"JSX props should only contain strings, simple variables, or ReactNode elements. Extract complex expressions to a variable first.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n const allowedExpressionTypes = new Set([\n AST_NODE_TYPES.Identifier,\n AST_NODE_TYPES.Literal,\n AST_NODE_TYPES.JSXElement,\n AST_NODE_TYPES.JSXFragment,\n AST_NODE_TYPES.MemberExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n AST_NODE_TYPES.FunctionExpression,\n ]);\n\n return {\n JSXAttribute(node) {\n if (!node.value) {\n return;\n }\n\n if (node.value.type === AST_NODE_TYPES.Literal) {\n return;\n }\n\n if (node.value.type === AST_NODE_TYPES.JSXExpressionContainer) {\n const { expression } = node.value;\n\n if (expression.type === AST_NODE_TYPES.JSXEmptyExpression) {\n return;\n }\n\n if (!allowedExpressionTypes.has(expression.type)) {\n context.report({\n node: node.value,\n messageId: \"noComplexProp\",\n });\n }\n }\n },\n };\n },\n});\n\nexport default jsxSimpleProps;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../utils\";\n\nimport type { TSESLint, 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst TYPE_GROUP = {\n STRING: 1,\n HYPHENATED_STRING: 2,\n NUMBER_BOOLEAN_NULL: 3,\n EXPRESSION: 4,\n OBJECT_ARRAY: 5,\n FUNCTION: 6,\n JSX: 7,\n SHORTHAND: 8,\n} as const;\n\nconst EXPRESSION_TYPE_TO_GROUP = new Map<AST_NODE_TYPES, number>([\n [AST_NODE_TYPES.ObjectExpression, TYPE_GROUP.OBJECT_ARRAY],\n [AST_NODE_TYPES.ArrayExpression, TYPE_GROUP.OBJECT_ARRAY],\n [AST_NODE_TYPES.ArrowFunctionExpression, TYPE_GROUP.FUNCTION],\n [AST_NODE_TYPES.FunctionExpression, TYPE_GROUP.FUNCTION],\n [AST_NODE_TYPES.JSXElement, TYPE_GROUP.JSX],\n [AST_NODE_TYPES.JSXFragment, TYPE_GROUP.JSX],\n]);\n\nfunction isHyphenatedName(node: TSESTree.JSXAttribute): boolean {\n return node.name.type === AST_NODE_TYPES.JSXIdentifier && node.name.name.includes(\"-\");\n}\n\nfunction getStringGroup(node: TSESTree.JSXAttribute): number {\n return isHyphenatedName(node) ? TYPE_GROUP.HYPHENATED_STRING : TYPE_GROUP.STRING;\n}\n\nfunction getLiteralValueGroup(value: TSESTree.Literal[\"value\"]): number | null {\n if (typeof value === \"string\") {\n return null;\n }\n\n return TYPE_GROUP.NUMBER_BOOLEAN_NULL;\n}\n\nfunction getExpressionGroup(expression: TSESTree.Expression): number | null {\n if (expression.type === AST_NODE_TYPES.Literal) {\n return getLiteralValueGroup(expression.value);\n }\n\n if (expression.type === AST_NODE_TYPES.TemplateLiteral) {\n return null;\n }\n\n if (expression.type === AST_NODE_TYPES.Identifier && expression.name === \"undefined\") {\n return TYPE_GROUP.NUMBER_BOOLEAN_NULL;\n }\n\n return EXPRESSION_TYPE_TO_GROUP.get(expression.type) ?? TYPE_GROUP.EXPRESSION;\n}\n\nfunction getTypeGroup(node: TSESTree.JSXAttribute): number | null {\n if (node.value === null) {\n return TYPE_GROUP.SHORTHAND;\n }\n\n if (node.value.type === AST_NODE_TYPES.Literal) {\n if (typeof node.value.value === \"string\") {\n return getStringGroup(node);\n }\n\n return TYPE_GROUP.NUMBER_BOOLEAN_NULL;\n }\n\n if (node.value.type !== AST_NODE_TYPES.JSXExpressionContainer) {\n return null;\n }\n\n const { expression } = node.value;\n\n if (expression.type === AST_NODE_TYPES.JSXEmptyExpression) {\n return null;\n }\n\n const group = getExpressionGroup(expression);\n\n if (group === null) {\n return getStringGroup(node);\n }\n\n return group;\n}\n\nfunction hasUnsortedProps(attributes: TSESTree.JSXOpeningElement[\"attributes\"]): boolean {\n let lastGroup = 0;\n\n return attributes.some((attribute) => {\n if (attribute.type === AST_NODE_TYPES.JSXSpreadAttribute) {\n lastGroup = 0;\n\n return false;\n }\n\n const group = getTypeGroup(attribute);\n\n if (group === null) {\n return false;\n }\n\n if (group < lastGroup) {\n return true;\n }\n\n lastGroup = group;\n\n return false;\n });\n}\n\nfunction sortSegment(\n segment: TSESTree.JSXAttribute[],\n sourceCode: TSESLint.SourceCode,\n fixer: TSESLint.RuleFixer,\n): TSESLint.RuleFix[] {\n const sorted = [...segment].sort((a, b) => (getTypeGroup(a) ?? 0) - (getTypeGroup(b) ?? 0));\n const sortedTexts = sorted.map((attr) => sourceCode.getText(attr));\n\n return segment\n .map((attr, i) => ({ attr, sortedText: sortedTexts[i] }))\n .filter(({ attr, sortedText }) => sourceCode.getText(attr) !== sortedText)\n .map(({ attr, sortedText }) => fixer.replaceText(attr, sortedText));\n}\n\nfunction getSegments(attributes: TSESTree.JSXOpeningElement[\"attributes\"]): TSESTree.JSXAttribute[][] {\n const result: TSESTree.JSXAttribute[][] = [];\n let current: TSESTree.JSXAttribute[] = [];\n\n attributes.forEach((attr) => {\n if (attr.type === AST_NODE_TYPES.JSXSpreadAttribute) {\n if (current.length > 0) {\n result.push(current);\n current = [];\n }\n } else {\n current.push(attr);\n }\n });\n\n if (current.length > 0) {\n result.push(current);\n }\n\n return result;\n}\n\nconst jsxSortProps = createRule({\n name: \"jsx-sort-props\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce JSX props are sorted by value type: strings, hyphenated strings, numbers/booleans, expressions, objects/arrays, functions, JSX elements, then shorthand booleans\",\n },\n fixable: \"code\",\n messages: {\n unsortedProps:\n \"JSX props should be sorted by value type: strings, hyphenated strings, numbers/booleans/null, expressions, objects/arrays, functions, JSX elements, then shorthand booleans.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n const { sourceCode } = context;\n\n return {\n JSXOpeningElement(node) {\n if (!hasUnsortedProps(node.attributes)) {\n return;\n }\n\n context.report({\n node,\n messageId: \"unsortedProps\",\n fix(fixer) {\n return getSegments(node.attributes).flatMap((segment) => sortSegment(segment, sourceCode, fixer));\n },\n });\n },\n };\n },\n});\n\nexport default jsxSortProps;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst jsxSpreadPropsLast = createRule({\n name: \"jsx-spread-props-last\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce JSX spread attributes appear after all other props\",\n },\n messages: {\n spreadNotLast: \"JSX spread attributes must come after all other props.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n return {\n JSXOpeningElement(node) {\n const { attributes } = node;\n\n let lastNonSpreadIndex = -1;\n\n attributes.forEach((attribute, index) => {\n if (attribute.type !== AST_NODE_TYPES.JSXSpreadAttribute) {\n lastNonSpreadIndex = index;\n }\n });\n\n attributes.forEach((attribute, index) => {\n if (attribute.type === AST_NODE_TYPES.JSXSpreadAttribute && index < lastNonSpreadIndex) {\n context.report({\n node: attribute,\n messageId: \"spreadNotLast\",\n });\n }\n });\n },\n };\n },\n});\n\nexport default jsxSpreadPropsLast;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\ntype ProgramChild = TSESTree.ProgramStatement;\n\nfunction isImportDeclaration(node: TSESTree.Node): boolean {\n return node.type === AST_NODE_TYPES.ImportDeclaration;\n}\n\nfunction checkStatements(\n statements: readonly ProgramChild[] | readonly TSESTree.Statement[],\n context: Parameters<ReturnType<typeof createRule>[\"create\"]>[0],\n): void {\n const { sourceCode } = context;\n\n statements.forEach((current, index) => {\n const next = statements[index + 1];\n\n if (!next) {\n return;\n }\n\n if (!current.loc || !next.loc) {\n return;\n }\n\n if (isImportDeclaration(current) && isImportDeclaration(next)) {\n return;\n }\n\n const currentIsMultiline = current.loc.start.line !== current.loc.end.line;\n const nextIsMultiline = next.loc.start.line !== next.loc.end.line;\n const lineGap = next.loc.start.line - current.loc.end.line;\n\n if ((currentIsMultiline || nextIsMultiline) && lineGap < 2) {\n context.report({\n node: next,\n messageId: \"requireNewline\",\n fix(fixer) {\n const tokenBefore = sourceCode.getTokenBefore(next, {\n includeComments: true,\n });\n if (!tokenBefore) {\n return null;\n }\n return fixer.insertTextAfter(tokenBefore, \"\\n\");\n },\n });\n }\n });\n}\n\nconst newlineAfterMultilineBlock = createRule({\n name: \"newline-after-multiline-block\",\n meta: {\n type: \"layout\",\n docs: {\n description: \"Require a blank line after multi-line statements before the next statement\",\n },\n fixable: \"whitespace\",\n messages: {\n requireNewline: \"A blank line is required after a multi-line statement before the next statement\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Program(node) {\n checkStatements(node.body, context);\n },\n BlockStatement(node) {\n checkStatements(node.body, context);\n },\n };\n },\n});\n\nexport default newlineAfterMultilineBlock;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst newlineBeforeReturn = createRule({\n name: \"newline-before-return\",\n meta: {\n type: \"layout\",\n docs: {\n description: \"Require a blank line before return statements\",\n },\n fixable: \"whitespace\",\n messages: {\n requireNewline: \"A blank line is required before return statements\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { sourceCode } = context;\n\n function checkReturnStatement(node: TSESTree.ReturnStatement): void {\n const { parent } = node;\n\n if (!parent || parent.type !== AST_NODE_TYPES.BlockStatement) {\n return;\n }\n\n const { body: statements } = parent;\n const returnIndex = statements.indexOf(node);\n\n if (returnIndex <= 0) {\n return;\n }\n\n const previousStatement = statements[returnIndex - 1];\n\n if (!previousStatement.loc || !node.loc) {\n return;\n }\n\n const lineGap = node.loc.start.line - previousStatement.loc.end.line;\n\n if (lineGap < 2) {\n context.report({\n node,\n messageId: \"requireNewline\",\n fix(fixer) {\n const tokenBefore = sourceCode.getTokenBefore(node, {\n includeComments: true,\n });\n\n if (!tokenBefore) {\n return null;\n }\n\n return fixer.insertTextAfter(tokenBefore, \"\\n\");\n },\n });\n }\n }\n\n return {\n ReturnStatement: checkReturnStatement,\n };\n },\n});\n\nexport default newlineBeforeReturn;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noComplexInlineReturn = createRule({\n name: \"no-complex-inline-return\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow complex inline expressions in return statements - prefer extracting to a const first\",\n },\n messages: {\n noComplexInlineReturn:\n \"Avoid returning complex expressions directly. Extract to a const variable first for better readability.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const isComplexExpression = (node: TSESTree.Expression | null | undefined): boolean => {\n if (!node) return false;\n\n if (node.type === AST_NODE_TYPES.ConditionalExpression) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.LogicalExpression) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.NewExpression) {\n return true;\n }\n\n return false;\n };\n\n return {\n ReturnStatement(node) {\n if (node.argument && isComplexExpression(node.argument)) {\n context.report({\n node: node.argument,\n messageId: \"noComplexInlineReturn\",\n });\n }\n },\n };\n },\n});\n\nexport default noComplexInlineReturn;\n","import { AST_NODE_TYPES, 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noDirectDate = createRule({\n name: \"no-direct-date\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow direct usage of Date constructor and methods to enforce centralized date utilities\",\n },\n messages: {\n noNewDate: \"Avoid using 'new Date()'. Use a centralized date utility like dayjs instead.\",\n noDateNow: \"Avoid using 'Date.now()'. Use a centralized date utility like dayjs instead.\",\n noDateParse: \"Avoid using 'Date.parse()'. Use a centralized date utility like dayjs instead.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n NewExpression(node) {\n if (node.callee.type === AST_NODE_TYPES.Identifier && node.callee.name === \"Date\") {\n context.report({\n node,\n messageId: \"noNewDate\",\n });\n }\n },\n CallExpression(node) {\n if (\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n node.callee.object.type === AST_NODE_TYPES.Identifier &&\n node.callee.object.name === \"Date\" &&\n node.callee.property.type === AST_NODE_TYPES.Identifier\n ) {\n const methodName = node.callee.property.name;\n\n if (methodName === \"now\") {\n context.report({\n node,\n messageId: \"noDateNow\",\n });\n }\n\n if (methodName === \"parse\") {\n context.report({\n node,\n messageId: \"noDateParse\",\n });\n }\n }\n },\n };\n },\n});\n\nexport default noDirectDate;\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.replaceAll(\"-\", \"_\").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 { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noEnvFallback = createRule({\n name: \"no-env-fallback\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow fallback values for environment variables as they can be dangerous in production\",\n },\n messages: {\n noEnvFallback:\n \"Avoid using fallback values with process.env. Environment variables should fail explicitly when missing rather than silently using a default value.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const isProcessEnvAccess = (node: TSESTree.Node): boolean => {\n if (node.type !== AST_NODE_TYPES.MemberExpression) {\n return false;\n }\n\n const { object } = node;\n if (object.type !== AST_NODE_TYPES.MemberExpression) {\n return false;\n }\n\n const processNode = object.object;\n const envNode = object.property;\n\n return (\n processNode.type === AST_NODE_TYPES.Identifier &&\n processNode.name === \"process\" &&\n envNode.type === AST_NODE_TYPES.Identifier &&\n envNode.name === \"env\"\n );\n };\n\n return {\n LogicalExpression(node) {\n if ((node.operator === \"||\" || node.operator === \"??\") && isProcessEnvAccess(node.left)) {\n context.report({\n node,\n messageId: \"noEnvFallback\",\n });\n }\n },\n ConditionalExpression(node) {\n if (isProcessEnvAccess(node.test)) {\n context.report({\n node,\n messageId: \"noEnvFallback\",\n });\n }\n },\n };\n },\n});\n\nexport default noEnvFallback;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst GHOST_TAGS = new Set([\"div\", \"span\"]);\n\nfunction isKeyAttribute(attribute: TSESTree.JSXAttribute | TSESTree.JSXSpreadAttribute): boolean {\n return (\n attribute.type === AST_NODE_TYPES.JSXAttribute &&\n attribute.name.type === AST_NODE_TYPES.JSXIdentifier &&\n attribute.name.name === \"key\"\n );\n}\n\nconst noGhostWrapper = createRule({\n name: \"no-ghost-wrapper\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow bare <div> and <span> elements that have no meaningful attributes (Divitis / ghost wrappers)\",\n },\n schema: [],\n messages: {\n noGhostWrapper:\n \"Ghost <{{ tag }}> has no meaningful attributes. Use a Fragment (<>...</>), a semantic element (section, article, header, etc.), or add a meaningful attribute (className, role, data-*, ref, etc.). Note: 'key' alone does not count as meaningful.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n return {\n JSXOpeningElement(node: TSESTree.JSXOpeningElement) {\n if (node.name.type !== AST_NODE_TYPES.JSXIdentifier) {\n return;\n }\n\n const tagName = node.name.name;\n if (!GHOST_TAGS.has(tagName)) {\n return;\n }\n\n const meaningfulAttributes = node.attributes.filter((attribute) => !isKeyAttribute(attribute));\n\n if (meaningfulAttributes.length === 0) {\n context.report({\n node,\n messageId: \"noGhostWrapper\",\n data: { tag: tagName },\n });\n }\n },\n };\n },\n});\n\nexport default noGhostWrapper;\n","import path from \"path\";\n\nimport { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noHelperFunctionInHook = createRule({\n name: \"no-helper-function-in-hook\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow non-hook helper function definitions in hook files\",\n },\n messages: {\n noHelperFunction: \"Helper functions must not be defined in hook files. Extract to a separate utility file.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const basename = path.basename(context.filename);\n const isHookFile = basename.endsWith(\".hook.ts\") || basename.endsWith(\".hooks.ts\");\n\n if (!isHookFile) return {};\n\n function isAtProgramLevel(node: TSESTree.Node): boolean {\n const { parent } = node;\n\n if (parent === undefined) return false;\n if (parent.type === AST_NODE_TYPES.Program) return true;\n if (parent.type !== AST_NODE_TYPES.ExportNamedDeclaration) return false;\n\n return parent.parent?.type === AST_NODE_TYPES.Program;\n }\n\n return {\n FunctionDeclaration(node: TSESTree.FunctionDeclaration) {\n if (!isAtProgramLevel(node)) return;\n if (node.id !== null && node.id.name.startsWith(\"use\")) return;\n\n context.report({ node, messageId: \"noHelperFunction\" });\n },\n VariableDeclarator(node: TSESTree.VariableDeclarator) {\n if (node.parent.type !== AST_NODE_TYPES.VariableDeclaration) return;\n if (!isAtProgramLevel(node.parent)) return;\n\n if (\n node.init === null ||\n (node.init.type !== AST_NODE_TYPES.ArrowFunctionExpression &&\n node.init.type !== AST_NODE_TYPES.FunctionExpression)\n )\n return;\n\n if (node.id.type === AST_NODE_TYPES.Identifier && node.id.name.startsWith(\"use\")) return;\n\n context.report({ node, messageId: \"noHelperFunction\" });\n },\n };\n },\n});\n\nexport default noHelperFunctionInHook;\n","import path from \"path\";\n\nimport { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noHelperFunctionInTest = createRule({\n name: \"no-helper-function-in-test\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow helper function definitions in test files\",\n },\n messages: {\n noHelperFunction: \"Helper functions must not be defined in test files. Extract to a separate utility file.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const basename = path.basename(context.filename);\n const isTestFile = basename.endsWith(\".test.ts\") || basename.endsWith(\".test.tsx\");\n\n if (!isTestFile) return {};\n\n return {\n FunctionDeclaration(node: TSESTree.FunctionDeclaration) {\n if (node.parent.type === AST_NODE_TYPES.Program) {\n context.report({ node, messageId: \"noHelperFunction\" });\n }\n },\n VariableDeclarator(node: TSESTree.VariableDeclarator) {\n if (\n node.parent.type === AST_NODE_TYPES.VariableDeclaration &&\n node.parent.parent.type === AST_NODE_TYPES.Program &&\n node.init !== null &&\n (node.init.type === AST_NODE_TYPES.ArrowFunctionExpression ||\n node.init.type === AST_NODE_TYPES.FunctionExpression)\n ) {\n context.report({ node, messageId: \"noHelperFunction\" });\n }\n },\n };\n },\n});\n\nexport default noHelperFunctionInTest;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noInlineDefaultExport = createRule({\n name: \"no-inline-default-export\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow inline exports. Prefer declaring first, then exporting separately.\",\n },\n messages: {\n noInlineDefaultExport:\n \"Avoid inline default export. Declare the {{type}} first, then export it separately: `export default {{name}};`\",\n noAnonymousDefaultExport:\n \"Avoid anonymous default export. Declare a named {{type}} first, then export it separately.\",\n noInlineNamedExport:\n \"Avoid inline named export. Declare the {{type}} first, then export it separately: `export { {{name}} };`\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n ExportDefaultDeclaration(node: TSESTree.ExportDefaultDeclaration) {\n const { declaration } = node;\n\n if (declaration.type === AST_NODE_TYPES.FunctionDeclaration) {\n if (declaration.id) {\n context.report({\n node,\n messageId: \"noInlineDefaultExport\",\n data: { type: \"function\", name: declaration.id.name },\n });\n } else {\n context.report({\n node,\n messageId: \"noAnonymousDefaultExport\",\n data: { type: \"function\" },\n });\n }\n }\n\n if (declaration.type === AST_NODE_TYPES.ClassDeclaration) {\n if (declaration.id) {\n context.report({\n node,\n messageId: \"noInlineDefaultExport\",\n data: { type: \"class\", name: declaration.id.name },\n });\n } else {\n context.report({\n node,\n messageId: \"noAnonymousDefaultExport\",\n data: { type: \"class\" },\n });\n }\n }\n\n if (\n declaration.type === AST_NODE_TYPES.ArrowFunctionExpression ||\n declaration.type === AST_NODE_TYPES.FunctionExpression\n ) {\n context.report({\n node,\n messageId: \"noAnonymousDefaultExport\",\n data: { type: \"function\" },\n });\n }\n },\n\n ExportNamedDeclaration(node: TSESTree.ExportNamedDeclaration) {\n const { declaration } = node;\n\n if (!declaration) {\n return;\n }\n\n if (declaration.type === AST_NODE_TYPES.FunctionDeclaration && declaration.id) {\n context.report({\n node,\n messageId: \"noInlineNamedExport\",\n data: { type: \"function\", name: declaration.id.name },\n });\n }\n\n if (declaration.type === AST_NODE_TYPES.ClassDeclaration && declaration.id) {\n context.report({\n node,\n messageId: \"noInlineNamedExport\",\n data: { type: \"class\", name: declaration.id.name },\n });\n }\n },\n };\n },\n});\n\nexport default noInlineDefaultExport;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isObjectOrArray(node: TSESTree.Node): boolean {\n return (\n node.type === AST_NODE_TYPES.ObjectExpression ||\n node.type === AST_NODE_TYPES.ArrayExpression ||\n node.type === AST_NODE_TYPES.TSAsExpression\n );\n}\n\nfunction getInnerExpression(node: TSESTree.Node): TSESTree.Node {\n if (node.type === AST_NODE_TYPES.TSAsExpression) {\n return getInnerExpression(node.expression);\n }\n return node;\n}\n\nfunction isNestedStructure(node: TSESTree.Node): boolean {\n const inner = getInnerExpression(node);\n return inner.type === AST_NODE_TYPES.ObjectExpression || inner.type === AST_NODE_TYPES.ArrayExpression;\n}\n\nfunction containsNestedStructure(node: TSESTree.ObjectExpression | TSESTree.ArrayExpression): boolean {\n if (node.type === AST_NODE_TYPES.ObjectExpression) {\n return node.properties.some((prop) => {\n if (prop.type !== AST_NODE_TYPES.Property) return false;\n return isNestedStructure(prop.value);\n });\n }\n return node.elements.some((el) => {\n if (el === null) return false;\n return isNestedStructure(el);\n });\n}\n\nconst noInlineNestedObject = createRule({\n name: \"no-inline-nested-object\",\n meta: {\n type: \"layout\",\n docs: {\n description:\n \"Require object or array values that contain further nested objects or arrays to span multiple lines\",\n },\n fixable: \"whitespace\",\n messages: {\n requireMultiline: \"Inline collections containing nested objects or arrays should span multiple lines\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { sourceCode } = context;\n\n return {\n Property(node) {\n if (!node.value || !isObjectOrArray(node.value)) {\n return;\n }\n\n const valueNode = getInnerExpression(node.value);\n\n if (valueNode.type !== AST_NODE_TYPES.ObjectExpression && valueNode.type !== AST_NODE_TYPES.ArrayExpression) {\n return;\n }\n\n if (!valueNode.loc) {\n return;\n }\n\n const isMultiline = valueNode.loc.start.line !== valueNode.loc.end.line;\n if (isMultiline) {\n return;\n }\n\n if (!containsNestedStructure(valueNode)) {\n return;\n }\n\n const elements = valueNode.type === AST_NODE_TYPES.ObjectExpression ? valueNode.properties : valueNode.elements;\n\n context.report({\n node: valueNode,\n messageId: \"requireMultiline\",\n fix(fixer) {\n const openBrace = sourceCode.getFirstToken(valueNode);\n const closeBrace = sourceCode.getLastToken(valueNode);\n\n if (!openBrace || !closeBrace) {\n return null;\n }\n\n const indent = \" \".repeat(node.loc?.start.column ?? 0);\n const innerIndent = `${indent} `;\n\n const elementTexts = elements\n .filter((el): el is NonNullable<typeof el> => el !== null)\n .map((el) => sourceCode.getText(el));\n\n const isObject = valueNode.type === AST_NODE_TYPES.ObjectExpression;\n const openChar = isObject ? \"{\" : \"[\";\n const closeChar = isObject ? \"}\" : \"]\";\n\n const formattedElements = elementTexts.map((text) => `${innerIndent}${text},`).join(\"\\n\");\n\n const newContent = `${openChar}\\n${formattedElements}\\n${indent}${closeChar}`;\n\n return fixer.replaceText(valueNode, newContent);\n },\n });\n },\n };\n },\n});\n\nexport default noInlineNestedObject;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst isShorthandProperty = (property: TSESTree.ObjectLiteralElement): boolean => {\n if (property.type === AST_NODE_TYPES.SpreadElement) {\n return true;\n }\n\n if (property.type !== AST_NODE_TYPES.Property) {\n return false;\n }\n\n return property.shorthand;\n};\n\nconst noInlineReturnProperties = createRule({\n name: \"no-inline-return-properties\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Require return object properties to use shorthand notation by extracting non-shorthand values to const variables\",\n },\n messages: {\n noInlineProperty:\n \"Property '{{ name }}' should use shorthand notation. Extract the value to a const variable before the return statement.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n ReturnStatement(node) {\n if (!node.argument || node.argument.type !== AST_NODE_TYPES.ObjectExpression) {\n return;\n }\n\n node.argument.properties.forEach((property) => {\n if (isShorthandProperty(property)) {\n return;\n }\n\n if (property.type !== AST_NODE_TYPES.Property) {\n return;\n }\n\n let keyName: string | null = null;\n\n if (property.key.type === AST_NODE_TYPES.Identifier) {\n keyName = property.key.name;\n } else if (property.key.type === AST_NODE_TYPES.Literal) {\n keyName = String(property.key.value);\n }\n\n context.report({\n node: property,\n messageId: \"noInlineProperty\",\n data: { name: keyName ?? \"unknown\" },\n });\n });\n },\n };\n },\n});\n\nexport default noInlineReturnProperties;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst isInlineTypeSpecifier = (specifier: TSESTree.ImportClause): specifier is TSESTree.ImportSpecifier =>\n specifier.type === AST_NODE_TYPES.ImportSpecifier && specifier.importKind === \"type\";\n\nconst noInlineTypeImport = createRule({\n name: \"no-inline-type-import\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Disallow inline 'type' markers on import specifiers. Use 'import type' or split into a separate type-only import statement.\",\n },\n fixable: \"code\",\n messages: {\n noInlineTypeImport:\n \"Avoid inline 'type' markers on import specifiers. Hoist to 'import type' or split into a separate type-only import statement.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n ImportDeclaration(node: TSESTree.ImportDeclaration) {\n const inlineTypeSpecifiers = node.specifiers.filter(isInlineTypeSpecifier);\n\n if (inlineTypeSpecifiers.length === 0) {\n return;\n }\n\n context.report({\n node,\n messageId: \"noInlineTypeImport\",\n fix(fixer) {\n if (node.importKind === \"type\") {\n return inlineTypeSpecifiers.map((specifier) =>\n fixer.removeRange([specifier.range[0], specifier.imported.range[0]]),\n );\n }\n\n const sourceText = context.sourceCode.getText(node.source);\n const fileText = context.sourceCode.text;\n\n const typeSpecifierTexts = inlineTypeSpecifiers.map((specifier) =>\n fileText.slice(specifier.imported.range[0], specifier.range[1]),\n );\n const typeImport = `import type { ${typeSpecifierTexts.join(\", \")} } from ${sourceText};`;\n\n const valueSpecifiers = node.specifiers.filter(\n (specifier) => !(specifier.type === AST_NODE_TYPES.ImportSpecifier && specifier.importKind === \"type\"),\n );\n\n if (valueSpecifiers.length === 0) {\n return fixer.replaceText(node, typeImport);\n }\n\n const parts: string[] = [];\n const namedValueSpecifiers: TSESTree.ImportSpecifier[] = [];\n\n for (const specifier of valueSpecifiers) {\n if (specifier.type === AST_NODE_TYPES.ImportDefaultSpecifier) {\n parts.push(specifier.local.name);\n } else if (specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier) {\n parts.push(`* as ${specifier.local.name}`);\n } else if (specifier.type === AST_NODE_TYPES.ImportSpecifier) {\n namedValueSpecifiers.push(specifier);\n }\n }\n\n if (namedValueSpecifiers.length > 0) {\n const namedTexts = namedValueSpecifiers.map((specifier) => context.sourceCode.getText(specifier));\n parts.push(`{ ${namedTexts.join(\", \")} }`);\n }\n\n const valueImport = `import ${parts.join(\", \")} from ${sourceText};`;\n return fixer.replaceText(node, `${valueImport}\\n${typeImport}`);\n },\n });\n },\n };\n },\n});\n\nexport default noInlineTypeImport;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst KEYBOARD_ROWS = [\"qwertyuiop\", \"asdfghjkl\", \"zxcvbnm\", \"1234567890\"];\n\nconst MIN_LENGTH = 3;\nconst MIN_SEQUENCE_LENGTH = 4;\n\nconst hasRepeatedChars = (name: string): boolean =>\n name.split(\"\").some((char, index) => {\n if (index > name.length - 3) {\n return false;\n }\n return char === name[index + 1] && char === name[index + 2];\n });\n\nconst hasKeyboardSequence = (name: string): boolean => {\n const lowerName = name.toLowerCase();\n if (lowerName.length < MIN_SEQUENCE_LENGTH) {\n return false;\n }\n\n return KEYBOARD_ROWS.some((row) => {\n const positions = Array.from({ length: row.length - MIN_SEQUENCE_LENGTH + 1 }, (_, i) => i);\n return positions.some((start) => {\n const sequence = row.slice(start, start + MIN_SEQUENCE_LENGTH);\n const reverseSequence = sequence.split(\"\").reverse().join(\"\");\n return lowerName.includes(sequence) || lowerName.includes(reverseSequence);\n });\n });\n};\n\nconst isLazyIdentifier = (name: string): boolean => {\n if (name.length < MIN_LENGTH) {\n return false;\n }\n\n if (name.startsWith(\"_\")) {\n return false;\n }\n\n if (hasRepeatedChars(name)) {\n return true;\n }\n\n if (hasKeyboardSequence(name)) {\n return true;\n }\n\n return false;\n};\n\nconst noLazyIdentifiers = createRule({\n name: \"no-lazy-identifiers\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow lazy, meaningless variable names that hurt code readability\",\n },\n messages: {\n noLazyIdentifier: \"Avoid lazy identifier '{{name}}'. Use a descriptive name that clearly indicates the purpose.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const checkIdentifier = (node: TSESTree.Identifier) => {\n const { name } = node;\n\n if (!isLazyIdentifier(name)) {\n return;\n }\n\n context.report({\n node,\n messageId: \"noLazyIdentifier\",\n data: { name },\n });\n };\n\n const checkPattern = (pattern: TSESTree.Node) => {\n if (pattern.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(pattern);\n } else if (pattern.type === AST_NODE_TYPES.ObjectPattern) {\n pattern.properties.forEach((prop) => {\n if (prop.type === AST_NODE_TYPES.Property && prop.value.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(prop.value);\n } else if (prop.type === AST_NODE_TYPES.RestElement && prop.argument.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(prop.argument);\n }\n });\n } else if (pattern.type === AST_NODE_TYPES.ArrayPattern) {\n pattern.elements.forEach((element) => {\n if (element?.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(element);\n } else if (\n element?.type === AST_NODE_TYPES.RestElement &&\n element.argument.type === AST_NODE_TYPES.Identifier\n ) {\n checkIdentifier(element.argument);\n }\n });\n } else if (pattern.type === AST_NODE_TYPES.AssignmentPattern && pattern.left.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(pattern.left);\n } else if (pattern.type === AST_NODE_TYPES.RestElement && pattern.argument.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(pattern.argument);\n }\n };\n\n return {\n VariableDeclarator(node) {\n checkPattern(node.id);\n },\n FunctionDeclaration(node) {\n if (node.id) {\n checkIdentifier(node.id);\n }\n node.params.forEach((param) => checkPattern(param));\n },\n FunctionExpression(node) {\n if (node.id) {\n checkIdentifier(node.id);\n }\n node.params.forEach((param) => checkPattern(param));\n },\n ArrowFunctionExpression(node) {\n node.params.forEach((param) => checkPattern(param));\n },\n CatchClause(node) {\n if (node.param) {\n checkPattern(node.param);\n }\n },\n ClassDeclaration(node) {\n if (node.id) {\n checkIdentifier(node.id);\n }\n },\n TSTypeAliasDeclaration(node) {\n checkIdentifier(node.id);\n },\n TSInterfaceDeclaration(node) {\n checkIdentifier(node.id);\n },\n };\n },\n});\n\nexport default noLazyIdentifiers;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noLogicInParams = createRule({\n name: \"no-logic-in-params\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow logic or conditions in function parameters - extract to a const variable first\",\n },\n messages: {\n noLogicInParams:\n \"Avoid logic or conditions in function parameters. Extract to a const variable first for better readability.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const isComplexExpression = (node: TSESTree.Expression | TSESTree.SpreadElement): boolean => {\n if (node.type === AST_NODE_TYPES.SpreadElement) {\n return false;\n }\n\n if (node.type === AST_NODE_TYPES.ConditionalExpression) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.LogicalExpression) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.BinaryExpression) {\n const logicalOperators = [\"==\", \"===\", \"!=\", \"!==\", \"<\", \">\", \"<=\", \">=\", \"in\", \"instanceof\"];\n return logicalOperators.includes(node.operator);\n }\n\n if (node.type === AST_NODE_TYPES.UnaryExpression) {\n return node.operator === \"!\";\n }\n\n return false;\n };\n\n const checkArguments = (args: TSESTree.CallExpressionArgument[]): void => {\n args.forEach((arg) => {\n if (isComplexExpression(arg)) {\n context.report({\n node: arg,\n messageId: \"noLogicInParams\",\n });\n }\n\n if (arg.type === AST_NODE_TYPES.ArrayExpression) {\n arg.elements.forEach((element) => {\n if (element && isComplexExpression(element)) {\n context.report({\n node: element,\n messageId: \"noLogicInParams\",\n });\n }\n });\n }\n });\n };\n\n return {\n CallExpression(node) {\n checkArguments(node.arguments);\n },\n NewExpression(node) {\n checkArguments(node.arguments);\n },\n };\n },\n});\n\nexport default noLogicInParams;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst SCREAMING_SNAKE_CASE_REGEX = /^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$/;\n\nconst isAsConstAssertion = (node: TSESTree.Expression): boolean =>\n node.type === AST_NODE_TYPES.TSAsExpression &&\n node.typeAnnotation.type === AST_NODE_TYPES.TSTypeReference &&\n node.typeAnnotation.typeName.type === AST_NODE_TYPES.Identifier &&\n node.typeAnnotation.typeName.name === \"const\";\n\nconst isStaticValue = (init: TSESTree.Expression): boolean => {\n if (isAsConstAssertion(init)) {\n return true;\n }\n\n if (init.type === AST_NODE_TYPES.Literal) {\n return true;\n }\n\n if (init.type === AST_NODE_TYPES.UnaryExpression && init.argument.type === AST_NODE_TYPES.Literal) {\n return true;\n }\n\n if (init.type === AST_NODE_TYPES.TemplateLiteral && init.expressions.length === 0) {\n return true;\n }\n\n if (init.type === AST_NODE_TYPES.ArrayExpression) {\n return init.elements.every((el) => el !== null && el.type !== AST_NODE_TYPES.SpreadElement && isStaticValue(el));\n }\n\n if (init.type === AST_NODE_TYPES.ObjectExpression) {\n return init.properties.every(\n (prop) => prop.type === AST_NODE_TYPES.Property && isStaticValue(prop.value as TSESTree.Expression),\n );\n }\n\n return false;\n};\n\nconst isGlobalScope = (node: TSESTree.VariableDeclaration): boolean => {\n const { parent } = node;\n\n if (parent.type === AST_NODE_TYPES.Program) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ExportNamedDeclaration && parent.parent?.type === AST_NODE_TYPES.Program) {\n return true;\n }\n\n return false;\n};\n\nconst noMisleadingConstantCase = createRule({\n name: \"no-misleading-constant-case\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow SCREAMING_SNAKE_CASE for non-constant or non-static values\",\n },\n messages: {\n mutableScreamingCase:\n \"Variable '{{ name }}' uses SCREAMING_SNAKE_CASE but is declared with '{{ kind }}'. Use camelCase for mutable bindings.\",\n dynamicScreamingCase:\n \"Constant '{{ name }}' uses SCREAMING_SNAKE_CASE but its value is not a static primitive. Use camelCase for dynamic or computed values.\",\n localScreamingCase:\n \"Local variable '{{ name }}' should use camelCase. SCREAMING_SNAKE_CASE is reserved for global constants.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n VariableDeclaration(node) {\n node.declarations.forEach((declarator) => {\n if (declarator.id.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const { name } = declarator.id;\n\n if (!SCREAMING_SNAKE_CASE_REGEX.test(name)) {\n return;\n }\n\n if (node.kind === \"let\" || node.kind === \"var\") {\n context.report({\n node: declarator.id,\n messageId: \"mutableScreamingCase\",\n data: { name, kind: node.kind },\n });\n\n return;\n }\n\n if (!isGlobalScope(node)) {\n context.report({\n node: declarator.id,\n messageId: \"localScreamingCase\",\n data: { name },\n });\n\n return;\n }\n\n if (!declarator.init) {\n return;\n }\n\n if (!isStaticValue(declarator.init)) {\n context.report({\n node: declarator.id,\n messageId: \"dynamicScreamingCase\",\n data: { name },\n });\n }\n });\n },\n };\n },\n});\n\nexport default noMisleadingConstantCase;\n","import { AST_NODE_TYPES, 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noNestedInterfaceDeclaration = createRule({\n name: \"no-nested-interface-declaration\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow inline object type literals in interface or type properties\",\n },\n fixable: undefined,\n schema: [],\n messages: {\n noNestedInterface: \"Extract nested object type into a separate interface or type declaration\",\n },\n },\n defaultOptions: [],\n create(context) {\n return {\n TSPropertySignature(node) {\n if (!node.typeAnnotation) {\n return;\n }\n\n const { typeAnnotation } = node.typeAnnotation;\n\n if (typeAnnotation.type === AST_NODE_TYPES.TSTypeLiteral) {\n context.report({\n node: typeAnnotation,\n messageId: \"noNestedInterface\",\n });\n\n return;\n }\n\n if (typeAnnotation.type === AST_NODE_TYPES.TSArrayType) {\n if (typeAnnotation.elementType.type === AST_NODE_TYPES.TSTypeLiteral) {\n context.report({\n node: typeAnnotation.elementType,\n messageId: \"noNestedInterface\",\n });\n }\n\n return;\n }\n\n if (typeAnnotation.type === AST_NODE_TYPES.TSTypeReference && typeAnnotation.typeArguments) {\n typeAnnotation.typeArguments.params.forEach((param) => {\n if (param.type === AST_NODE_TYPES.TSTypeLiteral) {\n context.report({\n node: param,\n messageId: \"noNestedInterface\",\n });\n }\n });\n }\n },\n };\n },\n});\n\nexport default noNestedInterfaceDeclaration;\n","import { AST_NODE_TYPES, 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noNestedTernary = createRule({\n name: \"no-nested-ternary\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow nested ternary expressions\",\n },\n messages: {\n noNestedTernary: \"Nested ternary expressions are not allowed. Use a function with early returns instead.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n ConditionalExpression(node) {\n const { consequent, alternate } = node;\n\n if (consequent.type === AST_NODE_TYPES.ConditionalExpression) {\n context.report({\n node: consequent,\n messageId: \"noNestedTernary\",\n });\n }\n\n if (alternate.type === AST_NODE_TYPES.ConditionalExpression) {\n context.report({\n node: alternate,\n messageId: \"noNestedTernary\",\n });\n }\n },\n };\n },\n});\n\nexport default noNestedTernary;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isFragmentName(name: TSESTree.JSXTagNameExpression): boolean {\n if (name.type === AST_NODE_TYPES.JSXIdentifier && name.name === \"Fragment\") {\n return true;\n }\n\n if (\n name.type === AST_NODE_TYPES.JSXMemberExpression &&\n name.object.type === AST_NODE_TYPES.JSXIdentifier &&\n name.object.name === \"React\" &&\n name.property.type === AST_NODE_TYPES.JSXIdentifier &&\n name.property.name === \"Fragment\"\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction hasKeyAttribute(attributes: ReadonlyArray<TSESTree.JSXAttribute | TSESTree.JSXSpreadAttribute>): boolean {\n return attributes.some(\n (attribute) =>\n attribute.type === AST_NODE_TYPES.JSXAttribute &&\n attribute.name.type === AST_NODE_TYPES.JSXIdentifier &&\n attribute.name.name === \"key\",\n );\n}\n\nfunction countMeaningfulChildren(children: ReadonlyArray<TSESTree.JSXChild>): number {\n return children.filter((child) => {\n if (child.type === AST_NODE_TYPES.JSXText) {\n return child.value.trim() !== \"\";\n }\n return true;\n }).length;\n}\n\nconst noRedundantFragment = createRule({\n name: \"no-redundant-fragment\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow Fragments that wrap zero or one child (unless a key prop is needed)\",\n },\n schema: [],\n messages: {\n redundantFragment:\n \"Fragment is redundant when wrapping {{ count }} child. Remove the Fragment or replace it with the child directly.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n return {\n JSXFragment(node: TSESTree.JSXFragment) {\n const count = countMeaningfulChildren(node.children);\n if (count <= 1) {\n context.report({\n node,\n messageId: \"redundantFragment\",\n data: { count: String(count) },\n });\n }\n },\n JSXElement(node: TSESTree.JSXElement) {\n const opening = node.openingElement;\n if (!isFragmentName(opening.name)) {\n return;\n }\n\n if (hasKeyAttribute(opening.attributes)) {\n return;\n }\n\n const count = countMeaningfulChildren(node.children);\n if (count <= 1) {\n context.report({\n node,\n messageId: \"redundantFragment\",\n data: { count: String(count) },\n });\n }\n },\n };\n },\n});\n\nexport default noRedundantFragment;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noRelativeImports = createRule({\n name: \"no-relative-imports\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow relative imports with parent directory traversal (../) - use absolute imports instead\",\n },\n messages: {\n noRelativeImport:\n \"Avoid relative imports with '../'. Use absolute imports (e.g., 'src/components/...') for better maintainability.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const checkImportPath = (source: string, node: TSESTree.Node): void => {\n if (source.startsWith(\"../\")) {\n context.report({\n node,\n messageId: \"noRelativeImport\",\n });\n }\n };\n\n return {\n ImportDeclaration(node) {\n if (node.source.type === AST_NODE_TYPES.Literal && typeof node.source.value === \"string\") {\n checkImportPath(node.source.value, node);\n }\n },\n ImportExpression(node) {\n if (node.source.type === AST_NODE_TYPES.Literal && typeof node.source.value === \"string\") {\n checkImportPath(node.source.value, node);\n }\n },\n ExportNamedDeclaration(node) {\n if (node.source?.type === AST_NODE_TYPES.Literal && typeof node.source.value === \"string\") {\n checkImportPath(node.source.value, node);\n }\n },\n ExportAllDeclaration(node) {\n if (node.source.type === AST_NODE_TYPES.Literal && typeof node.source.value === \"string\") {\n checkImportPath(node.source.value, node);\n }\n },\n };\n },\n});\n\nexport default noRelativeImports;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst ALLOWED_IN_FOR_LOOPS = new Set([\"i\", \"j\", \"k\", \"n\"]);\nconst ALLOWED_UNDERSCORE = \"_\";\n\nconst isForLoopInit = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node | undefined = node;\n\n while (current) {\n const parentNode: TSESTree.Node | undefined = current.parent;\n\n if (!parentNode) {\n return false;\n }\n\n if (parentNode.type === AST_NODE_TYPES.ForStatement) {\n const { init } = parentNode;\n if (init && init === current) {\n return true;\n }\n }\n\n current = parentNode;\n }\n\n return false;\n};\n\nconst isAllowedInContext = (name: string, node: TSESTree.Node): boolean => {\n if (name === ALLOWED_UNDERSCORE) {\n return true;\n }\n\n if (ALLOWED_IN_FOR_LOOPS.has(name) && isForLoopInit(node)) {\n return true;\n }\n\n return false;\n};\n\nconst noSingleCharVariables = createRule({\n name: \"no-single-char-variables\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow single character variable and parameter names for better code readability\",\n },\n messages: {\n noSingleChar:\n \"Avoid single character variable name '{{name}}'. Use a descriptive name that clearly indicates the purpose.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const checkIdentifier = (node: TSESTree.Identifier, declarationNode: TSESTree.Node) => {\n const { name } = node;\n\n if (name.length !== 1) {\n return;\n }\n\n if (isAllowedInContext(name, declarationNode)) {\n return;\n }\n\n context.report({\n node,\n messageId: \"noSingleChar\",\n data: { name },\n });\n };\n\n const checkPattern = (pattern: TSESTree.Node, declarationNode: TSESTree.Node) => {\n if (pattern.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(pattern, declarationNode);\n } else if (pattern.type === AST_NODE_TYPES.ObjectPattern) {\n pattern.properties.forEach((prop) => {\n if (prop.type === AST_NODE_TYPES.Property && prop.value.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(prop.value, declarationNode);\n } else if (prop.type === AST_NODE_TYPES.RestElement && prop.argument.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(prop.argument, declarationNode);\n }\n });\n } else if (pattern.type === AST_NODE_TYPES.ArrayPattern) {\n pattern.elements.forEach((element) => {\n if (element?.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(element, declarationNode);\n } else if (\n element?.type === AST_NODE_TYPES.RestElement &&\n element.argument.type === AST_NODE_TYPES.Identifier\n ) {\n checkIdentifier(element.argument, declarationNode);\n }\n });\n } else if (pattern.type === AST_NODE_TYPES.AssignmentPattern && pattern.left.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(pattern.left, declarationNode);\n } else if (pattern.type === AST_NODE_TYPES.RestElement && pattern.argument.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(pattern.argument, declarationNode);\n }\n };\n\n return {\n VariableDeclarator(node) {\n checkPattern(node.id, node);\n },\n FunctionDeclaration(node) {\n if (node.id) {\n checkIdentifier(node.id, node);\n }\n node.params.forEach((param) => checkPattern(param, node));\n },\n FunctionExpression(node) {\n if (node.id) {\n checkIdentifier(node.id, node);\n }\n node.params.forEach((param) => checkPattern(param, node));\n },\n ArrowFunctionExpression(node) {\n node.params.forEach((param) => checkPattern(param, node));\n },\n CatchClause(node) {\n if (node.param) {\n checkPattern(node.param, node);\n }\n },\n };\n },\n});\n\nexport default noSingleCharVariables;\n","import { AST_NODE_TYPES, 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst preferAsyncAwait = createRule({\n name: \"prefer-async-await\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce async/await over .then() promise chains for better readability and error handling\",\n },\n messages: {\n preferAsyncAwait:\n \"Prefer async/await over .then() chains. Async/await is more readable and provides better error handling with try/catch.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n CallExpression(node) {\n if (\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n node.callee.property.type === AST_NODE_TYPES.Identifier &&\n node.callee.property.name === \"then\"\n ) {\n context.report({\n node: node.callee.property,\n messageId: \"preferAsyncAwait\",\n });\n }\n },\n };\n },\n});\n\nexport default preferAsyncAwait;\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.replaceAll(\"-\", \"_\").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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst isTsFile = (filename: string): boolean => filename.endsWith(\".ts\") && !filename.endsWith(\".d.ts\");\n\nconst isCallbackContext = (node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression): boolean => {\n const { parent } = node;\n\n if (!parent) {\n return false;\n }\n\n if (parent.type === AST_NODE_TYPES.CallExpression && parent.arguments.includes(node)) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.NewExpression && parent.arguments.includes(node)) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ReturnStatement) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.Property) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ArrayExpression) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ConditionalExpression) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.LogicalExpression) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.AssignmentExpression && parent.left !== node) {\n return true;\n }\n\n return false;\n};\n\nconst preferFunctionDeclaration = createRule({\n name: \"prefer-function-declaration\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce function declarations over arrow functions assigned to variables in .ts files for better readability and hoisting\",\n },\n messages: {\n preferDeclaration:\n \"Use function declaration instead of arrow function. Replace 'const {{name}} = () => ...' with 'function {{name}}() ...'\",\n preferDeclarationExpr:\n \"Use function declaration instead of function expression. Replace 'const {{name}} = function() ...' with 'function {{name}}() ...'\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n\n if (!isTsFile(filename)) {\n return {};\n }\n\n return {\n VariableDeclarator(node) {\n if (node.id.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const { init } = node;\n\n if (!init) {\n return;\n }\n\n if (init.type === AST_NODE_TYPES.ArrowFunctionExpression) {\n if (isCallbackContext(init)) {\n return;\n }\n\n context.report({\n node: init,\n messageId: \"preferDeclaration\",\n data: { name: node.id.name },\n });\n }\n\n if (init.type === AST_NODE_TYPES.FunctionExpression) {\n if (isCallbackContext(init)) {\n return;\n }\n\n context.report({\n node: init,\n messageId: \"preferDeclarationExpr\",\n data: { name: node.id.name },\n });\n }\n },\n };\n },\n});\n\nexport default preferFunctionDeclaration;\n","import { AST_NODE_TYPES, 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst preferGuardClause = createRule({\n name: \"prefer-guard-clause\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce guard clause pattern instead of nested if statements\",\n },\n messages: {\n preferGuardClause: \"Avoid nested if statements. Use guard clauses (early returns) instead.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n IfStatement(node) {\n const { consequent } = node;\n\n if (consequent.type === AST_NODE_TYPES.BlockStatement) {\n const hasNestedIf = consequent.body.some((statement) => statement.type === AST_NODE_TYPES.IfStatement);\n\n if (hasNestedIf && consequent.body.length === 1) {\n context.report({\n node,\n messageId: \"preferGuardClause\",\n });\n }\n }\n\n if (consequent.type === AST_NODE_TYPES.IfStatement) {\n context.report({\n node,\n messageId: \"preferGuardClause\",\n });\n }\n },\n };\n },\n});\n\nexport default preferGuardClause;\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.replaceAll(\"-\", \"_\").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 isInTypeContext(node: TSESTree.Node | undefined): boolean {\n let current = node;\n while (current) {\n switch (current.type) {\n case AST_NODE_TYPES.TSTypeReference:\n case AST_NODE_TYPES.TSTypeAnnotation:\n case AST_NODE_TYPES.TSTypeParameterInstantiation:\n case AST_NODE_TYPES.TSInterfaceHeritage:\n case AST_NODE_TYPES.TSClassImplements:\n case AST_NODE_TYPES.TSTypeQuery:\n case AST_NODE_TYPES.TSTypeAssertion:\n case AST_NODE_TYPES.TSAsExpression:\n case AST_NODE_TYPES.TSSatisfiesExpression:\n case AST_NODE_TYPES.TSTypeAliasDeclaration:\n case AST_NODE_TYPES.TSInterfaceDeclaration:\n case AST_NODE_TYPES.TSTypeParameter:\n case AST_NODE_TYPES.TSQualifiedName:\n return true;\n\n case AST_NODE_TYPES.MemberExpression:\n case AST_NODE_TYPES.Identifier:\n current = current.parent;\n break;\n\n default:\n return false;\n }\n }\n return false;\n }\n\n function isUsedAsValue(localName: string, scope: ReturnType<typeof context.sourceCode.getScope>): boolean {\n const variable = scope.set.get(localName);\n if (!variable) {\n return false;\n }\n\n if (variable.references.length === 0) {\n return true;\n }\n\n return variable.references.some((ref) => {\n if (ref.isWrite()) {\n return false;\n }\n\n const { identifier } = ref;\n const { parent } = identifier;\n\n if (!parent) {\n return false;\n }\n\n if (isInTypeContext(parent)) {\n return false;\n }\n\n switch (parent.type) {\n case AST_NODE_TYPES.CallExpression:\n case AST_NODE_TYPES.NewExpression:\n case AST_NODE_TYPES.JSXOpeningElement:\n case AST_NODE_TYPES.JSXClosingElement:\n case AST_NODE_TYPES.MemberExpression:\n case AST_NODE_TYPES.VariableDeclarator:\n case AST_NODE_TYPES.TaggedTemplateExpression:\n case AST_NODE_TYPES.SpreadElement:\n case AST_NODE_TYPES.ExportSpecifier:\n case AST_NODE_TYPES.ArrayExpression:\n case AST_NODE_TYPES.ObjectExpression:\n case AST_NODE_TYPES.BinaryExpression:\n case AST_NODE_TYPES.LogicalExpression:\n case AST_NODE_TYPES.UnaryExpression:\n case AST_NODE_TYPES.ReturnStatement:\n case AST_NODE_TYPES.ArrowFunctionExpression:\n case AST_NODE_TYPES.ConditionalExpression:\n case AST_NODE_TYPES.AwaitExpression:\n case AST_NODE_TYPES.YieldExpression:\n case AST_NODE_TYPES.Property:\n case AST_NODE_TYPES.JSXExpressionContainer:\n return true;\n\n default:\n return false;\n }\n });\n }\n\n function checkImportDeclaration(node: TSESTree.ImportDeclaration) {\n if (node.importKind === \"type\") {\n return;\n }\n\n const hasInlineTypeSpecifier = node.specifiers.some(\n (specifier) => specifier.type === AST_NODE_TYPES.ImportSpecifier && specifier.importKind === \"type\",\n );\n if (hasInlineTypeSpecifier) {\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 scope = context.sourceCode.getScope(node);\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 localName = specifier.local.name;\n return !isUsedAsValue(localName, scope);\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isLiteralUnionType(node: TSESTree.TypeNode): boolean {\n if (node.type !== AST_NODE_TYPES.TSUnionType) {\n return false;\n }\n\n return node.types.every(\n (member) =>\n member.type === AST_NODE_TYPES.TSLiteralType ||\n member.type === AST_NODE_TYPES.TSNullKeyword ||\n member.type === AST_NODE_TYPES.TSUndefinedKeyword,\n );\n}\n\nconst preferInlineLiteralUnion = createRule({\n name: \"prefer-inline-literal-union\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce inlining literal union types in interface properties instead of using type aliases for better IDE hover information\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n inlineLiteralUnion:\n \"Inline the literal union type instead of using a type alias for better IDE hover information\",\n },\n },\n defaultOptions: [],\n create(context) {\n const literalUnionAliases = new Map<string, TSESTree.TSTypeAliasDeclaration>();\n\n return {\n TSTypeAliasDeclaration(node) {\n if (isLiteralUnionType(node.typeAnnotation)) {\n literalUnionAliases.set(node.id.name, node);\n }\n },\n\n TSPropertySignature(node) {\n if (!node.typeAnnotation) {\n return;\n }\n\n const { typeAnnotation } = node.typeAnnotation;\n\n if (typeAnnotation.type !== AST_NODE_TYPES.TSTypeReference) {\n return;\n }\n\n if (typeAnnotation.typeName.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const aliasName = typeAnnotation.typeName.name;\n const aliasDeclaration = literalUnionAliases.get(aliasName);\n\n if (!aliasDeclaration) {\n return;\n }\n\n const { sourceCode } = context;\n const unionText = sourceCode.getText(aliasDeclaration.typeAnnotation);\n\n context.report({\n node: typeAnnotation,\n messageId: \"inlineLiteralUnion\",\n fix(fixer) {\n return fixer.replaceText(typeAnnotation, unionText);\n },\n });\n },\n };\n },\n});\n\nexport default preferInlineLiteralUnion;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst isTypeDeclaration = (node: TSESTree.Node): boolean =>\n node.type === AST_NODE_TYPES.TSInterfaceDeclaration || node.type === AST_NODE_TYPES.TSTypeAliasDeclaration;\n\nconst preferInlineTypeExport = createRule({\n name: \"prefer-inline-type-export\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Require type and interface declarations to be exported inline rather than via a separate export statement\",\n },\n fixable: \"code\",\n messages: {\n preferInlineExport: \"Export '{{name}}' inline at its declaration instead of using a separate export statement.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const typeDeclarations = new Map<string, TSESTree.Node>();\n\n function collectDeclaration(node: TSESTree.TSInterfaceDeclaration | TSESTree.TSTypeAliasDeclaration): void {\n if (node.parent.type !== AST_NODE_TYPES.ExportNamedDeclaration) {\n typeDeclarations.set(node.id.name, node);\n }\n }\n\n function reportSpecifier(\n specifier: TSESTree.ExportSpecifier,\n statement: TSESTree.ExportNamedDeclaration,\n declarationNode: TSESTree.Node,\n ): void {\n if (specifier.local.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const { name } = specifier.local;\n\n context.report({\n node: specifier,\n messageId: \"preferInlineExport\",\n data: { name },\n fix(fixer) {\n const { sourceCode } = context;\n const declarationToken = sourceCode.getFirstToken(declarationNode);\n\n if (!declarationToken) {\n return null;\n }\n\n if (statement.specifiers.length === 1) {\n const nextToken = sourceCode.getTokenAfter(statement);\n const end = nextToken ? nextToken.range[0] : statement.range[1];\n\n return [fixer.insertTextBefore(declarationToken, \"export \"), fixer.removeRange([statement.range[0], end])];\n }\n\n const tokenBefore = sourceCode.getTokenBefore(specifier);\n const tokenAfter = sourceCode.getTokenAfter(specifier);\n\n if (!tokenBefore || !tokenAfter) {\n return null;\n }\n\n const isLastSpecifier = statement.specifiers.at(-1) === specifier;\n\n const removalRange: TSESTree.Range =\n isLastSpecifier && tokenBefore.value === \",\"\n ? [tokenBefore.range[0], specifier.range[1]]\n : [specifier.range[0], tokenAfter.range[1]];\n\n return [fixer.insertTextBefore(declarationToken, \"export \"), fixer.removeRange(removalRange)];\n },\n });\n }\n\n return {\n Program(node) {\n node.body.forEach((statement) => {\n if (\n statement.type === AST_NODE_TYPES.TSInterfaceDeclaration ||\n statement.type === AST_NODE_TYPES.TSTypeAliasDeclaration\n ) {\n collectDeclaration(statement);\n }\n });\n\n node.body.forEach((statement) => {\n if (statement.type !== AST_NODE_TYPES.ExportNamedDeclaration || statement.declaration !== null) {\n return;\n }\n\n statement.specifiers.forEach((specifier) => {\n if (specifier.local.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const declarationNode = typeDeclarations.get(specifier.local.name);\n\n if (!declarationNode || !isTypeDeclaration(declarationNode)) {\n return;\n }\n\n reportSpecifier(specifier, statement, declarationNode);\n });\n });\n },\n };\n },\n});\n\nexport default preferInlineTypeExport;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst preferInterfaceForComponentProps = createRule({\n name: \"prefer-interface-for-component-props\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce 'interface' over 'type' alias for component prop declarations in component files (*.tsx, *.jsx)\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n preferInterface: \"Component props '{{ name }}' should use 'interface' instead of 'type' alias.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) {\n return {};\n }\n\n return {\n TSTypeAliasDeclaration(node: TSESTree.TSTypeAliasDeclaration) {\n if (node.id.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n if (!node.id.name.endsWith(\"Props\")) {\n return;\n }\n if (node.typeAnnotation.type !== AST_NODE_TYPES.TSTypeLiteral) {\n return;\n }\n\n const { name } = node.id;\n\n context.report({\n node: node.id,\n messageId: \"preferInterface\",\n data: { name },\n fix(fixer) {\n const { sourceCode } = context;\n const typeText = sourceCode.getText(node.typeAnnotation);\n const typeParamsText = node.typeParameters ? sourceCode.getText(node.typeParameters) : \"\";\n const newText = `interface ${name}${typeParamsText} ${typeText}`;\n\n const tokenAfter = sourceCode.getTokenAfter(node);\n if (tokenAfter && tokenAfter.value === \";\") {\n return fixer.replaceTextRange([node.range[0], tokenAfter.range[1]], newText);\n }\n return fixer.replaceText(node, newText);\n },\n });\n },\n };\n },\n});\n\nexport default preferInterfaceForComponentProps;\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.replaceAll(\"-\", \"_\").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 { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst preferJSXTemplateLiterals = createRule({\n name: \"prefer-jsx-template-literals\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce using template literals instead of mixing text and JSX expressions\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n preferTemplate: \"Use template literal instead of mixing text with JSX expressions\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n function handleTextBeforeExpression(textNode: TSESTree.JSXText, exprNode: TSESTree.JSXExpressionContainer) {\n const textValue = textNode.value;\n const trimmedText = textValue.trim();\n\n if (!trimmedText) {\n return;\n }\n\n const hasTextContent = trimmedText.length > 0 && textValue !== trimmedText;\n const hasNoTrailingSpace = trimmedText.length > 0 && /\\S$/.test(textValue);\n\n if (!hasTextContent && !hasNoTrailingSpace) {\n return;\n }\n\n context.report({\n node: textNode,\n messageId: \"preferTemplate\",\n fix(fixer) {\n const textPart = textValue.trimEnd();\n const exprText = context.sourceCode.getText(exprNode.expression);\n const templateLiteral = `{\\`${textPart}\\${${exprText}}\\`}`;\n\n return [fixer.replaceText(textNode, templateLiteral), fixer.remove(exprNode)];\n },\n });\n }\n\n function handleExpressionBeforeText(exprNode: TSESTree.JSXExpressionContainer, textNode: TSESTree.JSXText) {\n const textValue = textNode.value;\n const trimmedText = textValue.trim();\n\n if (!trimmedText) {\n return;\n }\n\n const startsWithNonWhitespace = /^\\S/.test(trimmedText);\n\n if (!startsWithNonWhitespace) {\n return;\n }\n\n context.report({\n node: textNode,\n messageId: \"preferTemplate\",\n fix(fixer) {\n const exprText = context.sourceCode.getText(exprNode.expression);\n const textPart = textValue.trim();\n const templateLiteral = `{\\`\\${${exprText}}${textPart}\\`}`;\n\n return [fixer.replaceText(exprNode, templateLiteral), fixer.remove(textNode)];\n },\n });\n }\n\n function checkJSXElement(node: TSESTree.JSXElement) {\n const { children } = node;\n\n if (children.length < 2) {\n return;\n }\n\n for (let i = 0; i < children.length - 1; i += 1) {\n const child = children[i];\n const nextChild = children[i + 1];\n\n if (!child || !nextChild) {\n return;\n }\n\n if (child.type === AST_NODE_TYPES.JSXText && nextChild.type === AST_NODE_TYPES.JSXExpressionContainer) {\n handleTextBeforeExpression(child, nextChild);\n } else if (child.type === AST_NODE_TYPES.JSXExpressionContainer && nextChild.type === AST_NODE_TYPES.JSXText) {\n handleExpressionBeforeText(child, nextChild);\n }\n }\n }\n\n return {\n JSXElement: checkJSXElement,\n };\n },\n});\n\nexport default preferJSXTemplateLiterals;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst returnsJsx = (node: TSESTree.Node): boolean => {\n if (node.type === AST_NODE_TYPES.JSXElement || node.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n if (node.type === AST_NODE_TYPES.ConditionalExpression) {\n return returnsJsx(node.consequent) || returnsJsx(node.alternate);\n }\n if (node.type === AST_NODE_TYPES.LogicalExpression) {\n return returnsJsx(node.left) || returnsJsx(node.right);\n }\n return false;\n};\n\nconst bodyReturnsJsx = (body: TSESTree.BlockStatement | TSESTree.Expression): boolean => {\n if (body.type !== AST_NODE_TYPES.BlockStatement) {\n return returnsJsx(body);\n }\n return body.body.some(\n (stmt) => stmt.type === AST_NODE_TYPES.ReturnStatement && stmt.argument !== null && returnsJsx(stmt.argument),\n );\n};\n\nconst isReactComponentFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression,\n): boolean => bodyReturnsJsx(node.body);\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 if (\n (node.type === AST_NODE_TYPES.FunctionDeclaration ||\n node.type === AST_NODE_TYPES.FunctionExpression ||\n node.type === AST_NODE_TYPES.ArrowFunctionExpression) &&\n params.length === 1 &&\n params[0].type === AST_NODE_TYPES.Identifier &&\n isReactComponentFunction(node)\n ) {\n return;\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 { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst preferPropsWithChildren = createRule({\n name: \"prefer-props-with-children\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Prefer PropsWithChildren<T> over manually declaring children: ReactNode in component props\",\n },\n schema: [],\n messages: {\n usePropsWithChildren: \"Use 'PropsWithChildren<T>' instead of manually declaring 'children: ReactNode'.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n function isReactNodeType(typeNode: TSESTree.TypeNode | undefined): boolean {\n if (!typeNode) {\n return false;\n }\n if (typeNode.type !== AST_NODE_TYPES.TSTypeReference) {\n return false;\n }\n const { typeName } = typeNode;\n if (typeName.type === AST_NODE_TYPES.Identifier) {\n return typeName.name === \"ReactNode\";\n }\n if (\n typeName.type === AST_NODE_TYPES.TSQualifiedName &&\n typeName.left.type === AST_NODE_TYPES.Identifier &&\n typeName.left.name === \"React\" &&\n typeName.right.type === AST_NODE_TYPES.Identifier &&\n typeName.right.name === \"ReactNode\"\n ) {\n return true;\n }\n return false;\n }\n\n function findChildrenReactNode(members: readonly TSESTree.TypeElement[]): TSESTree.TSPropertySignature | undefined {\n for (const member of members) {\n if (member.type !== AST_NODE_TYPES.TSPropertySignature) {\n continue;\n }\n if (member.key.type !== AST_NODE_TYPES.Identifier) {\n continue;\n }\n if (member.key.name !== \"children\") {\n continue;\n }\n if (!member.typeAnnotation) {\n continue;\n }\n if (isReactNodeType(member.typeAnnotation.typeAnnotation)) {\n return member;\n }\n }\n return undefined;\n }\n\n return {\n TSInterfaceDeclaration(node) {\n const childrenMember = findChildrenReactNode(node.body.body);\n if (childrenMember) {\n context.report({\n node: childrenMember,\n messageId: \"usePropsWithChildren\",\n });\n }\n },\n TSTypeLiteral(node) {\n const childrenMember = findChildrenReactNode(node.members);\n if (childrenMember) {\n context.report({\n node: childrenMember,\n messageId: \"usePropsWithChildren\",\n });\n }\n },\n };\n },\n});\n\nexport default preferPropsWithChildren;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").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 if (!isJsxFile(context.filename)) return {};\n\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 { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").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 if (!isJsxFile(context.filename)) return {};\n\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 { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\ntype FunctionNode = TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression;\n\nconst isReactComponent = (node: FunctionNode): boolean => {\n if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {\n const { parent } = node;\n if (parent?.type === AST_NODE_TYPES.VariableDeclarator) {\n const { id } = parent;\n if (id.type === AST_NODE_TYPES.Identifier) {\n return /^[A-Z]/.test(id.name);\n }\n }\n }\n\n if (node.type === AST_NODE_TYPES.FunctionDeclaration && node.id) {\n return /^[A-Z]/.test(node.id.name);\n }\n\n return false;\n};\n\nconst isCallbackFunction = (node: FunctionNode): boolean => {\n if (node.type === AST_NODE_TYPES.FunctionDeclaration) {\n return false;\n }\n\n const { parent } = node;\n\n if (!parent) {\n return false;\n }\n\n if (parent.type === AST_NODE_TYPES.CallExpression && parent.arguments.includes(node)) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.Property) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ArrayExpression) {\n return true;\n }\n\n return false;\n};\n\nconst getFunctionName = (node: FunctionNode): string | null => {\n if (node.type === AST_NODE_TYPES.FunctionDeclaration && node.id) {\n return node.id.name;\n }\n\n if (node.type === AST_NODE_TYPES.FunctionExpression && node.id) {\n return node.id.name;\n }\n\n if (\n (node.type === AST_NODE_TYPES.ArrowFunctionExpression || node.type === AST_NODE_TYPES.FunctionExpression) &&\n node.parent?.type === AST_NODE_TYPES.VariableDeclarator &&\n node.parent.id.type === AST_NODE_TYPES.Identifier\n ) {\n return node.parent.id.name;\n }\n\n return null;\n};\n\nconst requireExplicitReturnType = createRule({\n name: \"require-explicit-return-type\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Require explicit return types on functions for better code documentation and type safety\",\n },\n messages: {\n missingReturnType:\n \"Function '{{name}}' is missing an explicit return type. Add a return type annotation for better documentation.\",\n missingReturnTypeAnonymous:\n \"Function is missing an explicit return type. Add a return type annotation for better documentation.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const checkFunction = (node: FunctionNode) => {\n if (node.returnType) {\n return;\n }\n\n if (isCallbackFunction(node)) {\n return;\n }\n\n if (isReactComponent(node)) {\n return;\n }\n\n const functionName = getFunctionName(node);\n\n if (functionName) {\n context.report({\n node,\n messageId: \"missingReturnType\",\n data: { name: functionName },\n });\n } else {\n context.report({\n node,\n messageId: \"missingReturnTypeAnonymous\",\n });\n }\n };\n\n return {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n };\n },\n});\n\nexport default requireExplicitReturnType;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst GROUP_NAMES = [\"\", \"external/alias re-export\", \"relative re-export\", \"local export\"] as const;\n\nfunction getExportGroup(node: TSESTree.ExportNamedDeclaration): number {\n if (!node.source) {\n return 3;\n }\n\n const source = node.source.value;\n\n if (source.startsWith(\".\")) {\n return 2;\n }\n\n return 1;\n}\n\nconst sortExports = createRule({\n name: \"sort-exports\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce a consistent ordering of export groups\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n unsortedExports:\n \"Export group '{{current}}' should come before '{{previous}}'. Expected order: external/alias re-exports, relative re-exports, local exports.\",\n },\n },\n defaultOptions: [],\n create(context) {\n function checkOrder(exports: { node: TSESTree.ExportNamedDeclaration; group: number }[]): void {\n const firstUnsorted = exports.find((entry, index) => index > 0 && entry.group < exports[index - 1].group);\n\n if (!firstUnsorted) {\n return;\n }\n\n const previous = exports[exports.indexOf(firstUnsorted) - 1];\n\n context.report({\n node: firstUnsorted.node,\n messageId: \"unsortedExports\",\n data: {\n current: GROUP_NAMES[firstUnsorted.group],\n previous: GROUP_NAMES[previous.group],\n },\n fix(fixer) {\n const { sourceCode } = context;\n const sorted = [...exports].sort((a, b) => a.group - b.group);\n const sortedTexts = sorted.map((entry) => sourceCode.getText(entry.node));\n\n return exports.map((entry, index) => fixer.replaceText(entry.node, sortedTexts[index]));\n },\n });\n }\n\n return {\n Program(node) {\n const exportGroups: { node: TSESTree.ExportNamedDeclaration; group: number }[] = [];\n\n node.body.forEach((statement) => {\n if (statement.type !== AST_NODE_TYPES.ExportNamedDeclaration || statement.declaration !== null) {\n if (exportGroups.length > 0) {\n checkOrder(exportGroups);\n exportGroups.length = 0;\n }\n\n return;\n }\n\n exportGroups.push({ node: statement, group: getExportGroup(statement) });\n });\n\n if (exportGroups.length > 0) {\n checkOrder(exportGroups);\n }\n },\n };\n },\n});\n\nexport default sortExports;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst NODE_BUILTINS = new Set([\n \"assert\",\n \"async_hooks\",\n \"buffer\",\n \"child_process\",\n \"cluster\",\n \"console\",\n \"constants\",\n \"crypto\",\n \"dgram\",\n \"diagnostics_channel\",\n \"dns\",\n \"domain\",\n \"events\",\n \"fs\",\n \"http\",\n \"http2\",\n \"https\",\n \"inspector\",\n \"module\",\n \"net\",\n \"os\",\n \"path\",\n \"perf_hooks\",\n \"process\",\n \"punycode\",\n \"querystring\",\n \"readline\",\n \"repl\",\n \"stream\",\n \"string_decoder\",\n \"sys\",\n \"timers\",\n \"tls\",\n \"trace_events\",\n \"tty\",\n \"url\",\n \"util\",\n \"v8\",\n \"vm\",\n \"wasi\",\n \"worker_threads\",\n \"zlib\",\n]);\n\nconst GROUP_NAMES = [\"\", \"side-effect\", \"builtin\", \"external\", \"internal alias\", \"relative\"] as const;\n\nfunction getImportGroup(node: TSESTree.ImportDeclaration): number {\n const source = node.source.value;\n\n if (node.specifiers.length === 0 && node.importKind !== \"type\") {\n return 1;\n }\n\n if (source.startsWith(\"node:\") || NODE_BUILTINS.has(source.split(\"/\")[0])) {\n return 2;\n }\n\n if (source.startsWith(\"@/\") || source.startsWith(\"~/\") || source.startsWith(\"#\")) {\n return 4;\n }\n\n if (source.startsWith(\".\")) {\n return 5;\n }\n\n return 3;\n}\n\nfunction isTypeOnlyImport(node: TSESTree.ImportDeclaration): boolean {\n return node.importKind === \"type\" && node.specifiers.length > 0;\n}\n\nconst sortImports = createRule({\n name: \"sort-imports\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce a consistent ordering of import groups\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n unsortedImports:\n \"Import group '{{current}}' should come before '{{previous}}'. Expected order: side-effect, builtin, external, internal alias, relative.\",\n },\n },\n defaultOptions: [],\n create(context) {\n function checkOrder(imports: { node: TSESTree.ImportDeclaration; group: number }[]): void {\n const isSorted = imports.every((entry, index) => index === 0 || entry.group >= imports[index - 1].group);\n\n if (isSorted) {\n return;\n }\n\n const firstUnsorted = imports.find((entry, index) => index > 0 && entry.group < imports[index - 1].group);\n\n if (!firstUnsorted) {\n return;\n }\n\n const previous = imports[imports.indexOf(firstUnsorted) - 1];\n\n context.report({\n node: firstUnsorted.node,\n messageId: \"unsortedImports\",\n data: {\n current: GROUP_NAMES[firstUnsorted.group],\n previous: GROUP_NAMES[previous.group],\n },\n fix(fixer) {\n const { sourceCode } = context;\n const sorted = [...imports].sort((a, b) => a.group - b.group);\n const sortedTexts = sorted.map((entry) => sourceCode.getText(entry.node));\n\n return imports.map((entry, index) => fixer.replaceText(entry.node, sortedTexts[index]));\n },\n });\n }\n\n return {\n Program(node) {\n const importGroups: { node: TSESTree.ImportDeclaration; group: number }[] = [];\n\n node.body.forEach((statement) => {\n if (statement.type !== AST_NODE_TYPES.ImportDeclaration) {\n if (importGroups.length > 0) {\n checkOrder(importGroups);\n importGroups.length = 0;\n }\n\n return;\n }\n\n if (isTypeOnlyImport(statement)) {\n return;\n }\n\n importGroups.push({ node: statement, group: getImportGroup(statement) });\n });\n\n if (importGroups.length > 0) {\n checkOrder(importGroups);\n }\n },\n };\n },\n});\n\nexport default sortImports;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isAlphabeticallySortedWithinGroups(members: TSESTree.TypeElement[]): boolean {\n const properties = members.filter(\n (member): member is TSESTree.TSPropertySignature =>\n member.type === AST_NODE_TYPES.TSPropertySignature && member.key.type === AST_NODE_TYPES.Identifier,\n );\n\n if (properties.length < 2) {\n return true;\n }\n\n const required = properties.filter((prop) => !prop.optional).map((prop) => (prop.key as TSESTree.Identifier).name);\n\n const optional = properties.filter((prop) => prop.optional).map((prop) => (prop.key as TSESTree.Identifier).name);\n\n const isRequiredSorted = required.every((name, index) => index === 0 || required[index - 1].localeCompare(name) <= 0);\n\n const isOptionalSorted = optional.every((name, index) => index === 0 || optional[index - 1].localeCompare(name) <= 0);\n\n return isRequiredSorted && isOptionalSorted;\n}\n\nconst sortTypeAlphabetically = createRule({\n name: \"sort-type-alphabetically\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce alphabetical sorting of properties within required and optional groups in TypeScript interfaces and type aliases\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n unsortedTypeMembers: \"Type members should be sorted alphabetically within their required and optional groups.\",\n },\n },\n defaultOptions: [],\n create(context) {\n function fixMembers(\n fixer: Parameters<NonNullable<Parameters<typeof context.report>[0][\"fix\"]>>[0],\n members: TSESTree.TypeElement[],\n ) {\n const { sourceCode } = context;\n const properties = members.filter(\n (member): member is TSESTree.TSPropertySignature =>\n member.type === AST_NODE_TYPES.TSPropertySignature && member.key.type === AST_NODE_TYPES.Identifier,\n );\n\n const required = properties.filter((prop) => !prop.optional);\n const optional = properties.filter((prop) => prop.optional);\n\n const sortedRequired = [...required].sort((a, b) =>\n (a.key as TSESTree.Identifier).name.localeCompare((b.key as TSESTree.Identifier).name),\n );\n const sortedOptional = [...optional].sort((a, b) =>\n (a.key as TSESTree.Identifier).name.localeCompare((b.key as TSESTree.Identifier).name),\n );\n\n const sortedMap = new Map<TSESTree.TSPropertySignature, string>();\n let reqIdx = 0;\n let optIdx = 0;\n\n properties.forEach((prop) => {\n if (!prop.optional) {\n sortedMap.set(prop, sourceCode.getText(sortedRequired[reqIdx]));\n reqIdx += 1;\n } else {\n sortedMap.set(prop, sourceCode.getText(sortedOptional[optIdx]));\n optIdx += 1;\n }\n });\n\n return properties\n .filter((prop) => sourceCode.getText(prop) !== sortedMap.get(prop))\n .map((prop) => fixer.replaceText(prop, sortedMap.get(prop)!));\n }\n\n return {\n TSInterfaceDeclaration(node) {\n if (!isAlphabeticallySortedWithinGroups(node.body.body)) {\n context.report({\n node,\n messageId: \"unsortedTypeMembers\",\n fix(fixer) {\n return fixMembers(fixer, node.body.body);\n },\n });\n }\n },\n TSTypeAliasDeclaration(node) {\n if (node.typeAnnotation.type !== AST_NODE_TYPES.TSTypeLiteral) {\n return;\n }\n\n const { members } = node.typeAnnotation;\n\n if (!isAlphabeticallySortedWithinGroups(members)) {\n context.report({\n node,\n messageId: \"unsortedTypeMembers\",\n fix(fixer) {\n return fixMembers(fixer, members);\n },\n });\n }\n },\n };\n },\n});\n\nexport default sortTypeAlphabetically;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isRequiredBeforeOptional(members: TSESTree.TypeElement[]): boolean {\n const properties = members.filter(\n (member): member is TSESTree.TSPropertySignature =>\n member.type === AST_NODE_TYPES.TSPropertySignature && member.key.type === AST_NODE_TYPES.Identifier,\n );\n\n if (properties.length < 2) {\n return true;\n }\n\n const firstOptionalIndex = properties.findIndex((prop) => prop.optional);\n\n if (firstOptionalIndex === -1) {\n return true;\n }\n\n return properties.slice(firstOptionalIndex).every((prop) => prop.optional);\n}\n\nconst sortTypeRequiredFirst = createRule({\n name: \"sort-type-required-first\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce required properties come before optional properties in TypeScript interfaces and type aliases\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n unsortedTypeMembers: \"Required type members should come before optional members.\",\n },\n },\n defaultOptions: [],\n create(context) {\n function fixMembers(\n fixer: Parameters<NonNullable<Parameters<typeof context.report>[0][\"fix\"]>>[0],\n members: TSESTree.TypeElement[],\n ) {\n const { sourceCode } = context;\n const properties = members.filter(\n (member): member is TSESTree.TSPropertySignature =>\n member.type === AST_NODE_TYPES.TSPropertySignature && member.key.type === AST_NODE_TYPES.Identifier,\n );\n\n const required = properties.filter((prop) => !prop.optional);\n const optional = properties.filter((prop) => prop.optional);\n const sorted = [...required, ...optional];\n\n const sortedTexts = sorted.map((prop) => sourceCode.getText(prop));\n\n return properties.map((prop, index) => fixer.replaceText(prop, sortedTexts[index]));\n }\n\n return {\n TSInterfaceDeclaration(node) {\n if (!isRequiredBeforeOptional(node.body.body)) {\n context.report({\n node,\n messageId: \"unsortedTypeMembers\",\n fix(fixer) {\n return fixMembers(fixer, node.body.body);\n },\n });\n }\n },\n TSTypeAliasDeclaration(node) {\n if (node.typeAnnotation.type !== AST_NODE_TYPES.TSTypeLiteral) {\n return;\n }\n\n const { members } = node.typeAnnotation;\n\n if (!isRequiredBeforeOptional(members)) {\n context.report({\n node,\n messageId: \"unsortedTypeMembers\",\n fix(fixer) {\n return fixMembers(fixer, members);\n },\n });\n }\n },\n };\n },\n});\n\nexport default sortTypeRequiredFirst;\n","import packageJson from \"../package.json\" with { type: \"json\" };\n\nimport booleanNamingPrefix from \"./rules/boolean-naming-prefix\";\nimport enforceCamelCase from \"./rules/enforce-camel-case\";\nimport enforceConstantCase from \"./rules/enforce-constant-case\";\nimport enforceHookFilename from \"./rules/enforce-hook-filename\";\nimport enforceHookNaming from \"./rules/enforce-hook-naming\";\nimport enforcePropertyCase from \"./rules/enforce-property-case\";\nimport enforcePropsSuffix from \"./rules/enforce-props-suffix\";\nimport enforceReadonlyComponentProps from \"./rules/enforce-readonly-component-props\";\nimport enforceRenderNaming from \"./rules/enforce-render-naming\";\nimport enforceServiceNaming from \"./rules/enforce-service-naming\";\nimport enforceTestFilename from \"./rules/enforce-test-filename\";\nimport enforceSortedDestructuring from \"./rules/enforce-sorted-destructuring\";\nimport enforceTypeDeclarationOrder from \"./rules/enforce-type-declaration-order\";\nimport indexExportOnly from \"./rules/index-export-only\";\nimport jsxNewlineBetweenElements from \"./rules/jsx-newline-between-elements\";\nimport jsxNoDataArray from \"./rules/jsx-no-data-array\";\nimport jsxNoDataObject from \"./rules/jsx-no-data-object\";\nimport jsxNoInlineObjectProp from \"./rules/jsx-no-inline-object-prop\";\nimport jsxNoNewlineSingleLineElements from \"./rules/jsx-no-newline-single-line-elements\";\nimport jsxNoNonComponentFunction from \"./rules/jsx-no-non-component-function\";\nimport jsxNoSubInterface from \"./rules/jsx-no-sub-interface\";\nimport jsxNoTernaryNull from \"./rules/jsx-no-ternary-null\";\nimport jsxNoVariableInCallback from \"./rules/jsx-no-variable-in-callback\";\nimport jsxRequireSuspense from \"./rules/jsx-require-suspense\";\nimport jsxSimpleProps from \"./rules/jsx-simple-props\";\nimport jsxSortProps from \"./rules/jsx-sort-props\";\nimport jsxSpreadPropsLast from \"./rules/jsx-spread-props-last\";\nimport newlineAfterMultilineBlock from \"./rules/newline-after-multiline-block\";\nimport newlineBeforeReturn from \"./rules/newline-before-return\";\nimport noComplexInlineReturn from \"./rules/no-complex-inline-return\";\nimport noDirectDate from \"./rules/no-direct-date\";\nimport noEmoji from \"./rules/no-emoji\";\nimport noEnvFallback from \"./rules/no-env-fallback\";\nimport noGhostWrapper from \"./rules/no-ghost-wrapper\";\nimport noHelperFunctionInHook from \"./rules/no-helper-function-in-hook\";\nimport noHelperFunctionInTest from \"./rules/no-helper-function-in-test\";\nimport noInlineDefaultExport from \"./rules/no-inline-default-export\";\nimport noInlineNestedObject from \"./rules/no-inline-nested-object\";\nimport noInlineReturnProperties from \"./rules/no-inline-return-properties\";\nimport noInlineTypeImport from \"./rules/no-inline-type-import\";\nimport noLazyIdentifiers from \"./rules/no-lazy-identifiers\";\nimport noLogicInParams from \"./rules/no-logic-in-params\";\nimport noMisleadingConstantCase from \"./rules/no-misleading-constant-case\";\nimport noNestedInterfaceDeclaration from \"./rules/no-nested-interface-declaration\";\nimport noNestedTernary from \"./rules/no-nested-ternary\";\nimport noRedundantFragment from \"./rules/no-redundant-fragment\";\nimport noRelativeImports from \"./rules/no-relative-imports\";\nimport noSingleCharVariables from \"./rules/no-single-char-variables\";\nimport preferAsyncAwait from \"./rules/prefer-async-await\";\nimport preferDestructuringParams from \"./rules/prefer-destructuring-params\";\nimport preferFunctionDeclaration from \"./rules/prefer-function-declaration\";\nimport preferGuardClause from \"./rules/prefer-guard-clause\";\nimport preferImportType from \"./rules/prefer-import-type\";\nimport preferInlineLiteralUnion from \"./rules/prefer-inline-literal-union\";\nimport preferInlineTypeExport from \"./rules/prefer-inline-type-export\";\nimport preferInterfaceForComponentProps from \"./rules/prefer-interface-for-component-props\";\nimport preferInterfaceOverInlineTypes from \"./rules/prefer-interface-over-inline-types\";\nimport preferJSXTemplateLiterals from \"./rules/prefer-jsx-template-literals\";\nimport preferNamedParamTypes from \"./rules/prefer-named-param-types\";\nimport preferPropsWithChildren from \"./rules/prefer-props-with-children\";\nimport preferReactImportTypes from \"./rules/prefer-react-import-types\";\nimport reactPropsDestructure from \"./rules/react-props-destructure\";\nimport requireExplicitReturnType from \"./rules/require-explicit-return-type\";\nimport sortExports from \"./rules/sort-exports\";\nimport sortImports from \"./rules/sort-imports\";\nimport sortTypeAlphabetically from \"./rules/sort-type-alphabetically\";\nimport sortTypeRequiredFirst from \"./rules/sort-type-required-first\";\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 \"boolean-naming-prefix\": booleanNamingPrefix,\n \"enforce-camel-case\": enforceCamelCase,\n \"enforce-constant-case\": enforceConstantCase,\n \"enforce-hook-filename\": enforceHookFilename,\n \"enforce-hook-naming\": enforceHookNaming,\n \"enforce-property-case\": enforcePropertyCase,\n \"enforce-props-suffix\": enforcePropsSuffix,\n \"enforce-readonly-component-props\": enforceReadonlyComponentProps,\n \"enforce-render-naming\": enforceRenderNaming,\n \"enforce-service-naming\": enforceServiceNaming,\n \"enforce-test-filename\": enforceTestFilename,\n \"enforce-sorted-destructuring\": enforceSortedDestructuring,\n \"enforce-type-declaration-order\": enforceTypeDeclarationOrder,\n \"index-export-only\": indexExportOnly,\n \"jsx-newline-between-elements\": jsxNewlineBetweenElements,\n \"jsx-no-data-array\": jsxNoDataArray,\n \"jsx-no-data-object\": jsxNoDataObject,\n \"jsx-no-inline-object-prop\": jsxNoInlineObjectProp,\n \"jsx-no-newline-single-line-elements\": jsxNoNewlineSingleLineElements,\n \"jsx-no-non-component-function\": jsxNoNonComponentFunction,\n \"jsx-no-sub-interface\": jsxNoSubInterface,\n \"jsx-no-ternary-null\": jsxNoTernaryNull,\n \"jsx-no-variable-in-callback\": jsxNoVariableInCallback,\n \"jsx-require-suspense\": jsxRequireSuspense,\n \"jsx-simple-props\": jsxSimpleProps,\n \"jsx-sort-props\": jsxSortProps,\n \"jsx-spread-props-last\": jsxSpreadPropsLast,\n \"newline-after-multiline-block\": newlineAfterMultilineBlock,\n \"newline-before-return\": newlineBeforeReturn,\n \"no-complex-inline-return\": noComplexInlineReturn,\n \"no-direct-date\": noDirectDate,\n \"no-emoji\": noEmoji,\n \"no-env-fallback\": noEnvFallback,\n \"no-ghost-wrapper\": noGhostWrapper,\n \"no-helper-function-in-hook\": noHelperFunctionInHook,\n \"no-helper-function-in-test\": noHelperFunctionInTest,\n \"no-inline-default-export\": noInlineDefaultExport,\n \"no-inline-nested-object\": noInlineNestedObject,\n \"no-inline-return-properties\": noInlineReturnProperties,\n \"no-inline-type-import\": noInlineTypeImport,\n \"no-lazy-identifiers\": noLazyIdentifiers,\n \"no-logic-in-params\": noLogicInParams,\n \"no-misleading-constant-case\": noMisleadingConstantCase,\n \"no-nested-interface-declaration\": noNestedInterfaceDeclaration,\n \"no-nested-ternary\": noNestedTernary,\n \"no-redundant-fragment\": noRedundantFragment,\n \"no-relative-imports\": noRelativeImports,\n \"no-single-char-variables\": noSingleCharVariables,\n \"prefer-async-await\": preferAsyncAwait,\n \"prefer-destructuring-params\": preferDestructuringParams,\n \"prefer-function-declaration\": preferFunctionDeclaration,\n \"prefer-guard-clause\": preferGuardClause,\n \"prefer-import-type\": preferImportType,\n \"prefer-inline-literal-union\": preferInlineLiteralUnion,\n \"prefer-inline-type-export\": preferInlineTypeExport,\n \"prefer-interface-for-component-props\": preferInterfaceForComponentProps,\n \"prefer-interface-over-inline-types\": preferInterfaceOverInlineTypes,\n \"prefer-jsx-template-literals\": preferJSXTemplateLiterals,\n \"prefer-named-param-types\": preferNamedParamTypes,\n \"prefer-props-with-children\": preferPropsWithChildren,\n \"prefer-react-import-types\": preferReactImportTypes,\n \"react-props-destructure\": reactPropsDestructure,\n \"require-explicit-return-type\": requireExplicitReturnType,\n \"sort-exports\": sortExports,\n \"sort-imports\": sortImports,\n \"sort-type-alphabetically\": sortTypeAlphabetically,\n \"sort-type-required-first\": sortTypeRequiredFirst,\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/boolean-naming-prefix\": \"warn\",\n \"nextfriday/enforce-camel-case\": \"warn\",\n \"nextfriday/enforce-constant-case\": \"warn\",\n \"nextfriday/enforce-hook-filename\": \"warn\",\n \"nextfriday/enforce-hook-naming\": \"warn\",\n \"nextfriday/enforce-property-case\": \"warn\",\n \"nextfriday/enforce-service-naming\": \"warn\",\n \"nextfriday/enforce-test-filename\": \"warn\",\n \"nextfriday/enforce-sorted-destructuring\": \"warn\",\n \"nextfriday/enforce-type-declaration-order\": \"warn\",\n \"nextfriday/index-export-only\": \"warn\",\n \"nextfriday/newline-after-multiline-block\": \"warn\",\n \"nextfriday/newline-before-return\": \"warn\",\n \"nextfriday/no-complex-inline-return\": \"warn\",\n \"nextfriday/no-direct-date\": \"warn\",\n \"nextfriday/no-emoji\": \"warn\",\n \"nextfriday/no-env-fallback\": \"warn\",\n \"nextfriday/no-helper-function-in-hook\": \"warn\",\n \"nextfriday/no-helper-function-in-test\": \"warn\",\n \"nextfriday/no-inline-default-export\": \"warn\",\n \"nextfriday/no-inline-nested-object\": \"warn\",\n \"nextfriday/no-inline-return-properties\": \"warn\",\n \"nextfriday/no-inline-type-import\": \"warn\",\n \"nextfriday/no-lazy-identifiers\": \"warn\",\n \"nextfriday/no-logic-in-params\": \"warn\",\n \"nextfriday/no-misleading-constant-case\": \"warn\",\n \"nextfriday/no-nested-interface-declaration\": \"warn\",\n \"nextfriday/no-nested-ternary\": \"warn\",\n \"nextfriday/no-relative-imports\": \"warn\",\n \"nextfriday/no-single-char-variables\": \"warn\",\n \"nextfriday/prefer-async-await\": \"warn\",\n \"nextfriday/prefer-destructuring-params\": \"warn\",\n \"nextfriday/prefer-function-declaration\": \"warn\",\n \"nextfriday/prefer-guard-clause\": \"warn\",\n \"nextfriday/prefer-import-type\": \"warn\",\n \"nextfriday/prefer-inline-literal-union\": \"warn\",\n \"nextfriday/prefer-inline-type-export\": \"warn\",\n \"nextfriday/prefer-named-param-types\": \"warn\",\n \"nextfriday/prefer-react-import-types\": \"warn\",\n \"nextfriday/require-explicit-return-type\": \"warn\",\n \"nextfriday/sort-exports\": \"warn\",\n \"nextfriday/sort-imports\": \"warn\",\n \"nextfriday/sort-type-alphabetically\": \"warn\",\n \"nextfriday/sort-type-required-first\": \"warn\",\n} as const;\n\nconst baseRecommendedRules = {\n \"nextfriday/boolean-naming-prefix\": \"error\",\n \"nextfriday/enforce-camel-case\": \"error\",\n \"nextfriday/enforce-constant-case\": \"error\",\n \"nextfriday/enforce-hook-filename\": \"error\",\n \"nextfriday/enforce-hook-naming\": \"error\",\n \"nextfriday/enforce-property-case\": \"error\",\n \"nextfriday/enforce-service-naming\": \"error\",\n \"nextfriday/enforce-test-filename\": \"error\",\n \"nextfriday/enforce-sorted-destructuring\": \"error\",\n \"nextfriday/enforce-type-declaration-order\": \"error\",\n \"nextfriday/index-export-only\": \"error\",\n \"nextfriday/newline-after-multiline-block\": \"error\",\n \"nextfriday/newline-before-return\": \"error\",\n \"nextfriday/no-complex-inline-return\": \"error\",\n \"nextfriday/no-direct-date\": \"error\",\n \"nextfriday/no-emoji\": \"error\",\n \"nextfriday/no-env-fallback\": \"error\",\n \"nextfriday/no-helper-function-in-hook\": \"error\",\n \"nextfriday/no-helper-function-in-test\": \"error\",\n \"nextfriday/no-inline-default-export\": \"error\",\n \"nextfriday/no-inline-nested-object\": \"error\",\n \"nextfriday/no-inline-return-properties\": \"error\",\n \"nextfriday/no-inline-type-import\": \"error\",\n \"nextfriday/no-lazy-identifiers\": \"error\",\n \"nextfriday/no-logic-in-params\": \"error\",\n \"nextfriday/no-misleading-constant-case\": \"error\",\n \"nextfriday/no-nested-interface-declaration\": \"error\",\n \"nextfriday/no-nested-ternary\": \"error\",\n \"nextfriday/no-relative-imports\": \"error\",\n \"nextfriday/no-single-char-variables\": \"error\",\n \"nextfriday/prefer-async-await\": \"error\",\n \"nextfriday/prefer-destructuring-params\": \"error\",\n \"nextfriday/prefer-function-declaration\": \"error\",\n \"nextfriday/prefer-guard-clause\": \"error\",\n \"nextfriday/prefer-import-type\": \"error\",\n \"nextfriday/prefer-inline-literal-union\": \"error\",\n \"nextfriday/prefer-inline-type-export\": \"error\",\n \"nextfriday/prefer-named-param-types\": \"error\",\n \"nextfriday/prefer-react-import-types\": \"error\",\n \"nextfriday/require-explicit-return-type\": \"error\",\n \"nextfriday/sort-exports\": \"error\",\n \"nextfriday/sort-imports\": \"error\",\n \"nextfriday/sort-type-alphabetically\": \"error\",\n \"nextfriday/sort-type-required-first\": \"error\",\n} as const;\n\nconst jsxRules = {\n \"nextfriday/enforce-props-suffix\": \"warn\",\n \"nextfriday/enforce-readonly-component-props\": \"warn\",\n \"nextfriday/enforce-render-naming\": \"warn\",\n \"nextfriday/jsx-newline-between-elements\": \"warn\",\n \"nextfriday/jsx-no-data-array\": \"warn\",\n \"nextfriday/jsx-no-data-object\": \"warn\",\n \"nextfriday/jsx-no-inline-object-prop\": \"warn\",\n \"nextfriday/jsx-no-newline-single-line-elements\": \"warn\",\n \"nextfriday/jsx-no-non-component-function\": \"warn\",\n \"nextfriday/jsx-no-sub-interface\": \"warn\",\n \"nextfriday/jsx-no-ternary-null\": \"warn\",\n \"nextfriday/jsx-no-variable-in-callback\": \"warn\",\n \"nextfriday/jsx-require-suspense\": \"warn\",\n \"nextfriday/jsx-simple-props\": \"warn\",\n \"nextfriday/jsx-sort-props\": \"warn\",\n \"nextfriday/jsx-spread-props-last\": \"warn\",\n \"nextfriday/no-ghost-wrapper\": \"warn\",\n \"nextfriday/no-redundant-fragment\": \"warn\",\n \"nextfriday/prefer-interface-for-component-props\": \"warn\",\n \"nextfriday/prefer-interface-over-inline-types\": \"warn\",\n \"nextfriday/prefer-jsx-template-literals\": \"warn\",\n \"nextfriday/prefer-props-with-children\": \"warn\",\n \"nextfriday/react-props-destructure\": \"warn\",\n} as const;\n\nconst jsxRecommendedRules = {\n \"nextfriday/enforce-props-suffix\": \"error\",\n \"nextfriday/enforce-readonly-component-props\": \"error\",\n \"nextfriday/enforce-render-naming\": \"error\",\n \"nextfriday/jsx-newline-between-elements\": \"error\",\n \"nextfriday/jsx-no-data-array\": \"error\",\n \"nextfriday/jsx-no-data-object\": \"error\",\n \"nextfriday/jsx-no-inline-object-prop\": \"error\",\n \"nextfriday/jsx-no-newline-single-line-elements\": \"error\",\n \"nextfriday/jsx-no-non-component-function\": \"error\",\n \"nextfriday/jsx-no-sub-interface\": \"error\",\n \"nextfriday/jsx-no-ternary-null\": \"error\",\n \"nextfriday/jsx-no-variable-in-callback\": \"error\",\n \"nextfriday/jsx-require-suspense\": \"error\",\n \"nextfriday/jsx-simple-props\": \"error\",\n \"nextfriday/jsx-sort-props\": \"error\",\n \"nextfriday/jsx-spread-props-last\": \"error\",\n \"nextfriday/no-ghost-wrapper\": \"error\",\n \"nextfriday/no-redundant-fragment\": \"error\",\n \"nextfriday/prefer-interface-for-component-props\": \"error\",\n \"nextfriday/prefer-interface-over-inline-types\": \"error\",\n \"nextfriday/prefer-jsx-template-literals\": \"error\",\n \"nextfriday/prefer-props-with-children\": \"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};\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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"}
1
+ {"version":3,"file":"index.js","names":["createRule","createRule","SNAKE_CASE_REGEX","returnsJsx","bodyReturnsJsx","isComponentFunction","isGlobalScope","isStaticValue","createRule","SCREAMING_SNAKE_CASE_REGEX","SNAKE_CASE_REGEX","isGlobalScope","createRule","SCREAMING_SNAKE_CASE_REGEX","createRule","isPascalCase","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","createRule","GROUP_NAMES","createRule","createRule","packageJson.name","packageJson.version"],"sources":["../package.json","../src/rules/boolean-naming-prefix.ts","../src/rules/enforce-camel-case.ts","../src/utils.ts","../src/rules/enforce-constant-case.ts","../src/rules/enforce-hook-filename.ts","../src/rules/enforce-hook-naming.ts","../src/rules/enforce-property-case.ts","../src/rules/enforce-props-suffix.ts","../src/rules/enforce-readonly-component-props.ts","../src/rules/enforce-render-naming.ts","../src/rules/enforce-service-naming.ts","../src/rules/enforce-test-filename.ts","../src/rules/enforce-sorted-destructuring.ts","../src/rules/enforce-type-declaration-order.ts","../src/rules/index-export-only.ts","../src/rules/jsx-newline-between-elements.ts","../src/rules/jsx-no-data-array.ts","../src/rules/jsx-no-data-object.ts","../src/rules/jsx-no-inline-object-prop.ts","../src/rules/jsx-no-newline-single-line-elements.ts","../src/rules/jsx-no-non-component-function.ts","../src/rules/jsx-no-sub-interface.ts","../src/rules/jsx-no-ternary-null.ts","../src/rules/jsx-no-variable-in-callback.ts","../src/rules/jsx-require-suspense.ts","../src/rules/jsx-simple-props.ts","../src/rules/jsx-sort-props.ts","../src/rules/jsx-spread-props-last.ts","../src/rules/newline-after-multiline-block.ts","../src/rules/newline-before-return.ts","../src/rules/no-complex-inline-return.ts","../src/rules/no-direct-date.ts","../src/rules/no-emoji.ts","../src/rules/no-env-fallback.ts","../src/rules/no-ghost-wrapper.ts","../src/rules/no-helper-function-in-hook.ts","../src/rules/no-helper-function-in-test.ts","../src/rules/no-inline-default-export.ts","../src/rules/no-inline-nested-object.ts","../src/rules/no-inline-return-properties.ts","../src/rules/no-inline-type-import.ts","../src/rules/no-lazy-identifiers.ts","../src/rules/no-logic-in-params.ts","../src/rules/no-misleading-constant-case.ts","../src/rules/no-nested-interface-declaration.ts","../src/rules/no-nested-ternary.ts","../src/rules/no-redundant-fragment.ts","../src/rules/no-relative-imports.ts","../src/rules/no-single-char-variables.ts","../src/rules/prefer-async-await.ts","../src/rules/prefer-destructuring-params.ts","../src/rules/prefer-function-declaration.ts","../src/rules/prefer-guard-clause.ts","../src/rules/prefer-import-type.ts","../src/rules/prefer-inline-literal-union.ts","../src/rules/prefer-interface-for-component-props.ts","../src/rules/prefer-interface-over-inline-types.ts","../src/rules/prefer-jsx-template-literals.ts","../src/rules/prefer-named-param-types.ts","../src/rules/prefer-props-with-children.ts","../src/rules/prefer-react-import-types.ts","../src/rules/react-props-destructure.ts","../src/rules/require-explicit-return-type.ts","../src/rules/sort-exports.ts","../src/rules/sort-imports.ts","../src/rules/sort-type-alphabetically.ts","../src/rules/sort-type-required-first.ts","../src/index.ts"],"sourcesContent":["","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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst BOOLEAN_PREFIXES = [\"is\", \"has\", \"should\", \"can\", \"did\", \"will\", \"was\", \"are\", \"does\", \"had\"];\n\nconst startsWithBooleanPrefix = (name: string): boolean =>\n BOOLEAN_PREFIXES.some((prefix) => {\n if (!name.startsWith(prefix)) {\n return false;\n }\n\n if (name.length === prefix.length) {\n return true;\n }\n\n const nextChar = name.charAt(prefix.length);\n return nextChar === nextChar.toUpperCase() && nextChar !== nextChar.toLowerCase();\n });\n\nconst isBooleanLiteral = (node: TSESTree.Expression): boolean =>\n node.type === AST_NODE_TYPES.Literal && typeof node.value === \"boolean\";\n\nconst isBooleanExpression = (node: TSESTree.Expression): boolean => {\n if (isBooleanLiteral(node)) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.UnaryExpression && node.operator === \"!\") {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.BinaryExpression) {\n const comparisonOperators = [\"===\", \"!==\", \"==\", \"!=\", \"<\", \">\", \"<=\", \">=\", \"in\", \"instanceof\"];\n return comparisonOperators.includes(node.operator);\n }\n\n if (node.type === AST_NODE_TYPES.LogicalExpression) {\n return node.operator === \"&&\" || node.operator === \"||\";\n }\n\n return false;\n};\n\nconst hasBooleanTypeAnnotation = (node: TSESTree.VariableDeclarator | TSESTree.Parameter): boolean => {\n if (node.type === AST_NODE_TYPES.Identifier) {\n const { typeAnnotation } = node;\n if (typeAnnotation?.typeAnnotation.type === AST_NODE_TYPES.TSBooleanKeyword) {\n return true;\n }\n }\n\n if (\"id\" in node && node.id.type === AST_NODE_TYPES.Identifier) {\n const { typeAnnotation } = node.id;\n if (typeAnnotation?.typeAnnotation.type === AST_NODE_TYPES.TSBooleanKeyword) {\n return true;\n }\n }\n\n return false;\n};\n\nconst booleanNamingPrefix = createRule({\n name: \"boolean-naming-prefix\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce boolean variables and parameters to have a prefix like is, has, should, can, did, will for better readability\",\n },\n messages: {\n missingPrefix:\n \"Boolean variable '{{name}}' should have a prefix like is, has, should, can, did, or will. Example: 'is{{suggestedName}}' or 'has{{suggestedName}}'.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const checkBooleanNaming = (name: string, node: TSESTree.Node) => {\n if (startsWithBooleanPrefix(name)) {\n return;\n }\n\n const suggestedName = name.charAt(0).toUpperCase() + name.slice(1);\n\n context.report({\n node,\n messageId: \"missingPrefix\",\n data: { name, suggestedName },\n });\n };\n\n return {\n VariableDeclarator(node) {\n if (node.id.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const { name } = node.id;\n\n if (hasBooleanTypeAnnotation(node)) {\n checkBooleanNaming(name, node.id);\n return;\n }\n\n if (node.init && isBooleanExpression(node.init)) {\n checkBooleanNaming(name, node.id);\n }\n },\n FunctionDeclaration(node) {\n node.params.forEach((param) => {\n if (param.type === AST_NODE_TYPES.Identifier && hasBooleanTypeAnnotation(param)) {\n checkBooleanNaming(param.name, param);\n }\n\n if (param.type === AST_NODE_TYPES.AssignmentPattern) {\n if (param.left.type === AST_NODE_TYPES.Identifier && param.right && isBooleanLiteral(param.right)) {\n checkBooleanNaming(param.left.name, param.left);\n }\n }\n });\n },\n FunctionExpression(node) {\n node.params.forEach((param) => {\n if (param.type === AST_NODE_TYPES.Identifier && hasBooleanTypeAnnotation(param)) {\n checkBooleanNaming(param.name, param);\n }\n\n if (param.type === AST_NODE_TYPES.AssignmentPattern) {\n if (param.left.type === AST_NODE_TYPES.Identifier && param.right && isBooleanLiteral(param.right)) {\n checkBooleanNaming(param.left.name, param.left);\n }\n }\n });\n },\n ArrowFunctionExpression(node) {\n node.params.forEach((param) => {\n if (param.type === AST_NODE_TYPES.Identifier && hasBooleanTypeAnnotation(param)) {\n checkBooleanNaming(param.name, param);\n }\n\n if (param.type === AST_NODE_TYPES.AssignmentPattern) {\n if (param.left.type === AST_NODE_TYPES.Identifier && param.right && isBooleanLiteral(param.right)) {\n checkBooleanNaming(param.left.name, param.left);\n }\n }\n });\n },\n };\n },\n});\n\nexport default booleanNamingPrefix;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst SNAKE_CASE_REGEX = /^[a-z]+_[a-z0-9_]*$/;\nconst PASCAL_CASE_REGEX = /^[A-Z][a-zA-Z0-9]*$/;\n\nconst REACT_WRAPPERS = [\"memo\", \"forwardRef\", \"lazy\"];\n\nconst returnsJsx = (node: TSESTree.Node): boolean => {\n if (node.type === AST_NODE_TYPES.JSXElement || node.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.ConditionalExpression) {\n return returnsJsx(node.consequent) || returnsJsx(node.alternate);\n }\n\n if (node.type === AST_NODE_TYPES.LogicalExpression) {\n return returnsJsx(node.left) || returnsJsx(node.right);\n }\n\n return false;\n};\n\nconst bodyReturnsJsx = (body: TSESTree.BlockStatement | TSESTree.Expression): boolean => {\n if (body.type !== AST_NODE_TYPES.BlockStatement) {\n return returnsJsx(body);\n }\n\n return body.body.some(\n (stmt) => stmt.type === AST_NODE_TYPES.ReturnStatement && stmt.argument !== null && returnsJsx(stmt.argument),\n );\n};\n\nconst isComponentFunction = (init: TSESTree.Expression): boolean => {\n if (init.type === AST_NODE_TYPES.ArrowFunctionExpression || init.type === AST_NODE_TYPES.FunctionExpression) {\n return bodyReturnsJsx(init.body);\n }\n\n if (init.type === AST_NODE_TYPES.CallExpression) {\n const { callee } = init;\n\n if (callee.type === AST_NODE_TYPES.Identifier && REACT_WRAPPERS.includes(callee.name)) {\n return true;\n }\n\n if (\n callee.type === AST_NODE_TYPES.MemberExpression &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n callee.object.name === \"React\" &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n REACT_WRAPPERS.includes(callee.property.name)\n ) {\n return true;\n }\n }\n\n return false;\n};\n\nconst isGlobalScope = (node: TSESTree.Node): boolean => {\n const declaration = node.parent;\n\n if (!declaration || declaration.type !== AST_NODE_TYPES.VariableDeclaration) {\n return false;\n }\n\n const { parent } = declaration;\n\n if (parent.type === AST_NODE_TYPES.Program) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ExportNamedDeclaration && parent.parent?.type === AST_NODE_TYPES.Program) {\n return true;\n }\n\n return false;\n};\n\nconst isStaticValue = (init: TSESTree.Expression): boolean => {\n if (init.type === AST_NODE_TYPES.Literal) {\n return true;\n }\n\n if (init.type === AST_NODE_TYPES.UnaryExpression && init.argument.type === AST_NODE_TYPES.Literal) {\n return true;\n }\n\n if (init.type === AST_NODE_TYPES.TemplateLiteral && init.expressions.length === 0) {\n return true;\n }\n\n if (init.type === AST_NODE_TYPES.ArrayExpression) {\n return init.elements.every((el) => el !== null && el.type !== AST_NODE_TYPES.SpreadElement && isStaticValue(el));\n }\n\n if (init.type === AST_NODE_TYPES.ObjectExpression) {\n return init.properties.every(\n (prop) => prop.type === AST_NODE_TYPES.Property && isStaticValue(prop.value as TSESTree.Expression),\n );\n }\n\n if (\n init.type === AST_NODE_TYPES.TSAsExpression &&\n init.typeAnnotation.type === AST_NODE_TYPES.TSTypeReference &&\n init.typeAnnotation.typeName.type === AST_NODE_TYPES.Identifier &&\n init.typeAnnotation.typeName.name === \"const\"\n ) {\n return true;\n }\n\n return false;\n};\n\nconst enforceCamelCase = createRule({\n name: \"enforce-camel-case\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce camelCase for variables and functions, ban snake_case, and restrict PascalCase to React components\",\n },\n messages: {\n noSnakeCase: \"Variable '{{ name }}' should not use snake_case. Use camelCase instead.\",\n pascalCaseReserved:\n \"Variable '{{ name }}' uses PascalCase but is not a React component. PascalCase is reserved for components.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n VariableDeclarator(node) {\n if (node.id.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const { name } = node.id;\n\n if (SNAKE_CASE_REGEX.test(name)) {\n const declaration = node.parent;\n\n if (declaration.kind === \"const\" && isGlobalScope(node) && node.init && isStaticValue(node.init)) {\n return;\n }\n\n context.report({\n node: node.id,\n messageId: \"noSnakeCase\",\n data: { name },\n });\n\n return;\n }\n\n if (!node.init || !PASCAL_CASE_REGEX.test(name)) {\n return;\n }\n\n if (isComponentFunction(node.init)) {\n return;\n }\n\n if (\n node.init.type !== AST_NODE_TYPES.ArrowFunctionExpression &&\n node.init.type !== AST_NODE_TYPES.FunctionExpression &&\n node.init.type !== AST_NODE_TYPES.CallExpression\n ) {\n return;\n }\n\n context.report({\n node: node.id,\n messageId: \"pascalCaseReserved\",\n data: { name },\n });\n },\n FunctionDeclaration(node) {\n if (!node.id) {\n return;\n }\n\n const { name } = node.id;\n\n if (SNAKE_CASE_REGEX.test(name)) {\n context.report({\n node: node.id,\n messageId: \"noSnakeCase\",\n data: { name },\n });\n }\n },\n };\n },\n});\n\nexport default enforceCamelCase;\n","import { basename, extname } from \"node:path\";\n\nimport { AST_NODE_TYPES, type TSESTree } from \"@typescript-eslint/utils\";\n\ntype FunctionNode = TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression;\n\nexport const getFunctionParams = (node: FunctionNode) => node.params;\n\nexport const hasMultipleParams = (node: FunctionNode) => node.params.length > 1;\n\nexport const isDestructuredParam = (param: TSESTree.Parameter) =>\n param.type === AST_NODE_TYPES.ObjectPattern || param.type === AST_NODE_TYPES.ArrayPattern;\n\nexport const hasNonDestructuredParams = (node: FunctionNode) =>\n node.params.some(\n (param: TSESTree.Parameter) => !isDestructuredParam(param) && param.type !== AST_NODE_TYPES.RestElement,\n );\n\nexport const getFileExtension = (filename: string) => extname(filename).slice(1);\n\nexport const getBaseName = (filename: string) => basename(filename, extname(filename));\n\nexport const isJsFile = (filename: string) => {\n const ext = getFileExtension(filename);\n return ext === \"js\" || ext === \"ts\";\n};\n\nexport const isJsxFile = (filename: string) => {\n const ext = getFileExtension(filename);\n return ext === \"jsx\" || ext === \"tsx\";\n};\n\nexport const isConfigFile = (filename: string) => {\n const baseName = getBaseName(filename);\n return (\n /\\.(config|rc|setup|spec|test)$/.test(baseName) ||\n /\\.(config|rc|setup|spec|test)\\./.test(filename) ||\n /^\\.(eslintrc|babelrc|prettierrc)/.test(filename)\n );\n};\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isConfigFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst SCREAMING_SNAKE_CASE_REGEX = /^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$/;\nconst SNAKE_CASE_REGEX = /^[a-z]+_[a-z0-9_]*$/;\n\nconst toScreamingSnakeCase = (str: string): string =>\n str\n .replace(/([a-z])([A-Z])/g, \"$1_$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1_$2\")\n .toUpperCase();\n\nconst isMagicLiteral = (init: TSESTree.Expression): boolean => {\n if (init.type === AST_NODE_TYPES.Literal) {\n return typeof init.value === \"string\" || typeof init.value === \"number\";\n }\n\n if (init.type === AST_NODE_TYPES.UnaryExpression) {\n const { argument, operator } = init;\n return (\n (operator === \"-\" || operator === \"+\") &&\n argument.type === AST_NODE_TYPES.Literal &&\n typeof argument.value === \"number\"\n );\n }\n\n return false;\n};\n\nconst isGlobalScope = (node: TSESTree.VariableDeclaration): boolean => {\n const { parent } = node;\n\n if (parent.type === AST_NODE_TYPES.Program) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ExportNamedDeclaration && parent.parent?.type === AST_NODE_TYPES.Program) {\n return true;\n }\n\n return false;\n};\n\nconst enforceConstantCase = createRule({\n name: \"enforce-constant-case\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce SCREAMING_SNAKE_CASE for global magic-number and magic-text constants\",\n },\n messages: {\n useScreamingSnakeCase: \"Constant '{{ name }}' should use SCREAMING_SNAKE_CASE. Rename to '{{ suggestion }}'.\",\n noSnakeCase: \"Global constant '{{ name }}' should not use snake_case. Rename to '{{ suggestion }}'.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (isConfigFile(context.filename)) {\n return {};\n }\n\n return {\n VariableDeclaration(node) {\n if (node.kind !== \"const\" || !isGlobalScope(node)) {\n return;\n }\n\n node.declarations.forEach((declarator) => {\n if (declarator.id.type !== AST_NODE_TYPES.Identifier || !declarator.init) {\n return;\n }\n\n if (!isMagicLiteral(declarator.init)) {\n return;\n }\n\n const { name } = declarator.id;\n\n if (SNAKE_CASE_REGEX.test(name)) {\n context.report({\n node: declarator.id,\n messageId: \"noSnakeCase\",\n data: { name, suggestion: toScreamingSnakeCase(name) },\n });\n\n return;\n }\n\n if (!SCREAMING_SNAKE_CASE_REGEX.test(name)) {\n context.report({\n node: declarator.id,\n messageId: \"useScreamingSnakeCase\",\n data: { name, suggestion: toScreamingSnakeCase(name) },\n });\n }\n });\n },\n };\n },\n});\n\nexport default enforceConstantCase;\n","import path from \"path\";\n\nimport { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst enforceHookFilename = createRule({\n name: \"enforce-hook-filename\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce that files exporting custom hooks are named *.hook.ts or *.hooks.ts\",\n },\n messages: {\n requireHookFilename: \"'{{ name }}' is a custom hook and must be exported from a *.hook.ts or *.hooks.ts file.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const basename = path.basename(context.filename);\n const isHookFile = basename.endsWith(\".hook.ts\") || basename.endsWith(\".hooks.ts\");\n\n if (isHookFile) return {};\n\n function reportIfHook(name: string, node: TSESTree.Node): void {\n if (name.startsWith(\"use\") && name.length > 3 && /^use[A-Z]/.test(name)) {\n context.report({ node, messageId: \"requireHookFilename\", data: { name } });\n }\n }\n\n return {\n ExportNamedDeclaration(node) {\n if (node.declaration?.type === AST_NODE_TYPES.FunctionDeclaration && node.declaration.id) {\n reportIfHook(node.declaration.id.name, node.declaration.id);\n }\n\n if (node.declaration?.type === AST_NODE_TYPES.VariableDeclaration) {\n for (const declarator of node.declaration.declarations) {\n if (\n declarator.id.type === AST_NODE_TYPES.Identifier &&\n declarator.init !== null &&\n (declarator.init.type === AST_NODE_TYPES.ArrowFunctionExpression ||\n declarator.init.type === AST_NODE_TYPES.FunctionExpression)\n ) {\n reportIfHook(declarator.id.name, declarator.id);\n }\n }\n }\n },\n ExportDefaultDeclaration(node) {\n if (node.declaration.type === AST_NODE_TYPES.FunctionDeclaration && node.declaration.id !== null) {\n reportIfHook(node.declaration.id.name, node.declaration.id);\n }\n },\n };\n },\n});\n\nexport default enforceHookFilename;\n","import path from \"path\";\n\nimport { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst enforceHookNaming = createRule({\n name: \"enforce-hook-naming\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce 'use' prefix for functions in custom hook files (*.hook.ts, *.hooks.ts)\",\n },\n messages: {\n missingUsePrefix: \"Custom hook functions must start with 'use'. Rename '{{ name }}' to '{{ suggestion }}'.\",\n defaultExportMissingUsePrefix:\n \"Default export in hook files must start with 'use'. Rename '{{ name }}' to '{{ suggestion }}'.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const basename = path.basename(filename);\n const isHookFile = basename.endsWith(\".hook.ts\") || basename.endsWith(\".hooks.ts\");\n\n if (!isHookFile) {\n return {};\n }\n\n const getSuggestion = (name: string): string => {\n const capitalizedName = name.charAt(0).toUpperCase() + name.slice(1);\n\n return `use${capitalizedName}`;\n };\n\n const checkFunctionName = (\n name: string,\n node: TSESTree.Node,\n messageId: \"missingUsePrefix\" | \"defaultExportMissingUsePrefix\",\n ): void => {\n if (!name.startsWith(\"use\")) {\n context.report({\n node,\n messageId,\n data: {\n name,\n suggestion: getSuggestion(name),\n },\n });\n }\n };\n\n return {\n ExportNamedDeclaration(node) {\n if (node.declaration?.type === AST_NODE_TYPES.FunctionDeclaration && node.declaration.id) {\n checkFunctionName(node.declaration.id.name, node.declaration.id, \"missingUsePrefix\");\n }\n\n if (node.declaration?.type === AST_NODE_TYPES.VariableDeclaration) {\n node.declaration.declarations.forEach((declarator) => {\n if (declarator.id.type === AST_NODE_TYPES.Identifier) {\n checkFunctionName(declarator.id.name, declarator.id, \"missingUsePrefix\");\n }\n });\n }\n },\n ExportDefaultDeclaration(node) {\n if (node.declaration.type === AST_NODE_TYPES.Identifier) {\n checkFunctionName(node.declaration.name, node.declaration, \"defaultExportMissingUsePrefix\");\n }\n\n if (node.declaration.type === AST_NODE_TYPES.FunctionDeclaration && node.declaration.id) {\n checkFunctionName(node.declaration.id.name, node.declaration.id, \"defaultExportMissingUsePrefix\");\n }\n },\n };\n },\n});\n\nexport default enforceHookNaming;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst SNAKE_CASE_REGEX = /^[a-z]+_[a-z0-9_]*$/;\nconst SCREAMING_SNAKE_CASE_REGEX = /^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$/;\n\nconst isInsideAsConst = (node: TSESTree.ObjectExpression): boolean => {\n const { parent } = node;\n\n if (\n parent.type === AST_NODE_TYPES.TSAsExpression &&\n parent.typeAnnotation.type === AST_NODE_TYPES.TSTypeReference &&\n parent.typeAnnotation.typeName.type === AST_NODE_TYPES.Identifier &&\n parent.typeAnnotation.typeName.name === \"const\"\n ) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ArrayExpression) {\n const grandparent = parent.parent;\n\n if (\n grandparent?.type === AST_NODE_TYPES.TSAsExpression &&\n grandparent.typeAnnotation.type === AST_NODE_TYPES.TSTypeReference &&\n grandparent.typeAnnotation.typeName.type === AST_NODE_TYPES.Identifier &&\n grandparent.typeAnnotation.typeName.name === \"const\"\n ) {\n return true;\n }\n }\n\n return false;\n};\n\nconst enforcePropertyCase = createRule({\n name: \"enforce-property-case\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce camelCase for unquoted object property keys\",\n },\n messages: {\n useCamelCase:\n \"Property '{{ name }}' should use camelCase. Use camelCase for object properties, or wrap in quotes if required by an API.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Property(node) {\n if (node.parent.type !== AST_NODE_TYPES.ObjectExpression) {\n return;\n }\n\n if (isInsideAsConst(node.parent)) {\n return;\n }\n\n if (node.computed) {\n return;\n }\n\n if (node.key.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const { name } = node.key;\n\n if (SNAKE_CASE_REGEX.test(name) || SCREAMING_SNAKE_CASE_REGEX.test(name)) {\n context.report({\n node: node.key,\n messageId: \"useCamelCase\",\n data: { name },\n });\n }\n },\n };\n },\n});\n\nexport default enforcePropertyCase;\n","import path from \"path\";\n\nimport { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst enforcePropsSuffix = createRule({\n name: \"enforce-props-suffix\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce 'Props' suffix for interfaces and types in component files (*.tsx)\",\n },\n messages: {\n missingPropsSuffix: \"Interface/type '{{ name }}' should end with 'Props'. Rename to '{{ suggestion }}'.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const ext = path.extname(filename);\n const isComponentFile = ext === \".tsx\" || ext === \".jsx\";\n\n if (!isComponentFile) {\n return {};\n }\n\n const checkTypeName = (name: string, node: TSESTree.Node): void => {\n if (!name.endsWith(\"Props\")) {\n context.report({\n node,\n messageId: \"missingPropsSuffix\",\n data: {\n name,\n suggestion: `${name}Props`,\n },\n });\n }\n };\n\n return {\n TSInterfaceDeclaration(node) {\n if (node.id.type === AST_NODE_TYPES.Identifier) {\n checkTypeName(node.id.name, node.id);\n }\n },\n TSTypeAliasDeclaration(node) {\n if (node.id.type === AST_NODE_TYPES.Identifier) {\n if (node.typeAnnotation.type === AST_NODE_TYPES.TSTypeLiteral) {\n checkTypeName(node.id.name, node.id);\n }\n }\n },\n };\n },\n});\n\nexport default enforcePropsSuffix;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").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 if (!isJsxFile(context.filename)) return {};\n\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 { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { getFileExtension } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst ARRAY_RETURNING_METHODS = new Set([\"map\", \"flatMap\", \"filter\"]);\n\nfunction hasRenderPrefix(name: string): boolean {\n if (!name.startsWith(\"render\")) {\n return false;\n }\n if (name.length === \"render\".length) {\n return true;\n }\n const nextChar = name[\"render\".length];\n return nextChar === nextChar.toUpperCase() && nextChar !== nextChar.toLowerCase();\n}\n\nfunction functionBodyReturnsJsx(body: TSESTree.BlockStatement | TSESTree.Expression): boolean {\n if (body.type === AST_NODE_TYPES.JSXElement || body.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n\n if (body.type === AST_NODE_TYPES.ConditionalExpression) {\n return isJsxProducingExpression(body.consequent) || isJsxProducingExpression(body.alternate);\n }\n\n if (body.type === AST_NODE_TYPES.LogicalExpression) {\n return isJsxProducingExpression(body.right);\n }\n\n if (body.type !== AST_NODE_TYPES.BlockStatement) {\n return false;\n }\n\n for (const statement of body.body) {\n if (statement.type === AST_NODE_TYPES.ReturnStatement && statement.argument) {\n if (isJsxProducingExpression(statement.argument)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nfunction isJsxProducingExpression(node: TSESTree.Expression): boolean {\n if (node.type === AST_NODE_TYPES.JSXElement || node.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.ConditionalExpression) {\n return isJsxProducingExpression(node.consequent) || isJsxProducingExpression(node.alternate);\n }\n\n if (node.type === AST_NODE_TYPES.LogicalExpression) {\n return isJsxProducingExpression(node.right);\n }\n\n if (node.type === AST_NODE_TYPES.ArrayExpression) {\n return node.elements.some((element) => {\n if (!element || element.type === AST_NODE_TYPES.SpreadElement) {\n return false;\n }\n return isJsxProducingExpression(element as TSESTree.Expression);\n });\n }\n\n if (node.type === AST_NODE_TYPES.ArrowFunctionExpression || node.type === AST_NODE_TYPES.FunctionExpression) {\n return functionBodyReturnsJsx(node.body);\n }\n\n if (node.type === AST_NODE_TYPES.CallExpression) {\n if (\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n node.callee.property.type === AST_NODE_TYPES.Identifier &&\n ARRAY_RETURNING_METHODS.has(node.callee.property.name)\n ) {\n const callback = node.arguments[0];\n if (\n callback &&\n (callback.type === AST_NODE_TYPES.ArrowFunctionExpression ||\n callback.type === AST_NODE_TYPES.FunctionExpression)\n ) {\n return functionBodyReturnsJsx(callback.body);\n }\n }\n }\n\n if (node.type === AST_NODE_TYPES.TSAsExpression || node.type === AST_NODE_TYPES.TSSatisfiesExpression) {\n return isJsxProducingExpression(node.expression);\n }\n\n return false;\n}\n\nfunction isPascalCase(name: string): boolean {\n return /^[A-Z]/.test(name);\n}\n\nfunction isComponentFunction(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclaration | TSESTree.FunctionExpression,\n): boolean {\n if (node.type === AST_NODE_TYPES.FunctionDeclaration && node.id && isPascalCase(node.id.name)) {\n return true;\n }\n\n const parent = node.parent;\n if (\n parent?.type === AST_NODE_TYPES.VariableDeclarator &&\n parent.id.type === AST_NODE_TYPES.Identifier &&\n isPascalCase(parent.id.name)\n ) {\n return true;\n }\n\n return false;\n}\n\nconst enforceRenderNaming = createRule({\n name: \"enforce-render-naming\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Enforce 'render' prefix for variables that hold or return JSX inside React components\",\n },\n schema: [],\n messages: {\n missingRenderPrefix:\n \"Variable '{{ name }}' holds JSX-producing content inside a component. Rename it to 'render{{ pascalName }}' so the intent is explicit.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const extension = getFileExtension(filename);\n\n if (extension !== \"tsx\" && extension !== \"jsx\") {\n return {};\n }\n\n const componentStack: boolean[] = [];\n\n function isInsideComponent(): boolean {\n return componentStack.some((value) => value);\n }\n\n function pushFunction(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclaration | TSESTree.FunctionExpression,\n ) {\n componentStack.push(isComponentFunction(node));\n }\n\n function popFunction() {\n componentStack.pop();\n }\n\n return {\n ArrowFunctionExpression: pushFunction,\n FunctionDeclaration: pushFunction,\n FunctionExpression: pushFunction,\n \"ArrowFunctionExpression:exit\": popFunction,\n \"FunctionDeclaration:exit\": popFunction,\n \"FunctionExpression:exit\": popFunction,\n VariableDeclarator(node: TSESTree.VariableDeclarator) {\n if (!isInsideComponent()) {\n return;\n }\n\n if (node.id.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n if (!node.init) {\n return;\n }\n\n if (!isJsxProducingExpression(node.init)) {\n return;\n }\n\n const name = node.id.name;\n if (hasRenderPrefix(name)) {\n return;\n }\n\n const pascalName = name.charAt(0).toUpperCase() + name.slice(1);\n\n context.report({\n node: node.id,\n messageId: \"missingRenderPrefix\",\n data: { name, pascalName },\n });\n },\n };\n },\n});\n\nexport default enforceRenderNaming;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst BANNED_PREFIXES: Record<string, string[]> = {\n delete: [\"remove\", \"archive\"],\n do: [\"submit\", \"process\"],\n handle: [\"create\", \"verify\"],\n set: [\"update\", \"save\", \"patch\"],\n};\n\nconst enforceServiceNaming = createRule({\n name: \"enforce-service-naming\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Ban misleading function name prefixes in *.service.ts files\",\n },\n messages: {\n bannedPrefix:\n \"Avoid '{{ prefix }}' prefix in service functions. Rename '{{ name }}' to use a more descriptive prefix (e.g. {{ suggestions }}).\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const isServiceFile = filename.endsWith(\".service.ts\");\n\n if (!isServiceFile) {\n return {};\n }\n\n const checkFunctionName = (name: string, node: TSESTree.Node): void => {\n const matchedPrefix = Object.keys(BANNED_PREFIXES).find(\n (prefix) =>\n name.startsWith(prefix) &&\n name.length > prefix.length &&\n name[prefix.length] === name[prefix.length]?.toUpperCase(),\n );\n\n if (matchedPrefix) {\n context.report({\n node,\n messageId: \"bannedPrefix\",\n data: {\n prefix: matchedPrefix,\n name,\n suggestions: BANNED_PREFIXES[matchedPrefix].join(\", \"),\n },\n });\n }\n };\n\n const checkExportedFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.ArrowFunctionExpression,\n id: TSESTree.Identifier | null,\n ): void => {\n if (!node.async || !id) {\n return;\n }\n\n checkFunctionName(id.name, id);\n };\n\n return {\n ExportNamedDeclaration(node) {\n if (node.declaration?.type === AST_NODE_TYPES.FunctionDeclaration && node.declaration.id) {\n checkExportedFunction(node.declaration, node.declaration.id);\n }\n\n if (node.declaration?.type === AST_NODE_TYPES.VariableDeclaration) {\n node.declaration.declarations.forEach((declarator) => {\n if (\n declarator.id.type === AST_NODE_TYPES.Identifier &&\n declarator.init?.type === AST_NODE_TYPES.ArrowFunctionExpression\n ) {\n checkExportedFunction(declarator.init, declarator.id);\n }\n });\n }\n },\n };\n },\n});\n\nexport default enforceServiceNaming;\n","import path from \"path\";\n\nimport { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst TEST_GLOBALS = new Set([\"describe\", \"it\", \"test\", \"beforeEach\", \"beforeAll\", \"afterEach\", \"afterAll\"]);\n\nconst enforceTestFilename = createRule({\n name: \"enforce-test-filename\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce that files containing test code are named *.test.ts or *.test.tsx\",\n },\n messages: {\n requireTestFilename: \"Files containing test code must be named *.test.ts or *.test.tsx.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const basename = path.basename(context.filename);\n const isTestFile = basename.endsWith(\".test.ts\") || basename.endsWith(\".test.tsx\");\n\n if (isTestFile) return {};\n\n function isTestGlobalCall(node: TSESTree.CallExpression): boolean {\n return node.callee.type === AST_NODE_TYPES.Identifier && TEST_GLOBALS.has(node.callee.name);\n }\n\n let reported = false;\n\n return {\n CallExpression(node) {\n if (reported) return;\n if (!isTestGlobalCall(node)) return;\n\n reported = true;\n context.report({ node, messageId: \"requireTestFilename\" });\n },\n };\n },\n});\n\nexport default enforceTestFilename;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst enforceSortedDestructuring = createRule({\n name: \"enforce-sorted-destructuring\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce alphabetical sorting of destructured properties with defaults first\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n unsortedDestructuring:\n \"Destructured properties should be sorted alphabetically. Properties with defaults should come first, sorted alphabetically.\",\n },\n },\n defaultOptions: [],\n create(context) {\n function getPropertyName(property: TSESTree.Property | TSESTree.RestElement): string | null {\n if (property.type === AST_NODE_TYPES.RestElement) {\n return null;\n }\n\n if (property.key.type === AST_NODE_TYPES.Identifier) {\n return property.key.name;\n }\n\n return null;\n }\n\n function hasDefaultValue(property: TSESTree.Property): boolean {\n return property.value.type === AST_NODE_TYPES.AssignmentPattern && Boolean(property.value.right);\n }\n\n function checkVariableDeclarator(node: TSESTree.VariableDeclarator) {\n if (node.id.type !== AST_NODE_TYPES.ObjectPattern) {\n return;\n }\n\n const { properties } = node.id;\n\n if (properties.length < 2) {\n return;\n }\n\n const propertyInfo = properties\n .map((prop) => {\n if (prop.type === AST_NODE_TYPES.RestElement) {\n return null;\n }\n return {\n property: prop,\n name: getPropertyName(prop),\n hasDefault: hasDefaultValue(prop),\n };\n })\n .filter((info): info is NonNullable<typeof info> => info !== null && info.name !== null);\n\n const sorted = [...propertyInfo].sort((a, b) => {\n if (a.hasDefault && !b.hasDefault) {\n return -1;\n }\n if (!a.hasDefault && b.hasDefault) {\n return 1;\n }\n\n return a.name!.localeCompare(b.name!);\n });\n\n const isSorted = propertyInfo.every((info, index) => info.name === sorted[index].name);\n\n if (!isSorted) {\n context.report({\n node: node.id,\n messageId: \"unsortedDestructuring\",\n fix(fixer) {\n const { sourceCode } = context;\n const sortedTexts = sorted.map((info) => sourceCode.getText(info.property));\n\n return propertyInfo.map((info, index) => fixer.replaceText(info.property, sortedTexts[index]));\n },\n });\n }\n }\n\n return {\n VariableDeclarator: checkVariableDeclarator,\n };\n },\n});\n\nexport default enforceSortedDestructuring;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction getTypeDeclarationName(node: TSESTree.Node): { name: string; position: number } | null {\n if (node.type === AST_NODE_TYPES.TSInterfaceDeclaration && node.id.type === AST_NODE_TYPES.Identifier) {\n return { name: node.id.name, position: node.range[0] };\n }\n\n if (node.type === AST_NODE_TYPES.TSTypeAliasDeclaration && node.id.type === AST_NODE_TYPES.Identifier) {\n return { name: node.id.name, position: node.range[0] };\n }\n\n return null;\n}\n\nconst enforceTypeDeclarationOrder = createRule({\n name: \"enforce-type-declaration-order\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce that referenced types and interfaces are declared after the type that uses them\",\n },\n fixable: undefined,\n schema: [],\n messages: {\n dependencyBeforeConsumer: \"'{{dependency}}' should be declared after '{{consumer}}' which references it\",\n },\n },\n defaultOptions: [],\n create(context) {\n const typeDeclarations = new Map<string, number>();\n const reported = new Set<string>();\n\n return {\n TSInterfaceDeclaration(node) {\n const info = getTypeDeclarationName(node);\n\n if (info) {\n typeDeclarations.set(info.name, info.position);\n }\n },\n\n TSTypeAliasDeclaration(node) {\n const info = getTypeDeclarationName(node);\n\n if (info) {\n typeDeclarations.set(info.name, info.position);\n }\n },\n\n \"TSPropertySignature TSTypeReference\": function checkTypeReference(node: TSESTree.TSTypeReference) {\n if (node.typeName.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const referencedName = node.typeName.name;\n const referencedPosition = typeDeclarations.get(referencedName);\n\n if (referencedPosition === undefined) {\n return;\n }\n\n let current: TSESTree.Node | undefined = node.parent;\n\n while (current) {\n const consumerInfo = getTypeDeclarationName(current);\n\n if (consumerInfo) {\n if (referencedPosition < consumerInfo.position) {\n const reportKey = `${referencedName}-${consumerInfo.name}`;\n\n if (!reported.has(reportKey)) {\n reported.add(reportKey);\n context.report({\n node: node.typeName,\n messageId: \"dependencyBeforeConsumer\",\n data: {\n dependency: referencedName,\n consumer: consumerInfo.name,\n },\n });\n }\n }\n\n break;\n }\n\n current = current.parent;\n }\n },\n };\n },\n});\n\nexport default enforceTypeDeclarationOrder;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { getBaseName } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst isIndexFile = (filename: string): boolean => getBaseName(filename) === \"index\";\n\nconst isAllowedExportNamed = (node: TSESTree.ExportNamedDeclaration): boolean => {\n if (!node.declaration) {\n return true;\n }\n\n return (\n node.declaration.type === AST_NODE_TYPES.TSTypeAliasDeclaration ||\n node.declaration.type === AST_NODE_TYPES.TSInterfaceDeclaration\n );\n};\n\nconst isAllowedExportDefault = (node: TSESTree.ExportDefaultDeclaration): boolean =>\n node.declaration.type === AST_NODE_TYPES.Identifier;\n\nconst isAllowedTopLevel = (node: TSESTree.ProgramStatement): boolean => {\n switch (node.type) {\n case AST_NODE_TYPES.ImportDeclaration:\n case AST_NODE_TYPES.ExportAllDeclaration:\n case AST_NODE_TYPES.TSTypeAliasDeclaration:\n case AST_NODE_TYPES.TSInterfaceDeclaration:\n case AST_NODE_TYPES.TSImportEqualsDeclaration:\n return true;\n case AST_NODE_TYPES.ExportNamedDeclaration:\n return isAllowedExportNamed(node);\n case AST_NODE_TYPES.ExportDefaultDeclaration:\n return isAllowedExportDefault(node);\n default:\n return false;\n }\n};\n\nconst indexExportOnly = createRule({\n name: \"index-export-only\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Restrict index files to imports, re-exports, and type declarations only.\",\n },\n messages: {\n indexExportOnly:\n \"Index files must contain only imports, re-exports, and type declarations. Move runtime code to a separate module and re-export it from here.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (!isIndexFile(context.filename)) {\n return {};\n }\n\n return {\n Program(node: TSESTree.Program) {\n for (const statement of node.body) {\n if (!isAllowedTopLevel(statement)) {\n context.report({\n node: statement,\n messageId: \"indexExportOnly\",\n });\n }\n }\n },\n };\n },\n});\n\nexport default indexExportOnly;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst jsxNewlineBetweenElements = createRule({\n name: \"jsx-newline-between-elements\",\n meta: {\n type: \"layout\",\n docs: {\n description: \"Require empty lines between sibling JSX elements\",\n },\n fixable: \"whitespace\",\n schema: [],\n messages: {\n requireNewline: \"Expected empty line between sibling JSX elements\",\n forbidNewline: \"Unexpected empty line between single-line sibling JSX elements\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n const { sourceCode } = context;\n\n function isSignificantJSXChild(node: TSESTree.Node): boolean {\n return (\n node.type === AST_NODE_TYPES.JSXElement ||\n node.type === AST_NODE_TYPES.JSXFragment ||\n node.type === AST_NODE_TYPES.JSXExpressionContainer\n );\n }\n\n function isMultiLine(node: TSESTree.Node): boolean {\n return node.loc.start.line !== node.loc.end.line;\n }\n\n function checkSiblings(children: TSESTree.JSXChild[]) {\n const jsxElements = children.filter(\n (child): child is TSESTree.JSXElement | TSESTree.JSXFragment | TSESTree.JSXExpressionContainer =>\n isSignificantJSXChild(child),\n );\n\n for (let i = 0; i < jsxElements.length - 1; i += 1) {\n const current = jsxElements[i];\n const next = jsxElements[i + 1];\n\n const needsNewline = isMultiLine(current) || isMultiLine(next);\n\n if (needsNewline) {\n const currentEndLine = current.loc.end.line;\n const nextStartLine = next.loc.start.line;\n const lineDiff = nextStartLine - currentEndLine;\n\n if (lineDiff < 2) {\n context.report({\n node: next,\n messageId: \"requireNewline\",\n fix(fixer) {\n const textBetween = sourceCode.getText().slice(current.range[1], next.range[0]);\n\n if (textBetween.includes(\"//\") || textBetween.includes(\"/*\")) {\n return null;\n }\n\n return fixer.insertTextAfter(current, \"\\n\");\n },\n });\n }\n }\n }\n }\n\n return {\n JSXElement(node) {\n if (node.children.length > 0) {\n checkSiblings(node.children);\n }\n },\n JSXFragment(node) {\n if (node.children.length > 0) {\n checkSiblings(node.children);\n }\n },\n };\n },\n});\n\nexport default jsxNewlineBetweenElements;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { getFileExtension } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isObjectLikeElement(node: TSESTree.Expression | TSESTree.SpreadElement | null): boolean {\n if (!node) {\n return false;\n }\n\n if (node.type === AST_NODE_TYPES.ObjectExpression) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.TSAsExpression || node.type === AST_NODE_TYPES.TSSatisfiesExpression) {\n return isObjectLikeElement(node.expression);\n }\n\n return false;\n}\n\nfunction getArrayInitializer(init: TSESTree.Expression | null): TSESTree.ArrayExpression | null {\n if (!init) {\n return null;\n }\n\n if (init.type === AST_NODE_TYPES.ArrayExpression) {\n return init;\n }\n\n if (init.type === AST_NODE_TYPES.TSAsExpression || init.type === AST_NODE_TYPES.TSSatisfiesExpression) {\n return getArrayInitializer(init.expression);\n }\n\n return null;\n}\n\nconst jsxNoDataArray = createRule({\n name: \"jsx-no-data-array\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow top-level arrays of object literals in .tsx/.jsx files (extract to a data file)\",\n },\n schema: [],\n messages: {\n noDataArray:\n \"Top-level array of object literals belongs in a data file (e.g. *.data.ts), not a .tsx/.jsx component file. Extract '{{ name }}' to a sibling data module.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const extension = getFileExtension(filename);\n\n if (extension !== \"tsx\" && extension !== \"jsx\") {\n return {};\n }\n\n return {\n \"Program > VariableDeclaration > VariableDeclarator\": function checkDeclarator(\n node: TSESTree.VariableDeclarator,\n ) {\n const arrayInit = getArrayInitializer(node.init);\n if (!arrayInit) {\n return;\n }\n\n const hasObjectElement = arrayInit.elements.some((element) => isObjectLikeElement(element));\n if (!hasObjectElement) {\n return;\n }\n\n const name = node.id.type === AST_NODE_TYPES.Identifier ? node.id.name : \"<destructured>\";\n\n context.report({\n node,\n messageId: \"noDataArray\",\n data: { name },\n });\n },\n \"Program > ExportNamedDeclaration > VariableDeclaration > VariableDeclarator\": function checkExportedDeclarator(\n node: TSESTree.VariableDeclarator,\n ) {\n const arrayInit = getArrayInitializer(node.init);\n if (!arrayInit) {\n return;\n }\n\n const hasObjectElement = arrayInit.elements.some((element) => isObjectLikeElement(element));\n if (!hasObjectElement) {\n return;\n }\n\n const name = node.id.type === AST_NODE_TYPES.Identifier ? node.id.name : \"<destructured>\";\n\n context.report({\n node,\n messageId: \"noDataArray\",\n data: { name },\n });\n },\n };\n },\n});\n\nexport default jsxNoDataArray;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { getFileExtension } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction unwrapAssertion(node: TSESTree.Expression | null): TSESTree.Expression | null {\n if (!node) {\n return null;\n }\n\n if (node.type === AST_NODE_TYPES.TSAsExpression || node.type === AST_NODE_TYPES.TSSatisfiesExpression) {\n return unwrapAssertion(node.expression);\n }\n\n return node;\n}\n\nfunction isNestedValue(value: TSESTree.Expression | null): boolean {\n const unwrapped = unwrapAssertion(value);\n if (!unwrapped) {\n return false;\n }\n\n if (unwrapped.type === AST_NODE_TYPES.ObjectExpression) {\n return true;\n }\n\n if (unwrapped.type === AST_NODE_TYPES.ArrayExpression) {\n return unwrapped.elements.some((element) => {\n if (!element || element.type === AST_NODE_TYPES.SpreadElement) {\n return false;\n }\n const inner = unwrapAssertion(element);\n return inner?.type === AST_NODE_TYPES.ObjectExpression || inner?.type === AST_NODE_TYPES.ArrayExpression;\n });\n }\n\n return false;\n}\n\nfunction hasNestedProperty(object: TSESTree.ObjectExpression): boolean {\n return object.properties.some((property) => {\n if (property.type !== AST_NODE_TYPES.Property) {\n return false;\n }\n if (property.value.type === AST_NODE_TYPES.AssignmentPattern) {\n return false;\n }\n return isNestedValue(property.value as TSESTree.Expression);\n });\n}\n\nfunction getObjectInitializer(init: TSESTree.Expression | null): TSESTree.ObjectExpression | null {\n const unwrapped = unwrapAssertion(init);\n if (!unwrapped) {\n return null;\n }\n\n if (unwrapped.type === AST_NODE_TYPES.ObjectExpression) {\n return unwrapped;\n }\n\n return null;\n}\n\nconst jsxNoDataObject = createRule({\n name: \"jsx-no-data-object\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow top-level nested object literals in .tsx/.jsx files (extract to a data file)\",\n },\n schema: [],\n messages: {\n noDataObject:\n \"Top-level nested object literal belongs in a data file (e.g. *.data.ts), not a .tsx/.jsx component file. Extract '{{ name }}' to a sibling data module.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const extension = getFileExtension(filename);\n\n if (extension !== \"tsx\" && extension !== \"jsx\") {\n return {};\n }\n\n function checkDeclarator(node: TSESTree.VariableDeclarator) {\n const objectInit = getObjectInitializer(node.init);\n if (!objectInit) {\n return;\n }\n\n if (!hasNestedProperty(objectInit)) {\n return;\n }\n\n const name = node.id.type === AST_NODE_TYPES.Identifier ? node.id.name : \"<destructured>\";\n\n context.report({\n node,\n messageId: \"noDataObject\",\n data: { name },\n });\n }\n\n return {\n \"Program > VariableDeclaration > VariableDeclarator\": checkDeclarator,\n \"Program > ExportNamedDeclaration > VariableDeclaration > VariableDeclarator\": checkDeclarator,\n };\n },\n});\n\nexport default jsxNoDataObject;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst jsxNoInlineObjectProp = createRule({\n name: \"jsx-no-inline-object-prop\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow inline object literals in JSX props - extract to const first\",\n },\n messages: {\n noInlineObject:\n \"Avoid inline object literals in JSX props. Extract to a const variable first for better readability and performance.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n return {\n JSXAttribute(node) {\n if (\n node.value?.type === AST_NODE_TYPES.JSXExpressionContainer &&\n node.value.expression.type === AST_NODE_TYPES.ObjectExpression\n ) {\n context.report({\n node: node.value,\n messageId: \"noInlineObject\",\n });\n }\n },\n };\n },\n});\n\nexport default jsxNoInlineObjectProp;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isJSXElementOrFragment(node: TSESTree.Node): boolean {\n return node.type === AST_NODE_TYPES.JSXElement || node.type === AST_NODE_TYPES.JSXFragment;\n}\n\nfunction isSingleLine(node: TSESTree.Node): boolean {\n return node.loc.start.line === node.loc.end.line;\n}\n\nconst jsxNoNewlineSingleLineElements = createRule({\n name: \"jsx-no-newline-single-line-elements\",\n meta: {\n type: \"layout\",\n docs: {\n description: \"Disallow empty lines between single-line sibling JSX elements\",\n },\n fixable: \"whitespace\",\n schema: [],\n messages: {\n forbidNewline: \"Unexpected empty line between single-line sibling JSX elements.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n const { sourceCode } = context;\n\n function checkSiblings(children: TSESTree.JSXChild[]): void {\n const nonWhitespace = children.filter(\n (child) => !(child.type === AST_NODE_TYPES.JSXText && child.value.trim() === \"\"),\n );\n\n nonWhitespace.forEach((next, index) => {\n if (index === 0) {\n return;\n }\n\n const current = nonWhitespace[index - 1];\n\n if (!isJSXElementOrFragment(current) || !isJSXElementOrFragment(next)) {\n return;\n }\n\n if (!isSingleLine(current) || !isSingleLine(next)) {\n return;\n }\n\n const currentEndLine = current.loc.end.line;\n const nextStartLine = next.loc.start.line;\n const lineDiff = nextStartLine - currentEndLine;\n\n if (lineDiff < 2) {\n return;\n }\n\n context.report({\n node: next,\n messageId: \"forbidNewline\",\n fix(fixer) {\n const textBetween = sourceCode.getText().slice(current.range[1], next.range[0]);\n\n if (textBetween.includes(\"//\") || textBetween.includes(\"/*\")) {\n return null;\n }\n\n const indent = \" \".repeat(next.loc.start.column);\n\n return fixer.replaceTextRange([current.range[1], next.range[0]], `\\n${indent}`);\n },\n });\n });\n }\n\n return {\n JSXElement(node) {\n if (node.children.length > 0) {\n checkSiblings(node.children);\n }\n },\n JSXFragment(node) {\n if (node.children.length > 0) {\n checkSiblings(node.children);\n }\n },\n };\n },\n});\n\nexport default jsxNoNewlineSingleLineElements;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { getFileExtension } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst jsxNoNonComponentFunction = createRule({\n name: \"jsx-no-non-component-function\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow non-component functions defined at top level in .tsx and .jsx files\",\n },\n schema: [],\n messages: {\n noTopLevelFunction:\n \"Non-component functions should not be defined at top level in .tsx/.jsx files. Either move it inside the component or extract it to a separate file.\",\n },\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const extension = getFileExtension(filename);\n\n if (extension !== \"tsx\" && extension !== \"jsx\") {\n return {};\n }\n\n function isReactComponent(node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclaration): boolean {\n const functionName = node.type === AST_NODE_TYPES.FunctionDeclaration && node.id ? node.id.name : null;\n\n if (functionName && /^[A-Z]/.test(functionName)) {\n return true;\n }\n\n if (node.returnType?.typeAnnotation) {\n const returnTypeNode = node.returnType.typeAnnotation;\n if (\n returnTypeNode.type === AST_NODE_TYPES.TSTypeReference &&\n returnTypeNode.typeName.type === AST_NODE_TYPES.Identifier\n ) {\n const typeName = returnTypeNode.typeName.name;\n if (typeName === \"JSX\" || typeName === \"ReactElement\" || typeName === \"ReactNode\") {\n return true;\n }\n }\n }\n\n return false;\n }\n\n function checkTopLevelFunction(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclaration,\n declaratorNode?: TSESTree.VariableDeclarator,\n ) {\n if (isReactComponent(node)) {\n return;\n }\n\n const { parent } = node;\n if (!parent) {\n return;\n }\n\n if (\n parent.type === AST_NODE_TYPES.ExportDefaultDeclaration ||\n parent.type === AST_NODE_TYPES.ExportNamedDeclaration\n ) {\n return;\n }\n\n if (declaratorNode?.parent?.parent?.type === AST_NODE_TYPES.ExportNamedDeclaration) {\n return;\n }\n\n if (declaratorNode?.id.type === AST_NODE_TYPES.Identifier) {\n const varName = declaratorNode.id.name;\n if (/^[A-Z]/.test(varName)) {\n return;\n }\n }\n\n context.report({\n node: declaratorNode || node,\n messageId: \"noTopLevelFunction\",\n });\n }\n\n return {\n \"Program > VariableDeclaration > VariableDeclarator > ArrowFunctionExpression\": function checkArrowFunction(\n node: TSESTree.ArrowFunctionExpression,\n ) {\n const declarator = node.parent as TSESTree.VariableDeclarator;\n checkTopLevelFunction(node, declarator);\n },\n \"Program > FunctionDeclaration\": function checkFunctionDeclaration(node: TSESTree.FunctionDeclaration) {\n checkTopLevelFunction(node);\n },\n };\n },\n});\n\nexport default jsxNoNonComponentFunction;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { getFileExtension } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst PROPS_WRAPPER_NAMES = new Set([\"Readonly\", \"Required\", \"Partial\", \"PropsWithChildren\", \"NoInfer\"]);\n\nfunction unwrapWrapperType(node: TSESTree.TypeNode): TSESTree.TypeNode {\n if (\n node.type === AST_NODE_TYPES.TSTypeReference &&\n node.typeName.type === AST_NODE_TYPES.Identifier &&\n PROPS_WRAPPER_NAMES.has(node.typeName.name) &&\n node.typeArguments &&\n node.typeArguments.params.length > 0\n ) {\n return unwrapWrapperType(node.typeArguments.params[0]);\n }\n return node;\n}\n\nfunction getMainTypeName(typeNode: TSESTree.TypeNode | undefined): string | null {\n if (!typeNode) {\n return null;\n }\n const unwrapped = unwrapWrapperType(typeNode);\n if (unwrapped.type === AST_NODE_TYPES.TSTypeReference && unwrapped.typeName.type === AST_NODE_TYPES.Identifier) {\n return unwrapped.typeName.name;\n }\n return null;\n}\n\nfunction getComponentMainTypeName(\n node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclaration | TSESTree.FunctionExpression,\n): string | null {\n const firstParam = node.params[0];\n if (!firstParam) {\n return null;\n }\n\n if (\"typeAnnotation\" in firstParam && firstParam.typeAnnotation) {\n return getMainTypeName(firstParam.typeAnnotation.typeAnnotation);\n }\n\n return null;\n}\n\nfunction isPascalCase(name: string): boolean {\n return /^[A-Z]/.test(name);\n}\n\nfunction getDeclarationFromExportWrapper(node: TSESTree.ProgramStatement): TSESTree.Node {\n if (node.type === AST_NODE_TYPES.ExportNamedDeclaration && node.declaration) {\n return node.declaration;\n }\n if (node.type === AST_NODE_TYPES.ExportDefaultDeclaration) {\n return node.declaration;\n }\n return node;\n}\n\nconst jsxNoSubInterface = createRule({\n name: \"jsx-no-sub-interface\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow sub-interfaces and helper types in component files; keep only the main component props (extract the rest)\",\n },\n schema: [],\n messages: {\n noSubInterface:\n \"Sub-interface or helper type '{{ name }}' should not live in a component file. Extract it to a sibling module (e.g., a *.types.ts file or its own component file).\",\n },\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n const extension = getFileExtension(filename);\n\n if (extension !== \"tsx\" && extension !== \"jsx\") {\n return {};\n }\n\n return {\n Program(programNode: TSESTree.Program) {\n const mainTypes = new Set<string>();\n const typeDeclarations: Array<{ name: string; node: TSESTree.Node }> = [];\n let componentCount = 0;\n\n for (const statement of programNode.body) {\n const declaration = getDeclarationFromExportWrapper(statement);\n\n if (\n declaration.type === AST_NODE_TYPES.FunctionDeclaration &&\n declaration.id &&\n isPascalCase(declaration.id.name)\n ) {\n componentCount += 1;\n const mainType = getComponentMainTypeName(declaration);\n if (mainType) {\n mainTypes.add(mainType);\n }\n continue;\n }\n\n if (declaration.type === AST_NODE_TYPES.VariableDeclaration) {\n for (const declarator of declaration.declarations) {\n if (declarator.id.type !== AST_NODE_TYPES.Identifier) {\n continue;\n }\n if (!isPascalCase(declarator.id.name)) {\n continue;\n }\n const init = declarator.init;\n if (\n init &&\n (init.type === AST_NODE_TYPES.ArrowFunctionExpression ||\n init.type === AST_NODE_TYPES.FunctionExpression)\n ) {\n componentCount += 1;\n const mainType = getComponentMainTypeName(init);\n if (mainType) {\n mainTypes.add(mainType);\n }\n }\n }\n continue;\n }\n\n if (declaration.type === AST_NODE_TYPES.TSInterfaceDeclaration) {\n typeDeclarations.push({ name: declaration.id.name, node: declaration });\n continue;\n }\n\n if (declaration.type === AST_NODE_TYPES.TSTypeAliasDeclaration) {\n typeDeclarations.push({ name: declaration.id.name, node: declaration });\n continue;\n }\n }\n\n if (componentCount === 0) {\n return;\n }\n\n for (const declaration of typeDeclarations) {\n if (mainTypes.has(declaration.name)) {\n continue;\n }\n\n context.report({\n node: declaration.node,\n messageId: \"noSubInterface\",\n data: { name: declaration.name },\n });\n }\n },\n };\n },\n});\n\nexport default jsxNoSubInterface;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isNullOrUndefined(node: TSESTree.Node): boolean {\n if (node.type === AST_NODE_TYPES.Literal && node.value === null) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.Identifier && node.name === \"undefined\") {\n return true;\n }\n\n return false;\n}\n\nconst jsxNoTernaryNull = createRule({\n name: \"jsx-no-ternary-null\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce logical AND over ternary with null/undefined in JSX expressions\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n preferLogicalAnd: \"Use logical AND (&&) instead of ternary with null/undefined\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n return {\n JSXExpressionContainer(node: TSESTree.JSXExpressionContainer) {\n const { expression } = node;\n\n if (expression.type !== AST_NODE_TYPES.ConditionalExpression) {\n return;\n }\n\n const { test, consequent, alternate } = expression;\n\n if (isNullOrUndefined(alternate)) {\n const testText = context.sourceCode.getText(test);\n const consequentText = context.sourceCode.getText(consequent);\n\n context.report({\n node: expression,\n messageId: \"preferLogicalAnd\",\n fix(fixer) {\n return fixer.replaceText(expression, `${testText} && (${consequentText})`);\n },\n });\n } else if (isNullOrUndefined(consequent)) {\n const testText = context.sourceCode.getText(test);\n const alternateText = context.sourceCode.getText(alternate);\n\n context.report({\n node: expression,\n messageId: \"preferLogicalAnd\",\n fix(fixer) {\n return fixer.replaceText(expression, `!${testText} && (${alternateText})`);\n },\n });\n }\n },\n };\n },\n});\n\nexport default jsxNoTernaryNull;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst jsxNoVariableInCallback = createRule({\n name: \"jsx-no-variable-in-callback\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow variable declarations inside callback functions within JSX\",\n },\n schema: [],\n messages: {\n noVariableInCallback:\n \"Variable declarations should not be inside callback functions within JSX. Extract the logic to a separate function outside the JSX.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n function isInsideJSX(node: TSESTree.Node): boolean {\n let current = node.parent;\n while (current) {\n if (current.type === AST_NODE_TYPES.JSXElement || current.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n current = current.parent;\n }\n return false;\n }\n\n function isCallbackInJSX(node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression): boolean {\n if (!node.parent) {\n return false;\n }\n\n if (!isInsideJSX(node)) {\n return false;\n }\n\n if (\n node.parent.type === AST_NODE_TYPES.CallExpression ||\n node.parent.type === AST_NODE_TYPES.JSXExpressionContainer\n ) {\n return true;\n }\n\n if (node.parent.type === AST_NODE_TYPES.ArrayExpression && node.parent.parent) {\n if (\n node.parent.parent.type === AST_NODE_TYPES.CallExpression ||\n node.parent.parent.type === AST_NODE_TYPES.JSXExpressionContainer\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n function checkFunctionBody(node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression) {\n if (!isCallbackInJSX(node)) {\n return;\n }\n\n const { body } = node;\n\n if (body.type !== AST_NODE_TYPES.BlockStatement) {\n return;\n }\n\n body.body.forEach((statement) => {\n if (statement.type === AST_NODE_TYPES.VariableDeclaration) {\n context.report({\n node: statement,\n messageId: \"noVariableInCallback\",\n });\n }\n });\n }\n\n return {\n ArrowFunctionExpression: checkFunctionBody,\n FunctionExpression: checkFunctionBody,\n };\n },\n});\n\nexport default jsxNoVariableInCallback;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst jsxRequireSuspense = createRule({\n name: \"jsx-require-suspense\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Require lazy-loaded components to be wrapped in Suspense\",\n },\n messages: {\n requireSuspense:\n \"Lazy component '{{ name }}' must be wrapped in <Suspense>. Add a Suspense boundary with a fallback prop.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n const lazyComponents = new Set<string>();\n\n const isInsideSuspense = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node | undefined = node.parent;\n\n while (current) {\n if (\n current.type === AST_NODE_TYPES.JSXElement &&\n current.openingElement.name.type === AST_NODE_TYPES.JSXIdentifier &&\n current.openingElement.name.name === \"Suspense\"\n ) {\n return true;\n }\n current = current.parent;\n }\n\n return false;\n };\n\n return {\n VariableDeclarator(node) {\n if (node.id.type === AST_NODE_TYPES.Identifier && node.init?.type === AST_NODE_TYPES.CallExpression) {\n const { callee } = node.init;\n\n const isLazyCall =\n (callee.type === AST_NODE_TYPES.Identifier && callee.name === \"lazy\") ||\n (callee.type === AST_NODE_TYPES.MemberExpression &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n callee.object.name === \"React\" &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === \"lazy\");\n\n if (isLazyCall) {\n lazyComponents.add(node.id.name);\n }\n }\n },\n JSXOpeningElement(node) {\n if (node.name.type === AST_NODE_TYPES.JSXIdentifier) {\n const componentName = node.name.name;\n\n if (lazyComponents.has(componentName) && !isInsideSuspense(node)) {\n context.report({\n node,\n messageId: \"requireSuspense\",\n data: {\n name: componentName,\n },\n });\n }\n }\n },\n };\n },\n});\n\nexport default jsxRequireSuspense;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst jsxSimpleProps = createRule({\n name: \"jsx-simple-props\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce JSX props to only contain strings, simple variables, or ReactNode elements\",\n },\n messages: {\n noComplexProp:\n \"JSX props should only contain strings, simple variables, or ReactNode elements. Extract complex expressions to a variable first.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n const allowedExpressionTypes = new Set([\n AST_NODE_TYPES.Identifier,\n AST_NODE_TYPES.Literal,\n AST_NODE_TYPES.JSXElement,\n AST_NODE_TYPES.JSXFragment,\n AST_NODE_TYPES.MemberExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n AST_NODE_TYPES.FunctionExpression,\n ]);\n\n return {\n JSXAttribute(node) {\n if (!node.value) {\n return;\n }\n\n if (node.value.type === AST_NODE_TYPES.Literal) {\n return;\n }\n\n if (node.value.type === AST_NODE_TYPES.JSXExpressionContainer) {\n const { expression } = node.value;\n\n if (expression.type === AST_NODE_TYPES.JSXEmptyExpression) {\n return;\n }\n\n if (!allowedExpressionTypes.has(expression.type)) {\n context.report({\n node: node.value,\n messageId: \"noComplexProp\",\n });\n }\n }\n },\n };\n },\n});\n\nexport default jsxSimpleProps;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../utils\";\n\nimport type { TSESLint, 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst TYPE_GROUP = {\n STRING: 1,\n HYPHENATED_STRING: 2,\n NUMBER_BOOLEAN_NULL: 3,\n EXPRESSION: 4,\n OBJECT_ARRAY: 5,\n FUNCTION: 6,\n JSX: 7,\n SHORTHAND: 8,\n} as const;\n\nconst EXPRESSION_TYPE_TO_GROUP = new Map<AST_NODE_TYPES, number>([\n [AST_NODE_TYPES.ObjectExpression, TYPE_GROUP.OBJECT_ARRAY],\n [AST_NODE_TYPES.ArrayExpression, TYPE_GROUP.OBJECT_ARRAY],\n [AST_NODE_TYPES.ArrowFunctionExpression, TYPE_GROUP.FUNCTION],\n [AST_NODE_TYPES.FunctionExpression, TYPE_GROUP.FUNCTION],\n [AST_NODE_TYPES.JSXElement, TYPE_GROUP.JSX],\n [AST_NODE_TYPES.JSXFragment, TYPE_GROUP.JSX],\n]);\n\nfunction isHyphenatedName(node: TSESTree.JSXAttribute): boolean {\n return node.name.type === AST_NODE_TYPES.JSXIdentifier && node.name.name.includes(\"-\");\n}\n\nfunction getStringGroup(node: TSESTree.JSXAttribute): number {\n return isHyphenatedName(node) ? TYPE_GROUP.HYPHENATED_STRING : TYPE_GROUP.STRING;\n}\n\nfunction getLiteralValueGroup(value: TSESTree.Literal[\"value\"]): number | null {\n if (typeof value === \"string\") {\n return null;\n }\n\n return TYPE_GROUP.NUMBER_BOOLEAN_NULL;\n}\n\nfunction getExpressionGroup(expression: TSESTree.Expression): number | null {\n if (expression.type === AST_NODE_TYPES.Literal) {\n return getLiteralValueGroup(expression.value);\n }\n\n if (expression.type === AST_NODE_TYPES.TemplateLiteral) {\n return null;\n }\n\n if (expression.type === AST_NODE_TYPES.Identifier && expression.name === \"undefined\") {\n return TYPE_GROUP.NUMBER_BOOLEAN_NULL;\n }\n\n return EXPRESSION_TYPE_TO_GROUP.get(expression.type) ?? TYPE_GROUP.EXPRESSION;\n}\n\nfunction getTypeGroup(node: TSESTree.JSXAttribute): number | null {\n if (node.value === null) {\n return TYPE_GROUP.SHORTHAND;\n }\n\n if (node.value.type === AST_NODE_TYPES.Literal) {\n if (typeof node.value.value === \"string\") {\n return getStringGroup(node);\n }\n\n return TYPE_GROUP.NUMBER_BOOLEAN_NULL;\n }\n\n if (node.value.type !== AST_NODE_TYPES.JSXExpressionContainer) {\n return null;\n }\n\n const { expression } = node.value;\n\n if (expression.type === AST_NODE_TYPES.JSXEmptyExpression) {\n return null;\n }\n\n const group = getExpressionGroup(expression);\n\n if (group === null) {\n return getStringGroup(node);\n }\n\n return group;\n}\n\nfunction hasUnsortedProps(attributes: TSESTree.JSXOpeningElement[\"attributes\"]): boolean {\n let lastGroup = 0;\n\n return attributes.some((attribute) => {\n if (attribute.type === AST_NODE_TYPES.JSXSpreadAttribute) {\n lastGroup = 0;\n\n return false;\n }\n\n const group = getTypeGroup(attribute);\n\n if (group === null) {\n return false;\n }\n\n if (group < lastGroup) {\n return true;\n }\n\n lastGroup = group;\n\n return false;\n });\n}\n\nfunction sortSegment(\n segment: TSESTree.JSXAttribute[],\n sourceCode: TSESLint.SourceCode,\n fixer: TSESLint.RuleFixer,\n): TSESLint.RuleFix[] {\n const sorted = [...segment].sort((a, b) => (getTypeGroup(a) ?? 0) - (getTypeGroup(b) ?? 0));\n const sortedTexts = sorted.map((attr) => sourceCode.getText(attr));\n\n return segment\n .map((attr, i) => ({ attr, sortedText: sortedTexts[i] }))\n .filter(({ attr, sortedText }) => sourceCode.getText(attr) !== sortedText)\n .map(({ attr, sortedText }) => fixer.replaceText(attr, sortedText));\n}\n\nfunction getSegments(attributes: TSESTree.JSXOpeningElement[\"attributes\"]): TSESTree.JSXAttribute[][] {\n const result: TSESTree.JSXAttribute[][] = [];\n let current: TSESTree.JSXAttribute[] = [];\n\n attributes.forEach((attr) => {\n if (attr.type === AST_NODE_TYPES.JSXSpreadAttribute) {\n if (current.length > 0) {\n result.push(current);\n current = [];\n }\n } else {\n current.push(attr);\n }\n });\n\n if (current.length > 0) {\n result.push(current);\n }\n\n return result;\n}\n\nconst jsxSortProps = createRule({\n name: \"jsx-sort-props\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce JSX props are sorted by value type: strings, hyphenated strings, numbers/booleans, expressions, objects/arrays, functions, JSX elements, then shorthand booleans\",\n },\n fixable: \"code\",\n messages: {\n unsortedProps:\n \"JSX props should be sorted by value type: strings, hyphenated strings, numbers/booleans/null, expressions, objects/arrays, functions, JSX elements, then shorthand booleans.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n const { sourceCode } = context;\n\n return {\n JSXOpeningElement(node) {\n if (!hasUnsortedProps(node.attributes)) {\n return;\n }\n\n context.report({\n node,\n messageId: \"unsortedProps\",\n fix(fixer) {\n return getSegments(node.attributes).flatMap((segment) => sortSegment(segment, sourceCode, fixer));\n },\n });\n },\n };\n },\n});\n\nexport default jsxSortProps;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../utils\";\n\nconst createRule = ESLintUtils.RuleCreator(\n (name) =>\n `https://github.com/next-friday/eslint-plugin-nextfriday/blob/main/docs/rules/${name.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst jsxSpreadPropsLast = createRule({\n name: \"jsx-spread-props-last\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce JSX spread attributes appear after all other props\",\n },\n messages: {\n spreadNotLast: \"JSX spread attributes must come after all other props.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n return {\n JSXOpeningElement(node) {\n const { attributes } = node;\n\n let lastNonSpreadIndex = -1;\n\n attributes.forEach((attribute, index) => {\n if (attribute.type !== AST_NODE_TYPES.JSXSpreadAttribute) {\n lastNonSpreadIndex = index;\n }\n });\n\n attributes.forEach((attribute, index) => {\n if (attribute.type === AST_NODE_TYPES.JSXSpreadAttribute && index < lastNonSpreadIndex) {\n context.report({\n node: attribute,\n messageId: \"spreadNotLast\",\n });\n }\n });\n },\n };\n },\n});\n\nexport default jsxSpreadPropsLast;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\ntype ProgramChild = TSESTree.ProgramStatement;\n\nfunction isImportDeclaration(node: TSESTree.Node): boolean {\n return node.type === AST_NODE_TYPES.ImportDeclaration;\n}\n\nfunction checkStatements(\n statements: readonly ProgramChild[] | readonly TSESTree.Statement[],\n context: Parameters<ReturnType<typeof createRule>[\"create\"]>[0],\n): void {\n const { sourceCode } = context;\n\n statements.forEach((current, index) => {\n const next = statements[index + 1];\n\n if (!next) {\n return;\n }\n\n if (!current.loc || !next.loc) {\n return;\n }\n\n if (isImportDeclaration(current) && isImportDeclaration(next)) {\n return;\n }\n\n const currentIsMultiline = current.loc.start.line !== current.loc.end.line;\n const nextIsMultiline = next.loc.start.line !== next.loc.end.line;\n const lineGap = next.loc.start.line - current.loc.end.line;\n\n if ((currentIsMultiline || nextIsMultiline) && lineGap < 2) {\n context.report({\n node: next,\n messageId: \"requireNewline\",\n fix(fixer) {\n const tokenBefore = sourceCode.getTokenBefore(next, {\n includeComments: true,\n });\n if (!tokenBefore) {\n return null;\n }\n return fixer.insertTextAfter(tokenBefore, \"\\n\");\n },\n });\n }\n });\n}\n\nconst newlineAfterMultilineBlock = createRule({\n name: \"newline-after-multiline-block\",\n meta: {\n type: \"layout\",\n docs: {\n description: \"Require a blank line after multi-line statements before the next statement\",\n },\n fixable: \"whitespace\",\n messages: {\n requireNewline: \"A blank line is required after a multi-line statement before the next statement\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n Program(node) {\n checkStatements(node.body, context);\n },\n BlockStatement(node) {\n checkStatements(node.body, context);\n },\n };\n },\n});\n\nexport default newlineAfterMultilineBlock;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst newlineBeforeReturn = createRule({\n name: \"newline-before-return\",\n meta: {\n type: \"layout\",\n docs: {\n description: \"Require a blank line before return statements\",\n },\n fixable: \"whitespace\",\n messages: {\n requireNewline: \"A blank line is required before return statements\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { sourceCode } = context;\n\n function checkReturnStatement(node: TSESTree.ReturnStatement): void {\n const { parent } = node;\n\n if (!parent || parent.type !== AST_NODE_TYPES.BlockStatement) {\n return;\n }\n\n const { body: statements } = parent;\n const returnIndex = statements.indexOf(node);\n\n if (returnIndex <= 0) {\n return;\n }\n\n const previousStatement = statements[returnIndex - 1];\n\n if (!previousStatement.loc || !node.loc) {\n return;\n }\n\n const lineGap = node.loc.start.line - previousStatement.loc.end.line;\n\n if (lineGap < 2) {\n context.report({\n node,\n messageId: \"requireNewline\",\n fix(fixer) {\n const tokenBefore = sourceCode.getTokenBefore(node, {\n includeComments: true,\n });\n\n if (!tokenBefore) {\n return null;\n }\n\n return fixer.insertTextAfter(tokenBefore, \"\\n\");\n },\n });\n }\n }\n\n return {\n ReturnStatement: checkReturnStatement,\n };\n },\n});\n\nexport default newlineBeforeReturn;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noComplexInlineReturn = createRule({\n name: \"no-complex-inline-return\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow complex inline expressions in return statements - prefer extracting to a const first\",\n },\n messages: {\n noComplexInlineReturn:\n \"Avoid returning complex expressions directly. Extract to a const variable first for better readability.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const isComplexExpression = (node: TSESTree.Expression | null | undefined): boolean => {\n if (!node) return false;\n\n if (node.type === AST_NODE_TYPES.ConditionalExpression) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.LogicalExpression) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.NewExpression) {\n return true;\n }\n\n return false;\n };\n\n return {\n ReturnStatement(node) {\n if (node.argument && isComplexExpression(node.argument)) {\n context.report({\n node: node.argument,\n messageId: \"noComplexInlineReturn\",\n });\n }\n },\n };\n },\n});\n\nexport default noComplexInlineReturn;\n","import { AST_NODE_TYPES, 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noDirectDate = createRule({\n name: \"no-direct-date\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow direct usage of Date constructor and methods to enforce centralized date utilities\",\n },\n messages: {\n noNewDate: \"Avoid using 'new Date()'. Use a centralized date utility like dayjs instead.\",\n noDateNow: \"Avoid using 'Date.now()'. Use a centralized date utility like dayjs instead.\",\n noDateParse: \"Avoid using 'Date.parse()'. Use a centralized date utility like dayjs instead.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n NewExpression(node) {\n if (node.callee.type === AST_NODE_TYPES.Identifier && node.callee.name === \"Date\") {\n context.report({\n node,\n messageId: \"noNewDate\",\n });\n }\n },\n CallExpression(node) {\n if (\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n node.callee.object.type === AST_NODE_TYPES.Identifier &&\n node.callee.object.name === \"Date\" &&\n node.callee.property.type === AST_NODE_TYPES.Identifier\n ) {\n const methodName = node.callee.property.name;\n\n if (methodName === \"now\") {\n context.report({\n node,\n messageId: \"noDateNow\",\n });\n }\n\n if (methodName === \"parse\") {\n context.report({\n node,\n messageId: \"noDateParse\",\n });\n }\n }\n },\n };\n },\n});\n\nexport default noDirectDate;\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.replaceAll(\"-\", \"_\").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 { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noEnvFallback = createRule({\n name: \"no-env-fallback\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow fallback values for environment variables as they can be dangerous in production\",\n },\n messages: {\n noEnvFallback:\n \"Avoid using fallback values with process.env. Environment variables should fail explicitly when missing rather than silently using a default value.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const isProcessEnvAccess = (node: TSESTree.Node): boolean => {\n if (node.type !== AST_NODE_TYPES.MemberExpression) {\n return false;\n }\n\n const { object } = node;\n if (object.type !== AST_NODE_TYPES.MemberExpression) {\n return false;\n }\n\n const processNode = object.object;\n const envNode = object.property;\n\n return (\n processNode.type === AST_NODE_TYPES.Identifier &&\n processNode.name === \"process\" &&\n envNode.type === AST_NODE_TYPES.Identifier &&\n envNode.name === \"env\"\n );\n };\n\n return {\n LogicalExpression(node) {\n if ((node.operator === \"||\" || node.operator === \"??\") && isProcessEnvAccess(node.left)) {\n context.report({\n node,\n messageId: \"noEnvFallback\",\n });\n }\n },\n ConditionalExpression(node) {\n if (isProcessEnvAccess(node.test)) {\n context.report({\n node,\n messageId: \"noEnvFallback\",\n });\n }\n },\n };\n },\n});\n\nexport default noEnvFallback;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst GHOST_TAGS = new Set([\"div\", \"span\"]);\n\nfunction isKeyAttribute(attribute: TSESTree.JSXAttribute | TSESTree.JSXSpreadAttribute): boolean {\n return (\n attribute.type === AST_NODE_TYPES.JSXAttribute &&\n attribute.name.type === AST_NODE_TYPES.JSXIdentifier &&\n attribute.name.name === \"key\"\n );\n}\n\nconst noGhostWrapper = createRule({\n name: \"no-ghost-wrapper\",\n meta: {\n type: \"problem\",\n docs: {\n description:\n \"Disallow bare <div> and <span> elements that have no meaningful attributes (Divitis / ghost wrappers)\",\n },\n schema: [],\n messages: {\n noGhostWrapper:\n \"Ghost <{{ tag }}> has no meaningful attributes. Use a Fragment (<>...</>), a semantic element (section, article, header, etc.), or add a meaningful attribute (className, role, data-*, ref, etc.). Note: 'key' alone does not count as meaningful.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n return {\n JSXOpeningElement(node: TSESTree.JSXOpeningElement) {\n if (node.name.type !== AST_NODE_TYPES.JSXIdentifier) {\n return;\n }\n\n const tagName = node.name.name;\n if (!GHOST_TAGS.has(tagName)) {\n return;\n }\n\n const meaningfulAttributes = node.attributes.filter((attribute) => !isKeyAttribute(attribute));\n\n if (meaningfulAttributes.length === 0) {\n context.report({\n node,\n messageId: \"noGhostWrapper\",\n data: { tag: tagName },\n });\n }\n },\n };\n },\n});\n\nexport default noGhostWrapper;\n","import path from \"path\";\n\nimport { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noHelperFunctionInHook = createRule({\n name: \"no-helper-function-in-hook\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow non-hook helper function definitions in hook files\",\n },\n messages: {\n noHelperFunction: \"Helper functions must not be defined in hook files. Extract to a separate utility file.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const basename = path.basename(context.filename);\n const isHookFile = basename.endsWith(\".hook.ts\") || basename.endsWith(\".hooks.ts\");\n\n if (!isHookFile) return {};\n\n function isAtProgramLevel(node: TSESTree.Node): boolean {\n const { parent } = node;\n\n if (parent === undefined) return false;\n if (parent.type === AST_NODE_TYPES.Program) return true;\n if (parent.type !== AST_NODE_TYPES.ExportNamedDeclaration) return false;\n\n return parent.parent?.type === AST_NODE_TYPES.Program;\n }\n\n return {\n FunctionDeclaration(node: TSESTree.FunctionDeclaration) {\n if (!isAtProgramLevel(node)) return;\n if (node.id !== null && node.id.name.startsWith(\"use\")) return;\n\n context.report({ node, messageId: \"noHelperFunction\" });\n },\n VariableDeclarator(node: TSESTree.VariableDeclarator) {\n if (node.parent.type !== AST_NODE_TYPES.VariableDeclaration) return;\n if (!isAtProgramLevel(node.parent)) return;\n\n if (\n node.init === null ||\n (node.init.type !== AST_NODE_TYPES.ArrowFunctionExpression &&\n node.init.type !== AST_NODE_TYPES.FunctionExpression)\n )\n return;\n\n if (node.id.type === AST_NODE_TYPES.Identifier && node.id.name.startsWith(\"use\")) return;\n\n context.report({ node, messageId: \"noHelperFunction\" });\n },\n };\n },\n});\n\nexport default noHelperFunctionInHook;\n","import path from \"path\";\n\nimport { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noHelperFunctionInTest = createRule({\n name: \"no-helper-function-in-test\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow helper function definitions in test files\",\n },\n messages: {\n noHelperFunction: \"Helper functions must not be defined in test files. Extract to a separate utility file.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const basename = path.basename(context.filename);\n const isTestFile = basename.endsWith(\".test.ts\") || basename.endsWith(\".test.tsx\");\n\n if (!isTestFile) return {};\n\n return {\n FunctionDeclaration(node: TSESTree.FunctionDeclaration) {\n if (node.parent.type === AST_NODE_TYPES.Program) {\n context.report({ node, messageId: \"noHelperFunction\" });\n }\n },\n VariableDeclarator(node: TSESTree.VariableDeclarator) {\n if (\n node.parent.type === AST_NODE_TYPES.VariableDeclaration &&\n node.parent.parent.type === AST_NODE_TYPES.Program &&\n node.init !== null &&\n (node.init.type === AST_NODE_TYPES.ArrowFunctionExpression ||\n node.init.type === AST_NODE_TYPES.FunctionExpression)\n ) {\n context.report({ node, messageId: \"noHelperFunction\" });\n }\n },\n };\n },\n});\n\nexport default noHelperFunctionInTest;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noInlineDefaultExport = createRule({\n name: \"no-inline-default-export\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow inline exports. Prefer declaring first, then exporting separately.\",\n },\n messages: {\n noInlineDefaultExport:\n \"Avoid inline default export. Declare the {{type}} first, then export it separately: `export default {{name}};`\",\n noAnonymousDefaultExport:\n \"Avoid anonymous default export. Declare a named {{type}} first, then export it separately.\",\n noInlineNamedExport:\n \"Avoid inline named export. Declare the {{type}} first, then export it separately: `export { {{name}} };`\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n ExportDefaultDeclaration(node: TSESTree.ExportDefaultDeclaration) {\n const { declaration } = node;\n\n if (declaration.type === AST_NODE_TYPES.FunctionDeclaration) {\n if (declaration.id) {\n context.report({\n node,\n messageId: \"noInlineDefaultExport\",\n data: { type: \"function\", name: declaration.id.name },\n });\n } else {\n context.report({\n node,\n messageId: \"noAnonymousDefaultExport\",\n data: { type: \"function\" },\n });\n }\n }\n\n if (declaration.type === AST_NODE_TYPES.ClassDeclaration) {\n if (declaration.id) {\n context.report({\n node,\n messageId: \"noInlineDefaultExport\",\n data: { type: \"class\", name: declaration.id.name },\n });\n } else {\n context.report({\n node,\n messageId: \"noAnonymousDefaultExport\",\n data: { type: \"class\" },\n });\n }\n }\n\n if (\n declaration.type === AST_NODE_TYPES.ArrowFunctionExpression ||\n declaration.type === AST_NODE_TYPES.FunctionExpression\n ) {\n context.report({\n node,\n messageId: \"noAnonymousDefaultExport\",\n data: { type: \"function\" },\n });\n }\n },\n\n ExportNamedDeclaration(node: TSESTree.ExportNamedDeclaration) {\n const { declaration } = node;\n\n if (!declaration) {\n return;\n }\n\n if (declaration.type === AST_NODE_TYPES.FunctionDeclaration && declaration.id) {\n context.report({\n node,\n messageId: \"noInlineNamedExport\",\n data: { type: \"function\", name: declaration.id.name },\n });\n }\n\n if (declaration.type === AST_NODE_TYPES.ClassDeclaration && declaration.id) {\n context.report({\n node,\n messageId: \"noInlineNamedExport\",\n data: { type: \"class\", name: declaration.id.name },\n });\n }\n },\n };\n },\n});\n\nexport default noInlineDefaultExport;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isObjectOrArray(node: TSESTree.Node): boolean {\n return (\n node.type === AST_NODE_TYPES.ObjectExpression ||\n node.type === AST_NODE_TYPES.ArrayExpression ||\n node.type === AST_NODE_TYPES.TSAsExpression\n );\n}\n\nfunction getInnerExpression(node: TSESTree.Node): TSESTree.Node {\n if (node.type === AST_NODE_TYPES.TSAsExpression) {\n return getInnerExpression(node.expression);\n }\n return node;\n}\n\nfunction isNestedStructure(node: TSESTree.Node): boolean {\n const inner = getInnerExpression(node);\n return inner.type === AST_NODE_TYPES.ObjectExpression || inner.type === AST_NODE_TYPES.ArrayExpression;\n}\n\nfunction containsNestedStructure(node: TSESTree.ObjectExpression | TSESTree.ArrayExpression): boolean {\n if (node.type === AST_NODE_TYPES.ObjectExpression) {\n return node.properties.some((prop) => {\n if (prop.type !== AST_NODE_TYPES.Property) return false;\n return isNestedStructure(prop.value);\n });\n }\n return node.elements.some((el) => {\n if (el === null) return false;\n return isNestedStructure(el);\n });\n}\n\nconst noInlineNestedObject = createRule({\n name: \"no-inline-nested-object\",\n meta: {\n type: \"layout\",\n docs: {\n description:\n \"Require object or array values that contain further nested objects or arrays to span multiple lines\",\n },\n fixable: \"whitespace\",\n messages: {\n requireMultiline: \"Inline collections containing nested objects or arrays should span multiple lines\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { sourceCode } = context;\n\n return {\n Property(node) {\n if (!node.value || !isObjectOrArray(node.value)) {\n return;\n }\n\n const valueNode = getInnerExpression(node.value);\n\n if (valueNode.type !== AST_NODE_TYPES.ObjectExpression && valueNode.type !== AST_NODE_TYPES.ArrayExpression) {\n return;\n }\n\n if (!valueNode.loc) {\n return;\n }\n\n const isMultiline = valueNode.loc.start.line !== valueNode.loc.end.line;\n if (isMultiline) {\n return;\n }\n\n if (!containsNestedStructure(valueNode)) {\n return;\n }\n\n const elements = valueNode.type === AST_NODE_TYPES.ObjectExpression ? valueNode.properties : valueNode.elements;\n\n context.report({\n node: valueNode,\n messageId: \"requireMultiline\",\n fix(fixer) {\n const openBrace = sourceCode.getFirstToken(valueNode);\n const closeBrace = sourceCode.getLastToken(valueNode);\n\n if (!openBrace || !closeBrace) {\n return null;\n }\n\n const indent = \" \".repeat(node.loc?.start.column ?? 0);\n const innerIndent = `${indent} `;\n\n const elementTexts = elements\n .filter((el): el is NonNullable<typeof el> => el !== null)\n .map((el) => sourceCode.getText(el));\n\n const isObject = valueNode.type === AST_NODE_TYPES.ObjectExpression;\n const openChar = isObject ? \"{\" : \"[\";\n const closeChar = isObject ? \"}\" : \"]\";\n\n const formattedElements = elementTexts.map((text) => `${innerIndent}${text},`).join(\"\\n\");\n\n const newContent = `${openChar}\\n${formattedElements}\\n${indent}${closeChar}`;\n\n return fixer.replaceText(valueNode, newContent);\n },\n });\n },\n };\n },\n});\n\nexport default noInlineNestedObject;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst isShorthandProperty = (property: TSESTree.ObjectLiteralElement): boolean => {\n if (property.type === AST_NODE_TYPES.SpreadElement) {\n return true;\n }\n\n if (property.type !== AST_NODE_TYPES.Property) {\n return false;\n }\n\n return property.shorthand;\n};\n\nconst noInlineReturnProperties = createRule({\n name: \"no-inline-return-properties\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Require return object properties to use shorthand notation by extracting non-shorthand values to const variables\",\n },\n messages: {\n noInlineProperty:\n \"Property '{{ name }}' should use shorthand notation. Extract the value to a const variable before the return statement.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n ReturnStatement(node) {\n if (!node.argument || node.argument.type !== AST_NODE_TYPES.ObjectExpression) {\n return;\n }\n\n node.argument.properties.forEach((property) => {\n if (isShorthandProperty(property)) {\n return;\n }\n\n if (property.type !== AST_NODE_TYPES.Property) {\n return;\n }\n\n let keyName: string | null = null;\n\n if (property.key.type === AST_NODE_TYPES.Identifier) {\n keyName = property.key.name;\n } else if (property.key.type === AST_NODE_TYPES.Literal) {\n keyName = String(property.key.value);\n }\n\n context.report({\n node: property,\n messageId: \"noInlineProperty\",\n data: { name: keyName ?? \"unknown\" },\n });\n });\n },\n };\n },\n});\n\nexport default noInlineReturnProperties;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst isInlineTypeSpecifier = (specifier: TSESTree.ImportClause): specifier is TSESTree.ImportSpecifier =>\n specifier.type === AST_NODE_TYPES.ImportSpecifier && specifier.importKind === \"type\";\n\nconst noInlineTypeImport = createRule({\n name: \"no-inline-type-import\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Disallow inline 'type' markers on import specifiers. Use 'import type' or split into a separate type-only import statement.\",\n },\n fixable: \"code\",\n messages: {\n noInlineTypeImport:\n \"Avoid inline 'type' markers on import specifiers. Hoist to 'import type' or split into a separate type-only import statement.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n ImportDeclaration(node: TSESTree.ImportDeclaration) {\n const inlineTypeSpecifiers = node.specifiers.filter(isInlineTypeSpecifier);\n\n if (inlineTypeSpecifiers.length === 0) {\n return;\n }\n\n context.report({\n node,\n messageId: \"noInlineTypeImport\",\n fix(fixer) {\n if (node.importKind === \"type\") {\n return inlineTypeSpecifiers.map((specifier) =>\n fixer.removeRange([specifier.range[0], specifier.imported.range[0]]),\n );\n }\n\n const sourceText = context.sourceCode.getText(node.source);\n const fileText = context.sourceCode.text;\n\n const typeSpecifierTexts = inlineTypeSpecifiers.map((specifier) =>\n fileText.slice(specifier.imported.range[0], specifier.range[1]),\n );\n const typeImport = `import type { ${typeSpecifierTexts.join(\", \")} } from ${sourceText};`;\n\n const valueSpecifiers = node.specifiers.filter(\n (specifier) => !(specifier.type === AST_NODE_TYPES.ImportSpecifier && specifier.importKind === \"type\"),\n );\n\n if (valueSpecifiers.length === 0) {\n return fixer.replaceText(node, typeImport);\n }\n\n const parts: string[] = [];\n const namedValueSpecifiers: TSESTree.ImportSpecifier[] = [];\n\n for (const specifier of valueSpecifiers) {\n if (specifier.type === AST_NODE_TYPES.ImportDefaultSpecifier) {\n parts.push(specifier.local.name);\n } else if (specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier) {\n parts.push(`* as ${specifier.local.name}`);\n } else if (specifier.type === AST_NODE_TYPES.ImportSpecifier) {\n namedValueSpecifiers.push(specifier);\n }\n }\n\n if (namedValueSpecifiers.length > 0) {\n const namedTexts = namedValueSpecifiers.map((specifier) => context.sourceCode.getText(specifier));\n parts.push(`{ ${namedTexts.join(\", \")} }`);\n }\n\n const valueImport = `import ${parts.join(\", \")} from ${sourceText};`;\n return fixer.replaceText(node, `${valueImport}\\n${typeImport}`);\n },\n });\n },\n };\n },\n});\n\nexport default noInlineTypeImport;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst KEYBOARD_ROWS = [\"qwertyuiop\", \"asdfghjkl\", \"zxcvbnm\", \"1234567890\"];\n\nconst MIN_LENGTH = 3;\nconst MIN_SEQUENCE_LENGTH = 4;\n\nconst hasRepeatedChars = (name: string): boolean =>\n name.split(\"\").some((char, index) => {\n if (index > name.length - 3) {\n return false;\n }\n return char === name[index + 1] && char === name[index + 2];\n });\n\nconst hasKeyboardSequence = (name: string): boolean => {\n const lowerName = name.toLowerCase();\n if (lowerName.length < MIN_SEQUENCE_LENGTH) {\n return false;\n }\n\n return KEYBOARD_ROWS.some((row) => {\n const positions = Array.from({ length: row.length - MIN_SEQUENCE_LENGTH + 1 }, (_, i) => i);\n return positions.some((start) => {\n const sequence = row.slice(start, start + MIN_SEQUENCE_LENGTH);\n const reverseSequence = sequence.split(\"\").reverse().join(\"\");\n return lowerName.includes(sequence) || lowerName.includes(reverseSequence);\n });\n });\n};\n\nconst isLazyIdentifier = (name: string): boolean => {\n if (name.length < MIN_LENGTH) {\n return false;\n }\n\n if (name.startsWith(\"_\")) {\n return false;\n }\n\n if (hasRepeatedChars(name)) {\n return true;\n }\n\n if (hasKeyboardSequence(name)) {\n return true;\n }\n\n return false;\n};\n\nconst noLazyIdentifiers = createRule({\n name: \"no-lazy-identifiers\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow lazy, meaningless variable names that hurt code readability\",\n },\n messages: {\n noLazyIdentifier: \"Avoid lazy identifier '{{name}}'. Use a descriptive name that clearly indicates the purpose.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const checkIdentifier = (node: TSESTree.Identifier) => {\n const { name } = node;\n\n if (!isLazyIdentifier(name)) {\n return;\n }\n\n context.report({\n node,\n messageId: \"noLazyIdentifier\",\n data: { name },\n });\n };\n\n const checkPattern = (pattern: TSESTree.Node) => {\n if (pattern.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(pattern);\n } else if (pattern.type === AST_NODE_TYPES.ObjectPattern) {\n pattern.properties.forEach((prop) => {\n if (prop.type === AST_NODE_TYPES.Property && prop.value.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(prop.value);\n } else if (prop.type === AST_NODE_TYPES.RestElement && prop.argument.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(prop.argument);\n }\n });\n } else if (pattern.type === AST_NODE_TYPES.ArrayPattern) {\n pattern.elements.forEach((element) => {\n if (element?.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(element);\n } else if (\n element?.type === AST_NODE_TYPES.RestElement &&\n element.argument.type === AST_NODE_TYPES.Identifier\n ) {\n checkIdentifier(element.argument);\n }\n });\n } else if (pattern.type === AST_NODE_TYPES.AssignmentPattern && pattern.left.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(pattern.left);\n } else if (pattern.type === AST_NODE_TYPES.RestElement && pattern.argument.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(pattern.argument);\n }\n };\n\n return {\n VariableDeclarator(node) {\n checkPattern(node.id);\n },\n FunctionDeclaration(node) {\n if (node.id) {\n checkIdentifier(node.id);\n }\n node.params.forEach((param) => checkPattern(param));\n },\n FunctionExpression(node) {\n if (node.id) {\n checkIdentifier(node.id);\n }\n node.params.forEach((param) => checkPattern(param));\n },\n ArrowFunctionExpression(node) {\n node.params.forEach((param) => checkPattern(param));\n },\n CatchClause(node) {\n if (node.param) {\n checkPattern(node.param);\n }\n },\n ClassDeclaration(node) {\n if (node.id) {\n checkIdentifier(node.id);\n }\n },\n TSTypeAliasDeclaration(node) {\n checkIdentifier(node.id);\n },\n TSInterfaceDeclaration(node) {\n checkIdentifier(node.id);\n },\n };\n },\n});\n\nexport default noLazyIdentifiers;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noLogicInParams = createRule({\n name: \"no-logic-in-params\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow logic or conditions in function parameters - extract to a const variable first\",\n },\n messages: {\n noLogicInParams:\n \"Avoid logic or conditions in function parameters. Extract to a const variable first for better readability.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const isComplexExpression = (node: TSESTree.Expression | TSESTree.SpreadElement): boolean => {\n if (node.type === AST_NODE_TYPES.SpreadElement) {\n return false;\n }\n\n if (node.type === AST_NODE_TYPES.ConditionalExpression) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.LogicalExpression) {\n return true;\n }\n\n if (node.type === AST_NODE_TYPES.BinaryExpression) {\n const logicalOperators = [\"==\", \"===\", \"!=\", \"!==\", \"<\", \">\", \"<=\", \">=\", \"in\", \"instanceof\"];\n return logicalOperators.includes(node.operator);\n }\n\n if (node.type === AST_NODE_TYPES.UnaryExpression) {\n return node.operator === \"!\";\n }\n\n return false;\n };\n\n const checkArguments = (args: TSESTree.CallExpressionArgument[]): void => {\n args.forEach((arg) => {\n if (isComplexExpression(arg)) {\n context.report({\n node: arg,\n messageId: \"noLogicInParams\",\n });\n }\n\n if (arg.type === AST_NODE_TYPES.ArrayExpression) {\n arg.elements.forEach((element) => {\n if (element && isComplexExpression(element)) {\n context.report({\n node: element,\n messageId: \"noLogicInParams\",\n });\n }\n });\n }\n });\n };\n\n return {\n CallExpression(node) {\n checkArguments(node.arguments);\n },\n NewExpression(node) {\n checkArguments(node.arguments);\n },\n };\n },\n});\n\nexport default noLogicInParams;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst SCREAMING_SNAKE_CASE_REGEX = /^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$/;\n\nconst isAsConstAssertion = (node: TSESTree.Expression): boolean =>\n node.type === AST_NODE_TYPES.TSAsExpression &&\n node.typeAnnotation.type === AST_NODE_TYPES.TSTypeReference &&\n node.typeAnnotation.typeName.type === AST_NODE_TYPES.Identifier &&\n node.typeAnnotation.typeName.name === \"const\";\n\nconst isStaticValue = (init: TSESTree.Expression): boolean => {\n if (isAsConstAssertion(init)) {\n return true;\n }\n\n if (init.type === AST_NODE_TYPES.Literal) {\n return true;\n }\n\n if (init.type === AST_NODE_TYPES.UnaryExpression && init.argument.type === AST_NODE_TYPES.Literal) {\n return true;\n }\n\n if (init.type === AST_NODE_TYPES.TemplateLiteral && init.expressions.length === 0) {\n return true;\n }\n\n if (init.type === AST_NODE_TYPES.ArrayExpression) {\n return init.elements.every((el) => el !== null && el.type !== AST_NODE_TYPES.SpreadElement && isStaticValue(el));\n }\n\n if (init.type === AST_NODE_TYPES.ObjectExpression) {\n return init.properties.every(\n (prop) => prop.type === AST_NODE_TYPES.Property && isStaticValue(prop.value as TSESTree.Expression),\n );\n }\n\n return false;\n};\n\nconst isGlobalScope = (node: TSESTree.VariableDeclaration): boolean => {\n const { parent } = node;\n\n if (parent.type === AST_NODE_TYPES.Program) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ExportNamedDeclaration && parent.parent?.type === AST_NODE_TYPES.Program) {\n return true;\n }\n\n return false;\n};\n\nconst noMisleadingConstantCase = createRule({\n name: \"no-misleading-constant-case\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow SCREAMING_SNAKE_CASE for non-constant or non-static values\",\n },\n messages: {\n mutableScreamingCase:\n \"Variable '{{ name }}' uses SCREAMING_SNAKE_CASE but is declared with '{{ kind }}'. Use camelCase for mutable bindings.\",\n dynamicScreamingCase:\n \"Constant '{{ name }}' uses SCREAMING_SNAKE_CASE but its value is not a static primitive. Use camelCase for dynamic or computed values.\",\n localScreamingCase:\n \"Local variable '{{ name }}' should use camelCase. SCREAMING_SNAKE_CASE is reserved for global constants.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n VariableDeclaration(node) {\n node.declarations.forEach((declarator) => {\n if (declarator.id.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const { name } = declarator.id;\n\n if (!SCREAMING_SNAKE_CASE_REGEX.test(name)) {\n return;\n }\n\n if (node.kind === \"let\" || node.kind === \"var\") {\n context.report({\n node: declarator.id,\n messageId: \"mutableScreamingCase\",\n data: { name, kind: node.kind },\n });\n\n return;\n }\n\n if (!isGlobalScope(node)) {\n context.report({\n node: declarator.id,\n messageId: \"localScreamingCase\",\n data: { name },\n });\n\n return;\n }\n\n if (!declarator.init) {\n return;\n }\n\n if (!isStaticValue(declarator.init)) {\n context.report({\n node: declarator.id,\n messageId: \"dynamicScreamingCase\",\n data: { name },\n });\n }\n });\n },\n };\n },\n});\n\nexport default noMisleadingConstantCase;\n","import { AST_NODE_TYPES, 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noNestedInterfaceDeclaration = createRule({\n name: \"no-nested-interface-declaration\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow inline object type literals in interface or type properties\",\n },\n fixable: undefined,\n schema: [],\n messages: {\n noNestedInterface: \"Extract nested object type into a separate interface or type declaration\",\n },\n },\n defaultOptions: [],\n create(context) {\n return {\n TSPropertySignature(node) {\n if (!node.typeAnnotation) {\n return;\n }\n\n const { typeAnnotation } = node.typeAnnotation;\n\n if (typeAnnotation.type === AST_NODE_TYPES.TSTypeLiteral) {\n context.report({\n node: typeAnnotation,\n messageId: \"noNestedInterface\",\n });\n\n return;\n }\n\n if (typeAnnotation.type === AST_NODE_TYPES.TSArrayType) {\n if (typeAnnotation.elementType.type === AST_NODE_TYPES.TSTypeLiteral) {\n context.report({\n node: typeAnnotation.elementType,\n messageId: \"noNestedInterface\",\n });\n }\n\n return;\n }\n\n if (typeAnnotation.type === AST_NODE_TYPES.TSTypeReference && typeAnnotation.typeArguments) {\n typeAnnotation.typeArguments.params.forEach((param) => {\n if (param.type === AST_NODE_TYPES.TSTypeLiteral) {\n context.report({\n node: param,\n messageId: \"noNestedInterface\",\n });\n }\n });\n }\n },\n };\n },\n});\n\nexport default noNestedInterfaceDeclaration;\n","import { AST_NODE_TYPES, 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noNestedTernary = createRule({\n name: \"no-nested-ternary\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow nested ternary expressions\",\n },\n messages: {\n noNestedTernary: \"Nested ternary expressions are not allowed. Use a function with early returns instead.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n ConditionalExpression(node) {\n const { consequent, alternate } = node;\n\n if (consequent.type === AST_NODE_TYPES.ConditionalExpression) {\n context.report({\n node: consequent,\n messageId: \"noNestedTernary\",\n });\n }\n\n if (alternate.type === AST_NODE_TYPES.ConditionalExpression) {\n context.report({\n node: alternate,\n messageId: \"noNestedTernary\",\n });\n }\n },\n };\n },\n});\n\nexport default noNestedTernary;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isFragmentName(name: TSESTree.JSXTagNameExpression): boolean {\n if (name.type === AST_NODE_TYPES.JSXIdentifier && name.name === \"Fragment\") {\n return true;\n }\n\n if (\n name.type === AST_NODE_TYPES.JSXMemberExpression &&\n name.object.type === AST_NODE_TYPES.JSXIdentifier &&\n name.object.name === \"React\" &&\n name.property.type === AST_NODE_TYPES.JSXIdentifier &&\n name.property.name === \"Fragment\"\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction hasKeyAttribute(attributes: ReadonlyArray<TSESTree.JSXAttribute | TSESTree.JSXSpreadAttribute>): boolean {\n return attributes.some(\n (attribute) =>\n attribute.type === AST_NODE_TYPES.JSXAttribute &&\n attribute.name.type === AST_NODE_TYPES.JSXIdentifier &&\n attribute.name.name === \"key\",\n );\n}\n\nfunction countMeaningfulChildren(children: ReadonlyArray<TSESTree.JSXChild>): number {\n return children.filter((child) => {\n if (child.type === AST_NODE_TYPES.JSXText) {\n return child.value.trim() !== \"\";\n }\n return true;\n }).length;\n}\n\nconst noRedundantFragment = createRule({\n name: \"no-redundant-fragment\",\n meta: {\n type: \"problem\",\n docs: {\n description: \"Disallow Fragments that wrap zero or one child (unless a key prop is needed)\",\n },\n schema: [],\n messages: {\n redundantFragment:\n \"Fragment is redundant when wrapping {{ count }} child. Remove the Fragment or replace it with the child directly.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n return {\n JSXFragment(node: TSESTree.JSXFragment) {\n const count = countMeaningfulChildren(node.children);\n if (count <= 1) {\n context.report({\n node,\n messageId: \"redundantFragment\",\n data: { count: String(count) },\n });\n }\n },\n JSXElement(node: TSESTree.JSXElement) {\n const opening = node.openingElement;\n if (!isFragmentName(opening.name)) {\n return;\n }\n\n if (hasKeyAttribute(opening.attributes)) {\n return;\n }\n\n const count = countMeaningfulChildren(node.children);\n if (count <= 1) {\n context.report({\n node,\n messageId: \"redundantFragment\",\n data: { count: String(count) },\n });\n }\n },\n };\n },\n});\n\nexport default noRedundantFragment;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst noRelativeImports = createRule({\n name: \"no-relative-imports\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow relative imports with parent directory traversal (../) - use absolute imports instead\",\n },\n messages: {\n noRelativeImport:\n \"Avoid relative imports with '../'. Use absolute imports (e.g., 'src/components/...') for better maintainability.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const checkImportPath = (source: string, node: TSESTree.Node): void => {\n if (source.startsWith(\"../\")) {\n context.report({\n node,\n messageId: \"noRelativeImport\",\n });\n }\n };\n\n return {\n ImportDeclaration(node) {\n if (node.source.type === AST_NODE_TYPES.Literal && typeof node.source.value === \"string\") {\n checkImportPath(node.source.value, node);\n }\n },\n ImportExpression(node) {\n if (node.source.type === AST_NODE_TYPES.Literal && typeof node.source.value === \"string\") {\n checkImportPath(node.source.value, node);\n }\n },\n ExportNamedDeclaration(node) {\n if (node.source?.type === AST_NODE_TYPES.Literal && typeof node.source.value === \"string\") {\n checkImportPath(node.source.value, node);\n }\n },\n ExportAllDeclaration(node) {\n if (node.source.type === AST_NODE_TYPES.Literal && typeof node.source.value === \"string\") {\n checkImportPath(node.source.value, node);\n }\n },\n };\n },\n});\n\nexport default noRelativeImports;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst ALLOWED_IN_FOR_LOOPS = new Set([\"i\", \"j\", \"k\", \"n\"]);\nconst ALLOWED_UNDERSCORE = \"_\";\n\nconst isForLoopInit = (node: TSESTree.Node): boolean => {\n let current: TSESTree.Node | undefined = node;\n\n while (current) {\n const parentNode: TSESTree.Node | undefined = current.parent;\n\n if (!parentNode) {\n return false;\n }\n\n if (parentNode.type === AST_NODE_TYPES.ForStatement) {\n const { init } = parentNode;\n if (init && init === current) {\n return true;\n }\n }\n\n current = parentNode;\n }\n\n return false;\n};\n\nconst isAllowedInContext = (name: string, node: TSESTree.Node): boolean => {\n if (name === ALLOWED_UNDERSCORE) {\n return true;\n }\n\n if (ALLOWED_IN_FOR_LOOPS.has(name) && isForLoopInit(node)) {\n return true;\n }\n\n return false;\n};\n\nconst noSingleCharVariables = createRule({\n name: \"no-single-char-variables\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Disallow single character variable and parameter names for better code readability\",\n },\n messages: {\n noSingleChar:\n \"Avoid single character variable name '{{name}}'. Use a descriptive name that clearly indicates the purpose.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const checkIdentifier = (node: TSESTree.Identifier, declarationNode: TSESTree.Node) => {\n const { name } = node;\n\n if (name.length !== 1) {\n return;\n }\n\n if (isAllowedInContext(name, declarationNode)) {\n return;\n }\n\n context.report({\n node,\n messageId: \"noSingleChar\",\n data: { name },\n });\n };\n\n const checkPattern = (pattern: TSESTree.Node, declarationNode: TSESTree.Node) => {\n if (pattern.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(pattern, declarationNode);\n } else if (pattern.type === AST_NODE_TYPES.ObjectPattern) {\n pattern.properties.forEach((prop) => {\n if (prop.type === AST_NODE_TYPES.Property && prop.value.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(prop.value, declarationNode);\n } else if (prop.type === AST_NODE_TYPES.RestElement && prop.argument.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(prop.argument, declarationNode);\n }\n });\n } else if (pattern.type === AST_NODE_TYPES.ArrayPattern) {\n pattern.elements.forEach((element) => {\n if (element?.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(element, declarationNode);\n } else if (\n element?.type === AST_NODE_TYPES.RestElement &&\n element.argument.type === AST_NODE_TYPES.Identifier\n ) {\n checkIdentifier(element.argument, declarationNode);\n }\n });\n } else if (pattern.type === AST_NODE_TYPES.AssignmentPattern && pattern.left.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(pattern.left, declarationNode);\n } else if (pattern.type === AST_NODE_TYPES.RestElement && pattern.argument.type === AST_NODE_TYPES.Identifier) {\n checkIdentifier(pattern.argument, declarationNode);\n }\n };\n\n return {\n VariableDeclarator(node) {\n checkPattern(node.id, node);\n },\n FunctionDeclaration(node) {\n if (node.id) {\n checkIdentifier(node.id, node);\n }\n node.params.forEach((param) => checkPattern(param, node));\n },\n FunctionExpression(node) {\n if (node.id) {\n checkIdentifier(node.id, node);\n }\n node.params.forEach((param) => checkPattern(param, node));\n },\n ArrowFunctionExpression(node) {\n node.params.forEach((param) => checkPattern(param, node));\n },\n CatchClause(node) {\n if (node.param) {\n checkPattern(node.param, node);\n }\n },\n };\n },\n});\n\nexport default noSingleCharVariables;\n","import { AST_NODE_TYPES, 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst preferAsyncAwait = createRule({\n name: \"prefer-async-await\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce async/await over .then() promise chains for better readability and error handling\",\n },\n messages: {\n preferAsyncAwait:\n \"Prefer async/await over .then() chains. Async/await is more readable and provides better error handling with try/catch.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n CallExpression(node) {\n if (\n node.callee.type === AST_NODE_TYPES.MemberExpression &&\n node.callee.property.type === AST_NODE_TYPES.Identifier &&\n node.callee.property.name === \"then\"\n ) {\n context.report({\n node: node.callee.property,\n messageId: \"preferAsyncAwait\",\n });\n }\n },\n };\n },\n});\n\nexport default preferAsyncAwait;\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.replaceAll(\"-\", \"_\").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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst isTsFile = (filename: string): boolean => filename.endsWith(\".ts\") && !filename.endsWith(\".d.ts\");\n\nconst isCallbackContext = (node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression): boolean => {\n const { parent } = node;\n\n if (!parent) {\n return false;\n }\n\n if (parent.type === AST_NODE_TYPES.CallExpression && parent.arguments.includes(node)) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.NewExpression && parent.arguments.includes(node)) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ReturnStatement) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.Property) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ArrayExpression) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ConditionalExpression) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.LogicalExpression) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.AssignmentExpression && parent.left !== node) {\n return true;\n }\n\n return false;\n};\n\nconst preferFunctionDeclaration = createRule({\n name: \"prefer-function-declaration\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce function declarations over arrow functions assigned to variables in .ts files for better readability and hoisting\",\n },\n messages: {\n preferDeclaration:\n \"Use function declaration instead of arrow function. Replace 'const {{name}} = () => ...' with 'function {{name}}() ...'\",\n preferDeclarationExpr:\n \"Use function declaration instead of function expression. Replace 'const {{name}} = function() ...' with 'function {{name}}() ...'\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const { filename } = context;\n\n if (!isTsFile(filename)) {\n return {};\n }\n\n return {\n VariableDeclarator(node) {\n if (node.id.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const { init } = node;\n\n if (!init) {\n return;\n }\n\n if (init.type === AST_NODE_TYPES.ArrowFunctionExpression) {\n if (isCallbackContext(init)) {\n return;\n }\n\n context.report({\n node: init,\n messageId: \"preferDeclaration\",\n data: { name: node.id.name },\n });\n }\n\n if (init.type === AST_NODE_TYPES.FunctionExpression) {\n if (isCallbackContext(init)) {\n return;\n }\n\n context.report({\n node: init,\n messageId: \"preferDeclarationExpr\",\n data: { name: node.id.name },\n });\n }\n },\n };\n },\n});\n\nexport default preferFunctionDeclaration;\n","import { AST_NODE_TYPES, 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst preferGuardClause = createRule({\n name: \"prefer-guard-clause\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce guard clause pattern instead of nested if statements\",\n },\n messages: {\n preferGuardClause: \"Avoid nested if statements. Use guard clauses (early returns) instead.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n return {\n IfStatement(node) {\n const { consequent } = node;\n\n if (consequent.type === AST_NODE_TYPES.BlockStatement) {\n const hasNestedIf = consequent.body.some((statement) => statement.type === AST_NODE_TYPES.IfStatement);\n\n if (hasNestedIf && consequent.body.length === 1) {\n context.report({\n node,\n messageId: \"preferGuardClause\",\n });\n }\n }\n\n if (consequent.type === AST_NODE_TYPES.IfStatement) {\n context.report({\n node,\n messageId: \"preferGuardClause\",\n });\n }\n },\n };\n },\n});\n\nexport default preferGuardClause;\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.replaceAll(\"-\", \"_\").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 isInTypeContext(node: TSESTree.Node | undefined): boolean {\n let current = node;\n while (current) {\n switch (current.type) {\n case AST_NODE_TYPES.TSTypeReference:\n case AST_NODE_TYPES.TSTypeAnnotation:\n case AST_NODE_TYPES.TSTypeParameterInstantiation:\n case AST_NODE_TYPES.TSInterfaceHeritage:\n case AST_NODE_TYPES.TSClassImplements:\n case AST_NODE_TYPES.TSTypeQuery:\n case AST_NODE_TYPES.TSTypeAssertion:\n case AST_NODE_TYPES.TSAsExpression:\n case AST_NODE_TYPES.TSSatisfiesExpression:\n case AST_NODE_TYPES.TSTypeAliasDeclaration:\n case AST_NODE_TYPES.TSInterfaceDeclaration:\n case AST_NODE_TYPES.TSTypeParameter:\n case AST_NODE_TYPES.TSQualifiedName:\n return true;\n\n case AST_NODE_TYPES.MemberExpression:\n case AST_NODE_TYPES.Identifier:\n current = current.parent;\n break;\n\n default:\n return false;\n }\n }\n return false;\n }\n\n function isUsedAsValue(localName: string, scope: ReturnType<typeof context.sourceCode.getScope>): boolean {\n const variable = scope.set.get(localName);\n if (!variable) {\n return false;\n }\n\n if (variable.references.length === 0) {\n return true;\n }\n\n return variable.references.some((ref) => {\n if (ref.isWrite()) {\n return false;\n }\n\n const { identifier } = ref;\n const { parent } = identifier;\n\n if (!parent) {\n return false;\n }\n\n if (isInTypeContext(parent)) {\n return false;\n }\n\n switch (parent.type) {\n case AST_NODE_TYPES.CallExpression:\n case AST_NODE_TYPES.NewExpression:\n case AST_NODE_TYPES.JSXMemberExpression:\n case AST_NODE_TYPES.JSXOpeningElement:\n case AST_NODE_TYPES.JSXClosingElement:\n case AST_NODE_TYPES.MemberExpression:\n case AST_NODE_TYPES.VariableDeclarator:\n case AST_NODE_TYPES.TaggedTemplateExpression:\n case AST_NODE_TYPES.SpreadElement:\n case AST_NODE_TYPES.ExportSpecifier:\n case AST_NODE_TYPES.ArrayExpression:\n case AST_NODE_TYPES.ObjectExpression:\n case AST_NODE_TYPES.BinaryExpression:\n case AST_NODE_TYPES.LogicalExpression:\n case AST_NODE_TYPES.UnaryExpression:\n case AST_NODE_TYPES.ReturnStatement:\n case AST_NODE_TYPES.ArrowFunctionExpression:\n case AST_NODE_TYPES.ConditionalExpression:\n case AST_NODE_TYPES.AwaitExpression:\n case AST_NODE_TYPES.YieldExpression:\n case AST_NODE_TYPES.Property:\n case AST_NODE_TYPES.JSXExpressionContainer:\n return true;\n\n default:\n return false;\n }\n });\n }\n\n function checkImportDeclaration(node: TSESTree.ImportDeclaration) {\n if (node.importKind === \"type\") {\n return;\n }\n\n const hasInlineTypeSpecifier = node.specifiers.some(\n (specifier) => specifier.type === AST_NODE_TYPES.ImportSpecifier && specifier.importKind === \"type\",\n );\n if (hasInlineTypeSpecifier) {\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 scope = context.sourceCode.getScope(node);\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 localName = specifier.local.name;\n return !isUsedAsValue(localName, scope);\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isLiteralUnionType(node: TSESTree.TypeNode): boolean {\n if (node.type !== AST_NODE_TYPES.TSUnionType) {\n return false;\n }\n\n return node.types.every(\n (member) =>\n member.type === AST_NODE_TYPES.TSLiteralType ||\n member.type === AST_NODE_TYPES.TSNullKeyword ||\n member.type === AST_NODE_TYPES.TSUndefinedKeyword,\n );\n}\n\nconst preferInlineLiteralUnion = createRule({\n name: \"prefer-inline-literal-union\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce inlining literal union types in interface properties instead of using type aliases for better IDE hover information\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n inlineLiteralUnion:\n \"Inline the literal union type instead of using a type alias for better IDE hover information\",\n },\n },\n defaultOptions: [],\n create(context) {\n const literalUnionAliases = new Map<string, TSESTree.TSTypeAliasDeclaration>();\n\n return {\n TSTypeAliasDeclaration(node) {\n if (isLiteralUnionType(node.typeAnnotation)) {\n literalUnionAliases.set(node.id.name, node);\n }\n },\n\n TSPropertySignature(node) {\n if (!node.typeAnnotation) {\n return;\n }\n\n const { typeAnnotation } = node.typeAnnotation;\n\n if (typeAnnotation.type !== AST_NODE_TYPES.TSTypeReference) {\n return;\n }\n\n if (typeAnnotation.typeName.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n\n const aliasName = typeAnnotation.typeName.name;\n const aliasDeclaration = literalUnionAliases.get(aliasName);\n\n if (!aliasDeclaration) {\n return;\n }\n\n const { sourceCode } = context;\n const unionText = sourceCode.getText(aliasDeclaration.typeAnnotation);\n\n context.report({\n node: typeAnnotation,\n messageId: \"inlineLiteralUnion\",\n fix(fixer) {\n return fixer.replaceText(typeAnnotation, unionText);\n },\n });\n },\n };\n },\n});\n\nexport default preferInlineLiteralUnion;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst preferInterfaceForComponentProps = createRule({\n name: \"prefer-interface-for-component-props\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce 'interface' over 'type' alias for component prop declarations in component files (*.tsx, *.jsx)\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n preferInterface: \"Component props '{{ name }}' should use 'interface' instead of 'type' alias.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) {\n return {};\n }\n\n return {\n TSTypeAliasDeclaration(node: TSESTree.TSTypeAliasDeclaration) {\n if (node.id.type !== AST_NODE_TYPES.Identifier) {\n return;\n }\n if (!node.id.name.endsWith(\"Props\")) {\n return;\n }\n if (node.typeAnnotation.type !== AST_NODE_TYPES.TSTypeLiteral) {\n return;\n }\n\n const { name } = node.id;\n\n context.report({\n node: node.id,\n messageId: \"preferInterface\",\n data: { name },\n fix(fixer) {\n const { sourceCode } = context;\n const typeText = sourceCode.getText(node.typeAnnotation);\n const typeParamsText = node.typeParameters ? sourceCode.getText(node.typeParameters) : \"\";\n const newText = `interface ${name}${typeParamsText} ${typeText}`;\n\n const tokenAfter = sourceCode.getTokenAfter(node);\n if (tokenAfter && tokenAfter.value === \";\") {\n return fixer.replaceTextRange([node.range[0], tokenAfter.range[1]], newText);\n }\n return fixer.replaceText(node, newText);\n },\n });\n },\n };\n },\n});\n\nexport default preferInterfaceForComponentProps;\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.replaceAll(\"-\", \"_\").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 { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst preferJSXTemplateLiterals = createRule({\n name: \"prefer-jsx-template-literals\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce using template literals instead of mixing text and JSX expressions\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n preferTemplate: \"Use template literal instead of mixing text with JSX expressions\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n function handleTextBeforeExpression(textNode: TSESTree.JSXText, exprNode: TSESTree.JSXExpressionContainer) {\n const textValue = textNode.value;\n const trimmedText = textValue.trim();\n\n if (!trimmedText) {\n return;\n }\n\n const hasTextContent = trimmedText.length > 0 && textValue !== trimmedText;\n const hasNoTrailingSpace = trimmedText.length > 0 && /\\S$/.test(textValue);\n\n if (!hasTextContent && !hasNoTrailingSpace) {\n return;\n }\n\n context.report({\n node: textNode,\n messageId: \"preferTemplate\",\n fix(fixer) {\n const textPart = textValue.trimEnd();\n const exprText = context.sourceCode.getText(exprNode.expression);\n const templateLiteral = `{\\`${textPart}\\${${exprText}}\\`}`;\n\n return [fixer.replaceText(textNode, templateLiteral), fixer.remove(exprNode)];\n },\n });\n }\n\n function handleExpressionBeforeText(exprNode: TSESTree.JSXExpressionContainer, textNode: TSESTree.JSXText) {\n const textValue = textNode.value;\n const trimmedText = textValue.trim();\n\n if (!trimmedText) {\n return;\n }\n\n const startsWithNonWhitespace = /^\\S/.test(trimmedText);\n\n if (!startsWithNonWhitespace) {\n return;\n }\n\n context.report({\n node: textNode,\n messageId: \"preferTemplate\",\n fix(fixer) {\n const exprText = context.sourceCode.getText(exprNode.expression);\n const textPart = textValue.trim();\n const templateLiteral = `{\\`\\${${exprText}}${textPart}\\`}`;\n\n return [fixer.replaceText(exprNode, templateLiteral), fixer.remove(textNode)];\n },\n });\n }\n\n function checkJSXElement(node: TSESTree.JSXElement) {\n const { children } = node;\n\n if (children.length < 2) {\n return;\n }\n\n for (let i = 0; i < children.length - 1; i += 1) {\n const child = children[i];\n const nextChild = children[i + 1];\n\n if (!child || !nextChild) {\n return;\n }\n\n if (child.type === AST_NODE_TYPES.JSXText && nextChild.type === AST_NODE_TYPES.JSXExpressionContainer) {\n handleTextBeforeExpression(child, nextChild);\n } else if (child.type === AST_NODE_TYPES.JSXExpressionContainer && nextChild.type === AST_NODE_TYPES.JSXText) {\n handleExpressionBeforeText(child, nextChild);\n }\n }\n }\n\n return {\n JSXElement: checkJSXElement,\n };\n },\n});\n\nexport default preferJSXTemplateLiterals;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst returnsJsx = (node: TSESTree.Node): boolean => {\n if (node.type === AST_NODE_TYPES.JSXElement || node.type === AST_NODE_TYPES.JSXFragment) {\n return true;\n }\n if (node.type === AST_NODE_TYPES.ConditionalExpression) {\n return returnsJsx(node.consequent) || returnsJsx(node.alternate);\n }\n if (node.type === AST_NODE_TYPES.LogicalExpression) {\n return returnsJsx(node.left) || returnsJsx(node.right);\n }\n return false;\n};\n\nconst bodyReturnsJsx = (body: TSESTree.BlockStatement | TSESTree.Expression): boolean => {\n if (body.type !== AST_NODE_TYPES.BlockStatement) {\n return returnsJsx(body);\n }\n return body.body.some(\n (stmt) => stmt.type === AST_NODE_TYPES.ReturnStatement && stmt.argument !== null && returnsJsx(stmt.argument),\n );\n};\n\nconst isReactComponentFunction = (\n node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression,\n): boolean => bodyReturnsJsx(node.body);\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 if (\n (node.type === AST_NODE_TYPES.FunctionDeclaration ||\n node.type === AST_NODE_TYPES.FunctionExpression ||\n node.type === AST_NODE_TYPES.ArrowFunctionExpression) &&\n params.length === 1 &&\n params[0].type === AST_NODE_TYPES.Identifier &&\n isReactComponentFunction(node)\n ) {\n return;\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 { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst preferPropsWithChildren = createRule({\n name: \"prefer-props-with-children\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Prefer PropsWithChildren<T> over manually declaring children: ReactNode in component props\",\n },\n schema: [],\n messages: {\n usePropsWithChildren: \"Use 'PropsWithChildren<T>' instead of manually declaring 'children?: ReactNode'.\",\n },\n },\n defaultOptions: [],\n create(context) {\n if (!isJsxFile(context.filename)) return {};\n\n function isReactNodeType(typeNode: TSESTree.TypeNode | undefined): boolean {\n if (!typeNode) {\n return false;\n }\n if (typeNode.type !== AST_NODE_TYPES.TSTypeReference) {\n return false;\n }\n const { typeName } = typeNode;\n if (typeName.type === AST_NODE_TYPES.Identifier) {\n return typeName.name === \"ReactNode\";\n }\n if (\n typeName.type === AST_NODE_TYPES.TSQualifiedName &&\n typeName.left.type === AST_NODE_TYPES.Identifier &&\n typeName.left.name === \"React\" &&\n typeName.right.type === AST_NODE_TYPES.Identifier &&\n typeName.right.name === \"ReactNode\"\n ) {\n return true;\n }\n return false;\n }\n\n function findChildrenReactNode(members: readonly TSESTree.TypeElement[]): TSESTree.TSPropertySignature | undefined {\n for (const member of members) {\n if (member.type !== AST_NODE_TYPES.TSPropertySignature) {\n continue;\n }\n if (member.key.type !== AST_NODE_TYPES.Identifier) {\n continue;\n }\n if (member.key.name !== \"children\") {\n continue;\n }\n if (!member.typeAnnotation) {\n continue;\n }\n if (member.optional && isReactNodeType(member.typeAnnotation.typeAnnotation)) {\n return member;\n }\n }\n return undefined;\n }\n\n return {\n TSInterfaceDeclaration(node) {\n const childrenMember = findChildrenReactNode(node.body.body);\n if (childrenMember) {\n context.report({\n node: childrenMember,\n messageId: \"usePropsWithChildren\",\n });\n }\n },\n TSTypeLiteral(node) {\n const childrenMember = findChildrenReactNode(node.members);\n if (childrenMember) {\n context.report({\n node: childrenMember,\n messageId: \"usePropsWithChildren\",\n });\n }\n },\n };\n },\n});\n\nexport default preferPropsWithChildren;\n","import { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\";\n\nimport { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").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 if (!isJsxFile(context.filename)) return {};\n\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 { isJsxFile } from \"../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.replaceAll(\"-\", \"_\").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 if (!isJsxFile(context.filename)) return {};\n\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 { 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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\ntype FunctionNode = TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression;\n\nconst isReactComponent = (node: FunctionNode): boolean => {\n if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {\n const { parent } = node;\n if (parent?.type === AST_NODE_TYPES.VariableDeclarator) {\n const { id } = parent;\n if (id.type === AST_NODE_TYPES.Identifier) {\n return /^[A-Z]/.test(id.name);\n }\n }\n }\n\n if (node.type === AST_NODE_TYPES.FunctionDeclaration && node.id) {\n return /^[A-Z]/.test(node.id.name);\n }\n\n return false;\n};\n\nconst isCallbackFunction = (node: FunctionNode): boolean => {\n if (node.type === AST_NODE_TYPES.FunctionDeclaration) {\n return false;\n }\n\n const { parent } = node;\n\n if (!parent) {\n return false;\n }\n\n if (parent.type === AST_NODE_TYPES.CallExpression && parent.arguments.includes(node)) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.Property) {\n return true;\n }\n\n if (parent.type === AST_NODE_TYPES.ArrayExpression) {\n return true;\n }\n\n return false;\n};\n\nconst getFunctionName = (node: FunctionNode): string | null => {\n if (node.type === AST_NODE_TYPES.FunctionDeclaration && node.id) {\n return node.id.name;\n }\n\n if (node.type === AST_NODE_TYPES.FunctionExpression && node.id) {\n return node.id.name;\n }\n\n if (\n (node.type === AST_NODE_TYPES.ArrowFunctionExpression || node.type === AST_NODE_TYPES.FunctionExpression) &&\n node.parent?.type === AST_NODE_TYPES.VariableDeclarator &&\n node.parent.id.type === AST_NODE_TYPES.Identifier\n ) {\n return node.parent.id.name;\n }\n\n return null;\n};\n\nconst requireExplicitReturnType = createRule({\n name: \"require-explicit-return-type\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Require explicit return types on functions for better code documentation and type safety\",\n },\n messages: {\n missingReturnType:\n \"Function '{{name}}' is missing an explicit return type. Add a return type annotation for better documentation.\",\n missingReturnTypeAnonymous:\n \"Function is missing an explicit return type. Add a return type annotation for better documentation.\",\n },\n schema: [],\n },\n defaultOptions: [],\n create(context) {\n const checkFunction = (node: FunctionNode) => {\n if (node.returnType) {\n return;\n }\n\n if (isCallbackFunction(node)) {\n return;\n }\n\n if (isReactComponent(node)) {\n return;\n }\n\n const functionName = getFunctionName(node);\n\n if (functionName) {\n context.report({\n node,\n messageId: \"missingReturnType\",\n data: { name: functionName },\n });\n } else {\n context.report({\n node,\n messageId: \"missingReturnTypeAnonymous\",\n });\n }\n };\n\n return {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n };\n },\n});\n\nexport default requireExplicitReturnType;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst GROUP_NAMES = [\"\", \"external/alias re-export\", \"relative re-export\", \"local export\"] as const;\n\nfunction getExportGroup(node: TSESTree.ExportNamedDeclaration): number {\n if (!node.source) {\n return 3;\n }\n\n const source = node.source.value;\n\n if (source.startsWith(\".\")) {\n return 2;\n }\n\n return 1;\n}\n\nconst sortExports = createRule({\n name: \"sort-exports\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce a consistent ordering of export groups\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n unsortedExports:\n \"Export group '{{current}}' should come before '{{previous}}'. Expected order: external/alias re-exports, relative re-exports, local exports.\",\n },\n },\n defaultOptions: [],\n create(context) {\n function checkOrder(exports: { node: TSESTree.ExportNamedDeclaration; group: number }[]): void {\n const firstUnsorted = exports.find((entry, index) => index > 0 && entry.group < exports[index - 1].group);\n\n if (!firstUnsorted) {\n return;\n }\n\n const previous = exports[exports.indexOf(firstUnsorted) - 1];\n\n context.report({\n node: firstUnsorted.node,\n messageId: \"unsortedExports\",\n data: {\n current: GROUP_NAMES[firstUnsorted.group],\n previous: GROUP_NAMES[previous.group],\n },\n fix(fixer) {\n const { sourceCode } = context;\n const sorted = [...exports].sort((a, b) => a.group - b.group);\n const sortedTexts = sorted.map((entry) => sourceCode.getText(entry.node));\n\n return exports.map((entry, index) => fixer.replaceText(entry.node, sortedTexts[index]));\n },\n });\n }\n\n return {\n Program(node) {\n const exportGroups: { node: TSESTree.ExportNamedDeclaration; group: number }[] = [];\n\n node.body.forEach((statement) => {\n if (statement.type !== AST_NODE_TYPES.ExportNamedDeclaration || statement.declaration !== null) {\n if (exportGroups.length > 0) {\n checkOrder(exportGroups);\n exportGroups.length = 0;\n }\n\n return;\n }\n\n exportGroups.push({ node: statement, group: getExportGroup(statement) });\n });\n\n if (exportGroups.length > 0) {\n checkOrder(exportGroups);\n }\n },\n };\n },\n});\n\nexport default sortExports;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nconst NODE_BUILTINS = new Set([\n \"assert\",\n \"async_hooks\",\n \"buffer\",\n \"child_process\",\n \"cluster\",\n \"console\",\n \"constants\",\n \"crypto\",\n \"dgram\",\n \"diagnostics_channel\",\n \"dns\",\n \"domain\",\n \"events\",\n \"fs\",\n \"http\",\n \"http2\",\n \"https\",\n \"inspector\",\n \"module\",\n \"net\",\n \"os\",\n \"path\",\n \"perf_hooks\",\n \"process\",\n \"punycode\",\n \"querystring\",\n \"readline\",\n \"repl\",\n \"stream\",\n \"string_decoder\",\n \"sys\",\n \"timers\",\n \"tls\",\n \"trace_events\",\n \"tty\",\n \"url\",\n \"util\",\n \"v8\",\n \"vm\",\n \"wasi\",\n \"worker_threads\",\n \"zlib\",\n]);\n\nconst GROUP_NAMES = [\"\", \"side-effect\", \"builtin\", \"external\", \"internal alias\", \"relative\"] as const;\n\nfunction getImportGroup(node: TSESTree.ImportDeclaration): number {\n const source = node.source.value;\n\n if (node.specifiers.length === 0 && node.importKind !== \"type\") {\n return 1;\n }\n\n if (source.startsWith(\"node:\") || NODE_BUILTINS.has(source.split(\"/\")[0])) {\n return 2;\n }\n\n if (source.startsWith(\"@/\") || source.startsWith(\"~/\") || source.startsWith(\"#\")) {\n return 4;\n }\n\n if (source.startsWith(\".\")) {\n return 5;\n }\n\n return 3;\n}\n\nfunction isTypeOnlyImport(node: TSESTree.ImportDeclaration): boolean {\n return node.importKind === \"type\" && node.specifiers.length > 0;\n}\n\nconst sortImports = createRule({\n name: \"sort-imports\",\n meta: {\n type: \"suggestion\",\n docs: {\n description: \"Enforce a consistent ordering of import groups\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n unsortedImports:\n \"Import group '{{current}}' should come before '{{previous}}'. Expected order: side-effect, builtin, external, internal alias, relative.\",\n },\n },\n defaultOptions: [],\n create(context) {\n function checkOrder(imports: { node: TSESTree.ImportDeclaration; group: number }[]): void {\n const isSorted = imports.every((entry, index) => index === 0 || entry.group >= imports[index - 1].group);\n\n if (isSorted) {\n return;\n }\n\n const firstUnsorted = imports.find((entry, index) => index > 0 && entry.group < imports[index - 1].group);\n\n if (!firstUnsorted) {\n return;\n }\n\n const previous = imports[imports.indexOf(firstUnsorted) - 1];\n\n context.report({\n node: firstUnsorted.node,\n messageId: \"unsortedImports\",\n data: {\n current: GROUP_NAMES[firstUnsorted.group],\n previous: GROUP_NAMES[previous.group],\n },\n fix(fixer) {\n const { sourceCode } = context;\n const sorted = [...imports].sort((a, b) => a.group - b.group);\n const sortedTexts = sorted.map((entry) => sourceCode.getText(entry.node));\n\n return imports.map((entry, index) => fixer.replaceText(entry.node, sortedTexts[index]));\n },\n });\n }\n\n return {\n Program(node) {\n const importGroups: { node: TSESTree.ImportDeclaration; group: number }[] = [];\n\n node.body.forEach((statement) => {\n if (statement.type !== AST_NODE_TYPES.ImportDeclaration) {\n if (importGroups.length > 0) {\n checkOrder(importGroups);\n importGroups.length = 0;\n }\n\n return;\n }\n\n if (isTypeOnlyImport(statement)) {\n return;\n }\n\n importGroups.push({ node: statement, group: getImportGroup(statement) });\n });\n\n if (importGroups.length > 0) {\n checkOrder(importGroups);\n }\n },\n };\n },\n});\n\nexport default sortImports;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isAlphabeticallySortedWithinGroups(members: TSESTree.TypeElement[]): boolean {\n const properties = members.filter(\n (member): member is TSESTree.TSPropertySignature =>\n member.type === AST_NODE_TYPES.TSPropertySignature && member.key.type === AST_NODE_TYPES.Identifier,\n );\n\n if (properties.length < 2) {\n return true;\n }\n\n const required = properties.filter((prop) => !prop.optional).map((prop) => (prop.key as TSESTree.Identifier).name);\n\n const optional = properties.filter((prop) => prop.optional).map((prop) => (prop.key as TSESTree.Identifier).name);\n\n const isRequiredSorted = required.every((name, index) => index === 0 || required[index - 1].localeCompare(name) <= 0);\n\n const isOptionalSorted = optional.every((name, index) => index === 0 || optional[index - 1].localeCompare(name) <= 0);\n\n return isRequiredSorted && isOptionalSorted;\n}\n\nconst sortTypeAlphabetically = createRule({\n name: \"sort-type-alphabetically\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce alphabetical sorting of properties within required and optional groups in TypeScript interfaces and type aliases\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n unsortedTypeMembers: \"Type members should be sorted alphabetically within their required and optional groups.\",\n },\n },\n defaultOptions: [],\n create(context) {\n function fixMembers(\n fixer: Parameters<NonNullable<Parameters<typeof context.report>[0][\"fix\"]>>[0],\n members: TSESTree.TypeElement[],\n ) {\n const { sourceCode } = context;\n const properties = members.filter(\n (member): member is TSESTree.TSPropertySignature =>\n member.type === AST_NODE_TYPES.TSPropertySignature && member.key.type === AST_NODE_TYPES.Identifier,\n );\n\n const required = properties.filter((prop) => !prop.optional);\n const optional = properties.filter((prop) => prop.optional);\n\n const sortedRequired = [...required].sort((a, b) =>\n (a.key as TSESTree.Identifier).name.localeCompare((b.key as TSESTree.Identifier).name),\n );\n const sortedOptional = [...optional].sort((a, b) =>\n (a.key as TSESTree.Identifier).name.localeCompare((b.key as TSESTree.Identifier).name),\n );\n\n const sortedMap = new Map<TSESTree.TSPropertySignature, string>();\n let reqIdx = 0;\n let optIdx = 0;\n\n properties.forEach((prop) => {\n if (!prop.optional) {\n sortedMap.set(prop, sourceCode.getText(sortedRequired[reqIdx]));\n reqIdx += 1;\n } else {\n sortedMap.set(prop, sourceCode.getText(sortedOptional[optIdx]));\n optIdx += 1;\n }\n });\n\n return properties\n .filter((prop) => sourceCode.getText(prop) !== sortedMap.get(prop))\n .map((prop) => fixer.replaceText(prop, sortedMap.get(prop)!));\n }\n\n return {\n TSInterfaceDeclaration(node) {\n if (!isAlphabeticallySortedWithinGroups(node.body.body)) {\n context.report({\n node,\n messageId: \"unsortedTypeMembers\",\n fix(fixer) {\n return fixMembers(fixer, node.body.body);\n },\n });\n }\n },\n TSTypeAliasDeclaration(node) {\n if (node.typeAnnotation.type !== AST_NODE_TYPES.TSTypeLiteral) {\n return;\n }\n\n const { members } = node.typeAnnotation;\n\n if (!isAlphabeticallySortedWithinGroups(members)) {\n context.report({\n node,\n messageId: \"unsortedTypeMembers\",\n fix(fixer) {\n return fixMembers(fixer, members);\n },\n });\n }\n },\n };\n },\n});\n\nexport default sortTypeAlphabetically;\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.replaceAll(\"-\", \"_\").toUpperCase()}.md`,\n);\n\nfunction isRequiredBeforeOptional(members: TSESTree.TypeElement[]): boolean {\n const properties = members.filter(\n (member): member is TSESTree.TSPropertySignature =>\n member.type === AST_NODE_TYPES.TSPropertySignature && member.key.type === AST_NODE_TYPES.Identifier,\n );\n\n if (properties.length < 2) {\n return true;\n }\n\n const firstOptionalIndex = properties.findIndex((prop) => prop.optional);\n\n if (firstOptionalIndex === -1) {\n return true;\n }\n\n return properties.slice(firstOptionalIndex).every((prop) => prop.optional);\n}\n\nconst sortTypeRequiredFirst = createRule({\n name: \"sort-type-required-first\",\n meta: {\n type: \"suggestion\",\n docs: {\n description:\n \"Enforce required properties come before optional properties in TypeScript interfaces and type aliases\",\n },\n fixable: \"code\",\n schema: [],\n messages: {\n unsortedTypeMembers: \"Required type members should come before optional members.\",\n },\n },\n defaultOptions: [],\n create(context) {\n function fixMembers(\n fixer: Parameters<NonNullable<Parameters<typeof context.report>[0][\"fix\"]>>[0],\n members: TSESTree.TypeElement[],\n ) {\n const { sourceCode } = context;\n const properties = members.filter(\n (member): member is TSESTree.TSPropertySignature =>\n member.type === AST_NODE_TYPES.TSPropertySignature && member.key.type === AST_NODE_TYPES.Identifier,\n );\n\n const required = properties.filter((prop) => !prop.optional);\n const optional = properties.filter((prop) => prop.optional);\n const sorted = [...required, ...optional];\n\n const sortedTexts = sorted.map((prop) => sourceCode.getText(prop));\n\n return properties.map((prop, index) => fixer.replaceText(prop, sortedTexts[index]));\n }\n\n return {\n TSInterfaceDeclaration(node) {\n if (!isRequiredBeforeOptional(node.body.body)) {\n context.report({\n node,\n messageId: \"unsortedTypeMembers\",\n fix(fixer) {\n return fixMembers(fixer, node.body.body);\n },\n });\n }\n },\n TSTypeAliasDeclaration(node) {\n if (node.typeAnnotation.type !== AST_NODE_TYPES.TSTypeLiteral) {\n return;\n }\n\n const { members } = node.typeAnnotation;\n\n if (!isRequiredBeforeOptional(members)) {\n context.report({\n node,\n messageId: \"unsortedTypeMembers\",\n fix(fixer) {\n return fixMembers(fixer, members);\n },\n });\n }\n },\n };\n },\n});\n\nexport default sortTypeRequiredFirst;\n","import packageJson from \"../package.json\" with { type: \"json\" };\n\nimport booleanNamingPrefix from \"./rules/boolean-naming-prefix\";\nimport enforceCamelCase from \"./rules/enforce-camel-case\";\nimport enforceConstantCase from \"./rules/enforce-constant-case\";\nimport enforceHookFilename from \"./rules/enforce-hook-filename\";\nimport enforceHookNaming from \"./rules/enforce-hook-naming\";\nimport enforcePropertyCase from \"./rules/enforce-property-case\";\nimport enforcePropsSuffix from \"./rules/enforce-props-suffix\";\nimport enforceReadonlyComponentProps from \"./rules/enforce-readonly-component-props\";\nimport enforceRenderNaming from \"./rules/enforce-render-naming\";\nimport enforceServiceNaming from \"./rules/enforce-service-naming\";\nimport enforceTestFilename from \"./rules/enforce-test-filename\";\nimport enforceSortedDestructuring from \"./rules/enforce-sorted-destructuring\";\nimport enforceTypeDeclarationOrder from \"./rules/enforce-type-declaration-order\";\nimport indexExportOnly from \"./rules/index-export-only\";\nimport jsxNewlineBetweenElements from \"./rules/jsx-newline-between-elements\";\nimport jsxNoDataArray from \"./rules/jsx-no-data-array\";\nimport jsxNoDataObject from \"./rules/jsx-no-data-object\";\nimport jsxNoInlineObjectProp from \"./rules/jsx-no-inline-object-prop\";\nimport jsxNoNewlineSingleLineElements from \"./rules/jsx-no-newline-single-line-elements\";\nimport jsxNoNonComponentFunction from \"./rules/jsx-no-non-component-function\";\nimport jsxNoSubInterface from \"./rules/jsx-no-sub-interface\";\nimport jsxNoTernaryNull from \"./rules/jsx-no-ternary-null\";\nimport jsxNoVariableInCallback from \"./rules/jsx-no-variable-in-callback\";\nimport jsxRequireSuspense from \"./rules/jsx-require-suspense\";\nimport jsxSimpleProps from \"./rules/jsx-simple-props\";\nimport jsxSortProps from \"./rules/jsx-sort-props\";\nimport jsxSpreadPropsLast from \"./rules/jsx-spread-props-last\";\nimport newlineAfterMultilineBlock from \"./rules/newline-after-multiline-block\";\nimport newlineBeforeReturn from \"./rules/newline-before-return\";\nimport noComplexInlineReturn from \"./rules/no-complex-inline-return\";\nimport noDirectDate from \"./rules/no-direct-date\";\nimport noEmoji from \"./rules/no-emoji\";\nimport noEnvFallback from \"./rules/no-env-fallback\";\nimport noGhostWrapper from \"./rules/no-ghost-wrapper\";\nimport noHelperFunctionInHook from \"./rules/no-helper-function-in-hook\";\nimport noHelperFunctionInTest from \"./rules/no-helper-function-in-test\";\nimport noInlineDefaultExport from \"./rules/no-inline-default-export\";\nimport noInlineNestedObject from \"./rules/no-inline-nested-object\";\nimport noInlineReturnProperties from \"./rules/no-inline-return-properties\";\nimport noInlineTypeImport from \"./rules/no-inline-type-import\";\nimport noLazyIdentifiers from \"./rules/no-lazy-identifiers\";\nimport noLogicInParams from \"./rules/no-logic-in-params\";\nimport noMisleadingConstantCase from \"./rules/no-misleading-constant-case\";\nimport noNestedInterfaceDeclaration from \"./rules/no-nested-interface-declaration\";\nimport noNestedTernary from \"./rules/no-nested-ternary\";\nimport noRedundantFragment from \"./rules/no-redundant-fragment\";\nimport noRelativeImports from \"./rules/no-relative-imports\";\nimport noSingleCharVariables from \"./rules/no-single-char-variables\";\nimport preferAsyncAwait from \"./rules/prefer-async-await\";\nimport preferDestructuringParams from \"./rules/prefer-destructuring-params\";\nimport preferFunctionDeclaration from \"./rules/prefer-function-declaration\";\nimport preferGuardClause from \"./rules/prefer-guard-clause\";\nimport preferImportType from \"./rules/prefer-import-type\";\nimport preferInlineLiteralUnion from \"./rules/prefer-inline-literal-union\";\nimport preferInterfaceForComponentProps from \"./rules/prefer-interface-for-component-props\";\nimport preferInterfaceOverInlineTypes from \"./rules/prefer-interface-over-inline-types\";\nimport preferJSXTemplateLiterals from \"./rules/prefer-jsx-template-literals\";\nimport preferNamedParamTypes from \"./rules/prefer-named-param-types\";\nimport preferPropsWithChildren from \"./rules/prefer-props-with-children\";\nimport preferReactImportTypes from \"./rules/prefer-react-import-types\";\nimport reactPropsDestructure from \"./rules/react-props-destructure\";\nimport requireExplicitReturnType from \"./rules/require-explicit-return-type\";\nimport sortExports from \"./rules/sort-exports\";\nimport sortImports from \"./rules/sort-imports\";\nimport sortTypeAlphabetically from \"./rules/sort-type-alphabetically\";\nimport sortTypeRequiredFirst from \"./rules/sort-type-required-first\";\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 \"boolean-naming-prefix\": booleanNamingPrefix,\n \"enforce-camel-case\": enforceCamelCase,\n \"enforce-constant-case\": enforceConstantCase,\n \"enforce-hook-filename\": enforceHookFilename,\n \"enforce-hook-naming\": enforceHookNaming,\n \"enforce-property-case\": enforcePropertyCase,\n \"enforce-props-suffix\": enforcePropsSuffix,\n \"enforce-readonly-component-props\": enforceReadonlyComponentProps,\n \"enforce-render-naming\": enforceRenderNaming,\n \"enforce-service-naming\": enforceServiceNaming,\n \"enforce-test-filename\": enforceTestFilename,\n \"enforce-sorted-destructuring\": enforceSortedDestructuring,\n \"enforce-type-declaration-order\": enforceTypeDeclarationOrder,\n \"index-export-only\": indexExportOnly,\n \"jsx-newline-between-elements\": jsxNewlineBetweenElements,\n \"jsx-no-data-array\": jsxNoDataArray,\n \"jsx-no-data-object\": jsxNoDataObject,\n \"jsx-no-inline-object-prop\": jsxNoInlineObjectProp,\n \"jsx-no-newline-single-line-elements\": jsxNoNewlineSingleLineElements,\n \"jsx-no-non-component-function\": jsxNoNonComponentFunction,\n \"jsx-no-sub-interface\": jsxNoSubInterface,\n \"jsx-no-ternary-null\": jsxNoTernaryNull,\n \"jsx-no-variable-in-callback\": jsxNoVariableInCallback,\n \"jsx-require-suspense\": jsxRequireSuspense,\n \"jsx-simple-props\": jsxSimpleProps,\n \"jsx-sort-props\": jsxSortProps,\n \"jsx-spread-props-last\": jsxSpreadPropsLast,\n \"newline-after-multiline-block\": newlineAfterMultilineBlock,\n \"newline-before-return\": newlineBeforeReturn,\n \"no-complex-inline-return\": noComplexInlineReturn,\n \"no-direct-date\": noDirectDate,\n \"no-emoji\": noEmoji,\n \"no-env-fallback\": noEnvFallback,\n \"no-ghost-wrapper\": noGhostWrapper,\n \"no-helper-function-in-hook\": noHelperFunctionInHook,\n \"no-helper-function-in-test\": noHelperFunctionInTest,\n \"no-inline-default-export\": noInlineDefaultExport,\n \"no-inline-nested-object\": noInlineNestedObject,\n \"no-inline-return-properties\": noInlineReturnProperties,\n \"no-inline-type-import\": noInlineTypeImport,\n \"no-lazy-identifiers\": noLazyIdentifiers,\n \"no-logic-in-params\": noLogicInParams,\n \"no-misleading-constant-case\": noMisleadingConstantCase,\n \"no-nested-interface-declaration\": noNestedInterfaceDeclaration,\n \"no-nested-ternary\": noNestedTernary,\n \"no-redundant-fragment\": noRedundantFragment,\n \"no-relative-imports\": noRelativeImports,\n \"no-single-char-variables\": noSingleCharVariables,\n \"prefer-async-await\": preferAsyncAwait,\n \"prefer-destructuring-params\": preferDestructuringParams,\n \"prefer-function-declaration\": preferFunctionDeclaration,\n \"prefer-guard-clause\": preferGuardClause,\n \"prefer-import-type\": preferImportType,\n \"prefer-inline-literal-union\": preferInlineLiteralUnion,\n \"prefer-interface-for-component-props\": preferInterfaceForComponentProps,\n \"prefer-interface-over-inline-types\": preferInterfaceOverInlineTypes,\n \"prefer-jsx-template-literals\": preferJSXTemplateLiterals,\n \"prefer-named-param-types\": preferNamedParamTypes,\n \"prefer-props-with-children\": preferPropsWithChildren,\n \"prefer-react-import-types\": preferReactImportTypes,\n \"react-props-destructure\": reactPropsDestructure,\n \"require-explicit-return-type\": requireExplicitReturnType,\n \"sort-exports\": sortExports,\n \"sort-imports\": sortImports,\n \"sort-type-alphabetically\": sortTypeAlphabetically,\n \"sort-type-required-first\": sortTypeRequiredFirst,\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/boolean-naming-prefix\": \"warn\",\n \"nextfriday/enforce-camel-case\": \"warn\",\n \"nextfriday/enforce-constant-case\": \"warn\",\n \"nextfriday/enforce-hook-filename\": \"warn\",\n \"nextfriday/enforce-hook-naming\": \"warn\",\n \"nextfriday/enforce-property-case\": \"warn\",\n \"nextfriday/enforce-service-naming\": \"warn\",\n \"nextfriday/enforce-test-filename\": \"warn\",\n \"nextfriday/enforce-sorted-destructuring\": \"warn\",\n \"nextfriday/enforce-type-declaration-order\": \"warn\",\n \"nextfriday/index-export-only\": \"warn\",\n \"nextfriday/newline-after-multiline-block\": \"warn\",\n \"nextfriday/newline-before-return\": \"warn\",\n \"nextfriday/no-complex-inline-return\": \"warn\",\n \"nextfriday/no-direct-date\": \"warn\",\n \"nextfriday/no-emoji\": \"warn\",\n \"nextfriday/no-env-fallback\": \"warn\",\n \"nextfriday/no-helper-function-in-hook\": \"warn\",\n \"nextfriday/no-helper-function-in-test\": \"warn\",\n \"nextfriday/no-inline-default-export\": \"warn\",\n \"nextfriday/no-inline-nested-object\": \"warn\",\n \"nextfriday/no-inline-return-properties\": \"warn\",\n \"nextfriday/no-inline-type-import\": \"warn\",\n \"nextfriday/no-lazy-identifiers\": \"warn\",\n \"nextfriday/no-logic-in-params\": \"warn\",\n \"nextfriday/no-misleading-constant-case\": \"warn\",\n \"nextfriday/no-nested-interface-declaration\": \"warn\",\n \"nextfriday/no-nested-ternary\": \"warn\",\n \"nextfriday/no-relative-imports\": \"warn\",\n \"nextfriday/no-single-char-variables\": \"warn\",\n \"nextfriday/prefer-async-await\": \"warn\",\n \"nextfriday/prefer-destructuring-params\": \"warn\",\n \"nextfriday/prefer-function-declaration\": \"warn\",\n \"nextfriday/prefer-guard-clause\": \"warn\",\n \"nextfriday/prefer-import-type\": \"warn\",\n \"nextfriday/prefer-inline-literal-union\": \"warn\",\n \"nextfriday/prefer-named-param-types\": \"warn\",\n \"nextfriday/prefer-react-import-types\": \"warn\",\n \"nextfriday/require-explicit-return-type\": \"warn\",\n \"nextfriday/sort-exports\": \"warn\",\n \"nextfriday/sort-imports\": \"warn\",\n \"nextfriday/sort-type-alphabetically\": \"warn\",\n \"nextfriday/sort-type-required-first\": \"warn\",\n} as const;\n\nconst baseRecommendedRules = {\n \"nextfriday/boolean-naming-prefix\": \"error\",\n \"nextfriday/enforce-camel-case\": \"error\",\n \"nextfriday/enforce-constant-case\": \"error\",\n \"nextfriday/enforce-hook-filename\": \"error\",\n \"nextfriday/enforce-hook-naming\": \"error\",\n \"nextfriday/enforce-property-case\": \"error\",\n \"nextfriday/enforce-service-naming\": \"error\",\n \"nextfriday/enforce-test-filename\": \"error\",\n \"nextfriday/enforce-sorted-destructuring\": \"error\",\n \"nextfriday/enforce-type-declaration-order\": \"error\",\n \"nextfriday/index-export-only\": \"error\",\n \"nextfriday/newline-after-multiline-block\": \"error\",\n \"nextfriday/newline-before-return\": \"error\",\n \"nextfriday/no-complex-inline-return\": \"error\",\n \"nextfriday/no-direct-date\": \"error\",\n \"nextfriday/no-emoji\": \"error\",\n \"nextfriday/no-env-fallback\": \"error\",\n \"nextfriday/no-helper-function-in-hook\": \"error\",\n \"nextfriday/no-helper-function-in-test\": \"error\",\n \"nextfriday/no-inline-default-export\": \"error\",\n \"nextfriday/no-inline-nested-object\": \"error\",\n \"nextfriday/no-inline-return-properties\": \"error\",\n \"nextfriday/no-inline-type-import\": \"error\",\n \"nextfriday/no-lazy-identifiers\": \"error\",\n \"nextfriday/no-logic-in-params\": \"error\",\n \"nextfriday/no-misleading-constant-case\": \"error\",\n \"nextfriday/no-nested-interface-declaration\": \"error\",\n \"nextfriday/no-nested-ternary\": \"error\",\n \"nextfriday/no-relative-imports\": \"error\",\n \"nextfriday/no-single-char-variables\": \"error\",\n \"nextfriday/prefer-async-await\": \"error\",\n \"nextfriday/prefer-destructuring-params\": \"error\",\n \"nextfriday/prefer-function-declaration\": \"error\",\n \"nextfriday/prefer-guard-clause\": \"error\",\n \"nextfriday/prefer-import-type\": \"error\",\n \"nextfriday/prefer-inline-literal-union\": \"error\",\n \"nextfriday/prefer-named-param-types\": \"error\",\n \"nextfriday/prefer-react-import-types\": \"error\",\n \"nextfriday/require-explicit-return-type\": \"error\",\n \"nextfriday/sort-exports\": \"error\",\n \"nextfriday/sort-imports\": \"error\",\n \"nextfriday/sort-type-alphabetically\": \"error\",\n \"nextfriday/sort-type-required-first\": \"error\",\n} as const;\n\nconst jsxRules = {\n \"nextfriday/enforce-props-suffix\": \"warn\",\n \"nextfriday/enforce-readonly-component-props\": \"warn\",\n \"nextfriday/enforce-render-naming\": \"warn\",\n \"nextfriday/jsx-newline-between-elements\": \"warn\",\n \"nextfriday/jsx-no-data-array\": \"warn\",\n \"nextfriday/jsx-no-data-object\": \"warn\",\n \"nextfriday/jsx-no-inline-object-prop\": \"warn\",\n \"nextfriday/jsx-no-newline-single-line-elements\": \"warn\",\n \"nextfriday/jsx-no-non-component-function\": \"warn\",\n \"nextfriday/jsx-no-sub-interface\": \"warn\",\n \"nextfriday/jsx-no-ternary-null\": \"warn\",\n \"nextfriday/jsx-no-variable-in-callback\": \"warn\",\n \"nextfriday/jsx-require-suspense\": \"warn\",\n \"nextfriday/jsx-simple-props\": \"warn\",\n \"nextfriday/jsx-sort-props\": \"warn\",\n \"nextfriday/jsx-spread-props-last\": \"warn\",\n \"nextfriday/no-ghost-wrapper\": \"warn\",\n \"nextfriday/no-redundant-fragment\": \"warn\",\n \"nextfriday/prefer-interface-for-component-props\": \"warn\",\n \"nextfriday/prefer-interface-over-inline-types\": \"warn\",\n \"nextfriday/prefer-jsx-template-literals\": \"warn\",\n \"nextfriday/prefer-props-with-children\": \"warn\",\n \"nextfriday/react-props-destructure\": \"warn\",\n} as const;\n\nconst jsxRecommendedRules = {\n \"nextfriday/enforce-props-suffix\": \"error\",\n \"nextfriday/enforce-readonly-component-props\": \"error\",\n \"nextfriday/enforce-render-naming\": \"error\",\n \"nextfriday/jsx-newline-between-elements\": \"error\",\n \"nextfriday/jsx-no-data-array\": \"error\",\n \"nextfriday/jsx-no-data-object\": \"error\",\n \"nextfriday/jsx-no-inline-object-prop\": \"error\",\n \"nextfriday/jsx-no-newline-single-line-elements\": \"error\",\n \"nextfriday/jsx-no-non-component-function\": \"error\",\n \"nextfriday/jsx-no-sub-interface\": \"error\",\n \"nextfriday/jsx-no-ternary-null\": \"error\",\n \"nextfriday/jsx-no-variable-in-callback\": \"error\",\n \"nextfriday/jsx-require-suspense\": \"error\",\n \"nextfriday/jsx-simple-props\": \"error\",\n \"nextfriday/jsx-sort-props\": \"error\",\n \"nextfriday/jsx-spread-props-last\": \"error\",\n \"nextfriday/no-ghost-wrapper\": \"error\",\n \"nextfriday/no-redundant-fragment\": \"error\",\n \"nextfriday/prefer-interface-for-component-props\": \"error\",\n \"nextfriday/prefer-interface-over-inline-types\": \"error\",\n \"nextfriday/prefer-jsx-template-literals\": \"error\",\n \"nextfriday/prefer-props-with-children\": \"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};\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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"}