@gaia-react/lint 1.1.3 → 1.2.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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guardrails.d.ts","sourceRoot":"","sources":["../../src/configs/guardrails.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"guardrails.d.ts","sourceRoot":"","sources":["../../src/configs/guardrails.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AAiGnC,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAMrC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -650,6 +650,36 @@ var plugin = {
|
|
|
650
650
|
};
|
|
651
651
|
var no_enum_default = plugin;
|
|
652
652
|
|
|
653
|
+
// src/plugins/no-jsx-iife.ts
|
|
654
|
+
var noJsxIifeRule = {
|
|
655
|
+
create: (context) => ({
|
|
656
|
+
"JSXExpressionContainer > CallExpression > ArrowFunctionExpression.callee": (node) => {
|
|
657
|
+
context.report({ messageId: "noJsxIife", node });
|
|
658
|
+
},
|
|
659
|
+
"JSXExpressionContainer > CallExpression > FunctionExpression.callee": (node) => {
|
|
660
|
+
context.report({ messageId: "noJsxIife", node });
|
|
661
|
+
}
|
|
662
|
+
}),
|
|
663
|
+
meta: {
|
|
664
|
+
docs: { description: "Disallow IIFEs in JSX expressions" },
|
|
665
|
+
messages: {
|
|
666
|
+
noJsxIife: "Do not use IIFEs in JSX. Use a computed variable before the return or extract a component instead."
|
|
667
|
+
},
|
|
668
|
+
schema: [],
|
|
669
|
+
type: "problem"
|
|
670
|
+
}
|
|
671
|
+
};
|
|
672
|
+
var plugin2 = {
|
|
673
|
+
meta: {
|
|
674
|
+
name: "no-jsx-iife",
|
|
675
|
+
version: "0.1.0"
|
|
676
|
+
},
|
|
677
|
+
rules: {
|
|
678
|
+
"no-jsx-iife": noJsxIifeRule
|
|
679
|
+
}
|
|
680
|
+
};
|
|
681
|
+
var no_jsx_iife_default = plugin2;
|
|
682
|
+
|
|
653
683
|
// src/plugins/no-switch.ts
|
|
654
684
|
var noSwitchRule = {
|
|
655
685
|
create: (context) => ({
|
|
@@ -666,7 +696,7 @@ var noSwitchRule = {
|
|
|
666
696
|
type: "problem"
|
|
667
697
|
}
|
|
668
698
|
};
|
|
669
|
-
var
|
|
699
|
+
var plugin3 = {
|
|
670
700
|
meta: {
|
|
671
701
|
name: "no-switch",
|
|
672
702
|
version: "0.1.0"
|
|
@@ -675,7 +705,7 @@ var plugin2 = {
|
|
|
675
705
|
"no-switch": noSwitchRule
|
|
676
706
|
}
|
|
677
707
|
};
|
|
678
|
-
var no_switch_default =
|
|
708
|
+
var no_switch_default = plugin3;
|
|
679
709
|
|
|
680
710
|
// src/configs/guardrails.ts
|
|
681
711
|
var sonarConfig = [
|
|
@@ -728,6 +758,14 @@ var noEnumConfig = [
|
|
|
728
758
|
}
|
|
729
759
|
}
|
|
730
760
|
];
|
|
761
|
+
var noJsxIifeConfig = [
|
|
762
|
+
{
|
|
763
|
+
files: ["**/*.tsx", "**/*.jsx"],
|
|
764
|
+
name: "no-jsx-iife",
|
|
765
|
+
plugins: { "no-jsx-iife": no_jsx_iife_default },
|
|
766
|
+
rules: { "no-jsx-iife/no-jsx-iife": "error" }
|
|
767
|
+
}
|
|
768
|
+
];
|
|
731
769
|
var noSwitchConfig = [
|
|
732
770
|
{
|
|
733
771
|
files: ["**/*.ts?(x)", "**/*.js?(x)"],
|
|
@@ -758,6 +796,7 @@ var noRelativeImportPathsConfig = [
|
|
|
758
796
|
var guardrails = [
|
|
759
797
|
...sonarConfig,
|
|
760
798
|
...noEnumConfig,
|
|
799
|
+
...noJsxIifeConfig,
|
|
761
800
|
...noSwitchConfig,
|
|
762
801
|
...noRelativeImportPathsConfig
|
|
763
802
|
];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/configs/base.ts","../src/configs/react.ts","../src/configs/style-hygiene.ts","../src/configs/guardrails.ts","../src/plugins/no-enum.ts","../src/plugins/no-switch.ts","../src/configs/testing.ts","../src/configs/storybook.ts","../src/configs/playwright.ts","../src/configs/prettier.ts","../src/configs/better-tailwind.ts","../src/configs/ignores.ts","../src/index.ts"],"sourcesContent":["import eslintComments from '@eslint-community/eslint-plugin-eslint-comments';\nimport js from '@eslint/js';\nimport {configs, plugins, rules} from 'eslint-config-airbnb-extended';\nimport preferArrowFunctions from 'eslint-plugin-prefer-arrow-functions';\nimport lodashUnderscore from 'eslint-plugin-you-dont-need-lodash-underscore';\nimport type {ESLint, Linter} from 'eslint';\n\nconst jsConfig: Linter.Config[] = [\n // ESLint recommended config\n {\n name: 'js/config',\n ...js.configs.recommended,\n },\n // Stylistic plugin\n plugins.stylistic,\n // Import X plugin\n plugins.importX,\n // Airbnb base recommended config\n ...configs.base.recommended,\n // Strict import rules\n rules.base.importsStrict,\n];\n\nconst jsCustomConfig: Linter.Config[] = [\n {\n name: 'js-custom',\n rules: {\n 'consistent-return': 'off',\n curly: ['error', 'all'],\n 'max-params': 'error',\n 'no-param-reassign': 'off', // handled by sonarjs\n 'no-undef': 'off',\n 'no-unused-vars': 'off', // handled by sonarjs\n },\n },\n {\n files: ['**/*.test.ts?(x)', '**/*.stories.ts?(x)'],\n name: 'test-files/all',\n rules: {\n 'guard-for-in': 'off',\n 'max-params': 'off',\n 'no-await-in-loop': 'off',\n 'no-plusplus': 'off',\n 'no-restricted-syntax': 'off',\n },\n },\n {\n files: ['.playwright/**/*.ts?(x)'],\n name: 'playwright/all',\n rules: {\n 'no-await-in-loop': 'off',\n 'no-restricted-syntax': 'off',\n },\n },\n];\n\nconst typescriptConfig: Linter.Config[] = [\n // TypeScript ESLint plugin\n plugins.typescriptEslint,\n // Airbnb base TypeScript config\n ...configs.base.typescript,\n // Strict TypeScript rules\n rules.typescript.typescriptEslintStrict,\n rules.typescript.stylistic,\n // Airbnb React TypeScript config\n ...configs.react.typescript,\n {\n files: ['./*.ts'],\n name: 'root-ts-files',\n rules: {\n 'global-require': 'off',\n 'no-void': 'off',\n },\n },\n {\n files: ['**/*.ts?(x)'],\n name: 'no-void',\n rules: {\n 'no-void': ['error', {allowAsStatement: true}],\n },\n },\n];\n\nconst tsEslintConfig: Linter.Config[] = [\n {\n files: ['**/*.ts?(x)'],\n name: 'typescript/config',\n rules: {\n '@typescript-eslint/array-type': ['error', {default: 'array'}],\n '@typescript-eslint/ban-ts-comment': 'off',\n '@typescript-eslint/consistent-type-definitions': ['error', 'type'],\n '@typescript-eslint/consistent-type-imports': 'error',\n '@typescript-eslint/explicit-module-boundary-types': 'off',\n '@typescript-eslint/method-signature-style': 'error',\n '@typescript-eslint/no-confusing-void-expression': [\n 'error',\n {ignoreArrowShorthand: true},\n ],\n '@typescript-eslint/no-floating-promises': [\n 'error',\n {ignoreIIFE: true, ignoreVoid: true},\n ],\n '@typescript-eslint/no-misused-promises': [\n 'error',\n {checksVoidReturn: false},\n ],\n '@typescript-eslint/no-non-null-assertion': 'off',\n '@typescript-eslint/no-throw-literal': 'off',\n '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'error',\n '@typescript-eslint/no-unnecessary-condition': 'error',\n '@typescript-eslint/no-unnecessary-type-parameters': 'off',\n '@typescript-eslint/no-unsafe-assignment': 'error',\n '@typescript-eslint/no-unsafe-return': 'error',\n '@typescript-eslint/only-throw-error': 'off',\n '@typescript-eslint/prefer-nullish-coalescing': 'error',\n '@typescript-eslint/prefer-promise-reject-errors': 'off',\n '@typescript-eslint/restrict-template-expressions': [\n 'error',\n {allowBoolean: true, allowNumber: true},\n ],\n '@typescript-eslint/return-await': 'off',\n '@typescript-eslint/unbound-method': 'off',\n },\n },\n {\n files: ['app/hooks/**/*', 'app/routes/**/*', 'app/sessions.server/**/*'],\n name: 'typescript/only-throw-error',\n rules: {\n '@typescript-eslint/only-throw-error': 'off',\n },\n },\n {\n files: ['app/utils/**', 'app/services/**', 'app/hooks/**'],\n name: 'typescript/explicit-return-types',\n rules: {\n '@typescript-eslint/explicit-module-boundary-types': 'error',\n },\n },\n {\n files: ['**/*.test.ts?(x)', '**/*.stories.ts?(x)'],\n name: 'typescript/test-files',\n rules: {\n '@typescript-eslint/no-explicit-any': 'off',\n '@typescript-eslint/no-unsafe-assignment': 'off',\n '@typescript-eslint/no-unsafe-member-access': 'off',\n },\n },\n {\n files: ['test/**/*.ts?(x)'],\n name: 'typescript/test-config',\n rules: {\n '@typescript-eslint/no-var-requires': 'off',\n 'no-plusplus': 'off',\n },\n },\n {\n files: ['**/*.d.ts'],\n name: 'typescript/type-definitions',\n rules: {\n '@typescript-eslint/consistent-type-definitions': 'off',\n '@typescript-eslint/method-signature-style': 'error',\n '@typescript-eslint/no-unused-vars': 'off',\n },\n },\n];\n\nconst importXConfig: Linter.Config[] = [\n {\n name: 'import-x-all-files',\n rules: {\n 'import-x/consistent-type-specifier-style': ['error', 'prefer-top-level'],\n 'import-x/extensions': 'off',\n 'import-x/no-anonymous-default-export': [\n 'error',\n {\n allowArray: true,\n allowLiteral: true,\n allowObject: true,\n },\n ],\n 'import-x/no-namespace': 'off',\n 'import-x/no-rename-default': 'off',\n 'import-x/no-useless-path-segments': 'off',\n 'import-x/order': 'off',\n 'import-x/prefer-default-export': 'off',\n },\n },\n {\n files: ['./*.ts'],\n name: 'import-x/root-ts-files',\n rules: {\n 'import-x/no-extraneous-dependencies': 'off',\n 'import-x/no-unresolved': 'error',\n 'import-x/prefer-default-export': 'off',\n },\n },\n {\n files: ['**/*.test.ts?(x)', '**/*.stories.ts?(x)'],\n name: 'import-x/test-files',\n rules: {\n 'import-x/extensions': 'off',\n 'import-x/no-extraneous-dependencies': 'off',\n },\n },\n {\n files: ['app/**/!(*.test|*.stories).ts?(x)'],\n name: 'import-x/app-test-files',\n rules: {\n 'import-x/no-unresolved': 'error',\n },\n },\n {\n files: ['app/**/hooks/*.ts?(x)'],\n name: 'import-x/hooks',\n rules: {\n 'import-x/no-default-export': 'error',\n },\n },\n {\n files: ['test/**/*.ts?(x)'],\n name: 'import-x/test-config-files',\n rules: {\n 'import-x/no-extraneous-dependencies': 'off',\n 'import-x/prefer-default-export': 'off',\n },\n },\n {\n files: ['.storybook/**/*.ts?(x)', '.playwright/**/*.ts?(x)'],\n name: 'import-x/storybook-playwright',\n rules: {\n 'import-x/no-extraneous-dependencies': 'off',\n 'import-x/no-unresolved': 'off',\n },\n },\n];\n\nconst eslintCommentsConfig: Linter.Config[] = [\n {\n name: 'eslint-comments',\n plugins: {\n 'eslint-comments': eslintComments,\n },\n rules: {\n 'eslint-comments/disable-enable-pair': 'off',\n 'eslint-comments/no-unused-disable': 'error',\n },\n },\n];\n\nconst preferArrowFunctionsConfig: Linter.Config[] = [\n {\n name: 'prefer-arrow',\n plugins: {\n 'prefer-arrow-functions': preferArrowFunctions as unknown as ESLint.Plugin,\n },\n rules: {\n 'prefer-arrow-functions/prefer-arrow-functions': 'error',\n },\n },\n {\n // `prefer-arrow-functions` has a hardcoded exemption for named\n // default-exported declarations (`guard.js:hasNameAndIsExportedAsDefaultExport`),\n // so `export default function Foo() {}` slips through. This selector closes\n // that gap. Convert to `const Foo = () => {}; export default Foo;` instead.\n // `.d.ts` is ignored because ambient `export default function …(): T;`\n // declarations have no body to convert.\n ignores: ['**/*.d.ts'],\n name: 'prefer-arrow/no-default-exported-function',\n rules: {\n 'no-restricted-syntax': [\n 'error',\n {\n message:\n 'Use `const Name = () => {}; export default Name;` instead. The prefer-arrow-functions plugin exempts named default-exported declarations upstream.',\n selector: 'ExportDefaultDeclaration > FunctionDeclaration',\n },\n ],\n },\n },\n {\n files: ['**/*.d.ts'],\n name: 'ts-definition-files/prefer-arrow-off',\n rules: {\n 'prefer-arrow-functions/prefer-arrow-functions': 'off',\n },\n },\n];\n\nconst lodashUnderscoreConfig: Linter.Config[] = [\n {\n name: 'you-dont-need-lodash-underscore',\n plugins: {\n 'you-dont-need-lodash-underscore':\n lodashUnderscore as unknown as ESLint.Plugin,\n },\n rules: {\n ...(lodashUnderscore.configs.compatible.rules as Linter.RulesRecord),\n },\n },\n];\n\nexport const base: Linter.Config[] = [\n ...jsConfig,\n ...jsCustomConfig,\n ...typescriptConfig,\n ...tsEslintConfig,\n ...importXConfig,\n ...eslintCommentsConfig,\n ...preferArrowFunctionsConfig,\n ...lodashUnderscoreConfig,\n];\n","import {configs, plugins} from 'eslint-config-airbnb-extended';\nimport type {Linter} from 'eslint';\n\n/**\n * React flat-config block.\n *\n * Ports `reactConfig` + `reactCustomConfig` from GAIA's `eslint.config.mjs`.\n * Pulls React, React Hooks, and JSX A11y plugins plus Airbnb's recommended\n * React config, then layers GAIA's project-wide React rule overrides.\n *\n * The `react-router/routes` override targets `**\\/routes/**\\/*.tsx` — a GAIA\n * convention that's harmless for consumers without that folder structure\n * (the override only fires when files match).\n */\nexport const react: Linter.Config[] = [\n // React plugin\n plugins.react,\n // React hooks plugin\n plugins.reactHooks,\n // React JSX A11y plugin\n plugins.reactA11y,\n // Airbnb React recommended config\n ...configs.react.recommended,\n {\n name: 'react-custom',\n rules: {\n 'jsx-a11y/control-has-associated-label': 'off',\n 'jsx-a11y/no-autofocus': 'off',\n 'react/boolean-prop-naming': [\n 'error',\n {\n propTypeNames: ['bool', 'mutuallyExclusiveTrueProps'],\n rule: '^((can|has|hide|is|show)[A-Z]([A-Za-z0-9]?)+|(checked|disabled|hide|required|show))',\n },\n ],\n 'react/function-component-definition': 'off',\n 'react/jsx-boolean-value': ['error', 'always'],\n 'react/jsx-curly-brace-presence': 'error',\n 'react/jsx-filename-extension': 'off',\n 'react/jsx-fragments': 'error',\n // off by default because it doesn't handle props onXyz function names correctly\n // turn this on from time to time to check for misnamed handlers elsewhere\n 'react/jsx-handler-names': ['off', {checkLocalVariables: true}],\n 'react/jsx-newline': ['error', {prevent: true}],\n 'react/jsx-no-useless-fragment': ['error', {allowExpressions: true}],\n 'react/no-children-prop': 'off',\n 'react/no-danger': 'off',\n 'react/prop-types': 'off',\n 'react/react-in-jsx-scope': 'off',\n 'react/require-default-props': 'off',\n },\n },\n {\n files: ['**/routes/**/*.tsx'],\n name: 'react-router/routes',\n rules: {\n 'no-empty-pattern': 'off',\n 'react/display-name': 'off',\n },\n },\n {\n files: ['**/*.test.ts?(x)', '**/*.stories.ts?(x)'],\n name: 'react/test-files',\n rules: {\n 'react/jsx-props-no-spreading': 'off',\n },\n },\n];\n","import type {Linter} from 'eslint';\nimport canonical from 'eslint-plugin-canonical';\nimport checkFile from 'eslint-plugin-check-file';\nimport perfectionist from 'eslint-plugin-perfectionist';\nimport unicorn from 'eslint-plugin-unicorn';\nimport unusedImports from 'eslint-plugin-unused-imports';\n\nconst canonicalConfig: Linter.Config[] = [\n canonical.configs['flat/recommended'] as Linter.Config,\n {\n name: 'canonical',\n rules: {\n 'canonical/destructuring-property-newline': 'off',\n 'canonical/filename-match-exported': 'error',\n 'canonical/id-match': 'off',\n 'canonical/import-specifier-newline': 'off',\n },\n },\n {\n files: ['**/*.tsx', '**/hooks/*.ts?(x)'],\n name: 'canonical/sort-react-dependencies',\n rules: {\n 'canonical/sort-react-dependencies': 'error',\n },\n },\n {\n files: [\n 'app/root.tsx',\n 'app/entry.server.tsx',\n 'app/**/tests/*',\n 'test/**/*.ts?(x)',\n '**/*.stories.tsx',\n '**/routes/**/*.tsx',\n '**/hooks/*.ts?(x)',\n '.storybook/**/*.ts?(x)',\n '.playwright/**/*.ts?(x)',\n ],\n name: 'canonical/filename-match-exported-disabled',\n rules: {\n 'canonical/filename-match-exported': 'off',\n },\n },\n];\n\nconst perfectionistConfig: Linter.Config[] = [\n perfectionist.configs['recommended-natural'] as Linter.Config,\n {\n name: 'perfectionist',\n rules: {\n 'perfectionist/sort-imports': [\n 'error',\n {\n customGroups: [\n {\n elementNamePattern: '^react$',\n groupName: 'react-type',\n selector: 'type',\n },\n {\n elementNamePattern: '^react$',\n groupName: 'react',\n },\n {\n elementNamePattern: '^react-.+',\n groupName: 'react-other-type',\n selector: 'type',\n },\n {\n elementNamePattern: '^react-.+',\n groupName: 'react-other',\n },\n ],\n groups: [\n 'react-type',\n 'react',\n 'react-other-type',\n 'react-other',\n ['type-external', 'external'],\n ['type-builtin', 'builtin'],\n ['type-internal', 'internal'],\n ['type-parent', 'parent'],\n ['type-sibling', 'sibling'],\n ['type-index', 'index'],\n 'unknown',\n 'style',\n 'side-effect',\n 'side-effect-style',\n ],\n newlinesBetween: 0,\n type: 'natural',\n },\n ],\n 'perfectionist/sort-jsx-props': [\n 'error',\n {\n customGroups: [\n {\n elementNamePattern: ['^key$', '^ref$'],\n groupName: 'reserved',\n },\n ],\n groups: ['reserved'],\n type: 'natural',\n },\n ],\n },\n },\n];\n\nconst unicornConfig: Linter.Config[] = [\n unicorn.configs.recommended as Linter.Config,\n {\n name: 'unicorn',\n rules: {\n 'unicorn/consistent-destructuring': 'error',\n 'unicorn/consistent-template-literal-escape': 'off',\n 'unicorn/filename-case': 'off',\n 'unicorn/new-for-builtins': 'off',\n 'unicorn/no-array-callback-reference': 'off',\n 'unicorn/no-array-for-each': 'off',\n 'unicorn/no-array-reduce': 'off',\n 'unicorn/no-nested-ternary': 'off',\n 'unicorn/no-null': 'off',\n 'unicorn/no-useless-undefined': 'off',\n 'unicorn/prefer-export-from': 'off',\n 'unicorn/prefer-global-this': 'off',\n 'unicorn/prefer-set-has': 'off',\n 'unicorn/prefer-switch': 'off',\n 'unicorn/prefer-ternary': 'off',\n 'unicorn/prevent-abbreviations': [\n 'error',\n {\n ignore: [\n 'acc',\n 'ctx',\n 'e2e',\n 'env',\n 'obj',\n 'prev',\n 'req',\n 'res',\n /args/i,\n /fn/i,\n /param/i,\n /params/i,\n /props/i,\n /ref/i,\n /src/i,\n /utils/i,\n ],\n },\n ],\n 'unicorn/text-encoding-identifier-case': 'off',\n },\n },\n {\n files: ['./*.ts'],\n name: 'unicorn/root-ts-files',\n rules: {\n 'unicorn/prefer-module': 'off',\n 'unicorn/prevent-abbreviations': 'off',\n },\n },\n];\n\nconst unusedImportsConfig: Linter.Config[] = [\n {\n name: 'unused-imports',\n plugins: {\n 'unused-imports': unusedImports,\n },\n rules: {\n '@typescript-eslint/no-unused-vars': 'off',\n 'no-unused-vars': 'off',\n 'sonarjs/no-unused-vars': 'off',\n 'sonarjs/unused-import': 'off',\n 'unused-imports/no-unused-imports': 'error',\n 'unused-imports/no-unused-vars': [\n 'error',\n {\n args: 'after-used',\n argsIgnorePattern: '^_',\n ignoreRestSiblings: true,\n vars: 'all',\n varsIgnorePattern: '^_',\n },\n ],\n },\n },\n {\n files: ['**/*.d.ts'],\n name: 'unused-imports/ts-definition-files',\n rules: {\n 'unused-imports/no-unused-vars': 'off',\n },\n },\n];\n\nconst checkFileConfig: Linter.Config[] = [\n {\n plugins: {\n 'check-file': checkFile,\n },\n },\n {\n files: ['app/**/*'],\n name: 'check-file',\n rules: {\n 'check-file/filename-naming-convention': [\n 'error',\n {\n // React hook files must be camelCase (to match the hook name)\n '**/hooks/*.{ts,tsx}': 'CAMEL_CASE',\n 'app/state/*.tsx': 'KEBAB_CASE',\n // React component files must be named index.tsx\n 'app/{components,pages}/**/!(assets|hooks|state|tests|utils)/*.tsx':\n 'index+()',\n // Generally, non-component files must be named kebab-case\n 'app/{components,pages}/**/!(hooks)/*.ts': 'KEBAB_CASE',\n // Non-component files inside specific components folders must be kebab-case\n 'app/{components,pages}/**/(assets|state|tests|utils)/*.{ts,tsx}':\n 'KEBAB_CASE',\n 'test/**/*.ts?(x)': 'KEBAB_CASE',\n },\n {\n ignoreMiddleExtensions: true,\n },\n ],\n 'check-file/folder-match-with-fex': [\n 'error',\n {\n // require stories and test files to be inside tests folders\n '*.(stories|test).{ts,tsx}': 'app/**/tests/',\n },\n ],\n 'check-file/folder-naming-convention': [\n 'error',\n {\n // enforce PascalCase component folders, and allow assets, hooks, tests, and utils subfolders\n 'app/components/**/':\n '(assets|hooks|state|tests|utils|[A-Z][a-zA-Z0-9]*)',\n },\n ],\n },\n },\n {\n files: ['test/**/*.*'],\n name: 'check-file/test-files',\n rules: {\n 'check-file/filename-naming-convention': [\n 'error',\n {\n 'test/**/*.ts?(x)': 'KEBAB_CASE',\n },\n {\n ignoreMiddleExtensions: true,\n },\n ],\n },\n },\n];\n\nexport const styleHygiene: Linter.Config[] = [\n ...canonicalConfig,\n ...perfectionistConfig,\n ...unicornConfig,\n ...unusedImportsConfig,\n ...checkFileConfig,\n];\n","import type {Linter} from 'eslint';\nimport noRelativeImportPaths from 'eslint-plugin-no-relative-import-paths';\nimport sonarjs from 'eslint-plugin-sonarjs';\nimport noEnumPlugin from '../plugins/no-enum.js';\nimport noSwitchPlugin from '../plugins/no-switch.js';\n\nconst sonarConfig: Linter.Config[] = [\n sonarjs.configs!.recommended as Linter.Config,\n {\n name: 'sonarjs',\n rules: {\n 'sonarjs/cognitive-complexity': 'error',\n 'sonarjs/fixme-tag': 'off',\n 'sonarjs/no-commented-code': 'off',\n 'sonarjs/no-nested-conditional': 'off',\n 'sonarjs/no-nested-functions': 'off',\n 'sonarjs/no-selector-parameter': 'off',\n 'sonarjs/regex-complexity': 'off',\n 'sonarjs/todo-tag': 'off',\n },\n },\n {\n files: ['**/*.tsx', '**/hooks/*.ts?(x)'],\n name: 'sonarjs/react-files',\n rules: {\n 'sonarjs/cognitive-complexity': 'off',\n 'sonarjs/function-return-type': 'off',\n },\n },\n {\n files: ['**/*.test.ts?(x)', '**/*.stories.ts?(x)'],\n name: 'sonarjs/test-files',\n rules: {\n 'sonarjs/no-duplicate-string': 'off',\n 'sonarjs/no-identical-functions': 'off',\n },\n },\n {\n files: ['app/languages/**/*.ts', 'eslint.config.mjs'],\n name: 'sonarjs/credential-checks',\n rules: {\n 'sonarjs/no-hardcoded-credentials': 'off',\n 'sonarjs/no-hardcoded-passwords': 'off',\n },\n },\n];\n\nconst noEnumConfig: Linter.Config[] = [\n {\n files: ['**/*.ts?(x)'],\n name: 'no-enum',\n plugins: {'no-enum': noEnumPlugin},\n rules: {\n 'no-enum/no-enum': 'error',\n },\n },\n];\n\nconst noSwitchConfig: Linter.Config[] = [\n {\n files: ['**/*.ts?(x)', '**/*.js?(x)'],\n name: 'no-switch',\n plugins: {'no-switch': noSwitchPlugin},\n rules: {'no-switch/no-switch': 'error'},\n },\n];\n\nconst noRelativeImportPathsConfig: Linter.Config[] = [\n {\n name: 'no-relative-import-paths',\n plugins: {\n 'no-relative-import-paths': noRelativeImportPaths,\n },\n rules: {\n 'no-relative-import-paths/no-relative-import-paths': [\n 'error',\n {\n allowedDepth: 2,\n allowSameFolder: true,\n prefix: '~',\n rootDir: 'app',\n },\n ],\n },\n },\n];\n\nexport const guardrails: Linter.Config[] = [\n ...sonarConfig,\n ...noEnumConfig,\n ...noSwitchConfig,\n ...noRelativeImportPathsConfig,\n];\n","import type {ESLint, Rule} from 'eslint';\n\nconst noEnumRule: Rule.RuleModule = {\n create: (context) => ({\n TSEnumDeclaration: (node: Rule.Node) => {\n context.report({messageId: 'noEnum', node});\n },\n }),\n meta: {\n docs: {description: 'Disallow TypeScript enums'},\n messages: {\n noEnum:\n 'Do not use TypeScript enums. Use an object with `as const` instead.',\n },\n schema: [],\n type: 'problem',\n },\n};\n\nconst plugin: ESLint.Plugin = {\n meta: {\n name: 'no-enum',\n version: '0.1.0',\n },\n rules: {\n 'no-enum': noEnumRule,\n },\n};\n\nexport default plugin;\n","import type {ESLint, Rule} from 'eslint';\n\nconst noSwitchRule: Rule.RuleModule = {\n create: (context) => ({\n SwitchStatement: (node: Rule.Node) => {\n context.report({messageId: 'noSwitch', node});\n },\n }),\n meta: {\n docs: {description: 'Disallow switch statements'},\n messages: {\n noSwitch:\n 'Do not use switch statements. Use an object map or if/else instead.',\n },\n schema: [],\n type: 'problem',\n },\n};\n\nconst plugin: ESLint.Plugin = {\n meta: {\n name: 'no-switch',\n version: '0.1.0',\n },\n rules: {\n 'no-switch': noSwitchRule,\n },\n};\n\nexport default plugin;\n","import vitest from '@vitest/eslint-plugin';\nimport jestDom from 'eslint-plugin-jest-dom';\nimport testingLibrary from 'eslint-plugin-testing-library';\nimport type {Linter} from 'eslint';\n\n/**\n * Testing flat-config block.\n *\n * Ports `testHarnessConfig` + `testingLibraryConfig` from GAIA's\n * `eslint.config.mjs`. Wires up Vitest, jest-dom, and Testing Library\n * recommended rules across test/story/test-harness files.\n */\nexport const testing: Linter.Config[] = [\n {\n files: [\n '**/*.test.ts?(x)',\n '**/*.stories.ts?(x)',\n 'test/**/*.ts?(x)',\n ],\n name: 'vitest',\n plugins: {\n 'jest-dom': jestDom,\n vitest,\n },\n rules: {\n ...jestDom.configs['flat/recommended'].rules,\n ...vitest.configs.recommended.rules,\n 'import-x/no-useless-path-segments': [\n 'error',\n {noUselessIndex: true},\n ],\n 'vitest/expect-expect': [\n 'error',\n {assertFunctionNames: ['expect', 'expect*']},\n ],\n },\n },\n {\n ...testingLibrary.configs['flat/react'],\n files: ['**/*.test.ts?(x)'],\n name: 'testing-library',\n },\n];\n","import storybookPlugin from 'eslint-plugin-storybook';\nimport type {Linter} from 'eslint';\n\n/**\n * Storybook flat-config block.\n *\n * Ports `storybookConfig` from GAIA's `eslint.config.mjs` — applies the\n * official `flat/recommended` config from `eslint-plugin-storybook`.\n */\nexport const storybook: Linter.Config[] = [\n ...(storybookPlugin.configs['flat/recommended'] as Linter.Config[]),\n];\n","import playwrightPlugin from 'eslint-plugin-playwright';\nimport type {Linter} from 'eslint';\n\n/**\n * Playwright flat-config block.\n *\n * Ports `playwrightConfig` from GAIA's `eslint.config.mjs` — scopes\n * `eslint-plugin-playwright`'s `flat/recommended` config to `.playwright/`\n * test files (GAIA's e2e directory convention).\n */\nexport const playwright: Linter.Config[] = [\n {\n name: 'playwright',\n ...(playwrightPlugin.configs['flat/recommended'] as Linter.Config),\n files: ['.playwright/**/*.ts?(x)'],\n rules: {\n ...playwrightPlugin.configs['flat/recommended'].rules,\n 'playwright/expect-expect': [\n 'warn',\n {assertFunctionPatterns: ['^expect[A-Z]']},\n ],\n },\n },\n];\n","import {rules as prettierConfigRules} from 'eslint-config-prettier';\nimport prettierPlugin from 'eslint-plugin-prettier';\nimport type {Linter} from 'eslint';\n\n/**\n * Prettier flat-config block.\n *\n * Ports `prettierConfig` from GAIA's `eslint.config.mjs`. Layers\n * `eslint-config-prettier`'s rule disablers, then re-enables a few\n * `@stylistic/*` rules GAIA wants to keep (padding lines, single quotes),\n * and finally turns on the `prettier/prettier` rule itself.\n */\nexport const prettier: Linter.Config[] = [\n {\n name: 'prettier/plugin/config',\n plugins: {prettier: prettierPlugin},\n },\n {\n name: 'prettier/config',\n rules: {\n ...prettierConfigRules,\n '@stylistic/padding-line-between-statements': [\n 'error',\n {\n blankLine: 'always',\n next: ['block-like', 'export', 'return', 'throw'],\n prev: '*',\n },\n ],\n '@stylistic/quotes': [\n 'error',\n 'single',\n {\n allowTemplateLiterals: 'avoidEscape',\n avoidEscape: true,\n },\n ],\n '@stylistic/spaced-comment': 'off',\n 'prettier/prettier': ['error', {endOfLine: 'auto'}],\n },\n },\n];\n","import betterTailwindPlugin from 'eslint-plugin-better-tailwindcss';\nimport type {Linter} from 'eslint';\n\nexport type GaiaLintBetterTailwindOptions = {\n /** Path to the Tailwind entry CSS file (e.g. './app/styles/tailwind.css'). */\n entryPoint: string;\n /** Class names to ignore in `better-tailwindcss/no-unknown-classes`. */\n ignore?: string[];\n};\n\n/**\n * Better-Tailwind flat-config factory.\n *\n * Ports `betterTailwindConfig` from GAIA's `eslint.config.mjs`. The\n * `entryPoint` (consumer's Tailwind CSS entry) and `ignore` list are\n * project-specific, so this is shipped as a factory rather than a static\n * array.\n */\nexport const betterTailwind = (\n opts: GaiaLintBetterTailwindOptions,\n): Linter.Config[] => [\n {\n name: 'better-tailwindcss',\n plugins: {\n 'better-tailwindcss': betterTailwindPlugin,\n },\n rules: {\n 'better-tailwindcss/enforce-canonical-classes': 'error',\n 'better-tailwindcss/enforce-consistent-important-position': 'error',\n 'better-tailwindcss/enforce-consistent-variable-syntax': 'error',\n 'better-tailwindcss/enforce-shorthand-classes': 'error',\n 'better-tailwindcss/no-conflicting-classes': 'error',\n 'better-tailwindcss/no-deprecated-classes': 'error',\n 'better-tailwindcss/no-unknown-classes': [\n 'error',\n {ignore: opts.ignore ?? []},\n ],\n },\n settings: {\n 'better-tailwindcss': {\n detectComponentClasses: true,\n entryPoint: opts.entryPoint,\n },\n },\n },\n];\n","import {includeIgnoreFile} from '@eslint/compat';\nimport path from 'node:path';\nimport type {Linter} from 'eslint';\n\nexport type GaiaLintIgnoresOptions = {\n /** Path to a `.gitignore` file to merge in. Resolved from `process.cwd()` if relative. */\n gitignore?: string;\n /** Extra ignore globs to merge with GAIA defaults. */\n extra?: string[];\n};\n\n/**\n * GAIA's default ignore globs — matches the static `ignored-files` block in\n * GAIA's `eslint.config.mjs`. Consumer's `extra` ignores get concatenated\n * onto this list.\n */\nconst defaultIgnores = [\n '.storybook',\n '.playwright',\n '/.react-router/**',\n '.claude/**/*.js',\n '.claude/**/*.cjs',\n 'scripts',\n 'public/**',\n '**/*.css',\n '**/*.svg',\n '**/*.md',\n];\n\n/**\n * Ignores flat-config factory.\n *\n * Ports the `includeIgnoreFile(gitignorePath)` + static `ignored-files`\n * block from GAIA's `eslint.config.mjs`. The `gitignore` path must be\n * resolved at the consumer's cwd (config-load time), not at gaia-lint's\n * install location, so this is shipped as a factory.\n */\nexport const ignores = (opts?: GaiaLintIgnoresOptions): Linter.Config[] => {\n const out: Linter.Config[] = [];\n\n if (opts?.gitignore) {\n const resolved = path.isAbsolute(opts.gitignore)\n ? opts.gitignore\n : path.resolve(process.cwd(), opts.gitignore);\n out.push(includeIgnoreFile(resolved) as Linter.Config);\n }\n\n out.push({\n ignores: [...defaultIgnores, ...(opts?.extra ?? [])],\n name: 'ignored-files',\n });\n\n return out;\n};\n","export {base} from './configs/base.js';\nexport {react} from './configs/react.js';\nexport {styleHygiene} from './configs/style-hygiene.js';\nexport {guardrails} from './configs/guardrails.js';\nexport {testing} from './configs/testing.js';\nexport {storybook} from './configs/storybook.js';\nexport {playwright} from './configs/playwright.js';\nexport {prettier} from './configs/prettier.js';\nexport {\n betterTailwind,\n type GaiaLintBetterTailwindOptions,\n} from './configs/better-tailwind.js';\nexport {\n ignores,\n type GaiaLintIgnoresOptions,\n} from './configs/ignores.js';\n\nimport {base} from './configs/base.js';\nimport {react} from './configs/react.js';\nimport {styleHygiene} from './configs/style-hygiene.js';\nimport {guardrails} from './configs/guardrails.js';\nimport {testing} from './configs/testing.js';\nimport {storybook} from './configs/storybook.js';\nimport {playwright} from './configs/playwright.js';\nimport {prettier} from './configs/prettier.js';\nimport {betterTailwind} from './configs/better-tailwind.js';\nimport {ignores} from './configs/ignores.js';\n\nconst gaiaLint: {\n base: typeof base;\n react: typeof react;\n styleHygiene: typeof styleHygiene;\n guardrails: typeof guardrails;\n testing: typeof testing;\n storybook: typeof storybook;\n playwright: typeof playwright;\n prettier: typeof prettier;\n betterTailwind: typeof betterTailwind;\n ignores: typeof ignores;\n} = {\n base,\n react,\n styleHygiene,\n guardrails,\n testing,\n storybook,\n playwright,\n prettier,\n betterTailwind,\n ignores,\n};\n\nexport default gaiaLint;\n"],"mappings":"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","names":["configs","plugins","plugin"]}
|
|
1
|
+
{"version":3,"sources":["../src/configs/base.ts","../src/configs/react.ts","../src/configs/style-hygiene.ts","../src/configs/guardrails.ts","../src/plugins/no-enum.ts","../src/plugins/no-jsx-iife.ts","../src/plugins/no-switch.ts","../src/configs/testing.ts","../src/configs/storybook.ts","../src/configs/playwright.ts","../src/configs/prettier.ts","../src/configs/better-tailwind.ts","../src/configs/ignores.ts","../src/index.ts"],"sourcesContent":["import eslintComments from '@eslint-community/eslint-plugin-eslint-comments';\nimport js from '@eslint/js';\nimport {configs, plugins, rules} from 'eslint-config-airbnb-extended';\nimport preferArrowFunctions from 'eslint-plugin-prefer-arrow-functions';\nimport lodashUnderscore from 'eslint-plugin-you-dont-need-lodash-underscore';\nimport type {ESLint, Linter} from 'eslint';\n\nconst jsConfig: Linter.Config[] = [\n // ESLint recommended config\n {\n name: 'js/config',\n ...js.configs.recommended,\n },\n // Stylistic plugin\n plugins.stylistic,\n // Import X plugin\n plugins.importX,\n // Airbnb base recommended config\n ...configs.base.recommended,\n // Strict import rules\n rules.base.importsStrict,\n];\n\nconst jsCustomConfig: Linter.Config[] = [\n {\n name: 'js-custom',\n rules: {\n 'consistent-return': 'off',\n curly: ['error', 'all'],\n 'max-params': 'error',\n 'no-param-reassign': 'off', // handled by sonarjs\n 'no-undef': 'off',\n 'no-unused-vars': 'off', // handled by sonarjs\n },\n },\n {\n files: ['**/*.test.ts?(x)', '**/*.stories.ts?(x)'],\n name: 'test-files/all',\n rules: {\n 'guard-for-in': 'off',\n 'max-params': 'off',\n 'no-await-in-loop': 'off',\n 'no-plusplus': 'off',\n 'no-restricted-syntax': 'off',\n },\n },\n {\n files: ['.playwright/**/*.ts?(x)'],\n name: 'playwright/all',\n rules: {\n 'no-await-in-loop': 'off',\n 'no-restricted-syntax': 'off',\n },\n },\n];\n\nconst typescriptConfig: Linter.Config[] = [\n // TypeScript ESLint plugin\n plugins.typescriptEslint,\n // Airbnb base TypeScript config\n ...configs.base.typescript,\n // Strict TypeScript rules\n rules.typescript.typescriptEslintStrict,\n rules.typescript.stylistic,\n // Airbnb React TypeScript config\n ...configs.react.typescript,\n {\n files: ['./*.ts'],\n name: 'root-ts-files',\n rules: {\n 'global-require': 'off',\n 'no-void': 'off',\n },\n },\n {\n files: ['**/*.ts?(x)'],\n name: 'no-void',\n rules: {\n 'no-void': ['error', {allowAsStatement: true}],\n },\n },\n];\n\nconst tsEslintConfig: Linter.Config[] = [\n {\n files: ['**/*.ts?(x)'],\n name: 'typescript/config',\n rules: {\n '@typescript-eslint/array-type': ['error', {default: 'array'}],\n '@typescript-eslint/ban-ts-comment': 'off',\n '@typescript-eslint/consistent-type-definitions': ['error', 'type'],\n '@typescript-eslint/consistent-type-imports': 'error',\n '@typescript-eslint/explicit-module-boundary-types': 'off',\n '@typescript-eslint/method-signature-style': 'error',\n '@typescript-eslint/no-confusing-void-expression': [\n 'error',\n {ignoreArrowShorthand: true},\n ],\n '@typescript-eslint/no-floating-promises': [\n 'error',\n {ignoreIIFE: true, ignoreVoid: true},\n ],\n '@typescript-eslint/no-misused-promises': [\n 'error',\n {checksVoidReturn: false},\n ],\n '@typescript-eslint/no-non-null-assertion': 'off',\n '@typescript-eslint/no-throw-literal': 'off',\n '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'error',\n '@typescript-eslint/no-unnecessary-condition': 'error',\n '@typescript-eslint/no-unnecessary-type-parameters': 'off',\n '@typescript-eslint/no-unsafe-assignment': 'error',\n '@typescript-eslint/no-unsafe-return': 'error',\n '@typescript-eslint/only-throw-error': 'off',\n '@typescript-eslint/prefer-nullish-coalescing': 'error',\n '@typescript-eslint/prefer-promise-reject-errors': 'off',\n '@typescript-eslint/restrict-template-expressions': [\n 'error',\n {allowBoolean: true, allowNumber: true},\n ],\n '@typescript-eslint/return-await': 'off',\n '@typescript-eslint/unbound-method': 'off',\n },\n },\n {\n files: ['app/hooks/**/*', 'app/routes/**/*', 'app/sessions.server/**/*'],\n name: 'typescript/only-throw-error',\n rules: {\n '@typescript-eslint/only-throw-error': 'off',\n },\n },\n {\n files: ['app/utils/**', 'app/services/**', 'app/hooks/**'],\n name: 'typescript/explicit-return-types',\n rules: {\n '@typescript-eslint/explicit-module-boundary-types': 'error',\n },\n },\n {\n files: ['**/*.test.ts?(x)', '**/*.stories.ts?(x)'],\n name: 'typescript/test-files',\n rules: {\n '@typescript-eslint/no-explicit-any': 'off',\n '@typescript-eslint/no-unsafe-assignment': 'off',\n '@typescript-eslint/no-unsafe-member-access': 'off',\n },\n },\n {\n files: ['test/**/*.ts?(x)'],\n name: 'typescript/test-config',\n rules: {\n '@typescript-eslint/no-var-requires': 'off',\n 'no-plusplus': 'off',\n },\n },\n {\n files: ['**/*.d.ts'],\n name: 'typescript/type-definitions',\n rules: {\n '@typescript-eslint/consistent-type-definitions': 'off',\n '@typescript-eslint/method-signature-style': 'error',\n '@typescript-eslint/no-unused-vars': 'off',\n },\n },\n];\n\nconst importXConfig: Linter.Config[] = [\n {\n name: 'import-x-all-files',\n rules: {\n 'import-x/consistent-type-specifier-style': ['error', 'prefer-top-level'],\n 'import-x/extensions': 'off',\n 'import-x/no-anonymous-default-export': [\n 'error',\n {\n allowArray: true,\n allowLiteral: true,\n allowObject: true,\n },\n ],\n 'import-x/no-namespace': 'off',\n 'import-x/no-rename-default': 'off',\n 'import-x/no-useless-path-segments': 'off',\n 'import-x/order': 'off',\n 'import-x/prefer-default-export': 'off',\n },\n },\n {\n files: ['./*.ts'],\n name: 'import-x/root-ts-files',\n rules: {\n 'import-x/no-extraneous-dependencies': 'off',\n 'import-x/no-unresolved': 'error',\n 'import-x/prefer-default-export': 'off',\n },\n },\n {\n files: ['**/*.test.ts?(x)', '**/*.stories.ts?(x)'],\n name: 'import-x/test-files',\n rules: {\n 'import-x/extensions': 'off',\n 'import-x/no-extraneous-dependencies': 'off',\n },\n },\n {\n files: ['app/**/!(*.test|*.stories).ts?(x)'],\n name: 'import-x/app-test-files',\n rules: {\n 'import-x/no-unresolved': 'error',\n },\n },\n {\n files: ['app/**/hooks/*.ts?(x)'],\n name: 'import-x/hooks',\n rules: {\n 'import-x/no-default-export': 'error',\n },\n },\n {\n files: ['test/**/*.ts?(x)'],\n name: 'import-x/test-config-files',\n rules: {\n 'import-x/no-extraneous-dependencies': 'off',\n 'import-x/prefer-default-export': 'off',\n },\n },\n {\n files: ['.storybook/**/*.ts?(x)', '.playwright/**/*.ts?(x)'],\n name: 'import-x/storybook-playwright',\n rules: {\n 'import-x/no-extraneous-dependencies': 'off',\n 'import-x/no-unresolved': 'off',\n },\n },\n];\n\nconst eslintCommentsConfig: Linter.Config[] = [\n {\n name: 'eslint-comments',\n plugins: {\n 'eslint-comments': eslintComments,\n },\n rules: {\n 'eslint-comments/disable-enable-pair': 'off',\n 'eslint-comments/no-unused-disable': 'error',\n },\n },\n];\n\nconst preferArrowFunctionsConfig: Linter.Config[] = [\n {\n name: 'prefer-arrow',\n plugins: {\n 'prefer-arrow-functions': preferArrowFunctions as unknown as ESLint.Plugin,\n },\n rules: {\n 'prefer-arrow-functions/prefer-arrow-functions': 'error',\n },\n },\n {\n // `prefer-arrow-functions` has a hardcoded exemption for named\n // default-exported declarations (`guard.js:hasNameAndIsExportedAsDefaultExport`),\n // so `export default function Foo() {}` slips through. This selector closes\n // that gap. Convert to `const Foo = () => {}; export default Foo;` instead.\n // `.d.ts` is ignored because ambient `export default function …(): T;`\n // declarations have no body to convert.\n ignores: ['**/*.d.ts'],\n name: 'prefer-arrow/no-default-exported-function',\n rules: {\n 'no-restricted-syntax': [\n 'error',\n {\n message:\n 'Use `const Name = () => {}; export default Name;` instead. The prefer-arrow-functions plugin exempts named default-exported declarations upstream.',\n selector: 'ExportDefaultDeclaration > FunctionDeclaration',\n },\n ],\n },\n },\n {\n files: ['**/*.d.ts'],\n name: 'ts-definition-files/prefer-arrow-off',\n rules: {\n 'prefer-arrow-functions/prefer-arrow-functions': 'off',\n },\n },\n];\n\nconst lodashUnderscoreConfig: Linter.Config[] = [\n {\n name: 'you-dont-need-lodash-underscore',\n plugins: {\n 'you-dont-need-lodash-underscore':\n lodashUnderscore as unknown as ESLint.Plugin,\n },\n rules: {\n ...(lodashUnderscore.configs.compatible.rules as Linter.RulesRecord),\n },\n },\n];\n\nexport const base: Linter.Config[] = [\n ...jsConfig,\n ...jsCustomConfig,\n ...typescriptConfig,\n ...tsEslintConfig,\n ...importXConfig,\n ...eslintCommentsConfig,\n ...preferArrowFunctionsConfig,\n ...lodashUnderscoreConfig,\n];\n","import {configs, plugins} from 'eslint-config-airbnb-extended';\nimport type {Linter} from 'eslint';\n\n/**\n * React flat-config block.\n *\n * Ports `reactConfig` + `reactCustomConfig` from GAIA's `eslint.config.mjs`.\n * Pulls React, React Hooks, and JSX A11y plugins plus Airbnb's recommended\n * React config, then layers GAIA's project-wide React rule overrides.\n *\n * The `react-router/routes` override targets `**\\/routes/**\\/*.tsx` — a GAIA\n * convention that's harmless for consumers without that folder structure\n * (the override only fires when files match).\n */\nexport const react: Linter.Config[] = [\n // React plugin\n plugins.react,\n // React hooks plugin\n plugins.reactHooks,\n // React JSX A11y plugin\n plugins.reactA11y,\n // Airbnb React recommended config\n ...configs.react.recommended,\n {\n name: 'react-custom',\n rules: {\n 'jsx-a11y/control-has-associated-label': 'off',\n 'jsx-a11y/no-autofocus': 'off',\n 'react/boolean-prop-naming': [\n 'error',\n {\n propTypeNames: ['bool', 'mutuallyExclusiveTrueProps'],\n rule: '^((can|has|hide|is|show)[A-Z]([A-Za-z0-9]?)+|(checked|disabled|hide|required|show))',\n },\n ],\n 'react/function-component-definition': 'off',\n 'react/jsx-boolean-value': ['error', 'always'],\n 'react/jsx-curly-brace-presence': 'error',\n 'react/jsx-filename-extension': 'off',\n 'react/jsx-fragments': 'error',\n // off by default because it doesn't handle props onXyz function names correctly\n // turn this on from time to time to check for misnamed handlers elsewhere\n 'react/jsx-handler-names': ['off', {checkLocalVariables: true}],\n 'react/jsx-newline': ['error', {prevent: true}],\n 'react/jsx-no-useless-fragment': ['error', {allowExpressions: true}],\n 'react/no-children-prop': 'off',\n 'react/no-danger': 'off',\n 'react/prop-types': 'off',\n 'react/react-in-jsx-scope': 'off',\n 'react/require-default-props': 'off',\n },\n },\n {\n files: ['**/routes/**/*.tsx'],\n name: 'react-router/routes',\n rules: {\n 'no-empty-pattern': 'off',\n 'react/display-name': 'off',\n },\n },\n {\n files: ['**/*.test.ts?(x)', '**/*.stories.ts?(x)'],\n name: 'react/test-files',\n rules: {\n 'react/jsx-props-no-spreading': 'off',\n },\n },\n];\n","import type {Linter} from 'eslint';\nimport canonical from 'eslint-plugin-canonical';\nimport checkFile from 'eslint-plugin-check-file';\nimport perfectionist from 'eslint-plugin-perfectionist';\nimport unicorn from 'eslint-plugin-unicorn';\nimport unusedImports from 'eslint-plugin-unused-imports';\n\nconst canonicalConfig: Linter.Config[] = [\n canonical.configs['flat/recommended'] as Linter.Config,\n {\n name: 'canonical',\n rules: {\n 'canonical/destructuring-property-newline': 'off',\n 'canonical/filename-match-exported': 'error',\n 'canonical/id-match': 'off',\n 'canonical/import-specifier-newline': 'off',\n },\n },\n {\n files: ['**/*.tsx', '**/hooks/*.ts?(x)'],\n name: 'canonical/sort-react-dependencies',\n rules: {\n 'canonical/sort-react-dependencies': 'error',\n },\n },\n {\n files: [\n 'app/root.tsx',\n 'app/entry.server.tsx',\n 'app/**/tests/*',\n 'test/**/*.ts?(x)',\n '**/*.stories.tsx',\n '**/routes/**/*.tsx',\n '**/hooks/*.ts?(x)',\n '.storybook/**/*.ts?(x)',\n '.playwright/**/*.ts?(x)',\n ],\n name: 'canonical/filename-match-exported-disabled',\n rules: {\n 'canonical/filename-match-exported': 'off',\n },\n },\n];\n\nconst perfectionistConfig: Linter.Config[] = [\n perfectionist.configs['recommended-natural'] as Linter.Config,\n {\n name: 'perfectionist',\n rules: {\n 'perfectionist/sort-imports': [\n 'error',\n {\n customGroups: [\n {\n elementNamePattern: '^react$',\n groupName: 'react-type',\n selector: 'type',\n },\n {\n elementNamePattern: '^react$',\n groupName: 'react',\n },\n {\n elementNamePattern: '^react-.+',\n groupName: 'react-other-type',\n selector: 'type',\n },\n {\n elementNamePattern: '^react-.+',\n groupName: 'react-other',\n },\n ],\n groups: [\n 'react-type',\n 'react',\n 'react-other-type',\n 'react-other',\n ['type-external', 'external'],\n ['type-builtin', 'builtin'],\n ['type-internal', 'internal'],\n ['type-parent', 'parent'],\n ['type-sibling', 'sibling'],\n ['type-index', 'index'],\n 'unknown',\n 'style',\n 'side-effect',\n 'side-effect-style',\n ],\n newlinesBetween: 0,\n type: 'natural',\n },\n ],\n 'perfectionist/sort-jsx-props': [\n 'error',\n {\n customGroups: [\n {\n elementNamePattern: ['^key$', '^ref$'],\n groupName: 'reserved',\n },\n ],\n groups: ['reserved'],\n type: 'natural',\n },\n ],\n },\n },\n];\n\nconst unicornConfig: Linter.Config[] = [\n unicorn.configs.recommended as Linter.Config,\n {\n name: 'unicorn',\n rules: {\n 'unicorn/consistent-destructuring': 'error',\n 'unicorn/consistent-template-literal-escape': 'off',\n 'unicorn/filename-case': 'off',\n 'unicorn/new-for-builtins': 'off',\n 'unicorn/no-array-callback-reference': 'off',\n 'unicorn/no-array-for-each': 'off',\n 'unicorn/no-array-reduce': 'off',\n 'unicorn/no-nested-ternary': 'off',\n 'unicorn/no-null': 'off',\n 'unicorn/no-useless-undefined': 'off',\n 'unicorn/prefer-export-from': 'off',\n 'unicorn/prefer-global-this': 'off',\n 'unicorn/prefer-set-has': 'off',\n 'unicorn/prefer-switch': 'off',\n 'unicorn/prefer-ternary': 'off',\n 'unicorn/prevent-abbreviations': [\n 'error',\n {\n ignore: [\n 'acc',\n 'ctx',\n 'e2e',\n 'env',\n 'obj',\n 'prev',\n 'req',\n 'res',\n /args/i,\n /fn/i,\n /param/i,\n /params/i,\n /props/i,\n /ref/i,\n /src/i,\n /utils/i,\n ],\n },\n ],\n 'unicorn/text-encoding-identifier-case': 'off',\n },\n },\n {\n files: ['./*.ts'],\n name: 'unicorn/root-ts-files',\n rules: {\n 'unicorn/prefer-module': 'off',\n 'unicorn/prevent-abbreviations': 'off',\n },\n },\n];\n\nconst unusedImportsConfig: Linter.Config[] = [\n {\n name: 'unused-imports',\n plugins: {\n 'unused-imports': unusedImports,\n },\n rules: {\n '@typescript-eslint/no-unused-vars': 'off',\n 'no-unused-vars': 'off',\n 'sonarjs/no-unused-vars': 'off',\n 'sonarjs/unused-import': 'off',\n 'unused-imports/no-unused-imports': 'error',\n 'unused-imports/no-unused-vars': [\n 'error',\n {\n args: 'after-used',\n argsIgnorePattern: '^_',\n ignoreRestSiblings: true,\n vars: 'all',\n varsIgnorePattern: '^_',\n },\n ],\n },\n },\n {\n files: ['**/*.d.ts'],\n name: 'unused-imports/ts-definition-files',\n rules: {\n 'unused-imports/no-unused-vars': 'off',\n },\n },\n];\n\nconst checkFileConfig: Linter.Config[] = [\n {\n plugins: {\n 'check-file': checkFile,\n },\n },\n {\n files: ['app/**/*'],\n name: 'check-file',\n rules: {\n 'check-file/filename-naming-convention': [\n 'error',\n {\n // React hook files must be camelCase (to match the hook name)\n '**/hooks/*.{ts,tsx}': 'CAMEL_CASE',\n 'app/state/*.tsx': 'KEBAB_CASE',\n // React component files must be named index.tsx\n 'app/{components,pages}/**/!(assets|hooks|state|tests|utils)/*.tsx':\n 'index+()',\n // Generally, non-component files must be named kebab-case\n 'app/{components,pages}/**/!(hooks)/*.ts': 'KEBAB_CASE',\n // Non-component files inside specific components folders must be kebab-case\n 'app/{components,pages}/**/(assets|state|tests|utils)/*.{ts,tsx}':\n 'KEBAB_CASE',\n 'test/**/*.ts?(x)': 'KEBAB_CASE',\n },\n {\n ignoreMiddleExtensions: true,\n },\n ],\n 'check-file/folder-match-with-fex': [\n 'error',\n {\n // require stories and test files to be inside tests folders\n '*.(stories|test).{ts,tsx}': 'app/**/tests/',\n },\n ],\n 'check-file/folder-naming-convention': [\n 'error',\n {\n // enforce PascalCase component folders, and allow assets, hooks, tests, and utils subfolders\n 'app/components/**/':\n '(assets|hooks|state|tests|utils|[A-Z][a-zA-Z0-9]*)',\n },\n ],\n },\n },\n {\n files: ['test/**/*.*'],\n name: 'check-file/test-files',\n rules: {\n 'check-file/filename-naming-convention': [\n 'error',\n {\n 'test/**/*.ts?(x)': 'KEBAB_CASE',\n },\n {\n ignoreMiddleExtensions: true,\n },\n ],\n },\n },\n];\n\nexport const styleHygiene: Linter.Config[] = [\n ...canonicalConfig,\n ...perfectionistConfig,\n ...unicornConfig,\n ...unusedImportsConfig,\n ...checkFileConfig,\n];\n","import type {Linter} from 'eslint';\nimport noRelativeImportPaths from 'eslint-plugin-no-relative-import-paths';\nimport sonarjs from 'eslint-plugin-sonarjs';\nimport noEnumPlugin from '../plugins/no-enum.js';\nimport noJsxIifePlugin from '../plugins/no-jsx-iife.js';\nimport noSwitchPlugin from '../plugins/no-switch.js';\n\nconst sonarConfig: Linter.Config[] = [\n sonarjs.configs!.recommended as Linter.Config,\n {\n name: 'sonarjs',\n rules: {\n 'sonarjs/cognitive-complexity': 'error',\n 'sonarjs/fixme-tag': 'off',\n 'sonarjs/no-commented-code': 'off',\n 'sonarjs/no-nested-conditional': 'off',\n 'sonarjs/no-nested-functions': 'off',\n 'sonarjs/no-selector-parameter': 'off',\n 'sonarjs/regex-complexity': 'off',\n 'sonarjs/todo-tag': 'off',\n },\n },\n {\n files: ['**/*.tsx', '**/hooks/*.ts?(x)'],\n name: 'sonarjs/react-files',\n rules: {\n 'sonarjs/cognitive-complexity': 'off',\n 'sonarjs/function-return-type': 'off',\n },\n },\n {\n files: ['**/*.test.ts?(x)', '**/*.stories.ts?(x)'],\n name: 'sonarjs/test-files',\n rules: {\n 'sonarjs/no-duplicate-string': 'off',\n 'sonarjs/no-identical-functions': 'off',\n },\n },\n {\n files: ['app/languages/**/*.ts', 'eslint.config.mjs'],\n name: 'sonarjs/credential-checks',\n rules: {\n 'sonarjs/no-hardcoded-credentials': 'off',\n 'sonarjs/no-hardcoded-passwords': 'off',\n },\n },\n];\n\nconst noEnumConfig: Linter.Config[] = [\n {\n files: ['**/*.ts?(x)'],\n name: 'no-enum',\n plugins: {'no-enum': noEnumPlugin},\n rules: {\n 'no-enum/no-enum': 'error',\n },\n },\n];\n\nconst noJsxIifeConfig: Linter.Config[] = [\n {\n files: ['**/*.tsx', '**/*.jsx'],\n name: 'no-jsx-iife',\n plugins: {'no-jsx-iife': noJsxIifePlugin},\n rules: {'no-jsx-iife/no-jsx-iife': 'error'},\n },\n];\n\nconst noSwitchConfig: Linter.Config[] = [\n {\n files: ['**/*.ts?(x)', '**/*.js?(x)'],\n name: 'no-switch',\n plugins: {'no-switch': noSwitchPlugin},\n rules: {'no-switch/no-switch': 'error'},\n },\n];\n\nconst noRelativeImportPathsConfig: Linter.Config[] = [\n {\n name: 'no-relative-import-paths',\n plugins: {\n 'no-relative-import-paths': noRelativeImportPaths,\n },\n rules: {\n 'no-relative-import-paths/no-relative-import-paths': [\n 'error',\n {\n allowedDepth: 2,\n allowSameFolder: true,\n prefix: '~',\n rootDir: 'app',\n },\n ],\n },\n },\n];\n\nexport const guardrails: Linter.Config[] = [\n ...sonarConfig,\n ...noEnumConfig,\n ...noJsxIifeConfig,\n ...noSwitchConfig,\n ...noRelativeImportPathsConfig,\n];\n","import type {ESLint, Rule} from 'eslint';\n\nconst noEnumRule: Rule.RuleModule = {\n create: (context) => ({\n TSEnumDeclaration: (node: Rule.Node) => {\n context.report({messageId: 'noEnum', node});\n },\n }),\n meta: {\n docs: {description: 'Disallow TypeScript enums'},\n messages: {\n noEnum:\n 'Do not use TypeScript enums. Use an object with `as const` instead.',\n },\n schema: [],\n type: 'problem',\n },\n};\n\nconst plugin: ESLint.Plugin = {\n meta: {\n name: 'no-enum',\n version: '0.1.0',\n },\n rules: {\n 'no-enum': noEnumRule,\n },\n};\n\nexport default plugin;\n","import type {ESLint, Rule} from 'eslint';\n\nconst noJsxIifeRule: Rule.RuleModule = {\n create: (context) => ({\n 'JSXExpressionContainer > CallExpression > ArrowFunctionExpression.callee':\n (node: Rule.Node) => {\n context.report({messageId: 'noJsxIife', node});\n },\n 'JSXExpressionContainer > CallExpression > FunctionExpression.callee': (\n node: Rule.Node,\n ) => {\n context.report({messageId: 'noJsxIife', node});\n },\n }),\n meta: {\n docs: {description: 'Disallow IIFEs in JSX expressions'},\n messages: {\n noJsxIife:\n 'Do not use IIFEs in JSX. Use a computed variable before the return or extract a component instead.',\n },\n schema: [],\n type: 'problem',\n },\n};\n\nconst plugin: ESLint.Plugin = {\n meta: {\n name: 'no-jsx-iife',\n version: '0.1.0',\n },\n rules: {\n 'no-jsx-iife': noJsxIifeRule,\n },\n};\n\nexport default plugin;\n","import type {ESLint, Rule} from 'eslint';\n\nconst noSwitchRule: Rule.RuleModule = {\n create: (context) => ({\n SwitchStatement: (node: Rule.Node) => {\n context.report({messageId: 'noSwitch', node});\n },\n }),\n meta: {\n docs: {description: 'Disallow switch statements'},\n messages: {\n noSwitch:\n 'Do not use switch statements. Use an object map or if/else instead.',\n },\n schema: [],\n type: 'problem',\n },\n};\n\nconst plugin: ESLint.Plugin = {\n meta: {\n name: 'no-switch',\n version: '0.1.0',\n },\n rules: {\n 'no-switch': noSwitchRule,\n },\n};\n\nexport default plugin;\n","import vitest from '@vitest/eslint-plugin';\nimport jestDom from 'eslint-plugin-jest-dom';\nimport testingLibrary from 'eslint-plugin-testing-library';\nimport type {Linter} from 'eslint';\n\n/**\n * Testing flat-config block.\n *\n * Ports `testHarnessConfig` + `testingLibraryConfig` from GAIA's\n * `eslint.config.mjs`. Wires up Vitest, jest-dom, and Testing Library\n * recommended rules across test/story/test-harness files.\n */\nexport const testing: Linter.Config[] = [\n {\n files: [\n '**/*.test.ts?(x)',\n '**/*.stories.ts?(x)',\n 'test/**/*.ts?(x)',\n ],\n name: 'vitest',\n plugins: {\n 'jest-dom': jestDom,\n vitest,\n },\n rules: {\n ...jestDom.configs['flat/recommended'].rules,\n ...vitest.configs.recommended.rules,\n 'import-x/no-useless-path-segments': [\n 'error',\n {noUselessIndex: true},\n ],\n 'vitest/expect-expect': [\n 'error',\n {assertFunctionNames: ['expect', 'expect*']},\n ],\n },\n },\n {\n ...testingLibrary.configs['flat/react'],\n files: ['**/*.test.ts?(x)'],\n name: 'testing-library',\n },\n];\n","import storybookPlugin from 'eslint-plugin-storybook';\nimport type {Linter} from 'eslint';\n\n/**\n * Storybook flat-config block.\n *\n * Ports `storybookConfig` from GAIA's `eslint.config.mjs` — applies the\n * official `flat/recommended` config from `eslint-plugin-storybook`.\n */\nexport const storybook: Linter.Config[] = [\n ...(storybookPlugin.configs['flat/recommended'] as Linter.Config[]),\n];\n","import playwrightPlugin from 'eslint-plugin-playwright';\nimport type {Linter} from 'eslint';\n\n/**\n * Playwright flat-config block.\n *\n * Ports `playwrightConfig` from GAIA's `eslint.config.mjs` — scopes\n * `eslint-plugin-playwright`'s `flat/recommended` config to `.playwright/`\n * test files (GAIA's e2e directory convention).\n */\nexport const playwright: Linter.Config[] = [\n {\n name: 'playwright',\n ...(playwrightPlugin.configs['flat/recommended'] as Linter.Config),\n files: ['.playwright/**/*.ts?(x)'],\n rules: {\n ...playwrightPlugin.configs['flat/recommended'].rules,\n 'playwright/expect-expect': [\n 'warn',\n {assertFunctionPatterns: ['^expect[A-Z]']},\n ],\n },\n },\n];\n","import {rules as prettierConfigRules} from 'eslint-config-prettier';\nimport prettierPlugin from 'eslint-plugin-prettier';\nimport type {Linter} from 'eslint';\n\n/**\n * Prettier flat-config block.\n *\n * Ports `prettierConfig` from GAIA's `eslint.config.mjs`. Layers\n * `eslint-config-prettier`'s rule disablers, then re-enables a few\n * `@stylistic/*` rules GAIA wants to keep (padding lines, single quotes),\n * and finally turns on the `prettier/prettier` rule itself.\n */\nexport const prettier: Linter.Config[] = [\n {\n name: 'prettier/plugin/config',\n plugins: {prettier: prettierPlugin},\n },\n {\n name: 'prettier/config',\n rules: {\n ...prettierConfigRules,\n '@stylistic/padding-line-between-statements': [\n 'error',\n {\n blankLine: 'always',\n next: ['block-like', 'export', 'return', 'throw'],\n prev: '*',\n },\n ],\n '@stylistic/quotes': [\n 'error',\n 'single',\n {\n allowTemplateLiterals: 'avoidEscape',\n avoidEscape: true,\n },\n ],\n '@stylistic/spaced-comment': 'off',\n 'prettier/prettier': ['error', {endOfLine: 'auto'}],\n },\n },\n];\n","import betterTailwindPlugin from 'eslint-plugin-better-tailwindcss';\nimport type {Linter} from 'eslint';\n\nexport type GaiaLintBetterTailwindOptions = {\n /** Path to the Tailwind entry CSS file (e.g. './app/styles/tailwind.css'). */\n entryPoint: string;\n /** Class names to ignore in `better-tailwindcss/no-unknown-classes`. */\n ignore?: string[];\n};\n\n/**\n * Better-Tailwind flat-config factory.\n *\n * Ports `betterTailwindConfig` from GAIA's `eslint.config.mjs`. The\n * `entryPoint` (consumer's Tailwind CSS entry) and `ignore` list are\n * project-specific, so this is shipped as a factory rather than a static\n * array.\n */\nexport const betterTailwind = (\n opts: GaiaLintBetterTailwindOptions,\n): Linter.Config[] => [\n {\n name: 'better-tailwindcss',\n plugins: {\n 'better-tailwindcss': betterTailwindPlugin,\n },\n rules: {\n 'better-tailwindcss/enforce-canonical-classes': 'error',\n 'better-tailwindcss/enforce-consistent-important-position': 'error',\n 'better-tailwindcss/enforce-consistent-variable-syntax': 'error',\n 'better-tailwindcss/enforce-shorthand-classes': 'error',\n 'better-tailwindcss/no-conflicting-classes': 'error',\n 'better-tailwindcss/no-deprecated-classes': 'error',\n 'better-tailwindcss/no-unknown-classes': [\n 'error',\n {ignore: opts.ignore ?? []},\n ],\n },\n settings: {\n 'better-tailwindcss': {\n detectComponentClasses: true,\n entryPoint: opts.entryPoint,\n },\n },\n },\n];\n","import {includeIgnoreFile} from '@eslint/compat';\nimport path from 'node:path';\nimport type {Linter} from 'eslint';\n\nexport type GaiaLintIgnoresOptions = {\n /** Path to a `.gitignore` file to merge in. Resolved from `process.cwd()` if relative. */\n gitignore?: string;\n /** Extra ignore globs to merge with GAIA defaults. */\n extra?: string[];\n};\n\n/**\n * GAIA's default ignore globs — matches the static `ignored-files` block in\n * GAIA's `eslint.config.mjs`. Consumer's `extra` ignores get concatenated\n * onto this list.\n */\nconst defaultIgnores = [\n '.storybook',\n '.playwright',\n '/.react-router/**',\n '.claude/**/*.js',\n '.claude/**/*.cjs',\n 'scripts',\n 'public/**',\n '**/*.css',\n '**/*.svg',\n '**/*.md',\n];\n\n/**\n * Ignores flat-config factory.\n *\n * Ports the `includeIgnoreFile(gitignorePath)` + static `ignored-files`\n * block from GAIA's `eslint.config.mjs`. The `gitignore` path must be\n * resolved at the consumer's cwd (config-load time), not at gaia-lint's\n * install location, so this is shipped as a factory.\n */\nexport const ignores = (opts?: GaiaLintIgnoresOptions): Linter.Config[] => {\n const out: Linter.Config[] = [];\n\n if (opts?.gitignore) {\n const resolved = path.isAbsolute(opts.gitignore)\n ? opts.gitignore\n : path.resolve(process.cwd(), opts.gitignore);\n out.push(includeIgnoreFile(resolved) as Linter.Config);\n }\n\n out.push({\n ignores: [...defaultIgnores, ...(opts?.extra ?? [])],\n name: 'ignored-files',\n });\n\n return out;\n};\n","export {base} from './configs/base.js';\nexport {react} from './configs/react.js';\nexport {styleHygiene} from './configs/style-hygiene.js';\nexport {guardrails} from './configs/guardrails.js';\nexport {testing} from './configs/testing.js';\nexport {storybook} from './configs/storybook.js';\nexport {playwright} from './configs/playwright.js';\nexport {prettier} from './configs/prettier.js';\nexport {\n betterTailwind,\n type GaiaLintBetterTailwindOptions,\n} from './configs/better-tailwind.js';\nexport {\n ignores,\n type GaiaLintIgnoresOptions,\n} from './configs/ignores.js';\n\nimport {base} from './configs/base.js';\nimport {react} from './configs/react.js';\nimport {styleHygiene} from './configs/style-hygiene.js';\nimport {guardrails} from './configs/guardrails.js';\nimport {testing} from './configs/testing.js';\nimport {storybook} from './configs/storybook.js';\nimport {playwright} from './configs/playwright.js';\nimport {prettier} from './configs/prettier.js';\nimport {betterTailwind} from './configs/better-tailwind.js';\nimport {ignores} from './configs/ignores.js';\n\nconst gaiaLint: {\n base: typeof base;\n react: typeof react;\n styleHygiene: typeof styleHygiene;\n guardrails: typeof guardrails;\n testing: typeof testing;\n storybook: typeof storybook;\n playwright: typeof playwright;\n prettier: typeof prettier;\n betterTailwind: typeof betterTailwind;\n ignores: typeof ignores;\n} = {\n base,\n react,\n styleHygiene,\n guardrails,\n testing,\n storybook,\n playwright,\n prettier,\n betterTailwind,\n ignores,\n};\n\nexport default gaiaLint;\n"],"mappings":"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","names":["configs","plugins","plugin","plugin"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-jsx-iife.d.ts","sourceRoot":"","sources":["../../src/plugins/no-jsx-iife.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAO,MAAM,QAAQ,CAAC;AAyBzC,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,MAQpB,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gaia-react/lint",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "GAIA's opinionated lint configuration.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -43,40 +43,40 @@
|
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@eslint-community/eslint-plugin-eslint-comments": "4.7.1",
|
|
46
|
-
"@eslint/compat": "2.0
|
|
46
|
+
"@eslint/compat": "2.1.0",
|
|
47
47
|
"@eslint/js": "9.39.4",
|
|
48
|
-
"@vitest/eslint-plugin": "1.6.
|
|
48
|
+
"@vitest/eslint-plugin": "1.6.17",
|
|
49
49
|
"eslint-config-airbnb-extended": "3.1.0",
|
|
50
50
|
"eslint-config-prettier": "10.1.8",
|
|
51
|
-
"eslint-plugin-better-tailwindcss": "4.
|
|
51
|
+
"eslint-plugin-better-tailwindcss": "4.5.0",
|
|
52
52
|
"eslint-plugin-canonical": "5.1.3",
|
|
53
53
|
"eslint-plugin-check-file": "3.3.1",
|
|
54
54
|
"eslint-plugin-jest-dom": "5.5.0",
|
|
55
55
|
"eslint-plugin-no-relative-import-paths": "1.6.1",
|
|
56
56
|
"eslint-plugin-perfectionist": "5.9.0",
|
|
57
|
-
"eslint-plugin-playwright": "2.10.
|
|
57
|
+
"eslint-plugin-playwright": "2.10.4",
|
|
58
58
|
"eslint-plugin-prefer-arrow-functions": "3.9.1",
|
|
59
59
|
"eslint-plugin-prettier": "5.5.5",
|
|
60
60
|
"eslint-plugin-sonarjs": "4.0.3",
|
|
61
|
-
"eslint-plugin-storybook": "10.
|
|
61
|
+
"eslint-plugin-storybook": "10.4.1",
|
|
62
62
|
"eslint-plugin-testing-library": "7.16.2",
|
|
63
63
|
"eslint-plugin-unicorn": "64.0.0",
|
|
64
64
|
"eslint-plugin-unused-imports": "4.4.1",
|
|
65
65
|
"eslint-plugin-you-dont-need-lodash-underscore": "6.14.0",
|
|
66
|
-
"prettier-plugin-tailwindcss": "0.
|
|
67
|
-
"stylelint-config-clean-order": "8.0.
|
|
66
|
+
"prettier-plugin-tailwindcss": "0.8.0",
|
|
67
|
+
"stylelint-config-clean-order": "8.0.2",
|
|
68
68
|
"stylelint-config-standard": "40.0.0",
|
|
69
69
|
"stylelint-config-tailwindcss": "1.0.1",
|
|
70
70
|
"stylelint-order": "8.1.1"
|
|
71
71
|
},
|
|
72
72
|
"devDependencies": {
|
|
73
|
-
"@changesets/changelog-github": "^0.
|
|
73
|
+
"@changesets/changelog-github": "^0.7.0",
|
|
74
74
|
"@changesets/cli": "^2.31.0",
|
|
75
|
-
"@types/node": "^
|
|
75
|
+
"@types/node": "^25.9.1",
|
|
76
76
|
"eslint": "^9.39.0",
|
|
77
77
|
"tsup": "^8.0.0",
|
|
78
78
|
"typescript": "^6.0.0",
|
|
79
|
-
"typescript-eslint": "^8.59.
|
|
79
|
+
"typescript-eslint": "^8.59.4"
|
|
80
80
|
},
|
|
81
81
|
"author": "Steven Sacks <stevensacks@gmail.com>",
|
|
82
82
|
"license": "MIT",
|