Skip to content

Commit

Permalink
implicit conversion for laminar and scalajs-react
Browse files Browse the repository at this point in the history
  • Loading branch information
nguyenyou committed Jun 23, 2024
1 parent 7565e50 commit f511941
Show file tree
Hide file tree
Showing 12 changed files with 100 additions and 8 deletions.
5 changes: 5 additions & 0 deletions .changeset/brave-planes-push.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"scalawind": patch
---

implicit conversion for laminar and scalajs-react
8 changes: 7 additions & 1 deletion packages/scalawind/src/commands/generate.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ const initOptionsSchema = z.object({
packageName: z.string(),
previewCompliedResult: z.boolean(),
checkDuplication: z.boolean(),
checkOptimization: z.boolean()
checkOptimization: z.boolean(),
framework: z.union([z.literal("laminar"), z.literal("scalajs-react"), z.literal("both")])
})

export const generate = new Command()
Expand All @@ -41,6 +42,11 @@ export const generate = new Command()
"enable check duplication",
false
)
.option(
"-f, --framework",
"generate implicit conversion helpers for framework, can be: laminar, scalajs-react, both",
false
)
.option(
"-co, --check-optimization",
"enable check optimization",
Expand Down
16 changes: 16 additions & 0 deletions packages/scalawind/src/generate/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,26 @@ function readTemplate(filename) {
Handlebars.registerPartial({
swMacro: Handlebars.compile(readTemplate('swMacro')),
tailwind: Handlebars.compile(readTemplate('tailwind'), {noEscape: true}),
laminar: Handlebars.compile(readTemplate('laminar')),
scalajsReact: Handlebars.compile(readTemplate('scalajsReact')),
classesValidation: Handlebars.compile(readTemplate('classesValidation')),
});

const template = Handlebars.compile(readTemplate('scalawind'));

function getImplicitConversionHelpers(framework) {
switch (framework) {
case "laminar":
return { laminar: true, scalajsReact: false }
case "scalajs-react":
return { laminar: false, scalajsReact: true }
case "both":
return { laminar: true, scalajsReact: true }
default:
return { laminar: false, scalajsReact: false }
}
}

export function generateContent(options) {
const { userConfig } = options
const resolvedConfig = resolveConfig(userConfig);
Expand Down Expand Up @@ -112,6 +127,7 @@ export function generateContent(options) {
arbitrary,
opacityColors,
hasValidation,
...(getImplicitConversionHelpers(options.framework)),
...options,
})

Expand Down
14 changes: 14 additions & 0 deletions packages/scalawind/src/generate/templates/laminar.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{{#if laminar}}
import com.raquo.laminar.api.L

import scala.quoted.*

implicit inline def lw(inline tailwind: Tailwind): L.Modifier[L.HtmlElement] = {
${ lwImpl('tailwind) }
}

def lwImpl(tailwindExpr: Expr[Tailwind])(using Quotes): Expr[L.Modifier[L.HtmlElement]] = {
val value = swImpl(tailwindExpr).valueOrAbort
'{ L.cls := ${ Expr(value) } }
}
{{/if}}
12 changes: 12 additions & 0 deletions packages/scalawind/src/generate/templates/scalajsReact.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{{#if scalajsReact}}
import japgolly.scalajs.react.vdom.html_<^.*

implicit inline def cw(inline tailwind: Tailwind): TagMod = {
${ cwImpl('tailwind) }
}

def cwImpl(tailwindExpr: Expr[Tailwind])(using Quotes): Expr[TagMod] = {
val value = swImpl(tailwindExpr).valueOrAbort
'{ ^.cls := ${ Expr(value) } }
}
{{/if}}
3 changes: 2 additions & 1 deletion packages/scalawind/src/generate/templates/scalawind.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ package {{packageName}}
import scala.quoted.*
import scala.annotation.unused
import scala.language.implicitConversions

{{> laminar this }}
{{> scalajsReact this }}
{{> swMacro this }}

{{> tailwind this }}
3 changes: 1 addition & 2 deletions packages/scalawind/tests/cases/basic/basic.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,9 @@ test('basic test', () => {
userConfig: tailwindConfig,
packageName: "scalawind",
previewCompliedResult: true,
laminar: false,
scalajsReact: true,
checkDuplication: true,
checkOptimization: true,
framework: 'both',
})
const filepath = path.join(__dirname, "./expected.txt")
// utils.writeFile(filepath, actual)
Expand Down
21 changes: 21 additions & 0 deletions packages/scalawind/tests/cases/basic/expected.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,28 @@ package scalawind
import scala.quoted.*
import scala.annotation.unused
import scala.language.implicitConversions
import com.raquo.laminar.api.L

import scala.quoted.*

implicit inline def lw(inline tailwind: Tailwind): L.Modifier[L.HtmlElement] = {
${ lwImpl('tailwind) }
}

def lwImpl(tailwindExpr: Expr[Tailwind])(using Quotes): Expr[L.Modifier[L.HtmlElement]] = {
val value = swImpl(tailwindExpr).valueOrAbort
'{ L.cls := ${ Expr(value) } }
}
import japgolly.scalajs.react.vdom.html_<^.*

implicit inline def cw(inline tailwind: Tailwind): TagMod = {
${ cwImpl('tailwind) }
}

def cwImpl(tailwindExpr: Expr[Tailwind])(using Quotes): Expr[TagMod] = {
val value = swImpl(tailwindExpr).valueOrAbort
'{ ^.cls := ${ Expr(value) } }
}
extension (inline tailwind: Tailwind)
inline def css: String =
${ swImpl('tailwind) }
Expand Down
3 changes: 1 addition & 2 deletions packages/scalawind/tests/cases/daisy/daisy.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ test('daisy test', () => {
userConfig: tailwindConfig,
packageName: "scalawind",
previewCompliedResult: true,
laminar: false,
scalajsReact: true,
framework: "scalajs-react",
checkDuplication: true,
checkOptimization: true,
})
Expand Down
9 changes: 9 additions & 0 deletions packages/scalawind/tests/cases/daisy/expected.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,16 @@ package scalawind
import scala.quoted.*
import scala.annotation.unused
import scala.language.implicitConversions
import japgolly.scalajs.react.vdom.html_<^.*

implicit inline def cw(inline tailwind: Tailwind): TagMod = {
${ cwImpl('tailwind) }
}

def cwImpl(tailwindExpr: Expr[Tailwind])(using Quotes): Expr[TagMod] = {
val value = swImpl(tailwindExpr).valueOrAbort
'{ ^.cls := ${ Expr(value) } }
}
extension (inline tailwind: Tailwind)
inline def css: String =
${ swImpl('tailwind) }
Expand Down
11 changes: 11 additions & 0 deletions packages/scalawind/tests/cases/full/expected.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,18 @@ package scalawind
import scala.quoted.*
import scala.annotation.unused
import scala.language.implicitConversions
import com.raquo.laminar.api.L

import scala.quoted.*

implicit inline def lw(inline tailwind: Tailwind): L.Modifier[L.HtmlElement] = {
${ lwImpl('tailwind) }
}

def lwImpl(tailwindExpr: Expr[Tailwind])(using Quotes): Expr[L.Modifier[L.HtmlElement]] = {
val value = swImpl(tailwindExpr).valueOrAbort
'{ L.cls := ${ Expr(value) } }
}
extension (inline tailwind: Tailwind)
inline def css: String =
${ swImpl('tailwind) }
Expand Down
3 changes: 1 addition & 2 deletions packages/scalawind/tests/cases/full/full.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ test('full config test', () => {
userConfig: tailwindConfig,
packageName: "scalawind",
previewCompliedResult: true,
laminar: true,
scalajsReact: false,
framework: "laminar",
checkDuplication: false,
checkOptimization: false,
})
Expand Down

0 comments on commit f511941

Please sign in to comment.