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.
Files changed (187) hide show
  1. package/README.md +31 -17
  2. package/demo/hsml-app-form-validation_demo.html +1 -0
  3. package/demo/hsml-app-form-validation_demo.ts +22 -23
  4. package/demo/hsml-app-form_demo.html +1 -0
  5. package/demo/hsml-app-form_demo.ts +24 -20
  6. package/demo/hsml-app-test_demo.ts +36 -41
  7. package/demo/hsml-app-tictactoe_demo.ts +17 -16
  8. package/demo/hsml-app_demo.html +1 -0
  9. package/demo/hsml-app_demo.ts +16 -16
  10. package/demo/hsml-appel_demo.html +7 -0
  11. package/demo/hsml-appel_demo.ts +47 -27
  12. package/demo/hsml-appi_demo.ts +15 -22
  13. package/demo/hsml_demo.ts +27 -22
  14. package/demo/js/hsml-app-js-happi_demo.html +28 -21
  15. package/demo/js/hsml-app-js_demo.html +15 -17
  16. package/dist/browser-esmodule/encode.js.map +1 -1
  17. package/dist/browser-esmodule/hsml-app.js +114 -123
  18. package/dist/browser-esmodule/hsml-app.js.map +1 -1
  19. package/dist/browser-esmodule/hsml-convert.js.map +1 -1
  20. package/dist/browser-esmodule/hsml-dom.js +3 -3
  21. package/dist/browser-esmodule/hsml-dom.js.map +1 -1
  22. package/dist/browser-esmodule/hsml-h.js.map +1 -1
  23. package/dist/browser-esmodule/hsml-html.js +2 -2
  24. package/dist/browser-esmodule/hsml-html.js.map +1 -1
  25. package/dist/browser-esmodule/hsml-idom.js +5 -5
  26. package/dist/browser-esmodule/hsml-idom.js.map +1 -1
  27. package/dist/browser-esmodule/hsml.js.map +1 -1
  28. package/dist/browser-esmodule/http.js.map +1 -1
  29. package/dist/browser-esmodule/index.js +118 -127
  30. package/dist/browser-esmodule/index.js.map +1 -1
  31. package/dist/browser-esmodule/router.js.map +1 -1
  32. package/dist/browser-umd/encode.js +1 -1
  33. package/dist/browser-umd/encode.js.map +1 -1
  34. package/dist/browser-umd/hsml-app.js +1 -1
  35. package/dist/browser-umd/hsml-app.js.map +1 -1
  36. package/dist/browser-umd/hsml-convert.js.map +1 -1
  37. package/dist/browser-umd/hsml-dom.js +1 -1
  38. package/dist/browser-umd/hsml-dom.js.map +1 -1
  39. package/dist/browser-umd/hsml-h.js.map +1 -1
  40. package/dist/browser-umd/hsml-html.js +1 -1
  41. package/dist/browser-umd/hsml-html.js.map +1 -1
  42. package/dist/browser-umd/hsml-idom.js +1 -1
  43. package/dist/browser-umd/hsml-idom.js.map +1 -1
  44. package/dist/browser-umd/hsml.js.map +1 -1
  45. package/dist/browser-umd/http.js +1 -1
  46. package/dist/browser-umd/http.js.map +1 -1
  47. package/dist/browser-umd/index.js +1 -1
  48. package/dist/browser-umd/index.js.map +1 -1
  49. package/dist/browser-umd/router.js +1 -1
  50. package/dist/browser-umd/router.js.map +1 -1
  51. package/dist/browser-umd/validators-moment.js +1 -1
  52. package/dist/browser-umd/validators-moment.js.map +1 -1
  53. package/dist/browser-umd/validators-numeral.js.map +1 -1
  54. package/dist/demo/encode_demo.ce182166.js.map +1 -1
  55. package/dist/demo/encode_demo.f40a44eb.js.map +1 -1
  56. package/dist/demo/hsml-app-form-validation_demo.8e406f15.js +2 -0
  57. package/dist/demo/hsml-app-form-validation_demo.8e406f15.js.map +1 -0
  58. package/dist/demo/hsml-app-form-validation_demo.9a95cff3.js +2 -0
  59. package/dist/demo/hsml-app-form-validation_demo.9a95cff3.js.map +1 -0
  60. package/dist/demo/hsml-app-form-validation_demo.c6856b02.js +2 -0
  61. package/dist/demo/hsml-app-form-validation_demo.c6856b02.js.map +1 -0
  62. package/dist/demo/hsml-app-form-validation_demo.fdcc0b2d.js +2 -0
  63. package/dist/demo/hsml-app-form-validation_demo.fdcc0b2d.js.map +1 -0
  64. package/dist/demo/hsml-app-form-validation_demo.html +1 -1
  65. package/dist/demo/hsml-app-form_demo.950b2a09.js +2 -0
  66. package/dist/demo/hsml-app-form_demo.950b2a09.js.map +1 -0
  67. package/dist/demo/hsml-app-form_demo.ea3af725.js +2 -0
  68. package/dist/demo/hsml-app-form_demo.ea3af725.js.map +1 -0
  69. package/dist/demo/hsml-app-form_demo.html +1 -1
  70. package/dist/demo/hsml-app-test_demo.36a210b8.js +2 -0
  71. package/dist/demo/hsml-app-test_demo.36a210b8.js.map +1 -0
  72. package/dist/demo/hsml-app-test_demo.6ab4ea94.js +2 -0
  73. package/dist/demo/hsml-app-test_demo.6ab4ea94.js.map +1 -0
  74. package/dist/demo/hsml-app-test_demo.html +1 -1
  75. package/dist/demo/hsml-app-tictactoe_demo.7a91c368.js +2 -0
  76. package/dist/demo/hsml-app-tictactoe_demo.7a91c368.js.map +1 -0
  77. package/dist/demo/hsml-app-tictactoe_demo.97905c2f.js +2 -0
  78. package/dist/demo/hsml-app-tictactoe_demo.97905c2f.js.map +1 -0
  79. package/dist/demo/hsml-app-tictactoe_demo.html +1 -1
  80. package/dist/demo/hsml-app_demo.b5c1d27d.js +2 -0
  81. package/dist/demo/hsml-app_demo.b5c1d27d.js.map +1 -0
  82. package/dist/demo/hsml-app_demo.bbebbbcf.js +2 -0
  83. package/dist/demo/hsml-app_demo.bbebbbcf.js.map +1 -0
  84. package/dist/demo/hsml-app_demo.html +1 -1
  85. package/dist/demo/hsml-appel_demo.4d9e135c.js +2 -0
  86. package/dist/demo/hsml-appel_demo.4d9e135c.js.map +1 -0
  87. package/dist/demo/hsml-appel_demo.7ddb6fb3.js +2 -0
  88. package/dist/demo/hsml-appel_demo.7ddb6fb3.js.map +1 -0
  89. package/dist/demo/hsml-appel_demo.html +1 -1
  90. package/dist/demo/hsml-appi_demo.e5e28a65.js +2 -0
  91. package/dist/demo/hsml-appi_demo.e5e28a65.js.map +1 -0
  92. package/dist/demo/hsml-appi_demo.fef950c1.js +2 -0
  93. package/dist/demo/hsml-appi_demo.fef950c1.js.map +1 -0
  94. package/dist/demo/hsml-appi_demo.html +1 -1
  95. package/dist/demo/hsml-convert_demo.0ea1fa3b.js.map +1 -1
  96. package/dist/demo/hsml-convert_demo.63e3e7b5.js.map +1 -1
  97. package/dist/demo/{hsml_demo.ff950ba1.js → hsml_demo.a248689a.js} +2 -2
  98. package/dist/demo/hsml_demo.a248689a.js.map +1 -0
  99. package/dist/demo/hsml_demo.eb3b08be.js +2 -0
  100. package/dist/demo/hsml_demo.eb3b08be.js.map +1 -0
  101. package/dist/demo/hsml_demo.html +1 -1
  102. package/dist/demo/http_demo.3e7da3d8.js.map +1 -1
  103. package/dist/demo/http_demo.8e435f23.js.map +1 -1
  104. package/dist/demo/i18n_demo.html +1 -1
  105. package/dist/demo/router_demo.3cfa03aa.js.map +1 -1
  106. package/dist/demo/router_demo.89ab1681.js.map +1 -1
  107. package/dist/demo/{validators_demo.252e13a6.js → validators_demo.90ff6001.js} +2 -2
  108. package/dist/demo/validators_demo.90ff6001.js.map +1 -0
  109. package/dist/demo/{validators_demo.66893723.js → validators_demo.ef5b2dea.js} +2 -2
  110. package/dist/demo/validators_demo.ef5b2dea.js.map +1 -0
  111. package/dist/demo/validators_demo.html +1 -1
  112. package/dist/encode.js +1 -1
  113. package/dist/encode.js.map +1 -1
  114. package/dist/hsml-app.d.ts +63 -42
  115. package/dist/hsml-app.js +110 -117
  116. package/dist/hsml-app.js.map +1 -1
  117. package/dist/hsml-convert.d.ts +3 -3
  118. package/dist/hsml-convert.js.map +1 -1
  119. package/dist/hsml-dom.d.ts +2 -2
  120. package/dist/hsml-dom.js +3 -3
  121. package/dist/hsml-dom.js.map +1 -1
  122. package/dist/hsml-h.d.ts +8 -8
  123. package/dist/hsml-h.js.map +1 -1
  124. package/dist/hsml-html.d.ts +4 -4
  125. package/dist/hsml-html.js +2 -2
  126. package/dist/hsml-html.js.map +1 -1
  127. package/dist/hsml-idom.d.ts +2 -2
  128. package/dist/hsml-idom.js +5 -5
  129. package/dist/hsml-idom.js.map +1 -1
  130. package/dist/hsml.d.ts +26 -27
  131. package/dist/hsml.js.map +1 -1
  132. package/dist/http.js +1 -1
  133. package/dist/http.js.map +1 -1
  134. package/dist/router.js +1 -1
  135. package/dist/router.js.map +1 -1
  136. package/package.json +8 -8
  137. package/src/hsml-app.ts +305 -197
  138. package/src/hsml-convert.ts +8 -8
  139. package/src/hsml-dom.ts +18 -18
  140. package/src/hsml-h.ts +10 -10
  141. package/src/hsml-html.ts +19 -19
  142. package/src/hsml-idom.ts +25 -25
  143. package/src/hsml.ts +46 -143
  144. package/demo/hsml-appc_demo.html +0 -16
  145. package/demo/hsml-appc_demo.ts +0 -49
  146. package/dist/demo/hsml-app-form-validation_demo.0b03b743.js +0 -2
  147. package/dist/demo/hsml-app-form-validation_demo.0b03b743.js.map +0 -1
  148. package/dist/demo/hsml-app-form-validation_demo.b3a5c810.js +0 -2
  149. package/dist/demo/hsml-app-form-validation_demo.b3a5c810.js.map +0 -1
  150. package/dist/demo/hsml-app-form-validation_demo.d3925067.js +0 -2
  151. package/dist/demo/hsml-app-form-validation_demo.d3925067.js.map +0 -1
  152. package/dist/demo/hsml-app-form-validation_demo.f757d763.js +0 -2
  153. package/dist/demo/hsml-app-form-validation_demo.f757d763.js.map +0 -1
  154. package/dist/demo/hsml-app-form_demo.007ffcaa.js +0 -2
  155. package/dist/demo/hsml-app-form_demo.007ffcaa.js.map +0 -1
  156. package/dist/demo/hsml-app-form_demo.a034239d.js +0 -2
  157. package/dist/demo/hsml-app-form_demo.a034239d.js.map +0 -1
  158. package/dist/demo/hsml-app-test_demo.35c14dc9.js +0 -2
  159. package/dist/demo/hsml-app-test_demo.35c14dc9.js.map +0 -1
  160. package/dist/demo/hsml-app-test_demo.3c7e16ae.js +0 -2
  161. package/dist/demo/hsml-app-test_demo.3c7e16ae.js.map +0 -1
  162. package/dist/demo/hsml-app-tictactoe_demo.5f4861c1.js +0 -2
  163. package/dist/demo/hsml-app-tictactoe_demo.5f4861c1.js.map +0 -1
  164. package/dist/demo/hsml-app-tictactoe_demo.7deeabad.js +0 -2
  165. package/dist/demo/hsml-app-tictactoe_demo.7deeabad.js.map +0 -1
  166. package/dist/demo/hsml-app_demo.87d83c29.js +0 -2
  167. package/dist/demo/hsml-app_demo.87d83c29.js.map +0 -1
  168. package/dist/demo/hsml-app_demo.941a13a6.js +0 -2
  169. package/dist/demo/hsml-app_demo.941a13a6.js.map +0 -1
  170. package/dist/demo/hsml-appc_demo.0234ff15.js +0 -2
  171. package/dist/demo/hsml-appc_demo.0234ff15.js.map +0 -1
  172. package/dist/demo/hsml-appc_demo.f5783031.js +0 -2
  173. package/dist/demo/hsml-appc_demo.f5783031.js.map +0 -1
  174. package/dist/demo/hsml-appc_demo.html +0 -1
  175. package/dist/demo/hsml-appel_demo.0e8a4d4c.js +0 -2
  176. package/dist/demo/hsml-appel_demo.0e8a4d4c.js.map +0 -1
  177. package/dist/demo/hsml-appel_demo.1a5c2c26.js +0 -2
  178. package/dist/demo/hsml-appel_demo.1a5c2c26.js.map +0 -1
  179. package/dist/demo/hsml-appi_demo.2c3fb511.js +0 -2
  180. package/dist/demo/hsml-appi_demo.2c3fb511.js.map +0 -1
  181. package/dist/demo/hsml-appi_demo.427fdebd.js +0 -2
  182. package/dist/demo/hsml-appi_demo.427fdebd.js.map +0 -1
  183. package/dist/demo/hsml_demo.33f28c29.js +0 -2
  184. package/dist/demo/hsml_demo.33f28c29.js.map +0 -1
  185. package/dist/demo/hsml_demo.ff950ba1.js.map +0 -1
  186. package/dist/demo/validators_demo.252e13a6.js.map +0 -1
  187. 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, happ, HDispatch } from "../src/hsml-app";
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 TicTacToeState {
8
+ interface State {
9
9
  board: string[][];
10
10
  turn: number;
11
11
  }
12
12
 
13
- const enum TicTacToeActions {
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(): TicTacToeState {
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: TicTacToeState): HElements {
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>((row, y) =>
40
- ["div", row.map<HElement>((col, x) =>
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", TicTacToeActions.mark, { x, y, turn: state.turn }]
52
- : ["click", "noop"]
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", TicTacToeActions.reset] }, "Reset"]
60
+ ["button.w3-button.w3-blue", { on: ["click", Actions.reset] }, "Reset"]
60
61
  ]]
61
62
  ]]
62
63
  ]]
63
64
  ];
64
65
  }
65
66
 
66
- async function dispatcher(action: HAction, state: TicTacToeState, dispatch: HDispatch): Promise<void> {
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 TicTacToeActions.reset:
73
+ case Actions.reset:
72
74
  state.board = boardInit();
73
75
  break;
74
76
 
75
- case TicTacToeActions.mark:
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 = happ<TicTacToeState>(state, view, dispatcher);
84
+ const app = new HApp<State, Actions>(state, view, dispatcher, "app");
83
85
 
84
86
  (self as any).app = app;
85
-
@@ -8,6 +8,7 @@
8
8
  </head>
9
9
 
10
10
  <body>
11
+ <div id="app"></div>
11
12
  <script type="module" src="hsml-app_demo.ts"></script>
12
13
  </body>
13
14
 
@@ -1,10 +1,12 @@
1
1
  import { HApp, HDispatcher, HState, HView } from "../src/hsml-app";
2
2
 
3
3
  // Actions definition
4
- enum Action {
5
- say = "say",
6
- fetch = "fetch"
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", Action.say, "Hello"] }, "Say Hello"],
32
+ ["button", { on: ["click", "say", "Hello"] }, "Say Hello"],
31
33
  " ",
32
- ["button", { on: ["click", Action.say, "Hi"] }, "Say Hi"],
34
+ ["button", { on: ["click", "say", "Hi"] }, "Say Hi"],
33
35
  ]],
34
36
  ["p", [
35
- ["button", { on: ["click", Action.fetch] }, "Server fetch time"],
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
- // Dispatch action "say"
45
- case Action.say:
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
- case Action.fetch:
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>
@@ -1,11 +1,11 @@
1
1
  import { HElements } from "../src/hsml";
2
- import { HAction, HAppAction, happel, HDispatch, HDispatcher, HState, HView } from "../src/hsml-app";
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 CounterAction {
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: CounterState): HElements {
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", CounterAction.dec, 1] }, ["-"]],
27
- ["button", { on: ["click", CounterAction.inc, 2] }, ["+"]]
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: HAction, state: CounterState, dispatch: HDispatch) {
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 HAppAction._init:
39
- case HAppAction._mount:
40
- case HAppAction._umount:
38
+ case HAppActions.init:
39
+ case HAppActions.mount:
40
+ case HAppActions.umount:
41
41
  break;
42
42
 
43
- case HAppAction._element:
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 CounterAction.inc:
49
+ case CounterActions.inc:
50
50
  state.count = state.count + action.data as number;
51
- setTimeout(() => dispatch(CounterAction.dec, 1), 1e3); // async call
52
- dispatch(CounterAction.count, state.count);
51
+ setTimeout(() => dispatch(CounterActions.dec, 1), 1e3); // async call
52
+ dispatch(CounterActions.count, state.count, HDispatchScopes.element);
53
53
  break;
54
54
 
55
- case CounterAction.dec:
55
+ case CounterActions.dec:
56
56
  state.count = state.count - action.data as number;
57
- dispatch(CounterAction.count, state.count);
57
+ dispatch(CounterActions.count, state.count, HDispatchScopes.element);
58
58
  break;
59
59
  }
60
60
  };
61
61
 
62
- happel("happ-counter", ["count"], counterState, counterView, counterDispatcher);
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 AppAction {
70
- count = "app-count"
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: AppState): HElements {
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: [CounterAction.count, AppAction.count]
91
+ on: [HAppActions.action, AppActions.action]
85
92
  }]
86
93
  ];
87
94
  };
88
95
 
89
- const appDispatcher: HDispatcher<CounterState> = async function (action, state, dispatch) {
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 AppAction.count:
96
- state.count = action.data as number;
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("happ-app", [], appState, appView, appDispatcher);
102
-
103
- // HApp.debug = true;
104
- // HApp.debug = window.location.hostname === "localhost";
117
+ happel<AppState, AppActions | CounterActions>({
118
+ state: appState,
119
+ view: appView,
120
+ dispatcher: appDispatcher,
121
+ name: "app",
122
+ attributes: [],
123
+ debug: true
124
+ });
@@ -1,7 +1,7 @@
1
1
  import { HElements } from "../src/hsml";
2
- import { HAction, HApp, HAppAction, happi, HAppI, HDispatch } from "../src/hsml-app";
2
+ import { HAction, HApp, HAppActions, HDispatch, happ } from "../src/hsml-app";
3
3
 
4
- enum Action {
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
- class App implements HAppI<State> {
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", Action.name]
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 dispatcher(this: HApp<State>, action: HAction, state: State, dispatch: HDispatch): Promise<void> {
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 HAppAction._mount:
39
+ case HAppActions.mount:
41
40
  this.refs["focus"].focus();
42
41
  break;
43
42
 
44
- case Action.name:
43
+ case Actions.name:
45
44
  state.name = action.data;
46
45
  break;
47
46
  }
47
+ },
48
48
 
49
- // console.log("state:", JSON.stringify(state));
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<STATE> = (state: STATE, dispatch: Dispatch) => HElements;
4
+ type View<State, Actions extends string> = (state: State, dispatch: Dispatch<Actions>) => HElements<Actions>;
5
5
 
6
- type Dispatch = (event: string, data?: any) => void;
6
+ type Dispatch<Actions extends string> = (action: Actions, data?: any) => void;
7
7
 
8
- type Dispatcher<STATE> = (event: string, data: any, state: STATE, dispatch: Dispatch) => STATE;
8
+ type Dispatcher<State, Actions extends string> = (action: Actions, data: any, state: State, dispatch: Dispatch<Actions>) => State;
9
9
 
10
- function render<STATE>(element: HTMLElement,
11
- view: View<STATE>,
12
- state: 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 = (event: string, data?: any): void => {
29
- // console.log("dispatch", event, data);
30
- const state = dispatcher(event, data, appState, dispatch);
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 AppState = typeof appState;
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<AppState> = (state: AppState, dispatch: Dispatch): HElements => {
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<AppState> = (event: string, data: any, state: AppState, dispatch: Dispatch): AppState => {
63
- // console.log("reduce", event, data);
64
- switch (event) {
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 event", event, data);
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("event", {});
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, happi } from "../../dist/browser-esmodule/hsml-app.js";
17
- // import { HApp, happi } from "https://unpkg.com/peryl/dist/browser-esmodule/hsml-app.js";
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 Action = {
19
+ const Actions = {
20
20
  change: "change",
21
21
  reset: "reset"
22
22
  };
23
23
 
24
- class App {
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", { type: "text", placeholder: "Name", value: state.name, on: ["input", Action.change] }],
34
- ["button", { type: "button", on: ["click", Action.reset] }, "Reset"]
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 dispatcher(action, state, dispatch) {
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 HAppAction._init:
45
- case HAppAction._mount:
46
- case HAppAction._umount:
52
+ case HAppActions.init:
53
+ case HAppActions.mount:
54
+ case HAppActions.umount:
47
55
  break;
48
56
 
49
- case Action.change:
57
+ case Actions.change:
50
58
  state.name = action.data;
51
59
  break;
52
60
 
53
- case Action.reset:
61
+ case Actions.reset:
54
62
  state.name = new String();
55
63
  break;
56
64
  }
57
- }
58
- }
65
+ },
59
66
 
60
- HApp.debug = true;
61
-
62
- happi(App, "app");
67
+ element: "app",
68
+ debug: true
69
+ });
63
70
 
64
71
  </script>
65
72
  </body>