peryl 1.5.2 → 1.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -17
- package/demo/hsml-app-form-validation_demo.html +1 -0
- package/demo/hsml-app-form-validation_demo.ts +22 -23
- package/demo/hsml-app-form_demo.html +1 -0
- package/demo/hsml-app-form_demo.ts +24 -20
- package/demo/hsml-app-test_demo.ts +36 -41
- package/demo/hsml-app-tictactoe_demo.ts +17 -16
- package/demo/hsml-app_demo.html +1 -0
- package/demo/hsml-app_demo.ts +16 -16
- package/demo/hsml-appel_demo.html +7 -0
- package/demo/hsml-appel_demo.ts +47 -27
- package/demo/hsml-appi_demo.ts +15 -22
- package/demo/hsml_demo.ts +27 -22
- package/demo/js/hsml-app-js-happi_demo.html +28 -21
- package/demo/js/hsml-app-js_demo.html +15 -17
- package/dist/browser-esmodule/encode.js.map +1 -1
- package/dist/browser-esmodule/hsml-app.js +114 -123
- package/dist/browser-esmodule/hsml-app.js.map +1 -1
- package/dist/browser-esmodule/hsml-convert.js.map +1 -1
- package/dist/browser-esmodule/hsml-dom.js +3 -3
- package/dist/browser-esmodule/hsml-dom.js.map +1 -1
- package/dist/browser-esmodule/hsml-h.js.map +1 -1
- package/dist/browser-esmodule/hsml-html.js +2 -2
- package/dist/browser-esmodule/hsml-html.js.map +1 -1
- package/dist/browser-esmodule/hsml-idom.js +5 -5
- package/dist/browser-esmodule/hsml-idom.js.map +1 -1
- package/dist/browser-esmodule/hsml.js.map +1 -1
- package/dist/browser-esmodule/http.js.map +1 -1
- package/dist/browser-esmodule/index.js +118 -127
- package/dist/browser-esmodule/index.js.map +1 -1
- package/dist/browser-esmodule/router.js.map +1 -1
- package/dist/browser-umd/encode.js +1 -1
- package/dist/browser-umd/encode.js.map +1 -1
- package/dist/browser-umd/hsml-app.js +1 -1
- package/dist/browser-umd/hsml-app.js.map +1 -1
- package/dist/browser-umd/hsml-convert.js.map +1 -1
- package/dist/browser-umd/hsml-dom.js +1 -1
- package/dist/browser-umd/hsml-dom.js.map +1 -1
- package/dist/browser-umd/hsml-h.js.map +1 -1
- package/dist/browser-umd/hsml-html.js +1 -1
- package/dist/browser-umd/hsml-html.js.map +1 -1
- package/dist/browser-umd/hsml-idom.js +1 -1
- package/dist/browser-umd/hsml-idom.js.map +1 -1
- package/dist/browser-umd/hsml.js.map +1 -1
- package/dist/browser-umd/http.js +1 -1
- package/dist/browser-umd/http.js.map +1 -1
- package/dist/browser-umd/index.js +1 -1
- package/dist/browser-umd/index.js.map +1 -1
- package/dist/browser-umd/router.js +1 -1
- package/dist/browser-umd/router.js.map +1 -1
- package/dist/browser-umd/validators-moment.js +1 -1
- package/dist/browser-umd/validators-moment.js.map +1 -1
- package/dist/browser-umd/validators-numeral.js.map +1 -1
- package/dist/demo/encode_demo.ce182166.js.map +1 -1
- package/dist/demo/encode_demo.f40a44eb.js.map +1 -1
- package/dist/demo/hsml-app-form-validation_demo.8e406f15.js +2 -0
- package/dist/demo/hsml-app-form-validation_demo.8e406f15.js.map +1 -0
- package/dist/demo/hsml-app-form-validation_demo.9a95cff3.js +2 -0
- package/dist/demo/hsml-app-form-validation_demo.9a95cff3.js.map +1 -0
- package/dist/demo/hsml-app-form-validation_demo.c6856b02.js +2 -0
- package/dist/demo/hsml-app-form-validation_demo.c6856b02.js.map +1 -0
- package/dist/demo/hsml-app-form-validation_demo.fdcc0b2d.js +2 -0
- package/dist/demo/hsml-app-form-validation_demo.fdcc0b2d.js.map +1 -0
- package/dist/demo/hsml-app-form-validation_demo.html +1 -1
- package/dist/demo/hsml-app-form_demo.950b2a09.js +2 -0
- package/dist/demo/hsml-app-form_demo.950b2a09.js.map +1 -0
- package/dist/demo/hsml-app-form_demo.ea3af725.js +2 -0
- package/dist/demo/hsml-app-form_demo.ea3af725.js.map +1 -0
- package/dist/demo/hsml-app-form_demo.html +1 -1
- package/dist/demo/hsml-app-test_demo.36a210b8.js +2 -0
- package/dist/demo/hsml-app-test_demo.36a210b8.js.map +1 -0
- package/dist/demo/hsml-app-test_demo.6ab4ea94.js +2 -0
- package/dist/demo/hsml-app-test_demo.6ab4ea94.js.map +1 -0
- package/dist/demo/hsml-app-test_demo.html +1 -1
- package/dist/demo/hsml-app-tictactoe_demo.7a91c368.js +2 -0
- package/dist/demo/hsml-app-tictactoe_demo.7a91c368.js.map +1 -0
- package/dist/demo/hsml-app-tictactoe_demo.97905c2f.js +2 -0
- package/dist/demo/hsml-app-tictactoe_demo.97905c2f.js.map +1 -0
- package/dist/demo/hsml-app-tictactoe_demo.html +1 -1
- package/dist/demo/hsml-app_demo.b5c1d27d.js +2 -0
- package/dist/demo/hsml-app_demo.b5c1d27d.js.map +1 -0
- package/dist/demo/hsml-app_demo.bbebbbcf.js +2 -0
- package/dist/demo/hsml-app_demo.bbebbbcf.js.map +1 -0
- package/dist/demo/hsml-app_demo.html +1 -1
- package/dist/demo/hsml-appel_demo.4d9e135c.js +2 -0
- package/dist/demo/hsml-appel_demo.4d9e135c.js.map +1 -0
- package/dist/demo/hsml-appel_demo.7ddb6fb3.js +2 -0
- package/dist/demo/hsml-appel_demo.7ddb6fb3.js.map +1 -0
- package/dist/demo/hsml-appel_demo.html +1 -1
- package/dist/demo/hsml-appi_demo.e5e28a65.js +2 -0
- package/dist/demo/hsml-appi_demo.e5e28a65.js.map +1 -0
- package/dist/demo/hsml-appi_demo.fef950c1.js +2 -0
- package/dist/demo/hsml-appi_demo.fef950c1.js.map +1 -0
- package/dist/demo/hsml-appi_demo.html +1 -1
- package/dist/demo/hsml-convert_demo.0ea1fa3b.js.map +1 -1
- package/dist/demo/hsml-convert_demo.63e3e7b5.js.map +1 -1
- package/dist/demo/{hsml_demo.ff950ba1.js → hsml_demo.a248689a.js} +2 -2
- package/dist/demo/hsml_demo.a248689a.js.map +1 -0
- package/dist/demo/hsml_demo.eb3b08be.js +2 -0
- package/dist/demo/hsml_demo.eb3b08be.js.map +1 -0
- package/dist/demo/hsml_demo.html +1 -1
- package/dist/demo/http_demo.3e7da3d8.js.map +1 -1
- package/dist/demo/http_demo.8e435f23.js.map +1 -1
- package/dist/demo/i18n_demo.html +1 -1
- package/dist/demo/router_demo.3cfa03aa.js.map +1 -1
- package/dist/demo/router_demo.89ab1681.js.map +1 -1
- package/dist/demo/{validators_demo.252e13a6.js → validators_demo.90ff6001.js} +2 -2
- package/dist/demo/validators_demo.90ff6001.js.map +1 -0
- package/dist/demo/{validators_demo.66893723.js → validators_demo.ef5b2dea.js} +2 -2
- package/dist/demo/validators_demo.ef5b2dea.js.map +1 -0
- package/dist/demo/validators_demo.html +1 -1
- package/dist/encode.js +1 -1
- package/dist/encode.js.map +1 -1
- package/dist/hsml-app.d.ts +63 -42
- package/dist/hsml-app.js +110 -117
- package/dist/hsml-app.js.map +1 -1
- package/dist/hsml-convert.d.ts +3 -3
- package/dist/hsml-convert.js.map +1 -1
- package/dist/hsml-dom.d.ts +2 -2
- package/dist/hsml-dom.js +3 -3
- package/dist/hsml-dom.js.map +1 -1
- package/dist/hsml-h.d.ts +8 -8
- package/dist/hsml-h.js.map +1 -1
- package/dist/hsml-html.d.ts +4 -4
- package/dist/hsml-html.js +2 -2
- package/dist/hsml-html.js.map +1 -1
- package/dist/hsml-idom.d.ts +2 -2
- package/dist/hsml-idom.js +5 -5
- package/dist/hsml-idom.js.map +1 -1
- package/dist/hsml.d.ts +26 -27
- package/dist/hsml.js.map +1 -1
- package/dist/http.js +1 -1
- package/dist/http.js.map +1 -1
- package/dist/router.js +1 -1
- package/dist/router.js.map +1 -1
- package/package.json +8 -8
- package/src/hsml-app.ts +305 -197
- package/src/hsml-convert.ts +8 -8
- package/src/hsml-dom.ts +18 -18
- package/src/hsml-h.ts +10 -10
- package/src/hsml-html.ts +19 -19
- package/src/hsml-idom.ts +25 -25
- package/src/hsml.ts +46 -143
- package/demo/hsml-appc_demo.html +0 -16
- package/demo/hsml-appc_demo.ts +0 -49
- package/dist/demo/hsml-app-form-validation_demo.0b03b743.js +0 -2
- package/dist/demo/hsml-app-form-validation_demo.0b03b743.js.map +0 -1
- package/dist/demo/hsml-app-form-validation_demo.b3a5c810.js +0 -2
- package/dist/demo/hsml-app-form-validation_demo.b3a5c810.js.map +0 -1
- package/dist/demo/hsml-app-form-validation_demo.d3925067.js +0 -2
- package/dist/demo/hsml-app-form-validation_demo.d3925067.js.map +0 -1
- package/dist/demo/hsml-app-form-validation_demo.f757d763.js +0 -2
- package/dist/demo/hsml-app-form-validation_demo.f757d763.js.map +0 -1
- package/dist/demo/hsml-app-form_demo.007ffcaa.js +0 -2
- package/dist/demo/hsml-app-form_demo.007ffcaa.js.map +0 -1
- package/dist/demo/hsml-app-form_demo.a034239d.js +0 -2
- package/dist/demo/hsml-app-form_demo.a034239d.js.map +0 -1
- package/dist/demo/hsml-app-test_demo.35c14dc9.js +0 -2
- package/dist/demo/hsml-app-test_demo.35c14dc9.js.map +0 -1
- package/dist/demo/hsml-app-test_demo.3c7e16ae.js +0 -2
- package/dist/demo/hsml-app-test_demo.3c7e16ae.js.map +0 -1
- package/dist/demo/hsml-app-tictactoe_demo.5f4861c1.js +0 -2
- package/dist/demo/hsml-app-tictactoe_demo.5f4861c1.js.map +0 -1
- package/dist/demo/hsml-app-tictactoe_demo.7deeabad.js +0 -2
- package/dist/demo/hsml-app-tictactoe_demo.7deeabad.js.map +0 -1
- package/dist/demo/hsml-app_demo.87d83c29.js +0 -2
- package/dist/demo/hsml-app_demo.87d83c29.js.map +0 -1
- package/dist/demo/hsml-app_demo.941a13a6.js +0 -2
- package/dist/demo/hsml-app_demo.941a13a6.js.map +0 -1
- package/dist/demo/hsml-appc_demo.0234ff15.js +0 -2
- package/dist/demo/hsml-appc_demo.0234ff15.js.map +0 -1
- package/dist/demo/hsml-appc_demo.f5783031.js +0 -2
- package/dist/demo/hsml-appc_demo.f5783031.js.map +0 -1
- package/dist/demo/hsml-appc_demo.html +0 -1
- package/dist/demo/hsml-appel_demo.0e8a4d4c.js +0 -2
- package/dist/demo/hsml-appel_demo.0e8a4d4c.js.map +0 -1
- package/dist/demo/hsml-appel_demo.1a5c2c26.js +0 -2
- package/dist/demo/hsml-appel_demo.1a5c2c26.js.map +0 -1
- package/dist/demo/hsml-appi_demo.2c3fb511.js +0 -2
- package/dist/demo/hsml-appi_demo.2c3fb511.js.map +0 -1
- package/dist/demo/hsml-appi_demo.427fdebd.js +0 -2
- package/dist/demo/hsml-appi_demo.427fdebd.js.map +0 -1
- package/dist/demo/hsml_demo.33f28c29.js +0 -2
- package/dist/demo/hsml_demo.33f28c29.js.map +0 -1
- package/dist/demo/hsml_demo.ff950ba1.js.map +0 -1
- package/dist/demo/validators_demo.252e13a6.js.map +0 -1
- package/dist/demo/validators_demo.66893723.js.map +0 -1
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { HElement, HElements } from "../src/hsml";
|
|
2
|
-
import { HAction,
|
|
2
|
+
import { HAction, HApp, HDispatch } from "../src/hsml-app";
|
|
3
3
|
|
|
4
4
|
const NBSP = "\u00A0";
|
|
5
5
|
const CIRC = "\u25EF";
|
|
6
6
|
const CROS = "\u2A2F";
|
|
7
7
|
|
|
8
|
-
interface
|
|
8
|
+
interface State {
|
|
9
9
|
board: string[][];
|
|
10
10
|
turn: number;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
const enum
|
|
13
|
+
const enum Actions {
|
|
14
14
|
mark = "mark",
|
|
15
|
-
reset = "reset"
|
|
15
|
+
reset = "reset",
|
|
16
|
+
noop = "noop"
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
const boardInit = () => [
|
|
@@ -21,14 +22,14 @@ const boardInit = () => [
|
|
|
21
22
|
[NBSP, NBSP, NBSP]
|
|
22
23
|
];
|
|
23
24
|
|
|
24
|
-
function state():
|
|
25
|
+
function state(): State {
|
|
25
26
|
return {
|
|
26
27
|
board: boardInit(),
|
|
27
28
|
turn: 0
|
|
28
29
|
};
|
|
29
30
|
}
|
|
30
31
|
|
|
31
|
-
function view(state:
|
|
32
|
+
function view(state: State): HElements<Actions> {
|
|
32
33
|
return [
|
|
33
34
|
["div.w3-content", [
|
|
34
35
|
["h1", ["Tic-Tac-Toe Demo"]],
|
|
@@ -36,8 +37,8 @@ function view(state: TicTacToeState): HElements {
|
|
|
36
37
|
["p.w3-xlarge", [
|
|
37
38
|
"Player: ", state.turn ? CROS : CIRC,
|
|
38
39
|
]],
|
|
39
|
-
["div", state.board.map<HElement
|
|
40
|
-
["div", row.map<HElement
|
|
40
|
+
["div", state.board.map<HElement<Actions>>((row, y) =>
|
|
41
|
+
["div", row.map<HElement<Actions>>((col, x) =>
|
|
41
42
|
["button.w3-button.w3-white.w3-border.w3-border-gray",
|
|
42
43
|
{
|
|
43
44
|
styles: {
|
|
@@ -48,38 +49,38 @@ function view(state: TicTacToeState): HElements {
|
|
|
48
49
|
height: "2em"
|
|
49
50
|
},
|
|
50
51
|
on: (col === NBSP)
|
|
51
|
-
? ["click",
|
|
52
|
-
: ["click",
|
|
52
|
+
? ["click", Actions.mark, { x, y, turn: state.turn }]
|
|
53
|
+
: ["click", Actions.noop]
|
|
53
54
|
},
|
|
54
55
|
col
|
|
55
56
|
])
|
|
56
57
|
])
|
|
57
58
|
],
|
|
58
59
|
["p", [
|
|
59
|
-
["button.w3-button.w3-blue", { on: ["click",
|
|
60
|
+
["button.w3-button.w3-blue", { on: ["click", Actions.reset] }, "Reset"]
|
|
60
61
|
]]
|
|
61
62
|
]]
|
|
62
63
|
]]
|
|
63
64
|
];
|
|
64
65
|
}
|
|
65
66
|
|
|
66
|
-
|
|
67
|
+
|
|
68
|
+
async function dispatcher(action: HAction<Actions>, state: State, dispatch: HDispatch<Actions>): Promise<void> {
|
|
67
69
|
console.log("action", action);
|
|
68
70
|
|
|
69
71
|
switch (action.type) {
|
|
70
72
|
|
|
71
|
-
case
|
|
73
|
+
case Actions.reset:
|
|
72
74
|
state.board = boardInit();
|
|
73
75
|
break;
|
|
74
76
|
|
|
75
|
-
case
|
|
77
|
+
case Actions.mark:
|
|
76
78
|
state.board[action.data.y][action.data.x] = action.data.turn ? CROS : CIRC;
|
|
77
79
|
state.turn = action.data.turn ? 0 : 1;
|
|
78
80
|
break;
|
|
79
81
|
}
|
|
80
82
|
}
|
|
81
83
|
|
|
82
|
-
const app =
|
|
84
|
+
const app = new HApp<State, Actions>(state, view, dispatcher, "app");
|
|
83
85
|
|
|
84
86
|
(self as any).app = app;
|
|
85
|
-
|
package/demo/hsml-app_demo.html
CHANGED
package/demo/hsml-app_demo.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { HApp, HDispatcher, HState, HView } from "../src/hsml-app";
|
|
2
2
|
|
|
3
3
|
// Actions definition
|
|
4
|
-
enum
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
4
|
+
// enum Actions {
|
|
5
|
+
// say = "say",
|
|
6
|
+
// fetch = "fetch"
|
|
7
|
+
// }
|
|
8
|
+
|
|
9
|
+
type Actions = "say" | "fetch";
|
|
8
10
|
|
|
9
11
|
interface State {
|
|
10
12
|
message: string;
|
|
@@ -20,33 +22,34 @@ const state: HState<State> = function () {
|
|
|
20
22
|
};
|
|
21
23
|
|
|
22
24
|
// Template function, returns HSML markup generated from app state
|
|
23
|
-
const view: HView<State> = function (state) {
|
|
25
|
+
const view: HView<State, Actions> = function (state) {
|
|
24
26
|
return [
|
|
25
27
|
["p", [
|
|
26
28
|
"Greeting: ", state.message
|
|
27
29
|
]],
|
|
28
30
|
["p", [
|
|
29
31
|
// On button event "click" dispatch Action.say type with data "Hello"
|
|
30
|
-
["button", { on: ["click",
|
|
32
|
+
["button", { on: ["click", "say", "Hello"] }, "Say Hello"],
|
|
31
33
|
" ",
|
|
32
|
-
["button", { on: ["click",
|
|
34
|
+
["button", { on: ["click", "say", "Hi"] }, "Say Hi"],
|
|
33
35
|
]],
|
|
34
36
|
["p", [
|
|
35
|
-
["button", { on: ["click",
|
|
37
|
+
["button", { on: ["click", "fetch"] }, "Server fetch time"],
|
|
36
38
|
["pre", state.json]
|
|
37
39
|
]]
|
|
38
40
|
];
|
|
39
41
|
};
|
|
40
42
|
|
|
41
43
|
// Action dispatcher, app logic
|
|
42
|
-
const dispatcher: HDispatcher<State> = async function (action, state, dispatch) {
|
|
44
|
+
const dispatcher: HDispatcher<State, Actions> = async function (action, state, dispatch) {
|
|
43
45
|
switch (action.type) {
|
|
44
|
-
|
|
45
|
-
case
|
|
46
|
+
|
|
47
|
+
case "say":
|
|
46
48
|
// Change app state message by action data (3. parameter of on click action)
|
|
47
49
|
state.message = action.data;
|
|
48
50
|
break;
|
|
49
|
-
|
|
51
|
+
|
|
52
|
+
case "fetch":
|
|
50
53
|
// Server async call
|
|
51
54
|
try {
|
|
52
55
|
const res = await fetch("http://date.jsontest.com");
|
|
@@ -59,8 +62,5 @@ const dispatcher: HDispatcher<State> = async function (action, state, dispatch)
|
|
|
59
62
|
}
|
|
60
63
|
};
|
|
61
64
|
|
|
62
|
-
// Debug mode logging HApp actions, rendering, dispatching info
|
|
63
|
-
HApp.debug = true;
|
|
64
|
-
|
|
65
65
|
// Run application
|
|
66
|
-
(window as any).app = new HApp(state, view, dispatcher);
|
|
66
|
+
(window as any).app = new HApp<State, Actions>(state, view, dispatcher, "app", true);
|
|
@@ -12,6 +12,13 @@
|
|
|
12
12
|
<happ-app></happ-app>
|
|
13
13
|
|
|
14
14
|
<script type="module" src="hsml-appel_demo.ts"></script>
|
|
15
|
+
<script type="module">
|
|
16
|
+
document.getElementsByTagName("happ-app")[0]
|
|
17
|
+
.addEventListener("action",
|
|
18
|
+
function (e) {
|
|
19
|
+
console.log("EventListener action", e.detail);
|
|
20
|
+
});
|
|
21
|
+
</script>
|
|
15
22
|
</body>
|
|
16
23
|
|
|
17
24
|
</html>
|
package/demo/hsml-appel_demo.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { HElements } from "../src/hsml";
|
|
2
|
-
import { HAction,
|
|
2
|
+
import { HAction, HAppActions, happel, HDispatch, HDispatcher, HDispatchScopes, HState, HView } from "../src/hsml-app";
|
|
3
3
|
|
|
4
4
|
interface CounterState {
|
|
5
5
|
count: number;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
enum
|
|
8
|
+
enum CounterActions {
|
|
9
9
|
dec = "counter-dec",
|
|
10
10
|
inc = "counter-inc",
|
|
11
11
|
count = "counter-count"
|
|
@@ -17,57 +17,64 @@ const counterState: HState<CounterState> = function () {
|
|
|
17
17
|
}
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
const counterView: HView<CounterState> = function (state
|
|
20
|
+
const counterView: HView<CounterState, CounterActions> = function (state) {
|
|
21
21
|
return [
|
|
22
22
|
["h3", ["Counter"]],
|
|
23
23
|
["p", [
|
|
24
24
|
["em", ["Count"]], ": ", state.count,
|
|
25
25
|
" ",
|
|
26
|
-
["button", { on: ["click",
|
|
27
|
-
["button", { on: ["click",
|
|
26
|
+
["button", { on: ["click", CounterActions.dec, 1] }, ["-"]],
|
|
27
|
+
["button", { on: ["click", CounterActions.inc, 2] }, ["+"]]
|
|
28
28
|
]]
|
|
29
29
|
];
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
-
const counterDispatcher: HDispatcher<CounterState> = async function (action
|
|
32
|
+
const counterDispatcher: HDispatcher<CounterState, CounterActions> = async function (action, state, dispatch) {
|
|
33
33
|
console.log("action counter:", action);
|
|
34
34
|
// console.log("state counter:", state);
|
|
35
35
|
// console.log("happ counter:", this);
|
|
36
36
|
|
|
37
37
|
switch (action.type) {
|
|
38
|
-
case
|
|
39
|
-
case
|
|
40
|
-
case
|
|
38
|
+
case HAppActions.init:
|
|
39
|
+
case HAppActions.mount:
|
|
40
|
+
case HAppActions.umount:
|
|
41
41
|
break;
|
|
42
42
|
|
|
43
|
-
case
|
|
43
|
+
case HAppActions.attribute:
|
|
44
44
|
if (action.data.attrName === "count") {
|
|
45
45
|
state.count = Number(action.data.newVal);
|
|
46
46
|
}
|
|
47
47
|
break;
|
|
48
48
|
|
|
49
|
-
case
|
|
49
|
+
case CounterActions.inc:
|
|
50
50
|
state.count = state.count + action.data as number;
|
|
51
|
-
setTimeout(() => dispatch(
|
|
52
|
-
dispatch(
|
|
51
|
+
setTimeout(() => dispatch(CounterActions.dec, 1), 1e3); // async call
|
|
52
|
+
dispatch(CounterActions.count, state.count, HDispatchScopes.element);
|
|
53
53
|
break;
|
|
54
54
|
|
|
55
|
-
case
|
|
55
|
+
case CounterActions.dec:
|
|
56
56
|
state.count = state.count - action.data as number;
|
|
57
|
-
dispatch(
|
|
57
|
+
dispatch(CounterActions.count, state.count, HDispatchScopes.element);
|
|
58
58
|
break;
|
|
59
59
|
}
|
|
60
60
|
};
|
|
61
61
|
|
|
62
|
-
happel
|
|
62
|
+
happel<CounterState, CounterActions>({
|
|
63
|
+
state: counterState,
|
|
64
|
+
view: counterView,
|
|
65
|
+
dispatcher: counterDispatcher,
|
|
66
|
+
name: "counter",
|
|
67
|
+
attributes: ["count"],
|
|
68
|
+
debug: true
|
|
69
|
+
});
|
|
63
70
|
|
|
64
71
|
|
|
65
72
|
interface AppState {
|
|
66
73
|
count: number;
|
|
67
74
|
}
|
|
68
75
|
|
|
69
|
-
enum
|
|
70
|
-
|
|
76
|
+
enum AppActions {
|
|
77
|
+
action = "app-action"
|
|
71
78
|
}
|
|
72
79
|
|
|
73
80
|
const appState: HState<AppState> = function () {
|
|
@@ -76,29 +83,42 @@ const appState: HState<AppState> = function () {
|
|
|
76
83
|
}
|
|
77
84
|
};
|
|
78
85
|
|
|
79
|
-
const appView: HView<AppState> = function (state
|
|
86
|
+
const appView: HView<AppState, AppActions> = function (state) {
|
|
80
87
|
return [
|
|
81
88
|
["h2", ["App count: ", state.count]],
|
|
82
89
|
["happ-counter", {
|
|
83
90
|
count: 33,
|
|
84
|
-
on: [
|
|
91
|
+
on: [HAppActions.action, AppActions.action]
|
|
85
92
|
}]
|
|
86
93
|
];
|
|
87
94
|
};
|
|
88
95
|
|
|
89
|
-
const appDispatcher: HDispatcher<
|
|
96
|
+
const appDispatcher: HDispatcher<AppState, AppActions | CounterActions> = async function (action, state, dispatch) {
|
|
90
97
|
console.log("action:", action);
|
|
91
98
|
// console.log("state:", state);
|
|
92
99
|
// console.log("happ:", this);
|
|
93
100
|
|
|
94
101
|
switch (action.type) {
|
|
95
|
-
case
|
|
96
|
-
|
|
102
|
+
case AppActions.action:
|
|
103
|
+
const a = action.data as HAction<AppActions | CounterActions>;
|
|
104
|
+
switch (a.type) {
|
|
105
|
+
case CounterActions.count:
|
|
106
|
+
state.count = a.data as number;
|
|
107
|
+
dispatch(CounterActions.count, state.count, HDispatchScopes.element);
|
|
108
|
+
break;
|
|
109
|
+
default:
|
|
110
|
+
console.log(a);
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
97
113
|
break;
|
|
98
114
|
}
|
|
99
115
|
};
|
|
100
116
|
|
|
101
|
-
happel
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
117
|
+
happel<AppState, AppActions | CounterActions>({
|
|
118
|
+
state: appState,
|
|
119
|
+
view: appView,
|
|
120
|
+
dispatcher: appDispatcher,
|
|
121
|
+
name: "app",
|
|
122
|
+
attributes: [],
|
|
123
|
+
debug: true
|
|
124
|
+
});
|
package/demo/hsml-appi_demo.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { HElements } from "../src/hsml";
|
|
2
|
-
import { HAction, HApp,
|
|
2
|
+
import { HAction, HApp, HAppActions, HDispatch, happ } from "../src/hsml-app";
|
|
3
3
|
|
|
4
|
-
enum
|
|
4
|
+
enum Actions {
|
|
5
5
|
name = "name"
|
|
6
6
|
}
|
|
7
7
|
|
|
@@ -9,19 +9,19 @@ interface State {
|
|
|
9
9
|
name: string;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
(window as any).app = happ<State, Actions>({
|
|
13
13
|
|
|
14
|
-
state(): State {
|
|
14
|
+
state: function (): State {
|
|
15
15
|
return { name: "" };
|
|
16
|
-
}
|
|
16
|
+
},
|
|
17
17
|
|
|
18
|
-
view(state: State): HElements {
|
|
18
|
+
view: function (state: State): HElements<Actions> {
|
|
19
19
|
return [
|
|
20
20
|
["h1", "Hello"],
|
|
21
21
|
["input~focus", {
|
|
22
22
|
type: "text",
|
|
23
23
|
placeholder: "name",
|
|
24
|
-
on: ["input",
|
|
24
|
+
on: ["input", Actions.name]
|
|
25
25
|
}],
|
|
26
26
|
["p",
|
|
27
27
|
state.name
|
|
@@ -29,30 +29,23 @@ class App implements HAppI<State> {
|
|
|
29
29
|
: "Greeting"
|
|
30
30
|
]
|
|
31
31
|
];
|
|
32
|
-
}
|
|
32
|
+
},
|
|
33
33
|
|
|
34
|
-
async
|
|
34
|
+
dispatcher: async function (this: HApp<State, Actions>, action: HAction<Actions>, state: State, dispatch: HDispatch<Actions>): Promise<void> {
|
|
35
35
|
console.log(action);
|
|
36
36
|
// console.log(this);
|
|
37
|
-
|
|
38
37
|
switch (action.type) {
|
|
39
38
|
|
|
40
|
-
case
|
|
39
|
+
case HAppActions.mount:
|
|
41
40
|
this.refs["focus"].focus();
|
|
42
41
|
break;
|
|
43
42
|
|
|
44
|
-
case
|
|
43
|
+
case Actions.name:
|
|
45
44
|
state.name = action.data;
|
|
46
45
|
break;
|
|
47
46
|
}
|
|
47
|
+
},
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// HApp.debug = true;
|
|
54
|
-
// HApp.debug = window.location.hostname === "localhost";
|
|
55
|
-
|
|
56
|
-
const app = happi(App);
|
|
57
|
-
|
|
58
|
-
(self as any).app = app;
|
|
49
|
+
element: "app",
|
|
50
|
+
debug: false
|
|
51
|
+
});
|
package/demo/hsml_demo.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { hsmls2idomPatch } from "../src/hsml-idom";
|
|
2
2
|
import { HElements, HElement } from "../src/hsml";
|
|
3
3
|
|
|
4
|
-
type View<
|
|
4
|
+
type View<State, Actions extends string> = (state: State, dispatch: Dispatch<Actions>) => HElements<Actions>;
|
|
5
5
|
|
|
6
|
-
type Dispatch = (
|
|
6
|
+
type Dispatch<Actions extends string> = (action: Actions, data?: any) => void;
|
|
7
7
|
|
|
8
|
-
type Dispatcher<
|
|
8
|
+
type Dispatcher<State, Actions extends string> = (action: Actions, data: any, state: State, dispatch: Dispatch<Actions>) => State;
|
|
9
9
|
|
|
10
|
-
function render<
|
|
11
|
-
view: View<
|
|
12
|
-
state:
|
|
13
|
-
dispatch: Dispatch): void {
|
|
10
|
+
function render<State, Actions extends string>(element: HTMLElement,
|
|
11
|
+
view: View<State, Actions>,
|
|
12
|
+
state: State,
|
|
13
|
+
dispatch: Dispatch<Actions>): void {
|
|
14
14
|
(render as any).scheduled || ((render as any).scheduled = null);
|
|
15
15
|
if (!state) {
|
|
16
16
|
return;
|
|
@@ -19,29 +19,34 @@ function render<STATE>(element: HTMLElement,
|
|
|
19
19
|
(render as any).scheduled = setTimeout(() => {
|
|
20
20
|
const hsml = view(state, dispatch);
|
|
21
21
|
// console.log("render", hsml);
|
|
22
|
-
hsmls2idomPatch(element, hsml);
|
|
22
|
+
hsmls2idomPatch<Actions>(element, hsml);
|
|
23
23
|
(render as any).scheduled = null;
|
|
24
24
|
}, 0);
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
const dispatch: Dispatch = (
|
|
29
|
-
// console.log("dispatch",
|
|
30
|
-
const state = dispatcher(
|
|
28
|
+
const dispatch: Dispatch<Actions> = (action, data): void => {
|
|
29
|
+
// console.log("dispatch", action, data);
|
|
30
|
+
const state = dispatcher(action, data, appState, dispatch);
|
|
31
31
|
// console.log("state", state);
|
|
32
32
|
render(appElement!, view, state, dispatch);
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
// ----------------------------------------------------------------------------
|
|
36
|
-
|
|
37
35
|
const appState = {
|
|
38
36
|
title: "Counter",
|
|
39
37
|
count: 0
|
|
40
38
|
};
|
|
41
39
|
|
|
42
|
-
type
|
|
40
|
+
type State = typeof appState;
|
|
41
|
+
|
|
42
|
+
type Actions =
|
|
43
|
+
| "inc"
|
|
44
|
+
| "dec"
|
|
45
|
+
| "dec_async"
|
|
46
|
+
| "action"
|
|
47
|
+
| "xxx";
|
|
43
48
|
|
|
44
|
-
const view: View<
|
|
49
|
+
const view: View<State, Actions> = (state, dispatch): HElements<Actions> => {
|
|
45
50
|
return [
|
|
46
51
|
["h2", [state.title]],
|
|
47
52
|
["p", [
|
|
@@ -50,18 +55,18 @@ const view: View<AppState> = (state: AppState, dispatch: Dispatch): HElements =>
|
|
|
50
55
|
button("-", () => dispatch("dec", 1)),
|
|
51
56
|
button("+", () => dispatch("inc", 2)),
|
|
52
57
|
" ",
|
|
53
|
-
button("xxx", () => dispatch("xxx"))
|
|
58
|
+
button("xxx", () => dispatch("xxx"))
|
|
54
59
|
]],
|
|
55
60
|
];
|
|
56
61
|
}
|
|
57
62
|
|
|
58
|
-
function button(label: string, cb: (e: Event) => void): HElement {
|
|
63
|
+
function button(label: string, cb: (e: Event) => void): HElement<Actions> {
|
|
59
64
|
return ["button", { click: cb }, [label]];
|
|
60
65
|
}
|
|
61
66
|
|
|
62
|
-
const dispatcher: Dispatcher<
|
|
63
|
-
|
|
64
|
-
switch (
|
|
67
|
+
const dispatcher: Dispatcher<State, Actions> = (action, data, state, dispatch) => {
|
|
68
|
+
console.log("action:", action, data);
|
|
69
|
+
switch (action) {
|
|
65
70
|
case "inc":
|
|
66
71
|
state.count += data;
|
|
67
72
|
break;
|
|
@@ -73,7 +78,7 @@ const dispatcher: Dispatcher<AppState> = (event: string, data: any, state: AppSt
|
|
|
73
78
|
state.count -= data;
|
|
74
79
|
break;
|
|
75
80
|
default:
|
|
76
|
-
console.warn("unhandled
|
|
81
|
+
console.warn("unhandled action:", action, data);
|
|
77
82
|
}
|
|
78
83
|
return state;
|
|
79
84
|
}
|
|
@@ -82,4 +87,4 @@ const appElement = document.getElementById("app");
|
|
|
82
87
|
|
|
83
88
|
render(appElement!, view, appState, dispatch);
|
|
84
89
|
|
|
85
|
-
dispatch("
|
|
90
|
+
dispatch("action", {});
|
|
@@ -13,53 +13,60 @@
|
|
|
13
13
|
<script src="../../dist/browser-umd/hsml-app.js"></script>
|
|
14
14
|
<!-- <script src="https://unpkg.com/peryl/dist/browser-umd/hsml-app.js"></script> -->
|
|
15
15
|
<script type="module">
|
|
16
|
-
// import { HApp,
|
|
17
|
-
// import { HApp,
|
|
16
|
+
// import { HApp, happ } from "../../dist/browser-esmodule/hsml-app.js";
|
|
17
|
+
// import { HApp, happ } from "https://unpkg.com/peryl/dist/browser-esmodule/hsml-app.js";
|
|
18
18
|
|
|
19
|
-
const
|
|
19
|
+
const Actions = {
|
|
20
20
|
change: "change",
|
|
21
21
|
reset: "reset"
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
happ({
|
|
25
25
|
|
|
26
|
-
state() {
|
|
26
|
+
state: function () {
|
|
27
27
|
return { name: "" };
|
|
28
|
-
}
|
|
28
|
+
},
|
|
29
29
|
|
|
30
|
-
view(state) {
|
|
30
|
+
view: function (state) {
|
|
31
31
|
return [
|
|
32
32
|
["h1", ["Hello ", state.name]],
|
|
33
|
-
["input", {
|
|
34
|
-
|
|
33
|
+
["input", {
|
|
34
|
+
type: "text",
|
|
35
|
+
placeholder: "Name",
|
|
36
|
+
value: state.name,
|
|
37
|
+
on: ["input", Actions.change]
|
|
38
|
+
}],
|
|
39
|
+
["button", {
|
|
40
|
+
type: "button",
|
|
41
|
+
on: ["click", Actions.reset]
|
|
42
|
+
}, "Reset"]
|
|
35
43
|
];
|
|
36
|
-
}
|
|
44
|
+
},
|
|
37
45
|
|
|
38
|
-
async
|
|
46
|
+
dispatcher: async function (action, state, dispatch) {
|
|
39
47
|
console.log("action:", action);
|
|
40
48
|
console.log("state:", state);
|
|
41
49
|
console.log("happ:", this);
|
|
42
50
|
|
|
43
51
|
switch (action.type) {
|
|
44
|
-
case
|
|
45
|
-
case
|
|
46
|
-
case
|
|
52
|
+
case HAppActions.init:
|
|
53
|
+
case HAppActions.mount:
|
|
54
|
+
case HAppActions.umount:
|
|
47
55
|
break;
|
|
48
56
|
|
|
49
|
-
case
|
|
57
|
+
case Actions.change:
|
|
50
58
|
state.name = action.data;
|
|
51
59
|
break;
|
|
52
60
|
|
|
53
|
-
case
|
|
61
|
+
case Actions.reset:
|
|
54
62
|
state.name = new String();
|
|
55
63
|
break;
|
|
56
64
|
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
65
|
+
},
|
|
59
66
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
67
|
+
element: "app",
|
|
68
|
+
debug: true
|
|
69
|
+
});
|
|
63
70
|
|
|
64
71
|
</script>
|
|
65
72
|
</body>
|