@scrabble-solver/scrabble-solver 2.8.8 → 2.8.10

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 (111) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +12 -12
  3. package/.next/cache/.tsbuildinfo +1 -1
  4. package/.next/cache/eslint/.cache_8dgz12 +1 -1
  5. package/.next/cache/next-server.js.nft.json +1 -1
  6. package/.next/cache/webpack/client-production/0.pack +0 -0
  7. package/.next/cache/webpack/client-production/index.pack +0 -0
  8. package/.next/cache/webpack/server-production/0.pack +0 -0
  9. package/.next/cache/webpack/server-production/index.pack +0 -0
  10. package/.next/next-server.js.nft.json +1 -1
  11. package/.next/prerender-manifest.json +1 -1
  12. package/.next/routes-manifest.json +1 -1
  13. package/.next/server/chunks/413.js +350 -73
  14. package/.next/server/chunks/429.js +2 -13
  15. package/.next/server/chunks/44.js +802 -0
  16. package/.next/server/chunks/515.js +767 -322
  17. package/.next/server/chunks/911.js +77 -25
  18. package/.next/server/middleware-build-manifest.js +1 -1
  19. package/.next/server/pages/404.html +2 -2
  20. package/.next/server/pages/404.js.nft.json +1 -1
  21. package/.next/server/pages/500.html +2 -2
  22. package/.next/server/pages/_app.js.nft.json +1 -1
  23. package/.next/server/pages/_document.js.nft.json +1 -1
  24. package/.next/server/pages/_error.js.nft.json +1 -1
  25. package/.next/server/pages/api/solve.js +226 -927
  26. package/.next/server/pages/api/solve.js.nft.json +1 -1
  27. package/.next/server/pages/api/verify.js +217 -0
  28. package/.next/server/pages/api/verify.js.nft.json +1 -0
  29. package/.next/server/pages/index.html +3 -3
  30. package/.next/server/pages/index.js +8 -2
  31. package/.next/server/pages/index.js.nft.json +1 -1
  32. package/.next/server/pages/index.json +1 -1
  33. package/.next/server/pages-manifest.json +1 -0
  34. package/.next/static/A8A_Lmg8cM-Bkf-Jo1CLh/_buildManifest.js +1 -0
  35. package/.next/static/{z3J3qmq1nazbDv_ENIkCo → A8A_Lmg8cM-Bkf-Jo1CLh}/_ssgManifest.js +0 -0
  36. package/.next/static/chunks/317-95ab9051449362fa.js +1 -0
  37. package/.next/static/chunks/758-eff80059a1365d5d.js +1 -0
  38. package/.next/static/chunks/pages/{404-8eb3ba4f0ba17e08.js → 404-90c624da3c83fd17.js} +1 -1
  39. package/.next/static/chunks/pages/_app-0e358b5622cf9e66.js +1 -0
  40. package/.next/static/chunks/pages/index-0cc5e6eda5adac73.js +1 -0
  41. package/.next/static/css/9ac903004135f4b1.css +1 -0
  42. package/.next/static/css/{cdbc9e0afcff5473.css → ad2a08918868cad8.css} +1 -1
  43. package/.next/trace +42 -41
  44. package/package.json +12 -12
  45. package/src/components/Badge/Badge.module.scss +13 -0
  46. package/src/components/Badge/Badge.tsx +15 -0
  47. package/src/components/Badge/index.ts +1 -0
  48. package/src/components/Board/Board.tsx +4 -2
  49. package/src/components/Board/BoardPure.tsx +25 -5
  50. package/src/components/Board/hooks/useGrid.ts +212 -91
  51. package/src/components/Dictionary/Dictionary.tsx +8 -1
  52. package/src/components/NavButtons/NavButtons.tsx +33 -14
  53. package/src/components/Rack/Rack.tsx +51 -11
  54. package/src/components/Rack/RackTile.tsx +33 -16
  55. package/src/components/RemainingTiles/RemainingTiles.module.scss +8 -7
  56. package/src/components/RemainingTiles/RemainingTiles.tsx +13 -4
  57. package/src/components/Results/Results.tsx +19 -3
  58. package/src/components/Sidebar/Sidebar.tsx +2 -2
  59. package/src/components/Sidebar/components/Section/Section.module.scss +0 -1
  60. package/src/components/Sidebar/components/Section/Section.tsx +1 -1
  61. package/src/components/SquareButton/Link.tsx +1 -1
  62. package/src/components/SquareButton/SquareButton.module.scss +5 -0
  63. package/src/components/Tile/Tile.module.scss +4 -0
  64. package/src/components/Tile/Tile.tsx +13 -4
  65. package/src/components/Tile/TilePure.tsx +3 -4
  66. package/src/components/Words/Words.module.scss +35 -0
  67. package/src/components/Words/Words.tsx +57 -0
  68. package/src/components/Words/index.ts +1 -0
  69. package/src/components/index.ts +2 -0
  70. package/src/i18n/de.json +4 -1
  71. package/src/i18n/en.json +4 -1
  72. package/src/i18n/es.json +4 -1
  73. package/src/i18n/fr.json +4 -1
  74. package/src/i18n/pl.json +4 -1
  75. package/src/icons/BookHalf.svg +4 -0
  76. package/src/icons/Check.svg +4 -0
  77. package/src/icons/Cross.svg +2 -2
  78. package/src/icons/CrossFill.svg +4 -0
  79. package/src/icons/index.ts +3 -0
  80. package/src/lib/extractCharacters.ts +26 -0
  81. package/src/lib/extractInputValue.ts +17 -0
  82. package/src/lib/index.ts +2 -0
  83. package/src/lib/isCtrl.ts +1 -1
  84. package/src/lib/memoize.ts +15 -1
  85. package/src/pages/api/solve.ts +3 -4
  86. package/src/pages/api/verify.ts +71 -0
  87. package/src/pages/index.tsx +5 -0
  88. package/src/sdk/fetchJson.ts +36 -0
  89. package/src/sdk/findWordDefinitions.ts +4 -3
  90. package/src/sdk/index.ts +1 -0
  91. package/src/sdk/solve.ts +8 -7
  92. package/src/sdk/verify.ts +23 -0
  93. package/src/state/rootReducer.ts +2 -0
  94. package/src/state/sagas.ts +35 -8
  95. package/src/state/selectors.ts +17 -1
  96. package/src/state/slices/dictionaryInitialState.ts +10 -2
  97. package/src/state/slices/dictionarySlice.ts +10 -16
  98. package/src/state/slices/index.ts +2 -0
  99. package/src/state/slices/rackSlice.ts +7 -0
  100. package/src/state/slices/solveInitialState.ts +14 -2
  101. package/src/state/slices/solveSlice.ts +7 -4
  102. package/src/state/slices/verifyInitialState.ts +12 -0
  103. package/src/state/slices/verifySlice.ts +31 -0
  104. package/src/styles/variables.scss +2 -1
  105. package/src/types/index.ts +6 -1
  106. package/.next/static/chunks/615-d258f6c528c18622.js +0 -1
  107. package/.next/static/chunks/758-f333b1dcdb941547.js +0 -1
  108. package/.next/static/chunks/pages/_app-4a663fd3d5ca4524.js +0 -1
  109. package/.next/static/chunks/pages/index-1a9826d740cc8830.js +0 -1
  110. package/.next/static/css/180c6c26317ac90f.css +0 -1
  111. package/.next/static/z3J3qmq1nazbDv_ENIkCo/_buildManifest.js +0 -1
@@ -861,7 +861,7 @@ exports.VOWELS = ['a', 'ą', 'ä', 'e', 'ę', 'i', 'o', 'ó', 'ö', 'u', 'ü', '
861
861
 
862
862
  /***/ }),
863
863
 
864
- /***/ 92237:
864
+ /***/ 75558:
865
865
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
866
866
 
867
867
 
@@ -873,6 +873,8 @@ __webpack_require__.d(__webpack_exports__, {
873
873
  "np": () => (/* reexport */ lib_createKeyboardNavigation),
874
874
  "Ml": () => (/* reexport */ lib_createNullMovingComparator),
875
875
  "Nj": () => (/* reexport */ lib_detectLocale),
876
+ "nK": () => (/* reexport */ lib_extractCharacters),
877
+ "WM": () => (/* reexport */ lib_extractInputValue),
876
878
  "Jp": () => (/* reexport */ lib_findCell),
877
879
  "Dz": () => (/* reexport */ lib_getCellSize),
878
880
  "ZM": () => (/* reexport */ lib_getRemainingTiles),
@@ -973,6 +975,43 @@ const detectLocale = ()=>{
973
975
  };
974
976
  /* harmony default export */ const lib_detectLocale = (detectLocale);
975
977
 
978
+ // EXTERNAL MODULE: ../constants/build/index.js
979
+ var constants_build = __webpack_require__(7618);
980
+ ;// CONCATENATED MODULE: ./src/lib/extractCharacters.ts
981
+
982
+ const extractCharacters = (config, value)=>{
983
+ let index = 0;
984
+ const characters = [];
985
+ while(index < value.length){
986
+ const character = value[index];
987
+ const nextCharacter = value[index + 1];
988
+ const twoCharacterTileCandidate = `${character}${nextCharacter}`;
989
+ if (config.twoCharacterTiles.includes(twoCharacterTileCandidate)) {
990
+ characters.push(twoCharacterTileCandidate);
991
+ ++index;
992
+ } else if (config.hasCharacter(character) || character === constants_build.BLANK) {
993
+ characters.push(character);
994
+ }
995
+ ++index;
996
+ }
997
+ return characters;
998
+ };
999
+ /* harmony default export */ const lib_extractCharacters = (extractCharacters);
1000
+
1001
+ ;// CONCATENATED MODULE: ./src/lib/extractInputValue.ts
1002
+ const extractInputValue = (input)=>{
1003
+ const value = input.value.toLocaleLowerCase();
1004
+ if (input.selectionStart === null || input.selectionEnd === null) {
1005
+ return value;
1006
+ }
1007
+ const index = Math.min(input.selectionStart, input.selectionEnd);
1008
+ if (index > 0) {
1009
+ return value.substring(index - 1, index);
1010
+ }
1011
+ return value;
1012
+ };
1013
+ /* harmony default export */ const lib_extractInputValue = (extractInputValue);
1014
+
976
1015
  ;// CONCATENATED MODULE: ./src/lib/findCell.ts
977
1016
  const findCell = (cells, x, y)=>{
978
1017
  return cells.find((cell)=>cell.x === x && cell.y === y);
@@ -991,8 +1030,6 @@ const getCellSize = (config, width, height)=>{
991
1030
  };
992
1031
  /* harmony default export */ const lib_getCellSize = (getCellSize);
993
1032
 
994
- // EXTERNAL MODULE: ../constants/build/index.js
995
- var constants_build = __webpack_require__(7618);
996
1033
  ;// CONCATENATED MODULE: ./src/lib/numberComparator.ts
997
1034
  const numberComparator = (a, b)=>a - b;
998
1035
  /* harmony default export */ const lib_numberComparator = (numberComparator);
@@ -1161,6 +1198,12 @@ const memoize = (fn)=>{
1161
1198
  const readCache = (parameters)=>{
1162
1199
  return cache.find((entry)=>parametersEqual(entry.parameters, parameters))?.result;
1163
1200
  };
1201
+ const removeCache = (parameters)=>{
1202
+ const index = cache.findIndex((entry)=>parametersEqual(entry.parameters, parameters));
1203
+ if (index >= 0) {
1204
+ cache.splice(index, 1);
1205
+ }
1206
+ };
1164
1207
  const writeCache = (parameters, result)=>{
1165
1208
  cache.push({
1166
1209
  parameters,
@@ -1173,6 +1216,11 @@ const memoize = (fn)=>{
1173
1216
  return cached;
1174
1217
  }
1175
1218
  const result = fn(...parameters);
1219
+ if (result instanceof Promise) {
1220
+ result.catch(()=>{
1221
+ removeCache(parameters);
1222
+ });
1223
+ }
1176
1224
  writeCache(parameters, result);
1177
1225
  return result;
1178
1226
  };
@@ -1306,6 +1354,8 @@ const zipCharactersAndTiles = (characters, tiles)=>{
1306
1354
 
1307
1355
 
1308
1356
 
1357
+
1358
+
1309
1359
 
1310
1360
 
1311
1361
 
@@ -1416,7 +1466,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
1416
1466
  /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(redux__WEBPACK_IMPORTED_MODULE_0__);
1417
1467
  /* harmony import */ var redux_saga__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(75998);
1418
1468
  /* harmony import */ var _rootReducer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(12935);
1419
- /* harmony import */ var _sagas__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(58531);
1469
+ /* harmony import */ var _sagas__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(22418);
1420
1470
  var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([redux_saga__WEBPACK_IMPORTED_MODULE_1__]);
1421
1471
  redux_saga__WEBPACK_IMPORTED_MODULE_1__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];
1422
1472
 
@@ -1445,6 +1495,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
1445
1495
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1446
1496
  /* harmony export */ "$o": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.$o),
1447
1497
  /* harmony export */ "En": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.En),
1498
+ /* harmony export */ "HM": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.HM),
1448
1499
  /* harmony export */ "I8": () => (/* reexport safe */ _slices__WEBPACK_IMPORTED_MODULE_4__.I8),
1449
1500
  /* harmony export */ "Mj": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.Mj),
1450
1501
  /* harmony export */ "O0": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.O0),
@@ -1453,6 +1504,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
1453
1504
  /* harmony export */ "QB": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.QB),
1454
1505
  /* harmony export */ "QL": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.QL),
1455
1506
  /* harmony export */ "R": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.R),
1507
+ /* harmony export */ "Rn": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.Rn),
1456
1508
  /* harmony export */ "TP": () => (/* reexport safe */ _slices__WEBPACK_IMPORTED_MODULE_4__.TP),
1457
1509
  /* harmony export */ "Xb": () => (/* reexport safe */ _localStorage__WEBPACK_IMPORTED_MODULE_2__.Z),
1458
1510
  /* harmony export */ "Yj": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.Yj),
@@ -1460,6 +1512,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
1460
1512
  /* harmony export */ "ZO": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.ZO),
1461
1513
  /* harmony export */ "Zf": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.Zf),
1462
1514
  /* harmony export */ "_C": () => (/* reexport safe */ _slices__WEBPACK_IMPORTED_MODULE_4__._C),
1515
+ /* harmony export */ "bs": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.bs),
1463
1516
  /* harmony export */ "dN": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.dN),
1464
1517
  /* harmony export */ "f2": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.f2),
1465
1518
  /* harmony export */ "fN": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.fN),
@@ -1467,6 +1520,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
1467
1520
  /* harmony export */ "ix": () => (/* reexport safe */ _useTypedSelector__WEBPACK_IMPORTED_MODULE_6__.Z),
1468
1521
  /* harmony export */ "j2": () => (/* reexport safe */ _actions__WEBPACK_IMPORTED_MODULE_0__.j),
1469
1522
  /* harmony export */ "lj": () => (/* reexport safe */ _slices__WEBPACK_IMPORTED_MODULE_4__.lj),
1523
+ /* harmony export */ "mK": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.mK),
1470
1524
  /* harmony export */ "mO": () => (/* reexport safe */ _slices__WEBPACK_IMPORTED_MODULE_4__.mO),
1471
1525
  /* harmony export */ "mc": () => (/* reexport safe */ _actions__WEBPACK_IMPORTED_MODULE_0__.m),
1472
1526
  /* harmony export */ "md": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.md),
@@ -1483,7 +1537,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
1483
1537
  /* harmony import */ var _createAppStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(33282);
1484
1538
  /* harmony import */ var _localStorage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(83773);
1485
1539
  /* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6114);
1486
- /* harmony import */ var _slices__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8772);
1540
+ /* harmony import */ var _slices__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(99134);
1487
1541
  /* harmony import */ var _useTranslate__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(41573);
1488
1542
  /* harmony import */ var _useTypedSelector__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(53872);
1489
1543
  var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_createAppStore__WEBPACK_IMPORTED_MODULE_1__]);
@@ -1566,7 +1620,7 @@ const localStorage = {
1566
1620
  /* harmony export */ });
1567
1621
  /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86695);
1568
1622
  /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(redux__WEBPACK_IMPORTED_MODULE_0__);
1569
- /* harmony import */ var _slices__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8772);
1623
+ /* harmony import */ var _slices__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(99134);
1570
1624
 
1571
1625
 
1572
1626
  const rootReducer = (0,redux__WEBPACK_IMPORTED_MODULE_0__.combineReducers)({
@@ -1576,14 +1630,15 @@ const rootReducer = (0,redux__WEBPACK_IMPORTED_MODULE_0__.combineReducers)({
1576
1630
  rack: _slices__WEBPACK_IMPORTED_MODULE_1__/* .rackSlice.reducer */ .O_.reducer,
1577
1631
  results: _slices__WEBPACK_IMPORTED_MODULE_1__/* .resultsSlice.reducer */ ._C.reducer,
1578
1632
  settings: _slices__WEBPACK_IMPORTED_MODULE_1__/* .settingsSlice.reducer */ .xj.reducer,
1579
- solve: _slices__WEBPACK_IMPORTED_MODULE_1__/* .solveSlice.reducer */ .TP.reducer
1633
+ solve: _slices__WEBPACK_IMPORTED_MODULE_1__/* .solveSlice.reducer */ .TP.reducer,
1634
+ verify: _slices__WEBPACK_IMPORTED_MODULE_1__/* .verifySlice.reducer */ .Gt.reducer
1580
1635
  });
1581
1636
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (rootReducer);
1582
1637
 
1583
1638
 
1584
1639
  /***/ }),
1585
1640
 
1586
- /***/ 58531:
1641
+ /***/ 22418:
1587
1642
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1588
1643
 
1589
1644
 
@@ -1592,38 +1647,83 @@ __webpack_require__.d(__webpack_exports__, {
1592
1647
  "R": () => (/* binding */ rootSaga)
1593
1648
  });
1594
1649
 
1595
- // EXTERNAL MODULE: ../types/build/index.js
1596
- var build = __webpack_require__(34046);
1597
1650
  // EXTERNAL MODULE: external "redux-saga/effects"
1598
1651
  var effects_ = __webpack_require__(56477);
1599
- // EXTERNAL MODULE: ./src/lib/index.ts + 27 modules
1600
- var lib = __webpack_require__(92237);
1652
+ // EXTERNAL MODULE: ./src/lib/index.ts + 29 modules
1653
+ var lib = __webpack_require__(75558);
1654
+ // EXTERNAL MODULE: ../types/build/index.js
1655
+ var build = __webpack_require__(34046);
1656
+ ;// CONCATENATED MODULE: ./src/sdk/fetchJson.ts
1657
+
1658
+ const fetchJson = async (input, init)=>{
1659
+ let response;
1660
+ try {
1661
+ response = await fetch(input, {
1662
+ ...init,
1663
+ headers: {
1664
+ "Content-Type": "application/json",
1665
+ ...init?.headers
1666
+ }
1667
+ });
1668
+ } catch (error) {
1669
+ const message = (0,build.isError)(error) ? error.message : "Unknown error";
1670
+ throw new Error(`Network error: ${message}`);
1671
+ }
1672
+ if (response.ok) {
1673
+ return response.json();
1674
+ }
1675
+ try {
1676
+ const json = await response.json();
1677
+ if ((0,build.isError)(json)) {
1678
+ throw new Error(json.message);
1679
+ }
1680
+ } finally{
1681
+ // do nothing
1682
+ }
1683
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
1684
+ };
1685
+ /* harmony default export */ const sdk_fetchJson = (fetchJson);
1686
+
1601
1687
  ;// CONCATENATED MODULE: ./src/sdk/findWordDefinitions.ts
1602
1688
 
1689
+
1603
1690
  const findWordDefinitions = async (locale, word)=>{
1604
- const url = `/api/dictionary/${locale}/${word}`;
1605
- const json = await fetch(url).then((response)=>response.json());
1691
+ const json = await sdk_fetchJson(`/api/dictionary/${locale}/${word}`);
1606
1692
  return json.map(build.WordDefinition.fromJson);
1607
1693
  };
1608
1694
  /* harmony default export */ const sdk_findWordDefinitions = (findWordDefinitions);
1609
1695
 
1610
1696
  ;// CONCATENATED MODULE: ./src/sdk/solve.ts
1611
- const solve = ({ board , characters , configId , locale })=>{
1612
- return fetch("/api/solve", {
1697
+
1698
+
1699
+ const solve = async ({ board , characters , configId , locale })=>{
1700
+ const json = await sdk_fetchJson("/api/solve", {
1613
1701
  method: "POST",
1614
- headers: {
1615
- "Content-Type": "application/json"
1616
- },
1617
1702
  body: JSON.stringify({
1618
1703
  board,
1619
1704
  characters,
1620
1705
  configId,
1621
1706
  locale
1622
1707
  })
1623
- }).then((response)=>response.json());
1708
+ });
1709
+ return json.map(build.Result.fromJson);
1624
1710
  };
1625
1711
  /* harmony default export */ const sdk_solve = (solve);
1626
1712
 
1713
+ ;// CONCATENATED MODULE: ./src/sdk/verify.ts
1714
+
1715
+ const verify = async ({ board , configId , locale })=>{
1716
+ return sdk_fetchJson("/api/verify", {
1717
+ method: "POST",
1718
+ body: JSON.stringify({
1719
+ board,
1720
+ configId,
1721
+ locale
1722
+ })
1723
+ });
1724
+ };
1725
+ /* harmony default export */ const sdk_verify = (verify);
1726
+
1627
1727
  ;// CONCATENATED MODULE: ./src/sdk/visit.ts
1628
1728
  const visit = ()=>{
1629
1729
  return fetch("/api/visit", {
@@ -1637,12 +1737,13 @@ const visit = ()=>{
1637
1737
 
1638
1738
 
1639
1739
 
1740
+
1640
1741
  // EXTERNAL MODULE: ./src/state/actions.ts
1641
1742
  var actions = __webpack_require__(89969);
1642
1743
  // EXTERNAL MODULE: ./src/state/selectors.ts + 6 modules
1643
1744
  var selectors = __webpack_require__(6114);
1644
- // EXTERNAL MODULE: ./src/state/slices/index.ts + 14 modules
1645
- var slices = __webpack_require__(8772);
1745
+ // EXTERNAL MODULE: ./src/state/slices/index.ts + 16 modules
1746
+ var slices = __webpack_require__(99134);
1646
1747
  ;// CONCATENATED MODULE: ./src/state/sagas.ts
1647
1748
 
1648
1749
 
@@ -1650,7 +1751,6 @@ var slices = __webpack_require__(8772);
1650
1751
 
1651
1752
 
1652
1753
 
1653
-
1654
1754
  const SUBMIT_DELAY = 150;
1655
1755
  const memoizedFindWordDefinitions = (0,lib/* memoize */.HP)(sdk_findWordDefinitions);
1656
1756
  function* rootSaga() {
@@ -1662,13 +1762,15 @@ function* rootSaga() {
1662
1762
  yield (0,effects_.takeLatest)(slices/* dictionarySlice.actions.submit.type */.lj.actions.submit.type, onDictionarySubmit);
1663
1763
  yield (0,effects_.takeLatest)(actions/* initialize.type */.j.type, onInitialize);
1664
1764
  yield (0,effects_.takeLatest)(actions/* reset.type */.m.type, onReset);
1665
- yield (0,effects_.takeLatest)(slices/* solveSlice.actions.submit.type */.TP.actions.submit.type, onSubmit);
1765
+ yield (0,effects_.takeLatest)(slices/* solveSlice.actions.submit.type */.TP.actions.submit.type, onSolve);
1766
+ yield (0,effects_.takeLatest)(slices/* verifySlice.actions.submit.type */.Gt.actions.submit.type, onVerify);
1666
1767
  }
1667
1768
  function* onCellValueChange({ payload }) {
1668
1769
  const isFiltered = yield (0,effects_.select)((state)=>(0,selectors/* selectCellIsFiltered */.id)(state, payload));
1669
1770
  if (isFiltered) {
1670
1771
  yield (0,effects_.put)(slices/* cellFilterSlice.actions.toggle */.mO.actions.toggle(payload));
1671
1772
  }
1773
+ yield (0,effects_.put)(slices/* verifySlice.actions.submit */.Gt.actions.submit());
1672
1774
  }
1673
1775
  function* onApplyResult({ payload: result }) {
1674
1776
  const autoGroupTiles = yield (0,effects_.select)(selectors/* selectAutoGroupTiles */.uz);
@@ -1676,10 +1778,12 @@ function* onApplyResult({ payload: result }) {
1676
1778
  yield (0,effects_.put)(slices/* cellFilterSlice.actions.reset */.mO.actions.reset());
1677
1779
  yield (0,effects_.put)(slices/* rackSlice.actions.removeTiles */.O_.actions.removeTiles(result.tiles));
1678
1780
  yield (0,effects_.put)(slices/* rackSlice.actions.groupTiles */.O_.actions.groupTiles(autoGroupTiles));
1781
+ yield (0,effects_.put)(slices/* verifySlice.actions.submit */.Gt.actions.submit());
1679
1782
  }
1680
1783
  function* onConfigIdChange() {
1681
1784
  yield (0,effects_.put)(slices/* resultsSlice.actions.reset */._C.actions.reset());
1682
1785
  yield (0,effects_.put)(slices/* solveSlice.actions.submit */.TP.actions.submit());
1786
+ yield (0,effects_.put)(slices/* verifySlice.actions.submit */.Gt.actions.submit());
1683
1787
  yield* ensureProperTilesCount();
1684
1788
  }
1685
1789
  function* onDictionarySubmit() {
@@ -1692,7 +1796,7 @@ function* onDictionarySubmit() {
1692
1796
  const wordDefinitions = yield (0,effects_.call)(memoizedFindWordDefinitions, locale, word);
1693
1797
  yield (0,effects_.put)(slices/* dictionarySlice.actions.submitSuccess */.lj.actions.submitSuccess(wordDefinitions));
1694
1798
  } catch (error) {
1695
- yield (0,effects_.put)(slices/* dictionarySlice.actions.submitFailure */.lj.actions.submitFailure());
1799
+ yield (0,effects_.put)(slices/* dictionarySlice.actions.submitFailure */.lj.actions.submitFailure(error));
1696
1800
  }
1697
1801
  }
1698
1802
  function* onInitialize() {
@@ -1705,11 +1809,13 @@ function* onReset() {
1705
1809
  yield (0,effects_.put)(slices/* dictionarySlice.actions.reset */.lj.actions.reset());
1706
1810
  yield (0,effects_.put)(slices/* rackSlice.actions.reset */.O_.actions.reset());
1707
1811
  yield (0,effects_.put)(slices/* resultsSlice.actions.reset */._C.actions.reset());
1812
+ yield (0,effects_.put)(slices/* verifySlice.actions.submit */.Gt.actions.submit());
1708
1813
  }
1709
1814
  function* onLocaleChange() {
1710
- yield (0,effects_.put)(slices/* solveSlice.actions.submit */.TP.actions.submit());
1711
- yield (0,effects_.put)(slices/* resultsSlice.actions.changeResultCandidate */._C.actions.changeResultCandidate(null));
1712
1815
  yield (0,effects_.put)(slices/* dictionarySlice.actions.reset */.lj.actions.reset());
1816
+ yield (0,effects_.put)(slices/* resultsSlice.actions.changeResultCandidate */._C.actions.changeResultCandidate(null));
1817
+ yield (0,effects_.put)(slices/* solveSlice.actions.submit */.TP.actions.submit());
1818
+ yield (0,effects_.put)(slices/* verifySlice.actions.submit */.Gt.actions.submit());
1713
1819
  }
1714
1820
  function* onResultCandidateChange({ payload: result }) {
1715
1821
  if (result) {
@@ -1717,7 +1823,7 @@ function* onResultCandidateChange({ payload: result }) {
1717
1823
  yield (0,effects_.put)(slices/* dictionarySlice.actions.submit */.lj.actions.submit());
1718
1824
  }
1719
1825
  }
1720
- function* onSubmit() {
1826
+ function* onSolve() {
1721
1827
  const board = yield (0,effects_.select)(selectors/* selectBoard */.ZO);
1722
1828
  const { config } = yield (0,effects_.select)(selectors/* selectConfig */.$o);
1723
1829
  const locale = yield (0,effects_.select)(selectors/* selectLocale */.fN);
@@ -1737,14 +1843,34 @@ function* onSubmit() {
1737
1843
  configId: config.id,
1738
1844
  locale
1739
1845
  });
1846
+ yield (0,effects_.put)(slices/* resultsSlice.actions.changeResults */._C.actions.changeResults(results));
1740
1847
  yield (0,effects_.put)(slices/* solveSlice.actions.submitSuccess */.TP.actions.submitSuccess({
1741
1848
  board,
1742
1849
  characters
1743
1850
  }));
1744
- yield (0,effects_.put)(slices/* resultsSlice.actions.changeResults */._C.actions.changeResults(results.map(build.Result.fromJson)));
1745
1851
  } catch (error) {
1746
1852
  yield (0,effects_.put)(slices/* resultsSlice.actions.changeResults */._C.actions.changeResults([]));
1747
- yield (0,effects_.put)(slices/* solveSlice.actions.submitFailure */.TP.actions.submitFailure());
1853
+ yield (0,effects_.put)(slices/* solveSlice.actions.submitFailure */.TP.actions.submitFailure(error));
1854
+ }
1855
+ }
1856
+ function* onVerify() {
1857
+ yield (0,effects_.delay)(SUBMIT_DELAY);
1858
+ const board = yield (0,effects_.select)(selectors/* selectBoard */.ZO);
1859
+ const { config } = yield (0,effects_.select)(selectors/* selectConfig */.$o);
1860
+ const locale = yield (0,effects_.select)(selectors/* selectLocale */.fN);
1861
+ try {
1862
+ const { invalidWords , validWords } = yield (0,effects_.call)(sdk_verify, {
1863
+ board: board.toJson(),
1864
+ configId: config.id,
1865
+ locale
1866
+ });
1867
+ yield (0,effects_.put)(slices/* verifySlice.actions.submitSuccess */.Gt.actions.submitSuccess({
1868
+ board,
1869
+ invalidWords,
1870
+ validWords
1871
+ }));
1872
+ } catch (error) {
1873
+ yield (0,effects_.put)(slices/* verifySlice.actions.submitFailure */.Gt.actions.submitFailure());
1748
1874
  }
1749
1875
  }
1750
1876
  function* ensureProperTilesCount() {
@@ -1787,6 +1913,8 @@ __webpack_require__.d(__webpack_exports__, {
1787
1913
  "$o": () => (/* binding */ selectConfig),
1788
1914
  "md": () => (/* binding */ selectConfigId),
1789
1915
  "w1": () => (/* binding */ selectDictionary),
1916
+ "mK": () => (/* binding */ selectDictionaryError),
1917
+ "bs": () => (/* binding */ selectHasInvalidWords),
1790
1918
  "En": () => (/* binding */ selectHasOverusedTiles),
1791
1919
  "xU": () => (/* binding */ selectIsLoading),
1792
1920
  "fN": () => (/* binding */ selectLocale),
@@ -1797,10 +1925,12 @@ __webpack_require__.d(__webpack_exports__, {
1797
1925
  "R": () => (/* binding */ selectResultsSortColumn),
1798
1926
  "sH": () => (/* binding */ selectResultsSortDirection),
1799
1927
  "ZA": () => (/* binding */ selectRowsWithCandidate),
1928
+ "Rn": () => (/* binding */ selectSolveError),
1800
1929
  "dN": () => (/* binding */ selectSortedFilteredResults),
1801
1930
  "f2": () => (/* binding */ selectSortedResults),
1802
1931
  "Zf": () => (/* binding */ selectTilePoints),
1803
- "nb": () => (/* binding */ selectTranslations)
1932
+ "nb": () => (/* binding */ selectTranslations),
1933
+ "HM": () => (/* binding */ selectVerify)
1804
1934
  });
1805
1935
 
1806
1936
  // UNUSED EXPORTS: selectCellFilter, selectHasBoardChanged, selectHaveCharactersChanged, selectLastSolvedParameters, selectRemainingTiles, selectResultCandidate, selectResultCandidateCells, selectResults, selectTranslation
@@ -1812,15 +1942,15 @@ var build = __webpack_require__(89418);
1812
1942
  // EXTERNAL MODULE: ../types/build/index.js
1813
1943
  var types_build = __webpack_require__(34046);
1814
1944
  ;// CONCATENATED MODULE: ./src/i18n/de.json
1815
- const de_namespaceObject = JSON.parse('{"cell.filter-cell":"Zielort - klicken zum Wechseln","cell.set-blank":"Als Blanko markieren","cell.set-not-blank":"Nicht als Blanko markieren","cell.toggle-direction":"Schreibrichtung - klicken zum Wechseln","common.blanks":"Blankos","common.clear":"Löschen","common.close":"Schließen","common.consonants":"Konsonanten","common.loading":"Laden","common.points":"Punkte","common.tiles":"Steine","common.two-letter-tiles":"Zwei-Buchstaben","common.vowels":"Vokale","common.word":"Wort","common.words":"Wörter","dictionary.empty-state.no-definitions":"Wort existiert im Wörterbuch aber hat keine Definition.","dictionary.empty-state.no-results":"Wort kann nicht im Wörterbuch gefunden werden.","dictionary.empty-state.not-allowed":"Dieses Wort ist nicht erlaubt.","dictionary.empty-state.uninitialized":"Die Wörterbuchdefinition des letzten markierten Wortes wird hier angezeigt.","dictionary.input.placeholder":"Durchsuche Wörterbuch...","empty-state.error":"Fehler","empty-state.info":"Info","empty-state.success":"Juhuu!","empty-state.warning":"Oje!","github":"Schau dieses Projekt auf GitHub an","keyMap":"Tastaturkürzel","keyMap.board":"Brett","keyMap.board.toggle-blank":"Als Blanko markieren / aufheben","keyMap.board.toggle-direction":"Schreibrichtung umschalten","keyMap.board-and-rack":"Brett & Ablage","keyMap.board-and-rack.insert-two-letter-tile":"Zwei-Buchstaben Stein hinzufügen","keyMap.board-and-rack.navigate":"Navigieren","keyMap.board-and-rack.remove-tile":"Stein entfernen","keyMap.board-and-rack.submit":"Lösen starten","keyMap.rack":"Ablage","keyMap.rack.insert-blank":"Blanko hinzufügen (Leertaste)","rack.placeholder":"Steine…","remaining-tiles":"Restliche Steine","results.empty-state.no-filtered-results":"Keine Ergebnisse für diese Anfrage.","results.empty-state.no-results":"Keine Ergebnisse - kein Wort konnte generiert werden.","results.empty-state.outdated":"Ergebnisse sind alt. Klicken zum Aktualisieren.","results.empty-state.uninitialized":"Wörter die aus deinen Buchstaben generiert wurden erscheinen hier.","results.input.placeholder":"Suchergebnisse... (RegExp)","results.solve":"Lösen","settings":"Einstellungen","settings.autoGroupTiles":"Restliche Steine gruppieren","settings.autoGroupTiles.left":"Linke Seite","settings.autoGroupTiles.right":"Rechte Seite","settings.autoGroupTiles.null":"Nicht gruppieren","settings.game":"Spiel","settings.language":"Sprache"}');
1945
+ const de_namespaceObject = JSON.parse('{"cell.filter-cell":"Zielort - klicken zum Wechseln","cell.set-blank":"Als Blanko markieren","cell.set-not-blank":"Nicht als Blanko markieren","cell.toggle-direction":"Schreibrichtung - klicken zum Wechseln","common.blanks":"Blankos","common.clear":"Löschen","common.close":"Schließen","common.consonants":"Konsonanten","common.loading":"Laden","common.points":"Punkte","common.tiles":"Steine","common.two-letter-tiles":"Zwei-Buchstaben","common.vowels":"Vokale","common.word":"Wort","common.words":"Wörter","dictionary.empty-state.no-definitions":"Wort existiert im Wörterbuch aber hat keine Definition.","dictionary.empty-state.no-results":"Wort kann nicht im Wörterbuch gefunden werden.","dictionary.empty-state.not-allowed":"Dieses Wort ist nicht erlaubt.","dictionary.empty-state.uninitialized":"Die Wörterbuchdefinition des letzten markierten Wortes wird hier angezeigt.","dictionary.input.placeholder":"Durchsuche Wörterbuch...","empty-state.error":"Fehler","empty-state.info":"Info","empty-state.success":"Juhuu!","empty-state.warning":"Oje!","github":"Schau dieses Projekt auf GitHub an","keyMap":"Tastaturkürzel","keyMap.board":"Brett","keyMap.board.toggle-blank":"Als Blanko markieren / aufheben","keyMap.board.toggle-direction":"Schreibrichtung umschalten","keyMap.board-and-rack":"Brett & Ablage","keyMap.board-and-rack.insert-two-letter-tile":"Zwei-Buchstaben Stein hinzufügen","keyMap.board-and-rack.navigate":"Navigieren","keyMap.board-and-rack.remove-tile":"Stein entfernen","keyMap.board-and-rack.submit":"Lösen starten","keyMap.rack":"Ablage","keyMap.rack.insert-blank":"Blanko hinzufügen (Leertaste)","rack.placeholder":"Steine…","remaining-tiles":"Restliche Steine","results.empty-state.no-filtered-results":"Keine Ergebnisse für diese Anfrage.","results.empty-state.no-results":"Keine Ergebnisse - kein Wort konnte generiert werden.","results.empty-state.outdated":"Ergebnisse sind alt. Klicken zum Aktualisieren.","results.empty-state.uninitialized":"Wörter die aus deinen Buchstaben generiert wurden erscheinen hier.","results.input.placeholder":"Suchergebnisse... (RegExp)","results.solve":"Lösen","settings":"Einstellungen","settings.autoGroupTiles":"Restliche Steine gruppieren","settings.autoGroupTiles.left":"Linke Seite","settings.autoGroupTiles.right":"Rechte Seite","settings.autoGroupTiles.null":"Nicht gruppieren","settings.game":"Spiel","settings.language":"Sprache","words":"Gebildete Wörter","words.invalid":"Falsch","words.valid":"Korrekt"}');
1816
1946
  ;// CONCATENATED MODULE: ./src/i18n/en.json
1817
- const en_namespaceObject = JSON.parse('{"cell.filter-cell":"Target destination - click to toggle","cell.set-blank":"Mark it a blank","cell.set-not-blank":"Mark it not a blank","cell.toggle-direction":"Typing direction - click to toggle","common.blanks":"Blanks","common.clear":"Clear","common.close":"Close","common.consonants":"Consonants","common.loading":"Loading","common.points":"Points","common.tiles":"Tiles","common.two-letter-tiles":"Two-letter","common.vowels":"Vowels","common.word":"Word","common.words":"Words","dictionary.empty-state.no-definitions":"Word exists in the dictionary but it does not have a definition.","dictionary.empty-state.no-results":"Unable to find word definition in dictionary.","dictionary.empty-state.not-allowed":"This word is not allowed.","dictionary.empty-state.uninitialized":"Dictionary definition of the last highlighted word will be shown here.","dictionary.input.placeholder":"Search dictionary...","empty-state.error":"Error","empty-state.info":"Info","empty-state.success":"Yeah!","empty-state.warning":"Oops!","github":"See this project on GitHub","keyMap":"Keyboard shortcuts","keyMap.board":"Board","keyMap.board.toggle-blank":"Mark/unmark tile as a blank","keyMap.board.toggle-direction":"Toggle typing direction","keyMap.board-and-rack":"Board & rack","keyMap.board-and-rack.insert-two-letter-tile":"Insert two-letter tile","keyMap.board-and-rack.navigate":"Navigate","keyMap.board-and-rack.remove-tile":"Remove tile","keyMap.board-and-rack.submit":"Start solving","keyMap.rack":"Rack","keyMap.rack.insert-blank":"Insert blank (spacebar)","rack.placeholder":"Letters","remaining-tiles":"Remaining tiles","results.empty-state.no-filtered-results":"No result matches this query.","results.empty-state.no-results":"No results - unable to generate any words.","results.empty-state.outdated":"Results are outdated. Click below to update.","results.empty-state.uninitialized":"Words generated from your letters will be shown here.","results.input.placeholder":"Search results... (RegExp)","results.solve":"Solve","settings":"Settings","settings.autoGroupTiles":"Group remaining tiles","settings.autoGroupTiles.left":"On the left","settings.autoGroupTiles.right":"On the right","settings.autoGroupTiles.null":"Do not group","settings.game":"Game","settings.language":"Language"}');
1947
+ const en_namespaceObject = JSON.parse('{"cell.filter-cell":"Target destination - click to toggle","cell.set-blank":"Mark it a blank","cell.set-not-blank":"Mark it not a blank","cell.toggle-direction":"Typing direction - click to toggle","common.blanks":"Blanks","common.clear":"Clear","common.close":"Close","common.consonants":"Consonants","common.loading":"Loading","common.points":"Points","common.tiles":"Tiles","common.two-letter-tiles":"Two-letter","common.vowels":"Vowels","common.word":"Word","common.words":"Words","dictionary.empty-state.no-definitions":"Word exists in the dictionary but it does not have a definition.","dictionary.empty-state.no-results":"Unable to find word definition in dictionary.","dictionary.empty-state.not-allowed":"This word is not allowed.","dictionary.empty-state.uninitialized":"Dictionary definition of the last highlighted word will be shown here.","dictionary.input.placeholder":"Search dictionary...","empty-state.error":"Error","empty-state.info":"Info","empty-state.success":"Yeah!","empty-state.warning":"Oops!","github":"See this project on GitHub","keyMap":"Keyboard shortcuts","keyMap.board":"Board","keyMap.board.toggle-blank":"Mark/unmark tile as a blank","keyMap.board.toggle-direction":"Toggle typing direction","keyMap.board-and-rack":"Board & rack","keyMap.board-and-rack.insert-two-letter-tile":"Insert two-letter tile","keyMap.board-and-rack.navigate":"Navigate","keyMap.board-and-rack.remove-tile":"Remove tile","keyMap.board-and-rack.submit":"Start solving","keyMap.rack":"Rack","keyMap.rack.insert-blank":"Insert blank (spacebar)","rack.placeholder":"Letters","remaining-tiles":"Remaining tiles","results.empty-state.no-filtered-results":"No result matches this query.","results.empty-state.no-results":"No results - unable to generate any words.","results.empty-state.outdated":"Results are outdated. Click below to update.","results.empty-state.uninitialized":"Words generated from your letters will be shown here.","results.input.placeholder":"Search results... (RegExp)","results.solve":"Solve","settings":"Settings","settings.autoGroupTiles":"Group remaining tiles","settings.autoGroupTiles.left":"On the left","settings.autoGroupTiles.right":"On the right","settings.autoGroupTiles.null":"Do not group","settings.game":"Game","settings.language":"Language","words":"Created words","words.invalid":"Invalid","words.valid":"Valid"}');
1818
1948
  ;// CONCATENATED MODULE: ./src/i18n/es.json
1819
- const es_namespaceObject = JSON.parse('{"cell.filter-cell":"Destino objetivo: haga clic para alternar","cell.set-blank":"Marcar como en blanco","cell.set-not-blank":"Marcar como no en blanco","cell.toggle-direction":"Dirección de escritura: haga clic para alternar","common.blanks":"Blancos","common.clear":"Borrar","common.close":"Cerrar","common.consonants":"Consonantes","common.loading":"Cargando","common.points":"Puntos","common.tiles":"Longitud","common.two-letter-tiles":"Dos letras","common.vowels":"Vocales","common.word":"Palabra","common.words":"Palabras","dictionary.empty-state.no-definitions":"La palabra existe en el diccionario pero no tiene una definición.","dictionary.empty-state.no-results":"No se puede encontrar la definición de palabra en el diccionario.","dictionary.empty-state.not-allowed":"Esta palabra no es aceptable.","dictionary.empty-state.uninitialized":"Aquí se mostrará la definición del diccionario de la última palabra resaltada.","dictionary.input.placeholder":"Busca el diccionario...","empty-state.error":"Error","empty-state.info":"Info","empty-state.success":"Sí!","empty-state.warning":"Vaya!","github":"Ver este proyecto en GitHub","keyMap":"Atajos de teclado","keyMap.board":"Tablero","keyMap.board.toggle-blank":"Marcar / desmarcar un espacio en blanco","keyMap.board.toggle-direction":"Alternar dirección de escritura","keyMap.board-and-rack":"Tablero y estante","keyMap.board-and-rack.insert-two-letter-tile":"Insertar mosaico de dos letras","keyMap.board-and-rack.navigate":"Navegar","keyMap.board-and-rack.remove-tile":"Quitar Letra","keyMap.board-and-rack.submit":"Empezar a resolver","keyMap.rack":"Estante","keyMap.rack.insert-blank":"Insertar espacio en blanco (barra espaciadora)","rack.placeholder":"Letras…","remaining-tiles":"Casillas restantes","results.empty-state.no-filtered-results":"Ningún resultado coincide con esta consulta.","results.empty-state.no-results":"No hay resultados; no se pueden generar palabras","results.empty-state.outdated":"Los resultados están desactualizados. Haga clic a continuación para actualizar.","results.empty-state.uninitialized":"Aquí se mostrarán las palabras generadas a partir de sus letras.","results.input.placeholder":"Busque una solución... (RegExp)","results.solve":"Resolver","settings":"Configuración","settings.autoGroupTiles":"Agrupar casillas restantes","settings.autoGroupTiles.left":"A la izquierda","settings.autoGroupTiles.right":"A la derecha","settings.autoGroupTiles.null":"No agrupar","settings.game":"Juego","settings.language":"Idioma"}');
1949
+ const es_namespaceObject = JSON.parse('{"cell.filter-cell":"Destino objetivo: haga clic para alternar","cell.set-blank":"Marcar como en blanco","cell.set-not-blank":"Marcar como no en blanco","cell.toggle-direction":"Dirección de escritura: haga clic para alternar","common.blanks":"Blancos","common.clear":"Borrar","common.close":"Cerrar","common.consonants":"Consonantes","common.loading":"Cargando","common.points":"Puntos","common.tiles":"Longitud","common.two-letter-tiles":"Dos letras","common.vowels":"Vocales","common.word":"Palabra","common.words":"Palabras","dictionary.empty-state.no-definitions":"La palabra existe en el diccionario pero no tiene una definición.","dictionary.empty-state.no-results":"No se puede encontrar la definición de palabra en el diccionario.","dictionary.empty-state.not-allowed":"Esta palabra no es aceptable.","dictionary.empty-state.uninitialized":"Aquí se mostrará la definición del diccionario de la última palabra resaltada.","dictionary.input.placeholder":"Busca el diccionario...","empty-state.error":"Error","empty-state.info":"Info","empty-state.success":"Sí!","empty-state.warning":"Vaya!","github":"Ver este proyecto en GitHub","keyMap":"Atajos de teclado","keyMap.board":"Tablero","keyMap.board.toggle-blank":"Marcar / desmarcar un espacio en blanco","keyMap.board.toggle-direction":"Alternar dirección de escritura","keyMap.board-and-rack":"Tablero y estante","keyMap.board-and-rack.insert-two-letter-tile":"Insertar mosaico de dos letras","keyMap.board-and-rack.navigate":"Navegar","keyMap.board-and-rack.remove-tile":"Quitar Letra","keyMap.board-and-rack.submit":"Empezar a resolver","keyMap.rack":"Estante","keyMap.rack.insert-blank":"Insertar espacio en blanco (barra espaciadora)","rack.placeholder":"Letras…","remaining-tiles":"Casillas restantes","results.empty-state.no-filtered-results":"Ningún resultado coincide con esta consulta.","results.empty-state.no-results":"No hay resultados; no se pueden generar palabras","results.empty-state.outdated":"Los resultados están desactualizados. Haga clic a continuación para actualizar.","results.empty-state.uninitialized":"Aquí se mostrarán las palabras generadas a partir de sus letras.","results.input.placeholder":"Busque una solución... (RegExp)","results.solve":"Resolver","settings":"Configuración","settings.autoGroupTiles":"Agrupar casillas restantes","settings.autoGroupTiles.left":"A la izquierda","settings.autoGroupTiles.right":"A la derecha","settings.autoGroupTiles.null":"No agrupar","settings.game":"Juego","settings.language":"Idioma","words":"Palabras creadas","words.invalid":"Incorrecto","words.valid":"Correcto"}');
1820
1950
  ;// CONCATENATED MODULE: ./src/i18n/fr.json
1821
- const fr_namespaceObject = JSON.parse('{"cell.filter-cell":"Destination cible - cliquer pour changer","cell.set-blank":"Marquer comme vide","cell.set-not-blank":"Marquer comme non vide","cell.toggle-direction":"Direction d\'écriture - cliquer pour changer","common.blanks":"Cases vides","common.clear":"Effacer","common.close":"Fermer","common.consonants":"Consonnes","common.loading":"Chargement","common.points":"Points","common.tiles":"Cases","common.two-letter-tiles":"Deux lettres","common.vowels":"Voyelles","common.word":"Mot","common.words":"Mots","dictionary.empty-state.no-definitions":"Le mot existe dans le dictionary mais n\'a pas de définition.","dictionary.empty-state.no-results":"Impossible de trouver une définition pour ce mot dans le dictionaire.","dictionary.empty-state.not-allowed":"Ce mot n\'est pas pas acceptable.","dictionary.empty-state.uninitialized":"La définition dictionaire du dernier mot surligné sera affichée ici.","dictionary.input.placeholder":"Rechercher dans le dictionnaire...","empty-state.error":"Erreur","empty-state.info":"Info","empty-state.success":"Ouais!","empty-state.warning":"Oups!","github":"Voir ce projet sur GitHub","keyMap":"Raccourcis clavier","keyMap.board":"Plateau","keyMap.board.toggle-blank":"Marqué/Démarqué la case en tant que vide","keyMap.board.toggle-direction":"Faire basculer la direction d\'écriture","keyMap.board-and-rack":"Plateau & chevalet","keyMap.board-and-rack.insert-two-letter-tile":"Insérer une tuile de deux lettres","keyMap.board-and-rack.navigate":"Naviguer","keyMap.board-and-rack.remove-tile":"Supprimer une case","keyMap.board-and-rack.submit":"Commencer la résolution","keyMap.rack":"Chevalet","keyMap.rack.insert-blank":"Inserer une case vide (spacebar)","rack.placeholder":"Lettres","remaining-tiles":"Cases restantes","results.empty-state.no-filtered-results":"Aucun résultat ne correspond à cette requête","results.empty-state.no-results":"Pas de résultats - impossible de générer des mots.","results.empty-state.outdated":"Les résultats sont dépassé. Cliquer ci-dessous pour mettre à jour.","results.empty-state.uninitialized":"Words generated from your letters will be shown here.","results.input.placeholder":"Rechercher les résultats... (RegExp)","results.solve":"Résoudre","settings":"Options","settings.autoGroupTiles":"Grouper les cases restantes","settings.autoGroupTiles.left":"Vers la droite","settings.autoGroupTiles.right":"Vers la gauche","settings.autoGroupTiles.null":"Ne pas grouper","settings.game":"Jeu","settings.language":"Langue"}');
1951
+ const fr_namespaceObject = JSON.parse('{"cell.filter-cell":"Destination cible - cliquer pour changer","cell.set-blank":"Marquer comme vide","cell.set-not-blank":"Marquer comme non vide","cell.toggle-direction":"Direction d\'écriture - cliquer pour changer","common.blanks":"Cases vides","common.clear":"Effacer","common.close":"Fermer","common.consonants":"Consonnes","common.loading":"Chargement","common.points":"Points","common.tiles":"Cases","common.two-letter-tiles":"Deux lettres","common.vowels":"Voyelles","common.word":"Mot","common.words":"Mots","dictionary.empty-state.no-definitions":"Le mot existe dans le dictionary mais n\'a pas de définition.","dictionary.empty-state.no-results":"Impossible de trouver une définition pour ce mot dans le dictionaire.","dictionary.empty-state.not-allowed":"Ce mot n\'est pas pas acceptable.","dictionary.empty-state.uninitialized":"La définition dictionaire du dernier mot surligné sera affichée ici.","dictionary.input.placeholder":"Rechercher dans le dictionnaire...","empty-state.error":"Erreur","empty-state.info":"Info","empty-state.success":"Ouais!","empty-state.warning":"Oups!","github":"Voir ce projet sur GitHub","keyMap":"Raccourcis clavier","keyMap.board":"Plateau","keyMap.board.toggle-blank":"Marqué/Démarqué la case en tant que vide","keyMap.board.toggle-direction":"Faire basculer la direction d\'écriture","keyMap.board-and-rack":"Plateau & chevalet","keyMap.board-and-rack.insert-two-letter-tile":"Insérer une tuile de deux lettres","keyMap.board-and-rack.navigate":"Naviguer","keyMap.board-and-rack.remove-tile":"Supprimer une case","keyMap.board-and-rack.submit":"Commencer la résolution","keyMap.rack":"Chevalet","keyMap.rack.insert-blank":"Inserer une case vide (spacebar)","rack.placeholder":"Lettres","remaining-tiles":"Cases restantes","results.empty-state.no-filtered-results":"Aucun résultat ne correspond à cette requête","results.empty-state.no-results":"Pas de résultats - impossible de générer des mots.","results.empty-state.outdated":"Les résultats sont dépassé. Cliquer ci-dessous pour mettre à jour.","results.empty-state.uninitialized":"Words generated from your letters will be shown here.","results.input.placeholder":"Rechercher les résultats... (RegExp)","results.solve":"Résoudre","settings":"Options","settings.autoGroupTiles":"Grouper les cases restantes","settings.autoGroupTiles.left":"Vers la droite","settings.autoGroupTiles.right":"Vers la gauche","settings.autoGroupTiles.null":"Ne pas grouper","settings.game":"Jeu","settings.language":"Langue","words":"Mots créés","words.invalid":"Incorrect","words.valid":"Corriger"}');
1822
1952
  ;// CONCATENATED MODULE: ./src/i18n/pl.json
1823
- const pl_namespaceObject = JSON.parse('{"cell.filter-cell":"Miejsce docelowe - kliknij aby zmienić","cell.set-blank":"Oznacz jako blank","cell.set-not-blank":"Oznacz jako nie blank","cell.toggle-direction":"Kierunek wpisywania - kliknij aby zmienić","common.blanks":"Blanki","common.clear":"Wyczyść","common.close":"Zamknij","common.consonants":"Spółgłoski","common.loading":"Ładowanie","common.points":"Punkty","common.tiles":"Płytki","common.two-letter-tiles":"Dwuliterowe","common.vowels":"Samogłoski","common.word":"Słowo","common.words":"Słowa","dictionary.empty-state.no-definitions":"Słowo istnieje w słowniku ale nie posiada definicji.","dictionary.empty-state.no-results":"Nie udało się znaleźć definicji słowa w słowniku.","dictionary.empty-state.not-allowed":"To słowo nie jest dopuszczalne w grach.","dictionary.empty-state.uninitialized":"Tu zostanie wyświetlona słownikowa definicja ostatnio podświetlonego słowa.","dictionary.input.placeholder":"Szukaj w słowniku...","empty-state.error":"Błąd","empty-state.info":"Info","empty-state.success":"Hurra!","empty-state.warning":"Ups!","github":"Zobacz ten projekt na GitHubie","keyMap":"Skróty klawiszowe","keyMap.board":"Plansza","keyMap.board.toggle-blank":"Oznacz/odznacz płytkę jako blank","keyMap.board.toggle-direction":"Zmień kierunek wpisywania","keyMap.board-and-rack":"Plansza i stojak","keyMap.board-and-rack.insert-two-letter-tile":"Wstaw dwuliterową płytkę","keyMap.board-and-rack.navigate":"Nawigacja","keyMap.board-and-rack.remove-tile":"Zdejmij płytkę","keyMap.board-and-rack.submit":"Rozpocznij wyszukiwanie","keyMap.rack":"Stojak","keyMap.rack.insert-blank":"Wstaw blanka (spacja)","rack.placeholder":"Literki","remaining-tiles":"Pozostałe płytki","results.empty-state.no-filtered-results":"Żaden wynik nie pasuje do tej kwerendy.","results.empty-state.no-results":"Brak wyników - nie można wygenerować żadnego słowa.","results.empty-state.outdated":"Wyniki są nieaktualne. Kliknij poniżej, aby zaktualizować.","results.empty-state.uninitialized":"Tu zostaną wyświetlone słowa wygenerowane z Twoich liter.","results.input.placeholder":"Szukaj rozwiązania... (RegExp)","results.solve":"Rozwiąż","settings":"Opcje","settings.autoGroupTiles":"Grupuj pozostałe płytki","settings.autoGroupTiles.left":"Po lewej","settings.autoGroupTiles.right":"Po prawej","settings.autoGroupTiles.null":"Nie grupuj","settings.game":"Gra","settings.language":"Język"}');
1953
+ const pl_namespaceObject = JSON.parse('{"cell.filter-cell":"Miejsce docelowe - kliknij aby zmienić","cell.set-blank":"Oznacz jako blank","cell.set-not-blank":"Oznacz jako nie blank","cell.toggle-direction":"Kierunek wpisywania - kliknij aby zmienić","common.blanks":"Blanki","common.clear":"Wyczyść","common.close":"Zamknij","common.consonants":"Spółgłoski","common.loading":"Ładowanie","common.points":"Punkty","common.tiles":"Płytki","common.two-letter-tiles":"Dwuliterowe","common.vowels":"Samogłoski","common.word":"Słowo","common.words":"Słowa","dictionary.empty-state.no-definitions":"Słowo istnieje w słowniku ale nie posiada definicji.","dictionary.empty-state.no-results":"Nie udało się znaleźć definicji słowa w słowniku.","dictionary.empty-state.not-allowed":"To słowo nie jest dopuszczalne w grach.","dictionary.empty-state.uninitialized":"Tu zostanie wyświetlona słownikowa definicja ostatnio podświetlonego słowa.","dictionary.input.placeholder":"Szukaj w słowniku...","empty-state.error":"Błąd","empty-state.info":"Info","empty-state.success":"Hurra!","empty-state.warning":"Ups!","github":"Zobacz ten projekt na GitHubie","keyMap":"Skróty klawiszowe","keyMap.board":"Plansza","keyMap.board.toggle-blank":"Oznacz/odznacz płytkę jako blank","keyMap.board.toggle-direction":"Zmień kierunek wpisywania","keyMap.board-and-rack":"Plansza i stojak","keyMap.board-and-rack.insert-two-letter-tile":"Wstaw dwuliterową płytkę","keyMap.board-and-rack.navigate":"Nawigacja","keyMap.board-and-rack.remove-tile":"Zdejmij płytkę","keyMap.board-and-rack.submit":"Rozpocznij wyszukiwanie","keyMap.rack":"Stojak","keyMap.rack.insert-blank":"Wstaw blanka (spacja)","rack.placeholder":"Literki","remaining-tiles":"Pozostałe płytki","results.empty-state.no-filtered-results":"Żaden wynik nie pasuje do tej kwerendy.","results.empty-state.no-results":"Brak wyników - nie można wygenerować żadnego słowa.","results.empty-state.outdated":"Wyniki są nieaktualne. Kliknij poniżej, aby zaktualizować.","results.empty-state.uninitialized":"Tu zostaną wyświetlone słowa wygenerowane z Twoich liter.","results.input.placeholder":"Szukaj rozwiązania... (RegExp)","results.solve":"Rozwiąż","settings":"Opcje","settings.autoGroupTiles":"Grupuj pozostałe płytki","settings.autoGroupTiles.left":"Po lewej","settings.autoGroupTiles.right":"Po prawej","settings.autoGroupTiles.null":"Nie grupuj","settings.game":"Gra","settings.language":"Język","words":"Utworzone słowa","words.invalid":"Niepoprawne","words.valid":"Poprawne"}');
1824
1954
  ;// CONCATENATED MODULE: ./src/i18n/index.ts
1825
1955
 
1826
1956
 
@@ -1838,13 +1968,14 @@ const i18n = {
1838
1968
  };
1839
1969
  /* harmony default export */ const src_i18n = (i18n);
1840
1970
 
1841
- // EXTERNAL MODULE: ./src/lib/index.ts + 27 modules
1842
- var lib = __webpack_require__(92237);
1971
+ // EXTERNAL MODULE: ./src/lib/index.ts + 29 modules
1972
+ var lib = __webpack_require__(75558);
1843
1973
  ;// CONCATENATED MODULE: ./src/state/selectors.ts
1844
1974
 
1845
1975
 
1846
1976
 
1847
1977
 
1978
+
1848
1979
  const selectCell = (_, cell)=>cell;
1849
1980
  const selectPoint = (_, point)=>point;
1850
1981
  const selectCharacter = (_, character)=>character;
@@ -1856,7 +1987,13 @@ const selectRackRoot = (state)=>state.rack;
1856
1987
  const selectResultsRoot = (state)=>state.results;
1857
1988
  const selectSettingsRoot = (state)=>state.settings;
1858
1989
  const selectSolveRoot = (state)=>state.solve;
1990
+ const selectVerifyRoot = (state)=>state.verify;
1859
1991
  const selectDictionary = selectDictionaryRoot;
1992
+ const selectDictionaryError = (0,toolkit_.createSelector)([
1993
+ selectDictionaryRoot
1994
+ ], (dictionary)=>{
1995
+ return (0,types_build.isError)(dictionary.error) ? dictionary.error : undefined;
1996
+ });
1860
1997
  const selectAutoGroupTiles = (0,toolkit_.createSelector)([
1861
1998
  selectSettingsRoot
1862
1999
  ], (settings)=>settings.autoGroupTiles);
@@ -1981,6 +2118,11 @@ const selectLastSolvedParameters = (0,toolkit_.createSelector)([
1981
2118
  const selectIsLoading = (0,toolkit_.createSelector)([
1982
2119
  selectSolveRoot
1983
2120
  ], (solve)=>solve.isLoading);
2121
+ const selectSolveError = (0,toolkit_.createSelector)([
2122
+ selectSolveRoot
2123
+ ], (solve)=>{
2124
+ return (0,types_build.isError)(solve.error) ? solve.error : undefined;
2125
+ });
1984
2126
  const selectHaveCharactersChanged = (0,toolkit_.createSelector)([
1985
2127
  selectLastSolvedParameters,
1986
2128
  selectCharacters
@@ -2008,11 +2150,17 @@ const selectHasOverusedTiles = (0,toolkit_.createSelector)([
2008
2150
  const selectRemainingTilesGroups = (0,toolkit_.createSelector)([
2009
2151
  selectRemainingTiles
2010
2152
  ], lib/* getRemainingTilesGroups */.op);
2153
+ const selectVerify = selectVerifyRoot;
2154
+ const selectHasInvalidWords = (0,toolkit_.createSelector)([
2155
+ selectVerify
2156
+ ], ({ invalidWords })=>{
2157
+ return invalidWords.length > 0;
2158
+ });
2011
2159
 
2012
2160
 
2013
2161
  /***/ }),
2014
2162
 
2015
- /***/ 8772:
2163
+ /***/ 99134:
2016
2164
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2017
2165
 
2018
2166
 
@@ -2024,10 +2172,11 @@ __webpack_require__.d(__webpack_exports__, {
2024
2172
  "O_": () => (/* reexport */ slices_rackSlice),
2025
2173
  "_C": () => (/* reexport */ slices_resultsSlice),
2026
2174
  "xj": () => (/* reexport */ slices_settingsSlice),
2027
- "TP": () => (/* reexport */ slices_solveSlice)
2175
+ "TP": () => (/* reexport */ slices_solveSlice),
2176
+ "Gt": () => (/* reexport */ slices_verifySlice)
2028
2177
  });
2029
2178
 
2030
- // UNUSED EXPORTS: boardInitialState, cellFilterInitialState, dictionaryInitialState, rackInitialState, resultsInitialState, settingsInitialState, solveInitialState
2179
+ // UNUSED EXPORTS: boardInitialState, cellFilterInitialState, dictionaryInitialState, rackInitialState, resultsInitialState, settingsInitialState, solveInitialState, verifyInitialState
2031
2180
 
2032
2181
  // EXTERNAL MODULE: ../configs/build/index.js
2033
2182
  var build = __webpack_require__(89418);
@@ -2151,6 +2300,7 @@ const cellFilterSlice = (0,toolkit_.createSlice)({
2151
2300
 
2152
2301
  ;// CONCATENATED MODULE: ./src/state/slices/dictionaryInitialState.ts
2153
2302
  const dictionaryInitialState = {
2303
+ error: undefined,
2154
2304
  input: "",
2155
2305
  isLoading: false,
2156
2306
  results: []
@@ -2172,32 +2322,41 @@ const dictionarySlice = (0,toolkit_.createSlice)({
2172
2322
  },
2173
2323
  reset: ()=>slices_dictionaryInitialState,
2174
2324
  submit: (state)=>{
2325
+ const error = slices_dictionaryInitialState.error;
2326
+ const results = slices_dictionaryInitialState.results;
2175
2327
  return {
2176
2328
  ...state,
2329
+ error,
2177
2330
  isLoading: true,
2178
- results: slices_dictionaryInitialState.results
2331
+ results
2179
2332
  };
2180
2333
  },
2181
- submitFailure: (state)=>{
2334
+ submitFailure: (state, action)=>{
2335
+ const error = action.payload;
2336
+ const results = slices_dictionaryInitialState.results;
2182
2337
  return {
2183
2338
  ...state,
2339
+ error,
2184
2340
  isLoading: false,
2185
- results: slices_dictionaryInitialState.results
2341
+ results
2186
2342
  };
2187
2343
  },
2188
2344
  submitSuccess: (state, action)=>{
2345
+ const error = slices_dictionaryInitialState.error;
2346
+ const results = action.payload;
2189
2347
  return {
2190
2348
  ...state,
2349
+ error,
2191
2350
  isLoading: false,
2192
- results: action.payload
2351
+ results
2193
2352
  };
2194
2353
  }
2195
2354
  }
2196
2355
  });
2197
2356
  /* harmony default export */ const slices_dictionarySlice = (dictionarySlice);
2198
2357
 
2199
- // EXTERNAL MODULE: ./src/lib/index.ts + 27 modules
2200
- var lib = __webpack_require__(92237);
2358
+ // EXTERNAL MODULE: ./src/lib/index.ts + 29 modules
2359
+ var lib = __webpack_require__(75558);
2201
2360
  ;// CONCATENATED MODULE: ./src/state/slices/rackInitialState.ts
2202
2361
  const rackInitialState = [
2203
2362
  null,
@@ -2230,6 +2389,16 @@ const rackSlice = (0,toolkit_.createSlice)({
2230
2389
  ...state.slice(index + 1)
2231
2390
  ];
2232
2391
  },
2392
+ changeCharacters: (state, action)=>{
2393
+ const { characters , index } = action.payload;
2394
+ const expectedRackLength = state.length;
2395
+ const rack = [
2396
+ ...state.slice(0, index),
2397
+ ...characters,
2398
+ ...state.slice(index + characters.length)
2399
+ ];
2400
+ return rack.slice(0, expectedRackLength);
2401
+ },
2233
2402
  groupTiles: (state, action)=>{
2234
2403
  const direction = action.payload;
2235
2404
  if (direction === null) {
@@ -2365,6 +2534,7 @@ const settingsSlice = (0,toolkit_.createSlice)({
2365
2534
  ;// CONCATENATED MODULE: ./src/state/slices/solveInitialState.ts
2366
2535
 
2367
2536
  const solveInitialState = {
2537
+ error: undefined,
2368
2538
  isLoading: false,
2369
2539
  lastSolvedParameters: {
2370
2540
  board: slices_boardInitialState,
@@ -2381,21 +2551,27 @@ const solveSlice = (0,toolkit_.createSlice)({
2381
2551
  name: "solve",
2382
2552
  reducers: {
2383
2553
  submit: (state)=>{
2554
+ const error = slices_solveInitialState.error;
2384
2555
  return {
2385
2556
  ...state,
2557
+ error,
2386
2558
  isLoading: true
2387
2559
  };
2388
2560
  },
2389
- submitFailure: (state)=>{
2561
+ submitFailure: (state, action)=>{
2562
+ const error = action.payload;
2390
2563
  return {
2391
2564
  ...state,
2565
+ error,
2392
2566
  isLoading: false
2393
2567
  };
2394
2568
  },
2395
2569
  submitSuccess: (state, action)=>{
2570
+ const error = slices_solveInitialState.error;
2396
2571
  const lastSolvedParameters = action.payload;
2397
2572
  return {
2398
2573
  ...state,
2574
+ error,
2399
2575
  isLoading: false,
2400
2576
  lastSolvedParameters
2401
2577
  };
@@ -2404,6 +2580,53 @@ const solveSlice = (0,toolkit_.createSlice)({
2404
2580
  });
2405
2581
  /* harmony default export */ const slices_solveSlice = (solveSlice);
2406
2582
 
2583
+ ;// CONCATENATED MODULE: ./src/state/slices/verifyInitialState.ts
2584
+
2585
+ const verifyInitialState = {
2586
+ isLoading: false,
2587
+ lastSolvedParameters: {
2588
+ board: slices_boardInitialState
2589
+ },
2590
+ invalidWords: [],
2591
+ validWords: []
2592
+ };
2593
+ /* harmony default export */ const slices_verifyInitialState = (verifyInitialState);
2594
+
2595
+ ;// CONCATENATED MODULE: ./src/state/slices/verifySlice.ts
2596
+
2597
+
2598
+ const verifySlice = (0,toolkit_.createSlice)({
2599
+ initialState: slices_verifyInitialState,
2600
+ name: "verify",
2601
+ reducers: {
2602
+ submit: (state)=>{
2603
+ return {
2604
+ ...state,
2605
+ isLoading: true
2606
+ };
2607
+ },
2608
+ submitFailure: (state)=>{
2609
+ return {
2610
+ ...state,
2611
+ isLoading: false
2612
+ };
2613
+ },
2614
+ submitSuccess: (state, action)=>{
2615
+ const { board , invalidWords , validWords } = action.payload;
2616
+ return {
2617
+ ...state,
2618
+ isLoading: false,
2619
+ lastSolvedParameters: {
2620
+ board
2621
+ },
2622
+ invalidWords,
2623
+ validWords
2624
+ };
2625
+ }
2626
+ }
2627
+ });
2628
+ /* harmony default export */ const slices_verifySlice = (verifySlice);
2629
+
2407
2630
  ;// CONCATENATED MODULE: ./src/state/slices/index.ts
2408
2631
 
2409
2632
 
@@ -2421,6 +2644,8 @@ const solveSlice = (0,toolkit_.createSlice)({
2421
2644
 
2422
2645
 
2423
2646
 
2647
+
2648
+
2424
2649
  /***/ }),
2425
2650
 
2426
2651
  /***/ 41573:
@@ -2567,7 +2792,7 @@ class Board {
2567
2792
  }
2568
2793
  getBlanksCount() {
2569
2794
  return this.rows.reduce((count, row) => {
2570
- return count + row.reduce((rowCount, cell) => (cell.tile.isBlank ? rowCount + 1 : rowCount), 0);
2795
+ return count + row.reduce((rowCount, cell) => rowCount + (cell.tile.isBlank ? 1 : 0), 0);
2571
2796
  }, 0);
2572
2797
  }
2573
2798
  getColumn(index) {
@@ -2578,9 +2803,25 @@ class Board {
2578
2803
  }
2579
2804
  getTilesCount() {
2580
2805
  return this.rows.reduce((count, row) => {
2581
- return count + row.reduce((rowCount, cell) => (cell.hasTile() ? rowCount + 1 : rowCount), 0);
2806
+ return count + row.reduce((rowCount, cell) => rowCount + (cell.hasTile() ? 1 : 0), 0);
2582
2807
  }, 0);
2583
2808
  }
2809
+ getWords() {
2810
+ const columns = [];
2811
+ for (let x = 0; x < this.columnsCount; ++x) {
2812
+ const column = [];
2813
+ for (let y = 0; y < this.rowsCount; ++y) {
2814
+ column.push(this.rows[y][x]);
2815
+ }
2816
+ columns.push(column);
2817
+ }
2818
+ const columnsBoard = new Board({ rows: columns });
2819
+ const lines = this.toString().split('\n').concat(columnsBoard.toString().split('\n'));
2820
+ const words = lines
2821
+ .flatMap((line) => line.replaceAll(/\s+/g, constants_1.EMPTY_CELL).split(' '))
2822
+ .filter((word) => word.length > 1);
2823
+ return words;
2824
+ }
2584
2825
  isEmpty() {
2585
2826
  return this.rows.every((row) => row.every(({ isEmpty }) => isEmpty));
2586
2827
  }
@@ -2588,7 +2829,7 @@ class Board {
2588
2829
  return this.rows.map((row) => row.map((cell) => cell.toJson()));
2589
2830
  }
2590
2831
  toString() {
2591
- return this.rows.map((row) => row.map(String)).join('\n');
2832
+ return this.rows.map((row) => row.map(String).join('')).join('\n');
2592
2833
  }
2593
2834
  updateCell(x, y, updateCell) {
2594
2835
  this.rows[y][x] = updateCell(this.rows[y][x]);
@@ -2856,7 +3097,7 @@ class Config {
2856
3097
  return tile.isBlank ? this.blankScore : this.getCharacterPoints(tile.character);
2857
3098
  }
2858
3099
  hasCharacter(character) {
2859
- return this.alphabet.includes(character);
3100
+ return character in this.pointsMap;
2860
3101
  }
2861
3102
  isTwoCharacterTilePrefix(character) {
2862
3103
  return typeof this.getTwoCharacterTileByPrefix(character) !== 'undefined';
@@ -2890,6 +3131,29 @@ const getPointsMap = (config) => config.tiles.reduce((pointsMap, { character, sc
2890
3131
  exports["default"] = Config;
2891
3132
 
2892
3133
 
3134
+ /***/ }),
3135
+
3136
+ /***/ 35905:
3137
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
3138
+
3139
+
3140
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3141
+ return (mod && mod.__esModule) ? mod : { "default": mod };
3142
+ };
3143
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
3144
+ const Pattern_1 = __importDefault(__webpack_require__(63207));
3145
+ class FinalPattern extends Pattern_1.default {
3146
+ constructor(pattern) {
3147
+ super(pattern.board, pattern.cells);
3148
+ this.collisions = pattern.getCollisions();
3149
+ }
3150
+ getCollisions() {
3151
+ return this.collisions;
3152
+ }
3153
+ }
3154
+ exports["default"] = FinalPattern;
3155
+
3156
+
2893
3157
  /***/ }),
2894
3158
 
2895
3159
  /***/ 49594:
@@ -2903,10 +3167,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
2903
3167
  const Pattern_1 = __importDefault(__webpack_require__(63207));
2904
3168
  class HorizontalPattern extends Pattern_1.default {
2905
3169
  clone() {
2906
- return new HorizontalPattern({
2907
- board: this.board,
2908
- cells: this.cells.map((cell) => cell.clone()),
2909
- });
3170
+ return new HorizontalPattern(this.board, this.cells.map((cell) => cell.clone()));
2910
3171
  }
2911
3172
  getCollisions() {
2912
3173
  const collisions = [];
@@ -2926,7 +3187,7 @@ class HorizontalPattern extends Pattern_1.default {
2926
3187
  const nextCells = column.slice(cell.y + 1, y);
2927
3188
  const cells = [...previousCells, cell, ...nextCells];
2928
3189
  if (cells.length > 1) {
2929
- const pattern = new Pattern_1.default({ board: this.board, cells });
3190
+ const pattern = new Pattern_1.default(this.board, cells);
2930
3191
  collisions.push(pattern);
2931
3192
  }
2932
3193
  });
@@ -2968,7 +3229,7 @@ exports["default"] = Locale;
2968
3229
 
2969
3230
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2970
3231
  class Pattern {
2971
- constructor({ board, cells }) {
3232
+ constructor(board, cells) {
2972
3233
  this.board = board;
2973
3234
  this.cells = cells;
2974
3235
  }
@@ -2979,10 +3240,7 @@ class Pattern {
2979
3240
  (this.hasAtLeast1NonEmptyCell() || this.collides() || (this.goesThroughBoardCenter() && this.board.isEmpty())));
2980
3241
  }
2981
3242
  clone() {
2982
- return new Pattern({
2983
- board: this.board,
2984
- cells: this.cells.map((cell) => cell.clone()),
2985
- });
3243
+ return new Pattern(this.board, this.cells.map((cell) => cell.clone()));
2986
3244
  }
2987
3245
  collides() {
2988
3246
  return this.cells.some((cell) => cell.isEmpty && this.board.collides(cell));
@@ -3076,11 +3334,9 @@ const getNonBlanks = (tiles) => tiles.filter(({ isBlank }) => !isBlank);
3076
3334
  const getPointsRatio = (tiles, points) => points / tiles.length;
3077
3335
  const getTiles = (cells) => cells.filter(({ isEmpty }) => isEmpty).map(({ tile }) => tile);
3078
3336
  const getTilesCharacters = (tiles) => getNonBlankCharacters(tiles).sort(charactersComparator).join('');
3079
- const getWord = (cells) => cells.map(String).join('');
3080
- const getWords = (cells, collisions) => [
3081
- getWord(cells),
3082
- ...collisions.map((collision) => collision.map(String).join('')),
3083
- ];
3337
+ // eslint-disable-next-line prefer-template
3338
+ const getWord = (cells) => cells.reduce((word, cell) => word + cell.toString(), '');
3339
+ const getWords = (cells, collisions) => [cells, ...collisions].map(getWord);
3084
3340
  const isConsonant = ({ character, isBlank }) => constants_1.CONSONANTS.includes(character) && !isBlank;
3085
3341
  const isVowel = ({ character, isBlank }) => constants_1.VOWELS.includes(character) && !isBlank;
3086
3342
  exports["default"] = Result;
@@ -3169,10 +3425,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
3169
3425
  const Pattern_1 = __importDefault(__webpack_require__(63207));
3170
3426
  class VerticalPattern extends Pattern_1.default {
3171
3427
  clone() {
3172
- return new VerticalPattern({
3173
- board: this.board,
3174
- cells: this.cells.map((cell) => cell.clone()),
3175
- });
3428
+ return new VerticalPattern(this.board, this.cells.map((cell) => cell.clone()));
3176
3429
  }
3177
3430
  getCollisions() {
3178
3431
  const collisions = [];
@@ -3192,7 +3445,7 @@ class VerticalPattern extends Pattern_1.default {
3192
3445
  const nextCells = row.slice(cell.x + 1, x);
3193
3446
  const cells = [...previousCells, cell, ...nextCells];
3194
3447
  if (cells.length > 1) {
3195
- const pattern = new Pattern_1.default({ board: this.board, cells });
3448
+ const pattern = new Pattern_1.default(this.board, cells);
3196
3449
  collisions.push(pattern);
3197
3450
  }
3198
3451
  });
@@ -3279,7 +3532,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3279
3532
  return (mod && mod.__esModule) ? mod : { "default": mod };
3280
3533
  };
3281
3534
  Object.defineProperty(exports, "__esModule", ({ value: true }));
3282
- exports.WordDefinition = exports.WordBonus = exports.VerticalPattern = exports.isTileJson = exports.Tile = exports.Result = exports.Pattern = exports.isLocale = exports.Locale = exports.isObject = exports.HorizontalPattern = exports.Config = exports.CharacterBonus = exports.isCellJson = exports.Cell = exports.Bonus = exports.isBoardJson = exports.Board = void 0;
3535
+ exports.WordDefinition = exports.WordBonus = exports.VerticalPattern = exports.isTileJson = exports.Tile = exports.Result = exports.Pattern = exports.isLocale = exports.Locale = exports.isObject = exports.isError = exports.HorizontalPattern = exports.FinalPattern = exports.Config = exports.CharacterBonus = exports.isCellJson = exports.Cell = exports.Bonus = exports.isBoardJson = exports.Board = void 0;
3283
3536
  var Board_1 = __webpack_require__(80559);
3284
3537
  Object.defineProperty(exports, "Board", ({ enumerable: true, get: function () { return __importDefault(Board_1).default; } }));
3285
3538
  var BoardJson_1 = __webpack_require__(46936);
@@ -3294,8 +3547,12 @@ var CharacterBonus_1 = __webpack_require__(19582);
3294
3547
  Object.defineProperty(exports, "CharacterBonus", ({ enumerable: true, get: function () { return __importDefault(CharacterBonus_1).default; } }));
3295
3548
  var Config_1 = __webpack_require__(28433);
3296
3549
  Object.defineProperty(exports, "Config", ({ enumerable: true, get: function () { return __importDefault(Config_1).default; } }));
3550
+ var FinalPattern_1 = __webpack_require__(35905);
3551
+ Object.defineProperty(exports, "FinalPattern", ({ enumerable: true, get: function () { return __importDefault(FinalPattern_1).default; } }));
3297
3552
  var HorizontalPattern_1 = __webpack_require__(49594);
3298
3553
  Object.defineProperty(exports, "HorizontalPattern", ({ enumerable: true, get: function () { return __importDefault(HorizontalPattern_1).default; } }));
3554
+ var isError_1 = __webpack_require__(96255);
3555
+ Object.defineProperty(exports, "isError", ({ enumerable: true, get: function () { return __importDefault(isError_1).default; } }));
3299
3556
  var isObject_1 = __webpack_require__(24814);
3300
3557
  Object.defineProperty(exports, "isObject", ({ enumerable: true, get: function () { return __importDefault(isObject_1).default; } }));
3301
3558
  var Locale_1 = __webpack_require__(26634);
@@ -3317,6 +3574,26 @@ var WordDefinition_1 = __webpack_require__(31560);
3317
3574
  Object.defineProperty(exports, "WordDefinition", ({ enumerable: true, get: function () { return __importDefault(WordDefinition_1).default; } }));
3318
3575
 
3319
3576
 
3577
+ /***/ }),
3578
+
3579
+ /***/ 96255:
3580
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
3581
+
3582
+
3583
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3584
+ return (mod && mod.__esModule) ? mod : { "default": mod };
3585
+ };
3586
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
3587
+ const isObject_1 = __importDefault(__webpack_require__(24814));
3588
+ const isError = (value) => {
3589
+ if (!(0, isObject_1.default)(value)) {
3590
+ return false;
3591
+ }
3592
+ return typeof value.message === 'string';
3593
+ };
3594
+ exports["default"] = isError;
3595
+
3596
+
3320
3597
  /***/ }),
3321
3598
 
3322
3599
  /***/ 24814: