Skip to content

Commit

Permalink
use esm in client js
Browse files Browse the repository at this point in the history
  • Loading branch information
schlawg committed Jun 20, 2023
1 parent 70ff63e commit 09b310b
Show file tree
Hide file tree
Showing 198 changed files with 1,438 additions and 1,686 deletions.
6 changes: 2 additions & 4 deletions app/controllers/Editor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,22 @@ import lila.common.Json.given

final class Editor(env: Env) extends LilaController(env):

private lazy val positionsJson = lila.common.String.html.safeJsonValue {
private lazy val positionsJson =
JsArray(chess.StartingPosition.all map { p =>
Json.obj(
"eco" -> p.eco,
"name" -> p.name,
"fen" -> p.fen
)
})
}

private lazy val endgamePositionsJson = lila.common.String.html.safeJsonValue {
private lazy val endgamePositionsJson =
JsArray(chess.EndgamePosition.positions map { p =>
Json.obj(
"name" -> p.name,
"fen" -> p.fen
)
})
}

def index = load("")

Expand Down
59 changes: 34 additions & 25 deletions app/templating/AssetHelper.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ package lila.app
package templating

import play.api.mvc.RequestHeader
import play.api.libs.json.{ Json, JsValue }

import lila.app.ui.ScalatagsTemplate.*
import lila.common.AssetVersion
import lila.common.String.html.safeJsonValue

trait AssetHelper extends HasEnv { self: I18nHelper with SecurityHelper =>

Expand Down Expand Up @@ -51,33 +53,40 @@ if (window.matchMedia('(prefers-color-scheme: dark)').media === 'not all')
document.querySelectorAll('[media="(prefers-color-scheme: dark)"]').forEach(e=>e.media='')
"""

// load scripts in <head> and always use defer
def jsAt(path: String): Frag = script(deferAttr, src := assetUrl(path))

def jsTag(name: String): Frag = jsAt(s"javascripts/$name")
// load iife scripts in <head> and defer
def iifeModule(path: String): Frag = script(deferAttr, src := assetUrl(path))

// jsModule is esm, no defer needed
def jsModule(name: String): Frag =
jsAt(s"compiled/$name${minifiedAssets so ".min"}.js")

def depsTag = jsAt("compiled/deps.min.js")

def roundTag = jsModule("round")
def roundNvuiTag(using ctx: WebContext) = ctx.blind option jsModule("round.nvui")

def analyseTag = jsModule("analysisBoard")
def analyseStudyTag = jsModule("analysisBoard.study")
def analyseNvuiTag(using ctx: WebContext) = ctx.blind option jsModule("analysisBoard.nvui")

def puzzleTag = jsModule("puzzle")
def puzzleNvuiTag(using ctx: WebContext) = ctx.blind option jsModule("puzzle.nvui")

def captchaTag = jsModule("captcha")
def infiniteScrollTag = jsModule("infiniteScroll")
def chessgroundTag = jsAt("javascripts/vendor/chessground.min.js")
def cashTag = jsAt("javascripts/vendor/cash.min.js")
def fingerprintTag = jsAt("javascripts/fipr.js")
def highchartsLatestTag = jsAt("vendor/highcharts-4.2.5/highcharts.js")
def highchartsMoreTag = jsAt("vendor/highcharts-4.2.5/highcharts-more.js")
script(tpe := "module", src := assetUrl(s"compiled/$name${minifiedAssets so ".min"}.js"))
def jsModuleInit(name: String)(using WebContext) =
frag(jsModule(name), embedJsUnsafeLoadThen(s"lichess.loadEsm('$name')"))
def jsModuleInit(name: String, text: String)(using WebContext) =
frag(jsModule(name), embedJsUnsafeLoadThen(s"lichess.loadEsm('$name',{init:$text})"))
def jsModuleInit(name: String, json: JsValue)(using WebContext): Frag =
jsModuleInit(name, safeJsonValue(json))
def jsModuleInit(name: String, text: String, nonce: lila.api.Nonce) =
frag(jsModule(name), embedJsUnsafeLoadThen(s"lichess.loadEsm('$name',{init:$text})", nonce))
def jsModuleInit(name: String, json: JsValue, nonce: lila.api.Nonce) = frag(
jsModule(name),
embedJsUnsafeLoadThen(s"lichess.loadEsm('$name',{init:${safeJsonValue(json)}})", nonce)
)
def analyseInit(mode: String, json: JsValue)(using ctx: WebContext) =
jsModuleInit("analysisBoard", Json.obj("mode" -> mode, "cfg" -> json))
def analyseStudyInit(mode: String, json: JsValue)(using ctx: WebContext) =
jsModuleInit("analysisBoard.study", Json.obj("mode" -> mode, "cfg" -> json))

def analyseNvuiTag(using ctx: WebContext) = ctx.blind option jsModule("analysisBoard.nvui")
def puzzleNvuiTag(using ctx: WebContext) = ctx.blind option jsModule("puzzle.nvui")
def roundNvuiTag(using ctx: WebContext) = ctx.blind option jsModule("round.nvui")
def infiniteScrollTag(using ctx: WebContext) = jsModuleInit("infiniteScroll", "'.infinite-scroll'")
def captchaTag = jsModule("captcha")
def depsTag = iifeModule("compiled/deps.min.js")
def chessgroundTag = iifeModule("javascripts/vendor/chessground.min.js")
def cashTag = iifeModule("javascripts/vendor/cash.min.js")
def fingerprintTag = iifeModule("javascripts/fipr.js")
def highchartsLatestTag = iifeModule("vendor/highcharts-4.2.5/highcharts.js")
def highchartsMoreTag = iifeModule("vendor/highcharts-4.2.5/highcharts-more.js")

def prismicJs(using WebContext): Frag =
raw:
Expand Down
7 changes: 1 addition & 6 deletions app/views/account/passwd.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,7 @@ object passwd:
account.layout(
title = trans.changePassword.txt(),
active = "password",
evenMoreJs = frag(
embedJsUnsafeLoadThen("""
lichess.loadModule('passwordComplexity').then(() =>
passwordComplexity.addPasswordChangeListener('form3-newPasswd1')
)""")
)
evenMoreJs = jsModuleInit("passwordComplexity", "'form3-newPasswd1'")
) {
div(cls := "account box box-pad")(
h1(cls := "box__top")(trans.changePassword()),
Expand Down
4 changes: 2 additions & 2 deletions app/views/account/twoFactor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ object twoFactor:
title = s"${me.username} - ${twoFactorAuth.txt()}",
active = "twofactor",
evenMoreJs = frag(
jsAt("javascripts/vendor/qrcode.min.js"),
jsTag("twofactor.form.js")
iifeModule("javascripts/vendor/qrcode.min.js"),
iifeModule("javascripts/twofactor.form.js")
)
) {
div(cls := "account twofactor box box-pad")(
Expand Down
8 changes: 2 additions & 6 deletions app/views/analyse/embed.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,8 @@ object embed:
div(cls := "is2d")(div(pgn)),
jsModule("lpv.embed"),
embedJsUnsafe(
s"""document.addEventListener("DOMContentLoaded",function(){LpvEmbed(document.body.firstChild.firstChild,${safeJsonValue(
Json
.obj(
"i18n" -> i18nJsObject(lpvI18n)
)
.add("orientation", orientation.map(_.name))
s"""document.addEventListener('DOMContentLoaded',function(){LpvEmbed(${safeJsonValue(
Json.obj("i18n" -> i18nJsObject(lpvI18n)).add("orientation", orientation.map(_.name))
)})})""",
config.nonce
)
Expand Down
24 changes: 12 additions & 12 deletions app/views/analyse/replay.scala
Original file line number Diff line number Diff line change
Expand Up @@ -123,19 +123,19 @@ object replay:
ctx.blind option cssTag("round.nvui")
),
moreJs = frag(
analyseTag,
analyseNvuiTag,
embedJsUnsafeLoadThen(s"""LichessAnalyse.boot(${safeJsonValue(
Json
.obj(
"data" -> data,
"i18n" -> jsI18n(),
"userId" -> ctx.userId,
"chat" -> chatJson
)
.add("hunter" -> isGranted(_.ViewBlurs)) ++
views.html.board.bits.explorerAndCevalConfig
)})""")
analyseInit(
"replay",
Json
.obj(
"data" -> data,
"i18n" -> jsI18n(),
"userId" -> ctx.userId,
"chat" -> chatJson
)
.add("hunter" -> isGranted(_.ViewBlurs)) ++
views.html.board.bits.explorerAndCevalConfig
)
),
openGraph = povOpenGraph(pov).some
)(
Expand Down
7 changes: 1 addition & 6 deletions app/views/auth/bits.scala
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,7 @@ object bits:
views.html.base.layout(
title = s"${me.username} - ${trans.changePassword.txt()}",
moreCss = cssTag("form3"),
moreJs = frag(
embedJsUnsafeLoadThen("""
lichess.loadModule('passwordComplexity').then(() =>
passwordComplexity.addPasswordChangeListener('form3-newPasswd1')
)""")
)
moreJs = jsModuleInit("passwordComplexity", "'form3-newPasswd1'")
) {
main(cls := "page-small box box-pad")(
boxTop(
Expand Down
5 changes: 1 addition & 4 deletions app/views/auth/login.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,7 @@ object login:
def apply(form: Form[?], referrer: Option[String])(using WebContext) =
views.html.base.layout(
title = trans.signIn.txt(),
moreJs = frag(
jsModule("login"),
embedJsUnsafeLoadThen("""loginSignup.loginStart()""")
),
moreJs = jsModuleInit("login", "'login'"),
moreCss = cssTag("auth"),
withHrefLangs = lila.common.LangPath(routes.Auth.login).some
) {
Expand Down
3 changes: 1 addition & 2 deletions app/views/auth/signup.scala
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ object signup:
views.html.base.layout(
title = trans.signUp.txt(),
moreJs = frag(
jsModule("login"),
embedJsUnsafeLoadThen("""loginSignup.signupStart()"""),
jsModuleInit("login", "'signup'"),
views.html.base.hcaptcha.script(form),
fingerprintTag
),
Expand Down
1 change: 1 addition & 0 deletions app/views/base/embed.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ object embed:
layout.dataAssetVersion := assetVersion.value,
layout.dataTheme := config.bg,
layout.dataPieceSet := config.pieceSet.name,
layout.dataDev,
body
)
)
Expand Down
15 changes: 6 additions & 9 deletions app/views/board/editor.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package views.html.board

import play.api.libs.json.Json
import play.api.libs.json.{ Json, JsArray }
import controllers.routes

import chess.format.Fen
Expand All @@ -14,17 +14,14 @@ object editor:

def apply(
fen: Option[Fen.Epd],
positionsJson: String,
endgamePositionsJson: String
positionsJson: JsArray,
endgamePositionsJson: JsArray
)(using WebContext) =
views.html.base.layout(
title = trans.boardEditor.txt(),
moreJs = frag(
jsModule("editor"),
embedJsUnsafeLoadThen(
s"""const data=${safeJsonValue(jsData(fen))};data.positions=$positionsJson;
data.endgamePositions=$endgamePositionsJson;LichessEditor(document.getElementById('board-editor'), data);"""
)
moreJs = jsModuleInit(
"editor",
jsData(fen) ++ Json.obj("positions" -> positionsJson, "endgamePositions" -> endgamePositionsJson)
),
moreCss = cssTag("editor"),
chessground = false,
Expand Down
22 changes: 11 additions & 11 deletions app/views/board/userAnalysis.scala
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,18 @@ object userAnalysis:
ctx.blind option cssTag("round.nvui")
),
moreJs = frag(
analyseTag,
analyseNvuiTag,
embedJsUnsafe(s"""lichess.userAnalysis=${safeJsonValue(
Json
.obj(
"data" -> data,
"i18n" -> userAnalysisI18n(withForecast = withForecast),
"wiki" -> pov.game.variant.standard
)
.add("inlinePgn", inlinePgn) ++
views.html.board.bits.explorerAndCevalConfig
)}""")
analyseInit(
"userAnalysis",
Json
.obj(
"data" -> data,
"i18n" -> userAnalysisI18n(withForecast = withForecast),
"wiki" -> pov.game.variant.standard
)
.add("inlinePgn", inlinePgn) ++
views.html.board.bits.explorerAndCevalConfig
)
),
csp = analysisCsp.withWikiBooks.some,
chessground = false,
Expand Down
18 changes: 8 additions & 10 deletions app/views/challenge/bits.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,14 @@ import controllers.routes
object bits:

def js(c: Challenge, json: JsObject, owner: Boolean, color: Option[chess.Color] = None)(using WebContext) =
frag(
jsModule("challengePage"),
embedJsUnsafeLoadThen(s"""challengePageStart(${safeJsonValue(
Json.obj(
"socketUrl" -> s"/challenge/${c.id}/socket/v$apiVersion",
"xhrUrl" -> routes.Challenge.show(c.id, color.map(_.name)).url,
"owner" -> owner,
"data" -> json
)
)})""")
jsModuleInit(
"challengePage",
Json.obj(
"socketUrl" -> s"/challenge/${c.id}/socket/v$apiVersion",
"xhrUrl" -> routes.Challenge.show(c.id, color.map(_.name)).url,
"owner" -> owner,
"data" -> json
)
)

def details(c: Challenge, requestedColor: Option[chess.Color])(using ctx: WebContext) =
Expand Down
2 changes: 1 addition & 1 deletion app/views/coach/picture.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ object picture:
def apply(c: Coach.WithUser, error: Option[String] = None)(using WebContext) =
views.html.account.layout(
title = s"${c.user.titleUsername} coach picture",
evenMoreJs = jsTag("coach.form.js"),
evenMoreJs = iifeModule("javascripts/coach.form.js"),
evenMoreCss = cssTag("coach.editor"),
active = "coach"
) {
Expand Down
9 changes: 1 addition & 8 deletions app/views/coordinate/show.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,7 @@ object show:
cssTag("coordinateTrainer"),
cssTag("voice")
),
moreJs = frag(
jsModule("coordinateTrainer"),
embedJsUnsafeLoadThen(
s"""LichessCoordinateTrainer(document.getElementById('trainer'), ${safeJsonValue(
bits.coordinateConfig(scoreOption)
)});"""
)
),
moreJs = jsModuleInit("coordinateTrainer", bits.coordinateConfig(scoreOption)),
csp = defaultCsp.withPeer.withWebAssembly.some,
openGraph = lila.app.ui
.OpenGraph(
Expand Down
8 changes: 4 additions & 4 deletions app/views/dgt.scala
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ object dgt:
)

def play(token: AccessToken)(using WebContext) =
layout("play", embedJsUnsafeLoadThen(s"""LichessDgt.playPage("${token.plain.value}")"""))(
layout("play", s"'${token.plain.value}'".some)(
div(id := "dgt-play-zone")(pre(id := "dgt-play-zone-log")),
div(cls := "dgt__play__help")(
h2(iconTag(licon.InfoCircle, "If a move is not detected")),
Expand All @@ -84,7 +84,7 @@ object dgt:
)

def config(token: Option[lila.oauth.AccessToken])(using WebContext) =
layout("config", embedJsUnsafeLoadThen("LichessDgt.configPage()"))(
layout("config")(
div(cls := "account")(
h1(cls := "box__top")("DGT - configure"),
form(action := routes.DgtCtrl.generateToken, method := "post")(
Expand Down Expand Up @@ -211,10 +211,10 @@ object dgt:
}.toList
)

private def layout(path: String, jsCall: Frag = emptyFrag)(body: Modifier*)(using WebContext) =
private def layout(path: String, token: Option[String] = None)(body: Modifier*)(using WebContext) =
views.html.base.layout(
moreCss = cssTag("dgt"),
moreJs = frag(jsModule("dgt"), jsCall),
moreJs = token.fold(jsModuleInit("dgt"))(jsModuleInit("dgt", _)),
title = "Play with a DGT board",
csp = defaultCsp.withAnyWs.some
)(
Expand Down
2 changes: 1 addition & 1 deletion app/views/event.scala
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ object event:
views.html.base.layout(
title = e.title,
moreCss = cssTag("event"),
moreJs = jsTag("event-countdown.js")
moreJs = iifeModule("javascripts/event-countdown.js")
) {
main(cls := "page-small event box box-pad")(
boxTop(
Expand Down
2 changes: 1 addition & 1 deletion app/views/game/importGame.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ object importGame:
views.html.base.layout(
title = trans.importGame.txt(),
moreCss = cssTag("importer"),
moreJs = jsTag("importer.js"),
moreJs = iifeModule("javascripts/importer.js"),
openGraph = lila.app.ui
.OpenGraph(
title = "Paste PGN chess game",
Expand Down
Loading

0 comments on commit 09b310b

Please sign in to comment.