Skip to content

Commit

Permalink
feat(meta): convert to TypeScript
Browse files Browse the repository at this point in the history
Converts the repository to TypeScript so we can get better typechecking
when adding new tooling.
  • Loading branch information
smartcontracts committed Sep 16, 2022
1 parent cd738e9 commit 5140844
Show file tree
Hide file tree
Showing 25 changed files with 2,614 additions and 312 deletions.
188 changes: 188 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
module.exports = {
root: true,
env: {
browser: true,
es6: true,
},
ignorePatterns: ['dist', 'coverage', 'packages/contracts/hardhat'],
extends: ['plugin:prettier/recommended'],
parser: '@babel/eslint-parser',
parserOptions: {
es6: true,
ecmaVersion: 6,
sourceType: 'module',
requireConfigFile: false,
},
plugins: [
'eslint-plugin-import',
'eslint-plugin-unicorn',
'eslint-plugin-jsdoc',
'eslint-plugin-prefer-arrow',
'eslint-plugin-react',
'@typescript-eslint',
],
overrides: [
{
files: ['**/*.ts'],
parser: '@typescript-eslint/parser',
parserOptions: {
project: './packages/**/tsconfig.json',
sourceType: 'module',
allowAutomaticSingleRunInference: true,
},
rules: {
'@typescript-eslint/adjacent-overload-signatures': 'error',
'@typescript-eslint/array-type': 'off',
'@typescript-eslint/ban-types': 'off',
'@typescript-eslint/consistent-type-assertions': 'error',
'@typescript-eslint/dot-notation': 'off',
'@typescript-eslint/indent': 'off',
'@typescript-eslint/member-delimiter-style': [
'off',
{
multiline: {
delimiter: 'none',
requireLast: true,
},
singleline: {
delimiter: 'semi',
requireLast: false,
},
},
],
'@typescript-eslint/member-ordering': 'off',
'@typescript-eslint/naming-convention': 'off',
'@typescript-eslint/no-empty-function': 'error',
'@typescript-eslint/no-empty-interface': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-misused-new': 'error',
'@typescript-eslint/no-namespace': 'error',
'@typescript-eslint/no-parameter-properties': 'off',
'@typescript-eslint/no-shadow': [
'error',
{
hoist: 'all',
},
],
'@typescript-eslint/no-this-alias': 'error',
'@typescript-eslint/no-unused-expressions': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/no-var-requires': 'error',
'@typescript-eslint/prefer-for-of': 'error',
'@typescript-eslint/prefer-function-type': 'error',
'@typescript-eslint/prefer-namespace-keyword': 'error',
'@typescript-eslint/quotes': 'off',
'@typescript-eslint/semi': ['off', null],
'@typescript-eslint/triple-slash-reference': [
'error',
{
path: 'always',
types: 'prefer-import',
lib: 'always',
},
],
'@typescript-eslint/type-annotation-spacing': 'off',
'@typescript-eslint/unified-signatures': 'error',
'@typescript-eslint/no-unused-vars': 'error',
},
},
],
rules: {
'prettier/prettier': 'warn',
'arrow-parens': ['off', 'always'],
'brace-style': ['off', 'off'],
'comma-dangle': 'off',
complexity: 'off',
'constructor-super': 'error',
curly: 'error',
'dot-notation': 'off',
'eol-last': 'off',
eqeqeq: ['error', 'smart'],
'guard-for-in': 'error',
'id-blacklist': 'off',
'id-match': 'off',
'import/no-extraneous-dependencies': ['error'],
'import/no-internal-modules': 'off',
'import/order': [
'error',
{
groups: ['builtin', 'external', 'internal'],
'newlines-between': 'always',
},
],
indent: 'off',
'jsdoc/check-alignment': 'error',
'jsdoc/check-indentation': 'error',
'jsdoc/newline-after-description': 'error',
'linebreak-style': 'off',
'max-classes-per-file': 'off',
'max-len': 'off',
'new-parens': 'off',
'newline-per-chained-call': 'off',
'no-bitwise': 'off',
'no-caller': 'error',
'no-cond-assign': 'error',
'no-console': 'off',
'no-debugger': 'error',
'no-duplicate-case': 'error',
'no-duplicate-imports': 'error',
'no-empty': 'error',
'no-eval': 'error',
'no-extra-bind': 'error',
'no-extra-semi': 'off',
'no-fallthrough': 'off',
'no-invalid-this': 'off',
'no-irregular-whitespace': 'off',
'no-multiple-empty-lines': 'off',
'no-new-func': 'error',
'no-new-wrappers': 'error',
'no-redeclare': 'error',
'no-return-await': 'error',
'no-sequences': 'error',
'no-sparse-arrays': 'error',
'no-template-curly-in-string': 'error',
'no-throw-literal': 'error',
'no-trailing-spaces': 'off',
'no-undef-init': 'error',
'no-underscore-dangle': 'off',
'no-unsafe-finally': 'error',
'no-unused-expressions': 'off',
'no-unused-labels': 'error',
'no-use-before-define': 'off',
'no-var': 'error',
'object-shorthand': 'error',
'one-var': ['error', 'never'],
'padded-blocks': [
'off',
{
blocks: 'never',
},
{
allowSingleLineBlocks: true,
},
],
'prefer-arrow/prefer-arrow-functions': 'error',
'prefer-const': 'error',
'prefer-object-spread': 'error',
'quote-props': 'off',
quotes: 'off',
radix: 'error',
'react/jsx-curly-spacing': 'off',
'react/jsx-equals-spacing': 'off',
'react/jsx-tag-spacing': [
'off',
{
afterOpening: 'allow',
closingSlash: 'allow',
},
],
'react/jsx-wrap-multilines': 'off',
semi: 'off',
'space-before-blocks': 'error',
'space-before-function-paren': 'off',
'space-in-parens': ['off', 'never'],
'unicorn/prefer-ternary': 'off',
'use-isnan': 'error',
'valid-typeof': 'off',
},
}
2 changes: 1 addition & 1 deletion .github/workflows/generate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:

- name: Generate token list
run: |
node ./bin/cli.js generate --datadir ./data --outfile optimism.tokenlist.json
yarn generate --datadir ./data --outfile optimism.tokenlist.json
- name: Commit token list
uses: stefanzweifel/git-auto-commit-action@v4
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/validate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,10 @@ jobs:
- name: Validate token list
run: |
CHANGED=$(git diff --name-only --cached | sed -nr "s/data\/(.*?)\/.*/\1/p" | paste -sd "," -)
node ./bin/cli.js validate --datadir ./data --tokens "${CHANGED}" 2> err.out 1> std.out
yarn validate --datadir ./data --tokens "${CHANGED}" 2> err.out 1> std.out
- name: Upload artifacts
if: ${{ always() }}
uses: actions/upload-artifact@v3
with:
name: logs-artifact
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ node_modules
.env
err.out
std.out
dist/
8 changes: 8 additions & 0 deletions .prettierrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module.exports = {
$schema: 'http://json.schemastore.org/prettierrc',
trailingComma: 'es5',
tabWidth: 2,
semi: false,
singleQuote: true,
arrowParens: 'always',
}
10 changes: 10 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
// Extension identifier format: ${publisher}.${name}. Example: vscode.csharp

// List of extensions which should be recommended for users of this workspace.
"recommendations": [
"dbaeumer.vscode-eslint",
"editorconfig.editorconfig",
],
}
10 changes: 10 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"[typescript]": {
"editor.defaultFormatter": "vscode.typescript-language-features",
"editor.formatOnSave": true
},
"eslint.nodePath": "./node_modules/eslint/bin/",
"eslint.format.enable": true,
"editorconfig.generateAuto": false,
"files.trimTrailingWhitespace": true
}
34 changes: 19 additions & 15 deletions bin/cli.js → bin/cli.ts
Original file line number Diff line number Diff line change
@@ -1,39 +1,43 @@
const fs = require("fs");
import fs from 'fs'

const { Command } = require("commander");
import { Command } from 'commander'

const { generate } = require("../src/generate");
const { validate } = require("../src/validate");
import { generate } from '../src/generate'
import { validate } from '../src/validate'
import { version } from '../package.json'

const program = new Command()

program
.name('optl')
.description('CLI for generating and validating tokenlists')
.version(require('../package.json').version)
.version(version)

program
.command('validate')
.description('Validate tokenlist data files')
.requiredOption('--datadir <datadir>', 'Directory containing data files')
.option('--tokens <tokens>', 'Comma-separated list of tokens symbols to validate')
.option(
'--tokens <tokens>',
'Comma-separated list of tokens symbols to validate'
)
.action(async (options) => {
const results = await validate(options.datadir, options.tokens.split(','));
const results = await validate(options.datadir, options.tokens.split(','))

const errs = results.filter(r => r.type === 'error');
const errs = results.filter((r) => r.type === 'error')
if (errs.length > 0) {
for (const err of errs) {
console.error(`error: ${err.message}`);
console.error(`error: ${err.message}`)
}

// Exit with error code so CI fails
process.exit(1);
process.exit(1)
}

const warns = results.filter(r => r.type === 'warning');
const warns = results.filter((r) => r.type === 'warning')
if (warns.length > 0) {
for (const warn of warns) {
console.log(`warning: ${warn.message}`);
console.log(`warning: ${warn.message}`)
}
}
})
Expand All @@ -44,8 +48,8 @@ program
.requiredOption('--datadir <datadir>', 'Directory containing data files')
.requiredOption('--outfile <outfile>', 'Output file to write')
.action(async (options) => {
const list = generate(options.datadir);
fs.writeFileSync(options.outfile, JSON.stringify(list, null, 2));
const list = generate(options.datadir)
fs.writeFileSync(options.outfile, JSON.stringify(list, null, 2))
})

program.parse();
program.parse()
1 change: 0 additions & 1 deletion index.js

This file was deleted.

2 changes: 2 additions & 0 deletions index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import * as list from './optimism.tokenlist.json'
export default list
5 changes: 5 additions & 0 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
};
41 changes: 33 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,49 @@
"url": "git+https://github.com/ethereum-optimism/tokenlist.git"
},
"scripts": {
"validate": "node ./bin/cli.js validate",
"generate": "node ./bin/cli.js generate",
"test": "jest --detectOpenHandles"
"validate": "ts-node ./bin/cli.ts validate",
"generate": "ts-node ./bin/cli.ts generate",
"build": "tsc -p ./tsconfig.json",
"test": "jest --detectOpenHandles",
"lint:check": "eslint . --max-warnings=0",
"lint:fix": "eslint --fix .",
"lint": "yarn lint:fix && yarn lint:check"
},
"dependencies": {
"devDependencies": {
"@actions/core": "^1.4.0",
"@babel/eslint-parser": "^7.18.2",
"@eth-optimism/contracts": "^0.5.7",
"ethers": "^5.4.1"
},
"devDependencies": {
"@eth-optimism/core-utils": "^0.9.3",
"@types/glob": "^8.0.0",
"@types/jest": "^29.0.3",
"@types/node": "^12.0.0",
"@typescript-eslint/eslint-plugin": "^5.26.0",
"@typescript-eslint/parser": "^4.26.0",
"@uniswap/token-lists": "^1.0.0-beta.30",
"ajv": "^8.11.0",
"ajv-formats": "^2.1.1",
"commander": "^9.4.0",
"eslint": "^8.16.0",
"eslint-config-prettier": "^8.3.0",
"eslint-config-standard": "^16.0.3",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-jsdoc": "^35.1.2",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prefer-arrow": "^1.2.3",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-promise": "^5.1.0",
"eslint-plugin-react": "^7.24.0",
"eslint-plugin-unicorn": "^42.0.0",
"ethers": "^5.4.1",
"glob": "^8.0.3",
"jest": "^28.1.3",
"jsonschema": "^1.4.1",
"node-fetch": "2.6.7"
"mocha": "^8.4.0",
"node-fetch": "2.6.7",
"prettier": "^2.3.1",
"ts-jest": "^29.0.1",
"ts-mocha": "^10.0.0",
"ts-node": "^10.8.2",
"typescript": "^4.6.2"
}
}
Loading

0 comments on commit 5140844

Please sign in to comment.