@scrabble-solver/scrabble-solver 2.15.10 → 2.15.12

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 (297) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +15 -15
  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 +7 -6
  19. package/.next/routes-manifest.json +1 -1
  20. package/.next/server/chunks/30.js +3 -3
  21. package/.next/server/chunks/318.js +1 -0
  22. package/.next/server/chunks/60.js +1 -1
  23. package/.next/server/chunks/812.js +1 -1
  24. package/.next/server/chunks/974.js +1 -1
  25. package/.next/server/middleware-build-manifest.js +1 -1
  26. package/.next/server/pages/404.html +1 -1
  27. package/.next/server/pages/404.js.nft.json +1 -1
  28. package/.next/server/pages/500.html +1 -1
  29. package/.next/server/pages/_app.js +1 -1
  30. package/.next/server/pages/_app.js.nft.json +1 -1
  31. package/.next/server/pages/_error.js +1 -1
  32. package/.next/server/pages/_error.js.nft.json +1 -1
  33. package/.next/server/pages/api/dictionary/[locale]/[word].js.nft.json +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.nft.json +1 -1
  38. package/.next/server/pages/index.html +1 -1
  39. package/.next/server/pages/index.js +1 -1
  40. package/.next/server/pages/index.js.nft.json +1 -1
  41. package/.next/server/pages/index.json +1 -1
  42. package/.next/server/pages-manifest.json +1 -1
  43. package/.next/static/{ylO_ttKeJTuoqDYywao5A → X6ny8arpUxpRCZ4OMm7Vo}/_buildManifest.js +1 -1
  44. package/.next/static/chunks/framework-57125a0cc6749ff9.js +1 -0
  45. package/.next/static/chunks/main-03618e8bd3cd04dd.js +1 -0
  46. package/.next/static/chunks/pages/{404-590e2a3839c1d9e0.js → 404-18b9f6f5faa91442.js} +1 -1
  47. package/.next/static/chunks/pages/_app-2378fe90e1762e8c.js +1 -0
  48. package/.next/static/chunks/pages/index-bfc599d9351773ae.js +1 -0
  49. package/.next/static/css/{6682db14f926d4c7.css → 04a3767982ec10e8.css} +1 -1
  50. package/.next/static/css/{d875648f38121a28.css → 1fae874a25934f54.css} +1 -1
  51. package/.next/trace +23 -23
  52. package/coverage/clover.xml +6 -0
  53. package/coverage/coverage-final.json +1 -0
  54. package/coverage/lcov-report/base.css +224 -0
  55. package/coverage/lcov-report/block-navigation.js +87 -0
  56. package/coverage/lcov-report/favicon.png +0 -0
  57. package/coverage/lcov-report/index.html +101 -0
  58. package/coverage/lcov-report/prettify.css +1 -0
  59. package/coverage/lcov-report/prettify.js +2 -0
  60. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  61. package/coverage/lcov-report/sorter.js +196 -0
  62. package/coverage/lcov.info +0 -0
  63. package/package.json +19 -18
  64. package/src/api/getServerLoggingData.ts +1 -1
  65. package/src/api/isBoardValid.ts +1 -1
  66. package/src/api/isCellValid.ts +1 -1
  67. package/src/api/isRowValid.ts +1 -1
  68. package/src/components/Alert/Alert.tsx +1 -1
  69. package/src/components/Badge/Badge.tsx +1 -1
  70. package/src/components/Board/Board.tsx +8 -8
  71. package/src/components/Board/BoardPure.tsx +12 -12
  72. package/src/components/Board/components/Actions/Actions.tsx +3 -3
  73. package/src/components/Board/components/Actions/lib.ts +3 -3
  74. package/src/components/Board/components/Cell/Cell.tsx +7 -7
  75. package/src/components/Board/components/InputPrompt/InputPrompt.tsx +2 -2
  76. package/src/components/Board/components/ToggleDirectionButton/ToggleDirectionButton.tsx +2 -2
  77. package/src/components/Board/hooks/useBackgroundImage.tsx +1 -1
  78. package/src/components/Board/hooks/useBoardStyle.ts +1 -1
  79. package/src/components/Board/hooks/useGrid.ts +13 -13
  80. package/src/components/Board/lib.ts +37 -0
  81. package/src/components/Board/selectors.ts +8 -0
  82. package/src/components/Button/Button.tsx +1 -1
  83. package/src/components/Button/Link.tsx +1 -1
  84. package/src/components/Dictionary/Dictionary.tsx +10 -3
  85. package/src/components/DictionaryInput/DictionaryInput.tsx +1 -1
  86. package/src/components/EmptyState/EmptyState.tsx +3 -3
  87. package/src/components/IconButton/IconButton.tsx +1 -1
  88. package/src/components/IconButton/Link.tsx +1 -1
  89. package/src/components/Key/Key.tsx +1 -1
  90. package/src/components/Keys/Arrows/Arrows.tsx +1 -1
  91. package/src/components/Keys/index.tsx +1 -1
  92. package/src/components/Loading/Loading.tsx +6 -8
  93. package/src/components/Logo/LogoBlueprint.tsx +1 -1
  94. package/src/components/Modal/Modal.tsx +4 -2
  95. package/src/components/Modal/components/Section/Section.tsx +1 -1
  96. package/src/components/NavButtons/NavButtons.tsx +16 -12
  97. package/src/components/NavButtons/selectors.ts +11 -0
  98. package/src/components/NotFound/NotFound.tsx +1 -1
  99. package/src/components/PlainTiles/PlainTiles.tsx +1 -1
  100. package/src/components/PlainTiles/Tile.tsx +1 -1
  101. package/src/components/PlainTiles/lib.ts +90 -0
  102. package/src/components/Progress/Progress.tsx +1 -1
  103. package/src/components/Rack/Rack.tsx +10 -26
  104. package/src/components/Rack/components/InputPrompt/InputPrompt.tsx +5 -8
  105. package/src/components/Rack/components/InputPrompt/lib.test.ts +27 -0
  106. package/src/components/Rack/components/InputPrompt/lib.ts +19 -0
  107. package/src/components/Rack/components/RackTile/RackTile.tsx +9 -9
  108. package/src/components/Rack/selectors.ts +9 -0
  109. package/src/components/Radio/Radio.tsx +1 -1
  110. package/src/components/Results/Cell.tsx +2 -2
  111. package/src/components/Results/Header.tsx +1 -1
  112. package/src/components/Results/HeaderButton.tsx +2 -2
  113. package/src/components/Results/Result.tsx +5 -6
  114. package/src/components/Results/Results.tsx +6 -6
  115. package/src/components/Results/SolveButton.tsx +3 -3
  116. package/src/components/Results/types.ts +2 -2
  117. package/src/components/ResultsInput/ResultsInput.tsx +1 -1
  118. package/src/components/SeoMessage/SeoMessage.tsx +5 -4
  119. package/src/components/Solver/Solver.tsx +4 -4
  120. package/src/components/Solver/components/InsertButton/InsertButton.tsx +1 -1
  121. package/src/components/Solver/components/ResultCandidatePicker/ResultCandidatePicker.tsx +5 -5
  122. package/src/components/Spinner/Spinner.tsx +1 -1
  123. package/src/components/Tile/Tile.tsx +7 -7
  124. package/src/components/Tile/TilePure.tsx +8 -8
  125. package/src/components/Tooltip/Tooltip.tsx +1 -1
  126. package/src/components/Tooltip/TooltipContent.tsx +1 -1
  127. package/src/components/Tooltip/TooltipTrigger.tsx +1 -1
  128. package/src/components/Tooltip/context.ts +1 -1
  129. package/src/components/Tooltip/useTooltip.ts +1 -1
  130. package/src/hooks/useAppLayout.ts +1 -1
  131. package/src/hooks/useColumns.ts +28 -1
  132. package/src/hooks/useEffectOnce.ts +1 -1
  133. package/src/hooks/useLocalStorage.ts +8 -0
  134. package/src/i18n/constants.ts +1 -1
  135. package/src/i18n/i18n.ts +1 -1
  136. package/src/i18n/languages/english.json +3 -0
  137. package/src/i18n/languages/french.json +3 -0
  138. package/src/i18n/languages/german.json +3 -0
  139. package/src/i18n/languages/persian.json +3 -0
  140. package/src/i18n/languages/polish.json +3 -0
  141. package/src/i18n/languages/romanian.json +3 -0
  142. package/src/i18n/languages/spanish.json +3 -0
  143. package/src/i18n/languages/turkish.json +3 -0
  144. package/src/lib/createComparator.ts +1 -1
  145. package/src/lib/createKeyComparator.ts +1 -1
  146. package/src/lib/createKeyboardNavigation.ts +1 -1
  147. package/src/lib/createStringComparator.ts +1 -1
  148. package/src/lib/extractCharacters.test.ts +42 -15
  149. package/src/lib/extractCharacters.ts +27 -25
  150. package/src/lib/findCell.ts +1 -1
  151. package/src/lib/getCoordinate.test.ts +22 -0
  152. package/src/lib/getCoordinate.ts +9 -1
  153. package/src/lib/index.ts +2 -17
  154. package/src/lib/isCtrl.ts +1 -1
  155. package/src/lib/localeTransliterate.test.ts +14 -0
  156. package/src/lib/localeTransliterate.ts +18 -0
  157. package/src/lib/numberComparator.ts +1 -1
  158. package/src/lib/reverseComparator.ts +1 -1
  159. package/src/lib/zipCharactersAndTiles.ts +2 -2
  160. package/src/modals/DictionaryModal/DictionaryModal.tsx +1 -1
  161. package/src/modals/KeyMapModal/KeyMapModal.tsx +1 -1
  162. package/src/modals/KeyMapModal/components/Mapping/Mapping.tsx +1 -1
  163. package/src/modals/MenuModal/MenuModal.tsx +1 -1
  164. package/src/modals/RemainingTilesModal/RemainingTilesModal.tsx +3 -2
  165. package/src/modals/RemainingTilesModal/components/Character/Character.tsx +7 -2
  166. package/src/{lib/getRemainingTilesGroups.ts → modals/RemainingTilesModal/lib.ts} +26 -9
  167. package/src/modals/RemainingTilesModal/selectors.ts +7 -0
  168. package/src/modals/ResultsModal/ResultsModal.tsx +4 -4
  169. package/src/modals/SettingsModal/SettingsModal.tsx +6 -1
  170. package/src/modals/SettingsModal/components/AutoGroupTilesSetting/AutoGroupTilesSetting.tsx +1 -1
  171. package/src/modals/SettingsModal/components/AutoGroupTilesSetting/lib.ts +1 -1
  172. package/src/modals/SettingsModal/components/ConfigSetting/ConfigSetting.tsx +1 -1
  173. package/src/modals/SettingsModal/components/ConfigSetting/lib.ts +1 -1
  174. package/src/modals/SettingsModal/components/InputModeSetting/InputModeSetting.tsx +1 -1
  175. package/src/modals/SettingsModal/components/InputModeSetting/lib.ts +1 -1
  176. package/src/modals/SettingsModal/components/LocaleSetting/LocaleSetting.tsx +2 -2
  177. package/src/modals/SettingsModal/components/RemoveCellFiltersSetting/RemoveCellFiltersSetting.module.scss +12 -0
  178. package/src/modals/SettingsModal/components/RemoveCellFiltersSetting/RemoveCellFiltersSetting.tsx +53 -0
  179. package/src/modals/SettingsModal/components/RemoveCellFiltersSetting/index.ts +1 -0
  180. package/src/modals/SettingsModal/components/RemoveCellFiltersSetting/lib.ts +13 -0
  181. package/src/modals/SettingsModal/components/ShowCoordinatesSetting/ShowCoordinatesSetting.tsx +2 -2
  182. package/src/modals/SettingsModal/components/index.ts +1 -0
  183. package/src/modals/WordsModal/WordsModal.tsx +4 -3
  184. package/src/pages/_app.tsx +4 -3
  185. package/src/pages/_document.tsx +1 -1
  186. package/src/pages/api/dictionary/[locale]/[word].ts +2 -2
  187. package/src/pages/api/dictionary/[locale]/index.ts +2 -2
  188. package/src/pages/api/solve.ts +11 -2
  189. package/src/pages/api/verify.ts +2 -2
  190. package/src/pages/api/visit.ts +1 -1
  191. package/src/pages/index.tsx +38 -44
  192. package/src/parameters/index.ts +1 -0
  193. package/src/sdk/findWordDefinitions.ts +1 -1
  194. package/src/sdk/getDictionary.ts +1 -1
  195. package/src/sdk/solve.ts +1 -1
  196. package/src/sdk/verify.ts +1 -1
  197. package/src/service-worker/dictionaries/getDictionary.ts +1 -1
  198. package/src/service-worker/dictionaries/getDictionaryUrl.ts +1 -1
  199. package/src/service-worker/dictionaries/revalidateDictionary.ts +1 -1
  200. package/src/service-worker/getTrie.ts +1 -1
  201. package/src/service-worker/routeSolveRequests.ts +2 -2
  202. package/src/service-worker/routeVerifyRequests.ts +1 -1
  203. package/src/state/board/index.ts +4 -0
  204. package/src/state/{slices/boardInitialState.ts → board/initialState.ts} +3 -6
  205. package/src/state/board/selectors.ts +3 -0
  206. package/src/state/{slices/boardSlice.ts → board/slice.ts} +5 -4
  207. package/src/state/board/types.ts +3 -0
  208. package/src/state/cellFilters/index.ts +4 -0
  209. package/src/state/cellFilters/initialState.ts +3 -0
  210. package/src/state/cellFilters/lib.ts +8 -0
  211. package/src/state/cellFilters/selectors.ts +13 -0
  212. package/src/state/{slices/cellFilterSlice.ts → cellFilters/slice.ts} +15 -14
  213. package/src/state/cellFilters/types.ts +3 -0
  214. package/src/state/dictionary/index.ts +4 -0
  215. package/src/state/dictionary/initialState.ts +8 -0
  216. package/src/state/dictionary/selectors.ts +16 -0
  217. package/src/state/{slices/dictionarySlice.ts → dictionary/slice.ts} +3 -3
  218. package/src/state/dictionary/types.ts +8 -0
  219. package/src/state/index.ts +12 -5
  220. package/src/{lib/getRemainingTiles.ts → state/lib.ts} +3 -4
  221. package/src/state/localStorage.ts +11 -2
  222. package/src/state/rack/index.ts +4 -0
  223. package/src/state/rack/initialState.ts +12 -0
  224. package/src/state/rack/selectors.ts +7 -0
  225. package/src/state/{slices/rackSlice.ts → rack/slice.ts} +4 -4
  226. package/src/state/rack/types.ts +3 -0
  227. package/src/state/results/index.ts +4 -0
  228. package/src/state/results/initialState.ts +13 -0
  229. package/src/state/results/lib.ts +96 -0
  230. package/src/state/results/selectors.ts +75 -0
  231. package/src/state/{slices/resultsSlice.ts → results/slice.ts} +4 -4
  232. package/src/state/results/types.ts +10 -0
  233. package/src/state/sagas.ts +22 -23
  234. package/src/state/selectors.ts +15 -235
  235. package/src/state/settings/index.ts +4 -0
  236. package/src/state/{slices/settingsInitialState.ts → settings/initialState.ts} +4 -11
  237. package/src/state/settings/lib.ts +42 -0
  238. package/src/state/settings/selectors.ts +69 -0
  239. package/src/state/{slices/settingsSlice.ts → settings/slice.ts} +9 -4
  240. package/src/state/settings/types.ts +12 -0
  241. package/src/state/solve/index.ts +4 -0
  242. package/src/state/solve/initialState.ts +12 -0
  243. package/src/state/solve/selectors.ts +14 -0
  244. package/src/state/{slices/solveSlice.ts → solve/slice.ts} +3 -3
  245. package/src/state/solve/types.ts +10 -0
  246. package/src/state/store.ts +9 -11
  247. package/src/state/types.ts +16 -18
  248. package/src/state/useTranslate.ts +2 -2
  249. package/src/state/useTypedSelector.ts +2 -2
  250. package/src/state/verify/index.ts +4 -0
  251. package/src/state/verify/initialState.ts +12 -0
  252. package/src/state/verify/selectors.ts +9 -0
  253. package/src/state/{slices/verifySlice.ts → verify/slice.ts} +3 -3
  254. package/src/state/verify/types.ts +10 -0
  255. package/src/styles/global.scss +5 -0
  256. package/src/types/api.ts +1 -1
  257. package/src/types/index.ts +9 -4
  258. package/tsconfig.tsbuildinfo +1 -0
  259. package/.eslintrc.js +0 -10
  260. package/.next/server/chunks/968.js +0 -1
  261. package/.next/static/chunks/framework-288d1abd95de88d9.js +0 -1
  262. package/.next/static/chunks/main-016492249b3393e2.js +0 -1
  263. package/.next/static/chunks/pages/_app-ac93a74c390f2ab8.js +0 -1
  264. package/.next/static/chunks/pages/index-e5f1caa581e6d3b8.js +0 -1
  265. package/src/components/Board/lib/getBonusColor.ts +0 -16
  266. package/src/components/Board/lib/getPositionInGrid.ts +0 -13
  267. package/src/components/Board/lib/index.ts +0 -2
  268. package/src/components/PlainTiles/lib/createPlainTile.ts +0 -41
  269. package/src/components/PlainTiles/lib/createPlainTiles.ts +0 -25
  270. package/src/components/PlainTiles/lib/getViewbox.ts +0 -17
  271. package/src/components/PlainTiles/lib/getX.ts +0 -5
  272. package/src/components/PlainTiles/lib/getY.ts +0 -5
  273. package/src/components/PlainTiles/lib/index.ts +0 -6
  274. package/src/components/PlainTiles/lib/randomize.ts +0 -1
  275. package/src/lib/createArray.ts +0 -1
  276. package/src/lib/createGridOf.ts +0 -9
  277. package/src/lib/detectLocale.ts +0 -27
  278. package/src/lib/extractCharactersByCase.test.ts +0 -29
  279. package/src/lib/extractCharactersByCase.ts +0 -29
  280. package/src/lib/getCellSize.ts +0 -10
  281. package/src/lib/getCoordinates.ts +0 -16
  282. package/src/lib/getRemainingTilesCount.ts +0 -5
  283. package/src/lib/getTotalRemainingTilesCount.ts +0 -5
  284. package/src/lib/groupResults.ts +0 -35
  285. package/src/lib/guessLocale.ts +0 -20
  286. package/src/lib/isUpperCase.ts +0 -5
  287. package/src/lib/resultMatchesCellFilter.ts +0 -21
  288. package/src/lib/sortGroupedResults.ts +0 -21
  289. package/src/lib/sortResults.ts +0 -41
  290. package/src/state/slices/cellFilterInitialState.ts +0 -5
  291. package/src/state/slices/dictionaryInitialState.ts +0 -15
  292. package/src/state/slices/index.ts +0 -16
  293. package/src/state/slices/rackInitialState.ts +0 -9
  294. package/src/state/slices/resultsInitialState.ts +0 -20
  295. package/src/state/slices/solveInitialState.ts +0 -21
  296. package/src/state/slices/verifyInitialState.ts +0 -19
  297. /package/.next/static/{ylO_ttKeJTuoqDYywao5A → X6ny8arpUxpRCZ4OMm7Vo}/_ssgManifest.js +0 -0
@@ -1,13 +1,14 @@
1
- import { FunctionComponent, memo } from 'react';
1
+ import { type FunctionComponent, memo } from 'react';
2
2
 
3
3
  import { Badge, Modal } from 'components';
4
4
  import { LOCALE_FEATURES } from 'i18n';
5
5
  import { getTileSizes } from 'lib';
6
6
  import { REMAINING_TILES_TILE_SIZE } from 'parameters';
7
- import { selectLocale, selectRemainingTilesGroups, useTranslate, useTypedSelector } from 'state';
7
+ import { selectLocale, useTranslate, useTypedSelector } from 'state';
8
8
 
9
9
  import { Character } from './components';
10
10
  import styles from './RemainingTilesModal.module.scss';
11
+ import { selectRemainingTilesGroups } from './selectors';
11
12
 
12
13
  interface Props {
13
14
  className?: string;
@@ -1,12 +1,12 @@
1
1
  import { BLANK } from '@scrabble-solver/constants';
2
2
  import classNames from 'classnames';
3
- import { FunctionComponent } from 'react';
3
+ import { type FunctionComponent } from 'react';
4
4
 
5
5
  import { Progress, Tile } from 'components';
6
6
  import { LOCALE_FEATURES } from 'i18n';
7
7
  import { REMAINING_TILES_TILE_SIZE } from 'parameters';
8
8
  import { selectCharacterPoints, selectLocale, useTypedSelector } from 'state';
9
- import { RemainingTile } from 'types';
9
+ import { type RemainingTile } from 'types';
10
10
 
11
11
  import styles from './Character.module.scss';
12
12
 
@@ -18,6 +18,11 @@ export const Character: FunctionComponent<Props> = ({ tile }) => {
18
18
  const locale = useTypedSelector(selectLocale);
19
19
  const { direction } = LOCALE_FEATURES[locale];
20
20
  const { character, count, usedCount } = tile;
21
+
22
+ if (typeof count === 'undefined') {
23
+ throw new Error('Remaining tiles not supported for this config');
24
+ }
25
+
21
26
  const remainingCount = count - usedCount;
22
27
  const points = useTypedSelector((state) => selectCharacterPoints(state, character));
23
28
  const current = direction === 'ltr' ? remainingCount : count;
@@ -1,9 +1,6 @@
1
1
  import { BLANK, CONSONANTS, VOWELS } from '@scrabble-solver/constants';
2
2
 
3
- import { RemainingTile, RemainingTilesGroup } from 'types';
4
-
5
- import { getRemainingTilesCount } from './getRemainingTilesCount';
6
- import { getTotalRemainingTilesCount } from './getTotalRemainingTilesCount';
3
+ import { type RemainingTile, type RemainingTilesGroup } from 'types';
7
4
 
8
5
  export const getRemainingTilesGroups = (remainingTiles: RemainingTile[]): RemainingTilesGroup[] => {
9
6
  const consonants = remainingTiles.filter(isConsonant);
@@ -15,21 +12,21 @@ export const getRemainingTilesGroups = (remainingTiles: RemainingTile[]): Remain
15
12
  remainingCount: getRemainingTilesCount(vowels),
16
13
  tiles: vowels,
17
14
  translationKey: 'common.vowels',
18
- totalCount: getTotalRemainingTilesCount(vowels),
15
+ totalCount: getTotalTilesCount(vowels),
19
16
  });
20
17
 
21
18
  groups.push({
22
19
  remainingCount: getRemainingTilesCount(consonants),
23
20
  tiles: consonants,
24
21
  translationKey: 'common.consonants',
25
- totalCount: getTotalRemainingTilesCount(consonants),
22
+ totalCount: getTotalTilesCount(consonants),
26
23
  });
27
24
 
28
25
  groups.push({
29
26
  remainingCount: getRemainingTilesCount(other),
30
27
  tiles: other,
31
28
  translationKey: 'common.tiles',
32
- totalCount: getTotalRemainingTilesCount(other),
29
+ totalCount: getTotalTilesCount(other),
33
30
  });
34
31
 
35
32
  const twoCharacterTiles = remainingTiles.filter(isTwoCharacter);
@@ -39,14 +36,14 @@ export const getRemainingTilesGroups = (remainingTiles: RemainingTile[]): Remain
39
36
  remainingCount: getRemainingTilesCount(twoCharacterTiles),
40
37
  tiles: twoCharacterTiles,
41
38
  translationKey: 'common.two-letter-tiles',
42
- totalCount: getTotalRemainingTilesCount(twoCharacterTiles),
39
+ totalCount: getTotalTilesCount(twoCharacterTiles),
43
40
  });
44
41
 
45
42
  groups.push({
46
43
  remainingCount: getRemainingTilesCount(blanks),
47
44
  tiles: blanks,
48
45
  translationKey: 'common.blanks',
49
- totalCount: getTotalRemainingTilesCount(blanks),
46
+ totalCount: getTotalTilesCount(blanks),
50
47
  });
51
48
 
52
49
  return groups.filter(({ totalCount }) => totalCount > 0);
@@ -62,3 +59,23 @@ const isBlank = (tile: RemainingTile): boolean => tile.character === BLANK;
62
59
 
63
60
  const isOther = (tile: RemainingTile) =>
64
61
  !isConsonant(tile) && !isVowel(tile) && !isBlank(tile) && !isTwoCharacter(tile);
62
+
63
+ const getRemainingTilesCount = (remainingTiles: RemainingTile[]): number => {
64
+ return remainingTiles.reduce((sum, { count, usedCount }) => {
65
+ if (typeof count === 'undefined') {
66
+ return sum;
67
+ }
68
+
69
+ return sum + count - usedCount;
70
+ }, 0);
71
+ };
72
+
73
+ const getTotalTilesCount = (remainingTiles: RemainingTile[]): number => {
74
+ return remainingTiles.reduce((sum, { count }) => {
75
+ if (typeof count === 'undefined') {
76
+ return sum;
77
+ }
78
+
79
+ return sum + count;
80
+ }, 0);
81
+ };
@@ -0,0 +1,7 @@
1
+ import { createSelector } from '@reduxjs/toolkit';
2
+
3
+ import { selectRemainingTiles } from 'state';
4
+
5
+ import { getRemainingTilesGroups } from './lib';
6
+
7
+ export const selectRemainingTilesGroups = createSelector([selectRemainingTiles], getRemainingTilesGroups);
@@ -1,11 +1,11 @@
1
- import { Result } from '@scrabble-solver/types';
2
- import { FunctionComponent, memo, useEffect, useMemo } from 'react';
1
+ import { type Result } from '@scrabble-solver/types';
2
+ import { type FunctionComponent, memo, useEffect, useMemo } from 'react';
3
3
  import { useDispatch } from 'react-redux';
4
4
 
5
5
  import { Button, Dictionary, Modal, Results } from 'components';
6
6
  import { useAppLayout } from 'hooks';
7
7
  import { Check, EyeFill } from 'icons';
8
- import { resultsSlice, selectResultCandidate, selectResults, useTranslate, useTypedSelector } from 'state';
8
+ import { resultsSlice, selectProcessedResults, selectResultCandidate, useTranslate, useTypedSelector } from 'state';
9
9
 
10
10
  import styles from './ResultsModal.module.scss';
11
11
 
@@ -19,7 +19,7 @@ const ResultsModalBase: FunctionComponent<Props> = ({ className, isOpen, onClose
19
19
  const dispatch = useDispatch();
20
20
  const translate = useTranslate();
21
21
  const { showResultsInModal } = useAppLayout();
22
- const results = useTypedSelector(selectResults);
22
+ const results = useTypedSelector(selectProcessedResults);
23
23
  const resultCandidate = useTypedSelector(selectResultCandidate);
24
24
  const index = results ? results.findIndex((result) => result.id === resultCandidate?.id) : -1;
25
25
  const highlightedIndex = index === -1 ? undefined : index;
@@ -1,4 +1,4 @@
1
- import { FunctionComponent, memo } from 'react';
1
+ import { type FunctionComponent, memo } from 'react';
2
2
 
3
3
  import { Modal } from 'components';
4
4
  import { useIsTouchDevice } from 'hooks';
@@ -10,6 +10,7 @@ import {
10
10
  InputModeSetting,
11
11
  LocaleSetting,
12
12
  ShowCoordinatesSetting,
13
+ RemoveCellFiltersSetting,
13
14
  } from './components';
14
15
 
15
16
  interface Props {
@@ -45,6 +46,10 @@ const SettingsModalBase: FunctionComponent<Props> = ({ className, isOpen, onClos
45
46
  <Modal.Section label={translate('settings.autoGroupTiles')} title={translate('settings.autoGroupTiles')}>
46
47
  <AutoGroupTilesSetting disabled={!isOpen} />
47
48
  </Modal.Section>
49
+
50
+ <Modal.Section label={translate('settings.removeCellFilters')} title={translate('settings.removeCellFilters')}>
51
+ <RemoveCellFiltersSetting disabled={!isOpen} />
52
+ </Modal.Section>
48
53
  </Modal>
49
54
  );
50
55
  };
@@ -1,4 +1,4 @@
1
- import { ChangeEvent, FunctionComponent } from 'react';
1
+ import { type ChangeEvent, type FunctionComponent } from 'react';
2
2
  import { useDispatch } from 'react-redux';
3
3
 
4
4
  import { Radio } from 'components';
@@ -1,4 +1,4 @@
1
- import { AutoGroupTiles } from 'types';
1
+ import { type AutoGroupTiles } from 'types';
2
2
 
3
3
  import { NULL_VALUE } from './constants';
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { isGame } from '@scrabble-solver/types';
2
- import { ChangeEvent, FunctionComponent, useMemo } from 'react';
2
+ import { type ChangeEvent, type FunctionComponent, useMemo } from 'react';
3
3
  import { useDispatch } from 'react-redux';
4
4
 
5
5
  import { Radio } from 'components';
@@ -1,5 +1,5 @@
1
1
  import { games, hasConfig, languages } from '@scrabble-solver/configs';
2
- import { Locale } from '@scrabble-solver/types';
2
+ import { type Locale } from '@scrabble-solver/types';
3
3
 
4
4
  export const getOptions = (locale: Locale) => {
5
5
  const gameConfigs = Object.values(games);
@@ -1,4 +1,4 @@
1
- import { ChangeEvent, FunctionComponent } from 'react';
1
+ import { type ChangeEvent, type FunctionComponent } from 'react';
2
2
  import { useDispatch } from 'react-redux';
3
3
 
4
4
  import { Radio } from 'components';
@@ -1,4 +1,4 @@
1
- import { InputMode } from 'types';
1
+ import { type InputMode } from 'types';
2
2
 
3
3
  export const parseValue = (value: string): InputMode => {
4
4
  if (value === 'keyboard') {
@@ -1,6 +1,6 @@
1
- import { Locale } from '@scrabble-solver/types';
1
+ import { type Locale } from '@scrabble-solver/types';
2
2
  import classNames from 'classnames';
3
- import { ChangeEvent, FunctionComponent } from 'react';
3
+ import { type ChangeEvent, type FunctionComponent } from 'react';
4
4
  import { useDispatch } from 'react-redux';
5
5
 
6
6
  import { Radio } from 'components';
@@ -0,0 +1,12 @@
1
+ .option {
2
+ margin-bottom: var(--spacing--m);
3
+
4
+ &:last-child {
5
+ margin-bottom: 0;
6
+ }
7
+ }
8
+
9
+ .label {
10
+ display: flex;
11
+ align-items: center;
12
+ }
@@ -0,0 +1,53 @@
1
+ import { type ChangeEvent, type FunctionComponent } from 'react';
2
+ import { useDispatch } from 'react-redux';
3
+
4
+ import { Radio } from 'components';
5
+ import { selectRemoveCellFilters, settingsSlice, useTranslate, useTypedSelector } from 'state';
6
+
7
+ import { parseValue } from './lib';
8
+ import styles from './RemoveCellFiltersSetting.module.scss';
9
+
10
+ interface Props {
11
+ className?: string;
12
+ disabled?: boolean;
13
+ }
14
+
15
+ export const RemoveCellFiltersSetting: FunctionComponent<Props> = ({ className, disabled }) => {
16
+ const dispatch = useDispatch();
17
+ const translate = useTranslate();
18
+ const value = useTypedSelector(selectRemoveCellFilters);
19
+
20
+ const options = [
21
+ {
22
+ label: translate('settings.removeCellFilters.always'),
23
+ value: 'always',
24
+ },
25
+ {
26
+ label: translate('settings.removeCellFilters.never'),
27
+ value: 'never',
28
+ },
29
+ ];
30
+
31
+ const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
32
+ const removeTileFilter = parseValue(event.target.value);
33
+ dispatch(settingsSlice.actions.changeRemoveCellFilters(removeTileFilter));
34
+ };
35
+
36
+ return (
37
+ <div className={className}>
38
+ {options.map((option) => (
39
+ <Radio
40
+ checked={value === option.value}
41
+ className={styles.option}
42
+ disabled={disabled}
43
+ key={option.value}
44
+ name="removeCellFilters"
45
+ value={option.value}
46
+ onChange={handleChange}
47
+ >
48
+ <div className={styles.label}>{option.label}</div>
49
+ </Radio>
50
+ ))}
51
+ </div>
52
+ );
53
+ };
@@ -0,0 +1 @@
1
+ export { RemoveCellFiltersSetting } from './RemoveCellFiltersSetting';
@@ -0,0 +1,13 @@
1
+ import { type RemoveCellFilters } from 'types';
2
+
3
+ export const parseValue = (value: string): RemoveCellFilters => {
4
+ if (value === 'always') {
5
+ return 'always';
6
+ }
7
+
8
+ if (value === 'never') {
9
+ return 'never';
10
+ }
11
+
12
+ throw new Error(`"${value}" is not valid. Should be "always" or "never"`);
13
+ };
@@ -1,5 +1,5 @@
1
- import { ShowCoordinates } from '@scrabble-solver/types';
2
- import { ChangeEvent, FunctionComponent } from 'react';
1
+ import { type ShowCoordinates } from '@scrabble-solver/types';
2
+ import { type ChangeEvent, type FunctionComponent } from 'react';
3
3
  import { useDispatch } from 'react-redux';
4
4
 
5
5
  import { Radio } from 'components';
@@ -3,3 +3,4 @@ export { ConfigSetting } from './ConfigSetting';
3
3
  export { InputModeSetting } from './InputModeSetting';
4
4
  export { LocaleSetting } from './LocaleSetting';
5
5
  export { ShowCoordinatesSetting } from './ShowCoordinatesSetting';
6
+ export { RemoveCellFiltersSetting } from './RemoveCellFiltersSetting';
@@ -1,9 +1,9 @@
1
1
  import classNames from 'classnames';
2
- import { FunctionComponent, memo } from 'react';
2
+ import { type FunctionComponent, memo } from 'react';
3
3
 
4
4
  import { Badge, Modal } from 'components';
5
5
  import { Check, Cross } from 'icons';
6
- import { selectLocale, selectVerify, useTranslate, useTypedSelector } from 'state';
6
+ import { selectInvalidWords, selectLocale, selectValidWords, useTranslate, useTypedSelector } from 'state';
7
7
 
8
8
  import styles from './WordsModal.module.scss';
9
9
 
@@ -16,7 +16,8 @@ interface Props {
16
16
  const WordsModalBase: FunctionComponent<Props> = ({ className, isOpen, onClose }) => {
17
17
  const translate = useTranslate();
18
18
  const locale = useTypedSelector(selectLocale);
19
- const { invalidWords, validWords } = useTypedSelector(selectVerify);
19
+ const invalidWords = useTypedSelector(selectInvalidWords);
20
+ const validWords = useTypedSelector(selectValidWords);
20
21
 
21
22
  return (
22
23
  <Modal className={className} isOpen={isOpen} title={translate('words')} onClose={onClose}>
@@ -1,7 +1,7 @@
1
1
  import { FloatingDelayGroup } from '@floating-ui/react';
2
- import { AppProps } from 'next/app';
2
+ import { type AppProps } from 'next/app';
3
3
  import Head from 'next/head';
4
- import { FunctionComponent } from 'react';
4
+ import { type FunctionComponent } from 'react';
5
5
  import { Provider } from 'react-redux';
6
6
 
7
7
  import { SeoMessage } from 'components';
@@ -11,7 +11,7 @@ import 'styles/global.scss';
11
11
 
12
12
  const DESCRIPTION =
13
13
  // eslint-disable-next-line max-len
14
- 'Scrabble Solver 2 - Free and open-source analysis tool for Scrabble, Scrabble Duel, Super Scrabble & Literaki. Quickly find top scoring words using given letters and board state. Available in English, French, German, Persian, Polish, Romanian, Spanish, and Turkish.';
14
+ 'Scrabble Solver 2 - Free and open-source analysis tool for Scrabble, Scrabble Duel, Super Scrabble, Letter League & Literaki. Quickly find top scoring words using given letters and board state. Available in English, French, German, Persian, Polish, Romanian, Spanish, and Turkish.';
15
15
 
16
16
  const KEYWORDS = [
17
17
  'Scrabble Solver',
@@ -20,6 +20,7 @@ const KEYWORDS = [
20
20
  'Solver',
21
21
  'Super Scrabble',
22
22
  'Kelimelik',
23
+ 'Letter League',
23
24
  'Literaki',
24
25
  'Board',
25
26
  'Open-source',
@@ -1,5 +1,5 @@
1
1
  import Document, { Head, Html, Main, NextScript } from 'next/document';
2
- import { ReactElement } from 'react';
2
+ import { type ReactElement } from 'react';
3
3
 
4
4
  class MyDocument extends Document {
5
5
  render(): ReactElement {
@@ -2,9 +2,9 @@ import { games } from '@scrabble-solver/configs';
2
2
  import { COMMA_ARABIC, COMMA_LATIN } from '@scrabble-solver/constants';
3
3
  import { dictionaries } from '@scrabble-solver/dictionaries';
4
4
  import { logger } from '@scrabble-solver/logger';
5
- import { Locale, isLocale } from '@scrabble-solver/types';
5
+ import { type Locale, isLocale } from '@scrabble-solver/types';
6
6
  import { getWordDefinition } from '@scrabble-solver/word-definitions';
7
- import { NextApiRequest, NextApiResponse } from 'next';
7
+ import { type NextApiRequest, type NextApiResponse } from 'next';
8
8
 
9
9
  import { getServerLoggingData } from 'api';
10
10
 
@@ -1,7 +1,7 @@
1
1
  import { dictionaries } from '@scrabble-solver/dictionaries';
2
2
  import { logger } from '@scrabble-solver/logger';
3
- import { isLocale, Locale } from '@scrabble-solver/types';
4
- import { NextApiRequest, NextApiResponse } from 'next';
3
+ import { isLocale, type Locale } from '@scrabble-solver/types';
4
+ import { type NextApiRequest, type NextApiResponse } from 'next';
5
5
 
6
6
  import { getServerLoggingData } from 'api';
7
7
 
@@ -3,8 +3,17 @@ import { BLANK } from '@scrabble-solver/constants';
3
3
  import { dictionaries } from '@scrabble-solver/dictionaries';
4
4
  import { logger } from '@scrabble-solver/logger';
5
5
  import { solve as solveScrabble } from '@scrabble-solver/solver';
6
- import { Board, Config, Game, Locale, Tile, isBoardJson, isGame, isLocale } from '@scrabble-solver/types';
7
- import { NextApiRequest, NextApiResponse } from 'next';
6
+ import {
7
+ Board,
8
+ type Config,
9
+ type Game,
10
+ type Locale,
11
+ Tile,
12
+ isBoardJson,
13
+ isGame,
14
+ isLocale,
15
+ } from '@scrabble-solver/types';
16
+ import { type NextApiRequest, type NextApiResponse } from 'next';
8
17
 
9
18
  import { getServerLoggingData, isBoardValid, isCharacterValid } from 'api';
10
19
  import { isStringArray } from 'lib';
@@ -1,8 +1,8 @@
1
1
  import { getConfig, hasConfig } from '@scrabble-solver/configs';
2
2
  import { dictionaries } from '@scrabble-solver/dictionaries';
3
3
  import { logger } from '@scrabble-solver/logger';
4
- import { Board, Config, Game, Locale, isBoardJson, isGame, isLocale } from '@scrabble-solver/types';
5
- import { NextApiRequest, NextApiResponse } from 'next';
4
+ import { Board, type Config, type Game, type Locale, isBoardJson, isGame, isLocale } from '@scrabble-solver/types';
5
+ import { type NextApiRequest, type NextApiResponse } from 'next';
6
6
 
7
7
  import { getServerLoggingData, isBoardValid } from 'api';
8
8
 
@@ -1,5 +1,5 @@
1
1
  import { logger } from '@scrabble-solver/logger';
2
- import { NextApiRequest, NextApiResponse } from 'next';
2
+ import { type NextApiRequest, type NextApiResponse } from 'next';
3
3
 
4
4
  import { getServerLoggingData } from 'api';
5
5
 
@@ -1,7 +1,7 @@
1
1
  import { isObject } from '@scrabble-solver/types';
2
2
  import fs from 'fs';
3
3
  import path from 'path';
4
- import { FunctionComponent, useCallback, useState } from 'react';
4
+ import { type FunctionComponent, useState } from 'react';
5
5
  import ReactModal from 'react-modal';
6
6
  import { useDispatch } from 'react-redux';
7
7
 
@@ -18,7 +18,7 @@ import {
18
18
  WordsModal,
19
19
  } from 'modals';
20
20
  import { registerServiceWorker } from 'serviceWorkerManager';
21
- import { initialize, reset, selectLocale, useTypedSelector } from 'state';
21
+ import { initialize, reset, selectConfig, selectLocale, useTypedSelector } from 'state';
22
22
 
23
23
  import styles from './index.module.scss';
24
24
 
@@ -28,34 +28,26 @@ interface Props {
28
28
  version: string;
29
29
  }
30
30
 
31
- // eslint-disable-next-line max-statements
31
+ type Modal = 'dictionary' | 'keyMap' | 'menu' | 'remainingTiles' | 'results' | 'settings' | 'words';
32
+
32
33
  const Index: FunctionComponent<Props> = ({ version }) => {
33
34
  const dispatch = useDispatch();
35
+ const config = useTypedSelector(selectConfig);
34
36
  const locale = useTypedSelector(selectLocale);
35
- const [showDictionary, setShowDictionary] = useState(false);
36
- const [showKeyMap, setShowKeyMap] = useState(false);
37
- const [showMenu, setShowMenu] = useState(false);
38
- const [showRemainingTiles, setShowRemainingTiles] = useState(false);
39
- const [showResults, setShowResults] = useState(false);
40
- const [showSettings, setShowSettings] = useState(false);
41
- const [showWords, setShowWords] = useState(false);
42
37
  const [isClient, setIsClient] = useState(false);
38
+ const [modals, setModals] = useState<Record<Modal, boolean>>({
39
+ dictionary: false,
40
+ keyMap: false,
41
+ menu: false,
42
+ remainingTiles: false,
43
+ results: false,
44
+ settings: false,
45
+ words: false,
46
+ });
43
47
 
44
- const handleShowResults = useCallback(() => setShowResults(true), []);
45
- const handleClear = useCallback(() => dispatch(reset()), [dispatch]);
46
- const handleHideDictionary = useCallback(() => setShowDictionary(false), []);
47
- const handleHideKeyMap = useCallback(() => setShowKeyMap(false), []);
48
- const handleHideMenu = useCallback(() => setShowMenu(false), []);
49
- const handleHideRemainingTiles = useCallback(() => setShowRemainingTiles(false), []);
50
- const handleHideResults = useCallback(() => setShowResults(false), []);
51
- const handleHideSettings = useCallback(() => setShowSettings(false), []);
52
- const handleHideWords = useCallback(() => setShowWords(false), []);
53
- const handleShowDictionary = useCallback(() => setShowDictionary(true), []);
54
- const handleShowKeyMap = useCallback(() => setShowKeyMap(true), []);
55
- const handleShowMenu = useCallback(() => setShowMenu(true), []);
56
- const handleShowRemainingTiles = useCallback(() => setShowRemainingTiles(true), []);
57
- const handleShowSettings = useCallback(() => setShowSettings(true), []);
58
- const handleShowWords = useCallback(() => setShowWords(true), []);
48
+ const patchModals = (patch: Partial<Record<Modal, boolean>>) => {
49
+ setModals((current) => ({ ...current, ...patch }));
50
+ };
59
51
 
60
52
  useDirection(LOCALE_FEATURES[locale].direction);
61
53
  useLanguage(locale);
@@ -86,38 +78,40 @@ const Index: FunctionComponent<Props> = ({ version }) => {
86
78
  </div>
87
79
 
88
80
  <NavButtons
89
- onClear={handleClear}
90
- onShowKeyMap={handleShowKeyMap}
91
- onShowMenu={handleShowMenu}
92
- onShowRemainingTiles={handleShowRemainingTiles}
93
- onShowSettings={handleShowSettings}
94
- onShowWords={handleShowWords}
81
+ onClear={() => dispatch(reset())}
82
+ onShowKeyMap={() => patchModals({ keyMap: true })}
83
+ onShowMenu={() => patchModals({ menu: true })}
84
+ onShowRemainingTiles={() => patchModals({ remainingTiles: true })}
85
+ onShowSettings={() => patchModals({ settings: true })}
86
+ onShowWords={() => patchModals({ words: true })}
95
87
  />
96
88
  </div>
97
89
  </nav>
98
90
 
99
- <Solver className={styles.solver} onShowResults={handleShowResults} />
91
+ <Solver className={styles.solver} onShowResults={() => patchModals({ results: true })} />
100
92
 
101
93
  <MenuModal
102
- isOpen={showMenu}
103
- onClose={handleHideMenu}
104
- onShowDictionary={handleShowDictionary}
105
- onShowRemainingTiles={handleShowRemainingTiles}
106
- onShowSettings={handleShowSettings}
107
- onShowWords={handleShowWords}
94
+ isOpen={modals.menu}
95
+ onClose={() => patchModals({ menu: false })}
96
+ onShowDictionary={() => patchModals({ dictionary: true })}
97
+ onShowRemainingTiles={() => patchModals({ remainingTiles: true })}
98
+ onShowSettings={() => patchModals({ settings: true })}
99
+ onShowWords={() => patchModals({ words: true })}
108
100
  />
109
101
 
110
- <SettingsModal isOpen={showSettings} onClose={handleHideSettings} />
102
+ <SettingsModal isOpen={modals.settings} onClose={() => patchModals({ settings: false })} />
111
103
 
112
- <KeyMapModal isOpen={showKeyMap} onClose={handleHideKeyMap} />
104
+ <KeyMapModal isOpen={modals.keyMap} onClose={() => patchModals({ keyMap: false })} />
113
105
 
114
- <WordsModal isOpen={showWords} onClose={handleHideWords} />
106
+ <WordsModal isOpen={modals.words} onClose={() => patchModals({ words: false })} />
115
107
 
116
- <RemainingTilesModal isOpen={showRemainingTiles} onClose={handleHideRemainingTiles} />
108
+ {config.supportsRemainingTiles && (
109
+ <RemainingTilesModal isOpen={modals.remainingTiles} onClose={() => patchModals({ remainingTiles: false })} />
110
+ )}
117
111
 
118
- <ResultsModal isOpen={showResults} onClose={handleHideResults} />
112
+ <ResultsModal isOpen={modals.results} onClose={() => patchModals({ results: false })} />
119
113
 
120
- <DictionaryModal isOpen={showDictionary} onClose={handleHideDictionary} />
114
+ <DictionaryModal isOpen={modals.dictionary} onClose={() => patchModals({ dictionary: false })} />
121
115
  </>
122
116
  );
123
117
  };
@@ -91,6 +91,7 @@ export const MODAL_HEADER_HEIGHT = 45;
91
91
  export const NAV_PADDING = SPACING_L;
92
92
 
93
93
  export const TILE_SIZE = 80;
94
+
94
95
  export const TOOLTIP_DURATION = TRANSITION_DURATION;
95
96
 
96
97
  export const PLAIN_TILES_COLOR_DEFAULT = COLOR_GREEN;
@@ -1,4 +1,4 @@
1
- import { Locale, WordDefinition, WordDefinitionJson } from '@scrabble-solver/types';
1
+ import { type Locale, WordDefinition, type WordDefinitionJson } from '@scrabble-solver/types';
2
2
 
3
3
  import { fetchJson } from './fetchJson';
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { Trie } from '@kamilmielnik/trie';
2
- import { Locale } from '@scrabble-solver/types';
2
+ import { type Locale } from '@scrabble-solver/types';
3
3
 
4
4
  import { fetchJson } from './fetchJson';
5
5
 
package/src/sdk/solve.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { BoardJson, Locale, Result, ResultJson } from '@scrabble-solver/types';
1
+ import { type BoardJson, type Locale, Result, type ResultJson } from '@scrabble-solver/types';
2
2
 
3
3
  import { fetchJson } from './fetchJson';
4
4
 
package/src/sdk/verify.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { BoardJson, Locale } from '@scrabble-solver/types';
1
+ import { type BoardJson, type Locale } from '@scrabble-solver/types';
2
2
 
3
3
  import { fetchJson } from './fetchJson';
4
4
 
@@ -1,4 +1,4 @@
1
- import { Locale } from '@scrabble-solver/types';
1
+ import { type Locale } from '@scrabble-solver/types';
2
2
 
3
3
  import { DICTIONARY_CACHE } from './constants';
4
4
  import { expirationManager } from './expirationManager';
@@ -1,4 +1,4 @@
1
- import { Locale } from '@scrabble-solver/types';
1
+ import { type Locale } from '@scrabble-solver/types';
2
2
 
3
3
  export const getDictionaryUrl = (locale: Locale): string => {
4
4
  return `/api/dictionary/${locale}`;