diff --git a/.eslintrc.json b/.eslintrc.json index 6ff7d29..928bdfd 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -15,10 +15,11 @@ "parser": "@typescript-eslint/parser", "parserOptions": { "ecmaVersion": "latest", - "project": "./tsconfig.json" + "project": "./tsconfig.eslint.json" }, "plugins": [ - "import", "prettier" + "import", + "prettier" ], "rules": { "no-plusplus": [ @@ -27,6 +28,10 @@ "allowForLoopAfterthoughts": true } ], + "import/extensions": [ + 2, + "ignorePackages" + ], "prettier/prettier": [ "error" ] diff --git a/.npmignore b/.npmignore index ad94a23..10bfb9b 100644 --- a/.npmignore +++ b/.npmignore @@ -1,9 +1,8 @@ **/* -dist/src/utils/__mock__ -dist/test/* -!dist/src/analysis/* -!dist/src/middleware/* -!dist/src/rateLimiters/* -!dist/src/utils/* -!dist/src/* +dist/utils/__mock__ +!dist/analysis/* +!dist/middleware/* +!dist/rateLimiters/* +!dist/utils/* +!dist/* !package.json \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 27704f5..94447ce 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,6 @@ script: # specify deployment before_deploy: - 'npm run build' - - 'npm run build:fix' deploy: on: diff --git a/.vscode/launch.json b/.vscode/launch.json index 9ba126c..a2a0703 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,20 +4,22 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ - - { - "type": "node", - "request": "launch", - "name": "Jest Tests", - "program": "${workspaceRoot}/node_modules/jest/bin/jest.js", - "args": [ - "-i", "--verbose", "--no-cache" - ], - // "preLaunchTask": "build", - // "internalConsoleOptions": "openOnSessionStart", - // "outFiles": [ - // "${workspaceRoot}/dist/**/*" - // ], - // "envFile": "${workspaceRoot}/.env" - }] + { + "type": "node", + "request": "launch", + "name": "Jest Tests", + "program": "${workspaceRoot}/node_modules/jest/bin/jest.js", + "args": [ + "-i", + "--verbose", + "--no-cache" + ], + // "preLaunchTask": "build", + // "internalConsoleOptions": "openOnSessionStart", + // "outFiles": [ + // "${workspaceRoot}/dist/**/*" + // ], + // "envFile": "${workspaceRoot}/.env" + } + ] } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 6dade31..bbf5fac 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,20 +4,26 @@ "editor.codeActionsOnSave": { "source.fixAll.eslint": true }, + "eslint.workingDirectories": [ + "./*" + ], "editor.formatOnSave": true, - "configurations": [{ - "type": "node", - "request": "launch", - "name": "Jest Tests", - "program": "${workspaceRoot}\\node_modules\\jest\\bin\\jest.js", - "args": [ + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Jest Tests", + "program": "${workspaceRoot}\\node_modules\\jest\\bin\\jest.js", + "args": [ "-i" - ], - // "preLaunchTask": "build", - "internalConsoleOptions": "openOnSessionStart", - "outFiles": [ + ], + // "preLaunchTask": "build", + "internalConsoleOptions": "openOnSessionStart", + "outFiles": [ "${workspaceRoot}/dist/**/*" - ], - "envFile": "${workspaceRoot}/.env" - }] + ], + "envFile": "${workspaceRoot}/.env" + } + ], + "jest.jestCommandLine": "npm t --", } \ No newline at end of file diff --git a/jest.config.ts b/jest.config.ts index 85af1ef..2866418 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -5,7 +5,20 @@ const config: Config.InitialOptions = { roots: ['./test'], preset: 'ts-jest', testEnvironment: 'node', - moduleFileExtensions: ['js', 'ts'], + // moduleFileExtensions: ['js', 'ts'], + // Bellow is needed to resolve imports with .js extensions + transform: { + '\\.[jt]s?$': 'ts-jest', + }, + globals: { + 'ts-jest': { + useESM: true, + }, + }, + moduleNameMapper: { + '(.+)\\.js': '$1', + }, + extensionsToTreatAsEsm: ['.ts'], }; export default config; diff --git a/package-lock.json b/package-lock.json index 4ee6a83..41a2fdb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "graphql-limiter", - "version": "1.1.0", + "version": "1.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "graphql-limiter", - "version": "1.1.0", + "version": "1.3.0", "license": "ISC", "dependencies": { "graphql": "^16.5.0", @@ -22,7 +22,6 @@ "@types/jest": "^27.5.1", "@typescript-eslint/eslint-plugin": "^5.24.0", "@typescript-eslint/parser": "^5.24.0", - "add-js-extension": "^1.0.4", "babel-jest": "^28.1.0", "eslint": "^8.15.0", "eslint-config-airbnb-base": "^15.0.0", @@ -2677,12 +2676,6 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, "node_modules/@types/node": { "version": "17.0.34", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.34.tgz", @@ -2974,25 +2967,6 @@ "node": ">=0.4.0" } }, - "node_modules/add-js-extension": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/add-js-extension/-/add-js-extension-1.0.4.tgz", - "integrity": "sha512-CB9EVl83CcyJkn/y2TaZR9vO5lhCdzixECXRBPW9QVkUvxPYrnINv39gVTXl6Qnw8VBhtqzlXUBkA5wwwINGug==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.14.7", - "@babel/traverse": "^7.14.7", - "@babel/types": "^7.14.5", - "@types/minimist": "^1.2.1", - "chokidar": "^3.5.2", - "colors": "^1.4.0", - "concurrently": "^6.2.0", - "minimist": "^1.2.5" - }, - "bin": { - "yab": "dist/bin.js" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -3307,15 +3281,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3466,45 +3431,6 @@ "node": ">=10" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/ci-info": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", @@ -3642,15 +3568,6 @@ "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -3666,111 +3583,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "node_modules/concurrently": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.5.1.tgz", - "integrity": "sha512-FlSwNpGjWQfRwPLXvJ/OgysbBxPkWpiVjy1042b0U7on7S7qwwMIILRj7WTN1mTgqa582bG6NFuScOoh6Zgdag==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "date-fns": "^2.16.1", - "lodash": "^4.17.21", - "rxjs": "^6.6.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^16.2.0" - }, - "bin": { - "concurrently": "bin/concurrently.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/concurrently/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/concurrently/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/concurrently/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/concurrently/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/concurrently/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -3829,19 +3641,6 @@ "node": ">= 8" } }, - "node_modules/date-fns": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.1.tgz", - "integrity": "sha512-dlLD5rKaKxpFdnjrs+5azHDFOPEu4ANy/LTh04A1DTzMM7qoajmKCBc8pkKRFT41CNzw+4gQh79X5C+Jq27HAw==", - "dev": true, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -5076,18 +4875,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -6195,12 +5982,6 @@ "node": ">=4" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -9409,18 +9190,6 @@ "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", "dev": true }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/readline-sync": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", @@ -9826,12 +9595,6 @@ "source-map": "^0.6.0" } }, - "node_modules/spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", - "dev": true - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -10124,15 +9887,6 @@ "node": ">=8.0" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, "node_modules/ts-jest": { "version": "28.0.2", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.2.tgz", @@ -12592,12 +12346,6 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, "@types/node": { "version": "17.0.34", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.34.tgz", @@ -12785,22 +12533,6 @@ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, - "add-js-extension": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/add-js-extension/-/add-js-extension-1.0.4.tgz", - "integrity": "sha512-CB9EVl83CcyJkn/y2TaZR9vO5lhCdzixECXRBPW9QVkUvxPYrnINv39gVTXl6Qnw8VBhtqzlXUBkA5wwwINGug==", - "dev": true, - "requires": { - "@babel/parser": "^7.14.7", - "@babel/traverse": "^7.14.7", - "@babel/types": "^7.14.5", - "@types/minimist": "^1.2.1", - "chokidar": "^3.5.2", - "colors": "^1.4.0", - "concurrently": "^6.2.0", - "minimist": "^1.2.5" - } - }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -13037,12 +12769,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -13143,33 +12869,6 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, "ci-info": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", @@ -13281,12 +12980,6 @@ "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, "commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -13299,86 +12992,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "concurrently": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.5.1.tgz", - "integrity": "sha512-FlSwNpGjWQfRwPLXvJ/OgysbBxPkWpiVjy1042b0U7on7S7qwwMIILRj7WTN1mTgqa582bG6NFuScOoh6Zgdag==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "date-fns": "^2.16.1", - "lodash": "^4.17.21", - "rxjs": "^6.6.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^16.2.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } - } - }, "confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -13429,12 +13042,6 @@ "which": "^2.0.1" } }, - "date-fns": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.1.tgz", - "integrity": "sha512-dlLD5rKaKxpFdnjrs+5azHDFOPEu4ANy/LTh04A1DTzMM7qoajmKCBc8pkKRFT41CNzw+4gQh79X5C+Jq27HAw==", - "dev": true - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -14352,15 +13959,6 @@ "has-bigints": "^1.0.1" } }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, "is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -15177,12 +14775,6 @@ "path-exists": "^3.0.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -17446,15 +17038,6 @@ "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", "dev": true }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, "readline-sync": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", @@ -17754,12 +17337,6 @@ "source-map": "^0.6.0" } }, - "spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", - "dev": true - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -17975,12 +17552,6 @@ "is-number": "^7.0.0" } }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, "ts-jest": { "version": "28.0.2", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.2.tgz", diff --git a/package.json b/package.json index 73b1cbb..25f9d80 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,8 @@ "name": "graphql-limiter", "version": "1.3.0", "description": "A GraphQL rate limiting library using query complexity analysis.", - "main": "./dist/src/index.js", - "types": "./dist/src/index.d.ts", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", "type": "module", "scripts": { "test": "jest --passWithNoTests --coverage --detectOpenHandles", @@ -11,8 +11,7 @@ "lint:fix": "eslint --fix src test @types", "prettier": "prettier --write .", "prepare": "husky install", - "build": "tsc", - "build:fix": "node node_modules/.bin/yab dist" + "build": "tsc" }, "repository": { "type": "git", @@ -44,7 +43,6 @@ "@types/jest": "^27.5.1", "@typescript-eslint/eslint-plugin": "^5.24.0", "@typescript-eslint/parser": "^5.24.0", - "add-js-extension": "^1.0.4", "babel-jest": "^28.1.0", "eslint": "^8.15.0", "eslint-config-airbnb-base": "^15.0.0", @@ -70,4 +68,4 @@ "graphql": "^16.5.0", "ioredis": "^5.0.5" } -} +} \ No newline at end of file diff --git a/src/@types/expressMiddleware.d.ts b/src/@types/expressMiddleware.d.ts index 487fa38..dfee73d 100644 --- a/src/@types/expressMiddleware.d.ts +++ b/src/@types/expressMiddleware.d.ts @@ -1,6 +1,6 @@ import { RedisOptions } from 'ioredis'; -import { TypeWeightConfig, TypeWeightSet } from './buildTypeWeights'; -import { RateLimiterConfig } from './rateLimit'; +import { TypeWeightConfig, TypeWeightSet } from './buildTypeWeights.d.ts'; +import { RateLimiterConfig } from './rateLimit.d.ts'; // extend ioredis configuration options to include an expiry prooperty for rate limiting cache interface RedisConfig { diff --git a/src/analysis/QueryParser.ts b/src/analysis/QueryParser.ts index d2b7010..f55de9f 100644 --- a/src/analysis/QueryParser.ts +++ b/src/analysis/QueryParser.ts @@ -7,7 +7,7 @@ import { DirectiveNode, SelectionNode, } from 'graphql'; -import { FieldWeight, TypeWeightObject, Variables } from '../@types/buildTypeWeights'; +import { FieldWeight, TypeWeightObject, Variables } from '../@types/buildTypeWeights.js'; /** * The AST node functions call each other following the nested structure below * Each function handles a specific GraphQL AST node type diff --git a/src/analysis/buildTypeWeights.ts b/src/analysis/buildTypeWeights.ts index 75bbe5b..1566083 100644 --- a/src/analysis/buildTypeWeights.ts +++ b/src/analysis/buildTypeWeights.ts @@ -29,7 +29,7 @@ import { Type, Fields, FieldMap, -} from '../@types/buildTypeWeights'; +} from '../@types/buildTypeWeights.js'; export const KEYWORDS = ['first', 'last', 'limit']; @@ -409,7 +409,7 @@ function parseTypes( * @param enforceBoundedLists Defaults to false * @param typeWeightsConfig Defaults to {mutation: 10, object: 1, field: 0, connection: 2} */ -function buildTypeWeightsFromSchema( +export default function buildTypeWeightsFromSchema( schema: GraphQLSchema, typeWeightsConfig: TypeWeightConfig = defaultTypeWeightsConfig, enforceBoundedLists = false @@ -437,5 +437,3 @@ function buildTypeWeightsFromSchema( throw new Error(`Error in expressGraphQLRateLimiter when parsing schema object: ${err}`); } } - -export default buildTypeWeightsFromSchema; diff --git a/src/middleware/index.ts b/src/middleware/index.ts index c47baa4..c654aa9 100644 --- a/src/middleware/index.ts +++ b/src/middleware/index.ts @@ -2,12 +2,14 @@ import EventEmitter from 'events'; import { parse, validate } from 'graphql'; import { GraphQLSchema } from 'graphql/type/schema'; import { Request, Response, NextFunction, RequestHandler } from 'express'; -import buildTypeWeightsFromSchema, { defaultTypeWeightsConfig } from '../analysis/buildTypeWeights'; -import setupRateLimiter from './rateLimiterSetup'; -import { ExpressMiddlewareConfig, ExpressMiddlewareSet } from '../@types/expressMiddleware'; -import { RateLimiterResponse } from '../@types/rateLimit'; -import { connect } from '../utils/redis'; -import QueryParser from '../analysis/QueryParser'; +import buildTypeWeightsFromSchema, { + defaultTypeWeightsConfig, +} from '../analysis/buildTypeWeights.js'; +import setupRateLimiter from './rateLimiterSetup.js'; +import { ExpressMiddlewareConfig, ExpressMiddlewareSet } from '../@types/expressMiddleware.js'; +import { RateLimiterResponse } from '../@types/rateLimit.js'; +import { connect } from '../utils/redis.js'; +import QueryParser from '../analysis/QueryParser.js'; /** * Primary entry point for adding GraphQL Rate Limiting middleware to an Express Server diff --git a/src/middleware/rateLimiterSetup.ts b/src/middleware/rateLimiterSetup.ts index 26166f8..683a503 100644 --- a/src/middleware/rateLimiterSetup.ts +++ b/src/middleware/rateLimiterSetup.ts @@ -1,9 +1,9 @@ import Redis from 'ioredis'; -import { RateLimiterConfig } from '../@types/rateLimit'; -import TokenBucket from '../rateLimiters/tokenBucket'; -import SlidingWindowCounter from '../rateLimiters/slidingWindowCounter'; -import SlidingWindowLog from '../rateLimiters/slidingWindowLog'; -import FixedWindow from '../rateLimiters/fixedWindow'; +import { RateLimiterConfig } from '../@types/rateLimit.js'; +import TokenBucket from '../rateLimiters/tokenBucket.js'; +import SlidingWindowCounter from '../rateLimiters/slidingWindowCounter.js'; +import SlidingWindowLog from '../rateLimiters/slidingWindowLog.js'; +import FixedWindow from '../rateLimiters/fixedWindow.js'; /** * Instatieate the rateLimiting algorithm class based on the developer selection and options diff --git a/src/rateLimiters/fixedWindow.ts b/src/rateLimiters/fixedWindow.ts index 2480596..a836097 100644 --- a/src/rateLimiters/fixedWindow.ts +++ b/src/rateLimiters/fixedWindow.ts @@ -1,5 +1,5 @@ import Redis from 'ioredis'; -import { RateLimiter, RateLimiterResponse, FixedWindow as Window } from '../@types/rateLimit'; +import { RateLimiter, RateLimiterResponse, FixedWindow as Window } from '../@types/rateLimit.js'; /** * The FixedWindow instance of a RateLimiter limits requests based on a unique user ID and a fixed time window. diff --git a/src/rateLimiters/slidingWindowCounter.ts b/src/rateLimiters/slidingWindowCounter.ts index 5507e1d..8b61f0b 100644 --- a/src/rateLimiters/slidingWindowCounter.ts +++ b/src/rateLimiters/slidingWindowCounter.ts @@ -1,5 +1,5 @@ import Redis from 'ioredis'; -import { RateLimiter, RateLimiterResponse, RedisWindow } from '../@types/rateLimit'; +import { RateLimiter, RateLimiterResponse, RedisWindow } from '../@types/rateLimit.js'; /** * The SlidingWindowCounter instance of a RateLimiter limits requests based on a unique user ID. diff --git a/src/rateLimiters/slidingWindowLog.ts b/src/rateLimiters/slidingWindowLog.ts index 3407920..5edbb43 100644 --- a/src/rateLimiters/slidingWindowLog.ts +++ b/src/rateLimiters/slidingWindowLog.ts @@ -1,5 +1,5 @@ import Redis from 'ioredis'; -import { RateLimiter, RateLimiterResponse, RedisBucket, RedisLog } from '../@types/rateLimit'; +import { RateLimiter, RateLimiterResponse, RedisLog } from '../@types/rateLimit.js'; /** * The SlidingWindowLog instance of a RateLimiter limits requests based on a unique user ID. diff --git a/src/rateLimiters/tokenBucket.ts b/src/rateLimiters/tokenBucket.ts index 15c093c..06a5a09 100644 --- a/src/rateLimiters/tokenBucket.ts +++ b/src/rateLimiters/tokenBucket.ts @@ -1,5 +1,5 @@ import Redis from 'ioredis'; -import { RateLimiter, RateLimiterResponse, RedisBucket } from '../@types/rateLimit'; +import { RateLimiter, RateLimiterResponse, RedisBucket } from '../@types/rateLimit.js'; /** * The TokenBucket instance of a RateLimiter limits requests based on a unique user ID. diff --git a/test/.eslintrc.json b/test/.eslintrc.json new file mode 100644 index 0000000..3aee61c --- /dev/null +++ b/test/.eslintrc.json @@ -0,0 +1,7 @@ +{ + "rules": { + "import/extensions": [ + "off" + ] + } +} \ No newline at end of file diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index a12071b..efe8777 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -1,7 +1,7 @@ { - "extends": "tsconfig.json", + "extends": "./tsconfig.json", "include": [ - "test/*", + "test", "src" ] } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index d178a85..c014e8f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -36,8 +36,6 @@ "include": [ "src/**/*.ts", "src/**/*.js", - "test/**/*.ts", - "test/**/*.js" ], "exclude": [ "node_modules",