Skip to content

Commit

Permalink
Fix(ESLint): Missing multi-configuration handling in monorepo
Browse files Browse the repository at this point in the history
  • Loading branch information
1aron committed Apr 26, 2024
1 parent 04b23e1 commit 67ffcca
Show file tree
Hide file tree
Showing 12 changed files with 71 additions and 104 deletions.
35 changes: 29 additions & 6 deletions packages/eslint-plugin/src/functions/filter-collision-classes.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,30 @@
import { createSyncFn } from 'synckit'
import runFilterCollisionClasses from './filter-collision-classes.worker'
import { join } from 'path'
import { generateValidRules } from '@master/css-validator'
import { MasterCSS, Rule, areRuleStatesEqual, areRulesDuplicated } from '@master/css'

export default process.env.NODE_ENV === 'test'
? runFilterCollisionClasses
: createSyncFn(join(__dirname, 'filter-collision-classes.worker.cjs')) as typeof runFilterCollisionClasses
export default function filterCollisionClasses(classNames: string[], css: MasterCSS): Record<string, string[]> {
const validRules = classNames
.map(eachClassName => generateValidRules(eachClassName, css)[0])
.filter(Boolean) as Rule[]
const collisionClassesRecord: Record<string, string[]> = {}
for (let i = 0; i < classNames.length; i++) {
const className = classNames[i]
const rule = validRules.find((eachValidRule) => eachValidRule.className === className)
const collisionClasses = []
if (rule) {
for (let j = 0; j < classNames.length; j++) {
const compareClassName = classNames[j]
const compareRule = validRules.find((eachValidRule) => eachValidRule.className === compareClassName)
if (i !== j && compareRule
&& areRulesDuplicated(rule, compareRule)
&& areRuleStatesEqual(rule, compareRule)
) {
collisionClasses.push(compareClassName)
}
}
if (collisionClasses.length > 0) {
collisionClassesRecord[className] = collisionClasses
}
}
}
return collisionClassesRecord
}

This file was deleted.

13 changes: 0 additions & 13 deletions packages/eslint-plugin/src/functions/get-css.ts

This file was deleted.

7 changes: 0 additions & 7 deletions packages/eslint-plugin/src/functions/reorder-valid-classes.ts

This file was deleted.

This file was deleted.

7 changes: 0 additions & 7 deletions packages/eslint-plugin/src/functions/validate.ts

This file was deleted.

10 changes: 0 additions & 10 deletions packages/eslint-plugin/src/functions/validate.worker.ts

This file was deleted.

5 changes: 3 additions & 2 deletions packages/eslint-plugin/src/rules/class-collision.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export default createRule({
},
defaultOptions: [],
create(context) {
const { options, settings } = resolveContext(context)
const { settings, css } = resolveContext(context)
const visitNode = (node, arg = null) => {
parseNodeRecursive(
node,
Expand All @@ -32,7 +32,8 @@ export default createRule({
const sourceCodeLines = sourceCode.lines
const nodeStartLine = node.loc.start.line
const nodeEndLine = node.loc.end.line
const collisionClassesRecord = filterCollisionClasses(classNames, settings.config)
// todo css
const collisionClassesRecord = filterCollisionClasses(classNames, css)
for (const className in collisionClassesRecord) {
const collisionClasses = collisionClassesRecord[className]
const collisionClassNamesMsg = collisionClasses.map(x => `"${x}"`).join(' and ')
Expand Down
7 changes: 4 additions & 3 deletions packages/eslint-plugin/src/rules/class-order.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import extractValueFromNode from '../utils/extract-value-from-node'
import extractRangeFromNode from '../utils/extract-range-from-node'
import extractClassnamesFromValue from '../utils/extract-classnames-from-value'
import findLoc from '../utils/find-loc'
import reorderValidClasses from '../functions/reorder-valid-classes'
import createRule from '../create-rule'
import settingsSchema from '../settings-schema'
import { reorderForReadableClasses } from '@master/css'

export default createRule({
name: 'consistent-class-order',
Expand All @@ -28,7 +28,7 @@ export default createRule({
},
defaultOptions: [],
create: function (context) {
const { options, settings } = resolveContext(context)
const { settings, css } = resolveContext(context)
const sourceCode = context.sourceCode
const visitNode = (node: any, arg = null) => {
let originalClassNamesValue = null
Expand Down Expand Up @@ -130,7 +130,8 @@ export default createRule({
return
}

let orderedClassNames = reorderValidClasses(classNames, settings.config)
let orderedClassNames = reorderForReadableClasses(classNames, css)
.filter((eachOrderedClassName) => classNames.includes(eachOrderedClassName))

orderedClassNames = classNames.filter(x => !orderedClassNames.includes(x))
.concat(orderedClassNames)
Expand Down
6 changes: 3 additions & 3 deletions packages/eslint-plugin/src/rules/class-validation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import defineVisitors from '../utils/define-visitors'
import resolveContext from '../utils/resolve-context'
import findLoc from '../utils/find-loc'
import { parseNodeRecursive } from '../utils/parse-node-recursive'
import validate from '../functions/validate'
import createRule from '../create-rule'
import settingsSchema from '../settings-schema'
import { validate } from '@master/css-validator'

export default createRule({
name: 'syntax-error-checks',
Expand All @@ -23,7 +23,7 @@ export default createRule({
},
defaultOptions: [],
create: function (context) {
const { options, settings } = resolveContext(context)
const { options, settings, css } = resolveContext(context)
const visitNode = (node, arg = null) => {
parseNodeRecursive(
node,
Expand All @@ -34,7 +34,7 @@ export default createRule({
const nodeStartLine = node.loc.start.line
const nodeEndLine = node.loc.end.line
for (const className of classNames) {
const { matched, errors } = validate(className, settings.config)
const { matched, errors } = validate(className, css)
if (errors.length > 0) {
for (const error of errors) {
if (matched) {
Expand Down
31 changes: 28 additions & 3 deletions packages/eslint-plugin/src/utils/resolve-context.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,35 @@
import type { RuleContext } from '@typescript-eslint/utils/ts-eslint'
import settings from '../settings'
import settings, { Settings } from '../settings'
import exploreConfig from '@master/css-explore-config'
import { Config, MasterCSS } from '@master/css'

declare type CSSCache = {
cwd: string
settings: Settings,
css: MasterCSS,
}

const cssCaches: CSSCache[] = []

export default function resolveContext(context: RuleContext<any, any[]>) {
const resolvedSettings = Object.assign(settings, context.settings?.['@master/css'])
const resolvedSettings = Object.assign({}, settings, context.settings?.['@master/css'])
let css = cssCaches.find(cache => cache.settings.config === resolvedSettings.config &&
cache.cwd === context.cwd)?.css

if (!css) {
let config: Config
if (typeof resolvedSettings.config === 'object') {
config = resolvedSettings.config
} else {
config = exploreConfig({ name: resolvedSettings.config, found: undefined })
}
css = new MasterCSS(config)
cssCaches.push({ cwd: context.cwd, settings: resolvedSettings, css })
}

return {
settings: resolvedSettings,
options: context.options[0] || {}
options: context.options[0] || {},
css
}
}
8 changes: 4 additions & 4 deletions packages/eslint-plugin/tests/validation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ new RuleTester({
{
disallowUnknownClass: true
}
]
] as any
},
{
code: `<div class="bg:black m:mistake rrr">Simple, basic</div>`,
Expand All @@ -51,7 +51,7 @@ new RuleTester({
{
disallowUnknownClass: true
}
]
] as any
},
{
code: `<div class="a c d hello:world font:error mt:0 mt:0@sm">Error class</div>`,
Expand Down Expand Up @@ -91,7 +91,7 @@ new RuleTester({
{
disallowUnknownClass: true
}
]
] as any
},
{
code: `<div class="btn a c d hello:world font:error mt:0 mt:0@sm">Error class</div>`,
Expand All @@ -106,7 +106,7 @@ new RuleTester({
{
disallowUnknownClass: true
}
]
] as any
},
],
})

0 comments on commit 67ffcca

Please sign in to comment.