@@ -2,9 +2,19 @@ import base, { createConfig } from '@metamask/eslint-config';
22import jest from '@metamask/eslint-config-jest' ;
33import nodejs from '@metamask/eslint-config-nodejs' ;
44import typescript from '@metamask/eslint-config-typescript' ;
5- import tailwind from 'eslint-plugin-better-tailwindcss' ;
5+ import betterTailwind from 'eslint-plugin-better-tailwindcss' ;
6+ import { createRequire } from 'node:module' ;
7+ import path from 'node:path' ;
68
79const NODE_LTS_VERSION = 22 ;
10+ const nativeRequire = createRequire (
11+ new URL ( './apps/storybook-react-native/package.json' , import . meta. url ) ,
12+ ) ;
13+ const nativeTailwind = nativeRequire ( 'eslint-plugin-tailwindcss' ) ;
14+ const NATIVE_TAILWIND_CONFIG_PATH = path . resolve (
15+ import . meta. dirname ,
16+ 'apps/storybook-react-native/tailwind-intellisense.config.js' ,
17+ ) ;
818
919const config = createConfig ( [
1020 ...base ,
@@ -221,7 +231,7 @@ const config = createConfig([
221231 } ,
222232 } ,
223233 plugins : {
224- 'better-tailwindcss' : tailwind ,
234+ 'better-tailwindcss' : betterTailwind ,
225235 } ,
226236 rules : {
227237 'better-tailwindcss/sort-classes' : 'error' ,
@@ -233,17 +243,24 @@ const config = createConfig([
233243 'packages/design-system-react-native/src/**' ,
234244 'apps/storybook-react-native/stories/**' ,
235245 ] ,
236- settings : {
237- 'better-tailwindcss' : {
238- tailwindConfig :
239- 'apps/storybook-react-native/tailwind-intellisense.config.js' ,
240- } ,
241- } ,
242246 plugins : {
243- 'better- tailwindcss' : tailwind ,
247+ tailwindcss : nativeTailwind ,
244248 } ,
245249 rules : {
246- 'better-tailwindcss/sort-classes' : 'error' ,
250+ 'tailwindcss/classnames-order' : 'error' ,
251+ 'tailwindcss/enforces-negative-arbitrary-values' : 'error' ,
252+ 'tailwindcss/enforces-shorthand' : 'error' ,
253+ 'tailwindcss/no-arbitrary-value' : 'off' , // There are legitimate reasons to use arbitrary values but we should specifically error on static colors
254+ 'tailwindcss/no-custom-classname' : 'off' , // Native includes dynamic token-driven class segments (e.g. text-${...})
255+ 'tailwindcss/no-contradicting-classname' : 'error' ,
256+ 'tailwindcss/no-unnecessary-arbitrary-value' : 'error' ,
257+ } ,
258+ settings : {
259+ tailwindcss : {
260+ callees : [ 'twClassName' , 'tw' ] ,
261+ config : NATIVE_TAILWIND_CONFIG_PATH ,
262+ tags : [ 'tw' ] , // Enable template literal support for tw`classnames`
263+ } ,
247264 } ,
248265 } ,
249266] ) ;
0 commit comments