scrabble-solver 2.13.2 → 2.13.4

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 (141) hide show
  1. package/.github/workflows/build.yml +3 -4
  2. package/.github/workflows/eslint.yml +1 -1
  3. package/.github/workflows/test.yml +1 -2
  4. package/.nx/cache/file-map.json +2610 -0
  5. package/.nx/cache/lockfile.hash +1 -0
  6. package/.nx/cache/nx_files.nxt +0 -0
  7. package/.nx/cache/parsed-lock-file.json +32593 -0
  8. package/.nx/cache/project-graph.json +32416 -0
  9. package/README.md +7 -7
  10. package/lerna.json +1 -1
  11. package/package.json +36 -29
  12. package/packages/configs/package.json +4 -5
  13. package/packages/constants/package.json +2 -3
  14. package/packages/dictionaries/package-lock.json +2 -2
  15. package/packages/dictionaries/package.json +5 -6
  16. package/packages/logger/package-lock.json +15 -7
  17. package/packages/logger/package.json +3 -4
  18. package/packages/scrabble-solver/.next/BUILD_ID +1 -1
  19. package/packages/scrabble-solver/.next/build-manifest.json +16 -16
  20. package/packages/scrabble-solver/.next/cache/.tsbuildinfo +1 -1
  21. package/packages/scrabble-solver/.next/cache/eslint/.cache_8dgz12 +1 -1
  22. package/packages/scrabble-solver/.next/cache/webpack/client-production/0.pack +0 -0
  23. package/packages/scrabble-solver/.next/cache/webpack/client-production/index.pack +0 -0
  24. package/packages/scrabble-solver/.next/cache/webpack/edge-server-production/0.pack +0 -0
  25. package/packages/scrabble-solver/.next/cache/webpack/edge-server-production/index.pack +0 -0
  26. package/packages/scrabble-solver/.next/cache/webpack/server-production/0.pack +0 -0
  27. package/packages/scrabble-solver/.next/cache/webpack/server-production/index.pack +0 -0
  28. package/packages/scrabble-solver/.next/next-minimal-server.js.nft.json +1 -0
  29. package/packages/scrabble-solver/.next/next-server.js.nft.json +1 -1
  30. package/packages/scrabble-solver/.next/prerender-manifest.js +1 -0
  31. package/packages/scrabble-solver/.next/prerender-manifest.json +1 -1
  32. package/packages/scrabble-solver/.next/required-server-files.json +1 -1
  33. package/packages/scrabble-solver/.next/routes-manifest.json +1 -1
  34. package/packages/scrabble-solver/.next/server/InjectManifest.js.nft.json +1 -1
  35. package/packages/scrabble-solver/.next/server/chunks/28.js +1 -0
  36. package/packages/scrabble-solver/.next/server/chunks/331.js +6 -0
  37. package/packages/scrabble-solver/.next/server/chunks/577.js +1 -0
  38. package/packages/scrabble-solver/.next/server/chunks/911.js +1 -1083
  39. package/packages/scrabble-solver/.next/server/chunks/977.js +1 -0
  40. package/packages/scrabble-solver/.next/server/functions-config-manifest.json +1 -0
  41. package/packages/scrabble-solver/.next/server/middleware-build-manifest.js +1 -1
  42. package/packages/scrabble-solver/.next/server/middleware-react-loadable-manifest.js +1 -1
  43. package/packages/scrabble-solver/.next/server/next-font-manifest.js +1 -1
  44. package/packages/scrabble-solver/.next/server/next-font-manifest.json +1 -6
  45. package/packages/scrabble-solver/.next/server/pages/404.html +1 -1
  46. package/packages/scrabble-solver/.next/server/pages/404.js.nft.json +1 -1
  47. package/packages/scrabble-solver/.next/server/pages/500.html +1 -1
  48. package/packages/scrabble-solver/.next/server/pages/_app.js +1 -380
  49. package/packages/scrabble-solver/.next/server/pages/_app.js.nft.json +1 -1
  50. package/packages/scrabble-solver/.next/server/pages/_document.js +1 -212
  51. package/packages/scrabble-solver/.next/server/pages/_document.js.nft.json +1 -1
  52. package/packages/scrabble-solver/.next/server/pages/_error.js +1 -166
  53. package/packages/scrabble-solver/.next/server/pages/_error.js.nft.json +1 -1
  54. package/packages/scrabble-solver/.next/server/pages/api/dictionary/[locale]/[word].js +2 -836
  55. package/packages/scrabble-solver/.next/server/pages/api/dictionary/[locale]/[word].js.nft.json +1 -1
  56. package/packages/scrabble-solver/.next/server/pages/api/dictionary/[locale].js +1 -192
  57. package/packages/scrabble-solver/.next/server/pages/api/dictionary/[locale].js.nft.json +1 -1
  58. package/packages/scrabble-solver/.next/server/pages/api/solve.js +1 -1121
  59. package/packages/scrabble-solver/.next/server/pages/api/solve.js.nft.json +1 -1
  60. package/packages/scrabble-solver/.next/server/pages/api/verify.js +1 -213
  61. package/packages/scrabble-solver/.next/server/pages/api/verify.js.nft.json +1 -1
  62. package/packages/scrabble-solver/.next/server/pages/api/visit.js +1 -131
  63. package/packages/scrabble-solver/.next/server/pages/api/visit.js.nft.json +1 -1
  64. package/packages/scrabble-solver/.next/server/pages/index.html +1 -1
  65. package/packages/scrabble-solver/.next/server/pages/index.js +1 -2088
  66. package/packages/scrabble-solver/.next/server/pages/index.js.nft.json +1 -1
  67. package/packages/scrabble-solver/.next/server/pages/index.json +1 -1
  68. package/packages/scrabble-solver/.next/server/pages-manifest.json +1 -12
  69. package/packages/scrabble-solver/.next/server/webpack-api-runtime.js +1 -172
  70. package/packages/scrabble-solver/.next/server/webpack-runtime.js +1 -229
  71. package/packages/scrabble-solver/.next/static/chunks/framework-1728d40275bc359a.js +49 -0
  72. package/packages/scrabble-solver/.next/static/chunks/main-5fb7abbfc135de15.js +1 -0
  73. package/packages/scrabble-solver/.next/static/chunks/pages/404-b6e238bb4117d451.js +1 -0
  74. package/packages/scrabble-solver/.next/static/chunks/pages/_app-b95404c40a0092e6.js +17 -0
  75. package/packages/scrabble-solver/.next/static/chunks/pages/_error-db043fa3544f8809.js +1 -0
  76. package/packages/scrabble-solver/.next/static/chunks/pages/index-59d569ef79bc2580.js +1 -0
  77. package/packages/scrabble-solver/.next/static/css/8fa2fb99b90e109e.css +1 -0
  78. package/packages/scrabble-solver/.next/static/css/c80ebc6fd13311f1.css +2 -0
  79. package/packages/scrabble-solver/.next/static/jyVoCYlAT5PMzOeavr5AX/_buildManifest.js +1 -0
  80. package/packages/scrabble-solver/.next/trace +44 -51
  81. package/packages/scrabble-solver/package-lock.json +754 -524
  82. package/packages/scrabble-solver/package.json +30 -31
  83. package/packages/scrabble-solver/public/service-worker.js +2 -0
  84. package/packages/scrabble-solver/public/service-worker.js.map +1 -0
  85. package/packages/scrabble-solver/src/state/slices/boardSlice.ts +4 -4
  86. package/packages/scrabble-solver/src/state/store.ts +1 -1
  87. package/packages/solver/package-lock.json +2 -2
  88. package/packages/solver/package.json +6 -7
  89. package/packages/types/package.json +3 -4
  90. package/packages/word-definitions/package-lock.json +10 -10
  91. package/packages/word-definitions/package.json +5 -5
  92. package/packages/word-lists/package-lock.json +22 -22
  93. package/packages/word-lists/package.json +8 -9
  94. package/tsconfig.json +1 -1
  95. package/packages/configs/dictionaries/build/Dictionaries.d.ts +0 -13
  96. package/packages/configs/dictionaries/build/Dictionaries.js +0 -46
  97. package/packages/configs/dictionaries/build/constants/index.d.ts +0 -3
  98. package/packages/configs/dictionaries/build/constants/index.js +0 -11
  99. package/packages/configs/dictionaries/build/index.d.ts +0 -3
  100. package/packages/configs/dictionaries/build/index.js +0 -23
  101. package/packages/configs/dictionaries/build/lib/DiskCache.d.ts +0 -11
  102. package/packages/configs/dictionaries/build/lib/DiskCache.js +0 -48
  103. package/packages/configs/dictionaries/build/lib/LayeredCache.d.ts +0 -13
  104. package/packages/configs/dictionaries/build/lib/LayeredCache.js +0 -55
  105. package/packages/configs/dictionaries/build/lib/MemoryCache.d.ts +0 -13
  106. package/packages/configs/dictionaries/build/lib/MemoryCache.js +0 -32
  107. package/packages/configs/dictionaries/build/lib/createAsyncProxy.d.ts +0 -3
  108. package/packages/configs/dictionaries/build/lib/createAsyncProxy.js +0 -18
  109. package/packages/configs/dictionaries/build/lib/createCacheTimestampComparator.d.ts +0 -5
  110. package/packages/configs/dictionaries/build/lib/createCacheTimestampComparator.js +0 -19
  111. package/packages/configs/dictionaries/build/lib/downloadDictionary.d.ts +0 -4
  112. package/packages/configs/dictionaries/build/lib/downloadDictionary.js +0 -16
  113. package/packages/configs/dictionaries/build/lib/getDictionaryFilepath.d.ts +0 -3
  114. package/packages/configs/dictionaries/build/lib/getDictionaryFilepath.js +0 -11
  115. package/packages/configs/dictionaries/build/lib/index.d.ts +0 -7
  116. package/packages/configs/dictionaries/build/lib/index.js +0 -20
  117. package/packages/configs/dictionaries/build/types/Cache.d.ts +0 -8
  118. package/packages/configs/dictionaries/build/types/Cache.js +0 -2
  119. package/packages/configs/dictionaries/build/types/index.d.ts +0 -1
  120. package/packages/configs/dictionaries/build/types/index.js +0 -2
  121. package/packages/scrabble-solver/.next/cache/next-server.js.nft.json +0 -1
  122. package/packages/scrabble-solver/.next/server/chunks/210.js +0 -109
  123. package/packages/scrabble-solver/.next/server/chunks/277.js +0 -11942
  124. package/packages/scrabble-solver/.next/server/chunks/44.js +0 -1838
  125. package/packages/scrabble-solver/.next/server/chunks/50.js +0 -12119
  126. package/packages/scrabble-solver/.next/server/chunks/636.js +0 -286
  127. package/packages/scrabble-solver/.next/server/chunks/675.js +0 -572
  128. package/packages/scrabble-solver/.next/server/chunks/859.js +0 -835
  129. package/packages/scrabble-solver/.next/server/chunks/865.js +0 -20424
  130. package/packages/scrabble-solver/.next/server/chunks/907.js +0 -42530
  131. package/packages/scrabble-solver/.next/server/chunks/987.js +0 -91
  132. package/packages/scrabble-solver/.next/static/16S6EJJ0_LRmtRPwnUIw5/_buildManifest.js +0 -1
  133. package/packages/scrabble-solver/.next/static/chunks/framework-2c29dc3cd933590b.js +0 -49
  134. package/packages/scrabble-solver/.next/static/chunks/main-4dcb7f9b52833aba.js +0 -1
  135. package/packages/scrabble-solver/.next/static/chunks/pages/404-b4b5ce15153d4825.js +0 -1
  136. package/packages/scrabble-solver/.next/static/chunks/pages/_app-122dc8ecfa0220d5.js +0 -32
  137. package/packages/scrabble-solver/.next/static/chunks/pages/_error-54de1933a164a1ff.js +0 -1
  138. package/packages/scrabble-solver/.next/static/chunks/pages/index-f56eaa969a831c70.js +0 -1
  139. package/packages/scrabble-solver/.next/static/css/4e8b47fe382a8a8f.css +0 -2
  140. package/packages/scrabble-solver/.next/static/css/cfae5256f1689f57.css +0 -1
  141. /package/packages/scrabble-solver/.next/static/{16S6EJJ0_LRmtRPwnUIw5 → jyVoCYlAT5PMzOeavr5AX}/_ssgManifest.js +0 -0
@@ -1,7 +1,7 @@
1
1
  import { createSlice, PayloadAction } from '@reduxjs/toolkit';
2
2
  import { games } from '@scrabble-solver/configs';
3
3
  import { EMPTY_CELL } from '@scrabble-solver/constants';
4
- import { Board, Cell, Game, Result, Tile } from '@scrabble-solver/types';
4
+ import { Board, Cell, Result, Tile } from '@scrabble-solver/types';
5
5
 
6
6
  import boardInitialState from './boardInitialState';
7
7
  import settingsSlice from './settingsSlice';
@@ -56,8 +56,8 @@ const boardSlice = createSlice({
56
56
  return newBoard;
57
57
  },
58
58
  },
59
- extraReducers: {
60
- [settingsSlice.actions.changeGame.type]: (state, action: PayloadAction<Game>) => {
59
+ extraReducers: (builder) => {
60
+ builder.addCase(settingsSlice.actions.changeGame, (state, action) => {
61
61
  const game = action.payload;
62
62
  const config = Object.values(games).find((gameConfig) => gameConfig.game === game);
63
63
 
@@ -70,7 +70,7 @@ const boardSlice = createSlice({
70
70
  }
71
71
 
72
72
  return state;
73
- },
73
+ });
74
74
  },
75
75
  });
76
76
 
@@ -26,7 +26,7 @@ const store = configureStore({
26
26
  solve: solveSlice.reducer,
27
27
  verify: verifySlice.reducer,
28
28
  },
29
- middleware: [sagaMiddleware],
29
+ middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat([sagaMiddleware]),
30
30
  });
31
31
 
32
32
  sagaMiddleware.run(rootSaga);
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@scrabble-solver/solver",
3
- "version": "2.13.2",
3
+ "version": "2.13.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@scrabble-solver/solver",
9
- "version": "2.13.2",
9
+ "version": "2.13.4",
10
10
  "license": "CC-BY-NC-ND-4.0",
11
11
  "dependencies": {
12
12
  "@kamilmielnik/trie": "^2.0.1"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scrabble-solver/solver",
3
- "version": "2.13.2",
3
+ "version": "2.13.4",
4
4
  "description": "Scrabble Solver 2 - Solver",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -20,17 +20,16 @@
20
20
  "homepage": "https://scrabble-solver.org",
21
21
  "scripts": {
22
22
  "build": "tsc --project .",
23
- "clean": "rimraf build/ node_modules/",
24
- "clean:force": "npm run clean && rimraf package-lock.json"
23
+ "clean": "rimraf build/"
25
24
  },
26
25
  "dependencies": {
27
26
  "@kamilmielnik/trie": "^2.0.1",
28
- "@scrabble-solver/types": "^2.13.2"
27
+ "@scrabble-solver/types": "^2.13.4"
29
28
  },
30
29
  "devDependencies": {
31
- "@scrabble-solver/configs": "^2.13.2",
32
- "@scrabble-solver/constants": "^2.13.2",
33
- "@scrabble-solver/dictionaries": "^2.13.2"
30
+ "@scrabble-solver/configs": "^2.13.4",
31
+ "@scrabble-solver/constants": "^2.13.4",
32
+ "@scrabble-solver/dictionaries": "^2.13.4"
34
33
  },
35
34
  "gitHead": "1e2d1ad49a288d4a44196d8e3336740da132c637"
36
35
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scrabble-solver/types",
3
- "version": "2.13.2",
3
+ "version": "2.13.4",
4
4
  "description": "Scrabble Solver 2 - Types",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -20,11 +20,10 @@
20
20
  "homepage": "https://scrabble-solver.org",
21
21
  "scripts": {
22
22
  "build": "tsc --project .",
23
- "clean": "rimraf build/ node_modules/",
24
- "clean:force": "npm run clean && rimraf package-lock.json"
23
+ "clean": "rimraf build/"
25
24
  },
26
25
  "dependencies": {
27
- "@scrabble-solver/constants": "^2.13.2"
26
+ "@scrabble-solver/constants": "^2.13.4"
28
27
  },
29
28
  "gitHead": "1e2d1ad49a288d4a44196d8e3336740da132c637"
30
29
  }
@@ -1,26 +1,26 @@
1
1
  {
2
2
  "name": "@scrabble-solver/word-definitions",
3
- "version": "2.13.2",
3
+ "version": "2.13.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@scrabble-solver/word-definitions",
9
- "version": "2.13.2",
9
+ "version": "2.13.4",
10
10
  "license": "CC-BY-NC-ND-4.0",
11
11
  "dependencies": {
12
12
  "cheerio": "^1.0.0-rc.12",
13
- "follow-redirects": "^1.15.2",
13
+ "follow-redirects": "^1.15.5",
14
14
  "striptags": "^3.2.0"
15
15
  },
16
16
  "devDependencies": {
17
- "@types/follow-redirects": "^1.14.1"
17
+ "@types/follow-redirects": "^1.14.4"
18
18
  }
19
19
  },
20
20
  "node_modules/@types/follow-redirects": {
21
- "version": "1.14.3",
22
- "resolved": "https://registry.npmjs.org/@types/follow-redirects/-/follow-redirects-1.14.3.tgz",
23
- "integrity": "sha512-VN4w0rKWI4DVySabR5/9P65nwcVEAr1taWFyYW3YR7rHYO/bOgG+LHpWfSzthPmCEfmawuXsMd4huQeSoc7jpg==",
21
+ "version": "1.14.4",
22
+ "resolved": "https://registry.npmjs.org/@types/follow-redirects/-/follow-redirects-1.14.4.tgz",
23
+ "integrity": "sha512-GWXfsD0Jc1RWiFmMuMFCpXMzi9L7oPDVwxUnZdg89kDNnqsRfUKXEtUYtA98A6lig1WXH/CYY/fvPW9HuN5fTA==",
24
24
  "dev": true,
25
25
  "dependencies": {
26
26
  "@types/node": "*"
@@ -165,9 +165,9 @@
165
165
  }
166
166
  },
167
167
  "node_modules/follow-redirects": {
168
- "version": "1.15.3",
169
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
170
- "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
168
+ "version": "1.15.5",
169
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz",
170
+ "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==",
171
171
  "funding": [
172
172
  {
173
173
  "type": "individual",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scrabble-solver/word-definitions",
3
- "version": "2.13.2",
3
+ "version": "2.13.4",
4
4
  "description": "Scrabble Solver 2 - Word definitions",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -20,15 +20,15 @@
20
20
  "homepage": "https://scrabble-solver.org",
21
21
  "scripts": {
22
22
  "build": "tsc --project .",
23
- "clean": "rimraf build/ node_modules/ package-lock.json"
23
+ "clean": "rimraf build/"
24
24
  },
25
25
  "dependencies": {
26
- "@scrabble-solver/types": "^2.13.2",
26
+ "@scrabble-solver/types": "^2.13.4",
27
27
  "cheerio": "^1.0.0-rc.12",
28
- "follow-redirects": "^1.15.2",
28
+ "follow-redirects": "^1.15.5",
29
29
  "striptags": "^3.2.0"
30
30
  },
31
31
  "devDependencies": {
32
- "@types/follow-redirects": "^1.14.1"
32
+ "@types/follow-redirects": "^1.14.4"
33
33
  }
34
34
  }
@@ -1,38 +1,38 @@
1
1
  {
2
2
  "name": "@scrabble-solver/word-lists",
3
- "version": "2.13.2",
3
+ "version": "2.13.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@scrabble-solver/word-lists",
9
- "version": "2.13.2",
9
+ "version": "2.13.4",
10
10
  "license": "CC-BY-NC-ND-4.0",
11
11
  "dependencies": {
12
12
  "cheerio": "^1.0.0-rc.12",
13
- "follow-redirects": "^1.15.2",
13
+ "follow-redirects": "^1.15.5",
14
14
  "latinize": "^1.0.0",
15
- "unzipper": "^0.10.11"
15
+ "unzipper": "^0.10.14"
16
16
  },
17
17
  "devDependencies": {
18
- "@types/follow-redirects": "^1.14.1",
19
- "@types/latinize": "^0.2.17",
20
- "@types/unzipper": "^0.10.5"
18
+ "@types/follow-redirects": "^1.14.4",
19
+ "@types/latinize": "^0.2.18",
20
+ "@types/unzipper": "^0.10.9"
21
21
  }
22
22
  },
23
23
  "node_modules/@types/follow-redirects": {
24
- "version": "1.14.1",
25
- "resolved": "https://registry.npmjs.org/@types/follow-redirects/-/follow-redirects-1.14.1.tgz",
26
- "integrity": "sha512-THBEFwqsLuU/K62B5JRwab9NW97cFmL4Iy34NTMX0bMycQVzq2q7PKOkhfivIwxdpa/J72RppgC42vCHfwKJ0Q==",
24
+ "version": "1.14.4",
25
+ "resolved": "https://registry.npmjs.org/@types/follow-redirects/-/follow-redirects-1.14.4.tgz",
26
+ "integrity": "sha512-GWXfsD0Jc1RWiFmMuMFCpXMzi9L7oPDVwxUnZdg89kDNnqsRfUKXEtUYtA98A6lig1WXH/CYY/fvPW9HuN5fTA==",
27
27
  "dev": true,
28
28
  "dependencies": {
29
29
  "@types/node": "*"
30
30
  }
31
31
  },
32
32
  "node_modules/@types/latinize": {
33
- "version": "0.2.17",
34
- "resolved": "https://registry.npmjs.org/@types/latinize/-/latinize-0.2.17.tgz",
35
- "integrity": "sha512-TqSJE7HHuwaxaGLAWm+YlFBymfNaLdQdddmZutXRD7+kabPgpWAiQHazOixwz1IrHGtacM8Oed/cg8CzrYvEDQ==",
33
+ "version": "0.2.18",
34
+ "resolved": "https://registry.npmjs.org/@types/latinize/-/latinize-0.2.18.tgz",
35
+ "integrity": "sha512-QjX4tcVEOcqDakv96sLMA2ESMcxSJel5KHxmcBgeTlZI7v6gFx9Tjqmt5+Pp8ijfGGr6CxuXzDNYk8A/iZ/GiA==",
36
36
  "dev": true
37
37
  },
38
38
  "node_modules/@types/node": {
@@ -42,9 +42,9 @@
42
42
  "dev": true
43
43
  },
44
44
  "node_modules/@types/unzipper": {
45
- "version": "0.10.5",
46
- "resolved": "https://registry.npmjs.org/@types/unzipper/-/unzipper-0.10.5.tgz",
47
- "integrity": "sha512-NrLJb29AdnBARpg9S/4ktfPEisbJ0AvaaAr3j7Q1tg8AgcEUsq2HqbNzvgLRoWyRtjzeLEv7vuL39u1mrNIyNA==",
45
+ "version": "0.10.9",
46
+ "resolved": "https://registry.npmjs.org/@types/unzipper/-/unzipper-0.10.9.tgz",
47
+ "integrity": "sha512-vHbmFZAw8emNAOVkHVbS3qBnbr0x/qHQZ+ei1HE7Oy6Tyrptl+jpqnOX+BF5owcu/HZLOV0nJK+K9sjs1Ox2JA==",
48
48
  "dev": true,
49
49
  "dependencies": {
50
50
  "@types/node": "*"
@@ -264,9 +264,9 @@
264
264
  }
265
265
  },
266
266
  "node_modules/follow-redirects": {
267
- "version": "1.15.2",
268
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
269
- "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
267
+ "version": "1.15.5",
268
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz",
269
+ "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==",
270
270
  "funding": [
271
271
  {
272
272
  "type": "individual",
@@ -509,9 +509,9 @@
509
509
  }
510
510
  },
511
511
  "node_modules/unzipper": {
512
- "version": "0.10.11",
513
- "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz",
514
- "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==",
512
+ "version": "0.10.14",
513
+ "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz",
514
+ "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==",
515
515
  "dependencies": {
516
516
  "big-integer": "^1.6.17",
517
517
  "binary": "~0.3.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scrabble-solver/word-lists",
3
- "version": "2.13.2",
3
+ "version": "2.13.4",
4
4
  "description": "Scrabble Solver 2 - Word lists",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -20,20 +20,19 @@
20
20
  "homepage": "https://scrabble-solver.org",
21
21
  "scripts": {
22
22
  "build": "tsc --project .",
23
- "clean": "rimraf build/ node_modules/",
24
- "clean:force": "npm run clean && rimraf package-lock.json"
23
+ "clean": "rimraf build/"
25
24
  },
26
25
  "dependencies": {
27
- "@scrabble-solver/types": "^2.13.2",
26
+ "@scrabble-solver/types": "^2.13.4",
28
27
  "cheerio": "^1.0.0-rc.12",
29
- "follow-redirects": "^1.15.2",
28
+ "follow-redirects": "^1.15.5",
30
29
  "latinize": "^1.0.0",
31
- "unzipper": "^0.10.11"
30
+ "unzipper": "^0.10.14"
32
31
  },
33
32
  "devDependencies": {
34
- "@types/follow-redirects": "^1.14.1",
35
- "@types/latinize": "^0.2.17",
36
- "@types/unzipper": "^0.10.5"
33
+ "@types/follow-redirects": "^1.14.4",
34
+ "@types/latinize": "^0.2.18",
35
+ "@types/unzipper": "^0.10.9"
37
36
  },
38
37
  "gitHead": "1e2d1ad49a288d4a44196d8e3336740da132c637"
39
38
  }
package/tsconfig.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "downlevelIteration": true,
5
5
  "esModuleInterop": true,
6
6
  "forceConsistentCasingInFileNames": true,
7
- "lib": ["esnext"],
7
+ "lib": ["esnext", "dom"],
8
8
  "module": "commonjs",
9
9
  "moduleResolution": "node",
10
10
  "noImplicitReturns": true,
@@ -1,13 +0,0 @@
1
- import { Trie } from '@kamilmielnik/trie';
2
- import { Locale } from '@scrabble-solver/types';
3
- declare class Dictionaries {
4
- private readonly cache;
5
- private readonly downloadDictionaryProxies;
6
- constructor();
7
- get(locale: Locale): Promise<Trie>;
8
- remove(): void;
9
- update(force?: boolean): Promise<void>;
10
- private getLocalesToUpdate;
11
- private updateDictionary;
12
- }
13
- export default Dictionaries;
@@ -1,46 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const logger_1 = __importDefault(require("@scrabble-solver/logger"));
7
- const types_1 = require("@scrabble-solver/types");
8
- const fs_1 = __importDefault(require("fs"));
9
- const constants_1 = require("./constants");
10
- const lib_1 = require("./lib");
11
- class Dictionaries {
12
- constructor() {
13
- this.cache = new lib_1.LayeredCache();
14
- this.downloadDictionaryProxies = Object.fromEntries(Object.values(types_1.Locale).map((locale) => [locale, (0, lib_1.createAsyncProxy)(() => (0, lib_1.downloadDictionary)(locale))]));
15
- }
16
- async get(locale) {
17
- if (this.cache.has(locale)) {
18
- const trie = await this.cache.get(locale);
19
- if (trie) {
20
- return trie;
21
- }
22
- }
23
- logger_1.default.info('Dictionaries - cache miss', { locale });
24
- return this.updateDictionary(locale);
25
- }
26
- remove() {
27
- fs_1.default.rmdirSync(constants_1.OUTPUT_DIRECTORY, { recursive: true });
28
- }
29
- async update(force) {
30
- const locales = force ? Object.values(types_1.Locale) : this.getLocalesToUpdate();
31
- logger_1.default.info('Dictionaries - update', { force, locales });
32
- await Promise.all(locales.map((locale) => this.updateDictionary(locale)));
33
- }
34
- getLocalesToUpdate() {
35
- return Object.values(types_1.Locale).filter((locale) => this.cache.isStale(locale) !== false);
36
- }
37
- async updateDictionary(locale) {
38
- logger_1.default.info('Dictionaries - updateDictionary', { locale });
39
- fs_1.default.mkdirSync(constants_1.OUTPUT_DIRECTORY, { recursive: true });
40
- const downloadDictionaryProxy = this.downloadDictionaryProxies[locale];
41
- const trie = await downloadDictionaryProxy();
42
- await this.cache.set(locale, trie);
43
- return trie;
44
- }
45
- }
46
- exports.default = Dictionaries;
@@ -1,3 +0,0 @@
1
- export declare const DAY: number;
2
- export declare const CACHE_STALE_THRESHOLD: number;
3
- export declare const OUTPUT_DIRECTORY: string;
@@ -1,11 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.OUTPUT_DIRECTORY = exports.CACHE_STALE_THRESHOLD = exports.DAY = void 0;
7
- const os_1 = __importDefault(require("os"));
8
- const path_1 = __importDefault(require("path"));
9
- exports.DAY = 24 * 60 * 60 * 1000;
10
- exports.CACHE_STALE_THRESHOLD = 1 * exports.DAY; // eslint-disable-line no-implicit-coercion
11
- exports.OUTPUT_DIRECTORY = path_1.default.resolve(os_1.default.homedir(), '.scrabble-solver', 'dictionaries');
@@ -1,3 +0,0 @@
1
- import Dictionaries from './Dictionaries';
2
- export * from './lib';
3
- export declare const dictionaries: Dictionaries;
@@ -1,23 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- var __importDefault = (this && this.__importDefault) || function (mod) {
17
- return (mod && mod.__esModule) ? mod : { "default": mod };
18
- };
19
- Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.dictionaries = void 0;
21
- const Dictionaries_1 = __importDefault(require("./Dictionaries"));
22
- __exportStar(require("./lib"), exports);
23
- exports.dictionaries = new Dictionaries_1.default();
@@ -1,11 +0,0 @@
1
- import { Trie } from '@kamilmielnik/trie';
2
- import { Locale } from '@scrabble-solver/types';
3
- import { Cache } from '../types';
4
- declare class DiskCache implements Cache<Locale, Trie> {
5
- get(locale: Locale): Promise<Trie | undefined>;
6
- getLastModifiedTimestamp(locale: Locale): number | undefined;
7
- has(locale: Locale): boolean;
8
- isStale(locale: Locale): boolean | undefined;
9
- set(locale: Locale, trie: Trie): Promise<void>;
10
- }
11
- export default DiskCache;
@@ -1,48 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const trie_1 = require("@kamilmielnik/trie");
7
- const fs_1 = __importDefault(require("fs"));
8
- const constants_1 = require("../constants");
9
- const getDictionaryFilepath_1 = __importDefault(require("./getDictionaryFilepath"));
10
- class DiskCache {
11
- async get(locale) {
12
- if (!this.has(locale)) {
13
- return undefined;
14
- }
15
- const filepath = (0, getDictionaryFilepath_1.default)(locale);
16
- const serialized = await fs_1.default.promises.readFile(filepath, 'utf-8');
17
- const trie = trie_1.Trie.deserialize(serialized);
18
- return trie;
19
- }
20
- getLastModifiedTimestamp(locale) {
21
- const filepath = (0, getDictionaryFilepath_1.default)(locale);
22
- if (!fs_1.default.existsSync(filepath)) {
23
- return undefined;
24
- }
25
- const stats = fs_1.default.statSync(filepath);
26
- return stats.mtimeMs;
27
- }
28
- has(locale) {
29
- const filepath = (0, getDictionaryFilepath_1.default)(locale);
30
- return fs_1.default.existsSync(filepath);
31
- }
32
- isStale(locale) {
33
- if (!this.has(locale)) {
34
- return undefined;
35
- }
36
- const lastModifiedTimestamp = this.getLastModifiedTimestamp(locale);
37
- if (typeof lastModifiedTimestamp === 'undefined') {
38
- return undefined;
39
- }
40
- const timeSinceModification = Math.abs(lastModifiedTimestamp - Date.now());
41
- return timeSinceModification > constants_1.CACHE_STALE_THRESHOLD;
42
- }
43
- async set(locale, trie) {
44
- const filepath = (0, getDictionaryFilepath_1.default)(locale);
45
- await fs_1.default.promises.writeFile(filepath, trie.serialize());
46
- }
47
- }
48
- exports.default = DiskCache;
@@ -1,13 +0,0 @@
1
- import { Trie } from '@kamilmielnik/trie';
2
- import { Locale } from '@scrabble-solver/types';
3
- import { Cache } from '../types';
4
- declare class LayeredCache implements Cache<Locale, Trie> {
5
- private readonly layers;
6
- get(locale: Locale): Promise<Trie | undefined>;
7
- getLastModifiedTimestamp(locale: Locale): number | undefined;
8
- has(locale: Locale): boolean;
9
- isStale(locale: Locale): boolean | undefined;
10
- set(locale: Locale, trie: Trie): Promise<void>;
11
- private getLastModifiedLayer;
12
- }
13
- export default LayeredCache;
@@ -1,55 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const createCacheTimestampComparator_1 = __importDefault(require("./createCacheTimestampComparator"));
7
- const DiskCache_1 = __importDefault(require("./DiskCache"));
8
- const MemoryCache_1 = __importDefault(require("./MemoryCache"));
9
- class LayeredCache {
10
- constructor() {
11
- this.layers = [new MemoryCache_1.default(), new DiskCache_1.default()];
12
- }
13
- async get(locale) {
14
- const cache = this.getLastModifiedLayer(locale);
15
- if (!cache) {
16
- return Promise.resolve(undefined);
17
- }
18
- const [memoryCache, diskCache] = this.layers;
19
- const value = await cache.get(locale);
20
- if (cache === diskCache && typeof value !== 'undefined') {
21
- await memoryCache.set(locale, value);
22
- }
23
- return value;
24
- }
25
- getLastModifiedTimestamp(locale) {
26
- const cache = this.getLastModifiedLayer(locale);
27
- if (!cache) {
28
- return undefined;
29
- }
30
- return cache.getLastModifiedTimestamp(locale);
31
- }
32
- has(locale) {
33
- return this.layers.some((cache) => cache.has(locale));
34
- }
35
- isStale(locale) {
36
- if (this.layers.some((cache) => cache.isStale(locale))) {
37
- return true;
38
- }
39
- if (this.layers.every((cache) => typeof cache.isStale(locale) === 'undefined')) {
40
- return undefined;
41
- }
42
- return false;
43
- }
44
- async set(locale, trie) {
45
- const [memoryCache, diskCache] = this.layers;
46
- await diskCache.set(locale, trie);
47
- await memoryCache.set(locale, trie);
48
- }
49
- getLastModifiedLayer(locale) {
50
- const layers = this.layers.filter((cache) => cache.has(locale));
51
- const [cached] = [...layers].sort((0, createCacheTimestampComparator_1.default)(locale));
52
- return cached;
53
- }
54
- }
55
- exports.default = LayeredCache;
@@ -1,13 +0,0 @@
1
- import { Trie } from '@kamilmielnik/trie';
2
- import { Locale } from '@scrabble-solver/types';
3
- import { Cache } from '../types';
4
- declare class MemoryCache implements Cache<Locale, Trie> {
5
- private readonly cache;
6
- private readonly cacheTimestamps;
7
- get(locale: Locale): Promise<Trie | undefined>;
8
- getLastModifiedTimestamp(locale: Locale): number | undefined;
9
- has(locale: Locale): boolean;
10
- isStale(locale: Locale): boolean | undefined;
11
- set(locale: Locale, trie: Trie): Promise<void>;
12
- }
13
- export default MemoryCache;
@@ -1,32 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const constants_1 = require("../constants");
4
- class MemoryCache {
5
- constructor() {
6
- this.cache = {};
7
- this.cacheTimestamps = {};
8
- }
9
- get(locale) {
10
- return Promise.resolve(this.cache[locale]);
11
- }
12
- getLastModifiedTimestamp(locale) {
13
- return this.cacheTimestamps[locale];
14
- }
15
- has(locale) {
16
- return typeof this.cache[locale] !== 'undefined';
17
- }
18
- isStale(locale) {
19
- const timestamp = this.getLastModifiedTimestamp(locale);
20
- if (!this.has(locale) || typeof timestamp === 'undefined') {
21
- return undefined;
22
- }
23
- const timeSinceModification = Math.abs(timestamp - Date.now());
24
- return timeSinceModification > constants_1.CACHE_STALE_THRESHOLD;
25
- }
26
- set(locale, trie) {
27
- this.cacheTimestamps[locale] = Date.now();
28
- this.cache[locale] = trie;
29
- return Promise.resolve();
30
- }
31
- }
32
- exports.default = MemoryCache;
@@ -1,3 +0,0 @@
1
- type AsyncCallback<T> = () => Promise<T>;
2
- declare const createAsyncProxy: <T>(asyncCallback: AsyncCallback<T>) => AsyncCallback<T>;
3
- export default createAsyncProxy;
@@ -1,18 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const createAsyncProxy = (asyncCallback) => {
4
- let promise = null;
5
- return async () => {
6
- if (promise) {
7
- return promise;
8
- }
9
- try {
10
- promise = asyncCallback();
11
- return await promise;
12
- }
13
- finally {
14
- promise = null;
15
- }
16
- };
17
- };
18
- exports.default = createAsyncProxy;
@@ -1,5 +0,0 @@
1
- import { Trie } from '@kamilmielnik/trie';
2
- import { Locale } from '@scrabble-solver/types';
3
- import { Cache } from '../types';
4
- declare const createCacheTimestampComparator: (locale: Locale) => (a: Cache<Locale, Trie>, b: Cache<Locale, Trie>) => number;
5
- export default createCacheTimestampComparator;