@scrabble-solver/scrabble-solver 2.15.23 → 2.15.25
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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +8 -8
- package/.next/cache/.previewinfo +1 -1
- package/.next/cache/.rscinfo +1 -1
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack.old +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack.old +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack.old +0 -0
- package/.next/diagnostics/framework.json +1 -1
- package/.next/prerender-manifest.json +4 -4
- package/.next/routes-manifest.json +1 -1
- package/.next/server/chunks/30.js +1 -1
- package/.next/server/chunks/712.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages/index.html +1 -1
- package/.next/server/pages/index.js +1 -1
- package/.next/server/pages/index.json +1 -1
- package/.next/server/pages/not-found.html +1 -1
- package/.next/static/{zFnoNsMXUha-MKjuZn6AN → FDUqldlsD7FXe6iWhIJmu}/_buildManifest.js +1 -1
- package/.next/static/chunks/{main-ca07941c8a544c9a.js → main-65a5015b46ca9827.js} +1 -1
- package/.next/static/chunks/pages/{_app-a3061a79f91b3796.js → _app-c0932b8ca24945cb.js} +5 -5
- package/.next/static/chunks/pages/{index-6c5b582e7afc063c.js → index-08b3b0a754095919.js} +1 -1
- package/.next/trace +21 -21
- package/.next/trace-build +1 -1
- package/package.json +11 -11
- package/src/app-layout/useAppLayoutValue.ts +4 -4
- package/src/components/Alert/Alert.tsx +1 -1
- package/src/components/Board/Board.tsx +4 -4
- package/src/components/Board/BoardPure.tsx +4 -4
- package/src/components/Board/components/Actions/Actions.tsx +5 -5
- package/src/components/Board/components/Actions/lib.ts +2 -2
- package/src/components/Board/components/Cell/Cell.tsx +1 -1
- package/src/components/Board/components/InputPrompt/InputPrompt.tsx +3 -3
- package/src/components/Board/components/ToggleDirectionButton/ToggleDirectionButton.tsx +4 -4
- package/src/components/Board/hooks/useBackgroundImage.tsx +13 -12
- package/src/components/Board/hooks/useBoardStyle.ts +4 -4
- package/src/components/Board/hooks/useFloatingActions.ts +2 -2
- package/src/components/Board/hooks/useFloatingInputPrompt.ts +1 -1
- package/src/components/Board/hooks/useGrid.ts +5 -5
- package/src/components/Board/lib.ts +2 -2
- package/src/components/Board/selectors.ts +2 -2
- package/src/components/Dictionary/Dictionary.tsx +2 -2
- package/src/components/DictionaryInput/DictionaryInput.tsx +2 -2
- package/src/components/EmptyState/EmptyState.tsx +13 -5
- package/src/components/Keys/Arrows/Arrows.tsx +1 -1
- package/src/components/Keys/index.tsx +2 -2
- package/src/components/Loading/Loading.tsx +2 -2
- package/src/components/Logo/Logo.tsx +2 -2
- package/src/components/Modal/Modal.tsx +3 -4
- package/src/components/NavButtons/NavButtons.tsx +4 -4
- package/src/components/NavButtons/selectors.ts +1 -1
- package/src/components/NotFound/NotFound.tsx +1 -1
- package/src/components/PlainTiles/lib.ts +1 -1
- package/src/components/Progress/Progress.tsx +2 -2
- package/src/components/Rack/Rack.tsx +4 -4
- package/src/components/Rack/components/InputPrompt/InputPrompt.tsx +2 -2
- package/src/components/Rack/components/InputPrompt/lib.ts +1 -3
- package/src/components/Rack/components/RackTile/RackTile.tsx +2 -2
- package/src/components/Rack/selectors.ts +2 -2
- package/src/components/Results/Cell.tsx +2 -2
- package/src/components/Results/Header.tsx +5 -5
- package/src/components/Results/HeaderButton.tsx +3 -3
- package/src/components/Results/Result.tsx +6 -6
- package/src/components/Results/Results.tsx +4 -4
- package/src/components/Results/SolveButton.tsx +2 -2
- package/src/components/ResultsInput/ResultsInput.tsx +2 -2
- package/src/components/Solver/Solver.tsx +3 -3
- package/src/components/Solver/components/InsertButton/InsertButton.tsx +2 -2
- package/src/components/Solver/components/ResultCandidatePicker/ResultCandidatePicker.tsx +2 -2
- package/src/components/Spinner/Spinner.tsx +1 -1
- package/src/components/Tile/Tile.tsx +3 -3
- package/src/components/Tile/TilePure.tsx +1 -1
- package/src/components/Tooltip/TooltipContent.tsx +1 -1
- package/src/hooks/useColumns.ts +3 -3
- package/src/hooks/useDirection.ts +1 -1
- package/src/hooks/useLanguage.ts +1 -1
- package/src/hooks/useLocalStorage.ts +1 -1
- package/src/hooks/useMedia.ts +0 -1
- package/src/hooks/useMediaQuery.ts +1 -1
- package/src/i18n/constants.ts +1 -1
- package/src/i18n/i18n.ts +1 -1
- package/src/i18n/languages/english.json +1 -1
- package/src/i18n/languages/french.json +1 -1
- package/src/i18n/languages/german.json +1 -1
- package/src/i18n/languages/polish.json +1 -1
- package/src/i18n/languages/romanian.json +1 -1
- package/src/i18n/languages/spanish.json +1 -1
- package/src/i18n/languages/turkish.json +1 -1
- package/src/lib/createComparator.ts +1 -1
- package/src/lib/createKeyComparator.ts +1 -1
- package/src/lib/createStringComparator.ts +1 -1
- package/src/lib/getTileSizes.ts +1 -1
- package/src/lib/numberComparator.ts +1 -1
- package/src/lib/reverseComparator.ts +1 -1
- package/src/lib/zipCharactersAndTiles.ts +1 -1
- package/src/modals/DictionaryModal/DictionaryModal.tsx +2 -2
- package/src/modals/KeyMapModal/KeyMapModal.tsx +2 -2
- package/src/modals/MenuModal/MenuModal.tsx +5 -5
- package/src/modals/RemainingTilesModal/RemainingTilesModal.tsx +5 -5
- package/src/modals/RemainingTilesModal/components/Character/Character.tsx +5 -5
- package/src/modals/RemainingTilesModal/lib.ts +1 -1
- package/src/modals/RemainingTilesModal/selectors.ts +1 -1
- package/src/modals/ResultsModal/ResultsModal.tsx +4 -4
- package/src/modals/SettingsModal/SettingsModal.tsx +3 -3
- package/src/modals/SettingsModal/components/AutoGroupTilesSetting/AutoGroupTilesSetting.tsx +2 -2
- package/src/modals/SettingsModal/components/AutoGroupTilesSetting/lib.ts +1 -1
- package/src/modals/SettingsModal/components/ConfigSetting/ConfigSetting.tsx +2 -2
- package/src/modals/SettingsModal/components/InputModeSetting/InputModeSetting.tsx +2 -2
- package/src/modals/SettingsModal/components/InputModeSetting/lib.ts +1 -1
- package/src/modals/SettingsModal/components/LocaleSetting/LocaleSetting.tsx +3 -3
- package/src/modals/SettingsModal/components/RemoveCellFiltersSetting/RemoveCellFiltersSetting.tsx +2 -2
- package/src/modals/SettingsModal/components/RemoveCellFiltersSetting/lib.ts +1 -1
- package/src/modals/SettingsModal/components/ShowCoordinatesSetting/ShowCoordinatesSetting.tsx +2 -2
- package/src/modals/WordsModal/WordsModal.tsx +3 -3
- package/src/pages/_app.tsx +3 -4
- package/src/pages/api/dictionary/[locale]/[word].ts +1 -1
- package/src/pages/api/dictionary/[locale]/index.ts +1 -1
- package/src/pages/api/solve.ts +2 -2
- package/src/pages/api/verify.ts +1 -1
- package/src/pages/api/visit.ts +1 -1
- package/src/pages/index.tsx +6 -6
- package/src/pages/not-found.tsx +1 -1
- package/src/parameters/index.ts +4 -4
- package/src/sdk/fetchJson.ts +3 -7
- package/src/service-worker/index.ts +0 -1
- package/src/service-worker/routeSolveRequests.ts +19 -13
- package/src/service-worker/routeVerifyRequests.ts +1 -1
- package/src/state/board/slice.ts +30 -5
- package/src/state/cellFilters/lib.ts +1 -1
- package/src/state/cellFilters/selectors.ts +1 -1
- package/src/state/cellFilters/slice.ts +1 -1
- package/src/state/cellFilters/types.ts +1 -1
- package/src/state/lib.ts +2 -2
- package/src/state/localStorage.ts +1 -1
- package/src/state/rack/slice.ts +2 -2
- package/src/state/rack/types.ts +1 -1
- package/src/state/results/initialState.ts +1 -1
- package/src/state/results/lib.ts +9 -2
- package/src/state/results/selectors.ts +1 -1
- package/src/state/results/slice.ts +1 -1
- package/src/state/results/types.ts +1 -1
- package/src/state/sagas.ts +4 -5
- package/src/state/selectors.ts +1 -1
- package/src/state/settings/selectors.ts +1 -1
- package/src/state/settings/slice.ts +1 -1
- package/src/state/settings/types.ts +1 -1
- package/src/state/useTranslate.ts +1 -1
- package/tsconfig.json +1 -16
- package/tsconfig.tsbuildinfo +1 -1
- /package/.next/static/{zFnoNsMXUha-MKjuZn6AN → FDUqldlsD7FXe6iWhIJmu}/_ssgManifest.js +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
2
|
import { type FunctionComponent, memo } from 'react';
|
|
3
3
|
|
|
4
|
-
import { Badge, Modal } from 'components';
|
|
5
|
-
import { Check, Cross } from 'icons';
|
|
6
|
-
import { selectInvalidWords, selectLocale, selectValidWords, useTranslate, useTypedSelector } from 'state';
|
|
4
|
+
import { Badge, Modal } from '@/components';
|
|
5
|
+
import { Check, Cross } from '@/icons';
|
|
6
|
+
import { selectInvalidWords, selectLocale, selectValidWords, useTranslate, useTypedSelector } from '@/state';
|
|
7
7
|
|
|
8
8
|
import styles from './WordsModal.module.scss';
|
|
9
9
|
|
package/src/pages/_app.tsx
CHANGED
|
@@ -4,14 +4,13 @@ import Head from 'next/head';
|
|
|
4
4
|
import { type FunctionComponent } from 'react';
|
|
5
5
|
import { Provider } from 'react-redux';
|
|
6
6
|
|
|
7
|
-
import { AppLayoutProvider } from 'app-layout';
|
|
8
|
-
import { SeoMessage } from 'components';
|
|
9
|
-
import { store } from 'state';
|
|
7
|
+
import { AppLayoutProvider } from '@/app-layout';
|
|
8
|
+
import { SeoMessage } from '@/components';
|
|
9
|
+
import { store } from '@/state';
|
|
10
10
|
|
|
11
11
|
import '../styles/global.scss';
|
|
12
12
|
|
|
13
13
|
const DESCRIPTION =
|
|
14
|
-
// eslint-disable-next-line max-len
|
|
15
14
|
'Scrabble Solver 2 - Free and open-source analysis tool for Scrabble, Scrabble Duel, Super Scrabble, Letter League, Crossplay, Literaki and Kelimelik. Quickly find top scoring words using given letters and board state. Available in English, French, German, Persian, Polish, Romanian, Spanish, and Turkish.';
|
|
16
15
|
|
|
17
16
|
const KEYWORDS = [
|
|
@@ -6,7 +6,7 @@ import { type Locale, isLocale } from '@scrabble-solver/types';
|
|
|
6
6
|
import { getWordDefinition } from '@scrabble-solver/word-definitions';
|
|
7
7
|
import { type NextApiRequest, type NextApiResponse } from 'next';
|
|
8
8
|
|
|
9
|
-
import { getServerLoggingData } from 'api';
|
|
9
|
+
import { getServerLoggingData } from '@/api';
|
|
10
10
|
|
|
11
11
|
interface RequestData {
|
|
12
12
|
locale: Locale;
|
|
@@ -3,7 +3,7 @@ import { logger } from '@scrabble-solver/logger';
|
|
|
3
3
|
import { isLocale, type Locale } from '@scrabble-solver/types';
|
|
4
4
|
import { type NextApiRequest, type NextApiResponse } from 'next';
|
|
5
5
|
|
|
6
|
-
import { getServerLoggingData } from 'api';
|
|
6
|
+
import { getServerLoggingData } from '@/api';
|
|
7
7
|
|
|
8
8
|
interface RequestData {
|
|
9
9
|
locale: Locale;
|
package/src/pages/api/solve.ts
CHANGED
|
@@ -15,8 +15,8 @@ import {
|
|
|
15
15
|
} from '@scrabble-solver/types';
|
|
16
16
|
import { type NextApiRequest, type NextApiResponse } from 'next';
|
|
17
17
|
|
|
18
|
-
import { getServerLoggingData, isBoardValid, isCharacterValid } from 'api';
|
|
19
|
-
import { isStringArray } from 'lib';
|
|
18
|
+
import { getServerLoggingData, isBoardValid, isCharacterValid } from '@/api';
|
|
19
|
+
import { isStringArray } from '@/lib';
|
|
20
20
|
|
|
21
21
|
interface RequestData {
|
|
22
22
|
board: Board;
|
package/src/pages/api/verify.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { logger } from '@scrabble-solver/logger';
|
|
|
4
4
|
import { Board, type Config, type Game, type Locale, isBoardJson, isGame, isLocale } from '@scrabble-solver/types';
|
|
5
5
|
import { type NextApiRequest, type NextApiResponse } from 'next';
|
|
6
6
|
|
|
7
|
-
import { getServerLoggingData, isBoardValid } from 'api';
|
|
7
|
+
import { getServerLoggingData, isBoardValid } from '@/api';
|
|
8
8
|
|
|
9
9
|
interface RequestData {
|
|
10
10
|
board: Board;
|
package/src/pages/api/visit.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { logger } from '@scrabble-solver/logger';
|
|
2
2
|
import { type NextApiRequest, type NextApiResponse } from 'next';
|
|
3
3
|
|
|
4
|
-
import { getServerLoggingData } from 'api';
|
|
4
|
+
import { getServerLoggingData } from '@/api';
|
|
5
5
|
|
|
6
6
|
const visit = (request: NextApiRequest, response: NextApiResponse): void => {
|
|
7
7
|
const meta = getServerLoggingData(request);
|
package/src/pages/index.tsx
CHANGED
|
@@ -7,9 +7,9 @@ import { type FunctionComponent, useCallback, useState } from 'react';
|
|
|
7
7
|
import ReactModal from 'react-modal';
|
|
8
8
|
import { useDispatch } from 'react-redux';
|
|
9
9
|
|
|
10
|
-
import { Logo, NavButtons, Solver } from 'components';
|
|
11
|
-
import { useDirection, useEffectOnce, useLanguage, useLocalStorage } from 'hooks';
|
|
12
|
-
import { LOCALE_FEATURES } from 'i18n';
|
|
10
|
+
import { Logo, NavButtons, Solver } from '@/components';
|
|
11
|
+
import { useDirection, useEffectOnce, useLanguage, useLocalStorage } from '@/hooks';
|
|
12
|
+
import { LOCALE_FEATURES } from '@/i18n';
|
|
13
13
|
import {
|
|
14
14
|
DictionaryModal,
|
|
15
15
|
KeyMapModal,
|
|
@@ -18,9 +18,9 @@ import {
|
|
|
18
18
|
ResultsModal,
|
|
19
19
|
SettingsModal,
|
|
20
20
|
WordsModal,
|
|
21
|
-
} from 'modals';
|
|
22
|
-
import { registerServiceWorker } from 'serviceWorkerManager';
|
|
23
|
-
import { initialize, reset, selectConfig, selectLocale, useTypedSelector } from 'state';
|
|
21
|
+
} from '@/modals';
|
|
22
|
+
import { registerServiceWorker } from '@/serviceWorkerManager';
|
|
23
|
+
import { initialize, reset, selectConfig, selectLocale, useTypedSelector } from '@/state';
|
|
24
24
|
|
|
25
25
|
import styles from './index.module.scss';
|
|
26
26
|
|
package/src/pages/not-found.tsx
CHANGED
package/src/parameters/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ResultColumnId } from 'types';
|
|
1
|
+
import { ResultColumnId } from '@/types';
|
|
2
2
|
|
|
3
3
|
export const BREAKPOINTS = {
|
|
4
4
|
xs: 480,
|
|
@@ -62,11 +62,13 @@ export const SPACING_XL = 40;
|
|
|
62
62
|
export const COMPONENTS_SPACING = SPACING_XL;
|
|
63
63
|
export const COMPONENTS_SPACING_SMALL = SPACING_L;
|
|
64
64
|
|
|
65
|
+
export const RACK_TILE_SIZE_MAX = 80;
|
|
66
|
+
|
|
65
67
|
export const BOARD_CELL_ACTIONS_OFFSET = 3;
|
|
66
68
|
export const BOARD_CELL_BORDER_WIDTH = 1;
|
|
67
69
|
export const BOARD_TILE_FONT_SIZE_MIN = 14;
|
|
68
70
|
export const BOARD_TILE_FONT_SIZE_POINTS_MIN = 10;
|
|
69
|
-
export const BOARD_TILE_SIZE_MAX =
|
|
71
|
+
export const BOARD_TILE_SIZE_MAX = RACK_TILE_SIZE_MAX;
|
|
70
72
|
|
|
71
73
|
export const BORDER_COLOR = '#cdcdcd';
|
|
72
74
|
export const BORDER_COLOR_LIGHT = '#d9d9d9';
|
|
@@ -119,8 +121,6 @@ export const PLAIN_TILES_VERSION_TILE_SIZE = TILE_SIZE;
|
|
|
119
121
|
export const PROGRESS_COLOR_VALUE = 'var(--color--violet--light)';
|
|
120
122
|
export const PROGRESS_COLOR_BACKGROUND = 'var(--color--inactive)';
|
|
121
123
|
|
|
122
|
-
export const RACK_TILE_SIZE_MAX = 80;
|
|
123
|
-
|
|
124
124
|
export const REMAINING_TILES_TILE_SIZE = 50;
|
|
125
125
|
|
|
126
126
|
export const RESULTS_COLUMN_WIDTH: Record<ResultColumnId, number | undefined> = {
|
package/src/sdk/fetchJson.ts
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import { fetch } from './fetch';
|
|
2
2
|
|
|
3
3
|
export const fetchJson = async <T>(input: RequestInfo | URL, init?: RequestInit): Promise<T> => {
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
headers: {
|
|
7
|
-
'Content-Type': 'application/json',
|
|
8
|
-
...init?.headers,
|
|
9
|
-
},
|
|
10
|
-
});
|
|
4
|
+
const headers = new Headers(init?.headers);
|
|
5
|
+
headers.set('Content-Type', 'application/json');
|
|
11
6
|
|
|
7
|
+
const response = await fetch(input, { ...init, headers });
|
|
12
8
|
return response.json();
|
|
13
9
|
};
|
|
@@ -5,7 +5,7 @@ import { solve } from '@scrabble-solver/solver';
|
|
|
5
5
|
import { Board, Tile } from '@scrabble-solver/types';
|
|
6
6
|
import { registerRoute } from 'workbox-routing';
|
|
7
7
|
|
|
8
|
-
import { type SolveRequestPayload } from 'types';
|
|
8
|
+
import { type SolveRequestPayload } from '@/types';
|
|
9
9
|
|
|
10
10
|
import { average } from './average';
|
|
11
11
|
import { revalidateDictionary } from './dictionaries';
|
|
@@ -19,18 +19,6 @@ const MIN_MEASUREMENTS = 5;
|
|
|
19
19
|
const localDurations: number[] = [];
|
|
20
20
|
const serverDurations: number[] = [];
|
|
21
21
|
|
|
22
|
-
const isSlowDevice = (): boolean | undefined => {
|
|
23
|
-
if (localDurations.length < MIN_MEASUREMENTS || serverDurations.length < MIN_MEASUREMENTS) {
|
|
24
|
-
return undefined;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const count = Math.min(localDurations.length, serverDurations.length);
|
|
28
|
-
const local = localDurations.slice(0, count).sort().slice(1, -1);
|
|
29
|
-
const server = serverDurations.slice(0, count).sort().slice(1, -1);
|
|
30
|
-
|
|
31
|
-
return average(local) > average(server);
|
|
32
|
-
};
|
|
33
|
-
|
|
34
22
|
export const routeSolveRequests = () => {
|
|
35
23
|
registerRoute(
|
|
36
24
|
({ url }) => url.origin === location.origin && url.pathname === '/api/solve',
|
|
@@ -83,3 +71,21 @@ export const routeSolveRequests = () => {
|
|
|
83
71
|
'POST',
|
|
84
72
|
);
|
|
85
73
|
};
|
|
74
|
+
|
|
75
|
+
const isSlowDevice = (): boolean | undefined => {
|
|
76
|
+
if (localDurations.length < MIN_MEASUREMENTS || serverDurations.length < MIN_MEASUREMENTS) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const count = Math.min(localDurations.length, serverDurations.length);
|
|
81
|
+
const local = localDurations
|
|
82
|
+
.slice(0, count)
|
|
83
|
+
.sort((a, b) => a - b)
|
|
84
|
+
.slice(1, -1);
|
|
85
|
+
const server = localDurations
|
|
86
|
+
.slice(0, count)
|
|
87
|
+
.sort((a, b) => a - b)
|
|
88
|
+
.slice(1, -1);
|
|
89
|
+
|
|
90
|
+
return average(local) > average(server);
|
|
91
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Board } from '@scrabble-solver/types';
|
|
2
2
|
import { registerRoute } from 'workbox-routing';
|
|
3
3
|
|
|
4
|
-
import { type VerifyRequestPayload } from 'types';
|
|
4
|
+
import { type VerifyRequestPayload } from '@/types';
|
|
5
5
|
|
|
6
6
|
import { revalidateDictionary } from './dictionaries';
|
|
7
7
|
import { getTrie } from './getTrie';
|
package/src/state/board/slice.ts
CHANGED
|
@@ -16,7 +16,7 @@ export const boardSlice = createSlice({
|
|
|
16
16
|
const result = action.payload;
|
|
17
17
|
|
|
18
18
|
result.cells.forEach((cell) => {
|
|
19
|
-
newBoard.updateCell(cell.x, cell.y, () => new Cell({
|
|
19
|
+
newBoard.updateCell(cell.x, cell.y, () => new Cell({ isEmpty: false, tile: cell.tile, x: cell.x, y: cell.y }));
|
|
20
20
|
});
|
|
21
21
|
|
|
22
22
|
return newBoard;
|
|
@@ -34,7 +34,7 @@ export const boardSlice = createSlice({
|
|
|
34
34
|
const tile = isEmpty ? Tile.Null : new Tile({ character: value });
|
|
35
35
|
|
|
36
36
|
newBoard.updateCell(x, y, (cell) => {
|
|
37
|
-
return new Cell({
|
|
37
|
+
return new Cell({ isEmpty, tile, x: cell.x, y: cell.y });
|
|
38
38
|
});
|
|
39
39
|
|
|
40
40
|
return newBoard;
|
|
@@ -50,8 +50,10 @@ export const boardSlice = createSlice({
|
|
|
50
50
|
const { x, y } = action.payload;
|
|
51
51
|
|
|
52
52
|
newBoard.updateCell(x, y, (cell) => {
|
|
53
|
-
const tile = cell.isEmpty
|
|
54
|
-
|
|
53
|
+
const tile = cell.isEmpty
|
|
54
|
+
? cell.tile
|
|
55
|
+
: new Tile({ isBlank: !cell.tile.isBlank, character: cell.tile.character });
|
|
56
|
+
return new Cell({ isEmpty: cell.isEmpty, tile, x: cell.x, y: cell.y });
|
|
55
57
|
});
|
|
56
58
|
|
|
57
59
|
return newBoard;
|
|
@@ -67,7 +69,30 @@ export const boardSlice = createSlice({
|
|
|
67
69
|
}
|
|
68
70
|
|
|
69
71
|
if (state.rows.length !== config.boardHeight || state.rows[0].length !== config.boardWidth) {
|
|
70
|
-
|
|
72
|
+
const newBoard = Board.create(config.boardWidth, config.boardHeight);
|
|
73
|
+
const offsetX = Math.floor(config.boardWidth / 2) - Math.floor(state.rows[0].length / 2);
|
|
74
|
+
const offsetY = Math.floor(config.boardHeight / 2) - Math.floor(state.rows.length / 2);
|
|
75
|
+
|
|
76
|
+
for (let y = 0; y < state.rows.length; ++y) {
|
|
77
|
+
for (let x = 0; x < state.rows[y].length; ++x) {
|
|
78
|
+
const cell = state.rows[y][x];
|
|
79
|
+
|
|
80
|
+
if (cell.isEmpty) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const newX = x + offsetX;
|
|
85
|
+
const newY = y + offsetY;
|
|
86
|
+
|
|
87
|
+
if (newX < 0 || newX >= config.boardWidth || newY < 0 || newY >= config.boardHeight) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
newBoard.updateCell(newX, newY, () => new Cell({ ...cell, x: newX, y: newY }));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return newBoard;
|
|
71
96
|
}
|
|
72
97
|
|
|
73
98
|
return state;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createSlice, type PayloadAction } from '@reduxjs/toolkit';
|
|
2
2
|
import type { Cell } from '@scrabble-solver/types';
|
|
3
3
|
|
|
4
|
-
import type { Point } from 'types';
|
|
4
|
+
import type { Point } from '@/types';
|
|
5
5
|
|
|
6
6
|
import { cellFiltersInitialState } from './initialState';
|
|
7
7
|
import { toggleCellFilterState } from './lib';
|
package/src/state/lib.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { BLANK } from '@scrabble-solver/constants';
|
|
2
2
|
import { type Board, type Config } from '@scrabble-solver/types';
|
|
3
3
|
|
|
4
|
-
import { createKeyComparator } from 'lib';
|
|
5
|
-
import { type RemainingTile } from 'types';
|
|
4
|
+
import { createKeyComparator } from '@/lib';
|
|
5
|
+
import { type RemainingTile } from '@/types';
|
|
6
6
|
|
|
7
7
|
export const getRemainingTiles = (
|
|
8
8
|
config: Config,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Board, type BoardJson, type Game, type Locale, type ShowCoordinates } from '@scrabble-solver/types';
|
|
2
2
|
import store2 from 'store2';
|
|
3
3
|
|
|
4
|
-
import type { AutoGroupTiles, InputMode, Rack, RemoveCellFilters } from 'types';
|
|
4
|
+
import type { AutoGroupTiles, InputMode, Rack, RemoveCellFilters } from '@/types';
|
|
5
5
|
|
|
6
6
|
const AUTO_GROUP_TILES = 'auto-group-tiles';
|
|
7
7
|
const BOARD = 'board';
|
package/src/state/rack/slice.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createSlice, type PayloadAction } from '@reduxjs/toolkit';
|
|
2
2
|
import { type Tile } from '@scrabble-solver/types';
|
|
3
3
|
|
|
4
|
-
import { arrayEquals, createNullMovingComparator, inverseDirection, zipCharactersAndTiles } from 'lib';
|
|
5
|
-
import { type AutoGroupTiles, type Rack } from 'types';
|
|
4
|
+
import { arrayEquals, createNullMovingComparator, inverseDirection, zipCharactersAndTiles } from '@/lib';
|
|
5
|
+
import { type AutoGroupTiles, type Rack } from '@/types';
|
|
6
6
|
|
|
7
7
|
import { rackDefaultState, rackInitialState } from './initialState';
|
|
8
8
|
|
package/src/state/rack/types.ts
CHANGED
package/src/state/results/lib.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { type Result, type ShowCoordinates } from '@scrabble-solver/types';
|
|
2
2
|
|
|
3
|
-
import { createKeyComparator, createRegExp, createStringComparator, getCoordinate, reverseComparator } from 'lib';
|
|
4
|
-
import {
|
|
3
|
+
import { createKeyComparator, createRegExp, createStringComparator, getCoordinate, reverseComparator } from '@/lib';
|
|
4
|
+
import {
|
|
5
|
+
type CellFilter,
|
|
6
|
+
type Comparator,
|
|
7
|
+
type GroupedResults,
|
|
8
|
+
ResultColumnId,
|
|
9
|
+
type Sort,
|
|
10
|
+
SortDirection,
|
|
11
|
+
} from '@/types';
|
|
5
12
|
|
|
6
13
|
export const getCoordinates = (result: Result, showCoordinates: ShowCoordinates): string => {
|
|
7
14
|
if (showCoordinates === 'hidden') {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createSlice, type PayloadAction } from '@reduxjs/toolkit';
|
|
2
2
|
import { type Result } from '@scrabble-solver/types';
|
|
3
3
|
|
|
4
|
-
import { type ResultColumnId, SortDirection } from 'types';
|
|
4
|
+
import { type ResultColumnId, SortDirection } from '@/types';
|
|
5
5
|
|
|
6
6
|
import { resultsInitialState } from './initialState';
|
|
7
7
|
|
package/src/state/sagas.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* eslint-disable max-lines
|
|
1
|
+
/* eslint-disable max-lines */
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
3
3
|
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
4
4
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
@@ -8,9 +8,9 @@ import { hasConfig, languages } from '@scrabble-solver/configs';
|
|
|
8
8
|
import { Board, type Locale, type Result } from '@scrabble-solver/types';
|
|
9
9
|
import { call, delay, put, select, takeEvery, takeLatest } from 'redux-saga/effects';
|
|
10
10
|
|
|
11
|
-
import { LOCALE_FEATURES } from 'i18n';
|
|
12
|
-
import { memoize } from 'lib';
|
|
13
|
-
import { findWordDefinitions, solve, verify, visit } from 'sdk';
|
|
11
|
+
import { LOCALE_FEATURES } from '@/i18n';
|
|
12
|
+
import { memoize } from '@/lib';
|
|
13
|
+
import { findWordDefinitions, solve, verify, visit } from '@/sdk';
|
|
14
14
|
|
|
15
15
|
import { initialize, reset } from './actions';
|
|
16
16
|
import { boardSlice, selectBoard } from './board';
|
|
@@ -35,7 +35,6 @@ const memoizedFindWordDefinitions = memoize(findWordDefinitions);
|
|
|
35
35
|
|
|
36
36
|
// Can't conveniently type generators for sagas yet,
|
|
37
37
|
// see: https://github.com/microsoft/TypeScript/issues/43632
|
|
38
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
39
38
|
type AnyGenerator = Generator<any, any, any>;
|
|
40
39
|
|
|
41
40
|
export function* rootSaga(): AnyGenerator {
|
package/src/state/selectors.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { getConfig } from '@scrabble-solver/configs';
|
|
|
3
3
|
import { BLANK } from '@scrabble-solver/constants';
|
|
4
4
|
import { type Cell, type Tile } from '@scrabble-solver/types';
|
|
5
5
|
|
|
6
|
-
import { i18n, LOCALE_FEATURES } from 'i18n';
|
|
6
|
+
import { i18n, LOCALE_FEATURES } from '@/i18n';
|
|
7
7
|
|
|
8
8
|
import type { RootState } from '../types';
|
|
9
9
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createSlice, type PayloadAction } from '@reduxjs/toolkit';
|
|
2
2
|
import { type Game, type Locale, type ShowCoordinates } from '@scrabble-solver/types';
|
|
3
3
|
|
|
4
|
-
import type { AutoGroupTiles, InputMode, RemoveCellFilters } from 'types';
|
|
4
|
+
import type { AutoGroupTiles, InputMode, RemoveCellFilters } from '@/types';
|
|
5
5
|
|
|
6
6
|
import { settingsInitialState } from './initialState';
|
|
7
7
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Game, type Locale, type ShowCoordinates } from '@scrabble-solver/types';
|
|
2
2
|
|
|
3
|
-
import type { AutoGroupTiles, InputMode, RemoveCellFilters } from 'types';
|
|
3
|
+
import type { AutoGroupTiles, InputMode, RemoveCellFilters } from '@/types';
|
|
4
4
|
|
|
5
5
|
export interface SettingsState {
|
|
6
6
|
autoGroupTiles: AutoGroupTiles;
|
package/tsconfig.json
CHANGED
|
@@ -3,28 +3,13 @@
|
|
|
3
3
|
|
|
4
4
|
"compilerOptions": {
|
|
5
5
|
"allowJs": true,
|
|
6
|
-
"baseUrl": ".",
|
|
7
6
|
"declaration": false,
|
|
8
7
|
"isolatedModules": true,
|
|
9
8
|
"jsx": "preserve",
|
|
10
9
|
"lib": ["dom", "dom.iterable", "esnext"],
|
|
11
10
|
"noEmit": true,
|
|
12
11
|
"paths": {
|
|
13
|
-
"
|
|
14
|
-
"app-layout": ["./src/app-layout"],
|
|
15
|
-
"components": ["./src/components"],
|
|
16
|
-
"hooks": ["./src/hooks"],
|
|
17
|
-
"icons": ["./src/icons"],
|
|
18
|
-
"i18n": ["./src/i18n"],
|
|
19
|
-
"lib": ["./src/lib"],
|
|
20
|
-
"modals": ["./src/modals"],
|
|
21
|
-
"pages": ["./src/pages"],
|
|
22
|
-
"parameters": ["./src/parameters"],
|
|
23
|
-
"sdk": ["./src/sdk"],
|
|
24
|
-
"serviceWorkerManager": ["./src/serviceWorkerManager"],
|
|
25
|
-
"state": ["./src/state"],
|
|
26
|
-
"styles": ["./src/styles"],
|
|
27
|
-
"types": ["./src/types"]
|
|
12
|
+
"@/*": ["./src/*"]
|
|
28
13
|
},
|
|
29
14
|
"resolveJsonModule": true,
|
|
30
15
|
"rootDir": "./src",
|