Skip to content

Commit 5e043b1

Browse files
authored
Issue 22 fix frontend (#23)
* make feed.name optional
1 parent 4ae0f1a commit 5e043b1

35 files changed

+333
-180
lines changed

build.sbt

+19-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import xerial.sbt.Sonatype.sonatypeCentralHost
22

3-
ThisBuild / scalaVersion := "3.5.0"
3+
ThisBuild / scalaVersion := "3.6.2"
44
ThisBuild / licenses := List(("MIT", url("https://opensource.org/licenses/MIT")))
55
ThisBuild / homepage := Some(url("https://github.com/d10xa/json-log-viewer"))
66
ThisBuild / organization := "ru.d10xa"
@@ -17,6 +17,14 @@ ThisBuild / sonatypeCredentialHost := sonatypeCentralHost
1717
val circeVersion = "0.14.10"
1818
val declineVersion = "2.4.1"
1919
val fs2Version = "3.11.0"
20+
val munitVersion = "1.0.3"
21+
22+
lazy val root = project.in(file(".")).
23+
aggregate(`json-log-viewer`.js, `json-log-viewer`.jvm, `frontend-laminar`).
24+
settings(
25+
publish := {},
26+
publishLocal := {},
27+
)
2028

2129
lazy val `json-log-viewer` = crossProject(JSPlatform, JVMPlatform)
2230
.in(file("json-log-viewer"))
@@ -28,6 +36,7 @@ lazy val `json-log-viewer` = crossProject(JSPlatform, JVMPlatform)
2836
pomIncludeRepository := { _ => false },
2937
libraryDependencies ++= Seq(
3038
"org.typelevel" %%% "cats-effect" % "3.5.4",
39+
"org.typelevel" %%% "munit-cats-effect" % "2.0.0" % Test,
3140
"co.fs2" %%% "fs2-core" % fs2Version,
3241
"co.fs2" %%% "fs2-io" % fs2Version,
3342
"com.monovore" %%% "decline" % declineVersion,
@@ -36,20 +45,22 @@ lazy val `json-log-viewer` = crossProject(JSPlatform, JVMPlatform)
3645
"io.circe" %%% "circe-literal" % circeVersion % Test,
3746
"io.circe" %%% "circe-parser" % circeVersion,
3847
"io.circe" %%% "circe-generic" % circeVersion,
39-
"io.circe" %%% "circe-yaml-scalayaml" % "0.16.0",
4048
"com.lihaoyi" %%% "fansi" % "0.5.0",
4149
"org.scala-lang.modules" %%% "scala-parser-combinators" % "2.4.0",
42-
"org.scalameta" %% "munit" % "0.7.29" % Test
50+
"org.scalameta" %%% "munit" % munitVersion % Test
4351
),
4452
fork := true,
4553
run / connectInput := true,
4654
)
4755
.jvmSettings(
56+
libraryDependencies ++= Seq(
57+
"io.circe" %%% "circe-yaml-scalayaml" % "0.16.0"
58+
),
4859
publish / skip := false
4960
)
5061
.jsSettings(
5162
publish / skip := true,
52-
fork := false,
63+
fork := false
5364
)
5465

5566
lazy val `make-logs` = project
@@ -77,12 +88,13 @@ lazy val `frontend-laminar` = project
7788
"com.raquo" %%% "airstream" % "16.0.0",
7889
"com.raquo" %%% "waypoint" % "7.0.0",
7990
"com.github.plokhotnyuk.jsoniter-scala" %%% "jsoniter-scala-core" % "2.28.4",
80-
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.28.4" % "provided"
91+
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.28.4" % "provided",
92+
"org.scalameta" %% "munit" % munitVersion % Test
8193
),
8294
Compile / fastLinkJS / scalaJSLinkerConfig ~= { _.withSourceMap(true) },
8395
Compile / fullLinkJS / scalaJSLinkerConfig ~= { _.withSourceMap(true) },
8496
scalaJSLinkerConfig ~= { _.withModuleKind(ModuleKind.CommonJSModule) },
97+
8598
scalaJSUseMainModuleInitializer := true,
86-
(Test / requireJsDomEnv) := true,
87-
useYarn := true
99+
(Test / requireJsDomEnv) := true
88100
)

frontend-laminar/src/main/resources/index-fastopt.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<link rel="stylesheet" href="./app.css">
88
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
99
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
10-
<script type="text/javascript" src="../../../target/scala-3.5.0/frontend-laminar-fastopt/main.js"></script>
10+
<script type="text/javascript" src="../../../target/scala-3.6.2/frontend-laminar-fastopt/main.js"></script>
1111
</head>
1212
<body>
1313
<div id="app-container"></div>

frontend-laminar/src/main/resources/index-fullopt.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<title>[FULL] json-log-viewer</title>
66
<link rel="stylesheet" href="./app.css">
77
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
8-
<script type="text/javascript" src="../../../target/scala-3.5.0/frontend-laminar-opt/main.js"></script>
8+
<script type="text/javascript" src="../../../target/scala-3.6.2/frontend-laminar-opt/main.js"></script>
99
</head>
1010
<body>
1111
<div id="app-container"></div>

frontend-laminar/src/main/scala/ViewElement.scala

-62
This file was deleted.

frontend-laminar/src/main/scala/Ansi2HtmlWithClasses.scala renamed to frontend-laminar/src/main/scala/ru/d10xa/jsonlogviewer/Ansi2HtmlWithClasses.scala

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
package ru.d10xa.jsonlogviewer
2+
13
import fansi.ErrorMode
24
import fansi.Str
35

@@ -6,7 +8,7 @@ import scala.scalajs.js.annotation.JSExport
68
/** https://github.com/com-lihaoyi/fansi/issues/62
79
*/
810
object Ansi2HtmlWithClasses extends Function1[String, String]:
9-
private def transition(from: fansi.Attr, to: fansi.Attr) =
11+
def transition(from: fansi.Attr, to: fansi.Attr): String =
1012
import fansi.*
1113
(from, to) match
1214
case (Underlined.Off, Underlined.On) => "<u>"

frontend-laminar/src/main/scala/App.scala renamed to frontend-laminar/src/main/scala/ru/d10xa/jsonlogviewer/App.scala

+24-11
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
1-
import Router0.*
1+
package ru.d10xa.jsonlogviewer
2+
23
import com.monovore.decline.Help
3-
import com.raquo.laminar.DomApi
44
import com.raquo.laminar.api.L
55
import com.raquo.laminar.api.L.*
66
import com.raquo.laminar.nodes.ReactiveHtmlElement
77
import com.raquo.waypoint.*
8-
import fansi.ErrorMode
98
import org.scalajs.dom
109
import org.scalajs.dom.HTMLButtonElement
1110
import org.scalajs.dom.HTMLDivElement
11+
import ru.d10xa.jsonlogviewer.Router0.*
12+
import ru.d10xa.jsonlogviewer.Router0.EditPage
13+
import ru.d10xa.jsonlogviewer.Router0.HelpPage
14+
import ru.d10xa.jsonlogviewer.Router0.LivePage
15+
import ru.d10xa.jsonlogviewer.Router0.Page
16+
import ru.d10xa.jsonlogviewer.Router0.ViewPage
17+
import ru.d10xa.jsonlogviewer.Router0.navigateTo
18+
import ru.d10xa.jsonlogviewer.decline.Config
1219
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn
13-
import ru.d10xa.jsonlogviewer.decline.Config.FormatOut
1420
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn.Json
1521
import ru.d10xa.jsonlogviewer.decline.Config.FormatIn.Logfmt
16-
import ru.d10xa.jsonlogviewer.decline.Config
17-
import ru.d10xa.jsonlogviewer.decline.Config
22+
import ru.d10xa.jsonlogviewer.decline.Config.FormatOut
1823
import ru.d10xa.jsonlogviewer.decline.DeclineOpts
1924
import ru.d10xa.jsonlogviewer.query.QueryCompiler
2025

@@ -50,7 +55,7 @@ object App {
5055
val formatInVar: Var[FormatIn] = Var(
5156
FormatIn.Json
5257
)
53-
val formatOutVar: Var[FormatOut] = Var(
58+
val formatOutVar: Var[FormatOut] = Var(
5459
FormatOut.Pretty
5560
)
5661

@@ -71,7 +76,13 @@ object App {
7176
case Right(value) => Some(value)
7277
} yield DeclineOpts.command
7378
.parse(splitArgs(cli))
74-
.map(cfg => cfg.copy(filter = filter, formatIn = Some(formatIn), formatOut = Some(formatOut)))
79+
.map(cfg =>
80+
cfg.copy(
81+
filter = filter,
82+
formatIn = Some(formatIn),
83+
formatOut = Some(formatOut)
84+
)
85+
)
7586

7687
def main(args: Array[String]): Unit = {
7788
lazy val container = dom.document.getElementById("app-container")
@@ -135,11 +146,11 @@ object App {
135146
select(
136147
cls := "col-1",
137148
value <-- formatOutVar.signal.map {
138-
case FormatOut.Raw => "raw"
149+
case FormatOut.Raw => "raw"
139150
case FormatOut.Pretty => "pretty"
140151
},
141152
onChange.mapToValue.map {
142-
case "raw" => FormatOut.Raw
153+
case "raw" => FormatOut.Raw
143154
case "pretty" => FormatOut.Pretty
144155
} --> formatOutVar,
145156
option(value := "pretty", "pretty"),
@@ -158,7 +169,7 @@ object App {
158169
onInput.mapToValue --> filterVar
159170
)
160171
)
161-
)
172+
)
162173

163174
def additionalArgsDiv: ReactiveHtmlElement[HTMLDivElement] = div(
164175
cls := "row-fluid",
@@ -193,6 +204,7 @@ object App {
193204
}
194205
)
195206
private def renderLivePage(): HtmlElement = {
207+
implicit val owner: Owner = new Owner {}
196208
div(
197209
formatInDiv,
198210
formatOutDiv,
@@ -205,6 +217,7 @@ object App {
205217
}
206218

207219
private def renderViewPage(): HtmlElement = {
220+
implicit val owner: Owner = new Owner {}
208221
div(
209222
ViewElement.render(textVar.signal, configSignal)
210223
)

frontend-laminar/src/main/scala/EditElement.scala renamed to frontend-laminar/src/main/scala/ru/d10xa/jsonlogviewer/EditElement.scala

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
import com.raquo.laminar.api.L.{*, given}
1+
package ru.d10xa.jsonlogviewer
2+
23
import com.raquo.laminar.api.L
4+
import com.raquo.laminar.api.L.*
35
object EditElement {
46

57
def render(mods: Modifier[TextArea]*): HtmlElement =

frontend-laminar/src/main/scala/Router0.scala renamed to frontend-laminar/src/main/scala/ru/d10xa/jsonlogviewer/Router0.scala

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import com.raquo.laminar.api.L.{*, given}
2-
import com.raquo.waypoint.*
3-
import org.scalajs.dom
1+
package ru.d10xa.jsonlogviewer
2+
43
import com.github.plokhotnyuk.jsoniter_scala.core.*
54
import com.github.plokhotnyuk.jsoniter_scala.macros.*
5+
import com.raquo.laminar.api.L.*
6+
import com.raquo.waypoint.*
7+
import org.scalajs.dom
68

79
object Router0 {
810

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package ru.d10xa.jsonlogviewer
2+
3+
import cats.effect.IO
4+
import cats.effect.unsafe.implicits.global
5+
import com.monovore.decline.Help
6+
import com.raquo.airstream.core.Signal
7+
import com.raquo.airstream.eventbus.EventBus
8+
import com.raquo.airstream.ownership.Owner
9+
import com.raquo.laminar.DomApi
10+
import com.raquo.laminar.api.L.*
11+
import ru.d10xa.jsonlogviewer.decline.Config
12+
import ru.d10xa.jsonlogviewer.decline.yaml.ConfigYaml
13+
import ru.d10xa.jsonlogviewer.decline.yaml.Feed
14+
15+
import scala.util.chaining.*
16+
17+
object ViewElement {
18+
19+
def stringsToHtmlElement(strings: List[String]): HtmlElement =
20+
strings
21+
.map(Ansi2HtmlWithClasses.apply)
22+
.mkString("<div>", "", "</div>")
23+
.pipe(DomApi.unsafeParseHtmlString)
24+
.pipe(foreignHtmlElement)
25+
26+
def modifyConfigForInlineInput(string: String, config: Config): Config =
27+
config.copy(configYaml =
28+
Some(
29+
ConfigYaml(
30+
filter = None,
31+
formatIn = None,
32+
commands = None,
33+
feeds = Some(
34+
List(
35+
Feed(
36+
name = None,
37+
commands = List.empty,
38+
inlineInput = Some(string),
39+
filter = config.filter,
40+
formatIn = config.formatIn
41+
)
42+
)
43+
)
44+
)
45+
)
46+
)
47+
48+
def render(
49+
logLinesSignal: Signal[String],
50+
configSignal: Signal[Either[Help, Config]]
51+
)(implicit owner: Owner): HtmlElement = {
52+
val eventBus = new EventBus[HtmlElement]
53+
logLinesSignal
54+
.combineWith(configSignal)
55+
.foreach {
56+
case (string, Right(c)) =>
57+
LogViewerStream
58+
.stream(modifyConfigForInlineInput(string, c))
59+
.compile
60+
.toList
61+
.map(stringsToHtmlElement)
62+
.flatMap(e => IO(eventBus.writer.onNext(e)))
63+
.unsafeRunAndForget()
64+
65+
case (_, Left(help)) =>
66+
eventBus.writer.onNext(pre(cls := "text-light", help.toString))
67+
}(owner)
68+
69+
pre(
70+
cls := "bg-dark font-monospace text-white",
71+
child <-- eventBus.events
72+
)
73+
}
74+
}

0 commit comments

Comments
 (0)