@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.
Files changed (77) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +15 -15
  3. package/.next/cache/.previewinfo +1 -0
  4. package/.next/cache/.rscinfo +1 -1
  5. package/.next/cache/.tsbuildinfo +1 -1
  6. package/.next/cache/webpack/client-production/0.pack +0 -0
  7. package/.next/cache/webpack/client-production/index.pack +0 -0
  8. package/.next/cache/webpack/client-production/index.pack.old +0 -0
  9. package/.next/cache/webpack/edge-server-production/0.pack +0 -0
  10. package/.next/cache/webpack/edge-server-production/index.pack +0 -0
  11. package/.next/cache/webpack/edge-server-production/index.pack.old +0 -0
  12. package/.next/cache/webpack/server-production/0.pack +0 -0
  13. package/.next/cache/webpack/server-production/index.pack +0 -0
  14. package/.next/cache/webpack/server-production/index.pack.old +0 -0
  15. package/.next/diagnostics/framework.json +1 -1
  16. package/.next/next-minimal-server.js.nft.json +1 -1
  17. package/.next/next-server.js.nft.json +1 -1
  18. package/.next/prerender-manifest.json +4 -4
  19. package/.next/required-server-files.json +23 -14
  20. package/.next/routes-manifest.json +11 -7
  21. package/.next/server/chunks/30.js +4 -4
  22. package/.next/server/chunks/318.js +1 -1
  23. package/.next/server/chunks/717.js +1 -0
  24. package/.next/server/chunks/791.js +19 -0
  25. package/.next/server/chunks/812.js +1 -1
  26. package/.next/server/chunks/829.js +1 -0
  27. package/.next/server/chunks/929.js +1 -0
  28. package/.next/server/middleware-build-manifest.js +1 -1
  29. package/.next/server/pages/404.html +1 -1
  30. package/.next/server/pages/404.js.nft.json +1 -1
  31. package/.next/server/pages/500.html +1 -1
  32. package/.next/server/pages/_app.js +1 -1
  33. package/.next/server/pages/_app.js.nft.json +1 -1
  34. package/.next/server/pages/_document.js +1 -1
  35. package/.next/server/pages/_document.js.nft.json +1 -1
  36. package/.next/server/pages/_error.js +1 -1
  37. package/.next/server/pages/_error.js.nft.json +1 -1
  38. package/.next/server/pages/api/dictionary/[locale]/[word].js +2 -2
  39. package/.next/server/pages/api/dictionary/[locale]/[word].js.nft.json +1 -1
  40. package/.next/server/pages/api/dictionary/[locale].js +1 -1
  41. package/.next/server/pages/api/dictionary/[locale].js.nft.json +1 -1
  42. package/.next/server/pages/api/solve.js +1 -1
  43. package/.next/server/pages/api/solve.js.nft.json +1 -1
  44. package/.next/server/pages/api/verify.js +1 -1
  45. package/.next/server/pages/api/verify.js.nft.json +1 -1
  46. package/.next/server/pages/api/visit.js +1 -1
  47. package/.next/server/pages/api/visit.js.nft.json +1 -1
  48. package/.next/server/pages/index.html +1 -1
  49. package/.next/server/pages/index.js +1 -1
  50. package/.next/server/pages/index.js.nft.json +1 -1
  51. package/.next/server/pages/index.json +1 -1
  52. package/.next/server/webpack-api-runtime.js +1 -1
  53. package/.next/server/webpack-runtime.js +1 -1
  54. package/.next/static/{X6ny8arpUxpRCZ4OMm7Vo → UHBG2hxudxuZNMubluQ6A}/_buildManifest.js +1 -1
  55. package/.next/static/chunks/framework-e4d8bdda7b6c00b3.js +1 -0
  56. package/.next/static/chunks/main-40732898df2b5947.js +1 -0
  57. package/.next/static/chunks/pages/404-3ab23f01145bda71.js +1 -0
  58. package/.next/static/chunks/pages/_app-ca98ddb1c33cb8b1.js +1 -0
  59. package/.next/static/chunks/pages/{_error-7ea2d37f66343175.js → _error-e7f663d1e0f43380.js} +1 -1
  60. package/.next/static/chunks/pages/index-5c4af5351329bef5.js +1 -0
  61. package/.next/static/css/d611d31bf52b6e25.css +2 -0
  62. package/.next/trace +24 -23
  63. package/.next/types/routes.d.ts +57 -0
  64. package/.next/types/validator.ts +107 -0
  65. package/next-env.d.ts +1 -0
  66. package/package.json +21 -21
  67. package/src/components/Results/Result.tsx +13 -17
  68. package/src/components/Results/Results.tsx +23 -24
  69. package/.next/server/chunks/60.js +0 -1
  70. package/.next/server/chunks/974.js +0 -1
  71. package/.next/static/chunks/framework-57125a0cc6749ff9.js +0 -1
  72. package/.next/static/chunks/main-03618e8bd3cd04dd.js +0 -1
  73. package/.next/static/chunks/pages/404-18b9f6f5faa91442.js +0 -1
  74. package/.next/static/chunks/pages/_app-2378fe90e1762e8c.js +0 -1
  75. package/.next/static/chunks/pages/index-bfc599d9351773ae.js +0 -1
  76. package/.next/static/css/1fae874a25934f54.css +0 -2
  77. /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.12",
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.9",
28
+ "@floating-ui/react": "^0.27.16",
29
29
  "@kamilmielnik/trie": "^4.0.0",
30
- "@reduxjs/toolkit": "^2.8.2",
31
- "@scrabble-solver/configs": "^2.15.12",
32
- "@scrabble-solver/constants": "^2.15.12",
33
- "@scrabble-solver/dictionaries": "^2.15.12",
34
- "@scrabble-solver/logger": "^2.15.12",
35
- "@scrabble-solver/solver": "^2.15.12",
36
- "@scrabble-solver/types": "^2.15.12",
37
- "@scrabble-solver/word-definitions": "^2.15.12",
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": "^10.1.0",
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.2",
42
+ "next": "^15.5.3",
43
43
  "normalize.css": "^8.0.1",
44
- "react": "^19.1.0",
44
+ "react": "^19.1.1",
45
45
  "react-cool-onclickoutside": "^1.7.0",
46
- "react-dom": "^19.1.0",
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.8.11",
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.4",
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.5",
65
- "@types/react-dom": "^19.1.5",
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": "^1.8.8",
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.89.0"
73
+ "sass": "^1.93.0"
74
74
  },
75
- "gitHead": "1eeef2b2975e63b195885dd2636c53624d300c6b"
75
+ "gitHead": "ff8105e2d4e2fff5fffde35cbeaa40474c232599"
76
76
  }
@@ -1,6 +1,7 @@
1
1
  import classNames from 'classnames';
2
- import { type CSSProperties, type FocusEventHandler, type MouseEventHandler, type ReactElement, useRef } from 'react';
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
- interface Props {
22
- data: ResultData;
23
- index: number;
24
- style?: CSSProperties;
25
- }
26
-
27
- export const Result = ({ data, index, style }: Props): ReactElement => {
28
- const {
29
- highlightedIndex,
30
- results = [],
31
- onBlur = noop,
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 { type FunctionComponent, useEffect, useMemo, useState } from 'react';
3
- import { FixedSizeList } from 'react-window';
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 { useAppLayout, useLatest } from 'hooks';
6
+ import { useLatest } from 'hooks';
7
7
  import { LOCALE_FEATURES } from 'i18n';
8
- import { BORDER_WIDTH, RESULTS_HEADER_HEIGHT, RESULTS_ITEM_HEIGHT, TEXT_INPUT_HEIGHT } from 'parameters';
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(() => ({ ...callbacks, highlightedIndex, results }), [callbacks, highlightedIndex, results]);
48
- const [listRef, setListRef] = useState<FixedSizeList<ResultData> | null>(null);
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
- if (listRef) {
61
- listRef.scrollToItem(scrollToIndexRef.current, 'center');
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
- <FixedSizeList
109
+ <List
108
110
  className={classNames(styles.list, {
109
111
  [styles.outdated]: isOutdated,
110
112
  })}
111
- direction={direction}
112
- height={height}
113
- itemCount={results.length}
114
- itemData={itemData}
115
- itemSize={RESULTS_ITEM_HEIGHT}
116
- ref={setListRef}
117
- width={width}
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}};