Compare commits

..

5 Commits

Author SHA1 Message Date
Richard Moore
b9c07b549c Added French and Spanish wordlist dist files. 2018-10-03 20:01:35 -04:00
Richard Moore
c34a1f73c6 Added French and Spanish BIP-39 wordlists (#191). 2018-10-03 19:58:45 -04:00
Richard Moore
281bd0613d Added support for JSON serialized BigNumbers in the constructor (#288). 2018-10-03 19:54:38 -04:00
Richard Moore
d936b4cd09 Fixed scrypt for long passwords (#223). 2018-10-03 19:50:15 -04:00
Richard Moore
5a0ebf84ef Updated dist files. 2018-10-01 17:34:44 -04:00
31 changed files with 4688 additions and 83 deletions

2
_version.d.ts vendored
View File

@@ -1 +1 @@
export declare const version = "4.0.0";
export declare const version = "4.0.1";

View File

@@ -1,3 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.version = "4.0.0";
exports.version = "4.0.1";

8
contract.d.ts vendored
View File

@@ -12,10 +12,10 @@ export declare type EventFilter = {
topics?: Array<string>;
};
export interface Event extends Log {
args: Array<any>;
decode: (data: string, topics?: Array<string>) => any;
event: string;
eventSignature: string;
args?: Array<any>;
decode?: (data: string, topics?: Array<string>) => any;
event?: string;
eventSignature?: string;
removeListener: () => void;
getBlock: () => Promise<Block>;
getTransaction: () => Promise<TransactionResponse>;

View File

@@ -59,7 +59,7 @@ var VoidSigner = /** @class */ (function (_super) {
}(abstract_signer_1.Signer));
exports.VoidSigner = VoidSigner;
var allowedTransactionKeys = {
data: true, from: true, gasLimit: true, gasPrice: true, nonce: true, to: true, value: true
chainId: true, data: true, from: true, gasLimit: true, gasPrice: true, nonce: true, to: true, value: true
};
// Recursively replaces ENS names with promises to resolve the name and
// stalls until all promises have returned
@@ -214,7 +214,10 @@ function runMethod(contract, functionName, estimateOnly) {
};
}
function getEventTag(filter) {
return (filter.address || '') + (filter.topics ? filter.topics.join(':') : '');
if (filter.address && (filter.topics == null || filter.topics.length === 0)) {
return '*';
}
return (filter.address || '*') + '@' + (filter.topics ? filter.topics.join(':') : '');
}
var Contract = /** @class */ (function () {
// https://github.com/Microsoft/TypeScript/issues/5453
@@ -366,8 +369,15 @@ var Contract = /** @class */ (function () {
// Listen for any event
if (eventName === '*') {
return {
decode: function (log) {
return [_this.interface.parseLog(log)];
prepareEvent: function (e) {
var parsed = _this.interface.parseLog(e);
if (parsed) {
e.args = parsed.values;
e.decode = parsed.decode;
e.event = parsed.name;
e.eventSignature = parsed.signature;
}
return [e];
},
eventTag: '*',
filter: { address: this.address },
@@ -386,8 +396,12 @@ var Contract = /** @class */ (function () {
topics: [event_1.topic]
};
return {
decode: function (log) {
return event_1.decode(log.data, log.topics);
prepareEvent: function (e) {
var args = event_1.decode(e.data, e.topics);
e.args = args;
var result = Array.prototype.slice.call(args);
result.push(e);
return result;
},
event: event_1,
eventTag: getEventTag(filter_1),
@@ -402,11 +416,11 @@ var Contract = /** @class */ (function () {
var event = null;
if (eventName.topics && eventName.topics[0]) {
filter.topics = eventName.topics;
for (var name in this.interface.events) {
if (name.indexOf('(') === -1) {
for (var name_1 in this.interface.events) {
if (name_1.indexOf('(') === -1) {
continue;
}
var e = this.interface.events[name];
var e = this.interface.events[name_1];
if (e.topic === eventName.topics[0].toLowerCase()) {
event = e;
break;
@@ -414,11 +428,15 @@ var Contract = /** @class */ (function () {
}
}
return {
decode: function (log) {
if (event) {
return event.decode(log.data, log.topics);
prepareEvent: function (e) {
if (!event) {
return [e];
}
return [log];
var args = event.decode(e.data, e.topics);
e.args = args;
var result = Array.prototype.slice.call(args);
result.push(e);
return result;
},
event: event,
eventTag: getEventTag(filter),
@@ -431,18 +449,18 @@ var Contract = /** @class */ (function () {
errors.throwError('events require a provider or a signer with a provider', errors.UNSUPPORTED_OPERATION, { operation: 'once' });
}
var wrappedListener = function (log) {
var decoded = Array.prototype.slice.call(eventFilter.decode(log));
var event = properties_1.deepCopy(log);
event.args = decoded;
event.decode = eventFilter.event.decode;
event.event = eventFilter.event.name;
event.eventSignature = eventFilter.event.signature;
var args = eventFilter.prepareEvent(event);
if (eventFilter.event) {
event.decode = eventFilter.event.decode;
event.event = eventFilter.event.name;
event.eventSignature = eventFilter.event.signature;
}
event.removeListener = function () { _this.removeListener(eventFilter.filter, listener); };
event.getBlock = function () { return _this.provider.getBlock(log.blockHash); };
event.getTransaction = function () { return _this.provider.getTransactionReceipt(log.transactionHash); };
event.getTransaction = function () { return _this.provider.getTransaction(log.transactionHash); };
event.getTransactionReceipt = function () { return _this.provider.getTransactionReceipt(log.transactionHash); };
decoded.push(event);
_this.emit.apply(_this, [eventFilter.filter].concat(decoded));
_this.emit.apply(_this, [eventFilter.filter].concat(args));
};
this.provider.on(eventFilter.filter, wrappedListener);
this._events.push({ eventFilter: eventFilter, listener: listener, wrappedListener: wrappedListener, once: once });
@@ -470,13 +488,16 @@ var Contract = /** @class */ (function () {
var result = false;
var eventFilter = this._getEventFilter(eventName);
this._events = this._events.filter(function (event) {
// Not this event (keep it for later)
if (event.eventFilter.eventTag !== eventFilter.eventTag) {
return true;
}
// Call the callback in the next event loop
setTimeout(function () {
event.listener.apply(_this, args);
}, 0);
result = true;
// Reschedule it if it not "once"
return !(event.once);
});
return result;

90
dist/ethers.js vendored
View File

@@ -1,7 +1,7 @@
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ethers = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.version = "4.0.0";
exports.version = "4.0.1";
},{}],2:[function(require,module,exports){
"use strict";
@@ -107,7 +107,7 @@ var VoidSigner = /** @class */ (function (_super) {
}(abstract_signer_1.Signer));
exports.VoidSigner = VoidSigner;
var allowedTransactionKeys = {
data: true, from: true, gasLimit: true, gasPrice: true, nonce: true, to: true, value: true
chainId: true, data: true, from: true, gasLimit: true, gasPrice: true, nonce: true, to: true, value: true
};
// Recursively replaces ENS names with promises to resolve the name and
// stalls until all promises have returned
@@ -262,7 +262,10 @@ function runMethod(contract, functionName, estimateOnly) {
};
}
function getEventTag(filter) {
return (filter.address || '') + (filter.topics ? filter.topics.join(':') : '');
if (filter.address && (filter.topics == null || filter.topics.length === 0)) {
return '*';
}
return (filter.address || '*') + '@' + (filter.topics ? filter.topics.join(':') : '');
}
var Contract = /** @class */ (function () {
// https://github.com/Microsoft/TypeScript/issues/5453
@@ -414,8 +417,15 @@ var Contract = /** @class */ (function () {
// Listen for any event
if (eventName === '*') {
return {
decode: function (log) {
return [_this.interface.parseLog(log)];
prepareEvent: function (e) {
var parsed = _this.interface.parseLog(e);
if (parsed) {
e.args = parsed.values;
e.decode = parsed.decode;
e.event = parsed.name;
e.eventSignature = parsed.signature;
}
return [e];
},
eventTag: '*',
filter: { address: this.address },
@@ -434,8 +444,12 @@ var Contract = /** @class */ (function () {
topics: [event_1.topic]
};
return {
decode: function (log) {
return event_1.decode(log.data, log.topics);
prepareEvent: function (e) {
var args = event_1.decode(e.data, e.topics);
e.args = args;
var result = Array.prototype.slice.call(args);
result.push(e);
return result;
},
event: event_1,
eventTag: getEventTag(filter_1),
@@ -450,11 +464,11 @@ var Contract = /** @class */ (function () {
var event = null;
if (eventName.topics && eventName.topics[0]) {
filter.topics = eventName.topics;
for (var name in this.interface.events) {
if (name.indexOf('(') === -1) {
for (var name_1 in this.interface.events) {
if (name_1.indexOf('(') === -1) {
continue;
}
var e = this.interface.events[name];
var e = this.interface.events[name_1];
if (e.topic === eventName.topics[0].toLowerCase()) {
event = e;
break;
@@ -462,11 +476,15 @@ var Contract = /** @class */ (function () {
}
}
return {
decode: function (log) {
if (event) {
return event.decode(log.data, log.topics);
prepareEvent: function (e) {
if (!event) {
return [e];
}
return [log];
var args = event.decode(e.data, e.topics);
e.args = args;
var result = Array.prototype.slice.call(args);
result.push(e);
return result;
},
event: event,
eventTag: getEventTag(filter),
@@ -479,18 +497,18 @@ var Contract = /** @class */ (function () {
errors.throwError('events require a provider or a signer with a provider', errors.UNSUPPORTED_OPERATION, { operation: 'once' });
}
var wrappedListener = function (log) {
var decoded = Array.prototype.slice.call(eventFilter.decode(log));
var event = properties_1.deepCopy(log);
event.args = decoded;
event.decode = eventFilter.event.decode;
event.event = eventFilter.event.name;
event.eventSignature = eventFilter.event.signature;
var args = eventFilter.prepareEvent(event);
if (eventFilter.event) {
event.decode = eventFilter.event.decode;
event.event = eventFilter.event.name;
event.eventSignature = eventFilter.event.signature;
}
event.removeListener = function () { _this.removeListener(eventFilter.filter, listener); };
event.getBlock = function () { return _this.provider.getBlock(log.blockHash); };
event.getTransaction = function () { return _this.provider.getTransactionReceipt(log.transactionHash); };
event.getTransaction = function () { return _this.provider.getTransaction(log.transactionHash); };
event.getTransactionReceipt = function () { return _this.provider.getTransactionReceipt(log.transactionHash); };
decoded.push(event);
_this.emit.apply(_this, [eventFilter.filter].concat(decoded));
_this.emit.apply(_this, [eventFilter.filter].concat(args));
};
this.provider.on(eventFilter.filter, wrappedListener);
this._events.push({ eventFilter: eventFilter, listener: listener, wrappedListener: wrappedListener, once: once });
@@ -518,13 +536,16 @@ var Contract = /** @class */ (function () {
var result = false;
var eventFilter = this._getEventFilter(eventName);
this._events = this._events.filter(function (event) {
// Not this event (keep it for later)
if (event.eventFilter.eventTag !== eventFilter.eventTag) {
return true;
}
// Call the callback in the next event loop
setTimeout(function () {
event.listener.apply(_this, args);
}, 0);
result = true;
// Reschedule it if it not "once"
return !(event.once);
});
return result;
@@ -10127,6 +10148,9 @@ function serializeTopics(topics) {
});
return topic.join(',');
}
else if (topic === null) {
return '';
}
return errors.throwError('invalid topic value', errors.INVALID_ARGUMENT, { argument: 'topic', value: topic });
}).join('&');
}
@@ -10139,7 +10163,12 @@ function deserializeTopics(data) {
}
return topic;
}
return comps;
return comps.map(function (topic) {
if (topic === '') {
return null;
}
return topic;
});
});
}
function getEventTag(eventName) {
@@ -14429,18 +14458,17 @@ function shallowCopy(object) {
exports.shallowCopy = shallowCopy;
var opaque = { boolean: true, number: true, string: true };
function deepCopy(object, frozen) {
// Opaque objects are not mutable, so safe to copy by assignment
if (object === undefined || object === null || opaque[typeof (object)]) {
return object;
}
// Arrays are mutable, so we need to create a copy
if (Array.isArray(object)) {
var result_1 = [];
object.forEach(function (item) {
result_1.push(deepCopy(item, frozen));
});
var result = object.map(function (item) { return deepCopy(item, frozen); });
if (frozen) {
Object.freeze(result_1);
Object.freeze(result);
}
return result_1;
return result;
}
if (typeof (object) === 'object') {
// Some internal objects, which are already immutable
@@ -14466,6 +14494,10 @@ function deepCopy(object, frozen) {
}
return result;
}
// The function type is also immutable, so safe to copy by assignment
if (typeof (object) === 'function') {
return object;
}
throw new Error('Cannot deepCopy ' + typeof (object));
}
exports.deepCopy = deepCopy;

2
dist/ethers.min.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

10
dist/ethers.types.txt vendored
View File

@@ -37,10 +37,10 @@ declare module 'ethers/contract' {
topics?: Array<string>;
};
export interface Event extends Log {
args: Array<any>;
decode: (data: string, topics?: Array<string>) => any;
event: string;
eventSignature: string;
args?: Array<any>;
decode?: (data: string, topics?: Array<string>) => any;
event?: string;
eventSignature?: string;
removeListener: () => void;
getBlock: () => Promise<Block>;
getTransaction: () => Promise<TransactionResponse>;
@@ -252,7 +252,7 @@ declare module 'ethers/utils/shims' {
}
declare module 'ethers/_version' {
export const version = "4.0.0";
export const version = "4.0.1";
}
declare module 'ethers/utils/bignumber' {

1
dist/wordlist-es.js vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/wordlist-fr.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -270,6 +270,8 @@ function taskLang(locale) {
});
}
taskLang("es");
taskLang("fr");
taskLang("it");
taskLang("ja");
taskLang("ko");

2
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{
"name": "ethers",
"version": "4.0.0",
"version": "4.0.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "ethers",
"version": "4.0.0",
"version": "4.0.1",
"description": "Ethereum wallet library.",
"main": "./index.js",
"types": "./index.d.ts",
@@ -9,7 +9,7 @@
"auto-build": "npm run build -- -w",
"dist": "npm run dist-version && npm run build && gulp default minified && npm run dist-types",
"dist-test": "gulp default-test minified-test",
"dist-bip39": "gulp bip39-it bip39-ja bip39-ko bip39-zh",
"dist-bip39": "gulp bip39-es bip39-fr bip39-it bip39-ja bip39-ko bip39-zh",
"dist-types": "dts-bundle --name ethers --main ./index.d.ts --out ./dist/ethers.types.txt",
"dist-version": "node -e \"let v = require('./package.json').version; require('fs').writeFileSync('./src.ts/_version.ts', 'export const version = \\\"' + v +'\\\";\\n')\"",
"eslint": "eslint index.js contracts/*.js providers/*.js utils/*.js wallet/*.js wordlists/*.js",
@@ -25,7 +25,7 @@
"elliptic": "6.3.3",
"hash.js": "1.1.3",
"js-sha3": "0.5.7",
"scrypt-js": "2.0.3",
"scrypt-js": "2.0.4",
"setimmediate": "1.0.4",
"uuid": "2.0.1",
"xmlhttprequest": "1.8.0"

View File

@@ -344,6 +344,9 @@ function serializeTopics(topics) {
});
return topic.join(',');
}
else if (topic === null) {
return '';
}
return errors.throwError('invalid topic value', errors.INVALID_ARGUMENT, { argument: 'topic', value: topic });
}).join('&');
}
@@ -356,7 +359,12 @@ function deserializeTopics(data) {
}
return topic;
}
return comps;
return comps.map(function (topic) {
if (topic === '') {
return null;
}
return topic;
});
});
}
function getEventTag(eventName) {

View File

@@ -1 +1 @@
export const version = "4.0.0";
export const version = "4.0.1";

View File

@@ -89,6 +89,9 @@ export class BigNumber implements Hexable {
} else if ((<any>value).toHexString) {
defineReadOnly(this, '_hex', toHex(toBN((<any>value).toHexString())));
} else if ((<any>value)._hex && isHexString((<any>value)._hex)) {
defineReadOnly(this, '_hex', (<any>value)._hex);
} else if (isArrayish(value)) {
defineReadOnly(this, '_hex', toHex(new BN.BN(hexlify(value).substring(2), 16)));

View File

@@ -1,21 +1,29 @@
'use strict';
// Wordlists
// See: https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md
import { Wordlist } from '../utils/wordlist';
import { langEn as _en } from './lang-en';
import { langEs as _es } from './lang-es';
import { langFr as _fr } from './lang-fr';
import { langJa as _ja } from './lang-ja';
import { langKo as _ko } from './lang-ko';
import { langIt as _it } from './lang-it';
import { langEn as _en } from './lang-en';
import { langZhCn as _zh_cn, langZhTw as _zh_tw } from './lang-zh';
const en: Wordlist = _en;
const ko: Wordlist = _ko;
const es: Wordlist = _es;
const fr: Wordlist = _fr;
const it: Wordlist = _it;
const ja: Wordlist = _ja;
const ko: Wordlist = _ko;
const zh: Wordlist = _zh_cn;
const zh_cn: Wordlist = _zh_cn;
const zh_tw: Wordlist = _zh_tw;
export {
en, it, ja, ko, zh, zh_cn, zh_tw
en, es, fr, it, ja, ko, zh, zh_cn, zh_tw
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -19,6 +19,8 @@ function checkWordlist(filename, wordlist) {
describe('Check Wordlists', function() {
checkWordlist('./wordlist-generation/lang-en.txt', ethers.wordlists.en);
checkWordlist('./wordlist-generation/lang-es.txt', ethers.wordlists.es);
checkWordlist('./wordlist-generation/lang-fr.txt', ethers.wordlists.fr);
checkWordlist('./wordlist-generation/lang-it.txt', ethers.wordlists.it);
checkWordlist('./wordlist-generation/lang-ja.txt', ethers.wordlists.ja);
checkWordlist('./wordlist-generation/lang-ko.txt', ethers.wordlists.ko);

View File

@@ -0,0 +1,49 @@
var fs = require('fs');
var ethers = require('../../');
var words = fs.readFileSync('./lang-es.txt').toString();
console.log(ethers.utils.id(words));
words = words.split('\x0a');
var chars = {};
var charsByte = {};
var data = words.map((word) => {
if (!word) { return ''; }
word = word[0].toUpperCase() + word.substring(1);
/*
for (var i = 0; i < word.length; i++) {
chars[word[i]] = (chars[word[i]] || 0) + 1;
charsByte[word[i]] = [ word, ethers.utils.toUtf8Bytes(word) ];
}
*/
return word;
}).join('');
data = ethers.utils.toUtf8Bytes(data);
var output= []
for (var i = 0; i < data.length; i++) {
var c = data[i];
chars[data[i]] = (chars[data[i]] || 0) + 1;
if ((c >= 65 && c <= 90) || (c >= 97 && c <= 123)) {
output.push(c);
} else if (c === 129) {
output.push(0x30);
} else if (c === 131) {
output.push(0x31);
} else if (c === 204) {
output.push(0x32);
} else {
console.log(c);
}
}
//console.log(chars);
output = ethers.utils.toUtf8String(output);
output = output.replace(/n21/g, '~').replace(/20/g, '/')
console.log('Output:', output);

View File

@@ -0,0 +1,43 @@
var fs = require('fs');
var ethers = require('../../');
var words = fs.readFileSync('./lang-fr.txt').toString();
console.log(ethers.utils.id(words));
words = words.split('\x0a');
var chars = {};
var charsByte = {};
var data = words.map((word) => {
if (!word) { return ''; }
word = word[0].toUpperCase() + word.substring(1);
return word;
}).join('');
data = ethers.utils.toUtf8Bytes(data);
var output= []
for (var i = 0; i < data.length; i++) {
var c = data[i];
chars[data[i]] = (chars[data[i]] || 0) + 1;
if ((c >= 65 && c <= 90) || (c >= 97 && c <= 123)) {
output.push(c);
} else if (c === 128) {
output.push(0x31);
} else if (c === 129) {
output.push(0x30);
} else if (c === 204) {
output.push(0x32);
} else {
console.log(c);
}
}
//console.log(chars);
output = ethers.utils.toUtf8String(output);
output = output.replace(/21/g, '-').replace(/20/g, '/')
console.log('Output:', output);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -48,18 +48,17 @@ function shallowCopy(object) {
exports.shallowCopy = shallowCopy;
var opaque = { boolean: true, number: true, string: true };
function deepCopy(object, frozen) {
// Opaque objects are not mutable, so safe to copy by assignment
if (object === undefined || object === null || opaque[typeof (object)]) {
return object;
}
// Arrays are mutable, so we need to create a copy
if (Array.isArray(object)) {
var result_1 = [];
object.forEach(function (item) {
result_1.push(deepCopy(item, frozen));
});
var result = object.map(function (item) { return deepCopy(item, frozen); });
if (frozen) {
Object.freeze(result_1);
Object.freeze(result);
}
return result_1;
return result;
}
if (typeof (object) === 'object') {
// Some internal objects, which are already immutable
@@ -85,6 +84,10 @@ function deepCopy(object, frozen) {
}
return result;
}
// The function type is also immutable, so safe to copy by assignment
if (typeof (object) === 'function') {
return object;
}
throw new Error('Cannot deepCopy ' + typeof (object));
}
exports.deepCopy = deepCopy;

View File

@@ -1,9 +1,11 @@
import { Wordlist } from '../utils/wordlist';
declare const en: Wordlist;
declare const ko: Wordlist;
declare const es: Wordlist;
declare const fr: Wordlist;
declare const it: Wordlist;
declare const ja: Wordlist;
declare const ko: Wordlist;
declare const zh: Wordlist;
declare const zh_cn: Wordlist;
declare const zh_tw: Wordlist;
export { en, it, ja, ko, zh, zh_cn, zh_tw };
export { en, es, fr, it, ja, ko, zh, zh_cn, zh_tw };

View File

@@ -1,18 +1,24 @@
'use strict';
Object.defineProperty(exports, "__esModule", { value: true });
var lang_en_1 = require("./lang-en");
var lang_es_1 = require("./lang-es");
var lang_fr_1 = require("./lang-fr");
var lang_ja_1 = require("./lang-ja");
var lang_ko_1 = require("./lang-ko");
var lang_it_1 = require("./lang-it");
var lang_en_1 = require("./lang-en");
var lang_zh_1 = require("./lang-zh");
var en = lang_en_1.langEn;
exports.en = en;
var ko = lang_ko_1.langKo;
exports.ko = ko;
var es = lang_es_1.langEs;
exports.es = es;
var fr = lang_fr_1.langFr;
exports.fr = fr;
var it = lang_it_1.langIt;
exports.it = it;
var ja = lang_ja_1.langJa;
exports.ja = ja;
var ko = lang_ko_1.langKo;
exports.ko = ko;
var zh = lang_zh_1.langZhCn;
exports.zh = zh;
var zh_cn = lang_zh_1.langZhCn;

8
wordlists/lang-es.d.ts vendored Normal file
View File

@@ -0,0 +1,8 @@
import { Wordlist } from '../utils/wordlist';
declare class LangEs extends Wordlist {
constructor();
getWord(index: number): string;
getWordIndex(word: string): number;
}
declare const langEs: LangEs;
export { langEs };

81
wordlists/lang-es.js Normal file

File diff suppressed because one or more lines are too long

8
wordlists/lang-fr.d.ts vendored Normal file
View File

@@ -0,0 +1,8 @@
import { Wordlist } from '../utils/wordlist';
declare class LangFr extends Wordlist {
constructor();
getWord(index: number): string;
getWordIndex(word: string): number;
}
declare const langFr: LangFr;
export { langFr };

80
wordlists/lang-fr.js Normal file

File diff suppressed because one or more lines are too long