Skip to content

Commit e5d23de

Browse files
authored
Merge pull request #260 from HapticX/dev
Fix bugs
2 parents bb6f7c9 + 29074e1 commit e5d23de

File tree

7 files changed

+137
-90
lines changed

7 files changed

+137
-90
lines changed

src/happyx.nim

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ when not defined(js):
302302
import
303303
happyx/core/[exceptions, constants, queries],
304304
happyx/sugar/[use, sgr, js, style],
305-
happyx/spa/[renderer, state, components, translatable, tag],
305+
happyx/spa/[renderer, state, components, translatable, tag, spa_utils],
306306
happyx/tmpl_engine/[engine],
307307
happyx/routing/[mounting, routing, decorators],
308308
happyx/ssr/utils
@@ -329,7 +329,8 @@ export
329329
mounting,
330330
sgr,
331331
js,
332-
utils
332+
utils,
333+
spa_utils
333334

334335

335336
# Language bindings

src/happyx/private/macro_utils.nim

Lines changed: 84 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -882,18 +882,40 @@ proc buildHtmlProcedure*(root, body: NimNode, inComponent: bool = false,
882882
cycleVar = " + " & cycleTmpVar & ")}"
883883
registerEvent = fmt"registerEventScoped{uniqueId.value}{uniqueId.value+2}"
884884
callRegister = newCall(registerEvent)
885-
var procParams = @[ident"ComponentEventHandler"]
885+
when defined(js):
886+
var procParams: seq[string] = @[]
887+
else:
888+
var procParams = @[ident"ComponentEventHandler"]
886889
for i in cycleVars:
887-
procParams.add(newIdentDefs(i, ident"auto"))
890+
when defined(js):
891+
procParams.add("`" & $i & "`")
892+
else:
893+
procParams.add(newIdentDefs(i, ident"auto"))
888894
callRegister.add(i)
889895
when defined(js):
890-
events.add(
891-
newCall(
892-
"addEventListener",
893-
newDotExpr(ident("__el" & $elemEventId), ident"Element"),
894-
newLit(event), procedure
896+
procedure.body.insert(0, newNimNode(nnkPragma).add(
897+
newNimNode(nnkExprColonExpr).add(
898+
ident"emit", newLit("`" & $args[^1][0] & "` = event;")
895899
)
896-
)
900+
))
901+
procedure.body.insert(0, newNimNode(nnkVarSection).add(
902+
newIdentDefs(args[^1][0], ident"Event", newEmptyNode())
903+
))
904+
events.add(newStmtList(
905+
newNimNode(nnkPragma).add(
906+
newNimNode(nnkExprColonExpr).add(
907+
ident"emit", newLit("const __elSc" & $elemEventId & " = (" & procParams.join(",") & ") => {")
908+
)
909+
),
910+
newCall(
911+
"eventListener", ident("__el" & $elemEventId), newLit(event), procedure.body
912+
),
913+
newNimNode(nnkPragma).add(
914+
newNimNode(nnkExprColonExpr).add(
915+
ident"emit", newLit("};\n__elSc" & $elemEventId & "(" & procParams.join(",") & ");")
916+
)
917+
),
918+
))
897919
else:
898920
result.addAttribute(
899921
newLit(evname),
@@ -921,12 +943,19 @@ proc buildHtmlProcedure*(root, body: NimNode, inComponent: bool = false,
921943
# In component and not in cycle
922944
else:
923945
when defined(js):
924-
events.add(
925-
newCall(
926-
"addEventListener",
927-
newDotExpr(ident("__el" & $elemEventId), ident"Element"),
928-
newLit(event), procedure
946+
procedure.body.insert(0, newNimNode(nnkPragma).add(
947+
newNimNode(nnkExprColonExpr).add(
948+
ident"emit", newLit("`" & $args[^1][0] & "` = event;")
929949
)
950+
))
951+
procedure.body.insert(0, newNimNode(nnkVarSection).add(
952+
newIdentDefs(args[^1][0], ident"Event", newEmptyNode())
953+
))
954+
events.add(
955+
newCall("eventListener", ident("__el" & $elemEventId), newLit(event),
956+
newNimNode(nnkBlockStmt).add(
957+
newEmptyNode(), procedure.body
958+
))
930959
)
931960
else:
932961
result.addAttribute(
@@ -953,18 +982,40 @@ proc buildHtmlProcedure*(root, body: NimNode, inComponent: bool = false,
953982
cycleVar = " + " & cycleTmpVar & ")}"
954983
registerEvent = fmt"registerEventScoped{uniqueId.value}{uniqueId.value+2}"
955984
callRegister = newCall(registerEvent)
956-
var procParams = @[ident"AppEventHandler"]
985+
when defined(js):
986+
var procParams: seq[string] = @[]
987+
else:
988+
var procParams = @[ident"AppEventHandler"]
957989
for i in cycleVars:
958-
procParams.add(newIdentDefs(i, ident"any"))
990+
when defined(js):
991+
procParams.add("`" & $i & "`")
992+
else:
993+
procParams.add(newIdentDefs(i, ident"auto"))
959994
callRegister.add(i)
960995
when defined(js):
961-
events.add(
962-
newCall(
963-
"addEventListener",
964-
newDotExpr(ident("__el" & $elemEventId), ident"Element"),
965-
newLit(event), procedure
996+
procedure.body.insert(0, newNimNode(nnkPragma).add(
997+
newNimNode(nnkExprColonExpr).add(
998+
ident"emit", newLit("`" & $args[^1][0] & "` = event;")
966999
)
967-
)
1000+
))
1001+
procedure.body.insert(0, newNimNode(nnkVarSection).add(
1002+
newIdentDefs(args[^1][0], ident"Event", newEmptyNode())
1003+
))
1004+
events.add(newStmtList(
1005+
newNimNode(nnkPragma).add(
1006+
newNimNode(nnkExprColonExpr).add(
1007+
ident"emit", newLit("const __elSc" & $elemEventId & " = (" & procParams.join(",") & ") => {")
1008+
)
1009+
),
1010+
newCall(
1011+
"eventListener", ident("__el" & $elemEventId), newLit(event), procedure.body
1012+
),
1013+
newNimNode(nnkPragma).add(
1014+
newNimNode(nnkExprColonExpr).add(
1015+
ident"emit", newLit("};\n__elSc" & $elemEventId & "(" & procParams.join(",") & ");")
1016+
)
1017+
),
1018+
))
9681019
else:
9691020
result.addAttribute(
9701021
newLit(evname),
@@ -989,12 +1040,19 @@ proc buildHtmlProcedure*(root, body: NimNode, inComponent: bool = false,
9891040
# not in component and not in cycle
9901041
else:
9911042
when defined(js):
992-
events.add(
993-
newCall(
994-
"addEventListener",
995-
newDotExpr(ident("__el" & $elemEventId), ident"Element"),
996-
newLit(event), procedure
1043+
procedure.body.insert(0, newNimNode(nnkPragma).add(
1044+
newNimNode(nnkExprColonExpr).add(
1045+
ident"emit", newLit("`" & $args[^1][0] & "` = event;")
9971046
)
1047+
))
1048+
procedure.body.insert(0, newNimNode(nnkVarSection).add(
1049+
newIdentDefs(args[^1][0], ident"Event", newEmptyNode())
1050+
))
1051+
events.add(
1052+
newCall("eventListener", ident("__el" & $elemEventId), newLit(event),
1053+
newNimNode(nnkBlockStmt).add(
1054+
newEmptyNode(), procedure.body
1055+
))
9981056
)
9991057
else:
10001058
result.addAttribute(

src/happyx/routing/routing.nim

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,13 @@ elif exportJvm:
3333
../bindings/java_types
3434

3535

36-
const declaredPathParams = CacheTable"HappyXDeclaredPathParams"
36+
const
37+
declaredPathParams = CacheTable"HappyXDeclaredPathParams"
38+
onException* = CacheTable"HappyXOnException"
39+
40+
41+
static:
42+
onException["e"] = newStmtList()
3743

3844

3945
type
@@ -520,7 +526,7 @@ proc exportRouteArgs*(urlPath, routePath, body: NimNode): NimNode =
520526
newCall("echo", newCall("fmt", newLit"json parse error: {getCurrentExceptionMsg()}"))
521527
else:
522528
newEmptyNode(),
523-
newCall("__onException", urlPath, body, newCall"getCurrentException"),
529+
onException["e"],
524530
newCall(
525531
"answerJson",
526532
ident"req",
@@ -537,7 +543,7 @@ proc exportRouteArgs*(urlPath, routePath, body: NimNode): NimNode =
537543
newCall("echo", newCall("fmt", newLit"json kind error: {getCurrentExceptionMsg()}"))
538544
else:
539545
newEmptyNode(),
540-
newCall("__onException", urlPath, body, newCall"getCurrentException"),
546+
onException["e"],
541547
newCall(
542548
"answerJson",
543549
ident"req",
@@ -554,7 +560,7 @@ proc exportRouteArgs*(urlPath, routePath, body: NimNode): NimNode =
554560
newCall("echo", newCall("fmt", newLit"json unknown error: {getCurrentExceptionMsg()}"))
555561
else:
556562
newEmptyNode(),
557-
newCall("__onException", urlPath, body, newCall"getCurrentException"),
563+
onException["e"],
558564
newCall(
559565
"answerJson",
560566
ident"req",

src/happyx/spa/spa_utils.nim

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import
2+
std/macros
3+
4+
5+
macro eventListener*(obj: untyped, event: string, body: untyped): untyped =
6+
newStmtList(
7+
newNimNode(nnkPragma).add(
8+
newNimNode(nnkExprColonExpr).add(
9+
ident"emit",
10+
newLit("`" & $obj & "`.addEventListener('" & $event & "', (event) => {")
11+
)
12+
),
13+
body,
14+
newNimNode(nnkPragma).add(
15+
newNimNode(nnkExprColonExpr).add(
16+
ident"emit", newLit("});")
17+
)
18+
),
19+
)

src/happyx/ssr/server.nim

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,6 @@ macro routes*(server: Server, body: untyped = newStmtList()): untyped =
749749
stmtList = newStmtList()
750750
staticDirs: seq[NimNode]
751751
notFoundNode = newEmptyNode()
752-
onException = newStmtList()
753752
procStmt = newProc(
754753
ident"handleRequest",
755754
[
@@ -1497,7 +1496,9 @@ socketToSsr.onmessage=function(m){
14971496
notFoundNode = statement[1]
14981497
of "onexception":
14991498
detectReturnStmt(statement[1])
1500-
onException = statement[1]
1499+
statement[1].insert(0, newLetStmt(ident"e", newCall"getCurrentException"))
1500+
onException["e"].add(statement[1])
1501+
echo onException["e"].toStrLit
15011502
of "middleware":
15021503
detectReturnStmt(statement[1])
15031504
stmtList.insert(0, statement[1])
@@ -1605,17 +1606,6 @@ socketToSsr.onmessage=function(m){
16051606
else:
16061607
newEmptyNode(),
16071608
setup,
1608-
newProc(
1609-
ident"__onException",
1610-
[
1611-
newEmptyNode(),
1612-
newIdentDefs(ident"url", ident"string"),
1613-
newIdentDefs(ident"body", ident"string"),
1614-
newIdentDefs(ident"e", newNimNode(nnkRefTy).add(newDotExpr(ident"system", ident"Exception"))),
1615-
],
1616-
onException,
1617-
nnkTemplateDef
1618-
),
16191609
newProc(
16201610
ident"__wsError",
16211611
[newEmptyNode(), newIdentDefs(wsClientI, wsType)],

tests/components/component_for.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ component ComponentFor:
1111
"{i}"
1212
@click:
1313
self.counter += 1
14+
{.emit: "console.log(`i`, `ev`)".}
1415
echo i
1516
!debugCurrent
1617

tests/testc20.nim

Lines changed: 17 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,23 @@
11
import ../src/happyx
22

3+
type
4+
Kind = enum
5+
circle
6+
square
37

4-
type Kind = enum
5-
str
6-
num
8+
model Obj:
9+
k: Kind
10+
st: string
711

12+
serve("127.0.0.1", 5000):
13+
post "/[data:Obj:json]":
14+
echo data
15+
return ""
816

9-
model Task:
10-
id: int
11-
12-
13-
serve "127.0.0.1", 5000:
14-
post "/[task:Task]":
15-
echo task.id
16-
return task.id
17-
18-
get "/x/$x":
19-
if x == "1":
20-
return x
21-
echo 1
22-
if x == "2":
23-
return x
24-
echo 2
25-
return x
26-
echo x
27-
28-
get "/thisShouldWorkWhithoutRegex":
29-
discard
30-
31-
get "/{k:enum(Kind)}/{x}":
32-
"1" & x
33-
get "/bool":
34-
"2"
35-
notfound:
36-
"3"
37-
38-
staticDir "/testdir"
39-
40-
staticDir "/testdir" -> "testdir" ~ "html,js,css"
41-
42-
middleware:
43-
outHeaders["x"] = "y"
44-
4517
onException:
46-
# here built-in variables:
47-
# `url`, `body` is string
48-
# `e` is `ref Exception`
49-
echo "URL: ", url
50-
echo "BODY: ", body
51-
echo "EXCEPTION: [", e.name, "] - ", e.msg
18+
echo "Exception"
19+
echo e.name
20+
echo e.msg
21+
statusCode = 422
22+
echo statusCode
23+
return "Exception"

0 commit comments

Comments
 (0)