Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F13711339
D17053.id50593.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
40 KB
Subscribers
None
D17053.id50593.diff
View Options
diff --git a/cashtab/.eslintrc.js b/cashtab/.eslintrc.js
--- a/cashtab/.eslintrc.js
+++ b/cashtab/.eslintrc.js
@@ -20,23 +20,41 @@
},
extends: [
'eslint:recommended',
+ 'plugin:@typescript-eslint/recommended',
'plugin:react/recommended',
'plugin:jest/recommended',
],
+ parser: '@typescript-eslint/parser',
parserOptions: {
+ ecmaVersion: 2020,
+ sourceType: 'module',
+ project: './tsconfig.json',
+ tsconfigRootDir: __dirname,
ecmaFeatures: {
jsx: true,
},
- ecmaVersion: 12,
- sourceType: 'module',
},
- plugins: ['etc', 'react', 'jest', 'testing-library', 'header'],
+ plugins: [
+ 'etc',
+ 'react',
+ 'jest',
+ 'testing-library',
+ 'header',
+ '@typescript-eslint',
+ ],
rules: {
'jest/no-mocks-import': 'off',
'etc/no-commented-out-code': 'error',
'header/header': [2, 'line', headerArray, 2],
},
- settings: { react: { version: 'detect' } },
+ settings: {
+ 'react': { version: 'detect' },
+ 'import/resolver': {
+ node: {
+ paths: ['src'],
+ },
+ },
+ },
overrides: [
{
// Enable eslint-plugin-testing-library rules or preset only for matching testing files!
diff --git a/cashtab/jsconfig.json b/cashtab/jsconfig.json
deleted file mode 100644
--- a/cashtab/jsconfig.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "compilerOptions": {
- "baseUrl": "src"
- },
- "include": ["src"]
-}
diff --git a/cashtab/package-lock.json b/cashtab/package-lock.json
--- a/cashtab/package-lock.json
+++ b/cashtab/package-lock.json
@@ -34,6 +34,7 @@
"devDependencies": {
"@babel/core": "^7.16.0",
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
+ "@babel/preset-typescript": "^7.26.0",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
"@svgr/webpack": "^6.3.1",
"@testing-library/jest-dom": "^6.4.2",
@@ -258,13 +259,14 @@
}
},
"node_modules/@babel/code-frame": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz",
- "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==",
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/highlight": "^7.25.7",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
"picocolors": "^1.0.0"
},
"engines": {
@@ -362,13 +364,14 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz",
- "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==",
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz",
+ "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.25.7",
+ "@babel/parser": "^7.26.2",
+ "@babel/types": "^7.26.0",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^3.0.2"
@@ -378,13 +381,13 @@
}
},
"node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz",
- "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+ "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.25.7"
+ "@babel/types": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -432,18 +435,18 @@
}
},
"node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz",
- "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
+ "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.25.7",
- "@babel/helper-member-expression-to-functions": "^7.25.7",
- "@babel/helper-optimise-call-expression": "^7.25.7",
- "@babel/helper-replace-supers": "^7.25.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7",
- "@babel/traverse": "^7.25.7",
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
"semver": "^6.3.1"
},
"engines": {
@@ -509,44 +512,43 @@
}
},
"node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz",
- "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
+ "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.25.7",
- "@babel/types": "^7.25.7"
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz",
- "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.25.7",
- "@babel/types": "^7.25.7"
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz",
- "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==",
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-module-imports": "^7.25.7",
- "@babel/helper-simple-access": "^7.25.7",
- "@babel/helper-validator-identifier": "^7.25.7",
- "@babel/traverse": "^7.25.7"
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -556,22 +558,22 @@
}
},
"node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz",
- "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
+ "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.25.7"
+ "@babel/types": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-plugin-utils": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz",
- "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
+ "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -597,15 +599,15 @@
}
},
"node_modules/@babel/helper-replace-supers": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz",
- "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz",
+ "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-member-expression-to-functions": "^7.25.7",
- "@babel/helper-optimise-call-expression": "^7.25.7",
- "@babel/traverse": "^7.25.7"
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -615,37 +617,37 @@
}
},
"node_modules/@babel/helper-simple-access": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz",
- "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz",
+ "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.25.7",
- "@babel/types": "^7.25.7"
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz",
- "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
+ "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.25.7",
- "@babel/types": "^7.25.7"
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz",
- "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -653,9 +655,9 @@
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz",
- "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -663,9 +665,9 @@
}
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz",
- "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -701,30 +703,14 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/highlight": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz",
- "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.25.7",
- "chalk": "^2.4.2",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
"node_modules/@babel/parser": {
- "version": "7.25.8",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz",
- "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==",
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
+ "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.25.8"
+ "@babel/types": "^7.26.0"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -1092,13 +1078,13 @@
}
},
"node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz",
- "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+ "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1218,13 +1204,13 @@
}
},
"node_modules/@babel/plugin-syntax-typescript": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz",
- "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
+ "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1655,15 +1641,15 @@
}
},
"node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz",
- "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz",
+ "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-module-transforms": "^7.25.7",
- "@babel/helper-plugin-utils": "^7.25.7",
- "@babel/helper-simple-access": "^7.25.7"
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-simple-access": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2139,17 +2125,17 @@
}
},
"node_modules/@babel/plugin-transform-typescript": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz",
- "integrity": "sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz",
+ "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.25.7",
- "@babel/helper-create-class-features-plugin": "^7.25.7",
- "@babel/helper-plugin-utils": "^7.25.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7",
- "@babel/plugin-syntax-typescript": "^7.25.7"
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-syntax-typescript": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2368,17 +2354,17 @@
}
},
"node_modules/@babel/preset-typescript": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz",
- "integrity": "sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==",
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz",
+ "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.7",
- "@babel/helper-validator-option": "^7.25.7",
- "@babel/plugin-syntax-jsx": "^7.25.7",
- "@babel/plugin-transform-modules-commonjs": "^7.25.7",
- "@babel/plugin-transform-typescript": "^7.25.7"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.25.9",
+ "@babel/plugin-transform-typescript": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2401,32 +2387,32 @@
}
},
"node_modules/@babel/template": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz",
- "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
+ "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.25.7",
- "@babel/parser": "^7.25.7",
- "@babel/types": "^7.25.7"
+ "@babel/code-frame": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/types": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz",
- "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz",
+ "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.25.7",
- "@babel/generator": "^7.25.7",
- "@babel/parser": "^7.25.7",
- "@babel/template": "^7.25.7",
- "@babel/types": "^7.25.7",
+ "@babel/code-frame": "^7.25.9",
+ "@babel/generator": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.25.9",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -2435,15 +2421,14 @@
}
},
"node_modules/@babel/types": {
- "version": "7.25.8",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz",
- "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==",
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
+ "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-string-parser": "^7.25.7",
- "@babel/helper-validator-identifier": "^7.25.7",
- "to-fast-properties": "^2.0.0"
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -5912,19 +5897,6 @@
"node": ">=8"
}
},
- "node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/any-promise": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
@@ -7340,21 +7312,6 @@
"bigi": "^1.4.2"
}
},
- "node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/char-regex": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
@@ -7522,23 +7479,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/colord": {
"version": "2.9.3",
"resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
@@ -9365,16 +9305,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/escodegen": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
@@ -20890,16 +20820,6 @@
"dev": true,
"license": "BSD-3-Clause"
},
- "node_modules/to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
diff --git a/cashtab/package.json b/cashtab/package.json
--- a/cashtab/package.json
+++ b/cashtab/package.json
@@ -51,6 +51,7 @@
"devDependencies": {
"@babel/core": "^7.16.0",
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
+ "@babel/preset-typescript": "^7.26.0",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
"@svgr/webpack": "^6.3.1",
"@testing-library/jest-dom": "^6.4.2",
diff --git a/cashtab/src/components/Common/GoogleAnalytics.js b/cashtab/src/components/Common/GoogleAnalytics.js
--- a/cashtab/src/components/Common/GoogleAnalytics.js
+++ b/cashtab/src/components/Common/GoogleAnalytics.js
@@ -46,7 +46,7 @@
: // If you are building the extension, export function that does nothing
// Note: it's not practical to conditionally remove calls to this function from all screens
// So, more practical to just define it as a do-nothing function for the extension
- () => {};
+ () => undefined;
export default process.env.REACT_APP_BUILD_ENV !== 'extension'
? {
@@ -54,6 +54,6 @@
init,
}
: {
- RouteTracker: () => {},
+ RouteTracker: () => undefined,
init,
};
diff --git a/cashtab/src/config/app.js b/cashtab/src/config/app.ts
rename from cashtab/src/config/app.js
rename to cashtab/src/config/app.ts
--- a/cashtab/src/config/app.js
+++ b/cashtab/src/config/app.ts
@@ -5,8 +5,41 @@
import mainLogo from 'assets/logo_primary.png';
import tokenLogo from 'assets/logo_secondary.png';
+interface AppConfig {
+ name: string;
+ ticker: string;
+ derivationPath: number;
+ logo: string; // path to png file
+ prefix: string;
+ coingeckoId: string;
+ fiatUpdateIntervalMs: number;
+ defaultFee: number;
+ minFee: number;
+ dustSats: number;
+ cashDecimals: number;
+ fiatDecimals: number;
+ pricePrecisionDecimals: number;
+ tokenName: string;
+ tokenTicker: string;
+ tokenLogo: string; // path to png file
+ localStorageMaxCharacters: number;
+ monitorExtension: false;
+ vipTokens: {
+ grumpy: {
+ tokenId: string;
+ // decimalized string, i.e. one million GRP tokens
+ vipBalance: string;
+ };
+ cachet: {
+ tokenId: string;
+ // decimalized string, i.e. one thousand CACHET tokens
+ vipBalance: string;
+ };
+ };
+ defaultLocale: string;
+}
// App settings not adjustable by the user
-const appConfig = {
+const appConfig: AppConfig = {
name: 'eCash',
ticker: process.env.REACT_APP_TESTNET === 'true' ? 'tXEC' : 'XEC',
derivationPath: 1899,
diff --git a/cashtab/src/types.d.ts b/cashtab/src/types.d.ts
new file mode 100644
--- /dev/null
+++ b/cashtab/src/types.d.ts
@@ -0,0 +1,5 @@
+// Copyright (c) 2024 The Bitcoin developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+declare module '*.png';
diff --git a/cashtab/src/utils/formatting.js b/cashtab/src/utils/formatting.ts
rename from cashtab/src/utils/formatting.js
rename to cashtab/src/utils/formatting.ts
--- a/cashtab/src/utils/formatting.js
+++ b/cashtab/src/utils/formatting.ts
@@ -5,12 +5,16 @@
import appConfig from 'config/app';
import { toXec } from 'wallet';
-export const formatDate = (dateString, userLocale = 'en') => {
- const options = { month: 'short', day: 'numeric', year: 'numeric' };
+export const formatDate = (dateString: string, userLocale = 'en'): string => {
+ const options: Intl.DateTimeFormatOptions = {
+ month: 'short',
+ day: 'numeric',
+ year: 'numeric',
+ };
const dateFormattingError = 'Unable to format date.';
try {
if (dateString) {
- return new Date(dateString * 1000).toLocaleDateString(
+ return new Date(Number(dateString) * 1000).toLocaleDateString(
userLocale,
options,
);
@@ -21,32 +25,29 @@
}
};
-export const formatFiatBalance = (fiatBalance, optionalLocale) => {
+export const formatFiatBalance = (
+ fiatBalance: number,
+ userLocale = 'en-US',
+) => {
try {
if (fiatBalance === 0) {
return Number(fiatBalance).toFixed(appConfig.cashDecimals);
}
- if (optionalLocale === undefined) {
- return fiatBalance.toLocaleString({
- maximumFractionDigits: appConfig.cashDecimals,
- });
- }
- return fiatBalance.toLocaleString(optionalLocale, {
+ const options: Intl.NumberFormatOptions = {
maximumFractionDigits: appConfig.cashDecimals,
- });
+ };
+ return fiatBalance.toLocaleString(userLocale, options);
} catch (err) {
return fiatBalance;
}
};
-export const formatBalance = (unformattedBalance, optionalLocale) => {
+export const formatBalance = (
+ unformattedBalance: string,
+ userLocale = 'en-US',
+): string => {
try {
- if (optionalLocale === undefined) {
- return new Number(unformattedBalance).toLocaleString({
- maximumFractionDigits: appConfig.cashDecimals,
- });
- }
- return new Number(unformattedBalance).toLocaleString(optionalLocale, {
+ return new Number(unformattedBalance).toLocaleString(userLocale, {
maximumFractionDigits: appConfig.cashDecimals,
});
} catch (err) {
@@ -57,14 +58,13 @@
};
/**
- * Add locale number formatting to a decimalized token quantity
- * @param {string} decimalizedTokenQty e.g. 100.123
- * @param {string} userLocale e.g. 'en-US'
+ * Add locale number formatting to a decimalized
+ * token quantity
*/
export const decimalizedTokenQtyToLocaleFormat = (
- decimalizedTokenQty,
- userLocale,
-) => {
+ decimalizedTokenQty: string,
+ userLocale: string,
+): string => {
// Note that we cannot parseFloat(decimalizedTokenQty) because it will round some numbers at
// upper end of possible token quantities
// So, use a string method
@@ -104,7 +104,10 @@
return localeTokenString;
};
-export const toFormattedXec = (satoshis, userLocale) => {
+export const toFormattedXec = (
+ satoshis: number,
+ userLocale: string,
+): string => {
// Get XEC balance
let xecAmount = toXec(satoshis);
// Format up to max supply
@@ -133,13 +136,12 @@
};
/**
- * Determine how many decimal places to render to support at least 2 places of precision
- * @param {number} number
- * @returns {integer}
+ * Determine how many decimal places to render to support
+ * at least 2 places of precision *
*/
const MAX_DIGITS_TO_RENDER = 20; // max supported by Intl.NumberFormat
const DESIRED_PRECISION = appConfig.cashDecimals;
-export const getMinimumFractionDigits = number => {
+export const getMinimumFractionDigits = (number: number): number => {
if (number === 0 || number >= 1) {
return DESIRED_PRECISION;
}
@@ -152,29 +154,37 @@
);
};
+/**
+ * Note
+ * This should not live here
+ * But, as part of gradually implementing ts
+ * needs to live in a ts file until it finds its rightful home
+ */
+export interface CashtabSettings {
+ autoCameraOn: boolean;
+ balanceVisible: boolean;
+ fiatCurrency: string;
+ hideMessagesFromUnknownSenders: boolean;
+ minFeeSends: boolean;
+ sendModal: boolean;
+}
/**
* Agora token prices may be much less than $1
- * Format so you have 2 decimals of price precision and account for crazy leading zeros
- * @param {object} settings
- * @param {string} userLocale
- * @param {number} priceXec
- * @param {number | null} fiatPrice
+ * Format so you have 2 decimals of price precision and account for crazy leading zeros *
*/
export const getFormattedFiatPrice = (
- settings,
- userLocale,
- priceXec,
- fiatPrice,
-) => {
+ settings: CashtabSettings,
+ userLocale: string,
+ priceXec: number,
+ fiatPrice: number | null,
+): string => {
const renderFiat = typeof fiatPrice === 'number';
- const renderedPrice = renderFiat
- ? parseFloat(priceXec) * fiatPrice
- : parseFloat(priceXec);
+ const renderedPrice = renderFiat ? priceXec * fiatPrice : priceXec;
let ticker = 'XEC';
if (renderFiat) {
ticker = settings.fiatCurrency.toUpperCase();
}
- let renderedDecimalPlaces = getMinimumFractionDigits(renderedPrice);
+ const renderedDecimalPlaces = getMinimumFractionDigits(renderedPrice);
if (renderFiat) {
// Note that while some locales will include the currency code
diff --git a/cashtab/tsconfig.json b/cashtab/tsconfig.json
new file mode 100644
--- /dev/null
+++ b/cashtab/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "compilerOptions": {
+ "target": "es2020",
+ "module": "commonjs",
+ "outDir": "./dist",
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "strict": true,
+ "alwaysStrict": true,
+ "skipLibCheck": true,
+ "declaration": true,
+ "baseUrl": "src",
+ "allowJs": true
+ },
+ "include": ["src", ".eslintrc.js"]
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Apr 26, 11:41 (16 h, 48 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5573430
Default Alt Text
D17053.id50593.diff (40 KB)
Attached To
D17053: [Cashtab] Implement typescript
Event Timeline
Log In to Comment