@fullstacksjs/eslint-config 12.4.1 → 12.4.2-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -69,7 +69,7 @@ interface Options {
69
69
  cypress?: boolean; // controls cypress plugin
70
70
  playwright?: boolean // controls playwright plugin
71
71
  storybook?: boolean; // controls storybook plugin
72
- tailwind?: boolean | { callee?: string[] }; // controls tailwindcss plugin
72
+ tailwind?: false | TailwindConfig; // controls tailwindcss plugin
73
73
  next?: boolean; // controls next plugin
74
74
  prettier?: boolean; // controls prettier plugin
75
75
  disableExpensiveRules?: boolean; // controls expensive rules
@@ -115,6 +115,34 @@ export default defineConfig(
115
115
  )
116
116
  ```
117
117
 
118
+ ## Tailwind
119
+
120
+ To enable Tailwind CSS in your project, specify the path to your CSS file in the module configuration:
121
+
122
+ Tailwind 4:
123
+ ```typescript
124
+ export default defineConfig({
125
+ tailwind: { entryPoint: './src/global.css' },
126
+ })
127
+ ```
128
+
129
+ Tailwind 3:
130
+ ```typescript
131
+ export default defineConfig({
132
+ tailwind: { tailwindConfig: './tailwind.config.js' },
133
+ })
134
+ ```
135
+
136
+ ## GitIgnore
137
+
138
+ By default, FullstacksJS checks for a `.gitignore` file at the root of the project. If the file exists, it will be used automatically. You can override this behavior by updating the configuration.
139
+
140
+ ```typescript
141
+ export default defineConfig({
142
+ gitignore: './packages/acme/.gitignore', // use `false` to disable
143
+ })
144
+ ```
145
+
118
146
  ## I'm Getting a Next.js Warning: Plugin Was Not Detected
119
147
 
120
148
  This configuration includes built-in support for [Next.js](https://nextjs.org). The warning you're seeing from Next.js is misleading—it simply checks whether the plugin is explicitly listed in your package.json.
@@ -178,7 +206,7 @@ export default defineConfig({
178
206
  * [eslint-plugin-promise](https://github.com/eslint-community/eslint-plugin-promise)
179
207
  * [eslint-plugin-react-hooks](https://www.npmjs.com/package/eslint-plugin-react-hooks)
180
208
  * [eslint-plugin-storybook](https://github.com/storybookjs/eslint-plugin-storybook#readme)
181
- * [eslint-plugin-tailwindcss](https://github.com/francoismassart/eslint-plugin-tailwindcss)
209
+ * [eslint-plugin-better-tailwindcss](https://github.com/schoero/eslint-plugin-better-tailwindcss)
182
210
  * [eslint-plugin-vitest](https://www.npmjs.com/package/eslint-plugin-vitest)
183
211
  * [typescript-eslint](https://typescript-eslint.io/)
184
212
 
package/cjs/index.d.ts CHANGED
@@ -7,6 +7,13 @@ interface ProjectService {
7
7
  maximumDefaultProjectFileMatchCount_THIS_WILL_SLOW_DOWN_LINTING: number;
8
8
  }
9
9
 
10
+ type TailwindConfig = {
11
+ callees?: string[];
12
+ variables?: string[];
13
+ attributes?: string[];
14
+ tags?: string[];
15
+ } & ({ entryPoint: string; tailwindConfig?: string } | { entryPoint?: string; tailwindConfig: string });
16
+
10
17
  export interface Options extends Linter.Config {
11
18
  /**
12
19
  * Controls React plugin.
@@ -24,9 +31,10 @@ export interface Options extends Linter.Config {
24
31
  next?: boolean;
25
32
  /**
26
33
  * Controls Tailwind plugin.
27
- * @default true - If you have `tailwind` in your dependencies.
34
+ * @default false
35
+ * @see https://github.com/schoero/eslint-plugin-better-tailwindcss/blob/main/docs/settings/settings.md
28
36
  */
29
- tailwind?: boolean | { callees: string[] };
37
+ tailwind?: false | TailwindConfig;
30
38
  /**
31
39
  * Controls [Node plugin](https://www.npmjs.com/package/eslint-plugin-n).
32
40
  * @default false
package/cjs/index.js CHANGED
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.defineConfig = defineConfig;
7
- exports.init = void 0;
8
7
  var _deepmerge = _interopRequireDefault(require("deepmerge"));
9
8
  var _config = require("eslint/config");
10
9
  var _localPkg = require("local-pkg");
@@ -51,7 +50,6 @@ const defaultOptions = {
51
50
  storybook: (0, _localPkg.isPackageExists)('storybook'),
52
51
  strict: false,
53
52
  tailwind: false,
54
- // ISSUE: https://github.com/francoismassart/eslint-plugin-tailwindcss/issues/325,
55
53
  test: testPackages.some(p => (0, _localPkg.isPackageExists)(p)),
56
54
  typescript: (0, _localPkg.isPackageExists)('typescript') ? {
57
55
  projectService: true
@@ -67,9 +65,6 @@ const defaultOptions = {
67
65
  */
68
66
  function defineConfig(initOptions = {}, ...extend) {
69
67
  const options = (0, _deepmerge.default)(defaultOptions, initOptions);
70
- if (options.tailwind === true) {
71
- options.tailwind = {};
72
- }
73
68
  if (options.import === true) {
74
69
  options.import = {};
75
70
  }
@@ -114,6 +109,3 @@ function defineConfig(initOptions = {}, ...extend) {
114
109
  if (extend) Array.prototype.push.apply(rules, extend);
115
110
  return (0, _config.defineConfig)(rules);
116
111
  }
117
-
118
- /** @deprecated Please use `defineConfig` from `@fullstacksjs/eslint-config` instead, this function will be removed in the next major release. */
119
- const init = exports.init = defineConfig;
@@ -19,7 +19,7 @@ function base(options = {}) {
19
19
  globals: {
20
20
  ..._globals.default.browser,
21
21
  ..._globals.default.node,
22
- ..._globals.default.es2024
22
+ ..._globals.default.es2025
23
23
  },
24
24
  parserOptions: {
25
25
  ecmaVersion: 'latest',
@@ -9,24 +9,24 @@ Object.defineProperty(exports, "__esModule", {
9
9
  * @return { Promise<import('eslint').Linter.Config> }
10
10
  */
11
11
  async function tailwind(options = {}) {
12
- const plugin = await Promise.resolve().then(() => require('eslint-plugin-tailwindcss'));
12
+ const plugin = await Promise.resolve().then(() => require('eslint-plugin-better-tailwindcss'));
13
13
  return {
14
14
  plugins: {
15
- tailwindcss: plugin.default ?? plugin
15
+ 'better-tailwindcss': plugin.default ?? plugin
16
16
  },
17
17
  settings: {
18
- tailwindcss: {
19
- callees: options.callees ?? ['cva', 'classnames', 'classNames', 'class', 'clsx', 'cn', 'cns', 'cx']
18
+ 'better-tailwindcss': {
19
+ entryPoint: options.tailwind.entryPoint,
20
+ tailwindConfig: options.tailwind.tailwindConfig
20
21
  }
21
22
  },
22
23
  rules: {
23
- 'tailwindcss/classnames-order': 'warn',
24
- 'tailwindcss/enforces-negative-arbitrary-values': 'warn',
25
- 'tailwindcss/enforces-shorthand': 'warn',
26
- 'tailwindcss/migration-from-tailwind-2': 'warn',
27
- 'tailwindcss/no-arbitrary-value': 'off',
28
- 'tailwindcss/no-custom-classname': 'warn',
29
- 'tailwindcss/no-contradicting-classname': 'error'
24
+ 'better-tailwindcss/sort-classes': 'warn',
25
+ 'better-tailwindcss/no-duplicate-classes': 'error',
26
+ 'better-tailwindcss/no-conflicting-classes': 'error',
27
+ 'better-tailwindcss/no-unnecessary-whitespace': 'warn',
28
+ 'better-tailwindcss/enforce-consistent-variable-syntax': 'error',
29
+ 'better-tailwindcss/multiline': 'off'
30
30
  }
31
31
  };
32
32
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fullstacksjs/eslint-config",
3
- "version": "12.4.1",
3
+ "version": "12.4.2-next.2",
4
4
  "license": "MIT",
5
5
  "author": "fullstacks <fullstacksjs@gmail.com>",
6
6
  "description": "fullstacks eslint config",
@@ -40,6 +40,7 @@
40
40
  "@next/eslint-plugin-next": "15.3.2",
41
41
  "@stylistic/eslint-plugin": "4.4.0",
42
42
  "deepmerge": "4.3.1",
43
+ "eslint-plugin-better-tailwindcss": "3.2.1",
43
44
  "eslint-plugin-cypress": "4.3.0",
44
45
  "eslint-plugin-import-x": "4.13.3",
45
46
  "eslint-plugin-jest": "28.11.0",
@@ -52,7 +53,6 @@
52
53
  "eslint-plugin-promise": "7.2.1",
53
54
  "eslint-plugin-react-hooks": "5.2.0",
54
55
  "eslint-plugin-storybook": "0.12.0",
55
- "eslint-plugin-tailwindcss": "3.18.0",
56
56
  "eslint-plugin-vitest": "0.5.4",
57
57
  "globals": "16.2.0",
58
58
  "local-pkg": "1.1.1",
package/src/index.d.ts CHANGED
@@ -7,6 +7,13 @@ interface ProjectService {
7
7
  maximumDefaultProjectFileMatchCount_THIS_WILL_SLOW_DOWN_LINTING: number;
8
8
  }
9
9
 
10
+ type TailwindConfig = {
11
+ callees?: string[];
12
+ variables?: string[];
13
+ attributes?: string[];
14
+ tags?: string[];
15
+ } & ({ entryPoint: string; tailwindConfig?: string } | { entryPoint?: string; tailwindConfig: string });
16
+
10
17
  export interface Options extends Linter.Config {
11
18
  /**
12
19
  * Controls React plugin.
@@ -24,9 +31,10 @@ export interface Options extends Linter.Config {
24
31
  next?: boolean;
25
32
  /**
26
33
  * Controls Tailwind plugin.
27
- * @default true - If you have `tailwind` in your dependencies.
34
+ * @default false
35
+ * @see https://github.com/schoero/eslint-plugin-better-tailwindcss/blob/main/docs/settings/settings.md
28
36
  */
29
- tailwind?: boolean | { callees: string[] };
37
+ tailwind?: false | TailwindConfig;
30
38
  /**
31
39
  * Controls [Node plugin](https://www.npmjs.com/package/eslint-plugin-n).
32
40
  * @default false
package/src/index.mjs CHANGED
@@ -44,7 +44,7 @@ const defaultOptions = {
44
44
  react: isPackageExists('react'),
45
45
  storybook: isPackageExists('storybook'),
46
46
  strict: false,
47
- tailwind: false, // ISSUE: https://github.com/francoismassart/eslint-plugin-tailwindcss/issues/325,
47
+ tailwind: false,
48
48
  test: testPackages.some(p => isPackageExists(p)),
49
49
  typescript: isPackageExists('typescript') ? { projectService: true } : false,
50
50
  vitest: isPackageExists('vitest'),
@@ -59,9 +59,6 @@ const defaultOptions = {
59
59
  export function defineConfig(initOptions = {}, ...extend) {
60
60
  const options = merge(defaultOptions, initOptions);
61
61
 
62
- if (options.tailwind === true) {
63
- options.tailwind = {};
64
- }
65
62
  if (options.import === true) {
66
63
  options.import = {};
67
64
  }
@@ -111,6 +108,3 @@ export function defineConfig(initOptions = {}, ...extend) {
111
108
 
112
109
  return eslintConfig(rules);
113
110
  }
114
-
115
- /** @deprecated Please use `defineConfig` from `@fullstacksjs/eslint-config` instead, this function will be removed in the next major release. */
116
- export const init = defineConfig;
@@ -14,7 +14,7 @@ function base(options = {}) {
14
14
  globals: {
15
15
  ...globals.browser,
16
16
  ...globals.node,
17
- ...globals.es2024,
17
+ ...globals.es2025,
18
18
  },
19
19
  parserOptions: {
20
20
  ecmaVersion: 'latest',
@@ -3,22 +3,22 @@
3
3
  * @return { Promise<import('eslint').Linter.Config> }
4
4
  */
5
5
  async function tailwind(options = {}) {
6
- const plugin = await import('eslint-plugin-tailwindcss');
6
+ const plugin = await import('eslint-plugin-better-tailwindcss');
7
7
  return {
8
- plugins: { tailwindcss: plugin.default ?? plugin },
8
+ plugins: { 'better-tailwindcss': plugin.default ?? plugin },
9
9
  settings: {
10
- tailwindcss: {
11
- callees: options.callees ?? ['cva', 'classnames', 'classNames', 'class', 'clsx', 'cn', 'cns', 'cx'],
10
+ 'better-tailwindcss': {
11
+ entryPoint: options.tailwind.entryPoint,
12
+ tailwindConfig: options.tailwind.tailwindConfig,
12
13
  },
13
14
  },
14
15
  rules: {
15
- 'tailwindcss/classnames-order': 'warn',
16
- 'tailwindcss/enforces-negative-arbitrary-values': 'warn',
17
- 'tailwindcss/enforces-shorthand': 'warn',
18
- 'tailwindcss/migration-from-tailwind-2': 'warn',
19
- 'tailwindcss/no-arbitrary-value': 'off',
20
- 'tailwindcss/no-custom-classname': 'warn',
21
- 'tailwindcss/no-contradicting-classname': 'error',
16
+ 'better-tailwindcss/sort-classes': 'warn',
17
+ 'better-tailwindcss/no-duplicate-classes': 'error',
18
+ 'better-tailwindcss/no-conflicting-classes': 'error',
19
+ 'better-tailwindcss/no-unnecessary-whitespace': 'warn',
20
+ 'better-tailwindcss/enforce-consistent-variable-syntax': 'error',
21
+ 'better-tailwindcss/multiline': 'off',
22
22
  },
23
23
  };
24
24
  }