@gaia-react/lint 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/configs/base.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAS,MAAM,EAAC,MAAM,QAAQ,CAAC;AAoR3C,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAS/B,CAAC"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/configs/base.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAS,MAAM,EAAC,MAAM,QAAQ,CAAC;AAwS3C,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAS/B,CAAC"}
package/dist/index.js CHANGED
@@ -252,6 +252,25 @@ var preferArrowFunctionsConfig = [
252
252
  "prefer-arrow-functions/prefer-arrow-functions": "error"
253
253
  }
254
254
  },
255
+ {
256
+ // `prefer-arrow-functions` has a hardcoded exemption for named
257
+ // default-exported declarations (`guard.js:hasNameAndIsExportedAsDefaultExport`),
258
+ // so `export default function Foo() {}` slips through. This selector closes
259
+ // that gap. Convert to `const Foo = () => {}; export default Foo;` instead.
260
+ // `.d.ts` is ignored because ambient `export default function …(): T;`
261
+ // declarations have no body to convert.
262
+ ignores: ["**/*.d.ts"],
263
+ name: "prefer-arrow/no-default-exported-function",
264
+ rules: {
265
+ "no-restricted-syntax": [
266
+ "error",
267
+ {
268
+ message: "Use `const Name = () => {}; export default Name;` instead. The prefer-arrow-functions plugin exempts named default-exported declarations upstream.",
269
+ selector: "ExportDefaultDeclaration > FunctionDeclaration"
270
+ }
271
+ ]
272
+ }
273
+ },
255
274
  {
256
275
  files: ["**/*.d.ts"],
257
276
  name: "ts-definition-files/prefer-arrow-off",
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 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: ['*.test.ts?(x)', '*.stories.ts?(x)', 'test/**/*.ts?(x)'],\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 },\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 },\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-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: ['*.test.ts?(x)', '*.stories.ts?(x)', 'test/**/*.ts?(x)'],\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 },\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 },\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"]}
@@ -0,0 +1,4 @@
1
+ import type { Config } from 'prettier';
2
+ declare const config: Config;
3
+ export default config;
4
+ //# sourceMappingURL=prettier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prettier.d.ts","sourceRoot":"","sources":["../src/prettier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AAErC,QAAA,MAAM,MAAM,EAAE,MAQb,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,15 @@
1
+ // src/prettier.ts
2
+ var config = {
3
+ bracketSpacing: false,
4
+ experimentalTernaries: true,
5
+ plugins: ["prettier-plugin-tailwindcss"],
6
+ singleQuote: true,
7
+ tabWidth: 2,
8
+ tailwindFunctions: ["twJoin", "twMerge"],
9
+ trailingComma: "es5"
10
+ };
11
+ var prettier_default = config;
12
+ export {
13
+ prettier_default as default
14
+ };
15
+ //# sourceMappingURL=prettier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/prettier.ts"],"sourcesContent":["import type {Config} from 'prettier';\n\nconst config: Config = {\n bracketSpacing: false,\n experimentalTernaries: true,\n plugins: ['prettier-plugin-tailwindcss'],\n singleQuote: true,\n tabWidth: 2,\n tailwindFunctions: ['twJoin', 'twMerge'],\n trailingComma: 'es5',\n};\n\nexport default config;\n"],"mappings":";AAEA,IAAM,SAAiB;AAAA,EACrB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,SAAS,CAAC,6BAA6B;AAAA,EACvC,aAAa;AAAA,EACb,UAAU;AAAA,EACV,mBAAmB,CAAC,UAAU,SAAS;AAAA,EACvC,eAAe;AACjB;AAEA,IAAO,mBAAQ;","names":[]}
@@ -0,0 +1,4 @@
1
+ import type { Config } from 'stylelint';
2
+ declare const config: Config;
3
+ export default config;
4
+ //# sourceMappingURL=stylelint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stylelint.d.ts","sourceRoot":"","sources":["../src/stylelint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,WAAW,CAAC;AAEtC,QAAA,MAAM,MAAM,EAAE,MA0Bb,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,33 @@
1
+ // src/stylelint.ts
2
+ var config = {
3
+ extends: [
4
+ "stylelint-config-standard",
5
+ "stylelint-config-clean-order",
6
+ "stylelint-config-tailwindcss"
7
+ ],
8
+ ignoreFiles: ["public/build/**/*.css"],
9
+ overrides: [
10
+ {
11
+ files: ["**/*.module.css"],
12
+ rules: {
13
+ "selector-class-pattern": "^[a-z][a-zA-Z0-9]+$"
14
+ }
15
+ }
16
+ ],
17
+ plugins: ["stylelint-order"],
18
+ rules: {
19
+ "at-rule-no-deprecated": null,
20
+ "no-descending-specificity": null,
21
+ "selector-pseudo-class-no-unknown": [
22
+ true,
23
+ {
24
+ ignorePseudoClasses: ["global", "local"]
25
+ }
26
+ ]
27
+ }
28
+ };
29
+ var stylelint_default = config;
30
+ export {
31
+ stylelint_default as default
32
+ };
33
+ //# sourceMappingURL=stylelint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stylelint.ts"],"sourcesContent":["import type {Config} from 'stylelint';\n\nconst config: Config = {\n extends: [\n 'stylelint-config-standard',\n 'stylelint-config-clean-order',\n 'stylelint-config-tailwindcss',\n ],\n ignoreFiles: ['public/build/**/*.css'],\n overrides: [\n {\n files: ['**/*.module.css'],\n rules: {\n 'selector-class-pattern': '^[a-z][a-zA-Z0-9]+$',\n },\n },\n ],\n plugins: ['stylelint-order'],\n rules: {\n 'at-rule-no-deprecated': null,\n 'no-descending-specificity': null,\n 'selector-pseudo-class-no-unknown': [\n true,\n {\n ignorePseudoClasses: ['global', 'local'],\n },\n ],\n },\n};\n\nexport default config;\n"],"mappings":";AAEA,IAAM,SAAiB;AAAA,EACrB,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAa,CAAC,uBAAuB;AAAA,EACrC,WAAW;AAAA,IACT;AAAA,MACE,OAAO,CAAC,iBAAiB;AAAA,MACzB,OAAO;AAAA,QACL,0BAA0B;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAS,CAAC,iBAAiB;AAAA,EAC3B,OAAO;AAAA,IACL,yBAAyB;AAAA,IACzB,6BAA6B;AAAA,IAC7B,oCAAoC;AAAA,MAClC;AAAA,MACA;AAAA,QACE,qBAAqB,CAAC,UAAU,OAAO;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,oBAAQ;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gaia-react/lint",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "GAIA's opinionated lint configuration.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -9,6 +9,14 @@
9
9
  ".": {
10
10
  "import": "./dist/index.js",
11
11
  "types": "./dist/index.d.ts"
12
+ },
13
+ "./prettier": {
14
+ "import": "./dist/prettier.js",
15
+ "types": "./dist/prettier.d.ts"
16
+ },
17
+ "./stylelint": {
18
+ "import": "./dist/stylelint.js",
19
+ "types": "./dist/stylelint.d.ts"
12
20
  }
13
21
  },
14
22
  "files": [
@@ -22,11 +30,15 @@
22
30
  "peerDependencies": {
23
31
  "eslint": "^9.0.0",
24
32
  "prettier": "^3.0.0",
33
+ "stylelint": "^17.0.0",
25
34
  "typescript": "^5.0.0 || ^6.0.0"
26
35
  },
27
36
  "peerDependenciesMeta": {
28
37
  "prettier": {
29
38
  "optional": true
39
+ },
40
+ "stylelint": {
41
+ "optional": true
30
42
  }
31
43
  },
32
44
  "dependencies": {
@@ -50,9 +62,16 @@
50
62
  "eslint-plugin-testing-library": "7.16.2",
51
63
  "eslint-plugin-unicorn": "64.0.0",
52
64
  "eslint-plugin-unused-imports": "4.4.1",
53
- "eslint-plugin-you-dont-need-lodash-underscore": "6.14.0"
65
+ "eslint-plugin-you-dont-need-lodash-underscore": "6.14.0",
66
+ "prettier-plugin-tailwindcss": "0.7.3",
67
+ "stylelint-config-clean-order": "8.0.1",
68
+ "stylelint-config-standard": "40.0.0",
69
+ "stylelint-config-tailwindcss": "1.0.1",
70
+ "stylelint-order": "8.1.1"
54
71
  },
55
72
  "devDependencies": {
73
+ "@changesets/changelog-github": "^0.6.0",
74
+ "@changesets/cli": "^2.31.0",
56
75
  "@types/node": "^22.0.0",
57
76
  "eslint": "^9.39.0",
58
77
  "tsup": "^8.0.0",
@@ -83,6 +102,9 @@
83
102
  "build": "tsup && tsc --emitDeclarationOnly",
84
103
  "dev": "tsup --watch",
85
104
  "typecheck": "tsc --noEmit",
86
- "lint": "eslint --max-warnings=0 src"
105
+ "lint": "eslint --max-warnings=0 src",
106
+ "changeset": "changeset",
107
+ "version-packages": "changeset version",
108
+ "release": "pnpm build && changeset publish"
87
109
  }
88
110
  }