kokopu-react 1.11.0 → 2.0.0

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 (526) hide show
  1. package/.eslintrc.yml +84 -0
  2. package/.nycrc.yml +0 -1
  3. package/README.md +1 -1
  4. package/{src/css/chessboard.css → dist/lib/chessboard/Chessboard.css} +2 -2
  5. package/dist/lib/chessboard/Chessboard.d.ts +171 -0
  6. package/dist/lib/chessboard/Chessboard.js +365 -0
  7. package/dist/lib/chessboard/Chessboard.js.map +1 -0
  8. package/dist/lib/chessboard/ChessboardImpl.d.ts +119 -0
  9. package/dist/lib/chessboard/ChessboardImpl.js +471 -0
  10. package/dist/lib/chessboard/ChessboardImpl.js.map +1 -0
  11. package/dist/lib/chessboard/Draggable.d.ts +62 -0
  12. package/dist/lib/chessboard/Draggable.js +157 -0
  13. package/dist/lib/chessboard/Draggable.js.map +1 -0
  14. package/dist/lib/chessboard/Motion.d.ts +28 -0
  15. package/dist/lib/chessboard/Motion.js +74 -0
  16. package/dist/lib/chessboard/Motion.js.map +1 -0
  17. package/dist/lib/chessboard/colorsets.d.ts +5 -0
  18. package/dist/lib/{impl → chessboard}/colorsets.js +43 -47
  19. package/dist/lib/chessboard/colorsets.js.map +1 -0
  20. package/dist/lib/chessboard/piecesets.d.ts +5 -0
  21. package/dist/lib/chessboard/piecesets.js +214 -0
  22. package/dist/lib/chessboard/piecesets.js.map +1 -0
  23. package/dist/lib/{sprites → chessboard/sprites}/cburnett-bb.png +0 -0
  24. package/dist/lib/{sprites → chessboard/sprites}/cburnett-bk.png +0 -0
  25. package/dist/lib/{sprites → chessboard/sprites}/cburnett-bn.png +0 -0
  26. package/dist/lib/{sprites → chessboard/sprites}/cburnett-bp.png +0 -0
  27. package/dist/lib/{sprites → chessboard/sprites}/cburnett-bq.png +0 -0
  28. package/dist/lib/{sprites → chessboard/sprites}/cburnett-br.png +0 -0
  29. package/dist/lib/{sprites → chessboard/sprites}/cburnett-bx.png +0 -0
  30. package/dist/lib/{sprites → chessboard/sprites}/cburnett-wb.png +0 -0
  31. package/dist/lib/{sprites → chessboard/sprites}/cburnett-wk.png +0 -0
  32. package/dist/lib/{sprites → chessboard/sprites}/cburnett-wn.png +0 -0
  33. package/dist/lib/{sprites → chessboard/sprites}/cburnett-wp.png +0 -0
  34. package/dist/lib/{sprites → chessboard/sprites}/cburnett-wq.png +0 -0
  35. package/dist/lib/{sprites → chessboard/sprites}/cburnett-wr.png +0 -0
  36. package/dist/lib/{sprites → chessboard/sprites}/cburnett-wx.png +0 -0
  37. package/dist/lib/{sprites → chessboard/sprites}/celtic-bb.png +0 -0
  38. package/dist/lib/{sprites → chessboard/sprites}/celtic-bk.png +0 -0
  39. package/dist/lib/{sprites → chessboard/sprites}/celtic-bn.png +0 -0
  40. package/dist/lib/{sprites → chessboard/sprites}/celtic-bp.png +0 -0
  41. package/dist/lib/{sprites → chessboard/sprites}/celtic-bq.png +0 -0
  42. package/dist/lib/{sprites → chessboard/sprites}/celtic-br.png +0 -0
  43. package/dist/lib/{sprites → chessboard/sprites}/celtic-bx.png +0 -0
  44. package/dist/lib/{sprites → chessboard/sprites}/celtic-wb.png +0 -0
  45. package/dist/lib/{sprites → chessboard/sprites}/celtic-wk.png +0 -0
  46. package/dist/lib/{sprites → chessboard/sprites}/celtic-wn.png +0 -0
  47. package/dist/lib/{sprites → chessboard/sprites}/celtic-wp.png +0 -0
  48. package/dist/lib/{sprites → chessboard/sprites}/celtic-wq.png +0 -0
  49. package/dist/lib/{sprites → chessboard/sprites}/celtic-wr.png +0 -0
  50. package/dist/lib/{sprites → chessboard/sprites}/celtic-wx.png +0 -0
  51. package/dist/lib/{sprites → chessboard/sprites}/eyes-bb.png +0 -0
  52. package/dist/lib/{sprites → chessboard/sprites}/eyes-bk.png +0 -0
  53. package/dist/lib/{sprites → chessboard/sprites}/eyes-bn.png +0 -0
  54. package/dist/lib/{sprites → chessboard/sprites}/eyes-bp.png +0 -0
  55. package/dist/lib/{sprites → chessboard/sprites}/eyes-bq.png +0 -0
  56. package/dist/lib/{sprites → chessboard/sprites}/eyes-br.png +0 -0
  57. package/dist/lib/{sprites → chessboard/sprites}/eyes-spatial-bx.png +0 -0
  58. package/dist/lib/{sprites → chessboard/sprites}/eyes-spatial-wx.png +0 -0
  59. package/dist/lib/{sprites → chessboard/sprites}/eyes-wb.png +0 -0
  60. package/dist/lib/{sprites → chessboard/sprites}/eyes-wk.png +0 -0
  61. package/dist/lib/{sprites → chessboard/sprites}/eyes-wn.png +0 -0
  62. package/dist/lib/{sprites → chessboard/sprites}/eyes-wp.png +0 -0
  63. package/dist/lib/{sprites → chessboard/sprites}/eyes-wq.png +0 -0
  64. package/dist/lib/{sprites → chessboard/sprites}/eyes-wr.png +0 -0
  65. package/dist/lib/{sprites → chessboard/sprites}/fantasy-bb.png +0 -0
  66. package/dist/lib/{sprites → chessboard/sprites}/fantasy-bk.png +0 -0
  67. package/dist/lib/{sprites → chessboard/sprites}/fantasy-bn.png +0 -0
  68. package/dist/lib/{sprites → chessboard/sprites}/fantasy-bp.png +0 -0
  69. package/dist/lib/{sprites → chessboard/sprites}/fantasy-bq.png +0 -0
  70. package/dist/lib/{sprites → chessboard/sprites}/fantasy-br.png +0 -0
  71. package/dist/lib/{sprites → chessboard/sprites}/fantasy-bx.png +0 -0
  72. package/dist/lib/{sprites → chessboard/sprites}/fantasy-wb.png +0 -0
  73. package/dist/lib/{sprites → chessboard/sprites}/fantasy-wk.png +0 -0
  74. package/dist/lib/{sprites → chessboard/sprites}/fantasy-wn.png +0 -0
  75. package/dist/lib/{sprites → chessboard/sprites}/fantasy-wp.png +0 -0
  76. package/dist/lib/{sprites → chessboard/sprites}/fantasy-wq.png +0 -0
  77. package/dist/lib/{sprites → chessboard/sprites}/fantasy-wr.png +0 -0
  78. package/dist/lib/{sprites → chessboard/sprites}/fantasy-wx.png +0 -0
  79. package/dist/lib/{sprites → chessboard/sprites}/skulls-bb.png +0 -0
  80. package/dist/lib/{sprites → chessboard/sprites}/skulls-bk.png +0 -0
  81. package/dist/lib/{sprites → chessboard/sprites}/skulls-bn.png +0 -0
  82. package/dist/lib/{sprites → chessboard/sprites}/skulls-bp.png +0 -0
  83. package/dist/lib/{sprites → chessboard/sprites}/skulls-bq.png +0 -0
  84. package/dist/lib/{sprites → chessboard/sprites}/skulls-br.png +0 -0
  85. package/dist/lib/{sprites → chessboard/sprites}/skulls-bx.png +0 -0
  86. package/dist/lib/{sprites → chessboard/sprites}/skulls-wb.png +0 -0
  87. package/dist/lib/{sprites → chessboard/sprites}/skulls-wk.png +0 -0
  88. package/dist/lib/{sprites → chessboard/sprites}/skulls-wn.png +0 -0
  89. package/dist/lib/{sprites → chessboard/sprites}/skulls-wp.png +0 -0
  90. package/dist/lib/{sprites → chessboard/sprites}/skulls-wq.png +0 -0
  91. package/dist/lib/{sprites → chessboard/sprites}/skulls-wr.png +0 -0
  92. package/dist/lib/{sprites → chessboard/sprites}/skulls-wx.png +0 -0
  93. package/dist/lib/{sprites → chessboard/sprites}/spatial-bb.png +0 -0
  94. package/dist/lib/{sprites → chessboard/sprites}/spatial-bk.png +0 -0
  95. package/dist/lib/{sprites → chessboard/sprites}/spatial-bn.png +0 -0
  96. package/dist/lib/{sprites → chessboard/sprites}/spatial-bp.png +0 -0
  97. package/dist/lib/{sprites → chessboard/sprites}/spatial-bq.png +0 -0
  98. package/dist/lib/{sprites → chessboard/sprites}/spatial-br.png +0 -0
  99. package/dist/lib/{sprites → chessboard/sprites}/spatial-wb.png +0 -0
  100. package/dist/lib/{sprites → chessboard/sprites}/spatial-wk.png +0 -0
  101. package/dist/lib/{sprites → chessboard/sprites}/spatial-wn.png +0 -0
  102. package/dist/lib/{sprites → chessboard/sprites}/spatial-wp.png +0 -0
  103. package/dist/lib/{sprites → chessboard/sprites}/spatial-wq.png +0 -0
  104. package/dist/lib/{sprites → chessboard/sprites}/spatial-wr.png +0 -0
  105. package/dist/lib/{css/error_box.css → errorbox/ErrorBox.css} +2 -2
  106. package/dist/lib/errorbox/ErrorBox.d.ts +28 -0
  107. package/dist/lib/errorbox/ErrorBox.js +84 -0
  108. package/dist/lib/errorbox/ErrorBox.js.map +1 -0
  109. package/dist/lib/exception.d.ts +18 -0
  110. package/dist/lib/exception.js +40 -0
  111. package/dist/lib/exception.js.map +1 -0
  112. package/dist/lib/i18n.d.ts +18 -0
  113. package/dist/lib/i18n.js +20 -33
  114. package/dist/lib/i18n.js.map +1 -0
  115. package/{src/css/symbol.css → dist/lib/icons/AnnotationSymbolShape.css} +2 -2
  116. package/dist/lib/icons/AnnotationSymbolShape.d.ts +30 -0
  117. package/dist/lib/{impl/ArrowTip.js → icons/AnnotationSymbolShape.js} +21 -35
  118. package/dist/lib/icons/AnnotationSymbolShape.js.map +1 -0
  119. package/dist/lib/icons/ArrowMarkerIcon.d.ts +20 -0
  120. package/dist/lib/icons/ArrowMarkerIcon.js +53 -0
  121. package/dist/lib/icons/ArrowMarkerIcon.js.map +1 -0
  122. package/dist/lib/icons/ArrowTip.d.ts +16 -0
  123. package/dist/lib/icons/ArrowTip.js +29 -0
  124. package/dist/lib/icons/ArrowTip.js.map +1 -0
  125. package/dist/lib/icons/SquareMarkerIcon.d.ts +18 -0
  126. package/{src/i18n.js → dist/lib/icons/SquareMarkerIcon.js} +24 -23
  127. package/dist/lib/icons/SquareMarkerIcon.js.map +1 -0
  128. package/dist/lib/icons/TextMarkerIcon.d.ts +23 -0
  129. package/dist/lib/icons/TextMarkerIcon.js +45 -0
  130. package/dist/lib/icons/TextMarkerIcon.js.map +1 -0
  131. package/{src/css → dist/lib/icons}/arrow.css +2 -2
  132. package/dist/lib/index.d.ts +10 -0
  133. package/dist/lib/index.js +31 -105
  134. package/dist/lib/index.js.map +1 -0
  135. package/dist/lib/{css/movetext.css → movetext/Movetext.css} +2 -2
  136. package/dist/lib/movetext/Movetext.d.ts +136 -0
  137. package/dist/lib/movetext/Movetext.js +167 -0
  138. package/dist/lib/movetext/Movetext.js.map +1 -0
  139. package/dist/lib/movetext/MovetextImpl.d.ts +85 -0
  140. package/dist/lib/movetext/MovetextImpl.js +411 -0
  141. package/dist/lib/movetext/MovetextImpl.js.map +1 -0
  142. package/dist/lib/{fonts → movetext/fonts}/chessalpha.woff +0 -0
  143. package/dist/lib/{fonts → movetext/fonts}/chessalpha.woff2 +0 -0
  144. package/dist/lib/{css → movetext}/fonts.css +4 -4
  145. package/dist/lib/movetext/htmlFilter.d.ts +7 -0
  146. package/dist/lib/movetext/htmlFilter.js +169 -0
  147. package/dist/lib/movetext/htmlFilter.js.map +1 -0
  148. package/dist/lib/movetext/moveFormatter.d.ts +20 -0
  149. package/dist/lib/movetext/moveFormatter.js +93 -0
  150. package/dist/lib/movetext/moveFormatter.js.map +1 -0
  151. package/dist/lib/sanitization.d.ts +6 -0
  152. package/dist/lib/sanitization.js +39 -0
  153. package/dist/lib/sanitization.js.map +1 -0
  154. package/dist/lib/types.d.ts +151 -0
  155. package/dist/lib/types.js +162 -0
  156. package/dist/lib/types.js.map +1 -0
  157. package/dist/lib/util.d.ts +2 -0
  158. package/dist/lib/util.js +36 -0
  159. package/dist/lib/util.js.map +1 -0
  160. package/doc_src/demo/{PageChessboardBase.js → PageChessboardBase.tsx} +30 -24
  161. package/doc_src/demo/{PageChessboardInteraction.js → PageChessboardInteraction.tsx} +95 -66
  162. package/doc_src/demo/{PageChessboardMove.js → PageChessboardMove.tsx} +66 -54
  163. package/doc_src/demo/{PageChessboardSmallScreens.js → PageChessboardSmallScreens.tsx} +23 -14
  164. package/doc_src/demo/{PageMovetextBase.js → PageMovetextBase.tsx} +62 -49
  165. package/doc_src/demo/{PageMovetextInteraction.js → PageMovetextInteraction.tsx} +58 -43
  166. package/doc_src/demo/decs.d.ts +31 -0
  167. package/doc_src/demo/demo.css +2 -2
  168. package/doc_src/demo/{util.js → util.ts} +3 -3
  169. package/doc_src/migrate_to_2.md +26 -0
  170. package/doc_src/theming/LogoRenderer.js +5 -5
  171. package/doc_src/theming/theming.css +8 -2
  172. package/package.json +31 -24
  173. package/scripts/docker-compose.yml +1 -1
  174. package/scripts/test-graphic.tsconfig.json +7 -0
  175. package/scripts/test-graphic.webpack.config.js +33 -17
  176. package/scripts/test-headless.webpack.config.js +6 -10
  177. package/{dist/lib/css/chessboard.css → src/chessboard/Chessboard.css} +2 -2
  178. package/src/chessboard/Chessboard.tsx +575 -0
  179. package/src/chessboard/ChessboardImpl.tsx +632 -0
  180. package/src/chessboard/Draggable.tsx +252 -0
  181. package/src/{impl/Motion.js → chessboard/Motion.tsx} +37 -27
  182. package/src/chessboard/colorsets.ts +134 -0
  183. package/src/chessboard/piecesets.ts +229 -0
  184. package/src/{sprites → chessboard/sprites}/cburnett-bb.png +0 -0
  185. package/src/{sprites → chessboard/sprites}/cburnett-bk.png +0 -0
  186. package/src/{sprites → chessboard/sprites}/cburnett-bn.png +0 -0
  187. package/src/{sprites → chessboard/sprites}/cburnett-bp.png +0 -0
  188. package/src/{sprites → chessboard/sprites}/cburnett-bq.png +0 -0
  189. package/src/{sprites → chessboard/sprites}/cburnett-br.png +0 -0
  190. package/src/{sprites → chessboard/sprites}/cburnett-bx.png +0 -0
  191. package/src/{sprites → chessboard/sprites}/cburnett-wb.png +0 -0
  192. package/src/{sprites → chessboard/sprites}/cburnett-wk.png +0 -0
  193. package/src/{sprites → chessboard/sprites}/cburnett-wn.png +0 -0
  194. package/src/{sprites → chessboard/sprites}/cburnett-wp.png +0 -0
  195. package/src/{sprites → chessboard/sprites}/cburnett-wq.png +0 -0
  196. package/src/{sprites → chessboard/sprites}/cburnett-wr.png +0 -0
  197. package/src/{sprites → chessboard/sprites}/cburnett-wx.png +0 -0
  198. package/src/{sprites → chessboard/sprites}/celtic-bb.png +0 -0
  199. package/src/{sprites → chessboard/sprites}/celtic-bk.png +0 -0
  200. package/src/{sprites → chessboard/sprites}/celtic-bn.png +0 -0
  201. package/src/{sprites → chessboard/sprites}/celtic-bp.png +0 -0
  202. package/src/{sprites → chessboard/sprites}/celtic-bq.png +0 -0
  203. package/src/{sprites → chessboard/sprites}/celtic-br.png +0 -0
  204. package/src/{sprites → chessboard/sprites}/celtic-bx.png +0 -0
  205. package/src/{sprites → chessboard/sprites}/celtic-wb.png +0 -0
  206. package/src/{sprites → chessboard/sprites}/celtic-wk.png +0 -0
  207. package/src/{sprites → chessboard/sprites}/celtic-wn.png +0 -0
  208. package/src/{sprites → chessboard/sprites}/celtic-wp.png +0 -0
  209. package/src/{sprites → chessboard/sprites}/celtic-wq.png +0 -0
  210. package/src/{sprites → chessboard/sprites}/celtic-wr.png +0 -0
  211. package/src/{sprites → chessboard/sprites}/celtic-wx.png +0 -0
  212. package/src/{sprites → chessboard/sprites}/eyes-bb.png +0 -0
  213. package/src/{sprites → chessboard/sprites}/eyes-bk.png +0 -0
  214. package/src/{sprites → chessboard/sprites}/eyes-bn.png +0 -0
  215. package/src/{sprites → chessboard/sprites}/eyes-bp.png +0 -0
  216. package/src/{sprites → chessboard/sprites}/eyes-bq.png +0 -0
  217. package/src/{sprites → chessboard/sprites}/eyes-br.png +0 -0
  218. package/src/{sprites → chessboard/sprites}/eyes-spatial-bx.png +0 -0
  219. package/src/{sprites → chessboard/sprites}/eyes-spatial-wx.png +0 -0
  220. package/src/{sprites → chessboard/sprites}/eyes-wb.png +0 -0
  221. package/src/{sprites → chessboard/sprites}/eyes-wk.png +0 -0
  222. package/src/{sprites → chessboard/sprites}/eyes-wn.png +0 -0
  223. package/src/{sprites → chessboard/sprites}/eyes-wp.png +0 -0
  224. package/src/{sprites → chessboard/sprites}/eyes-wq.png +0 -0
  225. package/src/{sprites → chessboard/sprites}/eyes-wr.png +0 -0
  226. package/src/{sprites → chessboard/sprites}/fantasy-bb.png +0 -0
  227. package/src/{sprites → chessboard/sprites}/fantasy-bk.png +0 -0
  228. package/src/{sprites → chessboard/sprites}/fantasy-bn.png +0 -0
  229. package/src/{sprites → chessboard/sprites}/fantasy-bp.png +0 -0
  230. package/src/{sprites → chessboard/sprites}/fantasy-bq.png +0 -0
  231. package/src/{sprites → chessboard/sprites}/fantasy-br.png +0 -0
  232. package/src/{sprites → chessboard/sprites}/fantasy-bx.png +0 -0
  233. package/src/{sprites → chessboard/sprites}/fantasy-wb.png +0 -0
  234. package/src/{sprites → chessboard/sprites}/fantasy-wk.png +0 -0
  235. package/src/{sprites → chessboard/sprites}/fantasy-wn.png +0 -0
  236. package/src/{sprites → chessboard/sprites}/fantasy-wp.png +0 -0
  237. package/src/{sprites → chessboard/sprites}/fantasy-wq.png +0 -0
  238. package/src/{sprites → chessboard/sprites}/fantasy-wr.png +0 -0
  239. package/src/{sprites → chessboard/sprites}/fantasy-wx.png +0 -0
  240. package/src/{sprites → chessboard/sprites}/skulls-bb.png +0 -0
  241. package/src/{sprites → chessboard/sprites}/skulls-bk.png +0 -0
  242. package/src/{sprites → chessboard/sprites}/skulls-bn.png +0 -0
  243. package/src/{sprites → chessboard/sprites}/skulls-bp.png +0 -0
  244. package/src/{sprites → chessboard/sprites}/skulls-bq.png +0 -0
  245. package/src/{sprites → chessboard/sprites}/skulls-br.png +0 -0
  246. package/src/{sprites → chessboard/sprites}/skulls-bx.png +0 -0
  247. package/src/{sprites → chessboard/sprites}/skulls-wb.png +0 -0
  248. package/src/{sprites → chessboard/sprites}/skulls-wk.png +0 -0
  249. package/src/{sprites → chessboard/sprites}/skulls-wn.png +0 -0
  250. package/src/{sprites → chessboard/sprites}/skulls-wp.png +0 -0
  251. package/src/{sprites → chessboard/sprites}/skulls-wq.png +0 -0
  252. package/src/{sprites → chessboard/sprites}/skulls-wr.png +0 -0
  253. package/src/{sprites → chessboard/sprites}/skulls-wx.png +0 -0
  254. package/src/{sprites → chessboard/sprites}/spatial-bb.png +0 -0
  255. package/src/{sprites → chessboard/sprites}/spatial-bk.png +0 -0
  256. package/src/{sprites → chessboard/sprites}/spatial-bn.png +0 -0
  257. package/src/{sprites → chessboard/sprites}/spatial-bp.png +0 -0
  258. package/src/{sprites → chessboard/sprites}/spatial-bq.png +0 -0
  259. package/src/{sprites → chessboard/sprites}/spatial-br.png +0 -0
  260. package/src/{sprites → chessboard/sprites}/spatial-wb.png +0 -0
  261. package/src/{sprites → chessboard/sprites}/spatial-wk.png +0 -0
  262. package/src/{sprites → chessboard/sprites}/spatial-wn.png +0 -0
  263. package/src/{sprites → chessboard/sprites}/spatial-wp.png +0 -0
  264. package/src/{sprites → chessboard/sprites}/spatial-wq.png +0 -0
  265. package/src/{sprites → chessboard/sprites}/spatial-wr.png +0 -0
  266. package/src/decs.d.ts +26 -0
  267. package/src/{css/error_box.css → errorbox/ErrorBox.css} +2 -2
  268. package/src/errorbox/ErrorBox.tsx +129 -0
  269. package/src/exception.ts +51 -0
  270. package/src/i18n.ts +43 -0
  271. package/{dist/lib/css/symbol.css → src/icons/AnnotationSymbolShape.css} +2 -2
  272. package/src/{impl/TextSymbol.js → icons/AnnotationSymbolShape.tsx} +32 -30
  273. package/src/{ArrowMarkerIcon.js → icons/ArrowMarkerIcon.tsx} +39 -36
  274. package/src/{impl/ArrowTip.js → icons/ArrowTip.tsx} +20 -20
  275. package/src/{SquareMarkerIcon.js → icons/SquareMarkerIcon.tsx} +35 -28
  276. package/src/{TextMarkerIcon.js → icons/TextMarkerIcon.tsx} +40 -32
  277. package/{dist/lib/css → src/icons}/arrow.css +2 -2
  278. package/src/index.ts +38 -0
  279. package/src/{css/movetext.css → movetext/Movetext.css} +2 -2
  280. package/src/movetext/Movetext.tsx +278 -0
  281. package/src/movetext/MovetextImpl.tsx +493 -0
  282. package/src/{fonts → movetext/fonts}/chessalpha.woff +0 -0
  283. package/src/{fonts → movetext/fonts}/chessalpha.woff2 +0 -0
  284. package/src/{css → movetext}/fonts.css +4 -4
  285. package/src/movetext/htmlFilter.tsx +188 -0
  286. package/src/{formatmove.js → movetext/moveFormatter.tsx} +39 -26
  287. package/src/sanitization.ts +51 -0
  288. package/src/types.ts +311 -0
  289. package/src/util.ts +39 -0
  290. package/test/.eslintrc.yml +3 -3
  291. package/test/{1_markers.js → 01_types.js} +89 -4
  292. package/test/{2_chessboard_util.js → 02_chessboard_util.js} +16 -7
  293. package/test/{3_marker_icons_graphic.js → 03_error_box_graphic.js} +20 -14
  294. package/test/04_marker_icons_graphic.js +49 -0
  295. package/test/05_chessboard_graphic.js +92 -0
  296. package/test/06_chessboard_animation.js +71 -0
  297. package/test/07_chessboard_interaction.js +130 -0
  298. package/test/08_chessboard_play_moves.js +98 -0
  299. package/test/{7_movetext_graphic.js → 09_movetext_graphic.js} +32 -16
  300. package/test/{8_movetext_interaction.js → 10_movetext_interaction.js} +18 -23
  301. package/test/common/graphic.js +67 -33
  302. package/test/graphic_references/03_error_box_graphic/base/cut_beginning_of_text.png +0 -0
  303. package/test/graphic_references/03_error_box_graphic/base/cut_end_of_text.png +0 -0
  304. package/test/graphic_references/03_error_box_graphic/base/cut_on_line_breaks.png +0 -0
  305. package/test/graphic_references/03_error_box_graphic/base/error_index_not_integer.png +0 -0
  306. package/test/graphic_references/03_error_box_graphic/base/full.png +0 -0
  307. package/test/graphic_references/03_error_box_graphic/base/minimal.png +0 -0
  308. package/test/graphic_references/03_error_box_graphic/base/missing_error_index.png +0 -0
  309. package/test/graphic_references/03_error_box_graphic/base/missing_error_text.png +0 -0
  310. package/test/graphic_references/03_error_box_graphic/base/negative_error_index.png +0 -0
  311. package/test/graphic_references/03_error_box_graphic/base/single_character_text.png +0 -0
  312. package/test/graphic_references/03_error_box_graphic/base/too_large_error_index.png +0 -0
  313. package/test/graphic_references/03_error_box_graphic/localization/default.png +0 -0
  314. package/test/graphic_references/04_marker_icons_graphic/base/colorized_arrow.png +0 -0
  315. package/test/{references/01_marker_icons/1.png → graphic_references/04_marker_icons_graphic/base/colorized_square.png} +0 -0
  316. package/test/graphic_references/04_marker_icons_graphic/base/colorized_symbol.png +0 -0
  317. package/test/graphic_references/04_marker_icons_graphic/base/colorized_text.png +0 -0
  318. package/test/graphic_references/04_marker_icons_graphic/base/default_arrow.png +0 -0
  319. package/test/{references/01_marker_icons/0.png → graphic_references/04_marker_icons_graphic/base/default_square.png} +0 -0
  320. package/test/graphic_references/04_marker_icons_graphic/base/default_text.png +0 -0
  321. package/test/graphic_references/04_marker_icons_graphic/base/invalid_arrow_size.png +0 -0
  322. package/test/graphic_references/04_marker_icons_graphic/base/invalid_square_size.png +0 -0
  323. package/test/graphic_references/04_marker_icons_graphic/base/invalid_symbol.png +0 -0
  324. package/test/graphic_references/04_marker_icons_graphic/base/invalid_text_size.png +0 -0
  325. package/test/graphic_references/04_marker_icons_graphic/base/wrapped_arrow.png +0 -0
  326. package/test/{references/01_marker_icons/2.png → graphic_references/04_marker_icons_graphic/base/wrapped_square.png} +0 -0
  327. package/test/graphic_references/04_marker_icons_graphic/base/wrapped_symbol.png +0 -0
  328. package/test/graphic_references/04_marker_icons_graphic/base/wrapped_text.png +0 -0
  329. package/test/{references/04_chessboard_annotations/4.png → graphic_references/05_chessboard_graphic/annotations/overlap.png} +0 -0
  330. package/test/{references/04_chessboard_annotations/5.png → graphic_references/05_chessboard_graphic/annotations/overlap_and_flip.png} +0 -0
  331. package/test/{references/04_chessboard_annotations/0.png → graphic_references/05_chessboard_graphic/annotations/with_coordinates.png} +0 -0
  332. package/test/{references/04_chessboard_annotations/1.png → graphic_references/05_chessboard_graphic/annotations/with_coordinates_and_flip.png} +0 -0
  333. package/test/{references/04_chessboard_annotations/2.png → graphic_references/05_chessboard_graphic/annotations/without_coordinates.png} +0 -0
  334. package/test/{references/04_chessboard_annotations/3.png → graphic_references/05_chessboard_graphic/annotations/without_coordinates_and_flip.png} +0 -0
  335. package/test/{references/02_chessboard_simple/0.png → graphic_references/05_chessboard_graphic/base/default.png} +0 -0
  336. package/test/{references/02_chessboard_simple/1.png → graphic_references/05_chessboard_graphic/base/empty.png} +0 -0
  337. package/test/{references/02_chessboard_simple/3.png → graphic_references/05_chessboard_graphic/base/from_fen.png} +0 -0
  338. package/test/{references/02_chessboard_simple/4.png → graphic_references/05_chessboard_graphic/base/from_kokopu_object.png} +0 -0
  339. package/test/{references/02_chessboard_simple/2.png → graphic_references/05_chessboard_graphic/base/parsing_error.png} +0 -0
  340. package/test/graphic_references/05_chessboard_graphic/base/wrong_position_type.png +0 -0
  341. package/test/graphic_references/05_chessboard_graphic/chess_variants/chess960.png +0 -0
  342. package/test/graphic_references/05_chessboard_graphic/chess_variants/chess960_with_move.png +0 -0
  343. package/test/graphic_references/05_chessboard_graphic/chess_variants/invalid_variant.png +0 -0
  344. package/test/graphic_references/05_chessboard_graphic/chess_variants/invalid_variant_with_fen.png +0 -0
  345. package/test/graphic_references/05_chessboard_graphic/chess_variants/special_code.png +0 -0
  346. package/test/graphic_references/05_chessboard_graphic/chess_variants/variant_with_std_initial_position.png +0 -0
  347. package/test/{references/03_chessboard_flipped/2.png → graphic_references/05_chessboard_graphic/chess_variants/variant_without_std_initial_position.png} +0 -0
  348. package/test/{references/03_chessboard_flipped/0.png → graphic_references/05_chessboard_graphic/flipped/default.png} +0 -0
  349. package/test/{references/03_chessboard_flipped/1.png → graphic_references/05_chessboard_graphic/flipped/empty.png} +0 -0
  350. package/test/{references/03_chessboard_flipped/3.png → graphic_references/05_chessboard_graphic/flipped/from_fen.png} +0 -0
  351. package/test/{references/03_chessboard_flipped/4.png → graphic_references/05_chessboard_graphic/flipped/from_kokopu_object.png} +0 -0
  352. package/test/graphic_references/05_chessboard_graphic/flipped/parsing_error.png +0 -0
  353. package/test/{references/05_chessboard_move/4.png → graphic_references/05_chessboard_graphic/move/capture.png} +0 -0
  354. package/test/{references/05_chessboard_move/5.png → graphic_references/05_chessboard_graphic/move/castling_move.png} +0 -0
  355. package/test/{references/05_chessboard_move/0.png → graphic_references/05_chessboard_graphic/move/default.png} +0 -0
  356. package/test/{references/05_chessboard_move/6.png → graphic_references/05_chessboard_graphic/move/en-passant.png} +0 -0
  357. package/test/{references/05_chessboard_move/1.png → graphic_references/05_chessboard_graphic/move/no_move_arrow.png} +0 -0
  358. package/test/{references/05_chessboard_move/2.png → graphic_references/05_chessboard_graphic/move/parsing_error.png} +0 -0
  359. package/test/{references/05_chessboard_move/7.png → graphic_references/05_chessboard_graphic/move/promotion.png} +0 -0
  360. package/test/{references/05_chessboard_move/3.png → graphic_references/05_chessboard_graphic/move/with_forced_move_arrow_and_flip.png} +0 -0
  361. package/test/graphic_references/05_chessboard_graphic/move/wrong_move_arrow_color_type.png +0 -0
  362. package/test/graphic_references/05_chessboard_graphic/move/wrong_move_type.png +0 -0
  363. package/test/{references/07_chessboard_theme/3.png → graphic_references/05_chessboard_graphic/theme/custom_1.png} +0 -0
  364. package/test/{references/07_chessboard_theme/4.png → graphic_references/05_chessboard_graphic/theme/custom_2.png} +0 -0
  365. package/test/{references/07_chessboard_theme/5.png → graphic_references/05_chessboard_graphic/theme/custom_3.png} +0 -0
  366. package/test/{references/07_chessboard_theme/6.png → graphic_references/05_chessboard_graphic/theme/custom_4.png} +0 -0
  367. package/test/{references/07_chessboard_theme/7.png → graphic_references/05_chessboard_graphic/theme/custom_5.png} +0 -0
  368. package/test/{references/07_chessboard_theme/8.png → graphic_references/05_chessboard_graphic/theme/custom_6.png} +0 -0
  369. package/test/{references/07_chessboard_theme/0.png → graphic_references/05_chessboard_graphic/theme/default.png} +0 -0
  370. package/test/{references/07_chessboard_theme/1.png → graphic_references/05_chessboard_graphic/theme/large.png} +0 -0
  371. package/test/{references/07_chessboard_theme/2.png → graphic_references/05_chessboard_graphic/theme/small.png} +0 -0
  372. package/test/graphic_references/05_chessboard_graphic/theme/wrong_colorset.png +0 -0
  373. package/test/graphic_references/05_chessboard_graphic/theme/wrong_pieceset.png +0 -0
  374. package/test/graphic_references/05_chessboard_graphic/theme/wrong_square_size_type.png +0 -0
  375. package/test/{references/06a_chessboard_animated_move/2.png → graphic_references/06_chessboard_animation/base_1/capture.png} +0 -0
  376. package/test/{references/06a_chessboard_animated_move/3.png → graphic_references/06_chessboard_animation/base_1/castling_move.png} +0 -0
  377. package/test/{references/06a_chessboard_animated_move/4.png → graphic_references/06_chessboard_animation/base_1/en-passant.png} +0 -0
  378. package/test/{references/06a_chessboard_animated_move/0.png → graphic_references/06_chessboard_animation/base_1/move_1.png} +0 -0
  379. package/test/{references/06a_chessboard_animated_move/1.png → graphic_references/06_chessboard_animation/base_1/move_2.png} +0 -0
  380. package/test/{references/06a_chessboard_animated_move/5.png → graphic_references/06_chessboard_animation/base_1/promotion.png} +0 -0
  381. package/test/{references/06b_chessboard_animated_move/2.png → graphic_references/06_chessboard_animation/base_2/capture.png} +0 -0
  382. package/test/{references/06b_chessboard_animated_move/3.png → graphic_references/06_chessboard_animation/base_2/castling_move.png} +0 -0
  383. package/test/{references/06b_chessboard_animated_move/4.png → graphic_references/06_chessboard_animation/base_2/en-passant.png} +0 -0
  384. package/test/{references/06b_chessboard_animated_move/0.png → graphic_references/06_chessboard_animation/base_2/move_1.png} +0 -0
  385. package/test/{references/06b_chessboard_animated_move/1.png → graphic_references/06_chessboard_animation/base_2/move_2.png} +0 -0
  386. package/test/{references/06b_chessboard_animated_move/5.png → graphic_references/06_chessboard_animation/base_2/promotion.png} +0 -0
  387. package/test/{references/06c_chessboard_animated_move/2.png → graphic_references/06_chessboard_animation/base_3/capture.png} +0 -0
  388. package/test/{references/06c_chessboard_animated_move/3.png → graphic_references/06_chessboard_animation/base_3/castling_move.png} +0 -0
  389. package/test/{references/06c_chessboard_animated_move/4.png → graphic_references/06_chessboard_animation/base_3/en-passant.png} +0 -0
  390. package/test/{references/06c_chessboard_animated_move/0.png → graphic_references/06_chessboard_animation/base_3/move_1.png} +0 -0
  391. package/test/{references/06c_chessboard_animated_move/1.png → graphic_references/06_chessboard_animation/base_3/move_2.png} +0 -0
  392. package/test/{references/06c_chessboard_animated_move/5.png → graphic_references/06_chessboard_animation/base_3/promotion.png} +0 -0
  393. package/test/graphic_references/06_chessboard_animation/on_redraw/final_state.png +0 -0
  394. package/test/graphic_references/06_chessboard_animation/on_redraw/initial_state.png +0 -0
  395. package/test/{references/10_chessboard_edit_arrows → graphic_references/07_chessboard_interaction/edit_arrows}/base_1.png +0 -0
  396. package/test/{references/10_chessboard_edit_arrows → graphic_references/07_chessboard_interaction/edit_arrows}/base_2.png +0 -0
  397. package/test/{references/10_chessboard_edit_arrows/null_vector.png → graphic_references/07_chessboard_interaction/edit_arrows/from_==_to.png} +0 -0
  398. package/test/{references/10_chessboard_edit_arrows → graphic_references/07_chessboard_interaction/edit_arrows}/out_of_board.png +0 -0
  399. package/test/{references/10_chessboard_edit_arrows → graphic_references/07_chessboard_interaction/edit_arrows}/over_arrow_marker.png +0 -0
  400. package/test/{references/10_chessboard_edit_arrows → graphic_references/07_chessboard_interaction/edit_arrows}/over_square_marker.png +0 -0
  401. package/test/graphic_references/07_chessboard_interaction/error/edit_color_not_set.png +0 -0
  402. package/test/graphic_references/07_chessboard_interaction/error/wrong_interaction_mode.png +0 -0
  403. package/test/{references/09_chessboard_move_pieces → graphic_references/07_chessboard_interaction/move_pieces}/after_move.png +0 -0
  404. package/test/{references/09_chessboard_move_pieces/null_vector.png → graphic_references/07_chessboard_interaction/move_pieces/from_==_to.png} +0 -0
  405. package/test/{references/09_chessboard_move_pieces/empty_square.png → graphic_references/07_chessboard_interaction/move_pieces/move_empty_square.png} +0 -0
  406. package/test/{references/09_chessboard_move_pieces → graphic_references/07_chessboard_interaction/move_pieces}/out_of_board.png +0 -0
  407. package/test/{references/09_chessboard_move_pieces → graphic_references/07_chessboard_interaction/move_pieces}/over_arrow_marker.png +0 -0
  408. package/test/{references/09_chessboard_move_pieces → graphic_references/07_chessboard_interaction/move_pieces}/over_empty.png +0 -0
  409. package/test/{references/09_chessboard_move_pieces/over_non_empty_1.png → graphic_references/07_chessboard_interaction/move_pieces/over_non-empty_1.png} +0 -0
  410. package/test/{references/09_chessboard_move_pieces/over_non_empty_2.png → graphic_references/07_chessboard_interaction/move_pieces/over_non-empty_2.png} +0 -0
  411. package/test/{references/09_chessboard_move_pieces → graphic_references/07_chessboard_interaction/move_pieces}/over_square_marker.png +0 -0
  412. package/test/{references/09_chessboard_move_pieces → graphic_references/07_chessboard_interaction/move_pieces}/over_text_marker.png +0 -0
  413. package/test/{references/11_chessboard_play_moves → graphic_references/08_chessboard_play_moves/base}/castling_move.png +0 -0
  414. package/test/{references/11_chessboard_play_moves → graphic_references/08_chessboard_play_moves/base}/chess960_ambiguous_king_move.png +0 -0
  415. package/test/{references/11_chessboard_play_moves → graphic_references/08_chessboard_play_moves/base}/chess960_castling_move_1.png +0 -0
  416. package/test/{references/11_chessboard_play_moves → graphic_references/08_chessboard_play_moves/base}/chess960_castling_move_2.png +0 -0
  417. package/test/{references/11_chessboard_play_moves/chess960_non_kxr_castling.png → graphic_references/08_chessboard_play_moves/base/chess960_non-kxr_castling.png} +0 -0
  418. package/test/{references/11_chessboard_play_moves/null_vector.png → graphic_references/08_chessboard_play_moves/base/from_==_to.png} +0 -0
  419. package/test/{references/11_chessboard_play_moves → graphic_references/08_chessboard_play_moves/base}/illegal_move.png +0 -0
  420. package/test/{references/11_chessboard_play_moves → graphic_references/08_chessboard_play_moves/base}/illegal_position.png +0 -0
  421. package/test/{references/11_chessboard_play_moves → graphic_references/08_chessboard_play_moves/base}/out_of_board.png +0 -0
  422. package/test/{references/11_chessboard_play_moves → graphic_references/08_chessboard_play_moves/base}/regular_move_1.png +0 -0
  423. package/test/{references/11_chessboard_play_moves → graphic_references/08_chessboard_play_moves/base}/regular_move_2.png +0 -0
  424. package/test/{references/10_chessboard_edit_arrows/edit_color_not_set.png → graphic_references/08_chessboard_play_moves/base/wrong_color_moved.png} +0 -0
  425. package/test/{references/12_chessboard_play_promotions → graphic_references/08_chessboard_play_moves/promotions}/antichess_promotion.png +0 -0
  426. package/test/{references/12_chessboard_play_promotions → graphic_references/08_chessboard_play_moves/promotions}/cancel_promotion.png +0 -0
  427. package/test/{references/12_chessboard_play_promotions → graphic_references/08_chessboard_play_moves/promotions}/regular_promotion_1.png +0 -0
  428. package/test/{references/12_chessboard_play_promotions → graphic_references/08_chessboard_play_moves/promotions}/regular_promotion_2.png +0 -0
  429. package/test/{references/13_movetext_simple/0.png → graphic_references/09_movetext_graphic/base/game_1.png} +0 -0
  430. package/test/{references/13_movetext_simple/1.png → graphic_references/09_movetext_graphic/base/game_2.png} +0 -0
  431. package/test/{references/13_movetext_simple/2.png → graphic_references/09_movetext_graphic/base/game_3.png} +0 -0
  432. package/test/{references/13_movetext_simple/3.png → graphic_references/09_movetext_graphic/base/game_4.png} +0 -0
  433. package/test/{references/14_movetext_error/2.png → graphic_references/09_movetext_graphic/error/pgn_parsing_error_1.png} +0 -0
  434. package/test/{references/14_movetext_error/3.png → graphic_references/09_movetext_graphic/error/pgn_parsing_error_2.png} +0 -0
  435. package/test/{references/14_movetext_error/0.png → graphic_references/09_movetext_graphic/error/wrong_game_index_1.png} +0 -0
  436. package/test/{references/14_movetext_error/1.png → graphic_references/09_movetext_graphic/error/wrong_game_index_2.png} +0 -0
  437. package/test/graphic_references/09_movetext_graphic/error/wrong_game_index_type.png +0 -0
  438. package/test/graphic_references/09_movetext_graphic/error/wrong_game_type.png +0 -0
  439. package/test/{references/15_movetext_html/2.png → graphic_references/09_movetext_graphic/html/filtered_tags_and_attributes.png} +0 -0
  440. package/test/{references/15_movetext_html/1.png → graphic_references/09_movetext_graphic/html/html_in_comments.png} +0 -0
  441. package/test/{references/15_movetext_html/0.png → graphic_references/09_movetext_graphic/html/html_in_headers.png} +0 -0
  442. package/test/{references/16_movetext_options/1.png → graphic_references/09_movetext_graphic/options/custom_piece_symbols.png} +0 -0
  443. package/test/{references/16_movetext_options/2.png → graphic_references/09_movetext_graphic/options/figurine_piece_symbols_and_diagram_options.png} +0 -0
  444. package/test/{references/16_movetext_options/3.png → graphic_references/09_movetext_graphic/options/hidden_diagrams.png} +0 -0
  445. package/test/{references/16_movetext_options/0.png → graphic_references/09_movetext_graphic/options/localized_piece_symbols.png} +0 -0
  446. package/test/graphic_references/09_movetext_graphic/options/wrong_diagram_options_1.png +0 -0
  447. package/test/graphic_references/09_movetext_graphic/options/wrong_diagram_options_2.png +0 -0
  448. package/test/graphic_references/10_movetext_interaction/error/wrong_interaction_mode.png +0 -0
  449. package/test/{references/17_movetext_interaction/0.png → graphic_references/10_movetext_interaction/select_moves/click_on_disabled.png} +0 -0
  450. package/test/{references/17_movetext_interaction/1.png → graphic_references/10_movetext_interaction/select_moves/click_on_unselected.png} +0 -0
  451. package/test/{references/17_movetext_interaction/2.png → graphic_references/10_movetext_interaction/select_moves/click_on_with_variations.png} +0 -0
  452. package/test/graphic_test_app/.eslintrc.yml +5 -0
  453. package/test/graphic_test_app/03_error_box_graphic/base.tsx +46 -0
  454. package/{scripts/clean-graphic-output.js → test/graphic_test_app/03_error_box_graphic/localization.tsx} +10 -7
  455. package/{graphic_test_src/01_marker_icons.js → test/graphic_test_app/04_marker_icons_graphic/base.tsx} +15 -7
  456. package/{graphic_test_src/04_chessboard_annotations.js → test/graphic_test_app/05_chessboard_graphic/annotations.tsx} +23 -14
  457. package/{graphic_test_src/02_chessboard_simple.js → test/graphic_test_app/05_chessboard_graphic/base.tsx} +6 -6
  458. package/test/graphic_test_app/05_chessboard_graphic/chess_variants.tsx +35 -0
  459. package/{graphic_test_src/03_chessboard_flipped.js → test/graphic_test_app/05_chessboard_graphic/flipped.tsx} +5 -5
  460. package/{graphic_test_src/05_chessboard_move.js → test/graphic_test_app/05_chessboard_graphic/move.tsx} +9 -8
  461. package/{graphic_test_src/07_chessboard_theme.js → test/graphic_test_app/05_chessboard_graphic/theme.tsx} +14 -11
  462. package/{graphic_test_src/06a_chessboard_animated_move.js → test/graphic_test_app/06_chessboard_animation/base_1.tsx} +5 -5
  463. package/{graphic_test_src/06b_chessboard_animated_move.js → test/graphic_test_app/06_chessboard_animation/base_2.tsx} +5 -5
  464. package/{graphic_test_src/06c_chessboard_animated_move.js → test/graphic_test_app/06_chessboard_animation/base_3.tsx} +5 -5
  465. package/test/graphic_test_app/06_chessboard_animation/on_redraw.tsx +49 -0
  466. package/{graphic_test_src/08_chessboard_click_squares.js → test/graphic_test_app/07_chessboard_interaction/click_squares.tsx} +7 -6
  467. package/{graphic_test_src/10_chessboard_edit_arrows.js → test/graphic_test_app/07_chessboard_interaction/edit_arrows.tsx} +7 -7
  468. package/test/graphic_test_app/07_chessboard_interaction/error.tsx +30 -0
  469. package/{graphic_test_src/09_chessboard_move_pieces.js → test/graphic_test_app/07_chessboard_interaction/move_pieces.tsx} +7 -6
  470. package/{graphic_test_src/11_chessboard_play_moves.js → test/graphic_test_app/08_chessboard_play_moves/base.tsx} +6 -6
  471. package/{graphic_test_src/12_chessboard_play_promotions.js → test/graphic_test_app/08_chessboard_play_moves/promotions.tsx} +6 -6
  472. package/{graphic_test_src/13_movetext_simple.js → test/graphic_test_app/09_movetext_graphic/base.tsx} +8 -8
  473. package/{graphic_test_src/14_movetext_error.js → test/graphic_test_app/09_movetext_graphic/error.tsx} +10 -9
  474. package/{graphic_test_src/15_movetext_html.js → test/graphic_test_app/09_movetext_graphic/html.tsx} +7 -7
  475. package/{graphic_test_src/16_movetext_options.js → test/graphic_test_app/09_movetext_graphic/options.tsx} +9 -6
  476. package/test/graphic_test_app/10_movetext_interaction/error.tsx +31 -0
  477. package/{graphic_test_src/17_movetext_interaction.js → test/graphic_test_app/10_movetext_interaction/select_moves.tsx} +7 -7
  478. package/test/graphic_test_app/common/decs.d.ts +26 -0
  479. package/{graphic_test_src → test/graphic_test_app}/common/dummy.pgn +0 -0
  480. package/{graphic_test_src → test/graphic_test_app}/common/games.pgn +1 -1
  481. package/{graphic_test_src → test/graphic_test_app}/common/heartbeat.txt +0 -0
  482. package/{graphic_test_src → test/graphic_test_app}/common/smiley.png +0 -0
  483. package/{graphic_test_src → test/graphic_test_app}/common/test_app.css +11 -2
  484. package/{graphic_test_src/common/test_app.js → test/graphic_test_app/common/test_app.tsx} +62 -14
  485. package/tsconfig.json +15 -0
  486. package/.babelrc +0 -3
  487. package/dist/lib/ArrowMarkerIcon.js +0 -85
  488. package/dist/lib/Chessboard.js +0 -1276
  489. package/dist/lib/ErrorBox.js +0 -125
  490. package/dist/lib/Movetext.js +0 -805
  491. package/dist/lib/SquareMarkerIcon.js +0 -69
  492. package/dist/lib/TextMarkerIcon.js +0 -74
  493. package/dist/lib/formatmove.js +0 -107
  494. package/dist/lib/impl/DraggableHandle.js +0 -268
  495. package/dist/lib/impl/HtmlSanitizer.js +0 -145
  496. package/dist/lib/impl/Motion.js +0 -109
  497. package/dist/lib/impl/TextSymbol.js +0 -89
  498. package/dist/lib/impl/piecesets.js +0 -219
  499. package/dist/lib/impl/util.js +0 -71
  500. package/dist/lib/markers.js +0 -144
  501. package/doc_src/.eslintrc.yml +0 -2
  502. package/src/Chessboard.js +0 -1034
  503. package/src/ErrorBox.js +0 -132
  504. package/src/Movetext.js +0 -671
  505. package/src/impl/DraggableHandle.js +0 -232
  506. package/src/impl/HtmlSanitizer.js +0 -126
  507. package/src/impl/colorsets.js +0 -119
  508. package/src/impl/piecesets.js +0 -218
  509. package/src/impl/util.js +0 -68
  510. package/src/index.js +0 -31
  511. package/src/markers.js +0 -115
  512. package/test/4_chessboard_graphic.js +0 -49
  513. package/test/5_chessboard_interaction.js +0 -135
  514. package/test/6_chessboard_play_moves.js +0 -107
  515. package/test/references/01_marker_icons/10.png +0 -0
  516. package/test/references/01_marker_icons/3.png +0 -0
  517. package/test/references/01_marker_icons/4.png +0 -0
  518. package/test/references/01_marker_icons/5.png +0 -0
  519. package/test/references/01_marker_icons/6.png +0 -0
  520. package/test/references/01_marker_icons/7.png +0 -0
  521. package/test/references/01_marker_icons/8.png +0 -0
  522. package/test/references/01_marker_icons/9.png +0 -0
  523. package/test/references/02_chessboard_simple/5.png +0 -0
  524. package/test/references/05_chessboard_move/8.png +0 -0
  525. package/test/references/11_chessboard_play_moves/wrong_color.png +0 -0
  526. package/test/references/14_movetext_error/4.png +0 -0
@@ -0,0 +1,98 @@
1
+ /* -------------------------------------------------------------------------- *
2
+ * *
3
+ * This file is part of Kokopu-React, a JavaScript chess library. *
4
+ * Copyright (C) 2021-2023 Yoann Le Montagner <yo35 -at- melix.net> *
5
+ * *
6
+ * This program is free software: you can redistribute it and/or *
7
+ * modify it under the terms of the GNU Lesser General Public License *
8
+ * as published by the Free Software Foundation, either version 3 of *
9
+ * the License, or (at your option) any later version. *
10
+ * *
11
+ * This program is distributed in the hope that it will be useful, *
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14
+ * GNU Lesser General Public License for more details. *
15
+ * *
16
+ * You should have received a copy of the GNU Lesser General *
17
+ * Public License along with this program. If not, see *
18
+ * <http://www.gnu.org/licenses/>. *
19
+ * *
20
+ * -------------------------------------------------------------------------- */
21
+
22
+
23
+ const { describeWithBrowser, itCustom, setSandbox, compareSandbox, takeScreenshot, compareScreenshot } = require('./common/graphic');
24
+
25
+
26
+ describeWithBrowser('Chessboard play moves', browserContext => {
27
+
28
+ function itCheckPlayMove(itemIndex, label, xFrom, yFrom, xTo, yTo, expectedText) {
29
+ itCustom(browserContext, '08_chessboard_play_moves/base', itemIndex, label, async element => {
30
+ const actions = browserContext.driver.actions({ async: true });
31
+ const area = await element.getRect();
32
+ await actions.move({ x: area.x + xFrom, y: area.y + yFrom }).press().move({ x: area.x + xTo, y: area.y + yTo }).perform();
33
+ await takeScreenshot(browserContext, label, element);
34
+ await actions.release().perform();
35
+ await compareScreenshot(browserContext, label);
36
+ await compareSandbox(browserContext, expectedText);
37
+ });
38
+ }
39
+
40
+ itCheckPlayMove(0, 'regular move 1', 225, 335, 220, 225, 'move played: e4');
41
+ itCheckPlayMove(1, 'regular move 2', 275, 225, 135, 85, 'move played: Bxf2+');
42
+ itCheckPlayMove(1, 'castling move', 175, 375, 75, 375, 'move played: O-O');
43
+ itCheckPlayMove(3, 'chess960 castling move 1', 275, 375, 75, 375, 'move played: O-O-O');
44
+ itCheckPlayMove(3, 'chess960 castling move 2', 275, 375, 375, 375, 'move played: O-O');
45
+ itCheckPlayMove(3, 'chess960 ambiguous king move', 275, 375, 320, 375, 'move played: Kg1');
46
+
47
+ function itCheckNonPlayMove(itemIndex, label, xFrom, yFrom, xTo, yTo) {
48
+ itCustom(browserContext, '08_chessboard_play_moves/base', itemIndex, label, async element => {
49
+ await setSandbox(browserContext, label); // can be any value as long as it is unique among other test-cases
50
+ const actions = browserContext.driver.actions({ async: true });
51
+ const area = await element.getRect();
52
+ await actions.move({ x: area.x + xFrom, y: area.y + yFrom }).press().move({ x: area.x + xTo, y: area.y + yTo }).perform();
53
+ await takeScreenshot(browserContext, label, element);
54
+ await actions.release().perform();
55
+ await compareScreenshot(browserContext, label);
56
+ await compareSandbox(browserContext, label);
57
+ });
58
+ }
59
+
60
+ itCheckNonPlayMove(2, 'illegal position', 225, 325, 225, 225);
61
+ itCheckNonPlayMove(0, 'wrong color moved', 75, 25, 125, 125);
62
+ itCheckNonPlayMove(0, 'illegal move', 75, 375, 125, 225);
63
+ itCheckNonPlayMove(0, 'from == to', 75, 375, 85, 365);
64
+ itCheckNonPlayMove(0, 'out of board', 325, 375, 450, 285);
65
+ itCheckNonPlayMove(3, 'chess960 non-KxR castling', 275, 375, 130, 375);
66
+
67
+ function itCheckPlayPromotion(itemIndex, label, xFrom, yFrom, xTo, yTo, xPromo, yPromo, expectedText) {
68
+ itCustom(browserContext, '08_chessboard_play_moves/promotions', itemIndex, label, async element => {
69
+ const actions = browserContext.driver.actions({ async: true });
70
+ const area = await element.getRect();
71
+ await actions.move({ x: area.x + xFrom, y: area.y + yFrom }).press().move({ x: area.x + xTo, y: area.y + yTo }).release().perform();
72
+ await takeScreenshot(browserContext, label, element);
73
+ await actions.move({ x: area.x + xPromo, y: area.y + yPromo }).click().perform();
74
+ await compareScreenshot(browserContext, label);
75
+ await compareSandbox(browserContext, expectedText);
76
+ });
77
+ }
78
+
79
+ itCheckPlayPromotion(0, 'regular promotion 1', 75, 75, 75, 25, 60, 10, 'promotion move played: b8=Q');
80
+ itCheckPlayPromotion(1, 'regular promotion 2', 75, 325, 25, 375, 15, 280, 'promotion move played: bxa1=B');
81
+ itCheckPlayPromotion(2, 'antichess promotion', 325, 325, 325, 375, 325, 175, 'promotion move played: b8=K');
82
+
83
+ function itCheckNonPlayPromotion(itemIndex, label, xFrom, yFrom, xTo, yTo, xPromo, yPromo) {
84
+ itCustom(browserContext, '08_chessboard_play_moves/promotions', itemIndex, label, async element => {
85
+ await setSandbox(browserContext, label); // can be any value as long as it is unique among other test-cases
86
+ const actions = browserContext.driver.actions({ async: true });
87
+ const area = await element.getRect();
88
+ await actions.move({ x: area.x + xFrom, y: area.y + yFrom }).press().move({ x: area.x + xTo, y: area.y + yTo }).release().perform();
89
+ await takeScreenshot(browserContext, label, element);
90
+ await actions.move({ x: area.x + xPromo, y: area.y + yPromo }).click().perform();
91
+ await compareScreenshot(browserContext, label);
92
+ await compareSandbox(browserContext, label);
93
+ });
94
+ }
95
+
96
+ itCheckNonPlayPromotion(1, 'cancel promotion', 75, 325, 75, 375, 190, 220);
97
+
98
+ });
@@ -1,4 +1,4 @@
1
- /******************************************************************************
1
+ /* -------------------------------------------------------------------------- *
2
2
  * *
3
3
  * This file is part of Kokopu-React, a JavaScript chess library. *
4
4
  * Copyright (C) 2021-2023 Yoann Le Montagner <yo35 -at- melix.net> *
@@ -17,27 +17,43 @@
17
17
  * Public License along with this program. If not, see *
18
18
  * <http://www.gnu.org/licenses/>. *
19
19
  * *
20
- ******************************************************************************/
20
+ * -------------------------------------------------------------------------- */
21
21
 
22
22
 
23
- const { openBrowser, closeBrowser, itChecksScreenshots } = require('./common/graphic');
23
+ const { describeWithBrowser, itChecksScreenshots } = require('./common/graphic');
24
24
 
25
25
 
26
- describe('Movetext graphic', function() {
26
+ describeWithBrowser('Movetext graphic', browserContext => {
27
27
 
28
- const browserContext = {};
28
+ itChecksScreenshots(browserContext, '09_movetext_graphic/base', [
29
+ 'game 1',
30
+ 'game 2',
31
+ 'game 3',
32
+ 'game 4',
33
+ ]);
29
34
 
30
- before(async function() {
31
- await openBrowser(this, browserContext);
32
- });
35
+ itChecksScreenshots(browserContext, '09_movetext_graphic/error', [
36
+ 'wrong game index 1',
37
+ 'wrong game index 2',
38
+ 'pgn parsing error 1',
39
+ 'pgn parsing error 2',
40
+ 'wrong game type',
41
+ 'wrong game index type',
42
+ ]);
33
43
 
34
- after(async function() {
35
- await closeBrowser(browserContext);
36
- });
44
+ itChecksScreenshots(browserContext, '09_movetext_graphic/html', [
45
+ 'html in headers',
46
+ 'html in comments',
47
+ 'filtered tags and attributes',
48
+ ]);
49
+
50
+ itChecksScreenshots(browserContext, '09_movetext_graphic/options', [
51
+ 'localized piece symbols',
52
+ 'custom piece symbols',
53
+ 'figurine piece symbols and diagram options',
54
+ 'hidden diagrams',
55
+ 'wrong diagram options 1',
56
+ 'wrong diagram options 2',
57
+ ]);
37
58
 
38
- itChecksScreenshots(browserContext, '13_movetext_simple', [ 'game-0', 'game-1', 'game-2', 'game-3' ]);
39
- itChecksScreenshots(browserContext, '14_movetext_error', [ 'wrong-game-index-1', 'wrong-game-index-2', 'pgn-parsing-error-1', 'pgn-parsing-error-2', 'wrong type' ]);
40
- itChecksScreenshots(browserContext, '15_movetext_html', [ 'html-in-headers', 'html-in-comments', 'filtered-tags-and-attributes' ]);
41
- itChecksScreenshots(browserContext, '16_movetext_options', [ 'localized-piece-symbols', 'custom-piece-symbols', 'figurine-piece-symbols-and-diagram-options',
42
- 'hidden-diagrams' ]);
43
59
  });
@@ -1,4 +1,4 @@
1
- /******************************************************************************
1
+ /* -------------------------------------------------------------------------- *
2
2
  * *
3
3
  * This file is part of Kokopu-React, a JavaScript chess library. *
4
4
  * Copyright (C) 2021-2023 Yoann Le Montagner <yo35 -at- melix.net> *
@@ -17,36 +17,26 @@
17
17
  * Public License along with this program. If not, see *
18
18
  * <http://www.gnu.org/licenses/>. *
19
19
  * *
20
- ******************************************************************************/
20
+ * -------------------------------------------------------------------------- */
21
21
 
22
22
 
23
- const { openBrowser, closeBrowser, itCustom, setSandbox, compareSandbox, takeScreenshot, compareScreenshot } = require('./common/graphic');
23
+ const { describeWithBrowser, itCustom, setSandbox, compareSandbox, takeScreenshot, compareScreenshot, itChecksScreenshots } = require('./common/graphic');
24
24
  const { By, Key } = require('selenium-webdriver');
25
25
 
26
26
 
27
- describe('Movetext interaction', function() {
28
-
29
- const browserContext = {};
30
-
31
- before(async function() {
32
- await openBrowser(this, browserContext);
33
- });
34
-
35
- after(async function() {
36
- await closeBrowser(browserContext);
37
- });
27
+ describeWithBrowser('Movetext interaction', browserContext => {
38
28
 
39
29
  function itCheckClickMove(itemIndex, label, targets) {
40
- itCustom(browserContext, '17_movetext_interaction', itemIndex, label, async function(element) {
41
- let actions = browserContext.driver.actions({ async: true });
30
+ itCustom(browserContext, '10_movetext_interaction/select_moves', itemIndex, label, async element => {
31
+ const actions = browserContext.driver.actions({ async: true });
42
32
  await setSandbox(browserContext, '');
43
33
  for (let i = 0; i < targets.length; ++i) {
44
- let target = targets[i];
45
- let moveElement = await element.findElement(By.xpath(`.//span[text()='${target.searchedText}']`));
34
+ const target = targets[i];
35
+ const moveElement = await element.findElement(By.xpath(`.//span[text()='${target.searchedText}']`));
46
36
  await actions.move({ origin: moveElement }).click().perform();
47
37
  if (i === 0) {
48
- await takeScreenshot(browserContext, itemIndex, element);
49
- await compareScreenshot(browserContext, itemIndex);
38
+ await takeScreenshot(browserContext, label, element);
39
+ await compareScreenshot(browserContext, label);
50
40
  }
51
41
  await compareSandbox(browserContext, target.expectedText);
52
42
  }
@@ -66,14 +56,14 @@ describe('Movetext interaction', function() {
66
56
  { searchedText: 'cxd5', expectedText: tpl('5w', 'click') },
67
57
  ]);
68
58
 
69
- itCheckClickMove(2, 'click on with variations 1', [
59
+ itCheckClickMove(2, 'click on with variations', [
70
60
  { searchedText: 'Bb5', expectedText: tpl(undefined, 'click') },
71
61
  { searchedText: 'Nc6', expectedText: tpl('1b-v0-2b', 'click') },
72
62
  ]);
73
63
 
74
64
  function itCheckKeyboardActions(itemIndex, label, expectedOnGoFirst, expectedOnGoPrevious, expectedOnGoNext, expectedOnGoLast) {
75
- itCustom(browserContext, '17_movetext_interaction', itemIndex, label, async function(element) {
76
- let focusFieldElement = await element.findElement(By.className('kokopu-focusField'));
65
+ itCustom(browserContext, '10_movetext_interaction/select_moves', itemIndex, label, async element => {
66
+ const focusFieldElement = await element.findElement(By.className('kokopu-focusField'));
77
67
 
78
68
  await setSandbox(browserContext, '');
79
69
  await focusFieldElement.sendKeys(Key.HOME);
@@ -105,4 +95,9 @@ describe('Movetext interaction', function() {
105
95
  itCheckKeyboardActions(6, 'key on last selected', tpl('start', 'key-first'), tpl('6w', 'key-previous'), '', '');
106
96
  itCheckKeyboardActions(7, 'key on invalid selection', '', '', '', '');
107
97
  itCheckKeyboardActions(8, 'key on sub-variation selected', tpl('start', 'key-first'), tpl('1w', 'key-previous'), tpl('1b-v0-1b', 'key-next'), tpl('1b-v0-3w', 'key-last'));
98
+
99
+ itChecksScreenshots(browserContext, '10_movetext_interaction/error', [
100
+ 'wrong interaction mode',
101
+ ]);
102
+
108
103
  });
@@ -1,4 +1,4 @@
1
- /******************************************************************************
1
+ /* -------------------------------------------------------------------------- *
2
2
  * *
3
3
  * This file is part of Kokopu-React, a JavaScript chess library. *
4
4
  * Copyright (C) 2021-2023 Yoann Le Montagner <yo35 -at- melix.net> *
@@ -17,7 +17,7 @@
17
17
  * Public License along with this program. If not, see *
18
18
  * <http://www.gnu.org/licenses/>. *
19
19
  * *
20
- ******************************************************************************/
20
+ * -------------------------------------------------------------------------- */
21
21
 
22
22
 
23
23
  const fs = require('fs');
@@ -27,12 +27,12 @@ const { imgDiff } = require('img-diff-js');
27
27
  const test = require('unit.js');
28
28
 
29
29
  const rootDir = __dirname + '/../..';
30
- const referenceDir = rootDir + '/test/references';
30
+ const referenceDir = rootDir + '/test/graphic_references';
31
31
  const outputDir = rootDir + '/build/graphic_output';
32
32
  const coverageDir = rootDir + '/build/.nyc_output';
33
33
 
34
34
  const UNREACHABLE_TEST_CLIENT_MESSAGE =
35
- 'Cannot reach the dockerized selenium webbrowser used for graphic tests (probably because the test environment is not running).\n' +
35
+ 'Cannot reach the Dockerized Selenium webbrowser used for graphic tests (probably because the test environment is not running).\n' +
36
36
  '\n' +
37
37
  'Use command `npm run test_env:start` to start the test environment.\n' +
38
38
  'Do not forget to run `npm run test_env:stop` when finished.\n';
@@ -42,29 +42,52 @@ const ANIMATION_DELAY = 200;
42
42
 
43
43
 
44
44
  /**
45
- * Open a browser in the client (+ ensure everything else is ready to execute graphic tests).
45
+ * Create a Mocha test-suite that runs graphic tests in Dockerized Selenium webbrowser.
46
46
  */
47
- exports.openBrowser = async function(mochaContext, browserContext) {
47
+ exports.describeWithBrowser = function(suiteLabel, testFactory) {
48
+ describe(suiteLabel, function() {
48
49
 
49
- // The initialization process may take a while, thus increase the timeout threshold.
50
- mochaContext.timeout(10000);
50
+ // Fetching a new page in the browser may take a while, thus increase the timeout threshold.
51
+ this.timeout(10000);
52
+
53
+ // Configure the browser context.
54
+ const browserContext = {};
55
+
56
+ before(async () => {
57
+ await openBrowser(browserContext);
58
+ });
59
+
60
+ after(async () => {
61
+ await closeBrowser(browserContext);
62
+ });
63
+
64
+ // Register the tests.
65
+ testFactory(browserContext);
66
+ });
67
+ };
68
+
69
+
70
+ /**
71
+ * Open a browser in the client.
72
+ */
73
+ async function openBrowser(browserContext) {
51
74
 
52
75
  // Start the browser and ensure it can fetch something.
53
- let capabilities = Capabilities.firefox();
54
- let driver = new Builder().usingServer('http://localhost:4444').withCapabilities(capabilities).build();
76
+ const capabilities = Capabilities.firefox();
77
+ const driver = new Builder().usingServer('http://localhost:4444').withCapabilities(capabilities).build();
55
78
  await driver.get('file:///app/build/test_graphic/heartbeat.txt').catch(reason => {
56
79
  return Promise.reject(reason.message.includes('ECONNREFUSED') ? new Error(UNREACHABLE_TEST_CLIENT_MESSAGE) : reason);
57
80
  });
58
81
 
59
82
  // Initialize the browser context
60
83
  browserContext.driver = driver;
61
- };
84
+ }
62
85
 
63
86
 
64
87
  /**
65
88
  * Close the given browser.
66
89
  */
67
- exports.closeBrowser = async function(browserContext) {
90
+ async function closeBrowser(browserContext) {
68
91
  if (browserContext.driver) {
69
92
 
70
93
  // Save the coverage data before closing the browser.
@@ -75,7 +98,7 @@ exports.closeBrowser = async function(browserContext) {
75
98
  delete browserContext.driver;
76
99
  delete browserContext.latestTestCase;
77
100
  }
78
- };
101
+ }
79
102
 
80
103
 
81
104
  /**
@@ -90,12 +113,12 @@ async function saveCoverage(browserContext) {
90
113
  let pageIndex = 0;
91
114
  let coverageFile = '';
92
115
  do {
93
- coverageFile = `${coverageDir}/${browserContext.latestTestCase}-${pageIndex}.json`;
116
+ coverageFile = `${coverageDir}/${browserContext.latestTestCase.replaceAll('/', '__')}-${pageIndex}.json`;
94
117
  ++pageIndex;
95
118
  } while (fs.existsSync(coverageFile));
96
119
 
97
120
  // Retrieve and save the coverage data.
98
- let coverageData = await browserContext.driver.executeScript('return JSON.stringify(window.__coverage__)');
121
+ const coverageData = await browserContext.driver.executeScript('return JSON.stringify(window.__coverage__)');
99
122
  fs.writeFileSync(coverageFile, coverageData);
100
123
  }
101
124
 
@@ -114,21 +137,28 @@ async function fetchTestCase(browserContext, testCaseName) {
114
137
  // Fetch the new page.
115
138
  await browserContext.driver.get(`file:///app/build/test_graphic/${testCaseName}/index.html`);
116
139
  browserContext.latestTestCase = testCaseName;
140
+ await waitForAnimation();
141
+ }
142
+
117
143
 
118
- // Wait until the end of the animations.
144
+ /**
145
+ * Wait until the end of the chessboard animations.
146
+ */
147
+ const waitForAnimation = exports.waitForAnimation = async function() {
119
148
  await new Promise(resolve => setTimeout(resolve, ANIMATION_DELAY));
120
- }
149
+ };
121
150
 
122
151
 
123
152
  /**
124
153
  * Take a screenshot of the element identified by the given CSS target.
125
154
  */
126
- let takeScreenshot = exports.takeScreenshot = async function(browserContext, imageBaseName, element) {
155
+ const takeScreenshot = exports.takeScreenshot = async function(browserContext, imageBaseName, element) {
127
156
 
128
- let actualFilename = `${outputDir}/${browserContext.latestTestCase}/${imageBaseName}.png`;
157
+ imageBaseName = imageBaseName.replaceAll(' ', '_').toLowerCase();
158
+ const actualFilename = `${outputDir}/${browserContext.latestTestCase}/${imageBaseName}.png`;
129
159
 
130
160
  // Take a screenshot of the targeted element.
131
- let image = await element.takeScreenshot();
161
+ const image = await element.takeScreenshot();
132
162
  fs.mkdirSync(path.dirname(actualFilename), { recursive: true });
133
163
  fs.writeFileSync(actualFilename, image, 'base64');
134
164
  };
@@ -137,14 +167,15 @@ let takeScreenshot = exports.takeScreenshot = async function(browserContext, ima
137
167
  /**
138
168
  * Compare a screenshot to its reference.
139
169
  */
140
- let compareScreenshot = exports.compareScreenshot = async function(browserContext, imageBaseName) {
170
+ const compareScreenshot = exports.compareScreenshot = async function(browserContext, imageBaseName) {
141
171
 
142
- let actualFilename = `${outputDir}/${browserContext.latestTestCase}/${imageBaseName}.png`;
143
- let expectedFilename = `${referenceDir}/${browserContext.latestTestCase}/${imageBaseName}.png`;
144
- let differenceFilename = `${outputDir}/${browserContext.latestTestCase}/${imageBaseName}.diff.png`;
172
+ imageBaseName = imageBaseName.replaceAll(' ', '_').toLowerCase();
173
+ const actualFilename = `${outputDir}/${browserContext.latestTestCase}/${imageBaseName}.png`;
174
+ const expectedFilename = `${referenceDir}/${browserContext.latestTestCase}/${imageBaseName}.png`;
175
+ const differenceFilename = `${outputDir}/${browserContext.latestTestCase}/${imageBaseName}.diff.png`;
145
176
 
146
177
  // Compare the current screenshot to the reference.
147
- let result = await imgDiff({
178
+ const result = await imgDiff({
148
179
  actualFilename: actualFilename,
149
180
  expectedFilename: expectedFilename,
150
181
  diffFilename: differenceFilename,
@@ -157,7 +188,7 @@ let compareScreenshot = exports.compareScreenshot = async function(browserContex
157
188
  * Compare content of the sandbox to the expected text.
158
189
  */
159
190
  exports.compareSandbox = async function(browserContext, expectedText) {
160
- let actualText = await browserContext.driver.findElement(By.id('sandbox')).getText();
191
+ const actualText = await browserContext.driver.findElement(By.id('sandbox')).getText();
161
192
  test.value(actualText).is(expectedText);
162
193
  };
163
194
 
@@ -166,7 +197,9 @@ exports.compareSandbox = async function(browserContext, expectedText) {
166
197
  * Set the content of the sandbox to the given value.
167
198
  */
168
199
  exports.setSandbox = async function(browserContext, value) {
169
- value = value.replace(/\W/g, '');
200
+ if (/[^\w \-=]/.test(value)) {
201
+ throw new Error('Invalid characters found in the sandox message.');
202
+ }
170
203
  await browserContext.driver.executeScript(`document.getElementById("sandbox").innerText = "${value}"`);
171
204
  };
172
205
 
@@ -174,10 +207,10 @@ exports.setSandbox = async function(browserContext, value) {
174
207
  /**
175
208
  * Open the page corresponding to the given test-case, and execute the given scenario.
176
209
  */
177
- let itCustom = exports.itCustom = function(browserContext, testCaseName, itemIndex, itemName, scenario) {
178
- it(testCaseName + ' - ' + itemName, async function() {
210
+ const itCustom = exports.itCustom = function(browserContext, testCaseName, itemIndex, itemName, scenario) {
211
+ it(`${testCaseName} - ${itemName}`, async () => {
179
212
  await fetchTestCase(browserContext, testCaseName);
180
- let element = await browserContext.driver.findElement(By.id('test-item-' + itemIndex));
213
+ const element = await browserContext.driver.findElement(By.id('test-item-' + itemIndex));
181
214
  await scenario(element);
182
215
  });
183
216
  };
@@ -188,9 +221,10 @@ let itCustom = exports.itCustom = function(browserContext, testCaseName, itemInd
188
221
  */
189
222
  exports.itChecksScreenshots = function(browserContext, testCaseName, itemNames) {
190
223
  for (let i = 0; i < itemNames.length; ++i) {
191
- itCustom(browserContext, testCaseName, i, itemNames[i], async function(element) {
192
- await takeScreenshot(browserContext, i, element);
193
- await compareScreenshot(browserContext, i);
224
+ const itemName = itemNames[i];
225
+ itCustom(browserContext, testCaseName, i, itemName, async element => {
226
+ await takeScreenshot(browserContext, itemName, element);
227
+ await compareScreenshot(browserContext, itemName);
194
228
  });
195
229
  }
196
230
  };