@scrabble-solver/word-lists 2.8.2 → 2.8.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.
- package/build/getDeDeWordList.js +5 -43
- package/build/getEnGbWordList.js +5 -43
- package/build/getEnUsWordList.js +5 -43
- package/build/getEsEsWordList.js +7 -50
- package/build/getFrFrWordList.js +9 -50
- package/build/getPlPlWordList.js +33 -91
- package/build/getWordList.js +16 -17
- package/build/lib/downloadFile.d.ts +1 -2
- package/build/lib/downloadFile.js +28 -10
- package/build/lib/downloadHtml.js +8 -8
- package/build/lib/extractWords.js +5 -5
- package/build/lib/findFirstWordIndex.js +6 -6
- package/build/lib/getHash.js +2 -5
- package/build/lib/getTempFilename.js +3 -3
- package/build/lib/getTxtWordList.js +10 -56
- package/package.json +3 -3
- package/src/getFrFrWordList.ts +1 -0
- package/src/getPlPlWordList.ts +2 -3
- package/src/lib/downloadFile.ts +25 -7
- package/src/lib/getTxtWordList.ts +2 -4
package/build/getDeDeWordList.js
CHANGED
|
@@ -1,46 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
return
|
|
43
|
-
|
|
44
|
-
});
|
|
45
|
-
}); };
|
|
3
|
+
const lib_1 = require("./lib");
|
|
4
|
+
const FILE_URL = 'https://raw.githubusercontent.com/HanSolo80/German-Dictionary/master/dictionary.txt';
|
|
5
|
+
const getDeDeWordList = async () => {
|
|
6
|
+
return (0, lib_1.getTxtWordList)(FILE_URL);
|
|
7
|
+
};
|
|
46
8
|
exports.default = getDeDeWordList;
|
package/build/getEnGbWordList.js
CHANGED
|
@@ -1,46 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
return
|
|
43
|
-
|
|
44
|
-
});
|
|
45
|
-
}); };
|
|
3
|
+
const lib_1 = require("./lib");
|
|
4
|
+
const FILE_URL = 'https://www.wordgamedictionary.com/sowpods/download/sowpods.txt';
|
|
5
|
+
const getEnGbWordList = async () => {
|
|
6
|
+
return (0, lib_1.getTxtWordList)(FILE_URL);
|
|
7
|
+
};
|
|
46
8
|
exports.default = getEnGbWordList;
|
package/build/getEnUsWordList.js
CHANGED
|
@@ -1,46 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
return
|
|
43
|
-
|
|
44
|
-
});
|
|
45
|
-
}); };
|
|
3
|
+
const lib_1 = require("./lib");
|
|
4
|
+
const FILE_URL = 'https://www.wordgamedictionary.com/twl06/download/twl06.txt';
|
|
5
|
+
const getEnUsWordList = async () => {
|
|
6
|
+
return (0, lib_1.getTxtWordList)(FILE_URL);
|
|
7
|
+
};
|
|
46
8
|
exports.default = getEnUsWordList;
|
package/build/getEsEsWordList.js
CHANGED
|
@@ -1,55 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
case 1:
|
|
47
|
-
words = _a.sent();
|
|
48
|
-
return [2 /*return*/, words.map(normalizeWord)];
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
}); };
|
|
52
|
-
var normalizeWord = function (word) {
|
|
3
|
+
const lib_1 = require("./lib");
|
|
4
|
+
const FILE_URL = 'https://raw.githubusercontent.com/kamilmielnik/fise-2/master/fise-2.txt';
|
|
5
|
+
const getEsEsWordList = async () => {
|
|
6
|
+
const words = await (0, lib_1.getTxtWordList)(FILE_URL);
|
|
7
|
+
return words.map(normalizeWord);
|
|
8
|
+
};
|
|
9
|
+
const normalizeWord = (word) => {
|
|
53
10
|
// normalization from https://stackoverflow.com/a/37511463
|
|
54
11
|
return word.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
|
|
55
12
|
};
|
package/build/getFrFrWordList.js
CHANGED
|
@@ -1,55 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return [2 /*return*/, words.map(normalizeWord)];
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
}); };
|
|
52
|
-
var normalizeWord = function (word) {
|
|
3
|
+
const lib_1 = require("./lib");
|
|
4
|
+
const FILE_URL =
|
|
5
|
+
// eslint-disable-next-line max-len
|
|
6
|
+
'https://raw.githubusercontent.com/hbenbel/French-Dictionary/a573eab10cc798d7d5da7daab4d2ac0259bb46a3/dictionary/dictionary.txt';
|
|
7
|
+
const getFrFrWordList = async () => {
|
|
8
|
+
const words = await (0, lib_1.getTxtWordList)(FILE_URL);
|
|
9
|
+
return words.map(normalizeWord);
|
|
10
|
+
};
|
|
11
|
+
const normalizeWord = (word) => {
|
|
53
12
|
// normalization from https://stackoverflow.com/a/37511463
|
|
54
13
|
return word.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
|
|
55
14
|
};
|
package/build/getPlPlWordList.js
CHANGED
|
@@ -1,108 +1,50 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
4
|
};
|
|
41
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
});
|
|
72
|
-
}); };
|
|
73
|
-
var fetchZipUrl = function (url) { return __awaiter(void 0, void 0, void 0, function () {
|
|
74
|
-
var html, filename, href;
|
|
75
|
-
return __generator(this, function (_a) {
|
|
76
|
-
switch (_a.label) {
|
|
77
|
-
case 0: return [4 /*yield*/, (0, lib_1.downloadHtml)(url)];
|
|
78
|
-
case 1:
|
|
79
|
-
html = _a.sent();
|
|
80
|
-
return [4 /*yield*/, parseZipContainingPage(html)];
|
|
81
|
-
case 2:
|
|
82
|
-
filename = _a.sent();
|
|
83
|
-
href = new url_1.URL(filename, url).href;
|
|
84
|
-
return [2 /*return*/, href];
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
}); };
|
|
88
|
-
var parseZipContainingPage = function (html) {
|
|
89
|
-
var $ = cheerio_1.default.load(html);
|
|
90
|
-
var $links = $('a');
|
|
91
|
-
var links = Array.from($links)
|
|
92
|
-
.map(function (link) { return $(link).attr('href'); })
|
|
6
|
+
const cheerio_1 = __importDefault(require("cheerio"));
|
|
7
|
+
const memfs_1 = require("memfs");
|
|
8
|
+
const unzipper_1 = __importDefault(require("unzipper"));
|
|
9
|
+
const url_1 = require("url");
|
|
10
|
+
const lib_1 = require("./lib");
|
|
11
|
+
const PAGE_URL = 'https://sjp.pl/sl/growy/';
|
|
12
|
+
const FILE_TO_EXTRACT_FROM_ZIP = 'slowa.txt';
|
|
13
|
+
const getPlPlWordList = async () => {
|
|
14
|
+
const tempFilename = (0, lib_1.getTempFilename)();
|
|
15
|
+
const zipUrl = await fetchZipUrl(PAGE_URL);
|
|
16
|
+
const zipTempFilename = await (0, lib_1.downloadFile)(zipUrl);
|
|
17
|
+
await unzip(zipTempFilename, tempFilename);
|
|
18
|
+
memfs_1.fs.unlinkSync(zipTempFilename);
|
|
19
|
+
const file = memfs_1.fs.readFileSync(tempFilename, 'utf-8');
|
|
20
|
+
memfs_1.fs.unlinkSync(tempFilename);
|
|
21
|
+
const words = (0, lib_1.extractWords)(file.toLocaleString());
|
|
22
|
+
return words;
|
|
23
|
+
};
|
|
24
|
+
const fetchZipUrl = async (url) => {
|
|
25
|
+
const html = await (0, lib_1.downloadHtml)(url);
|
|
26
|
+
const filename = await parseZipContainingPage(html);
|
|
27
|
+
const { href } = new url_1.URL(filename, url);
|
|
28
|
+
return href;
|
|
29
|
+
};
|
|
30
|
+
const parseZipContainingPage = (html) => {
|
|
31
|
+
const $ = cheerio_1.default.load(html);
|
|
32
|
+
const $links = $('a');
|
|
33
|
+
const links = Array.from($links)
|
|
34
|
+
.map((link) => $(link).attr('href'))
|
|
93
35
|
.filter(Boolean);
|
|
94
|
-
|
|
36
|
+
const zipFilename = links.find((link) => link.endsWith('.zip'));
|
|
95
37
|
if (typeof zipFilename === 'undefined') {
|
|
96
38
|
throw new Error('Cannot find link to zip file on the page');
|
|
97
39
|
}
|
|
98
40
|
return zipFilename;
|
|
99
41
|
};
|
|
100
|
-
|
|
42
|
+
const unzip = (zipFilename, outputFilename) => {
|
|
101
43
|
return memfs_1.fs
|
|
102
44
|
.createReadStream(zipFilename)
|
|
103
45
|
.pipe(unzipper_1.default.Parse())
|
|
104
|
-
.on('entry',
|
|
105
|
-
|
|
46
|
+
.on('entry', (entry) => {
|
|
47
|
+
const fileName = entry.path;
|
|
106
48
|
if (fileName === FILE_TO_EXTRACT_FROM_ZIP) {
|
|
107
49
|
entry.pipe(memfs_1.fs.createWriteStream(outputFilename));
|
|
108
50
|
}
|
package/build/getWordList.js
CHANGED
|
@@ -2,22 +2,21 @@
|
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
|
-
var _a;
|
|
6
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
6
|
+
const types_1 = require("@scrabble-solver/types");
|
|
7
|
+
const getDeDeWordList_1 = __importDefault(require("./getDeDeWordList"));
|
|
8
|
+
const getEnGbWordList_1 = __importDefault(require("./getEnGbWordList"));
|
|
9
|
+
const getEnUsWordList_1 = __importDefault(require("./getEnUsWordList"));
|
|
10
|
+
const getEsEsWordList_1 = __importDefault(require("./getEsEsWordList"));
|
|
11
|
+
const getFrFrWordList_1 = __importDefault(require("./getFrFrWordList"));
|
|
12
|
+
const getPlPlWordList_1 = __importDefault(require("./getPlPlWordList"));
|
|
13
|
+
const localeMap = {
|
|
14
|
+
[types_1.Locale.DE_DE]: getDeDeWordList_1.default,
|
|
15
|
+
[types_1.Locale.EN_GB]: getEnGbWordList_1.default,
|
|
16
|
+
[types_1.Locale.EN_US]: getEnUsWordList_1.default,
|
|
17
|
+
[types_1.Locale.ES_ES]: getEsEsWordList_1.default,
|
|
18
|
+
[types_1.Locale.FR_FR]: getFrFrWordList_1.default,
|
|
19
|
+
[types_1.Locale.PL_PL]: getPlPlWordList_1.default,
|
|
20
|
+
};
|
|
21
|
+
const getWordList = (locale) => localeMap[locale]();
|
|
23
22
|
exports.default = getWordList;
|
|
@@ -1,19 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
const follow_redirects_1 = require("follow-redirects");
|
|
7
|
+
const memfs_1 = require("memfs");
|
|
8
|
+
const getTempFilename_1 = __importDefault(require("./getTempFilename"));
|
|
9
|
+
const downloadFile = (url) => {
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
const tempFilename = (0, getTempFilename_1.default)();
|
|
12
|
+
const protocol = url.startsWith('https') ? follow_redirects_1.https : follow_redirects_1.http;
|
|
13
|
+
const writeStream = memfs_1.fs.createWriteStream(tempFilename);
|
|
14
|
+
const request = protocol.get(url, (response) => {
|
|
8
15
|
if (typeof response.statusCode === 'undefined' || response.statusCode >= 400) {
|
|
9
|
-
reject();
|
|
16
|
+
reject(new Error(`Cannot download file: ${url}`));
|
|
10
17
|
return;
|
|
11
18
|
}
|
|
12
|
-
response.
|
|
13
|
-
|
|
14
|
-
|
|
19
|
+
response.on('error', (error) => {
|
|
20
|
+
writeStream.close();
|
|
21
|
+
reject(error);
|
|
22
|
+
});
|
|
23
|
+
response.on('end', () => {
|
|
24
|
+
writeStream.on('finish', () => {
|
|
25
|
+
writeStream.close();
|
|
26
|
+
resolve(tempFilename);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
response.pipe(writeStream);
|
|
30
|
+
});
|
|
31
|
+
request.on('error', (error) => {
|
|
32
|
+
writeStream.close();
|
|
33
|
+
reject(error);
|
|
15
34
|
});
|
|
16
|
-
request.on('error', reject);
|
|
17
35
|
});
|
|
18
36
|
};
|
|
19
37
|
exports.default = downloadFile;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
return new Promise(
|
|
6
|
-
|
|
7
|
-
protocol.get(url,
|
|
8
|
-
|
|
3
|
+
const follow_redirects_1 = require("follow-redirects");
|
|
4
|
+
const downloadHtml = (url) => {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
const protocol = url.startsWith('https') ? follow_redirects_1.https : follow_redirects_1.http;
|
|
7
|
+
protocol.get(url, (response) => {
|
|
8
|
+
let data = '';
|
|
9
9
|
response.setEncoding('utf8');
|
|
10
|
-
response.on('data',
|
|
10
|
+
response.on('data', (chunk) => {
|
|
11
11
|
data += chunk;
|
|
12
12
|
});
|
|
13
|
-
response.on('end',
|
|
13
|
+
response.on('end', () => {
|
|
14
14
|
resolve(data);
|
|
15
15
|
});
|
|
16
16
|
response.on('error', reject);
|
|
@@ -3,11 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
const findFirstWordIndex_1 = __importDefault(require("./findFirstWordIndex"));
|
|
7
|
+
const extractWords = (file) => {
|
|
8
|
+
const lines = file.replace(/\r/g, '').split('\n');
|
|
9
|
+
const firstWordIndex = (0, findFirstWordIndex_1.default)(lines);
|
|
10
|
+
const words = lines.slice(firstWordIndex).filter(Boolean);
|
|
11
11
|
return words;
|
|
12
12
|
};
|
|
13
13
|
exports.default = extractWords;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
const findFirstWordIndex = (lines) => {
|
|
4
|
+
const firstWordIndex = lines.findIndex((line, index) => {
|
|
5
|
+
const nextLine = line[index + 1] || '';
|
|
6
|
+
const isNextLineInOrder = line.localeCompare(nextLine) === 1;
|
|
7
|
+
const hasWhitespace = Boolean(line.match(/\s/));
|
|
8
|
+
const isEmpty = line.trim().length === 0;
|
|
9
9
|
return !isEmpty && !hasWhitespace && isNextLineInOrder;
|
|
10
10
|
});
|
|
11
11
|
if (typeof firstWordIndex === 'undefined') {
|
package/build/lib/getHash.js
CHANGED
|
@@ -3,9 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
if (bytes === void 0) { bytes = 8; }
|
|
9
|
-
return crypto_1.default.randomBytes(bytes).toString('hex');
|
|
10
|
-
};
|
|
6
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
7
|
+
const getHash = (bytes = 8) => crypto_1.default.randomBytes(bytes).toString('hex');
|
|
11
8
|
exports.default = getHash;
|
|
@@ -3,8 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return
|
|
6
|
+
const getHash_1 = __importDefault(require("./getHash"));
|
|
7
|
+
const getTempFilename = () => {
|
|
8
|
+
return `/${(0, getHash_1.default)()}.txt`;
|
|
9
9
|
};
|
|
10
10
|
exports.default = getTempFilename;
|
|
@@ -1,62 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
4
|
};
|
|
41
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return [4 /*yield*/, (0, downloadFile_1.default)(url, memfs_1.fs.createWriteStream(tempFilename))];
|
|
53
|
-
case 1:
|
|
54
|
-
_a.sent();
|
|
55
|
-
file = memfs_1.fs.readFileSync(tempFilename, 'utf-8');
|
|
56
|
-
words = (0, extractWords_1.default)(file.toString());
|
|
57
|
-
memfs_1.fs.unlinkSync(tempFilename);
|
|
58
|
-
return [2 /*return*/, words];
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
}); };
|
|
6
|
+
const memfs_1 = require("memfs");
|
|
7
|
+
const downloadFile_1 = __importDefault(require("./downloadFile"));
|
|
8
|
+
const extractWords_1 = __importDefault(require("./extractWords"));
|
|
9
|
+
const getTxtWordList = async (url) => {
|
|
10
|
+
const tempFilename = await (0, downloadFile_1.default)(url);
|
|
11
|
+
const file = memfs_1.fs.readFileSync(tempFilename, 'utf-8');
|
|
12
|
+
const words = (0, extractWords_1.default)(file.toLocaleString());
|
|
13
|
+
memfs_1.fs.unlinkSync(tempFilename);
|
|
14
|
+
return words;
|
|
15
|
+
};
|
|
62
16
|
exports.default = getTxtWordList;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scrabble-solver/word-lists",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.4",
|
|
4
4
|
"description": "Scrabble Solver 2 - Word lists",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"clean:force": "npm run clean && rimraf package-lock.json"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@scrabble-solver/types": "^2.8.
|
|
27
|
+
"@scrabble-solver/types": "^2.8.4",
|
|
28
28
|
"cheerio": "^1.0.0-rc.12",
|
|
29
29
|
"follow-redirects": "^1.15.2",
|
|
30
30
|
"memfs": "^3.4.7",
|
|
@@ -34,5 +34,5 @@
|
|
|
34
34
|
"@types/follow-redirects": "^1.14.1",
|
|
35
35
|
"@types/unzipper": "^0.10.5"
|
|
36
36
|
},
|
|
37
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "3b0c4c9d7987e456f34f7e2918931b0024b8a393"
|
|
38
38
|
}
|
package/src/getFrFrWordList.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getTxtWordList } from './lib';
|
|
2
2
|
|
|
3
3
|
const FILE_URL =
|
|
4
|
+
// eslint-disable-next-line max-len
|
|
4
5
|
'https://raw.githubusercontent.com/hbenbel/French-Dictionary/a573eab10cc798d7d5da7daab4d2ac0259bb46a3/dictionary/dictionary.txt';
|
|
5
6
|
|
|
6
7
|
const getFrFrWordList = async (): Promise<string[]> => {
|
package/src/getPlPlWordList.ts
CHANGED
|
@@ -9,15 +9,14 @@ const PAGE_URL = 'https://sjp.pl/sl/growy/';
|
|
|
9
9
|
const FILE_TO_EXTRACT_FROM_ZIP = 'slowa.txt';
|
|
10
10
|
|
|
11
11
|
const getPlPlWordList = async (): Promise<string[]> => {
|
|
12
|
-
const zipTempFilename = getTempFilename();
|
|
13
12
|
const tempFilename = getTempFilename();
|
|
14
13
|
const zipUrl = await fetchZipUrl(PAGE_URL);
|
|
15
|
-
await downloadFile(zipUrl
|
|
14
|
+
const zipTempFilename = await downloadFile(zipUrl);
|
|
16
15
|
await unzip(zipTempFilename, tempFilename);
|
|
17
16
|
fs.unlinkSync(zipTempFilename);
|
|
18
17
|
const file = fs.readFileSync(tempFilename, 'utf-8');
|
|
19
18
|
fs.unlinkSync(tempFilename);
|
|
20
|
-
const words = extractWords(file.
|
|
19
|
+
const words = extractWords(file.toLocaleString());
|
|
21
20
|
return words;
|
|
22
21
|
};
|
|
23
22
|
|
package/src/lib/downloadFile.ts
CHANGED
|
@@ -1,20 +1,38 @@
|
|
|
1
1
|
import { http, https } from 'follow-redirects';
|
|
2
|
-
import {
|
|
2
|
+
import { fs } from 'memfs';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
import getTempFilename from './getTempFilename';
|
|
5
|
+
|
|
6
|
+
const downloadFile = (url: string): Promise<string> => {
|
|
5
7
|
return new Promise((resolve, reject) => {
|
|
8
|
+
const tempFilename = getTempFilename();
|
|
6
9
|
const protocol = url.startsWith('https') ? https : http;
|
|
10
|
+
const writeStream = fs.createWriteStream(tempFilename);
|
|
7
11
|
const request = protocol.get(url, (response) => {
|
|
8
12
|
if (typeof response.statusCode === 'undefined' || response.statusCode >= 400) {
|
|
9
|
-
reject();
|
|
13
|
+
reject(new Error(`Cannot download file: ${url}`));
|
|
10
14
|
return;
|
|
11
15
|
}
|
|
12
16
|
|
|
13
|
-
response.
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
response.on('error', (error) => {
|
|
18
|
+
writeStream.close();
|
|
19
|
+
reject(error);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
response.on('end', () => {
|
|
23
|
+
writeStream.on('finish', () => {
|
|
24
|
+
writeStream.close();
|
|
25
|
+
resolve(tempFilename);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
response.pipe(writeStream);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
request.on('error', (error) => {
|
|
33
|
+
writeStream.close();
|
|
34
|
+
reject(error);
|
|
16
35
|
});
|
|
17
|
-
request.on('error', reject);
|
|
18
36
|
});
|
|
19
37
|
};
|
|
20
38
|
|
|
@@ -2,13 +2,11 @@ import { fs } from 'memfs';
|
|
|
2
2
|
|
|
3
3
|
import downloadFile from './downloadFile';
|
|
4
4
|
import extractWords from './extractWords';
|
|
5
|
-
import getTempFilename from './getTempFilename';
|
|
6
5
|
|
|
7
6
|
const getTxtWordList = async (url: string): Promise<string[]> => {
|
|
8
|
-
const tempFilename =
|
|
9
|
-
await downloadFile(url, fs.createWriteStream(tempFilename));
|
|
7
|
+
const tempFilename = await downloadFile(url);
|
|
10
8
|
const file = fs.readFileSync(tempFilename, 'utf-8');
|
|
11
|
-
const words = extractWords(file.
|
|
9
|
+
const words = extractWords(file.toLocaleString());
|
|
12
10
|
fs.unlinkSync(tempFilename);
|
|
13
11
|
return words;
|
|
14
12
|
};
|