From 40657de462a3788dcba873dff469a4e72027809a Mon Sep 17 00:00:00 2001 From: Ian Sutherland Date: Thu, 7 Jul 2022 13:53:16 -0600 Subject: [PATCH] Send from parameter as a string to Apollo Studio API (#23) * Send from parameter as a string * Update dependencies * Add typecheck to workflows * Add validation period formatting * Always convert validation period to seconds * Format validation period in seconds for api request and human readable format for comment --- .github/workflows/ci.yml | 2 + .github/workflows/release-next.yml | 2 + .github/workflows/release.yml | 2 + CHANGELOG.md | 4 + package-lock.json | 225 +++++++++++++++++++---------- package.json | 3 +- rollup.config.js | 1 - src/format-message.ts | 20 ++- src/get-arguments.ts | 36 +++-- test/format-message.test.ts | 23 +++ test/get-arguments.test.ts | 20 ++- 11 files changed, 239 insertions(+), 99 deletions(-) create mode 100644 test/format-message.test.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ea863118..b88a19a8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,6 +16,8 @@ jobs: run: npm install --prefer-offline - name: Lint run: npm run lint + - name: Typecheck + run: npm run typecheck - name: Build run: npm run build - name: Test diff --git a/.github/workflows/release-next.yml b/.github/workflows/release-next.yml index eb5b04ed..503bbe3b 100644 --- a/.github/workflows/release-next.yml +++ b/.github/workflows/release-next.yml @@ -28,6 +28,8 @@ jobs: run: npm install --prefer-offline - name: Lint run: npm run lint + - name: Typecheck + run: npm run typecheck - name: Build run: npm run build - name: Test diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 51cc602b..f9f4789b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,6 +25,8 @@ jobs: run: npm install --prefer-offline - name: Lint run: npm run lint + - name: Typecheck + run: npm run typecheck - name: Build run: npm run build - name: Test diff --git a/CHANGELOG.md b/CHANGELOG.md index 7264090d..ac4e4821 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Apollo Schema Check Action Changelog +## 2.0.1 (July 6, 2022) + +- Pass `from` parameter to Apollo Studio API as a string instead of a number (see: [https://status.apollographql.com/incidents/c5dvk0tbg5bv](https://status.apollographql.com/incidents/c5dvk0tbg5bv)) + ## 2.0.0 (December 20, 2021) - Rewrite to use a direct call to the Apollo Studio API instead of using the Apollo CLI diff --git a/package-lock.json b/package-lock.json index 780ca1f8..c65c436c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "apollo-schema-check-action", - "version": "2.0.0", + "version": "2.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "apollo-schema-check-action", - "version": "2.0.0", + "version": "2.0.1", "license": "MIT", "dependencies": { "@actions/core": "^1.6.0", @@ -39,7 +39,8 @@ "typescript": "^4.5.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=16.0.0", + "npm": ">=8.0.0" } }, "node_modules/@actions/core": { @@ -744,22 +745,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", @@ -1892,15 +1877,19 @@ } }, "node_modules/ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ansi-colors": { @@ -2665,11 +2654,11 @@ "dev": true }, "node_modules/cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "dependencies": { - "node-fetch": "2.6.1" + "node-fetch": "2.6.7" } }, "node_modules/cross-spawn": { @@ -6582,9 +6571,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/mri": { @@ -6644,11 +6633,41 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, "engines": { "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/node-int64": { @@ -7804,9 +7823,9 @@ "dev": true }, "node_modules/semver-regex": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.3.tgz", - "integrity": "sha512-Aqi54Mk9uYTjVexLnR67rTyBusmwd04cLkHy9hNvk3+G3nT2Oyg7E0l4XVbOaNwIvQ3hHeYxGcyEy+mKreyBFQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", + "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", "dev": true, "engines": { "node": ">=8" @@ -8743,9 +8762,13 @@ } }, "node_modules/vm2": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.5.tgz", - "integrity": "sha512-LuCAHZN75H9tdrAiLFf030oW7nJV5xwNMuk1ymOZwopmuK3d2H4L1Kv4+GFHgarKiLfXXLFU+7LDABHnwOkWng==", + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz", + "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==", + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, "bin": { "vm2": "bin/vm2" }, @@ -8753,6 +8776,25 @@ "node": ">=6.0" } }, + "node_modules/vm2/node_modules/acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/vm2/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -9688,20 +9730,6 @@ "js-yaml": "^3.13.1", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - } } }, "@humanwhocodes/config-array": { @@ -10587,7 +10615,8 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "acorn-walk": { "version": "7.2.0", @@ -10614,9 +10643,9 @@ } }, "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -11203,11 +11232,11 @@ "dev": true }, "cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "requires": { - "node-fetch": "2.6.1" + "node-fetch": "2.6.7" } }, "cross-spawn": { @@ -12101,7 +12130,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-unicorn": { "version": "23.0.0", @@ -13433,7 +13463,8 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true + "dev": true, + "requires": {} }, "jest-regex-util": { "version": "27.4.0", @@ -13639,7 +13670,8 @@ "version": "3.4.2", "resolved": "https://registry.npmjs.org/jest-when/-/jest-when-3.4.2.tgz", "integrity": "sha512-vO1r+1XsyeavhoSapj7q4xD5xuM9i+UdopfhmJJK/aKaDpzDesxZ6hreLSO1JUZhZInqdM7CCn+At7c0SI2EEw==", - "dev": true + "dev": true, + "requires": {} }, "jest-worker": { "version": "27.4.2", @@ -14112,9 +14144,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "mri": { @@ -14165,9 +14197,33 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } }, "node-int64": { "version": "0.4.0", @@ -15024,9 +15080,9 @@ "dev": true }, "semver-regex": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.3.tgz", - "integrity": "sha512-Aqi54Mk9uYTjVexLnR67rTyBusmwd04cLkHy9hNvk3+G3nT2Oyg7E0l4XVbOaNwIvQ3hHeYxGcyEy+mKreyBFQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", + "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", "dev": true }, "setprototypeof": { @@ -15719,9 +15775,25 @@ } }, "vm2": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.5.tgz", - "integrity": "sha512-LuCAHZN75H9tdrAiLFf030oW7nJV5xwNMuk1ymOZwopmuK3d2H4L1Kv4+GFHgarKiLfXXLFU+7LDABHnwOkWng==" + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz", + "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==", + "requires": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "dependencies": { + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + } + } }, "w3c-hr-time": { "version": "1.0.2", @@ -15935,7 +16007,8 @@ "version": "7.5.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", - "dev": true + "dev": true, + "requires": {} }, "xml-name-validator": { "version": "3.0.0", diff --git a/package.json b/package.json index e9f2675f..52ca63f1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "apollo-schema-check-action", "description": "A GitHub Action to run a schema check with Apollo Studio and post the results as a comment on a Pull Request", - "version": "2.0.0", + "version": "2.0.1", "author": "Ian Sutherland ", "license": "MIT", "repository": { @@ -21,6 +21,7 @@ "test": "jest", "clean": "rimraf build", "clean:modules": "rimraf node_modules", + "typecheck": "tsc --noEmit", "lint": "eslint \"**/*.{ts,js}\"", "format": "prettier --write **/*.ts", "format:check": "prettier --check **/*.ts", diff --git a/rollup.config.js b/rollup.config.js index 3ce057f4..7c2104d8 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -18,7 +18,6 @@ export default { 'graphql', 'iso8601-duration', 'path', - 'pretty-ms', 'util', ], plugins: [typescript(), json()], diff --git a/src/format-message.ts b/src/format-message.ts index b2815fec..19d0f25b 100644 --- a/src/format-message.ts +++ b/src/format-message.ts @@ -1,10 +1,21 @@ import { getInput, setFailed } from '@actions/core'; +import { parse, toSeconds } from 'iso8601-duration'; import prettyMs from 'pretty-ms'; import { info, debug } from './actions-helpers'; import { ApolloStudioResponse, CheckSchemaResult, CompositionValidationResult } from './check-schema'; import { QueryVariables } from './get-arguments'; +const getValidationPeriod = (validationPeriod: string): string => { + if (validationPeriod.startsWith('P')) { + return prettyMs(toSeconds(parse(validationPeriod)) * 1_000, { verbose: true }); + } else if (validationPeriod.match(/^-?\d+$/)) { + return prettyMs(Math.abs(Number.parseInt(validationPeriod)) * 1_000, { verbose: true }); + } else { + return validationPeriod; + } +}; + const getSummary = ( checkSchemaResult: CheckSchemaResult | null, compositionValidationResult: CompositionValidationResult, @@ -23,11 +34,8 @@ const getSummary = ( summary += `🔢 Compared **${ checkSchemaResult?.diffToPrevious.changes.length - } schema changes** against **${numberOfCheckedOperations} operations** seen over the **last ${prettyMs( - Math.abs(variables.queryParameters.from * 1_000), - { - compact: true, - } + } schema changes** against **${numberOfCheckedOperations} operations** seen over the **last ${getValidationPeriod( + variables.queryParameters.from )}**\n`; if ( @@ -126,4 +134,4 @@ const formatMessage = ( return message; }; -export { formatMessage }; +export { formatMessage, getValidationPeriod }; diff --git a/src/get-arguments.ts b/src/get-arguments.ts index de49be6e..1c1a1f18 100644 --- a/src/get-arguments.ts +++ b/src/get-arguments.ts @@ -1,6 +1,6 @@ import { readFile } from 'fs/promises'; -import { parse, toSeconds } from 'iso8601-duration'; import { getInput } from '@actions/core'; +import { parse, toSeconds } from 'iso8601-duration'; import { debug } from './actions-helpers'; import { getSchema } from './get-schema'; @@ -42,7 +42,7 @@ export interface MergedConfig { sdl: string; }; queryParameters: { - from: number; + from: string; queryCountThreshold?: number; queryCountThresholdPercentage?: number; }; @@ -59,10 +59,20 @@ export interface QueryVariables { }; gitContext: CommitDetails; queryParameters: { - from: number; + from: string; }; } +const stringToNumber = (input?: string): number | undefined => { + if (input && input !== '') { + if (Number.isInteger(input)) { + return Number.parseInt(input, 10); + } else { + return Number.parseFloat(input); + } + } +}; + const getApolloConfigFile = async (file: string): Promise => { try { const contents = JSON.parse(await readFile(file, 'utf8')); @@ -73,13 +83,13 @@ const getApolloConfigFile = async (file: string): Promise => { } }; -const stringToNumber = (input?: string): number | undefined => { - if (input && input !== '') { - if (Number.isInteger(input)) { - return Number.parseInt(input, 10); - } else { - return Number.parseFloat(input); - } +const getFromValue = (validationPeriod: string): string => { + if (validationPeriod.startsWith('P')) { + return `${toSeconds(parse(validationPeriod))} sec`; + } else if (validationPeriod.match(/^-?\d+$/)) { + return `${Math.abs(Number.parseInt(validationPeriod))} sec`; + } else { + return validationPeriod; } }; @@ -90,9 +100,7 @@ const getMergedConfig = async (config: ApolloConfigFile, inputs: ActionInputs): variant: config.variant ?? inputs.variant ?? 'current', serviceName: config.service?.name ?? inputs.serviceName, queryParameters: { - from: Number.isInteger(inputs.validationPeriod) - ? 0 - Number.parseInt(inputs.validationPeriod, 10) - : 0 - toSeconds(parse(inputs.validationPeriod)), + from: getFromValue(inputs.validationPeriod), queryCountThreshold: stringToNumber(inputs.queryCountThreshold), queryCountThresholdPercentage: stringToNumber(inputs.queryCountThresholdPercentage), }, @@ -156,4 +164,4 @@ const getQueryVariables = async (): Promise => { return variables; }; -export { getQueryVariables }; +export { getQueryVariables, getFromValue }; diff --git a/test/format-message.test.ts b/test/format-message.test.ts new file mode 100644 index 00000000..55f21672 --- /dev/null +++ b/test/format-message.test.ts @@ -0,0 +1,23 @@ +import { getValidationPeriod } from '../src/format-message'; + +describe('getValidationPeriod', () => { + test('negative number of seconds', () => { + expect(getValidationPeriod('-86400')).toBe('1 day'); + }); + + test('positive number of seconds', () => { + expect(getValidationPeriod('300')).toBe('5 minutes'); + }); + + test('another positive number of seconds', () => { + expect(getValidationPeriod('325')).toBe('5 minutes 25 seconds'); + }); + + test('ISO 8601 duration', () => { + expect(getValidationPeriod('P2W')).toBe('14 days'); + }); + + test('Plain text duration', () => { + expect(getValidationPeriod('2 weeks')).toBe('2 weeks'); + }); +}); diff --git a/test/get-arguments.test.ts b/test/get-arguments.test.ts index 3f712501..4acdb6a4 100644 --- a/test/get-arguments.test.ts +++ b/test/get-arguments.test.ts @@ -1,7 +1,7 @@ import * as core from '@actions/core'; import { when } from 'jest-when'; -import { getQueryVariables } from '../src/get-arguments'; +import { getQueryVariables, getFromValue } from '../src/get-arguments'; const mockGetInput = jest.spyOn(core, 'getInput'); @@ -89,3 +89,21 @@ describe.skip('getQueryVariables', () => { expect(args).toContain('--markdown'); }); }); + +describe('getFromValue', () => { + test('negative number of seconds', () => { + expect(getFromValue('-86400')).toBe('86400 sec'); + }); + + test('positive number of seconds', () => { + expect(getFromValue('300')).toBe('300 sec'); + }); + + test('ISO 8601 duration', () => { + expect(getFromValue('P2W')).toBe('1209600 sec'); + }); + + test('Plain text duration', () => { + expect(getFromValue('2 weeks')).toBe('2 weeks'); + }); +});