@scrabble-solver/scrabble-solver 2.15.12 → 2.15.14
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 +15 -15
- package/.next/cache/.previewinfo +1 -0
- 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/0.pack +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/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +4 -4
- package/.next/required-server-files.json +23 -14
- package/.next/routes-manifest.json +11 -7
- package/.next/server/chunks/30.js +4 -4
- package/.next/server/chunks/318.js +1 -1
- package/.next/server/chunks/717.js +1 -0
- package/.next/server/chunks/791.js +19 -0
- package/.next/server/chunks/812.js +1 -1
- package/.next/server/chunks/829.js +1 -0
- package/.next/server/chunks/929.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/404.js.nft.json +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages/_app.js +1 -1
- package/.next/server/pages/_app.js.nft.json +1 -1
- package/.next/server/pages/_document.js +1 -1
- package/.next/server/pages/_document.js.nft.json +1 -1
- package/.next/server/pages/_error.js +1 -1
- package/.next/server/pages/_error.js.nft.json +1 -1
- package/.next/server/pages/api/dictionary/[locale]/[word].js +2 -2
- package/.next/server/pages/api/dictionary/[locale]/[word].js.nft.json +1 -1
- package/.next/server/pages/api/dictionary/[locale].js +1 -1
- package/.next/server/pages/api/dictionary/[locale].js.nft.json +1 -1
- package/.next/server/pages/api/solve.js +1 -1
- package/.next/server/pages/api/solve.js.nft.json +1 -1
- package/.next/server/pages/api/verify.js +1 -1
- package/.next/server/pages/api/verify.js.nft.json +1 -1
- package/.next/server/pages/api/visit.js +1 -1
- package/.next/server/pages/api/visit.js.nft.json +1 -1
- package/.next/server/pages/index.html +1 -1
- package/.next/server/pages/index.js +1 -1
- package/.next/server/pages/index.js.nft.json +1 -1
- package/.next/server/pages/index.json +1 -1
- package/.next/server/webpack-api-runtime.js +1 -1
- package/.next/server/webpack-runtime.js +1 -1
- package/.next/static/{X6ny8arpUxpRCZ4OMm7Vo → UHBG2hxudxuZNMubluQ6A}/_buildManifest.js +1 -1
- package/.next/static/chunks/framework-e4d8bdda7b6c00b3.js +1 -0
- package/.next/static/chunks/main-40732898df2b5947.js +1 -0
- package/.next/static/chunks/pages/404-3ab23f01145bda71.js +1 -0
- package/.next/static/chunks/pages/_app-ca98ddb1c33cb8b1.js +1 -0
- package/.next/static/chunks/pages/{_error-7ea2d37f66343175.js → _error-e7f663d1e0f43380.js} +1 -1
- package/.next/static/chunks/pages/index-5c4af5351329bef5.js +1 -0
- package/.next/static/css/d611d31bf52b6e25.css +2 -0
- package/.next/trace +24 -23
- package/.next/types/routes.d.ts +57 -0
- package/.next/types/validator.ts +107 -0
- package/next-env.d.ts +1 -0
- package/package.json +21 -21
- package/src/components/Results/Result.tsx +13 -17
- package/src/components/Results/Results.tsx +23 -24
- package/.next/server/chunks/60.js +0 -1
- package/.next/server/chunks/974.js +0 -1
- package/.next/static/chunks/framework-57125a0cc6749ff9.js +0 -1
- package/.next/static/chunks/main-03618e8bd3cd04dd.js +0 -1
- package/.next/static/chunks/pages/404-18b9f6f5faa91442.js +0 -1
- package/.next/static/chunks/pages/_app-2378fe90e1762e8c.js +0 -1
- package/.next/static/chunks/pages/index-bfc599d9351773ae.js +0 -1
- package/.next/static/css/1fae874a25934f54.css +0 -2
- /package/.next/static/{X6ny8arpUxpRCZ4OMm7Vo → UHBG2hxudxuZNMubluQ6A}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// This file is generated automatically by Next.js
|
|
2
|
+
// Do not edit this file manually
|
|
3
|
+
|
|
4
|
+
type AppRoutes = never
|
|
5
|
+
type PageRoutes = "/" | "/404"
|
|
6
|
+
type LayoutRoutes = never
|
|
7
|
+
type RedirectRoutes = never
|
|
8
|
+
type RewriteRoutes = never
|
|
9
|
+
type Routes = AppRoutes | PageRoutes | LayoutRoutes | RedirectRoutes | RewriteRoutes
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
interface ParamMap {
|
|
13
|
+
"/": {}
|
|
14
|
+
"/404": {}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
export type ParamsOf<Route extends Routes> = ParamMap[Route]
|
|
19
|
+
|
|
20
|
+
interface LayoutSlotMap {
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
export type { AppRoutes, PageRoutes, LayoutRoutes, RedirectRoutes, RewriteRoutes, ParamMap }
|
|
25
|
+
|
|
26
|
+
declare global {
|
|
27
|
+
/**
|
|
28
|
+
* Props for Next.js App Router page components
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* export default function Page(props: PageProps<'/blog/[slug]'>) {
|
|
32
|
+
* const { slug } = await props.params
|
|
33
|
+
* return <div>Blog post: {slug}</div>
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
interface PageProps<AppRoute extends AppRoutes> {
|
|
38
|
+
params: Promise<ParamMap[AppRoute]>
|
|
39
|
+
searchParams: Promise<Record<string, string | string[] | undefined>>
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Props for Next.js App Router layout components
|
|
44
|
+
* @example
|
|
45
|
+
* ```tsx
|
|
46
|
+
* export default function Layout(props: LayoutProps<'/dashboard'>) {
|
|
47
|
+
* return <div>{props.children}</div>
|
|
48
|
+
* }
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
type LayoutProps<LayoutRoute extends LayoutRoutes> = {
|
|
52
|
+
params: Promise<ParamMap[LayoutRoute]>
|
|
53
|
+
children: React.ReactNode
|
|
54
|
+
} & {
|
|
55
|
+
[K in LayoutSlotMap[LayoutRoute]]: React.ReactNode
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// This file is generated automatically by Next.js
|
|
2
|
+
// Do not edit this file manually
|
|
3
|
+
// This file validates that all pages and layouts export the correct types
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import type { NextApiHandler } from "next/types.js"
|
|
7
|
+
|
|
8
|
+
type PagesPageConfig = {
|
|
9
|
+
default: React.ComponentType<any> | ((props: any) => React.ReactNode | Promise<React.ReactNode> | never | void)
|
|
10
|
+
getStaticProps?: (context: any) => Promise<any> | any
|
|
11
|
+
getStaticPaths?: (context: any) => Promise<any> | any
|
|
12
|
+
getServerSideProps?: (context: any) => Promise<any> | any
|
|
13
|
+
getInitialProps?: (context: any) => Promise<any> | any
|
|
14
|
+
/**
|
|
15
|
+
* Segment configuration for legacy Pages Router pages.
|
|
16
|
+
* Validated at build-time by parsePagesSegmentConfig.
|
|
17
|
+
*/
|
|
18
|
+
config?: {
|
|
19
|
+
amp?: boolean | 'hybrid' | string // necessary for JS
|
|
20
|
+
maxDuration?: number
|
|
21
|
+
runtime?: 'edge' | 'experimental-edge' | 'nodejs' | string // necessary unless config is exported as const
|
|
22
|
+
regions?: string[]
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
type ApiRouteConfig = {
|
|
27
|
+
default: (req: any, res: any) => ReturnType<NextApiHandler>
|
|
28
|
+
config?: {
|
|
29
|
+
api?: {
|
|
30
|
+
bodyParser?: boolean | { sizeLimit?: string }
|
|
31
|
+
responseLimit?: string | number | boolean
|
|
32
|
+
externalResolver?: boolean
|
|
33
|
+
}
|
|
34
|
+
runtime?: 'edge' | 'experimental-edge' | 'nodejs' | string // necessary unless config is exported as const
|
|
35
|
+
maxDuration?: number
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
// Validate ../../src/pages/404.tsx
|
|
45
|
+
{
|
|
46
|
+
type __IsExpected<Specific extends PagesPageConfig> = Specific
|
|
47
|
+
const handler = {} as typeof import("../../src/pages/404.js")
|
|
48
|
+
type __Check = __IsExpected<typeof handler>
|
|
49
|
+
// @ts-ignore
|
|
50
|
+
type __Unused = __Check
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Validate ../../src/pages/index.tsx
|
|
54
|
+
{
|
|
55
|
+
type __IsExpected<Specific extends PagesPageConfig> = Specific
|
|
56
|
+
const handler = {} as typeof import("../../src/pages/index.js")
|
|
57
|
+
type __Check = __IsExpected<typeof handler>
|
|
58
|
+
// @ts-ignore
|
|
59
|
+
type __Unused = __Check
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Validate ../../src/pages/api/dictionary/[locale]/[word].ts
|
|
63
|
+
{
|
|
64
|
+
type __IsExpected<Specific extends ApiRouteConfig> = Specific
|
|
65
|
+
const handler = {} as typeof import("../../src/pages/api/dictionary/[locale]/[word].js")
|
|
66
|
+
type __Check = __IsExpected<typeof handler>
|
|
67
|
+
// @ts-ignore
|
|
68
|
+
type __Unused = __Check
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Validate ../../src/pages/api/dictionary/[locale]/index.ts
|
|
72
|
+
{
|
|
73
|
+
type __IsExpected<Specific extends ApiRouteConfig> = Specific
|
|
74
|
+
const handler = {} as typeof import("../../src/pages/api/dictionary/[locale]/index.js")
|
|
75
|
+
type __Check = __IsExpected<typeof handler>
|
|
76
|
+
// @ts-ignore
|
|
77
|
+
type __Unused = __Check
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Validate ../../src/pages/api/solve.ts
|
|
81
|
+
{
|
|
82
|
+
type __IsExpected<Specific extends ApiRouteConfig> = Specific
|
|
83
|
+
const handler = {} as typeof import("../../src/pages/api/solve.js")
|
|
84
|
+
type __Check = __IsExpected<typeof handler>
|
|
85
|
+
// @ts-ignore
|
|
86
|
+
type __Unused = __Check
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Validate ../../src/pages/api/verify.ts
|
|
90
|
+
{
|
|
91
|
+
type __IsExpected<Specific extends ApiRouteConfig> = Specific
|
|
92
|
+
const handler = {} as typeof import("../../src/pages/api/verify.js")
|
|
93
|
+
type __Check = __IsExpected<typeof handler>
|
|
94
|
+
// @ts-ignore
|
|
95
|
+
type __Unused = __Check
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Validate ../../src/pages/api/visit.ts
|
|
99
|
+
{
|
|
100
|
+
type __IsExpected<Specific extends ApiRouteConfig> = Specific
|
|
101
|
+
const handler = {} as typeof import("../../src/pages/api/visit.js")
|
|
102
|
+
type __Check = __IsExpected<typeof handler>
|
|
103
|
+
// @ts-ignore
|
|
104
|
+
type __Unused = __Check
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
|
package/next-env.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference types="next" />
|
|
2
2
|
/// <reference types="next/image-types/global" />
|
|
3
|
+
/// <reference path="./.next/types/routes.d.ts" />
|
|
3
4
|
|
|
4
5
|
// NOTE: This file should not be edited
|
|
5
6
|
// see https://nextjs.org/docs/pages/api-reference/config/typescript for more information.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scrabble-solver/scrabble-solver",
|
|
3
|
-
"version": "2.15.
|
|
3
|
+
"version": "2.15.14",
|
|
4
4
|
"description": "Scrabble Solver 2 - App",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,33 +25,33 @@
|
|
|
25
25
|
"type-check": "tsc --noEmit"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@floating-ui/react": "^0.27.
|
|
28
|
+
"@floating-ui/react": "^0.27.16",
|
|
29
29
|
"@kamilmielnik/trie": "^4.0.0",
|
|
30
|
-
"@reduxjs/toolkit": "^2.
|
|
31
|
-
"@scrabble-solver/configs": "^2.15.
|
|
32
|
-
"@scrabble-solver/constants": "^2.15.
|
|
33
|
-
"@scrabble-solver/dictionaries": "^2.15.
|
|
34
|
-
"@scrabble-solver/logger": "^2.15.
|
|
35
|
-
"@scrabble-solver/solver": "^2.15.
|
|
36
|
-
"@scrabble-solver/types": "^2.15.
|
|
37
|
-
"@scrabble-solver/word-definitions": "^2.15.
|
|
30
|
+
"@reduxjs/toolkit": "^2.9.0",
|
|
31
|
+
"@scrabble-solver/configs": "^2.15.14",
|
|
32
|
+
"@scrabble-solver/constants": "^2.15.14",
|
|
33
|
+
"@scrabble-solver/dictionaries": "^2.15.14",
|
|
34
|
+
"@scrabble-solver/logger": "^2.15.14",
|
|
35
|
+
"@scrabble-solver/solver": "^2.15.14",
|
|
36
|
+
"@scrabble-solver/types": "^2.15.14",
|
|
37
|
+
"@scrabble-solver/word-definitions": "^2.15.14",
|
|
38
38
|
"classnames": "^2.5.1",
|
|
39
|
-
"env-cmd": "^
|
|
39
|
+
"env-cmd": "^11.0.0",
|
|
40
40
|
"include-media": "^2.0.0",
|
|
41
41
|
"include-media-query-builder": "^1.1.0",
|
|
42
|
-
"next": "^15.3
|
|
42
|
+
"next": "^15.5.3",
|
|
43
43
|
"normalize.css": "^8.0.1",
|
|
44
|
-
"react": "^19.1.
|
|
44
|
+
"react": "^19.1.1",
|
|
45
45
|
"react-cool-onclickoutside": "^1.7.0",
|
|
46
|
-
"react-dom": "^19.1.
|
|
46
|
+
"react-dom": "^19.1.1",
|
|
47
47
|
"react-highlight-words": "^0.21.0",
|
|
48
48
|
"react-modal": "^3.16.3",
|
|
49
49
|
"react-redux": "^9.2.0",
|
|
50
|
-
"react-window": "^1.
|
|
50
|
+
"react-window": "^2.1.1",
|
|
51
51
|
"redux-saga": "^1.3.0",
|
|
52
52
|
"store2": "^2.14.4",
|
|
53
53
|
"transliteration": "^2.3.5",
|
|
54
|
-
"use-debounce": "^10.0.
|
|
54
|
+
"use-debounce": "^10.0.6",
|
|
55
55
|
"workbox-expiration": "^7.3.0",
|
|
56
56
|
"workbox-precaching": "^7.3.0",
|
|
57
57
|
"workbox-routing": "^7.3.0",
|
|
@@ -61,16 +61,16 @@
|
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@svgr/webpack": "^8.1.0",
|
|
63
63
|
"@types/classnames": "^2.3.4",
|
|
64
|
-
"@types/react": "^19.1.
|
|
65
|
-
"@types/react-dom": "^19.1.
|
|
64
|
+
"@types/react": "^19.1.13",
|
|
65
|
+
"@types/react-dom": "^19.1.9",
|
|
66
66
|
"@types/react-highlight-words": "^0.20.0",
|
|
67
67
|
"@types/react-modal": "^3.16.3",
|
|
68
68
|
"@types/react-portal": "^4.0.7",
|
|
69
69
|
"@types/react-redux": "^7.1.34",
|
|
70
|
-
"@types/react-window": "^
|
|
70
|
+
"@types/react-window": "^2.0.0",
|
|
71
71
|
"@types/redux": "^3.6.31",
|
|
72
72
|
"@types/redux-saga": "^0.10.5",
|
|
73
|
-
"sass": "^1.
|
|
73
|
+
"sass": "^1.93.0"
|
|
74
74
|
},
|
|
75
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "ff8105e2d4e2fff5fffde35cbeaa40474c232599"
|
|
76
76
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
|
-
import { type
|
|
2
|
+
import { type FocusEventHandler, type MouseEventHandler, type ReactElement, useRef } from 'react';
|
|
3
3
|
import Highlighter from 'react-highlight-words';
|
|
4
|
+
import { type RowComponentProps } from 'react-window';
|
|
4
5
|
|
|
5
6
|
import { useAppLayout, useColumns } from 'hooks';
|
|
6
7
|
import { LOCALE_FEATURES } from 'i18n';
|
|
@@ -18,22 +19,17 @@ import { Cell } from './Cell';
|
|
|
18
19
|
import styles from './Results.module.scss';
|
|
19
20
|
import { type ResultData } from './types';
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
onClick = noop,
|
|
33
|
-
onFocus = noop,
|
|
34
|
-
onMouseEnter = noop,
|
|
35
|
-
onMouseLeave = noop,
|
|
36
|
-
} = data;
|
|
22
|
+
export const Result = ({
|
|
23
|
+
index,
|
|
24
|
+
highlightedIndex,
|
|
25
|
+
results = [],
|
|
26
|
+
onBlur = noop,
|
|
27
|
+
onClick = noop,
|
|
28
|
+
onFocus = noop,
|
|
29
|
+
onMouseEnter = noop,
|
|
30
|
+
onMouseLeave = noop,
|
|
31
|
+
style,
|
|
32
|
+
}: RowComponentProps<ResultData>): ReactElement => {
|
|
37
33
|
const { resultWordWidth } = useAppLayout();
|
|
38
34
|
const ref = useRef<HTMLButtonElement>(null);
|
|
39
35
|
const columns = useColumns();
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { useEffect, useMemo, type FunctionComponent } from 'react';
|
|
3
|
+
import { List, useListRef } from 'react-window';
|
|
4
4
|
import { useDebounce } from 'use-debounce';
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { useLatest } from 'hooks';
|
|
7
7
|
import { LOCALE_FEATURES } from 'i18n';
|
|
8
|
-
import {
|
|
8
|
+
import { RESULTS_ITEM_HEIGHT } from 'parameters';
|
|
9
9
|
import {
|
|
10
10
|
selectAreResultsOutdated,
|
|
11
|
-
selectSolveIsLoading,
|
|
12
11
|
selectLocale,
|
|
13
12
|
selectProcessedResults,
|
|
14
13
|
selectSolveError,
|
|
14
|
+
selectSolveIsLoading,
|
|
15
15
|
useTranslate,
|
|
16
16
|
useTypedSelector,
|
|
17
17
|
} from 'state';
|
|
@@ -36,7 +36,6 @@ const IS_LOADING_DEBOUNCE = 100;
|
|
|
36
36
|
|
|
37
37
|
export const Results: FunctionComponent<Props> = ({ callbacks, className, highlightedIndex }) => {
|
|
38
38
|
const translate = useTranslate();
|
|
39
|
-
const { resultsHeight, resultsWidth } = useAppLayout();
|
|
40
39
|
const locale = useTypedSelector(selectLocale);
|
|
41
40
|
const { direction } = LOCALE_FEATURES[locale];
|
|
42
41
|
const results = useTypedSelector(selectProcessedResults);
|
|
@@ -44,22 +43,25 @@ export const Results: FunctionComponent<Props> = ({ callbacks, className, highli
|
|
|
44
43
|
const [isLoadingDebounced] = useDebounce(isLoading, IS_LOADING_DEBOUNCE);
|
|
45
44
|
const isOutdated = useTypedSelector(selectAreResultsOutdated);
|
|
46
45
|
const error = useTypedSelector(selectSolveError);
|
|
47
|
-
const itemData = useMemo(
|
|
48
|
-
|
|
46
|
+
const itemData = useMemo<ResultData>(
|
|
47
|
+
() => ({ ...callbacks, highlightedIndex, results }),
|
|
48
|
+
[callbacks, highlightedIndex, results],
|
|
49
|
+
);
|
|
50
|
+
const listRef = useListRef(null);
|
|
49
51
|
const scrollToIndex = typeof highlightedIndex === 'number' ? highlightedIndex : 0;
|
|
50
52
|
const scrollToIndexRef = useLatest(scrollToIndex);
|
|
51
53
|
const hasResults = typeof error === 'undefined' && typeof results !== 'undefined';
|
|
52
54
|
const showInput = hasResults && results.length > 0 && !isOutdated;
|
|
53
|
-
const height = resultsHeight - RESULTS_HEADER_HEIGHT - (showInput ? TEXT_INPUT_HEIGHT : 0) - 2 * BORDER_WIDTH;
|
|
54
|
-
const width = resultsWidth - 2 * BORDER_WIDTH;
|
|
55
55
|
|
|
56
56
|
useEffect(() => {
|
|
57
57
|
// without setTimeout, the initial scrolling offset is calculated
|
|
58
58
|
// incorrectly, as the list is not fully rendered by the browser yet
|
|
59
59
|
const timeout = globalThis.setTimeout(() => {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
listRef.current?.scrollToRow({
|
|
61
|
+
align: 'center',
|
|
62
|
+
behavior: 'instant',
|
|
63
|
+
index: scrollToIndexRef.current,
|
|
64
|
+
});
|
|
63
65
|
}, 0);
|
|
64
66
|
|
|
65
67
|
return () => {
|
|
@@ -104,20 +106,17 @@ export const Results: FunctionComponent<Props> = ({ callbacks, className, highli
|
|
|
104
106
|
|
|
105
107
|
{!isOutdated && results.length > 0 && (
|
|
106
108
|
<div className={styles.listContainer}>
|
|
107
|
-
<
|
|
109
|
+
<List
|
|
108
110
|
className={classNames(styles.list, {
|
|
109
111
|
[styles.outdated]: isOutdated,
|
|
110
112
|
})}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
>
|
|
119
|
-
{Result}
|
|
120
|
-
</FixedSizeList>
|
|
113
|
+
dir={direction}
|
|
114
|
+
listRef={listRef}
|
|
115
|
+
rowComponent={Result}
|
|
116
|
+
rowCount={results.length}
|
|
117
|
+
rowHeight={RESULTS_ITEM_HEIGHT}
|
|
118
|
+
rowProps={itemData}
|
|
119
|
+
/>
|
|
121
120
|
</div>
|
|
122
121
|
)}
|
|
123
122
|
</>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=60,exports.ids=[60],exports.modules={119:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getWordListUs=t.getWordListGb=void 0;let i=r(9562),o=r(8335);t.getWordListGb=async()=>(0,o.getTxtWordList)("https://www.wordgamedictionary.com/sowpods/download/sowpods.txt",i.Locale.EN_GB),t.getWordListUs=async()=>(0,o.getTxtWordList)("https://www.wordgamedictionary.com/twl06/download/twl06.txt",i.Locale.EN_US)},184:(e,t,r)=>{r.d(t,{T:()=>i});let i=e=>({origin:e.headers.origin,referer:e.headers.referer,userAgent:e.headers["user-agent"],xForwardedFor:e.headers["x-forwarded-for"],xRealIp:e.headers["x-real-ip"]})},224:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.unique=void 0,t.unique=e=>Array.from(new Set(e))},294:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MemoryCache=void 0;let i=r(4960);class o{constructor(){this.cache={},this.cacheTimestamps={}}get(e){return Promise.resolve(this.cache[e])}getLastModifiedTimestamp(e){return this.cacheTimestamps[e]}has(e){return void 0!==this.cache[e]}isStale(e){let t=this.getLastModifiedTimestamp(e);if(this.has(e)&&void 0!==t)return Math.abs(t-Date.now())>i.CACHE_STALE_THRESHOLD}set(e,t){return this.cacheTimestamps[e]=Date.now(),this.cache[e]=t,Promise.resolve()}}t.MemoryCache=o},305:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getWordList=void 0;let i=r(9562),o=r(8335);t.getWordList=async()=>{let e=await (0,o.getTxtWordList)("https://raw.githubusercontent.com/Thecoolsim/French-Scrabble-ODS8/main/French%20ODS%20dictionary.txt",i.Locale.FR_FR);return(0,o.transliterateDiacritics)(e)}},413:function(e,t,r){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getWordList=void 0;let o=r(4217),n=i(r(9021)),s=r(9551),l=r(8335);t.getWordList=async()=>{let e=(0,l.getTempFilepath)(),t=await a("https://sjp.pl/sl/growy/"),r=await (0,l.downloadFile)(t);await (0,l.unzip)(r,"slowa.txt",e),n.default.unlinkSync(r);let i=n.default.readFileSync(e,"utf-8");return n.default.unlinkSync(e),(0,l.extractWords)(i.toLocaleString(),"pl-PL")};let a=async e=>{let t=u(await (0,l.downloadHtml)(e)),{href:r}=new s.URL(t,e);return r},u=e=>{let t=(0,o.load)(e),r=Array.from(t("a")).map(e=>t(e).attr("href")).filter(Boolean).find(e=>e.endsWith(".zip"));if(void 0===r)throw Error("Cannot find link to zip file on the page");return r}},457:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createAsyncProxy=void 0,t.createAsyncProxy=e=>{let t=null;return async()=>{if(t)return t;try{return t=e(),await t}finally{t=null}}}},743:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createCacheTimestampComparator=void 0,t.createCacheTimestampComparator=e=>(t,r)=>{let i=t.getLastModifiedTimestamp(e),o=r.getLastModifiedTimestamp(e);return i===o?0:void 0===i?1:void 0===o?-1:o-i}},928:function(e,t,r){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.DiskCache=void 0;let o=r(9362),n=i(r(9021)),s=r(4960),l=r(1356);class a{async get(e){if(!this.has(e))return;let t=(0,l.getDictionaryFilepath)(e),r=await n.default.promises.readFile(t,"utf-8");return o.Trie.deserialize(r)}getLastModifiedTimestamp(e){let t=(0,l.getDictionaryFilepath)(e);if(n.default.existsSync(t))return n.default.statSync(t).mtimeMs}has(e){let t=(0,l.getDictionaryFilepath)(e);return n.default.existsSync(t)}isStale(e){if(!this.has(e))return;let t=this.getLastModifiedTimestamp(e);if(void 0!==t)return Math.abs(t-Date.now())>s.CACHE_STALE_THRESHOLD}async set(e,t){let r=(0,l.getDictionaryFilepath)(e);await n.default.promises.writeFile(r,t.serialize())}}t.DiskCache=a},949:function(e,t,r){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Dictionaries=void 0;let o=r(7519),n=r(9562),s=i(r(9021)),l=r(4960),a=r(2655);class u{constructor(){this.cache=new a.LayeredCache,this.downloadDictionaryProxies=Object.fromEntries(Object.values(n.Locale).map(e=>[e,(0,a.createAsyncProxy)(()=>(0,a.downloadDictionary)(e))]))}async get(e){if(this.cache.has(e)){let t=await this.cache.get(e);if(t)return t}return o.logger.info("Dictionaries - cache miss",{locale:e}),this.updateDictionary(e)}remove(){s.default.rmdirSync(l.OUTPUT_DIRECTORY,{recursive:!0})}async update(e){let t=e?Object.values(n.Locale):this.getLocalesToUpdate();o.logger.info("Dictionaries - update",{force:e,locales:t}),await Promise.all(t.map(e=>this.updateDictionary(e)))}getLocalesToUpdate(){return Object.values(n.Locale).filter(e=>!1!==this.cache.isStale(e))}async updateDictionary(e){o.logger.info("Dictionaries - updateDictionary",{locale:e}),s.default.mkdirSync(l.OUTPUT_DIRECTORY,{recursive:!0});let t=this.downloadDictionaryProxies[e],r=await t();return await this.cache.set(e,r),r}}t.Dictionaries=u},1135:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getWordList=void 0;let i=r(9562),o=r(8335);t.getWordList=async()=>(0,o.getTxtWordList)("https://raw.githubusercontent.com/MansourM/persian-to-persian-dictionary/main/moein/words.txt",i.Locale.FA_IR)},1356:function(e,t,r){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getDictionaryFilepath=void 0;let o=i(r(9902)),n=r(4960);t.getDictionaryFilepath=e=>o.default.resolve(n.OUTPUT_DIRECTORY,`${e}.txt`)},1385:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WordDefinition=void 0;class r{constructor({definitions:e,exists:t,isAllowed:r,word:i}){this.definitions=e,this.exists=t,this.isAllowed=r,this.word=i}toJson(){return{definitions:this.definitions,exists:this.exists,isAllowed:this.isAllowed,word:this.word}}}t.WordDefinition=r,r.fromJson=e=>e?new r({definitions:e.definitions,exists:e.exists,isAllowed:e.isAllowed,word:e.word}):r.Null,r.Null=Object.freeze({definitions:[],exists:!1,isAllowed:!1,word:"",toJson:()=>null})},1513:function(e,t,r){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.logger=void 0;let o=i(r(9902)),n=r(5124),s=r(6220);t.logger=(0,n.createLogger)({level:"info",format:n.format.combine(n.format.timestamp({format:"YYYY-MM-DD HH:mm:ss"}),n.format.errors({stack:!0}),n.format.splat(),n.format.json(),n.format.prettyPrint()),transports:[new n.transports.File({filename:o.default.resolve(s.OUTPUT_DIRECTORY,"error.log"),level:"error"}),new n.transports.File({filename:o.default.resolve(s.OUTPUT_DIRECTORY,"all.log")}),new n.transports.Console({format:n.format.combine(n.format.colorize(),n.format.simple()),level:"error"})]})},1652:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isTileJson=void 0;let i=r(2143);t.isTileJson=e=>(0,i.isObject)(e)&&"string"==typeof e.character&&"boolean"==typeof e.isBlank},2143:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isObject=void 0,t.isObject=e=>"object"==typeof e&&null!==e},2248:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getWordList=void 0;let i=r(9562),o=r(8335);t.getWordList=async()=>{let e=await (0,o.getTxtWordList)("https://raw.githubusercontent.com/kamilmielnik/scrabble-dictionaries/master/romanian/loc-5.0.txt",i.Locale.RO_RO);return(0,o.transliterateDiacritics)(e)}},2250:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.downloadHtml=void 0;let i=r(1097);t.downloadHtml=e=>new Promise((t,r)=>{(e.startsWith("https")?i.https:i.http).get(e,e=>{let i="";e.setEncoding("utf8"),e.on("data",e=>{i+=e}),e.on("end",()=>{t(i)}),e.on("error",r)})})},2498:function(e,t,r){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getTempFilepath=void 0;let o=i(r(1820)),n=i(r(9902)),s=r(3839),l=n.default.resolve(o.default.homedir(),".scrabble-solver");t.getTempFilepath=()=>{let e=`${(0,s.getHash)()}.txt`;return n.default.join(l,e)}},2507:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getWordList=void 0;let i=r(9562),o=r(7511),n={[i.Locale.DE_DE]:o.german.getWordList,[i.Locale.EN_GB]:o.english.getWordListGb,[i.Locale.EN_US]:o.english.getWordListUs,[i.Locale.ES_ES]:o.spanish.getWordList,[i.Locale.FA_IR]:o.persian.getWordList,[i.Locale.FR_FR]:o.french.getWordList,[i.Locale.PL_PL]:o.polish.getWordList,[i.Locale.RO_RO]:o.romanian.getWordList,[i.Locale.TR_TR]:o.turkish.getWordList};t.getWordList=e=>n[e]()},2639:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getWordList=void 0;let i=r(9562),o=r(8335);t.getWordList=async()=>(0,o.getTxtWordList)("https://raw.githubusercontent.com/kamilmielnik/scrabble-dictionaries/master/turkish/kelimelik.txt",i.Locale.TR_TR)},2655:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MemoryCache=t.LayeredCache=t.getDictionaryFilepath=t.downloadDictionary=t.DiskCache=t.createCacheTimestampComparator=t.createAsyncProxy=void 0;var i=r(457);Object.defineProperty(t,"createAsyncProxy",{enumerable:!0,get:function(){return i.createAsyncProxy}});var o=r(743);Object.defineProperty(t,"createCacheTimestampComparator",{enumerable:!0,get:function(){return o.createCacheTimestampComparator}});var n=r(928);Object.defineProperty(t,"DiskCache",{enumerable:!0,get:function(){return n.DiskCache}});var s=r(9085);Object.defineProperty(t,"downloadDictionary",{enumerable:!0,get:function(){return s.downloadDictionary}});var l=r(1356);Object.defineProperty(t,"getDictionaryFilepath",{enumerable:!0,get:function(){return l.getDictionaryFilepath}});var a=r(6299);Object.defineProperty(t,"LayeredCache",{enumerable:!0,get:function(){return a.LayeredCache}});var u=r(294);Object.defineProperty(t,"MemoryCache",{enumerable:!0,get:function(){return u.MemoryCache}})},2680:(e,t)=>{var r;Object.defineProperty(t,"__esModule",{value:!0}),t.isLocale=t.Locale=void 0,function(e){e.DE_DE="de-DE",e.EN_GB="en-GB",e.EN_US="en-US",e.ES_ES="es-ES",e.FA_IR="fa-IR",e.FR_FR="fr-FR",e.PL_PL="pl-PL",e.RO_RO="ro-RO",e.TR_TR="tr-TR"}(r||(t.Locale=r={}));let i=Object.values(r);t.isLocale=e=>i.includes(e)},3471:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.extractWords=void 0;let i=r(5878);t.extractWords=(e,t)=>{let r=e.split(/\r?\n/g),o=(0,i.findFirstWordIndex)(r,t),n=[];for(let e=o;e<r.length;++e){let t=r[e].trim();t.length>0&&n.push(t.toLocaleLowerCase())}return n}},3728:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isBoardJson=void 0;let i=r(4784);t.isBoardJson=e=>{if(!Array.isArray(e))return!1;for(let t of e){if(!Array.isArray(e))return!1;for(let e of t)if(!(0,i.isCellJson)(e))return!1}return!0}},3734:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cell=void 0;let i=r(5722);class o{constructor({isEmpty:e=!0,tile:t=i.Tile.Null,x:r,y:o}){this.isEmpty=e,this.tile=t,this.x=r,this.y=o}clone(){return new o({isEmpty:this.isEmpty,tile:this.tile.clone(),x:this.x,y:this.y})}equals(e){return this.x===e.x&&this.y===e.y&&this.isEmpty===e.isEmpty&&this.tile.equals(e.tile)}hasTile(){return this.tile!==i.Tile.Null}isCandidate(){return this.isEmpty&&this.hasTile()}toJson(){return{isEmpty:this.isEmpty,tile:this.tile.toJson(),x:this.x,y:this.y}}toString(){return this.tile.toString()}}t.Cell=o,o.fromJson=e=>new o({isEmpty:e.isEmpty,tile:i.Tile.fromJson(e.tile),x:e.x,y:e.y})},3839:function(e,t,r){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getHash=void 0;let o=i(r(5511));t.getHash=(e=8)=>o.default.randomBytes(e).toString("hex")},4182:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Board=void 0;let i=r(4474),o=r(3734),n=r(5722);class s{static fromStringArray(e){return new s({rows:e.map((e,t)=>e.split("").map((e,r)=>new o.Cell({isEmpty:!e||e===i.EMPTY_CELL,tile:e===i.EMPTY_CELL?n.Tile.Null:new n.Tile({character:e}),x:r,y:t})))})}constructor({rows:e}){this.rows=e,this.columnsCount=e[0].length,this.rowsCount=e.length}get center(){let e=Math.floor(this.columnsCount/2),t=Math.floor(this.rowsCount/2);return this.rows[t][e]}clone(){return new s({rows:this.rows.map(e=>e.map(e=>e.clone()))})}collides(e){return this.collidesUp(e)||this.collidesDown(e)||this.collidesLeft(e)||this.collidesRight(e)}collidesDown({x:e,y:t}){return t<this.rowsCount-1&&!this.rows[t+1][e].isEmpty}collidesLeft({x:e,y:t}){return e>0&&!this.rows[t][e-1].isEmpty}collidesRight({x:e,y:t}){return e<this.columnsCount-1&&!this.rows[t][e+1].isEmpty}collidesUp({x:e,y:t}){return t>0&&!this.rows[t-1][e].isEmpty}equals(e){return this.columnsCount===e.columnsCount&&this.rowsCount===e.rowsCount&&this.rows.every((t,r)=>t.every((t,i)=>t.equals(e.rows[r][i])))}getBlanksCount(){return this.rows.reduce((e,t)=>e+t.reduce((e,t)=>e+ +!!t.tile.isBlank,0),0)}getColumn(e){return this.rows.map(t=>t[e])}getRow(e){return this.rows[e]}getTilesCount(){return this.rows.reduce((e,t)=>e+t.reduce((e,t)=>e+ +!!t.hasTile(),0),0)}getWords(){return[...a(this.rows),...a(l(this.rows))]}isEmpty(){return this.rows.every(e=>e.every(({isEmpty:e})=>e))}toJson(){return this.rows.map(e=>e.map(e=>e.toJson()))}toString(){return this.rows.map(e=>e.map(String).join("")).join("\n")}updateCell(e,t,r){this.rows[t][e]=r(this.rows[t][e])}updateRow(e,t){this.rows[e]=t(this.rows[e])}}t.Board=s,s.create=(e,t)=>{let r=Array(t),i=Array(e).fill(" ").join(""),o=r.fill(i);return s.fromStringArray(o)},s.fromJson=e=>new s({rows:e.map(e=>e.map(o.Cell.fromJson))});let l=e=>{let t=e.length,r=e[0].length,i=Array(r).fill(null).map(()=>Array(t));for(let o=0;o<t;++o)for(let t=0;t<r;++t)i[t][o]=e[o][t];return i},a=e=>{let t=[];for(let r of e){let e=[];for(let i of r)i.isEmpty?e.length>0&&(e.length>1&&t.push(u(e)),e=[]):e.push(i);e.length>1&&t.push(u(e))}return t},u=e=>e.map(e=>e.tile.character).join("")},4392:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CharacterBonus=void 0;let i=r(4474),o=r(7103);class n extends o.Bonus{constructor(){super(...arguments),this.type=i.BONUS_CHARACTER}canApply(e,t){return super.canApply(e,t)&&this.matchesCellTileScore(e,t)}matchesCellTileScore(e,t){return void 0===this.score||this.score===e.pointsMap[t.tile.character]}get value(){return{characterMultiplier:this.multiplier,wordMultiplier:1}}}t.CharacterBonus=n},4409:(e,t,r)=>{e.exports=r(838)},4474:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.VOWELS=t.CONSONANTS=t.NO_BONUS=t.EMPTY_CELL=t.BONUS_WORD=t.BONUS_CHARACTER=t.BLANK=t.COMMA_LATIN=t.COMMA_ARABIC=void 0,t.COMMA_ARABIC="،",t.COMMA_LATIN=",",t.BLANK=" ",t.BONUS_CHARACTER="BONUS_CHARACTER",t.BONUS_WORD="BONUS_WORD",t.EMPTY_CELL=" ",t.NO_BONUS={characterMultiplier:1,wordMultiplier:1},t.CONSONANTS="bc\xe7ćdfgğhjklłmnń\xf1pqrsşśtvwxzźż".split(""),t.VOWELS="aą\xe4eęio\xf3\xf6u\xfcyı".split("")},4600:(e,t)=>{Object.defineProperty(t,"A",{enumerable:!0,get:function(){return r}});var r=function(e){return e.PAGES="PAGES",e.PAGES_API="PAGES_API",e.APP_PAGE="APP_PAGE",e.APP_ROUTE="APP_ROUTE",e.IMAGE="IMAGE",e}({})},4784:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isCellJson=void 0;let i=r(2143),o=r(1652);t.isCellJson=e=>(0,i.isObject)(e)&&"boolean"==typeof e.isEmpty&&((0,o.isTileJson)(e.tile)||null===e.tile)&&"number"==typeof e.x&&"number"==typeof e.y},4960:function(e,t,r){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.OUTPUT_DIRECTORY=t.CACHE_STALE_THRESHOLD=t.DAY=void 0;let o=i(r(1820)),n=i(r(9902));t.DAY=864e5,t.CACHE_STALE_THRESHOLD=+t.DAY,t.OUTPUT_DIRECTORY=n.default.resolve(o.default.homedir(),".scrabble-solver","dictionaries")},5145:function(e,t,r){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getTxtWordList=void 0;let o=i(r(9021)),n=r(7279),s=r(3471);t.getTxtWordList=async(e,t)=>{let r=await (0,n.downloadFile)(e),i=o.default.readFileSync(r,"utf-8"),l=(0,s.extractWords)(i.toLocaleString(),t);return o.default.unlinkSync(r),l}},5722:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Tile=void 0;let i=r(4474);class o{constructor({character:e,isBlank:t=!1}){this.character=e,this.isBlank=t}clone(){return new o({character:this.character,isBlank:this.isBlank})}equals(e){return this.character===e.character&&this.isBlank===e.isBlank}toJson(){return{character:this.character,isBlank:this.isBlank}}toString(){return this.character}}t.Tile=o,o.fromJson=e=>e?new o({character:e.character,isBlank:e.isBlank}):o.Null,o.Null=Object.freeze({character:i.EMPTY_CELL,isBlank:!1,clone:()=>o.Null,equals:e=>e===o.Null,toJson:()=>null,toString:()=>i.EMPTY_CELL})},5776:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;let i=r(4474),o=r(4392),n=r(7699);class s{constructor(e){this.bonuses=l(e),this.config=e,this.pointsMap=u(this.config)}get alphabet(){return a(this.config)}get bingo(){return this.config.bingo}get blankScore(){return this.config.blankScore}get blanksCount(){return this.config.blanksCount}get boardHeight(){return this.config.boardHeight}get boardWidth(){return this.config.boardWidth}get game(){return this.config.game}get locale(){return this.config.locale}get twoCharacterTiles(){return this.config.tiles.filter(e=>2===e.character.length).map(e=>e.character)}getCellBonus(e){return this.bonuses.find(t=>t.matchesCellCoordinates(e))}getCellBonusValue(e){return this.getCellBonus(e)?.value||i.NO_BONUS}getCharacterPoints(e){if(null!==e)return e===i.BLANK?this.blankScore:this.pointsMap[e]}getTwoCharacterTileByPrefix(e){if(1===e.length)return this.twoCharacterTiles.find(t=>t.startsWith(e))}getTilePoints(e){if(null!==e)return e.isBlank?this.blankScore:this.getCharacterPoints(e.character)}hasCharacter(e){return e in this.pointsMap}isTwoCharacterTilePrefix(e){return void 0!==this.getTwoCharacterTileByPrefix(e)}get rackSize(){return this.config.rackSize}get supportsRemainingTiles(){return this.tiles.every(e=>"number"==typeof e.count)}get tiles(){return this.config.tiles}toJson(){return this.config}}t.Config=s,s.fromJson=e=>new s(e);let l=e=>e.bonuses.map(e=>{if(e.type===i.BONUS_CHARACTER)return new o.CharacterBonus(e);if(e.type===i.BONUS_WORD)return new n.WordBonus(e);throw Error(`Unsupported Bonus type: "${e.type}"`)}),a=e=>e.tiles.map(({character:e})=>e),u=e=>e.tiles.reduce((e,{character:t,score:r})=>({...e,[t]:r}),{})},5878:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.findFirstWordIndex=void 0,t.findFirstWordIndex=(e,t)=>{let r=e.findIndex((e,r)=>{let i=e[r+1]||"",o=e.localeCompare(i,t)>0,n=!!e.match(/\s/);return 0!==e.trim().length&&!n&&o});if(void 0===r)throw Error("Cannot find index of the first word in the file");return r}},6182:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.VerticalPattern=void 0;let i=r(9660);class o extends i.Pattern{clone(){return new o(this.board,this.cells.map(e=>e.clone()))}getCollisions(){let e=[];return this.cells.filter(e=>e.isEmpty&&(this.board.collidesLeft(e)||this.board.collidesRight(e))).forEach(t=>{let r=this.board.getRow(t.y),o=t.x-1;for(;o>=0&&r[o].hasTile();)--o;let n=r.slice(o+1,t.x);for(o=t.x+1;o<r.length&&r[o].hasTile();)++o;let s=r.slice(t.x+1,o),l=[...n,t,...s];if(l.length>1){let t=new i.Pattern(this.board,l);e.push(t)}}),e}}t.VerticalPattern=o},6220:function(e,t,r){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.OUTPUT_DIRECTORY=void 0;let o=i(r(1820));t.OUTPUT_DIRECTORY=i(r(9902)).default.resolve(o.default.homedir(),".scrabble-solver","logs")},6289:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.transliterateDiacritics=void 0;let i=r(6605),o=r(224);t.transliterateDiacritics=(e,t)=>(0,o.unique)(e.map(e=>(0,i.transliterate)(e,t)))},6299:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LayeredCache=void 0;let i=r(743),o=r(928),n=r(294);class s{constructor(){this.layers=[new n.MemoryCache,new o.DiskCache]}async get(e){let t=this.getLastModifiedLayer(e);if(!t)return Promise.resolve(void 0);let[r,i]=this.layers,o=await t.get(e);return t===i&&void 0!==o&&await r.set(e,o),o}getLastModifiedTimestamp(e){let t=this.getLastModifiedLayer(e);if(t)return t.getLastModifiedTimestamp(e)}has(e){return this.layers.some(t=>t.has(e))}isStale(e){return!!this.layers.some(t=>t.isStale(e))||!!this.layers.every(t=>void 0===t.isStale(e))&&void 0}async set(e,t){let[r,i]=this.layers;await i.set(e,t),await r.set(e,t)}getLastModifiedLayer(e){let[t]=[...this.layers.filter(t=>t.has(e))].sort((0,i.createCacheTimestampComparator)(e));return t}}t.LayeredCache=s},6440:(e,t)=>{Object.defineProperty(t,"M",{enumerable:!0,get:function(){return function e(t,r){return r in t?t[r]:"then"in t&&"function"==typeof t.then?t.then(t=>e(t,r)):"function"==typeof t&&"default"===r?t:void 0}}})},7055:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isMultiplierBingo=t.isScoreBingo=t.isBingo=void 0;let i=r(2143);t.isBingo=e=>(0,t.isScoreBingo)(e)||(0,t.isMultiplierBingo)(e),t.isScoreBingo=e=>(0,i.isObject)(e)&&"score"in e&&"number"==typeof e.score,t.isMultiplierBingo=e=>(0,i.isObject)(e)&&"multiplier"in e&&"number"==typeof e.multiplier},7103:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Bonus=void 0;class r{constructor({multiplier:e,score:t,x:r,y:i}){this.multiplier=e,this.score=t,this.x=r,this.y=i}canApply(e,t){return t.isEmpty&&this.matchesCellCoordinates(t)}matchesCellCoordinates(e){return this.x===e.x&&this.y===e.y}toJson(){return{multiplier:this.multiplier,score:this.score,type:this.type,x:this.x,y:this.y}}get value(){return{characterMultiplier:1,wordMultiplier:1}}}t.Bonus=r},7279:function(e,t,r){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.downloadFile=void 0;let o=r(1097),n=i(r(9021)),s=r(2498);t.downloadFile=e=>new Promise((t,r)=>{let i=(0,s.getTempFilepath)(),l=e.startsWith("https")?o.https:o.http,a=n.default.createWriteStream(i);l.get(e,o=>{if(void 0===o.statusCode||o.statusCode>=400)return void r(Error(`Cannot download file: ${e}`));o.on("error",e=>{a.close(),r(e)}),o.on("end",()=>{a.on("finish",()=>{a.close(),t(i)})}),o.pipe(a)}).on("error",e=>{a.close(),r(e)})})},7475:function(e,t,r){var i=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var o=Object.getOwnPropertyDescriptor(t,r);(!o||("get"in o?!t.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,o)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),o=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||i(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.getWordList=void 0;var n=r(2507);Object.defineProperty(t,"getWordList",{enumerable:!0,get:function(){return n.getWordList}}),o(r(7511),t),o(r(8335),t)},7511:function(e,t,r){var i,o=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var o=Object.getOwnPropertyDescriptor(t,r);(!o||("get"in o?!t.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,o)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),s=this&&this.__importStar||(i=function(e){return(i=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t})(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=i(e),s=0;s<r.length;s++)"default"!==r[s]&&o(t,e,r[s]);return n(t,e),t});Object.defineProperty(t,"__esModule",{value:!0}),t.turkish=t.spanish=t.romanian=t.polish=t.persian=t.french=t.german=t.english=void 0,t.english=s(r(119)),t.german=s(r(7779)),t.french=s(r(305)),t.persian=s(r(1135)),t.polish=s(r(413)),t.romanian=s(r(2248)),t.spanish=s(r(9287)),t.turkish=s(r(2639))},7519:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.logger=void 0;var i=r(1513);Object.defineProperty(t,"logger",{enumerable:!0,get:function(){return i.logger}})},7605:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Result=void 0;let i=r(4474),o=r(3734);class n{constructor({cells:e,id:t,collisions:r,points:i}){let o=c(e);this.blanksCount=s(o).length,this.cells=e,this.collisions=r,this.consonantsCount=l(o).length,this.id=t,this.length=e.length,this.points=i,this.pointsRatio=u(o,i),this.tiles=o,this.tilesCount=o.length,this.vowelsCount=a(o).length,this.word=d(e),this.words=h(e,r),this.wordsCount=1+this.collisions.length}toJson(){return{cells:this.cells.map(e=>e.toJson()),id:this.id,collisions:this.collisions.map(e=>e.map(e=>e.toJson())),points:this.points}}isHorizontal(){return this.cells[0].y===this.cells[1].y}isVertical(){return this.cells[0].x===this.cells[1].x}}t.Result=n,n.fromJson=e=>new n({id:e.id,cells:e.cells.map(o.Cell.fromJson),collisions:e.collisions.map(e=>e.map(o.Cell.fromJson)),points:e.points});let s=e=>e.filter(({isBlank:e})=>e),l=e=>e.filter(f),a=e=>e.filter(p),u=(e,t)=>t/e.length,c=e=>e.filter(({isEmpty:e})=>e).map(({tile:e})=>e),d=e=>e.reduce((e,t)=>e+t.toString(),""),h=(e,t)=>[e,...t].map(d),f=({character:e,isBlank:t})=>i.CONSONANTS.includes(e)&&!t,p=({character:e,isBlank:t})=>i.VOWELS.includes(e)&&!t},7699:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WordBonus=void 0;let i=r(4474),o=r(7103);class n extends o.Bonus{constructor(){super(...arguments),this.type=i.BONUS_WORD}get value(){return{characterMultiplier:1,wordMultiplier:this.multiplier}}}t.WordBonus=n},7715:function(e,t,r){var i=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var o=Object.getOwnPropertyDescriptor(t,r);(!o||("get"in o?!t.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,o)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),o=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||i(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.dictionaries=void 0;let n=r(949);o(r(2655),t),t.dictionaries=new n.Dictionaries},7779:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getWordList=void 0;let i=r(9562),o=r(8335);t.getWordList=async()=>(0,o.getTxtWordList)("https://raw.githubusercontent.com/hippler/german-wordlist/master/words.txt",i.Locale.DE_DE)},8144:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HorizontalPattern=void 0;let i=r(9660);class o extends i.Pattern{clone(){return new o(this.board,this.cells.map(e=>e.clone()))}getCollisions(){let e=[];return this.cells.filter(e=>e.isEmpty&&(this.board.collidesUp(e)||this.board.collidesDown(e))).forEach(t=>{let r=this.board.getColumn(t.x),o=t.y-1;for(;o>=0&&r[o].hasTile();)--o;let n=r.slice(o+1,t.y);for(o=t.y+1;o<r.length&&r[o].hasTile();)++o;let s=r.slice(t.y+1,o),l=[...n,t,...s];if(l.length>1){let t=new i.Pattern(this.board,l);e.push(t)}}),e}}t.HorizontalPattern=o},8335:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.unzip=t.unique=t.transliterateDiacritics=t.getTxtWordList=t.getTempFilepath=t.getHash=t.findFirstWordIndex=t.extractWords=t.downloadHtml=t.downloadFile=void 0;var i=r(7279);Object.defineProperty(t,"downloadFile",{enumerable:!0,get:function(){return i.downloadFile}});var o=r(2250);Object.defineProperty(t,"downloadHtml",{enumerable:!0,get:function(){return o.downloadHtml}});var n=r(3471);Object.defineProperty(t,"extractWords",{enumerable:!0,get:function(){return n.extractWords}});var s=r(5878);Object.defineProperty(t,"findFirstWordIndex",{enumerable:!0,get:function(){return s.findFirstWordIndex}});var l=r(3839);Object.defineProperty(t,"getHash",{enumerable:!0,get:function(){return l.getHash}});var a=r(2498);Object.defineProperty(t,"getTempFilepath",{enumerable:!0,get:function(){return a.getTempFilepath}});var u=r(5145);Object.defineProperty(t,"getTxtWordList",{enumerable:!0,get:function(){return u.getTxtWordList}});var c=r(6289);Object.defineProperty(t,"transliterateDiacritics",{enumerable:!0,get:function(){return c.transliterateDiacritics}});var d=r(224);Object.defineProperty(t,"unique",{enumerable:!0,get:function(){return d.unique}});var h=r(9321);Object.defineProperty(t,"unzip",{enumerable:!0,get:function(){return h.unzip}})},8368:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FinalPattern=void 0;let i=r(9660);class o extends i.Pattern{constructor(e){super(e.board,e.cells),this.collisions=e.getCollisions()}getCollisions(){return this.collisions}}t.FinalPattern=o},8612:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isError=void 0;let i=r(2143);t.isError=e=>!!(0,i.isObject)(e)&&"string"==typeof e.message},8852:(e,t)=>{var r;Object.defineProperty(t,"__esModule",{value:!0}),t.isGame=t.Game=void 0,function(e){e.Kelimelik="kelimelik",e.LetterLeague="letter-league",e.Literaki="literaki",e.Scrabble="scrabble",e.ScrabbleDuel="scrabble-duel",e.SuperScrabble="super-scrabble"}(r||(t.Game=r={}));let i=Object.values(r);t.isGame=e=>i.includes(e)},9085:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.downloadDictionary=void 0;let i=r(9362),o=r(7519),n=r(7475);t.downloadDictionary=async e=>{o.logger.info("downloadDictionary",{locale:e});let t=await (0,n.getWordList)(e);return o.logger.info("downloadDictionary - success",{locale:e}),i.Trie.fromArray(t)}},9287:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getWordList=void 0;let i=r(9562),o=r(8335);t.getWordList=async()=>{let e=await (0,o.getTxtWordList)("https://raw.githubusercontent.com/kamilmielnik/scrabble-dictionaries/master/spanish/file-2017.txt",i.Locale.ES_ES);return(0,o.transliterateDiacritics)(e,{ignore:["\xf1"]})}},9321:function(e,t,r){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.unzip=void 0;let o=i(r(9021)),n=i(r(2029));t.unzip=(e,t,r)=>o.default.createReadStream(e).pipe(n.default.Parse()).on("entry",e=>{e.path===t?e.pipe(o.default.createWriteStream(r)):e.autodrain()}).promise()},9562:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WordDefinition=t.WordBonus=t.VerticalPattern=t.isTileJson=t.Tile=t.Result=t.Pattern=t.Locale=t.isLocale=t.isObject=t.isError=t.HorizontalPattern=t.isGame=t.Game=t.FinalPattern=t.Config=t.CharacterBonus=t.isCellJson=t.Cell=t.Bonus=t.isBoardJson=t.Board=t.isScoreBingo=t.isMultiplierBingo=t.isBingo=void 0;var i=r(7055);Object.defineProperty(t,"isBingo",{enumerable:!0,get:function(){return i.isBingo}}),Object.defineProperty(t,"isMultiplierBingo",{enumerable:!0,get:function(){return i.isMultiplierBingo}}),Object.defineProperty(t,"isScoreBingo",{enumerable:!0,get:function(){return i.isScoreBingo}});var o=r(4182);Object.defineProperty(t,"Board",{enumerable:!0,get:function(){return o.Board}});var n=r(3728);Object.defineProperty(t,"isBoardJson",{enumerable:!0,get:function(){return n.isBoardJson}});var s=r(7103);Object.defineProperty(t,"Bonus",{enumerable:!0,get:function(){return s.Bonus}});var l=r(3734);Object.defineProperty(t,"Cell",{enumerable:!0,get:function(){return l.Cell}});var a=r(4784);Object.defineProperty(t,"isCellJson",{enumerable:!0,get:function(){return a.isCellJson}});var u=r(4392);Object.defineProperty(t,"CharacterBonus",{enumerable:!0,get:function(){return u.CharacterBonus}});var c=r(5776);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return c.Config}});var d=r(8368);Object.defineProperty(t,"FinalPattern",{enumerable:!0,get:function(){return d.FinalPattern}});var h=r(8852);Object.defineProperty(t,"Game",{enumerable:!0,get:function(){return h.Game}}),Object.defineProperty(t,"isGame",{enumerable:!0,get:function(){return h.isGame}});var f=r(8144);Object.defineProperty(t,"HorizontalPattern",{enumerable:!0,get:function(){return f.HorizontalPattern}});var p=r(8612);Object.defineProperty(t,"isError",{enumerable:!0,get:function(){return p.isError}});var g=r(2143);Object.defineProperty(t,"isObject",{enumerable:!0,get:function(){return g.isObject}});var m=r(2680);Object.defineProperty(t,"isLocale",{enumerable:!0,get:function(){return m.isLocale}}),Object.defineProperty(t,"Locale",{enumerable:!0,get:function(){return m.Locale}});var y=r(9660);Object.defineProperty(t,"Pattern",{enumerable:!0,get:function(){return y.Pattern}});var b=r(7605);Object.defineProperty(t,"Result",{enumerable:!0,get:function(){return b.Result}});var _=r(5722);Object.defineProperty(t,"Tile",{enumerable:!0,get:function(){return _.Tile}});var v=r(1652);Object.defineProperty(t,"isTileJson",{enumerable:!0,get:function(){return v.isTileJson}});var O=r(6182);Object.defineProperty(t,"VerticalPattern",{enumerable:!0,get:function(){return O.VerticalPattern}});var P=r(7699);Object.defineProperty(t,"WordBonus",{enumerable:!0,get:function(){return P.WordBonus}});var w=r(1385);Object.defineProperty(t,"WordDefinition",{enumerable:!0,get:function(){return w.WordDefinition}})},9660:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Pattern=void 0;class r{constructor(e,t){this.board=e,this.cells=t}canBePlaced(e){let t=this.getEmptyCellsCount();return t>=1&&t<=e.rackSize&&(this.hasAtLeast1NonEmptyCell()||this.collides()||this.goesThroughBoardCenter()&&this.board.isEmpty())}clone(){return new r(this.board,this.cells.map(e=>e.clone()))}collides(){return this.cells.some(e=>e.isEmpty&&this.board.collides(e))}getIndexOfFirstCellWithoutTile(){return this.cells.findIndex(e=>!e.hasTile())}getEmptyCellsCount(){return this.cells.filter(e=>e.isEmpty).length}goesThroughBoardCenter(){return this.cells.some(e=>e.x===this.board.center.x&&e.y===this.board.center.y&&e.isEmpty)}hasAtLeast1EmptyCell(){return this.cells.some(e=>e.isEmpty)}hasAtLeast1NonEmptyCell(){return this.cells.some(e=>!e.isEmpty)}getCollisions(){return[]}toJson(){return{cells:this.cells.map(e=>e.toJson()),collisions:this.getCollisions().map(e=>e.toJson()),word:this.toString()}}toString(){return this.cells.reduce((e,t)=>e+t.toString(),"")}}t.Pattern=r}};
|