@scrabble-solver/scrabble-solver 2.15.8 → 2.15.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 (316) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +13 -13
  3. package/.next/cache/.rscinfo +1 -1
  4. package/.next/cache/.tsbuildinfo +1 -1
  5. package/.next/cache/webpack/client-production/0.pack +0 -0
  6. package/.next/cache/webpack/client-production/index.pack +0 -0
  7. package/.next/cache/webpack/client-production/index.pack.old +0 -0
  8. package/.next/cache/webpack/edge-server-production/0.pack +0 -0
  9. package/.next/cache/webpack/edge-server-production/index.pack +0 -0
  10. package/.next/cache/webpack/edge-server-production/index.pack.old +0 -0
  11. package/.next/cache/webpack/server-production/0.pack +0 -0
  12. package/.next/cache/webpack/server-production/index.pack +0 -0
  13. package/.next/cache/webpack/server-production/index.pack.old +0 -0
  14. package/.next/diagnostics/framework.json +1 -1
  15. package/.next/next-minimal-server.js.nft.json +1 -1
  16. package/.next/next-server.js.nft.json +1 -1
  17. package/.next/prerender-manifest.json +4 -4
  18. package/.next/required-server-files.json +1 -2
  19. package/.next/routes-manifest.json +1 -1
  20. package/.next/server/chunks/60.js +1 -1
  21. package/.next/server/chunks/812.js +1 -1
  22. package/.next/server/chunks/974.js +1 -1
  23. package/.next/server/middleware-build-manifest.js +1 -1
  24. package/.next/server/pages/404.html +1 -1
  25. package/.next/server/pages/404.js.nft.json +1 -1
  26. package/.next/server/pages/500.html +1 -1
  27. package/.next/server/pages/_app.js +1 -1
  28. package/.next/server/pages/_app.js.nft.json +1 -1
  29. package/.next/server/pages/_error.js +1 -1
  30. package/.next/server/pages/_error.js.nft.json +1 -1
  31. package/.next/server/pages/api/dictionary/[locale]/[word].js +2 -2
  32. package/.next/server/pages/api/dictionary/[locale]/[word].js.nft.json +1 -1
  33. package/.next/server/pages/api/dictionary/[locale].js +1 -1
  34. package/.next/server/pages/api/dictionary/[locale].js.nft.json +1 -1
  35. package/.next/server/pages/api/solve.js +1 -1
  36. package/.next/server/pages/api/solve.js.nft.json +1 -1
  37. package/.next/server/pages/api/verify.js +1 -1
  38. package/.next/server/pages/api/verify.js.nft.json +1 -1
  39. package/.next/server/pages/api/visit.js +1 -1
  40. package/.next/server/pages/index.html +1 -1
  41. package/.next/server/pages/index.js +1 -1
  42. package/.next/server/pages/index.js.nft.json +1 -1
  43. package/.next/server/pages/index.json +1 -1
  44. package/.next/server/pages-manifest.json +1 -1
  45. package/.next/server/webpack-api-runtime.js +1 -1
  46. package/.next/static/chunks/{main-b934e2c3dd3b55b5.js → main-016492249b3393e2.js} +1 -1
  47. package/.next/static/chunks/pages/{404-7451dd58396eaa39.js → 404-590e2a3839c1d9e0.js} +1 -1
  48. package/.next/static/chunks/pages/_app-ac93a74c390f2ab8.js +1 -0
  49. package/.next/static/chunks/pages/index-e5f1caa581e6d3b8.js +1 -0
  50. package/.next/static/chunks/webpack-6224d37324e372cb.js +1 -0
  51. package/.next/static/{IJuVKnkd8P2us9rVuan82 → ylO_ttKeJTuoqDYywao5A}/_buildManifest.js +1 -1
  52. package/.next/trace +23 -23
  53. package/LICENSE +1 -1
  54. package/next.config.js +3 -0
  55. package/package.json +11 -10
  56. package/src/api/getServerLoggingData.ts +1 -3
  57. package/src/api/index.ts +5 -5
  58. package/src/api/isBoardValid.ts +3 -5
  59. package/src/api/isCellValid.ts +4 -6
  60. package/src/api/isCharacterValid.ts +2 -3
  61. package/src/api/isRowValid.ts +3 -5
  62. package/src/components/Alert/Alert.tsx +1 -3
  63. package/src/components/Alert/index.ts +1 -1
  64. package/src/components/Badge/Badge.tsx +1 -3
  65. package/src/components/Badge/index.ts +1 -1
  66. package/src/components/Board/Board.tsx +3 -5
  67. package/src/components/Board/BoardPure.tsx +2 -2
  68. package/src/components/Board/components/Actions/Actions.tsx +3 -5
  69. package/src/components/Board/components/Actions/index.ts +1 -1
  70. package/src/components/Board/components/Cell/Cell.tsx +3 -5
  71. package/src/components/Board/components/Cell/index.ts +1 -1
  72. package/src/components/Board/components/InputPrompt/InputPrompt.tsx +3 -5
  73. package/src/components/Board/components/InputPrompt/index.ts +1 -1
  74. package/src/components/Board/components/ToggleDirectionButton/ToggleDirectionButton.tsx +2 -4
  75. package/src/components/Board/components/ToggleDirectionButton/index.ts +1 -1
  76. package/src/components/Board/components/index.ts +4 -4
  77. package/src/components/Board/hooks/index.ts +6 -6
  78. package/src/components/Board/hooks/useBackgroundImage.tsx +7 -9
  79. package/src/components/Board/hooks/useBoardStyle.ts +7 -9
  80. package/src/components/Board/hooks/useFloatingActions.ts +1 -3
  81. package/src/components/Board/hooks/useFloatingFocus.ts +1 -3
  82. package/src/components/Board/hooks/useFloatingInputPrompt.ts +1 -3
  83. package/src/components/Board/hooks/useGrid.ts +7 -9
  84. package/src/components/Board/index.ts +1 -1
  85. package/src/components/Board/lib/getBonusColor.ts +1 -3
  86. package/src/components/Board/lib/getPositionInGrid.ts +1 -3
  87. package/src/components/Board/lib/index.ts +2 -2
  88. package/src/components/Button/Button.tsx +3 -3
  89. package/src/components/Button/Link.tsx +1 -3
  90. package/src/components/Button/index.ts +1 -1
  91. package/src/components/Dictionary/Dictionary.tsx +3 -5
  92. package/src/components/Dictionary/index.ts +1 -1
  93. package/src/components/DictionaryInput/DictionaryInput.tsx +1 -3
  94. package/src/components/DictionaryInput/index.ts +1 -1
  95. package/src/components/EmptyState/EmptyState.tsx +4 -6
  96. package/src/components/EmptyState/index.ts +1 -1
  97. package/src/components/IconButton/IconButton.tsx +3 -3
  98. package/src/components/IconButton/Link.tsx +1 -3
  99. package/src/components/IconButton/index.ts +1 -1
  100. package/src/components/Key/Key.tsx +1 -3
  101. package/src/components/Key/index.ts +1 -1
  102. package/src/components/Keys/Arrows/Arrows.tsx +2 -4
  103. package/src/components/Keys/Arrows/index.ts +1 -1
  104. package/src/components/{keys.tsx → Keys/index.tsx} +3 -1
  105. package/src/components/Loading/Loading.tsx +2 -4
  106. package/src/components/Loading/index.ts +1 -1
  107. package/src/components/Logo/Logo.tsx +1 -3
  108. package/src/components/Logo/LogoBlueprint.tsx +2 -4
  109. package/src/components/Logo/index.ts +1 -1
  110. package/src/components/Modal/Modal.tsx +3 -3
  111. package/src/components/Modal/components/Section/Section.tsx +1 -3
  112. package/src/components/Modal/components/Section/index.ts +1 -1
  113. package/src/components/Modal/components/index.ts +1 -1
  114. package/src/components/Modal/index.ts +1 -1
  115. package/src/components/NavButtons/NavButtons.tsx +3 -3
  116. package/src/components/NavButtons/index.ts +1 -1
  117. package/src/components/NotFound/NotFound.tsx +2 -4
  118. package/src/components/NotFound/index.ts +1 -1
  119. package/src/components/PlainTiles/PlainTiles.tsx +10 -4
  120. package/src/components/PlainTiles/Tile.tsx +1 -3
  121. package/src/components/PlainTiles/index.ts +1 -1
  122. package/src/components/PlainTiles/lib/createPlainTile.ts +10 -6
  123. package/src/components/PlainTiles/lib/createPlainTiles.ts +2 -4
  124. package/src/components/PlainTiles/lib/getViewbox.ts +1 -3
  125. package/src/components/PlainTiles/lib/getX.ts +1 -3
  126. package/src/components/PlainTiles/lib/getY.ts +1 -3
  127. package/src/components/PlainTiles/lib/index.ts +6 -6
  128. package/src/components/PlainTiles/lib/randomize.ts +1 -3
  129. package/src/components/Progress/Progress.tsx +1 -3
  130. package/src/components/Progress/index.ts +1 -1
  131. package/src/components/Rack/Rack.tsx +9 -11
  132. package/src/components/Rack/components/InputPrompt/InputPrompt.tsx +3 -5
  133. package/src/components/Rack/components/InputPrompt/index.ts +1 -1
  134. package/src/components/Rack/components/RackTile/RackTile.tsx +9 -10
  135. package/src/components/Rack/components/RackTile/index.ts +1 -1
  136. package/src/components/Rack/components/index.ts +2 -2
  137. package/src/components/Rack/index.ts +1 -1
  138. package/src/components/Radio/Radio.tsx +1 -3
  139. package/src/components/Radio/index.ts +1 -1
  140. package/src/components/Results/Cell.tsx +9 -3
  141. package/src/components/Results/Header.tsx +2 -4
  142. package/src/components/Results/HeaderButton.tsx +1 -3
  143. package/src/components/Results/Result.tsx +2 -4
  144. package/src/components/Results/Results.tsx +7 -9
  145. package/src/components/Results/SolveButton.tsx +2 -4
  146. package/src/components/Results/index.ts +1 -1
  147. package/src/components/ResultsInput/ResultsInput.tsx +1 -3
  148. package/src/components/ResultsInput/index.ts +1 -1
  149. package/src/components/SeoMessage/SeoMessage.tsx +4 -6
  150. package/src/components/SeoMessage/index.ts +1 -1
  151. package/src/components/Solver/Solver.tsx +8 -8
  152. package/src/components/Solver/components/InsertButton/InsertButton.tsx +2 -4
  153. package/src/components/Solver/components/InsertButton/index.ts +1 -1
  154. package/src/components/Solver/components/ResultCandidatePicker/ResultCandidatePicker.tsx +4 -6
  155. package/src/components/Solver/components/ResultCandidatePicker/index.ts +1 -1
  156. package/src/components/Solver/components/index.ts +2 -2
  157. package/src/components/Solver/index.ts +1 -1
  158. package/src/components/Spinner/Spinner.tsx +1 -3
  159. package/src/components/Spinner/index.ts +1 -1
  160. package/src/components/Tile/Tile.tsx +2 -4
  161. package/src/components/Tile/TilePure.tsx +2 -2
  162. package/src/components/Tile/index.ts +1 -1
  163. package/src/components/Tooltip/TooltipTrigger.tsx +5 -3
  164. package/src/components/index.ts +24 -25
  165. package/src/hooks/index.ts +13 -13
  166. package/src/hooks/useAppLayout.ts +19 -15
  167. package/src/hooks/useColumns.ts +2 -4
  168. package/src/hooks/useDirection.ts +1 -3
  169. package/src/hooks/useEffectOnce.ts +8 -2
  170. package/src/hooks/useIsTouchDevice.ts +2 -4
  171. package/src/hooks/useLanguage.ts +1 -3
  172. package/src/hooks/useLatest.ts +1 -3
  173. package/src/hooks/useLocalStorage.ts +1 -3
  174. package/src/hooks/useMedia.ts +1 -3
  175. package/src/hooks/useMediaQueries.ts +2 -4
  176. package/src/hooks/useMediaQuery.ts +2 -4
  177. package/src/hooks/useOnWindowResize.ts +1 -3
  178. package/src/hooks/useViewportSize.ts +2 -4
  179. package/src/i18n/i18n.ts +1 -3
  180. package/src/i18n/index.ts +1 -1
  181. package/src/lib/arrayEquals.ts +1 -3
  182. package/src/lib/createArray.ts +1 -3
  183. package/src/lib/createComparator.ts +3 -5
  184. package/src/lib/createGridOf.ts +2 -4
  185. package/src/lib/createKeyComparator.ts +6 -5
  186. package/src/lib/createKeyboardNavigation.ts +2 -4
  187. package/src/lib/createNullMovingComparator.test.ts +1 -1
  188. package/src/lib/createNullMovingComparator.ts +1 -3
  189. package/src/lib/createRegExp.ts +1 -3
  190. package/src/lib/createStringComparator.ts +5 -3
  191. package/src/lib/detectLocale.ts +1 -3
  192. package/src/lib/extractCharacters.test.ts +3 -2
  193. package/src/lib/extractCharacters.ts +17 -5
  194. package/src/lib/extractCharactersByCase.test.ts +1 -1
  195. package/src/lib/extractCharactersByCase.ts +2 -4
  196. package/src/lib/extractInputValue.ts +1 -3
  197. package/src/lib/findCell.ts +1 -3
  198. package/src/lib/getCellSize.ts +3 -5
  199. package/src/lib/getCoordinate.ts +1 -3
  200. package/src/lib/getCoordinates.ts +2 -4
  201. package/src/lib/getRemainingTiles.ts +8 -5
  202. package/src/lib/getRemainingTilesCount.ts +1 -3
  203. package/src/lib/getRemainingTilesGroups.ts +3 -5
  204. package/src/lib/getTileSizes.ts +1 -3
  205. package/src/lib/getTotalRemainingTilesCount.ts +1 -3
  206. package/src/lib/groupResults.ts +3 -5
  207. package/src/lib/guessLocale.ts +2 -4
  208. package/src/lib/index.ts +39 -39
  209. package/src/lib/inverseDirection.ts +1 -3
  210. package/src/lib/isCtrl.ts +1 -3
  211. package/src/lib/isMac.ts +3 -4
  212. package/src/lib/isRegExp.ts +1 -3
  213. package/src/lib/isStringArray.ts +1 -3
  214. package/src/lib/isUpperCase.ts +1 -3
  215. package/src/lib/memoize.ts +18 -20
  216. package/src/lib/noop.ts +1 -3
  217. package/src/lib/numberComparator.ts +1 -3
  218. package/src/lib/resultMatchesCellFilter.ts +1 -3
  219. package/src/lib/reverseComparator.ts +1 -3
  220. package/src/lib/sortGroupedResults.ts +2 -4
  221. package/src/lib/sortResults.ts +5 -7
  222. package/src/lib/unorderedArraysEqual.ts +2 -4
  223. package/src/lib/zipCharactersAndTiles.ts +1 -3
  224. package/src/modals/DictionaryModal/DictionaryModal.tsx +2 -2
  225. package/src/modals/DictionaryModal/index.ts +1 -1
  226. package/src/modals/KeyMapModal/KeyMapModal.tsx +2 -2
  227. package/src/modals/KeyMapModal/components/Mapping/Mapping.tsx +1 -3
  228. package/src/modals/KeyMapModal/components/Mapping/index.ts +1 -1
  229. package/src/modals/KeyMapModal/components/index.ts +1 -1
  230. package/src/modals/KeyMapModal/index.ts +1 -1
  231. package/src/modals/MenuModal/MenuModal.tsx +2 -2
  232. package/src/modals/MenuModal/index.ts +1 -1
  233. package/src/modals/RemainingTilesModal/RemainingTilesModal.tsx +2 -2
  234. package/src/modals/RemainingTilesModal/components/Character/Character.tsx +1 -3
  235. package/src/modals/RemainingTilesModal/components/Character/index.ts +1 -1
  236. package/src/modals/RemainingTilesModal/components/index.ts +1 -1
  237. package/src/modals/RemainingTilesModal/index.ts +1 -1
  238. package/src/modals/ResultsModal/ResultsModal.tsx +2 -2
  239. package/src/modals/ResultsModal/index.ts +1 -1
  240. package/src/modals/SettingsModal/SettingsModal.tsx +2 -2
  241. package/src/modals/SettingsModal/components/AutoGroupTilesSetting/AutoGroupTilesSetting.tsx +1 -3
  242. package/src/modals/SettingsModal/components/AutoGroupTilesSetting/index.ts +1 -1
  243. package/src/modals/SettingsModal/components/ConfigSetting/ConfigSetting.tsx +4 -10
  244. package/src/modals/SettingsModal/components/ConfigSetting/index.ts +1 -1
  245. package/src/modals/SettingsModal/components/ConfigSetting/lib.ts +19 -0
  246. package/src/modals/SettingsModal/components/InputModeSetting/InputModeSetting.tsx +1 -3
  247. package/src/modals/SettingsModal/components/InputModeSetting/index.ts +1 -1
  248. package/src/modals/SettingsModal/components/LocaleSetting/LocaleSetting.tsx +1 -3
  249. package/src/modals/SettingsModal/components/LocaleSetting/index.ts +1 -1
  250. package/src/modals/SettingsModal/components/ShowCoordinatesSetting/ShowCoordinatesSetting.tsx +1 -3
  251. package/src/modals/SettingsModal/components/ShowCoordinatesSetting/index.ts +1 -1
  252. package/src/modals/SettingsModal/components/index.ts +5 -5
  253. package/src/modals/SettingsModal/index.ts +1 -1
  254. package/src/modals/WordsModal/WordsModal.tsx +2 -2
  255. package/src/modals/WordsModal/index.ts +1 -1
  256. package/src/modals/index.ts +7 -7
  257. package/src/pages/_app.tsx +2 -1
  258. package/src/pages/api/dictionary/[locale]/[word].ts +1 -1
  259. package/src/pages/api/dictionary/[locale]/index.ts +1 -1
  260. package/src/pages/api/solve.ts +6 -4
  261. package/src/pages/api/verify.ts +6 -4
  262. package/src/pages/api/visit.ts +2 -2
  263. package/src/pages/index.tsx +7 -0
  264. package/src/sdk/fetch.ts +1 -3
  265. package/src/sdk/fetchJson.ts +2 -4
  266. package/src/sdk/findWordDefinitions.ts +2 -4
  267. package/src/sdk/getDictionary.ts +2 -4
  268. package/src/sdk/index.ts +4 -4
  269. package/src/sdk/solve.ts +2 -4
  270. package/src/sdk/verify.ts +2 -4
  271. package/src/sdk/visit.ts +1 -3
  272. package/src/service-worker/average.ts +1 -3
  273. package/src/service-worker/dictionaries/expirationManager.ts +1 -3
  274. package/src/service-worker/dictionaries/getDictionary.ts +3 -5
  275. package/src/service-worker/dictionaries/getDictionaryUrl.ts +1 -3
  276. package/src/service-worker/dictionaries/index.ts +2 -2
  277. package/src/service-worker/dictionaries/revalidateDictionary.ts +3 -5
  278. package/src/service-worker/getTrie.ts +1 -3
  279. package/src/service-worker/index.ts +4 -2
  280. package/src/service-worker/routeSolveRequests.ts +17 -11
  281. package/src/service-worker/routeVerifyRequests.ts +7 -5
  282. package/src/serviceWorkerManager.ts +4 -4
  283. package/src/state/index.ts +4 -4
  284. package/src/state/localStorage.ts +10 -12
  285. package/src/state/sagas.ts +5 -2
  286. package/src/state/selectors.ts +2 -5
  287. package/src/state/slices/boardInitialState.ts +6 -7
  288. package/src/state/slices/boardSlice.ts +5 -7
  289. package/src/state/slices/cellFilterInitialState.ts +1 -3
  290. package/src/state/slices/cellFilterSlice.ts +2 -4
  291. package/src/state/slices/dictionaryInitialState.ts +2 -4
  292. package/src/state/slices/dictionarySlice.ts +2 -4
  293. package/src/state/slices/index.ts +16 -16
  294. package/src/state/slices/rackInitialState.ts +2 -4
  295. package/src/state/slices/rackSlice.ts +2 -4
  296. package/src/state/slices/resultsInitialState.ts +1 -3
  297. package/src/state/slices/resultsSlice.ts +2 -4
  298. package/src/state/slices/settingsInitialState.ts +2 -4
  299. package/src/state/slices/settingsSlice.ts +2 -4
  300. package/src/state/slices/solveInitialState.ts +3 -5
  301. package/src/state/slices/solveSlice.ts +2 -4
  302. package/src/state/slices/verifyInitialState.ts +2 -4
  303. package/src/state/slices/verifySlice.ts +2 -4
  304. package/src/state/store.ts +1 -3
  305. package/src/state/useTranslate.ts +2 -4
  306. package/src/state/useTypedSelector.ts +1 -3
  307. package/src/types/api.ts +15 -0
  308. package/src/types/index.ts +2 -0
  309. package/tsconfig.json +1 -1
  310. package/.next/cache/eslint/.cache_8dgz12 +0 -1
  311. package/.next/static/chunks/pages/_app-34618eeeff128581.js +0 -1
  312. package/.next/static/chunks/pages/index-d492616d9bc42176.js +0 -1
  313. package/.next/static/chunks/webpack-4224e970a97a4a86.js +0 -1
  314. package/src/components/Keys/index.ts +0 -1
  315. package/tsconfig.jest.json +0 -7
  316. /package/.next/static/{IJuVKnkd8P2us9rVuan82 → ylO_ttKeJTuoqDYywao5A}/_ssgManifest.js +0 -0
@@ -22,12 +22,12 @@ import {
22
22
  import { selectConfig, selectShowCoordinates, useTypedSelector } from 'state';
23
23
  import { ResultColumnId } from 'types';
24
24
 
25
- import useColumns from './useColumns';
26
- import useIsTouchDevice from './useIsTouchDevice';
27
- import useMediaQueries from './useMediaQueries';
28
- import useViewportSize from './useViewportSize';
25
+ import { useColumns } from './useColumns';
26
+ import { useIsTouchDevice } from './useIsTouchDevice';
27
+ import { useMediaQueries } from './useMediaQueries';
28
+ import { useViewportSize } from './useViewportSize';
29
29
 
30
- const useAppLayout = () => {
30
+ export const useAppLayout = () => {
31
31
  const { viewportHeight, viewportWidth } = useViewportSize();
32
32
  const config = useTypedSelector(selectConfig);
33
33
  const showCoordinates = useTypedSelector(selectShowCoordinates);
@@ -54,17 +54,22 @@ const useAppLayout = () => {
54
54
  const coordinatesSizeRatio = showCoordinates === 'hidden' ? 0 : 0.5;
55
55
  const coordinatesBorderWidth = showCoordinates === 'hidden' ? 0 : 1;
56
56
  const cellWidth =
57
- (maxBoardWidth - (config.boardSize + 1 + coordinatesBorderWidth) * BORDER_WIDTH) /
58
- (config.boardSize + coordinatesSizeRatio);
57
+ (maxBoardWidth - (config.boardWidth + 1 + coordinatesBorderWidth) * BORDER_WIDTH) /
58
+ (config.boardWidth + coordinatesSizeRatio);
59
59
  const cellHeight =
60
- (maxBoardHeight - (config.boardSize + 1 + coordinatesBorderWidth) * BORDER_WIDTH) /
61
- (config.boardSize + coordinatesSizeRatio);
60
+ (maxBoardHeight - (config.boardHeight + 1 + coordinatesBorderWidth) * BORDER_WIDTH) /
61
+ (config.boardHeight + coordinatesSizeRatio);
62
62
  const cellSize = Math.min(Math.min(cellWidth, cellHeight), BOARD_TILE_SIZE_MAX);
63
63
  const coordinatesSize = coordinatesSizeRatio * cellSize;
64
- const boardSize =
65
- (cellSize + BORDER_WIDTH) * config.boardSize +
64
+ const boardWidth =
65
+ (cellSize + BORDER_WIDTH) * config.boardWidth +
66
66
  BORDER_WIDTH +
67
67
  (showCoordinates === 'hidden' ? 0 : coordinatesSize + BORDER_WIDTH);
68
+ const boardHeight =
69
+ (cellSize + BORDER_WIDTH) * config.boardHeight +
70
+ BORDER_WIDTH +
71
+ (showCoordinates === 'hidden' ? 0 : coordinatesSize + BORDER_WIDTH);
72
+
68
73
  const maxControlsWidth = tileSize * config.rackSize + 2 * BORDER_WIDTH;
69
74
  const showResultsInModal = isLessThanL;
70
75
  const dictionaryHeight = showResultsInModal ? DICTIONARY_HEIGHT_MOBILE : DICTIONARY_HEIGHT;
@@ -72,7 +77,7 @@ const useAppLayout = () => {
72
77
  const modalWidth = isLessThanS ? viewportWidth : MODAL_WIDTH;
73
78
  const resultsHeight = isLessThanL
74
79
  ? viewportHeight - dictionaryHeight - BUTTON_HEIGHT - MODAL_HEADER_HEIGHT - 5 * componentsSpacing
75
- : boardSize - componentsSpacing - dictionaryHeight;
80
+ : boardHeight - componentsSpacing - dictionaryHeight;
76
81
  const rackWidth = tileSize * config.rackSize;
77
82
  const resultsWidth = isLessThanL ? modalWidth - 2 * componentsSpacing : SOLVER_COLUMN_WIDTH;
78
83
  const columnsWidth = Object.keys(columns).reduce(
@@ -83,7 +88,8 @@ const useAppLayout = () => {
83
88
 
84
89
  return {
85
90
  actionsWidth: 2 * BUTTON_HEIGHT - BORDER_WIDTH,
86
- boardSize,
91
+ boardHeight,
92
+ boardWidth,
87
93
  cellSize,
88
94
  coordinatesFontSize: coordinatesSize * 0.6,
89
95
  coordinatesSize,
@@ -106,5 +112,3 @@ const useAppLayout = () => {
106
112
  tileSize,
107
113
  };
108
114
  };
109
-
110
- export default useAppLayout;
@@ -3,7 +3,7 @@ import { useMemo } from 'react';
3
3
  import { selectColumns, useTypedSelector } from 'state';
4
4
  import { ResultColumnId } from 'types';
5
5
 
6
- import useMediaQueries from './useMediaQueries';
6
+ import { useMediaQueries } from './useMediaQueries';
7
7
 
8
8
  const COLUMNS_XS = [ResultColumnId.Coordinates, ResultColumnId.Word, ResultColumnId.Points];
9
9
 
@@ -13,7 +13,7 @@ const COLUMNS_M = [...COLUMNS_XS];
13
13
 
14
14
  const COLUMNS_L = [...COLUMNS_XS];
15
15
 
16
- const useColumns = (): Partial<Record<ResultColumnId, boolean>> => {
16
+ export const useColumns = (): Partial<Record<ResultColumnId, boolean>> => {
17
17
  const columns = useTypedSelector(selectColumns);
18
18
  const { isLessThanXs, isLessThanS, isLessThanM, isLessThanL } = useMediaQueries();
19
19
 
@@ -43,5 +43,3 @@ const useColumns = (): Partial<Record<ResultColumnId, boolean>> => {
43
43
 
44
44
  return columnsMap;
45
45
  };
46
-
47
- export default useColumns;
@@ -2,7 +2,7 @@ import { useEffect } from 'react';
2
2
 
3
3
  import { noop } from 'lib';
4
4
 
5
- const useDirection = (direction: 'ltr' | 'rtl') => {
5
+ export const useDirection = (direction: 'ltr' | 'rtl') => {
6
6
  useEffect(() => {
7
7
  const html = document.body.parentElement;
8
8
 
@@ -18,5 +18,3 @@ const useDirection = (direction: 'ltr' | 'rtl') => {
18
18
  };
19
19
  }, [direction]);
20
20
  };
21
-
22
- export default useDirection;
@@ -1,5 +1,11 @@
1
1
  import { EffectCallback, useEffect } from 'react';
2
2
 
3
- const useEffectOnce = (effect: EffectCallback) => useEffect(effect, []);
3
+ import { useLatest } from './useLatest';
4
4
 
5
- export default useEffectOnce;
5
+ export const useEffectOnce = (effect: EffectCallback) => {
6
+ const effectRef = useLatest(effect);
7
+
8
+ return useEffect(() => {
9
+ effectRef.current();
10
+ }, [effectRef]);
11
+ };
@@ -1,7 +1,5 @@
1
- import useMedia from './useMedia';
1
+ import { useMedia } from './useMedia';
2
2
 
3
- const useIsTouchDevice = () => {
3
+ export const useIsTouchDevice = () => {
4
4
  return useMedia('(hover: none)', false);
5
5
  };
6
-
7
- export default useIsTouchDevice;
@@ -2,7 +2,7 @@ import { useEffect } from 'react';
2
2
 
3
3
  import { noop } from 'lib';
4
4
 
5
- const useLanguage = (language: string) => {
5
+ export const useLanguage = (language: string) => {
6
6
  useEffect(() => {
7
7
  const html = document.body.parentElement;
8
8
 
@@ -18,5 +18,3 @@ const useLanguage = (language: string) => {
18
18
  };
19
19
  }, [language]);
20
20
  };
21
-
22
- export default useLanguage;
@@ -4,10 +4,8 @@ interface Latest<T> {
4
4
  readonly current: T;
5
5
  }
6
6
 
7
- const useLatest = <T>(value: T): Latest<T> => {
7
+ export const useLatest = <T>(value: T): Latest<T> => {
8
8
  const ref = useRef(value);
9
9
  ref.current = value;
10
10
  return ref;
11
11
  };
12
-
13
- export default useLatest;
@@ -12,7 +12,7 @@ import {
12
12
  useTypedSelector,
13
13
  } from 'state';
14
14
 
15
- const useLocalStorage = () => {
15
+ export const useLocalStorage = () => {
16
16
  const autoGroupTiles = useTypedSelector(selectAutoGroupTiles);
17
17
  const board = useTypedSelector(selectBoard);
18
18
  const game = useTypedSelector(selectGame);
@@ -63,5 +63,3 @@ const useLocalStorage = () => {
63
63
  }
64
64
  }, [showCoordinates]);
65
65
  };
66
-
67
- export default useLocalStorage;
@@ -12,7 +12,7 @@ const getInitialState = (query: string, defaultState?: boolean) => {
12
12
  return window.matchMedia(query).matches;
13
13
  };
14
14
 
15
- const useMedia = (query: string, defaultState?: boolean) => {
15
+ export const useMedia = (query: string, defaultState?: boolean) => {
16
16
  const [state, setState] = useState(getInitialState(query, defaultState));
17
17
 
18
18
  useEffect(() => {
@@ -32,5 +32,3 @@ const useMedia = (query: string, defaultState?: boolean) => {
32
32
 
33
33
  return state;
34
34
  };
35
-
36
- export default useMedia;
@@ -1,6 +1,6 @@
1
- import useMediaQuery from './useMediaQuery';
1
+ import { useMediaQuery } from './useMediaQuery';
2
2
 
3
- const useMediaQueries = () => {
3
+ export const useMediaQueries = () => {
4
4
  const isLessThanXs = useMediaQuery('<xs');
5
5
  const isLessThanS = useMediaQuery('<s');
6
6
  const isLessThanM = useMediaQuery('<m');
@@ -9,5 +9,3 @@ const useMediaQueries = () => {
9
9
 
10
10
  return { isLessThanXs, isLessThanS, isLessThanM, isLessThanL, isLessThanXl };
11
11
  };
12
-
13
- export default useMediaQueries;
@@ -2,11 +2,9 @@ import { buildMediaQuery } from 'include-media-query-builder';
2
2
 
3
3
  import { BREAKPOINTS } from 'parameters';
4
4
 
5
- import useMedia from './useMedia';
5
+ import { useMedia } from './useMedia';
6
6
 
7
- const useMediaQuery = (query: string | string[], defaultState?: boolean | undefined): boolean => {
7
+ export const useMediaQuery = (query: string | string[], defaultState?: boolean): boolean => {
8
8
  const mediaQuery = buildMediaQuery(BREAKPOINTS, query);
9
9
  return useMedia(mediaQuery, defaultState);
10
10
  };
11
-
12
- export default useMediaQuery;
@@ -1,6 +1,6 @@
1
1
  import { useEffect } from 'react';
2
2
 
3
- const useOnWindowResize = (onResize: (event: Event) => void) => {
3
+ export const useOnWindowResize = (onResize: (event: Event) => void) => {
4
4
  useEffect(() => {
5
5
  window.addEventListener('resize', onResize);
6
6
 
@@ -9,5 +9,3 @@ const useOnWindowResize = (onResize: (event: Event) => void) => {
9
9
  };
10
10
  }, [onResize]);
11
11
  };
12
-
13
- export default useOnWindowResize;
@@ -1,8 +1,8 @@
1
1
  import { useCallback, useState } from 'react';
2
2
 
3
- import useOnWindowResize from './useOnWindowResize';
3
+ import { useOnWindowResize } from './useOnWindowResize';
4
4
 
5
- const useViewportSize = () => {
5
+ export const useViewportSize = () => {
6
6
  const [viewportHeight, setViewportHeight] = useState(typeof window === 'undefined' ? 0 : window.innerHeight);
7
7
  const [viewportWidth, setViewportWidth] = useState(typeof window === 'undefined' ? 0 : window.innerWidth);
8
8
 
@@ -15,5 +15,3 @@ const useViewportSize = () => {
15
15
 
16
16
  return { viewportHeight, viewportWidth };
17
17
  };
18
-
19
- export default useViewportSize;
package/src/i18n/i18n.ts CHANGED
@@ -11,7 +11,7 @@ import romanian from './languages/romanian.json';
11
11
  import spanish from './languages/spanish.json';
12
12
  import turkish from './languages/turkish.json';
13
13
 
14
- const i18n: Record<Locale, Translations> = {
14
+ export const i18n: Record<Locale, Translations> = {
15
15
  [Locale.DE_DE]: german,
16
16
  [Locale.EN_GB]: english,
17
17
  [Locale.EN_US]: english,
@@ -22,5 +22,3 @@ const i18n: Record<Locale, Translations> = {
22
22
  [Locale.RO_RO]: romanian,
23
23
  [Locale.TR_TR]: turkish,
24
24
  };
25
-
26
- export default i18n;
package/src/i18n/index.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export * from './constants';
2
- export { default } from './i18n';
2
+ export { i18n } from './i18n';
@@ -1,5 +1,3 @@
1
- const arrayEquals = <T>(array1: T[], array2: T[]): boolean => {
1
+ export const arrayEquals = <T>(array1: T[], array2: T[]): boolean => {
2
2
  return array1.length === array2.length && array1.every((value, index) => value === array2[index]);
3
3
  };
4
-
5
- export default arrayEquals;
@@ -1,3 +1 @@
1
- const createArray = <T>(length: number): T[] => Array.from({ length });
2
-
3
- export default createArray;
1
+ export const createArray = <T>(length: number): T[] => Array.from({ length });
@@ -1,9 +1,9 @@
1
1
  import { Comparator } from 'types';
2
2
 
3
- import createStringComparator from './createStringComparator';
4
- import numberComparator from './numberComparator';
3
+ import { createStringComparator } from './createStringComparator';
4
+ import { numberComparator } from './numberComparator';
5
5
 
6
- const createComparator = <T>(locale: string): Comparator<T> => {
6
+ export const createComparator = <T>(locale: string): Comparator<T> => {
7
7
  const stringComparator = createStringComparator(locale);
8
8
 
9
9
  return (a: T, b: T): number => {
@@ -18,5 +18,3 @@ const createComparator = <T>(locale: string): Comparator<T> => {
18
18
  return 0;
19
19
  };
20
20
  };
21
-
22
- export default createComparator;
@@ -1,11 +1,9 @@
1
- import createArray from './createArray';
1
+ import { createArray } from './createArray';
2
2
 
3
- const createGridOf = <T>(width: number, height: number, getInitialValue: (x: number, y: number) => T): T[][] => {
3
+ export const createGridOf = <T>(width: number, height: number, getInitialValue: (x: number, y: number) => T): T[][] => {
4
4
  return createArray(height).map((_row, y) => {
5
5
  return createArray(width).map((_cell, x) => {
6
6
  return getInitialValue(x, y);
7
7
  });
8
8
  });
9
9
  };
10
-
11
- export default createGridOf;
@@ -1,9 +1,12 @@
1
1
  import { Comparator } from 'types';
2
2
 
3
- import createStringComparator from './createStringComparator';
4
- import numberComparator from './numberComparator';
3
+ import { createStringComparator } from './createStringComparator';
4
+ import { numberComparator } from './numberComparator';
5
5
 
6
- const createKeyComparator = <T extends Record<keyof T, unknown>>(key: keyof T, locale: string): Comparator<T> => {
6
+ export const createKeyComparator = <T extends Record<keyof T, unknown>>(
7
+ key: keyof T,
8
+ locale: string,
9
+ ): Comparator<T> => {
7
10
  const stringComparator = createStringComparator(locale);
8
11
 
9
12
  return (a: T, b: T): number => {
@@ -21,5 +24,3 @@ const createKeyComparator = <T extends Record<keyof T, unknown>>(key: keyof T, l
21
24
  return 0;
22
25
  };
23
26
  };
24
-
25
- export default createKeyComparator;
@@ -1,6 +1,6 @@
1
1
  import { KeyboardEventHandler } from 'react';
2
2
 
3
- import noop from './noop';
3
+ import { noop } from './noop';
4
4
 
5
5
  interface Parameters {
6
6
  onArrowDown?: KeyboardEventHandler<HTMLInputElement>;
@@ -14,7 +14,7 @@ interface Parameters {
14
14
  onSpace?: KeyboardEventHandler<HTMLInputElement>;
15
15
  }
16
16
 
17
- const createKeyboardNavigation = ({
17
+ export const createKeyboardNavigation = ({
18
18
  onArrowDown = noop,
19
19
  onArrowLeft = noop,
20
20
  onArrowRight = noop,
@@ -44,5 +44,3 @@ const createKeyboardNavigation = ({
44
44
 
45
45
  return handleKeyDown;
46
46
  };
47
-
48
- export default createKeyboardNavigation;
@@ -1,4 +1,4 @@
1
- import createNullMovingComparator from './createNullMovingComparator';
1
+ import { createNullMovingComparator } from './createNullMovingComparator';
2
2
 
3
3
  describe('createNullMovingComparator', () => {
4
4
  it('Moves nulls left', () => {
@@ -1,4 +1,4 @@
1
- const createNullMovingComparator = <T>(direction: 'left' | 'right') => {
1
+ export const createNullMovingComparator = <T>(direction: 'left' | 'right') => {
2
2
  return (a: T | null, b: T | null): number => {
3
3
  if (a === b) {
4
4
  return 0;
@@ -15,5 +15,3 @@ const createNullMovingComparator = <T>(direction: 'left' | 'right') => {
15
15
  return 0;
16
16
  };
17
17
  };
18
-
19
- export default createNullMovingComparator;
@@ -1,4 +1,4 @@
1
- const createRegExp = (input: string): RegExp => {
1
+ export const createRegExp = (input: string): RegExp => {
2
2
  if (input.trim().length === 0) {
3
3
  return /.*/;
4
4
  }
@@ -9,5 +9,3 @@ const createRegExp = (input: string): RegExp => {
9
9
  return /.*/;
10
10
  }
11
11
  };
12
-
13
- export default createRegExp;
@@ -1,5 +1,7 @@
1
1
  import { Comparator } from 'types';
2
2
 
3
- const createStringComparator: (locale: string) => Comparator<string> = (locale) => (a, b) => a.localeCompare(b, locale);
4
-
5
- export default createStringComparator;
3
+ export const createStringComparator: (locale: string) => Comparator<string> = (locale) => {
4
+ return (a, b) => {
5
+ return a.localeCompare(b, locale);
6
+ };
7
+ };
@@ -1,6 +1,6 @@
1
1
  import { Locale } from '@scrabble-solver/types';
2
2
 
3
- const detectLocale = (): Locale => {
3
+ export const detectLocale = (): Locale => {
4
4
  const languages = window.navigator.languages;
5
5
 
6
6
  if (languages.includes('pl') || languages.includes('pl-PL')) {
@@ -25,5 +25,3 @@ const detectLocale = (): Locale => {
25
25
 
26
26
  return Locale.EN_US;
27
27
  };
28
-
29
- export default detectLocale;
@@ -2,11 +2,12 @@ import { getConfig } from '@scrabble-solver/configs';
2
2
  import { BLANK } from '@scrabble-solver/constants';
3
3
  import { Game, Locale } from '@scrabble-solver/types';
4
4
 
5
- import extractCharacters from './extractCharacters';
5
+ import { extractCharacters } from './extractCharacters';
6
6
 
7
7
  const tests = [
8
8
  { input: 'ab ', expected: ['a', 'b', BLANK] },
9
- { input: 'śćźa', expected: ['a'] },
9
+ { input: 'śćźa', expected: ['s', 'c', 'z', 'a'] },
10
+ { input: 'bañó', expected: ['b', 'a', 'ñ', 'o'] },
10
11
  { input: 'bueno', expected: ['b', 'u', 'e', 'n', 'o'] },
11
12
  { input: 'bellas', expected: ['b', 'e', 'll', 'a', 's'] },
12
13
  { input: 'BELLAS', expected: ['b', 'e', 'll', 'a', 's'] },
@@ -1,10 +1,24 @@
1
1
  import { BLANK } from '@scrabble-solver/constants';
2
- import { Config } from '@scrabble-solver/types';
2
+ import { Config, Locale } from '@scrabble-solver/types';
3
+ import { transliterate } from 'transliteration';
3
4
 
4
- const extractCharacters = (config: Config, value: string): string[] => {
5
+ const transliteratePerLocale: Record<Locale, (word: string) => string> = {
6
+ [Locale.DE_DE]: (word) => word,
7
+ [Locale.EN_GB]: (word) => word,
8
+ [Locale.EN_US]: (word) => word,
9
+ [Locale.ES_ES]: (word) => transliterate(word, { ignore: ['ñ'] }),
10
+ [Locale.FA_IR]: (word) => word,
11
+ [Locale.FR_FR]: (word) => transliterate(word),
12
+ [Locale.PL_PL]: (word) => word,
13
+ [Locale.RO_RO]: (word) => transliterate(word),
14
+ [Locale.TR_TR]: (word) => word,
15
+ };
16
+
17
+ export const extractCharacters = (config: Config, value: string): string[] => {
5
18
  let index = 0;
6
19
  const characters: string[] = [];
7
- const valueLowercase = value.toLocaleLowerCase(config.locale);
20
+ const localeTransliterate = transliteratePerLocale[config.locale];
21
+ const valueLowercase = localeTransliterate(value.toLocaleLowerCase(config.locale));
8
22
 
9
23
  while (index < valueLowercase.length) {
10
24
  const character = valueLowercase[index];
@@ -24,5 +38,3 @@ const extractCharacters = (config: Config, value: string): string[] => {
24
38
 
25
39
  return characters;
26
40
  };
27
-
28
- export default extractCharacters;
@@ -2,7 +2,7 @@ import { getConfig } from '@scrabble-solver/configs';
2
2
  import { BLANK } from '@scrabble-solver/constants';
3
3
  import { Game, Locale } from '@scrabble-solver/types';
4
4
 
5
- import extractCharactersByCase from './extractCharactersByCase';
5
+ import { extractCharactersByCase } from './extractCharactersByCase';
6
6
 
7
7
  const tests = [
8
8
  { input: 'ab ', expected: ['a', 'b', BLANK] },
@@ -1,9 +1,9 @@
1
1
  import { BLANK } from '@scrabble-solver/constants';
2
2
  import { Config } from '@scrabble-solver/types';
3
3
 
4
- import isUpperCase from './isUpperCase';
4
+ import { isUpperCase } from './isUpperCase';
5
5
 
6
- const extractCharactersByCase = (config: Config, value: string): string[] => {
6
+ export const extractCharactersByCase = (config: Config, value: string): string[] => {
7
7
  let index = 0;
8
8
  const characters: string[] = [];
9
9
 
@@ -27,5 +27,3 @@ const extractCharactersByCase = (config: Config, value: string): string[] => {
27
27
 
28
28
  return characters;
29
29
  };
30
-
31
- export default extractCharactersByCase;
@@ -1,4 +1,4 @@
1
- const extractInputValue = (input: HTMLInputElement) => {
1
+ export const extractInputValue = (input: HTMLInputElement) => {
2
2
  const value = input.value.toLocaleLowerCase();
3
3
 
4
4
  if (input.selectionStart === null || input.selectionEnd === null) {
@@ -13,5 +13,3 @@ const extractInputValue = (input: HTMLInputElement) => {
13
13
 
14
14
  return value;
15
15
  };
16
-
17
- export default extractInputValue;
@@ -1,7 +1,5 @@
1
1
  import { Cell } from '@scrabble-solver/types';
2
2
 
3
- const findCell = (cells: Cell[], x: number, y: number): Cell | undefined => {
3
+ export const findCell = (cells: Cell[], x: number, y: number): Cell | undefined => {
4
4
  return cells.find((cell) => cell.x === x && cell.y === y);
5
5
  };
6
-
7
- export default findCell;
@@ -2,11 +2,9 @@ import { Config } from '@scrabble-solver/types';
2
2
 
3
3
  import { BOARD_CELL_BORDER_WIDTH, BOARD_TILE_SIZE_MAX } from 'parameters';
4
4
 
5
- const getCellSize = (config: Config, width: number, height: number): number => {
6
- const maxWidth = (width - BOARD_CELL_BORDER_WIDTH) / config.boardSize - BOARD_CELL_BORDER_WIDTH;
7
- const maxHeight = (height - BOARD_CELL_BORDER_WIDTH) / config.boardSize - BOARD_CELL_BORDER_WIDTH;
5
+ export const getCellSize = (config: Config, width: number, height: number): number => {
6
+ const maxWidth = (width - BOARD_CELL_BORDER_WIDTH) / config.boardWidth - BOARD_CELL_BORDER_WIDTH;
7
+ const maxHeight = (height - BOARD_CELL_BORDER_WIDTH) / config.boardHeight - BOARD_CELL_BORDER_WIDTH;
8
8
  const cellSize = Math.min(maxWidth, maxHeight);
9
9
  return Math.floor(Math.min(cellSize, BOARD_TILE_SIZE_MAX));
10
10
  };
11
-
12
- export default getCellSize;
@@ -1,11 +1,9 @@
1
1
  const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
2
2
 
3
- const getCoordinate = (index: number, type: 'letter' | 'number'): string => {
3
+ export const getCoordinate = (index: number, type: 'letter' | 'number'): string => {
4
4
  if (type === 'number') {
5
5
  return String(index + 1);
6
6
  }
7
7
 
8
8
  return alphabet[index];
9
9
  };
10
-
11
- export default getCoordinate;
@@ -1,8 +1,8 @@
1
1
  import { Result, ShowCoordinates } from '@scrabble-solver/types';
2
2
 
3
- import getCoordinate from './getCoordinate';
3
+ import { getCoordinate } from './getCoordinate';
4
4
 
5
- const getCoordinates = (result: Result, showCoordinates: ShowCoordinates): string => {
5
+ export const getCoordinates = (result: Result, showCoordinates: ShowCoordinates): string => {
6
6
  if (showCoordinates === 'hidden') {
7
7
  return '';
8
8
  }
@@ -14,5 +14,3 @@ const getCoordinates = (result: Result, showCoordinates: ShowCoordinates): strin
14
14
 
15
15
  return isHorizontal ? `${y}${x}` : `${x}${y}`;
16
16
  };
17
-
18
- export default getCoordinates;
@@ -3,9 +3,14 @@ import { Board, Config } from '@scrabble-solver/types';
3
3
 
4
4
  import { RemainingTile } from 'types';
5
5
 
6
- import createKeyComparator from './createKeyComparator';
7
-
8
- const getRemainingTiles = (config: Config, board: Board, characters: string[], locale: string): RemainingTile[] => {
6
+ import { createKeyComparator } from './createKeyComparator';
7
+
8
+ export const getRemainingTiles = (
9
+ config: Config,
10
+ board: Board,
11
+ characters: string[],
12
+ locale: string,
13
+ ): RemainingTile[] => {
9
14
  const nonEmptyCells = board.rows.flat().filter((cell) => !cell.isEmpty);
10
15
  const letterCells = nonEmptyCells.filter((cell) => !cell.tile.isBlank);
11
16
  const remainingTiles = Object.fromEntries(config.tiles.map((tile) => [tile.character, { ...tile, usedCount: 0 }]));
@@ -40,5 +45,3 @@ const getRemainingTiles = (config: Config, board: Board, characters: string[], l
40
45
 
41
46
  return [...Object.values(remainingTiles).sort(comparator), blank];
42
47
  };
43
-
44
- export default getRemainingTiles;
@@ -1,7 +1,5 @@
1
1
  import { RemainingTile } from 'types';
2
2
 
3
- const getRemainingTilesCount = (remainingTiles: RemainingTile[]): number => {
3
+ export const getRemainingTilesCount = (remainingTiles: RemainingTile[]): number => {
4
4
  return remainingTiles.reduce((sum, { count, usedCount }) => sum + count - usedCount, 0);
5
5
  };
6
-
7
- export default getRemainingTilesCount;
@@ -2,10 +2,10 @@ import { BLANK, CONSONANTS, VOWELS } from '@scrabble-solver/constants';
2
2
 
3
3
  import { RemainingTile, RemainingTilesGroup } from 'types';
4
4
 
5
- import getRemainingTilesCount from './getRemainingTilesCount';
6
- import getTotalRemainingTilesCount from './getTotalRemainingTilesCount';
5
+ import { getRemainingTilesCount } from './getRemainingTilesCount';
6
+ import { getTotalRemainingTilesCount } from './getTotalRemainingTilesCount';
7
7
 
8
- const getRemainingTilesGroups = (remainingTiles: RemainingTile[]): RemainingTilesGroup[] => {
8
+ export const getRemainingTilesGroups = (remainingTiles: RemainingTile[]): RemainingTilesGroup[] => {
9
9
  const consonants = remainingTiles.filter(isConsonant);
10
10
  const vowels = remainingTiles.filter(isVowel);
11
11
  const other = remainingTiles.filter(isOther);
@@ -62,5 +62,3 @@ const isBlank = (tile: RemainingTile): boolean => tile.character === BLANK;
62
62
 
63
63
  const isOther = (tile: RemainingTile) =>
64
64
  !isConsonant(tile) && !isVowel(tile) && !isBlank(tile) && !isTwoCharacter(tile);
65
-
66
- export default getRemainingTilesGroups;