Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
dist/
build/
coverage/
node_modules/
81 changes: 63 additions & 18 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<<<<<<< HEAD
'use strict';

module.exports = {
Expand Down Expand Up @@ -26,26 +27,70 @@ module.exports = {
'error',
{ argsIgnorePattern: '^_', varsIgnorePattern: '^_' },
],

// Allow explicit `any` with a warning instead of hard error (relax for now)
'@typescript-eslint/no-explicit-any': 'warn',

// Enforce consistent type imports
'@typescript-eslint/consistent-type-imports': [
'airbnb-typescript/base',
],
rules: {
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }],
'@typescript-eslint/quotes': ['error', 'double'],
'import/no-extraneous-dependencies': ['error', { devDependencies: true }],
'import/extensions': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/naming-convention': [
'error',
{
selector: 'variableLike',
format: ['camelCase', 'PascalCase', 'UPPER_CASE'],
leadingUnderscore: 'allow',
},
],
'node/no-missing-import': 'off',
'indent': 'off',
'@typescript-eslint/indent': 'off',
},
overrides: [
{
files: ['**/*.test.ts'],
rules: {
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }],
},
},
],
ignorePatterns: ['dist/', 'node_modules/', 'coverage/', 'build/'],
es2021: true,
jest: true,
},
plugins: ['@typescript-eslint', 'import', 'node', 'promise'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'airbnb-typescript/base',
],
rules: {
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }],
'@typescript-eslint/quotes': ['error', 'double'],
'import/no-extraneous-dependencies': ['error', { devDependencies: true }],
'import/extensions': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/naming-convention': [
'error',
{ prefer: 'type-imports', fixStyle: 'inline-type-imports' },
{
selector: 'variableLike',
format: ['camelCase', 'PascalCase', 'UPPER_CASE'],
leadingUnderscore: 'allow',
},
],

// No floating promises — important for async route handlers
'@typescript-eslint/no-floating-promises': 'error',

// Disallow require() in ESM codebase
'@typescript-eslint/no-require-imports': 'error',
'node/no-missing-import': 'off',
'indent': 'off',
'@typescript-eslint/indent': 'off',
},
ignorePatterns: [
'dist/',
'node_modules/',
'coverage/',
'*.cjs', // ignore this file itself
overrides: [
{
files: ['**/*.test.ts'],
rules: {
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }],
},
},
],
ignorePatterns: ['dist/', 'node_modules/', 'coverage/', 'build/'],
>>>>>>> 4e2f84e (chore: configure ESLint for backend TypeScript)
};
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,16 @@ npm run test:watch
- `GET /api/credit/lines/:id` — Get credit line by id (placeholder)
- `POST /api/risk/evaluate` — Request risk evaluation; body: `{ "walletAddress": "..." }`

## Linting and formatting

Consistent coding practices are enforced via ESLint configured for TypeScript. Run the linter with:

```bash
npm run lint # analyze source files under src/
```

The configuration lives in `.eslintrc.cjs` and common ignores are listed in `.eslintignore`.

## Project layout

```
Expand Down
1 change: 1 addition & 0 deletions coverage/.tmp/coverage-0.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"result":[{"scriptId":"375","url":"file:///home/samaro/cred/Creditra-Backend/src/__test__/creditService.test.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":29158,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":29158,"count":1},{"startOffset":566,"endOffset":29157,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":602,"endOffset":650,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":684,"endOffset":2309,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2340,"endOffset":2909,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2942,"endOffset":3555,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3590,"endOffset":7033,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":7066,"endOffset":10040,"count":0}],"isBlockCoverage":false}]}]}
1 change: 1 addition & 0 deletions coverage/.tmp/coverage-1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"result":[{"scriptId":"375","url":"file:///home/samaro/cred/Creditra-Backend/src/__test__/horizonListener.test.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":42421,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":42421,"count":1}],"isBlockCoverage":true},{"functionName":"silenceConsole","ranges":[{"startOffset":397,"endOffset":615,"count":33}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":473,"endOffset":484,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":536,"endOffset":547,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":600,"endOffset":611,"count":0}],"isBlockCoverage":false},{"functionName":"restoreConsole","ranges":[{"startOffset":616,"endOffset":741,"count":33},{"startOffset":669,"endOffset":673,"count":0},{"startOffset":701,"endOffset":705,"count":0},{"startOffset":734,"endOffset":738,"count":0}],"isBlockCoverage":true},{"functionName":"withEnv","ranges":[{"startOffset":742,"endOffset":1120,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1132,"endOffset":1278,"count":33},{"startOffset":1201,"endOffset":1277,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1291,"endOffset":1461,"count":33},{"startOffset":1340,"endOffset":1369,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1492,"endOffset":3620,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1559,"endOffset":1998,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2036,"endOffset":2253,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2292,"endOffset":2452,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2512,"endOffset":2754,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2808,"endOffset":3021,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3091,"endOffset":3229,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3273,"endOffset":3420,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3467,"endOffset":3616,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3661,"endOffset":4472,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3720,"endOffset":3848,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3904,"endOffset":4181,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":4233,"endOffset":4468,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":4495,"endOffset":6355,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4532,"endOffset":4674,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":4727,"endOffset":5059,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":5114,"endOffset":5684,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":5745,"endOffset":6085,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6128,"endOffset":6351,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6377,"endOffset":8004,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6415,"endOffset":6592,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6654,"endOffset":7142,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":7199,"endOffset":7372,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":7406,"endOffset":7666,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":7724,"endOffset":8000,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":8052,"endOffset":10351,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8119,"endOffset":8461,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":8523,"endOffset":8923,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":8987,"endOffset":9312,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":9393,"endOffset":9887,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":9944,"endOffset":10347,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":10377,"endOffset":12791,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10601,"endOffset":10705,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":10753,"endOffset":10969,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":11034,"endOffset":11463,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":11521,"endOffset":11709,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":11772,"endOffset":11965,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":12033,"endOffset":12364,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":12425,"endOffset":12787,"count":0}],"isBlockCoverage":false}]},{"scriptId":"376","url":"file:///home/samaro/cred/Creditra-Backend/src/services/horizonListener.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":13746,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":13746,"count":1}],"isBlockCoverage":true},{"functionName":"resolveConfig","ranges":[{"startOffset":284,"endOffset":792,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":894,"endOffset":923,"count":0}],"isBlockCoverage":false},{"functionName":"onEvent","ranges":[{"startOffset":927,"endOffset":987,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":1083,"endOffset":1106,"count":0}],"isBlockCoverage":false},{"functionName":"clearEventHandlers","ranges":[{"startOffset":1110,"endOffset":1171,"count":33}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":1278,"endOffset":1312,"count":33}],"isBlockCoverage":true},{"functionName":"dispatchEvent","ranges":[{"startOffset":1316,"endOffset":1565,"count":0}],"isBlockCoverage":false},{"functionName":"pollOnce","ranges":[{"startOffset":1566,"endOffset":2297,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":2394,"endOffset":2418,"count":0}],"isBlockCoverage":false},{"functionName":"isRunning","ranges":[{"startOffset":2422,"endOffset":2464,"count":33}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":2562,"endOffset":2587,"count":33}],"isBlockCoverage":true},{"functionName":"getConfig","ranges":[{"startOffset":2591,"endOffset":2638,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":2736,"endOffset":2761,"count":0}],"isBlockCoverage":false},{"functionName":"start","ranges":[{"startOffset":2765,"endOffset":3413,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":3507,"endOffset":3528,"count":0}],"isBlockCoverage":false},{"functionName":"stop","ranges":[{"startOffset":3532,"endOffset":3846,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":3939,"endOffset":3959,"count":0}],"isBlockCoverage":false}]}]}
1 change: 1 addition & 0 deletions coverage/.tmp/coverage-2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"result":[{"scriptId":"375","url":"file:///home/samaro/cred/Creditra-Backend/src/__test__/creditRoute.test.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":28745,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":28745,"count":1},{"startOffset":384,"endOffset":28744,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1055,"endOffset":1178,"count":0}],"isBlockCoverage":false},{"functionName":"buildApp","ranges":[{"startOffset":1239,"endOffset":1429,"count":0}],"isBlockCoverage":false},{"functionName":"allowAdmin","ranges":[{"startOffset":1529,"endOffset":1620,"count":0}],"isBlockCoverage":false},{"functionName":"denyAdmin","ranges":[{"startOffset":1621,"endOffset":1806,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1840,"endOffset":1904,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1939,"endOffset":1977,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2014,"endOffset":2764,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2805,"endOffset":3606,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3672,"endOffset":4357,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":4424,"endOffset":6302,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6366,"endOffset":7045,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":7110,"endOffset":9579,"count":0}],"isBlockCoverage":false}]}]}
1 change: 1 addition & 0 deletions coverage/.tmp/coverage-3.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"result":[{"scriptId":"375","url":"file:///home/samaro/cred/Creditra-Backend/src/__test__/riskService.test.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":19908,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":19908,"count":1},{"startOffset":354,"endOffset":19907,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":555,"endOffset":2194,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2228,"endOffset":3202,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3234,"endOffset":6310,"count":0}],"isBlockCoverage":false}]}]}
1 change: 1 addition & 0 deletions coverage/.tmp/coverage-4.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"result":[{"scriptId":"375","url":"file:///home/samaro/cred/Creditra-Backend/src/__test__/riskRoute.test.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15957,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":15957,"count":1},{"startOffset":384,"endOffset":15956,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":795,"endOffset":856,"count":0}],"isBlockCoverage":false},{"functionName":"buildApp","ranges":[{"startOffset":926,"endOffset":1114,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1436,"endOffset":5283,"count":0}],"isBlockCoverage":false}]}]}
Loading