From 66f77cc02f10e0d92b7f9db33934f44fb91f02ca Mon Sep 17 00:00:00 2001 From: Ivan Goncharov Date: Fri, 11 Aug 2023 13:34:08 +0300 Subject: [PATCH] Drop dependency on yargs --- package-lock.json | 273 ++++++++-------------------------------------- package.json | 4 +- src/cli.ts | 248 +++++++++++++++++++++++++---------------- src/index.ts | 94 +++++++--------- 4 files changed, 245 insertions(+), 374 deletions(-) diff --git a/package-lock.json b/package-lock.json index b5c45cb..56aa51c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,8 +19,7 @@ "graphql-voyager": "1.0.0-rc.31", "moment": "2.29.1", "node-fetch": "2.6.1", - "open": "8.0.5", - "yargs": "15.3.1" + "open": "8.0.5" }, "bin": { "graphql-faker": "dist/index.js" @@ -32,7 +31,6 @@ "@types/node": "20.2.5", "@types/react": "16.9.35", "@types/react-dom": "16.9.8", - "@types/yargs": "15.0.5", "@typescript-eslint/eslint-plugin": "5.59.5", "@typescript-eslint/parser": "5.59.5", "classnames": "2.3.1", @@ -984,21 +982,6 @@ "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, - "node_modules/@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.59.5", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", @@ -1764,6 +1747,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -2553,6 +2537,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, "engines": { "node": ">=6" } @@ -2782,16 +2767,6 @@ "tiny-emitter": "^2.0.0" } }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, "node_modules/clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -3671,6 +3646,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -4011,7 +3987,8 @@ "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==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/emojis-list": { "version": "3.0.0", @@ -5715,6 +5692,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -7029,6 +7007,7 @@ "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" } @@ -8736,6 +8715,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -8783,6 +8763,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "engines": { "node": ">=6" } @@ -9723,6 +9704,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -9730,7 +9712,8 @@ "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "node_modules/requires-port": { "version": "1.0.0", @@ -10135,7 +10118,8 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true }, "node_modules/set-value": { "version": "2.0.1", @@ -10812,6 +10796,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10894,6 +10879,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -13270,7 +13256,8 @@ "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true }, "node_modules/which-typed-array": { "version": "1.1.9", @@ -13322,19 +13309,6 @@ "errno": "~0.1.7" } }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -13384,6 +13358,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.2.tgz", "integrity": "sha512-DnBDwcL54b5xWMM/7RfFg4xs5amYxq2ot49aUfLjQSAracXkGvlZq0txzqr3Pa6Q0ayuCxBcwTzrPUScKY0O8w==", + "dev": true, "engines": { "node": ">=10" } @@ -13394,81 +13369,6 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "node_modules/yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -14290,21 +14190,6 @@ "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, - "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, "@typescript-eslint/eslint-plugin": { "version": "5.59.5", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", @@ -14881,7 +14766,8 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true }, "ansi-styles": { "version": "4.3.0", @@ -15533,7 +15419,8 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, "chalk": { "version": "4.1.0", @@ -15715,16 +15602,6 @@ "tiny-emitter": "^2.0.0" } }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -16412,7 +16289,8 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true }, "decode-uri-component": { "version": "0.2.0", @@ -16699,7 +16577,8 @@ "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==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "emojis-list": { "version": "3.0.0", @@ -18042,7 +17921,8 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true }, "get-intrinsic": { "version": "1.2.0", @@ -19031,7 +18911,8 @@ "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==" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, "is-glob": { "version": "4.0.3", @@ -20364,6 +20245,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "requires": { "p-try": "^2.0.0" } @@ -20395,7 +20277,8 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "package-json": { "version": "6.5.0", @@ -21143,12 +21026,14 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "requires-port": { "version": "1.0.0", @@ -21478,7 +21363,8 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true }, "set-value": { "version": "2.0.1", @@ -22049,6 +21935,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -22113,6 +22000,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -24041,7 +23929,8 @@ "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true }, "which-typed-array": { "version": "1.1.9", @@ -24081,16 +23970,6 @@ "errno": "~0.1.7" } }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -24133,7 +24012,8 @@ "y18n": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.2.tgz", - "integrity": "sha512-DnBDwcL54b5xWMM/7RfFg4xs5amYxq2ot49aUfLjQSAracXkGvlZq0txzqr3Pa6Q0ayuCxBcwTzrPUScKY0O8w==" + "integrity": "sha512-DnBDwcL54b5xWMM/7RfFg4xs5amYxq2ot49aUfLjQSAracXkGvlZq0txzqr3Pa6Q0ayuCxBcwTzrPUScKY0O8w==", + "dev": true }, "yallist": { "version": "3.1.1", @@ -24141,65 +24021,6 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - } - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 28458a6..383e881 100644 --- a/package.json +++ b/package.json @@ -47,8 +47,7 @@ "graphql-voyager": "1.0.0-rc.31", "moment": "2.29.1", "node-fetch": "2.6.1", - "open": "8.0.5", - "yargs": "15.3.1" + "open": "8.0.5" }, "devDependencies": { "@types/body-parser": "1.19.0", @@ -57,7 +56,6 @@ "@types/node": "20.2.5", "@types/react": "16.9.35", "@types/react-dom": "16.9.8", - "@types/yargs": "15.0.5", "@typescript-eslint/eslint-plugin": "5.59.5", "@typescript-eslint/parser": "5.59.5", "classnames": "2.3.1", diff --git a/src/cli.ts b/src/cli.ts index 3a8a97a..b785ec9 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,107 +1,171 @@ -import * as yargs from 'yargs'; +import { basename } from 'node:path'; +import { parseArgs } from 'node:util'; + +import * as chalk from 'chalk'; interface Options { - fileName: string | undefined; + fileName: string; port: number; corsOrigin: string | true; openEditor: boolean; extendURL: string | undefined; headers: { [key: string]: string }; - forwardHeaders: [string]; + forwardHeaders: ReadonlyArray; } -function builder(cmd) { - return cmd - .positional('SDLFile', { - describe: - 'path to file with SDL. If this argument is omitted Faker uses default file name', - type: 'string', - nargs: 1, - }) - .options({ - port: { - alias: 'p', - describe: 'HTTP Port', - type: 'number', - requiresArg: true, - default: process.env.PORT || 9002, - }, - open: { - alias: 'o', - describe: 'Open page with SDL editor and GraphiQL in browser', - type: 'boolean', - }, - 'cors-origin': { - alias: 'co', - describe: - 'CORS: Specify the custom origin for the Access-Control-Allow-Origin header, by default it is the same as `Origin` header from the request', - type: 'string', - requiresArg: true, - default: true, - }, - extend: { - alias: 'e', - describe: 'URL to existing GraphQL server to extend', - type: 'string', - requiresArg: true, - }, - header: { - alias: 'H', - describe: - 'Specify headers to the proxied server in cURL format, e.g.: "Authorization: bearer XXXXXXXXX"', - array: true, - type: 'string', - requiresArg: true, - implies: 'extend', - coerce(arr) { - const headers = {}; - for (const str of arr) { - const [, name, value] = str.match(/(.*?):(.*)/); - headers[name.toLowerCase()] = value.trim(); - } - return headers; - }, - }, - 'forward-headers': { - describe: - 'Specify which headers should be forwarded to the proxied server', - array: true, - type: 'string', - implies: 'extend', - coerce(arr) { - return arr.map((str) => str.toLowerCase()); - }, - }, - }) - .epilog(epilog) - .strict(); -} +export function parseCLI(): Options { + const [_, execPath] = process.argv; + const execName = basename(execPath); -export function parseCLI(commandCB: (options: Options) => void) { - yargs.usage('$0 [SDLFile]', '', builder, handler).help('h').alias('h', 'help') - .argv; - - function handler(argv) { - commandCB({ - fileName: argv.SDLFile, - port: argv.port, - corsOrigin: argv['cors-origin'], - openEditor: argv.open, - extendURL: argv.extend, - headers: argv.header || {}, - forwardHeaders: argv.forwardHeaders || [], - }); + const { values, positionals } = parser(); + + if (values.help === false) { + process.stderr.write(helpMessage()); + process.exit(0); } -} -const epilog = `Examples: + if (values.extend == null) { + if (values.header.length > 0) { + reportError( + 'Specifying `--header, -H` is supported only in `--extend, -e` mode', + ); + } + if (values['forward-headers'].length > 0) { + reportError( + 'Specifying `--forward-headers` is supported only in `--extend, -e` mode', + ); + } + } + + if (positionals.length > 1) { + reportError('Please specify single SDL file'); + } + + let fileName = positionals[0]; + if (fileName == null) { + fileName = values.extend + ? './schema_extension.faker.graphql' + : './schema.faker.graphql'; + process.stderr.write( + chalk.yellow( + `Default file ${chalk.magenta(fileName)} is used. ` + + `Specify [SDLFile] as argument to change.`, + ), + ); + } + + return { + fileName, + port: parsePortNumber(values.port), + corsOrigin: values['cors-origin'] ?? values.co ?? true, + openEditor: values.open, + extendURL: values.extend, + headers: Object.fromEntries(values.header.map(parseHeader)), + forwardHeaders: values['forward-headers'].map((str) => str.toLowerCase()), + }; + + function parsePortNumber(str: string): number { + const value = Number.parseInt(str); + if (!Number.isInteger(value) || value <= 0 || value.toString() !== str) { + reportError('Invalid port number: ' + str); + } + return value; + } + + function parseHeader(str: string): [name: string, value: string] { + const [name, ...rest] = str.split(':'); + if (rest.length === 0) { + reportError(`Header value "${str}" is missing colon`); + } + return [name, rest.join(':')]; + } + + function helpMessage(): string { + return `${execName} [SDLFile] + + Positionals: + SDLFile path to file with SDL. If this argument is omitted Faker uses default + file name [string] + + Options: + --version Show version number [boolean] + -h, --help Show help [boolean] + --port, -p HTTP Port [number] [default: 9002] + --open, -o Open page with SDL editor and GraphiQL in browser + [boolean] + --cors-origin, --co CORS: Specify the custom origin for the + Access-Control-Allow-Origin header, by default it is the + same as \`Origin\` header from the request + [string] + --extend, -e URL to existing GraphQL server to extend [string] + --header, -H Specify headers to the proxied server in cURL format, + e.g.: "Authorization: bearer XXXXXXXXX" [array] + --forward-headers Specify which headers should be forwarded to the proxied + server [array] + + Examples: + + # Mock GraphQL API based on example SDL and open interactive editor + ${execName} --open -# Mock GraphQL API based on example SDL and open interactive editor -$0 --open + # Extend real data from SWAPI with faked data based on extension SDL + ${execName} ./ext-swapi.graphql --extend http://swapi.apis.guru/ -# Extend real data from SWAPI with faked data based on extension SDL -$0 ./ext-swapi.graphql --extend http://swapi.apis.guru/ + # Extend real data from GitHub API with faked data based on extension SDL + ${execName} ./ext-gh.graphql --extend https://api.github.com/graphql \ + --header "Authorization: bearer " + `; + } + + function parser() { + try { + return parseArgs({ + strict: true, + allowPositionals: true, + options: { + help: { + short: 'h', + type: 'boolean', + }, + port: { + short: 'p', + type: 'string', + default: process.env.PORT || '9002', + }, + open: { + short: 'o', + type: 'boolean', + }, + 'cors-origin': { + type: 'string', + }, + // alias for 'cors-origin' + co: { type: 'string' }, + extend: { + short: 'e', + type: 'string', + }, + header: { + short: 'H', + type: 'string', + multiple: true, + default: [], + }, + 'forward-headers': { + type: 'string', + multiple: true, + default: [], + }, + }, + }); + } catch (error) { + reportError(error.message); + } + } + + function reportError(message: string): never { + process.stderr.write(`${execName}: ${message}\n`); + process.exit(1); + } +} -# Extend real data from GitHub API with faked data based on extension SDL -$0 ./ext-gh.graphql --extend https://api.github.com/graphql \\ ---header "Authorization: bearer "`; diff --git a/src/index.ts b/src/index.ts index 76b9543..06a5c1b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,64 +19,52 @@ import { existsSync, getRemoteSchema, readSDL } from './utils'; const log = console.log; -parseCLI((options) => { - const { extendURL, headers, forwardHeaders } = options; - const fileName = - options.fileName || - (extendURL ? './schema_extension.faker.graphql' : './schema.faker.graphql'); - - if (!options.fileName) { - log( - chalk.yellow( - `Default file ${chalk.magenta(fileName)} is used. ` + - `Specify [file] parameter to change.`, - ), - ); - } +const cliOptions = parseCLI(); - let userSDL = existsSync(fileName) && readSDL(fileName); +const { fileName, extendURL, headers, forwardHeaders } = cliOptions; - if (extendURL) { - // run in proxy mode - getRemoteSchema(extendURL, headers) - .then((schema) => { - const remoteSDL = new Source( - printSchema(schema), - `Introspection from "${extendURL}"`, - ); +let userSDL = existsSync(fileName) && readSDL(fileName); - if (!userSDL) { - let body = fs.readFileSync( - path.join(__dirname, 'default-extend.graphql'), - 'utf-8', - ); - - const rootTypeName = schema.getQueryType().name; - body = body.replace('___RootTypeName___', rootTypeName); - - userSDL = new Source(body, fileName); - } - - const executeFn = getProxyExecuteFn(extendURL, headers, forwardHeaders); - runServer(options, userSDL, remoteSDL, executeFn); - }) - .catch((error) => { - log(chalk.red(error.stack)); - process.exit(1); - }); - } else { - if (!userSDL) { - userSDL = new Source( - fs.readFileSync( - path.join(__dirname, 'default-schema.graphql'), - 'utf-8', - ), - fileName, +if (extendURL) { + // run in proxy mode + getRemoteSchema(extendURL, headers) + .then((schema) => { + const remoteSDL = new Source( + printSchema(schema), + `Introspection from "${extendURL}"`, ); - } - runServer(options, userSDL); + + if (!userSDL) { + let body = fs.readFileSync( + path.join(__dirname, 'default-extend.graphql'), + 'utf-8', + ); + + const rootTypeName = schema.getQueryType().name; + body = body.replace('___RootTypeName___', rootTypeName); + + userSDL = new Source(body, fileName); + } + + const executeFn = getProxyExecuteFn(extendURL, headers, forwardHeaders); + runServer(cliOptions, userSDL, remoteSDL, executeFn); + }) + .catch((error) => { + log(chalk.red(error.stack)); + process.exit(1); + }); +} else { + if (!userSDL) { + userSDL = new Source( + fs.readFileSync( + path.join(__dirname, 'default-schema.graphql'), + 'utf-8', + ), + fileName, + ); } -}); + runServer(cliOptions, userSDL); +} function runServer( options,