diff --git a/.changeset/quick-hotels-attend.md b/.changeset/quick-hotels-attend.md new file mode 100644 index 0000000..714a96f --- /dev/null +++ b/.changeset/quick-hotels-attend.md @@ -0,0 +1,5 @@ +--- +"scalawind": patch +--- + +separate check flags for duplication and optimization diff --git a/README.md b/README.md index 1ee5adf..680356b 100644 --- a/README.md +++ b/README.md @@ -258,14 +258,18 @@ val styles = "text-black bg-white hover:text-white hover:bg-black" ## Classes Validation -Passing the flag `-cv` or `--classes-validation` to enable this feature. - ### Check Duplication + +Passing the flag `-cd` or `--check-duplication` to enable this feature. + When writing a long list of utility classes, it's sometime necessary to check if we accidentally duplicate our class, with class validation feature enabled, we check it for you: Screenshot 2024-06-08 at 13 41 44 ### Usage Optimization + +Passing the flag `-co` or `--check-optimization` to enable this feature. + In Tailwind, we have `margin` and `padding` classes that can be used in three different fashions: - One-direction: `mt-2`, `mb-2`, `ml-2` and `mr-2` diff --git a/integration/package.json b/integration/package.json index aa499e3..12b7424 100644 --- a/integration/package.json +++ b/integration/package.json @@ -2,7 +2,7 @@ "name": "integration-test", "type": "module", "scripts": { - "generate": "scalawind generate --classes-validation -pcr -o ./src/scalawind.scala", + "generate": "scalawind generate --check-duplication --check-optimization -pcr -o ./src/scalawind.scala", "test:scala": "scala-cli test src --test-only 'tests.only*'" }, "dependencies": { diff --git a/packages/scalawind/src/commands/generate.js b/packages/scalawind/src/commands/generate.js index f33ca4b..371934b 100644 --- a/packages/scalawind/src/commands/generate.js +++ b/packages/scalawind/src/commands/generate.js @@ -16,7 +16,8 @@ const initOptionsSchema = z.object({ previewCompliedResult: z.boolean(), laminar: z.boolean(), scalajsReact: z.boolean(), - classesValidation: z.boolean() + checkDuplication: z.boolean(), + checkOptimization: z.boolean() }) export const generate = new Command() @@ -38,8 +39,13 @@ export const generate = new Command() false ) .option( - "-cv, --classes-validation", - "enable classes validation", + "-cd, --check-duplication", + "enable check duplication", + false + ) + .option( + "-co, --check-optimization", + "enable check optimization", false ) .option( diff --git a/packages/scalawind/src/generate/index.js b/packages/scalawind/src/generate/index.js index fe252a2..dc3345e 100644 --- a/packages/scalawind/src/generate/index.js +++ b/packages/scalawind/src/generate/index.js @@ -105,11 +105,14 @@ export function generateContent(options) { return ({ name: mod, value: mod}) }) + const hasValidation = options.checkDuplication || options.checkOptimization + const generatedScalawind = template({ modifiers, standard, arbitrary, opacityColors, + hasValidation, ...options, }) diff --git a/packages/scalawind/src/generate/templates/classesValidation.hbs b/packages/scalawind/src/generate/templates/classesValidation.hbs index 4aab568..d33ff62 100644 --- a/packages/scalawind/src/generate/templates/classesValidation.hbs +++ b/packages/scalawind/src/generate/templates/classesValidation.hbs @@ -1,17 +1,23 @@ -{{#if classesValidation}} def validate(classes: List[String]): Unit = { + {{#if checkDuplication}} checkDuplication(classes) + {{/if}} + {{#if checkOptimization}} val optimizationSuggestions = checkOptimization(classes) if optimizationSuggestions.nonEmpty then report.errorAndAbort(s"[Optimization] ${optimizationSuggestions.mkString(", ")}") + {{/if}} } +{{#if checkDuplication}} def checkDuplication(classes: List[String]): Unit = { val duplicates = classes.groupBy(identity).collect { case (x, List(_, _, _*)) => x } if duplicates.nonEmpty then report.errorAndAbort(s"[Duplication] ${duplicates.mkString(", ")}") } +{{/if}} +{{#if checkOptimization}} def checkOptimization(classes: List[String]): List[String] = { val properties = List("p", "m") diff --git a/packages/scalawind/src/generate/templates/swMacro.hbs b/packages/scalawind/src/generate/templates/swMacro.hbs index dda4bca..7fe2756 100644 --- a/packages/scalawind/src/generate/templates/swMacro.hbs +++ b/packages/scalawind/src/generate/templates/swMacro.hbs @@ -8,7 +8,9 @@ def methodNameToTailwindClass(rawName: String) = { def swImpl(tailwindExpr: Expr[Tailwind])(using Quotes): Expr[String] = { import quotes.reflect.* + {{#if hasValidation}} {{> classesValidation this }} + {{/if}} def extractClassNames(term: Term, prefix: String = "", important: Boolean = false): List[String] = { var stack = List((term, prefix, important)) @@ -79,7 +81,7 @@ def swImpl(tailwindExpr: Expr[Tailwind])(using Quotes): Expr[String] = { val term = tailwindExpr.asTerm val classList = extractClassNames(term).reverse - {{#if classesValidation}} + {{#if hasValidation}} validate(classList) {{/if}} val combinedClasses = classList.mkString(" ") diff --git a/packages/scalawind/tests/cases/basic/basic.test.js b/packages/scalawind/tests/cases/basic/basic.test.js index 84ac46f..0d8f90b 100644 --- a/packages/scalawind/tests/cases/basic/basic.test.js +++ b/packages/scalawind/tests/cases/basic/basic.test.js @@ -11,7 +11,8 @@ test('basic test', () => { previewCompliedResult: true, laminar: false, scalajsReact: true, - classesValidation: true + checkDuplication: true, + checkOptimization: true, }) const filepath = path.join(__dirname, "./expected.txt") // utils.writeFile(filepath, actual) diff --git a/packages/scalawind/tests/cases/full/full.test.js b/packages/scalawind/tests/cases/full/full.test.js index d0a1fe0..34043b6 100644 --- a/packages/scalawind/tests/cases/full/full.test.js +++ b/packages/scalawind/tests/cases/full/full.test.js @@ -11,6 +11,8 @@ test('full config test', () => { previewCompliedResult: true, laminar: true, scalajsReact: false, + checkDuplication: false, + checkOptimization: false, }) const filepath = path.join(__dirname, "./expected.txt") // utils.writeFile(filepath, actual)